From f867a8e7184e66c5b22b893f8bab49a027217179 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 3 May 2017 20:12:42 -0700 Subject: [PATCH] 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),