2 * Copyright (C) 2007 David Adam
3 * Copyright (C) 2007 Tony Wasserka
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #ifndef __D3DX9MATH_H__
23 #define __D3DX9MATH_H__
27 #define D3DX_PI ((FLOAT)3.141592654)
28 #define D3DX_1BYPI ((FLOAT)0.318309886)
30 #define D3DXSH_MINORDER 2
31 #define D3DXSH_MAXORDER 6
33 #define D3DXToRadian(degree) ((degree) * (D3DX_PI / 180.0f))
34 #define D3DXToDegree(radian) ((radian) * (180.0f / D3DX_PI))
36 typedef struct D3DXVECTOR2
40 D3DXVECTOR2(const FLOAT
*pf
);
41 D3DXVECTOR2(FLOAT fx
, FLOAT fy
);
44 operator const FLOAT
* () const;
46 D3DXVECTOR2
& operator += (const D3DXVECTOR2
&);
47 D3DXVECTOR2
& operator -= (const D3DXVECTOR2
&);
48 D3DXVECTOR2
& operator *= (FLOAT
);
49 D3DXVECTOR2
& operator /= (FLOAT
);
51 D3DXVECTOR2
operator + () const;
52 D3DXVECTOR2
operator - () const;
54 D3DXVECTOR2
operator + (const D3DXVECTOR2
&) const;
55 D3DXVECTOR2
operator - (const D3DXVECTOR2
&) const;
56 D3DXVECTOR2
operator * (FLOAT
) const;
57 D3DXVECTOR2
operator / (FLOAT
) const;
59 friend D3DXVECTOR2
operator * (FLOAT
, const D3DXVECTOR2
&);
61 BOOL
operator == (const D3DXVECTOR2
&) const;
62 BOOL
operator != (const D3DXVECTOR2
&) const;
63 #endif /* __cplusplus */
65 } D3DXVECTOR2
, *LPD3DXVECTOR2
;
68 typedef struct D3DXVECTOR3
: public D3DVECTOR
71 D3DXVECTOR3(const FLOAT
*pf
);
72 D3DXVECTOR3(const D3DVECTOR
& v
);
73 D3DXVECTOR3(FLOAT fx
, FLOAT fy
, FLOAT fz
);
76 operator const FLOAT
* () const;
78 D3DXVECTOR3
& operator += (const D3DXVECTOR3
&);
79 D3DXVECTOR3
& operator -= (const D3DXVECTOR3
&);
80 D3DXVECTOR3
& operator *= (FLOAT
);
81 D3DXVECTOR3
& operator /= (FLOAT
);
83 D3DXVECTOR3
operator + () const;
84 D3DXVECTOR3
operator - () const;
86 D3DXVECTOR3
operator + (const D3DXVECTOR3
&) const;
87 D3DXVECTOR3
operator - (const D3DXVECTOR3
&) const;
88 D3DXVECTOR3
operator * (FLOAT
) const;
89 D3DXVECTOR3
operator / (FLOAT
) const;
91 friend D3DXVECTOR3
operator * (FLOAT
, const struct D3DXVECTOR3
&);
93 BOOL
operator == (const D3DXVECTOR3
&) const;
94 BOOL
operator != (const D3DXVECTOR3
&) const;
95 } D3DXVECTOR3
, *LPD3DXVECTOR3
;
96 #else /* !__cplusplus */
97 typedef struct _D3DVECTOR D3DXVECTOR3
, *LPD3DXVECTOR3
;
98 #endif /* !__cplusplus */
100 typedef struct D3DXVECTOR4
104 D3DXVECTOR4(const FLOAT
*pf
);
105 D3DXVECTOR4(FLOAT fx
, FLOAT fy
, FLOAT fz
, FLOAT fw
);
108 operator const FLOAT
* () const;
110 D3DXVECTOR4
& operator += (const D3DXVECTOR4
&);
111 D3DXVECTOR4
& operator -= (const D3DXVECTOR4
&);
112 D3DXVECTOR4
& operator *= (FLOAT
);
113 D3DXVECTOR4
& operator /= (FLOAT
);
115 D3DXVECTOR4
operator + () const;
116 D3DXVECTOR4
operator - () const;
118 D3DXVECTOR4
operator + (const D3DXVECTOR4
&) const;
119 D3DXVECTOR4
operator - (const D3DXVECTOR4
&) const;
120 D3DXVECTOR4
operator * (FLOAT
) const;
121 D3DXVECTOR4
operator / (FLOAT
) const;
123 friend D3DXVECTOR4
operator * (FLOAT
, const D3DXVECTOR4
&);
125 BOOL
operator == (const D3DXVECTOR4
&) const;
126 BOOL
operator != (const D3DXVECTOR4
&) const;
127 #endif /* __cplusplus */
129 } D3DXVECTOR4
, *LPD3DXVECTOR4
;
132 typedef struct D3DXMATRIX
: public D3DMATRIX
135 D3DXMATRIX(const FLOAT
*pf
);
136 D3DXMATRIX(const D3DMATRIX
& mat
);
137 D3DXMATRIX(FLOAT f11
, FLOAT f12
, FLOAT f13
, FLOAT f14
,
138 FLOAT f21
, FLOAT f22
, FLOAT f23
, FLOAT f24
,
139 FLOAT f31
, FLOAT f32
, FLOAT f33
, FLOAT f34
,
140 FLOAT f41
, FLOAT f42
, FLOAT f43
, FLOAT f44
);
142 FLOAT
& operator () (UINT row
, UINT col
);
143 FLOAT
operator () (UINT row
, UINT col
) const;
146 operator const FLOAT
* () const;
148 D3DXMATRIX
& operator *= (const D3DXMATRIX
&);
149 D3DXMATRIX
& operator += (const D3DXMATRIX
&);
150 D3DXMATRIX
& operator -= (const D3DXMATRIX
&);
151 D3DXMATRIX
& operator *= (FLOAT
);
152 D3DXMATRIX
& operator /= (FLOAT
);
154 D3DXMATRIX
operator + () const;
155 D3DXMATRIX
operator - () const;
157 D3DXMATRIX
operator * (const D3DXMATRIX
&) const;
158 D3DXMATRIX
operator + (const D3DXMATRIX
&) const;
159 D3DXMATRIX
operator - (const D3DXMATRIX
&) const;
160 D3DXMATRIX
operator * (FLOAT
) const;
161 D3DXMATRIX
operator / (FLOAT
) const;
163 friend D3DXMATRIX
operator * (FLOAT
, const D3DXMATRIX
&);
165 BOOL
operator == (const D3DXMATRIX
&) const;
166 BOOL
operator != (const D3DXMATRIX
&) const;
167 } D3DXMATRIX
, *LPD3DXMATRIX
;
168 #else /* !__cplusplus */
169 typedef struct _D3DMATRIX D3DXMATRIX
, *LPD3DXMATRIX
;
170 #endif /* !__cplusplus */
172 typedef struct D3DXQUATERNION
176 D3DXQUATERNION(const FLOAT
*pf
);
177 D3DXQUATERNION(FLOAT fx
, FLOAT fy
, FLOAT fz
, FLOAT fw
);
180 operator const FLOAT
* () const;
182 D3DXQUATERNION
& operator += (const D3DXQUATERNION
&);
183 D3DXQUATERNION
& operator -= (const D3DXQUATERNION
&);
184 D3DXQUATERNION
& operator *= (const D3DXQUATERNION
&);
185 D3DXQUATERNION
& operator *= (FLOAT
);
186 D3DXQUATERNION
& operator /= (FLOAT
);
188 D3DXQUATERNION
operator + () const;
189 D3DXQUATERNION
operator - () const;
191 D3DXQUATERNION
operator + (const D3DXQUATERNION
&) const;
192 D3DXQUATERNION
operator - (const D3DXQUATERNION
&) const;
193 D3DXQUATERNION
operator * (const D3DXQUATERNION
&) const;
194 D3DXQUATERNION
operator * (FLOAT
) const;
195 D3DXQUATERNION
operator / (FLOAT
) const;
197 friend D3DXQUATERNION
operator * (FLOAT
, const D3DXQUATERNION
&);
199 BOOL
operator == (const D3DXQUATERNION
&) const;
200 BOOL
operator != (const D3DXQUATERNION
&) const;
201 #endif /* __cplusplus */
203 } D3DXQUATERNION
, *LPD3DXQUATERNION
;
205 typedef struct D3DXPLANE
209 D3DXPLANE(const FLOAT
*pf
);
210 D3DXPLANE(FLOAT fa
, FLOAT fb
, FLOAT fc
, FLOAT fd
);
213 operator const FLOAT
* () const;
215 D3DXPLANE
operator + () const;
216 D3DXPLANE
operator - () const;
218 BOOL
operator == (const D3DXPLANE
&) const;
219 BOOL
operator != (const D3DXPLANE
&) const;
220 #endif /* __cplusplus */
222 } D3DXPLANE
, *LPD3DXPLANE
;
224 typedef struct D3DXCOLOR
228 D3DXCOLOR(DWORD col
);
229 D3DXCOLOR(const FLOAT
*pf
);
230 D3DXCOLOR(const D3DCOLORVALUE
& col
);
231 D3DXCOLOR(FLOAT fr
, FLOAT fg
, FLOAT fb
, FLOAT fa
);
233 operator DWORD () const;
236 operator const FLOAT
* () const;
238 operator D3DCOLORVALUE
* ();
239 operator const D3DCOLORVALUE
* () const;
241 operator D3DCOLORVALUE
& ();
242 operator const D3DCOLORVALUE
& () const;
244 D3DXCOLOR
& operator += (const D3DXCOLOR
&);
245 D3DXCOLOR
& operator -= (const D3DXCOLOR
&);
246 D3DXCOLOR
& operator *= (FLOAT
);
247 D3DXCOLOR
& operator /= (FLOAT
);
249 D3DXCOLOR
operator + () const;
250 D3DXCOLOR
operator - () const;
252 D3DXCOLOR
operator + (const D3DXCOLOR
&) const;
253 D3DXCOLOR
operator - (const D3DXCOLOR
&) const;
254 D3DXCOLOR
operator * (FLOAT
) const;
255 D3DXCOLOR
operator / (FLOAT
) const;
257 friend D3DXCOLOR
operator * (FLOAT
, const D3DXCOLOR
&);
259 BOOL
operator == (const D3DXCOLOR
&) const;
260 BOOL
operator != (const D3DXCOLOR
&) const;
261 #endif /* __cplusplus */
263 } D3DXCOLOR
, *LPD3DXCOLOR
;
265 typedef struct D3DXFLOAT16
269 D3DXFLOAT16(FLOAT f
);
270 D3DXFLOAT16(const D3DXFLOAT16
&f
);
274 BOOL
operator == (const D3DXFLOAT16
&) const;
275 BOOL
operator != (const D3DXFLOAT16
&) const;
276 #endif /* __cplusplus */
278 } D3DXFLOAT16
, *LPD3DXFLOAT16
;
284 D3DXCOLOR
* WINAPI
D3DXColorAdjustContrast(D3DXCOLOR
*pout
, const D3DXCOLOR
*pc
, FLOAT s
);
285 D3DXCOLOR
* WINAPI
D3DXColorAdjustSaturation(D3DXCOLOR
*pout
, const D3DXCOLOR
*pc
, FLOAT s
);
287 FLOAT WINAPI
D3DXFresnelTerm(FLOAT costheta
, FLOAT refractionindex
);
289 D3DXMATRIX
* WINAPI
D3DXMatrixAffineTransformation(D3DXMATRIX
*pout
, FLOAT scaling
, const D3DXVECTOR3
*rotationcenter
, const D3DXQUATERNION
*rotation
,
290 const D3DXVECTOR3
*translation
);
291 D3DXMATRIX
* WINAPI
D3DXMatrixAffineTransformation2D(D3DXMATRIX
*pout
, FLOAT scaling
, const D3DXVECTOR2
*protationcenter
, FLOAT rotation
,
292 const D3DXVECTOR2
*ptranslation
);
293 HRESULT WINAPI
D3DXMatrixDecompose(D3DXVECTOR3
*poutscale
, D3DXQUATERNION
*poutrotation
, D3DXVECTOR3
*pouttranslation
, const D3DXMATRIX
*pm
);
294 FLOAT WINAPI
D3DXMatrixDeterminant(const D3DXMATRIX
*pm
);
295 D3DXMATRIX
* WINAPI
D3DXMatrixInverse(D3DXMATRIX
*pout
, FLOAT
*pdeterminant
, const D3DXMATRIX
*pm
);
296 D3DXMATRIX
* WINAPI
D3DXMatrixLookAtLH(D3DXMATRIX
*pout
, const D3DXVECTOR3
*peye
, const D3DXVECTOR3
*pat
, const D3DXVECTOR3
*pup
);
297 D3DXMATRIX
* WINAPI
D3DXMatrixLookAtRH(D3DXMATRIX
*pout
, const D3DXVECTOR3
*peye
, const D3DXVECTOR3
*pat
, const D3DXVECTOR3
*pup
);
298 D3DXMATRIX
* WINAPI
D3DXMatrixMultiply(D3DXMATRIX
*pout
, const D3DXMATRIX
*pm1
, const D3DXMATRIX
*pm2
);
299 D3DXMATRIX
* WINAPI
D3DXMatrixMultiplyTranspose(D3DXMATRIX
*pout
, const D3DXMATRIX
*pm1
, const D3DXMATRIX
*pm2
);
300 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoLH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
);
301 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoOffCenterLH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
);
302 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoOffCenterRH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
);
303 D3DXMATRIX
* WINAPI
D3DXMatrixOrthoRH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
);
304 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveFovLH(D3DXMATRIX
*pout
, FLOAT fovy
, FLOAT aspect
, FLOAT zn
, FLOAT zf
);
305 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveFovRH(D3DXMATRIX
*pout
, FLOAT fovy
, FLOAT aspect
, FLOAT zn
, FLOAT zf
);
306 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveLH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
);
307 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveOffCenterLH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
);
308 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveOffCenterRH(D3DXMATRIX
*pout
, FLOAT l
, FLOAT r
, FLOAT b
, FLOAT t
, FLOAT zn
, FLOAT zf
);
309 D3DXMATRIX
* WINAPI
D3DXMatrixPerspectiveRH(D3DXMATRIX
*pout
, FLOAT w
, FLOAT h
, FLOAT zn
, FLOAT zf
);
310 D3DXMATRIX
* WINAPI
D3DXMatrixReflect(D3DXMATRIX
*pout
, const D3DXPLANE
*pplane
);
311 D3DXMATRIX
* WINAPI
D3DXMatrixRotationAxis(D3DXMATRIX
*pout
, const D3DXVECTOR3
*pv
, FLOAT angle
);
312 D3DXMATRIX
* WINAPI
D3DXMatrixRotationQuaternion(D3DXMATRIX
*pout
, const D3DXQUATERNION
*pq
);
313 D3DXMATRIX
* WINAPI
D3DXMatrixRotationX(D3DXMATRIX
*pout
, FLOAT angle
);
314 D3DXMATRIX
* WINAPI
D3DXMatrixRotationY(D3DXMATRIX
*pout
, FLOAT angle
);
315 D3DXMATRIX
* WINAPI
D3DXMatrixRotationYawPitchRoll(D3DXMATRIX
*pout
, FLOAT yaw
, FLOAT pitch
, FLOAT roll
);
316 D3DXMATRIX
* WINAPI
D3DXMatrixRotationZ(D3DXMATRIX
*pout
, FLOAT angle
);
317 D3DXMATRIX
* WINAPI
D3DXMatrixScaling(D3DXMATRIX
*pout
, FLOAT sx
, FLOAT sy
, FLOAT sz
);
318 D3DXMATRIX
* WINAPI
D3DXMatrixShadow(D3DXMATRIX
*pout
, const D3DXVECTOR4
*plight
, const D3DXPLANE
*pPlane
);
319 D3DXMATRIX
* WINAPI
D3DXMatrixTransformation(D3DXMATRIX
*pout
, const D3DXVECTOR3
*pscalingcenter
, const D3DXQUATERNION
*pscalingrotation
, const D3DXVECTOR3
*pscaling
, const D3DXVECTOR3
*protationcenter
,
320 const D3DXQUATERNION
*protation
, const D3DXVECTOR3
*ptranslation
);
321 D3DXMATRIX
* WINAPI
D3DXMatrixTransformation2D(D3DXMATRIX
*pout
, const D3DXVECTOR2
*pscalingcenter
, FLOAT scalingrotation
, const D3DXVECTOR2
*pscaling
,
322 const D3DXVECTOR2
*protationcenter
, FLOAT rotation
, const D3DXVECTOR2
*ptranslation
);
323 D3DXMATRIX
* WINAPI
D3DXMatrixTranslation(D3DXMATRIX
*pout
, FLOAT x
, FLOAT y
, FLOAT z
);
324 D3DXMATRIX
* WINAPI
D3DXMatrixTranspose(D3DXMATRIX
*pout
, const D3DXMATRIX
*pm
);
326 D3DXPLANE
* WINAPI
D3DXPlaneFromPointNormal(D3DXPLANE
*pout
, const D3DXVECTOR3
*pvpoint
, const D3DXVECTOR3
*pvnormal
);
327 D3DXPLANE
* WINAPI
D3DXPlaneFromPoints(D3DXPLANE
*pout
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pv3
);
328 D3DXVECTOR3
* WINAPI
D3DXPlaneIntersectLine(D3DXVECTOR3
*pout
, const D3DXPLANE
*pp
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
);
329 D3DXPLANE
* WINAPI
D3DXPlaneNormalize(D3DXPLANE
*pout
, const D3DXPLANE
*pp
);
330 D3DXPLANE
* WINAPI
D3DXPlaneTransform(D3DXPLANE
*pout
, const D3DXPLANE
*pplane
, const D3DXMATRIX
*pm
);
331 D3DXPLANE
* WINAPI
D3DXPlaneTransformArray(D3DXPLANE
*pout
, UINT outstride
, const D3DXPLANE
*pplane
, UINT pstride
, const D3DXMATRIX
*pm
, UINT n
);
333 D3DXQUATERNION
* WINAPI
D3DXQuaternionBaryCentric(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
, const D3DXQUATERNION
*pq3
, FLOAT f
, FLOAT g
);
334 D3DXQUATERNION
* WINAPI
D3DXQuaternionExp(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq
);
335 D3DXQUATERNION
* WINAPI
D3DXQuaternionInverse(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq
);
336 D3DXQUATERNION
* WINAPI
D3DXQuaternionLn(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq
);
337 D3DXQUATERNION
* WINAPI
D3DXQuaternionMultiply(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
);
338 D3DXQUATERNION
* WINAPI
D3DXQuaternionNormalize(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq
);
339 D3DXQUATERNION
* WINAPI
D3DXQuaternionRotationAxis(D3DXQUATERNION
*pout
, const D3DXVECTOR3
*pv
, FLOAT angle
);
340 D3DXQUATERNION
* WINAPI
D3DXQuaternionRotationMatrix(D3DXQUATERNION
*pout
, const D3DXMATRIX
*pm
);
341 D3DXQUATERNION
* WINAPI
D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION
*pout
, FLOAT yaw
, FLOAT pitch
, FLOAT roll
);
342 D3DXQUATERNION
* WINAPI
D3DXQuaternionSlerp(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
, FLOAT t
);
343 D3DXQUATERNION
* WINAPI
D3DXQuaternionSquad(D3DXQUATERNION
*pout
, const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
, const D3DXQUATERNION
*pq3
,
344 const D3DXQUATERNION
*pq4
, FLOAT t
);
345 void WINAPI
D3DXQuaternionSquadSetup(D3DXQUATERNION
*paout
, D3DXQUATERNION
*pbout
, D3DXQUATERNION
*pcout
, const D3DXQUATERNION
*pq0
,
346 const D3DXQUATERNION
*pq1
, const D3DXQUATERNION
*pq2
, const D3DXQUATERNION
*pq3
);
347 void WINAPI
D3DXQuaternionToAxisAngle(const D3DXQUATERNION
*pq
, D3DXVECTOR3
*paxis
, FLOAT
*pangle
);
349 D3DXVECTOR2
* WINAPI
D3DXVec2BaryCentric(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv1
, const D3DXVECTOR2
*pv2
, const D3DXVECTOR2
*pv3
, FLOAT f
, FLOAT g
);
350 D3DXVECTOR2
* WINAPI
D3DXVec2CatmullRom(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv0
, const D3DXVECTOR2
*pv1
, const D3DXVECTOR2
*pv2
, const D3DXVECTOR2
*pv3
, FLOAT s
);
351 D3DXVECTOR2
* WINAPI
D3DXVec2Hermite(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv1
, const D3DXVECTOR2
*pt1
, const D3DXVECTOR2
*pv2
, const D3DXVECTOR2
*pt2
, FLOAT s
);
352 D3DXVECTOR2
* WINAPI
D3DXVec2Normalize(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv
);
353 D3DXVECTOR4
* WINAPI
D3DXVec2Transform(D3DXVECTOR4
*pout
, const D3DXVECTOR2
*pv
, const D3DXMATRIX
*pm
);
354 D3DXVECTOR4
* WINAPI
D3DXVec2TransformArray(D3DXVECTOR4
*pout
, UINT outstride
, const D3DXVECTOR2
*pv
, UINT vstride
, const D3DXMATRIX
*pm
, UINT n
);
355 D3DXVECTOR2
* WINAPI
D3DXVec2TransformCoord(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv
, const D3DXMATRIX
*pm
);
356 D3DXVECTOR2
* WINAPI
D3DXVec2TransformCoordArray(D3DXVECTOR2
*pout
, UINT outstride
, const D3DXVECTOR2
*pv
, UINT vstride
, const D3DXMATRIX
*pm
, UINT n
);
357 D3DXVECTOR2
* WINAPI
D3DXVec2TransformNormal(D3DXVECTOR2
*pout
, const D3DXVECTOR2
*pv
, const D3DXMATRIX
*pm
);
358 D3DXVECTOR2
* WINAPI
D3DXVec2TransformNormalArray(D3DXVECTOR2
*pout
, UINT outstride
, const D3DXVECTOR2
*pv
, UINT vstride
, const D3DXMATRIX
*pm
, UINT n
);
360 D3DXVECTOR3
* WINAPI
D3DXVec3BaryCentric(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pv3
, FLOAT f
, FLOAT g
);
361 D3DXVECTOR3
* WINAPI
D3DXVec3CatmullRom( D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv0
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pv3
, FLOAT s
);
362 D3DXVECTOR3
* WINAPI
D3DXVec3Hermite(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv1
, const D3DXVECTOR3
*pt1
, const D3DXVECTOR3
*pv2
, const D3DXVECTOR3
*pt2
, FLOAT s
);
363 D3DXVECTOR3
* WINAPI
D3DXVec3Normalize(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
);
364 D3DXVECTOR3
* WINAPI
D3DXVec3Project(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
, const D3DVIEWPORT9
*pviewport
, const D3DXMATRIX
*pprojection
,
365 const D3DXMATRIX
*pview
, const D3DXMATRIX
*pworld
);
366 D3DXVECTOR3
* WINAPI
D3DXVec3ProjectArray(D3DXVECTOR3
*pout
, UINT outstride
, const D3DXVECTOR3
*pv
, UINT vstride
, const D3DVIEWPORT9
*pviewport
,
367 const D3DXMATRIX
*pprojection
, const D3DXMATRIX
*pview
, const D3DXMATRIX
*pworld
, UINT n
);
368 D3DXVECTOR4
* WINAPI
D3DXVec3Transform(D3DXVECTOR4
*pout
, const D3DXVECTOR3
*pv
, const D3DXMATRIX
*pm
);
369 D3DXVECTOR4
* WINAPI
D3DXVec3TransformArray(D3DXVECTOR4
*pout
, UINT outstride
, const D3DXVECTOR3
*pv
, UINT vstride
, const D3DXMATRIX
*pm
, UINT n
);
370 D3DXVECTOR3
* WINAPI
D3DXVec3TransformCoord(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
, const D3DXMATRIX
*pm
);
371 D3DXVECTOR3
* WINAPI
D3DXVec3TransformCoordArray(D3DXVECTOR3
*pout
, UINT outstride
, const D3DXVECTOR3
*pv
, UINT vstride
, const D3DXMATRIX
*pm
, UINT n
);
372 D3DXVECTOR3
* WINAPI
D3DXVec3TransformNormal(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
, const D3DXMATRIX
*pm
);
373 D3DXVECTOR3
* WINAPI
D3DXVec3TransformNormalArray(D3DXVECTOR3
*pout
, UINT outstride
, const D3DXVECTOR3
*pv
, UINT vstride
, const D3DXMATRIX
*pm
, UINT n
);
374 D3DXVECTOR3
* WINAPI
D3DXVec3Unproject(D3DXVECTOR3
*pout
, const D3DXVECTOR3
*pv
, const D3DVIEWPORT9
*pviewport
, const D3DXMATRIX
*pprojection
,
375 const D3DXMATRIX
*pview
, const D3DXMATRIX
*pworld
);
376 D3DXVECTOR3
* WINAPI
D3DXVec3UnprojectArray(D3DXVECTOR3
*pout
, UINT outstride
, const D3DXVECTOR3
*pv
, UINT vstride
, const D3DVIEWPORT9
*pviewport
,
377 const D3DXMATRIX
*pprojection
, const D3DXMATRIX
*pview
, const D3DXMATRIX
*pworld
, UINT n
);
378 D3DXVECTOR4
* WINAPI
D3DXVec4BaryCentric(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pv3
, FLOAT f
, FLOAT g
);
379 D3DXVECTOR4
* WINAPI
D3DXVec4CatmullRom(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv0
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pv3
, FLOAT s
);
380 D3DXVECTOR4
* WINAPI
D3DXVec4Cross(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pv3
);
381 D3DXVECTOR4
* WINAPI
D3DXVec4Hermite(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv1
, const D3DXVECTOR4
*pt1
, const D3DXVECTOR4
*pv2
, const D3DXVECTOR4
*pt2
, FLOAT s
);
382 D3DXVECTOR4
* WINAPI
D3DXVec4Normalize(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv
);
383 D3DXVECTOR4
* WINAPI
D3DXVec4Transform(D3DXVECTOR4
*pout
, const D3DXVECTOR4
*pv
, const D3DXMATRIX
*pm
);
384 D3DXVECTOR4
* WINAPI
D3DXVec4TransformArray(D3DXVECTOR4
*pout
, UINT outstride
, const D3DXVECTOR4
*pv
, UINT vstride
, const D3DXMATRIX
*pm
, UINT n
);
386 D3DXFLOAT16
*WINAPI
D3DXFloat32To16Array(D3DXFLOAT16
*pout
, const FLOAT
*pin
, UINT n
);
387 FLOAT
*WINAPI
D3DXFloat16To32Array(FLOAT
*pout
, const D3DXFLOAT16
*pin
, UINT n
);
389 FLOAT
* WINAPI
D3DXSHAdd(FLOAT
*out
, UINT order
, const FLOAT
*a
, const FLOAT
*b
);
390 FLOAT WINAPI
D3DXSHDot(UINT order
, const FLOAT
*a
, const FLOAT
*b
);
391 HRESULT WINAPI
D3DXSHEvalConeLight(UINT order
, const D3DXVECTOR3
*dir
, FLOAT radius
, FLOAT Rintensity
, FLOAT Gintensity
, FLOAT Bintensity
, FLOAT
*rout
, FLOAT
*gout
, FLOAT
*bout
);
392 FLOAT
* WINAPI
D3DXSHEvalDirection(FLOAT
*out
, UINT order
, const D3DXVECTOR3
*dir
);
393 HRESULT WINAPI
D3DXSHEvalDirectionalLight(UINT order
, const D3DXVECTOR3
*dir
, FLOAT Rintensity
, FLOAT Gintensity
, FLOAT Bintensity
, FLOAT
*rout
, FLOAT
*gout
, FLOAT
*bout
);
394 HRESULT WINAPI
D3DXSHEvalHemisphereLight(UINT order
, const D3DXVECTOR3
*dir
, D3DXCOLOR top
, D3DXCOLOR bottom
, FLOAT
*rout
, FLOAT
*gout
, FLOAT
*bout
);
395 HRESULT WINAPI
D3DXSHEvalSphericalLight(UINT order
, const D3DXVECTOR3
*dir
, FLOAT radius
, FLOAT Rintensity
, FLOAT Gintensity
, FLOAT Bintensity
, FLOAT
*rout
, FLOAT
*gout
, FLOAT
*bout
);
396 FLOAT
* WINAPI
D3DXSHMultiply2(FLOAT
*out
, const FLOAT
*a
, const FLOAT
*b
);
397 FLOAT
* WINAPI
D3DXSHMultiply3(FLOAT
*out
, const FLOAT
*a
, const FLOAT
*b
);
398 FLOAT
* WINAPI
D3DXSHMultiply4(FLOAT
*out
, const FLOAT
*a
, const FLOAT
*b
);
399 FLOAT
* WINAPI
D3DXSHRotate(FLOAT
*out
, UINT order
, const D3DXMATRIX
*matrix
, const FLOAT
*in
);
400 FLOAT
* WINAPI
D3DXSHRotateZ(FLOAT
*out
, UINT order
, FLOAT angle
, const FLOAT
*in
);
401 FLOAT
* WINAPI
D3DXSHScale(FLOAT
*out
, UINT order
, const FLOAT
*a
, const FLOAT scale
);
407 typedef interface ID3DXMatrixStack
*LPD3DXMATRIXSTACK
;
409 DEFINE_GUID(IID_ID3DXMatrixStack
,
410 0xc7885ba7, 0xf990, 0x4fe7, 0x92, 0x2d, 0x85, 0x15, 0xe4, 0x77, 0xdd, 0x85);
413 #define INTERFACE ID3DXMatrixStack
415 DECLARE_INTERFACE_(ID3DXMatrixStack
, IUnknown
)
417 STDMETHOD(QueryInterface
)(THIS_ REFIID riid
, void **out
) PURE
;
418 STDMETHOD_(ULONG
,AddRef
)(THIS
) PURE
;
419 STDMETHOD_(ULONG
,Release
)(THIS
) PURE
;
420 STDMETHOD(Pop
)(THIS
) PURE
;
421 STDMETHOD(Push
)(THIS
) PURE
;
422 STDMETHOD(LoadIdentity
)(THIS
) PURE
;
423 STDMETHOD(LoadMatrix
)(THIS_
const D3DXMATRIX
* pM
) PURE
;
424 STDMETHOD(MultMatrix
)(THIS_
const D3DXMATRIX
* pM
) PURE
;
425 STDMETHOD(MultMatrixLocal
)(THIS_
const D3DXMATRIX
* pM
) PURE
;
426 STDMETHOD(RotateAxis
)(THIS_
const D3DXVECTOR3
* pV
, FLOAT Angle
) PURE
;
427 STDMETHOD(RotateAxisLocal
)(THIS_
const D3DXVECTOR3
* pV
, FLOAT Angle
) PURE
;
428 STDMETHOD(RotateYawPitchRoll
)(THIS_ FLOAT Yaw
, FLOAT Pitch
, FLOAT Roll
) PURE
;
429 STDMETHOD(RotateYawPitchRollLocal
)(THIS_ FLOAT Yaw
, FLOAT Pitch
, FLOAT Roll
) PURE
;
430 STDMETHOD(Scale
)(THIS_ FLOAT x
, FLOAT y
, FLOAT z
) PURE
;
431 STDMETHOD(ScaleLocal
)(THIS_ FLOAT x
, FLOAT y
, FLOAT z
) PURE
;
432 STDMETHOD(Translate
)(THIS_ FLOAT x
, FLOAT y
, FLOAT z
) PURE
;
433 STDMETHOD(TranslateLocal
)(THIS_ FLOAT x
, FLOAT y
, FLOAT z
) PURE
;
434 STDMETHOD_(D3DXMATRIX
*, GetTop
)(THIS
) PURE
;
439 #if !defined(__cplusplus) || defined(CINTERFACE)
441 #define ID3DXMatrixStack_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
442 #define ID3DXMatrixStack_AddRef(p) (p)->lpVtbl->AddRef(p)
443 #define ID3DXMatrixStack_Release(p) (p)->lpVtbl->Release(p)
444 #define ID3DXMatrixStack_Pop(p) (p)->lpVtbl->Pop(p)
445 #define ID3DXMatrixStack_Push(p) (p)->lpVtbl->Push(p)
446 #define ID3DXMatrixStack_LoadIdentity(p) (p)->lpVtbl->LoadIdentity(p)
447 #define ID3DXMatrixStack_LoadMatrix(p,a) (p)->lpVtbl->LoadMatrix(p,a)
448 #define ID3DXMatrixStack_MultMatrix(p,a) (p)->lpVtbl->MultMatrix(p,a)
449 #define ID3DXMatrixStack_MultMatrixLocal(p,a) (p)->lpVtbl->MultMatrixLocal(p,a)
450 #define ID3DXMatrixStack_RotateAxis(p,a,b) (p)->lpVtbl->RotateAxis(p,a,b)
451 #define ID3DXMatrixStack_RotateAxisLocal(p,a,b) (p)->lpVtbl->RotateAxisLocal(p,a,b)
452 #define ID3DXMatrixStack_RotateYawPitchRoll(p,a,b,c) (p)->lpVtbl->RotateYawPitchRoll(p,a,b,c)
453 #define ID3DXMatrixStack_RotateYawPitchRollLocal(p,a,b,c) (p)->lpVtbl->RotateYawPitchRollLocal(p,a,b,c)
454 #define ID3DXMatrixStack_Scale(p,a,b,c) (p)->lpVtbl->Scale(p,a,b,c)
455 #define ID3DXMatrixStack_ScaleLocal(p,a,b,c) (p)->lpVtbl->ScaleLocal(p,a,b,c)
456 #define ID3DXMatrixStack_Translate(p,a,b,c) (p)->lpVtbl->Translate(p,a,b,c)
457 #define ID3DXMatrixStack_TranslateLocal(p,a,b,c) (p)->lpVtbl->TranslateLocal(p,a,b,c)
458 #define ID3DXMatrixStack_GetTop(p) (p)->lpVtbl->GetTop(p)
466 HRESULT WINAPI
D3DXCreateMatrixStack(DWORD flags
, ID3DXMatrixStack
**stack
);
472 #include <d3dx9math.inl>
474 #endif /* __D3DX9MATH_H__ */