#include <Airports/runways.hxx>
#include <Airports/airport.hxx>
#include <Airports/dynamics.hxx>
+#include <Airports/airportdynamicsmanager.hxx>
#include <AIModel/AIManager.hxx>
#include <Network/fgcom.hxx>
#include <Network/http/httpd.hxx>
#include <Include/version.h>
-
+#include <Viewer/splash.hxx>
#include <Viewer/CameraGroup.hxx>
#include "fg_init.hxx"
extern osg::ref_ptr<osgViewer::Viewer> viewer;
// Return the current base package version
-string fgBasePackageVersion() {
- SGPath base_path( globals->get_fg_root() );
- base_path.append("version");
- if (!base_path.exists()) {
+string fgBasePackageVersion(const SGPath& base_path) {
+ SGPath p(base_path);
+ p.append("version");
+ if (!p.exists()) {
return string();
}
- sg_gzifstream in( base_path.str() );
+ sg_gzifstream in( p.str() );
if (!in.is_open()) {
return string();
}
exportDir.create(0755);
}
- // Set /sim/fg-home and don't allow malign code to override it until
- // Nasal security is set up. Use FG_HOME if necessary.
+ // Set /sim/fg-home. Use FG_HOME if necessary.
+ // deliberately not a tied property, for fgValidatePath security
+ // write-protect to avoid accidents
SGPropertyNode *home = fgGetNode("/sim", true);
home->removeChild("fg-home", 0);
home = home->getChild("fg-home", 0, true);
static void initAircraftDirsNasalSecurity()
{
+ // deliberately not a tied property, for fgValidatePath security
+ // write-protect to avoid accidents
SGPropertyNode* sim = fgGetNode("/sim", true);
sim->removeChildren("fg-aircraft");
}
}
-int fgInitAircraft(bool reinit)
+void fgInitAircraftPaths(bool reinit)
{
- if (!reinit) {
- // FIXME - use Documents/FlightGear/Aircraft
- SGPath userAircraftDir = globals->get_fg_home();
- userAircraftDir.append("Aircraft");
+ if (!globals->packageRoot()) {
+ fgInitPackageRoot();
+ }
- SGSharedPtr<Root> pkgRoot(new Root(userAircraftDir, FLIGHTGEAR_VERSION));
- // set the http client later (too early in startup right now)
- globals->setPackageRoot(pkgRoot);
- }
+ SGSharedPtr<Root> pkgRoot(globals->packageRoot());
+ SGPropertyNode* aircraftProp = fgGetNode("/sim/aircraft", true);
+ aircraftProp->setAttribute(SGPropertyNode::PRESERVE, true);
- SGSharedPtr<Root> pkgRoot(globals->packageRoot());
- SGPropertyNode* aircraftProp = fgGetNode("/sim/aircraft", true);
- aircraftProp->setAttribute(SGPropertyNode::PRESERVE, true);
+ if (!reinit) {
+ flightgear::Options::sharedInstance()->initPaths();
+ }
+}
+int fgInitAircraft(bool reinit)
+{
if (!reinit) {
flightgear::Options::sharedInstance()->initAircraft();
}
+
+ SGSharedPtr<Root> pkgRoot(globals->packageRoot());
+ SGPropertyNode* aircraftProp = fgGetNode("/sim/aircraft", true);
string aircraftId(aircraftProp->getStringValue());
PackageRef acftPackage = pkgRoot->getPackageById(aircraftId);
size_t lastDot = aircraftId.rfind('.');
if (lastDot != std::string::npos) {
aircraftId = aircraftId.substr(lastDot + 1);
- aircraftProp->setStringValue(aircraftId);
-
}
+ aircraftProp->setStringValue(aircraftId);
+
// run the traditional-code path below
} else {
#if 0
return flightgear::FG_OPTIONS_ERROR;
#endif
+ // fall back the default aircraft instead
}
}
bool
fgInitNav ()
{
- flightgear::NavDataCache* cache = flightgear::NavDataCache::instance();
- static bool doingRebuild = false;
- if (doingRebuild || cache->isRebuildRequired()) {
- doingRebuild = true;
- bool finished = cache->rebuild();
- if (!finished) {
- // sleep to give the rebuild thread more time
- SGTimeStamp::sleepForMSec(50);
- return false;
+ flightgear::NavDataCache* cache = flightgear::NavDataCache::instance();
+ static bool doingRebuild = false;
+
+ if (!cache) {
+ cache = flightgear::NavDataCache::createInstance();
+ doingRebuild = cache->isRebuildRequired();
}
- }
-
+
+ static const char* splashIdentsByRebuildPhase[] = {
+ "loading-nav-dat",
+ "navdata-airports",
+ "navdata-navaids",
+ "navdata-fixes",
+ "navdata-pois"
+ };
+
+ if (doingRebuild) {
+ flightgear::NavDataCache::RebuildPhase phase;
+ phase = cache->rebuild();
+ if (phase != flightgear::NavDataCache::REBUILD_DONE) {
+ // update the splash text based on percentage, phase
+
+ fgSplashProgress(splashIdentsByRebuildPhase[phase],
+ cache->rebuildPhaseCompletionPercentage());
+
+ // sleep to give the rebuild thread more time
+ SGTimeStamp::sleepForMSec(50);
+ return false;
+ }
+ }
+
FGTACANList *channellist = new FGTACANList;
globals->set_channellist( channellist );
SG_LOG( SG_GENERAL, SG_INFO, "aircraft-dir = " << '"' << fgGetString("/sim/aircraft-dir") << '"' );
SG_LOG( SG_GENERAL, SG_INFO, "fghome-dir = " << '"' << globals->get_fg_home() << '"');
- SG_LOG( SG_GENERAL, SG_INFO, "aircraft-dir = " << '"' << fgGetString("/sim/aircraft-dir") << '"');
-
+ SG_LOG( SG_GENERAL, SG_INFO, "download-dir = " << '"' << fgGetString("/sim/paths/download-dir") << '"' );
+ SG_LOG( SG_GENERAL, SG_INFO, "terrasync-dir = " << '"' << fgGetString("/sim/terrasync/scenery-dir") << '"' );
+
SG_LOG( SG_GENERAL, SG_INFO, "aircraft-search-paths = \n\t" << simgear::strutils::join(globals->get_aircraft_paths(), "\n\t") );
SG_LOG( SG_GENERAL, SG_INFO, "scenery-search-paths = \n\t" << simgear::strutils::join(globals->get_fg_scenery(), "\n\t") );
}
// to be updated in every loop.
// Sound manager is updated last so it can use the CPU while the GPU
// is processing the scenery (doubled the frame-rate for me) -EMH-
- globals->add_subsystem("sound", new FGSoundManager, SGSubsystemMgr::SOUND);
+ globals->add_new_subsystem<FGSoundManager>(SGSubsystemMgr::SOUND);
////////////////////////////////////////////////////////////////////
// Initialize the event manager subsystem.
globals->add_subsystem("properties", new FGProperties);
+ ////////////////////////////////////////////////////////////////////
+ // Add the FlightGear property utilities.
+ ////////////////////////////////////////////////////////////////////
+ globals->add_new_subsystem<flightgear::AirportDynamicsManager>();
+
////////////////////////////////////////////////////////////////////
// Add the performance monitoring system.
////////////////////////////////////////////////////////////////////
globals->get_props()) ) {
throw sg_io_exception("Error loading materials file", mpath);
}
-
- globals->add_subsystem( "http", new FGHTTPClient );
-
+
+ // may exist already due to GUI startup
+ if (!globals->get_subsystem("http")) {
+ globals->add_subsystem( "http", new FGHTTPClient );
+ }
+
////////////////////////////////////////////////////////////////////
// Initialize the scenery management subsystem.
////////////////////////////////////////////////////////////////////
globals->add_subsystem( "xml-autopilot", FGXMLAutopilotGroup::createInstance("autopilot"), SGSubsystemMgr::FDM );
globals->add_subsystem( "xml-proprules", FGXMLAutopilotGroup::createInstance("property-rule"), SGSubsystemMgr::GENERAL );
- globals->add_subsystem( "route-manager", new FGRouteMgr );
+ globals->add_new_subsystem<FGRouteMgr>();
////////////////////////////////////////////////////////////////////
// Initialize the Input-Output subsystem
// Initialize the controls subsystem.
////////////////////////////////////////////////////////////////////
- globals->add_subsystem("controls", new FGControls, SGSubsystemMgr::GENERAL);
+ globals->add_new_subsystem<FGControls>(SGSubsystemMgr::GENERAL);
////////////////////////////////////////////////////////////////////
// Initialize the input subsystem.
globals->add_subsystem("aircraft-model", new FGAircraftModel, SGSubsystemMgr::DISPLAY);
globals->add_subsystem("model-manager", new FGModelMgr, SGSubsystemMgr::DISPLAY);
- globals->add_subsystem("view-manager", new FGViewMgr, SGSubsystemMgr::DISPLAY);
-
- globals->add_subsystem("tile-manager", globals->get_tile_mgr(),
- SGSubsystemMgr::DISPLAY);
+ globals->add_new_subsystem<FGViewMgr>(SGSubsystemMgr::DISPLAY);
}
void fgPostInitSubsystems()
string_list::const_iterator it;
for (it = names.begin(); it != names.end(); ++it) {
if ((*it == "time") || (*it == "terrasync") || (*it == "events")
- || (*it == "lighting"))
+ || (*it == "lighting") || (*it == FGTileMgr::subsystemName()) || (*it == FGScenery::subsystemName()))
{
continue;
}
// order is important here since tile-manager shutdown needs to
// access the scenery object
- globals->set_tile_mgr(NULL);
- globals->set_scenery(NULL);
+ subsystemManger->remove(FGTileMgr::subsystemName());
+ subsystemManger->remove(FGScenery::subsystemName());
+
FGScenery::getPagerSingleton()->clearRequests();
flightgear::CameraGroup::setDefault(NULL);
}
fgGetNode("/sim")->removeChild("aircraft-dir");
+ fgInitAircraftPaths(true);
fgInitAircraft(true);
render = new FGRenderer;
fgSetBool("/sim/sceneryloaded",false);
}
+void fgInitPackageRoot()
+{
+ if (globals->packageRoot()) {
+ return;
+ }
+
+ SGPath packageAircraftDir = flightgear::defaultDownloadDir();
+ packageAircraftDir.append("Aircraft");
+
+ SGSharedPtr<Root> pkgRoot(new Root(packageAircraftDir, FLIGHTGEAR_VERSION));
+ // set the http client later (too early in startup right now)
+ globals->setPackageRoot(pkgRoot);
+
+}