36#ifdef DO_COLLISION_RECORDING
44CollisionVisualizer(
const std::string &name) :
PandaNode(name), _lock(
"CollisionVisualizer") {
58CollisionVisualizer(
const CollisionVisualizer ©) :
60 _lock(
"CollisionVisualizer"),
61 _point_scale(copy._point_scale),
62 _normal_scale(copy._normal_scale) {
75~CollisionVisualizer() {
82void CollisionVisualizer::
95 return new CollisionVisualizer(*
this);
116bool CollisionVisualizer::
122 Data::const_iterator di;
123 for (di = _data.begin(); di != _data.end(); ++di) {
125 const VizInfo &viz_info = (*di).second;
132 xform_data._net_transform = TransformState::make_identity();
134 xform_data.apply_transform(net_transform);
137 Solids::const_iterator si;
138 for (si = viz_info._solids.begin(); si != viz_info._solids.end(); ++si) {
144 const SolidInfo &solid_info = (*si).second;
145 bool was_detected = (solid_info._detected_count > 0);
146 PT(
PandaNode) node = solid->get_viz(trav, xform_data, !was_detected);
147 if (node !=
nullptr) {
152 next_data._state = get_viz_state();
158 if (!viz_info._points.empty()) {
159 CPT(
RenderState) empty_state = RenderState::make_empty();
160 CPT(
RenderState) point_state = RenderState::make(RenderModeAttrib::make(RenderModeAttrib::M_unchanged, 1.0f,
false));
164 Geom::NT_stdfloat, Geom::C_point,
165 InternalName::get_color(), 1,
166 Geom::NT_packed_dabc, Geom::C_color,
167 InternalName::get_size(), 1,
168 Geom::NT_stdfloat, Geom::C_other);
170 GeomVertexFormat::register_format(point_array_format);
172 Points::const_iterator pi;
173 for (pi = viz_info._points.begin(); pi != viz_info._points.end(); ++pi) {
174 const CollisionPoint &point = (*pi);
188 vertex.add_data3(point._surface_point);
189 color.add_data4(1.0f, 0.0f, 0.0f, 1.0f);
190 size.add_data1f(16.0f * _point_scale);
191 points->add_next_vertices(1);
192 points->close_primitive();
194 if (point._interior_point != point._surface_point) {
195 vertex.add_data3(point._interior_point);
196 color.add_data4(1.0f, 1.0f, 1.0f, 1.0f);
197 size.add_data1f(8.0f * _point_scale);
198 points->add_next_vertices(1);
199 points->close_primitive();
202 PT(
Geom) geom =
new Geom(point_vdata);
203 geom->add_primitive(points);
207 xform_data.get_internal_transform(trav));
213 if (!point._surface_normal.almost_equal(LVector3::zero())) {
223 vertex.add_data3(point._surface_point);
224 vertex.add_data3(point._surface_point +
225 point._surface_normal * _normal_scale);
226 color.add_data4(1.0f, 0.0f, 0.0f, 1.0f);
227 color.add_data4(1.0f, 1.0f, 1.0f, 1.0f);
228 lines->add_next_vertices(2);
229 lines->close_primitive();
231 PT(
Geom) geom =
new Geom(line_vdata);
232 geom->add_primitive(lines);
236 xform_data.get_internal_transform(trav));
254bool CollisionVisualizer::
255is_renderable()
const {
265void CollisionVisualizer::
266output(std::ostream &out)
const {
267 PandaNode::output(out);
269 CollisionRecorder::output(out);
277void CollisionVisualizer::
279 CollisionRecorder::begin_traversal();
289void CollisionVisualizer::
291 CollisionRecorder::collision_tested(entry, detected);
294 CPT(
TransformState) net_transform = node_path.get_net_transform();
296 nassertv(!solid.is_null());
299 VizInfo &viz_info = _data[std::move(net_transform)];
301 viz_info._solids[std::move(solid)]._detected_count++;
306 p._surface_point, p._surface_normal, p._interior_point);
307 viz_info._points.push_back(p);
311 viz_info._solids[std::move(solid)]._missed_count++;
325 if (state ==
nullptr) {
326 state = RenderState::make
327 (DepthOffsetAttrib::make());
Defines a single collision event.
get_into
Returns the CollisionSolid pointer for the particular solid was collided into.
bool has_surface_point() const
Returns true if the surface point has been specified, false otherwise.
get_into_node_path
Returns the NodePath that represents the specific CollisionNode or GeomNode instance that was collide...
bool get_all(const NodePath &space, LPoint3 &surface_point, LVector3 &surface_normal, LPoint3 &interior_point) const
Simultaneously transforms the surface point, surface normal, and interior point of the collision into...
The abstract base class for all things that can collide with other things in the world,...
virtual void record_object(CullableObject *object, const CullTraverser *traverser)
This callback function is intended to be overridden by a derived class.
This collects together the pieces of data that are accumulated for each node while walking the scene ...
This object performs a depth-first traversal of the scene graph, with optional view-frustum culling,...
CullHandler * get_cull_handler() const
Returns the object that will receive the culled Geoms.
GeometricBoundingVolume * get_view_frustum() const
Returns the bounding volume that corresponds to the view frustum, or NULL if the view frustum is not ...
void traverse(const NodePath &root)
Begins the traversal from the indicated node.
The smallest atom of cull.
Defines a series of disconnected line segments.
Defines a series of disconnected points.
This defines the actual numeric vertex data stored in a Geom, in the structure defined by a particula...
This object provides a high-level interface for quickly writing a sequence of numeric values from a v...
A container for geometry primitives.
Similar to MutexHolder, but for a light mutex.
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
This is a special kind of GeometricBoundingVolume that fills all of space.
A basic node of the scene graph or data graph.
This represents a unique collection of RenderAttrib objects that correspond to a particular renderabl...
TypeHandle is the identifier used to differentiate C++ class types.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.