fix probs with nonindexed qpgeoms

This commit is contained in:
David Rose 2005-04-20 04:35:31 +00:00
parent e0dca3b43b
commit 052e1bb02c
5 changed files with 45 additions and 35 deletions

View File

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

View File

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

View File

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

View File

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

View File

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