36 #ifdef DO_COLLISION_RECORDING
44 CollisionVisualizer(
const std::string &name) :
PandaNode(name), _lock(
"CollisionVisualizer") {
58 CollisionVisualizer(
const CollisionVisualizer ©) :
60 _lock(
"CollisionVisualizer"),
61 _point_scale(copy._point_scale),
62 _normal_scale(copy._normal_scale) {
75 ~CollisionVisualizer() {
82 void CollisionVisualizer::
95 return new CollisionVisualizer(*
this);
116 bool 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));
254 bool CollisionVisualizer::
255 is_renderable()
const {
265 void CollisionVisualizer::
266 output(std::ostream &out)
const {
267 PandaNode::output(out);
269 CollisionRecorder::output(out);
277 void CollisionVisualizer::
279 CollisionRecorder::begin_traversal();
289 void 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());
333 #endif // DO_COLLISION_RECORDING