1 /* 2 * Copyright (C) 2007 David Adam 3 * Copyright (C) 2007 Tony Wasserka 4 * 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. 9 * 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. 14 * 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 18 */ 19 20 #include <d3dx9.h> 21 22 #ifndef __D3DX9MATH_H__ 23 #define __D3DX9MATH_H__ 24 25 #include <math.h> 26 27 #define D3DX_PI ((FLOAT)3.141592654) 28 #define D3DX_1BYPI ((FLOAT)0.318309886) 29 30 #define D3DXSH_MINORDER 2 31 #define D3DXSH_MAXORDER 6 32 33 #define D3DXToRadian(degree) ((degree) * (D3DX_PI / 180.0f)) 34 #define D3DXToDegree(radian) ((radian) * (180.0f / D3DX_PI)) 35 36 typedef struct D3DXVECTOR2 37 { 38 #ifdef __cplusplus 39 D3DXVECTOR2(); 40 D3DXVECTOR2(const FLOAT *pf); 41 D3DXVECTOR2(FLOAT fx, FLOAT fy); 42 43 operator FLOAT* (); 44 operator const FLOAT* () const; 45 46 D3DXVECTOR2& operator += (const D3DXVECTOR2&); 47 D3DXVECTOR2& operator -= (const D3DXVECTOR2&); 48 D3DXVECTOR2& operator *= (FLOAT); 49 D3DXVECTOR2& operator /= (FLOAT); 50 51 D3DXVECTOR2 operator + () const; 52 D3DXVECTOR2 operator - () const; 53 54 D3DXVECTOR2 operator + (const D3DXVECTOR2&) const; 55 D3DXVECTOR2 operator - (const D3DXVECTOR2&) const; 56 D3DXVECTOR2 operator * (FLOAT) const; 57 D3DXVECTOR2 operator / (FLOAT) const; 58 59 friend D3DXVECTOR2 operator * (FLOAT, const D3DXVECTOR2&); 60 61 BOOL operator == (const D3DXVECTOR2&) const; 62 BOOL operator != (const D3DXVECTOR2&) const; 63 #endif /* __cplusplus */ 64 FLOAT x, y; 65 } D3DXVECTOR2, *LPD3DXVECTOR2; 66 67 #ifdef __cplusplus 68 typedef struct D3DXVECTOR3 : public D3DVECTOR 69 { 70 D3DXVECTOR3(); 71 D3DXVECTOR3(const FLOAT *pf); 72 D3DXVECTOR3(const D3DVECTOR& v); 73 D3DXVECTOR3(FLOAT fx, FLOAT fy, FLOAT fz); 74 75 operator FLOAT* (); 76 operator const FLOAT* () const; 77 78 D3DXVECTOR3& operator += (const D3DXVECTOR3&); 79 D3DXVECTOR3& operator -= (const D3DXVECTOR3&); 80 D3DXVECTOR3& operator *= (FLOAT); 81 D3DXVECTOR3& operator /= (FLOAT); 82 83 D3DXVECTOR3 operator + () const; 84 D3DXVECTOR3 operator - () const; 85 86 D3DXVECTOR3 operator + (const D3DXVECTOR3&) const; 87 D3DXVECTOR3 operator - (const D3DXVECTOR3&) const; 88 D3DXVECTOR3 operator * (FLOAT) const; 89 D3DXVECTOR3 operator / (FLOAT) const; 90 91 friend D3DXVECTOR3 operator * (FLOAT, const struct D3DXVECTOR3&); 92 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 */ 99 100 typedef struct D3DXVECTOR4 101 { 102 #ifdef __cplusplus 103 D3DXVECTOR4(); 104 D3DXVECTOR4(const FLOAT *pf); 105 D3DXVECTOR4(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw); 106 107 operator FLOAT* (); 108 operator const FLOAT* () const; 109 110 D3DXVECTOR4& operator += (const D3DXVECTOR4&); 111 D3DXVECTOR4& operator -= (const D3DXVECTOR4&); 112 D3DXVECTOR4& operator *= (FLOAT); 113 D3DXVECTOR4& operator /= (FLOAT); 114 115 D3DXVECTOR4 operator + () const; 116 D3DXVECTOR4 operator - () const; 117 118 D3DXVECTOR4 operator + (const D3DXVECTOR4&) const; 119 D3DXVECTOR4 operator - (const D3DXVECTOR4&) const; 120 D3DXVECTOR4 operator * (FLOAT) const; 121 D3DXVECTOR4 operator / (FLOAT) const; 122 123 friend D3DXVECTOR4 operator * (FLOAT, const D3DXVECTOR4&); 124 125 BOOL operator == (const D3DXVECTOR4&) const; 126 BOOL operator != (const D3DXVECTOR4&) const; 127 #endif /* __cplusplus */ 128 FLOAT x, y, z, w; 129 } D3DXVECTOR4, *LPD3DXVECTOR4; 130 131 #ifdef __cplusplus 132 typedef struct D3DXMATRIX : public D3DMATRIX 133 { 134 D3DXMATRIX(); 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); 141 142 FLOAT& operator () (UINT row, UINT col); 143 FLOAT operator () (UINT row, UINT col) const; 144 145 operator FLOAT* (); 146 operator const FLOAT* () const; 147 148 D3DXMATRIX& operator *= (const D3DXMATRIX&); 149 D3DXMATRIX& operator += (const D3DXMATRIX&); 150 D3DXMATRIX& operator -= (const D3DXMATRIX&); 151 D3DXMATRIX& operator *= (FLOAT); 152 D3DXMATRIX& operator /= (FLOAT); 153 154 D3DXMATRIX operator + () const; 155 D3DXMATRIX operator - () const; 156 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; 162 163 friend D3DXMATRIX operator * (FLOAT, const D3DXMATRIX&); 164 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 */ 171 172 typedef struct D3DXQUATERNION 173 { 174 #ifdef __cplusplus 175 D3DXQUATERNION(); 176 D3DXQUATERNION(const FLOAT *pf); 177 D3DXQUATERNION(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw); 178 179 operator FLOAT* (); 180 operator const FLOAT* () const; 181 182 D3DXQUATERNION& operator += (const D3DXQUATERNION&); 183 D3DXQUATERNION& operator -= (const D3DXQUATERNION&); 184 D3DXQUATERNION& operator *= (const D3DXQUATERNION&); 185 D3DXQUATERNION& operator *= (FLOAT); 186 D3DXQUATERNION& operator /= (FLOAT); 187 188 D3DXQUATERNION operator + () const; 189 D3DXQUATERNION operator - () const; 190 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; 196 197 friend D3DXQUATERNION operator * (FLOAT, const D3DXQUATERNION&); 198 199 BOOL operator == (const D3DXQUATERNION&) const; 200 BOOL operator != (const D3DXQUATERNION&) const; 201 #endif /* __cplusplus */ 202 FLOAT x, y, z, w; 203 } D3DXQUATERNION, *LPD3DXQUATERNION; 204 205 typedef struct D3DXPLANE 206 { 207 #ifdef __cplusplus 208 D3DXPLANE(); 209 D3DXPLANE(const FLOAT *pf); 210 D3DXPLANE(FLOAT fa, FLOAT fb, FLOAT fc, FLOAT fd); 211 212 operator FLOAT* (); 213 operator const FLOAT* () const; 214 215 D3DXPLANE operator + () const; 216 D3DXPLANE operator - () const; 217 218 BOOL operator == (const D3DXPLANE&) const; 219 BOOL operator != (const D3DXPLANE&) const; 220 #endif /* __cplusplus */ 221 FLOAT a, b, c, d; 222 } D3DXPLANE, *LPD3DXPLANE; 223 224 typedef struct D3DXCOLOR 225 { 226 #ifdef __cplusplus 227 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); 232 233 operator DWORD () const; 234 235 operator FLOAT* (); 236 operator const FLOAT* () const; 237 238 operator D3DCOLORVALUE* (); 239 operator const D3DCOLORVALUE* () const; 240 241 operator D3DCOLORVALUE& (); 242 operator const D3DCOLORVALUE& () const; 243 244 D3DXCOLOR& operator += (const D3DXCOLOR&); 245 D3DXCOLOR& operator -= (const D3DXCOLOR&); 246 D3DXCOLOR& operator *= (FLOAT); 247 D3DXCOLOR& operator /= (FLOAT); 248 249 D3DXCOLOR operator + () const; 250 D3DXCOLOR operator - () const; 251 252 D3DXCOLOR operator + (const D3DXCOLOR&) const; 253 D3DXCOLOR operator - (const D3DXCOLOR&) const; 254 D3DXCOLOR operator * (FLOAT) const; 255 D3DXCOLOR operator / (FLOAT) const; 256 257 friend D3DXCOLOR operator * (FLOAT, const D3DXCOLOR&); 258 259 BOOL operator == (const D3DXCOLOR&) const; 260 BOOL operator != (const D3DXCOLOR&) const; 261 #endif /* __cplusplus */ 262 FLOAT r, g, b, a; 263 } D3DXCOLOR, *LPD3DXCOLOR; 264 265 typedef struct D3DXFLOAT16 266 { 267 #ifdef __cplusplus 268 D3DXFLOAT16(); 269 D3DXFLOAT16(FLOAT f); 270 D3DXFLOAT16(const D3DXFLOAT16 &f); 271 272 operator FLOAT (); 273 274 BOOL operator == (const D3DXFLOAT16 &) const; 275 BOOL operator != (const D3DXFLOAT16 &) const; 276 #endif /* __cplusplus */ 277 WORD value; 278 } D3DXFLOAT16, *LPD3DXFLOAT16; 279 280 #ifdef __cplusplus 281 extern "C" { 282 #endif 283 284 D3DXCOLOR* WINAPI D3DXColorAdjustContrast(D3DXCOLOR *pout, const D3DXCOLOR *pc, FLOAT s); 285 D3DXCOLOR* WINAPI D3DXColorAdjustSaturation(D3DXCOLOR *pout, const D3DXCOLOR *pc, FLOAT s); 286 287 FLOAT WINAPI D3DXFresnelTerm(FLOAT costheta, FLOAT refractionindex); 288 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); 325 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); 332 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); 348 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); 359 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); 385 386 D3DXFLOAT16 *WINAPI D3DXFloat32To16Array(D3DXFLOAT16 *pout, const FLOAT *pin, UINT n); 387 FLOAT *WINAPI D3DXFloat16To32Array(FLOAT *pout, const D3DXFLOAT16 *pin, UINT n); 388 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 HRESULT WINAPI D3DXSHProjectCubeMap(UINT order, IDirect3DCubeTexture9 *cubemap, FLOAT *rout, FLOAT *gout, FLOAT *bout); 400 FLOAT* WINAPI D3DXSHRotate(FLOAT *out, UINT order, const D3DXMATRIX *matrix, const FLOAT *in); 401 FLOAT* WINAPI D3DXSHRotateZ(FLOAT *out, UINT order, FLOAT angle, const FLOAT *in); 402 FLOAT* WINAPI D3DXSHScale(FLOAT *out, UINT order, const FLOAT *a, const FLOAT scale); 403 404 #ifdef __cplusplus 405 } 406 #endif 407 408 typedef interface ID3DXMatrixStack *LPD3DXMATRIXSTACK; 409 410 DEFINE_GUID(IID_ID3DXMatrixStack, 411 0xc7885ba7, 0xf990, 0x4fe7, 0x92, 0x2d, 0x85, 0x15, 0xe4, 0x77, 0xdd, 0x85); 412 413 #undef INTERFACE 414 #define INTERFACE ID3DXMatrixStack 415 416 DECLARE_INTERFACE_(ID3DXMatrixStack, IUnknown) 417 { 418 STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **out) PURE; 419 STDMETHOD_(ULONG,AddRef)(THIS) PURE; 420 STDMETHOD_(ULONG,Release)(THIS) PURE; 421 STDMETHOD(Pop)(THIS) PURE; 422 STDMETHOD(Push)(THIS) PURE; 423 STDMETHOD(LoadIdentity)(THIS) PURE; 424 STDMETHOD(LoadMatrix)(THIS_ const D3DXMATRIX* pM ) PURE; 425 STDMETHOD(MultMatrix)(THIS_ const D3DXMATRIX* pM ) PURE; 426 STDMETHOD(MultMatrixLocal)(THIS_ const D3DXMATRIX* pM ) PURE; 427 STDMETHOD(RotateAxis)(THIS_ const D3DXVECTOR3* pV, FLOAT Angle) PURE; 428 STDMETHOD(RotateAxisLocal)(THIS_ const D3DXVECTOR3* pV, FLOAT Angle) PURE; 429 STDMETHOD(RotateYawPitchRoll)(THIS_ FLOAT Yaw, FLOAT Pitch, FLOAT Roll) PURE; 430 STDMETHOD(RotateYawPitchRollLocal)(THIS_ FLOAT Yaw, FLOAT Pitch, FLOAT Roll) PURE; 431 STDMETHOD(Scale)(THIS_ FLOAT x, FLOAT y, FLOAT z) PURE; 432 STDMETHOD(ScaleLocal)(THIS_ FLOAT x, FLOAT y, FLOAT z) PURE; 433 STDMETHOD(Translate)(THIS_ FLOAT x, FLOAT y, FLOAT z ) PURE; 434 STDMETHOD(TranslateLocal)(THIS_ FLOAT x, FLOAT y, FLOAT z) PURE; 435 STDMETHOD_(D3DXMATRIX*, GetTop)(THIS) PURE; 436 }; 437 438 #undef INTERFACE 439 440 #if !defined(__cplusplus) || defined(CINTERFACE) 441 442 #define ID3DXMatrixStack_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) 443 #define ID3DXMatrixStack_AddRef(p) (p)->lpVtbl->AddRef(p) 444 #define ID3DXMatrixStack_Release(p) (p)->lpVtbl->Release(p) 445 #define ID3DXMatrixStack_Pop(p) (p)->lpVtbl->Pop(p) 446 #define ID3DXMatrixStack_Push(p) (p)->lpVtbl->Push(p) 447 #define ID3DXMatrixStack_LoadIdentity(p) (p)->lpVtbl->LoadIdentity(p) 448 #define ID3DXMatrixStack_LoadMatrix(p,a) (p)->lpVtbl->LoadMatrix(p,a) 449 #define ID3DXMatrixStack_MultMatrix(p,a) (p)->lpVtbl->MultMatrix(p,a) 450 #define ID3DXMatrixStack_MultMatrixLocal(p,a) (p)->lpVtbl->MultMatrixLocal(p,a) 451 #define ID3DXMatrixStack_RotateAxis(p,a,b) (p)->lpVtbl->RotateAxis(p,a,b) 452 #define ID3DXMatrixStack_RotateAxisLocal(p,a,b) (p)->lpVtbl->RotateAxisLocal(p,a,b) 453 #define ID3DXMatrixStack_RotateYawPitchRoll(p,a,b,c) (p)->lpVtbl->RotateYawPitchRoll(p,a,b,c) 454 #define ID3DXMatrixStack_RotateYawPitchRollLocal(p,a,b,c) (p)->lpVtbl->RotateYawPitchRollLocal(p,a,b,c) 455 #define ID3DXMatrixStack_Scale(p,a,b,c) (p)->lpVtbl->Scale(p,a,b,c) 456 #define ID3DXMatrixStack_ScaleLocal(p,a,b,c) (p)->lpVtbl->ScaleLocal(p,a,b,c) 457 #define ID3DXMatrixStack_Translate(p,a,b,c) (p)->lpVtbl->Translate(p,a,b,c) 458 #define ID3DXMatrixStack_TranslateLocal(p,a,b,c) (p)->lpVtbl->TranslateLocal(p,a,b,c) 459 #define ID3DXMatrixStack_GetTop(p) (p)->lpVtbl->GetTop(p) 460 461 #endif 462 463 #ifdef __cplusplus 464 extern "C" { 465 #endif 466 467 HRESULT WINAPI D3DXCreateMatrixStack(DWORD flags, ID3DXMatrixStack **stack); 468 469 #ifdef __cplusplus 470 } 471 #endif 472 473 #include <d3dx9math.inl> 474 475 #endif /* __D3DX9MATH_H__ */ 476