From a3f3c868eb9835b6086bb9f1aad238509ee4ebc7 Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Tue, 14 Jan 2020 14:28:22 +0100
Subject: [PATCH 1/6] Removed needless calls to instance_bounding_box

---
 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index efb110199..61f3c10b2 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -62,18 +62,21 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select
         return;
     }
 
-    if (m_c->m_model_object != model_object || m_c->m_model_object_id != model_object->id()) {
+    bool something_changed = false;
+
+    if (m_c->m_model_object != model_object
+     || m_c->m_model_object_id != model_object->id()
+     || m_c->m_active_instance != selection.get_instance_idx()) {
         m_c->m_model_object = model_object;
         m_c->m_print_object_idx = -1;
+        m_c->m_active_instance = selection.get_instance_idx();
+        something_changed = true;
     }
 
-    m_c->m_active_instance = selection.get_instance_idx();
-
-    if (model_object && selection.is_from_single_instance())
+    if (model_object && something_changed && selection.is_from_single_instance())
     {
         // Cache the bb - it's needed for dealing with the clipping plane quite often
         // It could be done inside update_mesh but one has to account for scaling of the instance.
-        //FIXME calling ModelObject::instance_bounding_box() is expensive!
         m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius();
 
         if (is_mesh_update_necessary()) {

From 8c8256c6a23f159c9fb6e9f1c61c2689aa5d055e Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Tue, 14 Jan 2020 14:30:49 +0100
Subject: [PATCH 2/6] Fixed diameter/radius mismatch in gizmo UI

---
 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 6 ++++--
 src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index 61f3c10b2..5a99949bf 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -822,14 +822,16 @@ RENDER_AGAIN:
    // m_imgui->text(" "); // vertical gap
     ImGui::Separator();
 
-    float diameter_upper_cap = 20.f; //static_cast<ConfigOptionFloat*>(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value;
+    float diameter_upper_cap = 5.f;
     if (m_new_hole_radius > diameter_upper_cap)
         m_new_hole_radius = diameter_upper_cap;
     m_imgui->text(m_desc.at("hole_diameter"));
     ImGui::SameLine(diameter_slider_left);
     ImGui::PushItemWidth(window_width - diameter_slider_left);
 
-    ImGui::SliderFloat("", &m_new_hole_radius, 0.1f, diameter_upper_cap, "%.1f");
+    float diam = 2.f * m_new_hole_radius;
+    ImGui::SliderFloat("", &diam, 1.f, diameter_upper_cap, "%.1f");
+    m_new_hole_radius = diam / 2.f;
     bool clicked = ImGui::IsItemClicked();
     bool edited = ImGui::IsItemEdited();
     bool deactivated = ImGui::IsItemDeactivatedAfterEdit();
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
index ba2935a56..b6a125972 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
@@ -58,7 +58,7 @@ private:
     bool unsaved_changes() const;
 
     bool  m_show_supports = true;
-    float m_new_hole_radius = 4.f;        // Size of a new hole.
+    float m_new_hole_radius = 2.f;        // Size of a new hole.
     float m_new_hole_height = 5.f;
     mutable std::vector<bool> m_selected; // which holes are currently selected
 

From 6e8bdb2c862c95568b2b6f07d95e881cf66a4404 Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Tue, 14 Jan 2020 14:32:27 +0100
Subject: [PATCH 3/6] Fixed update of clipping plane when a gizmo was turned
 off

---
 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp      | 5 +----
 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 1 +
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index 5a99949bf..17154de58 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -963,10 +963,6 @@ std::string GLGizmoHollow::on_get_name() const
 }
 
 
-//const TriangleMesh* GLGizmoHollow::mesh() const {
-//    return (! m_c->m_mesh ? nullptr : (m_c->m_cavity_mesh ? m_c->m_cavity_mesh.get() : m_c->m_mesh));
-//}
-
 
 void GLGizmoHollow::on_set_state()
 {
@@ -1004,6 +1000,7 @@ void GLGizmoHollow::on_set_state()
         //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off")));
         m_parent.toggle_model_objects_visibility(true);
         m_clipping_plane_distance = 0.f;
+        update_clipping_plane();
         // Release clippers and the AABB raycaster.
         m_c->m_object_clipper.reset();
         m_c->m_supports_clipper.reset();
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index 4e00b0f77..9b04fd6ab 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -1082,6 +1082,7 @@ void GLGizmoSlaSupports::on_set_state()
             m_parent.toggle_model_objects_visibility(true);
             m_normal_cache.clear();
             m_clipping_plane_distance = 0.f;
+            update_clipping_plane();
             // Release clippers and the AABB raycaster.
             m_its = nullptr;
             m_c->m_object_clipper.reset();

From 902d3bb904fc4f69afb7a798f5e9b63fbd84a19a Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Tue, 14 Jan 2020 14:33:56 +0100
Subject: [PATCH 4/6] Fixed loading of hole_height when a hole is selected
 (hollowing gizmo)

---
 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index 17154de58..ebff04007 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -1079,7 +1079,7 @@ void GLGizmoHollow::select_point(int i)
 
         if (i == AllPoints) {
             m_new_hole_radius = m_c->m_model_object->sla_drain_holes[0].radius;
-            m_new_hole_height = m_c->m_model_object->sla_drain_holes[0].height;
+            m_new_hole_height = m_c->m_model_object->sla_drain_holes[0].height - HoleStickOutLength;
         }
     }
     else {
@@ -1088,7 +1088,7 @@ void GLGizmoHollow::select_point(int i)
         m_selected[i] = true;
         m_selection_empty = false;
         m_new_hole_radius = m_c->m_model_object->sla_drain_holes[i].radius;
-        m_new_hole_height = m_c->m_model_object->sla_drain_holes[i].height;
+        m_new_hole_height = m_c->m_model_object->sla_drain_holes[i].height - HoleStickOutLength;
     }
 }
 

From 822f9ff4a6921a7b42af4689da8dc387716129e0 Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Thu, 16 Jan 2020 12:43:42 +0100
Subject: [PATCH 5/6] Fixed issues in SLA gizmos related to showing/hiding of
 the model/support structures

---
 src/slic3r/GUI/GLCanvas3D.cpp                |  8 ++------
 src/slic3r/GUI/GLCanvas3D.hpp                |  2 +-
 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp      | 17 ++++++++++-------
 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 20 ++++++++++----------
 4 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index ce5609eca..6392b97c0 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1558,10 +1558,9 @@ int GLCanvas3D::check_volumes_outside_state() const
     return (int)state;
 }
 
