Module: wine Branch: master Commit: 43643072da6a5a22990f73e0ca44a318e29588a1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=43643072da6a5a22990f73e0ca...
Author: David Adam David.Adam@math.cnrs.fr Date: Sun Nov 11 17:16:22 2007 +0100
d3dx8: Implement D3XMatrixInverse.
---
dlls/d3dx8/d3dx8.spec | 2 +- dlls/d3dx8/math.c | 39 +++++++++++++++++++++++++++++++++++++++ dlls/d3dx8/tests/math.c | 15 ++++++++++++++- include/d3dx8math.h | 1 + 4 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx8/d3dx8.spec b/dlls/d3dx8/d3dx8.spec index 3d69e20..391da82 100644 --- a/dlls/d3dx8/d3dx8.spec +++ b/dlls/d3dx8/d3dx8.spec @@ -23,7 +23,7 @@ @ stdcall D3DXMatrixfDeterminant(ptr) @ stdcall D3DXMatrixMultiply(ptr ptr ptr) @ stdcall D3DXMatrixTranspose(ptr ptr) -@ stub D3DXMatrixInverse +@ stdcall D3DXMatrixInverse(ptr ptr ptr) @ stdcall D3DXMatrixScaling(ptr long long long) @ stdcall D3DXMatrixTranslation(ptr long long long) @ stdcall D3DXMatrixRotationX(ptr long) diff --git a/dlls/d3dx8/math.c b/dlls/d3dx8/math.c index e3d565e..6179dde 100644 --- a/dlls/d3dx8/math.c +++ b/dlls/d3dx8/math.c @@ -47,6 +47,45 @@ FLOAT WINAPI D3DXMatrixfDeterminant(CONST D3DXMATRIX *pm) return det; }
+D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONST D3DXMATRIX *pm) +{ + int a, i, j; + D3DXVECTOR4 v, vec[3]; + FLOAT cofactor, det; + + det = D3DXMatrixfDeterminant(pm); + if ( !det ) return NULL; + if ( pdeterminant ) *pdeterminant = det; + for (i=0; i<4; i++) + { + for (j=0; j<4; j++) + { + if (j != i ) + { + a = j; + if ( j > i ) a = a-1; + vec[a].x = pm->u.m[j][0]; + vec[a].y = pm->u.m[j][1]; + vec[a].z = pm->u.m[j][2]; + vec[a].w = pm->u.m[j][3]; + } + } + D3DXVec4Cross(&v, &vec[0], &vec[1], &vec[2]); + for (j=0; j<4; j++) + { + switch(j) + { + case 0: cofactor = v.x; break; + case 1: cofactor = v.y; break; + case 2: cofactor = v.z; break; + case 3: cofactor = v.w; break; + } + pout->u.m[j][i] = pow(-1.0f, i) * cofactor / det; + } + } + return pout; +} + D3DXMATRIX* WINAPI D3DXMatrixLookAtLH(D3DXMATRIX *pout, CONST D3DXVECTOR3 *peye, CONST D3DXVECTOR3 *pat, CONST D3DXVECTOR3 *pup) { D3DXVECTOR3 right, rightn, up, upn, vec, vec2; diff --git a/dlls/d3dx8/tests/math.c b/dlls/d3dx8/tests/math.c index a82c7fe..a796c6e 100644 --- a/dlls/d3dx8/tests/math.c +++ b/dlls/d3dx8/tests/math.c @@ -149,10 +149,11 @@ static void D3DXColorTest(void) static void D3DXMatrixTest(void) { D3DXMATRIX expectedmat, gotmat, mat, mat2, mat3; + LPD3DXMATRIX funcpointer; D3DXQUATERNION q; D3DXVECTOR3 at, axis, eye; BOOL expected, got; - FLOAT angle, expectedfloat, gotfloat; + FLOAT angle, determinant, expectedfloat, gotfloat;
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; @@ -181,6 +182,18 @@ static void D3DXMatrixTest(void) gotfloat = D3DXMatrixfDeterminant(&mat); ok(fabs( gotfloat - expectedfloat ) < admitted_error, "Expected: %f, Got: %f\n", expectedfloat, gotfloat);
+/*____________D3DXMatrixInverse______________*/ + expectedmat.m[0][0] = 16067.0f/73944.0f; expectedmat.m[0][1] = -10165.0f/147888.0f; expectedmat.m[0][2] = -2729.0f/147888.0f; expectedmat.m[0][3] = -1631.0f/49296.0f; + expectedmat.m[1][0] = -565.0f/36972.0f; expectedmat.m[1][1] = 2723.0f/73944.0f; expectedmat.m[1][2] = -1073.0f/73944.0f; expectedmat.m[1][3] = 289.0f/24648.0f; + expectedmat.m[2][0] = -389.0f/2054.0f; expectedmat.m[2][1] = 337.0f/4108.0f; expectedmat.m[2][2] = 181.0f/4108.0f; expectedmat.m[2][3] = 317.0f/4108.0f; + expectedmat.m[3][0] = 163.0f/5688.0f; expectedmat.m[3][1] = -101.0f/11376.0f; expectedmat.m[3][2] = -73.0f/11376.0f; expectedmat.m[3][3] = -127.0f/3792.0f; + expectedfloat = -147888.0f; + D3DXMatrixInverse(&gotmat,&determinant,&mat); + expect_mat(expectedmat,gotmat); + ok(fabs( determinant - expectedfloat ) < admitted_error, "Expected: %f, Got: %f\n", expectedfloat, determinant); + funcpointer = D3DXMatrixInverse(&gotmat,NULL,&mat2); + ok(funcpointer == NULL, "Expected: %p, Got: %p\n", NULL, funcpointer); + /*____________D3DXMatrixIsIdentity______________*/ expected = FALSE; got = D3DXMatrixIsIdentity(&mat3); diff --git a/include/d3dx8math.h b/include/d3dx8math.h index 40081fd..2d236df 100644 --- a/include/d3dx8math.h +++ b/include/d3dx8math.h @@ -260,6 +260,7 @@ typedef struct D3DXCOLOR } D3DXCOLOR, *LPD3DXCOLOR;
FLOAT WINAPI D3DXMatrixfDeterminant(CONST D3DXMATRIX *pm); +D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant, CONST D3DXMATRIX *pm); D3DXMATRIX* WINAPI D3DXMatrixLookAtLH(D3DXMATRIX *pout, CONST D3DXVECTOR3 *peye, CONST D3DXVECTOR3 *pat, CONST D3DXVECTOR3 *pup); D3DXMATRIX* WINAPI D3DXMatrixLookAtRH(D3DXMATRIX *pout, CONST D3DXVECTOR3 *peye, CONST D3DXVECTOR3 *pat, CONST D3DXVECTOR3 *pup); D3DXMATRIX* WINAPI D3DXMatrixMultiply(D3DXMATRIX *pout, CONST D3DXMATRIX *pm1, CONST D3DXMATRIX *pm2);