From e81e49b32e74e05c819a03d0cc5a0af4b64baded Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 18 Mar 2016 15:59:25 -0700 Subject: [PATCH] prevent crash in SwingTwistConstraint --- interface/src/avatar/AvatarUpdate.cpp | 1 + .../animation/src/AnimInverseKinematics.cpp | 2 +- .../animation/src/SwingTwistConstraint.cpp | 19 ++++++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/interface/src/avatar/AvatarUpdate.cpp b/interface/src/avatar/AvatarUpdate.cpp index a52b584527..1c91a21906 100644 --- a/interface/src/avatar/AvatarUpdate.cpp +++ b/interface/src/avatar/AvatarUpdate.cpp @@ -55,6 +55,7 @@ bool AvatarUpdate::process() { deltaMicroseconds = 10000; // 10 ms } float deltaSeconds = (float) deltaMicroseconds / (float) USECS_PER_SECOND; + assert(deltaSeconds > 0.0f); _lastAvatarUpdate = start; qApp->setAvatarSimrateSample(1.0f / deltaSeconds); diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index f4df7ada82..9ae992b86e 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -481,7 +481,7 @@ const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars // smooth transitions by relaxing _hipsOffset toward the new value const float HIPS_OFFSET_SLAVE_TIMESCALE = 0.15f; - float tau = dt > HIPS_OFFSET_SLAVE_TIMESCALE ? 1.0f : dt / HIPS_OFFSET_SLAVE_TIMESCALE; + float tau = dt < HIPS_OFFSET_SLAVE_TIMESCALE ? dt / HIPS_OFFSET_SLAVE_TIMESCALE : 1.0f; _hipsOffset += (newHipsOffset - _hipsOffset) * tau; } } diff --git a/libraries/animation/src/SwingTwistConstraint.cpp b/libraries/animation/src/SwingTwistConstraint.cpp index d6d8c87344..3d0e4e7c5f 100644 --- a/libraries/animation/src/SwingTwistConstraint.cpp +++ b/libraries/animation/src/SwingTwistConstraint.cpp @@ -384,11 +384,20 @@ void SwingTwistConstraint::dynamicallyAdjustLimits(const glm::quat& rotation) { swingTwistDecomposition(postRotation, Vectors::UNIT_Y, swingRotation, twistRotation); - // adjust swing limits - glm::vec3 swungY = swingRotation * Vectors::UNIT_Y; - glm::vec3 swingAxis = glm::cross(Vectors::UNIT_Y, swungY); - float theta = atan2f(-swingAxis.z, swingAxis.x); - _swingLimitFunction.dynamicallyAdjustMinDots(theta, swungY.y); + { // adjust swing limits + glm::vec3 swungY = swingRotation * Vectors::UNIT_Y; + glm::vec3 swingAxis = glm::cross(Vectors::UNIT_Y, swungY); + float theta = atan2f(-swingAxis.z, swingAxis.x); + if (isnan(theta)) { + // atan2f() will only return NaN if either of its arguments is NaN, which can only + // happen if we've been given a bad rotation. Since a NaN value here could potentially + // cause a crash (we use the value of theta to compute indices into a std::vector) + // we specifically check for this case. + theta = 0.0f; + swungY.y = 1.0f; + } + _swingLimitFunction.dynamicallyAdjustMinDots(theta, swungY.y); + } // restore twist limits if (_twistAdjusted) {