/* * Copyright 2008 David Adam * Copyright 2008 Luis Busquets * Copyright 2008 Philip Nilsson * Copyright 2008 Henri Verbeet * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "wine/test.h" #include "d3dx9.h" #include static BOOL compare_float(float f, float g, unsigned int ulps) { int x = *(int *)&f; int y = *(int *)&g; if (x < 0) x = INT_MIN - x; if (y < 0) y = INT_MIN - y; if (abs(x - y) > ulps) return FALSE; return TRUE; } static BOOL compare_vec2(const D3DXVECTOR2 *v1, const D3DXVECTOR2 *v2, unsigned int ulps) { return compare_float(v1->x, v2->x, ulps) && compare_float(v1->y, v2->y, ulps); } static BOOL compare_vec3(const D3DXVECTOR3 *v1, const D3DXVECTOR3 *v2, unsigned int ulps) { return compare_float(v1->x, v2->x, ulps) && compare_float(v1->y, v2->y, ulps) && compare_float(v1->z, v2->z, ulps); } static BOOL compare_vec4(const D3DXVECTOR4 *v1, const D3DXVECTOR4 *v2, unsigned int ulps) { return compare_float(v1->x, v2->x, ulps) && compare_float(v1->y, v2->y, ulps) && compare_float(v1->z, v2->z, ulps) && compare_float(v1->w, v2->w, ulps); } static BOOL compare_color(const D3DXCOLOR *c1, const D3DXCOLOR *c2, unsigned int ulps) { return compare_float(c1->r, c2->r, ulps) && compare_float(c1->g, c2->g, ulps) && compare_float(c1->b, c2->b, ulps) && compare_float(c1->a, c2->a, ulps); } static BOOL compare_plane(const D3DXPLANE *p1, const D3DXPLANE *p2, unsigned int ulps) { return compare_float(p1->a, p2->a, ulps) && compare_float(p1->b, p2->b, ulps) && compare_float(p1->c, p2->c, ulps) && compare_float(p1->d, p2->d, ulps); } static BOOL compare_quaternion(const D3DXQUATERNION *q1, const D3DXQUATERNION *q2, unsigned int ulps) { return compare_float(q1->x, q2->x, ulps) && compare_float(q1->y, q2->y, ulps) && compare_float(q1->z, q2->z, ulps) && compare_float(q1->w, q2->w, ulps); } static BOOL compare_matrix(const D3DXMATRIX *m1, const D3DXMATRIX *m2, unsigned int ulps) { unsigned int i, j; for (i = 0; i < 4; ++i) { for (j = 0; j < 4; ++j) { if (!compare_float(U(*m1).m[i][j], U(*m2).m[i][j], ulps)) return FALSE; } } return TRUE; } #define expect_vec2(expected, vector, ulps) expect_vec2_(__LINE__, expected, vector, ulps) static void expect_vec2_(unsigned int line, const D3DXVECTOR2 *expected, const D3DXVECTOR2 *vector, unsigned int ulps) { BOOL equal = compare_vec2(expected, vector, ulps); ok_(__FILE__, line)(equal, "Got unexpected vector {%.8e, %.8e}, expected {%.8e, %.8e}.\n", vector->x, vector->y, expected->x, expected->y); } #define expect_vec3(expected, vector, ulps) expect_vec3_(__LINE__, expected, vector, ulps) static void expect_vec3_(unsigned int line, const D3DXVECTOR3 *expected, const D3DXVECTOR3 *vector, unsigned int ulps) { BOOL equal = compare_vec3(expected, vector, ulps); ok_(__FILE__, line)(equal, "Got unexpected vector {%.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e}.\n", vector->x, vector->y, vector->z, expected->x, expected->y, expected->z); } #define expect_vec4(expected, vector, ulps) expect_vec4_(__LINE__, expected, vector, ulps) static void expect_vec4_(unsigned int line, const D3DXVECTOR4 *expected, const D3DXVECTOR4 *vector, unsigned int ulps) { BOOL equal = compare_vec4(expected, vector, ulps); ok_(__FILE__, line)(equal, "Got unexpected vector {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n", vector->x, vector->y, vector->z, vector->w, expected->x, expected->y, expected->z, expected->w); } #define expect_color(expected, color, ulps) expect_color_(__LINE__, expected, color, ulps) static void expect_color_(unsigned int line, const D3DXCOLOR *expected, const D3DXCOLOR *color, unsigned int ulps) { BOOL equal = compare_color(expected, color, ulps); ok_(__FILE__, line)(equal, "Got unexpected color {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n", color->r, color->g, color->b, color->a, expected->r, expected->g, expected->b, expected->a); } #define expect_plane(expected, plane, ulps) expect_plane_(__LINE__, expected, plane, ulps) static void expect_plane_(unsigned int line, const D3DXPLANE *expected, const D3DXPLANE *plane, unsigned int ulps) { BOOL equal = compare_plane(expected, plane, ulps); ok_(__FILE__, line)(equal, "Got unexpected plane {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n", plane->a, plane->b, plane->c, plane->d, expected->a, expected->b, expected->c, expected->d); } #define expect_quaternion(expected, quaternion, ulps) expect_quaternion_(__LINE__, expected, quaternion, ulps) static void expect_quaternion_(unsigned int line, const D3DXQUATERNION *expected, const D3DXQUATERNION *quaternion, unsigned int ulps) { BOOL equal = compare_quaternion(expected, quaternion, ulps); ok_(__FILE__, line)(equal, "Got unexpected quaternion {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e}.\n", quaternion->x, quaternion->y, quaternion->z, quaternion->w, expected->x, expected->y, expected->z, expected->w); } #define expect_matrix(expected, matrix, ulps) expect_matrix_(__LINE__, expected, matrix, ulps) static void expect_matrix_(unsigned int line, const D3DXMATRIX *expected, const D3DXMATRIX *matrix, unsigned int ulps) { BOOL equal = compare_matrix(expected, matrix, ulps); ok_(__FILE__, line)(equal, "Got unexpected matrix {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, " "%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e}, " "expected {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, " "%.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", U(*matrix).m[0][0], U(*matrix).m[0][1], U(*matrix).m[0][2], U(*matrix).m[0][3], U(*matrix).m[1][0], U(*matrix).m[1][1], U(*matrix).m[1][2], U(*matrix).m[1][3], U(*matrix).m[2][0], U(*matrix).m[2][1], U(*matrix).m[2][2], U(*matrix).m[2][3], U(*matrix).m[3][0], U(*matrix).m[3][1], U(*matrix).m[3][2], U(*matrix).m[3][3], U(*expected).m[0][0], U(*expected).m[0][1], U(*expected).m[0][2], U(*expected).m[0][3], U(*expected).m[1][0], U(*expected).m[1][1], U(*expected).m[1][2], U(*expected).m[1][3], U(*expected).m[2][0], U(*expected).m[2][1], U(*expected).m[2][2], U(*expected).m[2][3], U(*expected).m[3][0], U(*expected).m[3][1], U(*expected).m[3][2], U(*expected).m[3][3]); } #define expect_vec4_array(count, expected, vector, ulps) expect_vec4_array_(__LINE__, count, expected, vector, ulps) static void expect_vec4_array_(unsigned int line, unsigned int count, const D3DXVECTOR4 *expected, const D3DXVECTOR4 *vector, unsigned int ulps) { BOOL equal; unsigned int i; for (i = 0; i < count; ++i) { equal = compare_vec4(&expected[i], &vector[i], ulps); ok_(__FILE__, line)(equal, "Got unexpected vector {%.8e, %.8e, %.8e, %.8e} at index %u, expected {%.8e, %.8e, %.8e, %.8e}.\n", vector[i].x, vector[i].y, vector[i].z, vector[i].w, i, expected[i].x, expected[i].y, expected[i].z, expected[i].w); if (!equal) break; } } static void set_matrix(D3DXMATRIX* mat, float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33) { U(mat)->m[0][0] = m00; U(mat)->m[0][1] = m01; U(mat)->m[0][2] = m02; U(mat)->m[0][3] = m03; U(mat)->m[1][0] = m10; U(mat)->m[1][1] = m11; U(mat)->m[1][2] = m12; U(mat)->m[1][3] = m13; U(mat)->m[2][0] = m20; U(mat)->m[2][1] = m21; U(mat)->m[2][2] = m22; U(mat)->m[2][3] = m23; U(mat)->m[3][0] = m30; U(mat)->m[3][1] = m31; U(mat)->m[3][2] = m32; U(mat)->m[3][3] = m33; } static void D3DXColorTest(void) { D3DXCOLOR color, color1, color2, expected, got; LPD3DXCOLOR funcpointer; FLOAT scale; color.r = 0.2f; color.g = 0.75f; color.b = 0.41f; color.a = 0.93f; color1.r = 0.6f; color1.g = 0.55f; color1.b = 0.23f; color1.a = 0.82f; color2.r = 0.3f; color2.g = 0.5f; color2.b = 0.76f; color2.a = 0.11f; scale = 0.3f; /*_______________D3DXColorAdd________________*/ expected.r = 0.9f; expected.g = 1.05f; expected.b = 0.99f, expected.a = 0.93f; D3DXColorAdd(&got,&color1,&color2); expect_color(&expected, &got, 1); /* Test the NULL case */ funcpointer = D3DXColorAdd(&got,NULL,&color2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorAdd(NULL,NULL,&color2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorAdd(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXColorAdjustContrast______*/ expected.r = 0.41f; expected.g = 0.575f; expected.b = 0.473f, expected.a = 0.93f; D3DXColorAdjustContrast(&got,&color,scale); expect_color(&expected, &got, 0); /*_______________D3DXColorAdjustSaturation______*/ expected.r = 0.486028f; expected.g = 0.651028f; expected.b = 0.549028f, expected.a = 0.93f; D3DXColorAdjustSaturation(&got,&color,scale); expect_color(&expected, &got, 16); /*_______________D3DXColorLerp________________*/ expected.r = 0.32f; expected.g = 0.69f; expected.b = 0.356f; expected.a = 0.897f; D3DXColorLerp(&got,&color,&color1,scale); expect_color(&expected, &got, 0); /* Test the NULL case */ funcpointer = D3DXColorLerp(&got,NULL,&color1,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorLerp(NULL,NULL,&color1,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorLerp(NULL,NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXColorModulate________________*/ expected.r = 0.18f; expected.g = 0.275f; expected.b = 0.1748f; expected.a = 0.0902f; D3DXColorModulate(&got,&color1,&color2); expect_color(&expected, &got, 0); /* Test the NULL case */ funcpointer = D3DXColorModulate(&got,NULL,&color2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorModulate(NULL,NULL,&color2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorModulate(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXColorNegative________________*/ expected.r = 0.8f; expected.g = 0.25f; expected.b = 0.59f; expected.a = 0.93f; D3DXColorNegative(&got,&color); expect_color(&expected, &got, 1); /* Test the greater than 1 case */ color1.r = 0.2f; color1.g = 1.75f; color1.b = 0.41f; color1.a = 0.93f; expected.r = 0.8f; expected.g = -0.75f; expected.b = 0.59f; expected.a = 0.93f; D3DXColorNegative(&got,&color1); expect_color(&expected, &got, 1); /* Test the negative case */ color1.r = 0.2f; color1.g = -0.75f; color1.b = 0.41f; color1.a = 0.93f; expected.r = 0.8f; expected.g = 1.75f; expected.b = 0.59f; expected.a = 0.93f; D3DXColorNegative(&got,&color1); expect_color(&expected, &got, 1); /* Test the NULL case */ funcpointer = D3DXColorNegative(&got,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorNegative(NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXColorScale________________*/ expected.r = 0.06f; expected.g = 0.225f; expected.b = 0.123f; expected.a = 0.279f; D3DXColorScale(&got,&color,scale); expect_color(&expected, &got, 1); /* Test the NULL case */ funcpointer = D3DXColorScale(&got,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorScale(NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXColorSubtract_______________*/ expected.r = -0.1f; expected.g = 0.25f; expected.b = -0.35f, expected.a = 0.82f; D3DXColorSubtract(&got,&color,&color2); expect_color(&expected, &got, 1); /* Test the NULL case */ funcpointer = D3DXColorSubtract(&got,NULL,&color2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorSubtract(NULL,NULL,&color2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXColorSubtract(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); } static void D3DXFresnelTest(void) { float fresnel; BOOL equal; fresnel = D3DXFresnelTerm(0.5f, 1.5f); equal = compare_float(fresnel, 8.91867128e-02f, 1); ok(equal, "Got unexpected Fresnel term %.8e.\n", fresnel); } static void D3DXMatrixTest(void) { D3DXMATRIX expectedmat, gotmat, mat, mat2, mat3; BOOL expected, got, equal; float angle, determinant; D3DXMATRIX *funcpointer; D3DXPLANE plane; D3DXQUATERNION q, r; D3DXVECTOR3 at, axis, eye, last; D3DXVECTOR4 light; U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f; U(mat).m[3][3] = -40.0f; U(mat2).m[0][0] = 1.0f; U(mat2).m[1][0] = 2.0f; U(mat2).m[2][0] = 3.0f; U(mat2).m[3][0] = 4.0f; U(mat2).m[0][1] = 5.0f; U(mat2).m[1][1] = 6.0f; U(mat2).m[2][1] = 7.0f; U(mat2).m[3][1] = 8.0f; U(mat2).m[0][2] = -8.0f; U(mat2).m[1][2] = -7.0f; U(mat2).m[2][2] = -6.0f; U(mat2).m[3][2] = -5.0f; U(mat2).m[0][3] = -4.0f; U(mat2).m[1][3] = -3.0f; U(mat2).m[2][3] = -2.0f; U(mat2).m[3][3] = -1.0f; plane.a = -3.0f; plane.b = -1.0f; plane.c = 4.0f; plane.d = 7.0f; q.x = 1.0f; q.y = -4.0f; q.z =7.0f; q.w = -11.0f; r.x = 0.87f; r.y = 0.65f; r.z =0.43f; r.w= 0.21f; at.x = -2.0f; at.y = 13.0f; at.z = -9.0f; axis.x = 1.0f; axis.y = -3.0f; axis.z = 7.0f; eye.x = 8.0f; eye.y = -5.0f; eye.z = 5.75f; last.x = 9.7f; last.y = -8.6; last.z = 1.3f; light.x = 9.6f; light.y = 8.5f; light.z = 7.4; light.w = 6.3; angle = D3DX_PI/3.0f; /*____________D3DXMatrixAffineTransformation______*/ set_matrix(&expectedmat, -459.239990f, -576.719971f, -263.440002f, 0.0f, 519.760010f, -352.440002f, -277.679993f, 0.0f, 363.119995f, -121.040001f, -117.479996f, 0.0f, -1239.0f, 667.0f, 567.0f, 1.0f); D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, &q, &axis); expect_matrix(&expectedmat, &gotmat, 0); /* Test the NULL case */ 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; D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, &q, &axis); expect_matrix(&expectedmat, &gotmat, 0); U(expectedmat).m[3][0] = -1240.0f; U(expectedmat).m[3][1] = 670.0f; U(expectedmat).m[3][2] = 560.0f; U(expectedmat).m[3][3] = 1.0f; D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, &q, NULL); expect_matrix(&expectedmat, &gotmat, 0); 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; D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, &q, NULL); expect_matrix(&expectedmat, &gotmat, 0); set_matrix(&expectedmat, 3.56f, 0.0f, 0.0f, 0.0f, 0.0f, 3.56f, 0.0f, 0.0f, 0.0f, 0.0f, 3.56f, 0.0f, 1.0f, -3.0f, 7.0f, 1.0f); D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, NULL, &axis); expect_matrix(&expectedmat, &gotmat, 0); D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, NULL, &axis); expect_matrix(&expectedmat, &gotmat, 0); 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; D3DXMatrixAffineTransformation(&gotmat, 3.56f, &at, NULL, NULL); expect_matrix(&expectedmat, &gotmat, 0); D3DXMatrixAffineTransformation(&gotmat, 3.56f, NULL, NULL, NULL); expect_matrix(&expectedmat, &gotmat, 0); /*____________D3DXMatrixfDeterminant_____________*/ determinant = D3DXMatrixDeterminant(&mat); equal = compare_float(determinant, -147888.0f, 0); ok(equal, "Got unexpected determinant %.8e.\n", determinant); /*____________D3DXMatrixInverse______________*/ set_matrix(&expectedmat, 16067.0f/73944.0f, -10165.0f/147888.0f, -2729.0f/147888.0f, -1631.0f/49296.0f, -565.0f/36972.0f, 2723.0f/73944.0f, -1073.0f/73944.0f, 289.0f/24648.0f, -389.0f/2054.0f, 337.0f/4108.0f, 181.0f/4108.0f, 317.0f/4108.0f, 163.0f/5688.0f, -101.0f/11376.0f, -73.0f/11376.0f, -127.0f/3792.0f); D3DXMatrixInverse(&gotmat, &determinant, &mat); expect_matrix(&expectedmat, &gotmat, 1); equal = compare_float(determinant, -147888.0f, 0); ok(equal, "Got unexpected determinant %.8e.\n", determinant); funcpointer = D3DXMatrixInverse(&gotmat,NULL,&mat2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*____________D3DXMatrixIsIdentity______________*/ expected = FALSE; memset(&mat3, 0, sizeof(mat3)); got = D3DXMatrixIsIdentity(&mat3); ok(expected == got, "Expected : %d, Got : %d\n", expected, got); D3DXMatrixIdentity(&mat3); expected = TRUE; got = D3DXMatrixIsIdentity(&mat3); ok(expected == got, "Expected : %d, Got : %d\n", expected, got); U(mat3).m[0][0] = 0.000009f; expected = FALSE; got = D3DXMatrixIsIdentity(&mat3); ok(expected == got, "Expected : %d, Got : %d\n", expected, got); /* Test the NULL case */ expected = FALSE; got = D3DXMatrixIsIdentity(NULL); ok(expected == got, "Expected : %d, Got : %d\n", expected, got); /*____________D3DXMatrixLookAtLH_______________*/ set_matrix(&expectedmat, -0.82246518f, -0.40948939f, -0.39480308f, 0.0f, -0.55585691f, 0.43128574f, 0.71064550f, 0.0f, -0.12072885f, 0.80393475f, -0.58233452f, 0.0f, 4.4946337f, 0.80971903f, 10.060076f, 1.0f); D3DXMatrixLookAtLH(&gotmat, &eye, &at, &axis); expect_matrix(&expectedmat, &gotmat, 32); /*____________D3DXMatrixLookAtRH_______________*/ set_matrix(&expectedmat, 0.82246518f, -0.40948939f, 0.39480308f, 0.0f, 0.55585691f, 0.43128574f, -0.71064550f, 0.0f, 0.12072885f, 0.80393475f, 0.58233452f, 0.0f, -4.4946337f, 0.80971903f, -10.060076f, 1.0f); D3DXMatrixLookAtRH(&gotmat, &eye, &at, &axis); expect_matrix(&expectedmat, &gotmat, 32); /*____________D3DXMatrixMultiply______________*/ set_matrix(&expectedmat, 73.0f, 193.0f, -197.0f, -77.0f, 231.0f, 551.0f, -489.0f, -169.0f, 239.0f, 523.0f, -400.0f, -116.0f, -164.0f, -320.0f, 187.0f, 31.0f); D3DXMatrixMultiply(&gotmat, &mat, &mat2); expect_matrix(&expectedmat, &gotmat, 0); /*____________D3DXMatrixMultiplyTranspose____*/ set_matrix(&expectedmat, 73.0f, 231.0f, 239.0f, -164.0f, 193.0f, 551.0f, 523.0f, -320.0f, -197.0f, -489.0f, -400.0f, 187.0f, -77.0f, -169.0f, -116.0f, 31.0f); D3DXMatrixMultiplyTranspose(&gotmat, &mat, &mat2); expect_matrix(&expectedmat, &gotmat, 0); /*____________D3DXMatrixOrthoLH_______________*/ set_matrix(&expectedmat, 0.8f, 0.0f, 0.0f, 0.0f, 0.0f, 0.27027027f, 0.0f, 0.0f, 0.0f, 0.0f, -0.15151515f, 0.0f, 0.0f, 0.0f, -0.48484848f, 1.0f); D3DXMatrixOrthoLH(&gotmat, 2.5f, 7.4f, -3.2f, -9.8f); expect_matrix(&expectedmat, &gotmat, 16); /*____________D3DXMatrixOrthoOffCenterLH_______________*/ set_matrix(&expectedmat, 3.6363636f, 0.0f, 0.0f, 0.0f, 0.0f, 0.18018018f, 0.0f, 0.0f, 0.0f, 0.0f, -0.045662100f, 0.0f, -1.7272727f, -0.56756757f, 0.42465753f, 1.0f); D3DXMatrixOrthoOffCenterLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 9.3, -12.6); expect_matrix(&expectedmat, &gotmat, 32); /*____________D3DXMatrixOrthoOffCenterRH_______________*/ set_matrix(&expectedmat, 3.6363636f, 0.0f, 0.0f, 0.0f, 0.0f, 0.18018018f, 0.0f, 0.0f, 0.0f, 0.0f, 0.045662100f, 0.0f, -1.7272727f, -0.56756757f, 0.42465753f, 1.0f); D3DXMatrixOrthoOffCenterRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 9.3, -12.6); expect_matrix(&expectedmat, &gotmat, 32); /*____________D3DXMatrixOrthoRH_______________*/ set_matrix(&expectedmat, 0.8f, 0.0f, 0.0f, 0.0f, 0.0f, 0.27027027f, 0.0f, 0.0f, 0.0f, 0.0f, 0.15151515f, 0.0f, 0.0f, 0.0f, -0.48484848f, 1.0f); D3DXMatrixOrthoRH(&gotmat, 2.5f, 7.4f, -3.2f, -9.8f); expect_matrix(&expectedmat, &gotmat, 16); /*____________D3DXMatrixPerspectiveFovLH_______________*/ set_matrix(&expectedmat, 13.288858f, 0.0f, 0.0f, 0.0f, 0.0f, 9.9666444f, 0.0f, 0.0f, 0.0f, 0.0f, 0.78378378f, 1.0f, 0.0f, 0.0f, 1.8810811f, 0.0f); D3DXMatrixPerspectiveFovLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f); expect_matrix(&expectedmat, &gotmat, 4); /*____________D3DXMatrixPerspectiveFovRH_______________*/ set_matrix(&expectedmat, 13.288858f, 0.0f, 0.0f, 0.0f, 0.0f, 9.9666444f, 0.0f, 0.0f, 0.0f, 0.0f, -0.78378378f, -1.0f, 0.0f, 0.0f, 1.8810811f, 0.0f); D3DXMatrixPerspectiveFovRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f); expect_matrix(&expectedmat, &gotmat, 4); /*____________D3DXMatrixPerspectiveLH_______________*/ set_matrix(&expectedmat, -24.0f, 0.0f, 0.0f, 0.0f, 0.0f, -6.4f, 0.0f, 0.0f, 0.0f, 0.0f, 0.78378378f, 1.0f, 0.0f, 0.0f, 1.8810811f, 0.0f); D3DXMatrixPerspectiveLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f); expect_matrix(&expectedmat, &gotmat, 4); /*____________D3DXMatrixPerspectiveOffCenterLH_______________*/ set_matrix(&expectedmat, 11.636364f, 0.0f, 0.0f, 0.0f, 0.0f, 0.57657658f, 0.0f, 0.0f, -1.7272727f, -0.56756757f, 0.84079602f, 1.0f, 0.0f, 0.0f, -2.6905473f, 0.0f); D3DXMatrixPerspectiveOffCenterLH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 3.2f, -16.9f); expect_matrix(&expectedmat, &gotmat, 8); /*____________D3DXMatrixPerspectiveOffCenterRH_______________*/ set_matrix(&expectedmat, 11.636364f, 0.0f, 0.0f, 0.0f, 0.0f, 0.57657658f, 0.0f, 0.0f, 1.7272727f, 0.56756757f, -0.84079602f, -1.0f, 0.0f, 0.0f, -2.6905473f, 0.0f); D3DXMatrixPerspectiveOffCenterRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f, 3.2f, -16.9f); expect_matrix(&expectedmat, &gotmat, 8); /*____________D3DXMatrixPerspectiveRH_______________*/ set_matrix(&expectedmat, -24.0f, -0.0f, 0.0f, 0.0f, 0.0f, -6.4f, 0.0f, 0.0f, 0.0f, 0.0f, -0.78378378f, -1.0f, 0.0f, 0.0f, 1.8810811f, 0.0f); D3DXMatrixPerspectiveRH(&gotmat, 0.2f, 0.75f, -2.4f, 8.7f); expect_matrix(&expectedmat, &gotmat, 4); /*____________D3DXMatrixReflect______________*/ set_matrix(&expectedmat, 0.30769235f, -0.23076922f, 0.92307687f, 0.0f, -0.23076922, 0.92307693f, 0.30769232f, 0.0f, 0.92307687f, 0.30769232f, -0.23076922f, 0.0f, 1.6153846f, 0.53846157f, -2.1538463f, 1.0f); D3DXMatrixReflect(&gotmat, &plane); expect_matrix(&expectedmat, &gotmat, 32); /*____________D3DXMatrixRotationAxis_____*/ set_matrix(&expectedmat, 0.50847453f, 0.76380461f, 0.39756277f, 0.0f, -0.81465209f, 0.57627118f, -0.065219201f, 0.0f, -0.27891868f, -0.29071301f, 0.91525424f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); D3DXMatrixRotationAxis(&gotmat, &axis, angle); expect_matrix(&expectedmat, &gotmat, 32); /*____________D3DXMatrixRotationQuaternion______________*/ set_matrix(&expectedmat, -129.0f, -162.0f, -74.0f, 0.0f, 146.0f, -99.0f, -78.0f, 0.0f, 102.0f, -34.0f, -33.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); D3DXMatrixRotationQuaternion(&gotmat, &q); expect_matrix(&expectedmat, &gotmat, 0); /*____________D3DXMatrixRotationX______________*/ set_matrix(&expectedmat, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, sqrt(3.0f)/2.0f, 0.0f, 0.0f, -sqrt(3.0f)/2.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); D3DXMatrixRotationX(&gotmat, angle); expect_matrix(&expectedmat, &gotmat, 1); /*____________D3DXMatrixRotationY______________*/ set_matrix(&expectedmat, 0.5f, 0.0f, -sqrt(3.0f)/2.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, sqrt(3.0f)/2.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); D3DXMatrixRotationY(&gotmat, angle); expect_matrix(&expectedmat, &gotmat, 1); /*____________D3DXMatrixRotationYawPitchRoll____*/ set_matrix(&expectedmat, 0.88877726f, 0.091874748f, -0.44903678f, 0.0f, 0.35171318f, 0.49148652f, 0.79670501f, 0.0f, 0.29389259f, -0.86602545f, 0.40450847f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); D3DXMatrixRotationYawPitchRoll(&gotmat, 3.0f * angle / 5.0f, angle, 3.0f * angle / 17.0f); expect_matrix(&expectedmat, &gotmat, 64); /*____________D3DXMatrixRotationZ______________*/ set_matrix(&expectedmat, 0.5f, sqrt(3.0f)/2.0f, 0.0f, 0.0f, -sqrt(3.0f)/2.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); D3DXMatrixRotationZ(&gotmat, angle); expect_matrix(&expectedmat, &gotmat, 1); /*____________D3DXMatrixScaling______________*/ set_matrix(&expectedmat, 0.69f, 0.0f, 0.0f, 0.0f, 0.0f, 0.53f, 0.0f, 0.0f, 0.0f, 0.0f, 4.11f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); D3DXMatrixScaling(&gotmat, 0.69f, 0.53f, 4.11f); expect_matrix(&expectedmat, &gotmat, 0); /*____________D3DXMatrixShadow______________*/ set_matrix(&expectedmat, 12.786773f, 5.0009613f, 4.3537784f, 3.7065949f, 1.8827150f, 8.8056154f, 1.4512594f, 1.2355317f, -7.5308599f, -6.6679487f, 1.3335901f, -4.9421268f, -13.179006f, -11.668910f, -10.158816f, -1.5100943f); D3DXMatrixShadow(&gotmat, &light, &plane); expect_matrix(&expectedmat, &gotmat, 8); /*____________D3DXMatrixTransformation______________*/ set_matrix(&expectedmat, -0.21480007f, 1.3116000f, 0.47520003f, 0.0f, 0.95040143f, -0.88360137f, 0.92439979f, 0.0f, 1.0212044f, 0.19359307f, -1.3588026f, 0.0f, 18.298532f, -29.624001f, 15.683499f, 1.0f); D3DXMatrixTransformation(&gotmat, &at, &q, NULL, &eye, &r, &last); expect_matrix(&expectedmat, &gotmat, 512); /*____________D3DXMatrixTranslation______________*/ set_matrix(&expectedmat, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.69f, 0.53f, 4.11f, 1.0f); D3DXMatrixTranslation(&gotmat, 0.69f, 0.53f, 4.11f); expect_matrix(&expectedmat, &gotmat, 0); /*____________D3DXMatrixTranspose______________*/ set_matrix(&expectedmat, 10.0f, 11.0f, 19.0f, 2.0f, 5.0f, 20.0f, -21.0f, 3.0f, 7.0f, 16.0f, 30.f, -4.0f, 8.0f, 33.0f, 43.0f, -40.0f); D3DXMatrixTranspose(&gotmat, &mat); expect_matrix(&expectedmat, &gotmat, 0); } static void D3DXPlaneTest(void) { D3DXMATRIX mat; D3DXPLANE expectedplane, gotplane, nulplane, plane; D3DXVECTOR3 expectedvec, gotvec, vec1, vec2, vec3; LPD3DXVECTOR3 funcpointer; D3DXVECTOR4 vec; FLOAT expected, got; U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f; U(mat).m[3][3] = -40.0f; plane.a = -3.0f; plane.b = -1.0f; plane.c = 4.0f; plane.d = 7.0f; vec.x = 2.0f; vec.y = 5.0f; vec.z = -6.0f; vec.w = 11.0f; /*_______________D3DXPlaneDot________________*/ expected = 42.0f; got = D3DXPlaneDot(&plane,&vec), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); expected = 0.0f; got = D3DXPlaneDot(NULL,&vec), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); expected = 0.0f; got = D3DXPlaneDot(NULL,NULL), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); /*_______________D3DXPlaneDotCoord________________*/ expected = -28.0f; got = D3DXPlaneDotCoord(&plane,&vec), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); expected = 0.0f; got = D3DXPlaneDotCoord(NULL,&vec), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); expected = 0.0f; got = D3DXPlaneDotCoord(NULL,NULL), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); /*_______________D3DXPlaneDotNormal______________*/ expected = -35.0f; got = D3DXPlaneDotNormal(&plane,&vec), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); expected = 0.0f; got = D3DXPlaneDotNormal(NULL,&vec), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); expected = 0.0f; got = D3DXPlaneDotNormal(NULL,NULL), ok( expected == got, "Expected : %f, Got : %f\n",expected, got); /*_______________D3DXPlaneFromPointNormal_______*/ vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f; vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f; expectedplane.a = 17.0f; expectedplane.b = 31.0f; expectedplane.c = 24.0f; expectedplane.d = -950.0f; D3DXPlaneFromPointNormal(&gotplane, &vec1, &vec2); expect_plane(&expectedplane, &gotplane, 0); gotplane.a = vec2.x; gotplane.b = vec2.y; gotplane.c = vec2.z; D3DXPlaneFromPointNormal(&gotplane, &vec1, (D3DXVECTOR3 *)&gotplane); expect_plane(&expectedplane, &gotplane, 0); gotplane.a = vec1.x; gotplane.b = vec1.y; gotplane.c = vec1.z; expectedplane.d = -1826.0f; D3DXPlaneFromPointNormal(&gotplane, (D3DXVECTOR3 *)&gotplane, &vec2); expect_plane(&expectedplane, &gotplane, 0); /*_______________D3DXPlaneFromPoints_______*/ vec1.x = 1.0f; vec1.y = 2.0f; vec1.z = 3.0f; vec2.x = 1.0f; vec2.y = -6.0f; vec2.z = -5.0f; vec3.x = 83.0f; vec3.y = 74.0f; vec3.z = 65.0f; expectedplane.a = 0.085914f; expectedplane.b = -0.704492f; expectedplane.c = 0.704492f; expectedplane.d = -0.790406f; D3DXPlaneFromPoints(&gotplane,&vec1,&vec2,&vec3); expect_plane(&expectedplane, &gotplane, 64); /*_______________D3DXPlaneIntersectLine___________*/ vec1.x = 9.0f; vec1.y = 6.0f; vec1.z = 3.0f; vec2.x = 2.0f; vec2.y = 5.0f; vec2.z = 8.0f; expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f; D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2); expect_vec3(&expectedvec, &gotvec, 1); /* Test a parallel line */ vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f; vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f; expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f; funcpointer = D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXPlaneNormalize______________*/ 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); D3DXPlaneNormalize(&gotplane, &plane); expect_plane(&expectedplane, &gotplane, 2); nulplane.a = 0.0; nulplane.b = 0.0f, nulplane.c = 0.0f; nulplane.d = 0.0f; expectedplane.a = 0.0f; expectedplane.b = 0.0f; expectedplane.c = 0.0f; expectedplane.d = 0.0f; D3DXPlaneNormalize(&gotplane, &nulplane); expect_plane(&expectedplane, &gotplane, 0); /*_______________D3DXPlaneTransform____________*/ expectedplane.a = 49.0f; expectedplane.b = -98.0f; expectedplane.c = 55.0f; expectedplane.d = -165.0f; D3DXPlaneTransform(&gotplane,&plane,&mat); expect_plane(&expectedplane, &gotplane, 0); } static void D3DXQuaternionTest(void) { D3DXMATRIX mat; D3DXQUATERNION expectedquat, gotquat, Nq, Nq1, nul, smallq, smallr, q, r, s, t, u; BOOL expectedbool, gotbool, equal; float angle, got, scale, scale2; LPD3DXQUATERNION funcpointer; D3DXVECTOR3 axis, expectedvec; nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f; nul.w = 0.0f; q.x = 1.0f, q.y = 2.0f; q.z = 4.0f; q.w = 10.0f; r.x = -3.0f; r.y = 4.0f; r.z = -5.0f; r.w = 7.0; t.x = -1111.0f, t.y = 111.0f; t.z = -11.0f; t.w = 1.0f; u.x = 91.0f; u.y = - 82.0f; u.z = 7.3f; u.w = -6.4f; smallq.x = 0.1f; smallq.y = 0.2f; smallq.z= 0.3f; smallq.w = 0.4f; smallr.x = 0.5f; smallr.y = 0.6f; smallr.z= 0.7f; smallr.w = 0.8f; scale = 0.3f; scale2 = 0.78f; /*_______________D3DXQuaternionBaryCentric________________________*/ expectedquat.x = -867.444458; expectedquat.y = 87.851111f; expectedquat.z = -9.937778f; expectedquat.w = 3.235555f; D3DXQuaternionBaryCentric(&gotquat,&q,&r,&t,scale,scale2); expect_quaternion(&expectedquat, &gotquat, 1); /*_______________D3DXQuaternionConjugate________________*/ expectedquat.x = -1.0f; expectedquat.y = -2.0f; expectedquat.z = -4.0f; expectedquat.w = 10.0f; D3DXQuaternionConjugate(&gotquat,&q); expect_quaternion(&expectedquat, &gotquat, 0); /* Test the NULL case */ funcpointer = D3DXQuaternionConjugate(&gotquat,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXQuaternionConjugate(NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXQuaternionDot______________________*/ got = D3DXQuaternionDot(&q,&r); equal = compare_float(got, 55.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /* Tests the case NULL */ got = D3DXQuaternionDot(NULL,&r); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); got = D3DXQuaternionDot(NULL,NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /*_______________D3DXQuaternionExp______________________________*/ expectedquat.x = -0.216382f; expectedquat.y = -0.432764f; expectedquat.z = -0.8655270f; expectedquat.w = -0.129449f; D3DXQuaternionExp(&gotquat,&q); expect_quaternion(&expectedquat, &gotquat, 16); /* Test the null quaternion */ expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 1.0f; D3DXQuaternionExp(&gotquat,&nul); expect_quaternion(&expectedquat, &gotquat, 0); /* Test the case where the norm of the quaternion is <1 */ Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w= 0.9f; expectedquat.x = 0.195366; expectedquat.y = 0.097683f; expectedquat.z = 0.293049f; expectedquat.w = 0.930813f; D3DXQuaternionExp(&gotquat,&Nq1); expect_quaternion(&expectedquat, &gotquat, 8); /*_______________D3DXQuaternionIdentity________________*/ expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 1.0f; D3DXQuaternionIdentity(&gotquat); expect_quaternion(&expectedquat, &gotquat, 0); /* Test the NULL case */ funcpointer = D3DXQuaternionIdentity(NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXQuaternionInverse________________________*/ expectedquat.x = -1.0f/121.0f; expectedquat.y = -2.0f/121.0f; expectedquat.z = -4.0f/121.0f; expectedquat.w = 10.0f/121.0f; D3DXQuaternionInverse(&gotquat,&q); expect_quaternion(&expectedquat, &gotquat, 0); expectedquat.x = 1.0f; expectedquat.y = 2.0f; expectedquat.z = 4.0f; expectedquat.w = 10.0f; D3DXQuaternionInverse(&gotquat,&gotquat); expect_quaternion(&expectedquat, &gotquat, 1); /*_______________D3DXQuaternionIsIdentity________________*/ s.x = 0.0f; s.y = 0.0f; s.z = 0.0f; s.w = 1.0f; expectedbool = TRUE; gotbool = D3DXQuaternionIsIdentity(&s); ok( expectedbool == gotbool, "Expected boolean : %d, Got bool : %d\n", expectedbool, gotbool); s.x = 2.3f; s.y = -4.2f; s.z = 1.2f; s.w=0.2f; expectedbool = FALSE; gotbool = D3DXQuaternionIsIdentity(&q); ok( expectedbool == gotbool, "Expected boolean : %d, Got bool : %d\n", expectedbool, gotbool); /* Test the NULL case */ gotbool = D3DXQuaternionIsIdentity(NULL); ok(gotbool == FALSE, "Expected boolean: %d, Got boolean: %d\n", FALSE, gotbool); /*_______________D3DXQuaternionLength__________________________*/ got = D3DXQuaternionLength(&q); equal = compare_float(got, 11.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL. */ got = D3DXQuaternionLength(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXQuaternionLengthSq________________________*/ got = D3DXQuaternionLengthSq(&q); equal = compare_float(got, 121.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL */ got = D3DXQuaternionLengthSq(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXQuaternionLn______________________________*/ expectedquat.x = 1.0f; expectedquat.y = 2.0f; expectedquat.z = 4.0f; expectedquat.w = 0.0f; D3DXQuaternionLn(&gotquat,&q); expect_quaternion(&expectedquat, &gotquat, 0); expectedquat.x = -3.0f; expectedquat.y = 4.0f; expectedquat.z = -5.0f; expectedquat.w = 0.0f; D3DXQuaternionLn(&gotquat,&r); expect_quaternion(&expectedquat, &gotquat, 0); Nq.x = 1.0f/11.0f; Nq.y = 2.0f/11.0f; Nq.z = 4.0f/11.0f; Nq.w=10.0f/11.0f; expectedquat.x = 0.093768f; expectedquat.y = 0.187536f; expectedquat.z = 0.375073f; expectedquat.w = 0.0f; D3DXQuaternionLn(&gotquat,&Nq); expect_quaternion(&expectedquat, &gotquat, 32); Nq.x = 0.0f; Nq.y = 0.0f; Nq.z = 0.0f; Nq.w = 1.0f; expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f; D3DXQuaternionLn(&gotquat,&Nq); expect_quaternion(&expectedquat, &gotquat, 0); Nq.x = 5.4f; Nq.y = 1.2f; Nq.z = -0.3f; Nq.w = -0.3f; expectedquat.x = 10.616652f; expectedquat.y = 2.359256f; expectedquat.z = -0.589814f; expectedquat.w = 0.0f; D3DXQuaternionLn(&gotquat,&Nq); expect_quaternion(&expectedquat, &gotquat, 1); /* Test the case where the norm of the quaternion is <1 */ Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w = 0.9f; expectedquat.x = 0.206945f; expectedquat.y = 0.103473f; expectedquat.z = 0.310418f; expectedquat.w = 0.0f; D3DXQuaternionLn(&gotquat,&Nq1); expect_quaternion(&expectedquat, &gotquat, 64); /* Test the case where the real part of the quaternion is -1.0f */ Nq1.x = 0.2f; Nq1.y = 0.1f; Nq1.z = 0.3; Nq1.w = -1.0f; expectedquat.x = 0.2f; expectedquat.y = 0.1f; expectedquat.z = 0.3f; expectedquat.w = 0.0f; D3DXQuaternionLn(&gotquat,&Nq1); expect_quaternion(&expectedquat, &gotquat, 0); /*_______________D3DXQuaternionMultiply________________________*/ expectedquat.x = 3.0f; expectedquat.y = 61.0f; expectedquat.z = -32.0f; expectedquat.w = 85.0f; D3DXQuaternionMultiply(&gotquat,&q,&r); expect_quaternion(&expectedquat, &gotquat, 0); /*_______________D3DXQuaternionNormalize________________________*/ expectedquat.x = 1.0f/11.0f; expectedquat.y = 2.0f/11.0f; expectedquat.z = 4.0f/11.0f; expectedquat.w = 10.0f/11.0f; D3DXQuaternionNormalize(&gotquat,&q); expect_quaternion(&expectedquat, &gotquat, 1); /*_______________D3DXQuaternionRotationAxis___________________*/ axis.x = 2.0f; axis.y = 7.0; axis.z = 13.0f; angle = D3DX_PI/3.0f; expectedquat.x = 0.067116; expectedquat.y = 0.234905f; expectedquat.z = 0.436251f; expectedquat.w = 0.866025f; D3DXQuaternionRotationAxis(&gotquat,&axis,angle); expect_quaternion(&expectedquat, &gotquat, 64); /* Test the nul quaternion */ axis.x = 0.0f; axis.y = 0.0; axis.z = 0.0f; expectedquat.x = 0.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.866025f; D3DXQuaternionRotationAxis(&gotquat,&axis,angle); expect_quaternion(&expectedquat, &gotquat, 8); /*_______________D3DXQuaternionRotationMatrix___________________*/ /* test when the trace is >0 */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = 10.0f; U(mat).m[1][1] = 20.0f; U(mat).m[2][2] = 30.0f; U(mat).m[3][3] = 48.0f; expectedquat.x = 2.368682f; expectedquat.y = 0.768221f; expectedquat.z = -0.384111f; expectedquat.w = 3.905125f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 16); /* test the case when the greater element is (2,2) */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = -60.0f; U(mat).m[2][2] = 40.0f; U(mat).m[3][3] = 48.0f; expectedquat.x = 1.233905f; expectedquat.y = -0.237290f; expectedquat.z = 5.267827f; expectedquat.w = -0.284747f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 64); /* test the case when the greater element is (1,1) */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 60.0f; U(mat).m[2][2] = -80.0f; U(mat).m[3][3] = 48.0f; expectedquat.x = 0.651031f; expectedquat.y = 6.144103f; expectedquat.z = -0.203447f; expectedquat.w = 0.488273f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 8); /* test the case when the trace is near 0 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.9f; U(mat).m[3][3] = 48.0f; expectedquat.x = 1.709495f; expectedquat.y = 2.339872f; expectedquat.z = -0.534217f; expectedquat.w = 1.282122f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 8); /* test the case when the trace is 0.49 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.51f; U(mat).m[3][3] = 48.0f; expectedquat.x = 1.724923f; expectedquat.y = 2.318944f; expectedquat.z = -0.539039f; expectedquat.w = 1.293692f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 8); /* test the case when the trace is 0.51 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.49f; U(mat).m[3][3] = 48.0f; expectedquat.x = 1.725726f; expectedquat.y = 2.317865f; expectedquat.z = -0.539289f; expectedquat.w = 1.294294f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 8); /* test the case when the trace is 0.99 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = -0.01f; U(mat).m[3][3] = 48.0f; expectedquat.x = 1.745328f; expectedquat.y = 2.291833f; expectedquat.z = -0.545415f; expectedquat.w = 1.308996f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 4); /* test the case when the trace is 1.0 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.0f; U(mat).m[3][3] = 48.0f; expectedquat.x = 1.745743f; expectedquat.y = 2.291288f; expectedquat.z = -0.545545f; expectedquat.w = 1.309307f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 8); /* test the case when the trace is 1.01 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.01f; U(mat).m[3][3] = 48.0f; expectedquat.x = 18.408188f; expectedquat.y = 5.970223f; expectedquat.z = -2.985111f; expectedquat.w = 0.502494f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 4); /* test the case when the trace is 1.5 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.5f; U(mat).m[3][3] = 48.0f; expectedquat.x = 15.105186f; expectedquat.y = 4.898980f; expectedquat.z = -2.449490f; expectedquat.w = 0.612372f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 8); /* test the case when the trace is 1.7 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.70f; U(mat).m[3][3] = 48.0f; expectedquat.x = 14.188852f; expectedquat.y = 4.601790f; expectedquat.z = -2.300895f; expectedquat.w = 0.651920f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 4); /* test the case when the trace is 1.99 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 0.99f; U(mat).m[3][3] = 48.0f; expectedquat.x = 13.114303f; expectedquat.y = 4.253287f; expectedquat.z = -2.126644f; expectedquat.w = 0.705337f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 4); /* test the case when the trace is 2.0 in a matrix which is not a rotation */ U(mat).m[0][1] = 5.0f; U(mat).m[0][2] = 7.0f; U(mat).m[0][3] = 8.0f; U(mat).m[1][0] = 11.0f; U(mat).m[1][2] = 16.0f; U(mat).m[1][3] = 33.0f; U(mat).m[2][0] = 19.0f; U(mat).m[2][1] = -21.0f; U(mat).m[2][3] = 43.0f; U(mat).m[3][0] = 2.0f; U(mat).m[3][1] = 3.0f; U(mat).m[3][2] = -4.0f; U(mat).m[0][0] = -10.0f; U(mat).m[1][1] = 10.0f; U(mat).m[2][2] = 2.0f; U(mat).m[3][3] = 48.0f; expectedquat.x = 10.680980f; expectedquat.y = 3.464102f; expectedquat.z = -1.732051f; expectedquat.w = 0.866025f; D3DXQuaternionRotationMatrix(&gotquat,&mat); expect_quaternion(&expectedquat, &gotquat, 8); /*_______________D3DXQuaternionRotationYawPitchRoll__________*/ expectedquat.x = 0.303261f; expectedquat.y = 0.262299f; expectedquat.z = 0.410073f; expectedquat.w = 0.819190f; D3DXQuaternionRotationYawPitchRoll(&gotquat,D3DX_PI/4.0f,D3DX_PI/11.0f,D3DX_PI/3.0f); expect_quaternion(&expectedquat, &gotquat, 16); /*_______________D3DXQuaternionSlerp________________________*/ expectedquat.x = -0.2f; expectedquat.y = 2.6f; expectedquat.z = 1.3f; expectedquat.w = 9.1f; D3DXQuaternionSlerp(&gotquat,&q,&r,scale); expect_quaternion(&expectedquat, &gotquat, 4); expectedquat.x = 334.0f; expectedquat.y = -31.9f; expectedquat.z = 6.1f; expectedquat.w = 6.7f; D3DXQuaternionSlerp(&gotquat,&q,&t,scale); expect_quaternion(&expectedquat, &gotquat, 2); expectedquat.x = 0.239485f; expectedquat.y = 0.346580f; expectedquat.z = 0.453676f; expectedquat.w = 0.560772f; D3DXQuaternionSlerp(&gotquat,&smallq,&smallr,scale); expect_quaternion(&expectedquat, &gotquat, 32); /*_______________D3DXQuaternionSquad________________________*/ expectedquat.x = -156.296f; expectedquat.y = 30.242f; expectedquat.z = -2.5022f; expectedquat.w = 7.3576f; D3DXQuaternionSquad(&gotquat,&q,&r,&t,&u,scale); expect_quaternion(&expectedquat, &gotquat, 2); /*_______________D3DXQuaternionSquadSetup___________________*/ r.x = 1.0f, r.y = 2.0f; r.z = 4.0f; r.w = 10.0f; s.x = -3.0f; s.y = 4.0f; s.z = -5.0f; s.w = 7.0; t.x = -1111.0f, t.y = 111.0f; t.z = -11.0f; t.w = 1.0f; u.x = 91.0f; u.y = - 82.0f; u.z = 7.3f; u.w = -6.4f; D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &u); expectedquat.x = 7.121285f; expectedquat.y = 2.159964f; expectedquat.z = -3.855094f; expectedquat.w = 5.362844f; expect_quaternion(&expectedquat, &gotquat, 2); expectedquat.x = -1113.492920f; expectedquat.y = 82.679260f; expectedquat.z = -6.696645f; expectedquat.w = -4.090050f; expect_quaternion(&expectedquat, &Nq, 4); expectedquat.x = -1111.0f; expectedquat.y = 111.0f; expectedquat.z = -11.0f; expectedquat.w = 1.0f; expect_quaternion(&expectedquat, &Nq1, 0); gotquat = s; D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &gotquat, &t, &u); expectedquat.x = -1113.492920f; expectedquat.y = 82.679260f; expectedquat.z = -6.696645f; expectedquat.w = -4.090050f; expect_quaternion(&expectedquat, &Nq, 4); Nq1 = u; D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &Nq1); expect_quaternion(&expectedquat, &Nq, 4); r.x = 0.2f; r.y = 0.3f; r.z = 1.3f; r.w = -0.6f; s.x = -3.0f; s.y =-2.0f; s.z = 4.0f; s.w = 0.2f; t.x = 0.4f; t.y = 8.3f; t.z = -3.1f; t.w = -2.7f; u.x = 1.1f; u.y = -0.7f; u.z = 9.2f; u.w = 0.0f; D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &u, &t); expectedquat.x = -4.139569f; expectedquat.y = -2.469115f; expectedquat.z = 2.364477f; expectedquat.w = 0.465494f; expect_quaternion(&expectedquat, &gotquat, 16); expectedquat.x = 2.342533f; expectedquat.y = 2.365127f; expectedquat.z = 8.628538f; expectedquat.w = -0.898356f; expect_quaternion(&expectedquat, &Nq, 16); expectedquat.x = 1.1f; expectedquat.y = -0.7f; expectedquat.z = 9.2f; expectedquat.w = 0.0f; expect_quaternion(&expectedquat, &Nq1, 0); D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &u); expectedquat.x = -3.754567f; expectedquat.y = -0.586085f; expectedquat.z = 3.815818f; expectedquat.w = -0.198150f; expect_quaternion(&expectedquat, &gotquat, 32); expectedquat.x = 0.140773f; expectedquat.y = -8.737090f; expectedquat.z = -0.516593f; expectedquat.w = 3.053942f; expect_quaternion(&expectedquat, &Nq, 16); expectedquat.x = -0.4f; expectedquat.y = -8.3f; expectedquat.z = 3.1f; expectedquat.w = 2.7f; expect_quaternion(&expectedquat, &Nq1, 0); r.x = -1.0f; r.y = 0.0f; r.z = 0.0f; r.w = 0.0f; s.x = 1.0f; s.y =0.0f; s.z = 0.0f; s.w = 0.0f; t.x = 1.0f; t.y = 0.0f; t.z = 0.0f; t.w = 0.0f; u.x = -1.0f; u.y = 0.0f; u.z = 0.0f; u.w = 0.0f; D3DXQuaternionSquadSetup(&gotquat, &Nq, &Nq1, &r, &s, &t, &u); expectedquat.x = 1.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f; expect_quaternion(&expectedquat, &gotquat, 0); expectedquat.x = 1.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f; expect_quaternion(&expectedquat, &Nq, 0); expectedquat.x = 1.0f; expectedquat.y = 0.0f; expectedquat.z = 0.0f; expectedquat.w = 0.0f; expect_quaternion(&expectedquat, &Nq1, 0); /*_______________D3DXQuaternionToAxisAngle__________________*/ Nq.x = 1.0f/22.0f; Nq.y = 2.0f/22.0f; Nq.z = 4.0f/22.0f; Nq.w = 10.0f/22.0f; expectedvec.x = 1.0f/22.0f; expectedvec.y = 2.0f/22.0f; expectedvec.z = 4.0f/22.0f; D3DXQuaternionToAxisAngle(&Nq,&axis,&angle); expect_vec3(&expectedvec, &axis, 0); equal = compare_float(angle, 2.197869f, 1); ok(equal, "Got unexpected angle %.8e.\n", angle); /* Test if |w|>1.0f */ expectedvec.x = 1.0f; expectedvec.y = 2.0f; expectedvec.z = 4.0f; D3DXQuaternionToAxisAngle(&q,&axis,&angle); expect_vec3(&expectedvec, &axis, 0); /* Test the null quaternion */ expectedvec.x = 0.0f; expectedvec.y = 0.0f; expectedvec.z = 0.0f; D3DXQuaternionToAxisAngle(&nul, &axis, &angle); expect_vec3(&expectedvec, &axis, 0); equal = compare_float(angle, 3.14159274e+00f, 0); ok(equal, "Got unexpected angle %.8e.\n", angle); D3DXQuaternionToAxisAngle(&nul, &axis, NULL); D3DXQuaternionToAxisAngle(&nul, NULL, &angle); expect_vec3(&expectedvec, &axis, 0); equal = compare_float(angle, 3.14159274e+00f, 0); ok(equal, "Got unexpected angle %.8e.\n", angle); } static void D3DXVector2Test(void) { D3DXVECTOR2 expectedvec, gotvec, nul, u, v, w, x; LPD3DXVECTOR2 funcpointer; D3DXVECTOR4 expectedtrans, gottrans; float coeff1, coeff2, got, scale; D3DXMATRIX mat; BOOL equal; nul.x = 0.0f; nul.y = 0.0f; u.x = 3.0f; u.y = 4.0f; v.x = -7.0f; v.y = 9.0f; w.x = 4.0f; w.y = -3.0f; x.x = 2.0f; x.y = -11.0f; set_matrix(&mat, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); coeff1 = 2.0f; coeff2 = 5.0f; scale = -6.5f; /*_______________D3DXVec2Add__________________________*/ expectedvec.x = -4.0f; expectedvec.y = 13.0f; D3DXVec2Add(&gotvec,&u,&v); expect_vec2(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec2Add(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec2Add(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec2BaryCentric___________________*/ expectedvec.x = -12.0f; expectedvec.y = -21.0f; D3DXVec2BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2); expect_vec2(&expectedvec, &gotvec, 0); /*_______________D3DXVec2CatmullRom____________________*/ expectedvec.x = 5820.25f; expectedvec.y = -3654.5625f; D3DXVec2CatmullRom(&gotvec,&u,&v,&w,&x,scale); expect_vec2(&expectedvec, &gotvec, 0); /*_______________D3DXVec2CCW__________________________*/ got = D3DXVec2CCW(&u, &v); equal = compare_float(got, 55.0f, 0); ok(equal, "Got unexpected ccw %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec2CCW(NULL, &v); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected ccw %.8e.\n", got); got = D3DXVec2CCW(NULL, NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected ccw %.8e.\n", got); /*_______________D3DXVec2Dot__________________________*/ got = D3DXVec2Dot(&u, &v); equal = compare_float(got, 15.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /* Tests the case NULL */ got = D3DXVec2Dot(NULL, &v); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); got = D3DXVec2Dot(NULL, NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /*_______________D3DXVec2Hermite__________________________*/ expectedvec.x = 2604.625f; expectedvec.y = -4533.0f; D3DXVec2Hermite(&gotvec,&u,&v,&w,&x,scale); expect_vec2(&expectedvec, &gotvec, 0); /*_______________D3DXVec2Length__________________________*/ got = D3DXVec2Length(&u); equal = compare_float(got, 5.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec2Length(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXVec2LengthSq________________________*/ got = D3DXVec2LengthSq(&u); equal = compare_float(got, 25.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec2LengthSq(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXVec2Lerp__________________________*/ expectedvec.x = 68.0f; expectedvec.y = -28.5f; D3DXVec2Lerp(&gotvec, &u, &v, scale); expect_vec2(&expectedvec, &gotvec, 0); /* Tests the case NULL. */ funcpointer = D3DXVec2Lerp(&gotvec,NULL,&v,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec2Lerp(NULL,NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec2Maximize__________________________*/ expectedvec.x = 3.0f; expectedvec.y = 9.0f; D3DXVec2Maximize(&gotvec, &u, &v); expect_vec2(&expectedvec, &gotvec, 0); /* Tests the case NULL. */ funcpointer = D3DXVec2Maximize(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec2Maximize(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec2Minimize__________________________*/ expectedvec.x = -7.0f; expectedvec.y = 4.0f; D3DXVec2Minimize(&gotvec,&u,&v); expect_vec2(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec2Minimize(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec2Minimize(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec2Normalize_________________________*/ expectedvec.x = 0.6f; expectedvec.y = 0.8f; D3DXVec2Normalize(&gotvec,&u); expect_vec2(&expectedvec, &gotvec, 0); /* Test the nul vector */ expectedvec.x = 0.0f; expectedvec.y = 0.0f; D3DXVec2Normalize(&gotvec,&nul); expect_vec2(&expectedvec, &gotvec, 0); /*_______________D3DXVec2Scale____________________________*/ expectedvec.x = -19.5f; expectedvec.y = -26.0f; D3DXVec2Scale(&gotvec,&u,scale); expect_vec2(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec2Scale(&gotvec,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec2Scale(NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec2Subtract__________________________*/ expectedvec.x = 10.0f; expectedvec.y = -5.0f; D3DXVec2Subtract(&gotvec, &u, &v); expect_vec2(&expectedvec, &gotvec, 0); /* Tests the case NULL. */ funcpointer = D3DXVec2Subtract(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec2Subtract(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec2Transform_______________________*/ expectedtrans.x = 36.0f; expectedtrans.y = 44.0f; expectedtrans.z = 52.0f; expectedtrans.w = 60.0f; D3DXVec2Transform(&gottrans, &u, &mat); expect_vec4(&expectedtrans, &gottrans, 0); gottrans.x = u.x; gottrans.y = u.y; D3DXVec2Transform(&gottrans, (D3DXVECTOR2 *)&gottrans, &mat); expect_vec4(&expectedtrans, &gottrans, 0); /*_______________D3DXVec2TransformCoord_______________________*/ expectedvec.x = 0.6f; expectedvec.y = 11.0f/15.0f; D3DXVec2TransformCoord(&gotvec, &u, &mat); expect_vec2(&expectedvec, &gotvec, 1); gotvec.x = u.x; gotvec.y = u.y; D3DXVec2TransformCoord(&gotvec, (D3DXVECTOR2 *)&gotvec, &mat); expect_vec2(&expectedvec, &gotvec, 1); /*_______________D3DXVec2TransformNormal______________________*/ expectedvec.x = 23.0f; expectedvec.y = 30.0f; D3DXVec2TransformNormal(&gotvec,&u,&mat); expect_vec2(&expectedvec, &gotvec, 0); } static void D3DXVector3Test(void) { D3DVIEWPORT9 viewport; D3DXVECTOR3 expectedvec, gotvec, nul, u, v, w, x; LPD3DXVECTOR3 funcpointer; D3DXVECTOR4 expectedtrans, gottrans; D3DXMATRIX mat, projection, view, world; float coeff1, coeff2, got, scale; BOOL equal; nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f; u.x = 9.0f; u.y = 6.0f; u.z = 2.0f; v.x = 2.0f; v.y = -3.0f; v.z = -4.0; w.x = 3.0f; w.y = -5.0f; w.z = 7.0f; x.x = 4.0f; x.y = 1.0f; x.z = 11.0f; viewport.Width = 800; viewport.MinZ = 0.2f; viewport.X = 10; viewport.Height = 680; viewport.MaxZ = 0.9f; viewport.Y = 5; set_matrix(&mat, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); U(view).m[0][1] = 5.0f; U(view).m[0][2] = 7.0f; U(view).m[0][3] = 8.0f; U(view).m[1][0] = 11.0f; U(view).m[1][2] = 16.0f; U(view).m[1][3] = 33.0f; U(view).m[2][0] = 19.0f; U(view).m[2][1] = -21.0f; U(view).m[2][3] = 43.0f; U(view).m[3][0] = 2.0f; U(view).m[3][1] = 3.0f; U(view).m[3][2] = -4.0f; U(view).m[0][0] = 10.0f; U(view).m[1][1] = 20.0f; U(view).m[2][2] = 30.0f; U(view).m[3][3] = -40.0f; set_matrix(&world, 21.0f, 2.0f, 3.0f, 4.0f, 5.0f, 23.0f, 7.0f, 8.0f, -8.0f, -7.0f, 25.0f, -5.0f, -4.0f, -3.0f, -2.0f, 27.0f); coeff1 = 2.0f; coeff2 = 5.0f; scale = -6.5f; /*_______________D3DXVec3Add__________________________*/ expectedvec.x = 11.0f; expectedvec.y = 3.0f; expectedvec.z = -2.0f; D3DXVec3Add(&gotvec,&u,&v); expect_vec3(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec3Add(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec3Add(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec3BaryCentric___________________*/ expectedvec.x = -35.0f; expectedvec.y = -67.0; expectedvec.z = 15.0f; D3DXVec3BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2); expect_vec3(&expectedvec, &gotvec, 0); /*_______________D3DXVec3CatmullRom____________________*/ expectedvec.x = 1458.0f; expectedvec.y = 22.1875f; expectedvec.z = 4141.375f; D3DXVec3CatmullRom(&gotvec,&u,&v,&w,&x,scale); expect_vec3(&expectedvec, &gotvec, 0); /*_______________D3DXVec3Cross________________________*/ expectedvec.x = -18.0f; expectedvec.y = 40.0f; expectedvec.z = -39.0f; D3DXVec3Cross(&gotvec,&u,&v); expect_vec3(&expectedvec, &gotvec, 0); expectedvec.x = -277.0f; expectedvec.y = -150.0f; expectedvec.z = -26.0f; D3DXVec3Cross(&gotvec,&gotvec,&v); expect_vec3(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec3Cross(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec3Cross(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec3Dot__________________________*/ got = D3DXVec3Dot(&u, &v); equal = compare_float(got, -8.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /* Tests the case NULL */ got = D3DXVec3Dot(NULL, &v); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); got = D3DXVec3Dot(NULL, NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /*_______________D3DXVec3Hermite__________________________*/ expectedvec.x = -6045.75f; expectedvec.y = -6650.0f; expectedvec.z = 1358.875f; D3DXVec3Hermite(&gotvec,&u,&v,&w,&x,scale); expect_vec3(&expectedvec, &gotvec, 0); /*_______________D3DXVec3Length__________________________*/ got = D3DXVec3Length(&u); equal = compare_float(got, 11.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec3Length(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXVec3LengthSq________________________*/ got = D3DXVec3LengthSq(&u); equal = compare_float(got, 121.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec3LengthSq(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXVec3Lerp__________________________*/ expectedvec.x = 54.5f; expectedvec.y = 64.5f, expectedvec.z = 41.0f ; D3DXVec3Lerp(&gotvec,&u,&v,scale); expect_vec3(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec3Lerp(&gotvec,NULL,&v,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec3Lerp(NULL,NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec3Maximize__________________________*/ expectedvec.x = 9.0f; expectedvec.y = 6.0f; expectedvec.z = 2.0f; D3DXVec3Maximize(&gotvec,&u,&v); expect_vec3(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec3Maximize(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec3Maximize(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec3Minimize__________________________*/ expectedvec.x = 2.0f; expectedvec.y = -3.0f; expectedvec.z = -4.0f; D3DXVec3Minimize(&gotvec,&u,&v); expect_vec3(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec3Minimize(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec3Minimize(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec3Normalize_________________________*/ expectedvec.x = 9.0f/11.0f; expectedvec.y = 6.0f/11.0f; expectedvec.z = 2.0f/11.0f; D3DXVec3Normalize(&gotvec,&u); expect_vec3(&expectedvec, &gotvec, 1); /* Test the nul vector */ expectedvec.x = 0.0f; expectedvec.y = 0.0f; expectedvec.z = 0.0f; D3DXVec3Normalize(&gotvec,&nul); expect_vec3(&expectedvec, &gotvec, 0); /*_______________D3DXVec3Scale____________________________*/ expectedvec.x = -58.5f; expectedvec.y = -39.0f; expectedvec.z = -13.0f; D3DXVec3Scale(&gotvec,&u,scale); expect_vec3(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec3Scale(&gotvec,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec3Scale(NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec3Subtract_______________________*/ expectedvec.x = 7.0f; expectedvec.y = 9.0f; expectedvec.z = 6.0f; D3DXVec3Subtract(&gotvec,&u,&v); expect_vec3(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec3Subtract(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec3Subtract(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec3Transform_______________________*/ expectedtrans.x = 70.0f; expectedtrans.y = 88.0f; expectedtrans.z = 106.0f; expectedtrans.w = 124.0f; D3DXVec3Transform(&gottrans, &u, &mat); expect_vec4(&expectedtrans, &gottrans, 0); gottrans.x = u.x; gottrans.y = u.y; gottrans.z = u.z; D3DXVec3Transform(&gottrans, (D3DXVECTOR3 *)&gottrans, &mat); expect_vec4(&expectedtrans, &gottrans, 0); /*_______________D3DXVec3TransformCoord_______________________*/ expectedvec.x = 70.0f/124.0f; expectedvec.y = 88.0f/124.0f; expectedvec.z = 106.0f/124.0f; D3DXVec3TransformCoord(&gotvec,&u,&mat); expect_vec3(&expectedvec, &gotvec, 1); /*_______________D3DXVec3TransformNormal______________________*/ expectedvec.x = 57.0f; expectedvec.y = 74.0f; expectedvec.z = 91.0f; D3DXVec3TransformNormal(&gotvec,&u,&mat); expect_vec3(&expectedvec, &gotvec, 0); /*_______________D3DXVec3Project_________________________*/ expectedvec.x = 1135.721924f; expectedvec.y = 147.086914f; expectedvec.z = 0.153412f; D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f); D3DXVec3Project(&gotvec,&u,&viewport,&projection,&view,&world); expect_vec3(&expectedvec, &gotvec, 32); /* World matrix can be omitted */ D3DXMatrixMultiply(&mat,&world,&view); D3DXVec3Project(&gotvec,&u,&viewport,&projection,&mat,NULL); expect_vec3(&expectedvec, &gotvec, 32); /* Projection matrix can be omitted */ D3DXMatrixMultiply(&mat,&view,&projection); D3DXVec3Project(&gotvec,&u,&viewport,NULL,&mat,&world); expect_vec3(&expectedvec, &gotvec, 32); /* View matrix can be omitted */ D3DXMatrixMultiply(&mat,&world,&view); D3DXVec3Project(&gotvec,&u,&viewport,&projection,NULL,&mat); expect_vec3(&expectedvec, &gotvec, 32); /* All matrices can be omitted */ expectedvec.x = 4010.000000f; expectedvec.y = -1695.000000f; expectedvec.z = 1.600000f; D3DXVec3Project(&gotvec,&u,&viewport,NULL,NULL,NULL); expect_vec3(&expectedvec, &gotvec, 2); /* Viewport can be omitted */ expectedvec.x = 1.814305f; expectedvec.y = 0.582097f; expectedvec.z = -0.066555f; D3DXVec3Project(&gotvec,&u,NULL,&projection,&view,&world); expect_vec3(&expectedvec, &gotvec, 64); /*_______________D3DXVec3Unproject_________________________*/ expectedvec.x = -2.913411f; expectedvec.y = 1.593215f; expectedvec.z = 0.380724f; D3DXMatrixPerspectiveFovLH(&projection,D3DX_PI/4.0f,20.0f/17.0f,1.0f,1000.0f); D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,&view,&world); expect_vec3(&expectedvec, &gotvec, 16); /* World matrix can be omitted */ D3DXMatrixMultiply(&mat,&world,&view); D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,&mat,NULL); expect_vec3(&expectedvec, &gotvec, 16); /* Projection matrix can be omitted */ D3DXMatrixMultiply(&mat,&view,&projection); D3DXVec3Unproject(&gotvec,&u,&viewport,NULL,&mat,&world); expect_vec3(&expectedvec, &gotvec, 32); /* View matrix can be omitted */ D3DXMatrixMultiply(&mat,&world,&view); D3DXVec3Unproject(&gotvec,&u,&viewport,&projection,NULL,&mat); expect_vec3(&expectedvec, &gotvec, 16); /* All matrices can be omitted */ expectedvec.x = -1.002500f; expectedvec.y = 0.997059f; expectedvec.z = 2.571429f; D3DXVec3Unproject(&gotvec,&u,&viewport,NULL,NULL,NULL); expect_vec3(&expectedvec, &gotvec, 4); /* Viewport can be omitted */ expectedvec.x = -11.018396f; expectedvec.y = 3.218991f; expectedvec.z = 1.380329f; D3DXVec3Unproject(&gotvec,&u,NULL,&projection,&view,&world); expect_vec3(&expectedvec, &gotvec, 8); } static void D3DXVector4Test(void) { D3DXVECTOR4 expectedvec, gotvec, u, v, w, x; LPD3DXVECTOR4 funcpointer; D3DXVECTOR4 expectedtrans, gottrans; float coeff1, coeff2, got, scale; D3DXMATRIX mat; BOOL equal; u.x = 1.0f; u.y = 2.0f; u.z = 4.0f; u.w = 10.0; v.x = -3.0f; v.y = 4.0f; v.z = -5.0f; v.w = 7.0; w.x = 4.0f; w.y =6.0f; w.z = -2.0f; w.w = 1.0f; x.x = 6.0f; x.y = -7.0f; x.z =8.0f; x.w = -9.0f; set_matrix(&mat, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); coeff1 = 2.0f; coeff2 = 5.0; scale = -6.5f; /*_______________D3DXVec4Add__________________________*/ expectedvec.x = -2.0f; expectedvec.y = 6.0f; expectedvec.z = -1.0f; expectedvec.w = 17.0f; D3DXVec4Add(&gotvec,&u,&v); expect_vec4(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec4Add(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec4Add(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec4BaryCentric____________________*/ expectedvec.x = 8.0f; expectedvec.y = 26.0; expectedvec.z = -44.0f; expectedvec.w = -41.0f; D3DXVec4BaryCentric(&gotvec,&u,&v,&w,coeff1,coeff2); expect_vec4(&expectedvec, &gotvec, 0); /*_______________D3DXVec4CatmullRom____________________*/ expectedvec.x = 2754.625f; expectedvec.y = 2367.5625f; expectedvec.z = 1060.1875f; expectedvec.w = 131.3125f; D3DXVec4CatmullRom(&gotvec,&u,&v,&w,&x,scale); expect_vec4(&expectedvec, &gotvec, 0); /*_______________D3DXVec4Cross_________________________*/ expectedvec.x = 390.0f; expectedvec.y = -393.0f; expectedvec.z = -316.0f; expectedvec.w = 166.0f; D3DXVec4Cross(&gotvec,&u,&v,&w); expect_vec4(&expectedvec, &gotvec, 0); /*_______________D3DXVec4Dot__________________________*/ got = D3DXVec4Dot(&u, &v); equal = compare_float(got, 55.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec4Dot(NULL, &v); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); got = D3DXVec4Dot(NULL, NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected dot %.8e.\n", got); /*_______________D3DXVec4Hermite_________________________*/ expectedvec.x = 1224.625f; expectedvec.y = 3461.625f; expectedvec.z = -4758.875f; expectedvec.w = -5781.5f; D3DXVec4Hermite(&gotvec,&u,&v,&w,&x,scale); expect_vec4(&expectedvec, &gotvec, 0); /*_______________D3DXVec4Length__________________________*/ got = D3DXVec4Length(&u); equal = compare_float(got, 11.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec4Length(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXVec4LengthSq________________________*/ got = D3DXVec4LengthSq(&u); equal = compare_float(got, 121.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /* Tests the case NULL. */ got = D3DXVec4LengthSq(NULL); equal = compare_float(got, 0.0f, 0); ok(equal, "Got unexpected length %.8e.\n", got); /*_______________D3DXVec4Lerp__________________________*/ expectedvec.x = 27.0f; expectedvec.y = -11.0f; expectedvec.z = 62.5; expectedvec.w = 29.5; D3DXVec4Lerp(&gotvec,&u,&v,scale); expect_vec4(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec4Lerp(&gotvec,NULL,&v,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec4Lerp(NULL,NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec4Maximize__________________________*/ expectedvec.x = 1.0f; expectedvec.y = 4.0f; expectedvec.z = 4.0f; expectedvec.w = 10.0; D3DXVec4Maximize(&gotvec,&u,&v); expect_vec4(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec4Maximize(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec4Maximize(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec4Minimize__________________________*/ expectedvec.x = -3.0f; expectedvec.y = 2.0f; expectedvec.z = -5.0f; expectedvec.w = 7.0; D3DXVec4Minimize(&gotvec,&u,&v); expect_vec4(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec4Minimize(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec4Minimize(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec4Normalize_________________________*/ expectedvec.x = 1.0f/11.0f; expectedvec.y = 2.0f/11.0f; expectedvec.z = 4.0f/11.0f; expectedvec.w = 10.0f/11.0f; D3DXVec4Normalize(&gotvec,&u); expect_vec4(&expectedvec, &gotvec, 1); /*_______________D3DXVec4Scale____________________________*/ expectedvec.x = -6.5f; expectedvec.y = -13.0f; expectedvec.z = -26.0f; expectedvec.w = -65.0f; D3DXVec4Scale(&gotvec,&u,scale); expect_vec4(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec4Scale(&gotvec,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec4Scale(NULL,NULL,scale); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec4Subtract__________________________*/ expectedvec.x = 4.0f; expectedvec.y = -2.0f; expectedvec.z = 9.0f; expectedvec.w = 3.0f; D3DXVec4Subtract(&gotvec,&u,&v); expect_vec4(&expectedvec, &gotvec, 0); /* Tests the case NULL */ funcpointer = D3DXVec4Subtract(&gotvec,NULL,&v); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); funcpointer = D3DXVec4Subtract(NULL,NULL,NULL); ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); /*_______________D3DXVec4Transform_______________________*/ expectedtrans.x = 177.0f; expectedtrans.y = 194.0f; expectedtrans.z = 211.0f; expectedtrans.w = 228.0f; D3DXVec4Transform(&gottrans,&u,&mat); expect_vec4(&expectedtrans, &gottrans, 0); } static void test_matrix_stack(void) { ID3DXMatrixStack *stack; ULONG refcount; HRESULT hr; const D3DXMATRIX mat1 = {{{ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f }}}; const D3DXMATRIX mat2 = {{{ 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f, 32.0f }}}; hr = D3DXCreateMatrixStack(0, &stack); ok(SUCCEEDED(hr), "Failed to create a matrix stack, hr %#x\n", hr); if (FAILED(hr)) return; ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top of an empty matrix stack should be an identity matrix\n"); hr = ID3DXMatrixStack_Pop(stack); ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr); hr = ID3DXMatrixStack_Push(stack); ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr); ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n"); hr = ID3DXMatrixStack_Push(stack); ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr); hr = ID3DXMatrixStack_LoadMatrix(stack, &mat1); ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr); expect_matrix(&mat1, ID3DXMatrixStack_GetTop(stack), 0); hr = ID3DXMatrixStack_Push(stack); ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr); expect_matrix(&mat1, ID3DXMatrixStack_GetTop(stack), 0); hr = ID3DXMatrixStack_LoadMatrix(stack, &mat2); ok(SUCCEEDED(hr), "LoadMatrix failed, hr %#x\n", hr); expect_matrix(&mat2, ID3DXMatrixStack_GetTop(stack), 0); hr = ID3DXMatrixStack_Push(stack); ok(SUCCEEDED(hr), "Push failed, hr %#x\n", hr); expect_matrix(&mat2, ID3DXMatrixStack_GetTop(stack), 0); hr = ID3DXMatrixStack_LoadIdentity(stack); ok(SUCCEEDED(hr), "LoadIdentity failed, hr %#x\n", hr); ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n"); hr = ID3DXMatrixStack_Pop(stack); ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr); expect_matrix(&mat2, ID3DXMatrixStack_GetTop(stack), 0); hr = ID3DXMatrixStack_Pop(stack); ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr); expect_matrix(&mat1, ID3DXMatrixStack_GetTop(stack), 0); hr = ID3DXMatrixStack_Pop(stack); ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr); ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n"); hr = ID3DXMatrixStack_Pop(stack); ok(SUCCEEDED(hr), "Pop failed, hr %#x\n", hr); ok(D3DXMatrixIsIdentity(ID3DXMatrixStack_GetTop(stack)), "The top should be an identity matrix\n"); refcount = ID3DXMatrixStack_Release(stack); ok(!refcount, "Matrix stack has %u references left.\n", refcount); } static void test_Matrix_AffineTransformation2D(void) { D3DXMATRIX exp_mat, got_mat; D3DXVECTOR2 center, position; FLOAT angle, scale; center.x = 3.0f; center.y = 4.0f; position.x = -6.0f; position.y = 7.0f; angle = D3DX_PI/3.0f; scale = 20.0f; U(exp_mat).m[0][0] = 10.0f; U(exp_mat).m[1][0] = -17.320507f; U(exp_mat).m[2][0] = 0.0f; U(exp_mat).m[3][0] = -1.035898f; U(exp_mat).m[0][1] = 17.320507f; U(exp_mat).m[1][1] = 10.0f; U(exp_mat).m[2][1] = 0.0f; U(exp_mat).m[3][1] = 6.401924f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; U(exp_mat).m[2][3] = 0.0f; U(exp_mat).m[3][3] = 1.0f; D3DXMatrixAffineTransformation2D(&got_mat, scale, ¢er, angle, &position); expect_matrix(&exp_mat, &got_mat, 2); /*______________*/ center.x = 3.0f; center.y = 4.0f; angle = D3DX_PI/3.0f; scale = 20.0f; U(exp_mat).m[0][0] = 10.0f; U(exp_mat).m[1][0] = -17.320507f; U(exp_mat).m[2][0] = 0.0f; U(exp_mat).m[3][0] = 4.964102f; U(exp_mat).m[0][1] = 17.320507f; U(exp_mat).m[1][1] = 10.0f; U(exp_mat).m[2][1] = 0.0f; U(exp_mat).m[3][1] = -0.598076f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; U(exp_mat).m[2][3] = 0.0f; U(exp_mat).m[3][3] = 1.0f; D3DXMatrixAffineTransformation2D(&got_mat, scale, ¢er, angle, NULL); expect_matrix(&exp_mat, &got_mat, 8); /*______________*/ position.x = -6.0f; position.y = 7.0f; angle = D3DX_PI/3.0f; scale = 20.0f; U(exp_mat).m[0][0] = 10.0f; U(exp_mat).m[1][0] = -17.320507f; U(exp_mat).m[2][0] = 0.0f; U(exp_mat).m[3][0] = -6.0f; U(exp_mat).m[0][1] = 17.320507f; U(exp_mat).m[1][1] = 10.0f; U(exp_mat).m[2][1] = 0.0f; U(exp_mat).m[3][1] = 7.0f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; U(exp_mat).m[2][3] = 0.0f; U(exp_mat).m[3][3] = 1.0f; D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, &position); expect_matrix(&exp_mat, &got_mat, 1); /*______________*/ angle = 5.0f * D3DX_PI/4.0f; scale = -20.0f; U(exp_mat).m[0][0] = 14.142133f; U(exp_mat).m[1][0] = -14.142133f; U(exp_mat).m[2][0] = 0.0f; U(exp_mat).m[3][0] = 0.0f; U(exp_mat).m[0][1] = 14.142133; U(exp_mat).m[1][1] = 14.142133f; U(exp_mat).m[2][1] = 0.0f; U(exp_mat).m[3][1] = 0.0f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; U(exp_mat).m[2][3] = 0.0f; U(exp_mat).m[3][3] = 1.0f; D3DXMatrixAffineTransformation2D(&got_mat, scale, NULL, angle, NULL); expect_matrix(&exp_mat, &got_mat, 8); } static void test_Matrix_Decompose(void) { D3DXMATRIX pm; D3DXQUATERNION exp_rotation, got_rotation; D3DXVECTOR3 exp_scale, got_scale, exp_translation, got_translation; HRESULT hr; BOOL equal; /*___________*/ U(pm).m[0][0] = -9.23879206e-01f; U(pm).m[1][0] = -2.70598412e-01f; U(pm).m[2][0] = 2.70598441e-01f; U(pm).m[3][0] = -5.00000000e+00f; U(pm).m[0][1] = 2.70598471e-01f; U(pm).m[1][1] = 3.80604863e-02f; U(pm).m[2][1] = 9.61939573e-01f; U(pm).m[3][1] = 0.00000000e+00f; U(pm).m[0][2] = -2.70598441e-01f; U(pm).m[1][2] = 9.61939573e-01f; U(pm).m[2][2] = 3.80603075e-02f; U(pm).m[3][2] = 1.00000000e+01f; U(pm).m[0][3] = 0.00000000e+00f; U(pm).m[1][3] = 0.00000000e+00f; U(pm).m[2][3] = 0.00000000e+00f; U(pm).m[3][3] = 1.00000000e+00f; exp_scale.x = 9.99999881e-01f; exp_scale.y = 9.99999881e-01f; exp_scale.z = 9.99999881e-01f; exp_rotation.x = 2.14862776e-08f; exp_rotation.y = 6.93519890e-01f; exp_rotation.z = 6.93519890e-01f; exp_rotation.w = 1.95090637e-01f; exp_translation.x = -5.0f; exp_translation.y = 0.0f; exp_translation.z = 10.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 1); expect_quaternion(&exp_rotation, &got_rotation, 1); expect_vec3(&exp_translation, &got_translation, 0); /*_________*/ U(pm).m[0][0] = -2.255813f; U(pm).m[1][0] = 1.302324f; U(pm).m[2][0] = 1.488373f; U(pm).m[3][0] = 1.0f; U(pm).m[0][1] = 1.302327f; U(pm).m[1][1] = -0.7209296f; U(pm).m[2][1] = 2.60465f; U(pm).m[3][1] = 2.0f; U(pm).m[0][2] = 1.488371f; U(pm).m[1][2] = 2.604651f; U(pm).m[2][2] = -0.02325551f; U(pm).m[3][2] = 3.0f; U(pm).m[0][3] = 0.0f; U(pm).m[1][3] = 0.0f; U(pm).m[2][3] = 0.0f; U(pm).m[3][3] = 1.0f; exp_scale.x = 2.99999928e+00f; exp_scale.y = 2.99999905e+00f; exp_scale.z = 2.99999952e+00f; exp_rotation.x = 3.52180451e-01f; exp_rotation.y = 6.16315663e-01f; exp_rotation.z = 7.04360664e-01f; exp_rotation.w = 3.38489343e-07f; exp_translation.x = 1.0f; exp_translation.y = 2.0f; exp_translation.z = 3.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 0); expect_quaternion(&exp_rotation, &got_rotation, 2); expect_vec3(&exp_translation, &got_translation, 0); /*_____________*/ U(pm).m[0][0] = 2.427051f; U(pm).m[1][0] = 0.0f; U(pm).m[2][0] = 1.763355f; U(pm).m[3][0] = 5.0f; U(pm).m[0][1] = 0.0f; U(pm).m[1][1] = 3.0f; U(pm).m[2][1] = 0.0f; U(pm).m[3][1] = 5.0f; U(pm).m[0][2] = -1.763355f; U(pm).m[1][2] = 0.0f; U(pm).m[2][2] = 2.427051f; U(pm).m[3][2] = 5.0f; U(pm).m[0][3] = 0.0f; U(pm).m[1][3] = 0.0f; U(pm).m[2][3] = 0.0f; U(pm).m[3][3] = 1.0f; exp_scale.x = 2.99999976e+00f; exp_scale.y = 3.00000000e+00f; exp_scale.z = 2.99999976e+00f; exp_rotation.x = 0.00000000e+00f; exp_rotation.y = 3.09016883e-01f; exp_rotation.z = 0.00000000e+00f; exp_rotation.w = 9.51056540e-01f; exp_translation.x = 5.0f; exp_translation.y = 5.0f; exp_translation.z = 5.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 1); expect_quaternion(&exp_rotation, &got_rotation, 1); expect_vec3(&exp_translation, &got_translation, 0); /*_____________*/ U(pm).m[0][0] = -9.23879206e-01f; U(pm).m[1][0] = -2.70598412e-01f; U(pm).m[2][0] = 2.70598441e-01f; U(pm).m[3][0] = -5.00000000e+00f; U(pm).m[0][1] = 2.70598471e-01f; U(pm).m[1][1] = 3.80604863e-02f; U(pm).m[2][1] = 9.61939573e-01f; U(pm).m[3][1] = 0.00000000e+00f; U(pm).m[0][2] = -2.70598441e-01f; U(pm).m[1][2] = 9.61939573e-01f; U(pm).m[2][2] = 3.80603075e-02f; U(pm).m[3][2] = 1.00000000e+01f; U(pm).m[0][3] = 0.00000000e+00f; U(pm).m[1][3] = 0.00000000e+00f; U(pm).m[2][3] = 0.00000000e+00f; U(pm).m[3][3] = 1.00000000e+00f; exp_scale.x = 9.99999881e-01f; exp_scale.y = 9.99999881e-01f; exp_scale.z = 9.99999881e-01f; exp_rotation.x = 2.14862776e-08f; exp_rotation.y = 6.93519890e-01f; exp_rotation.z = 6.93519890e-01f; exp_rotation.w = 1.95090637e-01f; exp_translation.x = -5.0f; exp_translation.y = 0.0f; exp_translation.z = 10.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 1); expect_quaternion(&exp_rotation, &got_rotation, 1); expect_vec3(&exp_translation, &got_translation, 0); /*__________*/ U(pm).m[0][0] = -9.23878908e-01f; U(pm).m[1][0] = -5.41196704e-01f; U(pm).m[2][0] = 8.11795175e-01f; U(pm).m[3][0] = -5.00000000e+00f; U(pm).m[0][1] = 2.70598322e-01f; U(pm).m[1][1] = 7.61209577e-02f; U(pm).m[2][1] = 2.88581824e+00f; U(pm).m[3][1] = 0.00000000e+00f; U(pm).m[0][2] = -2.70598352e-01f; U(pm).m[1][2] = 1.92387879e+00f; U(pm).m[2][2] = 1.14180908e-01f; U(pm).m[3][2] = 1.00000000e+01f; U(pm).m[0][3] = 0.00000000e+00f; U(pm).m[1][3] = 0.00000000e+00f; U(pm).m[2][3] = 0.00000000e+00f; U(pm).m[3][3] = 1.00000000e+00f; exp_scale.x = 9.99999583e-01f; exp_scale.y = 1.99999940e+00f; exp_scale.z = 2.99999928e+00f; exp_rotation.x = 1.07431388e-08f; exp_rotation.y = 6.93519890e-01f; exp_rotation.z = 6.93519831e-01f; exp_rotation.w = 1.95090622e-01f; exp_translation.x = -5.0f; exp_translation.y = 0.0f; exp_translation.z = 10.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 1); equal = compare_quaternion(&exp_rotation, &got_rotation, 1); exp_rotation.x = 0.0f; equal |= compare_quaternion(&exp_rotation, &got_rotation, 2); ok(equal, "Got unexpected quaternion {%.8e, %.8e, %.8e, %.8e}.\n", got_rotation.x, got_rotation.y, got_rotation.z, got_rotation.w); expect_vec3(&exp_translation, &got_translation, 0); /*__________*/ U(pm).m[0][0] = 0.7156004f; U(pm).m[1][0] = -0.5098283f; U(pm).m[2][0] = -0.4774843f; U(pm).m[3][0] = -5.0f; U(pm).m[0][1] = -0.6612288f; U(pm).m[1][1] = -0.7147621f; U(pm).m[2][1] = -0.2277977f; U(pm).m[3][1] = 0.0f; U(pm).m[0][2] = -0.2251499f; U(pm).m[1][2] = 0.4787385f; U(pm).m[2][2] = -0.8485972f; U(pm).m[3][2] = 10.0f; U(pm).m[0][3] = 0.0f; U(pm).m[1][3] = 0.0f; U(pm).m[2][3] = 0.0f; U(pm).m[3][3] = 1.0f; exp_scale.x = 9.99999940e-01f; exp_scale.y = 1.00000012e+00f; exp_scale.z = 1.00000012e+00f; exp_rotation.x = 9.05394852e-01f; exp_rotation.y = -3.23355347e-01f; exp_rotation.z = -1.94013178e-01f; exp_rotation.w = 1.95090592e-01f; exp_translation.x = -5.0f; exp_translation.y = 0.0f; exp_translation.z = 10.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 0); expect_quaternion(&exp_rotation, &got_rotation, 1); expect_vec3(&exp_translation, &got_translation, 0); /*_____________*/ U(pm).m[0][0] = 0.06554436f; U(pm).m[1][0] = -0.6873012f; U(pm).m[2][0] = 0.7234092f; U(pm).m[3][0] = -5.0f; U(pm).m[0][1] = -0.9617381f; U(pm).m[1][1] = -0.2367795f; U(pm).m[2][1] = -0.1378230f; U(pm).m[3][1] = 0.0f; U(pm).m[0][2] = 0.2660144f; U(pm).m[1][2] = -0.6866967f; U(pm).m[2][2] = -0.6765233f; U(pm).m[3][2] = 10.0f; U(pm).m[0][3] = 0.0f; U(pm).m[1][3] = 0.0f; U(pm).m[2][3] = 0.0f; U(pm).m[3][3] = 1.0f; exp_scale.x = 9.99999940e-01f; exp_scale.y = 9.99999940e-01f; exp_scale.z = 9.99999881e-01f; exp_rotation.x = 7.03357518e-01f; exp_rotation.y = -5.86131275e-01f; exp_rotation.z = 3.51678789e-01f; exp_rotation.w = -1.95090577e-01f; exp_translation.x = -5.0f; exp_translation.y = 0.0f; exp_translation.z = 10.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 1); expect_quaternion(&exp_rotation, &got_rotation, 2); expect_vec3(&exp_translation, &got_translation, 0); /*_________*/ U(pm).m[0][0] = 7.12104797e+00f; U(pm).m[1][0] = -5.88348627e+00f; U(pm).m[2][0] = 1.18184204e+01f; U(pm).m[3][0] = -5.00000000e+00f; U(pm).m[0][1] = 5.88348627e+00f; U(pm).m[1][1] = -1.06065865e+01f; U(pm).m[2][1] = -8.82523251e+00f; U(pm).m[3][1] = 0.00000000e+00f; U(pm).m[0][2] = 1.18184204e+01f; U(pm).m[1][2] = 8.82523155e+00f; U(pm).m[2][2] = -2.72764111e+00f; U(pm).m[3][2] = 2.00000000e+00f; U(pm).m[0][3] = 0.00000000e+00f; U(pm).m[1][3] = 0.00000000e+00f; U(pm).m[2][3] = 0.00000000e+00f; U(pm).m[3][3] = 1.00000000e+00f; exp_scale.x = 1.49999933e+01f; exp_scale.y = 1.49999933e+01f; exp_scale.z = 1.49999943e+01f; exp_rotation.x = 7.68714130e-01f; exp_rotation.y = 0.00000000e+00f; exp_rotation.z = 5.12475967e-01f; exp_rotation.w = 3.82683903e-01f; exp_translation.x = -5.0f; exp_translation.y = 0.0f; exp_translation.z = 2.0f; D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); expect_vec3(&exp_scale, &got_scale, 0); expect_quaternion(&exp_rotation, &got_rotation, 1); expect_vec3(&exp_translation, &got_translation, 0); /*__________*/ U(pm).m[0][0] = 0.0f; U(pm).m[1][0] = 4.0f; U(pm).m[2][0] = 5.0f; U(pm).m[3][0] = -5.0f; U(pm).m[0][1] = 0.0f; U(pm).m[1][1] = -10.60660f; U(pm).m[2][1] = -8.825232f; U(pm).m[3][1] = 6.0f; U(pm).m[0][2] = 0.0f; U(pm).m[1][2] = 8.8252320f; U(pm).m[2][2] = 2.727645; U(pm).m[3][2] = 3.0f; U(pm).m[0][3] = 0.0f; U(pm).m[1][3] = 0.0f; U(pm).m[2][3] = 0.0f; U(pm).m[3][3] = 1.0f; hr = D3DXMatrixDecompose(&got_scale, &got_rotation, &got_translation, &pm); ok(hr == D3DERR_INVALIDCALL, "Expected D3DERR_INVALIDCALL, got %x\n", hr); } static void test_Matrix_Transformation2D(void) { D3DXMATRIX exp_mat, got_mat; D3DXVECTOR2 rot_center, sca, sca_center, trans; FLOAT rot, sca_rot; rot_center.x = 3.0f; rot_center.y = 4.0f; sca.x = 12.0f; sca.y = -3.0f; sca_center.x = 9.0f; sca_center.y = -5.0f; trans.x = -6.0f; trans.y = 7.0f; rot = D3DX_PI/3.0f; sca_rot = 5.0f*D3DX_PI/4.0f; U(exp_mat).m[0][0] = -4.245192f; U(exp_mat).m[1][0] = -0.147116f; U(exp_mat).m[2][0] = 0.0f; U(exp_mat).m[3][0] = 45.265373f; U(exp_mat).m[0][1] = 7.647113f; U(exp_mat).m[1][1] = 8.745192f; U(exp_mat).m[2][1] = 0.0f; U(exp_mat).m[3][1] = -13.401899f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; U(exp_mat).m[2][3] = 0.0f; U(exp_mat).m[3][3] = 1.0f; D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, &sca, &rot_center, rot, &trans); expect_matrix(&exp_mat, &got_mat, 64); /*_________*/ sca_center.x = 9.0f; sca_center.y = -5.0f; trans.x = -6.0f; trans.y = 7.0f; rot = D3DX_PI/3.0f; sca_rot = 5.0f*D3DX_PI/4.0f; U(exp_mat).m[0][0] = 0.50f; U(exp_mat).m[1][0] = -0.866025f; U(exp_mat).m[2][0] = 0.0f; U(exp_mat).m[3][0] = -6.0f; U(exp_mat).m[0][1] = 0.866025f; U(exp_mat).m[1][1] = 0.50f; U(exp_mat).m[2][1] = 0.0f; U(exp_mat).m[3][1] = 7.0f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; U(exp_mat).m[2][3] = 0.0f; U(exp_mat).m[3][3] = 1.0f; D3DXMatrixTransformation2D(&got_mat, &sca_center, sca_rot, NULL, NULL, rot, &trans); expect_matrix(&exp_mat, &got_mat, 8); /*_________*/ U(exp_mat).m[0][0] = 0.50f; U(exp_mat).m[1][0] = -0.866025f; U(exp_mat).m[2][0] = 0.0f; U(exp_mat).m[3][0] = 0.0f; U(exp_mat).m[0][1] = 0.866025f; U(exp_mat).m[1][1] = 0.50f; U(exp_mat).m[2][1] = 0.0f; U(exp_mat).m[3][1] = 0.0f; U(exp_mat).m[0][2] = 0.0f; U(exp_mat).m[1][2] = 0.0f; U(exp_mat).m[2][2] = 1.0f; U(exp_mat).m[3][2] = 0.0f; U(exp_mat).m[0][3] = 0.0f; U(exp_mat).m[1][3] = 0.0f; U(exp_mat).m[2][3] = 0.0f; U(exp_mat).m[3][3] = 1.0f; D3DXMatrixTransformation2D(&got_mat, NULL, sca_rot, NULL, NULL, rot, NULL); expect_matrix(&exp_mat, &got_mat, 8); } static void test_D3DXVec_Array(void) { D3DXPLANE inp_plane[5], out_plane[7], exp_plane[7]; D3DXVECTOR4 inp_vec[5], out_vec[7], exp_vec[7]; D3DXMATRIX mat, projection, view, world; D3DVIEWPORT9 viewport; unsigned int i; viewport.Width = 800; viewport.MinZ = 0.2f; viewport.X = 10; viewport.Height = 680; viewport.MaxZ = 0.9f; viewport.Y = 5; memset(out_vec, 0, sizeof(out_vec)); memset(exp_vec, 0, sizeof(exp_vec)); memset(out_plane, 0, sizeof(out_plane)); memset(exp_plane, 0, sizeof(exp_plane)); for (i = 0; i < ARRAY_SIZE(inp_vec); ++i) { inp_plane[i].a = inp_plane[i].c = inp_vec[i].x = inp_vec[i].z = i; inp_plane[i].b = inp_plane[i].d = inp_vec[i].y = inp_vec[i].w = ARRAY_SIZE(inp_vec) - i; } set_matrix(&mat, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); D3DXMatrixPerspectiveFovLH(&projection, D3DX_PI / 4.0f, 20.0f / 17.0f, 1.0f, 1000.0f); U(view).m[0][1] = 5.0f; U(view).m[0][2] = 7.0f; U(view).m[0][3] = 8.0f; U(view).m[1][0] = 11.0f; U(view).m[1][2] = 16.0f; U(view).m[1][3] = 33.0f; U(view).m[2][0] = 19.0f; U(view).m[2][1] = -21.0f; U(view).m[2][3] = 43.0f; U(view).m[3][0] = 2.0f; U(view).m[3][1] = 3.0f; U(view).m[3][2] = -4.0f; U(view).m[0][0] = 10.0f; U(view).m[1][1] = 20.0f; U(view).m[2][2] = 30.0f; U(view).m[3][3] = -40.0f; set_matrix(&world, 21.0f, 2.0f, 3.0f, 4.0f, 5.0f, 23.0f, 7.0f, 8.0f, -8.0f, -7.0f, 25.0f, -5.0f, -4.0f, -3.0f, -2.0f, 27.0f); /* D3DXVec2TransformCoordArray */ exp_vec[1].x = 6.78571403e-01f; exp_vec[1].y = 7.85714269e-01f; exp_vec[2].x = 6.53846204e-01f; exp_vec[2].y = 7.69230783e-01f; exp_vec[3].x = 6.25000000e-01f; exp_vec[3].y = 7.50000000e-01f; exp_vec[4].x = 5.90909123e-01f; exp_vec[4].y = 7.27272749e-01f; exp_vec[5].x = 5.49999952e-01f; exp_vec[5].y = 6.99999928e-01f; D3DXVec2TransformCoordArray((D3DXVECTOR2 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR2 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 1); /* D3DXVec2TransformNormalArray */ exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f; exp_vec[2].x = 21.0f; exp_vec[2].y = 26.0f; exp_vec[3].x = 17.0f; exp_vec[3].y = 22.0f; exp_vec[4].x = 13.0f; exp_vec[4].y = 18.0f; exp_vec[5].x = 9.0f; exp_vec[5].y = 14.0f; D3DXVec2TransformNormalArray((D3DXVECTOR2 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR2 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0); /* D3DXVec3TransformCoordArray */ exp_vec[1].x = 6.78571403e-01f; exp_vec[1].y = 7.85714269e-01f; exp_vec[1].z = 8.92857075e-01f; exp_vec[2].x = 6.71874940e-01f; exp_vec[2].y = 7.81249940e-01f; exp_vec[2].z = 8.90624940e-01f; exp_vec[3].x = 6.66666627e-01f; exp_vec[3].y = 7.77777731e-01f; exp_vec[3].z = 8.88888836e-01f; exp_vec[4].x = 6.62499964e-01f; exp_vec[4].y = 7.74999976e-01f; exp_vec[4].z = 8.87499928e-01f; exp_vec[5].x = 6.59090877e-01f; exp_vec[5].y = 7.72727251e-01f; exp_vec[5].z = 8.86363566e-01f; D3DXVec3TransformCoordArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 1); /* D3DXVec3TransformNormalArray */ exp_vec[1].x = 25.0f; exp_vec[1].y = 30.0f; exp_vec[1].z = 35.0f; exp_vec[2].x = 30.0f; exp_vec[2].y = 36.0f; exp_vec[2].z = 42.0f; exp_vec[3].x = 35.0f; exp_vec[3].y = 42.0f; exp_vec[3].z = 49.0f; exp_vec[4].x = 40.0f; exp_vec[4].y = 48.0f; exp_vec[4].z = 56.0f; exp_vec[5].x = 45.0f; exp_vec[5].y = 54.0f; exp_vec[5].z = 63.0f; D3DXVec3TransformNormalArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0); /* D3DXVec3ProjectArray */ exp_vec[1].x = 1.08955420e+03f; exp_vec[1].y = -2.26590622e+02f; exp_vec[1].z = 2.15272754e-01f; exp_vec[2].x = 1.06890344e+03f; exp_vec[2].y = 1.03085144e+02f; exp_vec[2].z = 1.83049560e-01f; exp_vec[3].x = 1.05177905e+03f; exp_vec[3].y = 3.76462280e+02f; exp_vec[3].z = 1.56329080e-01f; exp_vec[4].x = 1.03734888e+03f; exp_vec[4].y = 6.06827393e+02f; exp_vec[4].z = 1.33812696e-01f; exp_vec[5].x = 1.02502356e+03f; exp_vec[5].y = 8.03591248e+02f; exp_vec[5].z = 1.14580572e-01f; D3DXVec3ProjectArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec, sizeof(*inp_vec), &viewport, &projection, &view, &world, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 8); /* D3DXVec3UnprojectArray */ exp_vec[1].x = -6.12403107e+00f; exp_vec[1].y = 3.22536016e+00f; exp_vec[1].z = 6.20571136e-01f; exp_vec[2].x = -3.80710936e+00f; exp_vec[2].y = 2.04657936e+00f; exp_vec[2].z = 4.46894377e-01f; exp_vec[3].x = -2.92283988e+00f; exp_vec[3].y = 1.59668946e+00f; exp_vec[3].z = 3.80609393e-01f; exp_vec[4].x = -2.45622563e+00f; exp_vec[4].y = 1.35928988e+00f; exp_vec[4].z = 3.45631927e-01f; exp_vec[5].x = -2.16789746e+00f; exp_vec[5].y = 1.21259713e+00f; exp_vec[5].z = 3.24018806e-01f; D3DXVec3UnprojectArray((D3DXVECTOR3 *)&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec, sizeof(*inp_vec), &viewport, &projection, &view, &world, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 4); /* D3DXVec2TransformArray */ exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f; exp_vec[2].x = 34.0f; exp_vec[2].y = 40.0f; exp_vec[2].z = 46.0f; exp_vec[2].w = 52.0f; exp_vec[3].x = 30.0f; exp_vec[3].y = 36.0f; exp_vec[3].z = 42.0f; exp_vec[3].w = 48.0f; exp_vec[4].x = 26.0f; exp_vec[4].y = 32.0f; exp_vec[4].z = 38.0f; exp_vec[4].w = 44.0f; exp_vec[5].x = 22.0f; exp_vec[5].y = 28.0f; exp_vec[5].z = 34.0f; exp_vec[5].w = 40.0f; D3DXVec2TransformArray(&out_vec[1], sizeof(*out_vec), (D3DXVECTOR2 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0); /* D3DXVec3TransformArray */ exp_vec[1].x = 38.0f; exp_vec[1].y = 44.0f; exp_vec[1].z = 50.0f; exp_vec[1].w = 56.0f; exp_vec[2].x = 43.0f; exp_vec[2].y = 50.0f; exp_vec[2].z = 57.0f; exp_vec[2].w = 64.0f; exp_vec[3].x = 48.0f; exp_vec[3].y = 56.0f; exp_vec[3].z = 64.0f; exp_vec[3].w = 72.0f; exp_vec[4].x = 53.0f; exp_vec[4].y = 62.0f; exp_vec[4].z = 71.0f; exp_vec[4].w = 80.0f; exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f; exp_vec[5].z = 78.0f; exp_vec[5].w = 88.0f; D3DXVec3TransformArray(&out_vec[1], sizeof(*out_vec), (D3DXVECTOR3 *)inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0); /* D3DXVec4TransformArray */ exp_vec[1].x = 90.0f; exp_vec[1].y = 100.0f; exp_vec[1].z = 110.0f; exp_vec[1].w = 120.0f; exp_vec[2].x = 82.0f; exp_vec[2].y = 92.0f; exp_vec[2].z = 102.0f; exp_vec[2].w = 112.0f; exp_vec[3].x = 74.0f; exp_vec[3].y = 84.0f; exp_vec[3].z = 94.0f; exp_vec[3].w = 104.0f; exp_vec[4].x = 66.0f; exp_vec[4].y = 76.0f; exp_vec[4].z = 86.0f; exp_vec[4].w = 96.0f; exp_vec[5].x = 58.0f; exp_vec[5].y = 68.0f; exp_vec[5].z = 78.0f; exp_vec[5].w = 88.0f; D3DXVec4TransformArray(&out_vec[1], sizeof(*out_vec), inp_vec, sizeof(*inp_vec), &mat, ARRAY_SIZE(inp_vec)); expect_vec4_array(ARRAY_SIZE(exp_vec), exp_vec, out_vec, 0); /* D3DXPlaneTransformArray */ exp_plane[1].a = 90.0f; exp_plane[1].b = 100.0f; exp_plane[1].c = 110.0f; exp_plane[1].d = 120.0f; exp_plane[2].a = 82.0f; exp_plane[2].b = 92.0f; exp_plane[2].c = 102.0f; exp_plane[2].d = 112.0f; exp_plane[3].a = 74.0f; exp_plane[3].b = 84.0f; exp_plane[3].c = 94.0f; exp_plane[3].d = 104.0f; exp_plane[4].a = 66.0f; exp_plane[4].b = 76.0f; exp_plane[4].c = 86.0f; exp_plane[4].d = 96.0f; exp_plane[5].a = 58.0f; exp_plane[5].b = 68.0f; exp_plane[5].c = 78.0f; exp_plane[5].d = 88.0f; D3DXPlaneTransformArray(&out_plane[1], sizeof(*out_plane), inp_plane, sizeof(*inp_plane), &mat, ARRAY_SIZE(inp_plane)); for (i = 0; i < ARRAY_SIZE(exp_plane); ++i) { BOOL equal = compare_plane(&exp_plane[i], &out_plane[i], 0); ok(equal, "Got unexpected plane {%.8e, %.8e, %.8e, %.8e} at index %u, expected {%.8e, %.8e, %.8e, %.8e}.\n", out_plane[i].a, out_plane[i].b, out_plane[i].c, out_plane[i].d, i, exp_plane[i].a, exp_plane[i].b, exp_plane[i].c, exp_plane[i].d); if (!equal) break; } } static void test_D3DXFloat_Array(void) { unsigned int i; void *out = NULL; D3DXFLOAT16 half; BOOL equal; /* Input floats through bit patterns because compilers do not generate reliable INF and NaN values. */ union convert { DWORD d; float f; } single; struct { union convert single_in; /* half_ver2 occurs on WXPPROSP3 (32 bit math), WVISTAADM (32/64 bit math), W7PRO (32 bit math) */ WORD half_ver1, half_ver2; /* single_out_ver2 confirms that half -> single conversion is consistent across platforms */ union convert single_out_ver1, single_out_ver2; } testdata[] = { { { 0x479c4000 }, 0x7c00, 0x7ce2, { 0x47800000 }, { 0x479c4000 } }, /* 80000.0f */ { { 0x477fdf00 }, 0x7bff, 0x7bff, { 0x477fe000 }, { 0x477fe000 } }, /* 65503.0f */ { { 0x477fe000 }, 0x7bff, 0x7bff, { 0x477fe000 }, { 0x477fe000 } }, /* 65504.0f */ { { 0x477ff000 }, 0x7bff, 0x7c00, { 0x477fe000 }, { 0x47800000 } }, /* 65520.0f */ { { 0x477ff100 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65521.0f */ { { 0x477ffe00 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65534.0f */ { { 0x477fff00 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65535.0f */ { { 0x47800000 }, 0x7c00, 0x7c00, { 0x47800000 }, { 0x47800000 } }, /* 65536.0f */ { { 0xc79c4000 }, 0xfc00, 0xfce2, { 0xc7800000 }, { 0xc79c4000 } }, /* -80000.0f */ { { 0xc77fdf00 }, 0xfbff, 0xfbff, { 0xc77fe000 }, { 0xc77fe000 } }, /* -65503.0f */ { { 0xc77fe000 }, 0xfbff, 0xfbff, { 0xc77fe000 }, { 0xc77fe000 } }, /* -65504.0f */ { { 0xc77ff000 }, 0xfbff, 0xfc00, { 0xc77fe000 }, { 0xc7800000 } }, /* -65520.0f */ { { 0xc77ff100 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65521.0f */ { { 0xc77ffe00 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65534.0f */ { { 0xc77fff00 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65535.0f */ { { 0xc7800000 }, 0xfc00, 0xfc00, { 0xc7800000 }, { 0xc7800000 } }, /* -65536.0f */ { { 0x7f800000 }, 0x7c00, 0x7fff, { 0x47800000 }, { 0x47ffe000 } }, /* INF */ { { 0xff800000 }, 0xffff, 0xffff, { 0xc7ffe000 }, { 0xc7ffe000 } }, /* -INF */ { { 0x7fc00000 }, 0x7fff, 0xffff, { 0x47ffe000 }, { 0xc7ffe000 } }, /* NaN */ { { 0xffc00000 }, 0xffff, 0xffff, { 0xc7ffe000 }, { 0xc7ffe000 } }, /* -NaN */ { { 0x00000000 }, 0x0000, 0x0000, { 0x00000000 }, { 0x00000000 } }, /* 0.0f */ { { 0x80000000 }, 0x8000, 0x8000, { 0x80000000 }, { 0x80000000 } }, /* -0.0f */ { { 0x330007ff }, 0x0000, 0x0000, { 0x00000000 }, { 0x00000000 } }, /* 2.9809595e-08f */ { { 0xb30007ff }, 0x8000, 0x8000, { 0x80000000 }, { 0x80000000 } }, /* -2.9809595e-08f */ { { 0x33000800 }, 0x0001, 0x0000, { 0x33800000 }, { 0x00000000 } }, /* 2.9809598e-08f */ { { 0xb3000800 }, 0x8001, 0x8000, { 0xb3800000 }, { 0x80000000 } }, /* -2.9809598e-08f */ { { 0x33c00000 }, 0x0002, 0x0001, { 0x34000000 }, { 0x33800000 } }, /* 8.9406967e-08f */ }; /* exception on NULL out or in parameter */ out = D3DXFloat32To16Array(&half, &single.f, 0); ok(out == &half, "Got %p, expected %p.\n", out, &half); out = D3DXFloat16To32Array(&single.f, &half, 0); ok(out == &single.f, "Got %p, expected %p.\n", out, &single.f); for (i = 0; i < ARRAY_SIZE(testdata); ++i) { out = D3DXFloat32To16Array(&half, &testdata[i].single_in.f, 1); ok(out == &half, "Got %p, expected %p.\n", out, &half); ok(half.value == testdata[i].half_ver1 || half.value == testdata[i].half_ver2, "Got %x, expected %x or %x for index %d.\n", half.value, testdata[i].half_ver1, testdata[i].half_ver2, i); out = D3DXFloat16To32Array(&single.f, (D3DXFLOAT16 *)&testdata[i].half_ver1, 1); ok(out == &single.f, "Got %p, expected %p.\n", out, &single.f); equal = compare_float(single.f, testdata[i].single_out_ver1.f, 0); ok(equal, "Got %#x, expected %#x at index %u.\n", single.d, testdata[i].single_out_ver1.d, i); out = D3DXFloat16To32Array(&single.f, (D3DXFLOAT16 *)&testdata[i].half_ver2, 1); ok(out == &single.f, "Got %p, expected %p.\n", out, &single.f); equal = compare_float(single.f, testdata[i].single_out_ver2.f, 0); ok(equal, "Got %#x, expected %#x at index %u.\n", single.d, testdata[i].single_out_ver2.d, i); } } static void test_D3DXSHAdd(void) { float out[50] = {0.0f}; unsigned int i, k; float *ret; BOOL equal; static const float in1[50] = { 1.11f, 1.12f, 1.13f, 1.14f, 1.15f, 1.16f, 1.17f, 1.18f, 1.19f, 1.20f, 1.21f, 1.22f, 1.23f, 1.24f, 1.25f, 1.26f, 1.27f, 1.28f, 1.29f, 1.30f, 1.31f, 1.32f, 1.33f, 1.34f, 1.35f, 1.36f, 1.37f, 1.38f, 1.39f, 1.40f, 1.41f, 1.42f, 1.43f, 1.44f, 1.45f, 1.46f, 1.47f, 1.48f, 1.49f, 1.50f, 1.51f, 1.52f, 1.53f, 1.54f, 1.55f, 1.56f, 1.57f, 1.58f, 1.59f, 1.60f, }; static const float in2[50] = { 2.11f, 2.12f, 2.13f, 2.14f, 2.15f, 2.16f, 2.17f, 2.18f, 2.19f, 2.20f, 2.21f, 2.22f, 2.23f, 2.24f, 2.25f, 2.26f, 2.27f, 2.28f, 2.29f, 2.30f, 2.31f, 2.32f, 2.33f, 2.34f, 2.35f, 2.36f, 2.37f, 2.38f, 2.39f, 2.40f, 2.41f, 2.42f, 2.43f, 2.44f, 2.45f, 2.46f, 2.47f, 2.48f, 2.49f, 2.50f, 2.51f, 2.52f, 2.53f, 2.54f, 2.55f, 2.56f, 2.57f, 2.58f, 2.59f, 2.60f, }; /* * Order is not limited by D3DXSH_MINORDER and D3DXSH_MAXORDER! * All values will work, test from 0-7 [D3DXSH_MINORDER = 2, D3DXSH_MAXORDER = 6] * Exceptions will show up when out, in1 or in2 is NULL */ for (k = 0; k <= D3DXSH_MAXORDER + 1; k++) { UINT count = k * k; ret = D3DXSHAdd(&out[0], k, &in1[0], &in2[0]); ok(ret == out, "%u: D3DXSHAdd() failed, got %p, expected %p\n", k, out, ret); for (i = 0; i < count; ++i) { equal = compare_float(in1[i] + in2[i], out[i], 0); ok(equal, "%u-%u: Got %.8e, expected %.8e.\n", k, i, out[i], in1[i] + in2[i]); } equal = compare_float(out[count], 0.0f, 0); ok(equal, "%u-%u: Got %.8e, expected 0.0.\n", k, k * k, out[count]); } } static void test_D3DXSHDot(void) { float a[49], b[49], got; unsigned int i; BOOL equal; static const float expected[] = {0.5f, 0.5f, 25.0f, 262.5f, 1428.0f, 5362.5f, 15873.0f, 39812.5f}; for (i = 0; i < ARRAY_SIZE(a); ++i) { a[i] = i + 1.0f; b[i] = i + 0.5f; } /* D3DXSHDot computes by using order * order elements */ for (i = 0; i <= D3DXSH_MAXORDER + 1; i++) { got = D3DXSHDot(i, a, b); equal = compare_float(got, expected[i], 0); ok(equal, "order %u: Got %.8e, expected %.8e.\n", i, got, expected[i]); } } static void test_D3DXSHEvalConeLight(void) { float bout[49], expected, gout[49], rout[49]; unsigned int j, l, order; D3DXVECTOR3 dir; HRESULT hr; BOOL equal; static const float table[] = { /* Red colour */ 1.604815f, -3.131381f, 7.202175f, -2.870432f, 6.759296f, -16.959688f, 32.303082f, -15.546381f, -0.588878f, -5.902123f, 40.084042f, -77.423569f, 137.556320f, -70.971603f, -3.492171f, 7.683092f, -2.129311f, -35.971344f, 183.086548f, -312.414948f, 535.091064f, -286.380371f, -15.950727f, 46.825714f, -12.127637f, 11.289261f, -12.417809f, -155.039566f, 681.182556f, -1079.733643f, 1807.650513f, -989.755798f, -59.345467f, 201.822815f, -70.726486f, 7.206529f, 3.101155f, -3.128710f, 7.196033f, -2.867984f, -0.224708f, 0.563814f, -1.073895f, 0.516829f, 0.019577f, 2.059788f, -13.988971f, 27.020128f, -48.005917f, 24.768450f, 1.218736f, -2.681329f, -0.088639f, -1.497410f, 7.621501f, -13.005165f, 22.274696f, -11.921401f, -0.663995f, 1.949254f, -0.504848f, 4.168484f, -4.585193f, -57.247314f, 251.522095f, -398.684387f, 667.462891f, -365.460693f, -21.912912f, 74.521721f, -26.115280f, 2.660963f, /* Green colour */ 2.454422f, -4.789170f, 11.015091f, -4.390072f, 10.337747f, -25.938347f, 49.404713f, -23.776817f, -0.900637f, -9.026776f, 61.305000f, -118.412514f, 210.380249f, -108.544792f, -5.340967f, 11.750610f, -3.256593f, -55.014996f, 280.014709f, -477.811066f, 818.374512f, -437.993469f, -24.395227f, 71.615799f, -18.548151f, 17.265928f, -18.991943f, -237.119324f, 1041.808594f, -1651.357300f, 2764.642090f, -1513.744141f, -90.763657f, 308.670197f, -108.169922f, 11.021750f, 4.742942f, -4.785086f, 11.005697f, -4.386329f, -0.343672f, 0.862303f, -1.642427f, 0.790444f, 0.029941f, 3.150264f, -21.394896f, 41.324898f, -73.420807f, 37.881153f, 1.863950f, -4.100857f, -0.135565f, -2.290156f, 11.656413f, -19.890251f, 34.067181f, -18.232729f, -1.015521f, 2.981212f, -0.772120f, 6.375328f, -7.012648f, -87.554710f, 384.680817f, -609.752563f, 1020.825500f, -558.939819f, -33.513863f, 113.974388f, -39.941013f, 4.069707f, /* Blue colour */ 3.304030f, -6.446959f, 14.828006f, -5.909713f, 13.916198f, -34.917004f, 66.506340f, -32.007256f, -1.212396f, -12.151429f, 82.525963f, -159.401459f, 283.204193f, -146.117996f, -7.189764f, 15.818130f, -4.383876f, -74.058655f, 376.942871f, -643.207214f, 1101.658081f, -589.606628f, -32.839729f, 96.405884f, -24.968664f, 23.242596f, -25.566080f, -319.199097f, 1402.434692f, -2222.980957f, 3721.633545f, -2037.732544f, -122.181847f, 415.517578f, -145.613358f, 14.836972f, 6.384730f, -6.441462f, 14.815362f, -5.904673f, -0.462635f, 1.160793f, -2.210959f, 1.064060f, 0.040305f, 4.240739f, -28.800821f, 55.629673f, -98.835709f, 50.993862f, 2.509163f, -5.520384f, -0.182491f, -3.082903f, 15.691326f, -26.775339f, 45.859665f, -24.544060f, -1.367048f, 4.013170f, -1.039392f, 8.582172f, -9.440103f, -117.862114f, 517.839600f, -820.820740f, 1374.188232f, -752.419067f, -45.114819f, 153.427063f, -53.766754f, 5.478452f, }; const struct { float *red_received, *green_received, *blue_received; const float *red_expected, *green_expected, *blue_expected; float radius, roffset, goffset, boffset; } test[] = { { rout, gout, bout, table, &table[72], &table[144], 0.5f, 1.01f, 1.02f, 1.03f, }, { rout, gout, bout, &table[36], &table[108], &table[180], 1.6f, 1.01f, 1.02f, 1.03f, }, { rout, rout, rout, &table[144], &table[144], &table[144], 0.5f, 1.03f, 1.03f, 1.03f, }, { rout, rout, bout, &table[72], &table[72], &table[144], 0.5, 1.02f, 1.02f, 1.03f, }, { rout, gout, gout, table, &table[144], &table[144], 0.5f, 1.01f, 1.03f, 1.03f, }, { rout, gout, rout, &table[144], &table[72], &table[144], 0.5f, 1.03f, 1.02f, 1.03f, }, /* D3DXSHEvalConeLight accepts NULL green or blue colour. */ { rout, NULL, bout, table, NULL, &table[144], 0.5f, 1.01f, 0.0f, 1.03f, }, { rout, gout, NULL, table, &table[72], NULL, 0.5f, 1.01f, 1.02f, 0.0f, }, { rout, NULL, NULL, table, NULL, NULL, 0.5f, 1.01f, 0.0f, 0.0f, }, }; dir.x = 1.1f; dir.y = 1.2f; dir.z = 2.76f; for (l = 0; l < ARRAY_SIZE(test); ++l) { for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++) { for (j = 0; j < 49; j++) { test[l].red_received[j] = 1.01f + j; if (test[l].green_received) test[l].green_received[j] = 1.02f + j; if (test[l].blue_received) test[l].blue_received[j] = 1.03f + j; } hr = D3DXSHEvalConeLight(order, &dir, test[l].radius, 1.7f, 2.6f, 3.5f, test[l].red_received, test[l].green_received, test[l].blue_received); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); for (j = 0; j < 49; j++) { if (j >= order * order) expected = j + test[l].roffset; else expected = test[l].red_expected[j]; equal = compare_float(test[l].red_received[j], expected, 128); ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].red_received[j]); if (test[l].green_received) { if (j >= order * order) expected = j + test[l].goffset; else expected = test[l].green_expected[j]; equal = compare_float(test[l].green_received[j], expected, 64); ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].green_received[j]); } if (test[l].blue_received) { if (j >= order * order) expected = j + test[l].boffset; else expected = test[l].blue_expected[j]; equal = compare_float(test[l].blue_received[j], expected, 128); ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].blue_received[j]); } } } } /* Cone light with radius <= 0.0f behaves as a directional light */ for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++) { FLOAT blue[49], green[49], red[49]; for (j = 0; j < 49; j++) { rout[j] = 1.01f + j; gout[j] = 1.02f + j; bout[j] = 1.03f + j; red[j] = 1.01f + j; green[j] = 1.02f + j; blue[j] = 1.03f + j; } hr = D3DXSHEvalConeLight(order, &dir, -0.1f, 1.7f, 2.6f, 3.5f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); D3DXSHEvalDirectionalLight(order, &dir, 1.7f, 2.6f, 3.5f, red, green, blue); for (j = 0; j < 49; j++) { equal = compare_float(red[j], rout[j], 0); ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, red[j], rout[j]); equal = compare_float(green[j], gout[j], 0); ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, green[j], gout[j]); equal = compare_float(blue[j], bout[j], 0); ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, blue[j], bout[j]); } } /* D3DXSHEvalConeLight accepts order < D3DXSH_MINORDER or order > D3DXSH_MAXORDER. But tests in native windows show that the colour outputs are not set */ hr = D3DXSHEvalConeLight(7, &dir, 0.5f, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); hr = D3DXSHEvalConeLight(0, &dir, 0.5f, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); hr = D3DXSHEvalConeLight(1, &dir, 0.5f, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); } static void test_D3DXSHEvalDirection(void) { float a[49], expected, *received_ptr; unsigned int i, order; D3DXVECTOR3 d; BOOL equal; static const float table[36] = { 2.82094806e-01f, -9.77205038e-01f, 1.46580756e+00f, -4.88602519e-01f, 2.18509698e+00f, -6.55529118e+00f, 8.20018101e+00f, -3.27764559e-00f, -1.63882279e+00f, 1.18008721e+00f, 1.73436680e+01f, -4.02200317e+01f, 4.70202179e+01f, -2.01100159e+01f, -1.30077515e+01f, 6.49047947e+00f, -1.50200577e+01f, 1.06207848e+01f, 1.17325661e+02f, -2.40856750e+02f, 2.71657288e+02f, -1.20428375e+02f, -8.79942474e+01f, 5.84143143e+01f, -4.38084984e+00f, 2.49425201e+01f, -1.49447693e+02f, 7.82781296e+01f, 7.47791748e+02f, -1.42768787e+03f, 1.57461914e+03f, -7.13843933e+02f, -5.60843811e+02f, 4.30529724e+02f, -4.35889091e+01f, -2.69116650e+01f, }; d.x = 1.0; d.y = 2.0f; d.z = 3.0f; for (order = 0; order <= D3DXSH_MAXORDER + 1; order++) { for (i = 0; i < ARRAY_SIZE(a); ++i) a[i] = 1.5f + i; received_ptr = D3DXSHEvalDirection(a, order, &d); ok(received_ptr == a, "Expected %p, received %p\n", a, received_ptr); for (i = 0; i < ARRAY_SIZE(a); ++i) { /* if the order is < D3DXSH_MINORDER or order > D3DXSH_MAXORDER or * the index of the element is greater than order * order - 1, * D3DXSHEvalDirection() does not modify the output. */ if ((order < D3DXSH_MINORDER) || (order > D3DXSH_MAXORDER) || (i >= order * order)) expected = 1.5f + i; else expected = table[i]; equal = compare_float(a[i], expected, 2); ok(equal, "order %u, index %u: Got unexpected result %.8e, expected %.8e.\n", order, i, a[i], expected); } } } static void test_D3DXSHEvalDirectionalLight(void) { float *blue_out, bout[49], expected, gout[49], *green_out, *red_out, rout[49]; unsigned int j, l, order, startindex; D3DXVECTOR3 dir; HRESULT hr; BOOL equal; static const float table[] = { /* Red colour */ 2.008781f, -4.175174f, 9.602900f, -3.827243f, 1.417963f, -2.947181f, 6.778517f, -2.701583f, 7.249108f, -18.188671f, 34.643921f, -16.672949f, -0.631551f, 1.417963f, -2.947181f, 6.778517f, -2.701583f, 7.249108f, -18.188671f, 34.643921f, -16.672949f, -0.631551f, -7.794341f, 52.934967f, -102.245529f, 181.656815f, -93.725060f, -4.611760f, 10.146287f, 1.555186f, -3.232392f, 7.434503f, -2.963026f, 7.950634f, -19.948866f, 37.996559f, -18.286459f, -0.692669f, -8.548632f, 58.057705f, -112.140251f, 199.236496f, -102.795227f, -5.058059f, 11.128186f, -4.189955f, -70.782669f, 360.268829f, -614.755005f, 1052.926270f, -563.525391f, -31.387066f, 92.141365f, -23.864176f, 1.555186f, -3.232392f, 7.434503f, -2.963026f, 7.950634f, -19.948866f, 37.996559f, -18.286459f, -0.692669f, -8.548632f, 58.057705f, -112.140251f, 199.236496f, -102.795227f, -5.058059f, 11.128186f, -4.189955f, -70.782669f, 360.268829f, -614.755005f, 1052.926270f, -563.525391f, -31.387066f, 92.141365f, -23.864176f, 34.868664f, -38.354366f, -478.864166f, 2103.939941f, -3334.927734f, 5583.213867f, -3057.017090f, -183.297836f, 623.361633f, -218.449921f, 22.258503f, /* Green colour */ 3.072254f, -6.385560f, 14.686787f, -5.853429f, 2.168650f, -4.507453f, 10.367143f, -4.131832f, 11.086870f, -27.817965f, 52.984818f, -25.499800f, -0.965902f, 2.168650f, -4.507453f, 10.367143f, -4.131832f, 11.086870f, -27.817965f, 52.984818f, -25.499800f, -0.965902f, -11.920755f, 80.959351f, -156.375488f, 277.828033f, -143.344193f, -7.053278f, 15.517849f, 2.378519f, -4.943659f, 11.370415f, -4.531687f, 12.159794f, -30.510029f, 58.112385f, -27.967525f, -1.059376f, -13.074378f, 88.794136f, -171.508621f, 304.714630f, -157.216217f, -7.735855f, 17.019577f, -6.408166f, -108.255844f, 550.999390f, -940.213501f, 1610.357788f, -861.862305f, -48.003746f, 140.922089f, -36.498150f, 2.378519f, -4.943659f, 11.370415f, -4.531687f, 12.159794f, -30.510029f, 58.112385f, -27.967525f, -1.059376f, -13.074378f, 88.794136f, -171.508621f, 304.714630f, -157.216217f, -7.735855f, 17.019577f, -6.408166f, -108.255844f, 550.999390f, -940.213501f, 1610.357788f, -861.862305f, -48.003746f, 140.922089f, -36.498150f, 53.328545f, -58.659618f, -732.380493f, 3217.790283f, -5100.477539f, 8539.033203f, -4675.437500f, -280.337860f, 953.376587f, -334.099884f, 34.042416f, /* Blue colour */ 4.135726f, -8.595945f, 19.770674f, -7.879617f, 2.919336f, -6.067726f, 13.955770f, -5.562082f, 14.924634f, -37.447262f, 71.325722f, -34.326656f, -1.300252f, 2.919336f, -6.067726f, 13.955770f, -5.562082f, 14.924634f, -37.447262f, 71.325722f, -34.326656f, -1.300252f, -16.047173f, 108.983749f, -210.505493f, 373.999298f, -192.963348f, -9.494799f, 20.889414f, 3.201853f, -6.654925f, 15.306328f, -6.100348f, 16.368954f, -41.071194f, 78.228210f, -37.648590f, -1.426083f, -17.600124f, 119.530563f, -230.876984f, 410.192780f, -211.637222f, -10.413651f, 22.910971f, -8.626378f, -145.729019f, 741.729919f, -1265.671997f, 2167.789307f, -1160.199219f, -64.620430f, 189.702820f, -49.132126f, 3.201853f, -6.654925f, 15.306328f, -6.100348f, 16.368954f, -41.071194f, 78.228210f, -37.648590f, -1.426083f, -17.600124f, 119.530563f, -230.876984f, 410.192780f, -211.637222f, -10.413651f, 22.910971f, -8.626378f, -145.729019f, 741.729919f, -1265.671997f, 2167.789307f, -1160.199219f, -64.620430f, 189.702820f, -49.132126f, 71.788422f, -78.964867f, -985.896790f, 4331.640625f, -6866.027344f, 11494.852539f, -6293.858398f, -377.377899f, 1283.391479f, -449.749817f, 45.826328f, }; const struct { float *red_in, *green_in, *blue_in; const float *red_out, *green_out, *blue_out; float roffset, goffset, boffset; } test[] = { { rout, gout, bout, table, &table[90], &table[180], 1.01f, 1.02f, 1.03f, }, { rout, rout, rout, &table[180], &table[180], &table[180], 1.03f, 1.03f, 1.03f, }, { rout, rout, bout, &table[90], &table[90], &table[180], 1.02f, 1.02f, 1.03f, }, { rout, gout, gout, table, &table[180], &table[180], 1.01f, 1.03f, 1.03f, }, { rout, gout, rout, &table[180], &table[90], &table[180], 1.03f, 1.02f, 1.03f, }, /* D3DXSHEvalDirectionaLight accepts NULL green or blue colour. */ { rout, NULL, bout, table, NULL, &table[180], 1.01f, 0.0f, 1.03f, }, { rout, gout, NULL, table, &table[90], NULL, 1.01f, 1.02f, 0.0f, }, { rout, NULL, NULL, table, NULL, NULL, 1.01f, 0.0f, 0.0f, }, }; dir.x = 1.1f; dir.y= 1.2f; dir.z = 2.76f; for (l = 0; l < ARRAY_SIZE(test); ++l) { startindex = 0; for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++) { red_out = test[l].red_in; green_out = test[l].green_in; blue_out = test[l].blue_in; for (j = 0; j < ARRAY_SIZE(rout); ++j) { red_out[j] = 1.01f + j; if ( green_out ) green_out[j] = 1.02f + j; if ( blue_out ) blue_out[j] = 1.03f + j; } hr = D3DXSHEvalDirectionalLight(order, &dir, 1.7f, 2.6f, 3.5f, red_out, green_out, blue_out); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); for (j = 0; j < ARRAY_SIZE(rout); ++j) { if ( j >= order * order ) expected = j + test[l].roffset; else expected = test[l].red_out[startindex + j]; equal = compare_float(expected, red_out[j], 8); ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, red_out[j]); if ( green_out ) { if ( j >= order * order ) expected = j + test[l].goffset; else expected = test[l].green_out[startindex + j]; equal = compare_float(expected, green_out[j], 8); ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, green_out[j]); } if ( blue_out ) { if ( j >= order * order ) expected = j + test[l].boffset; else expected = test[l].blue_out[startindex + j]; equal = compare_float(expected, blue_out[j], 4); ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, blue_out[j]); } } startindex += order * order; } } /* D3DXSHEvalDirectionalLight accepts order < D3DXSH_MINORDER or order > D3DXSH_MAXORDER. But tests in native windows show that the colour outputs are not set*/ hr = D3DXSHEvalDirectionalLight(7, &dir, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); hr = D3DXSHEvalDirectionalLight(0, &dir, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); hr = D3DXSHEvalDirectionalLight(1, &dir, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); } static void test_D3DXSHEvalHemisphereLight(void) { float bout[49], expected, gout[49], rout[49]; unsigned int j, l, order; D3DXCOLOR bottom, top; D3DXVECTOR3 dir; HRESULT hr; BOOL equal; static const float table[] = { /* Red colour. */ 23.422981f, 15.859521f, -36.476898f, 14.537894f, /* Green colour. */ 19.966694f, 6.096982f, -14.023058f, 5.588900f, /* Blue colour. */ 24.566214f, 8.546826f, -19.657701f, 7.834591f, }; const struct { float *red_received, *green_received, *blue_received; const float *red_expected, *green_expected, *blue_expected; const float roffset, goffset, boffset; } test[] = { { rout, gout, bout, table, &table[4], &table[8], 1.01f, 1.02f, 1.03f, }, { rout, rout, rout, &table[8], &table[8], &table[8], 1.03f, 1.03f, 1.03f, }, { rout, rout, bout, &table[4], &table[4], &table[8], 1.02f, 1.02f, 1.03f, }, { rout, gout, gout, table, &table[8], &table[8], 1.01f, 1.03f, 1.03f, }, { rout, gout, rout, &table[8], &table[4], &table[8], 1.03f, 1.02f, 1.03f, }, /* D3DXSHEvalHemisphereLight accepts NULL green or blue colour. */ { rout, NULL, bout, table, NULL, &table[8], 1.01f, 1.02f, 1.03f, }, { rout, gout, NULL, table, &table[4], NULL, 1.01f, 1.02f, 1.03f, }, { rout, NULL, NULL, table, NULL, NULL, 1.01f, 1.02f, 1.03f, }, }; dir.x = 1.1f; dir.y = 1.2f; dir.z = 2.76f; top.r = 0.1f; top.g = 2.1f; top.b = 2.3f; top.a = 4.3f; bottom.r = 8.71f; bottom.g = 5.41f; bottom.b = 6.94f; bottom.a = 8.43f; for (l = 0; l < ARRAY_SIZE(test); ++l) for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER + 1; order++) { for (j = 0; j < 49; j++) { test[l].red_received[j] = 1.01f + j; if (test[l].green_received) test[l].green_received[j] = 1.02f + j; if (test[l].blue_received) test[l].blue_received[j] = 1.03f + j; } hr = D3DXSHEvalHemisphereLight(order, &dir, top, bottom, test[l].red_received, test[l].green_received, test[l].blue_received); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); for (j = 0; j < 49; j++) { if (j < 4) expected = test[l].red_expected[j]; else if (j < order * order) expected = 0.0f; else expected = test[l].roffset + j; equal = compare_float(test[l].red_received[j], expected, 4); ok(equal, "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].red_received[j]); if (test[l].green_received) { if (j < 4) expected = test[l].green_expected[j]; else if (j < order * order) expected = 0.0f; else expected = test[l].goffset + j; equal = compare_float(expected, test[l].green_received[j], 4); ok(equal, "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].green_received[j]); } if (test[l].blue_received) { if (j < 4) expected = test[l].blue_expected[j]; else if (j < order * order) expected = 0.0f; else expected = test[l].boffset + j; equal = compare_float(expected, test[l].blue_received[j], 4); ok(equal, "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].blue_received[j]); } } } } static void test_D3DXSHEvalSphericalLight(void) { float bout[49], expected, gout[49], rout[49]; unsigned int j, l, order; D3DXVECTOR3 dir; HRESULT hr; BOOL equal; static const float table[] = { /* Red colour. */ 3.01317163e+00f, -9.77240128e-01f, 2.24765220e+00f, -8.95803434e-01f, 3.25255224e-35f, -8.16094904e-35f, 8.95199460e-35f, -7.48086982e-35f, -2.83366352e-36f, 6.29281376e-02f, -4.27374053e-01f, 6.19212543e-01f, -3.04508915e-01f, 5.67611487e-01f, 3.72333533e-02f, -8.19167317e-02f, 1.25205729e-36f, 2.11515287e-35f, -8.85884025e-35f, 8.22100105e-35f, -1.41290744e-37f, 7.53591749e-35f, 7.71793061e-36f, -2.75340121e-35f, 7.13117824e-36f, 1.24992691e-02f, -1.37487792e-02f, -1.48109290e-01f, 4.34345843e-01f, -2.45986100e-01f, -1.51757946e-01f, -2.25487254e-01f, -3.78407442e-02f, 1.92801335e-01f, -7.83071154e-02f, 7.97894137e-03f, 4.02519645e-01f, -2.43653315e-01f, 5.60402600e-01f, -2.23348868e-01f, 1.62046875e-01f, -4.06590330e-01f, 4.46001368e-01f, -3.72707796e-01f, -1.41177231e-02f, -4.31995198e-02f, 2.93387896e-01f, -4.25083048e-01f, 2.09042241e-01f, -3.89659453e-01f, -2.55603144e-02f, 5.62349945e-02f, -4.68822967e-03f, -7.92002290e-02f, 3.31712278e-01f, -3.07828893e-01f, 5.29052032e-04f, -2.82176480e-01f, -2.88991817e-02f, 1.03098934e-01f, -2.67021338e-02f, 7.24339502e-03f, -7.96749298e-03f, -8.58301461e-02f, 2.51705799e-01f, -1.42550295e-01f, -8.79445626e-02f, -1.30671101e-01f, -2.19289189e-02f, 1.11729432e-01f, -4.53794030e-02f, 4.62384030e-03f, 1.95445306e+00f, -8.56593659e-01f, 1.97016533e+00f, -7.85210840e-01f, 2.31033385e-01f, -5.79683751e-01f, 6.35872835e-01f, -5.31376762e-01f, -2.01279127e-02f, 2.11104646e-02f, -1.43370917e-01f, 2.07726860e-01f, -1.02153423e-01f, 1.90416285e-01f, 1.24906507e-02f, -2.74805568e-02f, 6.33162467e-03f, 1.06962790e-01f, -4.47989495e-01f, 4.15734115e-01f, -7.14504011e-04f, 3.81089599e-01f, 3.90293960e-02f, -1.39238860e-01f, 3.60622028e-02f, -4.47359268e-03f, 4.92080277e-03f, 5.30095505e-02f, -1.55456001e-01f, 8.80404774e-02f, 5.43154350e-02f, 8.07037695e-02f, 1.35435180e-02f, -6.90052063e-02f, 2.80267699e-02f, -2.85572968e-03f, /* Green colour. */ 4.60837984e+00f, -1.49460245e+00f, 3.43758549e+00f, -1.37005222e+00f, 4.97449134e-35f, -1.24814507e-34f, 1.36912850e-34f, -1.14413296e-34f, -4.33383805e-36f, 9.62430278e-02f, -6.53630863e-01f, 9.47030887e-01f, -4.65719486e-01f, 8.68111630e-01f, 5.69451249e-02f, -1.25284405e-01f, 1.91491103e-36f, 3.23493947e-35f, -1.35488136e-34f, 1.25732949e-34f, -2.16091711e-37f, 1.15255201e-34f, 1.18038931e-35f, -4.21108392e-35f, 1.09065072e-35f, 1.91165280e-02f, -2.10275433e-02f, -2.26520076e-01f, 6.64293599e-01f, -3.76214011e-01f, -2.32100374e-01f, -3.44862837e-01f, -5.78740756e-02f, 2.94872611e-01f, -1.19763816e-01f, 1.22030860e-02f, 6.15618240e-01f, -3.72646222e-01f, 8.57086273e-01f, -3.41592364e-01f, 2.47836381e-01f, -6.21843994e-01f, 6.82119695e-01f, -5.70023651e-01f, -2.15918104e-02f, -6.60698496e-02f, 4.48710870e-01f, -6.50126972e-01f, 3.19711642e-01f, -5.95949713e-01f, -3.90922430e-02f, 8.60064566e-02f, -7.17023314e-03f, -1.21129754e-01f, 5.07324627e-01f, -4.70797100e-01f, 8.09138350e-04f, -4.31564000e-01f, -4.41987457e-02f, 1.57680712e-01f, -4.08385549e-02f, 1.10781328e-02f, -1.21855767e-02f, -1.31269627e-01f, 3.84961785e-01f, -2.18018084e-01f, -1.34503440e-01f, -1.99849906e-01f, -3.35383443e-02f, 1.70880296e-01f, -6.94037884e-02f, 7.07175529e-03f, 2.98916331e+00f, -1.31008433e+00f, 3.01319384e+00f, -1.20091062e+00f, 3.53345154e-01f, -8.86575090e-01f, 9.72511332e-01f, -8.12693818e-01f, -3.07838645e-02f, 3.22865908e-02f, -2.19273153e-01f, 3.17699883e-01f, -1.56234637e-01f, 2.91224888e-01f, 1.91033469e-02f, -4.20290842e-02f, 9.68366064e-03f, 1.63590138e-01f, -6.85160360e-01f, 6.35828606e-01f, -1.09277077e-03f, 5.82842878e-01f, 5.96920135e-02f, -2.12953537e-01f, 5.51539537e-02f, -6.84196484e-03f, 7.52593316e-03f, 8.10734249e-02f, -2.37756221e-01f, 1.34650133e-01f, 8.30706600e-02f, 1.23429287e-01f, 2.07136145e-02f, -1.05537368e-01f, 4.28644688e-02f, -4.36758628e-03f, /* Blue colour. */ 6.20358848e+00f, -2.01196491e+00f, 4.62751910e+00f, -1.84430114e+00f, 6.69643089e-35f, -1.68019534e-34f, 1.84305766e-34f, -1.54017904e-34f, -5.83401297e-36f, 1.29557927e-01f, -8.79887732e-01f, 1.27484932e+00f, -6.26930101e-01f, 1.16861185e+00f, 7.66569017e-02f, -1.68652090e-01f, 2.57776494e-36f, 4.35472637e-35f, -1.82387882e-34f, 1.69255899e-34f, -2.90892699e-37f, 1.55151238e-34f, 1.58898567e-35f, -5.66876703e-35f, 1.46818371e-35f, 2.57337886e-02f, -2.83063093e-02f, -3.04930882e-01f, 8.94241416e-01f, -5.06441957e-01f, -3.12442822e-01f, -4.64238452e-01f, -7.79074123e-02f, 3.96943914e-01f, -1.61220527e-01f, 1.64272318e-02f, 8.28716892e-01f, -5.01639163e-01f, 1.15377003e+00f, -4.59835891e-01f, 3.33625909e-01f, -8.37097715e-01f, 9.18238085e-01f, -7.67339558e-01f, -2.90658997e-02f, -8.89401854e-02f, 6.04033886e-01f, -8.75170956e-01f, 4.30381072e-01f, -8.02240028e-01f, -5.26241753e-02f, 1.15777927e-01f, -9.65223728e-03f, -1.63059290e-01f, 6.82937023e-01f, -6.33765350e-01f, 1.08922474e-03f, -5.80951560e-01f, -5.94983136e-02f, 2.12262505e-01f, -5.49749798e-02f, 1.49128717e-02f, -1.64036616e-02f, -1.76709119e-01f, 5.18217807e-01f, -2.93485893e-01f, -1.81062330e-01f, -2.69028730e-01f, -4.51477729e-02f, 2.30031176e-01f, -9.34281801e-02f, 9.51967094e-03f, 4.02387383e+00f, -1.76357513e+00f, 4.05622263e+00f, -1.61661051e+00f, 4.75656955e-01f, -1.19346651e+00f, 1.30914992e+00f, -1.09401095e+00f, -4.14398191e-02f, 4.34627200e-02f, -2.95175409e-01f, 4.27672935e-01f, -2.10315865e-01f, 3.92033517e-01f, 2.57160448e-02f, -5.65776154e-02f, 1.30356975e-02f, 2.20217502e-01f, -9.22331288e-01f, 8.55923154e-01f, -1.47103763e-03f, 7.84596211e-01f, 8.03546365e-02f, -2.86668233e-01f, 7.42457096e-02f, -9.21033762e-03f, 1.01310642e-02f, 1.09137307e-01f, -3.20056463e-01f, 1.81259801e-01f, 1.11825893e-01f, 1.66154815e-01f, 2.78837128e-02f, -1.42069538e-01f, 5.77021717e-02f, -5.87944329e-03f, }; const struct { float *red_received, *green_received, *blue_received; const float *red_expected, *green_expected, *blue_expected; float radius, roffset, goffset, boffset; } test[] = { { rout, gout, bout, table, &table[108], &table[216], 17.4f, 1.01f, 1.02f, 1.03f, }, { rout, gout, bout, &table[36], &table[144], &table[252], 1.6f, 1.01f, 1.02f, 1.03f, }, { rout, gout, bout, &table[72], &table[180], &table[288], -3.0f, 1.01f, 1.02f, 1.03f, }, { rout, rout, rout, &table[216], &table[216], &table[216], 17.4f, 1.03f, 1.03f, 1.03f, }, { rout, rout, bout, &table[108], &table[108], &table[216], 17.4, 1.02f, 1.02f, 1.03f, }, { rout, gout, gout, table, &table[216], &table[216], 17.4f, 1.01f, 1.03f, 1.03f, }, { rout, gout, rout, &table[216], &table[108], &table[216], 17.4f, 1.03f, 1.02f, 1.03f, }, /* D3DXSHEvalSphericalLight accepts NULL green or blue colour. */ { rout, NULL, bout, table, NULL, &table[216], 17.4f, 1.01f, 0.0f, 1.03f, }, { rout, gout, NULL, table, &table[108], NULL, 17.4f, 1.01f, 1.02f, 0.0f, }, { rout, NULL, NULL, table, NULL, NULL, 17.4f, 1.01f, 0.0f, 0.0f, }, }; dir.x = 1.1f; dir.y = 1.2f; dir.z = 2.76f; for (l = 0; l < ARRAY_SIZE(test); ++l) { for (order = D3DXSH_MINORDER; order <= D3DXSH_MAXORDER; order++) { for (j = 0; j < 49; j++) { test[l].red_received[j] = 1.01f + j; if (test[l].green_received) test[l].green_received[j] = 1.02f + j; if (test[l].blue_received) test[l].blue_received[j] = 1.03f + j; } hr = D3DXSHEvalSphericalLight(order, &dir, test[l].radius, 1.7f, 2.6f, 3.5f, test[l].red_received, test[l].green_received, test[l].blue_received); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); for (j = 0; j < 49; j++) { if (j >= order * order) expected = j + test[l].roffset; else expected = test[l].red_expected[j]; equal = compare_float(expected, test[l].red_received[j], 4096); ok(equal || (fabs(expected) < 1.0e-6f && fabs(test[l].red_received[j]) < 1.0e-6f), "Red: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].red_received[j]); if (test[l].green_received) { if (j >= order * order) expected = j + test[l].goffset; else expected = test[l].green_expected[j]; equal = compare_float(expected, test[l].green_received[j], 4096); ok(equal || (fabs(expected) < 1.0e-6f && fabs(test[l].green_received[j]) < 1.0e-6f), "Green: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].green_received[j]); } if (test[l].blue_received) { if (j >= order * order) expected = j + test[l].boffset; else expected = test[l].blue_expected[j]; equal = compare_float(expected, test[l].blue_received[j], 4096); ok(equal || (fabs(expected) < 1.0e-6f && fabs(test[l].blue_received[j]) < 1.0e-6f), "Blue: case %u, order %u: expected[%u] = %.8e, received %.8e.\n", l, order, j, expected, test[l].blue_received[j]); } } } } /* D3DXSHEvalSphericalLight accepts order < D3DXSH_MINORDER or order > D3DXSH_MAXORDER. But tests in native windows show that the colour outputs are not set */ hr = D3DXSHEvalSphericalLight(7, &dir, 17.4f, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); hr = D3DXSHEvalSphericalLight(0, &dir, 17.4f, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); hr = D3DXSHEvalSphericalLight(1, &dir, 17.4f, 1.0f, 2.0f, 3.0f, rout, gout, bout); ok(hr == D3D_OK, "Expected %#x, got %#x\n", D3D_OK, hr); } static void test_D3DXSHMultiply2(void) { float a[20], b[20], c[20]; unsigned int i; BOOL equal; /* D3DXSHMultiply2() only modifies the first 4 elements of the array. */ static const float expected[20] = { 3.41859412f, 1.69821072f, 1.70385253f, 1.70949447f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, }; for (i = 0; i < ARRAY_SIZE(a); ++i) { a[i] = 1.0f + i / 100.0f; b[i] = 3.0f - i / 100.0f; c[i] = i; } D3DXSHMultiply2(c, a, b); for (i = 0; i < ARRAY_SIZE(expected); ++i) { equal = compare_float(c[i], expected[i], 2); ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[i], c[i]); } } static void test_D3DXSHMultiply3(void) { float a[20], b[20], c[20]; unsigned int i; BOOL equal; /* D3DXSHMultiply3() only modifies the first 9 elements of the array. */ static const float expected[20] = { 7.81391382e+00f, 2.25605774e+00f, 5.94839954e+00f, 4.97089481e+00f, 2.89985824e+00f, 3.59894633e+00f, 1.72657156e+00f, 5.57353783e+00f, 6.22063160e-01f, 9.00000000e+00f, 1.00000000e+01f, 1.10000000e+01f, 1.20000000e+01f, 1.30000000e+01f, 1.40000000e+01f, 1.50000000e+01f, 1.60000000e+01f, 1.70000000e+01f, 1.80000000e+01f, 1.90000000e+01f, }; static const float expected_aliased[20] = { 4.54092499e+02f, 2.12640405e+00f, 5.57040071e+00f, 1.53303785e+01f, 2.27960873e+01f, 4.36041260e+01f, 4.27384138e+00f, 1.75772034e+02f, 2.37672729e+02f, 1.09000003e+00f, 1.10000002e+00f, 1.11000001e+00f, 1.12000000e+00f, 1.13000000e+00f, 1.13999999e+00f, 1.14999998e+00f, 1.15999997e+00f, 1.16999996e+00f, 1.17999995e+00f, 1.19000006e+00f, }; for (i = 0; i < ARRAY_SIZE(a); ++i) { a[i] = 1.0f + i / 100.0f; b[i] = 3.0f - i / 100.0f; c[i] = i; } D3DXSHMultiply3(c, a, b); for (i = 0; i < ARRAY_SIZE(expected); ++i) { equal = compare_float(c[i], expected[i], 4); ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[i], c[i]); } memcpy(c, a, sizeof(c)); D3DXSHMultiply3(c, c, b); for (i = 0; i < ARRAY_SIZE(expected_aliased); ++i) { equal = compare_float(c[i], expected_aliased[i], 32); ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected_aliased[i], c[i]); } } static void test_D3DXSHMultiply4(void) { float a[20], b[20], c[20]; unsigned int i; BOOL equal; /* D3DXSHMultiply4() only modifies the first 16 elements of the array. */ static const float expected[] = { /* c, a, b */ 1.41825991e+01f, 2.61570334e+00f, 1.28286009e+01f, 9.82059574e+00f, 3.03969646e+00f, 4.53044176e+00f, 5.82058382e+00f, 1.22498465e+01f, 2.19434643e+00f, 3.90015244e+00f, 5.41660881e+00f, 5.60181284e+00f, 9.59981740e-01f, 7.03754997e+00f, 3.62523031e+00f, 4.63601470e-01f, 1.60000000e+01f, 1.70000000e+01f, 1.80000000e+01f, 1.90000000e+01f, /* c, c, b */ -2.11441266e+05f, -2.52915771e+03f, -1.00233936e+04f, -4.41277191e+02f, -1.63994385e+02f, -5.26305115e+02f, 2.96361875e+04f, -3.93183081e+03f, -1.35771113e+04f, -3.97897388e+03f, -1.03303418e+04f, -1.37797871e+04f, -1.66851094e+04f, -4.49813750e+04f, -7.32697422e+04f, -9.52373359e+04f, 1.60000000e+01f, 1.70000000e+01f, 1.80000000e+01f, 1.90000000e+01f, /* c, c, c */ 2.36682415e-01f, -7.17648506e-01f, -1.80499524e-01f, -7.71235973e-02f, 1.44830629e-01f, 5.73285699e-01f, -3.37959230e-01f, 5.56938872e-02f, -4.42100227e-01f, 1.47701755e-01f, -5.51566519e-02f, 8.43374059e-02f, 1.79876596e-01f, 9.09878965e-03f, 2.32199892e-01f, 7.41420984e-02f, 1.60000002e+00f, 1.70000005e+00f, 1.80000007e+00f, 1.89999998e+00f, }; for (i = 0; i < ARRAY_SIZE(a); ++i) { a[i] = 1.0f + i / 100.0f; b[i] = 3.0f - i / 100.0f; c[i] = i; } D3DXSHMultiply4(c, a, b); for (i = 0; i < ARRAY_SIZE(c); ++i) { equal = compare_float(c[i], expected[i], 16); ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[i], c[i]); } for (i = 0; i < ARRAY_SIZE(b); ++i) { b[i] = 3.0f - i / 100.0f; c[i] = i; } D3DXSHMultiply4(c, c, b); for (i = 0; i < ARRAY_SIZE(c); ++i) { equal = compare_float(c[i], expected[20 + i], 32); ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[20 + i], c[i]); } for (i = 0; i < ARRAY_SIZE(c); ++i) c[i] = 0.1f * i; D3DXSHMultiply4(c, c, c); for (i = 0; i < ARRAY_SIZE(c); ++i) { equal = compare_float(c[i], expected[40 + i], 8); ok(equal, "Expected[%u] = %.8e, received = %.8e.\n", i, expected[40 + i], c[i]); } } static void test_D3DXSHRotate(void) { float expected, in[49], out[49], *out_temp, *received_ptr; unsigned int i, j, l, order; D3DXMATRIX m[4]; BOOL equal; static const float table[]= { /* Rotation around the x-axis, π/2. */ 1.00999999e+00f, -3.00999999e+00f, 2.00999975e+00f, 4.01000023e+00f, -8.01000023e+00f, -6.00999928e+00f, -1.13078899e+01f, 5.00999975e+00f, -1.56583869e+00f, 1.09359801e+00f, -1.10099983e+01f, 1.98334141e+01f, -1.52681913e+01f, -1.90041180e+01f, -3.36488891e+00f, -9.56262684e+00f, 1.20996542e+01f, -2.72131383e-01f, 3.02410126e+01f, 2.69199905e+01f, 3.92368774e+01f, -2.26324463e+01f, 6.70738792e+00f, -1.17682819e+01f, 3.44367194e+00f, -6.07445812e+00f, 1.16183939e+01f, 1.52756083e+00f, 3.78963356e+01f, -5.69012184e+01f, 4.74228935e+01f, 5.03915329e+01f, 1.06181908e+01f, 2.55010109e+01f, 4.92456071e-02f, 1.69833069e+01f, 1.00999999e+00f, -3.00999999e+00f, -3.01000023e+00f, 4.01000023e+00f, -8.01000023e+00f, -6.00999928e+00f, -1.13078890e+01f, -8.01000023e+00f, 1.42979193e+01f, /* Rotation around the x-axis, -π/2. */ 1.00999999e+00f, 3.00999999e+00f, -2.01000023e+00f, 4.01000023e+00f, 8.01000023e+00f, -6.01000118e+00f, -1.13078880e+01f, -5.01000071e+00f, -1.56583774e+00f, -1.09359753e+00f, -1.10100021e+01f, -1.98334103e+01f, 1.52681961e+01f, -1.90041142e+01f, 3.36489248e+00f, -9.56262398e+00f, -1.20996523e+01f, -2.72129118e-01f, -3.02410049e+01f, 2.69200020e+01f, 3.92368736e+01f, 2.26324520e+01f, 6.70738268e+00f, 1.17682877e+01f, 3.44367099e+00f, 6.07445717e+00f, 1.16183996e+01f, -1.52756333e+00f, 3.78963509e+01f, 5.69011993e+01f, -4.74229126e+01f, 5.03915253e+01f, -1.06182041e+01f, 2.55009995e+01f, -4.92481887e-02f, 1.69833050e+01f, 1.00999999e+00f, 3.00999999e+00f, -3.01000023e+00f, 4.01000023e+00f, 8.01000023e+00f, -6.01000118e+00f, -1.13078899e+01f, -8.01000023e+00f, 1.42979193e+01f, /* Yaw π/3, pitch π/4, roll π/5. */ 1.00999999e+00f, 4.94489908e+00f, 1.44230127e+00f, 1.62728095e+00f, 2.19220325e-01f, 1.05408239e+01f, -9.13690281e+00f, 2.76374960e+00f, -7.30904531e+00f, -5.87572050e+00f, 5.30312395e+00f, -8.68215370e+00f, -2.56833839e+01f, 1.68027866e+00f, -1.88083878e+01f, 7.65365601e+00f, 1.69391327e+01f, -1.73280182e+01f, 1.46297951e+01f, -5.44671021e+01f, -1.22310352e+01f, -4.08985710e+00f, -9.44422245e+00f, 3.05603528e+00f, 1.79257303e-01f, -1.00418749e+01f, 2.30900917e+01f, -2.31887093e+01f, 1.17270985e+01f, -6.51830902e+01f, 4.86715775e+01f, -1.50732088e+01f, 3.87931709e+01f, -2.60395355e+01f, 6.19276857e+00f, -1.76722469e+01f, 1.00999999e+00f, 4.94489908e+00f, -8.91142070e-01f, 4.60769463e+00f, 2.19218358e-01f, 1.07733250e+01f, -8.20476913e+00f, 1.35638294e+01f, -1.20077667e+01f, /* Rotation around the z-axis, π/6. */ 1.00999999e+00f, 3.74571109e+00f, 3.00999999e+00f, 2.46776199e+00f, 1.03078890e+01f, 9.20981312e+00f, 7.01000023e+00f, 3.93186355e+00f, 1.66212186e-01f, 1.60099983e+01f, 1.85040417e+01f, 1.74059658e+01f, 1.30100002e+01f, 6.12801647e+00f, -2.02994061e+00f, -1.00100012e+01f, 1.31542921e+01f, 2.40099964e+01f, 2.94322453e+01f, 2.83341675e+01f, 2.10100021e+01f, 9.05622101e+00f, -4.95814323e+00f, -1.80100002e+01f, -2.72360935e+01f, -4.52033186e+00f, 1.68145428e+01f, 3.40099945e+01f, 4.30924950e+01f, 4.19944229e+01f, 3.10100002e+01f, 1.27164707e+01f, -8.61839962e+00f, -2.80100021e+01f, -4.08963470e+01f, -4.41905708e+01f, 1.00999999e+00f, 3.74571109e+00f, 3.00999999e+00f, 1.59990644e+00f, 1.03078890e+01f, 9.20981312e+00f, 7.01000023e+00f, 2.33195710e+00f, -4.42189360e+00f, }; D3DXMatrixRotationX(&m[0], -D3DX_PI / 2.0f); D3DXMatrixRotationX(&m[1], D3DX_PI / 2.0f); D3DXMatrixRotationYawPitchRoll(&m[2], D3DX_PI / 3.0f, D3DX_PI / 4.0f, D3DX_PI / 5.0f); D3DXMatrixRotationZ(&m[3], D3DX_PI / 6.0f); for (l = 0; l < 2; l++) { if (l == 0) out_temp = out; else out_temp = in; for (j = 0; j < ARRAY_SIZE(m); ++j) { for (order = 0; order <= D3DXSH_MAXORDER; order++) { for (i = 0; i < ARRAY_SIZE(out); ++i) { out[i] = ( i + 1.0f ) * ( i + 1.0f ); in[i] = i + 1.01f; } received_ptr = D3DXSHRotate(out_temp, order, &m[j], in); ok(received_ptr == out_temp, "Order %u, expected %p, received %p.\n", order, out, received_ptr); for (i = 0; i < ARRAY_SIZE(out); ++i) { if ((i > 0) && ((i >= order * order) || (order > D3DXSH_MAXORDER))) { if (l == 0) expected = ( i + 1.0f ) * ( i + 1.0f ); else expected = i + 1.01f; } else if ((l == 0) || (order > 3)) expected = table[45 * j + i]; else expected = table[45 * j + 36 +i]; equal = compare_float(out_temp[i], expected, 4096); ok(equal, "Order %u index %u, expected %.8e, received %.8e.\n", order, i, expected, out_temp[i]); } } } } } static void test_D3DXSHRotateZ(void) { float expected, in[49], out[49], *out_temp, *received_ptr; unsigned int end, i, j, l, order, square; BOOL equal; static const float angle[] = {D3DX_PI / 3.0f, -D3DX_PI / 3.0f, 4.0f * D3DX_PI / 3.0f}; static const float table[] = { /* Angle π/3. */ 1.00999999e+00f, 4.47776222e+00f, 3.00999999e+00f, 2.64288902e-01f, 5.29788828e+00f, 9.94186401e+00f, 7.01000023e+00f, -1.19981313e+00f, -8.84378910e+00f, -1.00100021e+01f, 7.49403954e+00f, 1.81380157e+01f, 1.30100002e+01f, -3.39596605e+00f, -1.70399418e+01f, -1.60099983e+01f, -3.01642971e+01f, -1.80100040e+01f, 1.04222422e+01f, 2.90662193e+01f, 2.10100002e+01f, -6.32417059e+00f, -2.79681454e+01f, -2.40099983e+01f, 2.22609901e+00f, -1.81805649e+01f, -4.38245506e+01f, -2.80100040e+01f, 1.40824928e+01f, 4.27264709e+01f, 3.10100002e+01f, -9.98442554e+00f, -4.16283989e+01f, -3.40099945e+01f, 5.88635778e+00f, 4.05303307e+01f, 1.00999999e+00f, 4.47776222e+00f, 0.00000000e+00f, -5.81678391e+00f, 5.29788828e+00f, 6.93686390e+00f, 0.00000000e+00f, -9.01125050e+00f, -2.29405236e+00f, -1.00100021e+01f, 1.29990416e+01f, 1.21330166e+01f, 0.00000000e+00f, -1.57612505e+01f, -5.62874842e+00f, 0.00000000e+00f, -3.01642971e+01f, -3.29017075e-06f, 1.99272442e+01f, 1.90612202e+01f, 0.00000000e+00f, -2.47612514e+01f, -8.62874794e+00f, 0.00000000e+00f, -1.30615301e+01f, -1.81805649e+01f, -3.03195534e+01f, -4.66050415e-06f, 2.85874958e+01f, 2.77214737e+01f, 0.00000000e+00f, -3.60112534e+01f, -1.23787460e+01f, 0.00000000e+00f, -1.31287584e+01f, -2.36172504e+01f, 1.00999999e+00f, 3.97776222e+00f, 3.97776222e+00f, 1.11419535e+00f, 7.24579096e+00f, 1.05597591e+01f, 1.05597591e+01f, -9.95159924e-01f, -4.67341393e-01f, 4.67339337e-01f, 1.27653713e+01f, 1.85157013e+01f, 1.85157013e+01f, -1.79728663e+00f, 4.93915796e-01f, -4.93915856e-01f, -2.14123421e+01f, 2.14123383e+01f, 9.22107220e+00f, 2.36717567e+01f, 2.36717567e+01f, 3.85019469e+00f, -2.04687271e+01f, 2.04687233e+01f, -1.06621027e+01f, -3.65166283e+01f, -1.20612450e+01f, 1.20612402e+01f, 2.25568752e+01f, 3.89999084e+01f, 3.89999084e+01f, -3.48751247e-02f, -1.04279022e+01f, 1.04279003e+01f, -3.68382835e+01f, -2.76528034e+01f, /* Angle -π/3. */ 1.00999999e+00f, -2.46776247e+00f, 3.00999999e+00f, 3.74571109e+00f, -1.03078899e+01f, -3.93186426e+00f, 7.01000023e+00f, 9.20981312e+00f, -1.66213632e-01f, -1.00099983e+01f, -1.85040436e+01f, -6.12801695e+00f, 1.30100002e+01f, 1.74059658e+01f, 2.02993774e+00f, -1.60100021e+01f, 1.31543026e+01f, -1.80099964e+01f, -2.94322472e+01f, -9.05622101e+00f, 2.10100002e+01f, 2.83341694e+01f, 4.95813942e+00f, -2.40100021e+01f, -2.72360916e+01f, 4.41905823e+01f, 1.68145580e+01f, -2.80099964e+01f, -4.30924988e+01f, -1.27164736e+01f, 3.10100002e+01f, 4.19944229e+01f, 8.61839294e+00f, -3.40100021e+01f, -4.08963470e+01f, -4.52030993e+00f, 1.00999999e+00f, -2.46776247e+00f, 0.00000000e+00f, -3.20571756e+00f, -1.03078899e+01f, -6.93686390e+00f, 0.00000000e+00f, -9.01125050e+00f, -4.46344614e+00f, -1.00099983e+01f, -1.29990416e+01f, -1.21330166e+01f, 0.00000000e+00f, -1.57612505e+01f, -5.62874842e+00f, 0.00000000e+00f, 1.31543026e+01f, 3.29017075e-06f, -1.99272442e+01f, -1.90612202e+01f, 0.00000000e+00f, -2.47612514e+01f, -8.62874794e+00f, 0.00000000e+00f, -5.69598293e+00f, 4.41905823e+01f, 3.03195534e+01f, 4.66050415e-06f, -2.85874958e+01f, -2.77214737e+01f, 0.00000000e+00f, -3.60112534e+01f, -1.23787460e+01f, 0.00000000e+00f, -1.31287584e+01f, -5.74052582e+01f, 1.00999999e+00f, -2.96776223e+00f, -2.96776223e+00f, -6.09195352e-01f, -7.49829102e+00f, -1.06860094e+01f, -1.06860094e+01f, -1.18367157e+01f, 5.39078045e+00f, -5.39077854e+00f, -1.03036509e+01f, -1.72848415e+01f, -1.72848415e+01f, -1.75656433e+01f, 4.11427259e+00f, -4.11427307e+00f, 2.37164364e+01f, -2.37164326e+01f, -8.06902504e+00f, -2.30957317e+01f, -2.30957317e+01f, -1.85358467e+01f, -1.12711067e+01f, 1.12711039e+01f, -2.07248449e+00f, 3.01493301e+01f, 1.52448931e+01f, -1.52448883e+01f, -2.09650497e+01f, -3.82039986e+01f, -3.82039986e+01f, -3.72582664e+01f, 5.42667723e+00f, -5.42667913e+00f, -2.33967514e+01f, -9.90355873e+00f, /* Angle 4π/3. */ 1.00999999e+00f, -4.47776222e+00f, 3.00999999e+00f, -2.64288664e-01f, 5.29788685e+00f, -9.94186401e+00f, 7.01000023e+00f, 1.19981360e+00f, -8.84378815e+00f, 1.00100040e+01f, 7.49403811e+00f, -1.81380157e+01f, 1.30100002e+01f, 3.39596677e+00f, -1.70399399e+01f, 1.60099964e+01f, -3.01642933e+01f, 1.80100060e+01f, 1.04222393e+01f, -2.90662193e+01f, 2.10100002e+01f, 6.32417202e+00f, -2.79681435e+01f, 2.40099926e+01f, 2.22610497e+00f, 1.81805515e+01f, -4.38245430e+01f, 2.80100079e+01f, 1.40824890e+01f, -4.27264709e+01f, 3.10100002e+01f, 9.98442745e+00f, -4.16283989e+01f, 3.40099869e+01f, 5.88636589e+00f, -4.05303268e+01f, 1.00999999e+00f, -4.47776222e+00f, 0.00000000e+00f, -1.93892837e+00f, 5.29788685e+00f, -6.93686390e+00f, 0.00000000e+00f, -3.00375080e+00f, -2.29405141e+00f, 1.00100040e+01f, 1.29990396e+01f, -1.21330166e+01f, 0.00000000e+00f, -5.25375128e+00f, -5.62874699e+00f, -5.68378528e-06f, -3.01642933e+01f, 7.00829787e-06f, 1.99272423e+01f, -1.90612202e+01f, 0.00000000e+00f, -8.25375271e+00f, -8.62874603e+00f, -4.09131496e-12f, -1.30615349e+01f, 1.81805515e+01f, -3.03195534e+01f, 9.92720470e-06f, 2.85874920e+01f, -2.77214737e+01f, 0.00000000e+00f, -1.20037527e+01f, -1.23787422e+01f, -5.79531909e-12f, -1.31287651e+01f, -7.87240028e+00f, 1.00999999e+00f, -3.97776222e+00f, -3.97776222e+00f, 2.86356640e+00f, 6.37110424e+00f, -1.01224155e+01f, -1.01224155e+01f, 1.05787458e+01f, -7.76929522e+00f, -7.76928997e+00f, 1.68836861e+01f, -2.05748577e+01f, -2.05748577e+01f, 2.49091301e+01f, -5.72616625e+00f, -5.72616386e+00f, -1.87962208e+01f, -1.87962112e+01f, 2.93253498e+01f, -3.37238922e+01f, -3.37238922e+01f, 4.22584419e+01f, -4.85123205e+00f, -4.85122633e+00f, -2.53339314e+00f, 3.24522591e+01f, -4.65456696e+01f, -4.65456543e+01f, 5.18603249e+01f, -5.36516304e+01f, -5.36516304e+01f, 7.17381744e+01f, 4.44061565e+00f, 4.44062901e+00f, 2.58841743e+01f, -1.07481155e+01f, }; for (l = 0; l < 3; l++) { if (l == 0) out_temp = out; else out_temp = &in[l - 1]; if (l < 2) end = 49; else end = 48; for (j = 0; j < ARRAY_SIZE(angle); ++j) { for (order = 0; order <= D3DXSH_MAXORDER + 1; order++) { for (i = 0; i < ARRAY_SIZE(out); ++i) { out[i] = ( i + 1.0f ) * ( i + 1.0f ); in[i] = i + 1.01f; } received_ptr = D3DXSHRotateZ(out_temp, order, angle[j], in); ok(received_ptr == out_temp, "angle %f, order %u, expected %p, received %p\n", angle[j], order, out_temp, received_ptr); for (i = 0; i < end; i++) { /* order = 0 or order = 1 behaves like order = D3DXSH_MINORDER */ square = (order <= D3DXSH_MINORDER) ? D3DXSH_MINORDER * D3DXSH_MINORDER : order * order; if (i >= square || ((order >= D3DXSH_MAXORDER) && (i >= D3DXSH_MAXORDER * D3DXSH_MAXORDER))) if (l > 0) expected = i + l + 0.01f; else expected = ( i + 1.0f ) * ( i + 1.0f ); else expected = table[36 * (l + 3 * j) + i]; equal = compare_float(expected, out_temp[i], 256); ok(equal || (fabs(expected) < 2.0e-5f && fabs(out_temp[i]) < 2.0e-5f), "angle %.8e, order %u index %u, expected %.8e, received %.8e.\n", angle[j], order, i, expected, out_temp[i]); } } } } } static void test_D3DXSHScale(void) { float a[49], b[49], expected, *received_array; unsigned int i, order; BOOL equal; for (i = 0; i < ARRAY_SIZE(a); ++i) { a[i] = i; b[i] = i; } for (order = 0; order <= D3DXSH_MAXORDER + 1; order++) { received_array = D3DXSHScale(b, order, a, 5.0f); ok(received_array == b, "Expected %p, received %p\n", b, received_array); for (i = 0; i < ARRAY_SIZE(b); ++i) { if (i < order * order) expected = 5.0f * a[i]; /* D3DXSHScale does not modify the elements of the array after the order * order-th element */ else expected = a[i]; equal = compare_float(b[i], expected, 0); ok(equal, "order %u, element %u, expected %.8e, received %.8e.\n", order, i, expected, b[i]); } } } START_TEST(math) { D3DXColorTest(); D3DXFresnelTest(); D3DXMatrixTest(); D3DXPlaneTest(); D3DXQuaternionTest(); D3DXVector2Test(); D3DXVector3Test(); D3DXVector4Test(); test_matrix_stack(); test_Matrix_AffineTransformation2D(); test_Matrix_Decompose(); test_Matrix_Transformation2D(); test_D3DXVec_Array(); test_D3DXFloat_Array(); test_D3DXSHAdd(); test_D3DXSHDot(); test_D3DXSHEvalConeLight(); test_D3DXSHEvalDirection(); test_D3DXSHEvalDirectionalLight(); test_D3DXSHEvalHemisphereLight(); test_D3DXSHEvalSphericalLight(); test_D3DXSHMultiply2(); test_D3DXSHMultiply3(); test_D3DXSHMultiply4(); test_D3DXSHRotate(); test_D3DXSHRotateZ(); test_D3DXSHScale(); }