From f867a8e7184e66c5b22b893f8bab49a027217179 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 3 May 2017 20:12:42 -0700 Subject: [PATCH 1/2] guard against bad hinge-constraint settings --- .../physics/src/ObjectConstraintHinge.cpp | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/libraries/physics/src/ObjectConstraintHinge.cpp b/libraries/physics/src/ObjectConstraintHinge.cpp index dd82de924c..730fe5683e 100644 --- a/libraries/physics/src/ObjectConstraintHinge.cpp +++ b/libraries/physics/src/ObjectConstraintHinge.cpp @@ -17,12 +17,12 @@ const uint16_t ObjectConstraintHinge::constraintVersion = 1; - +const glm::vec3 DEFAULT_HINGE_AXIS(1.0f, 0.0f, 0.0f); ObjectConstraintHinge::ObjectConstraintHinge(const QUuid& id, EntityItemPointer ownerEntity) : ObjectConstraint(DYNAMIC_TYPE_HINGE, id, ownerEntity), - _pivotInA(glm::vec3(0.0f)), - _axisInA(glm::vec3(0.0f)) + _axisInA(DEFAULT_HINGE_AXIS), + _axisInB(DEFAULT_HINGE_AXIS) { #if WANT_DEBUG qCDebug(physics) << "ObjectConstraintHinge::ObjectConstraintHinge"; @@ -104,12 +104,27 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { return nullptr; } + if (glm::length(axisInA) == 0.0f) { + qCWarning(physics) << "hinge axis cannot be a zero vector"; + axisInA = DEFAULT_HINGE_AXIS; + } + + axisInA = glm::normalize(axisInA); + if (!otherEntityID.isNull()) { // This hinge is between two entities... find the other rigid body. btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); if (!rigidBodyB) { return nullptr; } + + if (glm::length(axisInB)) { + qCWarning(physics) << "hinge axis cannot be a zero vector"; + axisInB = DEFAULT_HINGE_AXIS; + } + + axisInB = glm::normalize(axisInB); + constraint = new btHingeConstraint(*rigidBodyA, *rigidBodyB, glmToBullet(pivotInA), glmToBullet(pivotInB), glmToBullet(axisInA), glmToBullet(axisInB), From c693687927eba1482e7f21e96523e346c0cd4787 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 3 May 2017 20:23:10 -0700 Subject: [PATCH 2/2] react to very small vectors instead of just zero-length ones --- libraries/physics/src/ObjectConstraintHinge.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/physics/src/ObjectConstraintHinge.cpp b/libraries/physics/src/ObjectConstraintHinge.cpp index 730fe5683e..cf91ca904b 100644 --- a/libraries/physics/src/ObjectConstraintHinge.cpp +++ b/libraries/physics/src/ObjectConstraintHinge.cpp @@ -104,13 +104,13 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { return nullptr; } - if (glm::length(axisInA) == 0.0f) { + if (glm::length(axisInA) < FLT_EPSILON) { qCWarning(physics) << "hinge axis cannot be a zero vector"; axisInA = DEFAULT_HINGE_AXIS; + } else { + axisInA = glm::normalize(axisInA); } - axisInA = glm::normalize(axisInA); - if (!otherEntityID.isNull()) { // This hinge is between two entities... find the other rigid body. btRigidBody* rigidBodyB = getOtherRigidBody(otherEntityID); @@ -118,13 +118,13 @@ btTypedConstraint* ObjectConstraintHinge::getConstraint() { return nullptr; } - if (glm::length(axisInB)) { + if (glm::length(axisInB) < FLT_EPSILON) { qCWarning(physics) << "hinge axis cannot be a zero vector"; axisInB = DEFAULT_HINGE_AXIS; + } else { + axisInB = glm::normalize(axisInB); } - axisInB = glm::normalize(axisInB); - constraint = new btHingeConstraint(*rigidBodyA, *rigidBodyB, glmToBullet(pivotInA), glmToBullet(pivotInB), glmToBullet(axisInA), glmToBullet(axisInB),