diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 11fe0cb5b..b224bc98c 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -3,7 +3,6 @@ #include #include -//#include #include #include @@ -87,9 +86,6 @@ remove_cvref_t _generate_interior(Mesh &&mesh, if (ctl.stopcondition()) return {}; else ctl.statuscb(70, L("Hollowing")); -// openvdb::tools::Filter filt{*gridptr}; -// filt.offset(float(offset + D)); - double iso_surface = D; double adaptivity = 0.; auto omesh = _grid_to_mesh(*gridptr, iso_surface, adaptivity); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 051605236..cbdadc475 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -571,24 +571,11 @@ std::pair GLGizmoHollow::get_hollowi return std::make_pair(m_mesh, sla::HollowingConfig{double(m_offset), double(m_accuracy), double(m_closing_d)}); } -void GLGizmoHollow::set_hollowing_result(std::unique_ptr mesh) +void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr &&rc) { - // Called from Plater when the UI job finishes - m_cavity_mesh = std::move(mesh); - - m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); + m_mesh_raycaster = std::move(rc); m_object_clipper.reset(); m_volume_with_cavity.reset(); - - if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside - Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); - volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); - m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); - - m_volume_with_cavity->set_volume_transformation(volume_trafo); - m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); - } } void GLGizmoHollow::hollow_mesh() @@ -597,9 +584,21 @@ void GLGizmoHollow::hollow_mesh() wxGetApp().plater()->hollow(); } -void GLGizmoHollow::update_hollowed_mesh() +void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) { - if (m_volume_with_cavity) m_volume_with_cavity->finalize_geometry(true); + // Called from Plater when the UI job finishes + m_cavity_mesh = std::move(mesh); + + if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside + Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); + volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); + m_volume_with_cavity->finalize_geometry(true); + m_volume_with_cavity->set_volume_transformation(volume_trafo); + m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); + } + m_parent.toggle_model_objects_visibility(! m_cavity_mesh, m_model_object, m_active_instance); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index cea7a5245..290a79340 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -79,8 +79,8 @@ public: std::pair get_hollowing_parameters() const; - void set_hollowing_result(std::unique_ptr mesh); - void update_hollowed_mesh(); + void update_mesh_raycaster(std::unique_ptr &&rc); + void update_hollowed_mesh(std::unique_ptr &&mesh); bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d52f21bb2..1d4926d92 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1717,7 +1717,8 @@ struct Plater::priv GLGizmoHollow * get_gizmo(); const GLGizmoHollow * get_gizmo() const; - std::unique_ptr m_output; + std::unique_ptr m_output_mesh; + std::unique_ptr m_output_raycaster; const TriangleMesh* m_object_mesh = nullptr; sla::HollowingConfig m_cfg; }; @@ -2870,7 +2871,7 @@ void Plater::priv::HollowJob::prepare() auto hlw_data = gizmo_hollow->get_hollowing_parameters(); m_object_mesh = hlw_data.first; m_cfg = hlw_data.second; - m_output.reset(); + m_output_mesh.reset(); } void Plater::priv::HollowJob::process() @@ -2884,14 +2885,13 @@ void Plater::priv::HollowJob::process() TriangleMesh omesh = sla::generate_interior(*m_object_mesh, m_cfg, ctl); if (!omesh.empty()) { - m_output.reset(new TriangleMesh{*m_object_mesh}); - m_output->merge(omesh); - m_output->require_shared_vertices(); + m_output_mesh.reset(new TriangleMesh{*m_object_mesh}); + m_output_mesh->merge(omesh); + m_output_mesh->require_shared_vertices(); - update_status(90, "Rendering hollowed object"); + update_status(90, _(L("Indexing hollowed object"))); - auto gizmo = get_gizmo(); - if (gizmo) gizmo->set_hollowing_result(std::move(m_output)); + m_output_raycaster.reset(new MeshRaycaster(*m_output_mesh)); update_status(100, was_canceled() ? _(L("Hollowing cancelled.")) : _(L("Hollowing done."))); @@ -2902,8 +2902,10 @@ void Plater::priv::HollowJob::process() void Plater::priv::HollowJob::finalize() { - auto gizmo = get_gizmo(); - if (gizmo) gizmo->update_hollowed_mesh(); + if (auto gizmo = get_gizmo()) { + gizmo->update_mesh_raycaster(std::move(m_output_raycaster)); + gizmo->update_hollowed_mesh(std::move(m_output_mesh)); + } } GLGizmoHollow *Plater::priv::HollowJob::get_gizmo()