David Adam : d3drm: Allow output pointer to be equal to input pointer.

Alexandre Julliard julliard at winehq.org
Mon Feb 16 09:35:39 CST 2009


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

Author: David Adam <david.adam.cnrs at gmail.com>
Date:   Sat Feb 14 14:35:42 2009 +0100

d3drm: Allow output pointer to be equal to input pointer.

---

 dlls/d3drm/math.c         |   58 +++++++++++++++++++++++++++++++--------------
 dlls/d3drm/tests/vector.c |   28 +++++++++++++++++++++-
 2 files changed, 67 insertions(+), 19 deletions(-)

diff --git a/dlls/d3drm/math.c b/dlls/d3drm/math.c
index 8bf5035..2410715 100644
--- a/dlls/d3drm/math.c
+++ b/dlls/d3drm/math.c
@@ -77,12 +77,16 @@ D3DVALUE WINAPI D3DRMColorGetRed(D3DCOLOR color)
 /* Product of 2 quaternions */
 LPD3DRMQUATERNION WINAPI D3DRMQuaternionMultiply(LPD3DRMQUATERNION q, LPD3DRMQUATERNION a, LPD3DRMQUATERNION b)
 {
+    D3DRMQUATERNION temp;
     D3DVECTOR cross_product;
+
     D3DRMVectorCrossProduct(&cross_product, &a->v, &b->v);
-    q->s = a->s * b->s - D3DRMVectorDotProduct(&a->v, &b->v);
-    q->v.u1.x = a->s * b->v.u1.x + b->s * a->v.u1.x + cross_product.u1.x;
-    q->v.u2.y = a->s * b->v.u2.y + b->s * a->v.u2.y + cross_product.u2.y;
-    q->v.u3.z = a->s * b->v.u3.z + b->s * a->v.u3.z + cross_product.u3.z;
+    temp.s = a->s * b->s - D3DRMVectorDotProduct(&a->v, &b->v);
+    temp.v.u1.x = a->s * b->v.u1.x + b->s * a->v.u1.x + cross_product.u1.x;
+    temp.v.u2.y = a->s * b->v.u2.y + b->s * a->v.u2.y + cross_product.u2.y;
+    temp.v.u3.z = a->s * b->v.u3.z + b->s * a->v.u3.z + cross_product.u3.z;
+
+    *q = temp;
     return q;
 }
 
