Explorar el Código

GeomPrimitive optimizations & tweaks

rdb hace 11 años
padre
commit
a56f722c09

+ 14 - 11
panda/src/gobj/geomEnums.cxx

@@ -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 << ")**";

+ 26 - 14
panda/src/gobj/geomPrimitive.cxx

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

+ 5 - 1
panda/src/gobj/preparedGraphicsObjects.cxx

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

+ 0 - 1
panda/src/pgraph/cullableObject.cxx

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

+ 0 - 1
panda/src/pgraph/cullableObject.h

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