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:
marauder2k7 2026-03-03 19:09:00 +00:00
parent 67f12311d4
commit bc3145bc55
21 changed files with 1881 additions and 136 deletions

View file

@ -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;