ReactOS 0.4.15-dev-8245-gd24675b
math.c
Go to the documentation of this file.
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
26static 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
42static 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
47static 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
54static 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
62static 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
70static 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
78static 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
86static 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)
103static void expect_vec2_(unsigned int line, const D3DXVECTOR2 *expected, const D3DXVECTOR2 *vector, unsigned int ulps)
104{
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)
112static void expect_vec3_(unsigned int line, const D3DXVECTOR3 *expected, const D3DXVECTOR3 *vector, unsigned int ulps)
113{
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)
121static void expect_vec4_(unsigned int line, const D3DXVECTOR4 *expected, const D3DXVECTOR4 *vector, unsigned int ulps)
122{
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)
130static void expect_color_(unsigned int line, const D3DXCOLOR *expected, const D3DXCOLOR *color, unsigned int ulps)
131{
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)
139static void expect_plane_(unsigned int line, const D3DXPLANE *expected, const D3DXPLANE *plane, unsigned int ulps)
140{
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)
148static 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)
159static void expect_matrix_(unsigned int line, const D3DXMATRIX *expected, const D3DXMATRIX *matrix, unsigned int ulps)
160{
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)
178static 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 {
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
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
208static 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;
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;
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
309static 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
319static void D3DXMatrixTest(void)
320{
321 D3DXMATRIX expectedmat, gotmat, mat, mat2, mat3;
322 BOOL expected, got, equal;
323 float angle, determinant;
326 D3DXVECTOR3 at, axis, eye, last;
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);
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);
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);
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);
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);
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);
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);
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
1378static void D3DXPlaneTest(void)
1379{
1381 D3DXPLANE expectedplane, gotplane, nulplane, plane;
1382 D3DXVECTOR3 expectedvec, gotvec, vec1, vec2, vec3;
1383 LPD3DXVECTOR3 funcpointer;
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
1481static void D3DXQuaternionTest(void)
1482{
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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);
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
1870static 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;
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
2042static 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
2282static 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;
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
2426static 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
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
2454 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2455
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
2461 ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
2462
2464 ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
2466
2468 ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
2470
2472 ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr);
2474
2476 ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr);
2478
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
2484 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2486
2488 ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr);
2490
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
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
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, &center, 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, &center, 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
2621 expect_matrix(&exp_mat, &got_mat, 8);
2622}
2623
2624static 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
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
3052static 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
3203static 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 */