diff options
author | Howard Trickey <howard.trickey@gmail.com> | 2020-11-16 04:24:59 +0300 |
---|---|---|
committer | Howard Trickey <howard.trickey@gmail.com> | 2020-11-16 04:24:59 +0300 |
commit | fbffff26e437ad87b644762b340dcddc7ddf16ab (patch) | |
tree | 2c98fa53ba9245a6f3f87465820e82dc6d512fde /source/blender/blenlib/intern/mesh_boolean.cc | |
parent | 9b54c81414801446940fdc32d8fa1ab267d55c90 (diff) |
Fix T82736, Exact Boolean fail with repeated subtraction of same object.
Two problems were fixed. One, the code for dissolving vertices
left a face around if dissolving a vertex would leave less than
three vertices. Instead, the face should be deleted.
Two, with transformations like "rotate 180 degrees", this should
be no problem with exact, but the current transformation matrix
has very small non-zero entries where it shouldn't. Cleaning the
transformation matrix makes it more likely that user expectations
about coplanar faces will be fulfilled.
Diffstat (limited to 'source/blender/blenlib/intern/mesh_boolean.cc')
-rw-r--r-- | source/blender/blenlib/intern/mesh_boolean.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index 8b6a7ed65f7..82ccbcc91b6 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -751,7 +751,7 @@ static PatchesInfo find_patches(const IMesh &tm, const TriMeshTopology &tmtopo) if (dbg_level > 1) { std::cout << "\ntriangle map\n"; for (int t : tm.face_index_range()) { - std::cout << t << ": patch " << pinfo.tri_patch(t) << "\n"; + std::cout << t << ": " << tm.face(t) << " patch " << pinfo.tri_patch(t) << "\n"; } } std::cout << "\npatch-patch incidences\n"; @@ -3135,6 +3135,7 @@ static void dissolve_verts(IMesh *imesh, const Array<bool> dissolve, IMeshArena { constexpr int inline_face_size = 100; Vector<bool, inline_face_size> face_pos_erase; + bool any_faces_erased = false; for (int f : imesh->face_index_range()) { const Face &face = *imesh->face(f); face_pos_erase.clear(); @@ -3151,10 +3152,13 @@ static void dissolve_verts(IMesh *imesh, const Array<bool> dissolve, IMeshArena } } if (num_erase > 0) { - imesh->erase_face_positions(f, face_pos_erase, arena); + any_faces_erased |= imesh->erase_face_positions(f, face_pos_erase, arena); } } imesh->set_dirty_verts(); + if (any_faces_erased) { + imesh->remove_null_faces(); + } } /** @@ -3376,6 +3380,10 @@ IMesh boolean_mesh(IMesh &imesh, IMesh ans = polymesh_from_trimesh_with_dissolve(tm_out, imesh, arena); if (dbg_level > 0) { std::cout << "boolean_mesh output:\n" << ans; + if (dbg_level > 2) { + ans.populate_vert(); + dump_test_spec(ans); + } } return ans; } |