David Adam : d3drm: Implement D3DRMMatrixFromQuaternion.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Apr 23 14:26:23 CDT 2007


Module: wine
Branch: master
Commit: f13c45f4dc71a4faa59707012a79ab0270d33537
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f13c45f4dc71a4faa59707012a79ab0270d33537

Author: David Adam <David.Adam at math.cnrs.fr>
Date:   Thu Apr 19 21:12:40 2007 +0200

d3drm: Implement D3DRMMatrixFromQuaternion.

---

 dlls/d3drm/d3drm.spec     |    2 +-
 dlls/d3drm/math.c         |   26 ++++++++++++++++++++++++++
 dlls/d3drm/tests/vector.c |   43 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/dlls/d3drm/d3drm.spec b/dlls/d3drm/d3drm.spec
index c907bab..a8133ab 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
 @ stdcall D3DRMQuaternionMultiply(ptr ptr ptr)
 @ stub D3DRMQuaternionSlerp
diff --git a/dlls/d3drm/math.c b/dlls/d3drm/math.c
index 02dd965..714f35f 100644
--- a/dlls/d3drm/math.c
+++ b/dlls/d3drm/math.c
@@ -44,6 +44,32 @@ LPD3DRMQUATERNION WINAPI D3DRMQuaternionMultiply(LPD3DRMQUATERNION q, LPD3DRMQUA
     return q;
 }
 
+/* Matrix for the Rotation that a unit quaternion represents */
+void WINAPI 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.0-2.0*(y*y+z*z);
+    m[1][1] = 1.0-2.0*(x*x+z*z);
+    m[2][2] = 1.0-2.0*(x*x+y*y);
+    m[1][0] = 2.0*(x*y+z*w);
+    m[0][1] = 2.0*(x*y-z*w);
+    m[2][0] = 2.0*(x*z-y*w);
+    m[0][2] = 2.0*(x*z+y*w);
+    m[2][1] = 2.0*(y*z+x*w);
+    m[1][2] = 2.0*(y*z-x*w);
+    m[3][0] = 0.0;
+    m[3][1] = 0.0;
+    m[3][2] = 0.0;
+    m[0][3] = 0.0;
+    m[1][3] = 0.0;
+    m[2][3] = 0.0;
+    m[3][3] = 1.0;
+}
+
 /* Add Two Vectors */
 LPD3DVECTOR WINAPI D3DRMVectorAdd(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
 {
diff --git a/dlls/d3drm/tests/vector.c b/dlls/d3drm/tests/vector.c
index 9f89893..b71805b 100644
--- a/dlls/d3drm/tests/vector.c
+++ b/dlls/d3drm/tests/vector.c
@@ -25,12 +25,37 @@
 #define PI (4*atan(1.0))
 #define admit_error 0.000001
 
+#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])>admit_error)\
+                 {\
+                  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] ); \
+}
+
 #define expect_vec(expectedvec,gotvec) \
   ok( ((fabs(expectedvec.x-gotvec.x)<admit_error)&&(fabs(expectedvec.y-gotvec.y)<admit_error)&&(fabs(expectedvec.z-gotvec.z)<admit_error)), \
   "Expected Vector= (%f, %f, %f)\n , Got Vector= (%f, %f, %f)\n", \
   expectedvec.x,expectedvec.y,expectedvec.z, gotvec.x, gotvec.y, gotvec.z);
 
-void VectorTest(void)
+static void VectorTest(void)
 {
     D3DVALUE mod,par,theta;
     D3DVECTOR e,r,u,v,w,axis,casnul,norm,ray;
@@ -101,7 +126,23 @@ void VectorTest(void)
     expect_vec(e,r);
 }
 
+static void MatrixTest(void)
+{
+    D3DRMQUATERNION q;
+    D3DRMMATRIX4D exp,mat;
+
+    exp[0][0]=-49.0; exp[0][1]=4.0;   exp[0][2]=22.0;  exp[0][3]=0.0;
+    exp[1][0]=20.0;  exp[1][1]=-39.0; exp[1][2]=20.0;  exp[1][3]=0.0;
+    exp[2][0]=10.0;  exp[2][1]=28.0;  exp[2][2]=-25.0; exp[2][3]=0.0;
+    exp[3][0]=0.0;   exp[3][1]=0.0;   exp[3][2]=0.0;   exp[3][3]=1.0;
+    q.s=1.0; q.v.x=2.0; q.v.y=3.0; q.v.z=4.0;
+
+   D3DRMMatrixFromQuaternion(mat,&q);
+   expect_mat(exp,mat);
+}
+
 START_TEST(vector)
 {
     VectorTest();
+    MatrixTest();
 }




More information about the wine-cvs mailing list