Module: wine Branch: master Commit: 9fa78fd4d7a4259a0575e21d26e1216792ecd2ae URL: http://source.winehq.org/git/wine.git/?a=commit;h=9fa78fd4d7a4259a0575e21d26...
Author: David Adam David.Adam@math.cnrs.fr Date: Thu Apr 19 21:12:00 2007 +0200
d3drm: Implement D3DRMVectorRotate.
---
dlls/d3drm/d3drm.spec | 2 +- dlls/d3drm/math.c | 19 +++++++++++++++++++ dlls/d3drm/tests/vector.c | 18 ++++++++++++++++-- 3 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/dlls/d3drm/d3drm.spec b/dlls/d3drm/d3drm.spec index 1cb0ff7..c907bab 100644 --- a/dlls/d3drm/d3drm.spec +++ b/dlls/d3drm/d3drm.spec @@ -15,7 +15,7 @@ @ stdcall D3DRMVectorNormalize(ptr) @ stdcall D3DRMVectorRandom(ptr) @ stdcall D3DRMVectorReflect(ptr ptr ptr) -@ stub D3DRMVectorRotate +@ stdcall D3DRMVectorRotate(ptr ptr ptr long) @ stdcall D3DRMVectorScale(ptr ptr long) @ stdcall D3DRMVectorSubtract(ptr ptr ptr) @ stub Direct3DRMCreate diff --git a/dlls/d3drm/math.c b/dlls/d3drm/math.c index 1dbff45..02dd965 100644 --- a/dlls/d3drm/math.c +++ b/dlls/d3drm/math.c @@ -122,6 +122,25 @@ LPD3DVECTOR WINAPI D3DRMVectorReflect(LPD3DVECTOR r, LPD3DVECTOR ray, LPD3DVECTO return r; }
+/* Rotation of a vector */ +LPD3DVECTOR WINAPI D3DRMVectorRotate(LPD3DVECTOR r, LPD3DVECTOR v, LPD3DVECTOR axis, D3DVALUE theta) +{ + D3DRMQUATERNION quaternion,quaternion1, quaternion2, quaternion3, resultq; + D3DVECTOR NORM; + + quaternion1.s = cos(theta*.5); + quaternion2.s = cos(theta*.5); + NORM = *D3DRMVectorNormalize(axis); + D3DRMVectorScale(&quaternion1.v, &NORM, sin(theta * .5)); + D3DRMVectorScale(&quaternion2.v, &NORM, -sin(theta * .5)); + quaternion3.s = 0.0; + quaternion3.v = *v; + D3DRMQuaternionMultiply(&quaternion, &quaternion1, &quaternion3); + D3DRMQuaternionMultiply(&resultq, &quaternion, &quaternion2); + *r = *D3DRMVectorNormalize(&resultq.v); + return r; +} + /* Scale a vector */ LPD3DVECTOR WINAPI D3DRMVectorScale(LPD3DVECTOR d, LPD3DVECTOR s, D3DVALUE factor) { diff --git a/dlls/d3drm/tests/vector.c b/dlls/d3drm/tests/vector.c index 88fbaf7..9f89893 100644 --- a/dlls/d3drm/tests/vector.c +++ b/dlls/d3drm/tests/vector.c @@ -32,8 +32,8 @@
void VectorTest(void) { - D3DVALUE mod,par; - D3DVECTOR e,r,u,v,casnul,norm,ray; + D3DVALUE mod,par,theta; + D3DVECTOR e,r,u,v,w,axis,casnul,norm,ray;
u.x=2.0;u.y=2.0;u.z=1.0; v.x=4.0;v.y=4.0;v.z=0.0; @@ -80,6 +80,20 @@ void VectorTest(void) D3DRMVectorReflect(&r,&ray,&norm); expect_vec(e,r);
+/*_______________________VectorRotate_______________________________*/ + w.x=3.0;w.y=4.0;w.z=0.0; + axis.x=0.0;axis.y=0.0;axis.z=1.0; + theta=2.0*PI/3.0; + D3DRMVectorRotate(&r,&w,&axis,theta); + e.x=-0.3-0.4*sqrt(3.0); e.y=0.3*sqrt(3.0)-0.4; e.z=0.0; + expect_vec(e,r); + +/* The same formula gives D3DRMVectorRotate, for theta in [-PI/2;+PI/2] or not. The following test proves this fact.*/ + theta=-PI/4.0; + D3DRMVectorRotate(&r,&w,&axis,-PI/4); + e.x=1.4/sqrt(2.0); e.y=0.2/sqrt(2.0); e.z=0.0; + expect_vec(e,r); + /*_______________________VectorScale__________________________*/ par=2.5; D3DRMVectorScale(&r,&v,par);