GeomPrimitive optimizations & tweaks

This commit is contained in:
rdb 2015-01-23 13:27:58 +01:00
parent c2aa6991d6
commit a56f722c09
5 changed files with 45 additions and 28 deletions

View File

@ -136,6 +136,9 @@ operator << (ostream &out, GeomEnums::Contents contents) {
case GeomEnums::C_morph_delta: case GeomEnums::C_morph_delta:
return out << "morph_delta"; return out << "morph_delta";
case GeomEnums::C_matrix:
return out << "matrix";
} }
return out << "**invalid contents (" << (int)contents << ")**"; return out << "**invalid contents (" << (int)contents << ")**";

View File

@ -295,11 +295,14 @@ add_consecutive_vertices(int start, int num_vertices) {
} }
PT(GeomVertexArrayData) array_obj = cdata->_vertices.get_write_pointer(); PT(GeomVertexArrayData) array_obj = cdata->_vertices.get_write_pointer();
int old_num_rows = array_obj->get_num_rows();
array_obj->unclean_set_num_rows(old_num_rows + num_vertices);
GeomVertexWriter index(array_obj, 0); GeomVertexWriter index(array_obj, 0);
index.set_row_unsafe(array_obj->get_num_rows()); index.set_row_unsafe(old_num_rows);
for (int v = start; v <= end; ++v) { for (int v = start; v <= end; ++v) {
index.add_data1i(v); index.set_data1i(v);
} }
cdata->_modified = Geom::get_next_modified(); cdata->_modified = Geom::get_next_modified();
@ -1019,11 +1022,13 @@ make_points() const {
// Now construct a new index array with just those bits. // Now construct a new index array with just those bits.
PT(GeomVertexArrayData) new_vertices = make_index_data(); PT(GeomVertexArrayData) new_vertices = make_index_data();
new_vertices->unclean_set_num_rows(bits.get_num_on_bits());
GeomVertexWriter new_index(new_vertices, 0); GeomVertexWriter new_index(new_vertices, 0);
int p = bits.get_lowest_on_bit(); int p = bits.get_lowest_on_bit();
while (p != -1) { while (p != -1) {
while (bits.get_bit(p)) { while (bits.get_bit(p)) {
new_index.add_data1i(p); new_index.set_data1i(p);
++p; ++p;
} }
int q = bits.get_next_higher_different_bit(p); int q = bits.get_next_higher_different_bit(p);
@ -2020,10 +2025,14 @@ recompute_minmax(GeomPrimitive::CData *cdata) {
cdata->_mins = make_index_data(); cdata->_mins = make_index_data();
cdata->_maxs = make_index_data(); cdata->_maxs = make_index_data();
GeomVertexWriter mins(cdata->_mins.get_write_pointer(), 0); GeomVertexArrayData *mins_data = cdata->_mins.get_write_pointer();
mins.reserve_num_rows(cdata->_ends.size()); GeomVertexArrayData *maxs_data = cdata->_maxs.get_write_pointer();
GeomVertexWriter maxs(cdata->_maxs.get_write_pointer(), 0);
maxs.reserve_num_rows(cdata->_ends.size()); mins_data->unclean_set_num_rows(cdata->_ends.size());
maxs_data->unclean_set_num_rows(cdata->_ends.size());
GeomVertexWriter mins(mins_data, 0);
GeomVertexWriter maxs(maxs_data, 0);
int pi = 0; int pi = 0;
@ -2050,8 +2059,8 @@ recompute_minmax(GeomPrimitive::CData *cdata) {
} }
vertex = index.get_data1i(); vertex = index.get_data1i();
mins.add_data1i(min_prim); mins.set_data1i(min_prim);
maxs.add_data1i(max_prim); maxs.set_data1i(max_prim);
min_prim = vertex; min_prim = vertex;
max_prim = vertex; max_prim = vertex;
++pi; ++pi;
@ -2066,8 +2075,8 @@ recompute_minmax(GeomPrimitive::CData *cdata) {
cdata->_max_vertex = max(cdata->_max_vertex, vertex); cdata->_max_vertex = max(cdata->_max_vertex, vertex);
} }
mins.add_data1i(min_prim); mins.set_data1i(min_prim);
maxs.add_data1i(max_prim); maxs.set_data1i(max_prim);
nassertv(mins.get_array_data()->get_num_rows() == (int)cdata->_ends.size()); nassertv(mins.get_array_data()->get_num_rows() == (int)cdata->_ends.size());
} else { } else {
@ -2109,10 +2118,13 @@ do_make_indexed(CData *cdata) {
nassertv(cdata->_num_vertices != -1); nassertv(cdata->_num_vertices != -1);
cdata->_vertices = make_index_data(); cdata->_vertices = make_index_data();
GeomVertexWriter index(cdata->_vertices.get_write_pointer(), 0);
index.reserve_num_rows(cdata->_num_vertices); GeomVertexArrayData *array_data = cdata->_vertices.get_write_pointer();
array_data->unclean_set_num_rows(cdata->_num_vertices);
GeomVertexWriter index(array_data, 0);
for (int i = 0; i < cdata->_num_vertices; ++i) { for (int i = 0; i < cdata->_num_vertices; ++i) {
index.add_data1i(i + cdata->_first_vertex); index.set_data1i(i + cdata->_first_vertex);
} }
cdata->_num_vertices = -1; cdata->_num_vertices = -1;
} }

View File

@ -1538,8 +1538,12 @@ begin_frame(GraphicsStateGuardianBase *gsg, Thread *current_thread) {
qibi != _enqueued_index_buffers.end(); qibi != _enqueued_index_buffers.end();
++qibi) { ++qibi) {
GeomPrimitive *data = (*qibi); GeomPrimitive *data = (*qibi);
// We need this check because the actual index data may
// not actually have propagated to the draw thread yet.
if (data->is_indexed()) {
data->prepare_now(this, gsg); data->prepare_now(this, gsg);
} }
}
_enqueued_index_buffers.clear(); _enqueued_index_buffers.clear();
} }

View File

@ -363,7 +363,6 @@ munge_points_to_quads(const CullTraverser *traverser, bool force) {
// Get the point in eye-space coordinates. // Get the point in eye-space coordinates.
LPoint3 eye = internal.xform_point(vertex.get_data3()); LPoint3 eye = internal.xform_point(vertex.get_data3());
PN_stdfloat dist = gsg->compute_distance_to(eye); PN_stdfloat dist = gsg->compute_distance_to(eye);
points[vi]._eye = eye;
points[vi]._dist = dist; points[vi]._dist = dist;
// The point in clip coordinates. // The point in clip coordinates.

View File

@ -92,7 +92,6 @@ private:
// This class is used internally by munge_points_to_quads(). // This class is used internally by munge_points_to_quads().
class PointData { class PointData {
public: public:
LPoint3 _eye;
PN_stdfloat _dist; PN_stdfloat _dist;
}; };
class SortPoints { class SortPoints {