From 415d1d850597622046f8ff8d61feee6d9c7a607d Mon Sep 17 00:00:00 2001 From: THoehne <77296181+THoehne@users.noreply.github.com> Date: Sun, 18 Aug 2024 17:53:06 +0200 Subject: [PATCH] Bug fixes --- .../Runtime/Core/public/Math/Matrix3.hpp | 31 +++++++++++-------- .../Runtime/Core/public/Math/Matrix3.inl | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp b/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp index a96c707..f3b5013 100644 --- a/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp +++ b/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp @@ -123,12 +123,12 @@ namespace Phanes::Core::Math { FORCEINLINE TVector3& operator[] (int m) { - return (*reinterpret_cast*>(this->m[m])); + return (*reinterpret_cast*>(this->data[m])); } FORCEINLINE const TVector3 operator[] (int m) const { - return (*reinterpret_cast*>(this->m[m])); + return (*reinterpret_cast*>(this->data[m])); } }; @@ -430,6 +430,7 @@ namespace Phanes::Core::Math { template bool InverseV(TMatrix3& m1) { + // Rows of inversed matrix TVector3 r0 = CrossP(m1.c1, m1.c2); TVector3 r1 = CrossP(m1.c2, m1.c0); TVector3 r2 = CrossP(m1.c0, m1.c1); @@ -441,6 +442,7 @@ namespace Phanes::Core::Math { return false; } + // Store matrix transposed m1 = TMatrix3(r0.x, r0.y, r0.z, r1.x, r1.y, r1.z, r2.x, r2.y, r2.z); @@ -475,22 +477,25 @@ namespace Phanes::Core::Math { template bool Inverse(const TMatrix3& m1, Ref> r) { - TVector3 r0 = CrossP(m1.c1, m1.c2); - TVector3 r1 = CrossP(m1.c2, m1.c0); - TVector3 r2 = CrossP(m1.c0, m1.c1); + // r is a row-major matrix. + TMatrix3 row; + row[0] = CrossP(m1.c1, m1.c2); + row[1] = CrossP(m1.c2, m1.c0); + row[2] = CrossP(m1.c0, m1.c1); T _1_det = (T)1.0 / Determinant(m1); - if (_1_det == (T)0.0) + if (Phanes::Core::Math::Equals(_1_det, (T)0.0)) { return false; } - r = TMatrix3(r0.x, r0.y, r0.z, - r1.x, r1.y, r1.z, - r2.x, r2.y, r2.z); + row *= _1_det; - r *= _1_det; + // Store matrix transposed. + (*r).data[0][0] = row.data[0][0]; (*r).data[1][0] = row.data[0][1]; (*r).data[2][0] = row.data[0][2]; + (*r).data[0][1] = row.data[1][0]; (*r).data[1][1] = row.data[1][1]; (*r).data[2][1] = row.data[1][2]; + (*r).data[0][2] = row.data[2][0]; (*r).data[1][2] = row.data[2][1]; (*r).data[2][2] = row.data[2][2]; return true; } @@ -513,9 +518,9 @@ namespace Phanes::Core::Math { template bool IsIdentityMatrix(const TMatrix3& m1) { - return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && abs(m1(0, 1) - (T)0.0) < P_FLT_INAC && abs(m1(0, 2) - (T)0.0) < P_FLT_INAC && - abs(m1(1, 0) - (T)0.0) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC && abs(m1(1, 2) - (T)0.0) < P_FLT_INAC && - abs(m1(2, 0) - (T)0.0) < P_FLT_INAC && abs(m1(2, 1) - (T)0.0) < P_FLT_INAC && abs(m1(2, 2) - (T)1.0) < P_FLT_INAC); + return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && m1(0, 1) < P_FLT_INAC && m1(0, 2) < P_FLT_INAC && + m1(1, 0) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC && m1(1, 2) < P_FLT_INAC && + m1(2, 0) < P_FLT_INAC && m1(2, 1) < P_FLT_INAC && abs(m1(2, 2) - (T)1.0) < P_FLT_INAC); } } // Phanes::Core::Math diff --git a/Engine/Source/Runtime/Core/public/Math/Matrix3.inl b/Engine/Source/Runtime/Core/public/Math/Matrix3.inl index bd6b239..159f579 100644 --- a/Engine/Source/Runtime/Core/public/Math/Matrix3.inl +++ b/Engine/Source/Runtime/Core/public/Math/Matrix3.inl @@ -10,7 +10,7 @@ namespace Phanes::Core::Math { template - TMatrix3 TransposeV(const TMatrix3& m) + TMatrix3 TransposeV(TMatrix3& m) { Detail::compute_mat3_transpose::map(m, m); return m;