added correct constraint removal
This commit is contained in:
parent
87ca7d8a14
commit
fb8fba9170
|
@ -100,6 +100,7 @@ class irrDynamics
|
||||||
~irrDynamics();
|
~irrDynamics();
|
||||||
static irrDynamics* instance;
|
static irrDynamics* instance;
|
||||||
void clearObjects();
|
void clearObjects();
|
||||||
|
void removeConstraints(btRigidBody* rigidBody);
|
||||||
|
|
||||||
//bt-related stuff
|
//bt-related stuff
|
||||||
class btDefaultCollisionConfiguration *collisionConfiguration;
|
class btDefaultCollisionConfiguration *collisionConfiguration;
|
||||||
|
|
|
@ -138,6 +138,7 @@ void irrDynamics::removeObject(scene::ISceneNode* node)
|
||||||
std::map<scene::ISceneNode*, btRigidBody*>::iterator iter = inst->objects.find(node);
|
std::map<scene::ISceneNode*, btRigidBody*>::iterator iter = inst->objects.find(node);
|
||||||
if (iter != inst->objects.end())
|
if (iter != inst->objects.end())
|
||||||
{
|
{
|
||||||
|
inst->removeConstraints(iter->second);
|
||||||
inst->world->removeRigidBody(iter->second);
|
inst->world->removeRigidBody(iter->second);
|
||||||
|
|
||||||
// Free memory
|
// Free memory
|
||||||
|
@ -157,6 +158,7 @@ void irrDynamics::clearObjects()
|
||||||
{
|
{
|
||||||
for (std::map<scene::ISceneNode*, btRigidBody*>::iterator iter = objects.begin(); iter != objects.end(); iter++)
|
for (std::map<scene::ISceneNode*, btRigidBody*>::iterator iter = objects.begin(); iter != objects.end(); iter++)
|
||||||
{
|
{
|
||||||
|
removeConstraints(iter->second);
|
||||||
world->removeRigidBody(iter->second);
|
world->removeRigidBody(iter->second);
|
||||||
|
|
||||||
// Free memory
|
// 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));
|
transform.setOrigin(btVector3(newPos.X, newPos.Y, newPos.Z));
|
||||||
iter->second->setCenterOfMassTransform(transform);
|
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