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)
{
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)
{
constraint->getRigidBodyA().addConstraintRef(constraint);

View File

@@ -326,7 +326,7 @@ void btRigidBody::addConstraintRef(btTypedConstraint* c)
int index = m_constraintRefs.findLinearSearch(c);
//don't add constraints that are already referenced
btAssert(index == m_constraintRefs.size());
//btAssert(index == m_constraintRefs.size());
if (index == m_constraintRefs.size())
{
m_constraintRefs.push_back(c);
@@ -347,7 +347,8 @@ void btRigidBody::removeConstraintRef(btTypedConstraint* c)
{
int index = m_constraintRefs.findLinearSearch(c);
//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();
btCollisionObject* colObjB = &c->getRigidBodyB();
@@ -359,6 +360,7 @@ void btRigidBody::removeConstraintRef(btTypedConstraint* c)
{
colObjB->setIgnoreCollisionCheck(colObjA, false);
}
}
}
int btRigidBody::calculateSerializeBufferSize() const