[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