2 * Copyright 2007 David Adam
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(d3dx8
);
32 /*_________________D3DXMatrix____________________*/
34 FLOAT WINAPI
D3DXMatrixfDeterminant(CONST D3DXMATRIX
*pm
)
36 D3DXVECTOR4 minor
, v1
, v2
, v3
;
39 v1
.x
= pm
->m
[0][0]; v1
.y
= pm
->m
[1][0]; v1
.z
= pm
->m
[2][0]; v1
.w
= pm
->m
[3][0];
40 v2
.x
= pm
->m
[0][1]; v2
.y
= pm
->m
[1][1]; v2
.z
= pm
->m
[2][1]; v2
.w
= pm
->m
[3][1];
41 v3
.x
= pm
->m
[0][2]; v3
.y
= pm
->m
[1][2]; v3
.z
= pm
->m
[2][2]; v3
.w
= pm
->m
[3][2];
42 D3DXVec4Cross(&minor
,&v1
,&v2
,&v3
);
43 det
= - (pm
->m
[0][3] * minor
.x
+ pm
->m
[1][3] * minor
.y
+ pm
->m
[2][3] * minor
.z
+ pm
->m
[3][3] * minor
.w
);
47 D3DXMATRIX
* WINAPI
D3DXMatrixMultiply(D3DXMATRIX
*pout
, CONST D3DXMATRIX
*pm1
, CONST D3DXMATRIX
*pm2
)
55 pout
->m
[i
][j
] = pm1
->m
[i
][0] * pm2
->m
[0][j
] + pm1
->m
[i
][1] * pm2
->m
[1][j
] + pm1
->m
[i
][2] * pm2
->m
[2][j
] + pm1
->m
[i
][3] * pm2
->m
[3][j
];
61 D3DXMATRIX
* WINAPI
D3DXMatrixRotationX(D3DXMATRIX
*pout
, FLOAT angle
)
63 D3DXMatrixIdentity(pout
);
64 pout
->m
[1][1] = cos(angle
);
65 pout
->m
[2][2] = cos(angle
);
66 pout
->m
[1][2] = sin(angle
);
67 pout
->m
[2][1] = -sin(angle
);
71 D3DXMATRIX
* WINAPI
D3DXMatrixRotationY(D3DXMATRIX
*pout
, FLOAT angle
)
73 D3DXMatrixIdentity(pout
);
74 pout
->m
[0][0] = cos(angle
);
75 pout
->m
[2][2] = cos(angle
);
76 pout
->m
[0][2] = -sin(angle
);
77 pout
->m
[2][0] = sin(angle
);
81 D3DXMATRIX
* WINAPI
D3DXMatrixRotationZ(D3DXMATRIX
*pout
, FLOAT angle
)
83 D3DXMatrixIdentity(pout
);
84 pout
->m
[0][0] = cos(angle
);
85 pout
->m
[1][1] = cos(angle
);
86 pout
->m
[0][1] = sin(angle
);
87 pout
->m
[1][0] = -sin(angle
);
91 D3DXMATRIX
* WINAPI
D3DXMatrixScaling(D3DXMATRIX
*pout
, FLOAT sx
, FLOAT sy
, FLOAT sz
)
93 D3DXMatrixIdentity(pout
);
100 D3DXMATRIX
* WINAPI
D3DXMatrixTranslation(D3DXMATRIX
*pout
, FLOAT x
, FLOAT y
, FLOAT z
)
102 D3DXMatrixIdentity(pout
);
109 D3DXMATRIX
* WINAPI
D3DXMatrixTranspose(D3DXMATRIX
*pout
, CONST D3DXMATRIX
*pm
)
117 pout
->m
[i
][j
] = pm
->m
[j
][i
];
123 /*_________________D3DXQUATERNION________________*/
125 D3DXQUATERNION
* WINAPI
D3DXQuaternionNormalize(D3DXQUATERNION
*pout
, CONST D3DXQUATERNION
*pq
)
129 norm
= D3DXQuaternionLength(pq
);
139 pout
->x
= pq
->x
/ norm
;
140 pout
->y
= pq
->y
/ norm
;
141 pout
->z
= pq
->z
/ norm
;
142 pout
->w
= pq
->w
/ norm
;
146 /*_________________D3DXVec2_____________________*/
148 D3DXVECTOR2
* WINAPI
D3DXVec2BaryCentric(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv1
, CONST D3DXVECTOR2
*pv2
, CONST D3DXVECTOR2
*pv3
, FLOAT f
, FLOAT g
)
150 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
151 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
155 D3DXVECTOR2
* WINAPI
D3DXVec2CatmullRom(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv0
, CONST D3DXVECTOR2
*pv1
, CONST D3DXVECTOR2
*pv2
, CONST D3DXVECTOR2
*pv3
, FLOAT s
)
157 pout
->x
= 0.5f
* (2.0f
* pv1
->x
+ (pv2
->x
- pv0
->x
) *s
+ (2.0f
*pv0
->x
- 5.0f
* pv1
->x
+ 4.0f
* pv2
->x
- pv3
->x
) * s
* s
+ (pv3
->x
-3.0f
* pv2
->x
+ 3.0f
* pv1
->x
- pv0
->x
) * s
* s
* s
);
158 pout
->y
= 0.5f
* (2.0f
* pv1
->y
+ (pv2
->y
- pv0
->y
) *s
+ (2.0f
*pv0
->y
- 5.0f
* pv1
->y
+ 4.0f
* pv2
->y
- pv3
->y
) * s
* s
+ (pv3
->y
-3.0f
* pv2
->y
+ 3.0f
* pv1
->y
- pv0
->y
) * s
* s
* s
);
162 D3DXVECTOR2
* WINAPI
D3DXVec2Hermite(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv1
, CONST D3DXVECTOR2
*pt1
, CONST D3DXVECTOR2
*pv2
, CONST D3DXVECTOR2
*pt2
, FLOAT s
)
164 FLOAT h1
, h2
, h3
, h4
;
166 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
167 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
168 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
169 h4
= s
* s
* s
- s
* s
;
171 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
172 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
176 D3DXVECTOR2
* WINAPI
D3DXVec2Normalize(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv
)
180 norm
= D3DXVec2Length(pv
);
188 pout
->x
= pv
->x
/ norm
;
189 pout
->y
= pv
->y
/ norm
;
194 D3DXVECTOR4
* WINAPI
D3DXVec2Transform(D3DXVECTOR4
*pout
, CONST D3DXVECTOR2
*pv
, CONST D3DXMATRIX
*pm
)
196 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[3][0];
197 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[3][1];
198 pout
->z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[3][2];
199 pout
->w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[3][3];
203 D3DXVECTOR2
* WINAPI
D3DXVec2TransformCoord(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv
, CONST D3DXMATRIX
*pm
)
207 norm
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[3][3];
210 pout
->x
= (pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[3][0]) / norm
;
211 pout
->y
= (pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[3][1]) / norm
;
221 D3DXVECTOR2
* WINAPI
D3DXVec2TransformNormal(D3DXVECTOR2
*pout
, CONST D3DXVECTOR2
*pv
, CONST D3DXMATRIX
*pm
)
223 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
;
224 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
;
228 /*_________________D3DXVec3_____________________*/
230 D3DXVECTOR3
* WINAPI
D3DXVec3BaryCentric(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv1
, CONST D3DXVECTOR3
*pv2
, CONST D3DXVECTOR3
*pv3
, FLOAT f
, FLOAT g
)
232 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
233 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
234 pout
->z
= (1.0f
-f
-g
) * (pv1
->z
) + f
* (pv2
->z
) + g
* (pv3
->z
);
238 D3DXVECTOR3
* WINAPI
D3DXVec3CatmullRom( D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv0
, CONST D3DXVECTOR3
*pv1
, CONST D3DXVECTOR3
*pv2
, CONST D3DXVECTOR3
*pv3
, FLOAT s
)
240 pout
->x
= 0.5f
* (2.0f
* pv1
->x
+ (pv2
->x
- pv0
->x
) *s
+ (2.0f
*pv0
->x
- 5.0f
* pv1
->x
+ 4.0f
* pv2
->x
- pv3
->x
) * s
* s
+ (pv3
->x
-3.0f
* pv2
->x
+ 3.0f
* pv1
->x
- pv0
->x
) * s
* s
* s
);
241 pout
->y
= 0.5f
* (2.0f
* pv1
->y
+ (pv2
->y
- pv0
->y
) *s
+ (2.0f
*pv0
->y
- 5.0f
* pv1
->y
+ 4.0f
* pv2
->y
- pv3
->y
) * s
* s
+ (pv3
->y
-3.0f
* pv2
->y
+ 3.0f
* pv1
->y
- pv0
->y
) * s
* s
* s
);
242 pout
->z
= 0.5f
* (2.0f
* pv1
->z
+ (pv2
->z
- pv0
->z
) *s
+ (2.0f
*pv0
->z
- 5.0f
* pv1
->z
+ 4.0f
* pv2
->z
- pv3
->z
) * s
* s
+ (pv3
->z
-3.0f
* pv2
->z
+ 3.0f
* pv1
->z
- pv0
->z
) * s
* s
* s
);
246 D3DXVECTOR3
* WINAPI
D3DXVec3Hermite(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv1
, CONST D3DXVECTOR3
*pt1
, CONST D3DXVECTOR3
*pv2
, CONST D3DXVECTOR3
*pt2
, FLOAT s
)
248 FLOAT h1
, h2
, h3
, h4
;
250 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
251 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
252 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
253 h4
= s
* s
* s
- s
* s
;
255 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
256 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
257 pout
->z
= h1
* (pv1
->z
) + h2
* (pt1
->z
) + h3
* (pv2
->z
) + h4
* (pt2
->z
);
261 D3DXVECTOR3
* WINAPI
D3DXVec3Normalize(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv
)
265 norm
= D3DXVec3Length(pv
);
274 pout
->x
= pv
->x
/ norm
;
275 pout
->y
= pv
->y
/ norm
;
276 pout
->z
= pv
->z
/ norm
;
281 D3DXVECTOR4
* WINAPI
D3DXVec3Transform(D3DXVECTOR4
*pout
, CONST D3DXVECTOR3
*pv
, CONST D3DXMATRIX
*pm
)
283 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0];
284 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1];
285 pout
->z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2];
286 pout
->w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] * pv
->z
+ pm
->m
[3][3];
290 D3DXVECTOR3
* WINAPI
D3DXVec3TransformCoord(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv
, CONST D3DXMATRIX
*pm
)
294 norm
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] *pv
->z
+ pm
->m
[3][3];
298 pout
->x
= (pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0]) / norm
;
299 pout
->y
= (pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1]) / norm
;
300 pout
->z
= (pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2]) / norm
;
311 D3DXVECTOR3
* WINAPI
D3DXVec3TransformNormal(D3DXVECTOR3
*pout
, CONST D3DXVECTOR3
*pv
, CONST D3DXMATRIX
*pm
)
313 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
;
314 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
;
315 pout
->z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
;
320 /*_________________D3DXVec4_____________________*/
322 D3DXVECTOR4
* WINAPI
D3DXVec4BaryCentric(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pv3
, FLOAT f
, FLOAT g
)
324 pout
->x
= (1.0f
-f
-g
) * (pv1
->x
) + f
* (pv2
->x
) + g
* (pv3
->x
);
325 pout
->y
= (1.0f
-f
-g
) * (pv1
->y
) + f
* (pv2
->y
) + g
* (pv3
->y
);
326 pout
->z
= (1.0f
-f
-g
) * (pv1
->z
) + f
* (pv2
->z
) + g
* (pv3
->z
);
327 pout
->w
= (1.0f
-f
-g
) * (pv1
->w
) + f
* (pv2
->w
) + g
* (pv3
->w
);
331 D3DXVECTOR4
* WINAPI
D3DXVec4CatmullRom(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv0
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pv3
, FLOAT s
)
333 pout
->x
= 0.5f
* (2.0f
* pv1
->x
+ (pv2
->x
- pv0
->x
) *s
+ (2.0f
*pv0
->x
- 5.0f
* pv1
->x
+ 4.0f
* pv2
->x
- pv3
->x
) * s
* s
+ (pv3
->x
-3.0f
* pv2
->x
+ 3.0f
* pv1
->x
- pv0
->x
) * s
* s
* s
);
334 pout
->y
= 0.5f
* (2.0f
* pv1
->y
+ (pv2
->y
- pv0
->y
) *s
+ (2.0f
*pv0
->y
- 5.0f
* pv1
->y
+ 4.0f
* pv2
->y
- pv3
->y
) * s
* s
+ (pv3
->y
-3.0f
* pv2
->y
+ 3.0f
* pv1
->y
- pv0
->y
) * s
* s
* s
);
335 pout
->z
= 0.5f
* (2.0f
* pv1
->z
+ (pv2
->z
- pv0
->z
) *s
+ (2.0f
*pv0
->z
- 5.0f
* pv1
->z
+ 4.0f
* pv2
->z
- pv3
->z
) * s
* s
+ (pv3
->z
-3.0f
* pv2
->z
+ 3.0f
* pv1
->z
- pv0
->z
) * s
* s
* s
);
336 pout
->w
= 0.5f
* (2.0f
* pv1
->w
+ (pv2
->w
- pv0
->w
) *s
+ (2.0f
*pv0
->w
- 5.0f
* pv1
->w
+ 4.0f
* pv2
->w
- pv3
->w
) * s
* s
+ (pv3
->w
-3.0f
* pv2
->w
+ 3.0f
* pv1
->w
- pv0
->w
) * s
* s
* s
);
340 D3DXVECTOR4
* WINAPI
D3DXVec4Cross(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pv3
)
342 pout
->x
= pv1
->y
* (pv2
->z
* pv3
->w
- pv3
->z
* pv2
->w
) - pv1
->z
* (pv2
->y
* pv3
->w
- pv3
->y
* pv2
->w
) + pv1
->w
* (pv2
->y
* pv3
->z
- pv2
->z
*pv3
->y
);
343 pout
->y
= -(pv1
->x
* (pv2
->z
* pv3
->w
- pv3
->z
* pv2
->w
) - pv1
->z
* (pv2
->x
* pv3
->w
- pv3
->x
* pv2
->w
) + pv1
->w
* (pv2
->x
* pv3
->z
- pv3
->x
* pv2
->z
));
344 pout
->z
= pv1
->x
* (pv2
->y
* pv3
->w
- pv3
->y
* pv2
->w
) - pv1
->y
* (pv2
->x
*pv3
->w
- pv3
->x
* pv2
->w
) + pv1
->w
* (pv2
->x
* pv3
->y
- pv3
->x
* pv2
->y
);
345 pout
->w
= -(pv1
->x
* (pv2
->y
* pv3
->z
- pv3
->y
* pv2
->z
) - pv1
->y
* (pv2
->x
* pv3
->z
- pv3
->x
*pv2
->z
) + pv1
->z
* (pv2
->x
* pv3
->y
- pv3
->x
* pv2
->y
));
349 D3DXVECTOR4
* WINAPI
D3DXVec4Hermite(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv1
, CONST D3DXVECTOR4
*pt1
, CONST D3DXVECTOR4
*pv2
, CONST D3DXVECTOR4
*pt2
, FLOAT s
)
351 FLOAT h1
, h2
, h3
, h4
;
353 h1
= 2.0f
* s
* s
* s
- 3.0f
* s
* s
+ 1.0f
;
354 h2
= s
* s
* s
- 2.0f
* s
* s
+ s
;
355 h3
= -2.0f
* s
* s
* s
+ 3.0f
* s
* s
;
356 h4
= s
* s
* s
- s
* s
;
358 pout
->x
= h1
* (pv1
->x
) + h2
* (pt1
->x
) + h3
* (pv2
->x
) + h4
* (pt2
->x
);
359 pout
->y
= h1
* (pv1
->y
) + h2
* (pt1
->y
) + h3
* (pv2
->y
) + h4
* (pt2
->y
);
360 pout
->z
= h1
* (pv1
->z
) + h2
* (pt1
->z
) + h3
* (pv2
->z
) + h4
* (pt2
->z
);
361 pout
->w
= h1
* (pv1
->w
) + h2
* (pt1
->w
) + h3
* (pv2
->w
) + h4
* (pt2
->w
);
365 D3DXVECTOR4
* WINAPI
D3DXVec4Normalize(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv
)
369 norm
= D3DXVec4Length(pv
);
379 pout
->x
= pv
->x
/ norm
;
380 pout
->y
= pv
->y
/ norm
;
381 pout
->z
= pv
->z
/ norm
;
382 pout
->w
= pv
->w
/ norm
;
387 D3DXVECTOR4
* WINAPI
D3DXVec4Transform(D3DXVECTOR4
*pout
, CONST D3DXVECTOR4
*pv
, CONST D3DXMATRIX
*pm
)
389 pout
->x
= pm
->m
[0][0] * pv
->x
+ pm
->m
[1][0] * pv
->y
+ pm
->m
[2][0] * pv
->z
+ pm
->m
[3][0] * pv
->w
;
390 pout
->y
= pm
->m
[0][1] * pv
->x
+ pm
->m
[1][1] * pv
->y
+ pm
->m
[2][1] * pv
->z
+ pm
->m
[3][1] * pv
->w
;
391 pout
->z
= pm
->m
[0][2] * pv
->x
+ pm
->m
[1][2] * pv
->y
+ pm
->m
[2][2] * pv
->z
+ pm
->m
[3][2] * pv
->w
;
392 pout
->w
= pm
->m
[0][3] * pv
->x
+ pm
->m
[1][3] * pv
->y
+ pm
->m
[2][3] * pv
->z
+ pm
->m
[3][3] * pv
->w
;