From 422bc588e9e8ae580f472f05e47c01a646acff38 Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Mon, 20 Feb 2023 13:03:46 -0600 Subject: [PATCH] Fix inverse perspective --- HandmadeMath.h | 23 ++++++++++++++++++++--- test/categories/MatrixOps.h | 8 ++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/HandmadeMath.h b/HandmadeMath.h index 6293a20..35ba927 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -1857,10 +1857,10 @@ static inline HMM_Mat4 HMM_Perspective_LH_ZO(float FOV, float AspectRatio, float return Result; } -COVERAGE(HMM_InvPerspective, 1) -static inline HMM_Mat4 HMM_InvPerspective(HMM_Mat4 PerspectiveMatrix) +COVERAGE(HMM_InvPerspective_RH, 1) +static inline HMM_Mat4 HMM_InvPerspective_RH(HMM_Mat4 PerspectiveMatrix) { - ASSERT_COVERED(HMM_InvPerspective); + ASSERT_COVERED(HMM_InvPerspective_RH); HMM_Mat4 Result = {0}; Result.Elements[0][0] = 1.0f / PerspectiveMatrix.Elements[0][0]; @@ -1874,6 +1874,23 @@ static inline HMM_Mat4 HMM_InvPerspective(HMM_Mat4 PerspectiveMatrix) return Result; } +COVERAGE(HMM_InvPerspective_LH, 1) +static inline HMM_Mat4 HMM_InvPerspective_LH(HMM_Mat4 PerspectiveMatrix) +{ + ASSERT_COVERED(HMM_InvPerspective_LH); + + HMM_Mat4 Result = {0}; + Result.Elements[0][0] = 1.0f / PerspectiveMatrix.Elements[0][0]; + Result.Elements[1][1] = 1.0f / PerspectiveMatrix.Elements[1][1]; + Result.Elements[2][2] = 0.0f; + + Result.Elements[2][3] = 1.0f / PerspectiveMatrix.Elements[3][2]; + Result.Elements[3][3] = PerspectiveMatrix.Elements[2][2] * -Result.Elements[2][3]; + Result.Elements[3][2] = PerspectiveMatrix.Elements[2][3]; + + return Result; +} + COVERAGE(HMM_Translate, 1) static inline HMM_Mat4 HMM_Translate(HMM_Vec3 Translation) { diff --git a/test/categories/MatrixOps.h b/test/categories/MatrixOps.h index 0e66839..4d77fdc 100644 --- a/test/categories/MatrixOps.h +++ b/test/categories/MatrixOps.h @@ -274,22 +274,22 @@ TEST(InvMatrix, InvPerspective) { { HMM_Mat4 Matrix = HMM_Perspective_RH_NO(HMM_AngleDeg(120), 16.0/9.0, 10, 10000); - HMM_Mat4 Inverse = HMM_InvPerspective(Matrix); + HMM_Mat4 Inverse = HMM_InvPerspective_RH(Matrix); EXPECT_M4_EQ(HMM_MulM4(Matrix, Inverse), HMM_M4D(1.0f)); } { HMM_Mat4 Matrix = HMM_Perspective_RH_ZO(HMM_AngleDeg(120), 16.0/9.0, 10, 10000); - HMM_Mat4 Inverse = HMM_InvPerspective(Matrix); + HMM_Mat4 Inverse = HMM_InvPerspective_RH(Matrix); EXPECT_M4_EQ(HMM_MulM4(Matrix, Inverse), HMM_M4D(1.0f)); } { HMM_Mat4 Matrix = HMM_Perspective_LH_NO(HMM_AngleDeg(120), 16.0/9.0, 10, 10000); - HMM_Mat4 Inverse = HMM_InvPerspective(Matrix); + HMM_Mat4 Inverse = HMM_InvPerspective_LH(Matrix); EXPECT_M4_EQ(HMM_MulM4(Matrix, Inverse), HMM_M4D(1.0f)); } { HMM_Mat4 Matrix = HMM_Perspective_LH_ZO(HMM_AngleDeg(120), 16.0/9.0, 10, 10000); - HMM_Mat4 Inverse = HMM_InvPerspective(Matrix); + HMM_Mat4 Inverse = HMM_InvPerspective_LH(Matrix); EXPECT_M4_EQ(HMM_MulM4(Matrix, Inverse), HMM_M4D(1.0f)); } }