diff --git a/panda/src/collide/collisionSolid.cxx b/panda/src/collide/collisionSolid.cxx index b68673be15..315fb3d17e 100644 --- a/panda/src/collide/collisionSolid.cxx +++ b/panda/src/collide/collisionSolid.cxx @@ -139,7 +139,11 @@ get_viz(const CullTraverser *, const CullTraverserData &, bool bounds_only) cons ((CollisionSolid *)this)->_bounds_viz_geom = new GeomNode("bounds_viz"); } else { _viz_geom->remove_all_geoms(); + _viz_geom->clear_effects(); + _viz_geom->clear_transform(); _bounds_viz_geom->remove_all_geoms(); + _bounds_viz_geom->clear_effects(); + _bounds_viz_geom->clear_transform(); } ((CollisionSolid *)this)->fill_viz_geom(); ((CollisionSolid *)this)->_flags &= ~F_viz_geom_stale; @@ -447,7 +451,7 @@ get_wireframe_viz_state() { static CPT(RenderState) intangible_state = nullptr; if (intangible_state == nullptr) { intangible_state = base_state->add_attrib - (ColorAttrib::make_flat(LColor(1.0f, 1.0f, 0.0f, 1.0f))); + (ColorAttrib::make_flat(LColor(0, 0, 0.0f, 1.0f))); } return intangible_state; diff --git a/panda/src/collide/collisionSphere.cxx b/panda/src/collide/collisionSphere.cxx index 0d3275ec36..631c0a5171 100644 --- a/panda/src/collide/collisionSphere.cxx +++ b/panda/src/collide/collisionSphere.cxx @@ -31,7 +31,9 @@ #include "mathNumbers.h" #include "geom.h" #include "geomTristrips.h" +#include "geomLinestrips.h" #include "geomVertexWriter.h" +#include "billboardEffect.h" using std::max; using std::min; @@ -551,34 +553,67 @@ fill_viz_geom() { } static const int num_slices = 16; - static const int num_stacks = 8; + static const int num_stacks = 24; + + Thread *current_thread = Thread::get_current_thread(); PT(GeomVertexData) vdata = new GeomVertexData - ("collision", GeomVertexFormat::get_v3(), - Geom::UH_static); + ("collision", GeomVertexFormat::get_v3(), Geom::UH_static); + vdata->unclean_set_num_rows(num_slices * num_stacks * 2); GeomVertexWriter vertex(vdata, InternalName::get_vertex()); PT(GeomTristrips) strip = new GeomTristrips(Geom::UH_static); for (int sl = 0; sl < num_slices; ++sl) { PN_stdfloat longitude0 = (PN_stdfloat)sl / (PN_stdfloat)num_slices; PN_stdfloat longitude1 = (PN_stdfloat)(sl + 1) / (PN_stdfloat)num_slices; - vertex.add_data3(compute_point(0.0, longitude0)); + vertex.set_data3(compute_point(0.0, longitude0)); for (int st = 1; st < num_stacks; ++st) { PN_stdfloat latitude = (PN_stdfloat)st / (PN_stdfloat)num_stacks; - vertex.add_data3(compute_point(latitude, longitude0)); - vertex.add_data3(compute_point(latitude, longitude1)); + vertex.set_data3(compute_point(latitude, longitude0)); + vertex.set_data3(compute_point(latitude, longitude1)); } - vertex.add_data3(compute_point(1.0, longitude0)); + vertex.set_data3(compute_point(1.0, longitude0)); strip->add_next_vertices(num_stacks * 2); strip->close_primitive(); } + // Also create a ring around the outer edge. + PT(GeomLinestrips) ring = new GeomLinestrips(Geom::UH_static); + ring->set_index_type(GeomEnums::NT_uint16); + { + PT(GeomVertexArrayDataHandle) handle = ring->modify_vertices_handle(current_thread); + handle->unclean_set_num_rows(num_stacks * 2 + 1); + uint16_t *ptr = (uint16_t *)handle->get_write_pointer(); + *ptr++ = 0; + for (int i = 0; i < num_stacks; ++i) { + *ptr++ = i * 2 + 1; + } + int offset = num_slices * num_stacks; + for (int i = num_stacks - 1; i > 0; --i) { + *ptr++ = offset + i * 2 - 1; + } + *ptr++ = offset; + } + ring->close_primitive(); + PT(Geom) geom = new Geom(vdata); geom->add_primitive(strip); + PT(Geom) ring_geom = new Geom(vdata); + ring_geom->add_primitive(ring); + + CPT(TransformState) transform = TransformState::make_pos(get_center()); + _viz_geom->add_geom(geom, get_solid_viz_state()); + _viz_geom->add_geom(ring_geom, get_wireframe_viz_state()); + _viz_geom->set_transform(transform); + _viz_geom->set_effect(BillboardEffect::make_point_eye()); + _bounds_viz_geom->add_geom(geom, get_solid_bounds_viz_state()); + _bounds_viz_geom->add_geom(ring_geom, get_wireframe_bounds_viz_state()); + _bounds_viz_geom->set_transform(transform); + _bounds_viz_geom->set_effect(BillboardEffect::make_point_eye()); } /** @@ -728,7 +763,7 @@ compute_point(PN_stdfloat latitude, PN_stdfloat longitude) const { csincos(longitude * 2.0f * MathNumbers::pi, &s2, &c2); LVertex p(s1 * c2, s1 * s2, c1); - return p * get_radius() + get_center(); + return p * get_radius(); } /**