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
compare_float(float f,float g,unsigned int ulps)26 static BOOL compare_float(float f, float g, unsigned int ulps)
27 {
28 int x = *(int *)&f;
29 int y = *(int *)&g;
30
31 if (x < 0)
32 x = INT_MIN - x;
33 if (y < 0)
34 y = INT_MIN - y;
35
36 if (abs(x - y) > ulps)
37 return FALSE;
38
39 return TRUE;
40 }
41
compare_vec2(const D3DXVECTOR2 * v1,const D3DXVECTOR2 * v2,unsigned int ulps)42 static BOOL compare_vec2(const D3DXVECTOR2 *v1, const D3DXVECTOR2 *v2, unsigned int ulps)
43 {
44 return compare_float(v1->x, v2->x, ulps) && compare_float(v1->y, v2->y, ulps);
45 }
46
compare_vec3(const D3DXVECTOR3 * v1,const D3DXVECTOR3 * v2,unsigned int ulps)47 static BOOL compare_vec3(const D3DXVECTOR3 *v1, const D3DXVECTOR3 *v2, unsigned int ulps)
48 {
49 return compare_float(v1->x, v2->x, ulps)
50 && compare_float(v1->y, v2->y, ulps)
51 && compare_float(v1->z, v2->z, ulps);
52 }
53
compare_vec4(const D3DXVECTOR4 * v1,const D3DXVECTOR4 * v2,unsigned int ulps)54 static BOOL compare_vec4(const D3DXVECTOR4 *v1, const D3DXVECTOR4 *v2, unsigned int ulps)
55 {
56 return compare_float(v1->x, v2->x, ulps)
57 && compare_float(v1->y, v2->y, ulps)
58 && compare_float(v1->z, v2->z, ulps)
59 && compare_float(v1->w, v2->w, ulps);
60 }
61
compare_color(const D3DXCOLOR * c1,const D3DXCOLOR * c2,unsigned int ulps)62 static BOOL compare_color(const D3DXCOLOR *c1, const D3DXCOLOR *c2, unsigned int ulps)
63 {
64 return compare_float(c1->r, c2->r, ulps)
65 && compare_float(c1->g, c2->g, ulps)
66 && compare_float(c1->b, c2->b, ulps)
67 && compare_float(c1->a, c2->a, ulps);
68 }
69
compare_plane(const D3DXPLANE * p1,const D3DXPLANE * p2,unsigned int ulps)70 static BOOL compare_plane(const D3DXPLANE *p1, const D3DXPLANE *p2, unsigned int ulps)
71 {
72 return compare_float(p1->a, p2->a, ulps)
73 && compare_float(p1->b, p2->b, ulps)
74 && compare_float(p1->c, p2->c, ulps)
75 && compare_float(p1->d, p2->d, ulps);
76 }
77
compare_quaternion(const D3DXQUATERNION * q1,const D3DXQUATERNION * q2,unsigned int ulps)78 static BOOL compare_quaternion(const D3DXQUATERNION *q1, const D3DXQUATERNION *q2, unsigned int ulps)
79 {
80 return compare_float(q1->x, q2->x, ulps)
81 && compare_float(q1->y, q2->y, ulps)
82 && compare_float(q1->z, q2->z, ulps)
83 && compare_float(q1->w, q2->w, ulps);
84 }
85
compare_matrix(const D3DXMATRIX * m1,const D3DXMATRIX * m2,unsigned int ulps)86 static BOOL compare_matrix(const D3DXMATRIX *m1, const D3DXMATRIX *m2, unsigned int ulps)
87 {
88 unsigned int i, j;
89
90 for (i = 0; i < 4; ++i)
91 {
92 for (j = 0; j < 4; ++j)
93 {
94 if (!compare_float(U(*m1).m[i][j], U(*m2).m[i][j], ulps))
95 return FALSE;
96 }
97 }
98
99 return TRUE;
100 }
101
102 #define expect_vec2(expected, vector, ulps) expect_vec2_(__LINE__, expected, vector, ulps)
expect_vec2_(unsigned int line,const D3DXVECTOR2 * expected,const D3DXVECTOR2 * vector,unsigned int ulps)103 static void expect_vec2_(unsigned int line, const D3DXVECTOR2 *expected, const D3DXVECTOR2 *vector, unsigned int ulps)
104 {
105 BOOL equal = compare_vec2(expected, vector, ulps);
106 ok_(__FILE__, line)(equal,
107 "Got unexpected vector {%.8e, %.8e}, expected {%.8e, %.8e}.\n",
108 vector->x, vector->y, expected->x, expected->y);
109 }
110
111 #define expect_vec3(expected, vector, ulps) expect_vec3_(__LINE__, expected, vector, ulps)
expect_vec3_(unsigned int line,const D3DXVECTOR3 * expected,const D3DXVECTOR3 * vector,unsigned int ulps)112 static void expect_vec3_(unsigned int line, const D3DXVECTOR3 *expected, const D3DXVECTOR3 *vector, unsigned int ulps)
113 {
114 BOOL equal = compare_vec3(expected, vector, ulps);
115 ok_(__FILE__, line)(equal,
116 "Got unexpected vector {%.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e}.\n",
117 vector->x, vector->y, vector->z, expected->x, expected->y, expected->z);
118 }
119
120 #define expect_vec4(expected, vector, ulps) expect_vec4_(__LINE__, expected, vector, ulps)
expect_vec4_(unsigned int line,const D3DXVECTOR4 * expected,const D3DXVECTOR4 * vector,unsigned int ulps)121 static void expect_vec4_(unsigned int line, const D3DXVECTOR4 *expected, const D3DXVECTOR4 *vector, unsigned int ulps)
122 {
123 BOOL equal = compare_vec4(expected, vector, ulps);
124 ok_(__FILE__, line)(equal,
125 "Got unexpected vector {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n",
126 vector->x, vector->y, vector->z, vector->w, expected->x, expected->y, expected->z, expected->w);
127 }
128
129 #define expect_color(expected, color, ulps) expect_color_(__LINE__, expected, color, ulps)
expect_color_(unsigned int line,const D3DXCOLOR * expected,const D3DXCOLOR * color,unsigned int ulps)130 static void expect_color_(unsigned int line, const D3DXCOLOR *expected, const D3DXCOLOR *color, unsigned int ulps)
131 {
132 BOOL equal = compare_color(expected, color, ulps);
133 ok_(__FILE__, line)(equal,
134 "Got unexpected color {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n",
135 color->r, color->g, color->b, color->a, expected->r, expected->g, expected->b, expected->a);
136 }
137
138 #define expect_plane(expected, plane, ulps) expect_plane_(__LINE__, expected, plane, ulps)
expect_plane_(unsigned int line,const D3DXPLANE * expected,const D3DXPLANE * plane,unsigned int ulps)139 static void expect_plane_(unsigned int line, const D3DXPLANE *expected, const D3DXPLANE *plane, unsigned int ulps)
140 {
141 BOOL equal = compare_plane(expected, plane, ulps);
142 ok_(__FILE__, line)(equal,
143 "Got unexpected plane {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n",
144 plane->a, plane->b, plane->c, plane->d, expected->a, expected->b, expected->c, expected->d);
145 }
146
147 #define expect_quaternion(expected, quaternion, ulps) expect_quaternion_(__LINE__, expected, quaternion, ulps)
expect_quaternion_(unsigned int line,const D3DXQUATERNION * expected,const D3DXQUATERNION * quaternion,unsigned int ulps)148 static void expect_quaternion_(unsigned int line, const D3DXQUATERNION *expected,
149 const D3DXQUATERNION *quaternion, unsigned int ulps)
150 {
151 BOOL equal = compare_quaternion(expected, quaternion, ulps);
152 ok_(__FILE__, line)(equal,
153 "Got unexpected quaternion {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n",
154 quaternion->x, quaternion->y, quaternion->z, quaternion->w,
155 expected->x, expected->y, expected->z, expected->w);
156 }
157
158 #define expect_matrix(expected, matrix, ulps) expect_matrix_(__LINE__, expected, matrix, ulps)
expect_matrix_(unsigned int line,const D3DXMATRIX * expected,const D3DXMATRIX * matrix,unsigned int ulps)159 static void expect_matrix_(unsigned int line, const D3DXMATRIX *expected, const D3DXMATRIX *matrix, unsigned int ulps)
160 {
161 BOOL equal = compare_matrix(expected, matrix, ulps);
162 ok_(__FILE__, line)(equal,
163 "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, "
164 "%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e}, "
165 "expected {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, "
166 "%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n",
167 U(*matrix).m[0][0], U(*matrix).m[0][1], U(*matrix).m[0][2], U(*matrix).m[0][3],
168 U(*matrix).m[1][0], U(*matrix).m[1][1], U(*matrix).m[1][2], U(*matrix).m[1][3],
169 U(*matrix).m[2][0], U(*matrix).m[2][1], U(*matrix).m[2][2], U(*matrix).m[2][3],
170 U(*matrix).m[3][0], U(*matrix).m[3][1], U(*matrix).m[3][2], U(*matrix).m[3][3],
171 U(*expected).m[0][0], U(*expected).m[0][1], U(*expected).m[0][2], U(*expected).m[0][3],
172 U(*expected).m[1][0], U(*expected).m[1][1], U(*expected).m[1][2], U(*expected).m[1][3],
173 U(*expected).m[2][0], U(*expected).m[2][1], U(*expected).m[2][2], U(*expected).m[2][3],
174 U(*expected).m[3][0], U(*expected).m[3][1], U(*expected).m[3][2], U(*expected).m[3][3]);
175 }
176
177 #define expect_vec4_array(count, expected, vector, ulps) expect_vec4_array_(__LINE__, count, expected, vector, ulps)
expect_vec4_array_(unsigned int line,unsigned int count,const D3DXVECTOR4 * expected,const D3DXVECTOR4 * vector,unsigned int ulps)178 static void expect_vec4_array_(unsigned int line, unsigned int count, const D3DXVECTOR4 *expected,
179 const D3DXVECTOR4 *vector, unsigned int ulps)
180 {
181 BOOL equal;
182 unsigned int i;
183
184 for (i = 0; i < count; ++i)
185 {
186 equal = compare_vec4(&expected[i], &vector[i], ulps);
187 ok_(__FILE__, line)(equal,
188 "Got unexpected vector {%.8e, %.8e, %.8e, %.8e} at index %u, expected {%.8e, %.8e, %.8e, %.8e}.\n",
189 vector[i].x, vector[i].y, vector[i].z, vector[i].w, i,
190 expected[i].x, expected[i].y, expected[i].z, expected[i].w);
191 if (!equal)
192 break;
193 }
194 }
195
set_matrix(D3DXMATRIX * mat,float m00,float m01,float m02,float m03,float m10,float m11,float m12,float m13,float m20,float m21,float m22,float m23,float m30,float m31,float m32,float m33)196 static void set_matrix(D3DXMATRIX* mat,
197 float m00, float m01, float m02, float m03,
198 float m10, float m11, float m12, float m13,
199 float m20, float m21, float m22, float m23,
200 float m30, float m31, float m32, float m33)
201 {
202 U(mat)->m[0][0] = m00; U(mat)->m[0][1] = m01; U(mat)->m[0][2] = m02; U(mat)->m[0][3] = m03;
203 U(mat)->m[1][0] = m10; U(mat)->m[1][1] = m11; U(mat)->m[1][2] = m12; U(mat)->m[1][3] = m13;
204 U(mat)->m[2][0] = m20; U(mat)->m[2][1] = m21; U(mat)->m[2][2] = m22; U(mat)->m[2][3] = m23;
205 U(mat)->m[3][0] = m30; U(mat)->m[3][1] = m31; U(mat)->m[3][2] = m32; U(mat)->m[3][3] = m33;
206 }
207
D3DXColorTest(void)208 static void D3DXColorTest(void)
209 {
210 D3DXCOLOR color, color1, color2, expected, got;
211 LPD3DXCOLOR funcpointer;
212 FLOAT scale;
213
214 color.r = 0.2f; color.g = 0.75f; color.b = 0.41f; color.a = 0.93f;
215 color1.r = 0.6f; color1.g = 0.55f; color1.b = 0.23f; color1.a = 0.82f;
216 color2.r = 0.3f; color2.g = 0.5f; color2.b = 0.76f; color2.a = 0.11f;
217
218 scale = 0.3f;
219
220 /*_______________D3DXColorAdd________________*/
221 expected.r = 0.9f; expected.g = 1.05f; expected.b = 0.99f; expected.a = 0.93f;
222 D3DXColorAdd(&got,&color1,&color2);
223 expect_color(&expected, &got, 1);
224 /* Test the NULL case */
225 funcpointer = D3DXColorAdd(&got,NULL,&color2);
226 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
227 funcpointer = D3DXColorAdd(NULL,NULL,&color2);
228 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
229 funcpointer = D3DXColorAdd(NULL,NULL,NULL);
230 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
231
232 /*_______________D3DXColorAdjustContrast______*/
233 expected.r = 0.41f; expected.g = 0.575f; expected.b = 0.473f; expected.a = 0.93f;
234 D3DXColorAdjustContrast(&got,&color,scale);
235 expect_color(&expected, &got, 0);
236
237 /*_______________D3DXColorAdjustSaturation______*/
238 expected.r = 0.486028f; expected.g = 0.651028f; expected.b = 0.549028f; expected.a = 0.93f;
239 D3DXColorAdjustSaturation(&got,&color,scale);
240 expect_color(&expected, &got, 16);
241
242 /*_______________D3DXColorLerp________________*/
243 expected.r = 0.32f; expected.g = 0.69f; expected.b = 0.356f; expected.a = 0.897f;
244 D3DXColorLerp(&got,&color,&color1,scale);
245 expect_color(&expected, &got, 0);
246 /* Test the NULL case */
247 funcpointer = D3DXColorLerp(&got,NULL,&color1,scale);
248 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
249 funcpointer = D3DXColorLerp(NULL,NULL,&color1,scale);
250 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
251 funcpointer = D3DXColorLerp(NULL,NULL,NULL,scale);
252 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
253
254 /*_______________D3DXColorModulate________________*/
255 expected.r = 0.18f; expected.g = 0.275f; expected.b = 0.1748f; expected.a = 0.0902f;
256 D3DXColorModulate(&got,&color1,&color2);
257 expect_color(&expected, &got, 0);
258 /* Test the NULL case */
259 funcpointer = D3DXColorModulate(&got,NULL,&color2);
260 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
261 funcpointer = D3DXColorModulate(NULL,NULL,&color2);
262 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
263 funcpointer = D3DXColorModulate(NULL,NULL,NULL);
264 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
265
266 /*_______________D3DXColorNegative________________*/
267 expected.r = 0.8f; expected.g = 0.25f; expected.b = 0.59f; expected.a = 0.93f;
268 D3DXColorNegative(&got,&color);
269 expect_color(&expected, &got, 1);
270 /* Test the greater than 1 case */
271 color1.r = 0.2f; color1.g = 1.75f; color1.b = 0.41f; color1.a = 0.93f;
272 expected.r = 0.8f; expected.g = -0.75f; expected.b = 0.59f; expected.a = 0.93f;
273 D3DXColorNegative(&got,&color1);
274 expect_color(&expected, &got, 1);
275 /* Test the negative case */
276 color1.r = 0.2f; color1.g = -0.75f; color1.b = 0.41f; color1.a = 0.93f;
277 expected.r = 0.8f; expected.g = 1.75f; expected.b = 0.59f; expected.a = 0.93f;
278 D3DXColorNegative(&got,&color1);
279 expect_color(&expected, &got, 1);
280 /* Test the NULL case */
281 funcpointer = D3DXColorNegative(&got,NULL);
282 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
283 funcpointer = D3DXColorNegative(NULL,NULL);
284 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
285
286 /*_______________D3DXColorScale________________*/
287 expected.r = 0.06f; expected.g = 0.225f; expected.b = 0.123f; expected.a = 0.279f;
288 D3DXColorScale(&got,&color,scale);
289 expect_color(&expected, &got, 1);
290 /* Test the NULL case */
291 funcpointer = D3DXColorScale(&got,NULL,scale);
292 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
293 funcpointer = D3DXColorScale(NULL,NULL,scale);
294 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
295
296 /*_______________D3DXColorSubtract_______________*/
297 expected.r = -0.1f; expected.g = 0.25f; expected.b = -0.35f; expected.a = 0.82f;
298 D3DXColorSubtract(&got,&color,&color2);
299 expect_color(&expected, &got, 1);
300 /* Test the NULL case */
301 funcpointer = D3DXColorSubtract(&got,NULL,&color2);
302 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
303 funcpointer = D3DXColorSubtract(NULL,NULL,&color2);
304 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
305 funcpointer = D3DXColorSubtract(NULL,NULL,NULL);
306 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
307 }
308
D3DXFresnelTest(void)309 static void D3DXFresnelTest(void)
310 {
311 float fresnel;
312 BOOL equal;
313
314 fresnel = D3DXFresnelTerm(0.5f, 1.5f);
315 equal = compare_float(fresnel, 8.91867128e-02f, 1);
316 ok(equal, "Got unexpected Fresnel term %.8e.\n", fresnel);
317 }
318
D3DXMatrixTest(void)319 static void D3DXMatrixTest(void)
320 {
321 D3DXMATRIX expectedmat, gotmat, mat, mat2, mat3;
322 BOOL expected, got, equal;
323 float angle, determinant;
324 D3DXPLANE plane;
325 D3DXQUATERNION q, r;
326 D3DXVECTOR3 at, axis, eye, last;
327 D3DXVECTOR4 light;
328 D3DXMATRIX *ret;
329
330 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
331 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
332 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
333 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
334 U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f;
335 U(mat).m[3][3] = -40.0f;
336
337 U(mat2).m[0][0] = 1.0f; U(mat2).m[1][0] = 2.0f; U(mat2).m[2][0] = 3.0f;
338 U(mat2).m[3][0] = 4.0f; U(mat2).m[0][1] = 5.0f; U(mat2).m[1][1] = 6.0f;
339 U(mat2).m[2][1] = 7.0f; U(mat2).m[3][1] = 8.0f; U(mat2).m[0][2] = -8.0f;
340 U(mat2).m[1][2] = -7.0f; U(mat2).m[2][2] = -6.0f; U(mat2).m[3][2] = -5.0f;
341 U(mat2).m[0][3] = -4.0f; U(mat2).m[1][3] = -3.0f; U(mat2).m[2][3] = -2.0f;
342 U(mat2).m[3][3] = -1.0f;
343
344 plane.a = -3.0f; plane.b = -1.0f; plane.c = 4.0f; plane.d = 7.0f;
345
346 q.x = 1.0f; q.y = -4.0f; q.z =7.0f; q.w = -11.0f;
347 r.x = 0.87f; r.y = 0.65f; r.z =0.43f; r.w= 0.21f;
348
349 at.x = -2.0f; at.y = 13.0f; at.z = -9.0f;
350 axis.x = 1.0f; axis.y = -3.0f; axis.z = 7.0f;
351 eye.x = 8.0f; eye.y = -5.0f; eye.z = 5.75f;
352 last.x = 9.7f; last.y = -8.6; last.z = 1.3f;
353
354 light.x = 9.6f; light.y = 8.5f; light.z = 7.4; light.w = 6.3;
355
356 angle = D3DX_PI/3.0f;
357
358 /*____________D3DXMatrixAffineTransformation______*/
359 set_matrix(&expectedmat,
360 -459.239990f, -576.719971f, -263.440002f, 0.0f,
361 519.760010f, -352.440002f, -277.679993f, 0.0f,
362 363.119995f, -121.040001f, -117.479996f, 0.0f,
363 -1239.0f, 667.0f, 567.0f, 1.0f);
364 D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, &q, &axis);
365 expect_matrix(&expectedmat, &gotmat, 0);
366
367 /* Test the NULL case */
368 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;
369 D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, &q, &axis);
370 expect_matrix(&expectedmat, &gotmat, 0);
371
372 U(expectedmat).m[3][0] = -1240.0f; U(expectedmat).m[3][1] = 670.0f; U(expectedmat).m[3][2] = 560.0f; U(expectedmat).m[3][3] = 1.0f;
373 D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, &q, NULL);
374 expect_matrix(&expectedmat, &gotmat, 0);
375
376 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;
377 D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, &q, NULL);
378 expect_matrix(&expectedmat, &gotmat, 0);
379
380 set_matrix(&expectedmat,
381 3.56f, 0.0f, 0.0f, 0.0f,
382 0.0f, 3.56f, 0.0f, 0.0f,
383 0.0f, 0.0f, 3.56f, 0.0f,
384 1.0f, -3.0f, 7.0f, 1.0f);
385 D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, NULL, &axis);
386 expect_matrix(&expectedmat, &gotmat, 0);
387
388 D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, NULL, &axis);
389 expect_matrix(&expectedmat, &gotmat, 0);
390
391 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;
392 D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, NULL, NULL);
393 expect_matrix(&expectedmat, &gotmat, 0);
394
395 D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, NULL, NULL);
396 expect_matrix(&expectedmat, &gotmat, 0);
397
398 /*____________D3DXMatrixfDeterminant_____________*/
399 determinant = D3DXMatrixDeterminant(&mat);
400 equal = compare_float(determinant, -147888.0f, 0);
401 ok(equal, "Got unexpected determinant %.8e.\n", determinant);
402
403 /*____________D3DXMatrixInverse______________*/
404 set_matrix(&expectedmat,
405 16067.0f/73944.0f, -10165.0f/147888.0f, -2729.0f/147888.0f, -1631.0f/49296.0f,
406 -565.0f/36972.0f, 2723.0f/73944.0f, -1073.0f/73944.0f, 289.0f/24648.0f,
407 -389.0f/2054.0f, 337.0f/4108.0f, 181.0f/4108.0f, 317.0f/4108.0f,
408 163.0f/5688.0f, -101.0f/11376.0f, -73.0f/11376.0f, -127.0f/3792.0f);
409 D3DXMatrixInverse(&gotmat, &determinant, &mat);
410 expect_matrix(&expectedmat, &gotmat, 1);
411 equal = compare_float(determinant, -147888.0f, 0);
412 ok(equal, "Got unexpected determinant %.8e.\n", determinant);
413 determinant = 5.0f;
414 ret = D3DXMatrixInverse(&gotmat, &determinant, &mat2);
415 ok(!ret, "Unexpected return value %p.\n", ret);
416 expect_matrix(&expectedmat, &gotmat, 1);
417 ok(compare_float(determinant, 5.0f, 0) || broken(!determinant), /* Vista 64 bit testbot */
418 "Unexpected determinant %.8e.\n", determinant);
419
420 /*____________D3DXMatrixIsIdentity______________*/
421 expected = FALSE;
422 memset(&mat3, 0, sizeof(mat3));
423 got = D3DXMatrixIsIdentity(&mat3);
424 ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
425 D3DXMatrixIdentity(&mat3);
426 expected = TRUE;
427 got = D3DXMatrixIsIdentity(&mat3);
428 ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
429 U(mat3).m[0][0] = 0.000009f;
430 expected = FALSE;
431 got = D3DXMatrixIsIdentity(&mat3);
432 ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
433 /* Test the NULL case */
434 expected = FALSE;
435 got = D3DXMatrixIsIdentity(NULL);
436 ok(expected == got, "Expected : %d, Got : %d\n", expected, got);
437
438 /*____________D3DXMatrixLookAtLH_______________*/
439 set_matrix(&expectedmat,
440 -0.82246518f, -0.40948939f, -0.39480308f, 0.0f,
441 -0.55585691f, 0.43128574f, 0.71064550f, 0.0f,
442 -0.12072885f, 0.80393475f, -0.58233452f, 0.0f,
443 4.4946337f, 0.80971903f, 10.060076f, 1.0f);
444 D3DXMatrixLookAtLH(&gotmat, &eye, &at, &axis);
445 expect_matrix(&expectedmat, &gotmat, 32);
446
447 /*____________D3DXMatrixLookAtRH_______________*/
448 set_matrix(&expectedmat,
449 0.82246518f, -0.40948939f, 0.39480308f, 0.0f,
450 0.55585691f, 0.43128574f, -0.71064550f, 0.0f,
451 0.12072885f, 0.80393475f, 0.58233452f, 0.0f,
452 -4.4946337f, 0.80971903f, -10.060076f, 1.0f);
453 D3DXMatrixLookAtRH(&gotmat, &eye, &at, &axis);
454 expect_matrix(&expectedmat, &gotmat, 32);
455
456 /*____________D3DXMatrixMultiply______________*/
457 set_matrix(&expectedmat,
458 73.0f, 193.0f, -197.0f, -77.0f,
459 231.0f, 551.0f, -489.0f, -169.0f,
460 239.0f, 523.0f, -400.0f, -116.0f,
461 -164.0f, -320.0f, 187.0f, 31.0f);
462 D3DXMatrixMultiply(&gotmat, &mat, &mat2);
463 expect_matrix(&expectedmat, &gotmat, 0);
464
465 /*____________D3DXMatrixMultiplyTranspose____*/
466 set_matrix(&expectedmat,
467 73.0f, 231.0f, 239.0f, -164.0f,
468 193.0f, 551.0f, 523.0f, -320.0f,
469 -197.0f, -489.0f, -400.0f, 187.0f,
470 -77.0f, -169.0f, -116.0f, 31.0f);
471 D3DXMatrixMultiplyTranspose(&gotmat, &mat, &mat2);
472 expect_matrix(&expectedmat, &gotmat, 0);
473
474 /*____________D3DXMatrixOrthoLH_______________*/
475 set_matrix(&expectedmat,
476 0.8f, 0.0f, 0.0f, 0.0f,
477 0.0f, 0.27027027f, 0.0f, 0.0f,
478 0.0f, 0.0f, -0.15151515f, 0.0f,
479 0.0f, 0.0f, -0.48484848f, 1.0f);
480 D3DXMatrixOrthoLH(&gotmat, 2.5f, 7.4f, -3.2f, -9.8f);
481 expect_matrix(&expectedmat, &gotmat, 16);
482
483 /*____________D3DXMatrixOrthoOffCenterLH_______________*/
484 set_matrix(&expectedmat,
485 3.6363636f, 0.0f, 0.0f, 0.0f,
486 0.0f, 0.18018018f, 0.0f, 0.0f,
487 0.0f, 0.0f, -0.045662100f, 0.0f,
488 -1.7272727f, -0.56756757f, 0.42465753f, 1.0f);
489 D3DXMatrixOrthoOffCenterLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 9.3, -12.6);
490 expect_matrix(&expectedmat, &gotmat, 32);
491
492 /*____________D3DXMatrixOrthoOffCenterRH_______________*/
493 set_matrix(&expectedmat,
494 3.6363636f, 0.0f, 0.0f, 0.0f,
495 0.0f, 0.18018018f, 0.0f, 0.0f,
496 0.0f, 0.0f, 0.045662100f, 0.0f,
497 -1.7272727f, -0.56756757f, 0.42465753f, 1.0f);
498 D3DXMatrixOrthoOffCenterRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 9.3, -12.6);
499 expect_matrix(&expectedmat, &gotmat, 32);
500
501 /*____________D3DXMatrixOrthoRH_______________*/
502 set_matrix(&expectedmat,
503 0.8f, 0.0f, 0.0f, 0.0f,
504 0.0f, 0.27027027f, 0.0f, 0.0f,
505 0.0f, 0.0f, 0.15151515f, 0.0f,
506 0.0f, 0.0f, -0.48484848f, 1.0f);
507 D3DXMatrixOrthoRH(&gotmat, 2.5f, 7.4f, -3.2f, -9.8f);
508 expect_matrix(&expectedmat, &gotmat, 16);
509
510 /*____________D3DXMatrixPerspectiveFovLH_______________*/
511 set_matrix(&expectedmat,
512 13.288858f, 0.0f, 0.0f, 0.0f,
513 0.0f, 9.9666444f, 0.0f, 0.0f,
514 0.0f, 0.0f, 0.78378378f, 1.0f,
515 0.0f, 0.0f, 1.8810811f, 0.0f);
516 D3DXMatrixPerspectiveFovLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
517 expect_matrix(&expectedmat, &gotmat, 4);
518
519 /*____________D3DXMatrixPerspectiveFovRH_______________*/
520 set_matrix(&expectedmat,
521 13.288858f, 0.0f, 0.0f, 0.0f,
522 0.0f, 9.9666444f, 0.0f, 0.0f,
523 0.0f, 0.0f, -0.78378378f, -1.0f,
524 0.0f, 0.0f, 1.8810811f, 0.0f);
525 D3DXMatrixPerspectiveFovRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
526 expect_matrix(&expectedmat, &gotmat, 4);
527
528 /*____________D3DXMatrixPerspectiveLH_______________*/
529 set_matrix(&expectedmat,
530 -24.0f, 0.0f, 0.0f, 0.0f,
531 0.0f, -6.4f, 0.0f, 0.0f,
532 0.0f, 0.0f, 0.78378378f, 1.0f,
533 0.0f, 0.0f, 1.8810811f, 0.0f);
534 D3DXMatrixPerspectiveLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
535 expect_matrix(&expectedmat, &gotmat, 4);
536
537 /*____________D3DXMatrixPerspectiveOffCenterLH_______________*/
538 set_matrix(&expectedmat,
539 11.636364f, 0.0f, 0.0f, 0.0f,
540 0.0f, 0.57657658f, 0.0f, 0.0f,
541 -1.7272727f, -0.56756757f, 0.84079602f, 1.0f,
542 0.0f, 0.0f, -2.6905473f, 0.0f);
543 D3DXMatrixPerspectiveOffCenterLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 3.2f, -16.9f);
544 expect_matrix(&expectedmat, &gotmat, 8);
545
546 /*____________D3DXMatrixPerspectiveOffCenterRH_______________*/
547 set_matrix(&expectedmat,
548 11.636364f, 0.0f, 0.0f, 0.0f,
549 0.0f, 0.57657658f, 0.0f, 0.0f,
550 1.7272727f, 0.56756757f, -0.84079602f, -1.0f,
551 0.0f, 0.0f, -2.6905473f, 0.0f);
552 D3DXMatrixPerspectiveOffCenterRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 3.2f, -16.9f);
553 expect_matrix(&expectedmat, &gotmat, 8);
554
555 /*____________D3DXMatrixPerspectiveRH_______________*/
556 set_matrix(&expectedmat,
557 -24.0f, -0.0f, 0.0f, 0.0f,
558 0.0f, -6.4f, 0.0f, 0.0f,
559 0.0f, 0.0f, -0.78378378f, -1.0f,
560 0.0f, 0.0f, 1.8810811f, 0.0f);
561 D3DXMatrixPerspectiveRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f);
562 expect_matrix(&expectedmat, &gotmat, 4);
563
564 /*____________D3DXMatrixReflect______________*/
565 set_matrix(&expectedmat,
566 0.30769235f, -0.23076922f, 0.92307687f, 0.0f,
567 -0.23076922, 0.92307693f, 0.30769232f, 0.0f,
568 0.92307687f, 0.30769232f, -0.23076922f, 0.0f,
569 1.6153846f, 0.53846157f, -2.1538463f, 1.0f);
570 D3DXMatrixReflect(&gotmat, &plane);
571 expect_matrix(&expectedmat, &gotmat, 32);
572
573 /*____________D3DXMatrixRotationAxis_____*/
574 set_matrix(&expectedmat,
575 0.50847453f, 0.76380461f, 0.39756277f, 0.0f,
576 -0.81465209f, 0.57627118f, -0.065219201f, 0.0f,
577 -0.27891868f, -0.29071301f, 0.91525424f, 0.0f,
578 0.0f, 0.0f, 0.0f, 1.0f);
579 D3DXMatrixRotationAxis(&gotmat, &axis, angle);
580 expect_matrix(&expectedmat, &gotmat, 32);
581
582 /*____________D3DXMatrixRotationQuaternion______________*/
583 set_matrix(&expectedmat,
584 -129.0f, -162.0f, -74.0f, 0.0f,
585 146.0f, -99.0f, -78.0f, 0.0f,
586 102.0f, -34.0f, -33.0f, 0.0f,
587 0.0f, 0.0f, 0.0f, 1.0f);
588 D3DXMatrixRotationQuaternion(&gotmat, &q);
589 expect_matrix(&expectedmat, &gotmat, 0);
590
591 /*____________D3DXMatrixRotationX______________*/
592 set_matrix(&expectedmat,
593 1.0f, 0.0f, 0.0f, 0.0f,
594 0.0f, 0.5f, sqrt(3.0f)/2.0f, 0.0f,
595 0.0f, -sqrt(3.0f)/2.0f, 0.5f, 0.0f,
596 0.0f, 0.0f, 0.0f, 1.0f);
597 D3DXMatrixRotationX(&gotmat, angle);
598 expect_matrix(&expectedmat, &gotmat, 1);
599
600 /*____________D3DXMatrixRotationY______________*/
601 set_matrix(&expectedmat,
602 0.5f, 0.0f, -sqrt(3.0f)/2.0f, 0.0f,
603 0.0f, 1.0f, 0.0f, 0.0f,
604 sqrt(3.0f)/2.0f, 0.0f, 0.5f, 0.0f,
605 0.0f, 0.0f, 0.0f, 1.0f);
606 D3DXMatrixRotationY(&gotmat, angle);
607 expect_matrix(&expectedmat, &gotmat, 1);
608
609 /*____________D3DXMatrixRotationYawPitchRoll____*/
610 set_matrix(&expectedmat,
611 0.88877726f, 0.091874748f, -0.44903678f, 0.0f,
612 0.35171318f, 0.49148652f, 0.79670501f, 0.0f,
613 0.29389259f, -0.86602545f, 0.40450847f, 0.0f,
614 0.0f, 0.0f, 0.0f, 1.0f);
615 D3DXMatrixRotationYawPitchRoll(&gotmat, 3.0f * angle / 5.0f, angle, 3.0f * angle / 17.0f);
616 expect_matrix(&expectedmat, &gotmat, 64);
617
618 /*____________D3DXMatrixRotationZ______________*/
619 set_matrix(&expectedmat,
620 0.5f, sqrt(3.0f)/2.0f, 0.0f, 0.0f,
621 -sqrt(3.0f)/2.0f, 0.5f, 0.0f, 0.0f,
622 0.0f, 0.0f, 1.0f, 0.0f,
623 0.0f, 0.0f, 0.0f, 1.0f);
624 D3DXMatrixRotationZ(&gotmat, angle);
625 expect_matrix(&expectedmat, &gotmat, 1);
626
627 /*____________D3DXMatrixScaling______________*/
628 set_matrix(&expectedmat,
629 0.69f, 0.0f, 0.0f, 0.0f,
630 0.0f, 0.53f, 0.0f, 0.0f,
631 0.0f, 0.0f, 4.11f, 0.0f,
632 0.0f, 0.0f, 0.0f, 1.0f);
633 D3DXMatrixScaling(&gotmat, 0.69f, 0.53f, 4.11f);
634 expect_matrix(&expectedmat, &gotmat, 0);
635
636 /*____________D3DXMatrixShadow______________*/
637 set_matrix(&expectedmat,
638 12.786773f, 5.0009613f, 4.3537784f, 3.7065949f,
639 1.8827150f, 8.8056154f, 1.4512594f, 1.2355317f,
640 -7.5308599f, -6.6679487f, 1.3335901f, -4.9421268f,
641 -13.179006f, -11.668910f, -10.158816f, -1.5100943f);
642 D3DXMatrixShadow(&gotmat, &light, &plane);
643 expect_matrix(&expectedmat, &gotmat, 8);
644
645 /*____________D3DXMatrixTransformation______________*/
646 set_matrix(&expectedmat,
647 1.0f, 0.0f, 0.0f, 0.0f,
648 0.0f, 1.0f, 0.0f, 0.0f,
649 0.0f, 0.0f, 1.0f, 0.0f,
650 0.0f, 0.0f, 0.0f, 1.0f);
651 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, NULL, NULL, NULL);
652 expect_matrix(&expectedmat, &gotmat, 0);
653
654 set_matrix(&expectedmat,
655 1.0f, 0.0f, 0.0f, 0.0f,
656 0.0f, 1.0f, 0.0f, 0.0f,
657 0.0f, 0.0f, 1.0f, 0.0f,
658 9.7f, -8.6f, 1.3f, 1.0f);
659 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, NULL, NULL, &last);
660 expect_matrix(&expectedmat, &gotmat, 0);
661
662 set_matrix(&expectedmat,
663 -0.2148f, 1.3116f, 0.4752f, 0.0f,
664 0.9504f, -0.8836f, 0.9244f, 0.0f,
665 1.0212f, 0.1936f, -1.3588f, 0.0f,
666 0.0f, 0.0f, 0.0f, 1.0f);
667 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, NULL, &r, NULL);
668 expect_matrix(&expectedmat, &gotmat, 8);
669
670 set_matrix(&expectedmat,
671 1.0f, 0.0f, 0.0f, 0.0f,
672 0.0f, 1.0f, 0.0f, 0.0f,
673 0.0f, 0.0f, 1.0f, 0.0f,
674 0.0f, 0.0f, 0.0f, 1.0f);
675 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, &eye, NULL, NULL);
676 expect_matrix(&expectedmat, &gotmat, 0);
677
678 set_matrix(&expectedmat,
679 1.0f, 0.0f, 0.0f, 0.0f,
680 0.0f, -3.0f, 0.0f, 0.0f,
681 0.0f, 0.0f, 7.0f, 0.0f,
682 0.0f, 0.0f, 0.0f, 1.0f);
683 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, NULL, NULL, NULL);
684 expect_matrix(&expectedmat, &gotmat, 0);
685
686 set_matrix(&expectedmat,
687 1.0f, 0.0f, 0.0f, 0.0f,
688 0.0f, 1.0f, 0.0f, 0.0f,
689 0.0f, 0.0f, 1.0f, 0.0f,
690 0.0f, 0.0f, 0.0f, 1.0f);
691 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, NULL, NULL, NULL);
692 expect_matrix(&expectedmat, &gotmat, 0);
693
694 set_matrix(&expectedmat,
695 1.0f, 0.0f, 0.0f, 0.0f,
696 0.0f, 1.0f, 0.0f, 0.0f,
697 0.0f, 0.0f, 1.0f, 0.0f,
698 0.0f, 0.0f, 0.0f, 1.0f);
699 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, NULL, NULL, NULL);
700 expect_matrix(&expectedmat, &gotmat, 0);
701
702 set_matrix(&expectedmat,
703 -0.2148f, 1.3116f, 0.4752f, 0.0f,
704 0.9504f, -0.8836f, 0.9244f, 0.0f,
705 1.0212f, 0.1936f, -1.3588f, 0.0f,
706 9.7f, -8.6f, 1.3f, 1.0f);
707 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, NULL, &r, &last);
708 expect_matrix(&expectedmat, &gotmat, 8);
709
710 set_matrix(&expectedmat,
711 1.0f, 0.0f, 0.0f, 0.0f,
712 0.0f, 1.0f, 0.0f, 0.0f,
713 0.0f, 0.0f, 1.0f, 0.0f,
714 9.7f, -8.6f, 1.3f, 1.0f);
715 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, &eye, NULL, &last);
716 expect_matrix(&expectedmat, &gotmat, 0);
717
718 set_matrix(&expectedmat,
719 1.0f, 0.0f, 0.0f, 0.0f,
720 0.0f, -3.0f, 0.0f, 0.0f,
721 0.0f, 0.0f, 7.0f, 0.0f,
722 9.7f, -8.6f, 1.3f, 1.0f);
723 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, NULL, NULL, &last);
724 expect_matrix(&expectedmat, &gotmat, 0);
725
726 set_matrix(&expectedmat,
727 1.0f, 0.0f, 0.0f, 0.0f,
728 0.0f, 1.0f, 0.0f, 0.0f,
729 0.0f, 0.0f, 1.0f, 0.0f,
730 9.7f, -8.6f, 1.3f, 1.0f);
731 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, NULL, NULL, &last);
732 expect_matrix(&expectedmat, &gotmat, 0);
733
734 set_matrix(&expectedmat,
735 1.0f, 0.0f, 0.0f, 0.0f,
736 0.0f, 1.0f, 0.0f, 0.0f,
737 0.0f, 0.0f, 1.0f, 0.0f,
738 9.7f, -8.6f, 1.3f, 1.0f);
739 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, NULL, NULL, &last);
740 expect_matrix(&expectedmat, &gotmat, 0);
741
742 set_matrix(&expectedmat,
743 -0.2148f, 1.3116f, 0.4752f, 0.0f,
744 0.9504f, -0.8836f, 0.9244f, 0.0f,
745 1.0212f, 0.1936f, -1.3588f, 0.0f,
746 8.5985f, -21.024f, 14.383499, 1.0f);
747 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, &eye, &r, NULL);
748 expect_matrix(&expectedmat, &gotmat, 8);
749
750 set_matrix(&expectedmat,
751 -0.2148f, 1.3116f, 0.4752f, 0.0f,
752 -2.8512f, 2.6508f, -2.7732f, 0.0f,
753 7.148399f, 1.3552f, -9.5116f, 0.0f,
754 0.0f, 0.0f, 0.0f, 1.0f);
755 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, NULL, &r, NULL);
756 expect_matrix(&expectedmat, &gotmat, 8);
757
758 set_matrix(&expectedmat,
759 -0.2148f, 1.3116f, 0.4752f, 0.0f,
760 0.9504f, -0.8836f, 0.9244f, 0.0f,
761 1.0212f, 0.1936f, -1.3588f, 0.0f,
762 0.0f, 0.0f, 0.0f, 1.0f);
763 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, NULL, &r, NULL);
764 expect_matrix(&expectedmat, &gotmat, 8);
765
766 set_matrix(&expectedmat,
767 -0.2148f, 1.3116f, 0.4752f, 0.0f,
768 0.9504f, -0.8836f, 0.9244f, 0.0f,
769 1.0212f, 0.1936f, -1.3588f, 0.0f,
770 0.0f, 0.0f, 0.0f, 1.0f);
771 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, NULL, &r, NULL);
772 expect_matrix(&expectedmat, &gotmat, 8);
773
774 set_matrix(&expectedmat,
775 1.0f, 0.0f, 0.0f, 0.0f,
776 0.0f, -3.0f, 0.0f, 0.0f,
777 0.0f, 0.0f, 7.0f, 0.0f,
778 0.0f, 0.0f, 0.0f, 1.0f);
779 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, &eye, NULL, NULL);
780 expect_matrix(&expectedmat, &gotmat, 0);
781
782 set_matrix(&expectedmat,
783 1.0f, 0.0f, 0.0f, 0.0f,
784 0.0f, 1.0f, 0.0f, 0.0f,
785 0.0f, 0.0f, 1.0f, 0.0f,
786 0.0f, 0.0f, 0.0f, 1.0f);
787 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, &eye, NULL, NULL);
788 expect_matrix(&expectedmat, &gotmat, 0);
789
790 set_matrix(&expectedmat,
791 1.0f, 0.0f, 0.0f, 0.0f,
792 0.0f, 1.0f, 0.0f, 0.0f,
793 0.0f, 0.0f, 1.0f, 0.0f,
794 0.0f, 0.0f, 0.0f, 1.0f);
795 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, &eye, NULL, NULL);
796 expect_matrix(&expectedmat, &gotmat, 0);
797
798 set_matrix(&expectedmat,
799 25521.0f, 39984.0f, 20148.0f, 0.0f,
800 39984.0f, 4933.0f, -3324.0f, 0.0f,
801 20148.0f, -3324.0f, -5153.0f, 0.0f,
802 0.0f, 0.0f, 0.0f, 1.0f);
803 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
804 expect_matrix(&expectedmat, &gotmat, 0);
805
806 set_matrix(&expectedmat,
807 1.0f, 0.0f, 0.0f, 0.0f,
808 0.0f, -3.0f, 0.0f, 0.0f,
809 0.0f, 0.0f, 7.0f, 0.0f,
810 0.0f, 52.0f, 54.0f, 1.0f);
811 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, NULL, NULL, NULL);
812 expect_matrix(&expectedmat, &gotmat, 0);
813
814 set_matrix(&expectedmat,
815 1.0f, 0.0f, 0.0f, 0.0f,
816 0.0f, 1.0f, 0.0f, 0.0f,
817 0.0f, 0.0f, 1.0f, 0.0f,
818 0.0f, 0.0f, 0.0f, 1.0f);
819 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, NULL, NULL, NULL);
820 expect_matrix(&expectedmat, &gotmat, 0);
821
822 set_matrix(&expectedmat,
823 -0.2148f, 1.3116f, 0.4752f, 0.0f,
824 0.9504f, -0.8836f, 0.9244f, 0.0f,
825 1.0212f, 0.1936f, -1.3588f, 0.0f,
826 18.2985f, -29.624001f, 15.683499f, 1.0f);
827 D3DXMatrixTransformation(&gotmat, NULL, NULL, NULL, &eye, &r, &last);
828 expect_matrix(&expectedmat, &gotmat, 8);
829
830 set_matrix(&expectedmat,
831 -0.2148f, 1.3116f, 0.4752f, 0.0f,
832 -2.8512f, 2.6508f, -2.7732f, 0.0f,
833 7.148399f, 1.3552f, -9.5116f, 0.0f,
834 9.7f, -8.6f, 1.3f, 1.0f);
835 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, NULL, &r, &last);
836 expect_matrix(&expectedmat, &gotmat, 8);
837
838 set_matrix(&expectedmat,
839 -0.2148f, 1.3116f, 0.4752f, 0.0f,
840 0.9504f, -0.8836f, 0.9244f, 0.0f,
841 1.0212f, 0.1936f, -1.3588f, 0.0f,
842 9.7f, -8.6f, 1.3f, 1.0f);
843 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, NULL, &r, &last);
844 expect_matrix(&expectedmat, &gotmat, 8);
845
846 set_matrix(&expectedmat,
847 -0.2148f, 1.3116f, 0.4752f, 0.0f,
848 0.9504f, -0.8836f, 0.9244f, 0.0f,
849 1.0212f, 0.1936f, -1.3588f, 0.0f,
850 9.7f, -8.6f, 1.3f, 1.0f);
851 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, NULL, &r, &last);
852 expect_matrix(&expectedmat, &gotmat, 8);
853
854 set_matrix(&expectedmat,
855 1.0f, 0.0f, 0.0f, 0.0f,
856 0.0f, -3.0f, 0.0f, 0.0f,
857 0.0f, 0.0f, 7.0f, 0.0f,
858 9.7f, -8.6f, 1.3f, 1.0f);
859 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, &eye, NULL, &last);
860 expect_matrix(&expectedmat, &gotmat, 0);
861
862 set_matrix(&expectedmat,
863 1.0f, 0.0f, 0.0f, 0.0f,
864 0.0f, 1.0f, 0.0f, 0.0f,
865 0.0f, 0.0f, 1.0f, 0.0f,
866 9.7f, -8.6f, 1.3f, 1.0f);
867 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, &eye, NULL, &last);
868 expect_matrix(&expectedmat, &gotmat, 0);
869
870 set_matrix(&expectedmat,
871 1.0f, 0.0f, 0.0f, 0.0f,
872 0.0f, 1.0f, 0.0f, 0.0f,
873 0.0f, 0.0f, 1.0f, 0.0f,
874 9.7f, -8.6f, 1.3f, 1.0f);
875 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, &eye, NULL, &last);
876 expect_matrix(&expectedmat, &gotmat, 0);
877
878 set_matrix(&expectedmat,
879 25521.0f, 39984.0f, 20148.0f, 0.0f,
880 39984.0f, 4933.0f, -3324.0f, 0.0f,
881 20148.0f, -3324.0f, -5153.0f, 0.0f,
882 9.7f, -8.6f, 1.3f, 1.0f);
883 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, &last);
884 expect_matrix(&expectedmat, &gotmat, 0);
885
886 set_matrix(&expectedmat,
887 1.0f, 0.0f, 0.0f, 0.0f,
888 0.0f, -3.0f, 0.0f, 0.0f,
889 0.0f, 0.0f, 7.0f, 0.0f,
890 9.7f, 43.400002f, 55.299999f, 1.0f);
891 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, NULL, NULL, &last);
892 expect_matrix(&expectedmat, &gotmat, 0);
893
894 set_matrix(&expectedmat,
895 1.0f, 0.0f, 0.0f, 0.0f,
896 0.0f, 1.0f, 0.0f, 0.0f,
897 0.0f, 0.0f, 1.0f, 0.0f,
898 9.7f, -8.6f, 1.3f, 1.0f);
899 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, NULL, NULL, &last);
900 expect_matrix(&expectedmat, &gotmat, 0);
901
902 set_matrix(&expectedmat,
903 -0.2148f, 1.3116f, 0.4752f, 0.0f,
904 -2.8512f, 2.6508f, -2.7732f, 0.0f,
905 7.148399f, 1.3552f, -9.5116f, 0.0f,
906 8.5985f, -21.024f, 14.383499, 1.0f);
907 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, &eye, &r, NULL);
908 expect_matrix(&expectedmat, &gotmat, 8);
909
910 set_matrix(&expectedmat,
911 -0.2148f, 1.3116f, 0.4752f, 0.0f,
912 0.9504f, -0.8836f, 0.9244f, 0.0f,
913 1.0212f, 0.1936f, -1.3588f, 0.0f,
914 8.5985f, -21.024f, 14.383499, 1.0f);
915 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, &eye, &r, NULL);
916 expect_matrix(&expectedmat, &gotmat, 8);
917
918 set_matrix(&expectedmat,
919 -0.2148f, 1.3116f, 0.4752f, 0.0f,
920 0.9504f, -0.8836f, 0.9244f, 0.0f,
921 1.0212f, 0.1936f, -1.3588f, 0.0f,
922 8.5985f, -21.024f, 14.383499, 1.0f);
923 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, &eye, &r, NULL);
924 expect_matrix(&expectedmat, &gotmat, 8);
925
926 set_matrix(&expectedmat,
927 53094.015625f, 2044.133789f, 21711.687500f, 0.0f,
928 -7294.705078f, 47440.683594f, 28077.113281, 0.0f,
929 -12749.161133f, 28365.580078f, 13503.520508f, 0.0f,
930 0.0f, 0.0f, 0.0f, 1.0f);
931 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, &r, NULL);
932 expect_matrix(&expectedmat, &gotmat, 32);
933
934 set_matrix(&expectedmat,
935 -0.2148f, 1.3116f, 0.4752f, 0.0f,
936 -2.8512f, 2.6508f, -2.7732f, 0.0f,
937 7.148399f, 1.3552f, -9.5116f, 0.0f,
938 104.565598f, -35.492798f, -25.306400f, 1.0f);
939 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, NULL, &r, NULL);
940 expect_matrix(&expectedmat, &gotmat, 8);
941
942 set_matrix(&expectedmat,
943 -0.2148f, 1.3116f, 0.4752f, 0.0f,
944 0.9504f, -0.8836f, 0.9244f, 0.0f,
945 1.0212f, 0.1936f, -1.3588f, 0.0f,
946 0.0f, 0.0f, 0.0f, 1.0f);
947 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, NULL, &r, NULL);
948 expect_matrix(&expectedmat, &gotmat, 8);
949
950 set_matrix(&expectedmat,
951 25521.0f, 39984.0f, 20148.0f, 0.0f,
952 39984.0f, 4933.0f, -3324.0f, 0.0f,
953 20148.0f, -3324.0f, -5153.0f, 0.0f,
954 0.0f, 0.0f, 0.0f, 1.0f);
955 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, &eye, NULL, NULL);
956 expect_matrix(&expectedmat, &gotmat, 0);
957
958 set_matrix(&expectedmat,
959 1.0f, 0.0f, 0.0f, 0.0f,
960 0.0f, -3.0f, 0.0f, 0.0f,
961 0.0f, 0.0f, 7.0f, 0.0f,
962 0.0f, 52.0f, 54.0f, 1.0f);
963 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, &eye, NULL, NULL);
964 expect_matrix(&expectedmat, &gotmat, 0);
965
966 set_matrix(&expectedmat,
967 1.0f, 0.0f, 0.0f, 0.0f,
968 0.0f, 1.0f, 0.0f, 0.0f,
969 0.0f, 0.0f, 1.0f, 0.0f,
970 0.0f, 0.0f, 0.0f, 1.0f);
971 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, &eye, NULL, NULL);
972 expect_matrix(&expectedmat, &gotmat, 0);
973
974 set_matrix(&expectedmat,
975 25521.0f, 39984.0f, 20148.0f, 0.0f,
976 39984.0f, 4933.0f, -3324.0f, 0.0f,
977 20148.0f, -3324.0f, -5153.0f, 0.0f,
978 -287420.0f, -14064.0f, 37122.0f, 1.0f);
979 D3DXMatrixTransformation(&gotmat, &at, &q, &axis, NULL, NULL, NULL);
980 expect_matrix(&expectedmat, &gotmat, 0);
981
982 set_matrix(&expectedmat,
983 -0.2148f, 1.3116f, 0.4752f, 0.0f,
984 -2.8512f, 2.6508f, -2.7732f, 0.0f,
985 7.148399f, 1.3552f, -9.5116f, 0.0f,
986 18.2985f, -29.624001f, 15.683499f, 1.0f);
987 D3DXMatrixTransformation(&gotmat, NULL, NULL, &axis, &eye, &r, &last);
988 expect_matrix(&expectedmat, &gotmat, 8);
989
990 set_matrix(&expectedmat,
991 -0.2148f, 1.3116f, 0.4752f, 0.0f,
992 0.9504f, -0.8836f, 0.9244f, 0.0f,
993 1.0212f, 0.1936f, -1.3588f, 0.0f,
994 18.2985f, -29.624001f, 15.683499f, 1.0f);
995 D3DXMatrixTransformation(&gotmat, NULL, &q, NULL, &eye, &r, &last);
996 expect_matrix(&expectedmat, &gotmat, 8);
997
998 set_matrix(&expectedmat,
999 -0.2148f, 1.3116f, 0.4752f, 0.0f,
1000 0.9504f, -0.8836f, 0.9244f, 0.0f,
1001 1.0212f, 0.1936f, -1.3588f, 0.0f,
1002 18.2985f, -29.624001f, 15.683499f, 1.0f);
1003 D3DXMatrixTransformation(&gotmat, &at, NULL, NULL, &eye, &r, &last);
1004 expect_matrix(&expectedmat, &gotmat, 8);
1005
1006 set_matrix(&expectedmat,
1007 53094.015625f, 2044.133789f, 21711.687500f, 0.0f,
1008 -7294.705078f, 47440.683594f, 28077.113281, 0.0f,
1009 -12749.161133f, 28365.580078f, 13503.520508f, 0.0f,
1010 9.7f, -8.6f, 1.3f, 1.0f);
1011 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, &r, &last);
1012 expect_matrix(&expectedmat, &gotmat, 32);
1013
1014 set_matrix(&expectedmat,
1015 -0.2148f, 1.3116f, 0.4752f, 0.0f,
1016 -2.8512f, 2.6508f, -2.7732f, 0.0f,
1017 7.148399f, 1.3552f, -9.5116f, 0.0f,
1018 114.265594f, -44.092796f, -24.006401f, 1.0f);
1019 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, NULL, &r, &last);
1020 expect_matrix(&expectedmat, &gotmat, 8);
1021
1022 set_matrix(&expectedmat,
1023 -0.2148f, 1.3116f, 0.4752f, 0.0f,
1024 0.9504f, -0.8836f, 0.9244f, 0.0f,
1025 1.0212f, 0.1936f, -1.3588f, 0.0f,
1026 9.7f, -8.6f, 1.3f, 1.0f);
1027 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, NULL, &r, &last);
1028 expect_matrix(&expectedmat, &gotmat, 8);
1029
1030 set_matrix(&expectedmat,
1031 25521.0f, 39984.0f, 20148.0f, 0.0f,
1032 39984.0f, 4933.0f, -3324.0f, 0.0f,
1033 20148.0f, -3324.0f, -5153.0f, 0.0f,
1034 9.7f, -8.6f, 1.3f, 1.0f);
1035 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, &eye, NULL, &last);
1036 expect_matrix(&expectedmat, &gotmat, 0);
1037
1038 set_matrix(&expectedmat,
1039 1.0f, 0.0f, 0.0f, 0.0f,
1040 0.0f, -3.0f, 0.0f, 0.0f,
1041 0.0f, 0.0f, 7.0f, 0.0f,
1042 9.7f, 43.400002f, 55.299999f, 1.0f);
1043 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, &eye, NULL, &last);
1044 expect_matrix(&expectedmat, &gotmat, 0);
1045
1046 set_matrix(&expectedmat,
1047 1.0f, 0.0f, 0.0f, 0.0f,
1048 0.0f, 1.0f, 0.0f, 0.0f,
1049 0.0f, 0.0f, 1.0f, 0.0f,
1050 9.7f, -8.6f, 1.3f, 1.0f);
1051 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, &eye, NULL, &last);
1052 expect_matrix(&expectedmat, &gotmat, 0);
1053
1054 set_matrix(&expectedmat,
1055 25521.0f, 39984.0f, 20148.0f, 0.0f,
1056 39984.0f, 4933.0f, -3324.0f, 0.0f,
1057 20148.0f, -3324.0f, -5153.0f, 0.0f,
1058 -287410.3125f, -14072.599609f, 37123.300781f, 1.0f);
1059 D3DXMatrixTransformation(&gotmat, &at, &q, &axis, NULL, NULL, &last);
1060 expect_matrix(&expectedmat, &gotmat, 0);
1061
1062 set_matrix(&expectedmat,
1063 53094.015625f, 2044.133789f, 21711.687500f, 0.0f,
1064 -7294.705078f, 47440.683594f, 28077.113281, 0.0f,
1065 -12749.161133f, 28365.580078f, 13503.520508f, 0.0f,
1066 8.598499f, -21.024f, 14.383499f, 1.0f);
1067 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, &eye, &r, NULL);
1068 expect_matrix(&expectedmat, &gotmat, 32);
1069
1070 set_matrix(&expectedmat,
1071 -0.2148f, 1.3116f, 0.4752f, 0.0f,
1072 -2.8512f, 2.6508f, -2.7732f, 0.0f,
1073 7.148399f, 1.3552f, -9.5116f, 0.0f,
1074 113.164093f, -56.5168f, -10.922897f, 1.0f);
1075 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, &eye, &r, NULL);
1076 expect_matrix(&expectedmat, &gotmat, 8);
1077
1078 set_matrix(&expectedmat,
1079 -0.2148f, 1.3116f, 0.4752f, 0.0f,
1080 0.9504f, -0.8836f, 0.9244f, 0.0f,
1081 1.0212f, 0.1936f, -1.3588f, 0.0f,
1082 8.5985f, -21.024f, 14.383499, 1.0f);
1083 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, &eye, &r, NULL);
1084 expect_matrix(&expectedmat, &gotmat, 8);
1085
1086 set_matrix(&expectedmat,
1087 53094.015625f, 2044.133789f, 21711.687500f, 0.0f,
1088 -7294.705078f, 47440.683594f, 28077.113281, 0.0f,
1089 -12749.161133f, 28365.580078f, 13503.520508f, 0.0f,
1090 86280.34375f, -357366.3125f, -200024.125f, 1.0f);
1091 D3DXMatrixTransformation(&gotmat, &at, &q, &axis, NULL, &r, NULL);
1092 expect_matrix(&expectedmat, &gotmat, 32);
1093
1094 set_matrix(&expectedmat,
1095 25521.0f, 39984.0f, 20148.0f, 0.0f,
1096 39984.0f, 4933.0f, -3324.0f, 0.0f,
1097 20148.0f, -3324.0f, -5153.0f, 0.0f,
1098 -287410.3125f, -14064.0f, 37122.0f, 1.0f);
1099 D3DXMatrixTransformation(&gotmat, &at, &q, &axis, &eye, NULL, NULL);
1100 expect_matrix(&expectedmat, &gotmat, 512);
1101
1102 set_matrix(&expectedmat,
1103 53094.015625f, 2044.133789f, 21711.687500f, 0.0f,
1104 -7294.705078f, 47440.683594f, 28077.113281, 0.0f,
1105 -12749.161133f, 28365.580078f, 13503.520508f, 0.0f,
1106 86280.34375f, -357366.3125f, -200009.75f, 1.0f);
1107 D3DXMatrixTransformation(&gotmat, &at, &q, &axis, &eye, &r, NULL);
1108 expect_matrix(&expectedmat, &gotmat, 2048);
1109
1110 set_matrix(&expectedmat,
1111 25521.0f, 39984.0f, 20148.0f, 0.0f,
1112 39984.0f, 4933.0f, -3324.0f, 0.0f,
1113 20148.0f, -3324.0f, -5153.0f, 0.0f,
1114 -287410.3125f, -14072.599609f, 37123.300781f, 1.0f);
1115 D3DXMatrixTransformation(&gotmat, &at, &q, &axis, &eye, NULL, &last);
1116 expect_matrix(&expectedmat, &gotmat, 0);
1117
1118 set_matrix(&expectedmat,
1119 53094.015625f, 2044.133789f, 21711.687500f, 0.0f,
1120 -7294.705078f, 47440.683594f, 28077.113281, 0.0f,
1121 -12749.161133f, 28365.580078f, 13503.520508f, 0.0f,
1122 86290.046875f, -357374.90625f, -200022.828125f, 1.0f);
1123 D3DXMatrixTransformation(&gotmat, &at, &q, &axis, NULL, &r, &last);
1124 expect_matrix(&expectedmat, &gotmat, 32);
1125
1126 set_matrix(&expectedmat,
1127 -0.21480007f, 1.3116000f, 0.47520003f, 0.0f,
1128 0.95040143f, -0.88360137f, 0.92439979f, 0.0f,
1129 1.0212044f, 0.19359307f, -1.3588026f, 0.0f,
1130 18.298532f, -29.624001f, 15.683499f, 1.0f);
1131 D3DXMatrixTransformation(&gotmat, &at, &q, NULL, &eye, &r, &last);
1132 expect_matrix(&expectedmat, &gotmat, 512);
1133
1134 set_matrix(&expectedmat,
1135 -0.2148f, 1.3116f, 0.4752f, 0.0f,
1136 -2.8512f, 2.6508f, -2.7732f, 0.0f,
1137 7.148399f, 1.3552f, -9.5116f, 0.0f,
1138 122.86409f, -65.116798f, -9.622897f, 1.0f);
1139 D3DXMatrixTransformation(&gotmat, &at, NULL, &axis, &eye, &r, &last);
1140 expect_matrix(&expectedmat, &gotmat, 8);
1141
1142 set_matrix(&expectedmat,
1143 53094.015625f, 2044.133789f, 21711.687500f, 0.0f,
1144 -7294.705078f, 47440.683594f, 28077.113281, 0.0f,
1145 -12749.161133f, 28365.580078f, 13503.520508f, 0.0f,
1146 18.2985f, -29.624001f, 15.683499f, 1.0f);
1147 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, &eye, &r, &last);
1148 expect_matrix(&expectedmat, &gotmat, 32);
1149
1150 q.x = 1.0f; q.y = 1.0f; q.z = 1.0f; q.w = 1.0f;
1151 axis.x = 1.0f; axis.y = 1.0f; axis.z = 2.0f;
1152
1153 set_matrix(&expectedmat,
1154 41.0f, -12.0f, -24.0f, 0.0f,
1155 -12.0f, 25.0f, -12.0f, 0.0f,
1156 -24.0f, -12.0f, 34.0f, 0.0f,
1157 0.0f, 0.0f, 0.0f, 1.0f);
1158 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1159 expect_matrix(&expectedmat, &gotmat, 0);
1160
1161 q.x = 1.0f; q.y = 1.0f; q.z = 1.0f; q.w = 1.0f;
1162 axis.x = 1.0f; axis.y = 1.0f; axis.z = 3.0f;
1163
1164 set_matrix(&expectedmat,
1165 57.0f, -12.0f, -36.0f, 0.0f,
1166 -12.0f, 25.0f, -12.0f, 0.0f,
1167 -36.0f, -12.0f, 43.0f, 0.0f,
1168 0.0f, 0.0f, 0.0f, 1.0f);
1169 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1170 expect_matrix(&expectedmat, &gotmat, 0);
1171
1172 q.x = 1.0f; q.y = 1.0f; q.z = 1.0f; q.w = 0.0f;
1173 axis.x = 1.0f; axis.y = 1.0f; axis.z = 3.0f;
1174
1175 set_matrix(&expectedmat,
1176 25.0f, 0.0f, -20.0f, 0.0f,
1177 0.0f, 25.0f, -20.0f, 0.0f,
1178 -20.0f, -20.0f, 35.0f, 0.0f,
1179 0.0f, 0.0f, 0.0f, 1.0f);
1180 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1181 expect_matrix(&expectedmat, &gotmat, 0);
1182
1183 q.x = 1.0f; q.y = 1.0f; q.z = 0.0f; q.w = 0.0f;
1184 axis.x = 1.0f; axis.y = 1.0f; axis.z = 3.0f;
1185
1186 set_matrix(&expectedmat,
1187 5.0f, -4.0f, 0.0f, 0.0f,
1188 -4.0f, 5.0f, 0.0f, 0.0f,
1189 0.0f, 0.0f, 27.0f, 0.0f,
1190 0.0f, 0.0f, 0.0f, 1.0f);
1191 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1192 expect_matrix(&expectedmat, &gotmat, 0);
1193
1194 q.x = 1.0f; q.y = 0.0f; q.z = 0.0f; q.w = 0.0f;
1195 axis.x = 5.0f; axis.y = 2.0f; axis.z = 1.0f;
1196
1197 set_matrix(&expectedmat,
1198 5.0f, 0.0f, 0.0f, 0.0f,
1199 0.0f, 2.0f, 0.0f, 0.0f,
1200 0.0f, 0.0f, 1.0f, 0.0f,
1201 0.0f, 0.0f, 0.0f, 1.0f);
1202 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1203 expect_matrix(&expectedmat, &gotmat, 0);
1204
1205 q.x = 1.0f; q.y = 0.0f; q.z = 0.0f; q.w = 0.0f;
1206 axis.x = 1.0f; axis.y = 4.0f; axis.z = 1.0f;
1207
1208 set_matrix(&expectedmat,
1209 1.0f, 0.0f, 0.0f, 0.0f,
1210 0.0f, 4.0f, 0.0f, 0.0f,
1211 0.0f, 0.0f, 1.0f, 0.0f,
1212 0.0f, 0.0f, 0.0f, 1.0f);
1213 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1214 expect_matrix(&expectedmat, &gotmat, 0);
1215
1216 q.x = 0.0f; q.y = 1.0f; q.z = 0.0f; q.w = 0.0f;
1217 axis.x = 1.0f; axis.y = 4.0f; axis.z = 1.0f;
1218
1219 set_matrix(&expectedmat,
1220 1.0f, 0.0f, 0.0f, 0.0f,
1221 0.0f, 4.0f, 0.0f, 0.0f,
1222 0.0f, 0.0f, 1.0f, 0.0f,
1223 0.0f, 0.0f, 0.0f, 1.0f);
1224 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1225 expect_matrix(&expectedmat, &gotmat, 0);
1226
1227 q.x = 1.0f; q.y = 0.0f; q.z = 0.0f; q.w = 1.0f;
1228 axis.x = 1.0f; axis.y = 4.0f; axis.z = 1.0f;
1229
1230 set_matrix(&expectedmat,
1231 1.0f, 0.0f, 0.0f, 0.0f,
1232 0.0f, 8.0f, -6.0f, 0.0f,
1233 0.0f, -6.0f, 17.0f, 0.0f,
1234 0.0f, 0.0f, 0.0f, 1.0f);
1235 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1236 expect_matrix(&expectedmat, &gotmat, 0);
1237
1238 q.x = 1.0f; q.y = 0.0f; q.z = 0.0f; q.w = 1.0f;
1239 axis.x = 0.0f; axis.y = 4.0f; axis.z = 0.0f;
1240
1241 set_matrix(&expectedmat,
1242 0.0f, 0.0f, 0.0f, 0.0f,
1243 0.0f, 4.0f, -8.0f, 0.0f,
1244 0.0f, -8.0f, 16.0f, 0.0f,
1245 0.0f, 0.0f, 0.0f, 1.0f);
1246 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1247 expect_matrix(&expectedmat, &gotmat, 0);
1248
1249 q.x = 0.0f; q.y = 1.0f; q.z = 0.0f; q.w = 1.0f;
1250 axis.x = 1.0f; axis.y = 4.0f; axis.z = 1.0f;
1251
1252 set_matrix(&expectedmat,
1253 5.0f, 0.0f, 0.0f, 0.0f,
1254 0.0f, 4.0f, 0.0f, 0.0f,
1255 0.0f, 0.0f, 5.0f, 0.0f,
1256 0.0f, 0.0f, 0.0f, 1.0f);
1257 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1258 expect_matrix(&expectedmat, &gotmat, 0);
1259
1260 q.x = 1.0f; q.y = 0.0f; q.z = 0.0f; q.w = 0.0f;
1261 axis.x = 1.0f; axis.y = 1.0f; axis.z = 3.0f;
1262
1263 set_matrix(&expectedmat,
1264 1.0f, 0.0f, 0.0f, 0.0f,
1265 0.0f, 1.0f, 0.0f, 0.0f,
1266 0.0f, 0.0f, 3.0f, 0.0f,
1267 0.0f, 0.0f, 0.0f, 1.0f);
1268 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1269 expect_matrix(&expectedmat, &gotmat, 0);
1270
1271 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1272 axis.x = 3.0f; axis.y = 3.0f; axis.z = 3.0f;
1273
1274 set_matrix(&expectedmat,
1275 3796587.0f, -1377948.0f, -1589940.0f, 0.0f,
1276 -1377948.0f, 3334059.0f, -1879020.0f, 0.0f,
1277 -1589940.0f, -1879020.0f, 2794443.0f, 0.0f,
1278 0.0f, 0.0f, 0.0f, 1.0f);
1279 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1280 expect_matrix(&expectedmat, &gotmat, 0);
1281
1282 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1283 axis.x = 1.0f; axis.y = 1.0f; axis.z = 1.0f;
1284
1285 set_matrix(&expectedmat,
1286 1265529.0f, -459316.0f, -529980.0f, 0.0f,
1287 -459316.0f, 1111353.0f, -626340.0f, 0.0f,
1288 -529980.0f, -626340.0f, 931481.0f, 0.0f,
1289 0.0f, 0.0f, 0.0f, 1.0f);
1290 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1291 expect_matrix(&expectedmat, &gotmat, 0);
1292
1293 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1294 axis.x = 1.0f; axis.y = 1.0f; axis.z = 3.0f;
1295
1296 set_matrix(&expectedmat,
1297 2457497.0f, -434612.0f, -1423956.0f, 0.0f,
1298 -434612.0f, 1111865.0f, -644868.0f, 0.0f,
1299 -1423956.0f, -644868.0f, 1601963.0f, 0.0f,
1300 0.0f, 0.0f, 0.0f, 1.0f);
1301 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1302 expect_matrix(&expectedmat, &gotmat, 0);
1303
1304 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1305 axis.x = 0.0f; axis.y = 0.0f; axis.z = 3.0f;
1306
1307 set_matrix(&expectedmat,
1308 1787952.0f, 37056.0f, -1340964.0f, 0.0f,
1309 37056.0f, 768.0f, -27792.0f, 0.0f,
1310 -1340964.0f, -27792.0f, 1005723.0f, 0.0f,
1311 0.0f, 0.0f, 0.0f, 1.0f);
1312 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1313 expect_matrix(&expectedmat, &gotmat, 0);
1314
1315 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1316 axis.x = 0.0f; axis.y = 0.0f; axis.z = 1.0f;
1317
1318 set_matrix(&expectedmat,
1319 595984.0f, 12352.0f, -446988.0f, 0.0f,
1320 12352.0f, 256.0f, -9264.0f, 0.0f,
1321 -446988.0f, -9264.0f, 335241.0f, 0.0f,
1322 0.0f, 0.0f, 0.0f, 1.0f);
1323 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1324 expect_matrix(&expectedmat, &gotmat, 0);
1325
1326 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1327 axis.x = 0.0f; axis.y = 3.0f; axis.z = 0.0f;
1328
1329 set_matrix(&expectedmat,
1330 150528.0f, 464352.0f, -513408.0f, 0.0f,
1331 464352.0f, 1432443.0f, -1583772.0f, 0.0f,
1332 -513408.0f, -1583772.0f, 1751088.0f, 0.0f,
1333 0.0f, 0.0f, 0.0f, 1.0f);
1334 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1335 expect_matrix(&expectedmat, &gotmat, 0);
1336
1337 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1338 axis.x = 0.0f; axis.y = 1.0f; axis.z = 0.0f;
1339
1340 set_matrix(&expectedmat,
1341 50176.0f, 154784.0f, -171136.0f, 0.0f,
1342 154784.0f, 477481.0f, -527924.0f, 0.0f,
1343 -171136.0f, -527924.0f, 583696.0f, 0.0f,
1344 0.0f, 0.0f, 0.0f, 1.0f);
1345 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1346 expect_matrix(&expectedmat, &gotmat, 0);
1347
1348 q.x = 11.0f; q.y = 13.0f; q.z = 15.0f; q.w = 17.0f;
1349 axis.x = 1.0f; axis.y = 0.0f; axis.z = 0.0f;
1350
1351 set_matrix(&expectedmat,
1352 619369.0f, -626452.0f, 88144.0f, 0.0f,
1353 -626452.0f, 633616.0f, -89152.0f, 0.0f,
1354 88144.0f, -89152, 12544.0f, 0.0f,
1355 0.0f, 0.0f, 0.0f, 1.0f);
1356 D3DXMatrixTransformation(&gotmat, NULL, &q, &axis, NULL, NULL, NULL);
1357 expect_matrix(&expectedmat, &gotmat, 0);
1358
1359 /*____________D3DXMatrixTranslation______________*/
1360 set_matrix(&expectedmat,
1361 1.0f, 0.0f, 0.0f, 0.0f,
1362 0.0f, 1.0f, 0.0f, 0.0f,
1363 0.0f, 0.0f, 1.0f, 0.0f,
1364 0.69f, 0.53f, 4.11f, 1.0f);
1365 D3DXMatrixTranslation(&gotmat, 0.69f, 0.53f, 4.11f);
1366 expect_matrix(&expectedmat, &gotmat, 0);
1367
1368 /*____________D3DXMatrixTranspose______________*/
1369 set_matrix(&expectedmat,
1370 10.0f, 11.0f, 19.0f, 2.0f,
1371 5.0f, 20.0f, -21.0f, 3.0f,
1372 7.0f, 16.0f, 30.f, -4.0f,
1373 8.0f, 33.0f, 43.0f, -40.0f);
1374 D3DXMatrixTranspose(&gotmat, &mat);
1375 expect_matrix(&expectedmat, &gotmat, 0);
1376 }
1377
D3DXPlaneTest(void)1378 static void D3DXPlaneTest(void)
1379 {
1380 D3DXMATRIX mat;
1381 D3DXPLANE expectedplane, gotplane, nulplane, plane;
1382 D3DXVECTOR3 expectedvec, gotvec, vec1, vec2, vec3;
1383 LPD3DXVECTOR3 funcpointer;
1384 D3DXVECTOR4 vec;
1385 FLOAT expected, got;
1386
1387 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1388 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1389 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1390 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1391 U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f;
1392 U(mat).m[3][3] = -40.0f;
1393
1394 plane.a = -3.0f; plane.b = -1.0f; plane.c = 4.0f; plane.d = 7.0f;
1395
1396 vec.x = 2.0f; vec.y = 5.0f; vec.z = -6.0f; vec.w = 11.0f;
1397
1398 /*_______________D3DXPlaneDot________________*/
1399 expected = 42.0f;
1400 got = D3DXPlaneDot(&plane, &vec);
1401 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1402 expected = 0.0f;
1403 got = D3DXPlaneDot(NULL, &vec);
1404 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1405 expected = 0.0f;
1406 got = D3DXPlaneDot(NULL, NULL);
1407 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1408
1409 /*_______________D3DXPlaneDotCoord________________*/
1410 expected = -28.0f;
1411 got = D3DXPlaneDotCoord(&plane, &vec);
1412 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1413 expected = 0.0f;
1414 got = D3DXPlaneDotCoord(NULL, &vec);
1415 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1416 expected = 0.0f;
1417 got = D3DXPlaneDotCoord(NULL, NULL);
1418 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1419
1420 /*_______________D3DXPlaneDotNormal______________*/
1421 expected = -35.0f;
1422 got = D3DXPlaneDotNormal(&plane, &vec);
1423 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1424 expected = 0.0f;
1425 got = D3DXPlaneDotNormal(NULL, &vec);
1426 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1427 expected = 0.0f;
1428 got = D3DXPlaneDotNormal(NULL, NULL);
1429 ok( expected == got, "Expected : %f, Got : %f\n",expected, got);
1430
1431 /*_______________D3DXPlaneFromPointNormal_______*/
1432 vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f;
1433 vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f;
1434 expectedplane.a = 17.0f; expectedplane.b = 31.0f; expectedplane.c = 24.0f; expectedplane.d = -950.0f;
1435 D3DXPlaneFromPointNormal(&gotplane, &vec1, &vec2);
1436 expect_plane(&expectedplane, &gotplane, 0);
1437 gotplane.a = vec2.x; gotplane.b = vec2.y; gotplane.c = vec2.z;
1438 D3DXPlaneFromPointNormal(&gotplane, &vec1, (D3DXVECTOR3 *)&gotplane);
1439 expect_plane(&expectedplane, &gotplane, 0);
1440 gotplane.a = vec1.x; gotplane.b = vec1.y; gotplane.c = vec1.z;
1441 expectedplane.d = -1826.0f;
1442 D3DXPlaneFromPointNormal(&gotplane, (D3DXVECTOR3 *)&gotplane, &vec2);
1443 expect_plane(&expectedplane, &gotplane, 0);
1444
1445 /*_______________D3DXPlaneFromPoints_______*/
1446 vec1.x = 1.0f; vec1.y = 2.0f; vec1.z = 3.0f;
1447 vec2.x = 1.0f; vec2.y = -6.0f; vec2.z = -5.0f;
1448 vec3.x = 83.0f; vec3.y = 74.0f; vec3.z = 65.0f;
1449 expectedplane.a = 0.085914f; expectedplane.b = -0.704492f; expectedplane.c = 0.704492f; expectedplane.d = -0.790406f;
1450 D3DXPlaneFromPoints(&gotplane,&vec1,&vec2,&vec3);
1451 expect_plane(&expectedplane, &gotplane, 64);
1452
1453 /*_______________D3DXPlaneIntersectLine___________*/
1454 vec1.x = 9.0f; vec1.y = 6.0f; vec1.z = 3.0f;
1455 vec2.x = 2.0f; vec2.y = 5.0f; vec2.z = 8.0f;
1456 expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f;
1457 D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2);
1458 expect_vec3(&expectedvec, &gotvec, 1);
1459 /* Test a parallel line */
1460 vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f;
1461 vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f;
1462 expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f;
1463 funcpointer = D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2);
1464 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1465
1466 /*_______________D3DXPlaneNormalize______________*/
1467 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);
1468 D3DXPlaneNormalize(&gotplane, &plane);
1469 expect_plane(&expectedplane, &gotplane, 2);
1470 nulplane.a = 0.0; nulplane.b = 0.0f; nulplane.c = 0.0f; nulplane.d = 0.0f;
1471 expectedplane.a = 0.0f; expectedplane.b = 0.0f; expectedplane.c = 0.0f; expectedplane.d = 0.0f;
1472 D3DXPlaneNormalize(&gotplane, &nulplane);
1473 expect_plane(&expectedplane, &gotplane, 0);
1474
1475 /*_______________D3DXPlaneTransform____________*/
1476 expectedplane.a = 49.0f; expectedplane.b = -98.0f; expectedplane.c = 55.0f; expectedplane.d = -165.0f;
1477 D3DXPlaneTransform(&gotplane,&plane,&mat);
1478 expect_plane(&expectedplane, &gotplane, 0);
1479 }
1480
D3DXQuaternionTest(void)1481 static void D3DXQuaternionTest(void)
1482 {
1483 D3DXMATRIX mat;
1484 D3DXQUATERNION expectedquat, gotquat, Nq, Nq1, nul, smallq, smallr, q, r, s, t, u;
1485 BOOL expectedbool, gotbool, equal;
1486 float angle, got, scale, scale2;
1487 LPD3DXQUATERNION funcpointer;
1488 D3DXVECTOR3 axis, expectedvec;
1489
1490 nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f; nul.w = 0.0f;
1491 q.x = 1.0f; q.y = 2.0f; q.z = 4.0f; q.w = 10.0f;
1492 r.x = -3.0f; r.y = 4.0f; r.z = -5.0f; r.w = 7.0;
1493 t.x = -1111.0f; t.y = 111.0f; t.z = -11.0f; t.w = 1.0f;
1494 u.x = 91.0f; u.y = - 82.0f; u.z = 7.3f; u.w = -6.4f;
1495 smallq.x = 0.1f; smallq.y = 0.2f; smallq.z= 0.3f; smallq.w = 0.4f;
1496 smallr.x = 0.5f; smallr.y = 0.6f; smallr.z= 0.7f; smallr.w = 0.8f;
1497
1498 scale = 0.3f;
1499 scale2 = 0.78f;
1500
1501 /*_______________D3DXQuaternionBaryCentric________________________*/
1502 expectedquat.x = -867.444458; expectedquat.y = 87.851111f; expectedquat.z = -9.937778f; expectedquat.w = 3.235555f;
1503 D3DXQuaternionBaryCentric(&gotquat,&q,&r,&t,scale,scale2);
1504 expect_quaternion(&expectedquat, &gotquat, 1);
1505
1506 /*_______________D3DXQuaternionConjugate________________*/
1507 expectedquat.x = -1.0f; expectedquat.y = -2.0f; expectedquat.z = -4.0f; expectedquat.w = 10.0f;
1508 D3DXQuaternionConjugate(&gotquat,&q);
1509 expect_quaternion(&expectedquat, &gotquat, 0);
1510 /* Test the NULL case */
1511 funcpointer = D3DXQuaternionConjugate(&gotquat,NULL);
1512 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1513 funcpointer = D3DXQuaternionConjugate(NULL,NULL);
1514 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1515
1516 /*_______________D3DXQuaternionDot______________________*/
1517 got = D3DXQuaternionDot(&q,&r);
1518 equal = compare_float(got, 55.0f, 0);
1519 ok(equal, "Got unexpected dot %.8e.\n", got);
1520 /* Tests the case NULL */
1521 got = D3DXQuaternionDot(NULL,&r);
1522 equal = compare_float(got, 0.0f, 0);
1523 ok(equal, "Got unexpected dot %.8e.\n", got);
1524 got = D3DXQuaternionDot(NULL,NULL);
1525 equal = compare_float(got, 0.0f, 0);
1526 ok(equal, "Got unexpected dot %.8e.\n", got);
1527
1528 /*_______________D3DXQuaternionExp______________________________*/
1529 expectedquat.x = -0.216382f; expectedquat.y = -0.432764f; expectedquat.z = -0.8655270f; expectedquat.w = -0.129449f;
1530 D3DXQuaternionExp(&gotquat,&q);
1531 expect_quaternion(&expectedquat, &gotquat, 16);
1532 /* Test the null quaternion */
1533 expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 1.0f;
1534 D3DXQuaternionExp(&gotquat,&nul);
1535 expect_quaternion(&expectedquat, &gotquat, 0);
1536 /* Test the case where the norm of the quaternion is <1 */
1537 Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w= 0.9f;
1538 expectedquat.x = 0.195366; expectedquat.y = 0.097683f; expectedquat.z = 0.293049f; expectedquat.w = 0.930813f;
1539 D3DXQuaternionExp(&gotquat,&Nq1);
1540 expect_quaternion(&expectedquat, &gotquat, 8);
1541
1542 /*_______________D3DXQuaternionIdentity________________*/
1543 expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 1.0f;
1544 D3DXQuaternionIdentity(&gotquat);
1545 expect_quaternion(&expectedquat, &gotquat, 0);
1546 /* Test the NULL case */
1547 funcpointer = D3DXQuaternionIdentity(NULL);
1548 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1549
1550 /*_______________D3DXQuaternionInverse________________________*/
1551 expectedquat.x = -1.0f/121.0f; expectedquat.y = -2.0f/121.0f; expectedquat.z = -4.0f/121.0f; expectedquat.w = 10.0f/121.0f;
1552 D3DXQuaternionInverse(&gotquat,&q);
1553 expect_quaternion(&expectedquat, &gotquat, 0);
1554
1555 expectedquat.x = 1.0f; expectedquat.y = 2.0f; expectedquat.z = 4.0f; expectedquat.w = 10.0f;
1556 D3DXQuaternionInverse(&gotquat,&gotquat);
1557 expect_quaternion(&expectedquat, &gotquat, 1);
1558
1559
1560 /*_______________D3DXQuaternionIsIdentity________________*/
1561 s.x = 0.0f; s.y = 0.0f; s.z = 0.0f; s.w = 1.0f;
1562 expectedbool = TRUE;
1563 gotbool = D3DXQuaternionIsIdentity(&s);
1564 ok( expectedbool == gotbool, "Expected boolean : %d, Got bool : %d\n", expectedbool, gotbool);
1565 s.x = 2.3f; s.y = -4.2f; s.z = 1.2f; s.w=0.2f;
1566 expectedbool = FALSE;
1567 gotbool = D3DXQuaternionIsIdentity(&q);
1568 ok( expectedbool == gotbool, "Expected boolean : %d, Got bool : %d\n", expectedbool, gotbool);
1569 /* Test the NULL case */
1570 gotbool = D3DXQuaternionIsIdentity(NULL);
1571 ok(gotbool == FALSE, "Expected boolean: %d, Got boolean: %d\n", FALSE, gotbool);
1572
1573 /*_______________D3DXQuaternionLength__________________________*/
1574 got = D3DXQuaternionLength(&q);
1575 equal = compare_float(got, 11.0f, 0);
1576 ok(equal, "Got unexpected length %.8e.\n", got);
1577 /* Tests the case NULL. */
1578 got = D3DXQuaternionLength(NULL);
1579 equal = compare_float(got, 0.0f, 0);
1580 ok(equal, "Got unexpected length %.8e.\n", got);
1581
1582 /*_______________D3DXQuaternionLengthSq________________________*/
1583 got = D3DXQuaternionLengthSq(&q);
1584 equal = compare_float(got, 121.0f, 0);
1585 ok(equal, "Got unexpected length %.8e.\n", got);
1586 /* Tests the case NULL */
1587 got = D3DXQuaternionLengthSq(NULL);
1588 equal = compare_float(got, 0.0f, 0);
1589 ok(equal, "Got unexpected length %.8e.\n", got);
1590
1591 /*_______________D3DXQuaternionLn______________________________*/
1592 expectedquat.x = 1.0f; expectedquat.y = 2.0f; expectedquat.z = 4.0f; expectedquat.w = 0.0f;
1593 D3DXQuaternionLn(&gotquat,&q);
1594 expect_quaternion(&expectedquat, &gotquat, 0);
1595 expectedquat.x = -3.0f; expectedquat.y = 4.0f; expectedquat.z = -5.0f; expectedquat.w = 0.0f;
1596 D3DXQuaternionLn(&gotquat,&r);
1597 expect_quaternion(&expectedquat, &gotquat, 0);
1598 Nq.x = 1.0f/11.0f; Nq.y = 2.0f/11.0f; Nq.z = 4.0f/11.0f; Nq.w=10.0f/11.0f;
1599 expectedquat.x = 0.093768f; expectedquat.y = 0.187536f; expectedquat.z = 0.375073f; expectedquat.w = 0.0f;
1600 D3DXQuaternionLn(&gotquat,&Nq);
1601 expect_quaternion(&expectedquat, &gotquat, 32);
1602 Nq.x = 0.0f; Nq.y = 0.0f; Nq.z = 0.0f; Nq.w = 1.0f;
1603 expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f;
1604 D3DXQuaternionLn(&gotquat,&Nq);
1605 expect_quaternion(&expectedquat, &gotquat, 0);
1606 Nq.x = 5.4f; Nq.y = 1.2f; Nq.z = -0.3f; Nq.w = -0.3f;
1607 expectedquat.x = 10.616652f; expectedquat.y = 2.359256f; expectedquat.z = -0.589814f; expectedquat.w = 0.0f;
1608 D3DXQuaternionLn(&gotquat,&Nq);
1609 expect_quaternion(&expectedquat, &gotquat, 1);
1610 /* Test the case where the norm of the quaternion is <1 */
1611 Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w = 0.9f;
1612 expectedquat.x = 0.206945f; expectedquat.y = 0.103473f; expectedquat.z = 0.310418f; expectedquat.w = 0.0f;
1613 D3DXQuaternionLn(&gotquat,&Nq1);
1614 expect_quaternion(&expectedquat, &gotquat, 64);
1615 /* Test the case where the real part of the quaternion is -1.0f */
1616 Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w = -1.0f;
1617 expectedquat.x = 0.2f; expectedquat.y = 0.1f; expectedquat.z = 0.3f; expectedquat.w = 0.0f;
1618 D3DXQuaternionLn(&gotquat,&Nq1);
1619 expect_quaternion(&expectedquat, &gotquat, 0);
1620
1621 /*_______________D3DXQuaternionMultiply________________________*/
1622 expectedquat.x = 3.0f; expectedquat.y = 61.0f; expectedquat.z = -32.0f; expectedquat.w = 85.0f;
1623 D3DXQuaternionMultiply(&gotquat,&q,&r);
1624 expect_quaternion(&expectedquat, &gotquat, 0);
1625
1626 /*_______________D3DXQuaternionNormalize________________________*/
1627 expectedquat.x = 1.0f/11.0f; expectedquat.y = 2.0f/11.0f; expectedquat.z = 4.0f/11.0f; expectedquat.w = 10.0f/11.0f;
1628 D3DXQuaternionNormalize(&gotquat,&q);
1629 expect_quaternion(&expectedquat, &gotquat, 1);
1630
1631 /*_______________D3DXQuaternionRotationAxis___________________*/
1632 axis.x = 2.0f; axis.y = 7.0; axis.z = 13.0f;
1633 angle = D3DX_PI/3.0f;
1634 expectedquat.x = 0.067116; expectedquat.y = 0.234905f; expectedquat.z = 0.436251f; expectedquat.w = 0.866025f;
1635 D3DXQuaternionRotationAxis(&gotquat,&axis,angle);
1636 expect_quaternion(&expectedquat, &gotquat, 64);
1637 /* Test the nul quaternion */
1638 axis.x = 0.0f; axis.y = 0.0; axis.z = 0.0f;
1639 expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.866025f;
1640 D3DXQuaternionRotationAxis(&gotquat,&axis,angle);
1641 expect_quaternion(&expectedquat, &gotquat, 8);
1642
1643 /*_______________D3DXQuaternionRotationMatrix___________________*/
1644 /* test when the trace is >0 */
1645 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1646 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1647 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1648 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1649 U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f;
1650 U(mat).m[3][3] = 48.0f;
1651 expectedquat.x = 2.368682f; expectedquat.y = 0.768221f; expectedquat.z = -0.384111f; expectedquat.w = 3.905125f;
1652 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1653 expect_quaternion(&expectedquat, &gotquat, 16);
1654 /* test the case when the greater element is (2,2) */
1655 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1656 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1657 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1658 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1659 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = -60.0f; U(mat).m[2][2] = 40.0f;
1660 U(mat).m[3][3] = 48.0f;
1661 expectedquat.x = 1.233905f; expectedquat.y = -0.237290f; expectedquat.z = 5.267827f; expectedquat.w = -0.284747f;
1662 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1663 expect_quaternion(&expectedquat, &gotquat, 64);
1664 /* test the case when the greater element is (1,1) */
1665 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1666 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1667 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1668 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1669 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 60.0f; U(mat).m[2][2] = -80.0f;
1670 U(mat).m[3][3] = 48.0f;
1671 expectedquat.x = 0.651031f; expectedquat.y = 6.144103f; expectedquat.z = -0.203447f; expectedquat.w = 0.488273f;
1672 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1673 expect_quaternion(&expectedquat, &gotquat, 8);
1674 /* test the case when the trace is near 0 in a matrix which is not a rotation */
1675 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1676 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1677 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1678 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1679 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.9f;
1680 U(mat).m[3][3] = 48.0f;
1681 expectedquat.x = 1.709495f; expectedquat.y = 2.339872f; expectedquat.z = -0.534217f; expectedquat.w = 1.282122f;
1682 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1683 expect_quaternion(&expectedquat, &gotquat, 8);
1684 /* test the case when the trace is 0.49 in a matrix which is not a rotation */
1685 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1686 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1687 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1688 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1689 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.51f;
1690 U(mat).m[3][3] = 48.0f;
1691 expectedquat.x = 1.724923f; expectedquat.y = 2.318944f; expectedquat.z = -0.539039f; expectedquat.w = 1.293692f;
1692 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1693 expect_quaternion(&expectedquat, &gotquat, 8);
1694 /* test the case when the trace is 0.51 in a matrix which is not a rotation */
1695 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1696 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1697 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1698 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1699 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.49f;
1700 U(mat).m[3][3] = 48.0f;
1701 expectedquat.x = 1.725726f; expectedquat.y = 2.317865f; expectedquat.z = -0.539289f; expectedquat.w = 1.294294f;
1702 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1703 expect_quaternion(&expectedquat, &gotquat, 8);
1704 /* test the case when the trace is 0.99 in a matrix which is not a rotation */
1705 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1706 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1707 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1708 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1709 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.01f;
1710 U(mat).m[3][3] = 48.0f;
1711 expectedquat.x = 1.745328f; expectedquat.y = 2.291833f; expectedquat.z = -0.545415f; expectedquat.w = 1.308996f;
1712 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1713 expect_quaternion(&expectedquat, &gotquat, 4);
1714 /* test the case when the trace is 1.0 in a matrix which is not a rotation */
1715 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1716 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1717 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1718 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1719 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.0f;
1720 U(mat).m[3][3] = 48.0f;
1721 expectedquat.x = 1.745743f; expectedquat.y = 2.291288f; expectedquat.z = -0.545545f; expectedquat.w = 1.309307f;
1722 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1723 expect_quaternion(&expectedquat, &gotquat, 8);
1724 /* test the case when the trace is 1.01 in a matrix which is not a rotation */
1725 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1726 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1727 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1728 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1729 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.01f;
1730 U(mat).m[3][3] = 48.0f;
1731 expectedquat.x = 18.408188f; expectedquat.y = 5.970223f; expectedquat.z = -2.985111f; expectedquat.w = 0.502494f;
1732 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1733 expect_quaternion(&expectedquat, &gotquat, 4);
1734 /* test the case when the trace is 1.5 in a matrix which is not a rotation */
1735 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1736 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1737 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1738 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1739 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.5f;
1740 U(mat).m[3][3] = 48.0f;
1741 expectedquat.x = 15.105186f; expectedquat.y = 4.898980f; expectedquat.z = -2.449490f; expectedquat.w = 0.612372f;
1742 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1743 expect_quaternion(&expectedquat, &gotquat, 8);
1744 /* test the case when the trace is 1.7 in a matrix which is not a rotation */
1745 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1746 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1747 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1748 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1749 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.70f;
1750 U(mat).m[3][3] = 48.0f;
1751 expectedquat.x = 14.188852f; expectedquat.y = 4.601790f; expectedquat.z = -2.300895f; expectedquat.w = 0.651920f;
1752 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1753 expect_quaternion(&expectedquat, &gotquat, 4);
1754 /* test the case when the trace is 1.99 in a matrix which is not a rotation */
1755 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1756 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1757 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1758 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1759 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.99f;
1760 U(mat).m[3][3] = 48.0f;
1761 expectedquat.x = 13.114303f; expectedquat.y = 4.253287f; expectedquat.z = -2.126644f; expectedquat.w = 0.705337f;
1762 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1763 expect_quaternion(&expectedquat, &gotquat, 4);
1764 /* test the case when the trace is 2.0 in a matrix which is not a rotation */
1765 U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f;
1766 U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f;
1767 U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f;
1768 U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f;
1769 U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 2.0f;
1770 U(mat).m[3][3] = 48.0f;
1771 expectedquat.x = 10.680980f; expectedquat.y = 3.464102f; expectedquat.z = -1.732051f; expectedquat.w = 0.866025f;
1772 D3DXQuaternionRotationMatrix(&gotquat,&mat);
1773 expect_quaternion(&expectedquat, &gotquat, 8);
1774
1775 /*_______________D3DXQuaternionRotationYawPitchRoll__________*/
1776 expectedquat.x = 0.303261f; expectedquat.y = 0.262299f; expectedquat.z = 0.410073f; expectedquat.w = 0.819190f;
1777 D3DXQuaternionRotationYawPitchRoll(&gotquat,D3DX_PI/4.0f,D3DX_PI/11.0f,D3DX_PI/3.0f);
1778 expect_quaternion(&expectedquat, &gotquat, 16);
1779
1780 /*_______________D3DXQuaternionSlerp________________________*/
1781 expectedquat.x = -0.2f; expectedquat.y = 2.6f; expectedquat.z = 1.3f; expectedquat.w = 9.1f;
1782 D3DXQuaternionSlerp(&gotquat,&q,&r,scale);
1783 expect_quaternion(&expectedquat, &gotquat, 4);
1784 expectedquat.x = 334.0f; expectedquat.y = -31.9f; expectedquat.z = 6.1f; expectedquat.w = 6.7f;
1785 D3DXQuaternionSlerp(&gotquat,&q,&t,scale);
1786 expect_quaternion(&expectedquat, &gotquat, 2);
1787 expectedquat.x = 0.239485f; expectedquat.y = 0.346580f; expectedquat.z = 0.453676f; expectedquat.w = 0.560772f;
1788 D3DXQuaternionSlerp(&gotquat,&smallq,&smallr,scale);
1789 expect_quaternion(&expectedquat, &gotquat, 32);
1790
1791 /*_______________D3DXQuaternionSquad________________________*/
1792 expectedquat.x = -156.296f; expectedquat.y = 30.242f; expectedquat.z = -2.5022f; expectedquat.w = 7.3576f;
1793 D3DXQuaternionSquad(&gotquat,&q,&r,&t,&u,scale);
1794 expect_quaternion(&expectedquat, &gotquat, 2);
1795
1796 /*_______________D3DXQuaternionSquadSetup___________________*/
1797 r.x = 1.0f; r.y = 2.0f; r.z = 4.0f; r.w = 10.0f;
1798 s.x = -3.0f; s.y = 4.0f; s.z = -5.0f; s.w = 7.0;
1799 t.x = -1111.0f; t.y = 111.0f; t.z = -11.0f; t.w = 1.0f;
1800 u.x = 91.0f; u.y = - 82.0f; u.z = 7.3f; u.w = -6.4f;
1801 D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &u);
1802 expectedquat.x = 7.121285f; expectedquat.y = 2.159964f; expectedquat.z = -3.855094f; expectedquat.w = 5.362844f;
1803 expect_quaternion(&expectedquat, &gotquat, 2);
1804 expectedquat.x = -1113.492920f; expectedquat.y = 82.679260f; expectedquat.z = -6.696645f; expectedquat.w = -4.090050f;
1805 expect_quaternion(&expectedquat, &Nq, 4);
1806 expectedquat.x = -1111.0f; expectedquat.y = 111.0f; expectedquat.z = -11.0f; expectedquat.w = 1.0f;
1807 expect_quaternion(&expectedquat, &Nq1, 0);
1808 gotquat = s;
1809 D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &gotquat, &t, &u);
1810 expectedquat.x = -1113.492920f; expectedquat.y = 82.679260f; expectedquat.z = -6.696645f; expectedquat.w = -4.090050f;
1811 expect_quaternion(&expectedquat, &Nq, 4);
1812 Nq1 = u;
1813 D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &Nq1);
1814 expect_quaternion(&expectedquat, &Nq, 4);
1815 r.x = 0.2f; r.y = 0.3f; r.z = 1.3f; r.w = -0.6f;
1816 s.x = -3.0f; s.y =-2.0f; s.z = 4.0f; s.w = 0.2f;
1817 t.x = 0.4f; t.y = 8.3f; t.z = -3.1f; t.w = -2.7f;
1818 u.x = 1.1f; u.y = -0.7f; u.z = 9.2f; u.w = 0.0f;
1819 D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &u, &t);
1820 expectedquat.x = -4.139569f; expectedquat.y = -2.469115f; expectedquat.z = 2.364477f; expectedquat.w = 0.465494f;
1821 expect_quaternion(&expectedquat, &gotquat, 16);
1822 expectedquat.x = 2.342533f; expectedquat.y = 2.365127f; expectedquat.z = 8.628538f; expectedquat.w = -0.898356f;
1823 expect_quaternion(&expectedquat, &Nq, 16);
1824 expectedquat.x = 1.1f; expectedquat.y = -0.7f; expectedquat.z = 9.2f; expectedquat.w = 0.0f;
1825 expect_quaternion(&expectedquat, &Nq1, 0);
1826 D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &u);
1827 expectedquat.x = -3.754567f; expectedquat.y = -0.586085f; expectedquat.z = 3.815818f; expectedquat.w = -0.198150f;
1828 expect_quaternion(&expectedquat, &gotquat, 32);
1829 expectedquat.x = 0.140773f; expectedquat.y = -8.737090f; expectedquat.z = -0.516593f; expectedquat.w = 3.053942f;
1830 expect_quaternion(&expectedquat, &Nq, 16);
1831 expectedquat.x = -0.4f; expectedquat.y = -8.3f; expectedquat.z = 3.1f; expectedquat.w = 2.7f;
1832 expect_quaternion(&expectedquat, &Nq1, 0);
1833 r.x = -1.0f; r.y = 0.0f; r.z = 0.0f; r.w = 0.0f;
1834 s.x = 1.0f; s.y =0.0f; s.z = 0.0f; s.w = 0.0f;
1835 t.x = 1.0f; t.y = 0.0f; t.z = 0.0f; t.w = 0.0f;
1836 u.x = -1.0f; u.y = 0.0f; u.z = 0.0f; u.w = 0.0f;
1837 D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &u);
1838 expectedquat.x = 1.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f;
1839 expect_quaternion(&expectedquat, &gotquat, 0);
1840 expectedquat.x = 1.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f;
1841 expect_quaternion(&expectedquat, &Nq, 0);
1842 expectedquat.x = 1.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f;
1843 expect_quaternion(&expectedquat, &Nq1, 0);
1844
1845 /*_______________D3DXQuaternionToAxisAngle__________________*/
1846 Nq.x = 1.0f/22.0f; Nq.y = 2.0f/22.0f; Nq.z = 4.0f/22.0f; Nq.w = 10.0f/22.0f;
1847 expectedvec.x = 1.0f/22.0f; expectedvec.y = 2.0f/22.0f; expectedvec.z = 4.0f/22.0f;
1848 D3DXQuaternionToAxisAngle(&Nq,&axis,&angle);
1849 expect_vec3(&expectedvec, &axis, 0);
1850 equal = compare_float(angle, 2.197869f, 1);
1851 ok(equal, "Got unexpected angle %.8e.\n", angle);
1852 /* Test if |w|>1.0f */
1853 expectedvec.x = 1.0f; expectedvec.y = 2.0f; expectedvec.z = 4.0f;
1854 D3DXQuaternionToAxisAngle(&q,&axis,&angle);
1855 expect_vec3(&expectedvec, &axis, 0);
1856 /* Test the null quaternion */
1857 expectedvec.x = 0.0f; expectedvec.y = 0.0f; expectedvec.z = 0.0f;
1858 D3DXQuaternionToAxisAngle(&nul, &axis, &angle);
1859 expect_vec3(&expectedvec, &axis, 0);
1860 equal = compare_float(angle, 3.14159274e+00f, 0);
1861 ok(equal, "Got unexpected angle %.8e.\n", angle);
1862
1863 D3DXQuaternionToAxisAngle(&nul, &axis, NULL);
1864 D3DXQuaternionToAxisAngle(&nul, NULL, &angle);
1865 expect_vec3(&expectedvec, &axis, 0);
1866 equal = compare_float(angle, 3.14159274e+00f, 0);
1867 ok(equal, "Got unexpected angle %.8e.\n", angle);
1868 }
1869
D3DXVector2Test(void)1870 static void D3DXVector2Test(void)
1871 {
1872 D3DXVECTOR2 expectedvec, gotvec, nul, u, v, w, x;
1873 LPD3DXVECTOR2 funcpointer;
1874 D3DXVECTOR4 expectedtrans, gottrans;
1875 float coeff1, coeff2, got, scale;
1876 D3DXMATRIX mat;
1877 BOOL equal;
1878
1879 nul.x = 0.0f; nul.y = 0.0f;
1880 u.x = 3.0f; u.y = 4.0f;
1881 v.x = -7.0f; v.y = 9.0f;
1882 w.x = 4.0f; w.y = -3.0f;
1883 x.x = 2.0f; x.y = -11.0f;
1884
1885 set_matrix(&mat,
1886 1.0f, 2.0f, 3.0f, 4.0f,
1887 5.0f, 6.0f, 7.0f, 8.0f,
1888 9.0f, 10.0f, 11.0f, 12.0f,
1889 13.0f, 14.0f, 15.0f, 16.0f);
1890
1891 coeff1 = 2.0f; coeff2 = 5.0f;
1892 scale = -6.5f;
1893
1894 /*_______________D3DXVec2Add__________________________*/
1895 expectedvec.x = -4.0f; expectedvec.y = 13.0f;
1896 D3DXVec2Add(&gotvec,&u,&v);
1897 expect_vec2(&expectedvec, &gotvec, 0);
1898 /* Tests the case NULL */
1899 funcpointer = D3DXVec2Add(&gotvec,NULL,&v);
1900 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1901 funcpointer = D3DXVec2Add(NULL,NULL,NULL);
1902 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1903
1904 /*_______________D3DXVec2BaryCentric___________________*/
1905 expectedvec.x = -12.0f; expectedvec.y = -21.0f;
1906 D3DXVec2BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2);
1907 expect_vec2(&expectedvec, &gotvec, 0);
1908
1909 /*_______________D3DXVec2CatmullRom____________________*/
1910 expectedvec.x = 5820.25f; expectedvec.y = -3654.5625f;
1911 D3DXVec2CatmullRom(&gotvec,&u,&v,&w,&x,scale);
1912 expect_vec2(&expectedvec, &gotvec, 0);
1913
1914 /*_______________D3DXVec2CCW__________________________*/
1915 got = D3DXVec2CCW(&u, &v);
1916 equal = compare_float(got, 55.0f, 0);
1917 ok(equal, "Got unexpected ccw %.8e.\n", got);
1918 /* Tests the case NULL. */
1919 got = D3DXVec2CCW(NULL, &v);
1920 equal = compare_float(got, 0.0f, 0);
1921 ok(equal, "Got unexpected ccw %.8e.\n", got);
1922 got = D3DXVec2CCW(NULL, NULL);
1923 equal = compare_float(got, 0.0f, 0);
1924 ok(equal, "Got unexpected ccw %.8e.\n", got);
1925
1926 /*_______________D3DXVec2Dot__________________________*/
1927 got = D3DXVec2Dot(&u, &v);
1928 equal = compare_float(got, 15.0f, 0);
1929 ok(equal, "Got unexpected dot %.8e.\n", got);
1930 /* Tests the case NULL */
1931 got = D3DXVec2Dot(NULL, &v);
1932 equal = compare_float(got, 0.0f, 0);
1933 ok(equal, "Got unexpected dot %.8e.\n", got);
1934 got = D3DXVec2Dot(NULL, NULL);
1935 equal = compare_float(got, 0.0f, 0);
1936 ok(equal, "Got unexpected dot %.8e.\n", got);
1937
1938 /*_______________D3DXVec2Hermite__________________________*/
1939 expectedvec.x = 2604.625f; expectedvec.y = -4533.0f;
1940 D3DXVec2Hermite(&gotvec,&u,&v,&w,&x,scale);
1941 expect_vec2(&expectedvec, &gotvec, 0);
1942
1943 /*_______________D3DXVec2Length__________________________*/
1944 got = D3DXVec2Length(&u);
1945 equal = compare_float(got, 5.0f, 0);
1946 ok(equal, "Got unexpected length %.8e.\n", got);
1947 /* Tests the case NULL. */
1948 got = D3DXVec2Length(NULL);
1949 equal = compare_float(got, 0.0f, 0);
1950 ok(equal, "Got unexpected length %.8e.\n", got);
1951
1952 /*_______________D3DXVec2LengthSq________________________*/
1953 got = D3DXVec2LengthSq(&u);
1954 equal = compare_float(got, 25.0f, 0);
1955 ok(equal, "Got unexpected length %.8e.\n", got);
1956 /* Tests the case NULL. */
1957 got = D3DXVec2LengthSq(NULL);
1958 equal = compare_float(got, 0.0f, 0);
1959 ok(equal, "Got unexpected length %.8e.\n", got);
1960
1961 /*_______________D3DXVec2Lerp__________________________*/
1962 expectedvec.x = 68.0f; expectedvec.y = -28.5f;
1963 D3DXVec2Lerp(&gotvec, &u, &v, scale);
1964 expect_vec2(&expectedvec, &gotvec, 0);
1965 /* Tests the case NULL. */
1966 funcpointer = D3DXVec2Lerp(&gotvec,NULL,&v,scale);
1967 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1968 funcpointer = D3DXVec2Lerp(NULL,NULL,NULL,scale);
1969 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1970
1971 /*_______________D3DXVec2Maximize__________________________*/
1972 expectedvec.x = 3.0f; expectedvec.y = 9.0f;
1973 D3DXVec2Maximize(&gotvec, &u, &v);
1974 expect_vec2(&expectedvec, &gotvec, 0);
1975 /* Tests the case NULL. */
1976 funcpointer = D3DXVec2Maximize(&gotvec,NULL,&v);
1977 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1978 funcpointer = D3DXVec2Maximize(NULL,NULL,NULL);
1979 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1980
1981 /*_______________D3DXVec2Minimize__________________________*/
1982 expectedvec.x = -7.0f; expectedvec.y = 4.0f;
1983 D3DXVec2Minimize(&gotvec,&u,&v);
1984 expect_vec2(&expectedvec, &gotvec, 0);
1985 /* Tests the case NULL */
1986 funcpointer = D3DXVec2Minimize(&gotvec,NULL,&v);
1987 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1988 funcpointer = D3DXVec2Minimize(NULL,NULL,NULL);
1989 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
1990
1991 /*_______________D3DXVec2Normalize_________________________*/
1992 expectedvec.x = 0.6f; expectedvec.y = 0.8f;
1993 D3DXVec2Normalize(&gotvec,&u);
1994 expect_vec2(&expectedvec, &gotvec, 0);
1995 /* Test the nul vector */
1996 expectedvec.x = 0.0f; expectedvec.y = 0.0f;
1997 D3DXVec2Normalize(&gotvec,&nul);
1998 expect_vec2(&expectedvec, &gotvec, 0);
1999
2000 /*_______________D3DXVec2Scale____________________________*/
2001 expectedvec.x = -19.5f; expectedvec.y = -26.0f;
2002 D3DXVec2Scale(&gotvec,&u,scale);
2003 expect_vec2(&expectedvec, &gotvec, 0);
2004 /* Tests the case NULL */
2005 funcpointer = D3DXVec2Scale(&gotvec,NULL,scale);
2006 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2007 funcpointer = D3DXVec2Scale(NULL,NULL,scale);
2008 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2009
2010 /*_______________D3DXVec2Subtract__________________________*/
2011 expectedvec.x = 10.0f; expectedvec.y = -5.0f;
2012 D3DXVec2Subtract(&gotvec, &u, &v);
2013 expect_vec2(&expectedvec, &gotvec, 0);
2014 /* Tests the case NULL. */
2015 funcpointer = D3DXVec2Subtract(&gotvec,NULL,&v);
2016 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2017 funcpointer = D3DXVec2Subtract(NULL,NULL,NULL);
2018 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2019
2020 /*_______________D3DXVec2Transform_______________________*/
2021 expectedtrans.x = 36.0f; expectedtrans.y = 44.0f; expectedtrans.z = 52.0f; expectedtrans.w = 60.0f;
2022 D3DXVec2Transform(&gottrans, &u, &mat);
2023 expect_vec4(&expectedtrans, &gottrans, 0);
2024 gottrans.x = u.x; gottrans.y = u.y;
2025 D3DXVec2Transform(&gottrans, (D3DXVECTOR2 *)&gottrans, &mat);
2026 expect_vec4(&expectedtrans, &gottrans, 0);
2027
2028 /*_______________D3DXVec2TransformCoord_______________________*/
2029 expectedvec.x = 0.6f; expectedvec.y = 11.0f/15.0f;
2030 D3DXVec2TransformCoord(&gotvec, &u, &mat);
2031 expect_vec2(&expectedvec, &gotvec, 1);
2032 gotvec.x = u.x; gotvec.y = u.y;
2033 D3DXVec2TransformCoord(&gotvec, &gotvec, &mat);
2034 expect_vec2(&expectedvec, &gotvec, 1);
2035
2036 /*_______________D3DXVec2TransformNormal______________________*/
2037 expectedvec.x = 23.0f; expectedvec.y = 30.0f;
2038 D3DXVec2TransformNormal(&gotvec,&u,&mat);
2039 expect_vec2(&expectedvec, &gotvec, 0);
2040 }
2041
D3DXVector3Test(void)2042 static void D3DXVector3Test(void)
2043 {
2044 D3DVIEWPORT9 viewport;
2045 D3DXVECTOR3 expectedvec, gotvec, nul, u, v, w, x;
2046 LPD3DXVECTOR3 funcpointer;
2047 D3DXVECTOR4 expectedtrans, gottrans;
2048 D3DXMATRIX mat, projection, view, world;
2049 float coeff1, coeff2, got, scale;
2050 BOOL equal;
2051
2052 nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f;
2053 u.x = 9.0f; u.y = 6.0f; u.z = 2.0f;
2054 v.x = 2.0f; v.y = -3.0f; v.z = -4.0;
2055 w.x = 3.0f; w.y = -5.0f; w.z = 7.0f;
2056 x.x = 4.0f; x.y = 1.0f; x.z = 11.0f;
2057
2058 viewport.Width = 800; viewport.MinZ = 0.2f; viewport.X = 10;
2059 viewport.Height = 680; viewport.MaxZ = 0.9f; viewport.Y = 5;
2060
2061 set_matrix(&mat,
2062 1.0f, 2.0f, 3.0f, 4.0f,
2063 5.0f, 6.0f, 7.0f, 8.0f,
2064 9.0f, 10.0f, 11.0f, 12.0f,
2065 13.0f, 14.0f, 15.0f, 16.0f);
2066
2067 U(view).m[0][1] = 5.0f; U(view).m[0][2] = 7.0f; U(view).m[0][3] = 8.0f;
2068 U(view).m[1][0] = 11.0f; U(view).m[1][2] = 16.0f; U(view).m[1][3] = 33.0f;
2069 U(view).m[2][0] = 19.0f; U(view).m[2][1] = -21.0f; U(view).m[2][3] = 43.0f;
2070 U(view).m[3][0] = 2.0f; U(view).m[3][1] = 3.0f; U(view).m[3][2] = -4.0f;
2071 U(view).m[0][0] = 10.0f; U(view).m[1][1] = 20.0f; U(view).m[2][2] = 30.0f;
2072 U(view).m[3][3] = -40.0f;
2073
2074 set_matrix(&world,
2075 21.0f, 2.0f, 3.0f, 4.0f,
2076 5.0f, 23.0f, 7.0f, 8.0f,
2077 -8.0f, -7.0f, 25.0f, -5.0f,
2078 -4.0f, -3.0f, -2.0f, 27.0f);
2079
2080 coeff1 = 2.0f; coeff2 = 5.0f;
2081 scale = -6.5f;
2082
2083 /*_______________D3DXVec3Add__________________________*/
2084 expectedvec.x = 11.0f; expectedvec.y = 3.0f; expectedvec.z = -2.0f;
2085 D3DXVec3Add(&gotvec,&u,&v);
2086 expect_vec3(&expectedvec, &gotvec, 0);
2087 /* Tests the case NULL */
2088 funcpointer = D3DXVec3Add(&gotvec,NULL,&v);
2089 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2090 funcpointer = D3DXVec3Add(NULL,NULL,NULL);
2091 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2092
2093 /*_______________D3DXVec3BaryCentric___________________*/
2094 expectedvec.x = -35.0f; expectedvec.y = -67.0; expectedvec.z = 15.0f;
2095 D3DXVec3BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2);
2096 expect_vec3(&expectedvec, &gotvec, 0);
2097
2098 /*_______________D3DXVec3CatmullRom____________________*/
2099 expectedvec.x = 1458.0f; expectedvec.y = 22.1875f; expectedvec.z = 4141.375f;
2100 D3DXVec3CatmullRom(&gotvec,&u,&v,&w,&x,scale);
2101 expect_vec3(&expectedvec, &gotvec, 0);
2102
2103 /*_______________D3DXVec3Cross________________________*/
2104 expectedvec.x = -18.0f; expectedvec.y = 40.0f; expectedvec.z = -39.0f;
2105 D3DXVec3Cross(&gotvec,&u,&v);
2106 expect_vec3(&expectedvec, &gotvec, 0);
2107 expectedvec.x = -277.0f; expectedvec.y = -150.0f; expectedvec.z = -26.0f;
2108 D3DXVec3Cross(&gotvec,&gotvec,&v);
2109 expect_vec3(&expectedvec, &gotvec, 0);
2110 /* Tests the case NULL */
2111 funcpointer = D3DXVec3Cross(&gotvec,NULL,&v);
2112 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2113 funcpointer = D3DXVec3Cross(NULL,NULL,NULL);
2114 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2115
2116 /*_______________D3DXVec3Dot__________________________*/
2117 got = D3DXVec3Dot(&u, &v);
2118 equal = compare_float(got, -8.0f, 0);
2119 ok(equal, "Got unexpected dot %.8e.\n", got);
2120 /* Tests the case NULL */
2121 got = D3DXVec3Dot(NULL, &v);
2122 equal = compare_float(got, 0.0f, 0);
2123 ok(equal, "Got unexpected dot %.8e.\n", got);
2124 got = D3DXVec3Dot(NULL, NULL);
2125 equal = compare_float(got, 0.0f, 0);
2126 ok(equal, "Got unexpected dot %.8e.\n", got);
2127
2128 /*_______________D3DXVec3Hermite__________________________*/
2129 expectedvec.x = -6045.75f; expectedvec.y = -6650.0f; expectedvec.z = 1358.875f;
2130 D3DXVec3Hermite(&gotvec,&u,&v,&w,&x,scale);
2131 expect_vec3(&expectedvec, &gotvec, 0);
2132
2133 /*_______________D3DXVec3Length__________________________*/
2134 got = D3DXVec3Length(&u);
2135 equal = compare_float(got, 11.0f, 0);
2136 ok(equal, "Got unexpected length %.8e.\n", got);
2137 /* Tests the case NULL. */
2138 got = D3DXVec3Length(NULL);
2139 equal = compare_float(got, 0.0f, 0);
2140 ok(equal, "Got unexpected length %.8e.\n", got);
2141
2142 /*_______________D3DXVec3LengthSq________________________*/
2143 got = D3DXVec3LengthSq(&u);
2144 equal = compare_float(got, 121.0f, 0);
2145 ok(equal, "Got unexpected length %.8e.\n", got);
2146 /* Tests the case NULL. */
2147 got = D3DXVec3LengthSq(NULL);
2148 equal = compare_float(got, 0.0f, 0);
2149 ok(equal, "Got unexpected length %.8e.\n", got);
2150
2151 /*_______________D3DXVec3Lerp__________________________*/
2152 expectedvec.x = 54.5f; expectedvec.y = 64.5f; expectedvec.z = 41.0f ;
2153 D3DXVec3Lerp(&gotvec,&u,&v,scale);
2154 expect_vec3(&expectedvec, &gotvec, 0);
2155 /* Tests the case NULL */
2156 funcpointer = D3DXVec3Lerp(&gotvec,NULL,&v,scale);
2157 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2158 funcpointer = D3DXVec3Lerp(NULL,NULL,NULL,scale);
2159 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2160
2161 /*_______________D3DXVec3Maximize__________________________*/
2162 expectedvec.x = 9.0f; expectedvec.y = 6.0f; expectedvec.z = 2.0f;
2163 D3DXVec3Maximize(&gotvec,&u,&v);
2164 expect_vec3(&expectedvec, &gotvec, 0);
2165 /* Tests the case NULL */
2166 funcpointer = D3DXVec3Maximize(&gotvec,NULL,&v);
2167 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2168 funcpointer = D3DXVec3Maximize(NULL,NULL,NULL);
2169 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2170
2171 /*_______________D3DXVec3Minimize__________________________*/
2172 expectedvec.x = 2.0f; expectedvec.y = -3.0f; expectedvec.z = -4.0f;
2173 D3DXVec3Minimize(&gotvec,&u,&v);
2174 expect_vec3(&expectedvec, &gotvec, 0);
2175 /* Tests the case NULL */
2176 funcpointer = D3DXVec3Minimize(&gotvec,NULL,&v);
2177 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2178 funcpointer = D3DXVec3Minimize(NULL,NULL,NULL);
2179 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2180
2181 /*_______________D3DXVec3Normalize_________________________*/
2182 expectedvec.x = 9.0f/11.0f; expectedvec.y = 6.0f/11.0f; expectedvec.z = 2.0f/11.0f;
2183 D3DXVec3Normalize(&gotvec,&u);
2184 expect_vec3(&expectedvec, &gotvec, 1);
2185 /* Test the nul vector */
2186 expectedvec.x = 0.0f; expectedvec.y = 0.0f; expectedvec.z = 0.0f;
2187 D3DXVec3Normalize(&gotvec,&nul);
2188 expect_vec3(&expectedvec, &gotvec, 0);
2189
2190 /*_______________D3DXVec3Scale____________________________*/
2191 expectedvec.x = -58.5f; expectedvec.y = -39.0f; expectedvec.z = -13.0f;
2192 D3DXVec3Scale(&gotvec,&u,scale);
2193 expect_vec3(&expectedvec, &gotvec, 0);
2194 /* Tests the case NULL */
2195 funcpointer = D3DXVec3Scale(&gotvec,NULL,scale);
2196 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2197 funcpointer = D3DXVec3Scale(NULL,NULL,scale);
2198 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2199
2200 /*_______________D3DXVec3Subtract_______________________*/
2201 expectedvec.x = 7.0f; expectedvec.y = 9.0f; expectedvec.z = 6.0f;
2202 D3DXVec3Subtract(&gotvec,&u,&v);
2203 expect_vec3(&expectedvec, &gotvec, 0);
2204 /* Tests the case NULL */
2205 funcpointer = D3DXVec3Subtract(&gotvec,NULL,&v);
2206 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2207 funcpointer = D3DXVec3Subtract(NULL,NULL,NULL);
2208 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2209
2210 /*_______________D3DXVec3Transform_______________________*/
2211 expectedtrans.x = 70.0f; expectedtrans.y = 88.0f; expectedtrans.z = 106.0f; expectedtrans.w = 124.0f;
2212 D3DXVec3Transform(&gottrans, &u, &mat);
2213 expect_vec4(&expectedtrans, &gottrans, 0);
2214
2215 gottrans.x = u.x; gottrans.y = u.y; gottrans.z = u.z;
2216 D3DXVec3Transform(&gottrans, (D3DXVECTOR3 *)&gottrans, &mat);
2217 expect_vec4(&expectedtrans, &gottrans, 0);
2218
2219 /*_______________D3DXVec3TransformCoord_______________________*/
2220 expectedvec.x = 70.0f/124.0f; expectedvec.y = 88.0f/124.0f; expectedvec.z = 106.0f/124.0f;
2221 D3DXVec3TransformCoord(&gotvec,&u,&mat);
2222 expect_vec3(&expectedvec, &gotvec, 1);
2223
2224 /*_______________D3DXVec3TransformNormal______________________*/
2225 expectedvec.x = 57.0f; expectedvec.y = 74.0f; expectedvec.z = 91.0f;
2226 D3DXVec3TransformNormal(&gotvec,&u,&mat);
2227 expect_vec3(&expectedvec, &gotvec, 0);
2228
2229 /*_______________D3DXVec3Project_________________________*/
2230 expectedvec.x = 1135.721924f; expectedvec.y = 147.086914f; expectedvec.z = 0.153412f;
2231 D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f);
2232 D3DXVec3Project(&gotvec,&u,&viewport,&projection,&view,&world);
2233 expect_vec3(&expectedvec, &gotvec, 32);
2234 /* World matrix can be omitted */
2235 D3DXMatrixMultiply(&mat,&world,&view);
2236 D3DXVec3Project(&gotvec,&u,&viewport,&projection,&mat,NULL);
2237 expect_vec3(&expectedvec, &gotvec, 32);
2238 /* Projection matrix can be omitted */
2239 D3DXMatrixMultiply(&mat,&view,&projection);
2240 D3DXVec3Project(&gotvec,&u,&viewport,NULL,&mat,&world);
2241 expect_vec3(&expectedvec, &gotvec, 32);
2242 /* View matrix can be omitted */
2243 D3DXMatrixMultiply(&mat,&world,&view);
2244 D3DXVec3Project(&gotvec,&u,&viewport,&projection,NULL,&mat);
2245 expect_vec3(&expectedvec, &gotvec, 32);
2246 /* All matrices can be omitted */
2247 expectedvec.x = 4010.000000f; expectedvec.y = -1695.000000f; expectedvec.z = 1.600000f;
2248 D3DXVec3Project(&gotvec,&u,&viewport,NULL,NULL,NULL);
2249 expect_vec3(&expectedvec, &gotvec, 2);
2250 /* Viewport can be omitted */
2251 expectedvec.x = 1.814305f; expectedvec.y = 0.582097f; expectedvec.z = -0.066555f;
2252 D3DXVec3Project(&gotvec,&u,NULL,&projection,&view,&world);
2253 expect_vec3(&expectedvec, &gotvec, 64);
2254
2255 /*_______________D3DXVec3Unproject_________________________*/
2256 expectedvec.x = -2.913411f; expectedvec.y = 1.593215f; expectedvec.z = 0.380724f;
2257 D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f);
2258 D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,&view,&world);
2259 expect_vec3(&expectedvec, &gotvec, 16);
2260 /* World matrix can be omitted */
2261 D3DXMatrixMultiply(&mat,&world,&view);
2262 D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,&mat,NULL);
2263 expect_vec3(&expectedvec, &gotvec, 16);
2264 /* Projection matrix can be omitted */
2265 D3DXMatrixMultiply(&mat,&view,&projection);
2266 D3DXVec3Unproject(&gotvec,&u,&viewport,NULL,&mat,&world);
2267 expect_vec3(&expectedvec, &gotvec, 32);
2268 /* View matrix can be omitted */
2269 D3DXMatrixMultiply(&mat,&world,&view);
2270 D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,NULL,&mat);
2271 expect_vec3(&expectedvec, &gotvec, 16);
2272 /* All matrices can be omitted */
2273 expectedvec.x = -1.002500f; expectedvec.y = 0.997059f; expectedvec.z = 2.571429f;
2274 D3DXVec3Unproject(&gotvec,&u,&viewport,NULL,NULL,NULL);
2275 expect_vec3(&expectedvec, &gotvec, 4);
2276 /* Viewport can be omitted */
2277 expectedvec.x = -11.018396f; expectedvec.y = 3.218991f; expectedvec.z = 1.380329f;
2278 D3DXVec3Unproject(&gotvec,&u,NULL,&projection,&view,&world);
2279 expect_vec3(&expectedvec, &gotvec, 8);
2280 }
2281
D3DXVector4Test(void)2282 static void D3DXVector4Test(void)
2283 {
2284 D3DXVECTOR4 expectedvec, gotvec, u, v, w, x;
2285 LPD3DXVECTOR4 funcpointer;
2286 D3DXVECTOR4 expectedtrans, gottrans;
2287 float coeff1, coeff2, got, scale;
2288 D3DXMATRIX mat;
2289 BOOL equal;
2290
2291 u.x = 1.0f; u.y = 2.0f; u.z = 4.0f; u.w = 10.0;
2292 v.x = -3.0f; v.y = 4.0f; v.z = -5.0f; v.w = 7.0;
2293 w.x = 4.0f; w.y =6.0f; w.z = -2.0f; w.w = 1.0f;
2294 x.x = 6.0f; x.y = -7.0f; x.z =8.0f; x.w = -9.0f;
2295
2296 set_matrix(&mat,
2297 1.0f, 2.0f, 3.0f, 4.0f,
2298 5.0f, 6.0f, 7.0f, 8.0f,
2299 9.0f, 10.0f, 11.0f, 12.0f,
2300 13.0f, 14.0f, 15.0f, 16.0f);
2301
2302 coeff1 = 2.0f; coeff2 = 5.0;
2303 scale = -6.5f;
2304
2305 /*_______________D3DXVec4Add__________________________*/
2306 expectedvec.x = -2.0f; expectedvec.y = 6.0f; expectedvec.z = -1.0f; expectedvec.w = 17.0f;
2307 D3DXVec4Add(&gotvec,&u,&v);
2308 expect_vec4(&expectedvec, &gotvec, 0);
2309 /* Tests the case NULL */
2310 funcpointer = D3DXVec4Add(&gotvec,NULL,&v);
2311 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2312 funcpointer = D3DXVec4Add(NULL,NULL,NULL);
2313 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2314
2315 /*_______________D3DXVec4BaryCentric____________________*/
2316 expectedvec.x = 8.0f; expectedvec.y = 26.0; expectedvec.z = -44.0f; expectedvec.w = -41.0f;
2317 D3DXVec4BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2);
2318 expect_vec4(&expectedvec, &gotvec, 0);
2319
2320 /*_______________D3DXVec4CatmullRom____________________*/
2321 expectedvec.x = 2754.625f; expectedvec.y = 2367.5625f; expectedvec.z = 1060.1875f; expectedvec.w = 131.3125f;
2322 D3DXVec4CatmullRom(&gotvec,&u,&v,&w,&x,scale);
2323 expect_vec4(&expectedvec, &gotvec, 0);
2324
2325 /*_______________D3DXVec4Cross_________________________*/
2326 expectedvec.x = 390.0f; expectedvec.y = -393.0f; expectedvec.z = -316.0f; expectedvec.w = 166.0f;
2327 D3DXVec4Cross(&gotvec,&u,&v,&w);
2328 expect_vec4(&expectedvec, &gotvec, 0);
2329
2330 /*_______________D3DXVec4Dot__________________________*/
2331 got = D3DXVec4Dot(&u, &v);
2332 equal = compare_float(got, 55.0f, 0);
2333 ok(equal, "Got unexpected dot %.8e.\n", got);
2334 /* Tests the case NULL. */
2335 got = D3DXVec4Dot(NULL, &v);
2336 equal = compare_float(got, 0.0f, 0);
2337 ok(equal, "Got unexpected dot %.8e.\n", got);
2338 got = D3DXVec4Dot(NULL, NULL);
2339 equal = compare_float(got, 0.0f, 0);
2340 ok(equal, "Got unexpected dot %.8e.\n", got);
2341
2342 /*_______________D3DXVec4Hermite_________________________*/
2343 expectedvec.x = 1224.625f; expectedvec.y = 3461.625f; expectedvec.z = -4758.875f; expectedvec.w = -5781.5f;
2344 D3DXVec4Hermite(&gotvec,&u,&v,&w,&x,scale);
2345 expect_vec4(&expectedvec, &gotvec, 0);
2346
2347 /*_______________D3DXVec4Length__________________________*/
2348 got = D3DXVec4Length(&u);
2349 equal = compare_float(got, 11.0f, 0);
2350 ok(equal, "Got unexpected length %.8e.\n", got);
2351 /* Tests the case NULL. */
2352 got = D3DXVec4Length(NULL);
2353 equal = compare_float(got, 0.0f, 0);
2354 ok(equal, "Got unexpected length %.8e.\n", got);
2355
2356 /*_______________D3DXVec4LengthSq________________________*/
2357 got = D3DXVec4LengthSq(&u);
2358 equal = compare_float(got, 121.0f, 0);
2359 ok(equal, "Got unexpected length %.8e.\n", got);
2360 /* Tests the case NULL. */
2361 got = D3DXVec4LengthSq(NULL);
2362 equal = compare_float(got, 0.0f, 0);
2363 ok(equal, "Got unexpected length %.8e.\n", got);
2364
2365 /*_______________D3DXVec4Lerp__________________________*/
2366 expectedvec.x = 27.0f; expectedvec.y = -11.0f; expectedvec.z = 62.5; expectedvec.w = 29.5;
2367 D3DXVec4Lerp(&gotvec,&u,&v,scale);
2368 expect_vec4(&expectedvec, &gotvec, 0);
2369 /* Tests the case NULL */
2370 funcpointer = D3DXVec4Lerp(&gotvec,NULL,&v,scale);
2371 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2372 funcpointer = D3DXVec4Lerp(NULL,NULL,NULL,scale);
2373 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2374
2375 /*_______________D3DXVec4Maximize__________________________*/
2376 expectedvec.x = 1.0f; expectedvec.y = 4.0f; expectedvec.z = 4.0f; expectedvec.w = 10.0;
2377 D3DXVec4Maximize(&gotvec,&u,&v);
2378 expect_vec4(&expectedvec, &gotvec, 0);
2379 /* Tests the case NULL */
2380 funcpointer = D3DXVec4Maximize(&gotvec,NULL,&v);
2381 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2382 funcpointer = D3DXVec4Maximize(NULL,NULL,NULL);
2383 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2384
2385 /*_______________D3DXVec4Minimize__________________________*/
2386 expectedvec.x = -3.0f; expectedvec.y = 2.0f; expectedvec.z = -5.0f; expectedvec.w = 7.0;
2387 D3DXVec4Minimize(&gotvec,&u,&v);
2388 expect_vec4(&expectedvec, &gotvec, 0);
2389 /* Tests the case NULL */
2390 funcpointer = D3DXVec4Minimize(&gotvec,NULL,&v);
2391 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2392 funcpointer = D3DXVec4Minimize(NULL,NULL,NULL);
2393 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2394
2395 /*_______________D3DXVec4Normalize_________________________*/
2396 expectedvec.x = 1.0f/11.0f; expectedvec.y = 2.0f/11.0f; expectedvec.z = 4.0f/11.0f; expectedvec.w = 10.0f/11.0f;
2397 D3DXVec4Normalize(&gotvec,&u);
2398 expect_vec4(&expectedvec, &gotvec, 1);
2399
2400 /*_______________D3DXVec4Scale____________________________*/
2401 expectedvec.x = -6.5f; expectedvec.y = -13.0f; expectedvec.z = -26.0f; expectedvec.w = -65.0f;
2402 D3DXVec4Scale(&gotvec,&u,scale);
2403 expect_vec4(&expectedvec, &gotvec, 0);
2404 /* Tests the case NULL */
2405 funcpointer = D3DXVec4Scale(&gotvec,NULL,scale);
2406 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2407 funcpointer = D3DXVec4Scale(NULL,NULL,scale);
2408 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2409
2410 /*_______________D3DXVec4Subtract__________________________*/
2411 expectedvec.x = 4.0f; expectedvec.y = -2.0f; expectedvec.z = 9.0f; expectedvec.w = 3.0f;
2412 D3DXVec4Subtract(&gotvec,&u,&v);
2413 expect_vec4(&expectedvec, &gotvec, 0);
2414 /* Tests the case NULL */
2415 funcpointer = D3DXVec4Subtract(&gotvec,NULL,&v);
2416 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2417 funcpointer = D3DXVec4Subtract(NULL,NULL,NULL);
2418 ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer);
2419
2420 /*_______________D3DXVec4Transform_______________________*/
2421 expectedtrans.x = 177.0f; expectedtrans.y = 194.0f; expectedtrans.z = 211.0f; expectedtrans.w = 228.0f;
2422 D3DXVec4Transform(&gottrans,&u,&mat);
2423 expect_vec4(&expectedtrans, &gottrans, 0);
2424 }
2425
test_matrix_stack(void)2426 static void test_matrix_stack(void)
2427 {
2428 ID3DXMatrixStack *stack;
2429 ULONG refcount;
2430 HRESULT hr;
2431
2432 const D3DXMATRIX mat1 = {{{
2433 1.0f, 2.0f, 3.0f, 4.0f,
2434 5.0f, 6.0f, 7.0f, 8.0f,
2435 9.0f, 10.0f, 11.0f, 12.0f,
2436 13.0f, 14.0f, 15.0f, 16.0f
2437 }}};
2438
2439 const D3DXMATRIX mat2 = {{{
2440 17.0f, 18.0f, 19.0f, 20.0f,
2441 21.0f, 22.0f, 23.0f, 24.0f,
2442 25.0f, 26.0f, 27.0f, 28.0f,
2443 29.0f, 30.0f, 31.0f, 32.0f
2444 }}};
2445
2446 hr = D3DXCreateMatrixStack(0, &stack);
2447 ok(SUCCEEDED(hr), "Failed to create a matrix stack, hr %#x\n", hr);
2448 if (FAILED(hr)) return;
2449
2450 ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)),
2451 "The top of an empty matrix stack should be an identity matrix\n");
2452
2453 hr = ID3DXMatrixStack_Pop(stack);
2454 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2455
2456 hr = ID3DXMatrixStack_Push(stack);
2457 ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
2458 ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
2459
2460 hr = ID3DXMatrixStack_Push(stack);
2461 ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
2462
2463 hr = ID3DXMatrixStack_LoadMatrix(stack, &mat1);
2464 ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
2465 expect_matrix(&mat1, ID3DXMatrixStack_GetTop(stack), 0);
2466
2467 hr = ID3DXMatrixStack_Push(stack);
2468 ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
2469 expect_matrix(&mat1, ID3DXMatrixStack_GetTop(stack), 0);
2470
2471 hr = ID3DXMatrixStack_LoadMatrix(stack, &mat2);
2472 ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
2473 expect_matrix(&mat2, ID3DXMatrixStack_GetTop(stack), 0);
2474
2475 hr = ID3DXMatrixStack_Push(stack);
2476 ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
2477 expect_matrix(&mat2, ID3DXMatrixStack_GetTop(stack), 0);
2478
2479 hr = ID3DXMatrixStack_LoadIdentity(stack);
2480 ok(SUCCEEDED(hr), "LoadIdentity failed, hr %#x\n", hr);
2481 ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
2482
2483 hr = ID3DXMatrixStack_Pop(stack);
2484 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2485 expect_matrix(&mat2, ID3DXMatrixStack_GetTop(stack), 0);
2486
2487 hr = ID3DXMatrixStack_Pop(stack);
2488 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2489 expect_matrix(&mat1, ID3DXMatrixStack_GetTop(stack), 0);
2490
2491 hr = ID3DXMatrixStack_Pop(stack);
2492 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2493 ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
2494
2495 hr = ID3DXMatrixStack_Pop(stack);
2496 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2497 ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n");
2498
2499 refcount = ID3DXMatrixStack_Release(stack);
2500 ok(!refcount, "Matrix stack has %u references left.\n", refcount);
2501 }
2502
test_Matrix_AffineTransformation2D(void)2503 static void test_Matrix_AffineTransformation2D(void)
2504 {
2505 D3DXMATRIX exp_mat, got_mat;
2506 D3DXVECTOR2 center, position;
2507 FLOAT angle, scale;
2508
2509 center.x = 3.0f;
2510 center.y = 4.0f;
2511
2512 position.x = -6.0f;
2513 position.y = 7.0f;
2514
2515 angle = D3DX_PI/3.0f;
2516
2517 scale = 20.0f;
2518
2519 U(exp_mat).m[0][0] = 10.0f;
2520 U(exp_mat).m[1][0] = -17.320507f;
2521 U(exp_mat).m[2][0] = 0.0f;
2522 U(exp_mat).m[3][0] = -1.035898f;
2523 U(exp_mat).m[0][1] = 17.320507f;
2524 U(exp_mat).m[1][1] = 10.0f;
2525 U(exp_mat).m[2][1] = 0.0f;
2526 U(exp_mat).m[3][1] = 6.401924f;
2527 U(exp_mat).m[0][2] = 0.0f;
2528 U(exp_mat).m[1][2] = 0.0f;
2529 U(exp_mat).m[2][2] = 1.0f;
2530 U(exp_mat).m[3][2] = 0.0f;
2531 U(exp_mat).m[0][3] = 0.0f;
2532 U(exp_mat).m[1][3] = 0.0f;
2533 U(exp_mat).m[2][3] = 0.0f;
2534 U(exp_mat).m[3][3] = 1.0f;
2535
2536 D3DXMatrixAffineTransformation2D(&got_mat, scale, ¢er, angle, &position);
2537 expect_matrix(&exp_mat, &got_mat, 2);
2538
2539 /*______________*/
2540
2541 center.x = 3.0f;
2542 center.y = 4.0f;
2543
2544 angle = D3DX_PI/3.0f;
2545
2546 scale = 20.0f;
2547
2548 U(exp_mat).m[0][0] = 10.0f;
2549 U(exp_mat).m[1][0] = -17.320507f;
2550 U(exp_mat).m[2][0] = 0.0f;
2551 U(exp_mat).m[3][0] = 4.964102f;
2552 U(exp_mat).m[0][1] = 17.320507f;
2553 U(exp_mat).m[1][1] = 10.0f;
2554 U(exp_mat).m[2][1] = 0.0f;
2555 U(exp_mat).m[3][1] = -0.598076f;
2556 U(exp_mat).m[0][2] = 0.0f;
2557 U(exp_mat).m[1][2] = 0.0f;
2558 U(exp_mat).m[2][2] = 1.0f;
2559 U(exp_mat).m[3][2] = 0.0f;
2560 U(exp_mat).m[0][3] = 0.0f;
2561 U(exp_mat).m[1][3] = 0.0f;
2562 U(exp_mat).m[2][3] = 0.0f;
2563 U(exp_mat).m[3][3] = 1.0f;
2564
2565 D3DXMatrixAffineTransformation2D(&got_mat, scale, ¢er, angle, NULL);
2566 expect_matrix(&exp_mat, &got_mat, 8);
2567
2568 /*______________*/
2569
2570 position.x = -6.0f;
2571 position.y = 7.0f;
2572
2573 angle = D3DX_PI/3.0f;
2574
2575 scale = 20.0f;
2576
2577 U(exp_mat).m[0][0] = 10.0f;
2578 U(exp_mat).m[1][0] = -17.320507f;
2579 U(exp_mat).m[2][0] = 0.0f;
2580 U(exp_mat).m[3][0] = -6.0f;
2581 U(exp_mat).m[0][1] = 17.320507f;
2582 U(exp_mat).m[1][1] = 10.0f;
2583 U(exp_mat).m[2][1] = 0.0f;
2584 U(exp_mat).m[3][1] = 7.0f;
2585 U(exp_mat).m[0][2] = 0.0f;
2586 U(exp_mat).m[1][2] = 0.0f;
2587 U(exp_mat).m[2][2] = 1.0f;
2588 U(exp_mat).m[3][2] = 0.0f;
2589 U(exp_mat).m[0][3] = 0.0f;
2590 U(exp_mat).m[1][3] = 0.0f;
2591 U(exp_mat).m[2][3] = 0.0f;
2592 U(exp_mat).m[3][3] = 1.0f;
2593
2594 D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, &position);
2595 expect_matrix(&exp_mat, &got_mat, 1);
2596
2597 /*______________*/
2598
2599 angle = 5.0f * D3DX_PI/4.0f;
2600
2601 scale = -20.0f;
2602
2603 U(exp_mat).m[0][0] = 14.142133f;
2604 U(exp_mat).m[1][0] = -14.142133f;
2605 U(exp_mat).m[2][0] = 0.0f;
2606 U(exp_mat).m[3][0] = 0.0f;
2607 U(exp_mat).m[0][1] = 14.142133;
2608 U(exp_mat).m[1][1] = 14.142133f;
2609 U(exp_mat).m[2][1] = 0.0f;
2610 U(exp_mat).m[3][1] = 0.0f;
2611 U(exp_mat).m[0][2] = 0.0f;
2612 U(exp_mat).m[1][2] = 0.0f;
2613 U(exp_mat).m[2][2] = 1.0f;
2614 U(exp_mat).m[3][2] = 0.0f;
2615 U(exp_mat).m[0][3] = 0.0f;
2616 U(exp_mat).m[1][3] = 0.0f;
2617 U(exp_mat).m[2][3] = 0.0f;
2618 U(exp_mat).m[3][3] = 1.0f;
2619
2620 D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, NULL);
2621 expect_matrix(&exp_mat, &got_mat, 8);
2622 }
2623
test_Matrix_Decompose(void)2624 static void test_Matrix_Decompose(void)
2625 {
2626 D3DXMATRIX pm;
2627 D3DXQUATERNION exp_rotation, got_rotation;
2628 D3DXVECTOR3 exp_scale, got_scale, exp_translation, got_translation;
2629 HRESULT hr;
2630 BOOL equal;
2631
2632 /*___________*/
2633
2634 U(pm).m[0][0] = -9.23879206e-01f;
2635 U(pm).m[1][0] = -2.70598412e-01f;
2636 U(pm).m[2][0] = 2.70598441e-01f;
2637 U(pm).m[3][0] = -5.00000000e+00f;
2638 U(pm).m[0][1] = 2.70598471e-01f;
2639 U(pm).m[1][1] = 3.80604863e-02f;
2640 U(pm).m[2][1] = 9.61939573e-01f;
2641 U(pm).m[3][1] = 0.00000000e+00f;
2642 U(pm).m[0][2] = -2.70598441e-01f;
2643 U(pm).m[1][2] = 9.61939573e-01f;
2644 U(pm).m[2][2] = 3.80603075e-02f;
2645 U(pm).m[3][2] = 1.00000000e+01f;
2646 U(pm).m[0][3] = 0.00000000e+00f;
2647 U(pm).m[1][3] = 0.00000000e+00f;
2648 U(pm).m[2][3] = 0.00000000e+00f;
2649 U(pm).m[3][3] = 1.00000000e+00f;
2650
2651 exp_scale.x = 9.99999881e-01f;
2652 exp_scale.y = 9.99999881e-01f;
2653 exp_scale.z = 9.99999881e-01f;
2654
2655 exp_rotation.x = 2.14862776e-08f;
2656 exp_rotation.y = 6.93519890e-01f;
2657 exp_rotation.z = 6.93519890e-01f;
2658 exp_rotation.w = 1.95090637e-01f;
2659
2660 exp_translation.x = -5.0f;
2661 exp_translation.y = 0.0f;
2662 exp_translation.z = 10.0f;
2663
2664 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2665 expect_vec3(&exp_scale, &got_scale, 1);
2666 expect_quaternion(&exp_rotation, &got_rotation, 1);
2667 expect_vec3(&exp_translation, &got_translation, 0);
2668
2669 /*_________*/
2670
2671 U(pm).m[0][0] = -2.255813f;
2672 U(pm).m[1][0] = 1.302324f;
2673 U(pm).m[2][0] = 1.488373f;
2674 U(pm).m[3][0] = 1.0f;
2675 U(pm).m[0][1] = 1.302327f;
2676 U(pm).m[1][1] = -0.7209296f;
2677 U(pm).m[2][1] = 2.60465f;
2678 U(pm).m[3][1] = 2.0f;
2679 U(pm).m[0][2] = 1.488371f;
2680 U(pm).m[1][2] = 2.604651f;
2681 U(pm).m[2][2] = -0.02325551f;
2682 U(pm).m[3][2] = 3.0f;
2683 U(pm).m[0][3] = 0.0f;
2684 U(pm).m[1][3] = 0.0f;
2685 U(pm).m[2][3] = 0.0f;
2686 U(pm).m[3][3] = 1.0f;
2687
2688 exp_scale.x = 2.99999928e+00f;
2689 exp_scale.y = 2.99999905e+00f;
2690 exp_scale.z = 2.99999952e+00f;
2691
2692 exp_rotation.x = 3.52180451e-01f;
2693 exp_rotation.y = 6.16315663e-01f;
2694 exp_rotation.z = 7.04360664e-01f;
2695 exp_rotation.w = 3.38489343e-07f;
2696
2697 exp_translation.x = 1.0f;
2698 exp_translation.y = 2.0f;
2699 exp_translation.z = 3.0f;
2700
2701 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2702 expect_vec3(&exp_scale, &got_scale, 0);
2703 expect_quaternion(&exp_rotation, &got_rotation, 2);
2704 expect_vec3(&exp_translation, &got_translation, 0);
2705
2706 /*_____________*/
2707
2708 U(pm).m[0][0] = 2.427051f;
2709 U(pm).m[1][0] = 0.0f;
2710 U(pm).m[2][0] = 1.763355f;
2711 U(pm).m[3][0] = 5.0f;
2712 U(pm).m[0][1] = 0.0f;
2713 U(pm).m[1][1] = 3.0f;
2714 U(pm).m[2][1] = 0.0f;
2715 U(pm).m[3][1] = 5.0f;
2716 U(pm).m[0][2] = -1.763355f;
2717 U(pm).m[1][2] = 0.0f;
2718 U(pm).m[2][2] = 2.427051f;
2719 U(pm).m[3][2] = 5.0f;
2720 U(pm).m[0][3] = 0.0f;
2721 U(pm).m[1][3] = 0.0f;
2722 U(pm).m[2][3] = 0.0f;
2723 U(pm).m[3][3] = 1.0f;
2724
2725 exp_scale.x = 2.99999976e+00f;
2726 exp_scale.y = 3.00000000e+00f;
2727 exp_scale.z = 2.99999976e+00f;
2728
2729 exp_rotation.x = 0.00000000e+00f;
2730 exp_rotation.y = 3.09016883e-01f;
2731 exp_rotation.z = 0.00000000e+00f;
2732 exp_rotation.w = 9.51056540e-01f;
2733
2734 exp_translation.x = 5.0f;
2735 exp_translation.y = 5.0f;
2736 exp_translation.z = 5.0f;
2737
2738 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2739 expect_vec3(&exp_scale, &got_scale, 1);
2740 expect_quaternion(&exp_rotation, &got_rotation, 1);
2741 expect_vec3(&exp_translation, &got_translation, 0);
2742
2743 /*_____________*/
2744
2745 U(pm).m[0][0] = -9.23879206e-01f;
2746 U(pm).m[1][0] = -2.70598412e-01f;
2747 U(pm).m[2][0] = 2.70598441e-01f;
2748 U(pm).m[3][0] = -5.00000000e+00f;
2749 U(pm).m[0][1] = 2.70598471e-01f;
2750 U(pm).m[1][1] = 3.80604863e-02f;
2751 U(pm).m[2][1] = 9.61939573e-01f;
2752 U(pm).m[3][1] = 0.00000000e+00f;
2753 U(pm).m[0][2] = -2.70598441e-01f;
2754 U(pm).m[1][2] = 9.61939573e-01f;
2755 U(pm).m[2][2] = 3.80603075e-02f;
2756 U(pm).m[3][2] = 1.00000000e+01f;
2757 U(pm).m[0][3] = 0.00000000e+00f;
2758 U(pm).m[1][3] = 0.00000000e+00f;
2759 U(pm).m[2][3] = 0.00000000e+00f;
2760 U(pm).m[3][3] = 1.00000000e+00f;
2761
2762 exp_scale.x = 9.99999881e-01f;
2763 exp_scale.y = 9.99999881e-01f;
2764 exp_scale.z = 9.99999881e-01f;
2765
2766 exp_rotation.x = 2.14862776e-08f;
2767 exp_rotation.y = 6.93519890e-01f;
2768 exp_rotation.z = 6.93519890e-01f;
2769 exp_rotation.w = 1.95090637e-01f;
2770
2771 exp_translation.x = -5.0f;
2772 exp_translation.y = 0.0f;
2773 exp_translation.z = 10.0f;
2774
2775 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2776 expect_vec3(&exp_scale, &got_scale, 1);
2777 expect_quaternion(&exp_rotation, &got_rotation, 1);
2778 expect_vec3(&exp_translation, &got_translation, 0);
2779
2780 /*__________*/
2781
2782 U(pm).m[0][0] = -9.23878908e-01f;
2783 U(pm).m[1][0] = -5.41196704e-01f;
2784 U(pm).m[2][0] = 8.11795175e-01f;
2785 U(pm).m[3][0] = -5.00000000e+00f;
2786 U(pm).m[0][1] = 2.70598322e-01f;
2787 U(pm).m[1][1] = 7.61209577e-02f;
2788 U(pm).m[2][1] = 2.88581824e+00f;
2789 U(pm).m[3][1] = 0.00000000e+00f;
2790 U(pm).m[0][2] = -2.70598352e-01f;
2791 U(pm).m[1][2] = 1.92387879e+00f;
2792 U(pm).m[2][2] = 1.14180908e-01f;
2793 U(pm).m[3][2] = 1.00000000e+01f;
2794 U(pm).m[0][3] = 0.00000000e+00f;
2795 U(pm).m[1][3] = 0.00000000e+00f;
2796 U(pm).m[2][3] = 0.00000000e+00f;
2797 U(pm).m[3][3] = 1.00000000e+00f;
2798
2799 exp_scale.x = 9.99999583e-01f;
2800 exp_scale.y = 1.99999940e+00f;
2801 exp_scale.z = 2.99999928e+00f;
2802
2803 exp_rotation.x = 1.07431388e-08f;
2804 exp_rotation.y = 6.93519890e-01f;
2805 exp_rotation.z = 6.93519831e-01f;
2806 exp_rotation.w = 1.95090622e-01f;
2807
2808 exp_translation.x = -5.0f;
2809 exp_translation.y = 0.0f;
2810 exp_translation.z = 10.0f;
2811
2812 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2813 expect_vec3(&exp_scale, &got_scale, 1);
2814 equal = compare_quaternion(&exp_rotation, &got_rotation, 1);
2815 exp_rotation.x = 0.0f;
2816 equal |= compare_quaternion(&exp_rotation, &got_rotation, 2);
2817 ok(equal, "Got unexpected quaternion {%.8e, %.8e, %.8e, %.8e}.\n",
2818 got_rotation.x, got_rotation.y, got_rotation.z, got_rotation.w);
2819 expect_vec3(&exp_translation, &got_translation, 0);
2820
2821 /*__________*/
2822
2823 U(pm).m[0][0] = 0.7156004f;
2824 U(pm).m[1][0] = -0.5098283f;
2825 U(pm).m[2][0] = -0.4774843f;
2826 U(pm).m[3][0] = -5.0f;
2827 U(pm).m[0][1] = -0.6612288f;
2828 U(pm).m[1][1] = -0.7147621f;
2829 U(pm).m[2][1] = -0.2277977f;
2830 U(pm).m[3][1] = 0.0f;
2831 U(pm).m[0][2] = -0.2251499f;
2832 U(pm).m[1][2] = 0.4787385f;
2833 U(pm).m[2][2] = -0.8485972f;
2834 U(pm).m[3][2] = 10.0f;
2835 U(pm).m[0][3] = 0.0f;
2836 U(pm).m[1][3] = 0.0f;
2837 U(pm).m[2][3] = 0.0f;
2838 U(pm).m[3][3] = 1.0f;
2839
2840 exp_scale.x = 9.99999940e-01f;
2841 exp_scale.y = 1.00000012e+00f;
2842 exp_scale.z = 1.00000012e+00f;
2843
2844 exp_rotation.x = 9.05394852e-01f;
2845 exp_rotation.y = -3.23355347e-01f;
2846 exp_rotation.z = -1.94013178e-01f;
2847 exp_rotation.w = 1.95090592e-01f;
2848
2849 exp_translation.x = -5.0f;
2850 exp_translation.y = 0.0f;
2851 exp_translation.z = 10.0f;
2852
2853 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2854 expect_vec3(&exp_scale, &got_scale, 0);
2855 expect_quaternion(&exp_rotation, &got_rotation, 1);
2856 expect_vec3(&exp_translation, &got_translation, 0);
2857
2858 /*_____________*/
2859
2860 U(pm).m[0][0] = 0.06554436f;
2861 U(pm).m[1][0] = -0.6873012f;
2862 U(pm).m[2][0] = 0.7234092f;
2863 U(pm).m[3][0] = -5.0f;
2864 U(pm).m[0][1] = -0.9617381f;
2865 U(pm).m[1][1] = -0.2367795f;
2866 U(pm).m[2][1] = -0.1378230f;
2867 U(pm).m[3][1] = 0.0f;
2868 U(pm).m[0][2] = 0.2660144f;
2869 U(pm).m[1][2] = -0.6866967f;
2870 U(pm).m[2][2] = -0.6765233f;
2871 U(pm).m[3][2] = 10.0f;
2872 U(pm).m[0][3] = 0.0f;
2873 U(pm).m[1][3] = 0.0f;
2874 U(pm).m[2][3] = 0.0f;
2875 U(pm).m[3][3] = 1.0f;
2876
2877 exp_scale.x = 9.99999940e-01f;
2878 exp_scale.y = 9.99999940e-01f;
2879 exp_scale.z = 9.99999881e-01f;
2880
2881 exp_rotation.x = 7.03357518e-01f;
2882 exp_rotation.y = -5.86131275e-01f;
2883 exp_rotation.z = 3.51678789e-01f;
2884 exp_rotation.w = -1.95090577e-01f;
2885
2886 exp_translation.x = -5.0f;
2887 exp_translation.y = 0.0f;
2888 exp_translation.z = 10.0f;
2889
2890 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2891 expect_vec3(&exp_scale, &got_scale, 1);
2892 expect_quaternion(&exp_rotation, &got_rotation, 2);
2893 expect_vec3(&exp_translation, &got_translation, 0);
2894
2895 /*_________*/
2896
2897 U(pm).m[0][0] = 7.12104797e+00f;
2898 U(pm).m[1][0] = -5.88348627e+00f;
2899 U(pm).m[2][0] = 1.18184204e+01f;
2900 U(pm).m[3][0] = -5.00000000e+00f;
2901 U(pm).m[0][1] = 5.88348627e+00f;
2902 U(pm).m[1][1] = -1.06065865e+01f;
2903 U(pm).m[2][1] = -8.82523251e+00f;
2904 U(pm).m[3][1] = 0.00000000e+00f;
2905 U(pm).m[0][2] = 1.18184204e+01f;
2906 U(pm).m[1][2] = 8.82523155e+00f;
2907 U(pm).m[2][2] = -2.72764111e+00f;
2908 U(pm).m[3][2] = 2.00000000e+00f;
2909 U(pm).m[0][3] = 0.00000000e+00f;
2910 U(pm).m[1][3] = 0.00000000e+00f;
2911 U(pm).m[2][3] = 0.00000000e+00f;
2912 U(pm).m[3][3] = 1.00000000e+00f;
2913
2914 exp_scale.x = 1.49999933e+01f;
2915 exp_scale.y = 1.49999933e+01f;
2916 exp_scale.z = 1.49999943e+01f;
2917
2918 exp_rotation.x = 7.68714130e-01f;
2919 exp_rotation.y = 0.00000000e+00f;
2920 exp_rotation.z = 5.12475967e-01f;
2921 exp_rotation.w = 3.82683903e-01f;
2922
2923 exp_translation.x = -5.0f;
2924 exp_translation.y = 0.0f;
2925 exp_translation.z = 2.0f;
2926
2927 D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2928 expect_vec3(&exp_scale, &got_scale, 0);
2929 expect_quaternion(&exp_rotation, &got_rotation, 1);
2930 expect_vec3(&exp_translation, &got_translation, 0);
2931
2932 /*__________*/
2933
2934 U(pm).m[0][0] = 0.0f;
2935 U(pm).m[1][0] = 4.0f;
2936 U(pm).m[2][0] = 5.0f;
2937 U(pm).m[3][0] = -5.0f;
2938 U(pm).m[0][1] = 0.0f;
2939 U(pm).m[1][1] = -10.60660f;
2940 U(pm).m[2][1] = -8.825232f;
2941 U(pm).m[3][1] = 6.0f;
2942 U(pm).m[0][2] = 0.0f;
2943 U(pm).m[1][2] = 8.8252320f;
2944 U(pm).m[2][2] = 2.727645;
2945 U(pm).m[3][2] = 3.0f;
2946 U(pm).m[0][3] = 0.0f;
2947 U(pm).m[1][3] = 0.0f;
2948 U(pm).m[2][3] = 0.0f;
2949 U(pm).m[3][3] = 1.0f;
2950
2951 hr = D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm);
2952 ok(hr == D3DERR_INVALIDCALL, "Expected D3DERR_INVALIDCALL, got %x\n", hr);
2953 }
2954
test_Matrix_Transformation2D(void)2955 static void test_Matrix_Transformation2D(void)
2956 {
2957 D3DXMATRIX exp_mat, got_mat;
2958 D3DXVECTOR2 rot_center, sca, sca_center, trans;
2959 FLOAT rot, sca_rot;
2960
2961 rot_center.x = 3.0f;
2962 rot_center.y = 4.0f;
2963
2964 sca.x = 12.0f;
2965 sca.y = -3.0f;
2966
2967 sca_center.x = 9.0f;
2968 sca_center.y = -5.0f;
2969
2970 trans.x = -6.0f;
2971 trans.y = 7.0f;
2972
2973 rot = D3DX_PI/3.0f;
2974
2975 sca_rot = 5.0f*D3DX_PI/4.0f;
2976
2977 U(exp_mat).m[0][0] = -4.245192f;
2978 U(exp_mat).m[1][0] = -0.147116f;
2979 U(exp_mat).m[2][0] = 0.0f;
2980 U(exp_mat).m[3][0] = 45.265373f;
2981 U(exp_mat).m[0][1] = 7.647113f;
2982 U(exp_mat).m[1][1] = 8.745192f;
2983 U(exp_mat).m[2][1] = 0.0f;
2984 U(exp_mat).m[3][1] = -13.401899f;
2985 U(exp_mat).m[0][2] = 0.0f;
2986 U(exp_mat).m[1][2] = 0.0f;
2987 U(exp_mat).m[2][2] = 1.0f;
2988 U(exp_mat).m[3][2] = 0.0f;
2989 U(exp_mat).m[0][3] = 0.0f;
2990 U(exp_mat).m[1][3] = 0.0f;
2991 U(exp_mat).m[2][3] = 0.0f;
2992 U(exp_mat).m[3][3] = 1.0f;
2993
2994 D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, &sca, &rot_center, rot, &trans);
2995 expect_matrix(&exp_mat, &got_mat, 64);
2996
2997 /*_________*/
2998
2999 sca_center.x = 9.0f;
3000 sca_center.y = -5.0f;
3001
3002 trans.x = -6.0f;
3003 trans.y = 7.0f;
3004
3005 rot = D3DX_PI/3.0f;
3006
3007 sca_rot = 5.0f*D3DX_PI/4.0f;
3008
3009 U(exp_mat).m[0][0] = 0.50f;
3010 U(exp_mat).m[1][0] = -0.866025f;
3011 U(exp_mat).m[2][0] = 0.0f;
3012 U(exp_mat).m[3][0] = -6.0f;
3013 U(exp_mat).m[0][1] = 0.866025f;
3014 U(exp_mat).m[1][1] = 0.50f;
3015 U(exp_mat).m[2][1] = 0.0f;
3016 U(exp_mat).m[3][1] = 7.0f;
3017 U(exp_mat).m[0][2] = 0.0f;
3018 U(exp_mat).m[1][2] = 0.0f;
3019 U(exp_mat).m[2][2] = 1.0f;
3020 U(exp_mat).m[3][2] = 0.0f;
3021 U(exp_mat).m[0][3] = 0.0f;
3022 U(exp_mat).m[1][3] = 0.0f;
3023 U(exp_mat).m[2][3] = 0.0f;
3024 U(exp_mat).m[3][3] = 1.0f;
3025
3026 D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, NULL, NULL, rot, &trans);
3027 expect_matrix(&exp_mat, &got_mat, 8);
3028
3029 /*_________*/
3030
3031 U(exp_mat).m[0][0] = 0.50f;
3032 U(exp_mat).m[1][0] = -0.866025f;
3033 U(exp_mat).m[2][0] = 0.0f;
3034 U(exp_mat).m[3][0] = 0.0f;
3035 U(exp_mat).m[0][1] = 0.866025f;
3036 U(exp_mat).m[1][1] = 0.50f;
3037 U(exp_mat).m[2][1] = 0.0f;
3038 U(exp_mat).m[3][1] = 0.0f;
3039 U(exp_mat).m[0][2] = 0.0f;
3040 U(exp_mat).m[1][2] = 0.0f;
3041 U(exp_mat).m[2][2] = 1.0f;
3042 U(exp_mat).m[3][2] = 0.0f;
3043 U(exp_mat).m[0][3] = 0.0f;
3044 U(exp_mat).m[1][3] = 0.0f;
3045 U(exp_mat).m[2][3] = 0.0f;
3046 U(exp_mat).m[3][3] = 1.0f;
3047
3048 D3DXMatrixTransformation2D(&got_mat, NULL, sca_rot, NULL, NULL, rot, NULL);
3049 expect_matrix(&exp_mat, &got_mat, 8);
3050 }
3051
test_D3DXVec_Array(void)3052 static void test_D3DXVec_Array(void)
3053 {
3054 D3DXPLANE inp_plane[5], out_plane[7], exp_plane[7];
3055 D3DXVECTOR4 inp_vec[5], out_vec[7], exp_vec[7];
3056 D3DXMATRIX mat, projection, view, world;
3057 D3DVIEWPORT9 viewport;
3058 unsigned int i;
3059
3060 viewport.Width = 800; viewport.MinZ = 0.2f; viewport.X = 10;
3061 viewport.Height = 680; viewport.MaxZ = 0.9f; viewport.Y = 5;
3062
3063 memset(out_vec, 0, sizeof(out_vec));
3064 memset(exp_vec, 0, sizeof(exp_vec));
3065 memset(out_plane, 0, sizeof(out_plane));
3066 memset(exp_plane, 0, sizeof(exp_plane));
3067
3068 for (i = 0; i < ARRAY_SIZE(inp_vec); ++i)
3069 {
3070 inp_plane[i].a = inp_plane[i].c = inp_vec[i].x = inp_vec[i].z = i;
3071 inp_plane[i].b = inp_plane[i].d = inp_vec[i].y = inp_vec[i].w = ARRAY_SIZE(inp_vec) - i;
3072 }
3073
3074 set_matrix(&mat,
3075 1.0f, 2.0f, 3.0f, 4.0f,
3076 5.0f, 6.0f, 7.0f, 8.0f,
3077 9.0f, 10.0f, 11.0f, 12.0f,
3078 13.0f, 14.0f, 15.0f, 16.0f);
3079
3080 D3DXMatrixPerspectiveFovLH(&projection, D3DX_PI / 4.0f, 20.0f / 17.0f, 1.0f, 1000.0f);
3081
3082 U(view).m[0][1] = 5.0f; U(view).m[0][2] = 7.0f; U(view).m[0][3] = 8.0f;
3083 U(view).m[1][0] = 11.0f; U(view).m[1][2] = 16.0f; U(view).m[1][3] = 33.0f;
3084 U(view).m[2][0] = 19.0f; U(view).m[2][1] = -21.0f; U(view).m[2][3] = 43.0f;
3085 U(view).m[3][0] = 2.0f; U(view).m[3][1] = 3.0f; U(view).m[3][2] = -4.0f;
3086 U(view).m[0][0] = 10.0f; U(view).m[1][1] = 20.0f; U(view).m[2][2] = 30.0f;
3087 U(view).m[3][3] = -40.0f;
3088
3089 set_matrix(&world,
3090 21.0f, 2.0f, 3.0f, 4.0f,
3091 5.0f, 23.0f, 7.0f, 8.0f,
3092 -8.0f, -7.0f, 25.0f, -5.0f,
3093 -4.0f, -3.0f, -2.0f, 27.0f);
3094
3095 /* D3DXVec2TransformCoordArray */
3096 exp_vec[1].x = 6.78571403e-01f; exp_vec[1].y = 7.85714269e-01f;
3097 exp_vec[2].x = 6.53846204e-01f; exp_vec[2].y = 7.69230783e-01f;
3098 exp_vec[3].x = 6.25000000e-01f; exp_vec[3].y = 7.50000000e-01f;
3099 exp_vec[4].x = 5.90909123e-01f; exp_vec[4].y = 7.27272749e-01f;
3100 exp_vec[5].x = 5.49999952e-01f; exp_vec[5].y = 6.99999928e-01f;
3101 D3DXVec2TransformCoordArray((D3DXVECTOR2 *)&out_vec[1], sizeof(*out_vec),
3102 (D3DXVECTOR2 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec));
3103 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 1);
3104
3105 /* D3DXVec2TransformNormalArray */
3106 exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f;
3107 exp_vec[2].x = 21.0f; exp_vec[2].y = 26.0f;
3108 exp_vec[3].x = 17.0f; exp_vec[3].y = 22.0f;
3109 exp_vec[4].x = 13.0f; exp_vec[4].y = 18.0f;
3110 exp_vec[5].x = 9.0f; exp_vec[5].y = 14.0f;
3111 D3DXVec2TransformNormalArray((D3DXVECTOR2 *)&out_vec[1], sizeof(*out_vec),
3112 (D3DXVECTOR2 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec));
3113 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0);
3114
3115 /* D3DXVec3TransformCoordArray */
3116 exp_vec[1].x = 6.78571403e-01f; exp_vec[1].y = 7.85714269e-01f; exp_vec[1].z = 8.92857075e-01f;
3117 exp_vec[2].x = 6.71874940e-01f; exp_vec[2].y = 7.81249940e-01f; exp_vec[2].z = 8.90624940e-01f;
3118 exp_vec[3].x = 6.66666627e-01f; exp_vec[3].y = 7.77777731e-01f; exp_vec[3].z = 8.88888836e-01f;
3119 exp_vec[4].x = 6.62499964e-01f; exp_vec[4].y = 7.74999976e-01f; exp_vec[4].z = 8.87499928e-01f;
3120 exp_vec[5].x = 6.59090877e-01f; exp_vec[5].y = 7.72727251e-01f; exp_vec[5].z = 8.86363566e-01f;
3121 D3DXVec3TransformCoordArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec),
3122 (D3DXVECTOR3 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec));
3123 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 1);
3124
3125 /* D3DXVec3TransformNormalArray */
3126 exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f; exp_vec[1].z = 35.0f;
3127 exp_vec[2].x = 30.0f; exp_vec[2].y = 36.0f; exp_vec[2].z = 42.0f;
3128 exp_vec[3].x = 35.0f; exp_vec[3].y = 42.0f; exp_vec[3].z = 49.0f;
3129 exp_vec[4].x = 40.0f; exp_vec[4].y = 48.0f; exp_vec[4].z = 56.0f;
3130 exp_vec[5].x = 45.0f; exp_vec[5].y = 54.0f; exp_vec[5].z = 63.0f;
3131 D3DXVec3TransformNormalArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec),
3132 (D3DXVECTOR3 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec));
3133 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0);
3134
3135 /* D3DXVec3ProjectArray */
3136 exp_vec[1].x = 1.08955420e+03f; exp_vec[1].y = -2.26590622e+02f; exp_vec[1].z = 2.15272754e-01f;
3137 exp_vec[2].x = 1.06890344e+03f; exp_vec[2].y = 1.03085144e+02f; exp_vec[2].z = 1.83049560e-01f;
3138 exp_vec[3].x = 1.05177905e+03f; exp_vec[3].y = 3.76462280e+02f; exp_vec[3].z = 1.56329080e-01f;
3139 exp_vec[4].x = 1.03734888e+03f; exp_vec[4].y = 6.06827393e+02f; exp_vec[4].z = 1.33812696e-01f;
3140 exp_vec[5].x = 1.02502356e+03f; exp_vec[5].y = 8.03591248e+02f; exp_vec[5].z = 1.14580572e-01f;
3141 D3DXVec3ProjectArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec,
3142 sizeof(*inp_vec), &viewport, &projection, &view, &world, ARRAY_SIZE(inp_vec));
3143 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 8);
3144
3145 /* D3DXVec3UnprojectArray */
3146 exp_vec[1].x = -6.12403107e+00f; exp_vec[1].y = 3.22536016e+00f; exp_vec[1].z = 6.20571136e-01f;
3147 exp_vec[2].x = -3.80710936e+00f; exp_vec[2].y = 2.04657936e+00f; exp_vec[2].z = 4.46894377e-01f;
3148 exp_vec[3].x = -2.92283988e+00f; exp_vec[3].y = 1.59668946e+00f; exp_vec[3].z = 3.80609393e-01f;
3149 exp_vec[4].x = -2.45622563e+00f; exp_vec[4].y = 1.35928988e+00f; exp_vec[4].z = 3.45631927e-01f;
3150 exp_vec[5].x = -2.16789746e+00f; exp_vec[5].y = 1.21259713e+00f; exp_vec[5].z = 3.24018806e-01f;
3151 D3DXVec3UnprojectArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec,
3152 sizeof(*inp_vec), &viewport, &projection, &view, &world, ARRAY_SIZE(inp_vec));
3153 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 4);
3154
3155 /* D3DXVec2TransformArray */
3156 exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f;
3157 exp_vec[2].x = 34.0f; exp_vec[2].y = 40.0f; exp_vec[2].z = 46.0f; exp_vec[2].w = 52.0f;
3158 exp_vec[3].x = 30.0f; exp_vec[3].y = 36.0f; exp_vec[3].z = 42.0f; exp_vec[3].w = 48.0f;
3159 exp_vec[4].x = 26.0f; exp_vec[4].y = 32.0f; exp_vec[4].z = 38.0f; exp_vec[4].w = 44.0f;
3160 exp_vec[5].x = 22.0f; exp_vec[5].y = 28.0f; exp_vec[5].z = 34.0f; exp_vec[5].w = 40.0f;
3161 D3DXVec2TransformArray(&out_vec[1], sizeof(*out_vec), (D3DXVECTOR2 *)inp_vec,
3162 sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec));
3163 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0);
3164
3165 /* D3DXVec3TransformArray */
3166 exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f;
3167 exp_vec[2].x = 43.0f; exp_vec[2].y = 50.0f; exp_vec[2].z = 57.0f; exp_vec[2].w = 64.0f;
3168 exp_vec[3].x = 48.0f; exp_vec[3].y = 56.0f; exp_vec[3].z = 64.0f; exp_vec[3].w = 72.0f;
3169 exp_vec[4].x = 53.0f; exp_vec[4].y = 62.0f; exp_vec[4].z = 71.0f; exp_vec[4].w = 80.0f;
3170 exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f; exp_vec[5].z = 78.0f; exp_vec[5].w = 88.0f;
3171 D3DXVec3TransformArray(&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec,
3172 sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec));
3173 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0);
3174
3175 /* D3DXVec4TransformArray */
3176 exp_vec[1].x = 90.0f; exp_vec[1].y = 100.0f; exp_vec[1].z = 110.0f; exp_vec[1].w = 120.0f;
3177 exp_vec[2].x = 82.0f; exp_vec[2].y = 92.0f; exp_vec[2].z = 102.0f; exp_vec[2].w = 112.0f;
3178 exp_vec[3].x = 74.0f; exp_vec[3].y = 84.0f; exp_vec[3].z = 94.0f; exp_vec[3].w = 104.0f;
3179 exp_vec[4].x = 66.0f; exp_vec[4].y = 76.0f; exp_vec[4].z = 86.0f; exp_vec[4].w = 96.0f;
3180 exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f; exp_vec[5].z = 78.0f; exp_vec[5].w = 88.0f;
3181 D3DXVec4TransformArray(&out_vec[1], sizeof(*out_vec), inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec));
3182 expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0);
3183
3184 /* D3DXPlaneTransformArray */
3185 exp_plane[1].a = 90.0f; exp_plane[1].b = 100.0f; exp_plane[1].c = 110.0f; exp_plane[1].d = 120.0f;
3186 exp_plane[2].a = 82.0f; exp_plane[2].b = 92.0f; exp_plane[2].c = 102.0f; exp_plane[2].d = 112.0f;
3187 exp_plane[3].a = 74.0f; exp_plane[3].b = 84.0f; exp_plane[3].c = 94.0f; exp_plane[3].d = 104.0f;
3188 exp_plane[4].a = 66.0f; exp_plane[4].b = 76.0f; exp_plane[4].c = 86.0f; exp_plane[4].d = 96.0f;
3189 exp_plane[5].a = 58.0f; exp_plane[5].b = 68.0f; exp_plane[5].c = 78.0f; exp_plane[5].d = 88.0f;
3190 D3DXPlaneTransformArray(&out_plane[1], sizeof(*out_plane), inp_plane,
3191 sizeof(*inp_plane), &mat, ARRAY_SIZE(inp_plane));
3192 for (i = 0; i < ARRAY_SIZE(exp_plane); ++i)
3193 {
3194 BOOL equal = compare_plane(&exp_plane[i], &out_plane[i], 0);
3195 ok(equal, "Got unexpected plane {%.8e, %.8e, %.8e, %.8e} at index %u, expected {%.8e, %.8e, %.8e, %.8e}.\n",
3196 out_plane[i].a, out_plane[i].b, out_plane[i].c, out_plane[i].d, i,
3197 exp_plane[i].a, exp_plane[i].b, exp_plane[i].c, exp_plane[i].d);
3198 if (!equal)
3199 break;
3200 }
3201 }
3202
test_D3DXFloat_Array(void)3203 static void test_D3DXFloat_Array(void)
3204 {
3205 unsigned int i;
3206 void *out = NULL;
3207 D3DXFLOAT16 half;
3208 BOOL equal;
3209
3210 /* Input floats through bit patterns because compilers do not generate reliable INF and NaN values. */
3211 union convert
3212 {
3213 DWORD d;
3214 float f;
3215 } single;
3216
3217 struct
3218 {
3219 union convert single_in;
3220
3221 /* half_ver2 occurs on WXPPROSP3 (32 bit math), WVISTAADM (32/64 bit math), W7PRO (32 bit math) */
3222 WORD half_ver1, half_ver2;
3223
3224 /* single_out_ver2 confirms that half -> single conversion is consistent across platforms */
3225 union convert single_out_ver1, single_out_ver2;
3226 }
3227 testdata[] =
3228 {
3229 { { 0x479c4000 }, 0x7c00, 0x7ce2, { 0x47800000 }, { 0x479c4000 } }, /* 80000.0f */
3230 { { 0x477fdf00 }, 0x7bff, 0x7bff, { 0x477fe000 }, { 0x477fe000 } }, /* 65503.0f */
3231 { { 0x477fe000 }, 0x7bff, 0x7bff, { 0x477fe000 }, { 0x477fe000 } }, /* 65504.0f */
3232 { { 0x477ff000 }, 0x7bff, 0x7c00, { 0x477fe000 }, { 0x47800000 } }, /* 65520.0f */
3233 { { 0x477ff100 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65521.0f */
3234
3235 { { 0x477ffe00 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65534.0f */
3236 { { 0x477fff00 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65535.0f */
3237 { { 0x47800000 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65536.0f */
3238 { { 0xc79c4000 }, 0xfc00, 0xfce2, { 0xc7800000 }, { 0xc79c4000 } }, /* -80000.0f */
3239 { { 0xc77fdf00 }, 0xfbff, 0xfbff, { 0xc77fe000 }, { 0xc77fe000 } }, /* -65503.0f */
3240
3241 { { 0xc77fe000 }, 0xfbff, 0xfbff, { 0xc77fe000 }, { 0xc77fe000 } }, /* -65504.0f */
3242 { { 0xc77ff000 }, 0xfbff, 0xfc00, { 0xc77fe000 }, { 0xc7800000 } }, /* -65520.0f */
3243 { { 0xc77ff100 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65521.0f */
3244 { { 0xc77ffe00 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65534.0f */
3245 { { 0xc77fff00 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65535.0f */
3246
3247 { { 0xc7800000 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65536.0f */
3248 { { 0x7f800000 }, 0x7c00, 0x7fff, { 0x47800000 }, { 0x47ffe000 } }, /* INF */
3249 { { 0xff800000 }, 0xffff, 0xffff, { 0xc7ffe000 }, { 0xc7ffe000 } }, /* -INF */
3250 { { 0x7fc00000 }, 0x7fff, 0xffff, { 0x47ffe000 }, { 0xc7ffe000 } }, /* NaN */
3251 { { 0xffc00000 }, 0xffff, 0xffff, { 0xc7ffe000 }, { 0xc7ffe000 } }, /* -NaN */
3252
3253 { { 0x00000000 }, 0x0000, 0x0000, { 0x00000000 }, { 0x00000000 } }, /* 0.0f */
3254 { { 0x80000000 }, 0x8000, 0x8000, { 0x80000000 }, { 0x80000000 } }, /* -0.0f */
3255 { { 0x330007ff }, 0x0000, 0x0000, { 0x00000000 }, { 0x00000000 } }, /* 2.9809595e-08f */
3256 { { 0xb30007ff }, 0x8000, 0x8000, { 0x80000000 }, { 0x80000000 } }, /* -2.9809595e-08f */
3257 { { 0x33000800 }, 0x0001, 0x0000, { 0x33800000 }, { 0x00000000 } }, /* 2.9809598e-08f */
3258
3259 { { 0xb3000800 }, 0x8001, 0x8000, { 0xb3800000 }, { 0x80000000 } }, /* -2.9809598e-08f */
3260 { { 0x33c00000 }, 0x0002, 0x0001, { 0x34000000 }, { 0x33800000 } }, /* 8.9406967e-08f */
3261 };
3262
3263 /* exception on NULL out or in parameter */
3264 out = D3DXFloat32To16Array(&half, &single.f, 0);
3265 ok(out == &half, "Got %p, expected %p.\n", out, &half);
3266
3267 out = D3DXFloat16To32Array(&single.f, &half, 0);
3268 ok(out == &single.f, "Got %p, expected %p.\n", out, &single.f);
3269
3270 for (i = 0; i < ARRAY_SIZE(testdata); ++i)
3271 {
3272 out = D3DXFloat32To16Array(&half, &testdata[i].single_in.f, 1);
3273 ok(out == &half, "Got %p, expected %p.\n", out, &half);
3274 ok(half.value == testdata[i].half_ver1 || half.value == testdata[i].half_ver2,
3275 "Got %x, expected %x or %x for index %d.\n", half.value, testdata[i].half_ver1,
3276 testdata[i].half_ver2, i);
3277
3278 out = D3DXFloat16To32Array(&single.f, (D3DXFLOAT16 *)&testdata[i].half_ver1, 1);
3279 ok(out == &single.f, "Got %p, expected %p.\n", out, &single.f);
3280 equal = compare_float(single.f, testdata[i].single_out_ver1.f, 0);
3281 ok(equal, "Got %#x, expected %#x at index %u.\n", single.d, testdata[i].single_out_ver1.d, i);
3282
3283 out = D3DXFloat16To32Array(&single.f, (D3DXFLOAT16 *)&testdata[i].half_ver2, 1);
3284 ok(out == &single.f, "Got %p, expected %p.\n", out, &single.f);
3285 equal = compare_float(single.f, testdata[i].single_out_ver2.f, 0);
3286 ok(equal, "Got %#x, expected %#x at index %u.\n", single.d, testdata[i].single_out_ver2.d, i);
3287 }
3288 }
3289
test_D3DXSHAdd(void)3290 static void test_D3DXSHAdd(void)
3291 {
3292 float out[50] = {0.0f};
3293 unsigned int i, k;
3294 float *ret;
3295 BOOL equal;
3296
3297 static const float in1[50] =
3298 {
3299 1.11f, 1.12f, 1.13f, 1.14f, 1.15f, 1.16f, 1.17f, 1.18f,
3300 1.19f, 1.20f, 1.21f, 1.22f, 1.23f, 1.24f, 1.25f, 1.26f,
3301 1.27f, 1.28f, 1.29f, 1.30f, 1.31f, 1.32f, 1.33f, 1.34f,
3302 1.35f, 1.36f, 1.37f, 1.38f, 1.39f, 1.40f, 1.41f, 1.42f,
3303 1.43f, 1.44f, 1.45f, 1.46f, 1.47f, 1.48f, 1.49f, 1.50f,
3304 1.51f, 1.52f, 1.53f, 1.54f, 1.55f, 1.56f, 1.57f, 1.58f,
3305 1.59f, 1.60f,
3306 };
3307 static const float in2[50] =
3308 {
3309 2.11f, 2.12f, 2.13f, 2.14f, 2.15f, 2.16f, 2.17f, 2.18f,
3310 2.19f, 2.20f, 2.21f, 2.22f, 2.23f, 2.24f, 2.25f, 2.26f,
3311 2.27f, 2.28f, 2.29f, 2.30f, 2.31f, 2.32f, 2.33f, 2.34f,
3312 2.35f, 2.36f, 2.37f, 2.38f, 2.39f, 2.40f, 2.41f, 2.42f,
3313 2.43f, 2.44f, 2.45f, 2.46f, 2.47f, 2.48f, 2.49f, 2.50f,
3314 2.51f, 2.52f, 2.53f, 2.54f, 2.55f, 2.56f, 2.57f, 2.58f,
3315 2.59f, 2.60f,
3316 };
3317
3318 /*
3319 * Order is not limited by D3DXSH_MINORDER and D3DXSH_MAXORDER!
3320 * All values will work, test from 0-7 [D3DXSH_MINORDER = 2, D3DXSH_MAXORDER = 6]
3321 * Exceptions will show up when out, in1 or in2 is NULL
3322 */
3323 for (k = 0; k <= D3DXSH_MAXORDER + 1; k++)
3324 {
3325 UINT count = k * k;
3326
3327 ret = D3DXSHAdd(&out[0], k, &in1[0], &in2[0]);
3328 ok(ret == out, "%u: D3DXSHAdd() failed, got %p, expected %p\n", k, out, ret);
3329
3330 for (i = 0; i < count; ++i)
3331 {
3332 equal = compare_float(in1[i] + in2[i], out[i], 0);
3333 ok(equal, "%u-%u: Got %.8e, expected %.8e.\n", k, i, out[i], in1[i] + in2[i]);
3334 }
3335 equal = compare_float(out[count], 0.0f, 0);
3336 ok(equal, "%u-%u: Got %.8e, expected 0.0.\n", k, k * k, out[count]);
3337 }
3338 }
3339
test_D3DXSHDot(void)3340 static void test_D3DXSHDot(void)
3341 {
3342 float a[49], b[49], got;
3343 unsigned int i;
3344 BOOL equal;
3345
3346 static const float expected[] = {0.5f, 0.5f, 25.0f, 262.5f, 1428.0f, 5362.5f, 15873.0f, 39812.5f};
3347
3348 for (i = 0; i < ARRAY_SIZE(a); ++i)
3349 {
3350 a[i] = i + 1.0f;
3351 b[i] = i + 0.5f;
3352 }
3353
3354 /* D3DXSHDot computes by using order * order elements */
3355 for (i = 0; i <= D3DXSH_MAXORDER + 1; i++)
3356 {
3357 got = D3DXSHDot(i, a, b);
3358 equal = compare_float(got, expected[i], 0);
3359 ok(equal, "order %u: Got %.8e, expected %.8e.\n", i, got, expected[i]);
3360 }
3361 }
3362
test_D3DXSHEvalConeLight(void)3363 static void test_D3DXSHEvalConeLight(void)
3364 {
3365 float bout[49], expected, gout[49], rout[49];
3366 unsigned int j, l, order;
3367 D3DXVECTOR3 dir;
3368 HRESULT hr;
3369 BOOL equal;
3370
3371 static const float table[] =
3372 {
3373 /* Red colour */
3374 1.604815f, -3.131381f, 7.202175f, -2.870432f, 6.759296f, -16.959688f,
3375 32.303082f, -15.546381f, -0.588878f, -5.902123f, 40.084042f, -77.423569f,
3376 137.556320f, -70.971603f, -3.492171f, 7.683092f, -2.129311f, -35.971344f,
3377 183.086548f, -312.414948f, 535.091064f, -286.380371f, -15.950727f, 46.825714f,
3378 -12.127637f, 11.289261f, -12.417809f, -155.039566f, 681.182556f, -1079.733643f,
3379 1807.650513f, -989.755798f, -59.345467f, 201.822815f, -70.726486f, 7.206529f,
3380
3381 3.101155f, -3.128710f, 7.196033f, -2.867984f, -0.224708f, 0.563814f,
3382 -1.073895f, 0.516829f, 0.019577f, 2.059788f, -13.988971f, 27.020128f,
3383 -48.005917f, 24.768450f, 1.218736f, -2.681329f, -0.088639f, -1.497410f,
3384 7.621501f, -13.005165f, 22.274696f, -11.921401f, -0.663995f, 1.949254f,
3385 -0.504848f, 4.168484f, -4.585193f, -57.247314f, 251.522095f, -398.684387f,
3386 667.462891f, -365.460693f, -21.912912f, 74.521721f, -26.115280f, 2.660963f,
3387 /* Green colour */
3388 2.454422f, -4.789170f, 11.015091f, -4.390072f, 10.337747f, -25.938347f,
3389 49.404713f, -23.776817f, -0.900637f, -9.026776f, 61.305000f, -118.412514f,
3390 210.380249f, -108.544792f, -5.340967f, 11.750610f, -3.256593f, -55.014996f,
3391 280.014709f, -477.811066f, 818.374512f, -437.993469f, -24.395227f, 71.615799f,
3392 -18.548151f, 17.265928f, -18.991943f, -237.119324f, 1041.808594f, -1651.357300f,
3393 2764.642090f, -1513.744141f, -90.763657f, 308.670197f, -108.169922f, 11.021750f,
3394
3395 4.742942f, -4.785086f, 11.005697f, -4.386329f, -0.343672f, 0.862303f,
3396 -1.642427f, 0.790444f, 0.029941f, 3.150264f, -21.394896f, 41.324898f,
3397 -73.420807f, 37.881153f, 1.863950f, -4.100857f, -0.135565f, -2.290156f,
3398 11.656413f, -19.890251f, 34.067181f, -18.232729f, -1.015521f, 2.981212f,
3399 -0.772120f, 6.375328f, -7.012648f, -87.554710f, 384.680817f, -609.752563f,
3400 1020.825500f, -558.939819f, -33.513863f, 113.974388f, -39.941013f, 4.069707f,
3401 /* Blue colour */
3402 3.304030f, -6.446959f, 14.828006f, -5.909713f, 13.916198f, -34.917004f,
3403 66.506340f, -32.007256f, -1.212396f, -12.151429f, 82.525963f, -159.401459f,
3404 283.204193f, -146.117996f, -7.189764f, 15.818130f, -4.383876f, -74.058655f,
3405 376.942871f, -643.207214f, 1101.658081f, -589.606628f, -32.839729f, 96.405884f,
3406 -24.968664f, 23.242596f, -25.566080f, -319.199097f, 1402.434692f, -2222.980957f,
3407 3721.633545f, -2037.732544f, -122.181847f, 415.517578f, -145.613358f, 14.836972f,
3408
3409 6.384730f, -6.441462f, 14.815362f, -5.904673f, -0.462635f, 1.160793f,
3410 -2.210959f, 1.064060f, 0.040305f, 4.240739f, -28.800821f, 55.629673f,
3411 -98.835709f, 50.993862f, 2.509163f, -5.520384f, -0.182491f, -3.082903f,
3412 15.691326f, -26.775339f, 45.859665f, -24.544060f, -1.367048f, 4.013170f,
3413 -1.039392f, 8.582172f, -9.440103f, -117.862114f, 517.839600f, -820.820740f,
3414 1374.188232f, -752.419067f, -45.114819f, 153.427063f, -53.766754f, 5.478452f, };
3415 const struct
3416 {
3417 float *red_received, *green_received, *blue_received;
3418 const float *red_expected, *green_expected, *blue_expected;
3419 float radius, roffset, goffset, boffset;
3420 }
3421 test[] =
3422 {
3423 { rout, gout, bout, table, &table[72], &table[144], 0.5f, 1.01f, 1.02f, 1.03f, },
3424 { rout, gout, bout, &table[36], &table[108], &table[180], 1.6f, 1.01f, 1.02f, 1.03f, },
3425 { rout, rout, rout, &table[144], &table[144], &table[144], 0.5f, 1.03f, 1.03f, 1.03f, },
3426 { rout, rout, bout, &table[72], &table[72], &table[144], 0.5, 1.02f, 1.02f, 1.03f, },
3427 { rout, gout, gout, table, &table[144], &table[144], 0.5f, 1.01f, 1.03f, 1.03f, },
3428 { rout, gout, rout, &table[144], &table[72], &table[144], 0.5f, 1.03f, 1.02f, 1.03f, },
3429 /* D3DXSHEvalConeLight accepts NULL green or blue colour. */
3430 { rout, NULL, bout, table, NULL, &table[144], 0.5f, 1.01f, 0.0f, 1.03f, },
3431 { rout, gout, NULL, table, &table[72], NULL, 0.5f, 1.01f, 1.02f, 0.0f, },
3432 { rout, NULL, NULL, table, NULL, NULL, 0.5f, 1.01f, 0.0f, 0.0f, },
3433 };
3434
3435 dir.x = 1.1f; dir.y = 1.2f; dir.z = 2.76f;
3436
3437 for (l = 0; l < ARRAY_SIZE(test); ++l)
3438 {
3439 for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++)
3440 {
3441 for (j = 0; j < 49; j++)
3442 {
3443 test[l].red_received[j] = 1.01f + j;
3444 if (test[l].green_received)
3445 test[l].green_received[j] = 1.02f + j;
3446 if (test[l].blue_received)
3447 test[l].blue_received[j] = 1.03f + j;
3448 }
3449
3450 hr = D3DXSHEvalConeLight(order, &dir, test[l].radius, 1.7f, 2.6f, 3.5f, test[l].red_received, test[l].green_received, test[l].blue_received);
3451 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3452
3453 for (j = 0; j < 49; j++)
3454 {
3455 if (j >= order * order)
3456 expected = j + test[l].roffset;
3457 else
3458 expected = test[l].red_expected[j];
3459 equal = compare_float(test[l].red_received[j], expected, 128);
3460 ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3461 l, order, j, expected, test[l].red_received[j]);
3462
3463 if (test[l].green_received)
3464 {
3465 if (j >= order * order)
3466 expected = j + test[l].goffset;
3467 else
3468 expected = test[l].green_expected[j];
3469 equal = compare_float(test[l].green_received[j], expected, 64);
3470 ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3471 l, order, j, expected, test[l].green_received[j]);
3472 }
3473
3474 if (test[l].blue_received)
3475 {
3476 if (j >= order * order)
3477 expected = j + test[l].boffset;
3478 else
3479 expected = test[l].blue_expected[j];
3480 equal = compare_float(test[l].blue_received[j], expected, 128);
3481 ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3482 l, order, j, expected, test[l].blue_received[j]);
3483 }
3484 }
3485 }
3486 }
3487
3488 /* Cone light with radius <= 0.0f behaves as a directional light */
3489 for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++)
3490 {
3491 FLOAT blue[49], green[49], red[49];
3492
3493 for (j = 0; j < 49; j++)
3494 {
3495 rout[j] = 1.01f + j;
3496 gout[j] = 1.02f + j;
3497 bout[j] = 1.03f + j;
3498 red[j] = 1.01f + j;
3499 green[j] = 1.02f + j;
3500 blue[j] = 1.03f + j;
3501 }
3502
3503 hr = D3DXSHEvalConeLight(order, &dir, -0.1f, 1.7f, 2.6f, 3.5f, rout, gout, bout);
3504 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3505 D3DXSHEvalDirectionalLight(order, &dir, 1.7f, 2.6f, 3.5f, red, green, blue);
3506
3507 for (j = 0; j < 49; j++)
3508 {
3509 equal = compare_float(red[j], rout[j], 0);
3510 ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3511 l, order, j, red[j], rout[j]);
3512
3513 equal = compare_float(green[j], gout[j], 0);
3514 ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3515 l, order, j, green[j], gout[j]);
3516
3517 equal = compare_float(blue[j], bout[j], 0);
3518 ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3519 l, order, j, blue[j], bout[j]);
3520 }
3521 }
3522
3523 /* D3DXSHEvalConeLight accepts order < D3DXSH_MINORDER or order > D3DXSH_MAXORDER. But tests in native windows show that the colour outputs are not set */
3524 hr = D3DXSHEvalConeLight(7, &dir, 0.5f, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3525 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3526 hr = D3DXSHEvalConeLight(0, &dir, 0.5f, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3527 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3528 hr = D3DXSHEvalConeLight(1, &dir, 0.5f, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3529 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3530 }
3531
test_D3DXSHEvalDirection(void)3532 static void test_D3DXSHEvalDirection(void)
3533 {
3534 float a[49], expected, *received_ptr;
3535 unsigned int i, order;
3536 D3DXVECTOR3 d;
3537 BOOL equal;
3538
3539 static const float table[36] =
3540 {
3541 2.82094806e-01f, -9.77205038e-01f, 1.46580756e+00f, -4.88602519e-01f, 2.18509698e+00f, -6.55529118e+00f,
3542 8.20018101e+00f, -3.27764559e-00f, -1.63882279e+00f, 1.18008721e+00f, 1.73436680e+01f, -4.02200317e+01f,
3543 4.70202179e+01f, -2.01100159e+01f, -1.30077515e+01f, 6.49047947e+00f, -1.50200577e+01f, 1.06207848e+01f,
3544 1.17325661e+02f, -2.40856750e+02f, 2.71657288e+02f, -1.20428375e+02f, -8.79942474e+01f, 5.84143143e+01f,
3545 -4.38084984e+00f, 2.49425201e+01f, -1.49447693e+02f, 7.82781296e+01f, 7.47791748e+02f, -1.42768787e+03f,
3546 1.57461914e+03f, -7.13843933e+02f, -5.60843811e+02f, 4.30529724e+02f, -4.35889091e+01f, -2.69116650e+01f,
3547 };
3548
3549 d.x = 1.0; d.y = 2.0f; d.z = 3.0f;
3550
3551 for (order = 0; order <= D3DXSH_MAXORDER + 1; order++)
3552 {
3553 for (i = 0; i < ARRAY_SIZE(a); ++i)
3554 a[i] = 1.5f + i;
3555
3556 received_ptr = D3DXSHEvalDirection(a, order, &d);
3557 ok(received_ptr == a, "Expected %p, received %p\n", a, received_ptr);
3558
3559 for (i = 0; i < ARRAY_SIZE(a); ++i)
3560 {
3561 /* if the order is < D3DXSH_MINORDER or order > D3DXSH_MAXORDER or
3562 * the index of the element is greater than order * order - 1,
3563 * D3DXSHEvalDirection() does not modify the output. */
3564 if ((order < D3DXSH_MINORDER) || (order > D3DXSH_MAXORDER) || (i >= order * order))
3565 expected = 1.5f + i;
3566 else
3567 expected = table[i];
3568
3569 equal = compare_float(a[i], expected, 2);
3570 ok(equal, "order %u, index %u: Got unexpected result %.8e, expected %.8e.\n",
3571 order, i, a[i], expected);
3572 }
3573 }
3574 }
3575
test_D3DXSHEvalDirectionalLight(void)3576 static void test_D3DXSHEvalDirectionalLight(void)
3577 {
3578 float *blue_out, bout[49], expected, gout[49], *green_out, *red_out, rout[49];
3579 unsigned int j, l, order, startindex;
3580 D3DXVECTOR3 dir;
3581 HRESULT hr;
3582 BOOL equal;
3583
3584 static const float table[] =
3585 {
3586 /* Red colour */
3587 2.008781f, -4.175174f, 9.602900f, -3.827243f, 1.417963f, -2.947181f,
3588 6.778517f, -2.701583f, 7.249108f, -18.188671f, 34.643921f, -16.672949f,
3589 -0.631551f, 1.417963f, -2.947181f, 6.778517f, -2.701583f, 7.249108f,
3590 -18.188671f, 34.643921f, -16.672949f, -0.631551f, -7.794341f, 52.934967f,
3591 -102.245529f, 181.656815f, -93.725060f, -4.611760f, 10.146287f, 1.555186f,
3592 -3.232392f, 7.434503f, -2.963026f, 7.950634f, -19.948866f, 37.996559f,
3593 -18.286459f, -0.692669f, -8.548632f, 58.057705f, -112.140251f, 199.236496f,
3594 -102.795227f, -5.058059f, 11.128186f, -4.189955f, -70.782669f, 360.268829f,
3595 -614.755005f, 1052.926270f, -563.525391f, -31.387066f, 92.141365f, -23.864176f,
3596 1.555186f, -3.232392f, 7.434503f, -2.963026f, 7.950634f, -19.948866f,
3597 37.996559f, -18.286459f, -0.692669f, -8.548632f, 58.057705f, -112.140251f,
3598 199.236496f, -102.795227f, -5.058059f, 11.128186f, -4.189955f, -70.782669f,
3599 360.268829f, -614.755005f, 1052.926270f, -563.525391f, -31.387066f, 92.141365f,
3600 -23.864176f, 34.868664f, -38.354366f, -478.864166f, 2103.939941f, -3334.927734f,
3601 5583.213867f, -3057.017090f, -183.297836f, 623.361633f, -218.449921f, 22.258503f,
3602 /* Green colour */
3603 3.072254f, -6.385560f, 14.686787f, -5.853429f, 2.168650f, -4.507453f,
3604 10.367143f, -4.131832f, 11.086870f, -27.817965f, 52.984818f, -25.499800f,
3605 -0.965902f, 2.168650f, -4.507453f, 10.367143f, -4.131832f, 11.086870f,
3606 -27.817965f, 52.984818f, -25.499800f, -0.965902f, -11.920755f, 80.959351f,
3607 -156.375488f, 277.828033f, -143.344193f, -7.053278f, 15.517849f, 2.378519f,
3608 -4.943659f, 11.370415f, -4.531687f, 12.159794f, -30.510029f, 58.112385f,
3609 -27.967525f, -1.059376f, -13.074378f, 88.794136f, -171.508621f, 304.714630f,
3610 -157.216217f, -7.735855f, 17.019577f, -6.408166f, -108.255844f, 550.999390f,
3611 -940.213501f, 1610.357788f, -861.862305f, -48.003746f, 140.922089f, -36.498150f,
3612 2.378519f, -4.943659f, 11.370415f, -4.531687f, 12.159794f, -30.510029f,
3613 58.112385f, -27.967525f, -1.059376f, -13.074378f, 88.794136f, -171.508621f,
3614 304.714630f, -157.216217f, -7.735855f, 17.019577f, -6.408166f, -108.255844f,
3615 550.999390f, -940.213501f, 1610.357788f, -861.862305f, -48.003746f, 140.922089f,
3616 -36.498150f, 53.328545f, -58.659618f, -732.380493f, 3217.790283f, -5100.477539f,
3617 8539.033203f, -4675.437500f, -280.337860f, 953.376587f, -334.099884f, 34.042416f,
3618 /* Blue colour */
3619 4.135726f, -8.595945f, 19.770674f, -7.879617f, 2.919336f, -6.067726f,
3620 13.955770f, -5.562082f, 14.924634f, -37.447262f, 71.325722f, -34.326656f,
3621 -1.300252f, 2.919336f, -6.067726f, 13.955770f, -5.562082f, 14.924634f,
3622 -37.447262f, 71.325722f, -34.326656f, -1.300252f, -16.047173f, 108.983749f,
3623 -210.505493f, 373.999298f, -192.963348f, -9.494799f, 20.889414f, 3.201853f,
3624 -6.654925f, 15.306328f, -6.100348f, 16.368954f, -41.071194f, 78.228210f,
3625 -37.648590f, -1.426083f, -17.600124f, 119.530563f, -230.876984f, 410.192780f,
3626 -211.637222f, -10.413651f, 22.910971f, -8.626378f, -145.729019f, 741.729919f,
3627 -1265.671997f, 2167.789307f, -1160.199219f, -64.620430f, 189.702820f, -49.132126f,
3628 3.201853f, -6.654925f, 15.306328f, -6.100348f, 16.368954f, -41.071194f,
3629 78.228210f, -37.648590f, -1.426083f, -17.600124f, 119.530563f, -230.876984f,
3630 410.192780f, -211.637222f, -10.413651f, 22.910971f, -8.626378f, -145.729019f,
3631 741.729919f, -1265.671997f, 2167.789307f, -1160.199219f, -64.620430f, 189.702820f,
3632 -49.132126f, 71.788422f, -78.964867f, -985.896790f, 4331.640625f, -6866.027344f,
3633 11494.852539f, -6293.858398f, -377.377899f, 1283.391479f, -449.749817f, 45.826328f, };
3634 const struct
3635 {
3636 float *red_in, *green_in, *blue_in;
3637 const float *red_out, *green_out, *blue_out;
3638 float roffset, goffset, boffset;
3639 }
3640 test[] =
3641 {
3642 { rout, gout, bout, table, &table[90], &table[180], 1.01f, 1.02f, 1.03f, },
3643 { rout, rout, rout, &table[180], &table[180], &table[180], 1.03f, 1.03f, 1.03f, },
3644 { rout, rout, bout, &table[90], &table[90], &table[180], 1.02f, 1.02f, 1.03f, },
3645 { rout, gout, gout, table, &table[180], &table[180], 1.01f, 1.03f, 1.03f, },
3646 { rout, gout, rout, &table[180], &table[90], &table[180], 1.03f, 1.02f, 1.03f, },
3647 /* D3DXSHEvalDirectionaLight accepts NULL green or blue colour. */
3648 { rout, NULL, bout, table, NULL, &table[180], 1.01f, 0.0f, 1.03f, },
3649 { rout, gout, NULL, table, &table[90], NULL, 1.01f, 1.02f, 0.0f, },
3650 { rout, NULL, NULL, table, NULL, NULL, 1.01f, 0.0f, 0.0f, },
3651 };
3652
3653 dir.x = 1.1f; dir.y= 1.2f; dir.z = 2.76f;
3654
3655 for (l = 0; l < ARRAY_SIZE(test); ++l)
3656 {
3657 startindex = 0;
3658
3659 for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++)
3660 {
3661 red_out = test[l].red_in;
3662 green_out = test[l].green_in;
3663 blue_out = test[l].blue_in;
3664
3665 for (j = 0; j < ARRAY_SIZE(rout); ++j)
3666 {
3667 red_out[j] = 1.01f + j;
3668 if ( green_out )
3669 green_out[j] = 1.02f + j;
3670 if ( blue_out )
3671 blue_out[j] = 1.03f + j;
3672 }
3673
3674 hr = D3DXSHEvalDirectionalLight(order, &dir, 1.7f, 2.6f, 3.5f, red_out, green_out, blue_out);
3675 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3676
3677 for (j = 0; j < ARRAY_SIZE(rout); ++j)
3678 {
3679 if ( j >= order * order )
3680 expected = j + test[l].roffset;
3681 else
3682 expected = test[l].red_out[startindex + j];
3683 equal = compare_float(expected, red_out[j], 8);
3684 ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3685 l, order, j, expected, red_out[j]);
3686
3687 if ( green_out )
3688 {
3689 if ( j >= order * order )
3690 expected = j + test[l].goffset;
3691 else
3692 expected = test[l].green_out[startindex + j];
3693 equal = compare_float(expected, green_out[j], 8);
3694 ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3695 l, order, j, expected, green_out[j]);
3696 }
3697
3698 if ( blue_out )
3699 {
3700 if ( j >= order * order )
3701 expected = j + test[l].boffset;
3702 else
3703 expected = test[l].blue_out[startindex + j];
3704 equal = compare_float(expected, blue_out[j], 4);
3705 ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3706 l, order, j, expected, blue_out[j]);
3707 }
3708 }
3709
3710 startindex += order * order;
3711 }
3712 }
3713
3714 /* D3DXSHEvalDirectionalLight accepts order < D3DXSH_MINORDER or order > D3DXSH_MAXORDER. But tests in native windows show that the colour outputs are not set*/
3715 hr = D3DXSHEvalDirectionalLight(7, &dir, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3716 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3717 hr = D3DXSHEvalDirectionalLight(0, &dir, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3718 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3719 hr = D3DXSHEvalDirectionalLight(1, &dir, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3720 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3721 }
3722
test_D3DXSHEvalHemisphereLight(void)3723 static void test_D3DXSHEvalHemisphereLight(void)
3724 {
3725 float bout[49], expected, gout[49], rout[49];
3726 unsigned int j, l, order;
3727 D3DXCOLOR bottom, top;
3728 D3DXVECTOR3 dir;
3729 HRESULT hr;
3730 BOOL equal;
3731
3732 static const float table[] =
3733 {
3734 /* Red colour. */
3735 23.422981f, 15.859521f, -36.476898f, 14.537894f,
3736 /* Green colour. */
3737 19.966694f, 6.096982f, -14.023058f, 5.588900f,
3738 /* Blue colour. */
3739 24.566214f, 8.546826f, -19.657701f, 7.834591f,
3740 };
3741 const struct
3742 {
3743 float *red_received, *green_received, *blue_received;
3744 const float *red_expected, *green_expected, *blue_expected;
3745 const float roffset, goffset, boffset;
3746 }
3747 test[] =
3748 {
3749 { rout, gout, bout, table, &table[4], &table[8], 1.01f, 1.02f, 1.03f, },
3750 { rout, rout, rout, &table[8], &table[8], &table[8], 1.03f, 1.03f, 1.03f, },
3751 { rout, rout, bout, &table[4], &table[4], &table[8], 1.02f, 1.02f, 1.03f, },
3752 { rout, gout, gout, table, &table[8], &table[8], 1.01f, 1.03f, 1.03f, },
3753 { rout, gout, rout, &table[8], &table[4], &table[8], 1.03f, 1.02f, 1.03f, },
3754 /* D3DXSHEvalHemisphereLight accepts NULL green or blue colour. */
3755 { rout, NULL, bout, table, NULL, &table[8], 1.01f, 1.02f, 1.03f, },
3756 { rout, gout, NULL, table, &table[4], NULL, 1.01f, 1.02f, 1.03f, },
3757 { rout, NULL, NULL, table, NULL, NULL, 1.01f, 1.02f, 1.03f, },
3758 };
3759
3760 dir.x = 1.1f; dir.y = 1.2f; dir.z = 2.76f;
3761 top.r = 0.1f; top.g = 2.1f; top.b = 2.3f; top.a = 4.3f;
3762 bottom.r = 8.71f; bottom.g = 5.41f; bottom.b = 6.94f; bottom.a = 8.43f;
3763
3764 for (l = 0; l < ARRAY_SIZE(test); ++l)
3765 for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER + 1; order++)
3766 {
3767 for (j = 0; j < 49; j++)
3768 {
3769 test[l].red_received[j] = 1.01f + j;
3770 if (test[l].green_received)
3771 test[l].green_received[j] = 1.02f + j;
3772 if (test[l].blue_received)
3773 test[l].blue_received[j] = 1.03f + j;
3774 }
3775
3776 hr = D3DXSHEvalHemisphereLight(order, &dir, top, bottom, test[l].red_received, test[l].green_received, test[l].blue_received);
3777 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3778
3779 for (j = 0; j < 49; j++)
3780 {
3781 if (j < 4)
3782 expected = test[l].red_expected[j];
3783 else if (j < order * order)
3784 expected = 0.0f;
3785 else
3786 expected = test[l].roffset + j;
3787 equal = compare_float(test[l].red_received[j], expected, 4);
3788 ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3789 l, order, j, expected, test[l].red_received[j]);
3790
3791 if (test[l].green_received)
3792 {
3793 if (j < 4)
3794 expected = test[l].green_expected[j];
3795 else if (j < order * order)
3796 expected = 0.0f;
3797 else
3798 expected = test[l].goffset + j;
3799 equal = compare_float(expected, test[l].green_received[j], 4);
3800 ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3801 l, order, j, expected, test[l].green_received[j]);
3802 }
3803
3804 if (test[l].blue_received)
3805 {
3806 if (j < 4)
3807 expected = test[l].blue_expected[j];
3808 else if (j < order * order)
3809 expected = 0.0f;
3810 else
3811 expected = test[l].boffset + j;
3812 equal = compare_float(expected, test[l].blue_received[j], 4);
3813 ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3814 l, order, j, expected, test[l].blue_received[j]);
3815 }
3816 }
3817 }
3818 }
3819
test_D3DXSHEvalSphericalLight(void)3820 static void test_D3DXSHEvalSphericalLight(void)
3821 {
3822 float bout[49], expected, gout[49], rout[49];
3823 unsigned int j, l, order;
3824 D3DXVECTOR3 dir;
3825 HRESULT hr;
3826 BOOL equal;
3827
3828 static const float table[] =
3829 {
3830 /* Red colour. */
3831 3.01317163e+00f, -9.77240128e-01f, 2.24765220e+00f, -8.95803434e-01f, 3.25255224e-35f, -8.16094904e-35f,
3832 8.95199460e-35f, -7.48086982e-35f, -2.83366352e-36f, 6.29281376e-02f, -4.27374053e-01f, 6.19212543e-01f,
3833 -3.04508915e-01f, 5.67611487e-01f, 3.72333533e-02f, -8.19167317e-02f, 1.25205729e-36f, 2.11515287e-35f,
3834 -8.85884025e-35f, 8.22100105e-35f, -1.41290744e-37f, 7.53591749e-35f, 7.71793061e-36f, -2.75340121e-35f,
3835 7.13117824e-36f, 1.24992691e-02f, -1.37487792e-02f, -1.48109290e-01f, 4.34345843e-01f, -2.45986100e-01f,
3836 -1.51757946e-01f, -2.25487254e-01f, -3.78407442e-02f, 1.92801335e-01f, -7.83071154e-02f, 7.97894137e-03f,
3837
3838 4.02519645e-01f, -2.43653315e-01f, 5.60402600e-01f, -2.23348868e-01f, 1.62046875e-01f, -4.06590330e-01f,
3839 4.46001368e-01f, -3.72707796e-01f, -1.41177231e-02f, -4.31995198e-02f, 2.93387896e-01f, -4.25083048e-01f,
3840 2.09042241e-01f, -3.89659453e-01f, -2.55603144e-02f, 5.62349945e-02f, -4.68822967e-03f, -7.92002290e-02f,
3841 3.31712278e-01f, -3.07828893e-01f, 5.29052032e-04f, -2.82176480e-01f, -2.88991817e-02f, 1.03098934e-01f,
3842 -2.67021338e-02f, 7.24339502e-03f, -7.96749298e-03f, -8.58301461e-02f, 2.51705799e-01f, -1.42550295e-01f,
3843 -8.79445626e-02f, -1.30671101e-01f, -2.19289189e-02f, 1.11729432e-01f, -4.53794030e-02f, 4.62384030e-03f,
3844
3845 1.95445306e+00f, -8.56593659e-01f, 1.97016533e+00f, -7.85210840e-01f, 2.31033385e-01f, -5.79683751e-01f,
3846 6.35872835e-01f, -5.31376762e-01f, -2.01279127e-02f, 2.11104646e-02f, -1.43370917e-01f, 2.07726860e-01f,
3847 -1.02153423e-01f, 1.90416285e-01f, 1.24906507e-02f, -2.74805568e-02f, 6.33162467e-03f, 1.06962790e-01f,
3848 -4.47989495e-01f, 4.15734115e-01f, -7.14504011e-04f, 3.81089599e-01f, 3.90293960e-02f, -1.39238860e-01f,
3849 3.60622028e-02f, -4.47359268e-03f, 4.92080277e-03f, 5.30095505e-02f, -1.55456001e-01f, 8.80404774e-02f,
3850 5.43154350e-02f, 8.07037695e-02f, 1.35435180e-02f, -6.90052063e-02f, 2.80267699e-02f, -2.85572968e-03f,
3851 /* Green colour. */
3852 4.60837984e+00f, -1.49460245e+00f, 3.43758549e+00f, -1.37005222e+00f, 4.97449134e-35f, -1.24814507e-34f,
3853 1.36912850e-34f, -1.14413296e-34f, -4.33383805e-36f, 9.62430278e-02f, -6.53630863e-01f, 9.47030887e-01f,
3854 -4.65719486e-01f, 8.68111630e-01f, 5.69451249e-02f, -1.25284405e-01f, 1.91491103e-36f, 3.23493947e-35f,
3855 -1.35488136e-34f, 1.25732949e-34f, -2.16091711e-37f, 1.15255201e-34f, 1.18038931e-35f, -4.21108392e-35f,
3856 1.09065072e-35f, 1.91165280e-02f, -2.10275433e-02f, -2.26520076e-01f, 6.64293599e-01f, -3.76214011e-01f,
3857 -2.32100374e-01f, -3.44862837e-01f, -5.78740756e-02f, 2.94872611e-01f, -1.19763816e-01f, 1.22030860e-02f,
3858
3859 6.15618240e-01f, -3.72646222e-01f, 8.57086273e-01f, -3.41592364e-01f, 2.47836381e-01f, -6.21843994e-01f,
3860 6.82119695e-01f, -5.70023651e-01f, -2.15918104e-02f, -6.60698496e-02f, 4.48710870e-01f, -6.50126972e-01f,
3861 3.19711642e-01f, -5.95949713e-01f, -3.90922430e-02f, 8.60064566e-02f, -7.17023314e-03f, -1.21129754e-01f,
3862 5.07324627e-01f, -4.70797100e-01f, 8.09138350e-04f, -4.31564000e-01f, -4.41987457e-02f, 1.57680712e-01f,
3863 -4.08385549e-02f, 1.10781328e-02f, -1.21855767e-02f, -1.31269627e-01f, 3.84961785e-01f, -2.18018084e-01f,
3864 -1.34503440e-01f, -1.99849906e-01f, -3.35383443e-02f, 1.70880296e-01f, -6.94037884e-02f, 7.07175529e-03f,
3865
3866 2.98916331e+00f, -1.31008433e+00f, 3.01319384e+00f, -1.20091062e+00f, 3.53345154e-01f, -8.86575090e-01f,
3867 9.72511332e-01f, -8.12693818e-01f, -3.07838645e-02f, 3.22865908e-02f, -2.19273153e-01f, 3.17699883e-01f,
3868 -1.56234637e-01f, 2.91224888e-01f, 1.91033469e-02f, -4.20290842e-02f, 9.68366064e-03f, 1.63590138e-01f,
3869 -6.85160360e-01f, 6.35828606e-01f, -1.09277077e-03f, 5.82842878e-01f, 5.96920135e-02f, -2.12953537e-01f,
3870 5.51539537e-02f, -6.84196484e-03f, 7.52593316e-03f, 8.10734249e-02f, -2.37756221e-01f, 1.34650133e-01f,
3871 8.30706600e-02f, 1.23429287e-01f, 2.07136145e-02f, -1.05537368e-01f, 4.28644688e-02f, -4.36758628e-03f,
3872 /* Blue colour. */
3873 6.20358848e+00f, -2.01196491e+00f, 4.62751910e+00f, -1.84430114e+00f, 6.69643089e-35f, -1.68019534e-34f,
3874 1.84305766e-34f, -1.54017904e-34f, -5.83401297e-36f, 1.29557927e-01f, -8.79887732e-01f, 1.27484932e+00f,
3875 -6.26930101e-01f, 1.16861185e+00f, 7.66569017e-02f, -1.68652090e-01f, 2.57776494e-36f, 4.35472637e-35f,
3876 -1.82387882e-34f, 1.69255899e-34f, -2.90892699e-37f, 1.55151238e-34f, 1.58898567e-35f, -5.66876703e-35f,
3877 1.46818371e-35f, 2.57337886e-02f, -2.83063093e-02f, -3.04930882e-01f, 8.94241416e-01f, -5.06441957e-01f,
3878 -3.12442822e-01f, -4.64238452e-01f, -7.79074123e-02f, 3.96943914e-01f, -1.61220527e-01f, 1.64272318e-02f,
3879
3880 8.28716892e-01f, -5.01639163e-01f, 1.15377003e+00f, -4.59835891e-01f, 3.33625909e-01f, -8.37097715e-01f,
3881 9.18238085e-01f, -7.67339558e-01f, -2.90658997e-02f, -8.89401854e-02f, 6.04033886e-01f, -8.75170956e-01f,
3882 4.30381072e-01f, -8.02240028e-01f, -5.26241753e-02f, 1.15777927e-01f, -9.65223728e-03f, -1.63059290e-01f,
3883 6.82937023e-01f, -6.33765350e-01f, 1.08922474e-03f, -5.80951560e-01f, -5.94983136e-02f, 2.12262505e-01f,
3884 -5.49749798e-02f, 1.49128717e-02f, -1.64036616e-02f, -1.76709119e-01f, 5.18217807e-01f, -2.93485893e-01f,
3885 -1.81062330e-01f, -2.69028730e-01f, -4.51477729e-02f, 2.30031176e-01f, -9.34281801e-02f, 9.51967094e-03f,
3886
3887 4.02387383e+00f, -1.76357513e+00f, 4.05622263e+00f, -1.61661051e+00f, 4.75656955e-01f, -1.19346651e+00f,
3888 1.30914992e+00f, -1.09401095e+00f, -4.14398191e-02f, 4.34627200e-02f, -2.95175409e-01f, 4.27672935e-01f,
3889 -2.10315865e-01f, 3.92033517e-01f, 2.57160448e-02f, -5.65776154e-02f, 1.30356975e-02f, 2.20217502e-01f,
3890 -9.22331288e-01f, 8.55923154e-01f, -1.47103763e-03f, 7.84596211e-01f, 8.03546365e-02f, -2.86668233e-01f,
3891 7.42457096e-02f, -9.21033762e-03f, 1.01310642e-02f, 1.09137307e-01f, -3.20056463e-01f, 1.81259801e-01f,
3892 1.11825893e-01f, 1.66154815e-01f, 2.78837128e-02f, -1.42069538e-01f, 5.77021717e-02f, -5.87944329e-03f,
3893 };
3894 const struct
3895 {
3896 float *red_received, *green_received, *blue_received;
3897 const float *red_expected, *green_expected, *blue_expected;
3898 float radius, roffset, goffset, boffset;
3899 }
3900 test[] =
3901 {
3902 { rout, gout, bout, table, &table[108], &table[216], 17.4f, 1.01f, 1.02f, 1.03f, },
3903 { rout, gout, bout, &table[36], &table[144], &table[252], 1.6f, 1.01f, 1.02f, 1.03f, },
3904 { rout, gout, bout, &table[72], &table[180], &table[288], -3.0f, 1.01f, 1.02f, 1.03f, },
3905 { rout, rout, rout, &table[216], &table[216], &table[216], 17.4f, 1.03f, 1.03f, 1.03f, },
3906 { rout, rout, bout, &table[108], &table[108], &table[216], 17.4, 1.02f, 1.02f, 1.03f, },
3907 { rout, gout, gout, table, &table[216], &table[216], 17.4f, 1.01f, 1.03f, 1.03f, },
3908 { rout, gout, rout, &table[216], &table[108], &table[216], 17.4f, 1.03f, 1.02f, 1.03f, },
3909 /* D3DXSHEvalSphericalLight accepts NULL green or blue colour. */
3910 { rout, NULL, bout, table, NULL, &table[216], 17.4f, 1.01f, 0.0f, 1.03f, },
3911 { rout, gout, NULL, table, &table[108], NULL, 17.4f, 1.01f, 1.02f, 0.0f, },
3912 { rout, NULL, NULL, table, NULL, NULL, 17.4f, 1.01f, 0.0f, 0.0f, },
3913 };
3914
3915 dir.x = 1.1f; dir.y = 1.2f; dir.z = 2.76f;
3916
3917 for (l = 0; l < ARRAY_SIZE(test); ++l)
3918 {
3919 for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++)
3920 {
3921 for (j = 0; j < 49; j++)
3922 {
3923 test[l].red_received[j] = 1.01f + j;
3924 if (test[l].green_received)
3925 test[l].green_received[j] = 1.02f + j;
3926 if (test[l].blue_received)
3927 test[l].blue_received[j] = 1.03f + j;
3928 }
3929
3930 hr = D3DXSHEvalSphericalLight(order, &dir, test[l].radius, 1.7f, 2.6f, 3.5f, test[l].red_received, test[l].green_received, test[l].blue_received);
3931 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3932
3933 for (j = 0; j < 49; j++)
3934 {
3935 if (j >= order * order)
3936 expected = j + test[l].roffset;
3937 else
3938 expected = test[l].red_expected[j];
3939 equal = compare_float(expected, test[l].red_received[j], 4096);
3940 ok(equal || (fabs(expected) < 1.0e-6f && fabs(test[l].red_received[j]) < 1.0e-6f),
3941 "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3942 l, order, j, expected, test[l].red_received[j]);
3943
3944 if (test[l].green_received)
3945 {
3946 if (j >= order * order)
3947 expected = j + test[l].goffset;
3948 else
3949 expected = test[l].green_expected[j];
3950 equal = compare_float(expected, test[l].green_received[j], 4096);
3951 ok(equal || (fabs(expected) < 1.0e-6f && fabs(test[l].green_received[j]) < 1.0e-6f),
3952 "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3953 l, order, j, expected, test[l].green_received[j]);
3954 }
3955
3956 if (test[l].blue_received)
3957 {
3958 if (j >= order * order)
3959 expected = j + test[l].boffset;
3960 else
3961 expected = test[l].blue_expected[j];
3962 equal = compare_float(expected, test[l].blue_received[j], 4096);
3963 ok(equal || (fabs(expected) < 1.0e-6f && fabs(test[l].blue_received[j]) < 1.0e-6f),
3964 "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n",
3965 l, order, j, expected, test[l].blue_received[j]);
3966 }
3967 }
3968 }
3969 }
3970
3971 /* D3DXSHEvalSphericalLight accepts order < D3DXSH_MINORDER or order > D3DXSH_MAXORDER. But tests in native windows show that the colour outputs are not set */
3972 hr = D3DXSHEvalSphericalLight(7, &dir, 17.4f, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3973 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3974 hr = D3DXSHEvalSphericalLight(0, &dir, 17.4f, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3975 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3976 hr = D3DXSHEvalSphericalLight(1, &dir, 17.4f, 1.0f, 2.0f, 3.0f, rout, gout, bout);
3977 ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr);
3978 }
3979
test_D3DXSHMultiply2(void)3980 static void test_D3DXSHMultiply2(void)
3981 {
3982 float a[20], b[20], c[20];
3983 unsigned int i;
3984 BOOL equal;
3985
3986 /* D3DXSHMultiply2() only modifies the first 4 elements of the array. */
3987 static const float expected[20] =
3988 {
3989 3.41859412f, 1.69821072f, 1.70385253f, 1.70949447f, 4.0f, 5.0f, 6.0f,
3990 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f,
3991 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f,
3992 };
3993
3994 for (i = 0; i < ARRAY_SIZE(a); ++i)
3995 {
3996 a[i] = 1.0f + i / 100.0f;
3997 b[i] = 3.0f - i / 100.0f;
3998 c[i] = i;
3999 }
4000
4001 D3DXSHMultiply2(c, a, b);
4002 for (i = 0; i < ARRAY_SIZE(expected); ++i)
4003 {
4004 equal = compare_float(c[i], expected[i], 2);
4005 ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[i], c[i]);
4006 }
4007 }
4008
test_D3DXSHMultiply3(void)4009 static void test_D3DXSHMultiply3(void)
4010 {
4011 float a[20], b[20], c[20];
4012 unsigned int i;
4013 BOOL equal;
4014
4015 /* D3DXSHMultiply3() only modifies the first 9 elements of the array. */
4016 static const float expected[20] =
4017 {
4018 7.81391382e+00f, 2.25605774e+00f, 5.94839954e+00f, 4.97089481e+00f, 2.89985824e+00f, 3.59894633e+00f,
4019 1.72657156e+00f, 5.57353783e+00f, 6.22063160e-01f, 9.00000000e+00f, 1.00000000e+01f, 1.10000000e+01f,
4020 1.20000000e+01f, 1.30000000e+01f, 1.40000000e+01f, 1.50000000e+01f, 1.60000000e+01f, 1.70000000e+01f,
4021 1.80000000e+01f, 1.90000000e+01f,
4022 };
4023 static const float expected_aliased[20] =
4024 {
4025 4.54092499e+02f, 2.12640405e+00f, 5.57040071e+00f, 1.53303785e+01f, 2.27960873e+01f, 4.36041260e+01f,
4026 4.27384138e+00f, 1.75772034e+02f, 2.37672729e+02f, 1.09000003e+00f, 1.10000002e+00f, 1.11000001e+00f,
4027 1.12000000e+00f, 1.13000000e+00f, 1.13999999e+00f, 1.14999998e+00f, 1.15999997e+00f, 1.16999996e+00f,
4028 1.17999995e+00f, 1.19000006e+00f,
4029 };
4030
4031 for (i = 0; i < ARRAY_SIZE(a); ++i)
4032 {
4033 a[i] = 1.0f + i / 100.0f;
4034 b[i] = 3.0f - i / 100.0f;
4035 c[i] = i;
4036 }
4037
4038 D3DXSHMultiply3(c, a, b);
4039 for (i = 0; i < ARRAY_SIZE(expected); ++i)
4040 {
4041 equal = compare_float(c[i], expected[i], 4);
4042 ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[i], c[i]);
4043 }
4044
4045 memcpy(c, a, sizeof(c));
4046 D3DXSHMultiply3(c, c, b);
4047 for (i = 0; i < ARRAY_SIZE(expected_aliased); ++i)
4048 {
4049 equal = compare_float(c[i], expected_aliased[i], 34);
4050 ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected_aliased[i], c[i]);
4051 }
4052 }
4053
test_D3DXSHMultiply4(void)4054 static void test_D3DXSHMultiply4(void)
4055 {
4056 float a[20], b[20], c[20];
4057 unsigned int i;
4058 BOOL equal;
4059
4060 /* D3DXSHMultiply4() only modifies the first 16 elements of the array. */
4061 static const float expected[] =
4062 {
4063 /* c, a, b */
4064 1.41825991e+01f, 2.61570334e+00f, 1.28286009e+01f, 9.82059574e+00f, 3.03969646e+00f, 4.53044176e+00f,
4065 5.82058382e+00f, 1.22498465e+01f, 2.19434643e+00f, 3.90015244e+00f, 5.41660881e+00f, 5.60181284e+00f,
4066 9.59981740e-01f, 7.03754997e+00f, 3.62523031e+00f, 4.63601470e-01f, 1.60000000e+01f, 1.70000000e+01f,
4067 1.80000000e+01f, 1.90000000e+01f,
4068 /* c, c, b */
4069 -2.11441266e+05f, -2.52915771e+03f, -1.00233936e+04f, -4.41277191e+02f, -1.63994385e+02f, -5.26305115e+02f,
4070 2.96361875e+04f, -3.93183081e+03f, -1.35771113e+04f, -3.97897388e+03f, -1.03303418e+04f, -1.37797871e+04f,
4071 -1.66851094e+04f, -4.49813750e+04f, -7.32697422e+04f, -9.52373359e+04f, 1.60000000e+01f, 1.70000000e+01f,
4072 1.80000000e+01f, 1.90000000e+01f,
4073 /* c, c, c */
4074 2.36682415e-01f, -7.17648506e-01f, -1.80499524e-01f, -7.71235973e-02f, 1.44830629e-01f, 5.73285699e-01f,
4075 -3.37959230e-01f, 5.56938872e-02f, -4.42100227e-01f, 1.47701755e-01f, -5.51566519e-02f, 8.43374059e-02f,
4076 1.79876596e-01f, 9.09878965e-03f, 2.32199892e-01f, 7.41420984e-02f, 1.60000002e+00f, 1.70000005e+00f,
4077 1.80000007e+00f, 1.89999998e+00f,
4078 };
4079
4080 for (i = 0; i < ARRAY_SIZE(a); ++i)
4081 {
4082 a[i] = 1.0f + i / 100.0f;
4083 b[i] = 3.0f - i / 100.0f;
4084 c[i] = i;
4085 }
4086
4087 D3DXSHMultiply4(c, a, b);
4088 for (i = 0; i < ARRAY_SIZE(c); ++i)
4089 {
4090 equal = compare_float(c[i], expected[i], 16);
4091 ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[i], c[i]);
4092 }
4093
4094 for (i = 0; i < ARRAY_SIZE(b); ++i)
4095 {
4096 b[i] = 3.0f - i / 100.0f;
4097 c[i] = i;
4098 }
4099
4100 D3DXSHMultiply4(c, c, b);
4101 for (i = 0; i < ARRAY_SIZE(c); ++i)
4102 {
4103 equal = compare_float(c[i], expected[20 + i], 32);
4104 ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[20 + i], c[i]);
4105 }
4106
4107 for (i = 0; i < ARRAY_SIZE(c); ++i)
4108 c[i] = 0.1f * i;
4109
4110 D3DXSHMultiply4(c, c, c);
4111 for (i = 0; i < ARRAY_SIZE(c); ++i)
4112 {
4113 equal = compare_float(c[i], expected[40 + i], 8);
4114 ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[40 + i], c[i]);
4115 }
4116 }
4117
test_D3DXSHRotate(void)4118 static void test_D3DXSHRotate(void)
4119 {
4120 float expected, in[49], out[49], *out_temp, *received_ptr;
4121 unsigned int i, j, l, order;
4122 D3DXMATRIX m[4];
4123 BOOL equal;
4124
4125 static const float table[]=
4126 {
4127 /* Rotation around the x-axis, π/2. */
4128 1.00999999e+00f, -3.00999999e+00f, 2.00999975e+00f, 4.01000023e+00f, -8.01000023e+00f, -6.00999928e+00f,
4129 -1.13078899e+01f, 5.00999975e+00f, -1.56583869e+00f, 1.09359801e+00f, -1.10099983e+01f, 1.98334141e+01f,
4130 -1.52681913e+01f, -1.90041180e+01f, -3.36488891e+00f, -9.56262684e+00f, 1.20996542e+01f, -2.72131383e-01f,
4131 3.02410126e+01f, 2.69199905e+01f, 3.92368774e+01f, -2.26324463e+01f, 6.70738792e+00f, -1.17682819e+01f,
4132 3.44367194e+00f, -6.07445812e+00f, 1.16183939e+01f, 1.52756083e+00f, 3.78963356e+01f, -5.69012184e+01f,
4133 4.74228935e+01f, 5.03915329e+01f, 1.06181908e+01f, 2.55010109e+01f, 4.92456071e-02f, 1.69833069e+01f,
4134
4135 1.00999999e+00f, -3.00999999e+00f, -3.01000023e+00f, 4.01000023e+00f, -8.01000023e+00f, -6.00999928e+00f,
4136 -1.13078890e+01f, -8.01000023e+00f, 1.42979193e+01f,
4137 /* Rotation around the x-axis, -Ï€/2. */
4138 1.00999999e+00f, 3.00999999e+00f, -2.01000023e+00f, 4.01000023e+00f, 8.01000023e+00f, -6.01000118e+00f,
4139 -1.13078880e+01f, -5.01000071e+00f, -1.56583774e+00f, -1.09359753e+00f, -1.10100021e+01f, -1.98334103e+01f,
4140 1.52681961e+01f, -1.90041142e+01f, 3.36489248e+00f, -9.56262398e+00f, -1.20996523e+01f, -2.72129118e-01f,
4141 -3.02410049e+01f, 2.69200020e+01f, 3.92368736e+01f, 2.26324520e+01f, 6.70738268e+00f, 1.17682877e+01f,
4142 3.44367099e+00f, 6.07445717e+00f, 1.16183996e+01f, -1.52756333e+00f, 3.78963509e+01f, 5.69011993e+01f,
4143 -4.74229126e+01f, 5.03915253e+01f, -1.06182041e+01f, 2.55009995e+01f, -4.92481887e-02f, 1.69833050e+01f,
4144
4145 1.00999999e+00f, 3.00999999e+00f, -3.01000023e+00f, 4.01000023e+00f, 8.01000023e+00f, -6.01000118e+00f,
4146 -1.13078899e+01f, -8.01000023e+00f, 1.42979193e+01f,
4147 /* Yaw π/3, pitch π/4, roll π/5. */
4148 1.00999999e+00f, 4.94489908e+00f, 1.44230127e+00f, 1.62728095e+00f, 2.19220325e-01f, 1.05408239e+01f,
4149 -9.13690281e+00f, 2.76374960e+00f, -7.30904531e+00f, -5.87572050e+00f, 5.30312395e+00f, -8.68215370e+00f,
4150 -2.56833839e+01f, 1.68027866e+00f, -1.88083878e+01f, 7.65365601e+00f, 1.69391327e+01f, -1.73280182e+01f,
4151 1.46297951e+01f, -5.44671021e+01f, -1.22310352e+01f, -4.08985710e+00f, -9.44422245e+00f, 3.05603528e+00f,
4152 1.79257303e-01f, -1.00418749e+01f, 2.30900917e+01f, -2.31887093e+01f, 1.17270985e+01f, -6.51830902e+01f,
4153 4.86715775e+01f, -1.50732088e+01f, 3.87931709e+01f, -2.60395355e+01f, 6.19276857e+00f, -1.76722469e+01f,
4154
4155 1.00999999e+00f, 4.94489908e+00f, -8.91142070e-01f, 4.60769463e+00f, 2.19218358e-01f, 1.07733250e+01f,
4156 -8.20476913e+00f, 1.35638294e+01f, -1.20077667e+01f,
4157 /* Rotation around the z-axis, π/6. */
4158 1.00999999e+00f, 3.74571109e+00f, 3.00999999e+00f, 2.46776199e+00f, 1.03078890e+01f, 9.20981312e+00f,
4159 7.01000023e+00f, 3.93186355e+00f, 1.66212186e-01f, 1.60099983e+01f, 1.85040417e+01f, 1.74059658e+01f,
4160 1.30100002e+01f, 6.12801647e+00f, -2.02994061e+00f, -1.00100012e+01f, 1.31542921e+01f, 2.40099964e+01f,
4161 2.94322453e+01f, 2.83341675e+01f, 2.10100021e+01f, 9.05622101e+00f, -4.95814323e+00f, -1.80100002e+01f,
4162 -2.72360935e+01f, -4.52033186e+00f, 1.68145428e+01f, 3.40099945e+01f, 4.30924950e+01f, 4.19944229e+01f,
4163 3.10100002e+01f, 1.27164707e+01f, -8.61839962e+00f, -2.80100021e+01f, -4.08963470e+01f, -4.41905708e+01f,
4164
4165 1.00999999e+00f, 3.74571109e+00f, 3.00999999e+00f, 1.59990644e+00f, 1.03078890e+01f, 9.20981312e+00f,
4166 7.01000023e+00f, 2.33195710e+00f, -4.42189360e+00f,
4167 };
4168
4169 D3DXMatrixRotationX(&m[0], -D3DX_PI / 2.0f);
4170 D3DXMatrixRotationX(&m[1], D3DX_PI / 2.0f);
4171 D3DXMatrixRotationYawPitchRoll(&m[2], D3DX_PI / 3.0f, D3DX_PI / 4.0f, D3DX_PI / 5.0f);
4172 D3DXMatrixRotationZ(&m[3], D3DX_PI / 6.0f);
4173
4174 for (l = 0; l < 2; l++)
4175 {
4176 if (l == 0)
4177 out_temp = out;
4178 else
4179 out_temp = in;
4180
4181 for (j = 0; j < ARRAY_SIZE(m); ++j)
4182 {
4183 for (order = 0; order <= D3DXSH_MAXORDER; order++)
4184 {
4185 for (i = 0; i < ARRAY_SIZE(out); ++i)
4186 {
4187 out[i] = ( i + 1.0f ) * ( i + 1.0f );
4188 in[i] = i + 1.01f;
4189 }
4190
4191 received_ptr = D3DXSHRotate(out_temp, order, &m[j], in);
4192 ok(received_ptr == out_temp, "Order %u, expected %p, received %p.\n",
4193 order, out, received_ptr);
4194
4195 for (i = 0; i < ARRAY_SIZE(out); ++i)
4196 {
4197 if ((i > 0) && ((i >= order * order) || (order > D3DXSH_MAXORDER)))
4198 {
4199 if (l == 0)
4200 expected = ( i + 1.0f ) * ( i + 1.0f );
4201 else
4202 expected = i + 1.01f;
4203 }
4204 else if ((l == 0) || (order > 3))
4205 expected = table[45 * j + i];
4206 else
4207 expected = table[45 * j + 36 +i];
4208 equal = compare_float(out_temp[i], expected, 4096);
4209 ok(equal, "Order %u index %u, expected %.8e, received %.8e.\n",
4210 order, i, expected, out_temp[i]);
4211 }
4212 }
4213 }
4214 }
4215 }
4216
test_D3DXSHRotateZ(void)4217 static void test_D3DXSHRotateZ(void)
4218 {
4219 float expected, in[49], out[49], *out_temp, *received_ptr;
4220 unsigned int end, i, j, l, order, square;
4221 BOOL equal;
4222
4223 static const float angle[] = {D3DX_PI / 3.0f, -D3DX_PI / 3.0f, 4.0f * D3DX_PI / 3.0f};
4224 static const float table[] =
4225 {
4226 /* Angle π/3. */
4227 1.00999999e+00f, 4.47776222e+00f, 3.00999999e+00f, 2.64288902e-01f, 5.29788828e+00f, 9.94186401e+00f,
4228 7.01000023e+00f, -1.19981313e+00f, -8.84378910e+00f, -1.00100021e+01f, 7.49403954e+00f, 1.81380157e+01f,
4229 1.30100002e+01f, -3.39596605e+00f, -1.70399418e+01f, -1.60099983e+01f, -3.01642971e+01f, -1.80100040e+01f,
4230 1.04222422e+01f, 2.90662193e+01f, 2.10100002e+01f, -6.32417059e+00f, -2.79681454e+01f, -2.40099983e+01f,
4231 2.22609901e+00f, -1.81805649e+01f, -4.38245506e+01f, -2.80100040e+01f, 1.40824928e+01f, 4.27264709e+01f,
4232 3.10100002e+01f, -9.98442554e+00f, -4.16283989e+01f, -3.40099945e+01f, 5.88635778e+00f, 4.05303307e+01f,
4233
4234 1.00999999e+00f, 4.47776222e+00f, 0.00000000e+00f, -5.81678391e+00f, 5.29788828e+00f, 6.93686390e+00f,
4235 0.00000000e+00f, -9.01125050e+00f, -2.29405236e+00f, -1.00100021e+01f, 1.29990416e+01f, 1.21330166e+01f,
4236 0.00000000e+00f, -1.57612505e+01f, -5.62874842e+00f, 0.00000000e+00f, -3.01642971e+01f, -3.29017075e-06f,
4237 1.99272442e+01f, 1.90612202e+01f, 0.00000000e+00f, -2.47612514e+01f, -8.62874794e+00f, 0.00000000e+00f,
4238 -1.30615301e+01f, -1.81805649e+01f, -3.03195534e+01f, -4.66050415e-06f, 2.85874958e+01f, 2.77214737e+01f,
4239 0.00000000e+00f, -3.60112534e+01f, -1.23787460e+01f, 0.00000000e+00f, -1.31287584e+01f, -2.36172504e+01f,
4240
4241 1.00999999e+00f, 3.97776222e+00f, 3.97776222e+00f, 1.11419535e+00f, 7.24579096e+00f, 1.05597591e+01f,
4242 1.05597591e+01f, -9.95159924e-01f, -4.67341393e-01f, 4.67339337e-01f, 1.27653713e+01f, 1.85157013e+01f,
4243 1.85157013e+01f, -1.79728663e+00f, 4.93915796e-01f, -4.93915856e-01f, -2.14123421e+01f, 2.14123383e+01f,
4244 9.22107220e+00f, 2.36717567e+01f, 2.36717567e+01f, 3.85019469e+00f, -2.04687271e+01f, 2.04687233e+01f,
4245 -1.06621027e+01f, -3.65166283e+01f, -1.20612450e+01f, 1.20612402e+01f, 2.25568752e+01f, 3.89999084e+01f,
4246 3.89999084e+01f, -3.48751247e-02f, -1.04279022e+01f, 1.04279003e+01f, -3.68382835e+01f, -2.76528034e+01f,
4247 /* Angle -Ï€/3. */
4248 1.00999999e+00f, -2.46776247e+00f, 3.00999999e+00f, 3.74571109e+00f, -1.03078899e+01f, -3.93186426e+00f,
4249 7.01000023e+00f, 9.20981312e+00f, -1.66213632e-01f, -1.00099983e+01f, -1.85040436e+01f, -6.12801695e+00f,
4250 1.30100002e+01f, 1.74059658e+01f, 2.02993774e+00f, -1.60100021e+01f, 1.31543026e+01f, -1.80099964e+01f,
4251 -2.94322472e+01f, -9.05622101e+00f, 2.10100002e+01f, 2.83341694e+01f, 4.95813942e+00f, -2.40100021e+01f,
4252 -2.72360916e+01f, 4.41905823e+01f, 1.68145580e+01f, -2.80099964e+01f, -4.30924988e+01f, -1.27164736e+01f,
4253 3.10100002e+01f, 4.19944229e+01f, 8.61839294e+00f, -3.40100021e+01f, -4.08963470e+01f, -4.52030993e+00f,
4254
4255 1.00999999e+00f, -2.46776247e+00f, 0.00000000e+00f, -3.20571756e+00f, -1.03078899e+01f, -6.93686390e+00f,
4256 0.00000000e+00f, -9.01125050e+00f, -4.46344614e+00f, -1.00099983e+01f, -1.29990416e+01f, -1.21330166e+01f,
4257 0.00000000e+00f, -1.57612505e+01f, -5.62874842e+00f, 0.00000000e+00f, 1.31543026e+01f, 3.29017075e-06f,
4258 -1.99272442e+01f, -1.90612202e+01f, 0.00000000e+00f, -2.47612514e+01f, -8.62874794e+00f, 0.00000000e+00f,
4259 -5.69598293e+00f, 4.41905823e+01f, 3.03195534e+01f, 4.66050415e-06f, -2.85874958e+01f, -2.77214737e+01f,
4260 0.00000000e+00f, -3.60112534e+01f, -1.23787460e+01f, 0.00000000e+00f, -1.31287584e+01f, -5.74052582e+01f,
4261
4262 1.00999999e+00f, -2.96776223e+00f, -2.96776223e+00f, -6.09195352e-01f, -7.49829102e+00f, -1.06860094e+01f,
4263 -1.06860094e+01f, -1.18367157e+01f, 5.39078045e+00f, -5.39077854e+00f, -1.03036509e+01f, -1.72848415e+01f,
4264 -1.72848415e+01f, -1.75656433e+01f, 4.11427259e+00f, -4.11427307e+00f, 2.37164364e+01f, -2.37164326e+01f,
4265 -8.06902504e+00f, -2.30957317e+01f, -2.30957317e+01f, -1.85358467e+01f, -1.12711067e+01f, 1.12711039e+01f,
4266 -2.07248449e+00f, 3.01493301e+01f, 1.52448931e+01f, -1.52448883e+01f, -2.09650497e+01f, -3.82039986e+01f,
4267 -3.82039986e+01f, -3.72582664e+01f, 5.42667723e+00f, -5.42667913e+00f, -2.33967514e+01f, -9.90355873e+00f,
4268 /* Angle 4Ï€/3. */
4269 1.00999999e+00f, -4.47776222e+00f, 3.00999999e+00f, -2.64288664e-01f, 5.29788685e+00f, -9.94186401e+00f,
4270 7.01000023e+00f, 1.19981360e+00f, -8.84378815e+00f, 1.00100040e+01f, 7.49403811e+00f, -1.81380157e+01f,
4271 1.30100002e+01f, 3.39596677e+00f, -1.70399399e+01f, 1.60099964e+01f, -3.01642933e+01f, 1.80100060e+01f,
4272 1.04222393e+01f, -2.90662193e+01f, 2.10100002e+01f, 6.32417202e+00f, -2.79681435e+01f, 2.40099926e+01f,
4273 2.22610497e+00f, 1.81805515e+01f, -4.38245430e+01f, 2.80100079e+01f, 1.40824890e+01f, -4.27264709e+01f,
4274 3.10100002e+01f, 9.98442745e+00f, -4.16283989e+01f, 3.40099869e+01f, 5.88636589e+00f, -4.05303268e+01f,
4275
4276 1.00999999e+00f, -4.47776222e+00f, 0.00000000e+00f, -1.93892837e+00f, 5.29788685e+00f, -6.93686390e+00f,
4277 0.00000000e+00f, -3.00375080e+00f, -2.29405141e+00f, 1.00100040e+01f, 1.29990396e+01f, -1.21330166e+01f,
4278 0.00000000e+00f, -5.25375128e+00f, -5.62874699e+00f, -5.68378528e-06f, -3.01642933e+01f, 7.00829787e-06f,
4279 1.99272423e+01f, -1.90612202e+01f, 0.00000000e+00f, -8.25375271e+00f, -8.62874603e+00f, -4.09131496e-12f,
4280 -1.30615349e+01f, 1.81805515e+01f, -3.03195534e+01f, 9.92720470e-06f, 2.85874920e+01f, -2.77214737e+01f,
4281 0.00000000e+00f, -1.20037527e+01f, -1.23787422e+01f, -5.79531909e-12f, -1.31287651e+01f, -7.87240028e+00f,
4282
4283 1.00999999e+00f, -3.97776222e+00f, -3.97776222e+00f, 2.86356640e+00f, 6.37110424e+00f, -1.01224155e+01f,
4284 -1.01224155e+01f, 1.05787458e+01f, -7.76929522e+00f, -7.76928997e+00f, 1.68836861e+01f, -2.05748577e+01f,
4285 -2.05748577e+01f, 2.49091301e+01f, -5.72616625e+00f, -5.72616386e+00f, -1.87962208e+01f, -1.87962112e+01f,
4286 2.93253498e+01f, -3.37238922e+01f, -3.37238922e+01f, 4.22584419e+01f, -4.85123205e+00f, -4.85122633e+00f,
4287 -2.53339314e+00f, 3.24522591e+01f, -4.65456696e+01f, -4.65456543e+01f, 5.18603249e+01f, -5.36516304e+01f,
4288 -5.36516304e+01f, 7.17381744e+01f, 4.44061565e+00f, 4.44062901e+00f, 2.58841743e+01f, -1.07481155e+01f,
4289 };
4290
4291 for (l = 0; l < 3; l++)
4292 {
4293 if (l == 0)
4294 out_temp = out;
4295 else
4296 out_temp = &in[l - 1];
4297
4298 if (l < 2)
4299 end = 49;
4300 else
4301 end = 48;
4302
4303 for (j = 0; j < ARRAY_SIZE(angle); ++j)
4304 {
4305 for (order = 0; order <= D3DXSH_MAXORDER + 1; order++)
4306 {
4307 for (i = 0; i < ARRAY_SIZE(out); ++i)
4308 {
4309 out[i] = ( i + 1.0f ) * ( i + 1.0f );
4310 in[i] = i + 1.01f;
4311 }
4312
4313 received_ptr = D3DXSHRotateZ(out_temp, order, angle[j], in);
4314 ok(received_ptr == out_temp, "angle %f, order %u, expected %p, received %p\n", angle[j], order, out_temp, received_ptr);
4315
4316 for (i = 0; i < end; i++)
4317 {
4318 /* order = 0 or order = 1 behaves like order = D3DXSH_MINORDER */
4319 square = (order <= D3DXSH_MINORDER) ? D3DXSH_MINORDER * D3DXSH_MINORDER : order * order;
4320 if (i >= square || ((order >= D3DXSH_MAXORDER) && (i >= D3DXSH_MAXORDER * D3DXSH_MAXORDER)))
4321 if (l > 0)
4322 expected = i + l + 0.01f;
4323 else
4324 expected = ( i + 1.0f ) * ( i + 1.0f );
4325 else
4326 expected = table[36 * (l + 3 * j) + i];
4327 equal = compare_float(expected, out_temp[i], 512);
4328 ok(equal || (fabs(expected) < 2.0e-5f && fabs(out_temp[i]) < 2.0e-5f),
4329 "angle %.8e, order %u index %u, expected %.8e, received %.8e.\n",
4330 angle[j], order, i, expected, out_temp[i]);
4331 }
4332 }
4333 }
4334 }
4335 }
4336
test_D3DXSHScale(void)4337 static void test_D3DXSHScale(void)
4338 {
4339 float a[49], b[49], expected, *received_array;
4340 unsigned int i, order;
4341 BOOL equal;
4342
4343 for (i = 0; i < ARRAY_SIZE(a); ++i)
4344 {
4345 a[i] = i;
4346 b[i] = i;
4347 }
4348
4349 for (order = 0; order <= D3DXSH_MAXORDER + 1; order++)
4350 {
4351 received_array = D3DXSHScale(b, order, a, 5.0f);
4352 ok(received_array == b, "Expected %p, received %p\n", b, received_array);
4353
4354 for (i = 0; i < ARRAY_SIZE(b); ++i)
4355 {
4356 if (i < order * order)
4357 expected = 5.0f * a[i];
4358 /* D3DXSHScale does not modify the elements of the array after the order * order-th element */
4359 else
4360 expected = a[i];
4361 equal = compare_float(b[i], expected, 0);
4362 ok(equal, "order %u, element %u, expected %.8e, received %.8e.\n", order, i, expected, b[i]);
4363 }
4364 }
4365 }
4366
START_TEST(math)4367 START_TEST(math)
4368 {
4369 D3DXColorTest();
4370 D3DXFresnelTest();
4371 D3DXMatrixTest();
4372 D3DXPlaneTest();
4373 D3DXQuaternionTest();
4374 D3DXVector2Test();
4375 D3DXVector3Test();
4376 D3DXVector4Test();
4377 test_matrix_stack();
4378 test_Matrix_AffineTransformation2D();
4379 test_Matrix_Decompose();
4380 test_Matrix_Transformation2D();
4381 test_D3DXVec_Array();
4382 test_D3DXFloat_Array();
4383 test_D3DXSHAdd();
4384 test_D3DXSHDot();
4385 test_D3DXSHEvalConeLight();
4386 test_D3DXSHEvalDirection();
4387 test_D3DXSHEvalDirectionalLight();
4388 test_D3DXSHEvalHemisphereLight();
4389 test_D3DXSHEvalSphericalLight();
4390 test_D3DXSHMultiply2();
4391 test_D3DXSHMultiply3();
4392 test_D3DXSHMultiply4();
4393 test_D3DXSHRotate();
4394 test_D3DXSHRotateZ();
4395 test_D3DXSHScale();
4396 }
4397