-bool GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx)
+void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx)
 {
-    if (m_render_sla_auxiliaries == visible)
-        return false;
+    m_render_sla_auxiliaries = visible;
 
     for (GLVolume* vol : m_volumes.volumes) {
         if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo)
@@ -1569,9 +1568,6 @@ bool GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObje
         && vol->composite_id.volume_id < 0)
             vol->is_active = visible;
     }
-
-    m_render_sla_auxiliaries = visible;
-    return true;
 }
 
 void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject* mo, int instance_idx)
diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp
index d68d5bb72..3e8b56bd0 100644
--- a/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/src/slic3r/GUI/GLCanvas3D.hpp
@@ -500,7 +500,7 @@ public:
     void reset_volumes();
     int check_volumes_outside_state() const;
 
-    bool toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1);
+    void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1);
     void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1);
     void update_instance_printable_state_for_object(size_t obj_idx);
     void update_instance_printable_state_for_objects(std::vector<size_t>& object_idxs);
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index ebff04007..a832b5e5c 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -87,7 +87,7 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select
         if (m_state == On) {
             m_parent.toggle_model_objects_visibility(false);
             m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance);
-            m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), 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);
@@ -132,9 +132,6 @@ void GLGizmoHollow::on_render() const
         m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id);
         m_parent.get_shader().stop_using();
     }
