From 052e1bb02cba45b9e5b9daf2ef4fc76e3c6d8a7a Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 20 Apr 2005 04:35:31 +0000 Subject: [PATCH] fix probs with nonindexed qpgeoms --- panda/src/gobj/qpgeomLinestrips.cxx | 8 +++---- panda/src/gobj/qpgeomPrimitive.cxx | 5 +++++ panda/src/gobj/qpgeomTrifans.cxx | 12 +++++------ panda/src/gobj/qpgeomTristrips.cxx | 22 ++++++++----------- panda/src/pgraph/cullableObject.cxx | 33 ++++++++++++++++++++--------- 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/panda/src/gobj/qpgeomLinestrips.cxx b/panda/src/gobj/qpgeomLinestrips.cxx index d519d49858..56243b67aa 100644 --- a/panda/src/gobj/qpgeomLinestrips.cxx +++ b/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(); } diff --git a/panda/src/gobj/qpgeomPrimitive.cxx b/panda/src/gobj/qpgeomPrimitive.cxx index 76c5ca0563..0fa8c37f9e 100644 --- a/panda/src/gobj/qpgeomPrimitive.cxx +++ b/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; } } diff --git a/panda/src/gobj/qpgeomTrifans.cxx b/panda/src/gobj/qpgeomTrifans.cxx index dd51f7be96..8de3d06b79 100644 --- a/panda/src/gobj/qpgeomTrifans.cxx +++ b/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(); } diff --git a/panda/src/gobj/qpgeomTristrips.cxx b/panda/src/gobj/qpgeomTristrips.cxx index c269dfec18..0f3b0eb7e7 100644 --- a/panda/src/gobj/qpgeomTristrips.cxx +++ b/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(); diff --git a/panda/src/pgraph/cullableObject.cxx b/panda/src/pgraph/cullableObject.cxx index 58d54c99f2..59d4a46e70 100644 --- a/panda/src/pgraph/cullableObject.cxx +++ b/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;