mirror of
https://github.com/overte-org/overte.git
synced 2025-07-23 10:44:31 +02:00
Merge pull request #7396 from AndrewMeadows/do-not-trust
prevent crash in SwingTwistConstraint
This commit is contained in:
commit
091e34e792
3 changed files with 16 additions and 6 deletions
|
@ -55,6 +55,7 @@ bool AvatarUpdate::process() {
|
||||||
deltaMicroseconds = 10000; // 10 ms
|
deltaMicroseconds = 10000; // 10 ms
|
||||||
}
|
}
|
||||||
float deltaSeconds = (float) deltaMicroseconds / (float) USECS_PER_SECOND;
|
float deltaSeconds = (float) deltaMicroseconds / (float) USECS_PER_SECOND;
|
||||||
|
assert(deltaSeconds > 0.0f);
|
||||||
_lastAvatarUpdate = start;
|
_lastAvatarUpdate = start;
|
||||||
qApp->setAvatarSimrateSample(1.0f / deltaSeconds);
|
qApp->setAvatarSimrateSample(1.0f / deltaSeconds);
|
||||||
|
|
||||||
|
|
|
@ -481,7 +481,7 @@ const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars
|
||||||
|
|
||||||
// smooth transitions by relaxing _hipsOffset toward the new value
|
// smooth transitions by relaxing _hipsOffset toward the new value
|
||||||
const float HIPS_OFFSET_SLAVE_TIMESCALE = 0.15f;
|
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;
|
_hipsOffset += (newHipsOffset - _hipsOffset) * tau;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -384,11 +384,20 @@ void SwingTwistConstraint::dynamicallyAdjustLimits(const glm::quat& rotation) {
|
||||||
|
|
||||||
swingTwistDecomposition(postRotation, Vectors::UNIT_Y, swingRotation, twistRotation);
|
swingTwistDecomposition(postRotation, Vectors::UNIT_Y, swingRotation, twistRotation);
|
||||||
|
|
||||||
// adjust swing limits
|
{ // adjust swing limits
|
||||||
glm::vec3 swungY = swingRotation * Vectors::UNIT_Y;
|
glm::vec3 swungY = swingRotation * Vectors::UNIT_Y;
|
||||||
glm::vec3 swingAxis = glm::cross(Vectors::UNIT_Y, swungY);
|
glm::vec3 swingAxis = glm::cross(Vectors::UNIT_Y, swungY);
|
||||||
float theta = atan2f(-swingAxis.z, swingAxis.x);
|
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);
|
_swingLimitFunction.dynamicallyAdjustMinDots(theta, swungY.y);
|
||||||
|
}
|
||||||
|
|
||||||
// restore twist limits
|
// restore twist limits
|
||||||
if (_twistAdjusted) {
|
if (_twistAdjusted) {
|
||||||
|
|
Loading…
Reference in a new issue