Bläddra i källkod

bullet: fix contact added callback behavior

The API seems to imply that the callback is per-world, when it is actually a global setting.  This fixes it to truly behave per-world.  This also fixes a crash on shutdown caused by the callback destructing when the Python interpreter is already shutting down.

Fixes #712
rdb 6 år sedan
förälder
incheckning
8c40ff39d7
2 ändrade filer med 7 tillägg och 2 borttagningar
  1. 6 2
      panda/src/bullet/bulletWorld.cxx
  2. 1 0
      panda/src/bullet/bulletWorld.h

+ 6 - 2
panda/src/bullet/bulletWorld.cxx

@@ -222,6 +222,8 @@ int BulletWorld::
 do_physics(PN_stdfloat dt, int max_substeps, PN_stdfloat stepsize) {
 do_physics(PN_stdfloat dt, int max_substeps, PN_stdfloat stepsize) {
   LightMutexHolder holder(get_global_lock());
   LightMutexHolder holder(get_global_lock());
 
 
+  bullet_contact_added_callback = _contact_added_callback_obj;
+
   _pstat_physics.start();
   _pstat_physics.start();
 
 
   int num_substeps = clamp(int(dt / stepsize), 1, max_substeps);
   int num_substeps = clamp(int(dt / stepsize), 1, max_substeps);
@@ -249,6 +251,8 @@ do_physics(PN_stdfloat dt, int max_substeps, PN_stdfloat stepsize) {
 
 
   _pstat_physics.stop();
   _pstat_physics.stop();
 
 
+  bullet_contact_added_callback.clear();
+
   return n;
   return n;
 }
 }
 
 
@@ -1146,7 +1150,7 @@ set_contact_added_callback(CallbackObject *obj) {
   _world->getSolverInfo().m_solverMode |= SOLVER_USE_2_FRICTION_DIRECTIONS;
   _world->getSolverInfo().m_solverMode |= SOLVER_USE_2_FRICTION_DIRECTIONS;
   _world->getSolverInfo().m_solverMode |= SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;
   _world->getSolverInfo().m_solverMode |= SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;
 
 
-  bullet_contact_added_callback = obj;
+  _contact_added_callback_obj = obj;
 }
 }
 
 
 /**
 /**
@@ -1160,7 +1164,7 @@ clear_contact_added_callback() {
   _world->getSolverInfo().m_solverMode &= ~SOLVER_USE_2_FRICTION_DIRECTIONS;
   _world->getSolverInfo().m_solverMode &= ~SOLVER_USE_2_FRICTION_DIRECTIONS;
   _world->getSolverInfo().m_solverMode &= ~SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;
   _world->getSolverInfo().m_solverMode &= ~SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;
 
 
-  bullet_contact_added_callback = nullptr;
+  _contact_added_callback_obj = nullptr;
 }
 }
 
 
 /**
 /**

+ 1 - 0
panda/src/bullet/bulletWorld.h

@@ -272,6 +272,7 @@ private:
   btOverlapFilterCallback *_filter_cb;
   btOverlapFilterCallback *_filter_cb;
 
 
   PT(CallbackObject) _tick_callback_obj;
   PT(CallbackObject) _tick_callback_obj;
+  PT(CallbackObject) _contact_added_callback_obj;
 
 
   PT(BulletDebugNode) _debug;
   PT(BulletDebugNode) _debug;