Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
992e6e57
Unverified
Commit
992e6e57
authored
Jun 15, 2020
by
Don Gagne
Committed by
GitHub
Jun 15, 2020
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #8844 from DonLakeFlyer/TerrainProfileCrash
Fix Terrain profile crash
parents
37d3db3d
fdb53cb4
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
134 additions
and
115 deletions
+134
-115
SurveyItemEditor.qml
src/PlanView/SurveyItemEditor.qml
+46
-44
TerrainProfile.cc
src/QmlControls/TerrainProfile.cc
+78
-63
TerrainProfile.h
src/QmlControls/TerrainProfile.h
+10
-8
No files found.
src/PlanView/SurveyItemEditor.qml
View file @
992e6e57
...
...
@@ -27,23 +27,24 @@ Rectangle {
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
property
real
_fieldWidth
:
ScreenTools
.
defaultFontPixelWidth
*
10.5
property
var
_vehicle
:
QGroundControl
.
multiVehicleManager
.
activeVehicle
?
QGroundControl
.
multiVehicleManager
.
activeVehicle
:
QGroundControl
.
multiVehicleManager
.
offlineEditingVehicle
property
real
_cameraMinTriggerInterval
:
missionItem
.
cameraCalc
.
minTriggerInterval
.
rawValue
property
real
_cameraMinTriggerInterval
:
_
missionItem
.
cameraCalc
.
minTriggerInterval
.
rawValue
property
bool
_polygonDone
:
false
property
string
_doneAdjusting
:
qsTr
(
"
Done
"
)
property
bool
_presetsAvailable
:
missionItem
.
presetNames
.
length
!==
0
property
var
_missionItem
:
missionItem
property
bool
_presetsAvailable
:
_missionItem
.
presetNames
.
length
!==
0
function
polygonCaptureStarted
()
{
missionItem
.
clearPolygon
()
_
missionItem
.
clearPolygon
()
}
function
polygonCaptureFinished
(
coordinates
)
{
for
(
var
i
=
0
;
i
<
coordinates
.
length
;
i
++
)
{
missionItem
.
addPolygonCoordinate
(
coordinates
[
i
])
_
missionItem
.
addPolygonCoordinate
(
coordinates
[
i
])
}
}
function
polygonAdjustVertex
(
vertexIndex
,
vertexCoordinate
)
{
missionItem
.
adjustPolygonCoordinate
(
vertexIndex
,
vertexCoordinate
)
_
missionItem
.
adjustPolygonCoordinate
(
vertexIndex
,
vertexCoordinate
)
}
function
polygonAdjustStarted
()
{
}
...
...
@@ -63,7 +64,7 @@ Rectangle {
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
spacing
:
_margin
visible
:
!
missionItem
.
surveyAreaPolygon
.
isValid
||
missionItem
.
wizardMode
visible
:
!
_missionItem
.
surveyAreaPolygon
.
isValid
||
_
missionItem
.
wizardMode
ColumnLayout
{
Layout.fillWidth
:
true
...
...
@@ -104,16 +105,16 @@ Rectangle {
text
:
qsTr
(
"
WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.
"
).
arg
(
_cameraMinTriggerInterval
.
toFixed
(
1
))
wrapMode
:
Text
.
WordWrap
color
:
qgcPal
.
warningText
visible
:
missionItem
.
cameraShots
>
0
&&
_cameraMinTriggerInterval
!==
0
&&
_cameraMinTriggerInterval
>
missionItem
.
timeBetweenShots
visible
:
_missionItem
.
cameraShots
>
0
&&
_cameraMinTriggerInterval
!==
0
&&
_cameraMinTriggerInterval
>
_
missionItem
.
timeBetweenShots
}
CameraCalcGrid
{
cameraCalc
:
missionItem
.
cameraCalc
cameraCalc
:
_
missionItem
.
cameraCalc
vehicleFlightIsFrontal
:
true
distanceToSurfaceLabel
:
qsTr
(
"
Altitude
"
)
distanceToSurfaceAltitudeMode
:
missionItem
.
followTerrain
?
distanceToSurfaceAltitudeMode
:
_
missionItem
.
followTerrain
?
QGroundControl
.
AltitudeModeAboveTerrain
:
(
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
?
QGroundControl
.
AltitudeModeRelative
:
QGroundControl
.
AltitudeModeAbsolute
)
(
_
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
?
QGroundControl
.
AltitudeModeRelative
:
QGroundControl
.
AltitudeModeAbsolute
)
frontalDistanceLabel
:
qsTr
(
"
Trigger Dist
"
)
sideDistanceLabel
:
qsTr
(
"
Spacing
"
)
}
...
...
@@ -135,9 +136,9 @@ Rectangle {
QGCLabel
{
text
:
qsTr
(
"
Angle
"
)
}
FactTextField
{
fact
:
missionItem
.
gridAngle
fact
:
_
missionItem
.
gridAngle
Layout.fillWidth
:
true
onUpdated
:
angleSlider
.
value
=
missionItem
.
gridAngle
.
value
onUpdated
:
angleSlider
.
value
=
_
missionItem
.
gridAngle
.
value
}
QGCSlider
{
...
...
@@ -149,8 +150,8 @@ Rectangle {
Layout.fillWidth
:
true
Layout.columnSpan
:
2
Layout.preferredHeight
:
ScreenTools
.
defaultFontPixelHeight
*
1.5
onValueChanged
:
missionItem
.
gridAngle
.
value
=
value
Component.onCompleted
:
value
=
missionItem
.
gridAngle
.
value
onValueChanged
:
_
missionItem
.
gridAngle
.
value
=
value
Component.onCompleted
:
value
=
_
missionItem
.
gridAngle
.
value
updateValueWhileDragging
:
true
}
...
...
@@ -158,14 +159,14 @@ Rectangle {
text
:
qsTr
(
"
Turnaround dist
"
)
}
FactTextField
{
fact
:
missionItem
.
turnAroundDistance
fact
:
_
missionItem
.
turnAroundDistance
Layout.fillWidth
:
true
}
}
QGCButton
{
text
:
qsTr
(
"
Rotate Entry Point
"
)
onClicked
:
missionItem
.
rotateEntryPoint
();
onClicked
:
_
missionItem
.
rotateEntryPoint
();
}
ColumnLayout
{
...
...
@@ -180,40 +181,40 @@ Rectangle {
model
:
[
{
text
:
qsTr
(
"
Hover and capture image
"
),
fact
:
missionItem
.
hoverAndCapture
,
enabled
:
!
missionItem
.
followTerrain
,
visible
:
missionItem
.
hoverAndCaptureAllowed
fact
:
_
missionItem
.
hoverAndCapture
,
enabled
:
!
_
missionItem
.
followTerrain
,
visible
:
_
missionItem
.
hoverAndCaptureAllowed
},
{
text
:
qsTr
(
"
Refly at 90 deg offset
"
),
fact
:
missionItem
.
refly90Degrees
,
enabled
:
!
missionItem
.
followTerrain
,
fact
:
_
missionItem
.
refly90Degrees
,
enabled
:
!
_
missionItem
.
followTerrain
,
visible
:
true
},
{
text
:
qsTr
(
"
Images in turnarounds
"
),
fact
:
missionItem
.
cameraTriggerInTurnAround
,
enabled
:
missionItem
.
hoverAndCaptureAllowed
?
!
missionItem
.
hoverAndCapture
.
rawValue
:
true
,
fact
:
_
missionItem
.
cameraTriggerInTurnAround
,
enabled
:
_missionItem
.
hoverAndCaptureAllowed
?
!
_
missionItem
.
hoverAndCapture
.
rawValue
:
true
,
visible
:
true
},
{
text
:
qsTr
(
"
Fly alternate transects
"
),
fact
:
missionItem
.
flyAlternateTransects
,
fact
:
_
missionItem
.
flyAlternateTransects
,
enabled
:
true
,
visible
:
_vehicle
?
(
_vehicle
.
fixedWing
||
_vehicle
.
vtol
)
:
false
},
{
text
:
qsTr
(
"
Relative altitude
"
),
enabled
:
missionItem
.
cameraCalc
.
isManualCamera
&&
!
missionItem
.
followTerrain
,
visible
:
QGroundControl
.
corePlugin
.
options
.
showMissionAbsoluteAltitude
||
(
!
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
&&
!
missionItem
.
followTerrain
),
checked
:
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
enabled
:
_missionItem
.
cameraCalc
.
isManualCamera
&&
!
_
missionItem
.
followTerrain
,
visible
:
QGroundControl
.
corePlugin
.
options
.
showMissionAbsoluteAltitude
||
(
!
_missionItem
.
cameraCalc
.
distanceToSurfaceRelative
&&
!
_
missionItem
.
followTerrain
),
checked
:
_
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
}
]
onItemClicked
:
{
if
(
index
==
4
)
{
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
=
!
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
console
.
log
(
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
)
_missionItem
.
cameraCalc
.
distanceToSurfaceRelative
=
!
_
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
console
.
log
(
_
missionItem
.
cameraCalc
.
distanceToSurfaceRelative
)
}
}
}
...
...
@@ -241,7 +242,7 @@ Rectangle {
visible
:
tabBar
.
currentIndex
===
1
CameraCalcCamera
{
cameraCalc
:
missionItem
.
cameraCalc
cameraCalc
:
_
missionItem
.
cameraCalc
}
}
// Camera Column
...
...
@@ -251,6 +252,7 @@ Rectangle {
anchors.right
:
parent
.
right
spacing
:
_margin
visible
:
tabBar
.
currentIndex
===
2
missionItem
:
_missionItem
}
// Presets Tab
...
...
@@ -269,7 +271,7 @@ Rectangle {
QGCComboBox
{
id
:
presetCombo
Layout.fillWidth
:
true
model
:
missionItem
.
presetNames
model
:
_
missionItem
.
presetNames
}
RowLayout
{
...
...
@@ -278,14 +280,14 @@ Rectangle {
QGCButton
{
Layout.fillWidth
:
true
text
:
qsTr
(
"
Apply Preset
"
)
enabled
:
missionItem
.
presetNames
.
length
!=
0
onClicked
:
missionItem
.
loadPreset
(
presetCombo
.
textAt
(
presetCombo
.
currentIndex
))
enabled
:
_
missionItem
.
presetNames
.
length
!=
0
onClicked
:
_
missionItem
.
loadPreset
(
presetCombo
.
textAt
(
presetCombo
.
currentIndex
))
}
QGCButton
{
Layout.fillWidth
:
true
text
:
qsTr
(
"
Delete Preset
"
)
enabled
:
missionItem
.
presetNames
.
length
!=
0
enabled
:
_
missionItem
.
presetNames
.
length
!=
0
onClicked
:
mainWindow
.
showComponentDialog
(
deletePresetMessage
,
qsTr
(
"
Delete Preset
"
),
mainWindow
.
showDialogDefaultWidth
,
StandardButton
.
Yes
|
StandardButton
.
No
)
Component
{
...
...
@@ -294,7 +296,7 @@ Rectangle {
message
:
qsTr
(
"
Are you sure you want to delete '%1' preset?
"
).
arg
(
presetName
)
property
string
presetName
:
presetCombo
.
textAt
(
presetCombo
.
currentIndex
)
function
accept
()
{
missionItem
.
deletePreset
(
presetName
)
_
missionItem
.
deletePreset
(
presetName
)
hideDialog
()
}
}
...
...
@@ -326,9 +328,9 @@ Rectangle {
QGCLabel
{
text
:
qsTr
(
"
Angle
"
)
}
FactTextField
{
fact
:
missionItem
.
gridAngle
fact
:
_
missionItem
.
gridAngle
Layout.fillWidth
:
true
onUpdated
:
presetsAngleSlider
.
value
=
missionItem
.
gridAngle
.
value
onUpdated
:
presetsAngleSlider
.
value
=
_
missionItem
.
gridAngle
.
value
}
QGCSlider
{
...
...
@@ -340,8 +342,8 @@ Rectangle {
Layout.fillWidth
:
true
Layout.columnSpan
:
2
Layout.preferredHeight
:
ScreenTools
.
defaultFontPixelHeight
*
1.5
onValueChanged
:
missionItem
.
gridAngle
.
value
=
value
Component.onCompleted
:
value
=
missionItem
.
gridAngle
.
value
onValueChanged
:
_
missionItem
.
gridAngle
.
value
=
value
Component.onCompleted
:
value
=
_
missionItem
.
gridAngle
.
value
updateValueWhileDragging
:
true
}
...
...
@@ -349,7 +351,7 @@ Rectangle {
Layout.columnSpan
:
2
Layout.fillWidth
:
true
text
:
qsTr
(
"
Rotate Entry Point
"
)
onClicked
:
missionItem
.
rotateEntryPoint
();
onClicked
:
_
missionItem
.
rotateEntryPoint
();
}
}
...
...
@@ -372,7 +374,7 @@ Rectangle {
QGCViewDialog
{
function
accept
()
{
if
(
presetNameField
.
text
!=
""
)
{
missionItem
.
savePreset
(
presetNameField
.
text
)
_
missionItem
.
savePreset
(
presetNameField
.
text
)
hideDialog
()
}
}
...
...
@@ -407,9 +409,9 @@ Rectangle {
selectExisting
:
true
onAcceptedForLoad
:
{
missionItem
.
surveyAreaPolygon
.
loadKMLOrSHPFile
(
file
)
missionItem
.
resetState
=
false
//editorMap.mapFitFunctions.fitMapViewportTo
M
issionItems()
_
missionItem
.
surveyAreaPolygon
.
loadKMLOrSHPFile
(
file
)
_
missionItem
.
resetState
=
false
//editorMap.mapFitFunctions.fitMapViewportTo
_m
issionItems()
close
()
}
}
...
...
src/QmlControls/TerrainProfile.cc
View file @
992e6e57
...
...
@@ -57,12 +57,12 @@ void TerrainProfile::_newVisualItems(void)
emit
_updateSignal
();
}
void
TerrainProfile
::
_createGeometry
(
QSGGeometryNode
*&
geometryNode
,
QSGGeometry
*&
geometry
,
int
vertices
,
QSGGeometry
::
DrawingMode
drawingMode
,
const
QColor
&
color
)
void
TerrainProfile
::
_createGeometry
(
QSGGeometryNode
*&
geometryNode
,
QSGGeometry
*&
geometry
,
QSGGeometry
::
DrawingMode
drawingMode
,
const
QColor
&
color
)
{
QSGFlatColorMaterial
*
terrainMaterial
=
new
QSGFlatColorMaterial
;
terrainMaterial
->
setColor
(
color
);
geometry
=
new
QSGGeometry
(
QSGGeometry
::
defaultAttributes_Point2D
(),
vertices
);
geometry
=
new
QSGGeometry
(
QSGGeometry
::
defaultAttributes_Point2D
(),
0
);
geometry
->
setDrawingMode
(
drawingMode
);
geometry
->
setLineWidth
(
2
);
...
...
@@ -74,12 +74,16 @@ void TerrainProfile::_createGeometry(QSGGeometryNode*& geometryNode, QSGGeometry
geometryNode
->
setGeometry
(
geometry
);
}
void
TerrainProfile
::
_updateSegmentCounts
(
FlightPathSegment
*
segment
,
int
&
c
Terrain
Points
,
int
&
cMissingTerrainSegments
,
int
&
cTerrainCollisionSegments
,
double
&
maxTerrainHeight
)
void
TerrainProfile
::
_updateSegmentCounts
(
FlightPathSegment
*
segment
,
int
&
c
FlightProfileSegments
,
int
&
cTerrainProfile
Points
,
int
&
cMissingTerrainSegments
,
int
&
cTerrainCollisionSegments
,
double
&
maxTerrainHeight
)
{
if
(
segment
->
amslTerrainHeights
().
count
()
==
0
||
qIsNaN
(
segment
->
coord1AMSLAlt
())
||
qIsNaN
(
segment
->
coord2AMSLAlt
()))
{
if
(
_shouldAddFlightProfileSegment
(
segment
))
{
cFlightProfileSegments
++
;
}
if
(
_shouldAddMissingTerrainSegment
(
segment
))
{
cMissingTerrainSegments
+=
1
;
}
else
{
cTerrainPoints
+=
segment
->
amslTerrainHeights
().
count
();
cTerrainP
rofileP
oints
+=
segment
->
amslTerrainHeights
().
count
();
for
(
int
i
=
0
;
i
<
segment
->
amslTerrainHeights
().
count
();
i
++
)
{
maxTerrainHeight
=
qMax
(
maxTerrainHeight
,
segment
->
amslTerrainHeights
()[
i
].
value
<
double
>
());
}
...
...
@@ -89,7 +93,7 @@ void TerrainProfile::_updateSegmentCounts(FlightPathSegment* segment, int& cTerr
}
}
void
TerrainProfile
::
_addTerrainProfileSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
terrainVertices
,
int
&
terrainVertexIndex
)
void
TerrainProfile
::
_addTerrainProfileSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
terrainVertices
,
int
&
terrain
Profile
VertexIndex
)
{
double
terrainDistance
=
0
;
for
(
int
heightIndex
=
0
;
heightIndex
<
segment
->
amslTerrainHeights
().
count
();
heightIndex
++
)
{
...
...
@@ -110,17 +114,17 @@ void TerrainProfile::_addTerrainProfileSegment(FlightPathSegment* segment, doubl
float
x
=
(
currentDistance
+
terrainDistance
)
*
_pixelsPerMeter
;
float
y
=
_availableHeight
()
-
(
terrainHeightPercent
*
_availableHeight
());
_setVertex
(
terrainVertices
[
terrainVertexIndex
++
],
x
,
y
);
_setVertex
(
terrainVertices
[
terrain
Profile
VertexIndex
++
],
x
,
y
);
}
}
void
TerrainProfile
::
_addMissingTerrainSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
QSGGeometry
::
Point2D
*
missingTerrainVertices
,
int
&
missing
Terrain
VertexIndex
)
void
TerrainProfile
::
_addMissingTerrainSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
QSGGeometry
::
Point2D
*
missingTerrainVertices
,
int
&
missing
terrainProfile
VertexIndex
)
{
if
(
segment
->
amslTerrainHeights
().
count
()
==
0
)
{
if
(
_shouldAddMissingTerrainSegment
(
segment
)
)
{
float
x
=
currentDistance
*
_pixelsPerMeter
;
float
y
=
_availableHeight
();
_setVertex
(
missingTerrainVertices
[
missing
Terrain
VertexIndex
++
],
x
,
y
);
_setVertex
(
missingTerrainVertices
[
missing
Terrain
VertexIndex
++
],
x
+
(
segment
->
totalDistance
()
*
_pixelsPerMeter
),
y
);
_setVertex
(
missingTerrainVertices
[
missing
terrainProfile
VertexIndex
++
],
x
,
y
);
_setVertex
(
missingTerrainVertices
[
missing
terrainProfile
VertexIndex
++
],
x
+
(
segment
->
totalDistance
()
*
_pixelsPerMeter
),
y
);
}
}
...
...
@@ -146,15 +150,15 @@ void TerrainProfile::_addTerrainCollisionSegment(FlightPathSegment* segment, dou
void
TerrainProfile
::
_addFlightProfileSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
flightProfileVertices
,
int
&
flightProfileVertexIndex
)
{
if
(
!
_shouldAddFlightProfileSegment
(
segment
))
{
return
;
}
double
amslCoord1Height
=
segment
->
coord1AMSLAlt
();
double
amslCoord2Height
=
segment
->
coord2AMSLAlt
();
double
coord1HeightPercent
=
qMax
(((
amslCoord1Height
-
_missionController
->
minAMSLAltitude
())
/
amslAltRange
),
0.0
);
double
coord2HeightPercent
=
qMax
(((
amslCoord2Height
-
_missionController
->
minAMSLAltitude
())
/
amslAltRange
),
0.0
);
if
(
qIsNaN
(
amslCoord1Height
)
||
qIsNaN
(
amslCoord2Height
))
{
return
;
}
float
x
=
currentDistance
*
_pixelsPerMeter
;
float
y
=
_availableHeight
()
-
(
coord1HeightPercent
*
_availableHeight
());
...
...
@@ -173,16 +177,16 @@ QSGNode* TerrainProfile::updatePaintNode(QSGNode* oldNode, QQuickItem::UpdatePai
QSGGeometry
*
missingTerrainGeometry
=
nullptr
;
QSGGeometry
*
flightProfileGeometry
=
nullptr
;
QSGGeometry
*
terrainCollisionGeometry
=
nullptr
;
int
cTerrainP
oints
=
0
;
int
cTerrainP
rofilePoints
=
0
;
int
cMissingTerrainSegments
=
0
;
int
cFlightP
athSegments
=
0
;
int
cFlightP
rofileSegments
=
0
;
int
cTerrainCollisionSegments
=
0
;
double
maxTerrainHeight
=
0
;
// First we need to determine:
// - how many terrain vertices we need
// - how many terrain
profile
vertices we need
// - how many missing terrain segments there are
// - how many flight p
ath
segments we need
// - how many flight p
rofile
segments we need
// - how many terrain collision segments there are
// - what is the total distance so we can calculate pixels per meter
...
...
@@ -191,16 +195,14 @@ QSGNode* TerrainProfile::updatePaintNode(QSGNode* oldNode, QQuickItem::UpdatePai
ComplexMissionItem
*
complexItem
=
_visualItems
->
value
<
ComplexMissionItem
*>
(
viIndex
);
if
(
visualItem
->
simpleFlightPathSegment
())
{
cFlightPathSegments
++
;
FlightPathSegment
*
segment
=
visualItem
->
simpleFlightPathSegment
();
_updateSegmentCounts
(
segment
,
c
Terrain
Points
,
cMissingTerrainSegments
,
cTerrainCollisionSegments
,
maxTerrainHeight
);
_updateSegmentCounts
(
segment
,
c
FlightProfileSegments
,
cTerrainProfile
Points
,
cMissingTerrainSegments
,
cTerrainCollisionSegments
,
maxTerrainHeight
);
}
if
(
complexItem
)
{
for
(
int
segmentIndex
=
0
;
segmentIndex
<
complexItem
->
flightPathSegments
()
->
count
();
segmentIndex
++
)
{
cFlightPathSegments
++
;
FlightPathSegment
*
segment
=
complexItem
->
flightPathSegments
()
->
value
<
FlightPathSegment
*>
(
segmentIndex
);
_updateSegmentCounts
(
segment
,
c
Terrain
Points
,
cMissingTerrainSegments
,
cTerrainCollisionSegments
,
maxTerrainHeight
);
_updateSegmentCounts
(
segment
,
c
FlightProfileSegments
,
cTerrainProfile
Points
,
cMissingTerrainSegments
,
cTerrainCollisionSegments
,
maxTerrainHeight
);
}
}
}
...
...
@@ -209,12 +211,12 @@ QSGNode* TerrainProfile::updatePaintNode(QSGNode* oldNode, QQuickItem::UpdatePai
#if 0
static int counter = 0;
qDebug() << "updatePaintNode" << counter++ << cFlightP
athSegments << cTerrain
Points << cMissingTerrainSegments << cTerrainCollisionSegments;
qDebug() << "updatePaintNode" << counter++ << cFlightP
rofileSegments << cTerrainProfile
Points << cMissingTerrainSegments << cTerrainCollisionSegments;
#endif
_pixelsPerMeter
=
(
_visibleWidth
-
(
_horizontalMargin
*
2
))
/
_missionController
->
missionDistance
();
// Instantiate nodes
if
(
!
rootNode
)
{
rootNode
=
new
QSGNode
;
...
...
@@ -223,47 +225,50 @@ QSGNode* TerrainProfile::updatePaintNode(QSGNode* oldNode, QQuickItem::UpdatePai
QSGGeometryNode
*
flightProfileNode
=
nullptr
;
QSGGeometryNode
*
terrainCollisionNode
=
nullptr
;
_createGeometry
(
terrainProfileNode
,
terrainProfileGeometry
,
cTerrainPoints
,
QSGGeometry
::
DrawLineStrip
,
"green"
);
_createGeometry
(
missingTerrainNode
,
missingTerrainGeometry
,
cMissingTerrainSegments
*
2
,
QSGGeometry
::
DrawLines
,
"yellow"
);
_createGeometry
(
flightProfileNode
,
flightProfileGeometry
,
cFlightPathSegments
*
2
,
QSGGeometry
::
DrawLines
,
"orange"
);
_createGeometry
(
terrainCollisionNode
,
terrainCollisionGeometry
,
cTerrainCollisionSegments
*
2
,
QSGGeometry
::
DrawLines
,
"red"
);
_createGeometry
(
terrainProfileNode
,
terrainProfileGeometry
,
QSGGeometry
::
DrawLineStrip
,
"green"
);
_createGeometry
(
missingTerrainNode
,
missingTerrainGeometry
,
QSGGeometry
::
DrawLines
,
"yellow"
);
_createGeometry
(
flightProfileNode
,
flightProfileGeometry
,
QSGGeometry
::
DrawLines
,
"orange"
);
_createGeometry
(
terrainCollisionNode
,
terrainCollisionGeometry
,
QSGGeometry
::
DrawLines
,
"red"
);
rootNode
->
appendChildNode
(
terrainProfileNode
);
rootNode
->
appendChildNode
(
missingTerrainNode
);
rootNode
->
appendChildNode
(
flightProfileNode
);
rootNode
->
appendChildNode
(
terrainCollisionNode
);
}
else
{
QSGNode
*
node
=
rootNode
->
childAtIndex
(
0
);
terrainProfileGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
terrainProfileGeometry
->
allocate
(
cTerrainPoints
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
node
=
rootNode
->
childAtIndex
(
1
);
missingTerrainGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
missingTerrainGeometry
->
allocate
(
cMissingTerrainSegments
*
2
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
node
=
rootNode
->
childAtIndex
(
2
);
flightProfileGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
flightProfileGeometry
->
allocate
(
cFlightPathSegments
*
2
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
node
=
rootNode
->
childAtIndex
(
3
);
terrainCollisionGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
terrainCollisionGeometry
->
allocate
(
cTerrainCollisionSegments
*
2
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
}
int
flightProfileVertexIndex
=
0
;
int
terrainVertexIndex
=
0
;
int
missingTerrainVertexIndex
=
0
;
int
terrainCollisionVertexIndex
=
0
;
double
currentDistance
=
0
;
QSGGeometry
::
Point2D
*
flightProfileVertices
=
flightProfileGeometry
->
vertexDataAsPoint2D
();
QSGGeometry
::
Point2D
*
terrainVertices
=
terrainProfileGeometry
->
vertexDataAsPoint2D
();
QSGGeometry
::
Point2D
*
missingTerrainVertices
=
missingTerrainGeometry
->
vertexDataAsPoint2D
();
QSGGeometry
::
Point2D
*
terrainCollisionVertices
=
terrainCollisionGeometry
->
vertexDataAsPoint2D
();
// Allocate space for the vertices
QSGNode
*
node
=
rootNode
->
childAtIndex
(
0
);
terrainProfileGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
terrainProfileGeometry
->
allocate
(
cTerrainProfilePoints
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
node
=
rootNode
->
childAtIndex
(
1
);
missingTerrainGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
missingTerrainGeometry
->
allocate
(
cMissingTerrainSegments
*
2
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
node
=
rootNode
->
childAtIndex
(
2
);
flightProfileGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
flightProfileGeometry
->
allocate
(
cFlightProfileSegments
*
2
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
node
=
rootNode
->
childAtIndex
(
3
);
terrainCollisionGeometry
=
static_cast
<
QSGGeometryNode
*>
(
node
)
->
geometry
();
terrainCollisionGeometry
->
allocate
(
cTerrainCollisionSegments
*
2
);
node
->
markDirty
(
QSGNode
::
DirtyGeometry
);
int
flightProfileVertexIndex
=
0
;
int
terrainProfileVertexIndex
=
0
;
int
missingterrainProfileVertexIndex
=
0
;
int
terrainCollisionVertexIndex
=
0
;
double
currentDistance
=
0
;
QSGGeometry
::
Point2D
*
flightProfileVertices
=
flightProfileGeometry
->
vertexDataAsPoint2D
();
QSGGeometry
::
Point2D
*
terrainProfileVertices
=
terrainProfileGeometry
->
vertexDataAsPoint2D
();
QSGGeometry
::
Point2D
*
missingTerrainVertices
=
missingTerrainGeometry
->
vertexDataAsPoint2D
();
QSGGeometry
::
Point2D
*
terrainCollisionVertices
=
terrainCollisionGeometry
->
vertexDataAsPoint2D
();
// This step places the vertices for display into the nodes
for
(
int
viIndex
=
0
;
viIndex
<
_visualItems
->
count
();
viIndex
++
)
{
VisualMissionItem
*
visualItem
=
_visualItems
->
value
<
VisualMissionItem
*>
(
viIndex
);
ComplexMissionItem
*
complexItem
=
_visualItems
->
value
<
ComplexMissionItem
*>
(
viIndex
);
...
...
@@ -276,8 +281,8 @@ QSGNode* TerrainProfile::updatePaintNode(QSGNode* oldNode, QQuickItem::UpdatePai
FlightPathSegment
*
segment
=
complexItem
->
flightPathSegments
()
->
value
<
FlightPathSegment
*>
(
segmentIndex
);
_addFlightProfileSegment
(
segment
,
currentDistance
,
amslAltRange
,
flightProfileVertices
,
flightProfileVertexIndex
);
_addTerrainProfileSegment
(
segment
,
currentDistance
,
amslAltRange
,
terrain
Vertices
,
terrain
VertexIndex
);
_addMissingTerrainSegment
(
segment
,
currentDistance
,
missingTerrainVertices
,
missing
Terrain
VertexIndex
);
_addTerrainProfileSegment
(
segment
,
currentDistance
,
amslAltRange
,
terrain
ProfileVertices
,
terrainProfile
VertexIndex
);
_addMissingTerrainSegment
(
segment
,
currentDistance
,
missingTerrainVertices
,
missing
terrainProfile
VertexIndex
);
_addTerrainCollisionSegment
(
segment
,
currentDistance
,
amslAltRange
,
terrainCollisionVertices
,
terrainCollisionVertexIndex
);
currentDistance
+=
segment
->
totalDistance
();
...
...
@@ -289,8 +294,8 @@ QSGNode* TerrainProfile::updatePaintNode(QSGNode* oldNode, QQuickItem::UpdatePai
FlightPathSegment
*
segment
=
visualItem
->
simpleFlightPathSegment
();
_addFlightProfileSegment
(
segment
,
currentDistance
,
amslAltRange
,
flightProfileVertices
,
flightProfileVertexIndex
);
_addTerrainProfileSegment
(
segment
,
currentDistance
,
amslAltRange
,
terrain
Vertices
,
terrain
VertexIndex
);
_addMissingTerrainSegment
(
segment
,
currentDistance
,
missingTerrainVertices
,
missing
Terrain
VertexIndex
);
_addTerrainProfileSegment
(
segment
,
currentDistance
,
amslAltRange
,
terrain
ProfileVertices
,
terrainProfile
VertexIndex
);
_addMissingTerrainSegment
(
segment
,
currentDistance
,
missingTerrainVertices
,
missing
terrainProfile
VertexIndex
);
_addTerrainCollisionSegment
(
segment
,
currentDistance
,
amslAltRange
,
terrainCollisionVertices
,
terrainCollisionVertexIndex
);
currentDistance
+=
segment
->
totalDistance
();
...
...
@@ -326,3 +331,13 @@ void TerrainProfile::_setVertex(QSGGeometry::Point2D& vertex, double x, double y
{
vertex
.
set
(
x
+
_horizontalMargin
,
y
+
_verticalMargin
);
}
bool
TerrainProfile
::
_shouldAddFlightProfileSegment
(
FlightPathSegment
*
segment
)
{
return
!
qIsNaN
(
segment
->
coord1AMSLAlt
())
&&
!
qIsNaN
(
segment
->
coord2AMSLAlt
());
}
bool
TerrainProfile
::
_shouldAddMissingTerrainSegment
(
FlightPathSegment
*
segment
)
{
return
segment
->
amslTerrainHeights
().
count
()
==
0
;
}
src/QmlControls/TerrainProfile.h
View file @
992e6e57
...
...
@@ -57,14 +57,16 @@ private slots:
void
_newVisualItems
(
void
);
private:
void
_createGeometry
(
QSGGeometryNode
*&
geometryNode
,
QSGGeometry
*&
geometry
,
int
vertices
,
QSGGeometry
::
DrawingMode
drawingMode
,
const
QColor
&
color
);
void
_updateSegmentCounts
(
FlightPathSegment
*
segment
,
int
&
cTerrainPoints
,
int
&
cMissingTerrainSegments
,
int
&
cTerrainCollisionSegments
,
double
&
maxTerrainHeight
);
void
_addTerrainProfileSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
terrainVertices
,
int
&
terrainVertexIndex
);
void
_addMissingTerrainSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
QSGGeometry
::
Point2D
*
missingTerrainVertices
,
int
&
missingTerrainVertexIndex
);
void
_addTerrainCollisionSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
terrainCollisionVertices
,
int
&
terrainCollisionVertexIndex
);
void
_addFlightProfileSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
flightProfileVertices
,
int
&
flightProfileVertexIndex
);
double
_availableHeight
(
void
)
const
;
void
_setVertex
(
QSGGeometry
::
Point2D
&
vertex
,
double
x
,
double
y
);
void
_createGeometry
(
QSGGeometryNode
*&
geometryNode
,
QSGGeometry
*&
geometry
,
QSGGeometry
::
DrawingMode
drawingMode
,
const
QColor
&
color
);
void
_updateSegmentCounts
(
FlightPathSegment
*
segment
,
int
&
cFlightProfileSegments
,
int
&
cTerrainPoints
,
int
&
cMissingTerrainSegments
,
int
&
cTerrainCollisionSegments
,
double
&
maxTerrainHeight
);
void
_addTerrainProfileSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
terrainProfileVertices
,
int
&
terrainVertexIndex
);
void
_addMissingTerrainSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
QSGGeometry
::
Point2D
*
missingTerrainVertices
,
int
&
missingTerrainVertexIndex
);
void
_addTerrainCollisionSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
terrainCollisionVertices
,
int
&
terrainCollisionVertexIndex
);
void
_addFlightProfileSegment
(
FlightPathSegment
*
segment
,
double
currentDistance
,
double
amslAltRange
,
QSGGeometry
::
Point2D
*
flightProfileVertices
,
int
&
flightProfileVertexIndex
);
double
_availableHeight
(
void
)
const
;
void
_setVertex
(
QSGGeometry
::
Point2D
&
vertex
,
double
x
,
double
y
);
bool
_shouldAddFlightProfileSegment
(
FlightPathSegment
*
segment
);
bool
_shouldAddMissingTerrainSegment
(
FlightPathSegment
*
segment
);
MissionController
*
_missionController
=
nullptr
;
QmlObjectListModel
*
_visualItems
=
nullptr
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment