From a29d4fc495101b36654e65c416805ff06ef4df7d Mon Sep 17 00:00:00 2001 From: yw4z Date: Sat, 9 May 2026 08:11:26 +0300 Subject: [PATCH] Crash fix assembly mode flatpak (#13413) * Update GLCanvas3D.cpp * Update GLCanvas3D.cpp * update * Update GLCanvas3D.cpp Co-Authored-By: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> --------- Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> --- src/slic3r/GUI/GLCanvas3D.cpp | 27 ++++++++++++++++++++------- src/slic3r/GUI/Plater.cpp | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 5457452189..ba4f06e8f2 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1920,6 +1920,14 @@ void GLCanvas3D::render(bool only_init) if (!is_initialized() && !init()) return; + + // If a scene reload was postponed while the canvas was hidden, consume it on first visible render. + if (m_reload_delayed) { + reload_scene(true); + if (m_reload_delayed) + return; + } + if (m_canvas_type == ECanvasType::CanvasView3D && m_gizmos.get_current_type() == GLGizmosManager::Undefined) { enable_return_toolbar(false); } @@ -2398,10 +2406,11 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re if (m_canvas == nullptr || m_config == nullptr || m_model == nullptr) return; - if (!m_initialized) + if (!m_initialized || !_set_current()) { + m_reload_delayed = true; + set_as_dirty(); return; - - _set_current(); + } m_hover_volume_idxs.clear(); @@ -2456,6 +2465,10 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re auto model_volume_state_lower = [](const ModelVolumeState& m1, const ModelVolumeState& m2) { return m1.geometry_id < m2.geometry_id; }; m_reload_delayed = !m_canvas->IsShown() && !refresh_immediately && !force_full_scene_refresh; + if (m_reload_delayed) { + set_as_dirty(); + return; + } PrinterTechnology printer_technology = current_printer_technology(); @@ -2617,9 +2630,6 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re //BBS clean hover_volume_idxs m_hover_volume_idxs.clear(); - if (m_reload_delayed) - return; - // BBS: do not check wipe tower changes bool update_object_list = false; if (deleted_volumes.size() != deleted_wipe_towers.size()) @@ -3897,7 +3907,7 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) if (m_gizmos.on_mouse_wheel(evt)) return; - if (m_canvas_type == CanvasAssembleView && (evt.AltDown() || evt.CmdDown())) { + if (m_canvas_type == CanvasAssembleView && (evt.AltDown() || evt.CmdDown()) && m_gizmos.m_assemble_view_data != nullptr) { float rotation = (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta(); if (evt.AltDown()) { auto clp_dist = m_gizmos.m_assemble_view_data->model_objects_clipper()->get_position(); @@ -8915,6 +8925,9 @@ float GLCanvas3D::_render_assembly_tooltip_button(ImGuiWrapper* imgui_wrapper) c //BBS void GLCanvas3D::_render_assemble_control() { + if(m_gizmos.m_assemble_view_data == nullptr) + return; + if (m_canvas_type != ECanvasType::CanvasAssembleView) { GLVolume::explosion_ratio = m_explosion_ratio = 1.0; return; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index ec74a796e4..31ec92bfc0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6923,6 +6923,12 @@ std::vector Plater::priv::load_files(const std::vector& input_ } if (load_model) { + if (!q->m_exported_file && view3D != nullptr) { + // Force a 3D scene refresh after view/plate selection to avoid losing the first load + // on platforms where the GL canvas mapping lags behind model loading. + view3D->reload_scene(true); + view3D->set_as_dirty(); + } if (!silence) wxGetApp().app_config->update_skein_dir(input_files[input_files.size() - 1].parent_path().make_preferred().string()); // XXX: Plater.pm had @loaded_files, but didn't seem to fill them with the filenames... } @@ -9130,6 +9136,20 @@ void Plater::priv::set_current_panel(wxPanel* panel, bool no_slice) if (current_panel == panel) { + if (panel == view3D) { + if (view3D->is_reload_delayed()) { + // Delayed loading of the 3D scene when caller requests the already active tab. + if (printer_technology == ptSLA) + update_restart_background_process(true, false); + else + view3D->reload_scene(true); + } + + view3D->set_as_dirty(); + view3D->get_canvas3d()->reset_old_size(); + if (notification_manager != nullptr) + notification_manager->set_in_preview(false); + } //BBS: add slice logic when switch to preview page //BBS: add only gcode mode if (!q->only_gcode_mode() && (current_panel == preview) && (wxGetApp().is_editor())) {