refs #863 Each aircraft gets its own interpolator instance,

so each one can cache calculations from one frame to the next.
The recent situations and parts are members of the interpolator.
This commit is contained in:
Mathew Sutcliffe
2017-02-05 15:54:39 +00:00
parent 2181702c5c
commit a167cc8e43
17 changed files with 108 additions and 87 deletions

View File

@@ -119,9 +119,10 @@ namespace BlackSimPlugin
}
CFs9Client::CFs9Client(const CCallsign &callsign, const QString &modelName,
BlackMisc::Simulation::IInterpolator *interpolator, const CTime &updateInterval, QObject *owner) :
const CTime &updateInterval, QObject *owner) :
CDirectPlayPeer(owner, callsign),
m_updateInterval(updateInterval), m_interpolator(interpolator), m_modelName(modelName)
m_updateInterval(updateInterval),
m_modelName(modelName)
{
}
@@ -177,14 +178,13 @@ namespace BlackSimPlugin
void CFs9Client::timerEvent(QTimerEvent *event)
{
Q_UNUSED(event);
Q_ASSERT_X(m_interpolator, Q_FUNC_INFO, "Missing interpolator");
if (m_clientStatus == Disconnected) { return; }
IInterpolator::InterpolationStatus status;
CInterpolationHints hints; // \fixme 201701 #865 KB if there is an elevation provider for FS9 add it here or set elevation
hints.setLoggingInterpolation(this->m_interpolator->getInterpolatorSetup().getLogCallsigns().contains(m_callsign));
const CAircraftSituation situation = this->m_interpolator->getInterpolatedSituation(m_callsign, -1, this->m_interpolationSetup, hints, status);
hints.setLoggingInterpolation(this->getInterpolationSetup().getLogCallsigns().contains(m_callsign));
const CAircraftSituation situation = this->m_interpolator.getInterpolatedSituation(m_callsign, -1, this->m_interpolationSetup, hints, status);
// Test only for successful interpolation. FS9 requires constant positions
if (!status.didInterpolationSucceed()) { return; }

View File

@@ -11,7 +11,7 @@
#define DIRECTPLAY_CLIENT_H
#include "directplaypeer.h"
#include "blackmisc/simulation/interpolator.h"
#include "blackmisc/simulation/interpolatorlinear.h"
#include "blackmisc/aviation/aircraftsituation.h"
#include "blackmisc/pq/time.h"
#include "blackmisc/aviation/callsign.h"
@@ -41,8 +41,7 @@ namespace BlackSimPlugin
//! Constructor
CFs9Client(const BlackMisc::Aviation::CCallsign &callsign, const QString &modelName,
BlackMisc::Simulation::IInterpolator *interpolator, const BlackMisc::PhysicalQuantities::CTime &updateInterval,
QObject *owner);
const BlackMisc::PhysicalQuantities::CTime &updateInterval, QObject *owner);
//! Destructor
virtual ~CFs9Client();
@@ -50,6 +49,9 @@ namespace BlackSimPlugin
//! Set DirectPlay host address
void setHostAddress(const QString &hostAddress);
//! Get interpolator
BlackMisc::Simulation::IInterpolator *getInterpolator() { return &m_interpolator; }
//! Set interpolation setup
//! \threadsafe
void setInterpolationSetup(const BlackMisc::Simulation::CInterpolationAndRenderingSetup &setup);
@@ -95,7 +97,7 @@ namespace BlackSimPlugin
BlackMisc::Simulation::CInterpolationAndRenderingSetup getInterpolationSetup() const;
BlackMisc::PhysicalQuantities::CTime m_updateInterval;
BlackMisc::Simulation::IInterpolator *m_interpolator = nullptr;
BlackMisc::Simulation::CInterpolatorLinear m_interpolator;
BlackMisc::Simulation::CInterpolationAndRenderingSetup m_interpolationSetup;
mutable QReadWriteLock m_interpolationSetupMutex;
QString m_modelName;

View File

@@ -112,7 +112,6 @@ namespace BlackSimPlugin
m_lobbyClient(lobbyClient)
{
connect(lobbyClient.data(), &CLobbyClient::disconnected, this, std::bind(&CSimulatorFs9::simulatorStatusChanged, this, 0));
m_interpolator = new CInterpolatorLinear(remoteAircraftProvider, this);
m_defaultModel =
{
"Boeing 737-400",
@@ -172,7 +171,7 @@ namespace BlackSimPlugin
bool rendered = true;
updateAircraftRendered(callsign, rendered);
CFs9Client *client = new CFs9Client(callsign, newRemoteAircraft.getModelString(), m_interpolator, CTime(25, CTimeUnit::ms()), this);
CFs9Client *client = new CFs9Client(callsign, newRemoteAircraft.getModelString(), CTime(25, CTimeUnit::ms()), this);
client->setHostAddress(m_fs9Host->getHostAddress());
client->setPlayerUserId(m_fs9Host->getPlayerUserId());
client->start();
@@ -391,6 +390,20 @@ namespace BlackSimPlugin
m_fsuipc->write(weatherGrid);
}
void CSimulatorFs9::ps_remoteProviderAddAircraftSituation(const CAircraftSituation &situation)
{
const auto it = m_hashFs9Clients.find(situation.getCallsign());
if (it == m_hashFs9Clients.end()) { return; }
QTimer::singleShot(0, it->data(), [client = *it, situation] { client->getInterpolator()->addAircraftSituation(situation); });
}
void CSimulatorFs9::ps_remoteProviderAddAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, const CAircraftParts &parts)
{
const auto it = m_hashFs9Clients.find(callsign);
if (it == m_hashFs9Clients.end()) { return; }
QTimer::singleShot(0, it->data(), [client = *it, parts] { client->getInterpolator()->addAircraftParts(parts); });
}
CSimulatorFs9Listener::CSimulatorFs9Listener(const CSimulatorPluginInfo &info,
const QSharedPointer<CFs9Host> &fs9Host,
const QSharedPointer<CLobbyClient> &lobbyClient) :

View File

@@ -76,6 +76,8 @@ namespace BlackSimPlugin
//! \name Base class overrides
//! @{
virtual void injectWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid) override;
virtual void ps_remoteProviderAddAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override;
virtual void ps_remoteProviderAddAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftParts &parts) override;
//! @}
private slots: