From 90f2b025b1ec7e21d8983cbf52d1d7eb81ae215e Mon Sep 17 00:00:00 2001 From: Christophe Date: Thu, 21 Dec 2023 18:54:34 +0100 Subject: [PATCH] Fixed EXT_matrix_transform inverted shear matrix multiple #1140 #1182 --- glm/ext/matrix_transform.inl | 8 +++---- readme.md | 1 + test/core/core_func_matrix.cpp | 41 +++++++++++++++++++++------------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/glm/ext/matrix_transform.inl b/glm/ext/matrix_transform.inl index 40459bbb7..029ef0fb5 100644 --- a/glm/ext/matrix_transform.inl +++ b/glm/ext/matrix_transform.inl @@ -117,10 +117,10 @@ namespace glm ); mat<4, 4, T, Q> Result; - Result[0] = Shear[0] * m[0][0] + Shear[1] * m[0][1] + Shear[2] * m[0][2] + Shear[3] * m[0][3]; - Result[1] = Shear[0] * m[1][0] + Shear[1] * m[1][1] + Shear[2] * m[1][2] + Shear[3] * m[1][3]; - Result[2] = Shear[0] * m[2][0] + Shear[1] * m[2][1] + Shear[2] * m[2][2] + Shear[3] * m[2][3]; - Result[3] = Shear[0] * m[3][0] + Shear[1] * m[3][1] + Shear[2] * m[3][2] + Shear[3] * m[3][3]; + Result[0] = m[0] * Shear[0][0] + m[1] * Shear[0][1] + m[2] * Shear[0][2] + m[3] * Shear[0][3]; + Result[1] = m[0] * Shear[1][0] + m[1] * Shear[1][1] + m[2] * Shear[1][2] + m[3] * Shear[1][3]; + Result[2] = m[0] * Shear[2][0] + m[1] * Shear[2][1] + m[2] * Shear[2][2] + m[3] * Shear[2][3]; + Result[3] = m[0] * Shear[3][0] + m[1] * Shear[3][1] + m[2] * Shear[3][2] + m[3] * Shear[3][3]; return Result; } diff --git a/readme.md b/readme.md index d2dfa7a6f..3680e1d31 100644 --- a/readme.md +++ b/readme.md @@ -114,6 +114,7 @@ target_link_libraries(main PRIVATE glm::glm) #### Fixes: - Fixed C++ language auto detection build, disable C++98 warnings with Clang #1235, #1231 - Fixed `GTX_color_space` missing include #1233 #1238 +- Fixed `EXT_matrix_transform` `shear` implementation #1140 #1182 ### [GLM 1.0.0](https://github.com/g-truc/glm/releases/tag/1.0.0) - 2024-01-24 #### Features: diff --git a/test/core/core_func_matrix.cpp b/test/core/core_func_matrix.cpp index c96fc0885..611816d46 100644 --- a/test/core/core_func_matrix.cpp +++ b/test/core/core_func_matrix.cpp @@ -280,12 +280,14 @@ static int test_shearing() glm::vec4(1, 1, 1, 0), glm::vec4(1, 1, 0, 1)); glm::mat4x4 const B4x4 = glm::shear(A4x4, center, l_x, l_y, l_z); + glm::mat4x4 const C4x4 = glm::shear_slow(A4x4, center, l_x, l_y, l_z); glm::mat4x4 const expected( glm::vec4(0, 0, 1, 1), - glm::vec4(2, 1, 1, 0), - glm::vec4(3, 1, 1, 0), - glm::vec4(3, 1, 0, 1)); + glm::vec4(0, 1, 3, 2), + glm::vec4(1, 1, 1, 0), + glm::vec4(1, 1, 0, 1)); Error += all(equal(B4x4, expected, epsilon())) ? 0 : 1; + Error += all(equal(C4x4, expected, epsilon())) ? 0 : 1; } { @@ -299,12 +301,14 @@ static int test_shearing() glm::vec4(1, 1, 1, 0), glm::vec4(1, 0, 0, 0)); glm::mat4x4 const B4x4 = glm::shear(A4x4, center, l_x, l_y, l_z); + glm::mat4x4 const C4x4 = glm::shear_slow(A4x4, center, l_x, l_y, l_z); glm::mat4x4 const expected( - glm::vec4(0, 1, 1, 0), - glm::vec4(1, 2, 1, 0), - glm::vec4(2, 2, 2, 0), - glm::vec4(1, 0, 1, 0)); + glm::vec4(1, 1, 2, 0), + glm::vec4(0, 1, 2, 0), + glm::vec4(1, 2, 2, 0), + glm::vec4(1, 0, 0, 0)); Error += all(equal(B4x4, expected, epsilon())) ? 0 : 1; + Error += all(equal(C4x4, expected, epsilon())) ? 0 : 1; } { @@ -314,12 +318,14 @@ static int test_shearing() glm::vec2 const l_z(4, 5); glm::mat4x4 const A4x4(1); glm::mat4x4 const B4x4 = glm::shear(A4x4, center, l_x, l_y, l_z); + glm::mat4x4 const C4x4 = glm::shear_slow(A4x4, center, l_x, l_y, l_z); glm::mat4x4 const expected( glm::vec4(1, 3, 4, 0), glm::vec4(1, 1, 5, 0), glm::vec4(2, 1, 1, 0), glm::vec4(-9, -8, -9, 1)); Error += all(equal(B4x4, expected, epsilon())) ? 0 : 1; + Error += all(equal(C4x4, expected, epsilon())) ? 0 : 1; } { @@ -333,12 +339,14 @@ static int test_shearing() glm::vec4(4, -8, 0, 0), glm::vec4(7, 1, -2, 0)); glm::mat4x4 const B4x4 = glm::shear(A4x4, center, l_x, l_y, l_z); + glm::mat4x4 const C4x4 = glm::shear_slow(A4x4, center, l_x, l_y, l_z); glm::mat4x4 const expected( - glm::vec4(1, -6, -1, 0), - glm::vec4(7, 12, 23, 0), - glm::vec4(-4, 4, -24, 0), - glm::vec4(4, 20, 31, 0)); + glm::vec4(22, -24, 4, 0), + glm::vec4(20, -36, 2, 0), + glm::vec4(1, -2, 3, 0), + glm::vec4(-26, 39, -19, 0)); Error += all(equal(B4x4, expected, epsilon())) ? 0 : 1; + Error += all(equal(C4x4, expected, epsilon())) ? 0 : 1; } return Error; @@ -392,19 +400,20 @@ static int test_inverse_perf(std::size_t Count, std::size_t Instance, char const int main() { int Error = 0; + Error += test_matrixCompMult(); Error += test_outerProduct(); Error += test_transpose(); Error += test_determinant(); Error += test_inverse(); - Error += test_inverse_simd(); - Error += test_shearing(); + Error += test_inverse_simd(); + Error += test_shearing(); -# ifdef NDEBUG +#ifdef NDEBUG std::size_t const Samples = 1000; -# else +#else std::size_t const Samples = 1; -# endif//NDEBUG +#endif//NDEBUG for(std::size_t i = 0; i < 1; ++i) {