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
This commit is contained in:
rdb 2019-08-23 12:04:26 +02:00
parent 665d2fc56b
commit 8c40ff39d7
2 changed files with 7 additions and 2 deletions

View File

@ -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;
} }
/** /**

View File

@ -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;