mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 09:52:27 -04:00
collide: fix multithreaded pipeline crash with CollisionVisualizer
This commit is contained in:
parent
fe0c182830
commit
3977b9c57c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ©) :
|
||||||
|
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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ©);
|
||||||
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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user