From 0e7fb7cee3972bc4f150821e8ccb6bae4398bfe1 Mon Sep 17 00:00:00 2001 From: jnomikos Date: Sun, 10 May 2026 22:28:12 -0400 Subject: [PATCH 1/2] 3D Viewer: Keep scene alive by default when exiting 3D view Added "keepSceneAlive" setting which keeps the 3D scene alive when going back to fly view. Ensures that the scene does not need to be reloaded on each entry into 3D view. --- src/FlyView/FlyView.qml | 30 ++++++++++++------- src/Settings/Viewer3D.SettingsGroup.json | 8 +++++ src/Settings/Viewer3DSettings.cc | 1 + src/Settings/Viewer3DSettings.h | 1 + .../pages/Viewer3D.SettingsUI.json | 3 ++ 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/FlyView/FlyView.qml b/src/FlyView/FlyView.qml index b617922cfd90..580fb8ea10e7 100644 --- a/src/FlyView/FlyView.qml +++ b/src/FlyView/FlyView.qml @@ -18,7 +18,8 @@ import QGroundControl.Viewer3D Item { id: _root - readonly property bool _is3DMode: QGCViewer3DManager.displayMode === QGCViewer3DManager.View3D + readonly property bool _is3DMode: QGCViewer3DManager.displayMode === QGCViewer3DManager.View3D + readonly property bool _keepSceneAlive: QGroundControl.settingsManager.viewer3DSettings.keepSceneAlive.rawValue // These should only be used by MainRootWindow property var planController: _planController @@ -157,15 +158,24 @@ Item { } Loader { - id: viewer3DLoader - z: 1 - anchors.fill: parent - active: _is3DMode - - onActiveChanged: { - if (active) { - setSource("qrc:/qml/QGroundControl/Viewer3D/Models3D/Viewer3DModel.qml", -) + id: viewer3DLoader + z: 1 + anchors.fill: parent + visible: _is3DMode + } + + Connections { + target: QGCViewer3DManager + function onDisplayModeChanged() { + if (QGCViewer3DManager.displayMode === QGCViewer3DManager.View3D) { + if (!viewer3DLoader.item) { + viewer3DLoader.setSource( + "qrc:/qml/QGroundControl/Viewer3D/Models3D/Viewer3DModel.qml", + { missionController: Qt.binding(() => _missionController) } + ) + } + } else if (!_keepSceneAlive) { + viewer3DLoader.source = "" } } } diff --git a/src/Settings/Viewer3D.SettingsGroup.json b/src/Settings/Viewer3D.SettingsGroup.json index 45518bb37e39..44813bc2a50f 100644 --- a/src/Settings/Viewer3D.SettingsGroup.json +++ b/src/Settings/Viewer3D.SettingsGroup.json @@ -49,6 +49,14 @@ "default": 0, "label": "Altitude bias for vehicles in the 3D View", "keywords": "altitude bias,3d data" + }, + { + "name": "keepSceneAlive", + "shortDesc": "Keep the 3D scene loaded in memory when switching back to fly view. Disable on memory-constrained devices.", + "type": "bool", + "default": true, + "label": "Keep 3D scene alive when exiting 3D view", + "keywords": "3d view,memory,scene,alive" } ] } diff --git a/src/Settings/Viewer3DSettings.cc b/src/Settings/Viewer3DSettings.cc index 20003aa38259..1679d0031591 100644 --- a/src/Settings/Viewer3DSettings.cc +++ b/src/Settings/Viewer3DSettings.cc @@ -9,3 +9,4 @@ DECLARE_SETTINGSFACT(Viewer3DSettings, mapProvider) DECLARE_SETTINGSFACT(Viewer3DSettings, osmFilePath) DECLARE_SETTINGSFACT(Viewer3DSettings, buildingLevelHeight) DECLARE_SETTINGSFACT(Viewer3DSettings, altitudeBias) +DECLARE_SETTINGSFACT(Viewer3DSettings, keepSceneAlive) diff --git a/src/Settings/Viewer3DSettings.h b/src/Settings/Viewer3DSettings.h index 718e8869427f..44f588221636 100644 --- a/src/Settings/Viewer3DSettings.h +++ b/src/Settings/Viewer3DSettings.h @@ -24,4 +24,5 @@ class Viewer3DSettings : public SettingsGroup DEFINE_SETTINGFACT(osmFilePath) DEFINE_SETTINGFACT(buildingLevelHeight) DEFINE_SETTINGFACT(altitudeBias) + DEFINE_SETTINGFACT(keepSceneAlive) }; diff --git a/src/UI/AppSettings/pages/Viewer3D.SettingsUI.json b/src/UI/AppSettings/pages/Viewer3D.SettingsUI.json index a355d0b94f8a..a3abb358c74e 100644 --- a/src/UI/AppSettings/pages/Viewer3D.SettingsUI.json +++ b/src/UI/AppSettings/pages/Viewer3D.SettingsUI.json @@ -11,6 +11,9 @@ }, { "setting": "viewer3DSettings.mapProvider" + }, + { + "setting": "viewer3DSettings.keepSceneAlive" } ] }, From c56863698a0c851ff527f0a5a651f59625c404d9 Mon Sep 17 00:00:00 2001 From: jnomikos Date: Sun, 10 May 2026 22:31:12 -0400 Subject: [PATCH 2/2] fix: Crash when switching between "3D View" and "Fly View" Specifically when "keepSceneAlive" is disabled. We manually clear missionWaypointListModel onDestruction of Viewer3DVehicleItems. --- src/Viewer3D/Viewer3DQml/Models3D/Viewer3DVehicleItems.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Viewer3D/Viewer3DQml/Models3D/Viewer3DVehicleItems.qml b/src/Viewer3D/Viewer3DQml/Models3D/Viewer3DVehicleItems.qml index eca757ac4bb3..4c8f30e7b9e3 100644 --- a/src/Viewer3D/Viewer3DQml/Models3D/Viewer3DVehicleItems.qml +++ b/src/Viewer3D/Viewer3DQml/Models3D/Viewer3DVehicleItems.qml @@ -163,7 +163,11 @@ Node { ListModel { id: missionWaypointListModel + } + Component.onDestruction: { + // This is necessary insurance to prevent crashes after destruction when "keepSceneAlive" setting is disabled. + missionWaypointListModel.clear() } DroneModelDjiF450 {