d3dx8: Implement D3DXQuaternionToAxisAngle.
This commit is contained in:
parent
aa30f442b1
commit
7a4490c062
|
@ -49,7 +49,7 @@
|
||||||
@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long)
|
@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long)
|
||||||
@ stdcall D3DXMatrixShadow(ptr ptr ptr)
|
@ stdcall D3DXMatrixShadow(ptr ptr ptr)
|
||||||
@ stdcall D3DXMatrixReflect(ptr ptr)
|
@ stdcall D3DXMatrixReflect(ptr ptr)
|
||||||
@ stub D3DXQuaternionToAxisAngle
|
@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr)
|
||||||
@ stub D3DXQuaternionRotationMatrix
|
@ stub D3DXQuaternionRotationMatrix
|
||||||
@ stub D3DXQuaternionRotationAxis
|
@ stub D3DXQuaternionRotationAxis
|
||||||
@ stub D3DXQuaternionRotationYawPitchRoll
|
@ stub D3DXQuaternionRotationYawPitchRoll
|
||||||
|
|
|
@ -665,6 +665,27 @@ D3DXQUATERNION* WINAPI D3DXQuaternionSquad(D3DXQUATERNION *pout, CONST D3DXQUATE
|
||||||
return pout;
|
return pout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WINAPI D3DXQuaternionToAxisAngle(CONST D3DXQUATERNION *pq, D3DXVECTOR3 *paxis, FLOAT *pangle)
|
||||||
|
{
|
||||||
|
FLOAT norm;
|
||||||
|
|
||||||
|
*pangle = 0.0f;
|
||||||
|
norm = D3DXQuaternionLength(pq);
|
||||||
|
if ( norm )
|
||||||
|
{
|
||||||
|
paxis->x = pq->x / norm;
|
||||||
|
paxis->y = pq->y / norm;
|
||||||
|
paxis->z = pq->z / norm;
|
||||||
|
if ( fabs( pq->w ) <= 1.0f ) *pangle = 2.0f * acos(pq->w);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
paxis->x = 1.0f;
|
||||||
|
paxis->y = 0.0f;
|
||||||
|
paxis->z = 0.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*_________________D3DXVec2_____________________*/
|
/*_________________D3DXVec2_____________________*/
|
||||||
|
|
||||||
D3DXVECTOR2* WINAPI D3DXVec2BaryCentric(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT f, FLOAT g)
|
D3DXVECTOR2* WINAPI D3DXVec2BaryCentric(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT f, FLOAT g)
|
||||||
|
|
|
@ -552,9 +552,10 @@ static void D3DXPlaneTest(void)
|
||||||
|
|
||||||
static void D3X8QuaternionTest(void)
|
static void D3X8QuaternionTest(void)
|
||||||
{
|
{
|
||||||
D3DXQUATERNION expectedquat, gotquat, nul, q, r, s, t, u;
|
D3DXQUATERNION expectedquat, gotquat, Nq, nul, q, r, s, t, u;
|
||||||
LPD3DXQUATERNION funcpointer;
|
LPD3DXQUATERNION funcpointer;
|
||||||
FLOAT expected, got, scale, scale2;
|
D3DXVECTOR3 axis, expectedvec;
|
||||||
|
FLOAT angle, expected, got, scale, scale2;
|
||||||
BOOL expectedbool, gotbool;
|
BOOL expectedbool, gotbool;
|
||||||
|
|
||||||
nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f; nul.w = 0.0f;
|
nul.x = 0.0f; nul.y = 0.0f; nul.z = 0.0f; nul.w = 0.0f;
|
||||||
|
@ -667,6 +668,26 @@ static void D3X8QuaternionTest(void)
|
||||||
expectedquat.x = -156.296f; expectedquat.y = 30.242f; expectedquat.z = -2.5022f; expectedquat.w = 7.3576f;
|
expectedquat.x = -156.296f; expectedquat.y = 30.242f; expectedquat.z = -2.5022f; expectedquat.w = 7.3576f;
|
||||||
D3DXQuaternionSquad(&gotquat,&q,&r,&t,&u,scale);
|
D3DXQuaternionSquad(&gotquat,&q,&r,&t,&u,scale);
|
||||||
expect_vec4(expectedquat,gotquat);
|
expect_vec4(expectedquat,gotquat);
|
||||||
|
|
||||||
|
/*_______________D3DXQuaternionToAxisAngle__________________*/
|
||||||
|
Nq.x = 1.0f/22.0f; Nq.y = 2.0f/22.0f; Nq.z = 4.0f/22.0f; Nq.w = 10.0f/22.0f;
|
||||||
|
expectedvec.x = 1.0f/11.0f; expectedvec.y = 2.0f/11.0f; expectedvec.z = 4.0f/11.0f;
|
||||||
|
expected = 2.197869f;
|
||||||
|
D3DXQuaternionToAxisAngle(&Nq,&axis,&angle);
|
||||||
|
expect_vec3(expectedvec,axis);
|
||||||
|
ok(fabs( angle - expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, angle);
|
||||||
|
/* Test if |w|>1.0f */
|
||||||
|
expectedvec.x = 1.0f/11.0f; expectedvec.y = 2.0f/11.0f; expectedvec.z = 4.0f/11.0f;
|
||||||
|
expected = 0.0f;
|
||||||
|
D3DXQuaternionToAxisAngle(&q,&axis,&angle);
|
||||||
|
expect_vec3(expectedvec,axis);
|
||||||
|
ok(fabs( angle - expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, angle);
|
||||||
|
/* Test the null quaternion */
|
||||||
|
expectedvec.x = 1.0f; expectedvec.y = 0.0f; expectedvec.z = 0.0f;
|
||||||
|
expected = 0.0f;
|
||||||
|
D3DXQuaternionToAxisAngle(&nul,&axis,&angle);
|
||||||
|
expect_vec3(expectedvec,axis);
|
||||||
|
ok(fabs( angle - expected ) < admitted_error, "Expected: %f, Got: %f\n", expected, angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3X8Vector2Test(void)
|
static void D3X8Vector2Test(void)
|
||||||
|
|
|
@ -308,6 +308,7 @@ D3DXQUATERNION* WINAPI D3DXQuaternionMultiply(D3DXQUATERNION *pout, CONST D3DXQU
|
||||||
D3DXQUATERNION* WINAPI D3DXQuaternionNormalize(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq);
|
D3DXQUATERNION* WINAPI D3DXQuaternionNormalize(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq);
|
||||||
D3DXQUATERNION* WINAPI D3DXQuaternionSlerp(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2, FLOAT t);
|
D3DXQUATERNION* WINAPI D3DXQuaternionSlerp(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2, FLOAT t);
|
||||||
D3DXQUATERNION* WINAPI D3DXQuaternionSquad(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2, CONST D3DXQUATERNION *pq3, CONST D3DXQUATERNION *pq4, FLOAT t);
|
D3DXQUATERNION* WINAPI D3DXQuaternionSquad(D3DXQUATERNION *pout, CONST D3DXQUATERNION *pq1, CONST D3DXQUATERNION *pq2, CONST D3DXQUATERNION *pq3, CONST D3DXQUATERNION *pq4, FLOAT t);
|
||||||
|
void WINAPI D3DXQuaternionToAxisAngle(CONST D3DXQUATERNION *pq, D3DXVECTOR3 *paxis, FLOAT *pangle);
|
||||||
|
|
||||||
D3DXVECTOR2* WINAPI D3DXVec2BaryCentric(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT f, FLOAT g);
|
D3DXVECTOR2* WINAPI D3DXVec2BaryCentric(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT f, FLOAT g);
|
||||||
D3DXVECTOR2* WINAPI D3DXVec2CatmullRom(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv0, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT s);
|
D3DXVECTOR2* WINAPI D3DXVec2CatmullRom(D3DXVECTOR2 *pout, CONST D3DXVECTOR2 *pv0, CONST D3DXVECTOR2 *pv1, CONST D3DXVECTOR2 *pv2, CONST D3DXVECTOR2 *pv3, FLOAT s);
|
||||||
|
|
Loading…
Reference in New Issue