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" } ] }, 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 {