fix issue related to addConstraint/removeConstraint, introduced by filtering collision between two particular bodies

https://github.com/bulletphysics/bullet3/issues/173
This commit is contained in:
erwincoumans
2014-05-17 14:24:22 -07:00
parent 1e2b907562
commit 2601932249
2 changed files with 19 additions and 14 deletions

View File

@@ -653,6 +653,9 @@ void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep)
void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint,bool disableCollisionsBetweenLinkedBodies) void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint,bool disableCollisionsBetweenLinkedBodies)
{ {
m_constraints.push_back(constraint); m_constraints.push_back(constraint);
//Make sure the two bodies of a type constraint are different (possibly add this to the btTypedConstraint constructor?)
btAssert(&constraint->getRigidBodyA()!=&constraint->getRigidBodyB());
if (disableCollisionsBetweenLinkedBodies) if (disableCollisionsBetweenLinkedBodies)
{ {
constraint->getRigidBodyA().addConstraintRef(constraint); constraint->getRigidBodyA().addConstraintRef(constraint);

View File

@@ -326,7 +326,7 @@ void btRigidBody::addConstraintRef(btTypedConstraint* c)
int index = m_constraintRefs.findLinearSearch(c); int index = m_constraintRefs.findLinearSearch(c);
//don't add constraints that are already referenced //don't add constraints that are already referenced
btAssert(index == m_constraintRefs.size()); //btAssert(index == m_constraintRefs.size());
if (index == m_constraintRefs.size()) if (index == m_constraintRefs.size())
{ {
m_constraintRefs.push_back(c); m_constraintRefs.push_back(c);
@@ -340,25 +340,27 @@ void btRigidBody::addConstraintRef(btTypedConstraint* c)
{ {
colObjB->setIgnoreCollisionCheck(colObjA, true); colObjB->setIgnoreCollisionCheck(colObjA, true);
} }
} }
} }
void btRigidBody::removeConstraintRef(btTypedConstraint* c) void btRigidBody::removeConstraintRef(btTypedConstraint* c)
{ {
int index = m_constraintRefs.findLinearSearch(c); int index = m_constraintRefs.findLinearSearch(c);
//don't remove constraints that are not referenced //don't remove constraints that are not referenced
btAssert(index < m_constraintRefs.size()); if(index < m_constraintRefs.size())
m_constraintRefs.remove(c); {
btCollisionObject* colObjA = &c->getRigidBodyA(); m_constraintRefs.remove(c);
btCollisionObject* colObjB = &c->getRigidBodyB(); btCollisionObject* colObjA = &c->getRigidBodyA();
if (colObjA == this) btCollisionObject* colObjB = &c->getRigidBodyB();
{ if (colObjA == this)
colObjA->setIgnoreCollisionCheck(colObjB, false); {
} colObjA->setIgnoreCollisionCheck(colObjB, false);
else }
{ else
colObjB->setIgnoreCollisionCheck(colObjA, false); {
} colObjB->setIgnoreCollisionCheck(colObjA, false);
}
}
} }
int btRigidBody::calculateSerializeBufferSize() const int btRigidBody::calculateSerializeBufferSize() const