diff --git a/src/xswiftbus/terrainprobe.cpp b/src/xswiftbus/terrainprobe.cpp index fc0fa227b..baee8a3db 100644 --- a/src/xswiftbus/terrainprobe.cpp +++ b/src/xswiftbus/terrainprobe.cpp @@ -7,6 +7,7 @@ */ #include "terrainprobe.h" +#include "utils.h" #include #include @@ -16,7 +17,7 @@ namespace XSwiftBus CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); } - double CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude) const + double CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const { double x, y, z; XPLMWorldToLocal(degreesLatitude, degreesLongitude, metersAltitude, &x, &y, &z); @@ -26,8 +27,18 @@ namespace XSwiftBus auto result = XPLMProbeTerrainXYZ(m_ref, static_cast(x), static_cast(y), static_cast(z), &probe); if (result != xplm_ProbeHitTerrain) { + std::string error; + if (result == xplm_ProbeError) { error = "probe error"; } + else if (result == xplm_ProbeMissed) { error = "probe missed"; } + else { error = "unknown probe result"; } + WARNING_LOG(callsign + " " + error + " at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude)); + return std::numeric_limits::quiet_NaN(); } + if (probe.is_wet) + { + DEBUG_LOG(callsign + " probe hit water at " + std::to_string(degreesLatitude) + ", " + std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude)); + } XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, °reesLatitude, °reesLongitude, &metersAltitude); return metersAltitude; diff --git a/src/xswiftbus/terrainprobe.h b/src/xswiftbus/terrainprobe.h index 4ade3641c..55c301077 100644 --- a/src/xswiftbus/terrainprobe.h +++ b/src/xswiftbus/terrainprobe.h @@ -10,6 +10,7 @@ #define BLACKSIM_XSWIFTBUS_ELEVATIONPROVIDER_H #include +#include namespace XSwiftBus { @@ -34,7 +35,7 @@ namespace XSwiftBus //! Get the elevation in meters at the given point in OpenGL space. //! \note Due to the Earth's curvature, the OpenGL vertical axis may not be exactly perpendicular to the surface of the geoid. //! \return NaN if no ground was detected. - double getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude) const; + double getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude, const std::string &callsign) const; private: XPLMProbeRef m_ref = nullptr; diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index 7a80891e4..e6c0856fa 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -509,7 +509,7 @@ namespace XSwiftBus const double latDeg = plane->position.lat; const double lonDeg = plane->position.lon; - double groundElevation = plane->terrainProbe.getElevation(latDeg, lonDeg, plane->position.elevation); + double groundElevation = plane->terrainProbe.getElevation(latDeg, lonDeg, plane->position.elevation, requestedCallsign); if (std::isnan(groundElevation)) { groundElevation = 0.0; } double fudgeFactor = 3.0; bool hasOffset = XPMPGetVerticalOffset(plane->id, &fudgeFactor); @@ -528,11 +528,11 @@ namespace XSwiftBus if (planeIt != m_planesByCallsign.end()) { const Plane *plane = planeIt->second; - return plane->terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters); + return plane->terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters, callsign); } else { - return m_terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters); + return m_terrainProbe.getElevation(latitudeDeg, longitudeDeg, altitudeMeters, callsign + " (plane not found)"); } }