From 3977b9c57c349a591a6db46fb0d8ef51a86e744d Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 18 Jan 2018 21:22:37 +0100 Subject: [PATCH] collide: fix multithreaded pipeline crash with CollisionVisualizer --- panda/src/collide/collisionVisualizer.I | 4 +++ panda/src/collide/collisionVisualizer.cxx | 34 +++++++++++++++++++---- panda/src/collide/collisionVisualizer.h | 3 ++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/panda/src/collide/collisionVisualizer.I b/panda/src/collide/collisionVisualizer.I index 3c14f309cf..16e218f267 100644 --- a/panda/src/collide/collisionVisualizer.I +++ b/panda/src/collide/collisionVisualizer.I @@ -31,6 +31,7 @@ SolidInfo() { */ INLINE void CollisionVisualizer:: set_point_scale(PN_stdfloat point_scale) { + LightMutexHolder holder(_lock); _point_scale = point_scale; } @@ -39,6 +40,7 @@ set_point_scale(PN_stdfloat point_scale) { */ INLINE PN_stdfloat CollisionVisualizer:: get_point_scale() const { + LightMutexHolder holder(_lock); return _point_scale; } @@ -51,6 +53,7 @@ get_point_scale() const { */ INLINE void CollisionVisualizer:: set_normal_scale(PN_stdfloat normal_scale) { + LightMutexHolder holder(_lock); _normal_scale = normal_scale; } @@ -59,6 +62,7 @@ set_normal_scale(PN_stdfloat normal_scale) { */ INLINE PN_stdfloat CollisionVisualizer:: get_normal_scale() const { + LightMutexHolder holder(_lock); return _normal_scale; } diff --git a/panda/src/collide/collisionVisualizer.cxx b/panda/src/collide/collisionVisualizer.cxx index d58137ce68..204a39b6bd 100644 --- a/panda/src/collide/collisionVisualizer.cxx +++ b/panda/src/collide/collisionVisualizer.cxx @@ -41,7 +41,7 @@ TypeHandle CollisionVisualizer::_type_handle; * */ CollisionVisualizer:: -CollisionVisualizer(const string &name) : PandaNode(name) { +CollisionVisualizer(const string &name) : PandaNode(name), _lock("CollisionVisualizer") { set_cull_callback(); // We always want to render the CollisionVisualizer node itself (even if it @@ -51,6 +51,23 @@ CollisionVisualizer(const string &name) : PandaNode(name) { _normal_scale = 1.0f; } +/** + * Copy constructor. + */ +CollisionVisualizer:: +CollisionVisualizer(const CollisionVisualizer ©) : + PandaNode(copy), + _lock("CollisionVisualizer"), + _point_scale(copy._point_scale), + _normal_scale(copy._normal_scale) { + + set_cull_callback(); + + // We always want to render the CollisionVisualizer node itself (even if it + // doesn't appear to have any geometry within it). + set_internal_bounds(new OmniBoundingVolume()); +} + /** * */ @@ -64,6 +81,7 @@ CollisionVisualizer:: */ void CollisionVisualizer:: clear() { + LightMutexHolder holder(_lock); _data.clear(); } @@ -99,6 +117,8 @@ bool CollisionVisualizer:: cull_callback(CullTraverser *trav, CullTraverserData &data) { // Now we go through and actually draw our visualized collision solids. + LightMutexHolder holder(_lock); + Data::const_iterator di; for (di = _data.begin(); di != _data.end(); ++di) { const TransformState *net_transform = (*di).first; @@ -257,6 +277,7 @@ output(ostream &out) const { void CollisionVisualizer:: begin_traversal() { CollisionRecorder::begin_traversal(); + LightMutexHolder holder(_lock); _data.clear(); } @@ -271,12 +292,13 @@ collision_tested(const CollisionEntry &entry, bool detected) { NodePath node_path = entry.get_into_node_path(); CPT(TransformState) net_transform = node_path.get_net_transform(); - const CollisionSolid *solid = entry.get_into(); - nassertv(solid != (CollisionSolid *)NULL); + CPT(CollisionSolid) solid = entry.get_into(); + nassertv(!solid.is_null()); - VizInfo &viz_info = _data[net_transform]; + LightMutexHolder holder(_lock); + VizInfo &viz_info = _data[move(net_transform)]; if (detected) { - viz_info._solids[solid]._detected_count++; + viz_info._solids[move(solid)]._detected_count++; if (entry.has_surface_point()) { CollisionPoint p; @@ -286,7 +308,7 @@ collision_tested(const CollisionEntry &entry, bool detected) { } } else { - viz_info._solids[solid]._missed_count++; + viz_info._solids[move(solid)]._missed_count++; } } diff --git a/panda/src/collide/collisionVisualizer.h b/panda/src/collide/collisionVisualizer.h index 29d920f92d..88491c4e26 100644 --- a/panda/src/collide/collisionVisualizer.h +++ b/panda/src/collide/collisionVisualizer.h @@ -20,6 +20,7 @@ #include "collisionSolid.h" #include "nodePath.h" #include "pmap.h" +#include "lightMutex.h" #ifdef DO_COLLISION_RECORDING @@ -34,6 +35,7 @@ class EXPCL_PANDA_COLLIDE CollisionVisualizer : public PandaNode, public CollisionRecorder { PUBLISHED: explicit CollisionVisualizer(const string &name); + CollisionVisualizer(const CollisionVisualizer ©); virtual ~CollisionVisualizer(); INLINE void set_point_scale(PN_stdfloat point_scale); @@ -89,6 +91,7 @@ private: Points _points; }; + LightMutex _lock; typedef pmap Data; Data _data;