2import QGroundControl.Controls
4import QtQuick3D.Helpers
9 property var _altitudeBias: _viewer3DSetting.altitudeBias.rawValue
10 property var _backendQml: null
11 property Node _camera: null
12 property var _missionController: (_planMasterController) ? (_planMasterController.missionController) : (null)
13 property var _planMasterController: null
14 property bool _rtlActive: false
15 property var _vehicle: null
16 property var _viewer3DSetting: QGroundControl.settingsManager.viewer3DSettings
17 property alias waypointConeModel: _waypointConeModel
18 property alias waypointInstancing: waypointInstancing
20 function addMissionItemsToListModel() {
21 missionWaypointListModel.clear();
22 waypointInstancing.selectedIndex = -1;
23 waypointInstancing.clear();
24 var _geo2EnuCopy = geo2Enu;
25 var launchItemCoordinate = null;
26 var _missionItemPrevious = null;
29 for (var i = 0; i < _missionController.visualItems.count; i++) {
30 var _missionItem = _missionController.visualItems.get(i);
31 if (isLaunchItem(_missionItem)) {
32 launchItemCoordinate = _missionItem.coordinate;
35 if (isItemAcceptable(_missionItem)) {
36 if (isReturnToLaunchItem(_missionItem)) {
38 _geo2EnuCopy.coordinate = (_vehicle.homePosition) ? (_vehicle.homePosition) : (_missionItem.coordinate);
39 _geo2EnuCopy.coordinate.altitude = _missionItemPrevious.altitude.value;
41 _geo2EnuCopy.coordinate = _missionItem.coordinate;
42 _geo2EnuCopy.coordinate.altitude = _missionItem.altitude.value;
44 var name = getItemName(_missionItem);
45 var lx = _geo2EnuCopy.localCoordinate.x;
46 var ly = _geo2EnuCopy.localCoordinate.y;
47 var lz = _geo2EnuCopy.coordinate.altitude;
48 missionWaypointListModel.append({
53 "index": _missionItem.sequenceNumber
55 waypointInstancing.addEntry(Qt.vector3d(lx * 10, ly * 10, (lz + _altitudeBias) * 10), Qt.vector3d(0.1, 0.1, 0.1), Quaternion.fromEulerAngles(Qt.vector3d(90, 0, 0)), waypointColor(name));
56 if (name === "L" || name === "W") {
57 _missionItemPrevious = _missionItem;
63 function addSegmentToMissionPathModel() {
64 pathInstancing.clear();
65 var _geo2EnuCopy = geo2Enu;
68 var _missionItemPrevious = null;
69 var launchItemCoordinate;
71 for (var i = 0; i < _missionController.visualItems.count; i++) {
72 _missionItem = _missionController.visualItems.get(i);
73 if (isLaunchItem(_missionItem)) {
74 launchItemCoordinate = _missionItem.coordinate;
77 if (_missionItem.isTakeoffItem) {
78 _missionItemPrevious = _missionItem;
81 if (_missionItemPrevious === null) {
84 if (getItemName(_missionItem) === "L" || getItemName(_missionItem) === "W") {
85 _geo2EnuCopy.coordinate = _missionItemPrevious.coordinate;
86 _geo2EnuCopy.coordinate.altitude = _missionItemPrevious.altitude.value;
87 var p1 = Qt.vector3d(_geo2EnuCopy.localCoordinate.x * 10, _geo2EnuCopy.localCoordinate.y * 10, (_geo2EnuCopy.coordinate.altitude + _altitudeBias) * 10);
89 if (isReturnToLaunchItem(_missionItem)) {
90 _geo2EnuCopy.coordinate = (_vehicle.homePosition) ? (_vehicle.homePosition) : (_missionItem.coordinate);
91 _geo2EnuCopy.coordinate.altitude = _missionItemPrevious.altitude.value;
93 _geo2EnuCopy.coordinate = _missionItem.coordinate;
94 _geo2EnuCopy.coordinate.altitude = _missionItem.altitude.value;
96 var p2 = Qt.vector3d(_geo2EnuCopy.localCoordinate.x * 10, _geo2EnuCopy.localCoordinate.y * 10, (_geo2EnuCopy.coordinate.altitude + _altitudeBias) * 10);
98 var color = isReturnToLaunchItem(_missionItem) ? "red" : "orange";
99 pathInstancing.addLineSegment(p1, p2, 8, color);
100 _missionItemPrevious = _missionItem;
105 function getItemName(missionItem) {
106 if (isLaunchItem(missionItem) || isReturnToLaunchItem(missionItem)) {
110 if (missionItem.isTakeoffItem) {
111 return qsTr("T"); //Takeoff
114 if (missionItem.specifiesCoordinate) {
115 switch (missionItem.command) {
117 return qsTr("W"); //Waypoint
119 return qsTr("T"); //Takeoff
121 return qsTr("R"); //ROI
123 return qsTr("R"); //ROI DEPRECATED
129 function isItemAcceptable(missionItem) {
130 const acceptableCmdIds = [16 // Waypoint
131 , 20 // Return To Launch
134 , 201 // ROI DEPRECATED
135 ,]; // based on MavCmdInfoCommon.json file
136 return acceptableCmdIds.includes(missionItem.command);
139 function isLaunchItem(missionItem) {
140 return missionItem.abbreviation === "L";
143 function isReturnToLaunchItem(missionItem) {
144 return missionItem.command === 20;
147 function waypointColor(itemName) {
148 if (itemName === "T")
150 if (itemName === "R")
152 if (itemName === "L")
157 Viewer3DGeoCoordinateType {
160 gpsRef: _backendQml.gpsRef
164 id: missionWaypointListModel
171 altitudeBias: _altitudeBias
172 gpsRef: _backendQml.gpsRef
173 modelScale: Qt.vector3d(0.05, 0.05, 0.05)
178 id: waypointInstancing
183 id: _waypointConeModel
185 instancing: waypointInstancing
186 instancingLodMax: 5000
191 materials: DefaultMaterial {
192 diffuseColor: "white"
197 model: missionWaypointListModel
200 position: Qt.vector3d(model.x * 10, model.y * 10, (model.z + _altitudeBias) * 10)
210 text: (model.itemName === "W") ? String(model.index) : model.itemName
222 instancing: pathInstancing
223 instancingLodMax: 8000
226 materials: DefaultMaterial {
227 diffuseColor: "white"
232 function onVisualItemsChanged() {
233 addMissionItemsToListModel();
234 addSegmentToMissionPathModel();
237 enabled: target !== null
238 target: _missionController
242 function onGpsRefChanged() {
243 addMissionItemsToListModel();
244 addSegmentToMissionPathModel();
247 enabled: target !== null
252 function onHomePositionChanged() {
254 addMissionItemsToListModel();
255 addSegmentToMissionPathModel();
259 enabled: target !== null