mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 08:44:19 -04:00
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:
parent
665d2fc56b
commit
8c40ff39d7
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user