From 9bae19fcb33ee03eca8e000555cd197650078b6d Mon Sep 17 00:00:00 2001 From: Kris Austin Date: Wed, 23 Sep 2026 16:21:16 -0500 Subject: [PATCH] fix: the 3D scene is drawn in the wrong view for the first half second of startup (#15830) --- src/slic3r/GUI/GUI_App.cpp | 3 +++ src/slic3r/GUI/Plater.cpp | 15 ++++++++------- src/slic3r/GUI/Plater.hpp | 4 ++-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 29bab18aeb..6b9b977219 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -865,6 +865,9 @@ void GUI_App::post_init() plater_->canvas3D()->enable_render(false); mainframe->select_tab(TAB_ID_PREPARE); plater_->select_view_3D("3D"); + // The first render happens before the queued new_project() sets the same view. + plater_->get_camera().select_view("topfront"); + plater_->get_camera().requires_zoom_to_bed = true; //BBS init the opengl resource here if (!plater_->canvas3D()->get_wxglcanvas()->IsShownOnScreen() || !plater_->canvas3D()->make_current_for_postinit()) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d4386fbe93..5a10dcd2a7 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -7033,7 +7033,7 @@ struct Plater::priv void remove(size_t obj_idx); bool delete_object_from_model(size_t obj_idx, bool refresh_immediately = true); //BBS void delete_all_objects_from_model(); - void reset(bool apply_presets_change = false); + void reset(bool apply_presets_change = false, bool reload_presets = true); void center_selection(); void drop_selection(); void mirror(Axis axis); @@ -7891,7 +7891,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) if (this->q->get_project_filename().IsEmpty() && this->q->is_empty_project()) { int skip_confirm = e.GetInt(); - this->q->new_project(skip_confirm, true); + // Skips the preset reload; trigger_restore_project()'s callers load the presets first. + this->q->new_project(skip_confirm, true, wxString(), false); } }); //wxPostEvent(this->q, wxCommandEvent{EVT_RESTORE_PROJECT}); @@ -10356,7 +10357,7 @@ void Plater::priv::delete_all_objects_from_model() model.plates_custom_gcodes.clear(); } -void Plater::priv::reset(bool apply_presets_change) +void Plater::priv::reset(bool apply_presets_change, bool reload_presets) { // TakeSnapshot below and load_current_presets() further down each re-evaluate the // aggregate dirty flag against a baseline that hasn't been reset yet, so they can toggle @@ -10431,7 +10432,7 @@ void Plater::priv::reset(bool apply_presets_change) wxGetApp().preset_bundle->reset_project_embedded_presets(); if (apply_presets_change) wxGetApp().apply_keeped_preset_modifications(); - else + else if (reload_presets) wxGetApp().load_current_presets(false, false); //BBS @@ -15351,7 +15352,7 @@ Print& Plater::fff_print() { return p->fff_print; } const SLAPrint& Plater::sla_print() const { return p->sla_print; } SLAPrint& Plater::sla_print() { return p->sla_print; } -int Plater::new_project(bool skip_confirm, bool silent, const wxString& project_name) +int Plater::new_project(bool skip_confirm, bool silent, const wxString& project_name, bool reload_presets) { model().calib_pa_pattern.reset(nullptr); model().plates_custom_gcodes.clear(); @@ -15399,7 +15400,7 @@ int Plater::new_project(bool skip_confirm, bool silent, const wxString& project_ // completes, so hold notifications until then to avoid firing on transient flips. ProjectDirtyStateManager::NotificationSuppressor dirty_notify_suppressor(p->dirty_state); - reset(transfer_preset_changes); + reset(transfer_preset_changes, reload_presets); reset_project_dirty_after_save(); reset_project_dirty_initial_presets(); wxGetApp().update_saved_preset_from_current_preset(); @@ -17984,7 +17985,7 @@ void Plater::deselect_all() { p->deselect_all(); } void Plater::exit_gizmo() { p->exit_gizmo(); } void Plater::remove(size_t obj_idx) { p->remove(obj_idx); } -void Plater::reset(bool apply_presets_change) { p->reset(apply_presets_change); } +void Plater::reset(bool apply_presets_change, bool reload_presets) { p->reset(apply_presets_change, reload_presets); } void Plater::reset_with_confirm() { if (p->model.objects.empty() || MessageDialog(static_cast(this), _L("All objects will be removed, continue?"), diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index b30f0298ee..90d0e5e673 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -339,7 +339,7 @@ public: // Helper: returns config indices where filament_is_mixed == false std::vector physical_filament_config_indices() const; - int new_project(bool skip_confirm = false, bool silent = false, const wxString& project_name = wxString()); + int new_project(bool skip_confirm = false, bool silent = false, const wxString& project_name = wxString(), bool reload_presets = true); // BBS: save & backup void load_project(wxString const & filename = "", wxString const & originfile = "-"); int save_project(bool saveAs = false); @@ -499,7 +499,7 @@ public: void deselect_all(); void exit_gizmo(); void remove(size_t obj_idx); - void reset(bool apply_presets_change = false); + void reset(bool apply_presets_change = false, bool reload_presets = true); void reset_with_confirm(); //BBS: return int for various result int close_with_confirm(std::function second_check = nullptr); // BBS close project