X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fglobals.cxx;h=51f202b4960d72f2785ed5498c32a2478f8a8c4f;hb=33425c671d20fc7a7fbb87c2db28aef455b5b5dd;hp=c63129866c95da9758c0e788f66e8d12f70b608a;hpb=505796e349db709c7fbcebf069bf5ddea4fa79bf;p=flightgear.git diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index c63129866..51f202b49 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -47,8 +46,6 @@ #include #include #include -#include -#include #include #include #include @@ -109,6 +106,23 @@ public: } }; +class CurrentAircraftDirProvider : public simgear::ResourceProvider +{ +public: + CurrentAircraftDirProvider() : + simgear::ResourceProvider(simgear::ResourceManager::PRIORITY_HIGH) + { + } + + virtual SGPath resolve(const std::string& aResource, SGPath&) const + { + const char* aircraftDir = fgGetString("/sim/aircraft-dir"); + SGPath p(aircraftDir); + p.append(aResource); + return p.exists() ? p : SGPath(); + } +}; + //////////////////////////////////////////////////////////////////////// // Implementation of FGGlobals. //////////////////////////////////////////////////////////////////////// @@ -136,24 +150,29 @@ FGGlobals::FGGlobals() : controls( NULL ), viewmgr( NULL ), commands( SGCommandMgr::instance() ), - acmodel( NULL ), - model_mgr( NULL ), channel_options_list( NULL ), initial_waypoints( NULL ), scenery( NULL ), tile_mgr( NULL ), fontcache ( new FGFontCache ), - navlist( NULL ), - loclist( NULL ), - gslist( NULL ), - dmelist( NULL ), - tacanlist( NULL ), - carrierlist( NULL ), channellist( NULL ), haveUserSettings(false) { - simgear::ResourceManager::instance()->addProvider(new AircraftResourceProvider()); + simgear::ResourceManager::instance()->addProvider(new AircraftResourceProvider); + simgear::ResourceManager::instance()->addProvider(new CurrentAircraftDirProvider); simgear::PropertyObjectBase::setDefaultRoot(props); + + positionLon = props->getNode("position/longitude-deg", true); + positionLat = props->getNode("position/latitude-deg", true); + positionAlt = props->getNode("position/altitude-ft", true); + + viewLon = props->getNode("sim/current-view/viewer-lon-deg", true); + viewLat = props->getNode("sim/current-view/viewer-lat-deg", true); + viewAlt = props->getNode("sim/current-view/viewer-elev-ft", true); + + orientPitch = props->getNode("orientation/pitch-deg", true); + orientHeading = props->getNode("orientation/heading-deg", true); + orientRoll = props->getNode("orientation/roll-deg", true); } // Destructor @@ -188,23 +207,11 @@ FGGlobals::~FGGlobals() delete ATIS_mgr; - if (controls) - { - controls->unbind(); - delete controls; - } - delete channel_options_list; delete initial_waypoints; delete scenery; delete fontcache; - delete navlist; - delete loclist; - delete gslist; - delete dmelist; - delete tacanlist; - delete carrierlist; delete channellist; delete sound; @@ -213,7 +220,7 @@ FGGlobals::~FGGlobals() } // set the fg_root path -void FGGlobals::set_fg_root (const string &root) { +void FGGlobals::set_fg_root (const std::string &root) { SGPath tmp(root); fg_root = tmp.realpath(); @@ -240,12 +247,60 @@ void FGGlobals::set_fg_root (const string &root) { } // set the fg_home path -void FGGlobals::set_fg_home (const string &home) { +void FGGlobals::set_fg_home (const std::string &home) { SGPath tmp(home); fg_home = tmp.realpath(); } -void FGGlobals::append_fg_scenery (const string &paths) +PathList FGGlobals::get_data_paths() const +{ + PathList r(additional_data_paths); + r.push_back(SGPath(fg_root)); + return r; +} + +PathList FGGlobals::get_data_paths(const std::string& suffix) const +{ + PathList r; + BOOST_FOREACH(SGPath p, get_data_paths()) { + p.append(suffix); + if (p.exists()) { + r.push_back(p); + } + } + + return r; +} + +void FGGlobals::append_data_path(const SGPath& path) +{ + if (!path.exists()) { + SG_LOG(SG_GENERAL, SG_WARN, "adding non-existant data path:" << path); + } + + additional_data_paths.push_back(path); +} + +SGPath FGGlobals::find_data_dir(const std::string& pathSuffix) const +{ + BOOST_FOREACH(SGPath p, additional_data_paths) { + p.append(pathSuffix); + if (p.exists()) { + return p; + } + } + + SGPath rootPath(fg_root); + rootPath.append(pathSuffix); + if (rootPath.exists()) { + return rootPath; + } + + SG_LOG(SG_GENERAL, SG_WARN, "dir not found in any data path:" << pathSuffix); + return SGPath(); +} + +void FGGlobals::append_fg_scenery (const std::string &paths) { // fg_scenery.clear(); SGPropertyNode* sim = fgGetNode("/sim", true); @@ -338,7 +393,7 @@ SGPath FGGlobals::resolve_maybe_aircraft_path(const std::string& branch) const return simgear::ResourceManager::instance()->findPath(branch); } -SGPath FGGlobals::resolve_ressource_path(const std::string& branch) const +SGPath FGGlobals::resolve_resource_path(const std::string& branch) const { return simgear::ResourceManager::instance() ->findPath(branch, SGPath(fgGetString("/sim/aircraft-dir"))); @@ -389,26 +444,37 @@ FGGlobals::get_event_mgr () const SGGeod FGGlobals::get_aircraft_position() const { - if( acmodel != NULL ) { - SGModelPlacement * mp = acmodel->get3DModel(); - if( mp != NULL ) - return mp->getPosition(); - } - - // fall back to reading the property tree. this can occur during - // startup before the acmodel is initialised - - return SGGeod::fromDegFt(fgGetDouble("/position/longitude-deg"), - fgGetDouble("/position/latitude-deg"), - fgGetDouble("/position/altitude-ft")); + return SGGeod::fromDegFt(positionLon->getDoubleValue(), + positionLat->getDoubleValue(), + positionAlt->getDoubleValue()); } SGVec3d -FGGlobals::get_aircraft_positon_cart() const +FGGlobals::get_aircraft_position_cart() const { return SGVec3d::fromGeod(get_aircraft_position()); } +void FGGlobals::get_aircraft_orientation(double& heading, double& pitch, double& roll) +{ + heading = orientHeading->getDoubleValue(); + pitch = orientPitch->getDoubleValue(); + roll = orientRoll->getDoubleValue(); +} + +SGGeod +FGGlobals::get_view_position() const +{ + return SGGeod::fromDegFt(viewLon->getDoubleValue(), + viewLat->getDoubleValue(), + viewAlt->getDoubleValue()); +} + +SGVec3d +FGGlobals::get_view_position_cart() const +{ + return SGVec3d::fromGeod(get_view_position()); +} // Save the current state as the initial state. void @@ -435,6 +501,17 @@ FGGlobals::saveInitialState () } } +static std::string autosaveName() +{ + std::ostringstream os; + string_list versionParts = simgear::strutils::split(VERSION, "."); + if (versionParts.size() < 2) { + return "autosave.xml"; + } + + os << "autosave_" << versionParts[0] << "_" << versionParts[1] << ".xml"; + return os.str(); +} // Restore the saved initial state, if any void @@ -465,7 +542,7 @@ FGGlobals::loadUserSettings(const SGPath& dataPath) // remember that we have (tried) to load any existing autsave.xml haveUserSettings = true; - SGPath autosaveFile = simgear::Dir(dataPath).file("autosave.xml"); + SGPath autosaveFile = simgear::Dir(dataPath).file(autosaveName()); SGPropertyNode autosave; if (autosaveFile.exists()) { SG_LOG(SG_INPUT, SG_INFO, "Reading user settings from " << autosaveFile.str()); @@ -493,13 +570,13 @@ FGGlobals::saveUserSettings() haveUserSettings = false; SGPath autosaveFile(globals->get_fg_home()); - autosaveFile.append( "autosave.xml" ); + autosaveFile.append(autosaveName()); autosaveFile.create_dir( 0700 ); SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << autosaveFile.str()); try { writeProperties(autosaveFile.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE); } catch (const sg_exception &e) { - guiErrorMessage("Error writing autosave.xml: ", e); + guiErrorMessage("Error writing autosave:", e); } SG_LOG(SG_INPUT, SG_DEBUG, "Finished Saving user settings"); }