|
|
@@ -21,7 +21,7 @@ const int PhysicsController::REGISTERED = 0x04;
|
|
|
const int PhysicsController::REMOVE = 0x08;
|
|
|
|
|
|
PhysicsController::PhysicsController()
|
|
|
- : _collisionConfiguration(NULL), _dispatcher(NULL),
|
|
|
+ : _isUpdating(false), _collisionConfiguration(NULL), _dispatcher(NULL),
|
|
|
_overlappingPairCache(NULL), _solver(NULL), _world(NULL), _ghostPairCallback(NULL),
|
|
|
_debugDrawer(NULL), _status(PhysicsController::Listener::DEACTIVATED), _listeners(NULL),
|
|
|
_gravity(btScalar(0.0), btScalar(-9.8), btScalar(0.0)), _collisionCallback(NULL), _scriptListeners(NULL)
|
|
|
@@ -502,6 +502,7 @@ void PhysicsController::resume()
|
|
|
void PhysicsController::update(float elapsedTime)
|
|
|
{
|
|
|
GP_ASSERT(_world);
|
|
|
+ _isUpdating = true;
|
|
|
|
|
|
// Update the physics simulation, with a maximum
|
|
|
// of 10 simulation steps being performed in a given frame.
|
|
|
@@ -613,6 +614,8 @@ void PhysicsController::update(float elapsedTime)
|
|
|
iter->second._status &= ~COLLISION;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ _isUpdating = false;
|
|
|
}
|
|
|
|
|
|
void PhysicsController::addCollisionListener(PhysicsCollisionObject::CollisionListener* listener, PhysicsCollisionObject* objectA, PhysicsCollisionObject* objectB)
|
|
|
@@ -672,10 +675,11 @@ void PhysicsController::addCollisionObject(PhysicsCollisionObject* object)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void PhysicsController::removeCollisionObject(PhysicsCollisionObject* object)
|
|
|
+void PhysicsController::removeCollisionObject(PhysicsCollisionObject* object, bool removeListeners)
|
|
|
{
|
|
|
GP_ASSERT(object);
|
|
|
GP_ASSERT(_world);
|
|
|
+ GP_ASSERT(!_isUpdating);
|
|
|
|
|
|
// Remove the collision object from the world.
|
|
|
if (object->getCollisionObject())
|
|
|
@@ -698,11 +702,14 @@ void PhysicsController::removeCollisionObject(PhysicsCollisionObject* object)
|
|
|
}
|
|
|
|
|
|
// Find all references to the object in the collision status cache and mark them for removal.
|
|
|
- std::map<PhysicsCollisionObject::CollisionPair, CollisionInfo>::iterator iter = _collisionStatus.begin();
|
|
|
- for (; iter != _collisionStatus.end(); iter++)
|
|
|
+ if (removeListeners)
|
|
|
{
|
|
|
- if (iter->first.objectA == object || iter->first.objectB == object)
|
|
|
- iter->second._status |= REMOVE;
|
|
|
+ std::map<PhysicsCollisionObject::CollisionPair, CollisionInfo>::iterator iter = _collisionStatus.begin();
|
|
|
+ for (; iter != _collisionStatus.end(); iter++)
|
|
|
+ {
|
|
|
+ if (iter->first.objectA == object || iter->first.objectB == object)
|
|
|
+ iter->second._status |= REMOVE;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|