diff options
author | Howard Trickey <howard.trickey@gmail.com> | 2021-03-08 02:13:19 +0300 |
---|---|---|
committer | Howard Trickey <howard.trickey@gmail.com> | 2021-03-08 02:13:19 +0300 |
commit | 1ba15f1f7f94616d52e8bbd80e22c9e34e45a81e (patch) | |
tree | 5437bbfec345fa2d931ff2754d04fd3e282c8d0a /source/blender/blenkernel/intern/mesh_boolean_convert.cc | |
parent | 7a34bd7c2886dfc812345c0b1649d63a9ee4666f (diff) |
Speedup for usual non-manifold exact boolean case.
The commit rB6f63417b500d that made exact boolean work on meshes
with holes (like Suzanne) unfortunately dramatically slowed things
down on other non-manifold meshes that don't have holes and didn't
need the per-triangle insideness test.
This adds a hole_tolerant parameter, false by default, that the user
can enable to get good results on non-manifold meshes with holes.
Using false for this parameter speeds up the time from 90 seconds
to 10 seconds on an example with 1.2M triangles.
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_boolean_convert.cc')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_boolean_convert.cc | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc index a179d39a9d2..61c9f74531d 100644 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -762,6 +762,7 @@ static Mesh *imesh_to_mesh(IMesh *im, MeshesToIMeshInfo &mim) static Mesh *direct_mesh_boolean(Span<const Mesh *> meshes, Span<const float4x4 *> obmats, const bool use_self, + const bool hole_tolerant, const BoolOpType boolean_mode) { const int dbg_level = 0; @@ -784,7 +785,8 @@ static Mesh *direct_mesh_boolean(Span<const Mesh *> meshes, } return static_cast<int>(mim.mesh_poly_offset.size()) - 1; }; - IMesh m_out = boolean_mesh(m_in, boolean_mode, meshes_len, shape_fn, use_self, nullptr, &arena); + IMesh m_out = boolean_mesh( + m_in, boolean_mode, meshes_len, shape_fn, use_self, hole_tolerant, nullptr, &arena); if (dbg_level > 1) { std::cout << m_out; write_obj_mesh(m_out, "m_out"); @@ -808,6 +810,7 @@ Mesh *BKE_mesh_boolean(const Mesh **meshes, const float (*obmats[])[4][4], const int meshes_len, const bool use_self, + const bool hole_tolerant, const int boolean_mode) { const blender::float4x4 **transforms = (const blender::float4x4 **)obmats; @@ -815,6 +818,7 @@ Mesh *BKE_mesh_boolean(const Mesh **meshes, blender::Span(meshes, meshes_len), blender::Span(transforms, meshes_len), use_self, + hole_tolerant, static_cast<blender::meshintersect::BoolOpType>(boolean_mode)); } @@ -823,6 +827,7 @@ Mesh *BKE_mesh_boolean(const Mesh **UNUSED(meshes), const float (*obmats[])[4][4], const int UNUSED(meshes_len), const bool UNUSED(use_self), + const bool UNUSED(hole_tolerant), const int UNUSED(boolean_mode)) { UNUSED_VARS(obmats); |