From c54f964a3b7c95899a52d5339e1624ae7528d0af Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 14 Aug 2019 14:38:58 +0200 Subject: [PATCH] bullet: workaround for deadlock adding shape to scaled body (#689) --- panda/src/bullet/bulletBodyNode.cxx | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/panda/src/bullet/bulletBodyNode.cxx b/panda/src/bullet/bulletBodyNode.cxx index cb9d7ed9c0..6e258c47d0 100644 --- a/panda/src/bullet/bulletBodyNode.cxx +++ b/panda/src/bullet/bulletBodyNode.cxx @@ -353,9 +353,17 @@ do_add_shape(BulletShape *bullet_shape, const TransformState *ts) { // Reset the shape scaling before we add a shape, and remember the current // Scale so we can restore it later... - NodePath np = NodePath::any_path((PandaNode *)this); - LVector3 scale = np.get_scale(); - np.set_scale(1.0); + CPT(TransformState) prev_transform = get_transform(); + bool scale_changed = false; + if (!prev_transform->is_identity() && prev_transform->get_scale() != LVecBase3(1.0, 1.0, 1.0)) { + // As a hack, temporarily release the lock, since transform_changed will + // otherwise deadlock trying to grab it again. See GitHub issue #689. + LightMutex &lock = BulletWorld::get_global_lock(); + lock.release(); + set_transform(prev_transform->set_scale(LVecBase3(1.0, 1.0, 1.0))); + lock.acquire(); + scale_changed = true; + } // Root shape btCollisionShape *previous = get_object()->getCollisionShape(); @@ -417,7 +425,13 @@ do_add_shape(BulletShape *bullet_shape, const TransformState *ts) { _shapes.push_back(bullet_shape); // Restore the local scaling again - np.set_scale(scale); + if (scale_changed) { + CPT(TransformState) transform = get_transform()->set_scale(prev_transform->get_scale()); + LightMutex &lock = BulletWorld::get_global_lock(); + lock.release(); + set_transform(std::move(transform)); + lock.acquire(); + } do_shape_changed(); }