Merge 57db4eeeb0
into ab534333b2
This commit is contained in:
commit
ddbdd7b120
@ -62,6 +62,8 @@ static inline void Mtx_Copy(C3D_Mtx* out, const C3D_Mtx* in)
|
|||||||
void Mtx_Identity(C3D_Mtx* out);
|
void Mtx_Identity(C3D_Mtx* out);
|
||||||
void Mtx_Multiply(C3D_Mtx* out, const C3D_Mtx* a, const C3D_Mtx* b);
|
void Mtx_Multiply(C3D_Mtx* out, const C3D_Mtx* a, const C3D_Mtx* b);
|
||||||
|
|
||||||
|
bool Mtx_Inverse(C3D_Mtx* out);
|
||||||
|
|
||||||
void Mtx_Translate(C3D_Mtx* mtx, float x, float y, float z);
|
void Mtx_Translate(C3D_Mtx* mtx, float x, float y, float z);
|
||||||
void Mtx_Scale(C3D_Mtx* mtx, float x, float y, float z);
|
void Mtx_Scale(C3D_Mtx* mtx, float x, float y, float z);
|
||||||
void Mtx_RotateX(C3D_Mtx* mtx, float angle, bool bRightSide);
|
void Mtx_RotateX(C3D_Mtx* mtx, float angle, bool bRightSide);
|
||||||
|
133
source/maths/mtx_inverse.c
Normal file
133
source/maths/mtx_inverse.c
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
#include <c3d/maths.h>
|
||||||
|
|
||||||
|
bool Mtx_Inverse(C3D_Mtx* out)
|
||||||
|
{
|
||||||
|
float inv[16], det;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
inv[0] = out->m[5] * out->m[10] * out->m[15] -
|
||||||
|
out->m[5] * out->m[11] * out->m[14] -
|
||||||
|
out->m[9] * out->m[6] * out->m[15] +
|
||||||
|
out->m[9] * out->m[7] * out->m[14] +
|
||||||
|
out->m[13] * out->m[6] * out->m[11] -
|
||||||
|
out->m[13] * out->m[7] * out->m[10];
|
||||||
|
|
||||||
|
inv[4] = -out->m[4] * out->m[10] * out->m[15] +
|
||||||
|
out->m[4] * out->m[11] * out->m[14] +
|
||||||
|
out->m[8] * out->m[6] * out->m[15] -
|
||||||
|
out->m[8] * out->m[7] * out->m[14] -
|
||||||
|
out->m[12] * out->m[6] * out->m[11] +
|
||||||
|
out->m[12] * out->m[7] * out->m[10];
|
||||||
|
|
||||||
|
inv[8] = out->m[4] * out->m[9] * out->m[15] -
|
||||||
|
out->m[4] * out->m[11] * out->m[13] -
|
||||||
|
out->m[8] * out->m[5] * out->m[15] +
|
||||||
|
out->m[8] * out->m[7] * out->m[13] +
|
||||||
|
out->m[12] * out->m[5] * out->m[11] -
|
||||||
|
out->m[12] * out->m[7] * out->m[9];
|
||||||
|
|
||||||
|
inv[12] = -out->m[4] * out->m[9] * out->m[14] +
|
||||||
|
out->m[4] * out->m[10] * out->m[13] +
|
||||||
|
out->m[8] * out->m[5] * out->m[14] -
|
||||||
|
out->m[8] * out->m[6] * out->m[13] -
|
||||||
|
out->m[12] * out->m[5] * out->m[10] +
|
||||||
|
out->m[12] * out->m[6] * out->m[9];
|
||||||
|
|
||||||
|
det = out->m[0] * inv[0] + out->m[1] * inv[4] + out->m[2] * inv[8] + out->m[3] * inv[12];
|
||||||
|
if (det != 0.0f){
|
||||||
|
|
||||||
|
inv[1] = -out->m[1] * out->m[10] * out->m[15] +
|
||||||
|
out->m[1] * out->m[11] * out->m[14] +
|
||||||
|
out->m[9] * out->m[2] * out->m[15] -
|
||||||
|
out->m[9] * out->m[3] * out->m[14] -
|
||||||
|
out->m[13] * out->m[2] * out->m[11] +
|
||||||
|
out->m[13] * out->m[3] * out->m[10];
|
||||||
|
|
||||||
|
inv[5] = out->m[0] * out->m[10] * out->m[15] -
|
||||||
|
out->m[0] * out->m[11] * out->m[14] -
|
||||||
|
out->m[8] * out->m[2] * out->m[15] +
|
||||||
|
out->m[8] * out->m[3] * out->m[14] +
|
||||||
|
out->m[12] * out->m[2] * out->m[11] -
|
||||||
|
out->m[12] * out->m[3] * out->m[10];
|
||||||
|
|
||||||
|
inv[9] = -out->m[0] * out->m[9] * out->m[15] +
|
||||||
|
out->m[0] * out->m[11] * out->m[13] +
|
||||||
|
out->m[8] * out->m[1] * out->m[15] -
|
||||||
|
out->m[8] * out->m[3] * out->m[13] -
|
||||||
|
out->m[12] * out->m[1] * out->m[11] +
|
||||||
|
out->m[12] * out->m[3] * out->m[9];
|
||||||
|
|
||||||
|
inv[13] = out->m[0] * out->m[9] * out->m[14] -
|
||||||
|
out->m[0] * out->m[10] * out->m[13] -
|
||||||
|
out->m[8] * out->m[1] * out->m[14] +
|
||||||
|
out->m[8] * out->m[2] * out->m[13] +
|
||||||
|
out->m[12] * out->m[1] * out->m[10] -
|
||||||
|
out->m[12] * out->m[2] * out->m[9];
|
||||||
|
|
||||||
|
inv[2] = out->m[1] * out->m[6] * out->m[15] -
|
||||||
|
out->m[1] * out->m[7] * out->m[14] -
|
||||||
|
out->m[5] * out->m[2] * out->m[15] +
|
||||||
|
out->m[5] * out->m[3] * out->m[14] +
|
||||||
|
out->m[13] * out->m[2] * out->m[7] -
|
||||||
|
out->m[13] * out->m[3] * out->m[6];
|
||||||
|
|
||||||
|
inv[6] = -out->m[0] * out->m[6] * out->m[15] +
|
||||||
|
out->m[0] * out->m[7] * out->m[14] +
|
||||||
|
out->m[4] * out->m[2] * out->m[15] -
|
||||||
|
out->m[4] * out->m[3] * out->m[14] -
|
||||||
|
out->m[12] * out->m[2] * out->m[7] +
|
||||||
|
out->m[12] * out->m[3] * out->m[6];
|
||||||
|
|
||||||
|
inv[10] = out->m[0] * out->m[5] * out->m[15] -
|
||||||
|
out->m[0] * out->m[7] * out->m[13] -
|
||||||
|
out->m[4] * out->m[1] * out->m[15] +
|
||||||
|
out->m[4] * out->m[3] * out->m[13] +
|
||||||
|
out->m[12] * out->m[1] * out->m[7] -
|
||||||
|
out->m[12] * out->m[3] * out->m[5];
|
||||||
|
|
||||||
|
inv[14] = -out->m[0] * out->m[5] * out->m[14] +
|
||||||
|
out->m[0] * out->m[6] * out->m[13] +
|
||||||
|
out->m[4] * out->m[1] * out->m[14] -
|
||||||
|
out->m[4] * out->m[2] * out->m[13] -
|
||||||
|
out->m[12] * out->m[1] * out->m[6] +
|
||||||
|
out->m[12] * out->m[2] * out->m[5];
|
||||||
|
|
||||||
|
inv[3] = -out->m[1] * out->m[6] * out->m[11] +
|
||||||
|
out->m[1] * out->m[7] * out->m[10] +
|
||||||
|
out->m[5] * out->m[2] * out->m[11] -
|
||||||
|
out->m[5] * out->m[3] * out->m[10] -
|
||||||
|
out->m[9] * out->m[2] * out->m[7] +
|
||||||
|
out->m[9] * out->m[3] * out->m[6];
|
||||||
|
|
||||||
|
inv[7] = out->m[0] * out->m[6] * out->m[11] -
|
||||||
|
out->m[0] * out->m[7] * out->m[10] -
|
||||||
|
out->m[4] * out->m[2] * out->m[11] +
|
||||||
|
out->m[4] * out->m[3] * out->m[10] +
|
||||||
|
out->m[8] * out->m[2] * out->m[7] -
|
||||||
|
out->m[8] * out->m[3] * out->m[6];
|
||||||
|
|
||||||
|
inv[11] = -out->m[0] * out->m[5] * out->m[11] +
|
||||||
|
out->m[0] * out->m[7] * out->m[9] +
|
||||||
|
out->m[4] * out->m[1] * out->m[11] -
|
||||||
|
out->m[4] * out->m[3] * out->m[9] -
|
||||||
|
out->m[8] * out->m[1] * out->m[7] +
|
||||||
|
out->m[8] * out->m[3] * out->m[5];
|
||||||
|
|
||||||
|
inv[15] = out->m[0] * out->m[5] * out->m[10] -
|
||||||
|
out->m[0] * out->m[6] * out->m[9] -
|
||||||
|
out->m[4] * out->m[1] * out->m[10] +
|
||||||
|
out->m[4] * out->m[2] * out->m[9] +
|
||||||
|
out->m[8] * out->m[1] * out->m[6] -
|
||||||
|
out->m[8] * out->m[2] * out->m[5];
|
||||||
|
|
||||||
|
det = 1.0 / det;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
out->m[i] = inv[i] * det;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user