collide: Improve CollisionSphere viz, add outline

This commit is contained in:
rdb 2021-02-06 01:24:17 +01:00
parent c73c94c862
commit c5568c3d5f
2 changed files with 48 additions and 9 deletions

View File

@ -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;

View File

@ -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();
}
/**