From 116a6866d61f5ee210a27f20bb97a2672d95366d Mon Sep 17 00:00:00 2001 From: David Rose Date: Sat, 17 Nov 2001 16:11:50 +0000 Subject: [PATCH] fix couch bug, take 2 --- panda/src/builder/mesherFanMaker.I | 25 ++++++++++++++----------- panda/src/builder/mesherFanMaker.h | 6 ++++-- panda/src/builder/mesherTempl.I | 14 +++++++++++++- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/panda/src/builder/mesherFanMaker.I b/panda/src/builder/mesherFanMaker.I index 67d1b9e191..344371dd28 100644 --- a/panda/src/builder/mesherFanMaker.I +++ b/panda/src/builder/mesherFanMaker.I @@ -149,7 +149,7 @@ compute_angle() const { template int MesherFanMaker:: -build() { +build(pvector &unrolled_tris) { nassertr(_edges.size() == _strips.size(), 0); int num_tris = _edges.size(); @@ -215,12 +215,12 @@ build() { if ( !((*si)->_prims.front() == (*last_si)->_prims.front()) || !(*si)->is_coplanar_with(*(*last_si), _bucket->_coplanar_threshold)) { // Here's the end of a run of matching pieces. - count += unroll(last_si, si, last_ei, ei); + count += unroll(last_si, si, last_ei, ei, unrolled_tris); last_si = si; last_ei = ei; } } - count += unroll(last_si, si, last_ei, ei); + count += unroll(last_si, si, last_ei, ei, unrolled_tris); return count; @@ -261,7 +261,8 @@ build() { template int MesherFanMaker:: unroll(Strips::iterator strip_begin, Strips::iterator strip_end, - Edges::iterator edge_begin, Edges::iterator edge_end) { + Edges::iterator edge_begin, Edges::iterator edge_end, + pvector &unrolled_tris) { Edges::iterator ei; Strips::iterator si; @@ -300,7 +301,13 @@ unroll(Strips::iterator strip_begin, Strips::iterator strip_end, if (_bucket->_show_quads) { // If we're showing quads, also show retesselated triangles. - _mesher->add_prim(poly, MO_fanpoly); + + // We can't add it directly to the mesher, that's unsafe; instead, + // we'll just add it to the end of the unrolled_tris list. This + // does mean we won't be able to color it a fancy color, but too + // bad. + //_mesher->add_prim(poly, MO_fanpoly); + unrolled_tris.push_back(poly); } else { // Now decompose the new polygon into triangles. @@ -308,12 +315,8 @@ unroll(Strips::iterator strip_begin, Strips::iterator strip_end, result = expand(poly, *_bucket, back_inserter(tris)); if (result) { - // Now add each triangle back into the mesher. - pvector::iterator ti; - - for (ti = tris.begin(); ti != tris.end(); ++ti) { - _mesher->add_prim(*ti); - } + unrolled_tris.insert(unrolled_tris.end(), + tris.begin(), tris.end()); } } diff --git a/panda/src/builder/mesherFanMaker.h b/panda/src/builder/mesherFanMaker.h index 676fa29ec3..76a6f307e2 100644 --- a/panda/src/builder/mesherFanMaker.h +++ b/panda/src/builder/mesherFanMaker.h @@ -31,6 +31,7 @@ #include "mesherStrip.h" #include "plist.h" +#include "pvector.h" template @@ -63,9 +64,10 @@ public: bool join(MesherFanMaker &other); float compute_angle() const; - int build(); + int build(pvector &unrolled_tris); int unroll(Strips::iterator strip_begin, Strips::iterator strip_end, - Edges::iterator edge_begin, Edges::iterator edge_end); + Edges::iterator edge_begin, Edges::iterator edge_end, + pvector &unrolled_tris); ostream &output(ostream &out) const; diff --git a/panda/src/builder/mesherTempl.I b/panda/src/builder/mesherTempl.I index 744de6e88e..d4072e36ea 100644 --- a/panda/src/builder/mesherTempl.I +++ b/panda/src/builder/mesherTempl.I @@ -495,6 +495,8 @@ template void MesherTempl:: find_fans() { #ifdef SUPPORT_FANS + pvector unrolled_tris; + // Consider all vertices. Any vertex with over a certain number of // edges connected to it is eligible to become a fan. @@ -555,11 +557,21 @@ find_fans() { for (fi = fans.begin(); fi != fans.end(); ++fi) { if ((*fi).is_valid()) { - (*fi).build(); + (*fi).build(unrolled_tris); } } } } + + // Finally, add back in the triangles we might have produced by + // unrolling some of the fans. We can't add these back in safely + // until we're done traversing all the vertices and primitives we + // had in the first place (since adding them will affect the edge + // lists). + pvector::iterator ti; + for (ti = unrolled_tris.begin(); ti != unrolled_tris.end(); ++ti) { + add_prim(*ti); + } #endif }