diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index b9bb4d05b..701d007f3 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -897,6 +897,7 @@ namespace XSwiftBus void CTraffic::Labels::draw() { + static const double maxRangeM = 10000; static const double metersPerFt = 0.3048; static float color[3]{ 1.0f, 0.75f, 0.0f }; std::array worldMat = m_worldMat.getAll(); @@ -915,6 +916,7 @@ namespace XSwiftBus double localPos[4]{}; double windowPos[4]{}; XPLMWorldToLocal(planePos.lat, planePos.lon, planePos.elevation * metersPerFt, &worldPos[0], &worldPos[1], &worldPos[2]); + if (distanceSquared(worldPos) > maxRangeM * maxRangeM) { continue; } matrixMultVec(localPos, worldMat.data(), worldPos); matrixMultVec(windowPos, projMat.data(), localPos); @@ -942,6 +944,14 @@ namespace XSwiftBus out[3] = v[0] * m[3] + v[1] * m[7] + v[2] * m[11] + v[3] * m[15]; } + double CTraffic::Labels::distanceSquared(const double pos[3]) const + { + const double dx = m_viewX.get() - pos[0]; + const double dy = m_viewY.get() - pos[1]; + const double dz = m_viewZ.get() - pos[2]; + return dx * dx + dy * dy + dz * dz; + } + int CTraffic::orbitPlaneFunc(XPLMCameraPosition_t *cameraPosition, int isLosingControl, void *refcon) { constexpr bool DEBUG = false; diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index 8737bd8a3..6bda2f09b 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -198,12 +198,16 @@ namespace XSwiftBus virtual void draw() override; private: static void matrixMultVec(double out[4], const float m[16], const double v[4]); + double distanceSquared(const double pos[3]) const; CTraffic *m_traffic = nullptr; ArrayDataRef m_worldMat; ArrayDataRef m_projMat; DataRef m_windowWidth; DataRef m_windowHeight; DataRef m_visibilityM; + DataRef m_viewX; + DataRef m_viewY; + DataRef m_viewZ; }; Labels m_labels { this };