mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
GeomPrimitive optimizations & tweaks
This commit is contained in:
parent
c2aa6991d6
commit
a56f722c09
@ -19,7 +19,7 @@
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GeomEnums::UsageHint output operator
|
||||
// Description:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
ostream &
|
||||
operator << (ostream &out, GeomEnums::UsageHint usage_hint) {
|
||||
@ -45,7 +45,7 @@ operator << (ostream &out, GeomEnums::UsageHint usage_hint) {
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GeomEnums::UsageHint input operator
|
||||
// Description:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
istream &
|
||||
operator >> (istream &in, GeomEnums::UsageHint &usage_hint) {
|
||||
@ -73,32 +73,32 @@ operator >> (istream &in, GeomEnums::UsageHint &usage_hint) {
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GeomEnums::NumericType output operator
|
||||
// Description:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
ostream &
|
||||
operator << (ostream &out, GeomEnums::NumericType numeric_type) {
|
||||
switch (numeric_type) {
|
||||
case GeomEnums::NT_uint8:
|
||||
return out << "uint8";
|
||||
|
||||
|
||||
case GeomEnums::NT_uint16:
|
||||
return out << "uint16";
|
||||
|
||||
|
||||
case GeomEnums::NT_uint32:
|
||||
return out << "uint32";
|
||||
|
||||
|
||||
case GeomEnums::NT_packed_dcba:
|
||||
return out << "packed_dcba";
|
||||
|
||||
|
||||
case GeomEnums::NT_packed_dabc:
|
||||
return out << "packed_dabc";
|
||||
|
||||
|
||||
case GeomEnums::NT_float32:
|
||||
return out << "float32";
|
||||
|
||||
|
||||
case GeomEnums::NT_float64:
|
||||
return out << "float64";
|
||||
|
||||
|
||||
case GeomEnums::NT_stdfloat:
|
||||
return out << "stdfloat";
|
||||
}
|
||||
@ -108,7 +108,7 @@ operator << (ostream &out, GeomEnums::NumericType numeric_type) {
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GeomEnums::Contents output operator
|
||||
// Description:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
ostream &
|
||||
operator << (ostream &out, GeomEnums::Contents contents) {
|
||||
@ -136,6 +136,9 @@ operator << (ostream &out, GeomEnums::Contents contents) {
|
||||
|
||||
case GeomEnums::C_morph_delta:
|
||||
return out << "morph_delta";
|
||||
|
||||
case GeomEnums::C_matrix:
|
||||
return out << "matrix";
|
||||
}
|
||||
|
||||
return out << "**invalid contents (" << (int)contents << ")**";
|
||||
|
@ -295,11 +295,14 @@ add_consecutive_vertices(int start, int num_vertices) {
|
||||
}
|
||||
|
||||
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);
|
||||
index.set_row_unsafe(array_obj->get_num_rows());
|
||||
index.set_row_unsafe(old_num_rows);
|
||||
|
||||
for (int v = start; v <= end; ++v) {
|
||||
index.add_data1i(v);
|
||||
index.set_data1i(v);
|
||||
}
|
||||
|
||||
cdata->_modified = Geom::get_next_modified();
|
||||
@ -1019,11 +1022,13 @@ make_points() const {
|
||||
|
||||
// Now construct a new index array with just those bits.
|
||||
PT(GeomVertexArrayData) new_vertices = make_index_data();
|
||||
new_vertices->unclean_set_num_rows(bits.get_num_on_bits());
|
||||
|
||||
GeomVertexWriter new_index(new_vertices, 0);
|
||||
int p = bits.get_lowest_on_bit();
|
||||
while (p != -1) {
|
||||
while (bits.get_bit(p)) {
|
||||
new_index.add_data1i(p);
|
||||
new_index.set_data1i(p);
|
||||
++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->_maxs = make_index_data();
|
||||
|
||||
GeomVertexWriter mins(cdata->_mins.get_write_pointer(), 0);
|
||||
mins.reserve_num_rows(cdata->_ends.size());
|
||||
GeomVertexWriter maxs(cdata->_maxs.get_write_pointer(), 0);
|
||||
maxs.reserve_num_rows(cdata->_ends.size());
|
||||
GeomVertexArrayData *mins_data = cdata->_mins.get_write_pointer();
|
||||
GeomVertexArrayData *maxs_data = cdata->_maxs.get_write_pointer();
|
||||
|
||||
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;
|
||||
|
||||
@ -2050,8 +2059,8 @@ recompute_minmax(GeomPrimitive::CData *cdata) {
|
||||
}
|
||||
vertex = index.get_data1i();
|
||||
|
||||
mins.add_data1i(min_prim);
|
||||
maxs.add_data1i(max_prim);
|
||||
mins.set_data1i(min_prim);
|
||||
maxs.set_data1i(max_prim);
|
||||
min_prim = vertex;
|
||||
max_prim = vertex;
|
||||
++pi;
|
||||
@ -2066,8 +2075,8 @@ recompute_minmax(GeomPrimitive::CData *cdata) {
|
||||
cdata->_max_vertex = max(cdata->_max_vertex, vertex);
|
||||
}
|
||||
|
||||
mins.add_data1i(min_prim);
|
||||
maxs.add_data1i(max_prim);
|
||||
mins.set_data1i(min_prim);
|
||||
maxs.set_data1i(max_prim);
|
||||
nassertv(mins.get_array_data()->get_num_rows() == (int)cdata->_ends.size());
|
||||
|
||||
} else {
|
||||
@ -2109,10 +2118,13 @@ do_make_indexed(CData *cdata) {
|
||||
|
||||
nassertv(cdata->_num_vertices != -1);
|
||||
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) {
|
||||
index.add_data1i(i + cdata->_first_vertex);
|
||||
index.set_data1i(i + cdata->_first_vertex);
|
||||
}
|
||||
cdata->_num_vertices = -1;
|
||||
}
|
||||
|
@ -1538,7 +1538,11 @@ begin_frame(GraphicsStateGuardianBase *gsg, Thread *current_thread) {
|
||||
qibi != _enqueued_index_buffers.end();
|
||||
++qibi) {
|
||||
GeomPrimitive *data = (*qibi);
|
||||
data->prepare_now(this, gsg);
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
_enqueued_index_buffers.clear();
|
||||
|
@ -363,7 +363,6 @@ munge_points_to_quads(const CullTraverser *traverser, bool force) {
|
||||
// Get the point in eye-space coordinates.
|
||||
LPoint3 eye = internal.xform_point(vertex.get_data3());
|
||||
PN_stdfloat dist = gsg->compute_distance_to(eye);
|
||||
points[vi]._eye = eye;
|
||||
points[vi]._dist = dist;
|
||||
|
||||
// The point in clip coordinates.
|
||||
|
@ -92,7 +92,6 @@ private:
|
||||
// This class is used internally by munge_points_to_quads().
|
||||
class PointData {
|
||||
public:
|
||||
LPoint3 _eye;
|
||||
PN_stdfloat _dist;
|
||||
};
|
||||
class SortPoints {
|
||||
|
Loading…
x
Reference in New Issue
Block a user