Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
0e1a34d2
Commit
0e1a34d2
authored
Apr 30, 2007
by
Francois Gouget
Committed by
Alexandre Julliard
Apr 30, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
d3drm: Fix compilation on systems that don't support nameless unions.
parent
75e5fb93
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
66 additions
and
63 deletions
+66
-63
math.c
dlls/d3drm/math.c
+28
-26
vector.c
dlls/d3drm/tests/vector.c
+38
-37
No files found.
dlls/d3drm/math.c
View file @
0e1a34d2
...
...
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define NONAMELESSUNION
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
...
...
@@ -38,9 +40,9 @@ LPD3DRMQUATERNION WINAPI D3DRMQuaternionMultiply(LPD3DRMQUATERNION q, LPD3DRMQUA
D3DVECTOR
cross_product
;
D3DRMVectorCrossProduct
(
&
cross_product
,
&
a
->
v
,
&
b
->
v
);
q
->
s
=
a
->
s
*
b
->
s
-
D3DRMVectorDotProduct
(
&
a
->
v
,
&
b
->
v
);
q
->
v
.
x
=
a
->
s
*
b
->
v
.
x
+
b
->
s
*
a
->
v
.
x
+
cross_product
.
x
;
q
->
v
.
y
=
a
->
s
*
b
->
v
.
y
+
b
->
s
*
a
->
v
.
y
+
cross_product
.
y
;
q
->
v
.
z
=
a
->
s
*
b
->
v
.
z
+
b
->
s
*
a
->
v
.
z
+
cross_product
.
z
;
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
;
return
q
;
}
...
...
@@ -49,9 +51,9 @@ void WINAPI D3DRMMatrixFromQuaternion(D3DRMMATRIX4D m, LPD3DRMQUATERNION q)
{
D3DVALUE
w
,
x
,
y
,
z
;
w
=
q
->
s
;
x
=
q
->
v
.
x
;
y
=
q
->
v
.
y
;
z
=
q
->
v
.
z
;
x
=
q
->
v
.
u1
.
x
;
y
=
q
->
v
.
u2
.
y
;
z
=
q
->
v
.
u3
.
z
;
m
[
0
][
0
]
=
1
.
0
-
2
.
0
*
(
y
*
y
+
z
*
z
);
m
[
1
][
1
]
=
1
.
0
-
2
.
0
*
(
x
*
x
+
z
*
z
);
m
[
2
][
2
]
=
1
.
0
-
2
.
0
*
(
x
*
x
+
y
*
y
);
...
...
@@ -93,27 +95,27 @@ LPD3DRMQUATERNION WINAPI D3DRMQuaternionSlerp(LPD3DRMQUATERNION q, LPD3DRMQUATER
/* Add Two Vectors */
LPD3DVECTOR
WINAPI
D3DRMVectorAdd
(
LPD3DVECTOR
d
,
LPD3DVECTOR
s1
,
LPD3DVECTOR
s2
)
{
d
->
x
=
s1
->
x
+
s2
->
x
;
d
->
y
=
s1
->
y
+
s2
->
y
;
d
->
z
=
s1
->
z
+
s2
->
z
;
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
;
return
d
;
}
/* Subtract Two Vectors */
LPD3DVECTOR
WINAPI
D3DRMVectorSubtract
(
LPD3DVECTOR
d
,
LPD3DVECTOR
s1
,
LPD3DVECTOR
s2
)
{
d
->
x
=
s1
->
x
-
s2
->
x
;
d
->
y
=
s1
->
y
-
s2
->
y
;
d
->
z
=
s1
->
z
-
s2
->
z
;
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
;
return
d
;
}
/* Cross Product of Two Vectors */
LPD3DVECTOR
WINAPI
D3DRMVectorCrossProduct
(
LPD3DVECTOR
d
,
LPD3DVECTOR
s1
,
LPD3DVECTOR
s2
)
{
d
->
x
=
s1
->
y
*
s2
->
z
-
s1
->
z
*
s2
->
y
;
d
->
y
=
s1
->
z
*
s2
->
x
-
s1
->
x
*
s2
->
z
;
d
->
z
=
s1
->
x
*
s2
->
y
-
s1
->
y
*
s2
->
x
;
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
;
return
d
;
}
...
...
@@ -121,7 +123,7 @@ LPD3DVECTOR WINAPI D3DRMVectorCrossProduct(LPD3DVECTOR d, LPD3DVECTOR s1, LPD3DV
D3DVALUE
WINAPI
D3DRMVectorDotProduct
(
LPD3DVECTOR
s1
,
LPD3DVECTOR
s2
)
{
D3DVALUE
dot_product
;
dot_product
=
s1
->
x
*
s2
->
x
+
s1
->
y
*
s2
->
y
+
s1
->
z
*
s2
->
z
;
dot_product
=
s1
->
u1
.
x
*
s2
->
u1
.
x
+
s1
->
u2
.
y
*
s2
->
u2
.
y
+
s1
->
u3
.
z
*
s2
->
u3
.
z
;
return
dot_product
;
}
...
...
@@ -129,7 +131,7 @@ D3DVALUE WINAPI D3DRMVectorDotProduct(LPD3DVECTOR s1, LPD3DVECTOR s2)
D3DVALUE
WINAPI
D3DRMVectorModulus
(
LPD3DVECTOR
v
)
{
D3DVALUE
result
;
result
=
sqrt
(
v
->
x
*
v
->
x
+
v
->
y
*
v
->
y
+
v
->
z
*
v
->
z
);
result
=
sqrt
(
v
->
u1
.
x
*
v
->
u1
.
x
+
v
->
u2
.
y
*
v
->
u2
.
y
+
v
->
u3
.
z
*
v
->
u3
.
z
);
return
result
;
}
...
...
@@ -143,9 +145,9 @@ LPD3DVECTOR WINAPI D3DRMVectorNormalize(LPD3DVECTOR u)
}
else
{
u
->
x
=
1
.
0
;
u
->
y
=
0
.
0
;
u
->
z
=
0
.
0
;
u
->
u1
.
x
=
1
.
0
;
u
->
u2
.
y
=
0
.
0
;
u
->
u3
.
z
=
0
.
0
;
}
return
u
;
}
...
...
@@ -153,9 +155,9 @@ LPD3DVECTOR WINAPI D3DRMVectorNormalize(LPD3DVECTOR u)
/* Returns a random unit vector */
LPD3DVECTOR
WINAPI
D3DRMVectorRandom
(
LPD3DVECTOR
d
)
{
d
->
x
=
rand
();
d
->
y
=
rand
();
d
->
z
=
rand
();
d
->
u1
.
x
=
rand
();
d
->
u2
.
y
=
rand
();
d
->
u3
.
z
=
rand
();
D3DRMVectorNormalize
(
d
);
return
d
;
}
...
...
@@ -190,8 +192,8 @@ LPD3DVECTOR WINAPI D3DRMVectorRotate(LPD3DVECTOR r, LPD3DVECTOR v, LPD3DVECTOR a
/* Scale a vector */
LPD3DVECTOR
WINAPI
D3DRMVectorScale
(
LPD3DVECTOR
d
,
LPD3DVECTOR
s
,
D3DVALUE
factor
)
{
d
->
x
=
factor
*
s
->
x
;
d
->
y
=
factor
*
s
->
y
;
d
->
z
=
factor
*
s
->
z
;
d
->
u1
.
x
=
factor
*
s
->
u1
.
x
;
d
->
u2
.
y
=
factor
*
s
->
u2
.
y
;
d
->
u3
.
z
=
factor
*
s
->
u3
.
z
;
return
d
;
}
dlls/d3drm/tests/vector.c
View file @
0e1a34d2
...
...
@@ -18,10 +18,11 @@
*/
#include <assert.h>
#include "wine/test.h"
#include "d3drmdef.h"
#include <math.h>
#include "wine/test.h"
#define PI (4*atan(1.0))
#define admit_error 0.000001
...
...
@@ -51,40 +52,40 @@
}
#define expect_quat(expectedquat,gotquat) \
ok( (fabs(
expectedquat.v.x-gotquat.v.x)<admit_error) &&
\
(fabs(
expectedquat.v.y-gotquat.v.y)<admit_error) &&
\
(fabs(
expectedquat.v.z-gotquat.v.z)<admit_error) &&
\
ok( (fabs(
U1(expectedquat.v).x-U1(gotquat.v).x)<admit_error) &&
\
(fabs(
U2(expectedquat.v).y-U2(gotquat.v).y)<admit_error) &&
\
(fabs(
U3(expectedquat.v).z-U3(gotquat.v).z)<admit_error) &&
\
(fabs(expectedquat.s-gotquat.s)<admit_error), \
"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);
expectedquat.s,U1(expectedquat.v).x,U2(expectedquat.v).y,U3(expectedquat.v)
.z, \
gotquat.s,U1(gotquat.v).x,U2(gotquat.v).y,U3(gotquat.v)
.z);
#define expect_vec(expectedvec,gotvec) \
ok( ((fabs(
expectedvec.x-gotvec.x)<admit_error)&&(fabs(expectedvec.y-gotvec.y)<admit_error)&&(fabs(expectedvec.z-gotvec
.z)<admit_error)), \
ok( ((fabs(
U1(expectedvec).x-U1(gotvec).x)<admit_error)&&(fabs(U2(expectedvec).y-U2(gotvec).y)<admit_error)&&(fabs(U3(expectedvec).z-U3(gotvec)
.z)<admit_error)), \
"Expected Vector= (%f, %f, %f)\n , Got Vector= (%f, %f, %f)\n", \
expectedvec.x,expectedvec.y,expectedvec.z, gotvec.x, gotvec.y, gotvec
.z);
U1(expectedvec).x,U2(expectedvec).y,U3(expectedvec).z, U1(gotvec).x, U2(gotvec).y, U3(gotvec)
.z);
static
void
VectorTest
(
void
)
{
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
;
U1
(
u
).
x
=
2
.
0
;
U2
(
u
).
y
=
2
.
0
;
U3
(
u
)
.
z
=
1
.
0
;
U1
(
v
).
x
=
4
.
0
;
U2
(
v
).
y
=
4
.
0
;
U3
(
v
)
.
z
=
0
.
0
;
/*______________________VectorAdd_________________________________*/
D3DRMVectorAdd
(
&
r
,
&
u
,
&
v
);
e
.
x
=
6
.
0
;
e
.
y
=
6
.
0
;
e
.
z
=
1
.
0
;
U1
(
e
).
x
=
6
.
0
;
U2
(
e
).
y
=
6
.
0
;
U3
(
e
)
.
z
=
1
.
0
;
expect_vec
(
e
,
r
);
/*_______________________VectorSubtract__________________________*/
D3DRMVectorSubtract
(
&
r
,
&
u
,
&
v
);
e
.
x
=-
2
.
0
;
e
.
y
=-
2
.
0
;
e
.
z
=
1
.
0
;
U1
(
e
).
x
=-
2
.
0
;
U2
(
e
).
y
=-
2
.
0
;
U3
(
e
)
.
z
=
1
.
0
;
expect_vec
(
e
,
r
);
/*_______________________VectorCrossProduct_______________________*/
D3DRMVectorCrossProduct
(
&
r
,
&
u
,
&
v
);
e
.
x
=-
4
.
0
;
e
.
y
=
4
.
0
;
e
.
z
=
0
.
0
;
U1
(
e
).
x
=-
4
.
0
;
U2
(
e
).
y
=
4
.
0
;
U3
(
e
)
.
z
=
0
.
0
;
expect_vec
(
e
,
r
);
/*_______________________VectorDotProduct__________________________*/
...
...
@@ -97,41 +98,41 @@ static void VectorTest(void)
/*_______________________VectorNormalize___________________________*/
D3DRMVectorNormalize
(
&
u
);
e
.
x
=
2
.
0
/
3
.
0
;
e
.
y
=
2
.
0
/
3
.
0
;
e
.
z
=
1
.
0
/
3
.
0
;
U1
(
e
).
x
=
2
.
0
/
3
.
0
;
U2
(
e
).
y
=
2
.
0
/
3
.
0
;
U3
(
e
)
.
z
=
1
.
0
/
3
.
0
;
expect_vec
(
e
,
u
);
/* If u is the NULL vector, MSDN says that the return vector is NULL. In fact, the returned vector is (1,0,0). The following test case prove it. */
casnul
.
x
=
0
.
0
;
casnul
.
y
=
0
.
0
;
casnul
.
z
=
0
.
0
;
U1
(
casnul
).
x
=
0
.
0
;
U2
(
casnul
).
y
=
0
.
0
;
U3
(
casnul
)
.
z
=
0
.
0
;
D3DRMVectorNormalize
(
&
casnul
);
e
.
x
=
1
.
0
;
e
.
y
=
0
.
0
;
e
.
z
=
0
.
0
;
U1
(
e
).
x
=
1
.
0
;
U2
(
e
).
y
=
0
.
0
;
U3
(
e
)
.
z
=
0
.
0
;
expect_vec
(
e
,
casnul
);
/*____________________VectorReflect_________________________________*/
ray
.
x
=
3
.
0
;
ray
.
y
=-
4
.
0
;
ray
.
z
=
5
.
0
;
norm
.
x
=
1
.
0
;
norm
.
y
=-
2
.
0
;
norm
.
z
=
6
.
0
;
e
.
x
=
79
.
0
;
e
.
y
=-
160
.
0
;
e
.
z
=
487
.
0
;
U1
(
ray
).
x
=
3
.
0
;
U2
(
ray
).
y
=-
4
.
0
;
U3
(
ray
)
.
z
=
5
.
0
;
U1
(
norm
).
x
=
1
.
0
;
U2
(
norm
).
y
=-
2
.
0
;
U3
(
norm
)
.
z
=
6
.
0
;
U1
(
e
).
x
=
79
.
0
;
U2
(
e
).
y
=-
160
.
0
;
U3
(
e
)
.
z
=
487
.
0
;
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
;
U1
(
w
).
x
=
3
.
0
;
U2
(
w
).
y
=
4
.
0
;
U3
(
w
)
.
z
=
0
.
0
;
U1
(
axis
).
x
=
0
.
0
;
U2
(
axis
).
y
=
0
.
0
;
U3
(
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
;
U1
(
e
).
x
=-
0
.
3
-
0
.
4
*
sqrt
(
3
.
0
);
U2
(
e
).
y
=
0
.
3
*
sqrt
(
3
.
0
)
-
0
.
4
;
U3
(
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
;
U1
(
e
).
x
=
1
.
4
/
sqrt
(
2
.
0
);
U2
(
e
).
y
=
0
.
2
/
sqrt
(
2
.
0
);
U3
(
e
)
.
z
=
0
.
0
;
expect_vec
(
e
,
r
);
/*_______________________VectorScale__________________________*/
par
=
2
.
5
;
D3DRMVectorScale
(
&
r
,
&
v
,
par
);
e
.
x
=
10
.
0
;
e
.
y
=
10
.
0
;
e
.
z
=
0
.
0
;
U1
(
e
).
x
=
10
.
0
;
U2
(
e
).
y
=
10
.
0
;
U3
(
e
)
.
z
=
0
.
0
;
expect_vec
(
e
,
r
);
}
...
...
@@ -144,7 +145,7 @@ static void MatrixTest(void)
exp
[
1
][
0
]
=
20
.
0
;
exp
[
1
][
1
]
=-
39
.
0
;
exp
[
1
][
2
]
=
20
.
0
;
exp
[
1
][
3
]
=
0
.
0
;
exp
[
2
][
0
]
=
10
.
0
;
exp
[
2
][
1
]
=
28
.
0
;
exp
[
2
][
2
]
=-
25
.
0
;
exp
[
2
][
3
]
=
0
.
0
;
exp
[
3
][
0
]
=
0
.
0
;
exp
[
3
][
1
]
=
0
.
0
;
exp
[
3
][
2
]
=
0
.
0
;
exp
[
3
][
3
]
=
1
.
0
;
q
.
s
=
1
.
0
;
q
.
v
.
x
=
2
.
0
;
q
.
v
.
y
=
3
.
0
;
q
.
v
.
z
=
4
.
0
;
q
.
s
=
1
.
0
;
U1
(
q
.
v
).
x
=
2
.
0
;
U2
(
q
.
v
).
y
=
3
.
0
;
U3
(
q
.
v
)
.
z
=
4
.
0
;
D3DRMMatrixFromQuaternion
(
mat
,
&
q
);
expect_mat
(
exp
,
mat
);
...
...
@@ -157,10 +158,10 @@ static void QuaternionTest(void)
D3DRMQUATERNION
q
,
q1
,
q2
,
r
;
/*_________________QuaternionFromRotation___________________*/
axis
.
x
=
1
.
0
;
axis
.
y
=
1
.
0
;
axis
.
z
=
1
.
0
;
U1
(
axis
).
x
=
1
.
0
;
U2
(
axis
).
y
=
1
.
0
;
U3
(
axis
)
.
z
=
1
.
0
;
theta
=
2
.
0
*
PI
/
3
.
0
;
D3DRMQuaternionFromRotation
(
&
r
,
&
axis
,
theta
);
q
.
s
=
0
.
5
;
q
.
v
.
x
=
0
.
5
;
q
.
v
.
y
=
0
.
5
;
q
.
v
.
z
=
0
.
5
;
q
.
s
=
0
.
5
;
U1
(
q
.
v
).
x
=
0
.
5
;
U2
(
q
.
v
).
y
=
0
.
5
;
U3
(
q
.
v
)
.
z
=
0
.
5
;
expect_quat
(
q
,
r
);
/*_________________QuaternionSlerp_________________________*/
...
...
@@ -169,28 +170,28 @@ static void QuaternionTest(void)
* interpolates between the first quaternion and the opposite of the second one. The test proves
* these two facts. */
par
=
0
.
31
;
q1
.
s
=
1
.
0
;
q1
.
v
.
x
=
2
.
0
;
q1
.
v
.
y
=
3
.
0
;
q1
.
v
.
z
=
50
.
0
;
q2
.
s
=-
4
.
0
;
q2
.
v
.
x
=
6
.
0
;
q2
.
v
.
y
=
7
.
0
;
q2
.
v
.
z
=
8
.
0
;
q1
.
s
=
1
.
0
;
U1
(
q1
.
v
).
x
=
2
.
0
;
U2
(
q1
.
v
).
y
=
3
.
0
;
U3
(
q1
.
v
)
.
z
=
50
.
0
;
q2
.
s
=-
4
.
0
;
U1
(
q2
.
v
).
x
=
6
.
0
;
U2
(
q2
.
v
).
y
=
7
.
0
;
U3
(
q2
.
v
)
.
z
=
8
.
0
;
/* The angle between q1 and q2 is in [-PI/2,PI/2]. So, one interpolates between q1 and q2. */
epsilon
=
1
.
0
;
g
=
1
.
0
-
par
;
h
=
epsilon
*
par
;
/* Part of the test proving that the interpolation is linear. */
q
.
s
=
g
*
q1
.
s
+
h
*
q2
.
s
;
q
.
v
.
x
=
g
*
q1
.
v
.
x
+
h
*
q2
.
v
.
x
;
q
.
v
.
y
=
g
*
q1
.
v
.
y
+
h
*
q2
.
v
.
y
;
q
.
v
.
z
=
g
*
q1
.
v
.
z
+
h
*
q2
.
v
.
z
;
U1
(
q
.
v
).
x
=
g
*
U1
(
q1
.
v
).
x
+
h
*
U1
(
q2
.
v
)
.
x
;
U2
(
q
.
v
).
y
=
g
*
U2
(
q1
.
v
).
y
+
h
*
U2
(
q2
.
v
)
.
y
;
U3
(
q
.
v
).
z
=
g
*
U3
(
q1
.
v
).
z
+
h
*
U3
(
q2
.
v
)
.
z
;
D3DRMQuaternionSlerp
(
&
r
,
&
q1
,
&
q2
,
par
);
expect_quat
(
q
,
r
);
q1
.
s
=
1
.
0
;
q1
.
v
.
x
=
2
.
0
;
q1
.
v
.
y
=
3
.
0
;
q1
.
v
.
z
=
50
.
0
;
q2
.
s
=-
94
.
0
;
q2
.
v
.
x
=
6
.
0
;
q2
.
v
.
y
=
7
.
0
;
q2
.
v
.
z
=-
8
.
0
;
q1
.
s
=
1
.
0
;
U1
(
q1
.
v
).
x
=
2
.
0
;
U2
(
q1
.
v
).
y
=
3
.
0
;
U3
(
q1
.
v
)
.
z
=
50
.
0
;
q2
.
s
=-
94
.
0
;
U1
(
q2
.
v
).
x
=
6
.
0
;
U2
(
q2
.
v
).
y
=
7
.
0
;
U3
(
q2
.
v
)
.
z
=-
8
.
0
;
/* The angle between q1 and q2 is not in [-PI/2,PI/2]. So, one interpolates between q1 and -q2. */
epsilon
=-
1
.
0
;
g
=
1
.
0
-
par
;
h
=
epsilon
*
par
;
q
.
s
=
g
*
q1
.
s
+
h
*
q2
.
s
;
q
.
v
.
x
=
g
*
q1
.
v
.
x
+
h
*
q2
.
v
.
x
;
q
.
v
.
y
=
g
*
q1
.
v
.
y
+
h
*
q2
.
v
.
y
;
q
.
v
.
z
=
g
*
q1
.
v
.
z
+
h
*
q2
.
v
.
z
;
U1
(
q
.
v
).
x
=
g
*
U1
(
q1
.
v
).
x
+
h
*
U1
(
q2
.
v
)
.
x
;
U2
(
q
.
v
).
y
=
g
*
U2
(
q1
.
v
).
y
+
h
*
U2
(
q2
.
v
)
.
y
;
U3
(
q
.
v
).
z
=
g
*
U3
(
q1
.
v
).
z
+
h
*
U3
(
q2
.
v
)
.
z
;
D3DRMQuaternionSlerp
(
&
r
,
&
q1
,
&
q2
,
par
);
expect_quat
(
q
,
r
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment