From bd0ce0f76d816522d5dd8096babbe5f55be9b1ef Mon Sep 17 00:00:00 2001 From: THoehne <77296181+THoehne@users.noreply.github.com> Date: Thu, 15 Aug 2024 14:10:06 +0200 Subject: [PATCH] Bug fixes. --- .../Runtime/Core/public/Math/Matrix2.hpp | 130 ++++++++++++------ 1 file changed, 85 insertions(+), 45 deletions(-) diff --git a/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp b/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp index 7a621c0..8dcad40 100644 --- a/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp +++ b/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp @@ -96,12 +96,30 @@ namespace Phanes::Core::Math { public: - FORCEINLINE T operator() (int n, int m) const + T& operator() (int n, int m) { - this->data[m][n]; + return this->data[m][n]; } - FORCEINLINE TVector2 operator[] (int m) const + T operator() (int n, int m) const + { + return this->data[m][n]; + } + + TVector2& operator[] (int m) + { + switch (m) + { + case 0: + return this->c0; + case 1: + return this->c1; + } + + throw std::invalid_argument("m is outside valid range."); + } + + TVector2 operator[] (int m) const { switch (m) { @@ -123,10 +141,10 @@ namespace Phanes::Core::Math { template TMatrix2 operator+= (TMatrix2& m1, T s) { - m1->m(0, 0) += s; - m1->m(0, 1) += s; - m1->m(1, 0) += s; - m1->m(1, 1) += s; + m1(0, 0) += s; + m1(0, 1) += s; + m1(1, 0) += s; + m1(1, 1) += s; return m1; } @@ -134,10 +152,10 @@ namespace Phanes::Core::Math { template TMatrix2 operator+= (TMatrix2& m1, const TMatrix2& m2) { - m1->m(0, 0) += m2.m(0, 0); - m1->m(0, 1) += m2.m(0, 1); - m1->m(1, 0) += m2.m(1, 0); - m1->m(1, 1) += m2.m(1, 1); + m1(0, 0) += m2(0, 0); + m1(0, 1) += m2(0, 1); + m1(1, 0) += m2(1, 0); + m1(1, 1) += m2(1, 1); return m1; } @@ -145,10 +163,10 @@ namespace Phanes::Core::Math { template TMatrix2 operator-= (TMatrix2& m1, T s) { - m1->m(0, 0) -= s; - m1->m(0, 1) -= s; - m1->m(1, 0) -= s; - m1->m(1, 1) -= s; + m1(0, 0) -= s; + m1(0, 1) -= s; + m1(1, 0) -= s; + m1(1, 1) -= s; return m1; } @@ -156,10 +174,10 @@ namespace Phanes::Core::Math { template TMatrix2 operator-= (TMatrix2& m1, const TMatrix2& m2) { - m1->m(0, 0) -= m2.m(0, 0); - m1->m(0, 1) -= m2.m(0, 1); - m1->m(1, 0) -= m2.m(1, 0); - m1->m(1, 1) -= m2.m(1, 1); + m1(0, 0) -= m2(0, 0); + m1(0, 1) -= m2(0, 1); + m1(1, 0) -= m2(1, 0); + m1(1, 1) -= m2(1, 1); return m1; } @@ -167,10 +185,10 @@ namespace Phanes::Core::Math { template TMatrix2 operator*= (TMatrix2& m1, T s) { - m1->m[0][0] *= s; - m1->m[0][1] *= s; - m1->m[1][0] *= s; - m1->m[1][1] *= s; + m1.data[0][0] *= s; + m1.data[0][1] *= s; + m1.data[1][0] *= s; + m1.data[1][1] *= s; return m1; } @@ -189,6 +207,18 @@ namespace Phanes::Core::Math { return m1; } + template + TMatrix2 operator/= (TMatrix2& m1, T s) + { + s = (T)1.0 / s; + m1.data[0][0] *= s; + m1.data[0][1] *= s; + m1.data[1][0] *= s; + m1.data[1][1] *= s; + + return m1; + } + template TMatrix2 operator+ (const TMatrix2& m1, T s) { @@ -200,7 +230,7 @@ namespace Phanes::Core::Math { TMatrix2 operator+ (const TMatrix2& m1, const TMatrix2& m2) { return TMatrix2(m1(0, 0) + m2(0, 0), m1(0, 1) + m2(0, 1), - m1(1, 0) + m2(1, 0), m1(1, 1) + m2(1, 1)); + m1(1, 0) + m2(1, 0), m1(1, 1) + m2(1, 1)); } template @@ -221,21 +251,29 @@ namespace Phanes::Core::Math { TMatrix2 operator* (const TMatrix2& m1, T s) { return TMatrix2(m1(0, 0) * s, m1(0, 1) * s, - m1(1, 0) * s, m1(1, 1) * s); + m1(1, 0) * s, m1(1, 1) * s); + } + + template + TMatrix2 operator/ (const TMatrix2& m1, T s) + { + s = (T)1.0 / s; + return TMatrix2(m1(0, 0) * s, m1(0, 1) * s, + m1(1, 0) * s, m1(1, 1) * s); } template TMatrix2 operator* (const TMatrix2& m1, const TMatrix2& m2) { return TMatrix2(m1(0, 0) * m2(0, 0) + m1(0, 1) * m2(1, 0), m1(0, 0) * m2(0, 1) + m1(0, 1) * m2(1, 1), - m1(1, 0) * m2(0, 0) + m1(1, 1) * m2(1, 0), m1(1, 0) * m2(0, 1) + m1(1, 1) * m2(1, 1)); + m1(1, 0) * m2(0, 0) + m1(1, 1) * m2(1, 0), m1(1, 0) * m2(0, 1) + m1(1, 1) * m2(1, 1)); } template TVector2 operator* (const TMatrix2& m1, const TVector2& v) { - return TVector2>(m1(0, 0) * v.x + m1(0, 1) * v.y, - m1(1, 0) * v.x + m1(1, 1) * v.y); + return TVector2(m1(0, 0) * v.x + m1(0, 1) * v.y, + m1(1, 0) * v.x + m1(1, 1) * v.y); } template @@ -258,28 +296,30 @@ namespace Phanes::Core::Math { template T Determinant(const TMatrix2& m1) { - return m1(0, 0) * m1(1, 1) - m1(0, 1) * m1(0, 1); + return m1(0, 0) * m1(1, 1) - m1(0, 1) * m1(1, 0); } template TMatrix2 InverseV(TMatrix2& m1) { - float _1_det = 1.0f / Determinant(m1); - float m00 = m1(0, 0); + float _1_det = 1.0f / Determinant(m1); + float m00 = m1(0, 0); - m1(0, 0) = m1(1, 1); - m1(0, 1) = -m1(0, 1); - m1(1, 0) = -m1(1, 0); - m1(1, 1) = m00; + m1(0, 0) = m1(1, 1); + m1(0, 1) = -m1(0, 1); + m1(1, 0) = -m1(1, 0); + m1(1, 1) = m00; - m1 *= _1_det; - return m1; + m1 *= _1_det; + return m1; } template TMatrix2 TransposeV(TMatrix2& m1) { Swap(m1(0, 1), m1(1, 0)); + + return m1; } // =============== // @@ -289,24 +329,24 @@ namespace Phanes::Core::Math { template TMatrix2 Inverse(TMatrix2& m1) { - float _1_det = 1.0f / Determinant(m1); + float _1_det = 1.0f / Determinant(m1); - return TMatrix2(m1(1, 1) * _1_det, m1(1, 0) * _1_det, - m1(0, 1) * _1_det, m1(0, 0) * _1_det); + return TMatrix2( m1(1, 1) * _1_det, -m1(0, 1) * _1_det, + -m1(1, 0) * _1_det, m1(0, 0) * _1_det); } template TMatrix2 Transpose(const TMatrix2& m1) { - return TMatrix2(m1(0, 0), m1(1, 0), - m1(0, 1), m1(1, 1)); + return TMatrix2(m1(0, 0), m1(1, 0), + m1(0, 1), m1(1, 1)); } template - bool IsIndentityMatrix(const TMatrix2& m1, T threshold = P_FLT_INAC) + bool IsIdentityMatrix(const TMatrix2& m1, T threshold = P_FLT_INAC) { - return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && abs(m1(0, 1) - (T)1.0) < P_FLT_INAC && - abs(m1(1, 0) - (T)1.0) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC); + return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && abs(m1(0, 1)) < P_FLT_INAC && + abs(m1(1, 0)) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC); } } // Phanes::Core::Math