]> git.mxchange.org Git - flightgear.git/blob - src/Main/globals.cxx
Martin Spott: Use standardized Sun directive.
[flightgear.git] / src / Main / globals.cxx
1 // globals.cxx -- Global state that needs to be shared among the sim modules
2 //
3 // Written by Curtis Olson, started July 2000.
4 //
5 // Copyright (C) 2000  Curtis L. Olson - http://www.flightgear.org/~curt
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 //
21 // $Id$
22
23
24 #include <simgear/sound/soundmgr_openal.hxx>
25 #include <simgear/structure/commands.hxx>
26 #include <simgear/misc/sg_path.hxx>
27
28 #include "globals.hxx"
29 #include "renderer.hxx"
30 #include "viewmgr.hxx"
31
32 #include "fg_props.hxx"
33 #include "fg_io.hxx"
34
35 \f
36 ////////////////////////////////////////////////////////////////////////
37 // Implementation of FGGlobals.
38 ////////////////////////////////////////////////////////////////////////
39
40 // global global :-)
41 FGGlobals *globals;
42
43
44 // Constructor
45 FGGlobals::FGGlobals() :
46     renderer( new FGRenderer ),
47     subsystem_mgr( new SGSubsystemMgr ),
48     event_mgr( new SGEventMgr ),
49     sim_time_sec( 0.0 ),
50     fg_root( "" ),
51 #if defined(FX) && defined(XMESA)
52     fullscreen( true ),
53 #endif
54     warp( 0 ),
55     warp_delta( 0 ),
56     time_params( NULL ),
57     ephem( NULL ),
58     mag( NULL ),
59     route_mgr( NULL ),
60     current_panel( NULL ),
61     soundmgr( NULL ),
62     airports( NULL ),
63     ATC_mgr( NULL ),
64     ATC_display( NULL ),
65     AI_mgr( NULL ),
66     controls( NULL ),
67     viewmgr( NULL ),
68     props( new SGPropertyNode ),
69     initial_state( NULL ),
70     locale( NULL ),
71     commands( new SGCommandMgr ),
72     model_lib( NULL ),
73     acmodel( NULL ),
74     model_mgr( NULL ),
75     channel_options_list( NULL ),
76     initial_waypoints( NULL ),
77     scenery( NULL ),
78     tile_mgr( NULL ),
79     io( new FGIO ),
80     navlist( NULL ),
81     loclist( NULL ),
82     gslist( NULL ),
83     dmelist( NULL ),
84     mkrlist( NULL ),
85     tacanlist( NULL ),
86     carrierlist( NULL ), 
87     fixlist( NULL )
88 {
89 }
90
91
92 // Destructor
93 FGGlobals::~FGGlobals() 
94 {
95     delete soundmgr;
96     delete subsystem_mgr;
97     delete event_mgr;
98     delete initial_state;
99     delete props;
100     delete commands;
101     delete io;
102     delete renderer;
103     delete initial_waypoints;
104 }
105
106
107 // set the fg_root path
108 void FGGlobals::set_fg_root (const string &root) {
109     fg_root = root;
110     
111     // append /data to root if it exists
112     SGPath tmp( fg_root );
113     tmp.append( "data" );
114     tmp.append( "version" );
115     if ( ulFileExists( tmp.c_str() ) ) {
116         fg_root += "/data";
117         }
118 }
119
120 void FGGlobals::set_fg_scenery (const string &scenery) {
121     SGPath s;
122     if (scenery.empty()) {
123         s.set( fg_root );
124         s.append( "Scenery" );
125     } else
126         s.set( scenery );
127
128     string_list path_list = sgPathSplit( s.str() );
129     fg_scenery.clear();
130
131     for (unsigned i = 0; i < path_list.size(); i++) {
132
133         ulDir *d = ulOpenDir( path_list[i].c_str() );
134         if (d == NULL)
135             continue;
136         ulCloseDir( d );
137
138         SGPath pt( path_list[i] ), po( path_list[i] );
139         pt.append("Terrain");
140         po.append("Objects");
141
142         ulDir *td = ulOpenDir( pt.c_str() );
143         ulDir *od = ulOpenDir( po.c_str() );
144
145         if (td == NULL && od == NULL)
146             fg_scenery.push_back( path_list[i] );
147         else {
148             if (td != NULL) {
149                 fg_scenery.push_back( pt.str() );
150                 ulCloseDir( td );
151             }
152             if (od != NULL) {
153                 fg_scenery.push_back( po.str() );
154                 ulCloseDir( od );
155             }
156         }
157     }
158 }
159
160
161 FGRenderer *
162 FGGlobals::get_renderer () const
163 {
164    return renderer;
165 }
166
167 SGSubsystemMgr *
168 FGGlobals::get_subsystem_mgr () const
169 {
170     return subsystem_mgr;
171 }
172
173 SGSubsystem *
174 FGGlobals::get_subsystem (const char * name)
175 {
176     return subsystem_mgr->get_subsystem(name);
177 }
178
179 void
180 FGGlobals::add_subsystem (const char * name,
181                           SGSubsystem * subsystem,
182                           SGSubsystemMgr::GroupType type,
183                           double min_time_sec)
184 {
185     subsystem_mgr->add(name, subsystem, type, min_time_sec);
186 }
187
188
189 SGEventMgr *
190 FGGlobals::get_event_mgr () const
191 {
192     return event_mgr;
193 }
194
195
196 // Save the current state as the initial state.
197 void
198 FGGlobals::saveInitialState ()
199 {
200   delete initial_state;
201   initial_state = new SGPropertyNode();
202
203   if (!copyProperties(props, initial_state))
204     SG_LOG(SG_GENERAL, SG_ALERT, "Error saving initial state");
205 }
206
207
208 // Restore the saved initial state, if any
209 void
210 FGGlobals::restoreInitialState ()
211 {
212     if ( initial_state == 0 ) {
213         SG_LOG(SG_GENERAL, SG_ALERT,
214                "No initial state available to restore!!!");
215         return;
216     }
217
218     SGPropertyNode *currentPresets = new SGPropertyNode;
219     SGPropertyNode *targetNode = fgGetNode( "/sim/presets" );
220
221     // stash the /sim/presets tree
222     if ( !copyProperties(targetNode, currentPresets) ) {
223         SG_LOG( SG_GENERAL, SG_ALERT, "Failed to save /sim/presets subtree" );
224     }
225     
226     if ( copyProperties(initial_state, props) ) {
227         SG_LOG( SG_GENERAL, SG_INFO, "Initial state restored successfully" );
228     } else {
229         SG_LOG( SG_GENERAL, SG_INFO,
230                 "Some errors restoring initial state (read-only props?)" );
231     }
232
233     // recover the /sim/presets tree
234     if ( !copyProperties(currentPresets, targetNode) ) {
235         SG_LOG( SG_GENERAL, SG_ALERT,
236                 "Failed to restore /sim/presets subtree" );
237     }
238
239    delete currentPresets;
240 }
241
242 FGViewer *
243 FGGlobals::get_current_view () const
244 {
245   return viewmgr->get_current_view();
246 }
247
248 // end of globals.cxx