collide: fix multithreaded pipeline crash with CollisionVisualizer

This commit is contained in:
rdb 2018-01-18 21:22:37 +01:00
parent fe0c182830
commit 3977b9c57c
3 changed files with 35 additions and 6 deletions

View File

@ -31,6 +31,7 @@ SolidInfo() {
*/ */
INLINE void CollisionVisualizer:: INLINE void CollisionVisualizer::
set_point_scale(PN_stdfloat point_scale) { set_point_scale(PN_stdfloat point_scale) {
LightMutexHolder holder(_lock);
_point_scale = point_scale; _point_scale = point_scale;
} }
@ -39,6 +40,7 @@ set_point_scale(PN_stdfloat point_scale) {
*/ */
INLINE PN_stdfloat CollisionVisualizer:: INLINE PN_stdfloat CollisionVisualizer::
get_point_scale() const { get_point_scale() const {
LightMutexHolder holder(_lock);
return _point_scale; return _point_scale;
} }
@ -51,6 +53,7 @@ get_point_scale() const {
*/ */
INLINE void CollisionVisualizer:: INLINE void CollisionVisualizer::
set_normal_scale(PN_stdfloat normal_scale) { set_normal_scale(PN_stdfloat normal_scale) {
LightMutexHolder holder(_lock);
_normal_scale = normal_scale; _normal_scale = normal_scale;
} }
@ -59,6 +62,7 @@ set_normal_scale(PN_stdfloat normal_scale) {
*/ */
INLINE PN_stdfloat CollisionVisualizer:: INLINE PN_stdfloat CollisionVisualizer::
get_normal_scale() const { get_normal_scale() const {
LightMutexHolder holder(_lock);
return _normal_scale; return _normal_scale;
} }

View File

@ -41,7 +41,7 @@ TypeHandle CollisionVisualizer::_type_handle;
* *
*/ */
CollisionVisualizer:: CollisionVisualizer::
CollisionVisualizer(const string &name) : PandaNode(name) { CollisionVisualizer(const string &name) : PandaNode(name), _lock("CollisionVisualizer") {
set_cull_callback(); set_cull_callback();
// We always want to render the CollisionVisualizer node itself (even if it // 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; _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:: void CollisionVisualizer::
clear() { clear() {
LightMutexHolder holder(_lock);
_data.clear(); _data.clear();
} }
@ -99,6 +117,8 @@ bool CollisionVisualizer::
cull_callback(CullTraverser *trav, CullTraverserData &data) { cull_callback(CullTraverser *trav, CullTraverserData &data) {
// Now we go through and actually draw our visualized collision solids. // Now we go through and actually draw our visualized collision solids.
LightMutexHolder holder(_lock);
Data::const_iterator di; Data::const_iterator di;
for (di = _data.begin(); di != _data.end(); ++di) { for (di = _data.begin(); di != _data.end(); ++di) {
const TransformState *net_transform = (*di).first; const TransformState *net_transform = (*di).first;
@ -257,6 +277,7 @@ output(ostream &out) const {
void CollisionVisualizer:: void CollisionVisualizer::
begin_traversal() { begin_traversal() {
CollisionRecorder::begin_traversal(); CollisionRecorder::begin_traversal();
LightMutexHolder holder(_lock);
_data.clear(); _data.clear();
} }
@ -271,12 +292,13 @@ collision_tested(const CollisionEntry &entry, bool detected) {
NodePath node_path = entry.get_into_node_path(); NodePath node_path = entry.get_into_node_path();
CPT(TransformState) net_transform = node_path.get_net_transform(); CPT(TransformState) net_transform = node_path.get_net_transform();
const CollisionSolid *solid = entry.get_into(); CPT(CollisionSolid) solid = entry.get_into();
nassertv(solid != (CollisionSolid *)NULL); nassertv(!solid.is_null());
VizInfo &viz_info = _data[net_transform]; LightMutexHolder holder(_lock);
VizInfo &viz_info = _data[move(net_transform)];
if (detected) { if (detected) {
viz_info._solids[solid]._detected_count++; viz_info._solids[move(solid)]._detected_count++;
if (entry.has_surface_point()) { if (entry.has_surface_point()) {
CollisionPoint p; CollisionPoint p;
@ -286,7 +308,7 @@ collision_tested(const CollisionEntry &entry, bool detected) {
} }
} else { } else {
viz_info._solids[solid]._missed_count++; viz_info._solids[move(solid)]._missed_count++;
} }
} }

View File

@ -20,6 +20,7 @@
#include "collisionSolid.h" #include "collisionSolid.h"
#include "nodePath.h" #include "nodePath.h"
#include "pmap.h" #include "pmap.h"
#include "lightMutex.h"
#ifdef DO_COLLISION_RECORDING #ifdef DO_COLLISION_RECORDING
@ -34,6 +35,7 @@
class EXPCL_PANDA_COLLIDE CollisionVisualizer : public PandaNode, public CollisionRecorder { class EXPCL_PANDA_COLLIDE CollisionVisualizer : public PandaNode, public CollisionRecorder {
PUBLISHED: PUBLISHED:
explicit CollisionVisualizer(const string &name); explicit CollisionVisualizer(const string &name);
CollisionVisualizer(const CollisionVisualizer &copy);
virtual ~CollisionVisualizer(); virtual ~CollisionVisualizer();
INLINE void set_point_scale(PN_stdfloat point_scale); INLINE void set_point_scale(PN_stdfloat point_scale);
@ -89,6 +91,7 @@ private:
Points _points; Points _points;
}; };
LightMutex _lock;
typedef pmap<CPT(TransformState), VizInfo> Data; typedef pmap<CPT(TransformState), VizInfo> Data;
Data _data; Data _data;