diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 62f09016ae..f29424b4cd 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -981,7 +981,7 @@ void GLCanvas3D::SequentialPrintClearance::render() glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); - if (!m_evaluating) + if (!m_evaluating && !m_dragging) m_fill.render(); #if ENABLE_GL_CORE_PROFILE @@ -3733,6 +3733,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!evt.CmdDown()) m_mouse.drag.start_position_3D = m_mouse.scene_position; m_sequential_print_clearance_first_displacement = true; + m_sequential_print_clearance.start_dragging(); } } } @@ -3857,6 +3858,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else if (m_mouse.drag.move_volume_idx != -1 && m_mouse.dragging) { do_move(L("Move Object")); wxGetApp().obj_manipul()->set_dirty(); + m_sequential_print_clearance.stop_dragging(); // Let the plater know that the dragging finished, so a delayed refresh // of the scene with the background processing data should be performed. post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 99935fa166..6c1b74f815 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -619,6 +619,7 @@ private: // list of transforms used to render the contours std::vector> m_instances; bool m_evaluating{ false }; + bool m_dragging{ false }; std::vector> m_hulls_2d_cache; @@ -628,6 +629,10 @@ private: void render(); bool empty() const { return m_contours.empty(); } + void start_dragging() { m_dragging = true; } + bool is_dragging() const { return m_dragging; } + void stop_dragging() { m_dragging = false; } + friend class GLCanvas3D; }; @@ -966,11 +971,18 @@ public: void reset_sequential_print_clearance() { m_sequential_print_clearance.m_evaluating = false; - m_sequential_print_clearance.set_contours(ContoursList(), false); + if (m_sequential_print_clearance.is_dragging()) + m_sequential_print_clearance_first_displacement = true; + else + m_sequential_print_clearance.set_contours(ContoursList(), false); + set_as_dirty(); + request_extra_frame(); } void set_sequential_print_clearance_contours(const ContoursList& contours, bool generate_fill) { m_sequential_print_clearance.set_contours(contours, generate_fill); + set_as_dirty(); + request_extra_frame(); } bool is_sequential_print_clearance_empty() const { @@ -982,7 +994,11 @@ public: } void update_sequential_clearance(bool force_contours_generation); - void set_sequential_clearance_as_evaluating() { m_sequential_print_clearance.m_evaluating = true; } + void set_sequential_clearance_as_evaluating() { + m_sequential_print_clearance.m_evaluating = true; + set_as_dirty(); + request_extra_frame(); + } const Print* fff_print() const; const SLAPrint* sla_print() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 16334b2c87..65933ee4f7 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3349,8 +3349,6 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool GLCanvas3D::ContoursList contours; contours.contours = background_process.fff_print()->get_sequential_print_clearance_contours(); canvas->set_sequential_print_clearance_contours(contours, true); - canvas->set_as_dirty(); - canvas->request_extra_frame(); } } } @@ -3365,8 +3363,6 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool GLCanvas3D::ContoursList contours; contours.contours = background_process.fff_print()->get_sequential_print_clearance_contours(); canvas->set_sequential_print_clearance_contours(contours, true); - canvas->set_as_dirty(); - canvas->request_extra_frame(); } } std::vector warnings; diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index aa006281d9..b6847859eb 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1550,10 +1550,7 @@ void Selection::erase() ensure_not_below_bed(); } - GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); - canvas->set_sequential_clearance_as_evaluating(); - canvas->set_as_dirty(); - canvas->request_extra_frame(); + wxGetApp().plater()->canvas3D()->set_sequential_clearance_as_evaluating(); } void Selection::render(float scale_factor)