From 09de945242898267d4c306fbce76d6027fa1ef29 Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Thu, 22 Feb 2018 23:05:13 +0100 Subject: [PATCH] Add experimental X-Plane CG offset fetching ref T231 --- src/plugins/simulator/xplane/simulatorxplane.cpp | 5 ++++- src/xswiftbus/traffic.cpp | 12 ++++++++---- src/xswiftbus/traffic.h | 3 ++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 815dc4d7a..e98941c45 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -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); diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index 503b41722..a84b7f65f 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -18,6 +18,7 @@ #include "blackmisc/simulation/interpolationhints.h" #include "blackmisc/aviation/callsign.h" #include "XPMPMultiplayer.h" +#include "XPMPPlaneRenderer.h" #include #include #include @@ -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(&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); } } diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index e2f1d4b68..72b2f6859 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -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 m_planesByCallsign; QHash m_planesById;