David Adam : d3drm: The input quaternions are not changed when calling D3DRMQuaternionSlerp.

Alexandre Julliard julliard at winehq.org
Mon Jan 11 15:59:34 CST 2010


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

Author: David Adam <david.adam.cnrs at gmail.com>
Date:   Sun Jan 10 21:19:05 2010 +0100

d3drm: The input quaternions are not changed when calling D3DRMQuaternionSlerp.

---

 dlls/d3drm/math.c         |    6 ++++--
 dlls/d3drm/tests/vector.c |    9 ++++++++-
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/dlls/d3drm/math.c b/dlls/d3drm/math.c
index d3156fc..aed6690 100644
--- a/dlls/d3drm/math.c
+++ b/dlls/d3drm/math.c
@@ -128,6 +128,7 @@ LPD3DRMQUATERNION WINAPI D3DRMQuaternionFromRotation(LPD3DRMQUATERNION q, LPD3DV
 LPD3DRMQUATERNION WINAPI D3DRMQuaternionSlerp(LPD3DRMQUATERNION q, LPD3DRMQUATERNION a, LPD3DRMQUATERNION b, D3DVALUE alpha)
 {
     D3DVALUE dot, epsilon, temp, theta, u;
+    D3DVECTOR v1, v2;
 
     dot = a->s * b->s + D3DRMVectorDotProduct(&a->v, &b->v);
     epsilon = 1.0f;
@@ -145,8 +146,9 @@ LPD3DRMQUATERNION WINAPI D3DRMQuaternionSlerp(LPD3DRMQUATERNION q, LPD3DRMQUATER
         u = sin(theta * alpha) / sin(theta);
     }
     q->s = temp * a->s + epsilon * u * b->s;
-    D3DRMVectorAdd(&q->v, D3DRMVectorScale(&a->v, &a->v, temp),
-                   D3DRMVectorScale(&b->v, &b->v, epsilon * u));
+    D3DRMVectorScale(&v1, &a->v, temp);
+    D3DRMVectorScale(&v2, &b->v, epsilon * u);
+    D3DRMVectorAdd(&q->v, &v1, &v2);
     return q;
 }
 
diff --git a/dlls/d3drm/tests/vector.c b/dlls/d3drm/tests/vector.c
index fbc8cc1..1961fe0 100644
--- a/dlls/d3drm/tests/vector.c
+++ b/dlls/d3drm/tests/vector.c
@@ -243,7 +243,7 @@ static void QuaternionTest(void)
 {
     D3DVECTOR axis;
     D3DVALUE par,theta;
-    D3DRMQUATERNION q,q1,q2,r;
+    D3DRMQUATERNION q,q1,q1final,q2,q2final,r;
 
 /*_________________QuaternionFromRotation___________________*/
     U1(axis).x=1.0f; U2(axis).y=1.0f; U3(axis).z=1.0f;
@@ -275,8 +275,15 @@ static void QuaternionTest(void)
     q1.s=0.1f; U1(q1.v).x=0.2f; U2(q1.v).y=0.3f; U3(q1.v).z=0.4f;
     q2.s=0.5f; U1(q2.v).x=0.6f; U2(q2.v).y=0.7f; U3(q2.v).z=0.8f;
     q.s = 0.243943f; U1(q.v).x = 0.351172f; U2(q.v).y = 0.458401f; U3(q.v).z = 0.565629f;
+
+    q1final=q1;
+    q2final=q2;
     pD3DRMQuaternionSlerp(&r,&q1,&q2,par);
     expect_quat(q,r);
+
+/* Test to show that the input quaternions are not changed */
+    expect_quat(q1,q1final);
+    expect_quat(q2,q2final);
 }
 
 static void ColorTest(void)




More information about the wine-cvs mailing list