From 2bb0fb39998a55b6843261d714d8067e6d12b40a Mon Sep 17 00:00:00 2001 From: EZForever <34133756+EZForever@users.noreply.github.com> Date: Wed, 28 Oct 2020 17:26:53 +0800 Subject: [PATCH 1/3] Add test case for glm::angle() sign bug introduced by #946 --- test/ext/ext_quaternion_trigonometric.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/ext/ext_quaternion_trigonometric.cpp b/test/ext/ext_quaternion_trigonometric.cpp index 1c1d6084..d2371252 100644 --- a/test/ext/ext_quaternion_trigonometric.cpp +++ b/test/ext/ext_quaternion_trigonometric.cpp @@ -21,6 +21,12 @@ static int test_angle() Error += glm::equal(A, 90.0f, Epsilon) ? 0 : 1; } + { + glm::quat const Q = glm::angleAxis(glm::two_pi() - 1.0f, glm::vec3(1, 0, 0)); + float const A = glm::angle(Q); + Error += glm::equal(A, 1.0f, Epsilon) ? 1 : 0; + } + return Error; } From a66b782134f9577f55fd890c56e33024ff700fd3 Mon Sep 17 00:00:00 2001 From: EZForever <34133756+EZForever@users.noreply.github.com> Date: Thu, 29 Oct 2020 13:50:31 +0800 Subject: [PATCH 2/3] fix: glm::angle() discards the sign of result for angles in range (2*pi-1, 2*pi) --- glm/ext/quaternion_trigonometric.inl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/glm/ext/quaternion_trigonometric.inl b/glm/ext/quaternion_trigonometric.inl index 06b7c4c3..56880e22 100644 --- a/glm/ext/quaternion_trigonometric.inl +++ b/glm/ext/quaternion_trigonometric.inl @@ -7,7 +7,10 @@ namespace glm { if (abs(x.w) > cos_one_over_two()) { - return asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast(2); + T const a = asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast(2); + if(x.w < static_cast(0)) + return two_pi() - a; + return a; } return acos(x.w) * static_cast(2); From f109b9185f7fab0c9ca3c61b0dac18beeb201546 Mon Sep 17 00:00:00 2001 From: EZForever <34133756+EZForever@users.noreply.github.com> Date: Thu, 29 Oct 2020 14:02:04 +0800 Subject: [PATCH 3/3] Make CI happy --- glm/ext/quaternion_trigonometric.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glm/ext/quaternion_trigonometric.inl b/glm/ext/quaternion_trigonometric.inl index 56880e22..896449aa 100644 --- a/glm/ext/quaternion_trigonometric.inl +++ b/glm/ext/quaternion_trigonometric.inl @@ -9,7 +9,7 @@ namespace glm { T const a = asin(sqrt(x.x * x.x + x.y * x.y + x.z * x.z)) * static_cast(2); if(x.w < static_cast(0)) - return two_pi() - a; + return pi() * static_cast(2) - a; return a; }