X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fglobals.cxx;h=c28c9f5d2f647818ad643dfcd2de1fc69b250c9d;hb=c053de6b4c4c3a9b22648d3c7e798cfd087887c7;hp=bfa51f72fed5bf8499601703636ec94c272cdabe;hpb=0bce31ae9a80c571b9126427c093b8dc3d3f6820;p=flightgear.git diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index bfa51f72f..c28c9f5d2 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -44,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -56,7 +56,54 @@ #include "fg_props.hxx" #include "fg_io.hxx" - + class AircraftResourceProvider : public simgear::ResourceProvider +{ +public: + AircraftResourceProvider() : + simgear::ResourceProvider(simgear::ResourceManager::PRIORITY_HIGH) + { + } + + virtual SGPath resolve(const std::string& aResource, SGPath&) const + { + string_list pieces(sgPathBranchSplit(aResource)); + if ((pieces.size() < 3) || (pieces.front() != "Aircraft")) { + return SGPath(); // not an Aircraft path + } + + // test against the aircraft-dir property + const char* aircraftDir = fgGetString("/sim/aircraft-dir"); + string_list aircraftDirPieces(sgPathBranchSplit(aircraftDir)); + if (aircraftDirPieces.empty() || (aircraftDirPieces.back() != pieces[1])) { + return SGPath(); // current aircraft-dir does not match resource aircraft + } + + SGPath r(aircraftDir); + for (unsigned int i=2; iget_aircraft_paths()); + string_list::const_iterator it = dirs.begin(); + for (; it != dirs.end(); ++it) { + SGPath p(*it, res); + if (p.exists()) { + SG_LOG(SG_IO, SG_INFO, "found path:" << aResource << " in aircraft dir: " << r.str()); + return p; + } + } // of aircraft path iteration + + return SGPath(); // not found + } +}; + //////////////////////////////////////////////////////////////////////// // Implementation of FGGlobals. //////////////////////////////////////////////////////////////////////// @@ -101,11 +148,9 @@ FGGlobals::FGGlobals() : dmelist( NULL ), tacanlist( NULL ), carrierlist( NULL ), - channellist( NULL ), - airwaynet( NULL ), - multiplayer_mgr( NULL ) + channellist( NULL ) { - + simgear::ResourceManager::instance()->addProvider(new AircraftResourceProvider()); } @@ -113,23 +158,23 @@ FGGlobals::FGGlobals() : FGGlobals::~FGGlobals() { delete renderer; + renderer = NULL; + // The AIModels manager performs a number of actions upon // Shutdown that implicitly assume that other subsystems // are still operational (Due to the dynamic allocation and // deallocation of AIModel objects. To ensure we can safely // shut down all subsystems, make sure we take down the // AIModels system first. - subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("ai_model"); - // FGInput (FGInputEvent) and FGDialog calls get_subsystem() in their destructors, - // which is not safe since some subsystem are already deleted but can be referred. - // So these subsystems must be deleted prior to deleting subsystem_mgr unless - // ~SGSubsystemGroup and SGSubsystemMgr::get_subsystem are changed not to refer to - // deleted subsystems. - subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("input"); - subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("gui"); + SGSubsystem* ai = subsystem_mgr->remove("ai_model"); + if (ai) { + ai->unbind(); + delete ai; + } + subsystem_mgr->unbind(); delete subsystem_mgr; - delete event_mgr; + delete time_params; delete mag; delete matlib; @@ -138,14 +183,9 @@ FGGlobals::~FGGlobals() delete ATC_mgr; delete controls; - delete viewmgr; -// delete commands; - delete acmodel; - delete model_mgr; delete channel_options_list; delete initial_waypoints; - delete tile_mgr; delete scenery; delete fontcache; @@ -156,8 +196,6 @@ FGGlobals::~FGGlobals() delete tacanlist; delete carrierlist; delete channellist; - delete airwaynet; - delete multiplayer_mgr; soundmgr->unbind(); delete soundmgr; @@ -186,6 +224,9 @@ void FGGlobals::set_fg_root (const string &root) { n = n->getChild("fg-root", 0, true); n->setStringValue(fg_root.c_str()); n->setAttribute(SGPropertyNode::WRITE, false); + + simgear::ResourceManager::instance()->addBasePath(fg_root, + simgear::ResourceManager::PRIORITY_DEFAULT); } void FGGlobals::set_fg_scenery (const string &scenery) @@ -261,60 +302,12 @@ void FGGlobals::append_aircraft_paths(const std::string& path) SGPath FGGlobals::resolve_aircraft_path(const std::string& branch) const { - string_list pieces(sgPathBranchSplit(branch)); - if ((pieces.size() < 3) || (pieces.front() != "Aircraft")) { - SG_LOG(SG_AIRCRAFT, SG_ALERT, "resolve_aircraft_path: bad path:" << branch); - return SGPath(); - } - -// check current aircraft dir first (takes precedence, allows Generics to be -// over-riden - const char* aircraftDir = fgGetString("/sim/aircraft-dir"); - string_list aircraftDirPieces(sgPathBranchSplit(aircraftDir)); - if (!aircraftDirPieces.empty() && (aircraftDirPieces.back() == pieces[1])) { - SGPath r(aircraftDir); - - for (unsigned int i=2; ifindPath(branch); } SGPath FGGlobals::resolve_maybe_aircraft_path(const std::string& branch) const { - if (branch.find("Aircraft/") == 0) { - return resolve_aircraft_path(branch); - } else { - SGPath r(fg_root); - r.append(branch); - return r; - } + return simgear::ResourceManager::instance()->findPath(branch); } FGRenderer *