fix probs with nonindexed qpgeoms
This commit is contained in:
parent
e0dca3b43b
commit
052e1bb02c
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue