mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 14:55:36 +08:00
Basic model loader implementation for FG
This commit is contained in:
committed by
Mat Sutcliffe
parent
716dde38e4
commit
0fa989c2f1
@@ -39,6 +39,7 @@ HEADERS += *.h \
|
||||
$$PWD/simulation/*.h \
|
||||
$$PWD/simulation/data/*.h \
|
||||
$$PWD/simulation/settings/*.h \
|
||||
$$PWD/simulation/flightgear/*.h \
|
||||
$$PWD/simulation/fscommon/*.h \
|
||||
$$PWD/simulation/fsx/*.h \
|
||||
$$PWD/simulation/xplane/*.h \
|
||||
@@ -60,6 +61,7 @@ SOURCES += *.cpp \
|
||||
$$PWD/simulation/*.cpp \
|
||||
$$PWD/simulation/data/*.cpp \
|
||||
$$PWD/simulation/settings/*.cpp \
|
||||
$$PWD/simulation/flightgear/*.cpp \
|
||||
$$PWD/simulation/fscommon/*.cpp \
|
||||
$$PWD/simulation/fsx/*.cpp \
|
||||
$$PWD/simulation/xplane/*.cpp \
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "blackmisc/simulation/aircraftmodelloader.h"
|
||||
#include "blackmisc/simulation/fscommon/aircraftcfgparser.h"
|
||||
#include "blackmisc/simulation/xplane/aircraftmodelloaderxplane.h"
|
||||
#include "blackmisc/simulation/flightgear/aircraftmodelloaderflightgear.h"
|
||||
#include "blackmisc/simulation/xplane/xplaneutil.h"
|
||||
#include "blackmisc/directoryutils.h"
|
||||
#include "blackmisc/compare.h"
|
||||
@@ -174,12 +175,7 @@ namespace BlackMisc
|
||||
{
|
||||
Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Single simulator");
|
||||
if (simulator.isXPlane()) { return new CAircraftModelLoaderXPlane(parent); }
|
||||
if (simulator.isFG())
|
||||
{
|
||||
//! \todo FG add real loader
|
||||
IAircraftModelLoader *dummy = new CDummyModelLoader(simulator, parent);
|
||||
return dummy;
|
||||
}
|
||||
if (simulator.isFG()) { return new BlackMisc::Simulation::Flightgear::AircraftModelLoaderFlightgear(parent); }
|
||||
return CAircraftCfgParser::createModelLoader(simulator, parent);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
#include "aircraftmodelloaderflightgear.h"
|
||||
#include "blackmisc/simulation/aircraftmodel.h"
|
||||
#include <QDirIterator>
|
||||
namespace BlackMisc{
|
||||
namespace Simulation {
|
||||
namespace Flightgear {
|
||||
|
||||
bool AircraftModelLoaderFlightgear::isLoadingFinished() const
|
||||
{
|
||||
return !m_parserWorker || m_parserWorker->isFinished();;
|
||||
}
|
||||
|
||||
AircraftModelLoaderFlightgear::AircraftModelLoaderFlightgear(QObject *parent) : Simulation::IAircraftModelLoader (Simulation::CSimulatorInfo::fg(), parent)
|
||||
{
|
||||
std::cout << "Test";
|
||||
}
|
||||
|
||||
void AircraftModelLoaderFlightgear::updateInstalledModels(const CAircraftModelList &models)
|
||||
{
|
||||
this->setModelsForSimulator(models, CSimulatorInfo::fg());
|
||||
const CStatusMessage m = CStatusMessage(this, CStatusMessage::SeverityInfo, u"XPlane updated '%1' models") << models.size();
|
||||
m_loadingMessages.push_back(m);
|
||||
}
|
||||
|
||||
Simulation::CAircraftModelList AircraftModelLoaderFlightgear::parseFlyableAirplaces(const QString &rootDirectory)
|
||||
{
|
||||
Simulation::CAircraftModelList installedModels;
|
||||
|
||||
QDir searchPath(rootDirectory, fileFilterFlyable());
|
||||
QDirIterator aircraftIt(searchPath, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
|
||||
|
||||
|
||||
while (aircraftIt.hasNext()) {
|
||||
aircraftIt.next();
|
||||
//TODO Add possibility of exclude dir
|
||||
Simulation::CAircraftModel model;
|
||||
model.setAircraftIcaoCode(QString::fromStdString("A320"));
|
||||
model.setDescription(QString::fromStdString("Description"));
|
||||
model.setName(QString::fromStdString("ModelName"));
|
||||
model.setModelType(CAircraftModel::TypeOwnSimulatorModel);
|
||||
model.setSimulator(CSimulatorInfo::fg());
|
||||
model.setFileDetailsAndTimestamp(aircraftIt.fileInfo());
|
||||
model.setModelMode(CAircraftModel::Exclude);
|
||||
|
||||
addUniqueModel(model,installedModels);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return installedModels;
|
||||
}
|
||||
|
||||
const QString &AircraftModelLoaderFlightgear::fileFilterFlyable()
|
||||
{
|
||||
static const QString f("*-set.xml");
|
||||
return f;
|
||||
}
|
||||
|
||||
void AircraftModelLoaderFlightgear::addUniqueModel(const CAircraftModel &model, CAircraftModelList &models)
|
||||
{
|
||||
//TODO Add check
|
||||
models.push_back(model);
|
||||
}
|
||||
|
||||
void AircraftModelLoaderFlightgear::startLoadingFromDisk(IAircraftModelLoader::LoadMode mode, const IAircraftModelLoader::ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories)
|
||||
{
|
||||
const CSimulatorInfo simulator = CSimulatorInfo::fg();
|
||||
const QStringList modelDirs = this->getInitializedModelDirectories(modelDirectories, simulator);
|
||||
const QStringList excludedDirectoryPatterns(m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator)); // copy
|
||||
|
||||
if (m_parserWorker && !m_parserWorker->isFinished()){ return; }
|
||||
emit this->diskLoadingStarted(simulator, mode);
|
||||
|
||||
m_parserWorker = CWorker::fromTask(this, "CAircraftModelLoaderFlightgear::performParsing",
|
||||
[this, modelDirs, excludedDirectoryPatterns, modelConsolidation]()
|
||||
{
|
||||
auto models = this->parseFlyableAirplaces("X:/Flightsim/Flightgear/2018.3/data/Aircraft");
|
||||
if (modelConsolidation) { modelConsolidation(models, true); }
|
||||
return models;
|
||||
});
|
||||
m_parserWorker->thenWithResult<CAircraftModelList>(this, [ = ](const auto & models)
|
||||
{
|
||||
this->updateInstalledModels(models);
|
||||
m_loadingMessages.freezeOrder();
|
||||
emit this->loadingFinished(m_loadingMessages, simulator, ParsedData);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
#include "blackmisc/simulation/aircraftmodelloader.h"
|
||||
#include <QPointer>
|
||||
|
||||
namespace BlackMisc{
|
||||
namespace Simulation {
|
||||
namespace Flightgear {
|
||||
class AircraftModelLoaderFlightgear : public Simulation::IAircraftModelLoader{
|
||||
|
||||
|
||||
// IAircraftModelLoader interface
|
||||
public:
|
||||
bool isLoadingFinished() const;
|
||||
AircraftModelLoaderFlightgear(QObject *parent = nullptr);
|
||||
|
||||
//! Parsed or injected models
|
||||
void updateInstalledModels(const CAircraftModelList &models);
|
||||
|
||||
private:
|
||||
Simulation::CAircraftModelList parseFlyableAirplaces(const QString &rootDirectory);
|
||||
static const QString &fileFilterFlyable();
|
||||
void addUniqueModel(const CAircraftModel &model, CAircraftModelList &models);
|
||||
QPointer<CWorker> m_parserWorker;
|
||||
|
||||
protected:
|
||||
void startLoadingFromDisk(LoadMode mode, const ModelConsolidationCallback &modelConsolidation, const QStringList &modelDirectories);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user