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