Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoward Trickey <howard.trickey@gmail.com>2020-11-16 04:24:59 +0300
committerHoward Trickey <howard.trickey@gmail.com>2020-11-16 04:24:59 +0300
commitfbffff26e437ad87b644762b340dcddc7ddf16ab (patch)
tree2c98fa53ba9245a6f3f87465820e82dc6d512fde /source/blender/blenlib/intern/mesh_boolean.cc
parent9b54c81414801446940fdc32d8fa1ab267d55c90 (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.cc12
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;
}