From d6d272e9a0894f8f5168e2313840dbe47ba19dce Mon Sep 17 00:00:00 2001 From: Quentin Santos Date: Mon, 13 Jul 2020 12:35:43 +0200 Subject: [PATCH] Fix handling of small magnitude quaternions The special case handling in glm::qua::pow is specifically intended for the case when the magnitude is null. Even for magnitudes smaller than epsilon, the common formula should be used. Because comparing a floating-point value by equality triggers a warning through the -Weveverything setting of clang, it must be selectively disabled for the condition. --- glm/ext/quaternion_exponential.inl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/glm/ext/quaternion_exponential.inl b/glm/ext/quaternion_exponential.inl index 8456c00a..dd24b6cb 100644 --- a/glm/ext/quaternion_exponential.inl +++ b/glm/ext/quaternion_exponential.inl @@ -56,7 +56,11 @@ namespace glm //Prevent a division by 0 error later on T VectorMagnitude = x.x * x.x + x.y * x.y + x.z * x.z; - if (glm::abs(VectorMagnitude - static_cast(0)) < glm::epsilon()) { + //Despite the compiler might say, we actually want to compare + //VectorMagnitude to 0. here; we could use denorm_int() compiling a + //project with unsafe maths optimizations might make the comparison + //always false, even when VectorMagnitude is 0. + if (VectorMagnitude < std::numeric_limits::min()) { //Equivalent to raising a real number to a power return qua(pow(x.w, y), 0, 0, 0); }