swift
Loading...
Searching...
No Matches
terrainprobe.cpp
1// SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors
2// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3
4#include "terrainprobe.h"
5
6#include <XPLM/XPLMGraphics.h>
7
8#include <cmath>
9#include <limits>
10
11#include "utils.h"
12
13namespace XSwiftBus
14{
15 CTerrainProbe::CTerrainProbe() : m_ref(XPLMCreateProbe(xplm_ProbeY)) {}
16
17 CTerrainProbe::~CTerrainProbe() { XPLMDestroyProbe(m_ref); }
18
19 std::array<double, 3> CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude,
20 double metersAltitude) const
21 {
22 static const std::string callsign = "myself";
23 bool unused = false;
24 return getElevation(degreesLatitude, degreesLongitude, metersAltitude, callsign, unused);
25 }
26
27 std::array<double, 3> CTerrainProbe::getElevation(double degreesLatitude, double degreesLongitude,
28 double metersAltitude, const std::string &callsign,
29 bool &o_isWater) const
30 {
31 double x, y, z;
32 XPLMWorldToLocal(degreesLatitude, degreesLongitude, metersAltitude, &x, &y, &z);
33
34 XPLMProbeInfo_t probe;
35 probe.structSize = sizeof(probe);
36 auto result =
37 XPLMProbeTerrainXYZ(m_ref, static_cast<float>(x), static_cast<float>(y), static_cast<float>(z), &probe);
38 if (result != xplm_ProbeHitTerrain)
39 {
40 if (m_logMessageCount < 100)
41 {
42 m_logMessageCount++;
43 std::string error;
44 if (result == xplm_ProbeError)
45 {
46 error = "probe error";
47 }
48 else if (result == xplm_ProbeMissed)
49 {
50 error = "probe missed";
51 }
52 else
53 {
54 error = "unknown probe result";
55 }
56 WARNING_LOG(callsign + " " + error + " at " + std::to_string(degreesLatitude) + ", " +
57 std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
58 }
59
60 o_isWater = false;
61 return { { std::numeric_limits<double>::quiet_NaN(), degreesLatitude, degreesLongitude } };
62 }
63 XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, &degreesLatitude, &degreesLongitude,
64 &metersAltitude);
65
66 if (probe.is_wet && m_logMessageCount < 100)
67 {
68 m_logMessageCount++;
69 DEBUG_LOG(callsign + " probe hit water at " + std::to_string(degreesLatitude) + ", " +
70 std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
71 }
72 if (std::isnan(metersAltitude) && m_logMessageCount < 100)
73 {
74 m_logMessageCount++;
75 DEBUG_LOG(callsign + " probe returned NaN at " + std::to_string(degreesLatitude) + ", " +
76 std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
77 }
78 o_isWater = probe.is_wet;
79 return { { metersAltitude, degreesLatitude, degreesLongitude } };
80 }
81} // namespace XSwiftBus
std::array< double, 3 > getElevation(double degreesLatitude, double degreesLongitude, double metersAltitude) const
Get the elevation in meters at the given point in OpenGL space.
Plugin loaded by X-Plane which publishes a DBus service.
Definition command.h:14
#define DEBUG_LOG(msg)
Logger convenience macros.
Definition utils.h:46
#define WARNING_LOG(msg)
Logger convenience macros.
Definition utils.h:50