David Adam : d3dx8: Implement D3XMatrixInverse.
Alexandre Julliard
julliard at winehq.org
Mon Nov 12 06:27:50 CST 2007
Module: wine
Branch: master
Commit: 43643072da6a5a22990f73e0ca44a318e29588a1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=43643072da6a5a22990f73e0ca44a318e29588a1
Author: David Adam <David.Adam at 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);
More information about the wine-cvs
mailing list