Home | History | Annotate | Download | only in include
      1 #undef INTERFACE
      2 /*
      3  * Copyright (C) 2007 David Adam
      4  * Copyright (C) 2007 Tony Wasserka
      5  *
      6  * This library is free software; you can redistribute it and/or
      7  * modify it under the terms of the GNU Lesser General Public
      8  * License as published by the Free Software Foundation; either
      9  * version 2.1 of the License, or (at your option) any later version.
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Lesser General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU Lesser General Public
     17  * License along with this library; if not, write to the Free Software
     18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
     19  */
     20 
     21 #include <d3dx9.h>
     22 
     23 #ifndef __D3DX9MATH_H__
     24 #define __D3DX9MATH_H__
     25 
     26 #include <math.h>
     27 
     28 #define D3DX_PI    ((FLOAT)3.141592654)
     29 #define D3DX_1BYPI ((FLOAT)0.318309886)
     30 
     31 #define D3DXSH_MINORDER 2
     32 #define D3DXSH_MAXORDER 6
     33 
     34 #define D3DXToRadian(degree) ((degree) * (D3DX_PI / 180.0f))
     35 #define D3DXToDegree(radian) ((radian) * (180.0f / D3DX_PI))
     36 
     37 typedef struct D3DXVECTOR2
     38 {
     39 #ifdef __cplusplus
     40     D3DXVECTOR2();
     41     D3DXVECTOR2(const FLOAT *pf);
     42     D3DXVECTOR2(FLOAT fx, FLOAT fy);
     43 
     44     operator FLOAT* ();
     45     operator const FLOAT* () const;
     46 
     47     D3DXVECTOR2& operator += (const D3DXVECTOR2&);
     48     D3DXVECTOR2& operator -= (const D3DXVECTOR2&);
     49     D3DXVECTOR2& operator *= (FLOAT);
     50     D3DXVECTOR2& operator /= (FLOAT);
     51 
     52     D3DXVECTOR2 operator + () const;
     53     D3DXVECTOR2 operator - () const;
     54 
     55     D3DXVECTOR2 operator + (const D3DXVECTOR2&) const;
     56     D3DXVECTOR2 operator - (const D3DXVECTOR2&) const;
     57     D3DXVECTOR2 operator * (FLOAT) const;
     58     D3DXVECTOR2 operator / (FLOAT) const;
     59 
     60     friend D3DXVECTOR2 operator * (FLOAT, const D3DXVECTOR2&);
     61 
     62     WINBOOL operator == (const D3DXVECTOR2&) const;
     63     WINBOOL operator != (const D3DXVECTOR2&) const;
     64 #endif /* __cplusplus */
     65     FLOAT x, y;
     66 } D3DXVECTOR2, *LPD3DXVECTOR2;
     67 
     68 #ifdef __cplusplus
     69 typedef struct D3DXVECTOR3 : public D3DVECTOR
     70 {
     71     D3DXVECTOR3();
     72     D3DXVECTOR3(const FLOAT *pf);
     73     D3DXVECTOR3(const D3DVECTOR& v);
     74     D3DXVECTOR3(FLOAT fx, FLOAT fy, FLOAT fz);
     75 
     76     operator FLOAT* ();
     77     operator const FLOAT* () const;
     78 
     79     D3DXVECTOR3& operator += (const D3DXVECTOR3&);
     80     D3DXVECTOR3& operator -= (const D3DXVECTOR3&);
     81     D3DXVECTOR3& operator *= (FLOAT);
     82     D3DXVECTOR3& operator /= (FLOAT);
     83 
     84     D3DXVECTOR3 operator + () const;
     85     D3DXVECTOR3 operator - () const;
     86 
     87     D3DXVECTOR3 operator + (const D3DXVECTOR3&) const;
     88     D3DXVECTOR3 operator - (const D3DXVECTOR3&) const;
     89     D3DXVECTOR3 operator * (FLOAT) const;
     90     D3DXVECTOR3 operator / (FLOAT) const;
     91 
     92     friend D3DXVECTOR3 operator * (FLOAT, const struct D3DXVECTOR3&);
     93 
     94     WINBOOL operator == (const D3DXVECTOR3&) const;
     95     WINBOOL operator != (const D3DXVECTOR3&) const;
     96 } D3DXVECTOR3, *LPD3DXVECTOR3;
     97 #else /* !__cplusplus */
     98 typedef struct _D3DVECTOR D3DXVECTOR3, *LPD3DXVECTOR3;
     99 #endif /* !__cplusplus */
    100 
    101 typedef struct D3DXVECTOR4
    102 {
    103 #ifdef __cplusplus
    104     D3DXVECTOR4();
    105     D3DXVECTOR4(const FLOAT *pf);
    106     D3DXVECTOR4(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw);
    107 
    108     operator FLOAT* ();
    109     operator const FLOAT* () const;
    110 
    111     D3DXVECTOR4& operator += (const D3DXVECTOR4&);
    112     D3DXVECTOR4& operator -= (const D3DXVECTOR4&);
    113     D3DXVECTOR4& operator *= (FLOAT);
    114     D3DXVECTOR4& operator /= (FLOAT);
    115 
    116     D3DXVECTOR4 operator + () const;
    117     D3DXVECTOR4 operator - () const;
    118 
    119     D3DXVECTOR4 operator + (const D3DXVECTOR4&) const;
    120     D3DXVECTOR4 operator - (const D3DXVECTOR4&) const;
    121     D3DXVECTOR4 operator * (FLOAT) const;
    122     D3DXVECTOR4 operator / (FLOAT) const;
    123 
    124     friend D3DXVECTOR4 operator * (FLOAT, const D3DXVECTOR4&);
    125 
    126     WINBOOL operator == (const D3DXVECTOR4&) const;
    127     WINBOOL operator != (const D3DXVECTOR4&) const;
    128 #endif /* __cplusplus */
    129     FLOAT x, y, z, w;
    130 } D3DXVECTOR4, *LPD3DXVECTOR4;
    131 
    132 #ifdef __cplusplus
    133 typedef struct D3DXMATRIX : public D3DMATRIX
    134 {
    135     D3DXMATRIX();
    136     D3DXMATRIX(const FLOAT *pf);
    137     D3DXMATRIX(const D3DMATRIX& mat);
    138     D3DXMATRIX(FLOAT f11, FLOAT f12, FLOAT f13, FLOAT f14,
    139                FLOAT f21, FLOAT f22, FLOAT f23, FLOAT f24,
    140                FLOAT f31, FLOAT f32, FLOAT f33, FLOAT f34,
    141                FLOAT f41, FLOAT f42, FLOAT f43, FLOAT f44);
    142 
    143     FLOAT& operator () (UINT row, UINT col);
    144     FLOAT operator () (UINT row, UINT col) const;
    145 
    146     operator FLOAT* ();
    147     operator const FLOAT* () const;
    148 
    149     D3DXMATRIX& operator *= (const D3DXMATRIX&);
    150     D3DXMATRIX& operator += (const D3DXMATRIX&);
    151     D3DXMATRIX& operator -= (const D3DXMATRIX&);
    152     D3DXMATRIX& operator *= (FLOAT);
    153     D3DXMATRIX& operator /= (FLOAT);
    154 
    155     D3DXMATRIX operator + () const;
    156     D3DXMATRIX operator - () const;
    157 
    158     D3DXMATRIX operator * (const D3DXMATRIX&) const;
    159     D3DXMATRIX operator + (const D3DXMATRIX&) const;
    160     D3DXMATRIX operator - (const D3DXMATRIX&) const;
    161     D3DXMATRIX operator * (FLOAT) const;
    162     D3DXMATRIX operator / (FLOAT) const;
    163 
    164     friend D3DXMATRIX operator * (FLOAT, const D3DXMATRIX&);
    165 
    166     WINBOOL operator == (const D3DXMATRIX&) const;
    167     WINBOOL operator != (const D3DXMATRIX&) const;
    168 } D3DXMATRIX, *LPD3DXMATRIX;
    169 #else /* !__cplusplus */
    170 typedef struct _D3DMATRIX D3DXMATRIX, *LPD3DXMATRIX;
    171 #endif /* !__cplusplus */
    172 
    173 typedef struct D3DXQUATERNION
    174 {
    175 #ifdef __cplusplus
    176     D3DXQUATERNION();
    177     D3DXQUATERNION(const FLOAT *pf);
    178     D3DXQUATERNION(FLOAT fx, FLOAT fy, FLOAT fz, FLOAT fw);
    179 
    180     operator FLOAT* ();
    181     operator const FLOAT* () const;
    182 
    183     D3DXQUATERNION& operator += (const D3DXQUATERNION&);
    184     D3DXQUATERNION& operator -= (const D3DXQUATERNION&);
    185     D3DXQUATERNION& operator *= (const D3DXQUATERNION&);
    186     D3DXQUATERNION& operator *= (FLOAT);
    187     D3DXQUATERNION& operator /= (FLOAT);
    188 
    189     D3DXQUATERNION  operator + () const;
    190     D3DXQUATERNION  operator - () const;
    191 
    192     D3DXQUATERNION operator + (const D3DXQUATERNION&) const;
    193     D3DXQUATERNION operator - (const D3DXQUATERNION&) const;
    194     D3DXQUATERNION operator * (const D3DXQUATERNION&) const;
    195     D3DXQUATERNION operator * (FLOAT) const;
    196     D3DXQUATERNION operator / (FLOAT) const;
    197 
    198     friend D3DXQUATERNION operator * (FLOAT, const D3DXQUATERNION&);
    199 
    200     WINBOOL operator == (const D3DXQUATERNION&) const;
    201     WINBOOL operator != (const D3DXQUATERNION&) const;
    202 #endif /* __cplusplus */
    203     FLOAT x, y, z, w;
    204 } D3DXQUATERNION, *LPD3DXQUATERNION;
    205 
    206 typedef struct D3DXPLANE
    207 {
    208 #ifdef __cplusplus
    209     D3DXPLANE();
    210     D3DXPLANE(const FLOAT *pf);
    211     D3DXPLANE(FLOAT fa, FLOAT fb, FLOAT fc, FLOAT fd);
    212 
    213     operator FLOAT* ();
    214     operator const FLOAT* () const;
    215 
    216     D3DXPLANE operator + () const;
    217     D3DXPLANE operator - () const;
    218 
    219     WINBOOL operator == (const D3DXPLANE&) const;
    220     WINBOOL operator != (const D3DXPLANE&) const;
    221 #endif /* __cplusplus */
    222     FLOAT a, b, c, d;
    223 } D3DXPLANE, *LPD3DXPLANE;
    224 
    225 typedef struct D3DXCOLOR
    226 {
    227 #ifdef __cplusplus
    228     D3DXCOLOR();
    229     D3DXCOLOR(DWORD col);
    230     D3DXCOLOR(const FLOAT *pf);
    231     D3DXCOLOR(const D3DCOLORVALUE& col);
    232     D3DXCOLOR(FLOAT fr, FLOAT fg, FLOAT fb, FLOAT fa);
    233 
    234     operator DWORD () const;
    235 
    236     operator FLOAT* ();
    237     operator const FLOAT* () const;
    238 
    239     operator D3DCOLORVALUE* ();
    240     operator const D3DCOLORVALUE* () const;
    241 
    242     operator D3DCOLORVALUE& ();
    243     operator const D3DCOLORVALUE& () const;
    244 
    245     D3DXCOLOR& operator += (const D3DXCOLOR&);
    246     D3DXCOLOR& operator -= (const D3DXCOLOR&);
    247     D3DXCOLOR& operator *= (FLOAT);
    248     D3DXCOLOR& operator /= (FLOAT);
    249 
    250     D3DXCOLOR operator + () const;
    251     D3DXCOLOR operator - () const;
    252 
    253     D3DXCOLOR operator + (const D3DXCOLOR&) const;
    254     D3DXCOLOR operator - (const D3DXCOLOR&) const;
    255     D3DXCOLOR operator * (FLOAT) const;
    256     D3DXCOLOR operator / (FLOAT) const;
    257 
    258     friend D3DXCOLOR operator * (FLOAT, const D3DXCOLOR&);
    259 
    260     WINBOOL operator == (const D3DXCOLOR&) const;
    261     WINBOOL operator != (const D3DXCOLOR&) const;
    262 #endif /* __cplusplus */
    263     FLOAT r, g, b, a;
    264 } D3DXCOLOR, *LPD3DXCOLOR;
    265 
    266 typedef struct D3DXFLOAT16
    267 {
    268 #ifdef __cplusplus
    269     D3DXFLOAT16();
    270     D3DXFLOAT16(FLOAT f);
    271     D3DXFLOAT16(const D3DXFLOAT16 &f);
    272 
    273     operator FLOAT ();
    274 
    275     WINBOOL operator == (const D3DXFLOAT16 &) const;
    276     WINBOOL operator != (const D3DXFLOAT16 &) const;
    277 #endif /* __cplusplus */
    278     WORD value;
    279 } D3DXFLOAT16, *LPD3DXFLOAT16;
    280 
    281 #ifdef __cplusplus
    282 extern "C" {
    283 #endif
    284 
    285 D3DXCOLOR* WINAPI D3DXColorAdjustContrast(D3DXCOLOR *pout, const D3DXCOLOR *pc, FLOAT s);
    286 D3DXCOLOR* WINAPI D3DXColorAdjustSaturation(D3DXCOLOR *pout, const D3DXCOLOR *pc, FLOAT s);
    287 
    288 FLOAT WINAPI D3DXFresnelTerm(FLOAT costheta, FLOAT refractionindex);
    289 
    290 D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation(D3DXMATRIX *pout, FLOAT scaling, const D3DXVECTOR3 *rotationcenter, const D3DXQUATERNION *rotation,
    291     const D3DXVECTOR3 *translation);
    292 D3DXMATRIX* WINAPI D3DXMatrixAffineTransformation2D(D3DXMATRIX *pout, FLOAT scaling, const D3DXVECTOR2 *protationcenter, FLOAT rotation,
    293     const D3DXVECTOR2 *ptranslation);
    294 HRESULT WINAPI D3DXMatrixDecompose(D3DXVECTOR3 *poutscale, D3DXQUATERNION *poutrotation, D3DXVECTOR3 *pouttranslation, const D3DXMATRIX *pm);
    295 FLOAT WINAPI D3DXMatrixDeterminant(const D3DXMATRIX *pm);
    296 D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, const D3DXMATRIX *pm);
    297 D3DXMATRIX* WINAPI D3DXMatrixLookAtLH(D3DXMATRIX *pout, const D3DXVECTOR3 *peye, const D3DXVECTOR3 *pat, const D3DXVECTOR3 *pup);
    298 D3DXMATRIX* WINAPI D3DXMatrixLookAtRH(D3DXMATRIX *pout, const D3DXVECTOR3 *peye, const D3DXVECTOR3 *pat, const D3DXVECTOR3 *pup);
    299 D3DXMATRIX* WINAPI D3DXMatrixMultiply(D3DXMATRIX *pout, const D3DXMATRIX *pm1, const D3DXMATRIX *pm2);
    300 D3DXMATRIX* WINAPI D3DXMatrixMultiplyTranspose(D3DXMATRIX *pout, const D3DXMATRIX *pm1, const D3DXMATRIX *pm2);
    301 D3DXMATRIX* WINAPI D3DXMatrixOrthoLH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
    302 D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenterLH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
    303 D3DXMATRIX* WINAPI D3DXMatrixOrthoOffCenterRH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
    304 D3DXMATRIX* WINAPI D3DXMatrixOrthoRH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
    305 D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovLH(D3DXMATRIX *pout, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf);
    306 D3DXMATRIX* WINAPI D3DXMatrixPerspectiveFovRH(D3DXMATRIX *pout, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf);
    307 D3DXMATRIX* WINAPI D3DXMatrixPerspectiveLH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
    308 D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenterLH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
    309 D3DXMATRIX* WINAPI D3DXMatrixPerspectiveOffCenterRH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
    310 D3DXMATRIX* WINAPI D3DXMatrixPerspectiveRH(D3DXMATRIX *pout, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
    311 D3DXMATRIX* WINAPI D3DXMatrixReflect(D3DXMATRIX *pout, const D3DXPLANE *pplane);
    312 D3DXMATRIX* WINAPI D3DXMatrixRotationAxis(D3DXMATRIX *pout, const D3DXVECTOR3 *pv, FLOAT angle);
    313 D3DXMATRIX* WINAPI D3DXMatrixRotationQuaternion(D3DXMATRIX *pout, const D3DXQUATERNION *pq);
    314 D3DXMATRIX* WINAPI D3DXMatrixRotationX(D3DXMATRIX *pout, FLOAT angle);
    315 D3DXMATRIX* WINAPI D3DXMatrixRotationY(D3DXMATRIX *pout, FLOAT angle);
    316 D3DXMATRIX* WINAPI D3DXMatrixRotationYawPitchRoll(D3DXMATRIX *pout, FLOAT yaw, FLOAT pitch, FLOAT roll);
    317 D3DXMATRIX* WINAPI D3DXMatrixRotationZ(D3DXMATRIX *pout, FLOAT angle);
    318 D3DXMATRIX* WINAPI D3DXMatrixScaling(D3DXMATRIX *pout, FLOAT sx, FLOAT sy, FLOAT sz);
    319 D3DXMATRIX* WINAPI D3DXMatrixShadow(D3DXMATRIX *pout, const D3DXVECTOR4 *plight, const D3DXPLANE *pPlane);
    320 D3DXMATRIX* WINAPI D3DXMatrixTransformation(D3DXMATRIX *pout, const D3DXVECTOR3 *pscalingcenter, const D3DXQUATERNION *pscalingrotation, const D3DXVECTOR3 *pscaling, const D3DXVECTOR3 *protationcenter,
    321     const D3DXQUATERNION *protation, const D3DXVECTOR3 *ptranslation);
    322 D3DXMATRIX* WINAPI D3DXMatrixTransformation2D(D3DXMATRIX *pout, const D3DXVECTOR2 *pscalingcenter, FLOAT scalingrotation, const D3DXVECTOR2 *pscaling,
    323     const D3DXVECTOR2 *protationcenter, FLOAT rotation, const D3DXVECTOR2 *ptranslation);
    324 D3DXMATRIX* WINAPI D3DXMatrixTranslation(D3DXMATRIX *pout, FLOAT x, FLOAT y, FLOAT z);
    325 D3DXMATRIX* WINAPI D3DXMatrixTranspose(D3DXMATRIX *pout, const D3DXMATRIX *pm);
    326 
    327 D3DXPLANE* WINAPI D3DXPlaneFromPointNormal(D3DXPLANE *pout, const D3DXVECTOR3 *pvpoint, const D3DXVECTOR3 *pvnormal);
    328 D3DXPLANE* WINAPI D3DXPlaneFromPoints(D3DXPLANE *pout, const D3DXVECTOR3 *pv1, const D3DXVECTOR3 *pv2, const D3DXVECTOR3 *pv3);
    329 D3DXVECTOR3* WINAPI D3DXPlaneIntersectLine(D3DXVECTOR3 *pout, const D3DXPLANE *pp, const D3DXVECTOR3 *pv1, const D3DXVECTOR3 *pv2);
    330 D3DXPLANE* WINAPI D3DXPlaneNormalize(D3DXPLANE *pout, const D3DXPLANE *pp);
    331 D3DXPLANE* WINAPI D3DXPlaneTransform(D3DXPLANE *pout, const D3DXPLANE *pplane, const D3DXMATRIX *pm);
    332 D3DXPLANE* WINAPI D3DXPlaneTransformArray(D3DXPLANE *pout, UINT outstride, const D3DXPLANE *pplane, UINT pstride, const D3DXMATRIX *pm, UINT n);
    333 
    334 D3DXQUATERNION* WINAPI D3DXQuaternionBaryCentric(D3DXQUATERNION *pout, const D3DXQUATERNION *pq1, const D3DXQUATERNION *pq2, const D3DXQUATERNION *pq3, FLOAT f, FLOAT g);
    335 D3DXQUATERNION* WINAPI D3DXQuaternionExp(D3DXQUATERNION *pout, const D3DXQUATERNION *pq);
    336 D3DXQUATERNION* WINAPI D3DXQuaternionInverse(D3DXQUATERNION *pout, const D3DXQUATERNION *pq);
    337 D3DXQUATERNION* WINAPI D3DXQuaternionLn(D3DXQUATERNION *pout, const D3DXQUATERNION *pq);
    338 D3DXQUATERNION* WINAPI D3DXQuaternionMultiply(D3DXQUATERNION *pout, const D3DXQUATERNION *pq1, const D3DXQUATERNION *pq2);
    339 D3DXQUATERNION* WINAPI D3DXQuaternionNormalize(D3DXQUATERNION *pout, const D3DXQUATERNION *pq);
    340 D3DXQUATERNION* WINAPI D3DXQuaternionRotationAxis(D3DXQUATERNION *pout, const D3DXVECTOR3 *pv, FLOAT angle);
    341 D3DXQUATERNION* WINAPI D3DXQuaternionRotationMatrix(D3DXQUATERNION *pout, const D3DXMATRIX *pm);
    342 D3DXQUATERNION* WINAPI D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION *pout, FLOAT yaw, FLOAT pitch, FLOAT roll);
    343 D3DXQUATERNION* WINAPI D3DXQuaternionSlerp(D3DXQUATERNION *pout, const D3DXQUATERNION *pq1, const D3DXQUATERNION *pq2, FLOAT t);
    344 D3DXQUATERNION* WINAPI D3DXQuaternionSquad(D3DXQUATERNION *pout, const D3DXQUATERNION *pq1, const D3DXQUATERNION *pq2, const D3DXQUATERNION *pq3,
    345     const D3DXQUATERNION *pq4, FLOAT t);
    346 void WINAPI D3DXQuaternionSquadSetup(D3DXQUATERNION *paout, D3DXQUATERNION *pbout, D3DXQUATERNION *pcout, const D3DXQUATERNION *pq0,
    347     const D3DXQUATERNION *pq1, const D3DXQUATERNION *pq2, const D3DXQUATERNION *pq3);
    348 void WINAPI D3DXQuaternionToAxisAngle(const D3DXQUATERNION *pq, D3DXVECTOR3 *paxis, FLOAT *pangle);
    349 
    350 D3DXVECTOR2* WINAPI D3DXVec2BaryCentric(D3DXVECTOR2 *pout, const D3DXVECTOR2 *pv1, const D3DXVECTOR2 *pv2, const D3DXVECTOR2 *pv3, FLOAT f, FLOAT g);
    351 D3DXVECTOR2* WINAPI D3DXVec2CatmullRom(D3DXVECTOR2 *pout, const D3DXVECTOR2 *pv0, const D3DXVECTOR2 *pv1, const D3DXVECTOR2 *pv2, const D3DXVECTOR2 *pv3, FLOAT s);
    352 D3DXVECTOR2* WINAPI D3DXVec2Hermite(D3DXVECTOR2 *pout, const D3DXVECTOR2 *pv1, const D3DXVECTOR2 *pt1, const D3DXVECTOR2 *pv2, const D3DXVECTOR2 *pt2, FLOAT s);
    353 D3DXVECTOR2* WINAPI D3DXVec2Normalize(D3DXVECTOR2 *pout, const D3DXVECTOR2 *pv);
    354 D3DXVECTOR4* WINAPI D3DXVec2Transform(D3DXVECTOR4 *pout, const D3DXVECTOR2 *pv, const D3DXMATRIX *pm);
    355 D3DXVECTOR4* WINAPI D3DXVec2TransformArray(D3DXVECTOR4 *pout, UINT outstride, const D3DXVECTOR2 *pv, UINT vstride, const D3DXMATRIX *pm, UINT n);
    356 D3DXVECTOR2* WINAPI D3DXVec2TransformCoord(D3DXVECTOR2 *pout, const D3DXVECTOR2 *pv, const D3DXMATRIX *pm);
    357 D3DXVECTOR2* WINAPI D3DXVec2TransformCoordArray(D3DXVECTOR2 *pout, UINT outstride, const D3DXVECTOR2 *pv, UINT vstride, const D3DXMATRIX *pm, UINT n);
    358 D3DXVECTOR2* WINAPI D3DXVec2TransformNormal(D3DXVECTOR2 *pout, const D3DXVECTOR2 *pv, const D3DXMATRIX *pm);
    359 D3DXVECTOR2* WINAPI D3DXVec2TransformNormalArray(D3DXVECTOR2 *pout, UINT outstride, const D3DXVECTOR2 *pv, UINT vstride, const D3DXMATRIX *pm, UINT n);
    360 
    361 D3DXVECTOR3* WINAPI D3DXVec3BaryCentric(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv1, const D3DXVECTOR3 *pv2, const D3DXVECTOR3 *pv3, FLOAT f, FLOAT g);
    362 D3DXVECTOR3* WINAPI D3DXVec3CatmullRom( D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv0, const D3DXVECTOR3 *pv1, const D3DXVECTOR3 *pv2, const D3DXVECTOR3 *pv3, FLOAT s);
    363 D3DXVECTOR3* WINAPI D3DXVec3Hermite(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv1, const D3DXVECTOR3 *pt1, const D3DXVECTOR3 *pv2, const D3DXVECTOR3 *pt2, FLOAT s);
    364 D3DXVECTOR3* WINAPI D3DXVec3Normalize(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv);
    365 D3DXVECTOR3* WINAPI D3DXVec3Project(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv, const D3DVIEWPORT9 *pviewport, const D3DXMATRIX *pprojection,
    366     const D3DXMATRIX *pview, const D3DXMATRIX *pworld);
    367 D3DXVECTOR3* WINAPI D3DXVec3ProjectArray(D3DXVECTOR3 *pout, UINT outstride, const D3DXVECTOR3 *pv, UINT vstride, const D3DVIEWPORT9 *pviewport,
    368     const D3DXMATRIX *pprojection, const D3DXMATRIX *pview, const D3DXMATRIX *pworld, UINT n);
    369 D3DXVECTOR4* WINAPI D3DXVec3Transform(D3DXVECTOR4 *pout, const D3DXVECTOR3 *pv, const D3DXMATRIX *pm);
    370 D3DXVECTOR4* WINAPI D3DXVec3TransformArray(D3DXVECTOR4 *pout, UINT outstride, const D3DXVECTOR3 *pv, UINT vstride, const D3DXMATRIX *pm, UINT n);
    371 D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv, const D3DXMATRIX *pm);
    372 D3DXVECTOR3* WINAPI D3DXVec3TransformCoordArray(D3DXVECTOR3 *pout, UINT outstride, const D3DXVECTOR3 *pv, UINT vstride, const D3DXMATRIX *pm, UINT n);
    373 D3DXVECTOR3* WINAPI D3DXVec3TransformNormal(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv, const D3DXMATRIX *pm);
    374 D3DXVECTOR3* WINAPI D3DXVec3TransformNormalArray(D3DXVECTOR3 *pout, UINT outstride, const D3DXVECTOR3 *pv, UINT vstride, const D3DXMATRIX *pm, UINT n);
    375 D3DXVECTOR3* WINAPI D3DXVec3Unproject(D3DXVECTOR3 *pout, const D3DXVECTOR3 *pv, const D3DVIEWPORT9 *pviewport, const D3DXMATRIX *pprojection,
    376     const D3DXMATRIX *pview, const D3DXMATRIX *pworld);
    377 D3DXVECTOR3* WINAPI D3DXVec3UnprojectArray(D3DXVECTOR3 *pout, UINT outstride, const D3DXVECTOR3 *pv, UINT vstride, const D3DVIEWPORT9 *pviewport,
    378     const D3DXMATRIX *pprojection, const D3DXMATRIX *pview, const D3DXMATRIX *pworld, UINT n);
    379 D3DXVECTOR4* WINAPI D3DXVec4BaryCentric(D3DXVECTOR4 *pout, const D3DXVECTOR4 *pv1, const D3DXVECTOR4 *pv2, const D3DXVECTOR4 *pv3, FLOAT f, FLOAT g);
    380 D3DXVECTOR4* WINAPI D3DXVec4CatmullRom(D3DXVECTOR4 *pout, const D3DXVECTOR4 *pv0, const D3DXVECTOR4 *pv1, const D3DXVECTOR4 *pv2, const D3DXVECTOR4 *pv3, FLOAT s);
    381 D3DXVECTOR4* WINAPI D3DXVec4Cross(D3DXVECTOR4 *pout, const D3DXVECTOR4 *pv1, const D3DXVECTOR4 *pv2, const D3DXVECTOR4 *pv3);
    382 D3DXVECTOR4* WINAPI D3DXVec4Hermite(D3DXVECTOR4 *pout, const D3DXVECTOR4 *pv1, const D3DXVECTOR4 *pt1, const D3DXVECTOR4 *pv2, const D3DXVECTOR4 *pt2, FLOAT s);
    383 D3DXVECTOR4* WINAPI D3DXVec4Normalize(D3DXVECTOR4 *pout, const D3DXVECTOR4 *pv);
    384 D3DXVECTOR4* WINAPI D3DXVec4Transform(D3DXVECTOR4 *pout, const D3DXVECTOR4 *pv, const D3DXMATRIX *pm);
    385 D3DXVECTOR4* WINAPI D3DXVec4TransformArray(D3DXVECTOR4 *pout, UINT outstride, const D3DXVECTOR4 *pv, UINT vstride, const D3DXMATRIX *pm, UINT n);
    386 
    387 D3DXFLOAT16 *WINAPI D3DXFloat32To16Array(D3DXFLOAT16 *pout, const FLOAT *pin, UINT n);
    388 FLOAT *WINAPI D3DXFloat16To32Array(FLOAT *pout, const D3DXFLOAT16 *pin, UINT n);
    389 
    390 FLOAT* WINAPI D3DXSHAdd(FLOAT *out, UINT order, const FLOAT *a, const FLOAT *b);
    391 FLOAT WINAPI D3DXSHDot(UINT order, const FLOAT *a, const FLOAT *b);
    392 HRESULT WINAPI D3DXSHEvalConeLight(UINT order, const D3DXVECTOR3 *dir, FLOAT radius, FLOAT Rintensity, FLOAT Gintensity, FLOAT Bintensity, FLOAT *rout, FLOAT *gout, FLOAT *bout);
    393 FLOAT* WINAPI D3DXSHEvalDirection(FLOAT *out, UINT order, const D3DXVECTOR3 *dir);
    394 HRESULT WINAPI D3DXSHEvalDirectionalLight(UINT order, const D3DXVECTOR3 *dir, FLOAT Rintensity, FLOAT Gintensity, FLOAT Bintensity, FLOAT *rout, FLOAT *gout, FLOAT *bout);
    395 HRESULT WINAPI D3DXSHEvalHemisphereLight(UINT order, const D3DXVECTOR3 *dir, D3DXCOLOR top, D3DXCOLOR bottom, FLOAT *rout, FLOAT *gout, FLOAT *bout);
    396 HRESULT WINAPI D3DXSHEvalSphericalLight(UINT order, const D3DXVECTOR3 *dir, FLOAT radius, FLOAT Rintensity, FLOAT Gintensity, FLOAT Bintensity, FLOAT *rout, FLOAT *gout, FLOAT *bout);
    397 FLOAT* WINAPI D3DXSHMultiply2(FLOAT *out, const FLOAT *a, const FLOAT *b);
    398 FLOAT* WINAPI D3DXSHMultiply3(FLOAT *out, const FLOAT *a, const FLOAT *b);
    399 FLOAT* WINAPI D3DXSHMultiply4(FLOAT *out, const FLOAT *a, const FLOAT *b);
    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, LPVOID * ppvObj) 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