[PATCH] Implement D3DXMatrixInverse with a test

David Adam David.Adam at math.cnrs.fr
Fri Nov 9 03:42:28 CST 2007


---
 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 1f14d5c..5513ff3 100644
--- a/dlls/d3dx8/math.c
+++ b/dlls/d3dx8/math.c
@@ -44,6 +44,45 @@ FLOAT WINAPI D3DXMatrixfDeterminant(CONST D3DXMATRIX *pm)
     return det;
 }
=20
+D3DXMATRIX* WINAPI D3DXMatrixInverse(D3DXMATRIX *pout, FLOAT *pdeterminant,=
 CONST D3DXMATRIX *pm)
+{
+    int a, i, j;
+    D3DXVECTOR4 v, vec[3];
+    FLOAT cofactor, det;
+
+    det =3D D3DXMatrixfDeterminant(pm);
+    if ( !det ) return NULL;
+    if ( pdeterminant ) *pdeterminant =3D det;
+    for (i=3D0; i<4; i++)
+    {
+     for (j=3D0; j<4; j++)
+     {
+      if (j !=3D i )
+      {
+       a =3D j;
+       if ( j > i ) a =3D a-1;
+       vec[a].x =3D pm->m[j][0];
+       vec[a].y =3D pm->m[j][1];
+       vec[a].z =3D pm->m[j][2];
+       vec[a].w =3D pm->m[j][3];
+      }
+     }
+    D3DXVec4Cross(&v, &vec[0], &vec[1], &vec[2]);
+    for (j=3D0; j<4; j++)
+    {
+     switch(j)
+     {
+      case 0: cofactor =3D v.x; break;
+      case 1: cofactor =3D v.y; break;
+      case 2: cofactor =3D v.z; break;
+      case 3: cofactor =3D v.w; break;
+     }
+    pout->m[j][i] =3D 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 c3cef3b..80fd78b 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;
=20
     U(mat).m[0][1] =3D 5.0f; U(mat).m[0][2] =3D 7.0f; U(mat).m[0][3] =3D 8.=
0f;
     U(mat).m[1][0] =3D 11.0f; U(mat).m[1][2] =3D 16.0f; U(mat).m[1][3] =3D =
33.0f;
@@ -181,6 +182,18 @@ static void D3DXMatrixTest(void)
     gotfloat =3D D3DXMatrixfDeterminant(&mat);
     ok(fabs( gotfloat - expectedfloat ) < admitted_error, "Expected: %f, Go=
t: %f\n", expectedfloat, gotfloat);
=20
+/*____________D3DXMatrixInverse______________*/
+    expectedmat.m[0][0] =3D 16067.0f/73944.0f; expectedmat.m[0][1] =3D -101=
65.0f/147888.0f; expectedmat.m[0][2] =3D -2729.0f/147888.0f; expectedmat.m[0=
][3] =3D -1631.0f/49296.0f;
+    expectedmat.m[1][0] =3D -565.0f/36972.0f; expectedmat.m[1][1] =3D 2723.=
0f/73944.0f; expectedmat.m[1][2] =3D -1073.0f/73944.0f; expectedmat.m[1][3] =
=3D 289.0f/24648.0f;
+    expectedmat.m[2][0] =3D -389.0f/2054.0f; expectedmat.m[2][1] =3D 337.0f=
/4108.0f; expectedmat.m[2][2] =3D 181.0f/4108.0f; expectedmat.m[2][3] =3D 31=
7.0f/4108.0f;
+    expectedmat.m[3][0] =3D 163.0f/5688.0f; expectedmat.m[3][1] =3D -101.0f=
/11376.0f; expectedmat.m[3][2] =3D -73.0f/11376.0f; expectedmat.m[3][3] =3D =
-127.0f/3792.0f;
+    expectedfloat =3D -147888.0f;
+    D3DXMatrixInverse(&gotmat,&determinant,&mat);
+    expect_mat(expectedmat,gotmat);
+    ok(fabs( determinant - expectedfloat ) < admitted_error, "Expected: %f,=
 Got: %f\n", expectedfloat, determinant);
+    funcpointer =3D D3DXMatrixInverse(&gotmat,NULL,&mat2);
+    ok(funcpointer =3D=3D NULL, "Expected: %p, Got: %p\n", NULL, funcpointe=
r);
+
 /*____________D3DXMatrixIsIdentity______________*/
     expected =3D FALSE;
     got =3D D3DXMatrixIsIdentity(&mat3);
diff --git a/include/d3dx8math.h b/include/d3dx8math.h
index bd1dc4f..98b2395 100644
--- a/include/d3dx8math.h
+++ b/include/d3dx8math.h
@@ -59,6 +59,7 @@ typedef struct D3DXCOLOR
 } D3DXCOLOR, *LPD3DXCOLOR;
=20
 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 *p=
m1, CONST D3DXMATRIX *pm2);
--=20
1.5.3.2


--=_1qaruqe56xus--



More information about the wine-patches mailing list