2003-02-16 04:01:45 +00:00
|
|
|
#include "global.h"
|
2002-10-28 05:30:45 +00:00
|
|
|
/*
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
File: RageMath
|
|
|
|
|
|
|
|
|
|
Desc: See header.
|
|
|
|
|
|
|
|
|
|
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
|
|
|
|
|
Chris Danford
|
|
|
|
|
Peter S. May (GetHashForString implementation)
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "RageMath.h"
|
|
|
|
|
#include "RageTypes.h"
|
2003-01-08 04:16:39 +00:00
|
|
|
#include <math.h>
|
2002-10-28 05:30:45 +00:00
|
|
|
|
|
|
|
|
void RageVec2Normalize( RageVector2* pOut, const RageVector2* pV )
|
|
|
|
|
{
|
2003-01-08 04:16:39 +00:00
|
|
|
float scale = 1.0f / sqrtf( pV->x*pV->x + pV->y*pV->y );
|
|
|
|
|
pOut->x = pV->x * scale;
|
|
|
|
|
pOut->y = pV->y * scale;
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
2003-03-05 02:52:40 +00:00
|
|
|
void RageVec3Normalize( RageVector3* pOut, const RageVector3* pV )
|
|
|
|
|
{
|
|
|
|
|
float scale = 1.0f / sqrtf( pV->x*pV->x + pV->y*pV->y + pV->z*pV->z );
|
|
|
|
|
pOut->x = pV->x * scale;
|
|
|
|
|
pOut->y = pV->y * scale;
|
|
|
|
|
pOut->z = pV->z * scale;
|
|
|
|
|
}
|
|
|
|
|
|
2002-10-28 05:30:45 +00:00
|
|
|
void RageVec3TransformCoord( RageVector3* pOut, const RageVector3* pV, const RageMatrix* pM )
|
|
|
|
|
{
|
2003-01-08 04:16:39 +00:00
|
|
|
RageVector4 temp( pV->x, pV->y, pV->z, 1.0f );
|
|
|
|
|
RageVec4TransformCoord( &temp, &temp, pM );
|
|
|
|
|
*pOut = RageVector3( temp.x/temp.w, temp.y/temp.w, temp.z/temp.w );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageVec4TransformCoord( RageVector4* pOut, const RageVector4* pV, const RageMatrix* pM )
|
|
|
|
|
{
|
|
|
|
|
const RageMatrix &a = *pM;
|
|
|
|
|
const RageVector4 &v = *pOut;
|
|
|
|
|
*pOut = RageVector4(
|
|
|
|
|
a.m00*v.x+a.m10*v.y+a.m20*v.z+a.m30*v.w,
|
|
|
|
|
a.m01*v.x+a.m11*v.y+a.m21*v.z+a.m31*v.w,
|
|
|
|
|
a.m02*v.x+a.m12*v.y+a.m22*v.z+a.m32*v.w,
|
|
|
|
|
a.m03*v.x+a.m13*v.y+a.m23*v.z+a.m33*v.w );
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageMatrixIdentity( RageMatrix* pOut )
|
|
|
|
|
{
|
2003-01-08 04:16:39 +00:00
|
|
|
*pOut = RageMatrix(
|
|
|
|
|
1,0,0,0,
|
|
|
|
|
0,1,0,0,
|
|
|
|
|
0,0,1,0,
|
|
|
|
|
0,0,0,1 );
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageMatrixMultiply( RageMatrix* pOut, const RageMatrix* pA, const RageMatrix* pB )
|
|
|
|
|
{
|
2003-01-08 04:16:39 +00:00
|
|
|
const RageMatrix &a = *pA;
|
|
|
|
|
const RageMatrix &b = *pB;
|
|
|
|
|
|
|
|
|
|
*pOut = RageMatrix(
|
2003-02-18 07:20:17 +00:00
|
|
|
b.m00*a.m00+b.m01*a.m10+b.m02*a.m20+b.m03*a.m30,
|
|
|
|
|
b.m00*a.m01+b.m01*a.m11+b.m02*a.m21+b.m03*a.m31,
|
|
|
|
|
b.m00*a.m02+b.m01*a.m12+b.m02*a.m22+b.m03*a.m32,
|
|
|
|
|
b.m00*a.m03+b.m01*a.m13+b.m02*a.m23+b.m03*a.m33,
|
|
|
|
|
b.m10*a.m00+b.m11*a.m10+b.m12*a.m20+b.m13*a.m30,
|
|
|
|
|
b.m10*a.m01+b.m11*a.m11+b.m12*a.m21+b.m13*a.m31,
|
|
|
|
|
b.m10*a.m02+b.m11*a.m12+b.m12*a.m22+b.m13*a.m32,
|
|
|
|
|
b.m10*a.m03+b.m11*a.m13+b.m12*a.m23+b.m13*a.m33,
|
|
|
|
|
b.m20*a.m00+b.m21*a.m10+b.m22*a.m20+b.m23*a.m30,
|
|
|
|
|
b.m20*a.m01+b.m21*a.m11+b.m22*a.m21+b.m23*a.m31,
|
|
|
|
|
b.m20*a.m02+b.m21*a.m12+b.m22*a.m22+b.m23*a.m32,
|
|
|
|
|
b.m20*a.m03+b.m21*a.m13+b.m22*a.m23+b.m23*a.m33,
|
|
|
|
|
b.m30*a.m00+b.m31*a.m10+b.m32*a.m20+b.m33*a.m30,
|
|
|
|
|
b.m30*a.m01+b.m31*a.m11+b.m32*a.m21+b.m33*a.m31,
|
|
|
|
|
b.m30*a.m02+b.m31*a.m12+b.m32*a.m22+b.m33*a.m32,
|
|
|
|
|
b.m30*a.m03+b.m31*a.m13+b.m32*a.m23+b.m33*a.m33
|
2003-01-08 04:16:39 +00:00
|
|
|
);
|
|
|
|
|
// phew!
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageMatrixTranslation( RageMatrix* pOut, float x, float y, float z )
|
|
|
|
|
{
|
2002-11-13 03:54:20 +00:00
|
|
|
RageMatrixIdentity(pOut);
|
|
|
|
|
pOut->m[3][0] = x;
|
|
|
|
|
pOut->m[3][1] = y;
|
|
|
|
|
pOut->m[3][2] = z;
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageMatrixScaling( RageMatrix* pOut, float x, float y, float z )
|
|
|
|
|
{
|
2002-11-13 03:54:20 +00:00
|
|
|
RageMatrixIdentity(pOut);
|
|
|
|
|
pOut->m[0][0] = x;
|
|
|
|
|
pOut->m[1][1] = y;
|
|
|
|
|
pOut->m[2][2] = z;
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageMatrixRotationX( RageMatrix* pOut, float theta )
|
2002-11-13 03:54:20 +00:00
|
|
|
{ /* UNTESTED */
|
|
|
|
|
RageMatrixIdentity(pOut);
|
|
|
|
|
pOut->m[1][1] = cosf(theta);
|
|
|
|
|
pOut->m[2][2] = pOut->m[1][1];
|
|
|
|
|
|
|
|
|
|
pOut->m[2][1] = sinf(theta);
|
|
|
|
|
pOut->m[1][2] = -pOut->m[2][1];
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageMatrixRotationY( RageMatrix* pOut, float theta )
|
2002-11-13 03:54:20 +00:00
|
|
|
{ /* UNTESTED */
|
|
|
|
|
RageMatrixIdentity(pOut);
|
|
|
|
|
pOut->m[0][0] = cosf(theta);
|
|
|
|
|
pOut->m[2][2] = pOut->m[0][0];
|
|
|
|
|
|
|
|
|
|
pOut->m[0][2] = sinf(theta);
|
|
|
|
|
pOut->m[2][0] = -pOut->m[0][2];
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RageMatrixRotationZ( RageMatrix* pOut, float theta )
|
|
|
|
|
{
|
2002-11-13 03:54:20 +00:00
|
|
|
RageMatrixIdentity(pOut);
|
|
|
|
|
pOut->m[0][0] = cosf(theta);
|
|
|
|
|
pOut->m[1][1] = pOut->m[0][0];
|
|
|
|
|
|
|
|
|
|
pOut->m[0][1] = sinf(theta);
|
|
|
|
|
pOut->m[1][0] = -pOut->m[0][1];
|
2002-10-28 05:30:45 +00:00
|
|
|
}
|