strmbase: do not lock in BaseOutputPinImpl_GetDeliveryBuffer the MemInputPin will...
[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     /* World matrix can be omitted */
1303     D3DXMatrixMultiply(&mat,&world,&view);
1304     D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,&mat,NULL);
1305     expect_vec3(expectedvec,gotvec);
1306 }
1307
1308 static void D3DXVector4Test(void)
1309 {
1310     D3DXVECTOR4 expectedvec, gotvec, u, v, w, x;
1311     LPD3DXVECTOR4 funcpointer;
1312     D3DXVECTOR4 expectedtrans, gottrans;
1313     D3DXMATRIX mat;
1314     FLOAT coeff1, coeff2, expected, got, scale;
1315
1316     u.x = 1.0f; u.y = 2.0f; u.z = 4.0f; u.w = 10.0;
1317     v.x = -3.0f; v.y = 4.0f; v.z = -5.0f; v.w = 7.0;
1318     w.x = 4.0f; w.y =6.0f; w.z = -2.0f; w.w = 1.0f;
1319     x.x = 6.0f; x.y = -7.0f; x.z =8.0f; x.w = -9.0f;
1320
1321     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;
1322     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;
1323     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;
1324     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;
1325
1326     coeff1 = 2.0f; coeff2 = 5.0;
1327     scale = -6.5f;
1328
1329 /*_______________D3DXVec4Add__________________________*/
1330     expectedvec.x = -2.0f; expectedvec.y = 6.0f; expectedvec.z = -1.0f; expectedvec.w = 17.0f;
1331     D3DXVec4Add(&gotvec,&u,&v);
1332     expect_vec4(expectedvec,gotvec);
1333     /* Tests the case NULL */
1334     funcpointer = D3DXVec4Add(&gotvec,NULL,&v);
1335     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1336     funcpointer = D3DXVec4Add(NULL,NULL,NULL);
1337     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1338
1339 /*_______________D3DXVec4BaryCentric____________________*/
1340     expectedvec.x = 8.0f; expectedvec.y = 26.0; expectedvec.z =  -44.0f; expectedvec.w = -41.0f;
1341     D3DXVec4BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2);
1342     expect_vec4(expectedvec,gotvec);
1343
1344 /*_______________D3DXVec4CatmullRom____________________*/
1345     expectedvec.x = 2754.625f; expectedvec.y = 2367.5625f; expectedvec.z = 1060.1875f; expectedvec.w = 131.3125f;
1346     D3DXVec4CatmullRom(&gotvec,&u,&v,&w,&x,scale);
1347     expect_vec4(expectedvec,gotvec);
1348
1349 /*_______________D3DXVec4Cross_________________________*/
1350     expectedvec.x = 390.0f; expectedvec.y = -393.0f; expectedvec.z = -316.0f; expectedvec.w = 166.0f;
1351     D3DXVec4Cross(&gotvec,&u,&v,&w);
1352     expect_vec4(expectedvec,gotvec);
1353
1354 /*_______________D3DXVec4Dot__________________________*/
1355     expected = 55.0f;
1356     got = D3DXVec4Dot(&u,&v);
1357     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1358     /* Tests the case NULL */
1359     expected=0.0f;
1360     got = D3DXVec4Dot(NULL,&v);
1361     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1362     expected=0.0f;
1363     got = D3DXVec4Dot(NULL,NULL);
1364     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1365
1366 /*_______________D3DXVec4Hermite_________________________*/
1367     expectedvec.x = 1224.625f; expectedvec.y = 3461.625f; expectedvec.z = -4758.875f; expectedvec.w = -5781.5f;
1368     D3DXVec4Hermite(&gotvec,&u,&v,&w,&x,scale);
1369     expect_vec4(expectedvec,gotvec);
1370
1371 /*_______________D3DXVec4Length__________________________*/
1372    expected = 11.0f;
1373    got = D3DXVec4Length(&u);
1374    ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1375    /* Tests the case NULL */
1376     expected=0.0f;
1377     got = D3DXVec4Length(NULL);
1378     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1379
1380 /*_______________D3DXVec4LengthSq________________________*/
1381     expected = 121.0f;
1382     got = D3DXVec4LengthSq(&u);
1383     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1384     /* Tests the case NULL */
1385     expected=0.0f;
1386     got = D3DXVec4LengthSq(NULL);
1387     ok(relative_error(got, expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, got);
1388
1389 /*_______________D3DXVec4Lerp__________________________*/
1390     expectedvec.x = 27.0f; expectedvec.y = -11.0f; expectedvec.z = 62.5;  expectedvec.w = 29.5;
1391     D3DXVec4Lerp(&gotvec,&u,&v,scale);
1392     expect_vec4(expectedvec,gotvec);
1393     /* Tests the case NULL */
1394     funcpointer = D3DXVec4Lerp(&gotvec,NULL,&v,scale);
1395     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1396     funcpointer = D3DXVec4Lerp(NULL,NULL,NULL,scale);
1397     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1398
1399 /*_______________D3DXVec4Maximize__________________________*/
1400     expectedvec.x = 1.0f; expectedvec.y = 4.0f; expectedvec.z = 4.0f; expectedvec.w = 10.0;
1401     D3DXVec4Maximize(&gotvec,&u,&v);
1402     expect_vec4(expectedvec,gotvec);
1403     /* Tests the case NULL */
1404     funcpointer = D3DXVec4Maximize(&gotvec,NULL,&v);
1405     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1406     funcpointer = D3DXVec4Maximize(NULL,NULL,NULL);
1407     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1408
1409 /*_______________D3DXVec4Minimize__________________________*/
1410     expectedvec.x = -3.0f; expectedvec.y = 2.0f; expectedvec.z = -5.0f; expectedvec.w = 7.0;
1411     D3DXVec4Minimize(&gotvec,&u,&v);
1412     expect_vec4(expectedvec,gotvec);
1413     /* Tests the case NULL */
1414     funcpointer = D3DXVec4Minimize(&gotvec,NULL,&v);
1415     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1416     funcpointer = D3DXVec4Minimize(NULL,NULL,NULL);
1417     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1418
1419 /*_______________D3DXVec4Normalize_________________________*/
1420     expectedvec.x = 1.0f/11.0f; expectedvec.y = 2.0f/11.0f; expectedvec.z = 4.0f/11.0f; expectedvec.w = 10.0f/11.0f;
1421     D3DXVec4Normalize(&gotvec,&u);
1422     expect_vec4(expectedvec,gotvec);
1423
1424 /*_______________D3DXVec4Scale____________________________*/
1425     expectedvec.x = -6.5f; expectedvec.y = -13.0f; expectedvec.z = -26.0f; expectedvec.w = -65.0f;
1426     D3DXVec4Scale(&gotvec,&u,scale);
1427     expect_vec4(expectedvec,gotvec);
1428     /* Tests the case NULL */
1429     funcpointer = D3DXVec4Scale(&gotvec,NULL,scale);
1430     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1431     funcpointer = D3DXVec4Scale(NULL,NULL,scale);
1432     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1433
1434 /*_______________D3DXVec4Subtract__________________________*/
1435     expectedvec.x = 4.0f; expectedvec.y = -2.0f; expectedvec.z = 9.0f; expectedvec.w = 3.0f;
1436     D3DXVec4Subtract(&gotvec,&u,&v);
1437     expect_vec4(expectedvec,gotvec);
1438     /* Tests the case NULL */
1439     funcpointer = D3DXVec4Subtract(&gotvec,NULL,&v);
1440     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1441     funcpointer = D3DXVec4Subtract(NULL,NULL,NULL);
1442     ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1443
1444 /*_______________D3DXVec4Transform_______________________*/
1445     expectedtrans.x = 177.0f; expectedtrans.y = 194.0f; expectedtrans.z = 211.0f; expectedtrans.w = 228.0f;
1446     D3DXVec4Transform(&gottrans,&u,&mat);
1447     expect_vec4(expectedtrans,gottrans);
1448 }
1449
1450 static void test_matrix_stack(void)
1451 {
1452     ID3DXMatrixStack *stack;
1453     ULONG refcount;
1454     HRESULT hr;
1455
1456     const D3DXMATRIX mat1 = {{{
1457          1.0f,  2.0f,  3.0f,  4.0f,
1458          5.0f,  6.0f,  7.0f,  8.0f,
1459          9.0f, 10.0f, 11.0f, 12.0f,
1460         13.0f, 14.0f, 15.0f, 16.0f
1461     }}};
1462
1463     const D3DXMATRIX mat2 = {{{
1464         17.0f, 18.0f, 19.0f, 20.0f,
1465         21.0f, 22.0f, 23.0f, 24.0f,
1466         25.0f, 26.0f, 27.0f, 28.0f,
1467         29.0f, 30.0f, 31.0f, 32.0f
1468     }}};
1469
1470     hr = D3DXCreateMatrixStack(0, &stack);
1471     ok(SUCCEEDED(hr), "Failed to create a matrix stack, hr %#x\n", hr);
1472     if (FAILED(hr)) return;
1473
1474     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)),
1475             "The top of an empty matrix stack should be an identity matrix\n");
1476
1477     hr = ID3DXMatrixStack_Pop(stack);
1478     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1479
1480     hr = ID3DXMatrixStack_Push(stack);
1481     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1482     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
1483
1484     hr = ID3DXMatrixStack_Push(stack);
1485     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1486
1487     hr = ID3DXMatrixStack_LoadMatrix(stack, &mat1);
1488     ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
1489     expect_mat(&mat1, ID3DXMatrixStack_GetTop(stack));
1490
1491     hr = ID3DXMatrixStack_Push(stack);
1492     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1493     expect_mat(&mat1, ID3DXMatrixStack_GetTop(stack));
1494
1495     hr = ID3DXMatrixStack_LoadMatrix(stack, &mat2);
1496     ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
1497     expect_mat(&mat2, ID3DXMatrixStack_GetTop(stack));
1498
1499     hr = ID3DXMatrixStack_Push(stack);
1500     ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
1501     expect_mat(&mat2, ID3DXMatrixStack_GetTop(stack));
1502
1503     hr = ID3DXMatrixStack_LoadIdentity(stack);
1504     ok(SUCCEEDED(hr), "LoadIdentity failed, hr %#x\n", hr);
1505     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
1506
1507     hr = ID3DXMatrixStack_Pop(stack);
1508     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1509     expect_mat(&mat2, ID3DXMatrixStack_GetTop(stack));
1510
1511     hr = ID3DXMatrixStack_Pop(stack);
1512     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1513     expect_mat(&mat1, ID3DXMatrixStack_GetTop(stack));
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     hr = ID3DXMatrixStack_Pop(stack);
1520     ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
1521     ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
1522
1523     refcount = ID3DXMatrixStack_Release(stack);
1524     ok(!refcount, "Matrix stack has %u references left.\n", refcount);
1525 }
1526
1527 static void test_Matrix_AffineTransformation2D(void)
1528 {
1529     D3DXMATRIX exp_mat, got_mat;
1530     D3DXVECTOR2 center, position;
1531     FLOAT angle, scale;
1532
1533     center.x = 3.0f;
1534     center.y = 4.0f;
1535
1536     position.x = -6.0f;
1537     position.y = 7.0f;
1538
1539     angle = D3DX_PI/3.0f;
1540
1541     scale = 20.0f;
1542
1543     U(exp_mat).m[0][0] = 10.0f;
1544     U(exp_mat).m[1][0] = -17.320507f;
1545     U(exp_mat).m[2][0] = 0.0f;
1546     U(exp_mat).m[3][0] = -1.035898f;
1547     U(exp_mat).m[0][1] = 17.320507f;
1548     U(exp_mat).m[1][1] = 10.0f;
1549     U(exp_mat).m[2][1] = 0.0f;
1550     U(exp_mat).m[3][1] = 6.401924f;
1551     U(exp_mat).m[0][2] = 0.0f;
1552     U(exp_mat).m[1][2] = 0.0f;
1553     U(exp_mat).m[2][2] = 1.0f;
1554     U(exp_mat).m[3][2] = 0.0f;
1555     U(exp_mat).m[0][3] = 0.0f;
1556     U(exp_mat).m[1][3] = 0.0f;
1557     U(exp_mat).m[2][3] = 0.0f;
1558     U(exp_mat).m[3][3] = 1.0f;
1559
1560     D3DXMatrixAffineTransformation2D(&got_mat, scale, &center, angle, &position);
1561
1562     expect_mat(&exp_mat, &got_mat);
1563
1564 /*______________*/
1565
1566     center.x = 3.0f;
1567     center.y = 4.0f;
1568
1569     angle = D3DX_PI/3.0f;
1570
1571     scale = 20.0f;
1572
1573     U(exp_mat).m[0][0] = 10.0f;
1574     U(exp_mat).m[1][0] = -17.320507f;
1575     U(exp_mat).m[2][0] = 0.0f;
1576     U(exp_mat).m[3][0] = 4.964102f;
1577     U(exp_mat).m[0][1] = 17.320507f;
1578     U(exp_mat).m[1][1] = 10.0f;
1579     U(exp_mat).m[2][1] = 0.0f;
1580     U(exp_mat).m[3][1] = -0.598076f;
1581     U(exp_mat).m[0][2] = 0.0f;
1582     U(exp_mat).m[1][2] = 0.0f;
1583     U(exp_mat).m[2][2] = 1.0f;
1584     U(exp_mat).m[3][2] = 0.0f;
1585     U(exp_mat).m[0][3] = 0.0f;
1586     U(exp_mat).m[1][3] = 0.0f;
1587     U(exp_mat).m[2][3] = 0.0f;
1588     U(exp_mat).m[3][3] = 1.0f;
1589
1590     D3DXMatrixAffineTransformation2D(&got_mat, scale, &center, angle, NULL);
1591
1592     expect_mat(&exp_mat, &got_mat);
1593
1594 /*______________*/
1595
1596     position.x = -6.0f;
1597     position.y = 7.0f;
1598
1599     angle = D3DX_PI/3.0f;
1600
1601     scale = 20.0f;
1602
1603     U(exp_mat).m[0][0] = 10.0f;
1604     U(exp_mat).m[1][0] = -17.320507f;
1605     U(exp_mat).m[2][0] = 0.0f;
1606     U(exp_mat).m[3][0] = -6.0f;
1607     U(exp_mat).m[0][1] = 17.320507f;
1608     U(exp_mat).m[1][1] = 10.0f;
1609     U(exp_mat).m[2][1] = 0.0f;
1610     U(exp_mat).m[3][1] = 7.0f;
1611     U(exp_mat).m[0][2] = 0.0f;
1612     U(exp_mat).m[1][2] = 0.0f;
1613     U(exp_mat).m[2][2] = 1.0f;
1614     U(exp_mat).m[3][2] = 0.0f;
1615     U(exp_mat).m[0][3] = 0.0f;
1616     U(exp_mat).m[1][3] = 0.0f;
1617     U(exp_mat).m[2][3] = 0.0f;
1618     U(exp_mat).m[3][3] = 1.0f;
1619
1620     D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, &position);
1621
1622     expect_mat(&exp_mat, &got_mat);
1623
1624 /*______________*/
1625
1626     angle = 5.0f * D3DX_PI/4.0f;
1627
1628     scale = -20.0f;
1629
1630     U(exp_mat).m[0][0] = 14.142133f;
1631     U(exp_mat).m[1][0] = -14.142133f;
1632     U(exp_mat).m[2][0] = 0.0f;
1633     U(exp_mat).m[3][0] = 0.0f;
1634     U(exp_mat).m[0][1] = 14.142133;
1635     U(exp_mat).m[1][1] = 14.142133f;
1636     U(exp_mat).m[2][1] = 0.0f;
1637     U(exp_mat).m[3][1] = 0.0f;
1638     U(exp_mat).m[0][2] = 0.0f;
1639     U(exp_mat).m[1][2] = 0.0f;
1640     U(exp_mat).m[2][2] = 1.0f;
1641     U(exp_mat).m[3][2] = 0.0f;
1642     U(exp_mat).m[0][3] = 0.0f;
1643     U(exp_mat).m[1][3] = 0.0f;
1644     U(exp_mat).m[2][3] = 0.0f;
1645     U(exp_mat).m[3][3] = 1.0f;
1646
1647     D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, NULL);
1648
1649     expect_mat(&exp_mat, &got_mat);
1650 }
1651
1652 static void test_Matrix_Decompose(void)
1653 {
1654     D3DXMATRIX pm;
1655     D3DXQUATERNION exp_rotation, got_rotation;
1656     D3DXVECTOR3 exp_scale, got_scale, exp_translation, got_translation;
1657     HRESULT hr;
1658
1659 /*___________*/
1660
1661     U(pm).m[0][0] = -0.9238790f;
1662     U(pm).m[1][0] = -0.2705984f;
1663     U(pm).m[2][0] = 0.2705984f;
1664     U(pm).m[3][0] = -5.0f;
1665     U(pm).m[0][1] = 0.2705984f;
1666     U(pm).m[1][1] = 0.03806049f;
1667     U(pm).m[2][1] = 0.9619395f;
1668     U(pm).m[3][1] = 0.0f;
1669     U(pm).m[0][2] = -0.2705984f;
1670     U(pm).m[1][2] = 0.9619395f;
1671     U(pm).m[2][2] = 0.03806049f;
1672     U(pm).m[3][2] = 10.0f;
1673     U(pm).m[0][3] = 0.0f;
1674     U(pm).m[1][3] = 0.0f;
1675     U(pm).m[2][3] = 0.0f;
1676     U(pm).m[3][3] = 1.0f;
1677
1678     exp_scale.x = 1.0f;
1679     exp_scale.y = 1.0f;
1680     exp_scale.z = 1.0f;
1681
1682     exp_rotation.w = 0.195091f;
1683     exp_rotation.x = 0.0f;
1684     exp_rotation.y = 0.693520f;
1685     exp_rotation.z = 0.693520f;
1686
1687     exp_translation.x = -5.0f;
1688     exp_translation.y = 0.0f;
1689     exp_translation.z = 10.0f;
1690
1691     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1692
1693     compare_scale(exp_scale, got_scale);
1694     compare_rotation(exp_rotation, got_rotation);
1695     compare_translation(exp_translation, got_translation);
1696
1697 /*_________*/
1698
1699     U(pm).m[0][0] = -2.255813f;
1700     U(pm).m[1][0] = 1.302324f;
1701     U(pm).m[2][0] = 1.488373f;
1702     U(pm).m[3][0] = 1.0f;
1703     U(pm).m[0][1] = 1.302327f;
1704     U(pm).m[1][1] = -0.7209296f;
1705     U(pm).m[2][1] = 2.60465f;
1706     U(pm).m[3][1] = 2.0f;
1707     U(pm).m[0][2] = 1.488371f;
1708     U(pm).m[1][2] = 2.604651f;
1709     U(pm).m[2][2] = -0.02325551f;
1710     U(pm).m[3][2] = 3.0f;
1711     U(pm).m[0][3] = 0.0f;
1712     U(pm).m[1][3] = 0.0f;
1713     U(pm).m[2][3] = 0.0f;
1714     U(pm).m[3][3] = 1.0f;
1715
1716     exp_scale.x = 3.0f;
1717     exp_scale.y = 3.0f;
1718     exp_scale.z = 3.0f;
1719
1720     exp_rotation.w = 0.0;
1721     exp_rotation.x = 0.352180f;
1722     exp_rotation.y = 0.616316f;
1723     exp_rotation.z = 0.704361f;
1724
1725     exp_translation.x = 1.0f;
1726     exp_translation.y = 2.0f;
1727     exp_translation.z = 3.0f;
1728
1729     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1730
1731     compare_scale(exp_scale, got_scale);
1732     compare_rotation(exp_rotation, got_rotation);
1733     compare_translation(exp_translation, got_translation);
1734
1735 /*_____________*/
1736
1737     U(pm).m[0][0] = 2.427051f;
1738     U(pm).m[1][0] = 0.0f;
1739     U(pm).m[2][0] = 1.763355f;
1740     U(pm).m[3][0] = 5.0f;
1741     U(pm).m[0][1] = 0.0f;
1742     U(pm).m[1][1] = 3.0f;
1743     U(pm).m[2][1] = 0.0f;
1744     U(pm).m[3][1] = 5.0f;
1745     U(pm).m[0][2] = -1.763355f;
1746     U(pm).m[1][2] = 0.0f;
1747     U(pm).m[2][2] = 2.427051f;
1748     U(pm).m[3][2] = 5.0f;
1749     U(pm).m[0][3] = 0.0f;
1750     U(pm).m[1][3] = 0.0f;
1751     U(pm).m[2][3] = 0.0f;
1752     U(pm).m[3][3] = 1.0f;
1753
1754     exp_scale.x = 3.0f;
1755     exp_scale.y = 3.0f;
1756     exp_scale.z = 3.0f;
1757
1758     exp_rotation.w = 0.951057f;
1759     exp_rotation.x = 0.0f;
1760     exp_rotation.y = 0.309017f;
1761     exp_rotation.z = 0.0f;
1762
1763     exp_translation.x = 5.0f;
1764     exp_translation.y = 5.0f;
1765     exp_translation.z = 5.0f;
1766
1767     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1768
1769     compare_scale(exp_scale, got_scale);
1770     compare_rotation(exp_rotation, got_rotation);
1771     compare_translation(exp_translation, got_translation);
1772
1773 /*_____________*/
1774
1775     U(pm).m[0][0] = -0.9238790f;
1776     U(pm).m[1][0] = -0.2705984f;
1777     U(pm).m[2][0] = 0.2705984f;
1778     U(pm).m[3][0] = -5.0f;
1779     U(pm).m[0][1] = 0.2705984f;
1780     U(pm).m[1][1] = 0.03806049f;
1781     U(pm).m[2][1] = 0.9619395f;
1782     U(pm).m[3][1] = 0.0f;
1783     U(pm).m[0][2] = -0.2705984f;
1784     U(pm).m[1][2] = 0.9619395f;
1785     U(pm).m[2][2] = 0.03806049f;
1786     U(pm).m[3][2] = 10.0f;
1787     U(pm).m[0][3] = 0.0f;
1788     U(pm).m[1][3] = 0.0f;
1789     U(pm).m[2][3] = 0.0f;
1790     U(pm).m[3][3] = 1.0f;
1791
1792     exp_scale.x = 1.0f;
1793     exp_scale.y = 1.0f;
1794     exp_scale.z = 1.0f;
1795
1796     exp_rotation.w = 0.195091f;
1797     exp_rotation.x = 0.0f;
1798     exp_rotation.y = 0.693520f;
1799     exp_rotation.z = 0.693520f;
1800
1801     exp_translation.x = -5.0f;
1802     exp_translation.y = 0.0f;
1803     exp_translation.z = 10.0f;
1804
1805     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1806
1807     compare_scale(exp_scale, got_scale);
1808     compare_rotation(exp_rotation, got_rotation);
1809     compare_translation(exp_translation, got_translation);
1810
1811 /*__________*/
1812
1813     U(pm).m[0][0] = -0.9238790f;
1814     U(pm).m[1][0] = -0.5411968f;
1815     U(pm).m[2][0] = 0.8117952f;
1816     U(pm).m[3][0] = -5.0f;
1817     U(pm).m[0][1] = 0.2705984f;
1818     U(pm).m[1][1] = 0.07612098f;
1819     U(pm).m[2][1] = 2.8858185f;
1820     U(pm).m[3][1] = 0.0f;
1821     U(pm).m[0][2] = -0.2705984f;
1822     U(pm).m[1][2] = 1.9238790f;
1823     U(pm).m[2][2] = 0.11418147f;
1824     U(pm).m[3][2] = 10.0f;
1825     U(pm).m[0][3] = 0.0f;
1826     U(pm).m[1][3] = 0.0f;
1827     U(pm).m[2][3] = 0.0f;
1828     U(pm).m[3][3] = 1.0f;
1829
1830     exp_scale.x = 1.0f;
1831     exp_scale.y = 2.0f;
1832     exp_scale.z = 3.0f;
1833
1834     exp_rotation.w = 0.195091f;
1835     exp_rotation.x = 0.0f;
1836     exp_rotation.y = 0.693520f;
1837     exp_rotation.z = 0.693520f;
1838
1839     exp_translation.x = -5.0f;
1840     exp_translation.y = 0.0f;
1841     exp_translation.z = 10.0f;
1842
1843     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1844
1845     compare_scale(exp_scale, got_scale);
1846     compare_rotation(exp_rotation, got_rotation);
1847     compare_translation(exp_translation, got_translation);
1848
1849 /*__________*/
1850
1851     U(pm).m[0][0] = 0.7156004f;
1852     U(pm).m[1][0] = -0.5098283f;
1853     U(pm).m[2][0] = -0.4774843f;
1854     U(pm).m[3][0] = -5.0f;
1855     U(pm).m[0][1] = -0.6612288f;
1856     U(pm).m[1][1] = -0.7147621f;
1857     U(pm).m[2][1] = -0.2277977f;
1858     U(pm).m[3][1] = 0.0f;
1859     U(pm).m[0][2] = -0.2251499f;
1860     U(pm).m[1][2] = 0.4787385f;
1861     U(pm).m[2][2] = -0.8485972f;
1862     U(pm).m[3][2] = 10.0f;
1863     U(pm).m[0][3] = 0.0f;
1864     U(pm).m[1][3] = 0.0f;
1865     U(pm).m[2][3] = 0.0f;
1866     U(pm).m[3][3] = 1.0f;
1867
1868     exp_scale.x = 1.0f;
1869     exp_scale.y = 1.0f;
1870     exp_scale.z = 1.0f;
1871
1872     exp_rotation.w = 0.195091f;
1873     exp_rotation.x = 0.905395f;
1874     exp_rotation.y = -0.323355f;
1875     exp_rotation.z = -0.194013f;
1876
1877     exp_translation.x = -5.0f;
1878     exp_translation.y = 0.0f;
1879     exp_translation.z = 10.0f;
1880
1881     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1882
1883     compare_scale(exp_scale, got_scale);
1884     compare_rotation(exp_rotation, got_rotation);
1885     compare_translation(exp_translation, got_translation);
1886
1887 /*_____________*/
1888
1889     U(pm).m[0][0] = 0.06554436f;
1890     U(pm).m[1][0] = -0.6873012f;
1891     U(pm).m[2][0] = 0.7234092f;
1892     U(pm).m[3][0] = -5.0f;
1893     U(pm).m[0][1] = -0.9617381f;
1894     U(pm).m[1][1] = -0.2367795f;
1895     U(pm).m[2][1] = -0.1378230f;
1896     U(pm).m[3][1] = 0.0f;
1897     U(pm).m[0][2] = 0.2660144f;
1898     U(pm).m[1][2] = -0.6866967f;
1899     U(pm).m[2][2] = -0.6765233f;
1900     U(pm).m[3][2] = 10.0f;
1901     U(pm).m[0][3] = 0.0f;
1902     U(pm).m[1][3] = 0.0f;
1903     U(pm).m[2][3] = 0.0f;
1904     U(pm).m[3][3] = 1.0f;
1905
1906     exp_scale.x = 1.0f;
1907     exp_scale.y = 1.0f;
1908     exp_scale.z = 1.0f;
1909
1910     exp_rotation.w = -0.195091f;
1911     exp_rotation.x = 0.703358f;
1912     exp_rotation.y = -0.586131f;
1913     exp_rotation.z = 0.351679f;
1914
1915     exp_translation.x = -5.0f;
1916     exp_translation.y = 0.0f;
1917     exp_translation.z = 10.0f;
1918
1919     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1920
1921     compare_scale(exp_scale, got_scale);
1922     compare_rotation(exp_rotation, got_rotation);
1923     compare_translation(exp_translation, got_translation);
1924
1925 /*_________*/
1926
1927     U(pm).m[0][0] = 7.121047f;
1928     U(pm).m[1][0] = -5.883487f;
1929     U(pm).m[2][0] = 11.81843f;
1930     U(pm).m[3][0] = -5.0f;
1931     U(pm).m[0][1] = 5.883487f;
1932     U(pm).m[1][1] = -10.60660f;
1933     U(pm).m[2][1] = -8.825232f;
1934     U(pm).m[3][1] = 0.0f;
1935     U(pm).m[0][2] = 11.81843f;
1936     U(pm).m[1][2] = 8.8252320f;
1937     U(pm).m[2][2] = -2.727645f;
1938     U(pm).m[3][2] = 2.0f;
1939     U(pm).m[0][3] = 0.0f;
1940     U(pm).m[1][3] = 0.0f;
1941     U(pm).m[2][3] = 0.0f;
1942     U(pm).m[3][3] = 1.0f;
1943
1944     exp_scale.x = 15.0f;
1945     exp_scale.y = 15.0f;
1946     exp_scale.z = 15.0f;
1947
1948     exp_rotation.w = 0.382684f;
1949     exp_rotation.x = 0.768714f;
1950     exp_rotation.y = 0.0f;
1951     exp_rotation.z = 0.512476f;
1952
1953     exp_translation.x = -5.0f;
1954     exp_translation.y = 0.0f;
1955     exp_translation.z = 2.0f;
1956
1957     D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1958
1959     compare_scale(exp_scale, got_scale);
1960     compare_rotation(exp_rotation, got_rotation);
1961     compare_translation(exp_translation, got_translation);
1962
1963 /*__________*/
1964
1965     U(pm).m[0][0] = 0.0f;
1966     U(pm).m[1][0] = 4.0f;
1967     U(pm).m[2][0] = 5.0f;
1968     U(pm).m[3][0] = -5.0f;
1969     U(pm).m[0][1] = 0.0f;
1970     U(pm).m[1][1] = -10.60660f;
1971     U(pm).m[2][1] = -8.825232f;
1972     U(pm).m[3][1] = 6.0f;
1973     U(pm).m[0][2] = 0.0f;
1974     U(pm).m[1][2] = 8.8252320f;
1975     U(pm).m[2][2] = 2.727645;
1976     U(pm).m[3][2] = 3.0f;
1977     U(pm).m[0][3] = 0.0f;
1978     U(pm).m[1][3] = 0.0f;
1979     U(pm).m[2][3] = 0.0f;
1980     U(pm).m[3][3] = 1.0f;
1981
1982     hr = D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
1983     ok(hr == D3DERR_INVALIDCALL, "Expected D3DERR_INVALIDCALL, got %x\n", hr);
1984 }
1985
1986 static void test_Matrix_Transformation2D(void)
1987 {
1988     D3DXMATRIX exp_mat, got_mat;
1989     D3DXVECTOR2 rot_center, sca, sca_center, trans;
1990     FLOAT rot, sca_rot;
1991
1992     rot_center.x = 3.0f;
1993     rot_center.y = 4.0f;
1994
1995     sca.x = 12.0f;
1996     sca.y = -3.0f;
1997
1998     sca_center.x = 9.0f;
1999     sca_center.y = -5.0f;
2000
2001     trans.x = -6.0f;
2002     trans.y = 7.0f;
2003
2004     rot = D3DX_PI/3.0f;
2005
2006     sca_rot = 5.0f*D3DX_PI/4.0f;
2007
2008     U(exp_mat).m[0][0] = -4.245192f;
2009     U(exp_mat).m[1][0] = -0.147116f;
2010     U(exp_mat).m[2][0] = 0.0f;
2011     U(exp_mat).m[3][0] = 45.265373f;
2012     U(exp_mat).m[0][1] = 7.647113f;
2013     U(exp_mat).m[1][1] = 8.745192f;
2014     U(exp_mat).m[2][1] = 0.0f;
2015     U(exp_mat).m[3][1] = -13.401899f;
2016     U(exp_mat).m[0][2] = 0.0f;
2017     U(exp_mat).m[1][2] = 0.0f;
2018     U(exp_mat).m[2][2] = 1.0f;
2019     U(exp_mat).m[3][2] = 0.0f;
2020     U(exp_mat).m[0][3] = 0.0f;
2021     U(exp_mat).m[1][3] = 0.0f;
2022     U(exp_mat).m[2][3] = 0.0f;
2023     U(exp_mat).m[3][3] = 1.0f;
2024
2025     D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, &sca, &rot_center, rot, &trans);
2026
2027     expect_mat(&exp_mat, &got_mat);
2028
2029 /*_________*/
2030
2031     sca_center.x = 9.0f;
2032     sca_center.y = -5.0f;
2033
2034     trans.x = -6.0f;
2035     trans.y = 7.0f;
2036
2037     rot = D3DX_PI/3.0f;
2038
2039     sca_rot = 5.0f*D3DX_PI/4.0f;
2040
2041     U(exp_mat).m[0][0] = 0.50f;
2042     U(exp_mat).m[1][0] = -0.866025f;
2043     U(exp_mat).m[2][0] = 0.0f;
2044     U(exp_mat).m[3][0] = -6.0f;
2045     U(exp_mat).m[0][1] = 0.866025f;
2046     U(exp_mat).m[1][1] = 0.50f;
2047     U(exp_mat).m[2][1] = 0.0f;
2048     U(exp_mat).m[3][1] = 7.0f;
2049     U(exp_mat).m[0][2] = 0.0f;
2050     U(exp_mat).m[1][2] = 0.0f;
2051     U(exp_mat).m[2][2] = 1.0f;
2052     U(exp_mat).m[3][2] = 0.0f;
2053     U(exp_mat).m[0][3] = 0.0f;
2054     U(exp_mat).m[1][3] = 0.0f;
2055     U(exp_mat).m[2][3] = 0.0f;
2056     U(exp_mat).m[3][3] = 1.0f;
2057
2058     D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, NULL, NULL, rot, &trans);
2059
2060     expect_mat(&exp_mat, &got_mat);
2061
2062 /*_________*/
2063
2064     U(exp_mat).m[0][0] = 0.50f;
2065     U(exp_mat).m[1][0] = -0.866025f;
2066     U(exp_mat).m[2][0] = 0.0f;
2067     U(exp_mat).m[3][0] = 0.0f;
2068     U(exp_mat).m[0][1] = 0.866025f;
2069     U(exp_mat).m[1][1] = 0.50f;
2070     U(exp_mat).m[2][1] = 0.0f;
2071     U(exp_mat).m[3][1] = 0.0f;
2072     U(exp_mat).m[0][2] = 0.0f;
2073     U(exp_mat).m[1][2] = 0.0f;
2074     U(exp_mat).m[2][2] = 1.0f;
2075     U(exp_mat).m[3][2] = 0.0f;
2076     U(exp_mat).m[0][3] = 0.0f;
2077     U(exp_mat).m[1][3] = 0.0f;
2078     U(exp_mat).m[2][3] = 0.0f;
2079     U(exp_mat).m[3][3] = 1.0f;
2080
2081     D3DXMatrixTransformation2D(&got_mat, NULL, sca_rot, NULL, NULL, rot, NULL);
2082
2083     expect_mat(&exp_mat, &got_mat);
2084 }
2085
2086 static void test_D3DXVec_Array(void)
2087 {
2088     unsigned int i;
2089     D3DVIEWPORT9 viewport;
2090     D3DXMATRIX mat, projection, view, world;
2091     D3DXVECTOR4 inp_vec[ARRAY_SIZE];
2092     D3DXVECTOR4 out_vec[ARRAY_SIZE + 2];
2093     D3DXVECTOR4 exp_vec[ARRAY_SIZE + 2];
2094     D3DXPLANE inp_plane[ARRAY_SIZE];
2095     D3DXPLANE out_plane[ARRAY_SIZE + 2];
2096     D3DXPLANE exp_plane[ARRAY_SIZE + 2];
2097
2098     viewport.Width = 800; viewport.MinZ = 0.2f; viewport.X = 10;
2099     viewport.Height = 680; viewport.MaxZ = 0.9f; viewport.Y = 5;
2100
2101     for (i = 0; i < ARRAY_SIZE + 2; ++i) {
2102         out_vec[i].x = out_vec[i].y = out_vec[i].z = out_vec[i].w = 0.0f;
2103         exp_vec[i].x = exp_vec[i].y = exp_vec[i].z = exp_vec[i].w = 0.0f;
2104         out_plane[i].a = out_plane[i].b = out_plane[i].c = out_plane[i].d = 0.0f;
2105         exp_plane[i].a = exp_plane[i].b = exp_plane[i].c = exp_plane[i].d = 0.0f;
2106     }
2107
2108     for (i = 0; i < ARRAY_SIZE; ++i) {
2109         inp_plane[i].a = inp_plane[i].c = inp_vec[i].x = inp_vec[i].z = i;
2110         inp_plane[i].b = inp_plane[i].d = inp_vec[i].y = inp_vec[i].w = ARRAY_SIZE - i;
2111     }
2112
2113     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;
2114     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;
2115     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;
2116     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;
2117
2118     D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f);
2119
2120     U(view).m[0][1] = 5.0f; U(view).m[0][2] = 7.0f; U(view).m[0][3] = 8.0f;
2121     U(view).m[1][0] = 11.0f; U(view).m[1][2] = 16.0f; U(view).m[1][3] = 33.0f;
2122     U(view).m[2][0] = 19.0f; U(view).m[2][1] = -21.0f; U(view).m[2][3] = 43.0f;
2123     U(view).m[3][0] = 2.0f; U(view).m[3][1] = 3.0f; U(view).m[3][2] = -4.0f;
2124     U(view).m[0][0] = 10.0f; U(view).m[1][1] = 20.0f; U(view).m[2][2] = 30.0f;
2125     U(view).m[3][3] = -40.0f;
2126
2127     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;
2128     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;
2129     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;
2130     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;
2131
2132     /* D3DXVec2TransformCoordArray */
2133     exp_vec[1].x = 0.678571f; exp_vec[1].y = 0.785714f;
2134     exp_vec[2].x = 0.653846f; exp_vec[2].y = 0.769231f;
2135     exp_vec[3].x = 0.625f;    exp_vec[3].y = 0.75f;
2136     exp_vec[4].x = 0.590909f; exp_vec[4].y = 8.0f/11.0f;
2137     exp_vec[5].x = 0.55f;     exp_vec[5].y = 0.7f;
2138     D3DXVec2TransformCoordArray((D3DXVECTOR2*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR2*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2139     compare_vectors(exp_vec, out_vec);
2140
2141     /* D3DXVec2TransformNormalArray */
2142     exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f;
2143     exp_vec[2].x = 21.0f; exp_vec[2].y = 26.0f;
2144     exp_vec[3].x = 17.0f; exp_vec[3].y = 22.0f;
2145     exp_vec[4].x = 13.0f; exp_vec[4].y = 18.0f;
2146     exp_vec[5].x =  9.0f; exp_vec[5].y = 14.0f;
2147     D3DXVec2TransformNormalArray((D3DXVECTOR2*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR2*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2148     compare_vectors(exp_vec, out_vec);
2149
2150     /* D3DXVec3TransformCoordArray */
2151     exp_vec[1].x = 0.678571f; exp_vec[1].y = 0.785714f;  exp_vec[1].z = 0.892857f;
2152     exp_vec[2].x = 0.671875f; exp_vec[2].y = 0.78125f;   exp_vec[2].z = 0.890625f;
2153     exp_vec[3].x = 6.0f/9.0f; exp_vec[3].y = 7.0f/9.0f;  exp_vec[3].z = 8.0f/9.0f;
2154     exp_vec[4].x = 0.6625f;   exp_vec[4].y = 0.775f;     exp_vec[4].z = 0.8875f;
2155     exp_vec[5].x = 0.659091f; exp_vec[5].y = 0.772727f;  exp_vec[5].z = 0.886364f;
2156     D3DXVec3TransformCoordArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2157     compare_vectors(exp_vec, out_vec);
2158
2159     /* D3DXVec3TransformNormalArray */
2160     exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f; exp_vec[1].z = 35.0f;
2161     exp_vec[2].x = 30.0f; exp_vec[2].y = 36.0f; exp_vec[2].z = 42.0f;
2162     exp_vec[3].x = 35.0f; exp_vec[3].y = 42.0f; exp_vec[3].z = 49.0f;
2163     exp_vec[4].x = 40.0f; exp_vec[4].y = 48.0f; exp_vec[4].z = 56.0f;
2164     exp_vec[5].x = 45.0f; exp_vec[5].y = 54.0f; exp_vec[5].z = 63.0f;
2165     D3DXVec3TransformNormalArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2166     compare_vectors(exp_vec, out_vec);
2167
2168     /* D3DXVec3ProjectArray */
2169     exp_vec[1].x = 1089.554199f; exp_vec[1].y = -226.590622f; exp_vec[1].z = 0.215273f;
2170     exp_vec[2].x = 1068.903320f; exp_vec[2].y =  103.085129f; exp_vec[2].z = 0.183050f;
2171     exp_vec[3].x = 1051.778931f; exp_vec[3].y =  376.462250f; exp_vec[3].z = 0.156329f;
2172     exp_vec[4].x = 1037.348877f; exp_vec[4].y =  606.827393f; exp_vec[4].z = 0.133813f;
2173     exp_vec[5].x = 1025.023560f; exp_vec[5].y =  803.591248f; exp_vec[5].z = 0.114581f;
2174     D3DXVec3ProjectArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (CONST D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &viewport, &projection, &view, &world, ARRAY_SIZE);
2175     compare_vectors(exp_vec, out_vec);
2176
2177     /* D3DXVec3UnprojectArray */
2178     exp_vec[1].x = -6.124031f; exp_vec[1].y = 3.225360f; exp_vec[1].z = 0.620571f;
2179     exp_vec[2].x = -3.807109f; exp_vec[2].y = 2.046579f; exp_vec[2].z = 0.446894f;
2180     exp_vec[3].x = -2.922839f; exp_vec[3].y = 1.596689f; exp_vec[3].z = 0.380609f;
2181     exp_vec[4].x = -2.456225f; exp_vec[4].y = 1.359290f; exp_vec[4].z = 0.345632f;
2182     exp_vec[5].x = -2.167897f; exp_vec[5].y = 1.212597f; exp_vec[5].z = 0.324019f;
2183     D3DXVec3UnprojectArray((D3DXVECTOR3*)(out_vec + 1), sizeof(D3DXVECTOR4), (CONST D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &viewport, &projection, &view, &world, ARRAY_SIZE);
2184     compare_vectors(exp_vec, out_vec);
2185
2186     /* D3DXVec2TransformArray */
2187     exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f;
2188     exp_vec[2].x = 34.0f; exp_vec[2].y = 40.0f; exp_vec[2].z = 46.0f; exp_vec[2].w = 52.0f;
2189     exp_vec[3].x = 30.0f; exp_vec[3].y = 36.0f; exp_vec[3].z = 42.0f; exp_vec[3].w = 48.0f;
2190     exp_vec[4].x = 26.0f; exp_vec[4].y = 32.0f; exp_vec[4].z = 38.0f; exp_vec[4].w = 44.0f;
2191     exp_vec[5].x = 22.0f; exp_vec[5].y = 28.0f; exp_vec[5].z = 34.0f; exp_vec[5].w = 40.0f;
2192     D3DXVec2TransformArray(out_vec + 1, sizeof(D3DXVECTOR4), (D3DXVECTOR2*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2193     compare_vectors(exp_vec, out_vec);
2194
2195     /* D3DXVec3TransformArray */
2196     exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f;
2197     exp_vec[2].x = 43.0f; exp_vec[2].y = 50.0f; exp_vec[2].z = 57.0f; exp_vec[2].w = 64.0f;
2198     exp_vec[3].x = 48.0f; exp_vec[3].y = 56.0f; exp_vec[3].z = 64.0f; exp_vec[3].w = 72.0f;
2199     exp_vec[4].x = 53.0f; exp_vec[4].y = 62.0f; exp_vec[4].z = 71.0f; exp_vec[4].w = 80.0f;
2200     exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f; exp_vec[5].z = 78.0f; exp_vec[5].w = 88.0f;
2201     D3DXVec3TransformArray(out_vec + 1, sizeof(D3DXVECTOR4), (D3DXVECTOR3*)inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2202     compare_vectors(exp_vec, out_vec);
2203
2204     /* D3DXVec4TransformArray */
2205     exp_vec[1].x = 90.0f; exp_vec[1].y = 100.0f; exp_vec[1].z = 110.0f; exp_vec[1].w = 120.0f;
2206     exp_vec[2].x = 82.0f; exp_vec[2].y = 92.0f;  exp_vec[2].z = 102.0f; exp_vec[2].w = 112.0f;
2207     exp_vec[3].x = 74.0f; exp_vec[3].y = 84.0f;  exp_vec[3].z = 94.0f;  exp_vec[3].w = 104.0f;
2208     exp_vec[4].x = 66.0f; exp_vec[4].y = 76.0f;  exp_vec[4].z = 86.0f;  exp_vec[4].w = 96.0f;
2209     exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f;  exp_vec[5].z = 78.0f;  exp_vec[5].w = 88.0f;
2210     D3DXVec4TransformArray(out_vec + 1, sizeof(D3DXVECTOR4), inp_vec, sizeof(D3DXVECTOR4), &mat, ARRAY_SIZE);
2211     compare_vectors(exp_vec, out_vec);
2212
2213     /* D3DXPlaneTransformArray */
2214     exp_plane[1].a = 90.0f; exp_plane[1].b = 100.0f; exp_plane[1].c = 110.0f; exp_plane[1].d = 120.0f;
2215     exp_plane[2].a = 82.0f; exp_plane[2].b = 92.0f;  exp_plane[2].c = 102.0f; exp_plane[2].d = 112.0f;
2216     exp_plane[3].a = 74.0f; exp_plane[3].b = 84.0f;  exp_plane[3].c = 94.0f;  exp_plane[3].d = 104.0f;
2217     exp_plane[4].a = 66.0f; exp_plane[4].b = 76.0f;  exp_plane[4].c = 86.0f;  exp_plane[4].d = 96.0f;
2218     exp_plane[5].a = 58.0f; exp_plane[5].b = 68.0f;  exp_plane[5].c = 78.0f;  exp_plane[5].d = 88.0f;
2219     D3DXPlaneTransformArray(out_plane + 1, sizeof(D3DXPLANE), inp_plane, sizeof(D3DXPLANE), &mat, ARRAY_SIZE);
2220     compare_planes(exp_plane, out_plane);
2221 }
2222
2223 static void test_D3DXFloat_Array(void)
2224 {
2225     static const float z = 0.0f;
2226     /* Compilers set different sign bits on 0.0 / 0.0, pick the right ones for NaN and -NaN */
2227     float tmpnan = 0.0f/z;
2228     float nnan = copysignf(1, tmpnan) < 0.0f ? tmpnan : -tmpnan;
2229     float nan = -nnan;
2230     unsigned int i;
2231     void *out = NULL;
2232     D3DXFLOAT16 half;
2233     FLOAT single;
2234     struct
2235     {
2236         FLOAT single_in;
2237
2238         /* half_ver2 occurs on WXPPROSP3 (32 bit math), WVISTAADM (32 bit math), W7PRO (32 bit math) */
2239         WORD half_ver1, half_ver2;
2240
2241         /* single_out_ver2 confirms that half -> single conversion is consistent across platforms */
2242         FLOAT single_out_ver1, single_out_ver2;
2243     } testdata[] = {
2244         { 80000.0f, 0x7c00, 0x7ce2, 65536.0f, 80000.0f },
2245         { 65503.0f, 0x7bff, 0x7bff, 65504.0f, 65504.0f },
2246         { 65504.0f, 0x7bff, 0x7bff, 65504.0f, 65504.0f },
2247         { 65520.0f, 0x7bff, 0x7c00, 65504.0f, 65536.0f },
2248         { 65521.0f, 0x7c00, 0x7c00, 65536.0f, 65536.0f },
2249         { 65534.0f, 0x7c00, 0x7c00, 65536.0f, 65536.0f },
2250         { 65535.0f, 0x7c00, 0x7c00, 65535.0f, 65536.0f },
2251         { 65536.0f, 0x7c00, 0x7c00, 65536.0f, 65536.0f },
2252         { -80000.0f, 0xfc00, 0xfce2, -65536.0f, -80000.0f },
2253         { -65503.0f, 0xfbff, 0xfbff, -65504.0f, -65504.0f },
2254         { -65504.0f, 0xfbff, 0xfbff, -65504.0f, -65504.0f },
2255         { -65520.0f, 0xfbff, 0xfc00, -65504.0f, -65536.0f },
2256         { -65521.0f, 0xfc00, 0xfc00, -65536.0f, -65536.0f },
2257         { -65534.0f, 0xfc00, 0xfc00, -65536.0f, -65536.0f },
2258         { -65535.0f, 0xfc00, 0xfc00, -65535.0f, -65536.0f },
2259         { -65536.0f, 0xfc00, 0xfc00, -65536.0f, -65536.0f },
2260         { 1.0f/z, 0x7c00, 0x7fff, 65536.0f, 131008.0f },
2261         { -1.0f/z, 0xffff, 0xffff, -131008.0f, -131008.0f },
2262         { nan, 0x7fff, 0x7fff, 131008.0f, 131008.0f },
2263         { nnan, 0xffff, 0xffff, -131008.0f, -131008.0f },
2264         { 0.0f, 0x0, 0x0, 0.0f, 0.0f },
2265         { -0.0f, 0x8000, 0x8000, 0.0f, 0.0f },
2266         { 2.9809595e-08f, 0x0, 0x0, 0.0f, 0.0f },
2267         { -2.9809595e-08f, 0x8000, 0x8000, -0.0f, -0.0f },
2268         { 2.9809598e-08f, 0x1, 0x1, 5.96046e-08f, 5.96046e-08f },
2269         { -2.9809598e-08f, 0x8001, 0x8001, -5.96046e-08f, -5.96046e-08f },
2270         { 8.9406967e-08f, 0x2, 0x2, 1.19209e-07f, 1.19209e-07f }
2271     };
2272
2273     /* exception on NULL out or in parameter */
2274     out = D3DXFloat32To16Array(&half, &single, 0);
2275     ok(out == &half, "Got %p, expected %p.\n", out, &half);
2276
2277     out = D3DXFloat16To32Array(&single, &half, 0);
2278     ok(out == &single, "Got %p, expected %p.\n", out, &single);
2279
2280     for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
2281     {
2282         out = D3DXFloat32To16Array(&half, &testdata[i].single_in, 1);
2283         ok(out == &half, "Got %p, expected %p.\n", out, &half);
2284         ok(half.value == testdata[i].half_ver1 || half.value == testdata[i].half_ver2,
2285            "Got %x, expected %x or %x for index %d.\n", half.value, testdata[i].half_ver1,
2286            testdata[i].half_ver2, i);
2287
2288         out = D3DXFloat16To32Array(&single, (D3DXFLOAT16 *)&testdata[i].half_ver1, 1);
2289         ok(out == &single, "Got %p, expected %p.\n", out, &single);
2290         ok(relative_error(single, testdata[i].single_out_ver1) < admitted_error,
2291            "Got %g, expected %g for index %d.\n", single, testdata[i].single_out_ver1, i);
2292
2293         out = D3DXFloat16To32Array(&single, (D3DXFLOAT16 *)&testdata[i].half_ver2, 1);
2294         ok(out == &single, "Got %p, expected %p.\n", out, &single);
2295         ok(relative_error(single, testdata[i].single_out_ver2) < admitted_error,
2296            "Got %g, expected %g for index %d.\n", single, testdata[i].single_out_ver2, i);
2297     }
2298 }
2299
2300 static void test_D3DXSHAdd(void)
2301 {
2302     UINT i, k;
2303     FLOAT *ret = (FLOAT *)0xdeadbeef;
2304     const FLOAT in1[50] =
2305     {
2306         1.11f, 1.12f, 1.13f, 1.14f, 1.15f, 1.16f, 1.17f, 1.18f,
2307         1.19f, 1.20f, 1.21f, 1.22f, 1.23f, 1.24f, 1.25f, 1.26f,
2308         1.27f, 1.28f, 1.29f, 1.30f, 1.31f, 1.32f, 1.33f, 1.34f,
2309         1.35f, 1.36f, 1.37f, 1.38f, 1.39f, 1.40f, 1.41f, 1.42f,
2310         1.43f, 1.44f, 1.45f, 1.46f, 1.47f, 1.48f, 1.49f, 1.50f,
2311         1.51f, 1.52f, 1.53f, 1.54f, 1.55f, 1.56f, 1.57f, 1.58f,
2312         1.59f, 1.60f,
2313     };
2314     const FLOAT in2[50] =
2315     {
2316         2.11f, 2.12f, 2.13f, 2.14f, 2.15f, 2.16f, 2.17f, 2.18f,
2317         2.19f, 2.20f, 2.21f, 2.22f, 2.23f, 2.24f, 2.25f, 2.26f,
2318         2.27f, 2.28f, 2.29f, 2.30f, 2.31f, 2.32f, 2.33f, 2.34f,
2319         2.35f, 2.36f, 2.37f, 2.38f, 2.39f, 2.40f, 2.41f, 2.42f,
2320         2.43f, 2.44f, 2.45f, 2.46f, 2.47f, 2.48f, 2.49f, 2.50f,
2321         2.51f, 2.52f, 2.53f, 2.54f, 2.55f, 2.56f, 2.57f, 2.58f,
2322         2.59f, 2.60f,
2323     };
2324     FLOAT out[50] = {0.0f};
2325
2326     /*
2327      * Order is not limited by D3DXSH_MINORDER and D3DXSH_MAXORDER!
2328      * All values will work, test from 0-7 [D3DXSH_MINORDER = 2, D3DXSH_MAXORDER = 6]
2329      * Exceptions will show up when out, in1 or in2 are NULL
2330      */
2331     for (k = 0; k < 8; ++k)
2332     {
2333         UINT count = k * k;
2334
2335         ret = D3DXSHAdd(&out[0], k, &in1[0], &in2[0]);
2336         ok(ret == out, "%u: D3DXSHAdd() failed, got %p, expected %p\n", k, out, ret);
2337
2338         for (i = 0; i < count; ++i)
2339         {
2340             ok(relative_error(in1[i] + in2[i], out[i]) < admitted_error,
2341                     "%u-%u: D3DXSHAdd() failed, got %f, expected %f\n", k, i, out[i], in1[i] + in2[i]);
2342         }
2343         ok(out[count] == 0.0f, "%u-%u: D3DXSHAdd() failed, got %f, expected 0.0\n", k, k * k, out[count]);
2344     }
2345 }
2346
2347 START_TEST(math)
2348 {
2349     D3DXColorTest();
2350     D3DXFresnelTest();
2351     D3DXMatrixTest();
2352     D3DXPlaneTest();
2353     D3DXQuaternionTest();
2354     D3DXVector2Test();
2355     D3DXVector3Test();
2356     D3DXVector4Test();
2357     test_matrix_stack();
2358     test_Matrix_AffineTransformation2D();
2359     test_Matrix_Decompose();
2360     test_Matrix_Transformation2D();
2361     test_D3DXVec_Array();
2362     test_D3DXFloat_Array();
2363     test_D3DXSHAdd();
2364 }