diff --git a/include/J3ML/Geometry/Capsule.h b/include/J3ML/Geometry/Capsule.h index 609c3c0..35770ed 100644 --- a/include/J3ML/Geometry/Capsule.h +++ b/include/J3ML/Geometry/Capsule.h @@ -16,7 +16,7 @@ namespace Geometry Capsule(); Capsule(const LineSegment& endPoints, float radius); Capsule(const Vector3& bottomPt, const Vector3& topPt, float radius); - bool IsDegenerate()const; + bool IsDegenerate() const; float Height() const; float Diameter() const; Vector3 Bottom() const; diff --git a/include/J3ML/LinearAlgebra/Matrix4x4.h b/include/J3ML/LinearAlgebra/Matrix4x4.h index 8ec0b04..c83acf7 100644 --- a/include/J3ML/LinearAlgebra/Matrix4x4.h +++ b/include/J3ML/LinearAlgebra/Matrix4x4.h @@ -12,7 +12,7 @@ namespace LinearAlgebra { * The elements of this matrix are * m_00, m_01, m_02, m_03 * m_10, m_11, m_12, m_13 - * m_20, m_21, m_22, am_23, + * m_20, m_21, m_22, m_23, * m_30, m_31, m_32, m_33 * * The element m_yx is the value on the row y and column x. @@ -107,7 +107,53 @@ namespace LinearAlgebra { // If the determinant is nonzero, this matrix is invertible. float Determinant() const; - Matrix4x4 Inverse() const; + Matrix4x4 Inverse() const + { + // Compute the inverse directly using Cramer's rule + // Warning: This method is numerically very unstable! + float d = Determinant(); + + d = 1.f / d; + // TODO: Subtract 1 from each entry index + + float a11 = At(0, 0); + float a12 = At(0, 1); + float a13 = At(0, 2); + float a14 = At(0, 3); + float a21 = At(1, 0); + float a22 = At(1, 1); + float a23 = At(1, 2); + float a24 = At(1, 3); + float a31 = At(2, 0); + float a32 = At(2, 1); + float a33 = At(2, 2); + float a34 = At(2, 3); + float a41 = At(3, 0); + float a42 = At(3, 1); + float a43 = At(3, 2); + float a44 = At(3, 3); + + + Matrix4x4 i = { + d * (a22*a33*a44 + a23*a34*a42 + a24*a32*a43 - a22*a34*a43 - a23*a32*a44 - a24*a33*a42), + d * (a12*a34*a43 + a13*a32*a44 + a14*a33*a42 - a12*a33*a44 - a13*a34*a42 - a14*a32*a43), + d * (a12*a23*a44 + a13*a24*a42 + a14*a22*a43 - a12*a24*a43 - a13*a22*a44 - a14*a23*a42), + d * (a12*a24*a33 + a13*a22*a34 + a14*a23*a32 - a12*a23*a34 - a13*a24*a32 - a14*a22*a33), + d * (a21*a34*a43 + a23*a31*a44 + a24*a33*a41 - a21*a33*a44 - a23*a34*a41 - a24*a31*a43), + d * (a11*a33*a44 + a13*a34*a41 + a14*a31*a43 - a11*a34*a43 - a13*a31*a44 - a14*a33*a41), + d * (a11*a24*a43 + a13*a21*a44 + a14*a23*a41 - a11*a23*a44 - a13*a24*a41 - a14*a21*a43), + d * (a11*a23*a34 + a13*a24*a31 + a14*a21*a33 - a11*a24*a33 - a13*a21*a34 - a14*a23*a31), + d * (a21*a32*a44 + a22*a34*a41 + a24*a31*a42 - a21*a34*a42 - a22*a31*a44 - a24*a32*a41), + d * (a11*a34*a42 + a12*a31*a44 + a14*a32*a41 - a11*a32*a44 - a12*a34*a41 - a14*a31*a42), + d * (a11*a22*a44 + a12*a24*a41 + a14*a21*a42 - a11*a24*a42 - a12*a21*a44 - a14*a22*a41), + d * (a11*a24*a32 + a12*a21*a34 + a14*a22*a31 - a11*a22*a34 - a12*a24*a31 - a14*a21*a32), + d * (a21*a33*a42 + a22*a31*a43 + a23*a32*a41 - a21*a32*a43 - a22*a33*a41 - a23*a31*a42), + d * (a11*a32*a43 + a12*a33*a41 + a13*a31*a42 - a11*a33*a42 - a12*a31*a43 - a13*a32*a41), + d * (a11*a23*a42 + a12*a21*a43 + a13*a22*a41 - a11*a22*a43 - a12*a23*a41 - a13*a21*a42), + d * (a11*a22*a33 + a12*a23*a31 + a13*a21*a32 - a11*a23*a32 - a12*a21*a33 - a13*a22*a31) + }; + return i; + } Matrix4x4 Transpose() const; @@ -126,6 +172,8 @@ namespace LinearAlgebra { static Matrix4x4 FromTranslation(const Vector3& rhs); + + static Matrix4x4 D3DOrthoProjLH(float nearPlane, float farPlane, float hViewportSize, float vViewportSize); static Matrix4x4 D3DOrthoProjRH(float nearPlane, float farPlane, float hViewportSize, float vViewportSize); static Matrix4x4 D3DPerspProjLH(float nearPlane, float farPlane, float hViewportSize, float vViewportSize);