X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fglobals.cxx;h=af4e693459bce2da14c45ce1e1ebd9342388142d;hb=38226af24ec01e8f0a20d7fd73ef838a69f6ef25;hp=b7305647638a4c730e7588cd4a4872e961517416;hpb=0a64405cadb8b7154031c648b3302bf6b2549f7d;p=flightgear.git diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index b73056476..af4e69345 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$ @@ -24,19 +24,21 @@ # include #endif -#include #include #include +#include #include #include #include #include #include #include +#include +#include +#include #include #include -#include #include #include #include @@ -44,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -56,7 +57,53 @@ #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])) { + // current aircraft-dir matches 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_DEBUG, "found path:" << aResource << " in aircraft dir: " << *it); + return p; + } + } // of aircraft path iteration + + return SGPath(); // not found + } +}; + //////////////////////////////////////////////////////////////////////// // Implementation of FGGlobals. //////////////////////////////////////////////////////////////////////// @@ -73,19 +120,16 @@ 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 ), - warp_delta( 0 ), time_params( NULL ), ephem( NULL ), mag( NULL ), matlib( NULL ), route_mgr( NULL ), current_panel( NULL ), - soundmgr( NULL ), ATC_mgr( NULL ), - AI_mgr( NULL ), controls( NULL ), viewmgr( NULL ), commands( SGCommandMgr::instance() ), @@ -95,7 +139,6 @@ FGGlobals::FGGlobals() : initial_waypoints( NULL ), scenery( NULL ), tile_mgr( NULL ), - io( new FGIO ), fontcache ( new FGFontCache ), navlist( NULL ), loclist( NULL ), @@ -103,10 +146,10 @@ FGGlobals::FGGlobals() : dmelist( NULL ), tacanlist( NULL ), carrierlist( NULL ), - channellist( NULL ), - airwaynet( NULL ), - multiplayer_mgr( NULL ) + channellist( NULL ) { + simgear::ResourceManager::instance()->addProvider(new AircraftResourceProvider()); + simgear::PropertyObjectBase::setDefaultRoot(props); } @@ -114,36 +157,37 @@ 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"); + SGSubsystem* ai = subsystem_mgr->remove("ai_model"); + if (ai) { + ai->unbind(); + delete ai; + } + + subsystem_mgr->shutdown(); + 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 soundmgr; delete ATC_mgr; - delete AI_mgr; + controls->unbind(); delete controls; - delete viewmgr; -// delete commands; - delete acmodel; - delete model_mgr; delete channel_options_list; delete initial_waypoints; - delete tile_mgr; delete scenery; - delete io; delete fontcache; delete navlist; @@ -153,8 +197,9 @@ FGGlobals::~FGGlobals() delete tacanlist; delete carrierlist; delete channellist; - delete airwaynet; - delete multiplayer_mgr; + + soundmgr->unbind(); + delete soundmgr; } @@ -180,9 +225,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 ); @@ -194,40 +243,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 @@ -256,6 +338,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 @@ -272,6 +359,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"); + } } @@ -285,14 +387,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 { @@ -300,13 +394,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 * @@ -315,4 +402,24 @@ FGGlobals::get_current_view () const return viewmgr->get_current_view(); } +long int FGGlobals::get_warp() const +{ + return fgGetInt("/sim/time/warp"); +} + +void FGGlobals::set_warp( long int w ) +{ + fgSetInt("/sim/time/warp", w); +} + +long int FGGlobals::get_warp_delta() const +{ + return fgGetInt("/sim/time/warp-delta"); +} + +void FGGlobals::set_warp_delta( long int d ) +{ + fgSetInt("/sim/time/warp-delta", d); +} + // end of globals.cxx