From 00d1315aac334cdb1cd6533364eff12cd0467eb1 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Thu, 25 Jan 2018 05:21:57 +0100 Subject: [PATCH] Ref T236, getGroundElevation can be used with and without provider --- src/blackmisc/simulation/interpolationhints.cpp | 10 ++++++---- src/blackmisc/simulation/interpolationhints.h | 5 ++++- src/blackmisc/simulation/interpolator.cpp | 11 ++++++++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/blackmisc/simulation/interpolationhints.cpp b/src/blackmisc/simulation/interpolationhints.cpp index 914da9d8a..1b9729f51 100644 --- a/src/blackmisc/simulation/interpolationhints.cpp +++ b/src/blackmisc/simulation/interpolationhints.cpp @@ -27,11 +27,13 @@ namespace BlackMisc m_isVtol(isVtolAircraft), m_hasParts(hasParts), m_logInterpolation(log) { } - CAltitude CInterpolationHints::getGroundElevation(const CAircraftSituation &situation) const + CAltitude CInterpolationHints::getGroundElevation(const CAircraftSituation &situation, bool useProvider, bool forceProvider) const { - if (m_elevationProvider) { return m_elevationProvider(situation); } - if (m_elevationPlane.isNull() || !m_elevationPlane.isWithinRange(situation)) { return CAltitude::null(); } - return m_elevationPlane.geodeticHeight(); + const bool validPlane = m_elevationPlane.isWithinRange(situation); + Q_ASSERT_X(!(forceProvider && !useProvider), Q_FUNC_INFO, "Invalid parameter combination"); + if (forceProvider && useProvider && m_elevationProvider) { return m_elevationProvider(situation); } + if (!validPlane && useProvider && m_elevationProvider) { return m_elevationProvider(situation); } + return validPlane ? this->m_elevationPlane.getAltitude() : CAltitude::null(); } void CInterpolationHints::resetElevationPlane() diff --git a/src/blackmisc/simulation/interpolationhints.h b/src/blackmisc/simulation/interpolationhints.h index b4534edb1..85831ef6e 100644 --- a/src/blackmisc/simulation/interpolationhints.h +++ b/src/blackmisc/simulation/interpolationhints.h @@ -56,9 +56,12 @@ namespace BlackMisc //! Get elevation from CInterpolationHints::getElevationProvider or CInterpolationHints::getElevation //! \remark avoid unnecessary calls on XPlane (calling elevation provider) + //! @param situation + //! @param useProvider using the provider if available + //! @param forceProvider use the provider and ignore any plane //! \see setElevationProvider //! \see setElevationPlane - Aviation::CAltitude getGroundElevation(const Aviation::CAircraftSituation &situation) const; + Aviation::CAltitude getGroundElevation(const Aviation::CAircraftSituation &situation, bool useProvider, bool forceProvider = false) const; //! Check if elevation is within radius and can be used bool isWithinRange(const Geo::ICoordinateGeodetic &coordinate) const; diff --git a/src/blackmisc/simulation/interpolator.cpp b/src/blackmisc/simulation/interpolator.cpp index 149fb95e6..b097a4c37 100644 --- a/src/blackmisc/simulation/interpolator.cpp +++ b/src/blackmisc/simulation/interpolator.cpp @@ -69,7 +69,7 @@ namespace BlackMisc // * for FSX/P3D provided as hints.getElevation which is set to current position of remote aircraft in simulator // * As XP uses lazy init we will call getGroundElevation only when needed // * default here via getElevationPlane - CAltitude currentGroundElevation(hints.getElevationPlane().getAltitudeIfWithinRadius(currentSituation)); + CAltitude currentGroundElevation(hints.getGroundElevation(currentSituation, false, false)); currentSituation.setGroundElevationChecked(currentGroundElevation); // set as default // data, split situations by time @@ -109,7 +109,12 @@ namespace BlackMisc log.groundFactor = groundFactor; if (groundFactor > 0.0) { - currentGroundElevation = hints.getGroundElevation(currentSituation); // "expensive on XPlane" + // if not having an ground elevation yet, we fetch from provider + if (!currentGroundElevation.isNull()) + { + currentGroundElevation = hints.getGroundElevation(currentSituation, true); // "expensive on XPlane" if provider is called + } + if (!currentGroundElevation.isNull()) { Q_ASSERT_X(currentGroundElevation.getReferenceDatum() == CAltitude::MeanSeaLevel, Q_FUNC_INFO, "Need MSL value"); @@ -322,7 +327,7 @@ namespace BlackMisc void CInterpolator::setGroundElevationFromHint(const CInterpolationHints &hints, CAircraftSituation &situation, bool override) { if (!override && situation.hasGroundElevation()) { return; } - const CAltitude elevation = hints.getGroundElevation(situation); + const CAltitude elevation = hints.getGroundElevation(situation, false); if (elevation.isNull()) { return; } situation.setGroundElevation(elevation); }