Release 1.4-rc5.
[wine] / dlls / d3dx9_36 / tests / math.c
1 /*
2  * Copyright 2008 David Adam
3  * Copyright 2008 Luis Busquets
4  * Copyright 2008 Philip Nilsson
5  * Copyright 2008 Henri Verbeet
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include "wine/test.h"
23 #include "d3dx9.h"
24 #include <math.h>
25
26 #define ARRAY_SIZE 5
27
28 #define admitted_error 0.0001f
29
30 #define relative_error(exp, out) ((exp == 0.0f) ? fabs(exp - out) : (fabs(1.0f - (out) / (exp))))
31
32 #define expect_color(expectedcolor,gotcolor) ok((relative_error(expectedcolor.r, gotcolor.r)<admitted_error)&&(relative_error(expectedcolor.g, gotcolor.g)<admitted_error)&&(relative_error(expectedcolor.b, gotcolor.b)<admitted_error)&&(relative_error(expectedcolor.a, gotcolor.a)<admitted_error),"Expected Color= (%f, %f, %f, %f)\n , Got Color= (%f, %f, %f, %f)\n", expectedcolor.r, expectedcolor.g, expectedcolor.b, expectedcolor.a, gotcolor.r, gotcolor.g, gotcolor.b, gotcolor.a);
33
34 static inline BOOL compare_matrix(const D3DXMATRIX *m1, const D3DXMATRIX *m2)
35 {
36     int i, j;
37
38     for (i = 0; i < 4; ++i)
39     {
40         for (j = 0; j < 4; ++j)
41         {
42             if (relative_error(U(*m1).m[i][j], U(*m2).m[i][j]) > admitted_error)
43                 return FALSE;
44         }
45     }
46
47     return TRUE;
48 }
49
50 #define expect_mat(expectedmat, gotmat) \
51 do { \
52     const D3DXMATRIX *__m1 = (expectedmat); \
53     const D3DXMATRIX *__m2 = (gotmat); \
54     ok(compare_matrix(__m1, __m2), "Expected matrix=\n(%f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n)\n\n" \
55             "Got matrix=\n(%f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f)\n", \
56             U(*__m1).m[0][0], U(*__m1).m[0][1], U(*__m1).m[0][2], U(*__m1).m[0][3], \
57             U(*__m1).m[1][0], U(*__m1).m[1][1], U(*__m1).m[1][2], U(*__m1).m[1][3], \
58             U(*__m1).m[2][0], U(*__m1).m[2][1], U(*__m1).m[2][2], U(*__m1).m[2][3], \
59             U(*__m1).m[3][0], U(*__m1).m[3][1], U(*__m1).m[3][2], U(*__m1).m[3][3], \
60             U(*__m2).m[0][0], U(*__m2).m[0][1], U(*__m2).m[0][2], U(*__m2).m[0][3], \
61             U(*__m2).m[1][0], U(*__m2).m[1][1], U(*__m2).m[1][2], U(*__m2).m[1][3], \
62             U(*__m2).m[2][0], U(*__m2).m[2][1], U(*__m2).m[2][2], U(*__m2).m[2][3], \
63             U(*__m2).m[3][0], U(*__m2).m[3][1], U(*__m2).m[3][2], U(*__m2).m[3][3]); \
64 } while(0)
65
66 #define compare_rotation(exp, got) \
67     ok(relative_error(exp.w, got.w) < admitted_error && \
68        relative_error(exp.x, got.x) < admitted_error && \
69        relative_error(exp.y, got.y) < admitted_error && \
70        relative_error(exp.z, got.z) < admitted_error, \
71        "Expected rotation = (%f, %f, %f, %f), \
72         got rotation = (%f, %f, %f, %f)\n", \
73         exp.w, exp.x, exp.y, exp.z, got.w, got.x, got.y, got.z)
74
75 #define compare_scale(exp, got) \
76     ok(relative_error(exp.x, got.x) < admitted_error && \
77        relative_error(exp.y, got.y) < admitted_error && \
78        relative_error(exp.z, got.z) < admitted_error, \
79        "Expected scale = (%f, %f, %f), \
80         got scale = (%f, %f, %f)\n", \
81         exp.x, exp.y, exp.z, got.x, got.y, got.z)
82
83 #define compare_translation(exp, got) \
84     ok(relative_error(exp.x, got.x) < admitted_error && \
85        relative_error(exp.y, got.y) < admitted_error && \
86        relative_error(exp.z, got.z) < admitted_error, \
87        "Expected translation = (%f, %f, %f), \
88         got translation = (%f, %f, %f)\n", \
89         exp.x, exp.y, exp.z, got.x, got.y, got.z)
90
91 #define compare_vectors(exp, out) \
92     for (i = 0; i < ARRAY_SIZE + 2; ++i) { \
93         ok(relative_error(exp[i].x, out[i].x) < admitted_error && \
94            relative_error(exp[i].y, out[i].y) < admitted_error && \
95            relative_error(exp[i].z, out[i].z) < admitted_error && \
96            relative_error(exp[i].w, out[i].w) < admitted_error, \
97             "Got (%f, %f, %f, %f), expected (%f, %f, %f, %f) for index %d.\n", \
98             out[i].x, out[i].y, out[i].z, out[i].w, \
99             exp[i].x, exp[i].y, exp[i].z, exp[i].w, \
100             i); \
101     }
102
103 #define compare_planes(exp, out) \
104     for (i = 0; i < ARRAY_SIZE + 2; ++i) { \
105         ok(relative_error(exp[i].a, out[i].a) < admitted_error && \
106            relative_error(exp[i].b, out[i].b) < admitted_error && \
107            relative_error(exp[i].c, out[i].c) < admitted_error && \
108            relative_error(exp[i].d, out[i].d) < admitted_error, \
109             "Got (%f, %f, %f, %f), expected (%f, %f, %f, %f) for index %d.\n", \
110             out[i].a, out[i].b, out[i].c, out[i].d, \
111             exp[i].a, exp[i].b, exp[i].c, exp[i].d, \
112             i); \
113     }
114
115 #define expect_plane(expectedplane,gotplane) ok((relative_error(expectedplane.a, gotplane.a)<admitted_error)&&(relative_error(expectedplane.b, gotplane.b)<admitted_error)&&(relative_error(expectedplane.c, gotplane.c)<admitted_error)&&(relative_error(expectedplane.d, gotplane.d)<admitted_error),"Expected Plane= (%f, %f, %f, %f)\n , Got Plane= (%f, %f, %f, %f)\n", expectedplane.a, expectedplane.b, expectedplane.c, expectedplane.d, gotplane.a, gotplane.b, gotplane.c, gotplane.d);
116
117 #define expect_vec(expectedvec,gotvec) ok((relative_error(expectedvec.x, gotvec.x)<admitted_error)&&(relative_error(expectedvec.y, gotvec.y)<admitted_error),"Expected Vector= (%f, %f)\n , Got Vector= (%f, %f)\n", expectedvec.x, expectedvec.y, gotvec.x, gotvec.y);
118
119 #define expect_vec3(expectedvec,gotvec) ok((relative_error(expectedvec.x, gotvec.x)<admitted_error)&&(relative_error(expectedvec.y, gotvec.y)<admitted_error)&&(relative_error(expectedvec.z, gotvec.z)<admitted_error),"Expected Vector= (%f, %f, %f)\n , Got Vector= (%f, %f, %f)\n", expectedvec.x, expectedvec.y, expectedvec.z, gotvec.x, gotvec.y, gotvec.z);
120
121 #define expect_vec4(expectedvec,gotvec) ok((relative_error(expectedvec.x, gotvec.x)<admitted_error)&&(relative_error(expectedvec.y, gotvec.y)<admitted_error)&&(relative_error(expectedvec.z, gotvec.z)<admitted_error)&&(relative_error(expectedvec.w, gotvec.w)<admitted_error),"Expected Vector= (%f, %f, %f, %f)\n , Got Vector= (%f, %f, %f, %f)\n", expectedvec.x, expectedvec.y, expectedvec.z, expectedvec.w, gotvec.x, gotvec.y, gotvec.z, gotvec.w);
122
123
124 static void D3DXColorTest(void)
125 {
126     D3DXCOLOR color, color1, color2, expected, got;
127     LPD3DXCOLOR funcpointer;
128     FLOAT scale;
129
130     color.r = 0.2f; color.g = 0.75f; color.b = 0.41f; color.a = 0.93f;
131     color1.r = 0.6f; color1.g = 0.55f; color1.b = 0.23f; color1.a = 0.82f;
132     color2.r = 0.3f; color2.g = 0.5f; color2.b = 0.76f; color2.a = 0.11f;
133
134     scale = 0.3f;
135
136 /*_______________D3DXColorAdd________________*/
137     expected.r = 0.9f; expected.g = 1.05f; expected.b = 0.99f, expected.a = 0.93f;
138     D3DXColorAdd(&got,&color1,&color2);
139     expect_color(expected,got);
140     /* Test the NULL case */
141     funcpointer = D3DXColorAdd(&got,NULL,&color2);
142     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
143     funcpointer = D3DXColorAdd(NULL,NULL,&color2);
144     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
145     funcpointer = D3DXColorAdd(NULL,NULL,NULL);
146     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
147
148 /*_______________D3DXColorAdjustContrast______*/
149     expected.r = 0.41f; expected.g = 0.575f; expected.b = 0.473f, expected.a = 0.93f;
150     D3DXColorAdjustContrast(&got,&color,scale);
151     expect_color(expected,got);
152
153 /*_______________D3DXColorAdjustSaturation______*/
154     expected.r = 0.486028f; expected.g = 0.651028f; expected.b = 0.549028f, expected.a = 0.93f;
155     D3DXColorAdjustSaturation(&got,&color,scale);
156     expect_color(expected,got);
157
158 /*_______________D3DXColorLerp________________*/
159     expected.r = 0.32f; expected.g = 0.69f; expected.b = 0.356f; expected.a = 0.897f;
160     D3DXColorLerp(&got,&color,&color1,scale);
161     expect_color(expected,got);
162     /* Test the NULL case */
163     funcpointer = D3DXColorLerp(&got,NULL,&color1,scale);
164     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
165     funcpointer = D3DXColorLerp(NULL,NULL,&color1,scale);
166     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
167     funcpointer = D3DXColorLerp(NULL,NULL,NULL,scale);
168     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
169
170 /*_______________D3DXColorModulate________________*/
171     expected.r = 0.18f; expected.g = 0.275f; expected.b = 0.1748f; expected.a = 0.0902f;
172     D3DXColorModulate(&got,&color1,&color2);
173     expect_color(expected,got);
174     /* Test the NULL case */
175     funcpointer = D3DXColorModulate(&got,NULL,&color2);
176     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
177     funcpointer = D3DXColorModulate(NULL,NULL,&color2);
178     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
179     funcpointer = D3DXColorModulate(NULL,NULL,NULL);
180     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
181
182 /*_______________D3DXColorNegative________________*/
183     expected.r = 0.8f; expected.g = 0.25f; expected.b = 0.59f; expected.a = 0.93f;
184     D3DXColorNegative(&got,&color);
185     expect_color(got,expected);
186     /* Test the greater than 1 case */
187     color1.r = 0.2f; color1.g = 1.75f; color1.b = 0.41f; color1.a = 0.93f;
188     expected.r = 0.8f; expected.g = -0.75f; expected.b = 0.59f; expected.a = 0.93f;
189     D3DXColorNegative(&got,&color1);
190     expect_color(got,expected);
191     /* Test the negative case */
192     color1.r = 0.2f; color1.g = -0.75f; color1.b = 0.41f; color1.a = 0.93f;
193     expected.r = 0.8f; expected.g = 1.75f; expected.b = 0.59f; expected.a = 0.93f;
194     D3DXColorNegative(&got,&color1);
195     expect_color(got,expected);
196     /* Test the NULL case */
197     funcpointer = D3DXColorNegative(&got,NULL);
198     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
199     funcpointer = D3DXColorNegative(NULL,NULL);
200     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
201
202 /*_______________D3DXColorScale________________*/
203     expected.r = 0.06f; expected.g = 0.225f; expected.b = 0.123f; expected.a = 0.279f;
204     D3DXColorScale(&got,&color,scale);
205     expect_color(expected,got);
206     /* Test the NULL case */
207     funcpointer = D3DXColorScale(&got,NULL,scale);
208     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
209     funcpointer = D3DXColorScale(NULL,NULL,scale);
210     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
211
212 /*_______________D3DXColorSubtract_______________*/
213     expected.r = -0.1f; expected.g = 0.25f; expected.b = -0.35f, expected.a = 0.82f;
214     D3DXColorSubtract(&got,&color,&color2);
215     expect_color(expected,got);
216     /* Test the NULL case */
217     funcpointer = D3DXColorSubtract(&got,NULL,&color2);
218     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
219     funcpointer = D3DXColorSubtract(NULL,NULL,&color2);
220     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
221     funcpointer = D3DXColorSubtract(NULL,NULL,NULL);
222     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
223 }
224
225 static void D3DXFresnelTest(void)
226 {
227     FLOAT expected, got;
228
229     expected = 0.089187;
230     got = D3DXFresnelTerm(0.5f,1.5);
231     ok(relative_error(got, expected) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
232 }
233
234 static void D3DXMatrixTest(void)
235 {
236     D3DXMATRIX expectedmat, gotmat, mat, mat2, mat3;
237     LPD3DXMATRIX funcpointer;
238     D3DXPLANE plane;
239     D3DXQUATERNION q, r;
240     D3DXVECTOR3 at, axis, eye, last;
241     D3DXVECTOR4 light;
242     BOOL expected, got;
243     FLOAT angle, determinant, expectedfloat, gotfloat;
244
245     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
246     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
247     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
248     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
249     U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f;
250     U(mat).m[3][3] = -40.0f;
251
252     U(mat2).m[0][0] = 1.0f; U(mat2).m[1][0] = 2.0f; U(mat2).m[2][0] = 3.0f;
253     U(mat2).m[3][0] = 4.0f; U(mat2).m[0][1] = 5.0f; U(mat2).m[1][1] = 6.0f;
254     U(mat2).m[2][1] = 7.0f; U(mat2).m[3][1] = 8.0f; U(mat2).m[0][2] = -8.0f;
255     U(mat2).m[1][2] = -7.0f; U(mat2).m[2][2] = -6.0f; U(mat2).m[3][2] = -5.0f;
256     U(mat2).m[0][3] = -4.0f; U(mat2).m[1][3] = -3.0f; U(mat2).m[2][3] = -2.0f;
257     U(mat2).m[3][3] = -1.0f;
258
259     plane.a = -3.0f; plane.b = -1.0f; plane.c = 4.0f; plane.d = 7.0f;
260
261     q.x = 1.0f; q.y = -4.0f; q.z =7.0f; q.w = -11.0f;
262     r.x = 0.87f; r.y = 0.65f; r.z =0.43f; r.w= 0.21f;
263
264     at.x = -2.0f; at.y = 13.0f; at.z = -9.0f;
265     axis.x = 1.0f; axis.y = -3.0f; axis.z = 7.0f;
266     eye.x = 8.0f; eye.y = -5.0f; eye.z = 5.75f;
267     last.x = 9.7f; last.y = -8.6; last.z = 1.3f;
268
269     light.x = 9.6f; light.y = 8.5f; light.z = 7.4; light.w = 6.3;
270
271     angle = D3DX_PI/3.0f;
272
273 /*____________D3DXMatrixAffineTransformation______*/
274     U(expectedmat).m[0][0] = -459.239990f; U(expectedmat).m[0][1] = -576.719971f; U(expectedmat).m[0][2] = -263.440002f; U(expectedmat).m[0][3] = 0.0f;
275     U(expectedmat).m[1][0] = 519.760010f; U(expectedmat).m[1][1] = -352.440002f; U(expectedmat).m[1][2] = -277.679993f; U(expectedmat).m[1][3] = 0.0f;
276     U(expectedmat).m[2][0] = 363.119995f; U(expectedmat).m[2][1] = -121.040001f; U(expectedmat).m[2][2] = -117.479996f; U(expectedmat).m[2][3] = 0.0f;
277     U(expectedmat).m[3][0] = -1239.0f; U(expectedmat).m[3][1] = 667.0f; U(expectedmat).m[3][2] = 567.0f; U(expectedmat).m[3][3] = 1.0f;
278     D3DXMatrixAffineTransformation(&gotmat,3.56f,&at,&q,&axis);
279     expect_mat(&expectedmat, &gotmat);
280 /* Test the NULL case */
281     U(expectedmat).m[0][0] = -459.239990f; U(expectedmat).m[0][1] = -576.719971f; U(expectedmat).m[0][2] = -263.440002f; U(expectedmat).m[0][3] = 0.0f;
282     U(expectedmat).m[1][0] = 519.760010f; U(expectedmat).m[1][1] = -352.440002f; U(expectedmat).m[1][2] = -277.679993f; U(expectedmat).m[1][3] = 0.0f;
283     U(expectedmat).m[2][0] = 363.119995f; U(expectedmat).m[2][1] = -121.040001f; U(expectedmat).m[2][2] = -117.479996f; U(expectedmat).m[2][3] = 0.0f;
284     U(expectedmat).m[3][0] = 1.0f; U(expectedmat).m[3][1] = -3.0f; U(expectedmat).m[3][2] = 7.0f; U(expectedmat).m[3][3] = 1.0f;
285     D3DXMatrixAffineTransformation(&gotmat,3.56f,NULL,&q,&axis);
286     expect_mat(&expectedmat, &gotmat);
287
288 /*____________D3DXMatrixfDeterminant_____________*/
289     expectedfloat = -147888.0f;
290     gotfloat = D3DXMatrixDeterminant(&mat);
291     ok(relative_error(gotfloat, expectedfloat ) < admitted_error, "Expected: %f, Got: %f\n", expectedfloat, gotfloat);
292
293 /*____________D3DXMatrixInverse______________*/
294     U(expectedmat).m[0][0] = 16067.0f/73944.0f; U(expectedmat).m[0][1] = -10165.0f/147888.0f; U(expectedmat).m[0][2] = -2729.0f/147888.0f; U(expectedmat).m[0][3] = -1631.0f/49296.0f;
295     U(expectedmat).m[1][0] = -565.0f/36972.0f; U(expectedmat).m[1][1] = 2723.0f/73944.0f; U(expectedmat).m[1][2] = -1073.0f/73944.0f; U(expectedmat).m[1][3] = 289.0f/24648.0f;
296     U(expectedmat).m[2][0] = -389.0f/2054.0f; U(expectedmat).m[2][1] = 337.0f/4108.0f; U(expectedmat).m[2][2] = 181.0f/4108.0f; U(expectedmat).m[2][3] = 317.0f/4108.0f;
297     U(expectedmat).m[3][0] = 163.0f/5688.0f; U(expectedmat).m[3][1] = -101.0f/11376.0f; U(expectedmat).m[3][2] = -73.0f/11376.0f; U(expectedmat).m[3][3] = -127.0f/3792.0f;
298     expectedfloat = -147888.0f;
299     D3DXMatrixInverse(&gotmat,&determinant,&mat);
300     expect_mat(&expectedmat, &gotmat);
301     ok(relative_error( determinant, expectedfloat ) < admitted_error, "Expected: %f, Got: %f\n", expectedfloat, determinant);
302     funcpointer = D3DXMatrixInverse(&gotmat,NULL,&mat2);
303     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
304
305 /*____________D3DXMatrixIsIdentity______________*/
306     expected = FALSE;
307     memset(&mat3, 0, sizeof(mat3));
308     got = D3DXMatrixIsIdentity(&mat3);
309     ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
310     D3DXMatrixIdentity(&mat3);
311     expected = TRUE;
312     got = D3DXMatrixIsIdentity(&mat3);
313     ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
314     U(mat3).m[0][0] = 0.000009f;
315     expected = FALSE;
316     got = D3DXMatrixIsIdentity(&mat3);
317     ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
318     /* Test the NULL case */
319     expected = FALSE;
320     got = D3DXMatrixIsIdentity(NULL);
321     ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
322
323 /*____________D3DXMatrixLookatLH_______________*/
324     U(expectedmat).m[0][0] = -0.822465f; U(expectedmat).m[0][1] = -0.409489f; U(expectedmat).m[0][2] = -0.394803f; U(expectedmat).m[0][3] = 0.0f;
325     U(expectedmat).m[1][0] = -0.555856f; U(expectedmat).m[1][1] = 0.431286f; U(expectedmat).m[1][2] = 0.710645f; U(expectedmat).m[1][3] = 0.0f;
326     U(expectedmat).m[2][0] = -0.120729f; U(expectedmat).m[2][1] = 0.803935f; U(expectedmat).m[2][2] = -0.582335f; U(expectedmat).m[2][3] = 0.0f;
327     U(expectedmat).m[3][0] = 4.494634f; U(expectedmat).m[3][1] = 0.809719f; U(expectedmat).m[3][2] = 10.060076f; U(expectedmat).m[3][3] = 1.0f;
328     D3DXMatrixLookAtLH(&gotmat,&eye,&at,&axis);
329     expect_mat(&expectedmat, &gotmat);
330
331 /*____________D3DXMatrixLookatRH_______________*/
332     U(expectedmat).m[0][0] = 0.822465f; U(expectedmat).m[0][1] = -0.409489f; U(expectedmat).m[0][2] = 0.394803f; U(expectedmat).m[0][3] = 0.0f;
333     U(expectedmat).m[1][0] = 0.555856f; U(expectedmat).m[1][1] = 0.431286f; U(expectedmat).m[1][2] = -0.710645f; U(expectedmat).m[1][3] = 0.0f;
334     U(expectedmat).m[2][0] = 0.120729f; U(expectedmat).m[2][1] = 0.803935f; U(expectedmat).m[2][2] = 0.582335f; U(expectedmat).m[2][3] = 0.0f;
335     U(expectedmat).m[3][0] = -4.494634f; U(expectedmat).m[3][1] = 0.809719f; U(expectedmat).m[3][2] = -10.060076f; U(expectedmat).m[3][3] = 1.0f;
336     D3DXMatrixLookAtRH(&gotmat,&eye,&at,&axis);
337     expect_mat(&expectedmat, &gotmat);
338
339 /*____________D3DXMatrixMultiply______________*/
340     U(expectedmat).m[0][0] = 73.0f; U(expectedmat).m[0][1] = 193.0f; U(expectedmat).m[0][2] = -197.0f; U(expectedmat).m[0][3] = -77.0f;
341     U(expectedmat).m[1][0] = 231.0f; U(expectedmat).m[1][1] = 551.0f; U(expectedmat).m[1][2] = -489.0f; U(expectedmat).m[1][3] = -169.0;
342     U(expectedmat).m[2][0] = 239.0f; U(expectedmat).m[2][1] = 523.0f; U(expectedmat).m[2][2] = -400.0f; U(expectedmat).m[2][3] = -116.0f;
343     U(expectedmat).m[3][0] = -164.0f; U(expectedmat).m[3][1] = -320.0f; U(expectedmat).m[3][2] = 187.0f; U(expectedmat).m[3][3] = 31.0f;
344     D3DXMatrixMultiply(&gotmat,&mat,&mat2);
345     expect_mat(&expectedmat, &gotmat);
346
347 /*____________D3DXMatrixMultiplyTranspose____*/
348     U(expectedmat).m[0][0] = 73.0f; U(expectedmat).m[0][1] = 231.0f; U(expectedmat).m[0][2] = 239.0f; U(expectedmat).m[0][3] = -164.0f;
349     U(expectedmat).m[1][0] = 193.0f; U(expectedmat).m[1][1] = 551.0f; U(expectedmat).m[1][2] = 523.0f; U(expectedmat).m[1][3] = -320.0;
350     U(expectedmat).m[2][0] = -197.0f; U(expectedmat).m[2][1] = -489.0f; U(expectedmat).m[2][2] = -400.0f; U(expectedmat).m[2][3] = 187.0f;
351     U(expectedmat).m[3][0] = -77.0f; U(expectedmat).m[3][1] = -169.0f; U(expectedmat).m[3][2] = -116.0f; U(expectedmat).m[3][3] = 31.0f;
352     D3DXMatrixMultiplyTranspose(&gotmat,&mat,&mat2);
353     expect_mat(&expectedmat, &gotmat);
354
355 /*____________D3DXMatrixOrthoLH_______________*/
356     U(expectedmat).m[0][0] = 0.8f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
357     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 0.270270f; U(expectedmat).m[1][2] = 0.0f; U(expectedmat).m[1][3] = 0.0f;
358     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = -0.151515f; U(expectedmat).m[2][3] = 0.0f;
359     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = -0.484848f; U(expectedmat).m[3][3] = 1.0f;
360     D3DXMatrixOrthoLH(&gotmat, 2.5f, 7.4f, -3.2f, -9.8f);
361     expect_mat(&expectedmat, &gotmat);
362
363 /*____________D3DXMatrixOrthoOffCenterLH_______________*/
364     U(expectedmat).m[0][0] = 3.636364f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
365     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 0.180180f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
366     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = -0.045662f; U(expectedmat).m[2][3] = 0.0f;
367     U(expectedmat).m[3][0] = -1.727272f; U(expectedmat).m[3][1] = -0.567568f; U(expectedmat).m[3][2] = 0.424658f; U(expectedmat).m[3][3] = 1.0f;
368     D3DXMatrixOrthoOffCenterLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 9.3, -12.6);
369     expect_mat(&expectedmat, &gotmat);
370
371 /*____________D3DXMatrixOrthoOffCenterRH_______________*/
372     U(expectedmat).m[0][0] = 3.636364f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
373     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 0.180180f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
374     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 0.045662f; U(expectedmat).m[2][3] = 0.0f;
375     U(expectedmat).m[3][0] = -1.727272f; U(expectedmat).m[3][1] = -0.567568f; U(expectedmat).m[3][2] = 0.424658f; U(expectedmat).m[3][3] = 1.0f;
376     D3DXMatrixOrthoOffCenterRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 9.3, -12.6);
377     expect_mat(&expectedmat, &gotmat);
378
379 /*____________D3DXMatrixOrthoRH_______________*/
380     U(expectedmat).m[0][0] = 0.8f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
381     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 0.270270f; U(expectedmat).m[1][2] = 0.0f; U(expectedmat).m[1][3] = 0.0f;
382     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 0.151515f; U(expectedmat).m[2][3] = 0.0f;
383     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = -0.484848f; U(expectedmat).m[3][3] = 1.0f;
384     D3DXMatrixOrthoRH(&gotmat, 2.5f, 7.4f, -3.2f, -9.8f);
385     expect_mat(&expectedmat, &gotmat);
386
387 /*____________D3DXMatrixPerspectiveFovLH_______________*/
388     U(expectedmat).m[0][0] = 13.288858f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
389     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 9.966644f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
390     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 0.783784f; U(expectedmat).m[2][3] = 1.0f;
391     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 1.881081f; U(expectedmat).m[3][3] = 0.0f;
392     D3DXMatrixPerspectiveFovLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
393     expect_mat(&expectedmat, &gotmat);
394
395 /*____________D3DXMatrixPerspectiveFovRH_______________*/
396     U(expectedmat).m[0][0] = 13.288858f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
397     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 9.966644f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
398     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = -0.783784f; U(expectedmat).m[2][3] = -1.0f;
399     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 1.881081f; U(expectedmat).m[3][3] = 0.0f;
400     D3DXMatrixPerspectiveFovRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
401     expect_mat(&expectedmat, &gotmat);
402
403 /*____________D3DXMatrixPerspectiveLH_______________*/
404     U(expectedmat).m[0][0] = -24.0f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
405     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = -6.4f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
406     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 0.783784f; U(expectedmat).m[2][3] = 1.0f;
407     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 1.881081f; U(expectedmat).m[3][3] = 0.0f;
408     D3DXMatrixPerspectiveLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
409     expect_mat(&expectedmat, &gotmat);
410
411 /*____________D3DXMatrixPerspectiveOffCenterLH_______________*/
412     U(expectedmat).m[0][0] = 11.636364f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
413     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 0.576577f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
414     U(expectedmat).m[2][0] = -1.727273f; U(expectedmat).m[2][1] = -0.567568f; U(expectedmat).m[2][2] = 0.840796f; U(expectedmat).m[2][3] = 1.0f;
415     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = -2.690547f; U(expectedmat).m[3][3] = 0.0f;
416     D3DXMatrixPerspectiveOffCenterLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 3.2f, -16.9f);
417     expect_mat(&expectedmat, &gotmat);
418
419 /*____________D3DXMatrixPerspectiveOffCenterRH_______________*/
420     U(expectedmat).m[0][0] = 11.636364f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
421     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = 0.576577f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
422     U(expectedmat).m[2][0] = 1.727273f; U(expectedmat).m[2][1] = 0.567568f; U(expectedmat).m[2][2] = -0.840796f; U(expectedmat).m[2][3] = -1.0f;
423     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = -2.690547f; U(expectedmat).m[3][3] = 0.0f;
424     D3DXMatrixPerspectiveOffCenterRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 3.2f, -16.9f);
425     expect_mat(&expectedmat, &gotmat);
426
427 /*____________D3DXMatrixPerspectiveRH_______________*/
428     U(expectedmat).m[0][0] = -24.0f; U(expectedmat).m[0][1] = -0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
429     U(expectedmat).m[1][0] = 0.0f; U(expectedmat).m[1][1] = -6.4f; U(expectedmat).m[1][2] = 0.0; U(expectedmat).m[1][3] = 0.0f;
430     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = -0.783784f; U(expectedmat).m[2][3] = -1.0f;
431     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 1.881081f; U(expectedmat).m[3][3] = 0.0f;
432     D3DXMatrixPerspectiveRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
433     expect_mat(&expectedmat, &gotmat);
434
435 /*____________D3DXMatrixReflect______________*/
436     U(expectedmat).m[0][0] = 0.307692f; U(expectedmat).m[0][1] = -0.230769f; U(expectedmat).m[0][2] = 0.923077f; U(expectedmat).m[0][3] = 0.0f;
437     U(expectedmat).m[1][0] = -0.230769; U(expectedmat).m[1][1] = 0.923077f; U(expectedmat).m[1][2] = 0.307693f; U(expectedmat).m[1][3] = 0.0f;
438     U(expectedmat).m[2][0] = 0.923077f; U(expectedmat).m[2][1] = 0.307693f; U(expectedmat).m[2][2] = -0.230769f; U(expectedmat).m[2][3] = 0.0f;
439     U(expectedmat).m[3][0] = 1.615385f; U(expectedmat).m[3][1] = 0.538462f; U(expectedmat).m[3][2] = -2.153846f; U(expectedmat).m[3][3] = 1.0f;
440     D3DXMatrixReflect(&gotmat,&plane);
441     expect_mat(&expectedmat, &gotmat);
442
443 /*____________D3DXMatrixRotationAxis_____*/
444     U(expectedmat).m[0][0] = 0.508475f; U(expectedmat).m[0][1] = 0.763805f; U(expectedmat).m[0][2] = 0.397563f; U(expectedmat).m[0][3] = 0.0f;
445     U(expectedmat).m[1][0] = -0.814652f; U(expectedmat).m[1][1] = 0.576271f; U(expectedmat).m[1][2] = -0.065219f; U(expectedmat).m[1][3] = 0.0f;
446     U(expectedmat).m[2][0] = -0.278919f; U(expectedmat).m[2][1] = -0.290713f; U(expectedmat).m[2][2] = 0.915254f; U(expectedmat).m[2][3] = 0.0f;
447     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 0.0f; U(expectedmat).m[3][3] = 1.0f;
448     D3DXMatrixRotationAxis(&gotmat,&axis,angle);
449     expect_mat(&expectedmat, &gotmat);
450
451 /*____________D3DXMatrixRotationQuaternion______________*/
452     U(expectedmat).m[0][0] = -129.0f; U(expectedmat).m[0][1] = -162.0f; U(expectedmat).m[0][2] = -74.0f; U(expectedmat).m[0][3] = 0.0f;
453     U(expectedmat).m[1][0] = 146.0f; U(expectedmat).m[1][1] = -99.0f; U(expectedmat).m[1][2] = -78.0f; U(expectedmat).m[1][3] = 0.0f;
454     U(expectedmat).m[2][0] = 102.0f; U(expectedmat).m[2][1] = -34.0f; U(expectedmat).m[2][2] = -33.0f; U(expectedmat).m[2][3] = 0.0f;
455     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 0.0f; U(expectedmat).m[3][3] = 1.0f;
456     D3DXMatrixRotationQuaternion(&gotmat,&q);
457     expect_mat(&expectedmat, &gotmat);
458
459 /*____________D3DXMatrixRotationX______________*/
460     U(expectedmat).m[0][0] = 1.0f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
461     U(expectedmat).m[1][0] = 0.0; U(expectedmat).m[1][1] = 0.5f; U(expectedmat).m[1][2] = sqrt(3.0f)/2.0f; U(expectedmat).m[1][3] = 0.0f;
462     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = -sqrt(3.0f)/2.0f; U(expectedmat).m[2][2] = 0.5f; U(expectedmat).m[2][3] = 0.0f;
463     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 0.0f; U(expectedmat).m[3][3] = 1.0f;
464     D3DXMatrixRotationX(&gotmat,angle);
465     expect_mat(&expectedmat, &gotmat);
466
467 /*____________D3DXMatrixRotationY______________*/
468     U(expectedmat).m[0][0] = 0.5f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = -sqrt(3.0f)/2.0f; U(expectedmat).m[0][3] = 0.0f;
469     U(expectedmat).m[1][0] = 0.0; U(expectedmat).m[1][1] = 1.0f; U(expectedmat).m[1][2] = 0.0f; U(expectedmat).m[1][3] = 0.0f;
470     U(expectedmat).m[2][0] = sqrt(3.0f)/2.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 0.5f; U(expectedmat).m[2][3] = 0.0f;
471     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 0.0f; U(expectedmat).m[3][3] = 1.0f;
472     D3DXMatrixRotationY(&gotmat,angle);
473     expect_mat(&expectedmat, &gotmat);
474
475 /*____________D3DXMatrixRotationYawPitchRoll____*/
476     U(expectedmat).m[0][0] = 0.888777f; U(expectedmat).m[0][1] = 0.091875f; U(expectedmat).m[0][2] = -0.449037f; U(expectedmat).m[0][3] = 0.0f;
477     U(expectedmat).m[1][0] = 0.351713f; U(expectedmat).m[1][1] = 0.491487f; U(expectedmat).m[1][2] = 0.796705f; U(expectedmat).m[1][3] = 0.0f;
478     U(expectedmat).m[2][0] = 0.293893f; U(expectedmat).m[2][1] = -0.866025f; U(expectedmat).m[2][2] = 0.404509f; U(expectedmat).m[2][3] = 0.0f;
479     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 0.0f; U(expectedmat).m[3][3] = 1.0f;
480     D3DXMatrixRotationYawPitchRoll(&gotmat, 3.0f*angle/5.0f, angle, 3.0f*angle/17.0f);
481     expect_mat(&expectedmat, &gotmat);
482
483 /*____________D3DXMatrixRotationZ______________*/
484     U(expectedmat).m[0][0] = 0.5f; U(expectedmat).m[0][1] = sqrt(3.0f)/2.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
485     U(expectedmat).m[1][0] = -sqrt(3.0f)/2.0f; U(expectedmat).m[1][1] = 0.5f; U(expectedmat).m[1][2] = 0.0f; U(expectedmat).m[1][3] = 0.0f;
486     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 1.0f; U(expectedmat).m[2][3] = 0.0f;
487     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 0.0f; U(expectedmat).m[3][3] = 1.0f;
488     D3DXMatrixRotationZ(&gotmat,angle);
489     expect_mat(&expectedmat, &gotmat);
490
491 /*____________D3DXMatrixScaling______________*/
492     U(expectedmat).m[0][0] = 0.69f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
493     U(expectedmat).m[1][0] = 0.0; U(expectedmat).m[1][1] = 0.53f; U(expectedmat).m[1][2] = 0.0f; U(expectedmat).m[1][3] = 0.0f;
494     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 4.11f; U(expectedmat).m[2][3] = 0.0f;
495     U(expectedmat).m[3][0] = 0.0f; U(expectedmat).m[3][1] = 0.0f; U(expectedmat).m[3][2] = 0.0f; U(expectedmat).m[3][3] = 1.0f;
496     D3DXMatrixScaling(&gotmat,0.69f,0.53f,4.11f);
497     expect_mat(&expectedmat, &gotmat);
498
499 /*____________D3DXMatrixShadow______________*/
500     U(expectedmat).m[0][0] = 12.786773f; U(expectedmat).m[0][1] = 5.000961f; U(expectedmat).m[0][2] = 4.353778f; U(expectedmat).m[0][3] = 3.706595f;
501     U(expectedmat).m[1][0] = 1.882715; U(expectedmat).m[1][1] = 8.805615f; U(expectedmat).m[1][2] = 1.451259f; U(expectedmat).m[1][3] = 1.235532f;
502     U(expectedmat).m[2][0] = -7.530860f; U(expectedmat).m[2][1] = -6.667949f; U(expectedmat).m[2][2] = 1.333590f; U(expectedmat).m[2][3] = -4.942127f;
503     U(expectedmat).m[3][0] = -13.179006f; U(expectedmat).m[3][1] = -11.668910f; U(expectedmat).m[3][2] = -10.158816f; U(expectedmat).m[3][3] = -1.510094f;
504     D3DXMatrixShadow(&gotmat,&light,&plane);
505     expect_mat(&expectedmat, &gotmat);
506
507 /*____________D3DXMatrixTransformation______________*/
508     U(expectedmat).m[0][0] = -0.2148f; U(expectedmat).m[0][1] = 1.3116f; U(expectedmat).m[0][2] = 0.4752f; U(expectedmat).m[0][3] = 0.0f;
509     U(expectedmat).m[1][0] = 0.9504f; U(expectedmat).m[1][1] = -0.8836f; U(expectedmat).m[1][2] = 0.9244f; U(expectedmat).m[1][3] = 0.0f;
510     U(expectedmat).m[2][0] = 1.0212f; U(expectedmat).m[2][1] = 0.1936f; U(expectedmat).m[2][2] = -1.3588f; U(expectedmat).m[2][3] = 0.0f;
511     U(expectedmat).m[3][0] = 18.2985f; U(expectedmat).m[3][1] = -29.624001f; U(expectedmat).m[3][2] = 15.683499f; U(expectedmat).m[3][3] = 1.0f;
512     D3DXMatrixTransformation(&gotmat,&at,&q,NULL,&eye,&r,&last);
513     expect_mat(&expectedmat, &gotmat);
514
515 /*____________D3DXMatrixTranslation______________*/
516     U(expectedmat).m[0][0] = 1.0f; U(expectedmat).m[0][1] = 0.0f; U(expectedmat).m[0][2] = 0.0f; U(expectedmat).m[0][3] = 0.0f;
517     U(expectedmat).m[1][0] = 0.0; U(expectedmat).m[1][1] = 1.0f; U(expectedmat).m[1][2] = 0.0f; U(expectedmat).m[1][3] = 0.0f;
518     U(expectedmat).m[2][0] = 0.0f; U(expectedmat).m[2][1] = 0.0f; U(expectedmat).m[2][2] = 1.0f; U(expectedmat).m[2][3] = 0.0f;
519     U(expectedmat).m[3][0] = 0.69f; U(expectedmat).m[3][1] = 0.53f; U(expectedmat).m[3][2] = 4.11f; U(expectedmat).m[3][3] = 1.0f;
520     D3DXMatrixTranslation(&gotmat,0.69f,0.53f,4.11f);
521     expect_mat(&expectedmat, &gotmat);
522
523 /*____________D3DXMatrixTranspose______________*/
524     U(expectedmat).m[0][0] = 10.0f; U(expectedmat).m[0][1] = 11.0f; U(expectedmat).m[0][2] = 19.0f; U(expectedmat).m[0][3] = 2.0f;
525     U(expectedmat).m[1][0] = 5.0; U(expectedmat).m[1][1] = 20.0f; U(expectedmat).m[1][2] = -21.0f; U(expectedmat).m[1][3] = 3.0f;
526     U(expectedmat).m[2][0] = 7.0f; U(expectedmat).m[2][1] = 16.0f; U(expectedmat).m[2][2] = 30.f; U(expectedmat).m[2][3] = -4.0f;
527     U(expectedmat).m[3][0] = 8.0f; U(expectedmat).m[3][1] = 33.0f; U(expectedmat).m[3][2] = 43.0f; U(expectedmat).m[3][3] = -40.0f;
528     D3DXMatrixTranspose(&gotmat,&mat);
529     expect_mat(&expectedmat, &gotmat);
530 }
531
532 static void D3DXPlaneTest(void)
533 {
534     D3DXMATRIX mat;
535     D3DXPLANE expectedplane, gotplane, nulplane, plane;
536     D3DXVECTOR3 expectedvec, gotvec, vec1, vec2, vec3;
537     LPD3DXVECTOR3 funcpointer;
538     D3DXVECTOR4 vec;
539     FLOAT expected, got;
540
541     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
542     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
543     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
544     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
545     U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f;
546     U(mat).m[3][3] = -40.0f;
547
548     plane.a = -3.0f; plane.b = -1.0f; plane.c = 4.0f; plane.d = 7.0f;
549
550     vec.x = 2.0f; vec.y = 5.0f; vec.z = -6.0f; vec.w = 11.0f;
551
552 /*_______________D3DXPlaneDot________________*/
553     expected = 42.0f;
554     got = D3DXPlaneDot(&plane,&vec),
555     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
556     expected = 0.0f;
557     got = D3DXPlaneDot(NULL,&vec),
558     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
559     expected = 0.0f;
560     got = D3DXPlaneDot(NULL,NULL),
561     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
562
563 /*_______________D3DXPlaneDotCoord________________*/
564     expected = -28.0f;
565     got = D3DXPlaneDotCoord(&plane,&vec),
566     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
567     expected = 0.0f;
568     got = D3DXPlaneDotCoord(NULL,&vec),
569     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
570     expected = 0.0f;
571     got = D3DXPlaneDotCoord(NULL,NULL),
572     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
573
574 /*_______________D3DXPlaneDotNormal______________*/
575     expected = -35.0f;
576     got = D3DXPlaneDotNormal(&plane,&vec),
577     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
578     expected = 0.0f;
579     got = D3DXPlaneDotNormal(NULL,&vec),
580     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
581     expected = 0.0f;
582     got = D3DXPlaneDotNormal(NULL,NULL),
583     ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
584
585 /*_______________D3DXPlaneFromPointNormal_______*/
586     vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f;
587     vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f;
588     expectedplane.a = 17.0f; expectedplane.b = 31.0f; expectedplane.c = 24.0f; expectedplane.d = -950.0f;
589     D3DXPlaneFromPointNormal(&gotplane,&vec1,&vec2);
590     expect_plane(expectedplane, gotplane);
591
592 /*_______________D3DXPlaneFromPoints_______*/
593     vec1.x = 1.0f; vec1.y = 2.0f; vec1.z = 3.0f;
594     vec2.x = 1.0f; vec2.y = -6.0f; vec2.z = -5.0f;
595     vec3.x = 83.0f; vec3.y = 74.0f; vec3.z = 65.0f;
596     expectedplane.a = 0.085914f; expectedplane.b = -0.704492f; expectedplane.c = 0.704492f; expectedplane.d = -0.790406f;
597     D3DXPlaneFromPoints(&gotplane,&vec1,&vec2,&vec3);
598     expect_plane(expectedplane, gotplane);
599
600 /*_______________D3DXPlaneIntersectLine___________*/
601     vec1.x = 9.0f; vec1.y = 6.0f; vec1.z = 3.0f;
602     vec2.x = 2.0f; vec2.y = 5.0f; vec2.z = 8.0f;
603     expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f;
604     D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2);
605     expect_vec3(expectedvec, gotvec);
606     /* Test a parallel line */
607     vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f;
608     vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f;
609     expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f;
610     funcpointer = D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2);
611     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
612
613 /*_______________D3DXPlaneNormalize______________*/
614     expectedplane.a = -3.0f/sqrt(26.0f); expectedplane.b = -1.0f/sqrt(26.0f); expectedplane.c = 4.0f/sqrt(26.0f); expectedplane.d = 7.0/sqrt(26.0f);
615     D3DXPlaneNormalize(&gotplane, &plane);
616     expect_plane(expectedplane, gotplane);
617     nulplane.a = 0.0; nulplane.b = 0.0f, nulplane.c = 0.0f; nulplane.d = 0.0f;
618     expectedplane.a = 0.0f; expectedplane.b = 0.0f; expectedplane.c = 0.0f; expectedplane.d = 0.0f;
619     D3DXPlaneNormalize(&gotplane, &nulplane);
620     expect_plane(expectedplane, gotplane);
621
622 /*_______________D3DXPlaneTransform____________*/
623     expectedplane.a = 49.0f; expectedplane.b = -98.0f; expectedplane.c = 55.0f; expectedplane.d = -165.0f;
624     D3DXPlaneTransform(&gotplane,&plane,&mat);
625     expect_plane(expectedplane, gotplane);
626 }
627
628 static void D3DXQuaternionTest(void)
629 {
630     D3DXMATRIX mat;
631     D3DXQUATERNION expectedquat, gotquat, Nq, Nq1, nul, smallq, smallr, q, r, s, t, u;
632     LPD3DXQUATERNION funcpointer;
633     D3DXVECTOR3 axis, expectedvec;
634     FLOAT angle, expected, got, scale, scale2;
635     BOOL expectedbool, gotbool;
636
637     nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f; nul.w = 0.0f;
638     q.x = 1.0f, q.y = 2.0f; q.z = 4.0f; q.w = 10.0f;
639     r.x = -3.0f; r.y = 4.0f; r.z = -5.0f; r.w = 7.0;
640     t.x = -1111.0f, t.y = 111.0f; t.z = -11.0f; t.w = 1.0f;
641     u.x = 91.0f; u.y = - 82.0f; u.z = 7.3f; u.w = -6.4f;
642     smallq.x = 0.1f; smallq.y = 0.2f; smallq.z= 0.3f; smallq.w = 0.4f;
643     smallr.x = 0.5f; smallr.y = 0.6f; smallr.z= 0.7f; smallr.w = 0.8f;
644
645     scale = 0.3f;
646     scale2 = 0.78f;
647
648 /*_______________D3DXQuaternionBaryCentric________________________*/
649     expectedquat.x = -867.444458; expectedquat.y = 87.851111f; expectedquat.z = -9.937778f; expectedquat.w = 3.235555f;
650     D3DXQuaternionBaryCentric(&gotquat,&q,&r,&t,scale,scale2);
651     expect_vec4(expectedquat,gotquat);
652
653 /*_______________D3DXQuaternionConjugate________________*/
654     expectedquat.x = -1.0f; expectedquat.y = -2.0f; expectedquat.z = -4.0f; expectedquat.w = 10.0f;
655     D3DXQuaternionConjugate(&gotquat,&q);
656     expect_vec4(expectedquat,gotquat);
657     /* Test the NULL case */
658     funcpointer = D3DXQuaternionConjugate(&gotquat,NULL);
659     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
660     funcpointer = D3DXQuaternionConjugate(NULL,NULL);
661     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
662
663 /*_______________D3DXQuaternionDot______________________*/
664     expected = 55.0f;
665     got = D3DXQuaternionDot(&q,&r);
666     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
667     /* Tests the case NULL */
668     expected=0.0f;
669     got = D3DXQuaternionDot(NULL,&r);
670     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
671     expected=0.0f;
672     got = D3DXQuaternionDot(NULL,NULL);
673     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
674
675 /*_______________D3DXQuaternionExp______________________________*/
676     expectedquat.x = -0.216382f; expectedquat.y = -0.432764f; expectedquat.z = -0.8655270f; expectedquat.w = -0.129449f;
677     D3DXQuaternionExp(&gotquat,&q);
678     expect_vec4(expectedquat,gotquat);
679     /* Test the null quaternion */
680     expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 1.0f;
681     D3DXQuaternionExp(&gotquat,&nul);
682     expect_vec4(expectedquat,gotquat);
683     /* Test the case where the norm of the quaternion is <1 */
684     Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w= 0.9f;
685     expectedquat.x = 0.195366; expectedquat.y = 0.097683f; expectedquat.z = 0.293049f; expectedquat.w = 0.930813f;
686     D3DXQuaternionExp(&gotquat,&Nq1);
687     expect_vec4(expectedquat,gotquat);
688
689 /*_______________D3DXQuaternionIdentity________________*/
690     expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 1.0f;
691     D3DXQuaternionIdentity(&gotquat);
692     expect_vec4(expectedquat,gotquat);
693     /* Test the NULL case */
694     funcpointer = D3DXQuaternionIdentity(NULL);
695     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
696
697 /*_______________D3DXQuaternionInverse________________________*/
698     expectedquat.x = -1.0f/121.0f; expectedquat.y = -2.0f/121.0f; expectedquat.z = -4.0f/121.0f; expectedquat.w = 10.0f/121.0f;
699     D3DXQuaternionInverse(&gotquat,&q);
700     expect_vec4(expectedquat,gotquat);
701
702     expectedquat.x = 1.0f; expectedquat.y = 2.0f; expectedquat.z = 4.0f; expectedquat.w = 10.0f;
703     D3DXQuaternionInverse(&gotquat,&gotquat);
704     expect_vec4(expectedquat,gotquat);
705
706
707 /*_______________D3DXQuaternionIsIdentity________________*/
708     s.x = 0.0f; s.y = 0.0f; s.z = 0.0f; s.w = 1.0f;
709     expectedbool = TRUE;
710     gotbool = D3DXQuaternionIsIdentity(&s);
711     ok( expectedbool == gotbool, "Expected boolean : %d, Got bool : %d\n", expectedbool, gotbool);
712     s.x = 2.3f; s.y = -4.2f; s.z = 1.2f; s.w=0.2f;
713     expectedbool = FALSE;
714     gotbool = D3DXQuaternionIsIdentity(&q);
715     ok( expectedbool == gotbool, "Expected boolean : %d, Got bool : %d\n", expectedbool, gotbool);
716     /* Test the NULL case */
717     gotbool = D3DXQuaternionIsIdentity(NULL);
718     ok(gotbool == FALSE, "Expected boolean: %d, Got boolean: %d\n", FALSE, gotbool);
719
720 /*_______________D3DXQuaternionLength__________________________*/
721    expected = 11.0f;
722    got = D3DXQuaternionLength(&q);
723    ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
724    /* Tests the case NULL */
725     expected=0.0f;
726     got = D3DXQuaternionLength(NULL);
727     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
728
729 /*_______________D3DXQuaternionLengthSq________________________*/
730     expected = 121.0f;
731     got = D3DXQuaternionLengthSq(&q);
732     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
733     /* Tests the case NULL */
734     expected=0.0f;
735     got = D3DXQuaternionLengthSq(NULL);
736     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
737
738 /*_______________D3DXQuaternionLn______________________________*/
739     expectedquat.x = 1.0f; expectedquat.y = 2.0f; expectedquat.z = 4.0f; expectedquat.w = 0.0f;
740     D3DXQuaternionLn(&gotquat,&q);
741     expect_vec4(expectedquat,gotquat);
742     expectedquat.x = -3.0f; expectedquat.y = 4.0f; expectedquat.z = -5.0f; expectedquat.w = 0.0f;
743     D3DXQuaternionLn(&gotquat,&r);
744     expect_vec4(expectedquat,gotquat);
745     Nq.x = 1.0f/11.0f; Nq.y = 2.0f/11.0f; Nq.z = 4.0f/11.0f; Nq.w=10.0f/11.0f;
746     expectedquat.x = 0.093768f; expectedquat.y = 0.187536f; expectedquat.z = 0.375073f; expectedquat.w = 0.0f;
747     D3DXQuaternionLn(&gotquat,&Nq);
748     expect_vec4(expectedquat,gotquat);
749     /* Test the cas where the norm of the quaternion is <1 */
750     Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w= 0.9f;
751     expectedquat.x = 0.206945f; expectedquat.y = 0.103473f; expectedquat.z = 0.310418f; expectedquat.w = 0.0f;
752     D3DXQuaternionLn(&gotquat,&Nq1);
753     todo_wine{ expect_vec4(expectedquat,gotquat) };
754
755 /*_______________D3DXQuaternionMultiply________________________*/
756     expectedquat.x = 3.0f; expectedquat.y = 61.0f; expectedquat.z = -32.0f; expectedquat.w = 85.0f;
757     D3DXQuaternionMultiply(&gotquat,&q,&r);
758     expect_vec4(expectedquat,gotquat);
759
760 /*_______________D3DXQuaternionNormalize________________________*/
761     expectedquat.x = 1.0f/11.0f; expectedquat.y = 2.0f/11.0f; expectedquat.z = 4.0f/11.0f; expectedquat.w = 10.0f/11.0f;
762     D3DXQuaternionNormalize(&gotquat,&q);
763     expect_vec4(expectedquat,gotquat);
764
765 /*_______________D3DXQuaternionRotationAxis___________________*/
766     axis.x = 2.0f; axis.y = 7.0; axis.z = 13.0f;
767     angle = D3DX_PI/3.0f;
768     expectedquat.x = 0.067116; expectedquat.y = 0.234905f; expectedquat.z = 0.436251f; expectedquat.w = 0.866025f;
769     D3DXQuaternionRotationAxis(&gotquat,&axis,angle);
770     expect_vec4(expectedquat,gotquat);
771  /* Test the nul quaternion */
772     axis.x = 0.0f; axis.y = 0.0; axis.z = 0.0f;
773     expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.866025f;
774     D3DXQuaternionRotationAxis(&gotquat,&axis,angle);
775     expect_vec4(expectedquat,gotquat);
776
777 /*_______________D3DXQuaternionRotationMatrix___________________*/
778     /* test when the trace is >0 */
779     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
780     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
781     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
782     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
783     U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f;
784     U(mat).m[3][3] = 48.0f;
785     expectedquat.x = 2.368682f; expectedquat.y = 0.768221f; expectedquat.z = -0.384111f; expectedquat.w = 3.905125f;
786     D3DXQuaternionRotationMatrix(&gotquat,&mat);
787     expect_vec4(expectedquat,gotquat);
788     /* test the case when the greater element is (2,2) */
789     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
790     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
791     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
792     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
793     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = -60.0f; U(mat).m[2][2] = 40.0f;
794     U(mat).m[3][3] = 48.0f;
795     expectedquat.x = 1.233905f; expectedquat.y = -0.237290f; expectedquat.z = 5.267827f; expectedquat.w = -0.284747f;
796     D3DXQuaternionRotationMatrix(&gotquat,&mat);
797     expect_vec4(expectedquat,gotquat);
798     /* test the case when the greater element is (1,1) */
799     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
800     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
801     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
802     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
803     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 60.0f; U(mat).m[2][2] = -80.0f;
804     U(mat).m[3][3] = 48.0f;
805     expectedquat.x = 0.651031f; expectedquat.y = 6.144103f; expectedquat.z = -0.203447f; expectedquat.w = 0.488273f;
806     D3DXQuaternionRotationMatrix(&gotquat,&mat);
807     expect_vec4(expectedquat,gotquat);
808     /* test the case when the trace is near 0 in a matrix which is not a rotation */
809     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
810     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
811     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
812     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
813     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.9f;
814     U(mat).m[3][3] = 48.0f;
815     expectedquat.x = 1.709495f; expectedquat.y = 2.339872f; expectedquat.z = -0.534217f; expectedquat.w = 1.282122f;
816     D3DXQuaternionRotationMatrix(&gotquat,&mat);
817     expect_vec4(expectedquat,gotquat);
818     /* test the case when the trace is 0.49 in a matrix which is not a rotation */
819     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
820     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
821     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
822     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
823     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.51f;
824     U(mat).m[3][3] = 48.0f;
825     expectedquat.x = 1.724923f; expectedquat.y = 2.318944f; expectedquat.z = -0.539039f; expectedquat.w = 1.293692f;
826     D3DXQuaternionRotationMatrix(&gotquat,&mat);
827     expect_vec4(expectedquat,gotquat);
828     /* test the case when the trace is 0.51 in a matrix which is not a rotation */
829     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
830     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
831     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
832     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
833     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.49f;
834     U(mat).m[3][3] = 48.0f;
835     expectedquat.x = 1.725726f; expectedquat.y = 2.317865f; expectedquat.z = -0.539289f; expectedquat.w = 1.294294f;
836     D3DXQuaternionRotationMatrix(&gotquat,&mat);
837     expect_vec4(expectedquat,gotquat);
838     /* test the case when the trace is 0.99 in a matrix which is not a rotation */
839     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
840     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
841     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
842     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
843     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.01f;
844     U(mat).m[3][3] = 48.0f;
845     expectedquat.x = 1.745328f; expectedquat.y = 2.291833f; expectedquat.z = -0.545415f; expectedquat.w = 1.308996f;
846     D3DXQuaternionRotationMatrix(&gotquat,&mat);
847     expect_vec4(expectedquat,gotquat);
848     /* test the case when the trace is 1.0 in a matrix which is not a rotation */
849     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
850     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
851     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
852     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
853     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.0f;
854     U(mat).m[3][3] = 48.0f;
855     expectedquat.x = 1.745743f; expectedquat.y = 2.291288f; expectedquat.z = -0.545545f; expectedquat.w = 1.309307f;
856     D3DXQuaternionRotationMatrix(&gotquat,&mat);
857     expect_vec4(expectedquat,gotquat);
858     /* test the case when the trace is 1.01 in a matrix which is not a rotation */
859     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
860     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
861     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
862     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
863     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.01f;
864     U(mat).m[3][3] = 48.0f;
865     expectedquat.x = 18.408188f; expectedquat.y = 5.970223f; expectedquat.z = -2.985111f; expectedquat.w = 0.502494f;
866     D3DXQuaternionRotationMatrix(&gotquat,&mat);
867     expect_vec4(expectedquat,gotquat);
868     /* test the case when the trace is 1.5 in a matrix which is not a rotation */
869     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
870     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
871     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
872     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
873     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.5f;
874     U(mat).m[3][3] = 48.0f;
875     expectedquat.x = 15.105186f; expectedquat.y = 4.898980f; expectedquat.z = -2.449490f; expectedquat.w = 0.612372f;
876     D3DXQuaternionRotationMatrix(&gotquat,&mat);
877     expect_vec4(expectedquat,gotquat);
878     /* test the case when the trace is 1.7 in a matrix which is not a rotation */
879     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
880     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
881     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
882     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
883     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.70f;
884     U(mat).m[3][3] = 48.0f;
885     expectedquat.x = 14.188852f; expectedquat.y = 4.601790f; expectedquat.z = -2.300895f; expectedquat.w = 0.651920f;
886     D3DXQuaternionRotationMatrix(&gotquat,&mat);
887     expect_vec4(expectedquat,gotquat);
888     /* test the case when the trace is 1.99 in a matrix which is not a rotation */
889     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
890     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
891     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
892     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
893     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.99f;
894     U(mat).m[3][3] = 48.0f;
895     expectedquat.x = 13.114303f; expectedquat.y = 4.253287f; expectedquat.z = -2.126644f; expectedquat.w = 0.705337f;
896     D3DXQuaternionRotationMatrix(&gotquat,&mat);
897     expect_vec4(expectedquat,gotquat);
898     /* test the case when the trace is 2.0 in a matrix which is not a rotation */
899     U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
900     U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
901     U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
902     U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
903     U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 2.0f;
904     U(mat).m[3][3] = 48.0f;
905     expectedquat.x = 10.680980f; expectedquat.y = 3.464102f; expectedquat.z = -1.732051f; expectedquat.w = 0.866025f;
906     D3DXQuaternionRotationMatrix(&gotquat,&mat);
907     expect_vec4(expectedquat,gotquat);
908
909 /*_______________D3DXQuaternionRotationYawPitchRoll__________*/
910     expectedquat.x = 0.303261f; expectedquat.y = 0.262299f; expectedquat.z = 0.410073f; expectedquat.w = 0.819190f;
911     D3DXQuaternionRotationYawPitchRoll(&gotquat,D3DX_PI/4.0f,D3DX_PI/11.0f,D3DX_PI/3.0f);
912     expect_vec4(expectedquat,gotquat);
913
914 /*_______________D3DXQuaternionSlerp________________________*/
915     expectedquat.x = -0.2f; expectedquat.y = 2.6f; expectedquat.z = 1.3f; expectedquat.w = 9.1f;
916     D3DXQuaternionSlerp(&gotquat,&q,&r,scale);
917     expect_vec4(expectedquat,gotquat);
918     expectedquat.x = 334.0f; expectedquat.y = -31.9f; expectedquat.z = 6.1f; expectedquat.w = 6.7f;
919     D3DXQuaternionSlerp(&gotquat,&q,&t,scale);
920     expect_vec4(expectedquat,gotquat);
921     expectedquat.x = 0.239485f; expectedquat.y = 0.346580f; expectedquat.z = 0.453676f; expectedquat.w = 0.560772f;
922     D3DXQuaternionSlerp(&gotquat,&smallq,&smallr,scale);
923     expect_vec4(expectedquat,gotquat);
924
925 /*_______________D3DXQuaternionSquad________________________*/
926     expectedquat.x = -156.296f; expectedquat.y = 30.242f; expectedquat.z = -2.5022f; expectedquat.w = 7.3576f;
927     D3DXQuaternionSquad(&gotquat,&q,&r,&t,&u,scale);
928     expect_vec4(expectedquat,gotquat);
929
930 /*_______________D3DXQuaternionToAxisAngle__________________*/
931     Nq.x = 1.0f/22.0f; Nq.y = 2.0f/22.0f; Nq.z = 4.0f/22.0f; Nq.w = 10.0f/22.0f;
932     expectedvec.x = 1.0f/22.0f; expectedvec.y = 2.0f/22.0f; expectedvec.z = 4.0f/22.0f;
933     expected = 2.197869f;
934     D3DXQuaternionToAxisAngle(&Nq,&axis,&angle);
935     expect_vec3(expectedvec,axis);
936     ok(relative_error(angle,  expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, angle);
937     /* Test if |w|>1.0f */
938     expectedvec.x = 1.0f; expectedvec.y = 2.0f; expectedvec.z = 4.0f;
939     D3DXQuaternionToAxisAngle(&q,&axis,&angle);
940     expect_vec3(expectedvec,axis);
941     /* Test the null quaternion */
942     expectedvec.x = 0.0f; expectedvec.y = 0.0f; expectedvec.z = 0.0f;
943     expected = 3.141593f;
944     D3DXQuaternionToAxisAngle(&nul,&axis,&angle);
945     expect_vec3(expectedvec,axis);
946     ok(relative_error(angle, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, angle);
947 }
948
949 static void D3DXVector2Test(void)
950 {
951     D3DXVECTOR2 expectedvec, gotvec, nul, u, v, w, x;
952     LPD3DXVECTOR2 funcpointer;
953     D3DXVECTOR4 expectedtrans, gottrans;
954     D3DXMATRIX mat;
955     FLOAT coeff1, coeff2, expected, got, scale;
956
957     nul.x = 0.0f; nul.y = 0.0f;
958     u.x = 3.0f; u.y = 4.0f;
959     v.x = -7.0f; v.y = 9.0f;
960     w.x = 4.0f; w.y = -3.0f;
961     x.x = 2.0f; x.y = -11.0f;
962
963     U(mat).m[0][0] = 1.0f; U(mat).m[0][1] = 2.0f; U(mat).m[0][2] = 3.0f; U(mat).m[0][3] = 4.0f;
964     U(mat).m[1][0] = 5.0f; U(mat).m[1][1] = 6.0f; U(mat).m[1][2] = 7.0f; U(mat).m[1][3] = 8.0f;
965     U(mat).m[2][0] = 9.0f; U(mat).m[2][1] = 10.0f; U(mat).m[2][2] = 11.0f; U(mat).m[2][3] = 12.0f;
966     U(mat).m[3][0] = 13.0f; U(mat).m[3][1] = 14.0f; U(mat).m[3][2] = 15.0f; U(mat).m[3][3] = 16.0f;
967
968     coeff1 = 2.0f; coeff2 = 5.0f;
969     scale = -6.5f;
970
971 /*_______________D3DXVec2Add__________________________*/
972     expectedvec.x = -4.0f; expectedvec.y = 13.0f;
973     D3DXVec2Add(&gotvec,&u,&v);
974     expect_vec(expectedvec,gotvec);
975     /* Tests the case NULL */
976     funcpointer = D3DXVec2Add(&gotvec,NULL,&v);
977     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
978     funcpointer = D3DXVec2Add(NULL,NULL,NULL);
979     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
980
981 /*_______________D3DXVec2BaryCentric___________________*/
982     expectedvec.x = -12.0f; expectedvec.y = -21.0f;
983     D3DXVec2BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2);
984     expect_vec(expectedvec,gotvec);
985
986 /*_______________D3DXVec2CatmullRom____________________*/
987     expectedvec.x = 5820.25f; expectedvec.y = -3654.5625f;
988     D3DXVec2CatmullRom(&gotvec,&u,&v,&w,&x,scale);
989     expect_vec(expectedvec,gotvec);
990
991 /*_______________D3DXVec2CCW__________________________*/
992    expected = 55.0f;
993    got = D3DXVec2CCW(&u,&v);
994    ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
995    /* Tests the case NULL */
996     expected=0.0f;
997     got = D3DXVec2CCW(NULL,&v);
998     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
999     expected=0.0f;
1000     got = D3DXVec2CCW(NULL,NULL);
1001     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1002
1003 /*_______________D3DXVec2Dot__________________________*/
1004     expected = 15.0f;
1005     got = D3DXVec2Dot(&u,&v);
1006     ok(relative_error(got,  expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1007     /* Tests the case NULL */
1008     expected=0.0f;
1009     got = D3DXVec2Dot(NULL,&v);
1010     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1011     expected=0.0f;
1012     got = D3DXVec2Dot(NULL,NULL);
1013     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1014
1015 /*_______________D3DXVec2Hermite__________________________*/
1016     expectedvec.x = 2604.625f; expectedvec.y = -4533.0f;
1017     D3DXVec2Hermite(&gotvec,&u,&v,&w,&x,scale);
1018     expect_vec(expectedvec,gotvec);
1019
1020 /*_______________D3DXVec2Length__________________________*/
1021    expected = 5.0f;
1022    got = D3DXVec2Length(&u);
1023    ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1024    /* Tests the case NULL */
1025     expected=0.0f;
1026     got = D3DXVec2Length(NULL);
1027     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1028
1029 /*_______________D3DXVec2LengthSq________________________*/
1030    expected = 25.0f;
1031    got = D3DXVec2LengthSq(&u);
1032    ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1033    /* Tests the case NULL */
1034     expected=0.0f;
1035     got = D3DXVec2LengthSq(NULL);
1036     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1037
1038 /*_______________D3DXVec2Lerp__________________________*/
1039    expectedvec.x = 68.0f; expectedvec.y = -28.5f;
1040    D3DXVec2Lerp(&gotvec,&u,&v,scale);
1041    expect_vec(expectedvec,gotvec);
1042    /* Tests the case NULL */
1043     funcpointer = D3DXVec2Lerp(&gotvec,NULL,&v,scale);
1044     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1045     funcpointer = D3DXVec2Lerp(NULL,NULL,NULL,scale);
1046     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1047
1048 /*_______________D3DXVec2Maximize__________________________*/
1049    expectedvec.x = 3.0f; expectedvec.y = 9.0f;
1050    D3DXVec2Maximize(&gotvec,&u,&v);
1051    expect_vec(expectedvec,gotvec);
1052    /* Tests the case NULL */
1053     funcpointer = D3DXVec2Maximize(&gotvec,NULL,&v);
1054     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1055     funcpointer = D3DXVec2Maximize(NULL,NULL,NULL);
1056     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1057
1058 /*_______________D3DXVec2Minimize__________________________*/
1059     expectedvec.x = -7.0f; expectedvec.y = 4.0f;
1060     D3DXVec2Minimize(&gotvec,&u,&v);
1061     expect_vec(expectedvec,gotvec);
1062     /* Tests the case NULL */
1063     funcpointer = D3DXVec2Minimize(&gotvec,NULL,&v);
1064     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1065     funcpointer = D3DXVec2Minimize(NULL,NULL,NULL);
1066     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1067
1068 /*_______________D3DXVec2Normalize_________________________*/
1069     expectedvec.x = 0.6f; expectedvec.y = 0.8f;
1070     D3DXVec2Normalize(&gotvec,&u);
1071     expect_vec(expectedvec,gotvec);
1072     /* Test the nul vector */
1073     expectedvec.x = 0.0f; expectedvec.y = 0.0f;
1074     D3DXVec2Normalize(&gotvec,&nul);
1075     expect_vec(expectedvec,gotvec);
1076
1077 /*_______________D3DXVec2Scale____________________________*/
1078     expectedvec.x = -19.5f; expectedvec.y = -26.0f;
1079     D3DXVec2Scale(&gotvec,&u,scale);
1080     expect_vec(expectedvec,gotvec);
1081     /* Tests the case NULL */
1082     funcpointer = D3DXVec2Scale(&gotvec,NULL,scale);
1083     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1084     funcpointer = D3DXVec2Scale(NULL,NULL,scale);
1085     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1086
1087 /*_______________D3DXVec2Subtract__________________________*/
1088    expectedvec.x = 10.0f; expectedvec.y = -5.0f;
1089    D3DXVec2Subtract(&gotvec,&u,&v);
1090    expect_vec(expectedvec,gotvec);
1091    /* Tests the case NULL */
1092     funcpointer = D3DXVec2Subtract(&gotvec,NULL,&v);
1093     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1094     funcpointer = D3DXVec2Subtract(NULL,NULL,NULL);
1095     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1096
1097 /*_______________D3DXVec2Transform_______________________*/
1098     expectedtrans.x = 36.0f; expectedtrans.y = 44.0f; expectedtrans.z = 52.0f; expectedtrans.w = 60.0f;
1099     D3DXVec2Transform(&gottrans,&u,&mat);
1100     expect_vec4(expectedtrans,gottrans);
1101
1102 /*_______________D3DXVec2TransformCoord_______________________*/
1103     expectedvec.x = 0.6f; expectedvec.y = 11.0f/15.0f;
1104     D3DXVec2TransformCoord(&gotvec,&u,&mat);
1105     expect_vec(expectedvec,gotvec);
1106
1107  /*_______________D3DXVec2TransformNormal______________________*/
1108     expectedvec.x = 23.0f; expectedvec.y = 30.0f;
1109     D3DXVec2TransformNormal(&gotvec,&u,&mat);
1110     expect_vec(expectedvec,gotvec);
1111 }
1112
1113 static void D3DXVector3Test(void)
1114 {
1115     D3DVIEWPORT9 viewport;
1116     D3DXVECTOR3 expectedvec, gotvec, nul, u, v, w, x;
1117     LPD3DXVECTOR3 funcpointer;
1118     D3DXVECTOR4 expectedtrans, gottrans;
1119     D3DXMATRIX mat, projection, view, world;
1120     FLOAT coeff1, coeff2, expected, got, scale;
1121
1122     nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f;
1123     u.x = 9.0f; u.y = 6.0f; u.z = 2.0f;
1124     v.x = 2.0f; v.y = -3.0f; v.z = -4.0;
1125     w.x = 3.0f; w.y = -5.0f; w.z = 7.0f;
1126     x.x = 4.0f; x.y = 1.0f; x.z = 11.0f;
1127
1128     viewport.Width = 800; viewport.MinZ = 0.2f; viewport.X = 10;
1129     viewport.Height = 680; viewport.MaxZ = 0.9f; viewport.Y = 5;
1130
1131     U(mat).m[0][0] = 1.0f; U(mat).m[0][1] = 2.0f; U(mat).m[0][2] = 3.0f; U(mat).m[0][3] = 4.0f;
1132     U(mat).m[1][0] = 5.0f; U(mat).m[1][1] = 6.0f; U(mat).m[1][2] = 7.0f; U(mat).m[1][3] = 8.0f;
1133     U(mat).m[2][0] = 9.0f; U(mat).m[2][1] = 10.0f; U(mat).m[2][2] = 11.0f; U(mat).m[2][3] = 12.0f;
1134     U(mat).m[3][0] = 13.0f; U(mat).m[3][1] = 14.0f; U(mat).m[3][2] = 15.0f; U(mat).m[3][3] = 16.0f;
1135
1136     U(view).m[0][1] = 5.0f; U(view).m[0][2] = 7.0f; U(view).m[0][3] = 8.0f;
1137     U(view).m[1][0] = 11.0f; U(view).m[1][2] = 16.0f; U(view).m[1][3] = 33.0f;
1138     U(view).m[2][0] = 19.0f; U(view).m[2][1] = -21.0f; U(view).m[2][3] = 43.0f;
1139     U(view).m[3][0] = 2.0f; U(view).m[3][1] = 3.0f; U(view).m[3][2] = -4.0f;
1140     U(view).m[0][0] = 10.0f; U(view).m[1][1] = 20.0f; U(view).m[2][2] = 30.0f;
1141     U(view).m[3][3] = -40.0f;
1142
1143     U(world).m[0][0] = 21.0f; U(world).m[0][1] = 2.0f; U(world).m[0][2] = 3.0f; U(world).m[0][3] = 4.0;
1144     U(world).m[1][0] = 5.0f; U(world).m[1][1] = 23.0f; U(world).m[1][2] = 7.0f; U(world).m[1][3] = 8.0f;
1145     U(world).m[2][0] = -8.0f; U(world).m[2][1] = -7.0f; U(world).m[2][2] = 25.0f; U(world).m[2][3] = -5.0f;
1146     U(world).m[3][0] = -4.0f; U(world).m[3][1] = -3.0f; U(world).m[3][2] = -2.0f; U(world).m[3][3] = 27.0f;
1147
1148     coeff1 = 2.0f; coeff2 = 5.0f;
1149     scale = -6.5f;
1150
1151 /*_______________D3DXVec3Add__________________________*/
1152     expectedvec.x = 11.0f; expectedvec.y = 3.0f; expectedvec.z = -2.0f;
1153     D3DXVec3Add(&gotvec,&u,&v);
1154     expect_vec3(expectedvec,gotvec);
1155     /* Tests the case NULL */
1156     funcpointer = D3DXVec3Add(&gotvec,NULL,&v);
1157     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1158     funcpointer = D3DXVec3Add(NULL,NULL,NULL);
1159     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1160
1161 /*_______________D3DXVec3BaryCentric___________________*/
1162     expectedvec.x = -35.0f; expectedvec.y = -67.0; expectedvec.z = 15.0f;
1163     D3DXVec3BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2);
1164
1165     expect_vec3(expectedvec,gotvec);
1166
1167 /*_______________D3DXVec3CatmullRom____________________*/
1168     expectedvec.x = 1458.0f; expectedvec.y = 22.1875f; expectedvec.z = 4141.375f;
1169     D3DXVec3CatmullRom(&gotvec,&u,&v,&w,&x,scale);
1170     expect_vec3(expectedvec,gotvec);
1171
1172 /*_______________D3DXVec3Cross________________________*/
1173     expectedvec.x = -18.0f; expectedvec.y = 40.0f; expectedvec.z = -39.0f;
1174     D3DXVec3Cross(&gotvec,&u,&v);
1175     expect_vec3(expectedvec,gotvec);
1176     /* Tests the case NULL */
1177     funcpointer = D3DXVec3Cross(&gotvec,NULL,&v);
1178     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1179     funcpointer = D3DXVec3Cross(NULL,NULL,NULL);
1180     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1181
1182 /*_______________D3DXVec3Dot__________________________*/
1183     expected = -8.0f;
1184     got = D3DXVec3Dot(&u,&v);
1185     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1186     /* Tests the case NULL */
1187     expected=0.0f;
1188     got = D3DXVec3Dot(NULL,&v);
1189     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1190     expected=0.0f;
1191     got = D3DXVec3Dot(NULL,NULL);
1192     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1193
1194 /*_______________D3DXVec3Hermite__________________________*/
1195     expectedvec.x = -6045.75f; expectedvec.y = -6650.0f; expectedvec.z = 1358.875f;
1196     D3DXVec3Hermite(&gotvec,&u,&v,&w,&x,scale);
1197     expect_vec3(expectedvec,gotvec);
1198
1199 /*_______________D3DXVec3Length__________________________*/
1200    expected = 11.0f;
1201    got = D3DXVec3Length(&u);
1202    ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1203    /* Tests the case NULL */
1204     expected=0.0f;
1205     got = D3DXVec3Length(NULL);
1206     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1207
1208 /*_______________D3DXVec3LengthSq________________________*/
1209     expected = 121.0f;
1210     got = D3DXVec3LengthSq(&u);
1211     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1212    /* Tests the case NULL */
1213     expected=0.0f;
1214     got = D3DXVec3LengthSq(NULL);
1215     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1216
1217 /*_______________D3DXVec3Lerp__________________________*/
1218     expectedvec.x = 54.5f; expectedvec.y = 64.5f, expectedvec.z = 41.0f ;
1219     D3DXVec3Lerp(&gotvec,&u,&v,scale);
1220     expect_vec3(expectedvec,gotvec);
1221     /* Tests the case NULL */
1222     funcpointer = D3DXVec3Lerp(&gotvec,NULL,&v,scale);
1223     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1224     funcpointer = D3DXVec3Lerp(NULL,NULL,NULL,scale);
1225     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1226
1227 /*_______________D3DXVec3Maximize__________________________*/
1228     expectedvec.x = 9.0f; expectedvec.y = 6.0f; expectedvec.z = 2.0f;
1229     D3DXVec3Maximize(&gotvec,&u,&v);
1230     expect_vec3(expectedvec,gotvec);
1231     /* Tests the case NULL */
1232     funcpointer = D3DXVec3Maximize(&gotvec,NULL,&v);
1233     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1234     funcpointer = D3DXVec3Maximize(NULL,NULL,NULL);
1235     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1236
1237 /*_______________D3DXVec3Minimize__________________________*/
1238     expectedvec.x = 2.0f; expectedvec.y = -3.0f; expectedvec.z = -4.0f;
1239     D3DXVec3Minimize(&gotvec,&u,&v);
1240     expect_vec3(expectedvec,gotvec);
1241     /* Tests the case NULL */
1242     funcpointer = D3DXVec3Minimize(&gotvec,NULL,&v);
1243     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1244     funcpointer = D3DXVec3Minimize(NULL,NULL,NULL);
1245     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1246
1247 /*_______________D3DXVec3Normalize_________________________*/
1248     expectedvec.x = 9.0f/11.0f; expectedvec.y = 6.0f/11.0f; expectedvec.z = 2.0f/11.0f;
1249     D3DXVec3Normalize(&gotvec,&u);
1250     expect_vec3(expectedvec,gotvec);
1251     /* Test the nul vector */
1252     expectedvec.x = 0.0f; expectedvec.y = 0.0f; expectedvec.z = 0.0f;
1253     D3DXVec3Normalize(&gotvec,&nul);
1254     expect_vec3(expectedvec,gotvec);
1255
1256 /*_______________D3DXVec3Project_________________________*/
1257     expectedvec.x = 1135.721924f; expectedvec.y = 147.086914f; expectedvec.z = 0.153412f;
1258     D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f);
1259     D3DXVec3Project(&gotvec,&u,&viewport,&projection,&view,&world);
1260     expect_vec3(expectedvec,gotvec);
1261
1262 /*_______________D3DXVec3Scale____________________________*/
1263     expectedvec.x = -58.5f; expectedvec.y = -39.0f; expectedvec.z = -13.0f;
1264     D3DXVec3Scale(&gotvec,&u,scale);
1265     expect_vec3(expectedvec,gotvec);
1266     /* Tests the case NULL */
1267     funcpointer = D3DXVec3Scale(&gotvec,NULL,scale);
1268     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1269     funcpointer = D3DXVec3Scale(NULL,NULL,scale);
1270     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1271
1272 /*_______________D3DXVec3Subtract_______________________*/
1273     expectedvec.x = 7.0f; expectedvec.y = 9.0f; expectedvec.z = 6.0f;
1274     D3DXVec3Subtract(&gotvec,&u,&v);
1275     expect_vec3(expectedvec,gotvec);
1276     /* Tests the case NULL */
1277     funcpointer = D3DXVec3Subtract(&gotvec,NULL,&v);
1278     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1279     funcpointer = D3DXVec3Subtract(NULL,NULL,NULL);
1280     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1281
1282 /*_______________D3DXVec3Transform_______________________*/
1283     expectedtrans.x = 70.0f; expectedtrans.y = 88.0f; expectedtrans.z = 106.0f; expectedtrans.w = 124.0f;
1284     D3DXVec3Transform(&gottrans,&u,&mat);
1285     expect_vec4(expectedtrans,gottrans);
1286
1287 /*_______________D3DXVec3TransformCoord_______________________*/
1288     expectedvec.x = 70.0f/124.0f; expectedvec.y = 88.0f/124.0f; expectedvec.z = 106.0f/124.0f;
1289     D3DXVec3TransformCoord(&gotvec,&u,&mat);
1290     expect_vec3(expectedvec,gotvec);
1291
1292 /*_______________D3DXVec3TransformNormal______________________*/
1293     expectedvec.x = 57.0f; expectedvec.y = 74.0f; expectedvec.z = 91.0f;
1294     D3DXVec3TransformNormal(&gotvec,&u,&mat);
1295     expect_vec3(expectedvec,gotvec);
1296
1297 /*_______________D3DXVec3Unproject_________________________*/
1298     expectedvec.x = -2.913411f; expectedvec.y = 1.593215f; expectedvec.z = 0.380724f;
1299     D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f);
1300     D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,&view,&world);
1301     expect_vec3(expectedvec,gotvec);
1302 }
1303
1304 static void D3DXVector4Test(void)
1305 {
1306     D3DXVECTOR4 expectedvec, gotvec, u, v, w, x;
1307     LPD3DXVECTOR4 funcpointer;
1308     D3DXVECTOR4 expectedtrans, gottrans;
1309     D3DXMATRIX mat;
1310     FLOAT coeff1, coeff2, expected, got, scale;
1311
1312     u.x = 1.0f; u.y = 2.0f; u.z = 4.0f; u.w = 10.0;
1313     v.x = -3.0f; v.y = 4.0f; v.z = -5.0f; v.w = 7.0;
1314     w.x = 4.0f; w.y =6.0f; w.z = -2.0f; w.w = 1.0f;
1315     x.x = 6.0f; x.y = -7.0f; x.z =8.0f; x.w = -9.0f;
1316
1317     U(mat).m[0][0] = 1.0f; U(mat).m[0][1] = 2.0f; U(mat).m[0][2] = 3.0f; U(mat).m[0][3] = 4.0f;
1318     U(mat).m[1][0] = 5.0f; U(mat).m[1][1] = 6.0f; U(mat).m[1][2] = 7.0f; U(mat).m[1][3] = 8.0f;
1319     U(mat).m[2][0] = 9.0f; U(mat).m[2][1] = 10.0f; U(mat).m[2][2] = 11.0f; U(mat).m[2][3] = 12.0f;
1320     U(mat).m[3][0] = 13.0f; U(mat).m[3][1] = 14.0f; U(mat).m[3][2] = 15.0f; U(mat).m[3][3] = 16.0f;
1321
1322     coeff1 = 2.0f; coeff2 = 5.0;
1323     scale = -6.5f;
1324
1325 /*_______________D3DXVec4Add__________________________*/
1326     expectedvec.x = -2.0f; expectedvec.y = 6.0f; expectedvec.z = -1.0f; expectedvec.w = 17.0f;
1327     D3DXVec4Add(&gotvec,&u,&v);
1328     expect_vec4(expectedvec,gotvec);
1329     /* Tests the case NULL */
1330     funcpointer = D3DXVec4Add(&gotvec,NULL,&v);
1331     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1332     funcpointer = D3DXVec4Add(NULL,NULL,NULL);
1333     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1334
1335 /*_______________D3DXVec4BaryCentric____________________*/
1336     expectedvec.x = 8.0f; expectedvec.y = 26.0; expectedvec.z =  -44.0f; expectedvec.w = -41.0f;
1337     D3DXVec4BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2);
1338     expect_vec4(expectedvec,gotvec);
1339
1340 /*_______________D3DXVec4CatmullRom____________________*/
1341     expectedvec.x = 2754.625f; expectedvec.y = 2367.5625f; expectedvec.z = 1060.1875f; expectedvec.w = 131.3125f;
1342     D3DXVec4CatmullRom(&gotvec,&u,&v,&w,&x,scale);
1343     expect_vec4(expectedvec,gotvec);
1344
1345 /*_______________D3DXVec4Cross_________________________*/
1346     expectedvec.x = 390.0f; expectedvec.y = -393.0f; expectedvec.z = -316.0f; expectedvec.w = 166.0f;
1347     D3DXVec4Cross(&gotvec,&u,&v,&w);
1348     expect_vec4(expectedvec,gotvec);
1349
1350 /*_______________D3DXVec4Dot__________________________*/
1351     expected = 55.0f;
1352     got = D3DXVec4Dot(&u,&v);
1353     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1354     /* Tests the case NULL */
1355     expected=0.0f;
1356     got = D3DXVec4Dot(NULL,&v);
1357     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1358     expected=0.0f;
1359     got = D3DXVec4Dot(NULL,NULL);
1360     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1361
1362 /*_______________D3DXVec4Hermite_________________________*/
1363     expectedvec.x = 1224.625f; expectedvec.y = 3461.625f; expectedvec.z = -4758.875f; expectedvec.w = -5781.5f;
1364     D3DXVec4Hermite(&gotvec,&u,&v,&w,&x,scale);
1365     expect_vec4(expectedvec,gotvec);
1366
1367 /*_______________D3DXVec4Length__________________________*/
1368    expected = 11.0f;
1369    got = D3DXVec4Length(&u);
1370    ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1371    /* Tests the case NULL */
1372     expected=0.0f;
1373     got = D3DXVec4Length(NULL);
1374     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1375
1376 /*_______________D3DXVec4LengthSq________________________*/
1377     expected = 121.0f;
1378     got = D3DXVec4LengthSq(&u);
1379     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1380     /* Tests the case NULL */
1381     expected=0.0f;
1382     got = D3DXVec4LengthSq(NULL);
1383     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1384
1385 /*_______________D3DXVec4Lerp__________________________*/
1386     expectedvec.x = 27.0f; expectedvec.y = -11.0f; expectedvec.z = 62.5;  expectedvec.w = 29.5;
1387     D3DXVec4Lerp(&gotvec,&u,&v,scale);
1388     expect_vec4(expectedvec,gotvec);
1389     /* Tests the case NULL */
1390     funcpointer = D3DXVec4Lerp(&gotvec,NULL,&v,scale);
1391     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1392     funcpointer = D3DXVec4Lerp(NULL,NULL,NULL,scale);
1393     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1394
1395 /*_______________D3DXVec4Maximize__________________________*/
1396     expectedvec.x = 1.0f; expectedvec.y = 4.0f; expectedvec.z = 4.0f; expectedvec.w = 10.0;
1397     D3DXVec4Maximize(&gotvec,&u,&v);
1398     expect_vec4(expectedvec,gotvec);
1399     /* Tests the case NULL */
1400     funcpointer = D3DXVec4Maximize(&gotvec,NULL,&v);
1401     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1402     funcpointer = D3DXVec4Maximize(NULL,NULL,NULL);
1403     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1404
1405 /*_______________D3DXVec4Minimize__________________________*/
1406     expectedvec.x = -3.0f; expectedvec.y = 2.0f; expectedvec.z = -5.0f; expectedvec.w = 7.0;
1407     D3DXVec4Minimize(&gotvec,&u,&v);
1408     expect_vec4(expectedvec,gotvec);
1409     /* Tests the case NULL */
1410     funcpointer = D3DXVec4Minimize(&gotvec,NULL,&v);
1411     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1412     funcpointer = D3DXVec4Minimize(NULL,NULL,NULL);
1413     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1414
1415 /*_______________D3DXVec4Normalize_________________________*/
1416     expectedvec.x = 1.0f/11.0f; expectedvec.y = 2.0f/11.0f; expectedvec.z = 4.0f/11.0f; expectedvec.w = 10.0f/11.0f;
1417     D3DXVec4Normalize(&gotvec,&u);
1418     expect_vec4(expectedvec,gotvec);
1419
1420 /*_______________D3DXVec4Scale____________________________*/
1421     expectedvec.x = -6.5f; expectedvec.y = -13.0f; expectedvec.z = -26.0f; expectedvec.w = -65.0f;
1422     D3DXVec4Scale(&gotvec,&u,scale);
1423     expect_vec4(expectedvec,gotvec);
1424     /* Tests the case NULL */
1425     funcpointer = D3DXVec4Scale(&gotvec,NULL,scale);
1426     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1427     funcpointer = D3DXVec4Scale(NULL,NULL,scale);
1428     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1429
1430 /*_______________D3DXVec4Subtract__________________________*/
1431     expectedvec.x = 4.0f; expectedvec.y = -2.0f; expectedvec.z = 9.0f; expectedvec.w = 3.0f;
1432     D3DXVec4Subtract(&gotvec,&u,&v);
1433     expect_vec4(expectedvec,gotvec);
1434     /* Tests the case NULL */
1435     funcpointer = D3DXVec4Subtract(&gotvec,NULL,&v);
1436     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1437     funcpointer = D3DXVec4Subtract(NULL,NULL,NULL);
1438     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1439
1440 /*_______________D3DXVec4Transform_______________________*/
1441     expectedtrans.x = 177.0f; expectedtrans.y = 194.0f; expectedtrans.z = 211.0f; expectedtrans.w = 228.0f;
1442     D3DXVec4Transform(&gottrans,&u,&mat);
1443     expect_vec4(expectedtrans,gottrans);
1444 }
1445
1446 static void test_matrix_stack(void)
1447 {
1448     ID3DXMatrixStack *stack;
1449     ULONG refcount;
1450     HRESULT hr;
1451
1452     const D3DXMATRIX mat1 = {{{
1453          1.0f,  2.0f,  3.0f,  4.0f,
1454          5.0f,  6.0f,  7.0f,  8.0f,
1455          9.0f, 10.0f, 11.0f, 12.0f,
1456         13.0f, 14.0f, 15.0f, 16.0f
1457     }}};
1458
1459     const D3DXMATRIX mat2 = {{{
1460         17.0f, 18.0f, 19.0f, 20.0f,
1461         21.0f, 22.0f, 23.0f, 24.0f,
1462         25.0f, 26.0f, 27.0f, 28.0f,
1463         29.0f, 30.0f, 31.0f, 32.0f
1464     }}};
1465
1466     hr = D3DXCreateMatrixStack(0, &stack);
1467     ok(SUCCEEDED(hr), "Failed to create a matrix stack, hr %#x\n", hr);
1468     if (FAILED(hr)) return;
1469
1470     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)),
1471             "The top of an empty matrix stack should be an identity matrix\n");
1472
1473     hr = ID3DXMatrixStack_Pop(stack);
1474     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1475
1476     hr = ID3DXMatrixStack_Push(stack);
1477     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1478     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
1479
1480     hr = ID3DXMatrixStack_Push(stack);
1481     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1482
1483     hr = ID3DXMatrixStack_LoadMatrix(stack, &mat1);
1484     ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
1485     expect_mat(&mat1, ID3DXMatrixStack_GetTop(stack));
1486
1487     hr = ID3DXMatrixStack_Push(stack);
1488     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1489     expect_mat(&mat1, ID3DXMatrixStack_GetTop(stack));
1490
1491     hr = ID3DXMatrixStack_LoadMatrix(stack, &mat2);
1492     ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
1493     expect_mat(&mat2, ID3DXMatrixStack_GetTop(stack));
1494
1495     hr = ID3DXMatrixStack_Push(stack);
1496     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1497     expect_mat(&mat2, ID3DXMatrixStack_GetTop(stack));
1498
1499     hr = ID3DXMatrixStack_LoadIdentity(stack);
1500     ok(SUCCEEDED(hr), "LoadIdentity failed, hr %#x\n", hr);
1501     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
1502
1503     hr = ID3DXMatrixStack_Pop(stack);
1504     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1505     expect_mat(&mat2, ID3DXMatrixStack_GetTop(stack));
1506
1507     hr = ID3DXMatrixStack_Pop(stack);
1508     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1509     expect_mat(&mat1, ID3DXMatrixStack_GetTop(stack));
1510
1511     hr = ID3DXMatrixStack_Pop(stack);
1512     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1513     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
1514
1515     hr = ID3DXMatrixStack_Pop(stack);
1516     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1517     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
1518
1519     refcount = ID3DXMatrixStack_Release(stack);
1520     ok(!refcount, "Matrix stack has %u references left.\n", refcount);
1521 }
1522
1523 static void test_Matrix_AffineTransformation2D(void)
1524 {
1525     D3DXMATRIX exp_mat, got_mat;
1526     D3DXVECTOR2 center, position;
1527     FLOAT angle, scale;
1528
1529     center.x = 3.0f;
1530     center.y = 4.0f;
1531
1532     position.x = -6.0f;
1533     position.y = 7.0f;
1534
1535     angle = D3DX_PI/3.0f;
1536
1537     scale = 20.0f;
1538
1539     U(exp_mat).m[0][0] = 10.0f;
1540     U(exp_mat).m[1][0] = -17.320507f;
1541     U(exp_mat).m[2][0] = 0.0f;
1542     U(exp_mat).m[3][0] = -1.035898f;
1543     U(exp_mat).m[0][1] = 17.320507f;
1544     U(exp_mat).m[1][1] = 10.0f;
1545     U(exp_mat).m[2][1] = 0.0f;
1546     U(exp_mat).m[3][1] = 6.401924f;
1547     U(exp_mat).m[0][2] = 0.0f;
1548     U(exp_mat).m[1][2] = 0.0f;
1549     U(exp_mat).m[2][2] = 1.0f;
1550     U(exp_mat).m[3][2] = 0.0f;
1551     U(exp_mat).m[0][3] = 0.0f;
1552     U(exp_mat).m[1][3] = 0.0f;
1553     U(exp_mat).m[2][3] = 0.0f;
1554     U(exp_mat).m[3][3] = 1.0f;
1555
1556     D3DXMatrixAffineTransformation2D(&got_mat, scale, &center, angle, &position);
1557
1558     expect_mat(&exp_mat, &got_mat);
1559
1560 /*______________*/
1561
1562     center.x = 3.0f;
1563     center.y = 4.0f;
1564
1565     angle = D3DX_PI/3.0f;
1566
1567     scale = 20.0f;
1568
1569     U(exp_mat).m[0][0] = 10.0f;
1570     U(exp_mat).m[1][0] = -17.320507f;
1571     U(exp_mat).m[2][0] = 0.0f;
1572     U(exp_mat).m[3][0] = 4.964102f;
1573     U(exp_mat).m[0][1] = 17.320507f;
1574     U(exp_mat).m[1][1] = 10.0f;
1575     U(exp_mat).m[2][1] = 0.0f;
1576     U(exp_mat).m[3][1] = -0.598076f;
1577     U(exp_mat).m[0][2] = 0.0f;
1578     U(exp_mat).m[1][2] = 0.0f;
1579     U(exp_mat).m[2][2] = 1.0f;
1580     U(exp_mat).m[3][2] = 0.0f;
1581     U(exp_mat).m[0][3] = 0.0f;
1582     U(exp_mat).m[1][3] = 0.0f;
1583     U(exp_mat).m[2][3] = 0.0f;
1584     U(exp_mat).m[3][3] = 1.0f;
1585
1586     D3DXMatrixAffineTransformation2D(&got_mat, scale, &center, angle, NULL);
1587
1588     expect_mat(&exp_mat, &got_mat);
1589
1590 /*______________*/
1591
1592     position.x = -6.0f;
1593     position.y = 7.0f;
1594
1595     angle = D3DX_PI/3.0f;
1596
1597     scale = 20.0f;
1598
1599     U(exp_mat).m[0][0] = 10.0f;
1600     U(exp_mat).m[1][0] = -17.320507f;
1601     U(exp_mat).m[2][0] = 0.0f;
1602     U(exp_mat).m[3][0] = -6.0f;
1603     U(exp_mat).m[0][1] = 17.320507f;
1604     U(exp_mat).m[1][1] = 10.0f;
1605     U(exp_mat).m[2][1] = 0.0f;
1606     U(exp_mat).m[3][1] = 7.0f;
1607     U(exp_mat).m[0][2] = 0.0f;
1608     U(exp_mat).m[1][2] = 0.0f;
1609     U(exp_mat).m[2][2] = 1.0f;
1610     U(exp_mat).m[3][2] = 0.0f;
1611     U(exp_mat).m[0][3] = 0.0f;
1612     U(exp_mat).m[1][3] = 0.0f;
1613     U(exp_mat).m[2][3] = 0.0f;
1614     U(exp_mat).m[3][3] = 1.0f;
1615
1616     D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, &position);
1617
1618     expect_mat(&exp_mat, &got_mat);
1619
1620 /*______________*/
1621
1622     angle = 5.0f * D3DX_PI/4.0f;
1623
1624     scale = -20.0f;
1625
1626     U(exp_mat).m[0][0] = 14.142133f;
1627     U(exp_mat).m[1][0] = -14.142133f;
1628     U(exp_mat).m[2][0] = 0.0f;
1629     U(exp_mat).m[3][0] = 0.0f;
1630     U(exp_mat).m[0][1] = 14.142133;
1631     U(exp_mat).m[1][1] = 14.142133f;
1632     U(exp_mat).m[2][1] = 0.0f;
1633     U(exp_mat).m[3][1] = 0.0f;
1634     U(exp_mat).m[0][2] = 0.0f;
1635     U(exp_mat).m[1][2] = 0.0f;
1636     U(exp_mat).m[2][2] = 1.0f;
1637     U(exp_mat).m[3][2] = 0.0f;
1638     U(exp_mat).m[0][3] = 0.0f;
1639     U(exp_mat).m[1][3] = 0.0f;
1640     U(exp_mat).m[2][3] = 0.0f;
1641     U(exp_mat).m[3][3] = 1.0f;
1642
1643     D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, NULL);
1644
1645     expect_mat(&exp_mat, &got_mat);
1646 }
1647
1648 static void test_Matrix_Decompose(void)
1649 {
1650     D3DXMATRIX pm;
1651     D3DXQUATERNION exp_rotation, got_rotation;
1652     D3DXVECTOR3 exp_scale, got_scale, exp_translation, got_translation;
1653     HRESULT hr;
1654
1655 /*___________*/
1656
1657     U(pm).m[0][0] = -0.9238790f;
1658     U(pm).m[1][0] = -0.2705984f;
1659     U(pm).m[2][0] = 0.2705984f;
1660     U(pm).m[3][0] = -5.0f;
1661     U(pm).m[0][1] = 0.2705984f;
1662     U(pm).m[1][1] = 0.03806049f;
1663     U(pm).m[2][1] = 0.9619395f;
1664     U(pm).m[3][1] = 0.0f;
1665     U(pm).m[0][2] = -0.2705984f;
1666     U(pm).m[1][2] = 0.9619395f;
1667     U(pm).m[2][2] = 0.03806049f;
1668     U(pm).m[3][2] = 10.0f;
1669     U(pm).m[0][3] = 0.0f;
1670     U(pm).m[1][3] = 0.0f;
1671     U(pm).m[2][3] = 0.0f;
1672     U(pm).m[3][3] = 1.0f;
1673
1674     exp_scale.x = 1.0f;
1675     exp_scale.y = 1.0f;
1676     exp_scale.z = 1.0f;
1677
1678     exp_rotation.w = 0.195091f;
1679     exp_rotation.x = 0.0f;
1680     exp_rotation.y = 0.693520f;
1681     exp_rotation.z = 0.693520f;
1682
1683     exp_translation.x = -5.0f;
1684     exp_translation.y = 0.0f;
1685     exp_translation.z = 10.0f;
1686
1687     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1688
1689     compare_scale(exp_scale, got_scale);
1690     compare_rotation(exp_rotation, got_rotation);
1691     compare_translation(exp_translation, got_translation);
1692
1693 /*_________*/
1694
1695     U(pm).m[0][0] = -2.255813f;
1696     U(pm).m[1][0] = 1.302324f;
1697     U(pm).m[2][0] = 1.488373f;
1698     U(pm).m[3][0] = 1.0f;
1699     U(pm).m[0][1] = 1.302327f;
1700     U(pm).m[1][1] = -0.7209296f;
1701     U(pm).m[2][1] = 2.60465f;
1702     U(pm).m[3][1] = 2.0f;
1703     U(pm).m[0][2] = 1.488371f;
1704     U(pm).m[1][2] = 2.604651f;
1705     U(pm).m[2][2] = -0.02325551f;
1706     U(pm).m[3][2] = 3.0f;
1707     U(pm).m[0][3] = 0.0f;
1708     U(pm).m[1][3] = 0.0f;
1709     U(pm).m[2][3] = 0.0f;
1710     U(pm).m[3][3] = 1.0f;
1711
1712     exp_scale.x = 3.0f;
1713     exp_scale.y = 3.0f;
1714     exp_scale.z = 3.0f;
1715
1716     exp_rotation.w = 0.0;
1717     exp_rotation.x = 0.352180f;
1718     exp_rotation.y = 0.616316f;
1719     exp_rotation.z = 0.704361f;
1720
1721     exp_translation.x = 1.0f;
1722     exp_translation.y = 2.0f;
1723     exp_translation.z = 3.0f;
1724
1725     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1726
1727     compare_scale(exp_scale, got_scale);
1728     compare_rotation(exp_rotation, got_rotation);
1729     compare_translation(exp_translation, got_translation);
1730
1731 /*_____________*/
1732
1733     U(pm).m[0][0] = 2.427051f;
1734     U(pm).m[1][0] = 0.0f;
1735     U(pm).m[2][0] = 1.763355f;
1736     U(pm).m[3][0] = 5.0f;
1737     U(pm).m[0][1] = 0.0f;
1738     U(pm).m[1][1] = 3.0f;
1739     U(pm).m[2][1] = 0.0f;
1740     U(pm).m[3][1] = 5.0f;
1741     U(pm).m[0][2] = -1.763355f;
1742     U(pm).m[1][2] = 0.0f;
1743     U(pm).m[2][2] = 2.427051f;
1744     U(pm).m[3][2] = 5.0f;
1745     U(pm).m[0][3] = 0.0f;
1746     U(pm).m[1][3] = 0.0f;
1747     U(pm).m[2][3] = 0.0f;
1748     U(pm).m[3][3] = 1.0f;
1749
1750     exp_scale.x = 3.0f;
1751     exp_scale.y = 3.0f;
1752     exp_scale.z = 3.0f;
1753
1754     exp_rotation.w = 0.951057f;
1755     exp_rotation.x = 0.0f;
1756     exp_rotation.y = 0.309017f;
1757     exp_rotation.z = 0.0f;
1758
1759     exp_translation.x = 5.0f;
1760     exp_translation.y = 5.0f;
1761     exp_translation.z = 5.0f;
1762
1763     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1764
1765     compare_scale(exp_scale, got_scale);
1766     compare_rotation(exp_rotation, got_rotation);
1767     compare_translation(exp_translation, got_translation);
1768
1769 /*_____________*/
1770
1771     U(pm).m[0][0] = -0.9238790f;
1772     U(pm).m[1][0] = -0.2705984f;
1773     U(pm).m[2][0] = 0.2705984f;
1774     U(pm).m[3][0] = -5.0f;
1775     U(pm).m[0][1] = 0.2705984f;
1776     U(pm).m[1][1] = 0.03806049f;
1777     U(pm).m[2][1] = 0.9619395f;
1778     U(pm).m[3][1] = 0.0f;
1779     U(pm).m[0][2] = -0.2705984f;
1780     U(pm).m[1][2] = 0.9619395f;
1781     U(pm).m[2][2] = 0.03806049f;
1782     U(pm).m[3][2] = 10.0f;
1783     U(pm).m[0][3] = 0.0f;
1784     U(pm).m[1][3] = 0.0f;
1785     U(pm).m[2][3] = 0.0f;
1786     U(pm).m[3][3] = 1.0f;
1787
1788     exp_scale.x = 1.0f;
1789     exp_scale.y = 1.0f;
1790     exp_scale.z = 1.0f;
1791
1792     exp_rotation.w = 0.195091f;
1793     exp_rotation.x = 0.0f;
1794     exp_rotation.y = 0.693520f;
1795     exp_rotation.z = 0.693520f;
1796
1797     exp_translation.x = -5.0f;
1798     exp_translation.y = 0.0f;
1799     exp_translation.z = 10.0f;
1800
1801     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1802
1803     compare_scale(exp_scale, got_scale);
1804     compare_rotation(exp_rotation, got_rotation);
1805     compare_translation(exp_translation, got_translation);
1806
1807 /*__________*/
1808
1809     U(pm).m[0][0] = -0.9238790f;
1810     U(pm).m[1][0] = -0.5411968f;
1811     U(pm).m[2][0] = 0.8117952f;
1812     U(pm).m[3][0] = -5.0f;
1813     U(pm).m[0][1] = 0.2705984f;
1814     U(pm).m[1][1] = 0.07612098f;
1815     U(pm).m[2][1] = 2.8858185f;
1816     U(pm).m[3][1] = 0.0f;
1817     U(pm).m[0][2] = -0.2705984f;
1818     U(pm).m[1][2] = 1.9238790f;
1819     U(pm).m[2][2] = 0.11418147f;
1820     U(pm).m[3][2] = 10.0f;
1821     U(pm).m[0][3] = 0.0f;
1822     U(pm).m[1][3] = 0.0f;
1823     U(pm).m[2][3] = 0.0f;
1824     U(pm).m[3][3] = 1.0f;
1825
1826     exp_scale.x = 1.0f;
1827     exp_scale.y = 2.0f;
1828     exp_scale.z = 3.0f;
1829
1830     exp_rotation.w = 0.195091f;
1831     exp_rotation.x = 0.0f;
1832     exp_rotation.y = 0.693520f;
1833     exp_rotation.z = 0.693520f;
1834
1835     exp_translation.x = -5.0f;
1836     exp_translation.y = 0.0f;
1837     exp_translation.z = 10.0f;
1838
1839     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1840
1841     compare_scale(exp_scale, got_scale);
1842     compare_rotation(exp_rotation, got_rotation);
1843     compare_translation(exp_translation, got_translation);
1844
1845 /*__________*/
1846
1847     U(pm).m[0][0] = 0.7156004f;
1848     U(pm).m[1][0] = -0.5098283f;
1849     U(pm).m[2][0] = -0.4774843f;
1850     U(pm).m[3][0] = -5.0f;
1851     U(pm).m[0][1] = -0.6612288f;
1852     U(pm).m[1][1] = -0.7147621f;
1853     U(pm).m[2][1] = -0.2277977f;
1854     U(pm).m[3][1] = 0.0f;
1855     U(pm).m[0][2] = -0.2251499f;
1856     U(pm).m[1][2] = 0.4787385f;
1857     U(pm).m[2][2] = -0.8485972f;
1858     U(pm).m[3][2] = 10.0f;
1859     U(pm).m[0][3] = 0.0f;
1860     U(pm).m[1][3] = 0.0f;
1861     U(pm).m[2][3] = 0.0f;
1862     U(pm).m[3][3] = 1.0f;
1863
1864     exp_scale.x = 1.0f;
1865     exp_scale.y = 1.0f;
1866     exp_scale.z = 1.0f;
1867
1868     exp_rotation.w = 0.195091f;
1869     exp_rotation.x = 0.905395f;
1870     exp_rotation.y = -0.323355f;
1871     exp_rotation.z = -0.194013f;
1872
1873     exp_translation.x = -5.0f;
1874     exp_translation.y = 0.0f;
1875     exp_translation.z = 10.0f;
1876
1877     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1878
1879     compare_scale(exp_scale, got_scale);
1880     compare_rotation(exp_rotation, got_rotation);
1881     compare_translation(exp_translation, got_translation);
1882
1883 /*_____________*/
1884
1885     U(pm).m[0][0] = 0.06554436f;
1886     U(pm).m[1][0] = -0.6873012f;
1887     U(pm).m[2][0] = 0.7234092f;
1888     U(pm).m[3][0] = -5.0f;
1889     U(pm).m[0][1] = -0.9617381f;
1890     U(pm).m[1][1] = -0.2367795f;
1891     U(pm).m[2][1] = -0.1378230f;
1892     U(pm).m[3][1] = 0.0f;
1893     U(pm).m[0][2] = 0.2660144f;
1894     U(pm).m[1][2] = -0.6866967f;
1895     U(pm).m[2][2] = -0.6765233f;
1896     U(pm).m[3][2] = 10.0f;
1897     U(pm).m[0][3] = 0.0f;
1898     U(pm).m[1][3] = 0.0f;
1899     U(pm).m[2][3] = 0.0f;
1900     U(pm).m[3][3] = 1.0f;
1901
1902     exp_scale.x = 1.0f;
1903     exp_scale.y = 1.0f;
1904     exp_scale.z = 1.0f;
1905
1906     exp_rotation.w = -0.195091f;
1907     exp_rotation.x = 0.703358f;
1908     exp_rotation.y = -0.586131f;
1909     exp_rotation.z = 0.351679f;
1910
1911     exp_translation.x = -5.0f;
1912     exp_translation.y = 0.0f;
1913     exp_translation.z = 10.0f;
1914
1915     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1916
1917     compare_scale(exp_scale, got_scale);
1918     compare_rotation(exp_rotation, got_rotation);
1919     compare_translation(exp_translation, got_translation);
1920
1921 /*_________*/
1922
1923     U(pm).m[0][0] = 7.121047f;
1924     U(pm).m[1][0] = -5.883487f;
1925     U(pm).m[2][0] = 11.81843f;
1926     U(pm).m[3][0] = -5.0f;
1927     U(pm).m[0][1] = 5.883487f;
1928     U(pm).m[1][1] = -10.60660f;
1929     U(pm).m[2][1] = -8.825232f;
1930     U(pm).m[3][1] = 0.0f;
1931     U(pm).m[0][2] = 11.81843f;
1932     U(pm).m[1][2] = 8.8252320f;
1933     U(pm).m[2][2] = -2.727645f;
1934     U(pm).m[3][2] = 2.0f;
1935     U(pm).m[0][3] = 0.0f;
1936     U(pm).m[1][3] = 0.0f;
1937     U(pm).m[2][3] = 0.0f;
1938     U(pm).m[3][3] = 1.0f;
1939
1940     exp_scale.x = 15.0f;
1941     exp_scale.y = 15.0f;
1942     exp_scale.z = 15.0f;
1943
1944     exp_rotation.w = 0.382684f;
1945     exp_rotation.x = 0.768714f;
1946     exp_rotation.y = 0.0f;
1947     exp_rotation.z = 0.512476f;
1948
1949     exp_translation.x = -5.0f;
1950     exp_translation.y = 0.0f;
1951     exp_translation.z = 2.0f;
1952
1953     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1954
1955     compare_scale(exp_scale, got_scale);
1956     compare_rotation(exp_rotation, got_rotation);
1957     compare_translation(exp_translation, got_translation);
1958
1959 /*__________*/
1960
1961     U(pm).m[0][0] = 0.0f;
1962     U(pm).m[1][0] = 4.0f;
1963     U(pm).m[2][0] = 5.0f;
1964     U(pm).m[3][0] = -5.0f;
1965     U(pm).m[0][1] = 0.0f;
1966     U(pm).m[1][1] = -10.60660f;
1967     U(pm).m[2][1] = -8.825232f;
1968     U(pm).m[3][1] = 6.0f;
1969     U(pm).m[0][2] = 0.0f;
1970     U(pm).m[1][2] = 8.8252320f;
1971     U(pm).m[2][2] = 2.727645;
1972     U(pm).m[3][2] = 3.0f;
1973     U(pm).m[0][3] = 0.0f;
1974     U(pm).m[1][3] = 0.0f;
1975     U(pm).m[2][3] = 0.0f;
1976     U(pm).m[3][3] = 1.0f;
1977
1978     hr = D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1979     ok(hr == D3DERR_INVALIDCALL, "Expected D3DERR_INVALIDCALL, got %x\n", hr);
1980 }
1981
1982 static void test_Matrix_Transformation2D(void)
1983 {
1984     D3DXMATRIX exp_mat, got_mat;
1985     D3DXVECTOR2 rot_center, sca, sca_center, trans;
1986     FLOAT rot, sca_rot;
1987
1988     rot_center.x = 3.0f;
1989     rot_center.y = 4.0f;
1990
1991     sca.x = 12.0f;
1992     sca.y = -3.0f;
1993
1994     sca_center.x = 9.0f;
1995     sca_center.y = -5.0f;
1996
1997     trans.x = -6.0f;
1998     trans.y = 7.0f;
1999
2000     rot = D3DX_PI/3.0f;
2001
2002     sca_rot = 5.0f*D3DX_PI/4.0f;
2003
2004     U(exp_mat).m[0][0] = -4.245192f;
2005     U(exp_mat).m[1][0] = -0.147116f;
2006     U(exp_mat).m[2][0] = 0.0f;
2007     U(exp_mat).m[3][0] = 45.265373f;
2008     U(exp_mat).m[0][1] = 7.647113f;
2009     U(exp_mat).m[1][1] = 8.745192f;
2010     U(exp_mat).m[2][1] = 0.0f;
2011     U(exp_mat).m[3][1] = -13.401899f;
2012     U(exp_mat).m[0][2] = 0.0f;
2013     U(exp_mat).m[1][2] = 0.0f;
2014     U(exp_mat).m[2][2] = 1.0f;
2015     U(exp_mat).m[3][2] = 0.0f;
2016     U(exp_mat).m[0][3] = 0.0f;
2017     U(exp_mat).m[1][3] = 0.0f;
2018     U(exp_mat).m[2][3] = 0.0f;
2019     U(exp_mat).m[3][3] = 1.0f;
2020
2021     D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, &sca, &rot_center, rot, &trans);
2022
2023     expect_mat(&exp_mat, &got_mat);
2024
2025 /*_________*/
2026
2027     sca_center.x = 9.0f;
2028     sca_center.y = -5.0f;
2029
2030     trans.x = -6.0f;
2031     trans.y = 7.0f;
2032
2033     rot = D3DX_PI/3.0f;
2034
2035     sca_rot = 5.0f*D3DX_PI/4.0f;
2036
2037     U(exp_mat).m[0][0] = 0.50f;
2038     U(exp_mat).m[1][0] = -0.866025f;
2039     U(exp_mat).m[2][0] = 0.0f;
2040     U(exp_mat).m[3][0] = -6.0f;
2041     U(exp_mat).m[0][1] = 0.866025f;
2042     U(exp_mat).m[1][1] = 0.50f;
2043     U(exp_mat).m[2][1] = 0.0f;
2044     U(exp_mat).m[3][1] = 7.0f;
2045     U(exp_mat).m[0][2] = 0.0f;
2046     U(exp_mat).m[1][2] = 0.0f;
2047     U(exp_mat).m[2][2] = 1.0f;
2048     U(exp_mat).m[3][2] = 0.0f;
2049     U(exp_mat).m[0][3] = 0.0f;
2050     U(exp_mat).m[1][3] = 0.0f;
2051     U(exp_mat).m[2][3] = 0.0f;
2052     U(exp_mat).m[3][3] = 1.0f;
2053
2054     D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, NULL, NULL, rot, &trans);
2055
2056     expect_mat(&exp_mat, &got_mat);
2057
2058 /*_________*/
2059
2060     U(exp_mat).m[0][0] = 0.50f;
2061     U(exp_mat).m[1][0] = -0.866025f;
2062     U(exp_mat).m[2][0] = 0.0f;
2063     U(exp_mat).m[3][0] = 0.0f;
2064     U(exp_mat).m[0][1] = 0.866025f;
2065     U(exp_mat).m[1][1] = 0.50f;
2066     U(exp_mat).m[2][1] = 0.0f;
2067     U(exp_mat).m[3][1] = 0.0f;
2068     U(exp_mat).m[0][2] = 0.0f;
2069     U(exp_mat).m[1][2] = 0.0f;
2070     U(exp_mat).m[2][2] = 1.0f;
2071     U(exp_mat).m[3][2] = 0.0f;
2072     U(exp_mat).m[0][3] = 0.0f;
2073     U(exp_mat).m[1][3] = 0.0f;
2074     U(exp_mat).m[2][3] = 0.0f;
2075     U(exp_mat).m[3][3] = 1.0f;
2076
2077     D3DXMatrixTransformation2D(&got_mat, NULL, sca_rot, NULL, NULL, rot, NULL);
2078
2079     expect_mat(&exp_mat, &got_mat);
2080 }
2081
2082 static void test_D3DXVec_Array(void)
2083 {
2084     unsigned int i;
2085     D3DVIEWPORT9 viewport;
2086     D3DXMATRIX mat, projection, view, world;
2087     D3DXVECTOR4 inp_vec[ARRAY_SIZE];
2088     D3DXVECTOR4 out_vec[ARRAY_SIZE + 2];
2089     D3DXVECTOR4 exp_vec[ARRAY_SIZE + 2];
2090     D3DXPLANE inp_plane[ARRAY_SIZE];
2091     D3DXPLANE out_plane[ARRAY_SIZE + 2];
2092     D3DXPLANE exp_plane[ARRAY_SIZE + 2];
2093
2094     viewport.Width = 800; viewport.MinZ = 0.2f; viewport.X = 10;
2095     viewport.Height = 680; viewport.MaxZ = 0.9f; viewport.Y = 5;
2096
2097     for (i = 0; i < ARRAY_SIZE + 2; ++i) {
2098         out_vec[i].x = out_vec[i].y = out_vec[i].z = out_vec[i].w = 0.0f;
2099         exp_vec[i].x = exp_vec[i].y = exp_vec[i].z = exp_vec[i].w = 0.0f;
2100         out_plane[i].a = out_plane[i].b = out_plane[i].c = out_plane[i].d = 0.0f;
2101         exp_plane[i].a = exp_plane[i].b = exp_plane[i].c = exp_plane[i].d = 0.0f;
2102     }
2103
2104     for (i = 0; i < ARRAY_SIZE; ++i) {
2105         inp_plane[i].a = inp_plane[i].c = inp_vec[i].x = inp_vec[i].z = i;
2106         inp_plane[i].b = inp_plane[i].d = inp_vec[i].y = inp_vec[i].w = ARRAY_SIZE - i;
2107     }
2108
2109     U(mat).m[0][0] = 1.0f; U(mat).m[0][1] = 2.0f; U(mat).m[0][2] = 3.0f; U(mat).m[0][3] = 4.0f;
2110     U(mat).m[1][0] = 5.0f; U(mat).m[1][1] = 6.0f; U(mat).m[1][2] = 7.0f; U(mat).m[1][3] = 8.0f;
2111     U(mat).m[2][0] = 9.0f; U(mat).m[2][1] = 10.0f; U(mat).m[2][2] = 11.0f; U(mat).m[2][3] = 12.0f;
2112     U(mat).m[3][0] = 13.0f; U(mat).m[3][1] = 14.0f; U(mat).m[3][2] = 15.0f; U(mat).m[3][3] = 16.0f;
2113
2114     D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f);
2115
2116     U(view).m[0][1] = 5.0f; U(view).m[0][2] = 7.0f; U(view).m[0][3] = 8.0f;
2117     U(view).m[1][0] = 11.0f; U(view).m[1][2] = 16.0f; U(view).m[1][3] = 33.0f;
2118     U(view).m[2][0] = 19.0f; U(view).m[2][1] = -21.0f; U(view).m[2][3] = 43.0f;
2119     U(view).m[3][0] = 2.0f; U(view).m[3][1] = 3.0f; U(view).m[3][2] = -4.0f;
2120     U(view).m[0][0] = 10.0f; U(view).m[1][1] = 20.0f; U(view).m[2][2] = 30.0f;
2121     U(view).m[3][3] = -40.0f;
2122
2123     U(world).m[0][0] = 21.0f; U(world).m[0][1] = 2.0f; U(world).m[0][2] = 3.0f; U(world).m[0][3] = 4.0;
2124     U(world).m[1][0] = 5.0f; U(world).m[1][1] = 23.0f; U(world).m[1][2] = 7.0f; U(world).m[1][3] = 8.0f;
2125     U(world).m[2][0] = -8.0f; U(world).m[2][1] = -7.0f; U(world).m[2][2] = 25.0f; U(world).m[2][3] = -5.0f;
2126     U(world).m[3][0] = -4.0f; U(world).m[3][1] = -3.0f; U(world).m[3][2] = -2.0f; U(world).m[3][3] = 27.0f;
2127
2128     /* D3DXVec2TransformCoordArray */
2129     exp_vec[1].x = 0.678571f; exp_vec[1].y = 0.785714f;
2130     exp_vec[2].x = 0.653846f; exp_vec[2].y = 0.769231f;
2131     exp_vec[3].x = 0.625f;    exp_vec[3].y = 0.75f;
2132     exp_vec[4].x = 0.590909f; exp_vec[4].y = 8.0f/11.0f;
2133     exp_vec[5].x = 0.55f;     exp_vec[5].y = 0.7f;
2134     D3DXVec2TransformCoordArray((D3DXVECTOR2*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR2*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2135     compare_vectors(exp_vec, out_vec);
2136
2137     /* D3DXVec2TransformNormalArray */
2138     exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f;
2139     exp_vec[2].x = 21.0f; exp_vec[2].y = 26.0f;
2140     exp_vec[3].x = 17.0f; exp_vec[3].y = 22.0f;
2141     exp_vec[4].x = 13.0f; exp_vec[4].y = 18.0f;
2142     exp_vec[5].x =  9.0f; exp_vec[5].y = 14.0f;
2143     D3DXVec2TransformNormalArray((D3DXVECTOR2*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR2*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2144     compare_vectors(exp_vec, out_vec);
2145
2146     /* D3DXVec3TransformCoordArray */
2147     exp_vec[1].x = 0.678571f; exp_vec[1].y = 0.785714f;  exp_vec[1].z = 0.892857f;
2148     exp_vec[2].x = 0.671875f; exp_vec[2].y = 0.78125f;   exp_vec[2].z = 0.890625f;
2149     exp_vec[3].x = 6.0f/9.0f; exp_vec[3].y = 7.0f/9.0f;  exp_vec[3].z = 8.0f/9.0f;
2150     exp_vec[4].x = 0.6625f;   exp_vec[4].y = 0.775f;     exp_vec[4].z = 0.8875f;
2151     exp_vec[5].x = 0.659091f; exp_vec[5].y = 0.772727f;  exp_vec[5].z = 0.886364f;
2152     D3DXVec3TransformCoordArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2153     compare_vectors(exp_vec, out_vec);
2154
2155     /* D3DXVec3TransformNormalArray */
2156     exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f; exp_vec[1].z = 35.0f;
2157     exp_vec[2].x = 30.0f; exp_vec[2].y = 36.0f; exp_vec[2].z = 42.0f;
2158     exp_vec[3].x = 35.0f; exp_vec[3].y = 42.0f; exp_vec[3].z = 49.0f;
2159     exp_vec[4].x = 40.0f; exp_vec[4].y = 48.0f; exp_vec[4].z = 56.0f;
2160     exp_vec[5].x = 45.0f; exp_vec[5].y = 54.0f; exp_vec[5].z = 63.0f;
2161     D3DXVec3TransformNormalArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2162     compare_vectors(exp_vec, out_vec);
2163
2164     /* D3DXVec3ProjectArray */
2165     exp_vec[1].x = 1089.554199f; exp_vec[1].y = -226.590622f; exp_vec[1].z = 0.215273f;
2166     exp_vec[2].x = 1068.903320f; exp_vec[2].y =  103.085129f; exp_vec[2].z = 0.183050f;
2167     exp_vec[3].x = 1051.778931f; exp_vec[3].y =  376.462250f; exp_vec[3].z = 0.156329f;
2168     exp_vec[4].x = 1037.348877f; exp_vec[4].y =  606.827393f; exp_vec[4].z = 0.133813f;
2169     exp_vec[5].x = 1025.023560f; exp_vec[5].y =  803.591248f; exp_vec[5].z = 0.114581f;
2170     D3DXVec3ProjectArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (CONST D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &viewport, &projection, &view, &world, ARRAY_SIZE);
2171     compare_vectors(exp_vec, out_vec);
2172
2173     /* D3DXVec3UnprojectArray */
2174     exp_vec[1].x = -6.124031f; exp_vec[1].y = 3.225360f; exp_vec[1].z = 0.620571f;
2175     exp_vec[2].x = -3.807109f; exp_vec[2].y = 2.046579f; exp_vec[2].z = 0.446894f;
2176     exp_vec[3].x = -2.922839f; exp_vec[3].y = 1.596689f; exp_vec[3].z = 0.380609f;
2177     exp_vec[4].x = -2.456225f; exp_vec[4].y = 1.359290f; exp_vec[4].z = 0.345632f;
2178     exp_vec[5].x = -2.167897f; exp_vec[5].y = 1.212597f; exp_vec[5].z = 0.324019f;
2179     D3DXVec3UnprojectArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (CONST D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &viewport, &projection, &view, &world, ARRAY_SIZE);
2180     compare_vectors(exp_vec, out_vec);
2181
2182     /* D3DXVec2TransformArray */
2183     exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f;
2184     exp_vec[2].x = 34.0f; exp_vec[2].y = 40.0f; exp_vec[2].z = 46.0f; exp_vec[2].w = 52.0f;
2185     exp_vec[3].x = 30.0f; exp_vec[3].y = 36.0f; exp_vec[3].z = 42.0f; exp_vec[3].w = 48.0f;
2186     exp_vec[4].x = 26.0f; exp_vec[4].y = 32.0f; exp_vec[4].z = 38.0f; exp_vec[4].w = 44.0f;
2187     exp_vec[5].x = 22.0f; exp_vec[5].y = 28.0f; exp_vec[5].z = 34.0f; exp_vec[5].w = 40.0f;
2188     D3DXVec2TransformArray(out_vec + 1, sizeof(D3DXVECTOR4), (D3DXVECTOR2*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2189     compare_vectors(exp_vec, out_vec);
2190
2191     /* D3DXVec3TransformArray */
2192     exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f;
2193     exp_vec[2].x = 43.0f; exp_vec[2].y = 50.0f; exp_vec[2].z = 57.0f; exp_vec[2].w = 64.0f;
2194     exp_vec[3].x = 48.0f; exp_vec[3].y = 56.0f; exp_vec[3].z = 64.0f; exp_vec[3].w = 72.0f;
2195     exp_vec[4].x = 53.0f; exp_vec[4].y = 62.0f; exp_vec[4].z = 71.0f; exp_vec[4].w = 80.0f;
2196     exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f; exp_vec[5].z = 78.0f; exp_vec[5].w = 88.0f;
2197     D3DXVec3TransformArray(out_vec + 1, sizeof(D3DXVECTOR4), (D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2198     compare_vectors(exp_vec, out_vec);
2199
2200     /* D3DXVec4TransformArray */
2201     exp_vec[1].x = 90.0f; exp_vec[1].y = 100.0f; exp_vec[1].z = 110.0f; exp_vec[1].w = 120.0f;
2202     exp_vec[2].x = 82.0f; exp_vec[2].y = 92.0f;  exp_vec[2].z = 102.0f; exp_vec[2].w = 112.0f;
2203     exp_vec[3].x = 74.0f; exp_vec[3].y = 84.0f;  exp_vec[3].z = 94.0f;  exp_vec[3].w = 104.0f;
2204     exp_vec[4].x = 66.0f; exp_vec[4].y = 76.0f;  exp_vec[4].z = 86.0f;  exp_vec[4].w = 96.0f;
2205     exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f;  exp_vec[5].z = 78.0f;  exp_vec[5].w = 88.0f;
2206     D3DXVec4TransformArray(out_vec + 1, sizeof(D3DXVECTOR4), inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2207     compare_vectors(exp_vec, out_vec);
2208
2209     /* D3DXPlaneTransformArray */
2210     exp_plane[1].a = 90.0f; exp_plane[1].b = 100.0f; exp_plane[1].c = 110.0f; exp_plane[1].d = 120.0f;
2211     exp_plane[2].a = 82.0f; exp_plane[2].b = 92.0f;  exp_plane[2].c = 102.0f; exp_plane[2].d = 112.0f;
2212     exp_plane[3].a = 74.0f; exp_plane[3].b = 84.0f;  exp_plane[3].c = 94.0f;  exp_plane[3].d = 104.0f;
2213     exp_plane[4].a = 66.0f; exp_plane[4].b = 76.0f;  exp_plane[4].c = 86.0f;  exp_plane[4].d = 96.0f;
2214     exp_plane[5].a = 58.0f; exp_plane[5].b = 68.0f;  exp_plane[5].c = 78.0f;  exp_plane[5].d = 88.0f;
2215     D3DXPlaneTransformArray(out_plane + 1, sizeof(D3DXPLANE), inp_plane, sizeof(D3DXPLANE), &mat, ARRAY_SIZE);
2216     compare_planes(exp_plane, out_plane);
2217 }
2218
2219 static void test_D3DXFloat_Array(void)
2220 {
2221     static const float z = 0.0f;
2222     /* Compilers set different sign bits on 0.0 / 0.0, pick the right ones for NaN and -NaN */
2223     float tmpnan = 0.0f/z;
2224     float nnan = copysignf(1, tmpnan) < 0.0f ? tmpnan : -tmpnan;
2225     float nan = -nnan;
2226     unsigned int i;
2227     void *out = NULL;
2228     D3DXFLOAT16 half;
2229     FLOAT single;
2230     struct
2231     {
2232         FLOAT single_in;
2233
2234         /* half_ver2 occurs on WXPPROSP3 (32 bit math), WVISTAADM (32 bit math), W7PRO (32 bit math) */
2235         WORD half_ver1, half_ver2;
2236
2237         /* single_out_ver2 confirms that half -> single conversion is consistent across platforms */
2238         FLOAT single_out_ver1, single_out_ver2;
2239     } testdata[] = {
2240         { 80000.0f, 0x7c00, 0x7ce2, 65536.0f, 80000.0f },
2241         { 65503.0f, 0x7bff, 0x7bff, 65504.0f, 65504.0f },
2242         { 65504.0f, 0x7bff, 0x7bff, 65504.0f, 65504.0f },
2243         { 65520.0f, 0x7bff, 0x7c00, 65504.0f, 65536.0f },
2244         { 65521.0f, 0x7c00, 0x7c00, 65536.0f, 65536.0f },
2245         { 65534.0f, 0x7c00, 0x7c00, 65536.0f, 65536.0f },
2246         { 65535.0f, 0x7c00, 0x7c00, 65535.0f, 65536.0f },
2247         { 65536.0f, 0x7c00, 0x7c00, 65536.0f, 65536.0f },
2248         { -80000.0f, 0xfc00, 0xfce2, -65536.0f, -80000.0f },
2249         { -65503.0f, 0xfbff, 0xfbff, -65504.0f, -65504.0f },
2250         { -65504.0f, 0xfbff, 0xfbff, -65504.0f, -65504.0f },
2251         { -65520.0f, 0xfbff, 0xfc00, -65504.0f, -65536.0f },
2252         { -65521.0f, 0xfc00, 0xfc00, -65536.0f, -65536.0f },
2253         { -65534.0f, 0xfc00, 0xfc00, -65536.0f, -65536.0f },
2254         { -65535.0f, 0xfc00, 0xfc00, -65535.0f, -65536.0f },
2255         { -65536.0f, 0xfc00, 0xfc00, -65536.0f, -65536.0f },
2256         { 1.0f/z, 0x7c00, 0x7fff, 65536.0f, 131008.0f },
2257         { -1.0f/z, 0xffff, 0xffff, -131008.0f, -131008.0f },
2258         { nan, 0x7fff, 0x7fff, 131008.0f, 131008.0f },
2259         { nnan, 0xffff, 0xffff, -131008.0f, -131008.0f },
2260         { 0.0f, 0x0, 0x0, 0.0f, 0.0f },
2261         { -0.0f, 0x8000, 0x8000, 0.0f, 0.0f },
2262         { 2.9809595e-08f, 0x0, 0x0, 0.0f, 0.0f },
2263         { -2.9809595e-08f, 0x8000, 0x8000, -0.0f, -0.0f },
2264         { 2.9809598e-08f, 0x1, 0x1, 5.96046e-08f, 5.96046e-08f },
2265         { -2.9809598e-08f, 0x8001, 0x8001, -5.96046e-08f, -5.96046e-08f },
2266         { 8.9406967e-08f, 0x2, 0x2, 1.19209e-07f, 1.19209e-07f }
2267     };
2268
2269     /* exception on NULL out or in parameter */
2270     out = D3DXFloat32To16Array(&half, &single, 0);
2271     ok(out == &half, "Got %p, expected %p.\n", out, &half);
2272
2273     out = D3DXFloat16To32Array(&single, &half, 0);
2274     ok(out == &single, "Got %p, expected %p.\n", out, &single);
2275
2276     for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
2277     {
2278         out = D3DXFloat32To16Array(&half, &testdata[i].single_in, 1);
2279         ok(out == &half, "Got %p, expected %p.\n", out, &half);
2280         ok(half.value == testdata[i].half_ver1 || half.value == testdata[i].half_ver2,
2281            "Got %x, expected %x or %x for index %d.\n", half.value, testdata[i].half_ver1,
2282            testdata[i].half_ver2, i);
2283
2284         out = D3DXFloat16To32Array(&single, (D3DXFLOAT16 *)&testdata[i].half_ver1, 1);
2285         ok(out == &single, "Got %p, expected %p.\n", out, &single);
2286         ok(relative_error(single, testdata[i].single_out_ver1) < admitted_error,
2287            "Got %g, expected %g for index %d.\n", single, testdata[i].single_out_ver1, i);
2288
2289         out = D3DXFloat16To32Array(&single, (D3DXFLOAT16 *)&testdata[i].half_ver2, 1);
2290         ok(out == &single, "Got %p, expected %p.\n", out, &single);
2291         ok(relative_error(single, testdata[i].single_out_ver2) < admitted_error,
2292            "Got %g, expected %g for index %d.\n", single, testdata[i].single_out_ver2, i);
2293     }
2294 }
2295
2296 static void test_D3DXSHAdd(void)
2297 {
2298     UINT i, k;
2299     FLOAT *ret = (FLOAT *)0xdeadbeef;
2300     const FLOAT in1[50] =
2301     {
2302         1.11f, 1.12f, 1.13f, 1.14f, 1.15f, 1.16f, 1.17f, 1.18f,
2303         1.19f, 1.20f, 1.21f, 1.22f, 1.23f, 1.24f, 1.25f, 1.26f,
2304         1.27f, 1.28f, 1.29f, 1.30f, 1.31f, 1.32f, 1.33f, 1.34f,
2305         1.35f, 1.36f, 1.37f, 1.38f, 1.39f, 1.40f, 1.41f, 1.42f,
2306         1.43f, 1.44f, 1.45f, 1.46f, 1.47f, 1.48f, 1.49f, 1.50f,
2307         1.51f, 1.52f, 1.53f, 1.54f, 1.55f, 1.56f, 1.57f, 1.58f,
2308         1.59f, 1.60f,
2309     };
2310     const FLOAT in2[50] =
2311     {
2312         2.11f, 2.12f, 2.13f, 2.14f, 2.15f, 2.16f, 2.17f, 2.18f,
2313         2.19f, 2.20f, 2.21f, 2.22f, 2.23f, 2.24f, 2.25f, 2.26f,
2314         2.27f, 2.28f, 2.29f, 2.30f, 2.31f, 2.32f, 2.33f, 2.34f,
2315         2.35f, 2.36f, 2.37f, 2.38f, 2.39f, 2.40f, 2.41f, 2.42f,
2316         2.43f, 2.44f, 2.45f, 2.46f, 2.47f, 2.48f, 2.49f, 2.50f,
2317         2.51f, 2.52f, 2.53f, 2.54f, 2.55f, 2.56f, 2.57f, 2.58f,
2318         2.59f, 2.60f,
2319     };
2320     FLOAT out[50] = {0.0f};
2321
2322     /*
2323      * Order is not limited by D3DXSH_MINORDER and D3DXSH_MAXORDER!
2324      * All values will work, test from 0-7 [D3DXSH_MINORDER = 2, D3DXSH_MAXORDER = 6]
2325      * Exceptions will show up when out, in1 or in2 are NULL
2326      */
2327     for (k = 0; k < 8; ++k)
2328     {
2329         UINT count = k * k;
2330
2331         ret = D3DXSHAdd(&out[0], k, &in1[0], &in2[0]);
2332         ok(ret == out, "%u: D3DXSHAdd() failed, got %p, expected %p\n", k, out, ret);
2333
2334         for (i = 0; i < count; ++i)
2335         {
2336             ok(relative_error(in1[i] + in2[i], out[i]) < admitted_error,
2337                     "%u-%u: D3DXSHAdd() failed, got %f, expected %f\n", k, i, out[i], in1[i] + in2[i]);
2338         }
2339         ok(out[count] == 0.0f, "%u-%u: D3DXSHAdd() failed, got %f, expected 0.0\n", k, k * k, out[count]);
2340     }
2341 }
2342
2343 START_TEST(math)
2344 {
2345     D3DXColorTest();
2346     D3DXFresnelTest();
2347     D3DXMatrixTest();
2348     D3DXPlaneTest();
2349     D3DXQuaternionTest();
2350     D3DXVector2Test();
2351     D3DXVector3Test();
2352     D3DXVector4Test();
2353     test_matrix_stack();
2354     test_Matrix_AffineTransformation2D();
2355     test_Matrix_Decompose();
2356     test_Matrix_Transformation2D();
2357     test_D3DXVec_Array();
2358     test_D3DXFloat_Array();
2359     test_D3DXSHAdd();
2360 }