From f5b8cadc8c27f0658d650c020c0799ffc55380c1 Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 5 Feb 2024 17:33:22 +0800 Subject: [PATCH] FIX: mesh boolean difference may miss some parts jira: STUDIO-6209 Change-Id: Iea86393a45954157ccc80d3a143d3db1e15721e4 (cherry picked from commit a23eb1e0db00a5cf7b82b240ebcbbefd37f8a84d) --- src/libslic3r/MeshBoolean.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 1fc02d871..ea7e51272 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -776,14 +776,12 @@ void do_boolean(McutMesh& srcMesh, const McutMesh& cutMesh, const std::string& b // But we can force it to work by spliting the src mesh into disconnected components, // and do booleans seperately, then merge all the results. indexed_triangle_set all_its; - std::vector has_been_merged(cut_parts.size(), false); if (boolean_opts == "UNION" || boolean_opts == "A_NOT_B") { for (size_t i = 0; i < src_parts.size(); i++) { auto src_part = triangle_mesh_to_mcut(src_parts[i]); for (size_t j = 0; j < cut_parts.size(); j++) { - if (has_been_merged[j]) continue; // assume union is done first, then we can safely skip the merged parts for A_NOT_B auto cut_part = triangle_mesh_to_mcut(cut_parts[j]); - has_been_merged[j] = do_boolean_single(*src_part, *cut_part, boolean_opts); + do_boolean_single(*src_part, *cut_part, boolean_opts); } TriangleMesh tri_part = mcut_to_triangle_mesh(*src_part); its_merge(all_its, tri_part.its);