whoops, triangulation goof

This commit is contained in:
David Rose 2013-01-04 01:44:25 +00:00
parent b3b2308c6c
commit 42aa65d92c
2 changed files with 32 additions and 25 deletions

View File

@ -699,6 +699,7 @@ process_f_node(vector_string &words) {
return false;
}
int synth_vni = 0;
if (!all_vn) {
// Synthesize a normal if we need it.
LNormal normal = LNormal::zero();
@ -716,8 +717,9 @@ process_f_node(vector_string &words) {
normal[2] += p0[0] * p1[1] - p0[1] * p1[0];
}
normal.normalize();
int synth_vni = add_synth_normal(normal);
synth_vni = add_synth_normal(normal);
/*
// Roll the polygon around to put the "non-vn" vertex at the
// end.
while (non_vn_index + 1 < verts.size()) {
@ -728,6 +730,7 @@ process_f_node(vector_string &words) {
}
verts.back()._synth_vni = synth_vni;
*/
}
Triangulator3 tri;
@ -750,32 +753,18 @@ process_f_node(vector_string &words) {
// We'll exceed our specified limit with these triangles; start a new Geom.
_current_vertex_data->close_geom(this);
}
pvector<int> indices;
indices.reserve(verts.size());
for (size_t i = 0; i < verts.size(); ++i) {
int index = _current_vertex_data->add_vertex(this, verts[i]);
indices.push_back(index);
}
if (indices.size() == 3) {
if (verts.size() == 3) {
// It's already a triangle; add it directly.
_current_vertex_data->add_triangle(indices[0], indices[1], indices[2]);
} else {
// We have to triangulate a higher-order polygon.
for (size_t i = 0; i < verts.size(); ++i) {
const LVecBase4 &p = _v_table[verts[i]._vi - 1];
tri.add_vertex(p[0], p[1], p[2]);
tri.add_polygon_vertex(i);
}
_current_vertex_data->add_triangle(this, verts[0], verts[1], verts[2], synth_vni);
tri.triangulate();
int num_tris = tri.get_num_triangles();
} else {
// Get the triangulated results.
for (int ti = 0; ti < num_tris; ++ti) {
int i0 = tri.get_triangle_v0(ti);
int i1 = tri.get_triangle_v1(ti);
int i2 = tri.get_triangle_v2(ti);
_current_vertex_data->add_triangle(indices[i0], indices[i1], indices[i2]);
_current_vertex_data->add_triangle(this, verts[i0], verts[i1], verts[i2], synth_vni);
}
}
@ -1038,12 +1027,28 @@ add_vertex(const ObjToEggConverter *converter, const VertexEntry &entry) {
// Function: ObjToEggConverter::VertexData::add_triangle
// Access: Public
// Description: Adds a triangle to the primitive, as a triple of
// three vertex index numbers (as returned by
// add_vertex()).
// three VertexEntry objects, which are each added to
// the vertex pool. If synth_vni is not 0, it is
// assigned to the last vertex.
////////////////////////////////////////////////////////////////////
void ObjToEggConverter::VertexData::
add_triangle(int v1, int v2, int v3) {
_prim->add_vertices(v1, v2, v3);
add_triangle(const ObjToEggConverter *converter, const VertexEntry &v0,
const VertexEntry &v1, const VertexEntry &v2,
int synth_vni) {
int v0i, v1i, v2i;
v0i = add_vertex(converter, v0);
v1i = add_vertex(converter, v1);
if (synth_vni != 0) {
VertexEntry v2n(v2);
v2n._synth_vni = synth_vni;
v2i = add_vertex(converter, v2n);
} else {
v2i = add_vertex(converter, v2);
}
_prim->add_vertices(v0i, v1i, v2i);
_prim->close_primitive();
}

View File

@ -122,7 +122,9 @@ protected:
VertexData(PandaNode *parent, const string &name);
int add_vertex(const ObjToEggConverter *converter, const VertexEntry &entry);
void add_triangle(int v1, int v2, int v3);
void add_triangle(const ObjToEggConverter *converter, const VertexEntry &v0,
const VertexEntry &v1, const VertexEntry &v2,
int synth_vni);
void close_geom(const ObjToEggConverter *converter);
PT(PandaNode) _parent;