SPE-1937: Fixed rendering of sequential clearance contours when dragging an object while the collision detection is running

This commit is contained in:
enricoturri1966 2023-10-06 14:27:40 +02:00
parent cfcb4f7925
commit 319454c259
4 changed files with 22 additions and 11 deletions

View File

@ -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));

View File

@ -619,6 +619,7 @@ private:
// list of transforms used to render the contours
std::vector<std::pair<size_t, Transform3d>> m_instances;
bool m_evaluating{ false };
bool m_dragging{ false };
std::vector<std::pair<Pointf3s, Transform3d>> 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;

View File

@ -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<std::string> warnings;

View File

@ -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)