From 237e22cdd11c3e9341ba26687f233a92e8266524 Mon Sep 17 00:00:00 2001 From: Thompson Lee Date: Fri, 5 Aug 2016 01:18:03 -0400 Subject: [PATCH] Enhancement: Mtx_Inverse() returns a non-zero determinant if the matrix passed in can be inverted, otherwise returns zero if the matrix is singular/degenerative. --- include/c3d/maths.h | 2 +- source/maths/mtx_inverse.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/include/c3d/maths.h b/include/c3d/maths.h index a935587..12a4361 100644 --- a/include/c3d/maths.h +++ b/include/c3d/maths.h @@ -303,7 +303,7 @@ void Mtx_Multiply(C3D_Mtx* out, const C3D_Mtx* a, const C3D_Mtx* b); * @retval true Matrix was inverted * @retval false Matrix is degenerate */ -bool Mtx_Inverse(C3D_Mtx* out); +float Mtx_Inverse(C3D_Mtx* out); /** * @brief Multiply 3x3 matrix by a FVec3 diff --git a/source/maths/mtx_inverse.c b/source/maths/mtx_inverse.c index fe74a5a..15b0311 100644 --- a/source/maths/mtx_inverse.c +++ b/source/maths/mtx_inverse.c @@ -1,8 +1,11 @@ #include #include -bool Mtx_Inverse(C3D_Mtx* out) +float Mtx_Inverse(C3D_Mtx* out) { + //Mtx_Inverse can be used to calculate the determinant and the inverse of the matrix. + //It's an enhancement. + C3D_Mtx inv; float det; int i; @@ -39,7 +42,8 @@ bool Mtx_Inverse(C3D_Mtx* out) out->r[0].z * inv.r[2].x + out->r[0].w * inv.r[3].x; if (fabsf(det) < FLT_EPSILON) - return false; + //Returns 0.0f if we find the determinant is less than +/- FLT_EPSILON. + return 0.0f; inv.r[0].y = -out->r[0].y * out->r[2].z * out->r[3].w + out->r[0].y * out->r[2].w * out->r[3].z + @@ -130,5 +134,5 @@ bool Mtx_Inverse(C3D_Mtx* out) for (i = 0; i < 16; i++) out->m[i] = inv.m[i] * det; - return true; + return det; }