X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FMain%2Fglobals.cxx;h=33098d807ee09619d331933e3bc437f0ee78a381;hb=4fe615fff546df5e381f7fc9ddae92dd3dc36251;hp=e1536925a344dab7cea2b9d4a4c88b945c2780fb;hpb=6654ae5f491ae65668b0dc7e2330c02d08d8df04;p=flightgear.git diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index e1536925a..33098d807 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started July 2000. // -// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -16,13 +16,31 @@ // // 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include #include "globals.hxx" +#include "renderer.hxx" +#include "viewmgr.hxx" +#include "fg_props.hxx" +#include "fg_io.hxx" + + +//////////////////////////////////////////////////////////////////////// +// Implementation of FGGlobals. +//////////////////////////////////////////////////////////////////////// // global global :-) FGGlobals *globals; @@ -30,14 +48,213 @@ FGGlobals *globals; // Constructor FGGlobals::FGGlobals() : - freeze( false ), + renderer( new FGRenderer ), + subsystem_mgr( new SGSubsystemMgr ), + event_mgr( new SGEventMgr ), + sim_time_sec( 0.0 ), + fg_root( "" ), +#if defined(FX) && defined(XMESA) + fullscreen( true ), +#endif warp( 0 ), - warp_delta( 0 ) + warp_delta( 0 ), + time_params( NULL ), + ephem( NULL ), + mag( NULL ), + route_mgr( NULL ), + current_panel( NULL ), + soundmgr( NULL ), + airports( NULL ), + ATC_mgr( NULL ), + ATC_display( NULL ), + AI_mgr( NULL ), + controls( NULL ), + viewmgr( NULL ), + props( new SGPropertyNode ), + initial_state( NULL ), + locale( NULL ), + commands( SGCommandMgr::instance() ), + model_lib( NULL ), + acmodel( NULL ), + model_mgr( NULL ), + channel_options_list( NULL ), + initial_waypoints( NULL ), + scenery( NULL ), + tile_mgr( NULL ), + io( new FGIO ), + fontcache ( new FGFontCache ), + navlist( NULL ), + loclist( NULL ), + gslist( NULL ), + dmelist( NULL ), + mkrlist( NULL ), + tacanlist( NULL ), + carrierlist( NULL ), + fixlist( NULL ) { } // Destructor -FGGlobals::~FGGlobals() { +FGGlobals::~FGGlobals() +{ + delete soundmgr; + delete subsystem_mgr; + delete event_mgr; + delete initial_state; + delete props; + delete io; + delete fontcache; + delete renderer; + delete initial_waypoints; +} + + +// set the fg_root path +void FGGlobals::set_fg_root (const string &root) { + fg_root = root; + + // append /data to root if it exists + SGPath tmp( fg_root ); + tmp.append( "data" ); + tmp.append( "version" ); + if ( ulFileExists( tmp.c_str() ) ) { + fg_root += "/data"; + } + + fgSetString("/sim/fg-root", fg_root.c_str()); +} + +void FGGlobals::set_fg_scenery (const string &scenery) { + SGPath s; + if (scenery.empty()) { + s.set( fg_root ); + s.append( "Scenery" ); + } else + s.set( scenery ); + + string_list path_list = sgPathSplit( s.str() ); + 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() ); + + 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 ); + } + } + // 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(""); + } +} + + +FGRenderer * +FGGlobals::get_renderer () const +{ + return renderer; +} + +SGSubsystemMgr * +FGGlobals::get_subsystem_mgr () const +{ + return subsystem_mgr; +} + +SGSubsystem * +FGGlobals::get_subsystem (const char * name) +{ + return subsystem_mgr->get_subsystem(name); +} + +void +FGGlobals::add_subsystem (const char * name, + SGSubsystem * subsystem, + SGSubsystemMgr::GroupType type, + double min_time_sec) +{ + subsystem_mgr->add(name, subsystem, type, min_time_sec); +} + + +SGEventMgr * +FGGlobals::get_event_mgr () const +{ + return event_mgr; +} + + +// Save the current state as the initial state. +void +FGGlobals::saveInitialState () +{ + delete initial_state; + initial_state = new SGPropertyNode(); + + if (!copyProperties(props, initial_state)) + SG_LOG(SG_GENERAL, SG_ALERT, "Error saving initial state"); +} + + +// Restore the saved initial state, if any +void +FGGlobals::restoreInitialState () +{ + if ( initial_state == 0 ) { + SG_LOG(SG_GENERAL, SG_ALERT, + "No initial state available to restore!!!"); + 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 { + SG_LOG( SG_GENERAL, SG_INFO, + "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 * +FGGlobals::get_current_view () const +{ + return viewmgr->get_current_view(); } +// end of globals.cxx