diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index a8c16eef8..7dc4191b8 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -387,8 +387,7 @@ namespace XSwiftBus void CTraffic::setPlanesPositions(const std::vector &callsigns, std::vector latitudesDeg, std::vector longitudesDeg, std::vector altitudesFt, std::vector pitchesDeg, std::vector rollsDeg, std::vector headingsDeg, const std::vector &onGrounds) { - (void)onGrounds; - + const bool setOnGround = onGrounds.size() == callsigns.size(); for (size_t i = 0; i < callsigns.size(); i++) { auto planeIt = m_planesByCallsign.find(callsigns.at(i)); @@ -402,6 +401,8 @@ namespace XSwiftBus plane->position.pitch = static_cast(pitchesDeg.at(i)); plane->position.roll = static_cast(rollsDeg.at(i)); plane->position.heading = static_cast(headingsDeg.at(i)); + + if (setOnGround) { plane->isOnGround = onGrounds.at(i); } } } @@ -959,21 +960,21 @@ namespace XSwiftBus // heading we wanted above. const double distanceMeterM = static_cast(std::max(10, traffic->getSettings().getFollowAircraftDistanceM())); static const double PI = std::acos(-1); - traffic->m_deltaCameraPosition.dx = -distanceMeterM * sin(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0); - traffic->m_deltaCameraPosition.dz = distanceMeterM * cos(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0); - traffic->m_deltaCameraPosition.dy = -distanceMeterM * tan(traffic->m_deltaCameraPosition.pitchDeg * PI / 180.0); + traffic->m_deltaCameraPosition.dxMeters = -distanceMeterM * sin(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0); + traffic->m_deltaCameraPosition.dzMeters = distanceMeterM * cos(traffic->m_deltaCameraPosition.headingDeg * PI / 180.0); + traffic->m_deltaCameraPosition.dyMeters = -distanceMeterM * tan(traffic->m_deltaCameraPosition.pitchDeg * PI / 180.0); traffic->m_deltaCameraPosition.isInitialized = true; } - double lx = 0, ly = 0, lz = 0; // normally init not needed, just to avoid any issues + double lxMeters = 0, lyMeters = 0, lzMeters = 0; // normally init not needed, just to avoid any issues static const double kFtToMeters = 0.3048; if (traffic->m_followPlaneViewCallsign == CTraffic::ownAircraftString()) { - lx = traffic->m_ownAircraftPositionX.get(); - ly = traffic->m_ownAircraftPositionY.get(); - lz = traffic->m_ownAircraftPositionZ.get(); + lxMeters = traffic->m_ownAircraftPositionX.get(); + lyMeters = traffic->m_ownAircraftPositionY.get(); + lzMeters = traffic->m_ownAircraftPositionZ.get(); } else { @@ -1013,15 +1014,20 @@ namespace XSwiftBus WARNING_LOG("Pos: " + pos2String(plane->position)); return 0; } - XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lx, &ly, &lz); + + // avoid underflow of camera into ground + if (plane->isOnGround) + { + if (traffic->m_deltaCameraPosition.dyMeters < 5) { traffic->m_deltaCameraPosition.dyMeters = 5; } + } + + XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lxMeters, &lyMeters, &lzMeters); } // Fill out the camera position info. - cameraPosition->x = static_cast(lx + traffic->m_deltaCameraPosition.dx); - cameraPosition->y = static_cast(ly + traffic->m_deltaCameraPosition.dy); - cameraPosition->z = static_cast(lz + traffic->m_deltaCameraPosition.dz); - // cameraPosition->pitch = static_cast(traffic->m_deltaCameraPosition.pitch); - // cameraPosition->heading = static_cast(traffic->m_deltaCameraPosition.heading); + cameraPosition->x = static_cast(lxMeters + traffic->m_deltaCameraPosition.dxMeters); + cameraPosition->y = static_cast(lyMeters + traffic->m_deltaCameraPosition.dyMeters); + cameraPosition->z = static_cast(lzMeters + traffic->m_deltaCameraPosition.dzMeters); cameraPosition->pitch = CTraffic::normalizeToPlusMinus180Deg(static_cast(traffic->m_deltaCameraPosition.pitchDeg)); cameraPosition->heading = CTraffic::normalizeToPlusMinus180Deg(static_cast(traffic->m_deltaCameraPosition.headingDeg)); cameraPosition->roll = 0.0; diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index 83661688d..db7901ee9 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -139,9 +139,9 @@ namespace XSwiftBus //! Camera struct DeltaCameraPosition { - double dx = 0.0; - double dy = 0.0; - double dz = 0.0; + double dxMeters = 0.0; + double dyMeters = 0.0; + double dzMeters = 0.0; double headingDeg = 0.0; double pitchDeg = 0.0; bool isInitialized = false; @@ -177,7 +177,8 @@ namespace XSwiftBus std::string modelName; std::string nightTextureMode; bool hasSurfaces = false; - bool hasXpdr = false; + bool hasXpdr = false; + bool isOnGround = false; char label[32] {}; CTerrainProbe terrainProbe; XPMPPlaneSurfaces_t surfaces;