@@ -149,27 +153,39 @@ LPD3DRMQUATERNION WINAPI D3DRMQuaternionSlerp(LPD3DRMQUATERNION q, LPD3DRMQUATER
 /* Add Two Vectors */
 LPD3DVECTOR WINAPI D3DRMVectorAdd(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
 {
-    d->u1.x=s1->u1.x + s2->u1.x;
-    d->u2.y=s1->u2.y + s2->u2.y;
-    d->u3.z=s1->u3.z + s2->u3.z;
+    D3DVECTOR temp;
+
+    temp.u1.x=s1->u1.x + s2->u1.x;
+    temp.u2.y=s1->u2.y + s2->u2.y;
+    temp.u3.z=s1->u3.z + s2->u3.z;
+
+    *d = temp;
     return d;
 }
 
 /* Subtract Two Vectors */
 LPD3DVECTOR WINAPI D3DRMVectorSubtract(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
 {
-    d->u1.x=s1->u1.x - s2->u1.x;
-    d->u2.y=s1->u2.y - s2->u2.y;
-    d->u3.z=s1->u3.z - s2->u3.z;
+    D3DVECTOR temp;
+
+    temp.u1.x=s1->u1.x - s2->u1.x;
+    temp.u2.y=s1->u2.y - s2->u2.y;
+    temp.u3.z=s1->u3.z - s2->u3.z;
+
+    *d = temp;
     return d;
 }
 
 /* Cross Product of Two Vectors */
 LPD3DVECTOR WINAPI D3DRMVectorCrossProduct(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
 {
-    d->u1.x=s1->u2.y * s2->u3.z - s1->u3.z * s2->u2.y;
-    d->u2.y=s1->u3.z * s2->u1.x - s1->u1.x * s2->u3.z;
-    d->u3.z=s1->u1.x * s2->u2.y - s1->u2.y * s2->u1.x;
+    D3DVECTOR temp;
+
+    temp.u1.x=s1->u2.y * s2->u3.z - s1->u3.z * s2->u2.y;
+    temp.u2.y=s1->u3.z * s2->u1.x - s1->u1.x * s2->u3.z;
+    temp.u3.z=s1->u1.x * s2->u2.y - s1->u2.y * s2->u1.x;
+
+    *d = temp;
     return d;
 }
 
@@ -219,8 +235,10 @@ LPD3DVECTOR WINAPI D3DRMVectorRandom(LPD3DVECTOR d)
 /* Reflection of a vector on a surface */
 LPD3DVECTOR WINAPI D3DRMVectorReflect(LPD3DVECTOR r, LPD3DVECTOR ray, LPD3DVECTOR norm)
 {
-    D3DVECTOR sca;
-    D3DRMVectorSubtract(r, D3DRMVectorScale(&sca, norm, 2.0*D3DRMVectorDotProduct(ray,norm)), ray);
+    D3DVECTOR sca, temp;
+    D3DRMVectorSubtract(&temp, D3DRMVectorScale(&sca, norm, 2.0*D3DRMVectorDotProduct(ray,norm)), ray);
+
+    *r = temp;
     return r;
 }
 
@@ -246,8 +264,12 @@ LPD3DVECTOR WINAPI D3DRMVectorRotate(LPD3DVECTOR r, LPD3DVECTOR v, LPD3DVECTOR a
 /* Scale a vector */
 LPD3DVECTOR WINAPI D3DRMVectorScale(LPD3DVECTOR d, LPD3DVECTOR s, D3DVALUE factor)
 {
-    d->u1.x=factor * s->u1.x;
-    d->u2.y=factor * s->u2.y;
-    d->u3.z=factor * s->u3.z;
+    D3DVECTOR temp;
+
+    temp.u1.x=factor * s->u1.x;
+    temp.u2.y=factor * s->u2.y;
+    temp.u3.z=factor * s->u3.z;
+
+    *d = temp;
     return d;
 }
diff --git a/dlls/d3drm/tests/vector.c b/dlls/d3drm/tests/vector.c
index 75c05fc..533523f 100644
--- a/dlls/d3drm/tests/vector.c
+++ b/dlls/d3drm/tests/vector.c
@@ -130,26 +130,42 @@ static BOOL InitFunctionPtrs(void)
 static void VectorTest(void)
 {
     D3DVALUE mod,par,theta;
-    D3DVECTOR e,r,u,v,w,axis,casnul,norm,ray;
+    D3DVECTOR e,r,u,v,w,axis,casnul,norm,ray,self;
 
     U1(u).x=2.0f; U2(u).y=2.0f; U3(u).z=1.0f;
     U1(v).x=4.0f; U2(v).y=4.0f; U3(v).z=0.0f;
 
+
 /*______________________VectorAdd_________________________________*/
     pD3DRMVectorAdd(&r,&u,&v);
     U1(e).x=6.0f; U2(e).y=6.0f; U3(e).z=1.0f;
     expect_vec(e,r);
 
+    U1(self).x=9.0f; U1(self).y=18.0f; U3(self).z=27.0f;
+    pD3DRMVectorAdd(&self,&self,&u);
+    U1(e).x=11.0f; U2(e).y=20.0f; U3(e).z=28.0f;
+    expect_vec(e,self);
+
 /*_______________________VectorSubtract__________________________*/
     pD3DRMVectorSubtract(&r,&u,&v);
     U1(e).x=-2.0f; U2(e).y=-2.0f; U3(e).z=1.0f;
     expect_vec(e,r);
 
+    U1(self).x=9.0f; U1(self).y=18.0f; U3(self).z=27.0f;
+    pD3DRMVectorSubtract(&self,&self,&u);
+    U1(e).x=7.0f; U2(e).y=16.0f; U3(e).z=26.0f;
+    expect_vec(e,self);
+
 /*_______________________VectorCrossProduct_______________________*/
     pD3DRMVectorCrossProduct(&r,&u,&v);
     U1(e).x=-4.0f; U2(e).y=4.0f; U3(e).z=0.0f;
     expect_vec(e,r);
 
+    U1(self).x=9.0f; U1(self).y=18.0f; U3(self).z=27.0f;
+    pD3DRMVectorCrossProduct(&self,&self,&u);
+    U1(e).x=-36.0f; U2(e).y=45.0f; U3(e).z=-18.0f;
+    expect_vec(e,self);
+
 /*_______________________VectorDotProduct__________________________*/
     mod=pD3DRMVectorDotProduct(&u,&v);
     ok((mod == 16.0f), "Expected 16.0f, Got %f\n", mod);
@@ -191,11 +207,21 @@ static void VectorTest(void)
     U1(e).x=1.4f/sqrtf(2.0f); U2(e).y=0.2f/sqrtf(2.0f); U3(e).z=0.0f;
     expect_vec(e,r);
 
+    theta=PI/8.0f;
+    pD3DRMVectorRotate(&self,&self,&axis,theta);
+    U1(e).x=0.989950; U2(e).y=0.141421f; U3(e).z=0.0f;
+    expect_vec(e,r);
+
 /*_______________________VectorScale__________________________*/
     par=2.5f;
     pD3DRMVectorScale(&r,&v,par);
     U1(e).x=10.0f; U2(e).y=10.0f; U3(e).z=0.0f;
     expect_vec(e,r);
+
+    U1(self).x=9.0f; U1(self).y=18.0f; U3(self).z=27.0f;
+    pD3DRMVectorScale(&self,&self,2);
+    U1(e).x=18.0f; U2(e).y=36.0f; U3(e).z=54.0f;
+    expect_vec(e,self);
 }
 
 static void MatrixTest(void)




More information about the wine-cvs mailing list