added correct constraint removal

This commit is contained in:
Otto Naderer 2014-03-20 15:28:54 +01:00
parent 87ca7d8a14
commit fb8fba9170
2 changed files with 26 additions and 0 deletions

View File

@ -100,6 +100,7 @@ class irrDynamics
~irrDynamics();
static irrDynamics* instance;
void clearObjects();
void removeConstraints(btRigidBody* rigidBody);
//bt-related stuff
class btDefaultCollisionConfiguration *collisionConfiguration;

View File

@ -138,6 +138,7 @@ void irrDynamics::removeObject(scene::ISceneNode* node)
std::map<scene::ISceneNode*, btRigidBody*>::iterator iter = inst->objects.find(node);
if (iter != inst->objects.end())
{
inst->removeConstraints(iter->second);
inst->world->removeRigidBody(iter->second);
// Free memory
@ -157,6 +158,7 @@ void irrDynamics::clearObjects()
{
for (std::map<scene::ISceneNode*, btRigidBody*>::iterator iter = objects.begin(); iter != objects.end(); iter++)
{
removeConstraints(iter->second);
world->removeRigidBody(iter->second);
// Free memory
@ -407,3 +409,26 @@ void irrDynamics::setPosition(scene::ISceneNode* node, const core::vector3df& ne
transform.setOrigin(btVector3(newPos.X, newPos.Y, newPos.Z));
iter->second->setCenterOfMassTransform(transform);
}
void irrDynamics::removeConstraints(btRigidBody* rigidBody)
{
const int len = rigidBody->getNumConstraintRefs();
//first, remove constraint reference at the other node
for (int i = 0; i < len; i++)
{
btTypedConstraint* constraint = rigidBody->getConstraintRef(i);
btRigidBody* bodyB = &(constraint->getRigidBodyB());
if (bodyB == rigidBody)
bodyB = &(constraint->getRigidBodyA());
bodyB->removeConstraintRef(constraint);
}
//then remove/delete at our side
while (rigidBody->getNumConstraintRefs() > 0)
{
btTypedConstraint* constraint = rigidBody->getConstraintRef(0);
world->removeConstraint(constraint);
rigidBody->removeConstraintRef(constraint);
delete constraint;
}
}