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