diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b10bddd7a..f05f34f68 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1339,9 +1339,10 @@ void GLCanvas3D::reset_volumes(bool is_destroying) _set_current(); - m_selection.clear(is_destroying); - m_volumes.clear(); - m_dirty = true; + m_selection.clear(is_destroying); + m_volumes.release_geometry(); + m_volumes.clear(); + m_dirty = true; if(!is_destroying) _set_warning_texture(WarningTexture::ObjectOutside, false); @@ -2326,23 +2327,23 @@ static void reserve_new_volume_finalize_old_volume(GLVolume& vol_new, GLVolume& vol_old.finalize_geometry(gl_initialized); } -void GLCanvas3D::load_gcode_preview(const GCodeProcessor::Result& gcode_result) +void GLCanvas3D::load_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector& str_tool_colors) { - m_gcode_viewer.load(gcode_result, *this->fff_print(), m_initialized); + if (m_dirty_gcode) { + m_dirty_gcode = false; + m_gcode_viewer.load(gcode_result, *this->fff_print(), m_initialized); - if (wxGetApp().is_editor()) { - m_gcode_viewer.update_shells_color_by_extruder(m_config); - _show_warning_texture_if_needed(WarningTexture::ToolpathOutside); + if (wxGetApp().is_editor()) { + m_gcode_viewer.update_shells_color_by_extruder(m_config); + _show_warning_texture_if_needed(WarningTexture::ToolpathOutside); + } + + m_gcode_viewer.refresh(gcode_result, str_tool_colors); + set_as_dirty(); + request_extra_frame(); } } -void GLCanvas3D::refresh_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector& str_tool_colors) -{ - m_gcode_viewer.refresh(gcode_result, str_tool_colors); - set_as_dirty(); - request_extra_frame(); -} - #if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE void GLCanvas3D::refresh_gcode_preview_render_paths() { @@ -2367,23 +2368,27 @@ void GLCanvas3D::load_sla_preview() void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) { - const Print *print = this->fff_print(); + const Print* print = this->fff_print(); if (print == nullptr) return; _set_current(); - // Release OpenGL data before generating new data. - this->reset_volumes(); + if (m_dirty_preview || m_volumes.empty()) { + m_dirty_preview = false; + // Release OpenGL data before generating new data. + this->reset_volumes(); + //note: this isn't releasing all the memory in all os, can make it crash on linux for exemple. - _load_print_toolpaths(); - _load_wipe_tower_toolpaths(str_tool_colors); - for (const PrintObject* object : print->objects()) + _load_print_toolpaths(); + _load_wipe_tower_toolpaths(str_tool_colors); + for (const PrintObject* object : print->objects()) _load_print_object_toolpaths(*object, str_tool_colors, color_print_values); - _update_toolpath_volumes_outside_state(); - _show_warning_texture_if_needed(WarningTexture::ToolpathOutside); + _update_toolpath_volumes_outside_state(); + _show_warning_texture_if_needed(WarningTexture::ToolpathOutside); } +} void GLCanvas3D::bind_event_handlers() { @@ -4835,7 +4840,7 @@ bool GLCanvas3D::_init_collapse_toolbar() bool GLCanvas3D::_set_current() { return m_context != nullptr && m_canvas->SetCurrent(*m_context); - } +} void GLCanvas3D::_resize(unsigned int w, unsigned int h) { diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 7d6238c80..a13df2036 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -475,6 +475,8 @@ private: // Screen is only refreshed from the OnIdle handler if it is dirty. bool m_dirty; + bool m_dirty_preview = true; + bool m_dirty_gcode = true; bool m_initialized; bool m_apply_zoom_to_volumes_filter; mutable std::vector m_hover_volume_idxs; @@ -557,6 +559,9 @@ public: void post_event(wxEvent &&event); void set_as_dirty(); + void set_preview_dirty() { m_dirty_preview = true; } + bool is_preview_dirty() { return m_dirty_preview; } + void set_gcode_viewer_dirty() { m_dirty_gcode = true; } void set_items_show(bool show_objects, bool show_gcode); unsigned int get_volumes_count() const; @@ -666,8 +671,7 @@ public: void reload_scene(bool refresh_immediately, bool force_full_scene_refresh = false); - void load_gcode_preview(const GCodeProcessor::Result& gcode_result); - void refresh_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector& str_tool_colors); + void load_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector& str_tool_colors); #if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE void refresh_gcode_preview_render_paths(); #endif // ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index d6e8cc242..207b8f597 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -416,8 +416,9 @@ void Preview::reload_print(bool keep_volumes) #ifdef __linux__ m_volumes_cleanup_required || #endif /* __linux__ */ - !keep_volumes) + (!keep_volumes && m_canvas->is_preview_dirty())) { + m_canvas->set_preview_dirty(); m_canvas->reset_volumes(); m_loaded = false; #ifdef __linux__ @@ -1020,8 +1021,9 @@ void Preview::load_print_as_fff(bool keep_z_range) m_canvas->set_selected_extruder(0); if (current_force_state == ForceState::ForceGcode || (gcode_preview_data_valid && current_force_state != ForceState::ForceExtrusions)) { // Load the real G-code preview. - m_canvas->load_gcode_preview(*m_gcode_result); - m_canvas->refresh_gcode_preview(*m_gcode_result, colors); + if (current_force_state == ForceState::NoForce) + m_canvas->set_items_show(false, true); + m_canvas->load_gcode_preview(*m_gcode_result, colors); m_left_sizer->Show(m_bottom_toolbar_panel); m_left_sizer->Layout(); Refresh(); @@ -1029,6 +1031,8 @@ void Preview::load_print_as_fff(bool keep_z_range) m_loaded = true; } else { // Load the initial preview based on slices, not the final G-code. + if (current_force_state == ForceState::NoForce) + m_canvas->set_items_show(true, false); m_canvas->load_preview(colors, color_print_values); m_left_sizer->Hide(m_bottom_toolbar_panel); m_left_sizer->Layout(); @@ -1039,8 +1043,9 @@ void Preview::load_print_as_fff(bool keep_z_range) // all layers filtered out hide_layers_slider(); m_canvas_widget->Refresh(); - } else + } else { update_layers_slider(zs, keep_z_range); + } } #if ENABLE_PREVIEW_TYPE_CHANGE @@ -1071,6 +1076,13 @@ void Preview::load_print_as_fff(bool keep_z_range) #endif // ENABLE_PREVIEW_TYPE_CHANGE } +void Preview::reset_gcode_toolpaths() +{ + if (current_force_state == ForceState::NoForce) + m_canvas->set_items_show(true, false); + m_canvas->reset_gcode_toolpaths(); +} + void Preview::load_print_as_sla() { if (m_loaded || (m_process->current_printer_technology() != ptSLA)) diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 8c72d7a3f..5b4d7f50e 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -203,6 +203,7 @@ Preview(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSl bool can_display_gcode(); bool can_display_volume(); + void reset_gcode_toolpaths(); private: ForceState current_force_state = ForceState::NoForce; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4337cb5f9..35abd56e4 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3576,8 +3576,14 @@ void Plater::priv::set_current_panel(wxTitledPanel* panel) // FIXME: it may be better to have a single function making this check and let it be called wherever needed bool export_in_progress = this->background_process.is_export_scheduled(); bool model_fits = view3D->check_volumes_outside_state() != ModelInstancePVS_Partly_Outside; - if (!model.objects.empty() && !export_in_progress && model_fits) - this->q->reslice(); + + if (!model.objects.empty() && !export_in_progress && model_fits) { + //check if already slicing + bool already_running = this->background_process.state() == BackgroundSlicingProcess::State::STATE_RUNNING || + this->background_process.state() == BackgroundSlicingProcess::State::STATE_STARTED; + if(!already_running) + this->q->reslice(); + } // keeps current gcode preview, if any preview->reload_print(true); } @@ -3722,6 +3728,7 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) void Plater::priv::on_slicing_completed(wxCommandEvent & evt) { + preview->get_canvas3d()->set_gcode_viewer_dirty(); // auto_switch_preview == 0 means "no force tab change" // auto_switch_preview == 1 means "force tab change" // auto_switch_preview == 2 means "force tab change only if already on a plater one" @@ -3753,6 +3760,8 @@ void Plater::priv::on_slicing_began() { clear_warnings(); notification_manager->close_notification_of_type(NotificationType::SlicingComplete); + preview->get_canvas3d()->set_gcode_viewer_dirty(); + preview->get_canvas3d()->set_preview_dirty(); } void Plater::priv::add_warning(const Slic3r::PrintStateBase::Warning& warning, size_t oid) { @@ -4390,7 +4399,7 @@ void Plater::priv::enable_preview_moves_slider(bool enable) void Plater::priv::reset_gcode_toolpaths() { - preview->get_canvas3d()->reset_gcode_toolpaths(); + preview->reset_gcode_toolpaths(); } bool Plater::priv::can_set_instance_to_object() const