]> git.mxchange.org Git - flightgear.git/blob - src/Main/globals.cxx
Remove all name and spatial queries from FGNavList. All remaining queries are
[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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 //
21 // $Id$
22
23 #ifdef HAVE_CONFIG_H
24 #  include <config.h>
25 #endif
26
27 #include <simgear/sound/soundmgr_openal.hxx>
28 #include <simgear/structure/commands.hxx>
29 #include <simgear/misc/sg_path.hxx>
30 #include <simgear/timing/sg_time.hxx>
31 #include <simgear/ephemeris/ephemeris.hxx>
32 #include <simgear/magvar/magvar.hxx>
33 #include <simgear/scene/material/matlib.hxx>
34 #include <simgear/structure/subsystem_mgr.hxx>
35 #include <simgear/structure/event_mgr.hxx>
36
37 #include <Aircraft/controls.hxx>
38 #include <Airports/runways.hxx>
39 #include <ATCDCL/AIMgr.hxx>
40 #include <ATCDCL/ATCmgr.hxx>
41 #include <Autopilot/route_mgr.hxx>
42 #include <Cockpit/panel.hxx>
43 #include <GUI/new_gui.hxx>
44 #include <Model/acmodel.hxx>
45 #include <Model/modelmgr.hxx>
46 #include <MultiPlayer/multiplaymgr.hxx>
47 #include <Navaids/awynet.hxx>
48 #include <Scenery/scenery.hxx>
49 #include <Scenery/tilemgr.hxx>
50 #include <Airports/simple.hxx>
51 #include <Navaids/navlist.hxx>
52 #include <Navaids/fixlist.hxx>
53
54 #include "globals.hxx"
55 #include "renderer.hxx"
56 #include "viewmgr.hxx"
57
58 #include "fg_props.hxx"
59 #include "fg_io.hxx"
60
61 \f
62 ////////////////////////////////////////////////////////////////////////
63 // Implementation of FGGlobals.
64 ////////////////////////////////////////////////////////////////////////
65
66 // global global :-)
67 FGGlobals *globals;
68
69
70 // Constructor
71 FGGlobals::FGGlobals() :
72     renderer( new FGRenderer ),
73     subsystem_mgr( new SGSubsystemMgr ),
74     event_mgr( new SGEventMgr ),
75     sim_time_sec( 0.0 ),
76     fg_root( "" ),
77     warp( 0 ),
78     warp_delta( 0 ),
79     time_params( NULL ),
80     ephem( NULL ),
81     mag( NULL ),
82     matlib( NULL ),
83     route_mgr( NULL ),
84     current_panel( NULL ),
85     soundmgr( NULL ),
86     airports( NULL ),
87     ATC_mgr( NULL ),
88     AI_mgr( NULL ),
89     controls( NULL ),
90     viewmgr( NULL ),
91     props( new SGPropertyNode ),
92     initial_state( NULL ),
93     locale( NULL ),
94     commands( SGCommandMgr::instance() ),
95     acmodel( NULL ),
96     model_mgr( NULL ),
97     channel_options_list( NULL ),
98     initial_waypoints( NULL ),
99     scenery( NULL ),
100     tile_mgr( NULL ),
101     io( new FGIO ),
102     fontcache ( new FGFontCache ),
103     navlist( NULL ),
104     loclist( NULL ),
105     gslist( NULL ),
106     dmelist( NULL ),
107     tacanlist( NULL ),
108     carrierlist( NULL ),
109     channellist( NULL ),
110     airwaynet( NULL ),
111     multiplayer_mgr( NULL )
112 {
113 }
114
115
116 // Destructor
117 FGGlobals::~FGGlobals() 
118 {
119     delete renderer;
120 // The AIModels manager performs a number of actions upon
121     // Shutdown that implicitly assume that other subsystems
122     // are still operational (Due to the dynamic allocation and
123     // deallocation of AIModel objects. To ensure we can safely
124     // shut down all subsystems, make sure we take down the 
125     // AIModels system first.
126     subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("ai_model");
127     delete subsystem_mgr;
128     delete event_mgr;
129     delete time_params;
130     delete ephem;
131     delete mag;
132     delete matlib;
133     delete route_mgr;
134     delete current_panel;
135     delete soundmgr;
136     delete airports;
137
138     delete ATC_mgr;
139     delete AI_mgr;
140     delete controls;
141     delete viewmgr;
142
143 //     delete commands;
144     delete acmodel;
145     delete model_mgr;
146     delete channel_options_list;
147     delete initial_waypoints;
148     delete tile_mgr;
149     delete scenery;
150     delete io;
151     delete fontcache;
152
153     delete navlist;
154     delete loclist;
155     delete gslist;
156     delete dmelist;
157     delete tacanlist;
158     delete carrierlist;
159     delete channellist;
160     delete airwaynet;
161     delete multiplayer_mgr;
162 }
163
164
165 // set the fg_root path
166 void FGGlobals::set_fg_root (const string &root) {
167     fg_root = root;
168
169     // append /data to root if it exists
170     SGPath tmp( fg_root );
171     tmp.append( "data" );
172     tmp.append( "version" );
173     if ( ulFileExists( tmp.c_str() ) ) {
174         fg_root += "/data";
175         SG_LOG(SG_GENERAL, SG_WARN, "Warning: changing bad FG_ROOT/--fg-root to '"
176                 << fg_root << '\'');
177     }
178
179     // remove /sim/fg-root before writing to prevent hijacking
180     SGPropertyNode *n = fgGetNode("/sim", true);
181     n->removeChild("fg-root", 0, false);
182     n = n->getChild("fg-root", 0, true);
183     n->setStringValue(fg_root.c_str());
184     n->setAttribute(SGPropertyNode::WRITE, false);
185 }
186
187 void FGGlobals::set_fg_scenery (const string &scenery) {
188     SGPath s;
189     if (scenery.empty()) {
190         s.set( fg_root );
191         s.append( "Scenery" );
192     } else
193         s.set( scenery );
194
195     string_list path_list = sgPathSplit( s.str() );
196     fg_scenery.clear();
197
198     for (unsigned i = 0; i < path_list.size(); i++) {
199
200         ulDir *d = ulOpenDir( path_list[i].c_str() );
201         if (d == NULL)
202             continue;
203         ulCloseDir( d );
204
205         SGPath pt( path_list[i] ), po( path_list[i] );
206         pt.append("Terrain");
207         po.append("Objects");
208
209         ulDir *td = ulOpenDir( pt.c_str() );
210         ulDir *od = ulOpenDir( po.c_str() );
211
212         if (td == NULL && od == NULL)
213             fg_scenery.push_back( path_list[i] );
214         else {
215             if (td != NULL) {
216                 fg_scenery.push_back( pt.str() );
217                 ulCloseDir( td );
218             }
219             if (od != NULL) {
220                 fg_scenery.push_back( po.str() );
221                 ulCloseDir( od );
222             }
223         }
224         // insert a marker for FGTileEntry::load(), so that
225         // FG_SCENERY=A:B becomes list ["A/Terrain", "A/Objects", "",
226         // "B/Terrain", "B/Objects", ""]
227         fg_scenery.push_back("");
228     }
229 }
230
231
232 FGRenderer *
233 FGGlobals::get_renderer () const
234 {
235    return renderer;
236 }
237
238 SGSubsystemMgr *
239 FGGlobals::get_subsystem_mgr () const
240 {
241     return subsystem_mgr;
242 }
243
244 SGSubsystem *
245 FGGlobals::get_subsystem (const char * name)
246 {
247     return subsystem_mgr->get_subsystem(name);
248 }
249
250 void
251 FGGlobals::add_subsystem (const char * name,
252                           SGSubsystem * subsystem,
253                           SGSubsystemMgr::GroupType type,
254                           double min_time_sec)
255 {
256     subsystem_mgr->add(name, subsystem, type, min_time_sec);
257 }
258
259
260 SGEventMgr *
261 FGGlobals::get_event_mgr () const
262 {
263     return event_mgr;
264 }
265
266
267 // Save the current state as the initial state.
268 void
269 FGGlobals::saveInitialState ()
270 {
271   initial_state = new SGPropertyNode();
272
273   if (!copyProperties(props, initial_state))
274     SG_LOG(SG_GENERAL, SG_ALERT, "Error saving initial state");
275 }
276
277
278 // Restore the saved initial state, if any
279 void
280 FGGlobals::restoreInitialState ()
281 {
282     if ( initial_state == 0 ) {
283         SG_LOG(SG_GENERAL, SG_ALERT,
284                "No initial state available to restore!!!");
285         return;
286     }
287
288     SGPropertyNode *currentPresets = new SGPropertyNode;
289     SGPropertyNode *targetNode = fgGetNode( "/sim/presets" );
290
291     // stash the /sim/presets tree
292     if ( !copyProperties(targetNode, currentPresets) ) {
293         SG_LOG( SG_GENERAL, SG_ALERT, "Failed to save /sim/presets subtree" );
294     }
295     
296     if ( copyProperties(initial_state, props) ) {
297         SG_LOG( SG_GENERAL, SG_INFO, "Initial state restored successfully" );
298     } else {
299         SG_LOG( SG_GENERAL, SG_INFO,
300                 "Some errors restoring initial state (read-only props?)" );
301     }
302
303     // recover the /sim/presets tree
304     if ( !copyProperties(currentPresets, targetNode) ) {
305         SG_LOG( SG_GENERAL, SG_ALERT,
306                 "Failed to restore /sim/presets subtree" );
307     }
308
309    delete currentPresets;
310 }
311
312 FGViewer *
313 FGGlobals::get_current_view () const
314 {
315   return viewmgr->get_current_view();
316 }
317
318 // end of globals.cxx