Browse Source

collide: fix multithreaded pipeline crash with CollisionVisualizer

rdb 8 years ago
parent
commit
3977b9c57c

+ 4 - 0
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;
 }
 

+ 28 - 6
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 &copy) :
+  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++;
   }
 }
 

+ 3 - 0
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 &copy);
   virtual ~CollisionVisualizer();
 
   INLINE void set_point_scale(PN_stdfloat point_scale);
@@ -89,6 +91,7 @@ private:
     Points _points;
   };
 
+  LightMutex _lock;
   typedef pmap<CPT(TransformState), VizInfo> Data;
   Data _data;