FIX: mesh boolean difference may miss some parts

jira: STUDIO-6209

Change-Id: Iea86393a45954157ccc80d3a143d3db1e15721e4
(cherry picked from commit a23eb1e0db00a5cf7b82b240ebcbbefd37f8a84d)
This commit is contained in:
Arthur 2024-02-05 17:33:22 +08:00 committed by Lane.Wei
parent 9ceb622d4c
commit f5b8cadc8c
1 changed files with 1 additions and 3 deletions

View File

@ -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<bool> 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);