diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index 03a4cf573..889f3bca3 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -872,7 +872,7 @@ namespace XSwiftBus { // Ideally we would like to test against right mouse button, but X-Plane SDK does not // allow that. - if (traffic->m_isSpacePressed) + if (!traffic->m_deltaCameraPosition.isInitialized || traffic->m_isSpacePressed) { int w, h, x, y; // First get the screen size and mouse location. We will use this to decide @@ -880,50 +880,45 @@ namespace XSwiftBus // fixme: In a future update, change the orbit only while right mouse button is pressed. XPLMGetScreenSize(&w, &h); XPLMGetMouseLocation(&x, &y); - double heading = 360.0 * static_cast(x) / static_cast(w); - double pitch = 20.0 * ((static_cast(y) / static_cast(h)) * 2.0 - 1.0); + traffic->m_deltaCameraPosition.heading = 360.0 * static_cast(x) / static_cast(w); + traffic->m_deltaCameraPosition.pitch = 20.0 * ((static_cast(y) / static_cast(h)) * 2.0 - 1.0); // Now calculate where the camera should be positioned to be 200 // meters from the plane and pointing at the plane at the pitch and // heading we wanted above. static const double PI = std::acos(-1); - double dx = -50.0 * sin(heading * PI / 180.0); - double dz = 50.0 * cos(heading * PI / 180.0); - double dy = -50.0 * tan(pitch * PI / 180.0); + traffic->m_deltaCameraPosition.dx = -50.0 * sin(traffic->m_deltaCameraPosition.heading * PI / 180.0); + traffic->m_deltaCameraPosition.dz = 50.0 * cos(traffic->m_deltaCameraPosition.heading * PI / 180.0); + traffic->m_deltaCameraPosition.dy = -50.0 * tan(traffic->m_deltaCameraPosition.pitch * PI / 180.0); - double lx, ly, lz; - static const double kFtToMeters = 0.3048; + traffic->m_deltaCameraPosition.isInitialized = true; + } - if (traffic->m_followPlaneViewCallsign == traffic->ownAircraftString()) - { - lx = traffic->m_ownAircraftPositionX.get(); - ly = traffic->m_ownAircraftPositionY.get(); - lz = traffic->m_ownAircraftPositionZ.get(); - } - else - { - auto planeIt = traffic->m_planesByCallsign.find(traffic->m_followPlaneViewCallsign); - if (planeIt == traffic->m_planesByCallsign.end()) { return 0; } - Plane *plane = planeIt->second; + double lx, ly, lz; + static const double kFtToMeters = 0.3048; - XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lx, &ly, &lz); - } + if (traffic->m_followPlaneViewCallsign == traffic->ownAircraftString()) + { + lx = traffic->m_ownAircraftPositionX.get(); + ly = traffic->m_ownAircraftPositionY.get(); + lz = traffic->m_ownAircraftPositionZ.get(); + } + else + { + auto planeIt = traffic->m_planesByCallsign.find(traffic->m_followPlaneViewCallsign); + if (planeIt == traffic->m_planesByCallsign.end()) { return 0; } + Plane *plane = planeIt->second; - // Fill out the camera position info. - traffic->m_lastCameraPosition.x = static_cast(lx + dx); - traffic->m_lastCameraPosition.y = static_cast(ly + dy); - traffic->m_lastCameraPosition.z = static_cast(lz + dz); - traffic->m_lastCameraPosition.pitch = static_cast(pitch); - traffic->m_lastCameraPosition.heading = static_cast(heading); + XPLMWorldToLocal(plane->position.lat, plane->position.lon, plane->position.elevation * kFtToMeters, &lx, &ly, &lz); } // Fill out the camera position info. - cameraPosition->x = traffic->m_lastCameraPosition.x; - cameraPosition->y = traffic->m_lastCameraPosition.y; - cameraPosition->z = traffic->m_lastCameraPosition.z; - cameraPosition->pitch = traffic->m_lastCameraPosition.pitch; - cameraPosition->heading = traffic->m_lastCameraPosition.heading; - cameraPosition->roll = 0; + 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->roll = 0.0; } // Return 1 to indicate we want to keep controlling the camera. diff --git a/src/xswiftbus/traffic.h b/src/xswiftbus/traffic.h index c85a179e3..d8c94057a 100644 --- a/src/xswiftbus/traffic.h +++ b/src/xswiftbus/traffic.h @@ -134,6 +134,16 @@ namespace XSwiftBus DBusHandlerResult dbusMessageHandler(const CDBusMessage &message) override; private: + struct DeltaCameraPosition + { + double dx = 0.0; + double dy = 0.0; + double dz = 0.0; + double heading = 0.0; + double pitch = 0.0; + bool isInitialized = false; + }; + bool m_initialized = false; bool m_enabledMultiplayer = false; CTerrainProbe m_terrainProbe; @@ -190,9 +200,9 @@ namespace XSwiftBus DataRef m_ownAircraftPositionY; DataRef m_ownAircraftPositionZ; - XPLMCameraPosition_t m_lastCameraPosition; - bool m_isSpacePressed = false; + DeltaCameraPosition m_deltaCameraPosition; + bool m_emitSimFrame = true; int getPlaneData(void *id, int dataType, void *io_data);