From e999c4c6f720f52cfd8a51137a3f447bc0d8714d Mon Sep 17 00:00:00 2001 From: Thompson Lee Date: Sat, 30 Jul 2016 23:11:52 -0400 Subject: [PATCH 1/3] Adding a Mtx_Inverse calculation. --- source/maths/mtx_inverse.c | 129 +++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 source/maths/mtx_inverse.c diff --git a/source/maths/mtx_inverse.c b/source/maths/mtx_inverse.c new file mode 100644 index 0000000..06179e7 --- /dev/null +++ b/source/maths/mtx_inverse.c @@ -0,0 +1,129 @@ +#include + +void 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; + } + +} From 71b0af035029edeabf066f0bb47fb3e2cfed400b Mon Sep 17 00:00:00 2001 From: Thompson Lee Date: Sun, 31 Jul 2016 00:42:14 -0400 Subject: [PATCH 2/3] Decided to return int value to notify if inverse calculation is successful, or failed. --- include/c3d/maths.h | 2 ++ source/maths/mtx_inverse.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/c3d/maths.h b/include/c3d/maths.h index 6ab0f21..c461801 100644 --- a/include/c3d/maths.h +++ b/include/c3d/maths.h @@ -62,6 +62,8 @@ static inline void Mtx_Copy(C3D_Mtx* out, const C3D_Mtx* in) void Mtx_Identity(C3D_Mtx* out); void Mtx_Multiply(C3D_Mtx* out, const C3D_Mtx* a, const C3D_Mtx* b); +int Mtx_Inverse(C3D_Mtx* out); + 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_RotateX(C3D_Mtx* mtx, float angle, bool bRightSide); diff --git a/source/maths/mtx_inverse.c b/source/maths/mtx_inverse.c index 06179e7..938da3e 100644 --- a/source/maths/mtx_inverse.c +++ b/source/maths/mtx_inverse.c @@ -1,6 +1,6 @@ #include -void Mtx_Inverse(C3D_Mtx* out) +int Mtx_Inverse(C3D_Mtx* out) { float inv[16], det; int i; @@ -124,6 +124,10 @@ void Mtx_Inverse(C3D_Mtx* out) for (i = 0; i < 16; i++) out->m[i] = inv[i] * det; + + return 0; } - + + return -1; + } From 57db4eeeb027a1bd0f0657d41a6286fc1304ddc3 Mon Sep 17 00:00:00 2001 From: Thompson Lee Date: Sun, 31 Jul 2016 01:03:51 -0400 Subject: [PATCH 3/3] Wait... There's bool used.... --- include/c3d/maths.h | 2 +- source/maths/mtx_inverse.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/c3d/maths.h b/include/c3d/maths.h index c461801..f41b33d 100644 --- a/include/c3d/maths.h +++ b/include/c3d/maths.h @@ -62,7 +62,7 @@ static inline void Mtx_Copy(C3D_Mtx* out, const C3D_Mtx* in) void Mtx_Identity(C3D_Mtx* out); void Mtx_Multiply(C3D_Mtx* out, const C3D_Mtx* a, const C3D_Mtx* b); -int Mtx_Inverse(C3D_Mtx* out); +bool Mtx_Inverse(C3D_Mtx* out); void Mtx_Translate(C3D_Mtx* mtx, float x, float y, float z); void Mtx_Scale(C3D_Mtx* mtx, float x, float y, float z); diff --git a/source/maths/mtx_inverse.c b/source/maths/mtx_inverse.c index 938da3e..f8874f0 100644 --- a/source/maths/mtx_inverse.c +++ b/source/maths/mtx_inverse.c @@ -1,6 +1,6 @@ #include -int Mtx_Inverse(C3D_Mtx* out) +bool Mtx_Inverse(C3D_Mtx* out) { float inv[16], det; int i; @@ -125,9 +125,9 @@ int Mtx_Inverse(C3D_Mtx* out) for (i = 0; i < 16; i++) out->m[i] = inv[i] * det; - return 0; + return true; } - return -1; + return false; }