diff --git a/src/libslic3r/TriangleMeshSlicer.cpp b/src/libslic3r/TriangleMeshSlicer.cpp index 417ca354d3..4ff18165cb 100644 --- a/src/libslic3r/TriangleMeshSlicer.cpp +++ b/src/libslic3r/TriangleMeshSlicer.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -607,6 +608,17 @@ static inline std::vector slice_make_lines( } } ); + // Facet processing above is parallel, so per-layer line order depends on thread scheduling, + // and make_loops() derives island order and loop start vertices from it. Sort canonically; + // edge_type and flags only break ties, std::sort being unstable. + tbb::parallel_for(tbb::blocked_range(0, lines.size()), + [&lines](const tbb::blocked_range &range) { + for (size_t i = range.begin(); i < range.end(); ++ i) + std::sort(lines[i].begin(), lines[i].end(), [](const IntersectionLine &l, const IntersectionLine &r) { + return std::make_tuple(l.edge_a_id, l.edge_b_id, l.a_id, l.b_id, l.a.x(), l.a.y(), l.b.x(), l.b.y(), l.edge_type, l.flags) < + std::make_tuple(r.edge_a_id, r.edge_b_id, r.a_id, r.b_id, r.a.x(), r.a.y(), r.b.x(), r.b.y(), r.edge_type, r.flags); + }); + }); return lines; }