swift
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 
13 namespace 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) { error = "probe error"; }
45  else if (result == xplm_ProbeMissed) { error = "probe missed"; }
46  else { error = "unknown probe result"; }
47  WARNING_LOG(callsign + " " + error + " at " + std::to_string(degreesLatitude) + ", " +
48  std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
49  }
50 
51  o_isWater = false;
52  return { { std::numeric_limits<double>::quiet_NaN(), degreesLatitude, degreesLongitude } };
53  }
54  XPLMLocalToWorld(probe.locationX, probe.locationY, probe.locationZ, &degreesLatitude, &degreesLongitude,
55  &metersAltitude);
56 
57  if (probe.is_wet && m_logMessageCount < 100)
58  {
59  m_logMessageCount++;
60  DEBUG_LOG(callsign + " probe hit water at " + std::to_string(degreesLatitude) + ", " +
61  std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
62  }
63  if (std::isnan(metersAltitude) && m_logMessageCount < 100)
64  {
65  m_logMessageCount++;
66  DEBUG_LOG(callsign + " probe returned NaN at " + std::to_string(degreesLatitude) + ", " +
67  std::to_string(degreesLongitude) + ", " + std::to_string(metersAltitude));
68  }
69  o_isWater = probe.is_wet;
70  return { { metersAltitude, degreesLatitude, degreesLongitude } };
71  }
72 } // 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.
~CTerrainProbe()
Destructor;.
CTerrainProbe()
Constructor.
Plugin loaded by X-Plane which publishes a DBus service.
Definition: command.h:14
#define DEBUG_LOG(msg)
Logger convenience macros.
Definition: utils.h:47
#define WARNING_LOG(msg)
Logger convenience macros.
Definition: utils.h:51