Add own aircraft to X-Plane plane view menu

ref T269
This commit is contained in:
Roland Winklmeier
2018-05-16 17:13:12 +02:00
committed by Klaus Basan
parent 654cc1621e
commit 0b607f9e0b
4 changed files with 78 additions and 5 deletions

View File

@@ -13,6 +13,7 @@
#include "weather.h"
#include "utils.h"
#include "XPLM/XPLMProcessing.h"
#include <cmath>
#include <functional>
#include <thread>
@@ -33,6 +34,7 @@ namespace XSwiftBus
// m_startServerMenuItems.push_back(m_menu.item("Start server on system bus", [this]{ startServer(BlackMisc::CDBusServer::systemBusAddress()); }));
// m_startServerMenuItems.push_back(m_menu.item("Start server on localhost P2P", [this]{ startServer(BlackMisc::CDBusServer::p2pAddress("localhost")); }));
m_planeViewSubMenu = m_menu.subMenu("Plane View");
planeViewOwnAircraftMenuItem = m_planeViewSubMenu.item("Own Aircraft", [this] { switchToOwnAircraftView(); });
m_dbusThread = std::thread([this]()
{
@@ -77,6 +79,18 @@ namespace XSwiftBus
INFO_LOG("XSwiftBus started.");
}
void CPlugin::switchToOwnAircraftView()
{
/* This is the hotkey callback. First we simulate a joystick press and
* release to put us in 'free view 1'. This guarantees that no panels
* are showing and we are an external view. */
XPLMCommandButtonPress(xplm_joy_v_fr1);
XPLMCommandButtonRelease(xplm_joy_v_fr1);
/* Now we control the camera until the view changes. */
XPLMControlCamera(xplm_ControlCameraUntilViewChanges, orbitOwnAircraftFunc, this);
}
void CPlugin::onAircraftModelChanged()
{
if (m_service)
@@ -101,4 +115,48 @@ namespace XSwiftBus
if (plugin->m_traffic) { plugin->m_traffic->processDBus(); }
return -1;
}
int CPlugin::orbitOwnAircraftFunc(XPLMCameraPosition_t *cameraPosition, int isLosingControl, void *refcon)
{
auto *plugin = static_cast<CPlugin *>(refcon);
if (isLosingControl == 1) { return 0; }
if (cameraPosition)
{
int w, h, x, y;
// First get the screen size and mouse location. We will use this to decide
// what part of the orbit we are in. The mouse will move us up-down and around.
// 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<double>(x) / static_cast<double>(w);
double pitch = 20.0 * ((static_cast<double>(y) / static_cast<double>(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);
double lx, ly, lz;
lx = plugin->m_ownAircraftPositionX.get();
ly = plugin->m_ownAircraftPositionY.get();
lz = plugin->m_ownAircraftPositionZ.get();
// Fill out the camera position info.
cameraPosition->x = static_cast<float>(lx + dx);
cameraPosition->y = static_cast<float>(ly + dy);
cameraPosition->z = static_cast<float>(lz + dz);
cameraPosition->pitch = static_cast<float>(pitch);
cameraPosition->heading = static_cast<float>(heading);
cameraPosition->roll = 0;
}
// Return 1 to indicate we want to keep controlling the camera.
return 1;
}
}