Quellcode durchsuchen

fix probs with nonindexed qpgeoms

David Rose vor 20 Jahren
Ursprung
Commit
052e1bb02c

+ 3 - 5
panda/src/gobj/qpgeomLinestrips.cxx

@@ -132,8 +132,6 @@ CPT(qpGeomPrimitive) qpGeomLinestrips::
 decompose_impl() const {
   PT(qpGeomLines) lines = new qpGeomLines(get_usage_hint());
   lines->set_shade_model(get_shade_model());
-  CPT(qpGeomVertexArrayData) vertices = get_vertices();
-  qpGeomVertexReader index(vertices, 0);
   CPTA_int ends = get_ends();
 
   int vi = 0;
@@ -141,10 +139,10 @@ decompose_impl() const {
   while (li < (int)ends.size()) {
     int end = ends[li];
     nassertr(vi + 1 <= end, lines.p());
-    int v0 = index.get_data1i();
+    int v0 = get_vertex(vi);
     ++vi;
     while (vi < end) {
-      int v1 = index.get_data1i();
+      int v1 = get_vertex(vi);
       ++vi;
       lines->add_vertex(v0);
       lines->add_vertex(v1);
@@ -153,7 +151,7 @@ decompose_impl() const {
     }
     ++li;
   }
-  nassertr(vi == vertices->get_num_rows() && index.is_at_end(), NULL);
+  nassertr(vi == get_num_vertices(), NULL);
 
   return lines.p();
 }

+ 5 - 0
panda/src/gobj/qpgeomPrimitive.cxx

@@ -220,10 +220,14 @@ add_vertex(int vertex) {
     if (cdata->_num_vertices == 0) {
       cdata->_first_vertex = vertex;
       cdata->_num_vertices = 1;
+      cdata->_modified = qpGeom::get_next_modified();
+      cdata->_got_minmax = false;
       return;
 
     } else if (vertex == cdata->_first_vertex + cdata->_num_vertices) {
       ++cdata->_num_vertices;
+      cdata->_modified = qpGeom::get_next_modified();
+      cdata->_got_minmax = false;
       return;
     }
     
@@ -397,6 +401,7 @@ offset_vertices(int offset) {
     CDWriter cdata(_cycler);
     cdata->_first_vertex += offset;
     cdata->_modified = qpGeom::get_next_modified();
+    cdata->_got_minmax = false;
   }
 }
 

+ 5 - 7
panda/src/gobj/qpgeomTrifans.cxx

@@ -120,23 +120,21 @@ CPT(qpGeomPrimitive) qpGeomTrifans::
 decompose_impl() const {
   PT(qpGeomTriangles) triangles = new qpGeomTriangles(get_usage_hint());
   triangles->set_shade_model(get_shade_model());
-  CPT(qpGeomVertexArrayData) vertices = get_vertices();
-  qpGeomVertexReader index(vertices, 0);
   CPTA_int ends = get_ends();
 
-  int num_vertices = vertices->get_num_rows();
+  int num_vertices = get_num_vertices();
 
   int vi = 0;
   int li = 0;
   while (li < (int)ends.size()) {
     int end = ends[li];
     nassertr(vi + 2 <= end, triangles.p());
-    int v0 = index.get_data1i();
+    int v0 = get_vertex(vi);
     ++vi;
-    int v1 = index.get_data1i();
+    int v1 = get_vertex(vi);
     ++vi;
     while (vi < end) {
-      int v2 = index.get_data1i();
+      int v2 = get_vertex(vi);
       ++vi;
       triangles->add_vertex(v0);
       triangles->add_vertex(v1);
@@ -147,7 +145,7 @@ decompose_impl() const {
     ++li;
   }
 
-  nassertr(vi == num_vertices && index.is_at_end(), NULL);
+  nassertr(vi == num_vertices, NULL);
 
   return triangles.p();
 }

+ 9 - 13
panda/src/gobj/qpgeomTristrips.cxx

@@ -135,11 +135,9 @@ CPT(qpGeomPrimitive) qpGeomTristrips::
 decompose_impl() const {
   PT(qpGeomTriangles) triangles = new qpGeomTriangles(get_usage_hint());
   triangles->set_shade_model(get_shade_model());
-  CPT(qpGeomVertexArrayData) vertices = get_vertices();
-  qpGeomVertexReader index(vertices, 0);
   CPTA_int ends = get_ends();
 
-  int num_vertices = vertices->get_num_rows();
+  int num_vertices = get_num_vertices();
 
   // We need a slightly different algorithm for SM_flat_first_vertex
   // than for SM_flat_last_vertex, to preserve the key vertex in the
@@ -153,17 +151,16 @@ decompose_impl() const {
     while (li < (int)ends.size()) {
       // Skip unused vertices between tristrips.
       vi += 2;
-      index.set_row(vi);
       int end = ends[li];
       nassertr(vi + 2 <= end, NULL);
-      int v0 = index.get_data1i();
+      int v0 = get_vertex(vi);
       ++vi;
-      int v1 = index.get_data1i();
+      int v1 = get_vertex(vi);
       ++vi;
       bool reversed = false;
       while (vi < end) {
         triangles->add_vertex(v0);
-        int v2 = index.get_data1i();
+        int v2 = get_vertex(vi);
         ++vi;
         if (reversed) {
           triangles->add_vertex(v2);
@@ -180,7 +177,7 @@ decompose_impl() const {
       }
       ++li;
     }
-    nassertr(vi == num_vertices && index.is_at_end(), NULL);
+    nassertr(vi == num_vertices, NULL);
 
   } else {
     // Preserve the last vertex of each component triangle as the
@@ -190,12 +187,11 @@ decompose_impl() const {
     while (li < (int)ends.size()) {
       // Skip unused vertices between tristrips.
       vi += 2;
-      index.set_row(vi);
       int end = ends[li];
       nassertr(vi + 2 <= end, NULL);
-      int v0 = index.get_data1i();
+      int v0 = get_vertex(vi);
       ++vi;
-      int v1 = index.get_data1i();
+      int v1 = get_vertex(vi);
       ++vi;
       bool reversed = false;
       while (vi < end) {
@@ -208,7 +204,7 @@ decompose_impl() const {
           triangles->add_vertex(v1);
           reversed = true;
         }
-        int v2 = index.get_data1i();
+        int v2 = get_vertex(vi);
         ++vi;
         triangles->add_vertex(v2);
         v0 = v1;
@@ -217,7 +213,7 @@ decompose_impl() const {
       }
       ++li;
     }
-    nassertr(vi == num_vertices && index.is_at_end(), NULL);
+    nassertr(vi == num_vertices, NULL);
   }
 
   return triangles.p();

+ 23 - 10
panda/src/pgraph/cullableObject.cxx

@@ -267,15 +267,28 @@ munge_points_to_quads(const CullTraverser *traverser) {
     unsigned int *vertices = (unsigned int *)alloca(num_vertices * sizeof(unsigned int));
     unsigned int *vertices_end = vertices + num_vertices;
 
-    qpGeomVertexReader index(primitive->get_vertices(), 0);
-    unsigned int *vi;
-    for (vi = vertices; vi != vertices_end; ++vi) {
-      // Get the point in eye-space coordinates.
-      unsigned int v = index.get_data1i();
-      (*vi) = v;
-      vertex.set_row(v);
-      points[v]._eye = modelview.xform_point(vertex.get_data3f());
-      points[v]._dist = gsg->compute_distance_to(points[v]._eye);
+    if (primitive->is_indexed()) {
+      qpGeomVertexReader index(primitive->get_vertices(), 0);
+      for (unsigned int *vi = vertices; vi != vertices_end; ++vi) {
+        // Get the point in eye-space coordinates.
+        unsigned int v = index.get_data1i();
+        nassertv(v < (unsigned int)num_points);
+        (*vi) = v;
+        vertex.set_row(v);
+        points[v]._eye = modelview.xform_point(vertex.get_data3f());
+        points[v]._dist = gsg->compute_distance_to(points[v]._eye);
+      }
+    } else {
+      // Nonindexed case.
+      unsigned int first_vertex = primitive->get_first_vertex();
+      for (int i = 0; i < num_vertices; ++i) {
+        unsigned int v = i + first_vertex;
+        nassertv(v < (unsigned int)num_points);
+        vertices[i] = v;
+        vertex.set_row(i + first_vertex);
+        points[v]._eye = modelview.xform_point(vertex.get_data3f());
+        points[v]._dist = gsg->compute_distance_to(points[v]._eye);
+      }
     }
   
     // Now sort the points in order from back-to-front so they will
@@ -290,7 +303,7 @@ munge_points_to_quads(const CullTraverser *traverser) {
     // together).
     PT(qpGeomPrimitive) new_primitive = new qpGeomTriangles(qpGeom::UH_client);
 
-    for (vi = vertices; vi != vertices_end; ++vi) {
+    for (unsigned int *vi = vertices; vi != vertices_end; ++vi) {
       // The point in eye coordinates.
       const LPoint3f &eye = points[*vi]._eye;