Implements D3DRMMatrixfromQuaternion

David.Adam at math.cnrs.fr David.Adam at math.cnrs.fr
Sun Apr 15 18:37:50 CDT 2007


-------------- next part --------------
>From 790f65badfa2d353c16a3f72f143b78d115f55ab Mon Sep 17 00:00:00 2001
From: Adam <David.Adam at math.cnrs.fr>
Date: Sun, 15 Apr 2007 14:26:27 +0200
Subject: [PATCH] [11] Implements D3DRMMatrixFromQuaternion with test.

---
 dlls/d3drm/d3drm.spec     |    2 +-
 dlls/d3drm/math.c         |   12 ++++++++++++
 dlls/d3drm/tests/vector.c |   38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 51 insertions(+), 1 deletions(-)

diff --git a/dlls/d3drm/d3drm.spec b/dlls/d3drm/d3drm.spec
index 19361a9..3b02fa9 100644
--- a/dlls/d3drm/d3drm.spec
+++ b/dlls/d3drm/d3drm.spec
@@ -4,7 +4,7 @@
 @ stub D3DRMColorGetRed
 @ stub D3DRMCreateColorRGB
 @ stub D3DRMCreateColorRGBA
-@ stub D3DRMMatrixFromQuaternion
+@ stdcall D3DRMMatrixFromQuaternion(ptr ptr)
 @ stub D3DRMQuaternionFromRotation
 @ stub D3DRMQuaternionMultiply
 @ stub D3DRMQuaternionSlerp
diff --git a/dlls/d3drm/math.c b/dlls/d3drm/math.c
index 9882464..1fc8b06 100644
--- a/dlls/d3drm/math.c
+++ b/dlls/d3drm/math.c
@@ -31,6 +31,18 @@ #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
 
+/* Matrix for the Rotation that a unit quaternion represents */
+void D3DRMAPI D3DRMMatrixFromQuaternion(D3DRMMATRIX4D m, LPD3DRMQUATERNION q)
+{
+    D3DVALUE w,x,y,z;
+    w=q->s; x=(q->v).x; y=(q->v).y; z=(q->v).z;
+    m[0][0]=1-2*(y*y+z*z); m[1][1]=1-2*(x*x+z*z); m[2][2]=1-2*(x*x+y*y);
+    m[1][0]=2*(x*y+z*w); m[0][1]=2*(x*y-z*w);
+    m[2][0]=2*(x*z-y*w); m[0][2]=2*(x*z+y*w);
+    m[2][1]=2*(y*z+x*w); m[1][2]=2*(y*z-x*w);
+    m[3][0]=0; m[3][1]=0; m[3][2]=0; m[0][3]=0; m[1][3]=0; m[2][3]=0; m[3][3]=1;
+}
+
 /* Add Two Vectors */
 LPD3DVECTOR D3DRMAPI D3DRMVectorAdd(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
 {
diff --git a/dlls/d3drm/tests/vector.c b/dlls/d3drm/tests/vector.c
index 0e38b7d..9be0b53 100644
--- a/dlls/d3drm/tests/vector.c
+++ b/dlls/d3drm/tests/vector.c
@@ -27,6 +27,22 @@ #define expect_vec(expectedvec,gotvec) \
   "Expected Vector= (%f, %f, %f)\n , Got Vector= (%f, %f, %f)\n", \
   expectedvec.x,expectedvec.y,expectedvec.z, gotvec.x, gotvec.y, gotvec.z);
 
+#define expect_mat( expectedmat, gotmat)\
+{ \
+   int i,j,equal=1; \
+    for (i=0; i<4; i++)\
+        {\
+         for (j=0; j<4; j++)\
+             {\
+              if (fabs(expectedmat[i][j]-gotmat[i][j])>0.000001)\
+                 {\
+                  equal=0;\
+                 }\
+             }\
+        }\
+    ok(equal, "Expected matrix=\n(%f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n)\n\n Got matrix=\n(%f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f\n %f,%f,%f,%f)\n",expectedmat[0][0],expectedmat[0][1],expectedmat[0][2],expectedmat[0][3],expectedmat[1][0],expectedmat[1][1],expectedmat[1][2],expectedmat[1][3],expectedmat[2][0],expectedmat[2][1],expectedmat[2][2],expectedmat[2][3],expectedmat[3][0],expectedmat[3][1],expectedmat[3][2],expectedmat[3][3],gotmat[0][0],gotmat[0][1],gotmat[0][2],gotmat[0][3],gotmat[1][0],gotmat[1][1],gotmat[1][2],gotmat[1][3],gotmat[2][0],gotmat[2][1],gotmat[2][2],gotmat[2][3],gotmat[3][0],gotmat[3][1],gotmat[3][2],gotmat[3][3]);\
+}\
+
 static LPD3DVECTOR (D3DRMAPI *pD3DRMVectorAdd)(LPD3DVECTOR,LPD3DVECTOR,LPD3DVECTOR);
 static LPD3DVECTOR (D3DRMAPI *pD3DRMVectorCrossProduct)(LPD3DVECTOR,LPD3DVECTOR,LPD3DVECTOR);
 static D3DVALUE (D3DRMAPI *pD3DRMVectorDotProduct)(LPD3DVECTOR,LPD3DVECTOR);
@@ -36,6 +52,8 @@ static LPD3DVECTOR (D3DRMAPI *pD3DRMVect
 static LPD3DVECTOR (D3DRMAPI *pD3DRMVectorScale)(LPD3DVECTOR,LPD3DVECTOR,D3DVALUE);
 static LPD3DVECTOR (D3DRMAPI *pD3DRMVectorSubtract)(LPD3DVECTOR,LPD3DVECTOR,LPD3DVECTOR);
 
+static void (D3DRMAPI *pD3DRMMatrixFromQuaternion)(D3DRMMATRIX4D, LPD3DRMQUATERNION);
+
 static void init_function_pointers(void)
 {
     HMODULE hmod = LoadLibraryA("d3drm.dll");
@@ -54,6 +72,8 @@ static void init_function_pointers(void)
     pD3DRMVectorReflect = (void*)GetProcAddress(hmod, "D3DRMVectorReflect");
     pD3DRMVectorScale = (void*)GetProcAddress(hmod, "D3DRMVectorScale");
     pD3DRMVectorSubtract = (void*)GetProcAddress(hmod, "D3DRMVectorSubtract");
+
+     pD3DRMMatrixFromQuaternion = (void*)GetProcAddress(hmod, "D3DRMMatrixFromQuaternion");
 }
 
 static void VectorTest(void)
@@ -127,8 +147,26 @@ static void VectorTest(void)
               }
 }
 
+static void MatrixTest(void)
+{
+    D3DRMQUATERNION q;
+    D3DRMMATRIX4D exp,mat;
+
+    exp[0][0]=-49; exp[0][1]=4;   exp[0][2]=22;  exp[0][3]=0;
+    exp[1][0]=20;  exp[1][1]=-39; exp[1][2]=20;  exp[1][3]=0;
+    exp[2][0]=10;  exp[2][1]=28;  exp[2][2]=-25; exp[2][3]=0;
+    exp[3][0]=0;   exp[3][1]=0;   exp[3][2]=0;   exp[3][3]=1;
+    q.s=1; q.v.x=2; q.v.y=3; q.v.z=4;
+
+   pD3DRMMatrixFromQuaternion(mat,&q);
+   todo_wine {
+              expect_mat(exp,mat);
+             }
+}
+
 START_TEST(vector)
 {
    init_function_pointers();
    VectorTest();
+   MatrixTest();
 }
-- 
1.4.2



More information about the wine-patches mailing list