Skip to content

Commit 17e02c4

Browse files
committed
simplify: Avoid early termination of passes due to error_goal
In large meshes with complex topology we occasionally hit a case where error_goal cutoff is not monotonic: a previous pass would simplify up to a certain goal, but a subsequent pass would arrive at a smaller goal (for example as invalid collapses get eliminated) and hit it before an error that it already encountered. If we already collapsed an edge with a given error it is always correct to collapse other edges with a smaller error. This change tweaks the conditional, which results in fewer passes on some meshes (eg thai_buddha gets ~10% faster to simplify), 2-3% smaller error on some meshes, and occasionally 1-2% larger error; most meshes simplify as they did before however.
1 parent 5c8639a commit 17e02c4

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

src/simplifier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1129,7 +1129,7 @@ static size_t performEdgeCollapses(unsigned int* collapse_remap, unsigned char*
11291129

11301130
// on average, each collapse is expected to lock 6 other collapses; to avoid degenerate passes on meshes with odd
11311131
// topology, we only abort if we got over 1/6 collapses accordingly.
1132-
if (c.error > error_goal && triangle_collapses > triangle_collapse_goal / 6)
1132+
if (c.error > error_goal && c.error > result_error && triangle_collapses > triangle_collapse_goal / 6)
11331133
{
11341134
TRACESTATS(6);
11351135
break;

0 commit comments

Comments
 (0)