2 * Copyright 2007 David Adam
3 * Copyright 2007 Vijay Kiran Kamuju
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
35 /* Product of 2 quaternions */
36 LPD3DRMQUATERNION WINAPI D3DRMQuaternionMultiply(LPD3DRMQUATERNION q, LPD3DRMQUATERNION a, LPD3DRMQUATERNION b)
38 D3DVECTOR cross_product;
39 D3DRMVectorCrossProduct(&cross_product, &a->v, &b->v);
40 q->s = a->s * b->s - D3DRMVectorDotProduct(&a->v, &b->v);
41 q->v.x = a->s * b->v.x + b->s * a->v.x + cross_product.x;
42 q->v.y = a->s * b->v.y + b->s * a->v.y + cross_product.y;
43 q->v.z = a->s * b->v.z + b->s * a->v.z + cross_product.z;
48 LPD3DVECTOR WINAPI D3DRMVectorAdd(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
56 /* Subtract Two Vectors */
57 LPD3DVECTOR WINAPI D3DRMVectorSubtract(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
65 /* Cross Product of Two Vectors */
66 LPD3DVECTOR WINAPI D3DRMVectorCrossProduct(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DVECTOR s2)
68 d->x=s1->y * s2->z - s1->z * s2->y;
69 d->y=s1->z * s2->x - s1->x * s2->z;
70 d->z=s1->x * s2->y - s1->y * s2->x;
74 /* Dot Product of Two vectors */
75 D3DVALUE WINAPI D3DRMVectorDotProduct(LPD3DVECTOR s1, LPD3DVECTOR s2)
78 dot_product=s1->x * s2->x + s1->y * s2->y + s1->z * s2->z;
82 /* Norm of a vector */
83 D3DVALUE WINAPI D3DRMVectorModulus(LPD3DVECTOR v)
86 result=sqrt(v->x * v->x + v->y * v->y + v->z * v->z);
90 /* Normalize a vector. Returns (1,0,0) if INPUT is the NULL vector. */
91 LPD3DVECTOR WINAPI D3DRMVectorNormalize(LPD3DVECTOR u)
93 D3DVALUE modulus = D3DRMVectorModulus(u);
96 D3DRMVectorScale(u,u,1.0/modulus);
107 /* Returns a random unit vector */
108 LPD3DVECTOR WINAPI D3DRMVectorRandom(LPD3DVECTOR d)
113 D3DRMVectorNormalize(d);
117 /* Reflection of a vector on a surface */
118 LPD3DVECTOR WINAPI D3DRMVectorReflect(LPD3DVECTOR r, LPD3DVECTOR ray, LPD3DVECTOR norm)
121 D3DRMVectorSubtract(r, D3DRMVectorScale(&sca, norm, 2.0*D3DRMVectorDotProduct(ray,norm)), ray);
125 /* Rotation of a vector */
126 LPD3DVECTOR WINAPI D3DRMVectorRotate(LPD3DVECTOR r, LPD3DVECTOR v, LPD3DVECTOR axis, D3DVALUE theta)
128 D3DRMQUATERNION quaternion,quaternion1, quaternion2, quaternion3, resultq;
131 quaternion1.s = cos(theta*.5);
132 quaternion2.s = cos(theta*.5);
133 NORM = *D3DRMVectorNormalize(axis);
134 D3DRMVectorScale(&quaternion1.v, &NORM, sin(theta * .5));
135 D3DRMVectorScale(&quaternion2.v, &NORM, -sin(theta * .5));
138 D3DRMQuaternionMultiply(&quaternion, &quaternion1, &quaternion3);
139 D3DRMQuaternionMultiply(&resultq, &quaternion, &quaternion2);
140 *r = *D3DRMVectorNormalize(&resultq.v);
145 LPD3DVECTOR WINAPI D3DRMVectorScale(LPD3DVECTOR d, LPD3DVECTOR s, D3DVALUE factor)