Add experimental X-Plane CG offset fetching

ref T231
This commit is contained in:
Roland Winklmeier
2018-02-22 23:05:13 +01:00
committed by Klaus Basan
parent 72497fdefc
commit 09de945242
3 changed files with 14 additions and 6 deletions

View File

@@ -1024,7 +1024,10 @@ namespace BlackSimPlugin
CInterpolationHints &hints = m_hints[callsign];
hints.setElevationPlane(elevation); // update elevation
hints.setCGAboveGround({ modelVerticalOffset, CLengthUnit::ft() }); // normally never changing, but if user changes ModelMatching update possible
// The entire vertical offset (CG offset) is still very experimental in X-Plane. Libxplanemp simply calculates the lowest Y
// value from all the OpenGL model vertices. I assume its in meters.
// The unit of modelVerticalOffset is still very unknown. This needs to be confirmed.
hints.setCGAboveGround({ modelVerticalOffset, CLengthUnit::m() });
// set it in the remote aircraft provider
this->updateAircraftGroundElevation(callsign, elevation);

View File

@@ -18,6 +18,7 @@
#include "blackmisc/simulation/interpolationhints.h"
#include "blackmisc/aviation/callsign.h"
#include "XPMPMultiplayer.h"
#include "XPMPPlaneRenderer.h"
#include <XPLM/XPLMProcessing.h>
#include <XPLM/XPLMUtilities.h>
#include <QDateTime>
@@ -31,8 +32,10 @@
namespace XSwiftBus
{
CTraffic::Plane::Plane(void *id_, QString callsign_, QString aircraftIcao_, QString airlineIcao_, QString livery_)
: id(id_), callsign(callsign_), aircraftIcao(aircraftIcao_), airlineIcao(airlineIcao_), livery(livery_), interpolator(callsign)
CTraffic::Plane::Plane(void *id_, QString callsign_, QString aircraftIcao_, QString airlineIcao_, QString livery_, QString modelName_)
: id(id_), callsign(callsign_), aircraftIcao(aircraftIcao_), airlineIcao(airlineIcao_), livery(livery_), modelName(modelName_),
interpolator(callsign)
{
std::memset(static_cast<void *>(&surfaces), 0, sizeof(surfaces));
surfaces.lights.bcnLights = surfaces.lights.landLights = surfaces.lights.navLights = surfaces.lights.strbLights = 1;
@@ -225,7 +228,7 @@ namespace XSwiftBus
if (id)
{
auto plane = new Plane(id, callsign, aircraftIcao, airlineIcao, livery);
auto plane = new Plane(id, callsign, aircraftIcao, airlineIcao, livery, modelName);
m_planesByCallsign[callsign] = plane;
m_planesById[id] = plane;
}
@@ -391,7 +394,8 @@ namespace XSwiftBus
double elevation = plane->position.elevation;
double groundElevation = plane->terrainProbe.getElevation(lat, lon, elevation);
if (std::isnan(groundElevation)) { groundElevation = 0.0; }
constexpr double fudgeFactor = 3.0; //! \fixme Value should be different for each plane, derived from the CSL model geometry
double fudgeFactor = 3.0;
actualVertOffsetInfo(qPrintable(plane->modelName), nullptr, &fudgeFactor);
emit remoteAircraftData(plane->callsign, lat, lon, groundElevation, fudgeFactor);
}
}

View File

@@ -148,6 +148,7 @@ namespace XSwiftBus
QString aircraftIcao;
QString airlineIcao;
QString livery;
QString modelName;
bool hasSurfaces = false;
bool hasXpdr = false;
char label[32] {};
@@ -160,7 +161,7 @@ namespace XSwiftBus
qint64 prevSurfacesLerpTime = 0;
XPMPPlaneRadar_t xpdr;
XPMPPlanePosition_t position;
Plane(void *id_, QString callsign_, QString aircraftIcao_, QString airlineIcao_, QString livery_);
Plane(void *id_, QString callsign_, QString aircraftIcao_, QString airlineIcao_, QString livery_, QString modelName_);
};
QHash<QString, Plane *> m_planesByCallsign;
QHash<void *, Plane *> m_planesById;