mirror of
https://github.com/g-truc/glm.git
synced 2024-11-13 22:01:46 +00:00
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.
This commit is contained in:
parent
dc2a00e3a8
commit
d6d272e9a0
@ -56,7 +56,11 @@ namespace glm
|
|||||||
|
|
||||||
//Prevent a division by 0 error later on
|
//Prevent a division by 0 error later on
|
||||||
T VectorMagnitude = x.x * x.x + x.y * x.y + x.z * x.z;
|
T VectorMagnitude = x.x * x.x + x.y * x.y + x.z * x.z;
|
||||||
if (glm::abs(VectorMagnitude - static_cast<T>(0)) < glm::epsilon<T>()) {
|
//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<T>::min()) {
|
||||||
//Equivalent to raising a real number to a power
|
//Equivalent to raising a real number to a power
|
||||||
return qua<T, Q>(pow(x.w, y), 0, 0, 0);
|
return qua<T, Q>(pow(x.w, y), 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user