Implements D3DRMQuatrenionFromRotation

David.Adam at math.cnrs.fr David.Adam at math.cnrs.fr
Sun Apr 15 18:38:49 CDT 2007


-------------- next part --------------
>From b1d07a3bec22ef46de8be0a6e497c8e1060d94ae Mon Sep 17 00:00:00 2001
From: Adam <David.Adam at math.cnrs.fr>
Date: Sun, 15 Apr 2007 14:32:15 +0200
Subject: [PATCH] [12] Implements D3DRMQuaternionFromRotation with test.
[12] Implements D3DRMQuaternionFromRotation with test.
---
 dlls/d3drm/d3drm.spec     |    2 +-
 dlls/d3drm/math.c         |    8 ++++++++
 dlls/d3drm/tests/vector.c |   27 +++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/dlls/d3drm/d3drm.spec b/dlls/d3drm/d3drm.spec
index 3b02fa9..fd42527 100644
--- a/dlls/d3drm/d3drm.spec
+++ b/dlls/d3drm/d3drm.spec
@@ -5,7 +5,7 @@
 @ stub D3DRMCreateColorRGB
 @ stub D3DRMCreateColorRGBA
 @ stdcall D3DRMMatrixFromQuaternion(ptr ptr)
-@ stub D3DRMQuaternionFromRotation
+@ stdcall D3DRMQuaternionFromRotation(ptr ptr long)
 @ stub D3DRMQuaternionMultiply
 @ stub D3DRMQuaternionSlerp
 @ stdcall D3DRMVectorAdd(ptr ptr ptr)
diff --git a/dlls/d3drm/math.c b/dlls/d3drm/math.c
index 1fc8b06..912870c 100644
--- a/dlls/d3drm/math.c
+++ b/dlls/d3drm/math.c
@@ -43,6 +43,14 @@ void D3DRMAPI D3DRMMatrixFromQuaternion(
     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;
 }
 
+/* Returns a unit quaternion that represents a rotation of an angle around an axis */
+LPD3DRMQUATERNION D3DRMAPI D3DRMQuaternionFromRotation(LPD3DRMQUATERNION q, LPD3DVECTOR v, D3DVALUE theta)
+{
+    q->s=cos(theta/2);
+    D3DRMVectorScale(&(q->v),D3DRMVectorNormalize(v),sin(theta/2));
+    return q;
+}
+
 /* 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 9be0b53..3ea2391 100644
--- a/dlls/d3drm/tests/vector.c
+++ b/dlls/d3drm/tests/vector.c
@@ -22,6 +22,8 @@ #include "wine/test.h"
 #include "d3drmdef.h"
 #include <math.h>
 
+#define PI 4*atan(1.0)
+
 #define expect_vec(expectedvec,gotvec) \
   ok( ((fabs(expectedvec.x-gotvec.x)<0.000001)&&(fabs(expectedvec.y-gotvec.y)<0.000001)&&(fabs(expectedvec.z-gotvec.z)<0.000001)), \
   "Expected Vector= (%f, %f, %f)\n , Got Vector= (%f, %f, %f)\n", \
@@ -43,6 +45,12 @@ #define expect_mat( expectedmat, gotmat)
     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_quat(expectedquat,gotquat) \
+  ok( (fabs(expectedquat.v.x-gotquat.v.x)<0.000001)&&(fabs(expectedquat.v.y-gotquat.v.y)<0.0000001)&&(fabs(expectedquat.v.z-gotquat.v.z)<0.000001)&&(fabs(expectedquat.s-gotquat.s)<0.000001), \
+  "Expected Quaternion %f %f %f %f , Got Quaternion %f %f %f %f\n", \
+  expectedquat.s,expectedquat.v.x,expectedquat.v.y,expectedquat.v.z, \
+  gotquat.s,gotquat.v.x,gotquat.v.y,gotquat.v.z);
+
 static LPD3DVECTOR (D3DRMAPI *pD3DRMVectorAdd)(LPD3DVECTOR,LPD3DVECTOR,LPD3DVECTOR);
 static LPD3DVECTOR (D3DRMAPI *pD3DRMVectorCrossProduct)(LPD3DVECTOR,LPD3DVECTOR,LPD3DVECTOR);
 static D3DVALUE (D3DRMAPI *pD3DRMVectorDotProduct)(LPD3DVECTOR,LPD3DVECTOR);
@@ -54,6 +62,8 @@ static LPD3DVECTOR (D3DRMAPI *pD3DRMVect
 
 static void (D3DRMAPI *pD3DRMMatrixFromQuaternion)(D3DRMMATRIX4D, LPD3DRMQUATERNION);
 
+static LPD3DRMQUATERNION (D3DRMAPI *pD3DRMQuaternionFromRotation)(LPD3DRMQUATERNION,LPD3DVECTOR,D3DVALUE);
+
 static void init_function_pointers(void)
 {
     HMODULE hmod = LoadLibraryA("d3drm.dll");
@@ -164,9 +174,26 @@ static void MatrixTest(void)
              }
 }
 
+static void QuaternionTest(void)
+{
+    D3DVECTOR axis;
+    D3DVALUE theta=2*PI/3;
+    D3DRMQUATERNION q,r;
+
+    axis.x=1.0;axis.y=1.0;axis.z=1.0;
+
+/*_________________QuaternionFromMatrix___________________*/
+    pD3DRMQuaternionFromRotation(&r,&axis,theta);
+    q.s=0.5;q.v.x=0.5;q.v.y=0.5;q.v.z=0.5;
+    todo_wine {
+    expect_quat(q,r);
+              }
+}
+
 START_TEST(vector)
 {
    init_function_pointers();
    VectorTest();
    MatrixTest();
+   QuaternionTest();
 }
-- 
1.4.2



More information about the wine-patches mailing list