From 3431db548f2d22e0db7caaa10a1802a9ec6ebaea Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 28 Dec 2016 11:31:47 -0800 Subject: [PATCH] Optimize AnimPose(glm::mat) ctor --- libraries/animation/src/AnimPose.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/animation/src/AnimPose.cpp b/libraries/animation/src/AnimPose.cpp index b62a29d64e..26a16e2457 100644 --- a/libraries/animation/src/AnimPose.cpp +++ b/libraries/animation/src/AnimPose.cpp @@ -18,11 +18,17 @@ const AnimPose AnimPose::identity = AnimPose(glm::vec3(1.0f), glm::vec3(0.0f)); AnimPose::AnimPose(const glm::mat4& mat) : _dirty(false) { + static const float EPSILON = 0.0001f; _mat = mat; _scale = extractScale(mat); // quat_cast doesn't work so well with scaled matrices, so cancel it out. glm::mat4 tmp = glm::scale(mat, 1.0f / _scale); - _rot = glm::normalize(glm::quat_cast(tmp)); + _rot = glm::quat_cast(tmp); + float lengthSquared = glm::length2(_rot); + if (glm::abs(lengthSquared - 1.0f) > EPSILON) { + float oneOverLength = 1.0f / sqrt(lengthSquared); + _rot = glm::quat(_rot.w * oneOverLength, _rot.x * oneOverLength, _rot.y * oneOverLength, _rot.z * oneOverLength); + } _trans = extractTranslation(mat); }