diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index daf7e1fd1d..52518878fa 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -310,6 +310,7 @@ unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char gr bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* model_object) { recent_update = false; + bool object_changed = false; if (m_model_object != model_object || (model_object && m_model_object_id != model_object->id())) { @@ -325,7 +326,7 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_active_instance = canvas.get_selection().get_instance_idx(); m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); } - + object_changed = true; recent_update = true; } @@ -347,6 +348,7 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode } } + bool mesh_exchanged = false; m_mesh = nullptr; // Load either the model_object mesh, or one provided by the backend // This mesh does not account for the possible Z up SLA offset. @@ -359,6 +361,7 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_backend_mesh_transformed.transform(canvas.sla_print()->sla_trafo(*m_model_object).inverse()); m_mesh = &m_backend_mesh_transformed; m_has_drilled_mesh = true; + mesh_exchanged = true; } } @@ -371,13 +374,22 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_model_object_id = m_model_object->id(); if (m_mesh != m_old_mesh) { - wxBusyCursor wait; - m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); - m_object_clipper.reset(); - m_supports_clipper.reset(); - m_old_mesh = m_mesh; - m_clipping_plane_distance = 0.f; - m_clipping_plane_distance_stash = 0.f; + // Update clipping plane position. + float new_clp_pos = m_clipping_plane_distance; + if (object_changed) { + new_clp_pos = 0.f; + m_clipping_plane_was_moved = false; + } else { + // After we got a drilled mesh, move the cp to 25% (if not used already) + if (m_clipping_plane_distance == 0.f && mesh_exchanged && m_has_drilled_mesh) { + new_clp_pos = 0.25f; + m_clipping_plane_was_moved = false; // so it uses current camera direction + } + } + m_clipping_plane_distance = new_clp_pos; + m_clipping_plane_distance_stash = new_clp_pos; + + m_schedule_aabb_calculation = true; recent_update = true; return true; } @@ -388,6 +400,19 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode } +void CommonGizmosData::build_AABB_if_needed() +{ + if (! m_schedule_aabb_calculation) + return; + + wxBusyCursor wait; + m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); + m_object_clipper.reset(); + m_supports_clipper.reset(); + m_old_mesh = m_mesh; + m_schedule_aabb_calculation = false; +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 11185a83d0..695946e3d6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -220,6 +220,7 @@ public: float m_clipping_plane_distance = 0.f; std::unique_ptr m_clipping_plane; + bool m_clipping_plane_was_moved = false; void stash_clipping_plane() { m_clipping_plane_distance_stash = m_clipping_plane_distance; @@ -231,11 +232,14 @@ public: bool has_drilled_mesh() const { return m_has_drilled_mesh; } + void build_AABB_if_needed(); + private: const TriangleMesh* m_old_mesh; TriangleMesh m_backend_mesh_transformed; float m_clipping_plane_distance_stash = 0.f; bool m_has_drilled_mesh = false; + bool m_schedule_aabb_calculation = false; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 408164aa81..a89d8f9e52 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -58,6 +58,11 @@ void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) { if (m_c->recent_update) { + if (m_state == On) + m_c->build_AABB_if_needed(); + + update_clipping_plane(m_c->m_clipping_plane_was_moved); + if (m_c->m_model_object) { reload_cache(); if (m_c->has_drilled_mesh()) @@ -69,8 +74,11 @@ void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); } - else - m_parent.toggle_model_objects_visibility(true, nullptr, -1); + // following was removed so that it does not show the object when it should + // be hidden because the supports gizmo is active. on_set_state takes care + // of showing the object. + //else + // m_parent.toggle_model_objects_visibility(true, nullptr, -1); } } @@ -507,7 +515,8 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos if (action == SLAGizmoEventType::MouseWheelUp && control_down) { m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f); - update_clipping_plane(true); + update_clipping_plane(m_c->m_clipping_plane_was_moved); + m_c->m_clipping_plane_was_moved = true; return true; } @@ -897,8 +906,10 @@ RENDER_AGAIN: ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) - update_clipping_plane(true); + if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) { + update_clipping_plane(m_c->m_clipping_plane_was_moved); + m_c->m_clipping_plane_was_moved = true; + } // make sure supports are shown/hidden as appropriate if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) { @@ -981,7 +992,9 @@ void GLGizmoHollow::on_set_state() //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); //m_c->update_from_backend(m_parent, m_c->m_model_object); m_c->unstash_clipping_plane(); - update_clipping_plane(m_c->m_clipping_plane_distance != 0.f); + update_clipping_plane(m_c->m_clipping_plane_was_moved); + + m_c->build_AABB_if_needed(); // we'll now reload support points: if (m_c->m_model_object) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 759cda35ce..aa9ce50144 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -63,14 +63,26 @@ bool GLGizmoSlaSupports::on_init() void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) { + // Update common data for hollowing and sla support gizmos. + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) + m_c->update_from_backend(m_parent, model_object); + if (m_c->recent_update) { + if (m_state == On) + m_c->build_AABB_if_needed(); + + update_clipping_plane(m_c->m_clipping_plane_was_moved); + if (m_state == On) { m_parent.toggle_model_objects_visibility(false); m_parent.toggle_model_objects_visibility(/*! m_c->m_cavity_mesh*/ true, m_c->m_model_object, m_c->m_active_instance); m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); } - else - m_parent.toggle_model_objects_visibility(true, nullptr, -1); + // following was removed so that it does not show the object when it should + // be hidden because the supports gizmo is active. on_set_state takes care + // of showing the object. + //else + // m_parent.toggle_model_objects_visibility(true, nullptr, -1); disable_editing_mode(); if (m_c->m_model_object) @@ -590,7 +602,8 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous if (action == SLAGizmoEventType::MouseWheelUp && control_down) { m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f); - update_clipping_plane(true); + update_clipping_plane(m_c->m_clipping_plane_was_moved); + m_c->m_clipping_plane_was_moved = true; return true; } @@ -916,8 +929,10 @@ RENDER_AGAIN: ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) - update_clipping_plane(true); + if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) { + update_clipping_plane(m_c->m_clipping_plane_was_moved); + m_c->m_clipping_plane_was_moved = true; + } if (m_imgui->button("?")) { @@ -1002,7 +1017,9 @@ void GLGizmoSlaSupports::on_set_state() Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); m_c->unstash_clipping_plane(); - update_clipping_plane(m_c->m_clipping_plane_distance != 0.f); + update_clipping_plane(m_c->m_clipping_plane_was_moved); + + m_c->build_AABB_if_needed(); // we'll now reload support points: @@ -1010,9 +1027,10 @@ void GLGizmoSlaSupports::on_set_state() reload_cache(); m_parent.toggle_model_objects_visibility(false); - if (m_c->m_model_object /*&& ! m_c->m_cavity_mesh*/) + if (m_c->m_model_object) { m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); + } // Set default head diameter from config. const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 7e334c29f2..7d747ceff1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -351,19 +351,8 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) auto* gizmo_supports = dynamic_cast(m_gizmos[SlaSupports].get()); auto* gizmo_hollow = dynamic_cast(m_gizmos[Hollow].get()); - - // Update common data for hollowing and sla support gizmos. - if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) { - if (m_common_gizmos_data->update_from_backend(m_parent, model_object)) { - // FIXME: this is a hack to make that the clipping plane is - // updated when the update set its position to zero. The clipping - // plane itself should be common, including the update_function. - // Then update_from_backend could do it itself. - gizmo_supports->update_clipping_plane(); - gizmo_hollow->update_clipping_plane(); - } - } - + // note: sla support gizmo takes care of updating the common data. + // following lines are thus dependent gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection()); gizmo_hollow->set_sla_support_data(model_object, m_parent.get_selection()); }