mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-03-19 12:20:57 +00:00
matrix functions
most matrix functions are converted over, no benefit to converting over the project/ortho because they would be scalar anyway but may need to move them regardless.
This commit is contained in:
parent
67f12311d4
commit
bc3145bc55
21 changed files with 1881 additions and 136 deletions
|
|
@ -464,71 +464,26 @@ static void affineInvertTo(const F32 * m, F32 * out)
|
|||
}
|
||||
#endif
|
||||
|
||||
//--------------------------------------
|
||||
static void m_matF_inverse_C(F32 *m)
|
||||
static void m_matF_invert_to_C(const F32* m, F32* d)
|
||||
{
|
||||
// using Cramers Rule find the Inverse
|
||||
// Minv = (1/det(M)) * adjoint(M)
|
||||
F32 det = m_matF_determinant( m );
|
||||
AssertFatal( det != 0.0f, "MatrixF::inverse: non-singular matrix, no inverse.");
|
||||
F32 det = m_matF_determinant(m);
|
||||
AssertFatal(det != 0.0f, "MatrixF::inverse: non-singular matrix, no inverse.");
|
||||
|
||||
F32 invDet = 1.0f/det;
|
||||
F32 temp[16];
|
||||
F32 invDet = 1.0f / det;
|
||||
|
||||
temp[0] = (m[5] * m[10]- m[6] * m[9]) * invDet;
|
||||
temp[1] = (m[9] * m[2] - m[10]* m[1]) * invDet;
|
||||
temp[2] = (m[1] * m[6] - m[2] * m[5]) * invDet;
|
||||
|
||||
temp[4] = (m[6] * m[8] - m[4] * m[10])* invDet;
|
||||
temp[5] = (m[10]* m[0] - m[8] * m[2]) * invDet;
|
||||
temp[6] = (m[2] * m[4] - m[0] * m[6]) * invDet;
|
||||
|
||||
temp[8] = (m[4] * m[9] - m[5] * m[8]) * invDet;
|
||||
temp[9] = (m[8] * m[1] - m[9] * m[0]) * invDet;
|
||||
temp[10]= (m[0] * m[5] - m[1] * m[4]) * invDet;
|
||||
|
||||
m[0] = temp[0];
|
||||
m[1] = temp[1];
|
||||
m[2] = temp[2];
|
||||
|
||||
m[4] = temp[4];
|
||||
m[5] = temp[5];
|
||||
m[6] = temp[6];
|
||||
|
||||
m[8] = temp[8];
|
||||
m[9] = temp[9];
|
||||
m[10] = temp[10];
|
||||
|
||||
// invert the translation
|
||||
temp[0] = -m[3];
|
||||
temp[1] = -m[7];
|
||||
temp[2] = -m[11];
|
||||
m_matF_x_vectorF(m, temp, &temp[4]);
|
||||
m[3] = temp[4];
|
||||
m[7] = temp[5];
|
||||
m[11]= temp[6];
|
||||
}
|
||||
|
||||
static void m_matF_invert_to_C(const F32 *m, F32 *d)
|
||||
{
|
||||
// using Cramers Rule find the Inverse
|
||||
// Minv = (1/det(M)) * adjoint(M)
|
||||
F32 det = m_matF_determinant( m );
|
||||
AssertFatal( det != 0.0f, "MatrixF::inverse: non-singular matrix, no inverse.");
|
||||
|
||||
F32 invDet = 1.0f/det;
|
||||
|
||||
d[0] = (m[5] * m[10]- m[6] * m[9]) * invDet;
|
||||
d[1] = (m[9] * m[2] - m[10]* m[1]) * invDet;
|
||||
d[0] = (m[5] * m[10] - m[6] * m[9]) * invDet;
|
||||
d[1] = (m[9] * m[2] - m[10] * m[1]) * invDet;
|
||||
d[2] = (m[1] * m[6] - m[2] * m[5]) * invDet;
|
||||
|
||||
d[4] = (m[6] * m[8] - m[4] * m[10])* invDet;
|
||||
d[5] = (m[10]* m[0] - m[8] * m[2]) * invDet;
|
||||
d[4] = (m[6] * m[8] - m[4] * m[10]) * invDet;
|
||||
d[5] = (m[10] * m[0] - m[8] * m[2]) * invDet;
|
||||
d[6] = (m[2] * m[4] - m[0] * m[6]) * invDet;
|
||||
|
||||
d[8] = (m[4] * m[9] - m[5] * m[8]) * invDet;
|
||||
d[9] = (m[8] * m[1] - m[9] * m[0]) * invDet;
|
||||
d[10]= (m[0] * m[5] - m[1] * m[4]) * invDet;
|
||||
d[10] = (m[0] * m[5] - m[1] * m[4]) * invDet;
|
||||
|
||||
// invert the translation
|
||||
F32 temp[6];
|
||||
|
|
@ -538,33 +493,13 @@ static void m_matF_invert_to_C(const F32 *m, F32 *d)
|
|||
m_matF_x_vectorF(d, temp, &temp[3]);
|
||||
d[3] = temp[3];
|
||||
d[7] = temp[4];
|
||||
d[11]= temp[5];
|
||||
d[ 12 ] = m[ 12 ];
|
||||
d[ 13 ] = m[ 13 ];
|
||||
d[ 14 ] = m[ 14 ];
|
||||
d[ 15 ] = m[ 15 ];
|
||||
d[11] = temp[5];
|
||||
d[12] = m[12];
|
||||
d[13] = m[13];
|
||||
d[14] = m[14];
|
||||
d[15] = m[15];
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
static void m_matF_affineInverse_C(F32 *m)
|
||||
{
|
||||
// Matrix class checks to make sure this is an affine transform before calling
|
||||
// this function, so we can proceed assuming it is...
|
||||
F32 temp[16];
|
||||
dMemcpy(temp, m, 16 * sizeof(F32));
|
||||
|
||||
// Transpose rotation
|
||||
m[1] = temp[4];
|
||||
m[4] = temp[1];
|
||||
m[2] = temp[8];
|
||||
m[8] = temp[2];
|
||||
m[6] = temp[9];
|
||||
m[9] = temp[6];
|
||||
|
||||
m[3] = -(temp[0]*temp[3] + temp[4]*temp[7] + temp[8]*temp[11]);
|
||||
m[7] = -(temp[1]*temp[3] + temp[5]*temp[7] + temp[9]*temp[11]);
|
||||
m[11] = -(temp[2]*temp[3] + temp[6]*temp[7] + temp[10]*temp[11]);
|
||||
}
|
||||
|
||||
inline void swap(F32 &a, F32 &b)
|
||||
{
|
||||
|
|
@ -633,11 +568,11 @@ static void m_matF_normalize_C(F32 *m)
|
|||
|
||||
|
||||
//--------------------------------------
|
||||
static F32 m_matF_determinant_C(const F32 *m)
|
||||
static F32 m_matF_determinant_C(const F32* m)
|
||||
{
|
||||
return m[0] * (m[5] * m[10] - m[6] * m[9]) +
|
||||
m[4] * (m[2] * m[9] - m[1] * m[10]) +
|
||||
m[8] * (m[1] * m[6] - m[2] * m[5]) ;
|
||||
return m[0] * (m[5] * m[10] - m[6] * m[9]) +
|
||||
m[4] * (m[2] * m[9] - m[1] * m[10]) +
|
||||
m[8] * (m[1] * m[6] - m[2] * m[5]);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -890,13 +825,11 @@ void (*m_quatF_set_matF)( F32 x, F32 y, F32 z, F32 w, F32* m ) = m_quatF_set_mat
|
|||
void (*m_matF_set_euler)(const F32 *e, F32 *result) = m_matF_set_euler_C;
|
||||
void (*m_matF_set_euler_point)(const F32 *e, const F32 *p, F32 *result) = m_matF_set_euler_point_C;
|
||||
void (*m_matF_identity)(F32 *m) = m_matF_identity_C;
|
||||
void (*m_matF_inverse)(F32 *m) = m_matF_inverse_C;
|
||||
void (*m_matF_affineInverse)(F32 *m) = m_matF_affineInverse_C;
|
||||
void (*m_matF_invert_to)(const F32 *m, F32 *d) = m_matF_invert_to_C;
|
||||
void (*m_matF_invert_to)(const F32* m, F32* d) = m_matF_invert_to_C;
|
||||
void (*m_matF_transpose)(F32 *m) = m_matF_transpose_C;
|
||||
void (*m_matF_scale)(F32 *m,const F32* p) = m_matF_scale_C;
|
||||
void (*m_matF_normalize)(F32 *m) = m_matF_normalize_C;
|
||||
F32 (*m_matF_determinant)(const F32 *m) = m_matF_determinant_C;
|
||||
F32(*m_matF_determinant)(const F32* m) = m_matF_determinant_C;
|
||||
void (*m_matF_x_matF)(const F32 *a, const F32 *b, F32 *mresult) = default_matF_x_matF_C;
|
||||
void (*m_matF_x_matF_aligned)(const F32 *a, const F32 *b, F32 *mresult) = default_matF_x_matF_C;
|
||||
// void (*m_matF_x_point3F)(const F32 *m, const F32 *p, F32 *presult) = m_matF_x_point3F_C;
|
||||
|
|
@ -935,13 +868,11 @@ void mInstallLibrary_C()
|
|||
m_matF_set_euler = m_matF_set_euler_C;
|
||||
m_matF_set_euler_point = m_matF_set_euler_point_C;
|
||||
m_matF_identity = m_matF_identity_C;
|
||||
m_matF_inverse = m_matF_inverse_C;
|
||||
m_matF_affineInverse = m_matF_affineInverse_C;
|
||||
m_matF_invert_to = m_matF_invert_to_C;
|
||||
m_matF_invert_to = m_matF_invert_to_C;
|
||||
m_matF_transpose = m_matF_transpose_C;
|
||||
m_matF_scale = m_matF_scale_C;
|
||||
m_matF_normalize = m_matF_normalize_C;
|
||||
m_matF_determinant = m_matF_determinant_C;
|
||||
m_matF_determinant = m_matF_determinant_C;
|
||||
m_matF_x_matF = default_matF_x_matF_C;
|
||||
m_matF_x_matF_aligned = default_matF_x_matF_C;
|
||||
// m_matF_x_point3F = m_matF_x_point3F_C;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue