5import QGroundControl.Controls
10 objectName: "viewer3DView"
12 readonly property real _viewDistance: 50000
13 readonly property var _gpsRef: QGCViewer3DManager.gpsRef
14 readonly property bool _mapLoaded: QGCViewer3DManager.mapProvider ? QGCViewer3DManager.mapProvider.mapLoaded : false
16 // Exposed so FlyView can position the scale bar alongside the other widgets
17 readonly property Viewer3DCameraController cameraController: _cameraController
19 camera: standAloneScene.cameraOne
21 environment: SceneEnvironment {
22 antialiasingMode: SceneEnvironment.MSAA
23 antialiasingQuality: SceneEnvironment.High
24 backgroundMode: SceneEnvironment.Color
31 depthFar: _viewDistance
37 QGCPalette { id: qgcPal }
39 readonly property color _skyColor: qgcPal.window
40 importScene: CameraLightModel {
43 cameraHeading: cameraController.heading
44 cameraTilt: cameraController.tilt
45 cameraZoom: cameraController.distance
46 orbitCenter: cameraController.orbitCenter
47 viewDistance: _viewDistance
50 Viewer3DCameraController {
53 fieldOfView: standAloneScene.cameraOne.fieldOfView
54 viewportSize: Qt.size(topView.width, topView.height)
57 function _resetCameraForContent() {
59 cameraController.reset();
61 // Without an OSM map there is no terrain; a top-down view shows
62 // nothing useful. Look at the vehicle from the side, slightly above.
63 cameraController.lookAt(Qt.vector3d(0, 0, 0), 0, 75, 400);
67 Component.onCompleted: {
68 vehicle3DLoader.active = true;
69 mapGeometryLoader.active = true;
70 _resetCameraForContent();
73 _resetCameraForContent();
75 on_MapLoadedChanged: {
76 _resetCameraForContent();
80 id: buildingsGeometryComponent
86 scale: Qt.vector3d(10, 10, 10)
89 geometry: CityMapGeometry {
92 mapProvider: QGCViewer3DManager.mapProvider
98 indexOfRefraction: 4.0
110 scale: Qt.vector3d(10, 10, 10)
113 geometry: Viewer3DTerrainGeometry {
114 id: terrainGeometryManager
116 refCoordinate: _gpsRef
118 materials: CustomMaterial {
119 property TextureInput someTextureMap: TextureInput {
121 textureData: _terrainTextureManager
125 fragmentShader: "/qml/QGroundControl/Viewer3D/ShaderFragment/earthMaterial.frag"
126 vertexShader: "/qml/QGroundControl/Viewer3D/ShaderVertex/earthMaterial.vert"
130 Viewer3DTerrainTexture {
131 id: _terrainTextureManager
133 readonly property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
135 fallbackCenter: _activeVehicle ? _activeVehicle.homePosition : QtPositioning.coordinate()
136 mapProvider: QGCViewer3DManager.mapProvider
138 onTextureGeometryDoneChanged: {
139 if (textureGeometryDone === true) {
140 terrainGeometryManager.sectorCount = tileCount.width;
141 terrainGeometryManager.stackCount = tileCount.height;
142 terrainGeometryManager.roiMin = roiMinCoordinate;
143 terrainGeometryManager.roiMax = roiMaxCoordinate;
144 terrainGeometryManager.updateEarthData();
152 id: mapGeometryLoader
155 sourceComponent: buildingsGeometryComponent
159 id: vehicle3DComponent
162 model: QGroundControl.multiVehicleManager.vehicles
164 delegate: Viewer3DVehicleItems {
165 _backendQml: QGCViewer3DManager
166 _camera: standAloneScene.cameraOne
167 _planMasterController: masterController
170 PlanMasterController {
173 Component.onCompleted: startStaticActiveVehicle(object)
183 sourceComponent: vehicle3DComponent
186 Viewer3DCameraControls {
188 controller: cameraController
192 function deselectAllWaypoints() {
193 if (!vehicle3DLoader.item)
195 for (var i = 0; i < vehicle3DLoader.item.count; i++) {
196 vehicle3DLoader.item.objectAt(i).waypointInstancing.selectedIndex = -1;
200 onTapped: function (eventPoint) {
201 if (!vehicle3DLoader.item)
205 for (var i = 0; i < vehicle3DLoader.item.count; i++) {
206 models.push(vehicle3DLoader.item.objectAt(i).waypointConeModel);
209 var results = topView.pickSubset(eventPoint.position.x, eventPoint.position.y, models);
210 if (results.length === 0) {
211 deselectAllWaypoints();
215 var result = results[0];
216 for (var i = 0; i < vehicle3DLoader.item.count; i++) {
217 var vehicleItem = vehicle3DLoader.item.objectAt(i);
218 if (result.objectHit === vehicleItem.waypointConeModel) {
219 vehicleItem.waypointInstancing.selectedIndex = result.instanceIndex;
224 deselectAllWaypoints();