X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fglobals.cxx;h=c28c9f5d2f647818ad643dfcd2de1fc69b250c9d;hb=c053de6b4c4c3a9b22648d3c7e798cfd087887c7;hp=7e6553fa4b196ba2602e70bdc2ada320e5ef95c3;hpb=afb0ada81f6fd0fe179ab00f048134d101f5f311;p=flightgear.git diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index 7e6553fa4..c28c9f5d2 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -15,8 +15,8 @@ // General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// along with this program; if not, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -26,16 +26,18 @@ #include #include +#include #include #include #include #include #include #include +#include +#include #include #include -#include #include #include #include @@ -43,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -55,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. //////////////////////////////////////////////////////////////////////// @@ -72,6 +120,7 @@ FGGlobals::FGGlobals() : renderer( new FGRenderer ), subsystem_mgr( new SGSubsystemMgr ), event_mgr( new SGEventMgr ), + soundmgr( new SGSoundMgr ), sim_time_sec( 0.0 ), fg_root( "" ), warp( 0 ), @@ -83,7 +132,6 @@ FGGlobals::FGGlobals() : route_mgr( NULL ), current_panel( NULL ), ATC_mgr( NULL ), - AI_mgr( NULL ), controls( NULL ), viewmgr( NULL ), commands( SGCommandMgr::instance() ), @@ -100,10 +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()); } @@ -111,41 +158,34 @@ 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 ephem; delete mag; delete matlib; delete route_mgr; delete current_panel; delete ATC_mgr; - delete AI_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,9 @@ FGGlobals::~FGGlobals() delete tacanlist; delete carrierlist; delete channellist; - delete airwaynet; - delete multiplayer_mgr; + + soundmgr->unbind(); + delete soundmgr; } @@ -183,9 +224,13 @@ 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) { +void FGGlobals::set_fg_scenery (const string &scenery) +{ SGPath s; if (scenery.empty()) { s.set( fg_root ); @@ -197,40 +242,73 @@ void FGGlobals::set_fg_scenery (const string &scenery) { fg_scenery.clear(); for (unsigned i = 0; i < path_list.size(); i++) { - - ulDir *d = ulOpenDir( path_list[i].c_str() ); - if (d == NULL) - continue; - ulCloseDir( d ); - - SGPath pt( path_list[i] ), po( path_list[i] ); - pt.append("Terrain"); - po.append("Objects"); - - ulDir *td = ulOpenDir( pt.c_str() ); - ulDir *od = ulOpenDir( po.c_str() ); - - // "Terrain" and "Airports" directory don't exist. add directory as is - // otherwise, automatically append either Terrain, Objects, or both - //if (td == NULL && od == NULL) - fg_scenery.push_back( path_list[i] ); - //else { - if (td != NULL) { - fg_scenery.push_back( pt.str() ); - ulCloseDir( td ); - } - if (od != NULL) { - fg_scenery.push_back( po.str() ); - ulCloseDir( od ); - } - //} + SGPath path(path_list[i]); + if (!path.exists()) { + SG_LOG(SG_GENERAL, SG_WARN, "scenery path not found:" << path.str()); + continue; + } + + simgear::Dir dir(path); + SGPath terrainDir(dir.file("Terrain")); + SGPath objectsDir(dir.file("Objects")); + + // this code used to add *either* the base dir, OR add the + // Terrain and Objects subdirs, but the conditional logic was commented + // out, such that all three dirs are added. Unfortunately there's + // no information as to why the change was made. + fg_scenery.push_back(path.str()); + + if (terrainDir.exists()) { + fg_scenery.push_back(terrainDir.str()); + } + + if (objectsDir.exists()) { + fg_scenery.push_back(objectsDir.str()); + } + // insert a marker for FGTileEntry::load(), so that // FG_SCENERY=A:B becomes list ["A/Terrain", "A/Objects", "", // "B/Terrain", "B/Objects", ""] fg_scenery.push_back(""); - } + } // of path list iteration } +void FGGlobals::append_aircraft_path(const std::string& path) +{ + SGPath dirPath(path); + if (!dirPath.exists()) { + SG_LOG(SG_GENERAL, SG_WARN, "aircraft path not found:" << path); + return; + } + + unsigned int index = fg_aircraft_dirs.size(); + fg_aircraft_dirs.push_back(path); + +// make aircraft dirs available to Nasal + SGPropertyNode* sim = fgGetNode("/sim", true); + sim->removeChild("fg-aircraft", index, false); + SGPropertyNode* n = sim->getChild("fg-aircraft", index, true); + n->setStringValue(path); + n->setAttribute(SGPropertyNode::WRITE, false); +} + +void FGGlobals::append_aircraft_paths(const std::string& path) +{ + string_list paths = sgPathSplit(path); + for (unsigned int p = 0; pfindPath(branch); +} + +SGPath FGGlobals::resolve_maybe_aircraft_path(const std::string& branch) const +{ + return simgear::ResourceManager::instance()->findPath(branch); +} FGRenderer * FGGlobals::get_renderer () const @@ -259,6 +337,11 @@ FGGlobals::add_subsystem (const char * name, subsystem_mgr->add(name, subsystem, type, min_time_sec); } +SGSoundMgr * +FGGlobals::get_soundmgr () const +{ + return soundmgr; +} SGEventMgr * FGGlobals::get_event_mgr () const @@ -275,6 +358,21 @@ FGGlobals::saveInitialState () if (!copyProperties(props, initial_state)) SG_LOG(SG_GENERAL, SG_ALERT, "Error saving initial state"); + + // delete various properties from the initial state, since we want to + // preserve their values even if doing a restore + + SGPropertyNode* sim = initial_state->getChild("sim"); + sim->removeChild("presets"); + SGPropertyNode* simStartup = sim->getChild("startup"); + simStartup->removeChild("xsize"); + simStartup->removeChild("ysize"); + + SGPropertyNode* cameraGroupNode = sim->getNode("rendering/camera-group"); + if (cameraGroupNode) { + cameraGroupNode->removeChild("camera"); + cameraGroupNode->removeChild("gui"); + } } @@ -288,14 +386,6 @@ FGGlobals::restoreInitialState () return; } - SGPropertyNode *currentPresets = new SGPropertyNode; - SGPropertyNode *targetNode = fgGetNode( "/sim/presets" ); - - // stash the /sim/presets tree - if ( !copyProperties(targetNode, currentPresets) ) { - SG_LOG( SG_GENERAL, SG_ALERT, "Failed to save /sim/presets subtree" ); - } - if ( copyProperties(initial_state, props) ) { SG_LOG( SG_GENERAL, SG_INFO, "Initial state restored successfully" ); } else { @@ -303,13 +393,6 @@ FGGlobals::restoreInitialState () "Some errors restoring initial state (read-only props?)" ); } - // recover the /sim/presets tree - if ( !copyProperties(currentPresets, targetNode) ) { - SG_LOG( SG_GENERAL, SG_ALERT, - "Failed to restore /sim/presets subtree" ); - } - - delete currentPresets; } FGViewer *