@@ -222,9 +222,10 @@ void Manifold::Impl::SimplifyTopology() {
222
222
precision_};
223
223
for_each_n (policy, countAt (0 ), nbEdges,
224
224
[=] __host__ __device__ (int i) { bflagsPtr[i] = se (i); });
225
- std::vector<int > visited (halfedge_.size (), - 1 );
225
+ std::vector<glm::ivec2 > visited (halfedge_.size (), glm::ivec2 (- 1 ) );
226
226
for (int i = 0 ; i < nbEdges; ++i) {
227
227
if (bflags[i]) {
228
+ visited.resize (0 );
228
229
RecursiveEdgeSwap (i, visited);
229
230
numFlagged++;
230
231
}
@@ -485,14 +486,17 @@ void Manifold::Impl::CollapseEdge(const int edge) {
485
486
}
486
487
487
488
void Manifold::Impl::RecursiveEdgeSwap (const int edge,
488
- std::vector<int >& visited) {
489
+ std::vector<glm::ivec2 >& visited) {
489
490
VecDH<TriRef>& triRef = meshRelation_.triRef ;
490
491
491
492
if (edge < 0 ) return ;
492
493
const int pair = halfedge_[edge].pairedHalfedge ;
493
494
if (pair < 0 ) return ;
494
- if (visited[edge] == pair) return ;
495
- visited[edge] = pair;
495
+
496
+ // avoid infinite recursion
497
+ for (int i = 0 ; i < visited.size (); ++i) {
498
+ if (visited[i] == glm::ivec2 (edge, pair)) return ;
499
+ }
496
500
497
501
const glm::ivec3 tri0edge = TriOf (edge);
498
502
const glm::ivec3 tri1edge = TriOf (pair);
@@ -572,8 +576,10 @@ void Manifold::Impl::RecursiveEdgeSwap(const int edge,
572
576
SwapEdge ();
573
577
const glm::vec2 e23 = v[3 ] - v[2 ];
574
578
if (glm::dot (e23 , e23 ) < precision_ * precision_) {
579
+ visited.resize (0 );
575
580
CollapseEdge (tri0edge[2 ]);
576
581
} else {
582
+ visited.emplace_back (glm::ivec2 (edge, pair));
577
583
RecursiveEdgeSwap (tri0edge[0 ], visited);
578
584
RecursiveEdgeSwap (tri0edge[1 ], visited);
579
585
RecursiveEdgeSwap (tri1edge[0 ], visited);
@@ -586,6 +592,7 @@ void Manifold::Impl::RecursiveEdgeSwap(const int edge,
586
592
}
587
593
// Normal path
588
594
SwapEdge ();
595
+ visited.emplace_back (glm::ivec2 (edge, pair));
589
596
RecursiveEdgeSwap (halfedge_[tri0edge[1 ]].pairedHalfedge , visited);
590
597
RecursiveEdgeSwap (halfedge_[tri1edge[0 ]].pairedHalfedge , visited);
591
598
}
0 commit comments