guard against bad hinge-constraint settings

This commit is contained in:
Seth Alves 2017-05-03 20:12:42 -07:00
parent affc7fc654
commit f867a8e718

View file

@ -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),