-    // Show/hide the original object
-    m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance);
-    m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance);
 
     m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
 
@@ -649,6 +646,9 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr<TriangleMesh> &&mesh)
         m_c->m_volume_with_cavity->finalize_geometry(true);
         m_c->m_volume_with_cavity->force_transparent = false;
 
+        m_parent.toggle_model_objects_visibility(false, m_c->m_model_object, m_c->m_active_instance);
+        m_parent.toggle_sla_auxiliaries_visibility(true, m_c->m_model_object, m_c->m_active_instance);
+
         // Reset raycaster so it works with the new mesh:
         m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh()));
     }
@@ -908,8 +908,10 @@ RENDER_AGAIN:
         update_clipping_plane(true);
 
     // make sure supports are shown/hidden as appropriate
-    m_imgui->checkbox(m_desc["show_supports"], m_show_supports);
-    force_refresh = m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance);
+    if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) {
+        m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance);
+        force_refresh = true;
+    }
 
     m_imgui->end();
 
@@ -990,7 +992,8 @@ void GLGizmoHollow::on_set_state()
 
         m_parent.toggle_model_objects_visibility(false);
         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_model_objects_visibility(! m_c->m_cavity_mesh, 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);
 
         // 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/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index 9b04fd6ab..45a766ccc 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -88,7 +88,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S
             if (m_state == On) {
                 m_parent.toggle_model_objects_visibility(false);
                 m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance);
-                m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), 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);
@@ -144,8 +144,8 @@ void GLGizmoSlaSupports::on_render() const
         m_parent.get_shader().stop_using();
     }
     // Show/hide the original object
-    m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance);
-    m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance);
+    //m_parent.toggle_model_objects_visibility(! m_editing_mode && ! m_c->m_cavity_mesh, 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_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
 
@@ -967,12 +967,6 @@ RENDER_AGAIN:
 
     m_imgui->end();
 
-    // Make sure that the supports are (not) visible as they should be. This
-    // is done on each refresh because the user can switch the editing mode
-    // before background process finishes.
-    force_refresh = m_parent.toggle_sla_auxiliaries_visibility(
-                ! m_editing_mode, m_c->m_model_object, m_c->m_active_instance);
-
     if (remove_selected || remove_all) {
         force_refresh = false;
         m_parent.set_as_dirty();
@@ -1052,8 +1046,9 @@ void GLGizmoSlaSupports::on_set_state()
             reload_cache();
 
         m_parent.toggle_model_objects_visibility(false);
-        if (m_c->m_model_object)
+        if (m_c->m_model_object && ! m_c->m_cavity_mesh)
             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);
 
         // Set default head diameter from config.
         const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config;
@@ -1305,6 +1300,9 @@ void GLGizmoSlaSupports::switch_to_editing_mode()
     for (const sla::SupportPoint& sp : m_normal_cache)
         m_editing_cache.emplace_back(sp);
     select_point(NoPoints);
+
+    m_parent.toggle_sla_auxiliaries_visibility(false, m_c->m_model_object, m_c->m_active_instance);
+    m_parent.set_as_dirty();
 }
 
 
@@ -1313,6 +1311,8 @@ void GLGizmoSlaSupports::disable_editing_mode()
     if (m_editing_mode) {
         m_editing_mode = false;
         wxGetApp().plater()->leave_gizmos_stack();
+        m_parent.toggle_sla_auxiliaries_visibility(true, m_c->m_model_object, m_c->m_active_instance);
+        m_parent.set_as_dirty();
     }
 }
 

From d9786f2bcddf2d79aead22354b7b8ca99d5736fd Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Thu, 16 Jan 2020 13:08:37 +0100
Subject: [PATCH 6/6] Fixed SLA gizmos picking problem - hollowed mesh was not
 rendered for picking

---
 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp      | 28 +++++++++++-------
 src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp      |  1 +
 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 31 ++++++++++++--------
 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp |  1 +
 4 files changed, 38 insertions(+), 23 deletions(-)

diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index a832b5e5c..d02fdd077 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -115,6 +115,23 @@ void GLGizmoHollow::on_render() const
     glsafe(::glEnable(GL_BLEND));
     glsafe(::glEnable(GL_DEPTH_TEST));
 
+    m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
+
+    render_hollowed_mesh();
+
+    if (m_quadric != nullptr && selection.is_from_single_instance())
+        render_points(selection, false);
+
+    m_selection_rectangle.render(m_parent);
+    render_clipping_plane(selection);
+
+    glsafe(::glDisable(GL_BLEND));
+}
+
+
+
+void GLGizmoHollow::render_hollowed_mesh() const
+{
     if (m_c->m_volume_with_cavity) {
         m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift);
         m_parent.get_shader().start_using();
@@ -132,16 +149,6 @@ void GLGizmoHollow::on_render() const
         m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id);
         m_parent.get_shader().stop_using();
     }
-
-    m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
-
-    if (m_quadric != nullptr && selection.is_from_single_instance())
-        render_points(selection, false);
-
-    m_selection_rectangle.render(m_parent);
-    render_clipping_plane(selection);
-
-    glsafe(::glDisable(GL_BLEND));
 }
 
 
@@ -241,6 +248,7 @@ void GLGizmoHollow::on_render_for_picking() const
 
     glsafe(::glEnable(GL_DEPTH_TEST));
     render_points(selection, true);
+    render_hollowed_mesh();
 }
 
 void GLGizmoHollow::render_points(const Selection& selection, bool picking) const
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
index b6a125972..f6560c861 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
@@ -52,6 +52,7 @@ private:
 
     void render_points(const Selection& selection, bool picking = false) const;
     void render_clipping_plane(const Selection& selection) const;
+    void render_hollowed_mesh() const;
     bool is_mesh_update_necessary() const;
     void update_mesh();
     void hollow_mesh();
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index 45a766ccc..c6e0d9007 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -126,6 +126,23 @@ void GLGizmoSlaSupports::on_render() const
     glsafe(::glEnable(GL_BLEND));
     glsafe(::glEnable(GL_DEPTH_TEST));
 
+    m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
+
+    render_hollowed_mesh();
+
+    if (m_quadric != nullptr && selection.is_from_single_instance())
+        render_points(selection, false);
+
+    m_selection_rectangle.render(m_parent);
+    render_clipping_plane(selection);
+
+    glsafe(::glDisable(GL_BLEND));
+}
+
+
+
+void GLGizmoSlaSupports::render_hollowed_mesh() const
+{
     if (m_c->m_volume_with_cavity) {
         m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift);
         m_parent.get_shader().start_using();
@@ -143,19 +160,6 @@ void GLGizmoSlaSupports::on_render() const
         m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id);
         m_parent.get_shader().stop_using();
     }
-    // Show/hide the original object
-    //m_parent.toggle_model_objects_visibility(! m_editing_mode && ! m_c->m_cavity_mesh, 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_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
-
-    if (m_quadric != nullptr && selection.is_from_single_instance())
-        render_points(selection, false);
-
-    m_selection_rectangle.render(m_parent);
-    render_clipping_plane(selection);
-
-    glsafe(::glDisable(GL_BLEND));
 }
 
 
@@ -256,6 +260,7 @@ void GLGizmoSlaSupports::on_render_for_picking() const
 
     glsafe(::glEnable(GL_DEPTH_TEST));
     render_points(selection, true);
+    render_hollowed_mesh();
 }
 
 void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
index 7700ad3a6..3697e7af6 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
@@ -90,6 +90,7 @@ private:
     //void render_selection_rectangle() const;
     void render_points(const Selection& selection, bool picking = false) const;
     void render_clipping_plane(const Selection& selection) const;
+    void render_hollowed_mesh() const;
     bool is_mesh_update_necessary() const;
     void update_mesh();
     bool unsaved_changes() const;