From f52110471ac6f76a3b064924a20f55631fe7f939 Mon Sep 17 00:00:00 2001 From: THoehne <77296181+THoehne@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:54:04 +0200 Subject: [PATCH] Bug fixes --- .../Core/public/Math/Detail/Matrix4Decl.inl | 70 ++++++++--- .../Core/public/Math/MathTypeConversion.hpp | 16 ++- .../Runtime/Core/public/Math/Matrix2.hpp | 4 +- .../Runtime/Core/public/Math/Matrix3.hpp | 6 +- .../Runtime/Core/public/Math/Matrix4.hpp | 119 ++++++++++-------- .../Runtime/Core/public/Math/Matrix4.inl | 35 +++++- 6 files changed, 167 insertions(+), 83 deletions(-) diff --git a/Engine/Source/Runtime/Core/public/Math/Detail/Matrix4Decl.inl b/Engine/Source/Runtime/Core/public/Math/Detail/Matrix4Decl.inl index 94369a9..88c2b48 100644 --- a/Engine/Source/Runtime/Core/public/Math/Detail/Matrix4Decl.inl +++ b/Engine/Source/Runtime/Core/public/Math/Detail/Matrix4Decl.inl @@ -14,16 +14,19 @@ namespace Phanes::Core::Math::Detail template struct compute_mat4_transpose {}; + template + struct compute_mat4_mul {}; + template struct compute_mat4_det { - static constexpr T map(Phanes::Core::Math::TMatrix4& m) + static constexpr T map(const Phanes::Core::Math::TMatrix4& m) { - const TVector3& a = reinterpret_cast&>(m[0]); - const TVector3& b = reinterpret_cast&>(m[1]); - const TVector3& c = reinterpret_cast&>(m[2]); - const TVector3& d = reinterpret_cast&>(m[3]); + const TVector3& a = reinterpret_cast&>(m[0]); + const TVector3& b = reinterpret_cast&>(m[1]); + const TVector3& c = reinterpret_cast&>(m[2]); + const TVector3& d = reinterpret_cast&>(m[3]); const float& x = m(3, 0); const float& y = m(3, 1); @@ -43,10 +46,10 @@ namespace Phanes::Core::Math::Detail { static constexpr bool map(Phanes::Core::Math::TMatrix4& r, const Phanes::Core::Math::TMatrix4& m) { - const TVector3& a = reinterpret_cast&>(m[0]); - const TVector3& b = reinterpret_cast&>(m[1]); - const TVector3& c = reinterpret_cast&>(m[2]); - const TVector3& d = reinterpret_cast&>(m[3]); + const TVector3& a = reinterpret_cast&>(m[0]); + const TVector3& b = reinterpret_cast&>(m[1]); + const TVector3& c = reinterpret_cast&>(m[2]); + const TVector3& d = reinterpret_cast&>(m[3]); const float& x = m(3, 0); const float& y = m(3, 1); @@ -60,7 +63,7 @@ namespace Phanes::Core::Math::Detail float _1_det = (T)1.0 / (DotP(s, v) + DotP(t, u)); - if (_1_det == 0.0) + if (_1_det == (T)0.0) { return false; } @@ -70,15 +73,15 @@ namespace Phanes::Core::Math::Detail u *= _1_det; v *= _1_det; - TVector3 r0 = Cross(b, v) + t * y; - TVector3 r1 = Cross(v, a) + t * x; - TVector3 r2 = Cross(d, u) + s * w; - TVector3 r3 = Cross(u, c) + s * z; + TVector3 r0 = CrossP(b, v) + t * y; + TVector3 r1 = CrossP(v, a) - t * x; + TVector3 r2 = CrossP(d, u) + s * w; + TVector3 r3 = CrossP(u, c) - s * z; r = TMatrix4(r0.x, r0.y, r0.z, -DotP(b, t), - r1.x, r1.y, r1.z, DotP(a, t), + r1.x, r1.y, r1.z, DotP(a, t), r2.x, r2.y, r2.z, -DotP(d, s), - r3.x, r3.y, r3.z, DotP(c, s)); + r3.x, r3.y, r3.z, DotP(c, s)); return true; } @@ -95,4 +98,39 @@ namespace Phanes::Core::Math::Detail m(0, 3), m(1, 3), m(2, 3), m(3, 3)); } }; + + template + struct compute_mat4_mul + { + static constexpr void map(Phanes::Core::Math::TMatrix4& r, const Phanes::Core::Math::TMatrix4& m1, const Phanes::Core::Math::TMatrix4& m2) + { + r(0, 0) = m1(0, 0) * m2(0, 0) + m1(0, 1) * m2(1, 0) + m1(0, 2) * m2(2, 0) + m1(0, 3) * m2(3, 0); + r(0, 1) = m1(0, 0) * m2(0, 1) + m1(0, 1) * m2(1, 1) + m1(0, 2) * m2(2, 1) + m1(0, 3) * m2(3, 1); + r(0, 2) = m1(0, 0) * m2(0, 2) + m1(0, 1) * m2(1, 2) + m1(0, 2) * m2(2, 2) + m1(0, 3) * m2(3, 2); + r(0, 3) = m1(0, 0) * m2(0, 3) + m1(0, 1) * m2(1, 3) + m1(0, 2) * m2(2, 3) + m1(0, 3) * m2(3, 3); + + r(1, 0) = m1(1, 0) * m2(0, 0) + m1(1, 1) * m2(1, 0) + m1(1, 2) * m2(2, 0) + m1(1, 3) * m2(3, 0); + r(1, 1) = m1(1, 0) * m2(0, 1) + m1(1, 1) * m2(1, 1) + m1(1, 2) * m2(2, 1) + m1(1, 3) * m2(3, 1); + r(1, 2) = m1(1, 0) * m2(0, 2) + m1(1, 1) * m2(1, 2) + m1(1, 2) * m2(2, 2) + m1(1, 3) * m2(3, 2); + r(1, 3) = m1(1, 0) * m2(0, 3) + m1(1, 1) * m2(1, 3) + m1(1, 2) * m2(2, 3) + m1(1, 3) * m2(3, 3); + + r(2, 0) = m1(2, 0) * m2(0, 0) + m1(2, 1) * m2(1, 0) + m1(2, 2) * m2(2, 0) + m1(2, 3) * m2(3, 0); + r(2, 1) = m1(2, 0) * m2(0, 1) + m1(2, 1) * m2(1, 1) + m1(2, 2) * m2(2, 1) + m1(2, 3) * m2(3, 1); + r(2, 2) = m1(2, 0) * m2(0, 2) + m1(2, 1) * m2(1, 2) + m1(2, 2) * m2(2, 2) + m1(2, 3) * m2(3, 2); + r(2, 3) = m1(2, 0) * m2(0, 3) + m1(2, 1) * m2(1, 3) + m1(2, 2) * m2(2, 3) + m1(2, 3) * m2(3, 3); + + r(3, 0) = m1(3, 0) * m2(0, 0) + m1(3, 1) * m2(1, 0) + m1(3, 2) * m2(2, 0) + m1(3, 3) * m2(3, 0); + r(3, 1) = m1(3, 0) * m2(0, 1) + m1(3, 1) * m2(1, 1) + m1(3, 2) * m2(2, 1) + m1(3, 3) * m2(3, 1); + r(3, 2) = m1(3, 0) * m2(0, 2) + m1(3, 1) * m2(1, 2) + m1(3, 2) * m2(2, 2) + m1(3, 3) * m2(3, 2); + r(3, 3) = m1(3, 0) * m2(0, 3) + m1(3, 1) * m2(1, 3) + m1(3, 2) * m2(2, 3) + m1(3, 3) * m2(3, 3); + } + + static constexpr void map(Phanes::Core::Math::TVector4& r, const Phanes::Core::Math::TMatrix4& m1, const Phanes::Core::Math::TVector4& v) + { + r.x = m1(0, 0) * v.x + m1(0, 1) * v.y + m1(0, 2) * v.z + m1(0, 3) * v.w; + r.y = m1(1, 0) * v.x + m1(1, 1) * v.y + m1(1, 2) * v.z + m1(1, 3) * v.w; + r.z = m1(2, 0) * v.x + m1(2, 1) * v.y + m1(2, 2) * v.z + m1(2, 3) * v.w; + r.w = m1(3, 0) * v.x + m1(3, 1) * v.y + m1(3, 2) * v.z + m1(3, 3) * v.w; + } + }; } \ No newline at end of file diff --git a/Engine/Source/Runtime/Core/public/Math/MathTypeConversion.hpp b/Engine/Source/Runtime/Core/public/Math/MathTypeConversion.hpp index 1cd2b80..c62ac1f 100644 --- a/Engine/Source/Runtime/Core/public/Math/MathTypeConversion.hpp +++ b/Engine/Source/Runtime/Core/public/Math/MathTypeConversion.hpp @@ -101,17 +101,27 @@ namespace Phanes::Core::Math { template std::string ToString(const TMatrix2& m) { - return "([" + ToString(m(0, 0)) + ", " + ToString(m(0, 1)) + "], [" + ToString(m(1, 0)) + ", " + ToString(m(1, 1)) + "])"; + return "([" + ToString(m(0, 0)) + ", " + ToString(m(0, 1)) + "], [" + + ToString(m(1, 0)) + ", " + ToString(m(1, 1)) + "])"; } template std::string ToString(const TMatrix3& m) { - return "([" + ToString(m(0, 0)) + ", " + ToString(m(0, 1)) + ", " + ToString(m(0, 2)) + "], [" + ToString(m(1, 0)) + ", " + ToString(m(1, 1)) + ", " + ToString(m(1, 2)) + "], [" + ToString(m(2, 0)) + ", " + ToString(m(2, 1)) + ", " + ToString(m(2, 2)) + "])"; + return "([" + ToString(m(0, 0)) + ", " + ToString(m(0, 1)) + ", " + ToString(m(0, 2)) + "], [" + + ToString(m(1, 0)) + ", " + ToString(m(1, 1)) + ", " + ToString(m(1, 2)) + "], [" + + ToString(m(2, 0)) + ", " + ToString(m(2, 1)) + ", " + ToString(m(2, 2)) + "])"; } - //std::string toString(const Matrix3& v); + template + std::string ToString(const TMatrix4& m) + { + return "([" + ToString(m(0, 0)) + ", " + ToString(m(0, 1)) + ", " + ToString(m(0, 2)) + ", " + ToString(m(0, 3)) + "], [" + + ToString(m(1, 0)) + ", " + ToString(m(1, 1)) + ", " + ToString(m(1, 2)) + ", " + ToString(m(1, 3)) + "], [" + + ToString(m(2, 0)) + ", " + ToString(m(2, 1)) + ", " + ToString(m(2, 2)) + ", " + ToString(m(2, 3)) + "], [" + + ToString(m(3, 0)) + ", " + ToString(m(3, 1)) + ", " + ToString(m(3, 2)) + ", " + ToString(m(3, 3)) + "])"; + } } diff --git a/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp b/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp index 8dcad40..0e08972 100644 --- a/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp +++ b/Engine/Source/Runtime/Core/public/Math/Matrix2.hpp @@ -345,8 +345,8 @@ namespace Phanes::Core::Math { template 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)) < P_FLT_INAC && - abs(m1(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 diff --git a/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp b/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp index f3b5013..d18ede9 100644 --- a/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp +++ b/Engine/Source/Runtime/Core/public/Math/Matrix3.hpp @@ -518,9 +518,9 @@ namespace Phanes::Core::Math { template bool IsIdentityMatrix(const TMatrix3& m1) { - 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); + return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && abs(m1(0, 1)) < P_FLT_INAC && abs(m1(0, 2)) < P_FLT_INAC && + abs(m1(1, 0)) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC && abs(m1(1, 2)) < P_FLT_INAC && + abs(m1(2, 0)) < P_FLT_INAC && abs(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/Matrix4.hpp b/Engine/Source/Runtime/Core/public/Math/Matrix4.hpp index 73b10e5..d5921b3 100644 --- a/Engine/Source/Runtime/Core/public/Math/Matrix4.hpp +++ b/Engine/Source/Runtime/Core/public/Math/Matrix4.hpp @@ -31,6 +31,62 @@ namespace Phanes::Core::Math { T data[4][4]; }; + public: + + /// + /// Default constructor. + /// + TMatrix4() = default; + + /// + /// Copy constructor + /// + /// + TMatrix4(const TMatrix4& m) + { + this->c0 = m.c0; + this->c1 = m.c1; + this->c2 = m.c2; + this->c3 = m.c3; + } + + /// + /// Construct matrix with values. + /// + TMatrix4(float n00, float n01, float n02, float n03, + float n10, float n11, float n12, float n13, + float n20, float n21, float n22, float n23, + float n30, float n31, float n32, float n33) + { + this->c0 = TVector4(n00, n10, n20, n30); + this->c1 = TVector4(n01, n11, n21, n31); + this->c2 = TVector4(n02, n12, n22, n32); + this->c3 = TVector4(n03, n13, n23, n33); + } + + /// + /// Construct matrix from columns. + /// + TMatrix4(const TVector4& v0, const TVector4& v1, const TVector4& v2, const TVector4& v3) + { + this->c0 = v0; + this->c1 = v1; + this->c2 = v2; + this->c3 = v3; + } + + /// + /// Construct matrix from field of values. + /// + /// + TMatrix4(T field[4][4]) + { + this->c0 = TVector4(field[0]); + this->c1 = TVector4(field[1]); + this->c2 = TVector4(field[2]); + this->c3 = TVector4(field[3]); + } + public: FORCEINLINE T& operator() (int n, int m) @@ -48,7 +104,7 @@ namespace Phanes::Core::Math { } FORCEINLINE const TVector4& operator[] (int m) const { - return (*reinterpret_cast*>(this->m[m])); + return (*reinterpret_cast*>(this->data[m])); } }; @@ -112,15 +168,7 @@ namespace Phanes::Core::Math { } template - TMatrix4 operator*= (TMatrix4& m1, const TMatrix4& m2) - { - m1.c0 *= m2.c0; - m1.c1 *= m2.c1; - m1.c2 *= m2.c2; - m1.c3 *= m2.c3; - - return m1; - } + TMatrix4 operator*= (TMatrix4& m1, const TMatrix4& m2); template TMatrix4 operator/= (TMatrix4& m1, T s) @@ -134,17 +182,6 @@ namespace Phanes::Core::Math { return m1; } - template - TMatrix4 operator/= (TMatrix4& m1, const TMatrix4& m2) - { - m1.c0 /= m2.c0; - m1.c1 /= m2.c1; - m1.c2 /= m2.c2; - m1.c3 /= m2.c3; - - return m1; - } - template TMatrix4 operator+ (const TMatrix4& m1, T s) { @@ -196,14 +233,7 @@ namespace Phanes::Core::Math { } template - TMatrix4 operator* (const TMatrix4& m1, const TMatrix4& m2) - { - return TMatrix4(m1.c0 * m2.c0, - m1.c1 * m2.c1, - m1.c2 * m2.c2, - m1.c3 * m2.c3 - ); - } + TMatrix4 operator* (const TMatrix4& m1, const TMatrix4& m2); template TMatrix4 operator/ (const TMatrix4& m1, T s) @@ -217,24 +247,7 @@ namespace Phanes::Core::Math { } template - TMatrix4 operator/ (const TMatrix4& m1, const TMatrix4& m2) - { - return TMatrix4(m1.c0 / m2.c0, - m1.c1 / m2.c1, - m1.c2 / m2.c2, - m1.c3 / m2.c3 - ); - } - - template - TVector4 operator* (const TMatrix4& m1, const TVector4& v) - { - return TVector4(DotP(m1.c0, v), - DotP(m1.c1, v), - DotP(m1.c2, v), - DotP(m1.c3, v) - ); - } + TVector4 operator* (const TMatrix4& m1, const TVector4& v); template bool operator== (const TMatrix4& m1, const TMatrix4& m2) @@ -269,18 +282,18 @@ namespace Phanes::Core::Math { template - bool Inverse(TMatrix4& a); + bool Inverse(const TMatrix4& m, Ref> r); template TMatrix4 Transpose(const TMatrix4& a); template - FORCEINLINE bool IsIndentityMatrix(const TMatrix4& m1) + FORCEINLINE bool IsIdentityMatrix(const TMatrix4& 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(0, 3) - (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(1, 3) - (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 && abs(m1(2, 3) - (T)0.0) < P_FLT_INAC && - abs(m1(3, 0) - (T)0.0) < P_FLT_INAC && abs(m1(3, 1) - (T)0.0) < P_FLT_INAC && abs(m1(3, 2) - (T)1.0) < P_FLT_INAC && abs(m1(3, 3) - (T)0.0) < P_FLT_INAC); + return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && abs(m1(0, 1)) < P_FLT_INAC && abs(m1(0, 2)) < P_FLT_INAC && abs(m1(0, 3)) < P_FLT_INAC && + abs(m1(1, 0)) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC && abs(m1(1, 2)) < P_FLT_INAC && abs(m1(1, 3)) < P_FLT_INAC && + abs(m1(2, 0)) < P_FLT_INAC && abs(m1(2, 1)) < P_FLT_INAC && abs(m1(2, 2) - (T)1.0) < P_FLT_INAC && abs(m1(2, 3)) < P_FLT_INAC && + abs(m1(3, 0)) < P_FLT_INAC && abs(m1(3, 1)) < P_FLT_INAC && abs(m1(3, 2)) < P_FLT_INAC && abs(m1(3, 3) - (T)0.0) < P_FLT_INAC); } diff --git a/Engine/Source/Runtime/Core/public/Math/Matrix4.inl b/Engine/Source/Runtime/Core/public/Math/Matrix4.inl index 4d9d6f0..80a574e 100644 --- a/Engine/Source/Runtime/Core/public/Math/Matrix4.inl +++ b/Engine/Source/Runtime/Core/public/Math/Matrix4.inl @@ -25,22 +25,45 @@ namespace Phanes::Core::Math template TMatrix4 TransposeV(TMatrix4& a) { - return Detail::compute_mat4_transpose::map(a, a); + Detail::compute_mat4_transpose::map(a, a); + return a; } template - bool Inverse(TMatrix4& a) + bool Inverse(const TMatrix4& m, Ref> r) { - TMatrix4 r; - return Detail::compute_mat4_inv::map(r, a); - return r; + return Detail::compute_mat4_inv::map(*r, m); } template TMatrix4 Transpose(TMatrix4& a) { TMatrix4 r; - return Detail::compute_mat4_transpose::map(r, a); + Detail::compute_mat4_transpose::map(r, a); + return r; + } + + template + TMatrix4 operator*= (TMatrix4& m1, const TMatrix4& m2) + { + TMatrix4 r; + Detail::compute_mat4_mul::map(r, m1, m2); + return (m1 = r); + } + + template + TMatrix4 operator* (const TMatrix4& m1, const TMatrix4& m2) + { + TMatrix4 r; + Detail::compute_mat4_mul::map(r, m1, m2); + return r; + } + + template + TVector4 operator* (const TMatrix4& m1, const TVector4& v) + { + TVector4 r; + Detail::compute_mat4_mul::map(r, m1, v); return r; } } \ No newline at end of file