added correct constraint removal
This commit is contained in:
parent
87ca7d8a14
commit
fb8fba9170
|
@ -100,6 +100,7 @@ class irrDynamics
|
|||
~irrDynamics();
|
||||
static irrDynamics* instance;
|
||||
void clearObjects();
|
||||
void removeConstraints(btRigidBody* rigidBody);
|
||||
|
||||
//bt-related stuff
|
||||
class btDefaultCollisionConfiguration *collisionConfiguration;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue