From 4df6a645f2c98ae90b187c3c47b468f98543cd14 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 20 Feb 2020 14:28:45 +0100 Subject: [PATCH 1/3] AABB trees for SLA gizmos are not calculated when the object is selected, but only after one of the gizmos is opened --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 23 ++++++++++++++------ src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 3 +++ src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 6 +++++ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 11 ++++++++++ src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 15 ++----------- 5 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index daf7e1fd1d..523d3eef6c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -371,13 +371,7 @@ 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; + m_schedule_aabb_calculation = true; recent_update = true; return true; } @@ -388,6 +382,21 @@ 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_clipping_plane_distance = 0.f; + m_clipping_plane_distance_stash = 0.f; + 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..157100687f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -231,11 +231,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..27e99e240d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -57,6 +57,10 @@ bool GLGizmoHollow::on_init() 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(); if (m_c->m_model_object) { reload_cache(); @@ -983,6 +987,8 @@ void GLGizmoHollow::on_set_state() m_c->unstash_clipping_plane(); update_clipping_plane(m_c->m_clipping_plane_distance != 0.f); + m_c->build_AABB_if_needed(); + // we'll now reload support points: if (m_c->m_model_object) reload_cache(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 759cda35ce..d9898b3151 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -63,7 +63,16 @@ 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(); + 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); @@ -1004,6 +1013,8 @@ void GLGizmoSlaSupports::on_set_state() m_c->unstash_clipping_plane(); update_clipping_plane(m_c->m_clipping_plane_distance != 0.f); + 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/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()); } From 4c22023762d4231df4823c7e0c9f85ca89b0f05a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 21 Feb 2020 08:14:45 +0100 Subject: [PATCH 2/3] SLA gizmo clipping plane resetting Clipping plane direction is now initialized when the plane is first moved, not when the gizmo is opened. This is how previous versions worked. This is a minimal-effort solution before the clipping plane is refactored properly. --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 22 +++++++++++++++++--- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 14 ++++++++----- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 18 +++++++++------- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 523d3eef6c..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,6 +374,21 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_model_object_id = m_model_object->id(); if (m_mesh != m_old_mesh) { + // 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; @@ -392,8 +410,6 @@ void CommonGizmosData::build_AABB_if_needed() 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; m_schedule_aabb_calculation = false; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 157100687f..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; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 27e99e240d..260bc813da 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -57,10 +57,11 @@ bool GLGizmoHollow::on_init() 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(); + update_clipping_plane(m_c->m_clipping_plane_was_moved); if (m_c->m_model_object) { reload_cache(); @@ -511,7 +512,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; } @@ -901,8 +903,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)) { @@ -985,7 +989,7 @@ 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(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index d9898b3151..247e643eb1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -71,7 +71,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S if (m_state == On) m_c->build_AABB_if_needed(); - update_clipping_plane(); + update_clipping_plane(m_c->m_clipping_plane_was_moved); if (m_state == On) { m_parent.toggle_model_objects_visibility(false); @@ -599,7 +599,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; } @@ -925,8 +926,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("?")) { @@ -1011,7 +1014,7 @@ 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(); @@ -1021,9 +1024,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; From 003a54600d1b09c06f0c2ec440fa3fad9749de3b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 21 Feb 2020 08:28:20 +0100 Subject: [PATCH 3/3] Make sure that objects are correctly shown/hidden when switched --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 7 +++++-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 260bc813da..a89d8f9e52 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -74,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); } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 247e643eb1..aa9ce50144 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -78,8 +78,11 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S 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)