// 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$
# include <config.h>
#endif
-#include <simgear/sound/soundmgr_openal.hxx>
#include <simgear/structure/commands.hxx>
#include <simgear/misc/sg_path.hxx>
#include <simgear/timing/sg_time.hxx>
#include <simgear/scene/material/matlib.hxx>
#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/structure/event_mgr.hxx>
+#include <simgear/sound/soundmgr_openal.hxx>
#include <Aircraft/controls.hxx>
#include <Airports/runways.hxx>
#include <Navaids/awynet.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
-#include <Airports/simple.hxx>
#include <Navaids/navlist.hxx>
-#include <Navaids/fixlist.hxx>
#include "globals.hxx"
#include "renderer.hxx"
// Constructor
FGGlobals::FGGlobals() :
+ props( new SGPropertyNode ),
+ initial_state( NULL ),
+ locale( NULL ),
renderer( new FGRenderer ),
subsystem_mgr( new SGSubsystemMgr ),
event_mgr( new SGEventMgr ),
+ soundmgr( new SGSoundMgr ),
sim_time_sec( 0.0 ),
fg_root( "" ),
warp( 0 ),
matlib( NULL ),
route_mgr( NULL ),
current_panel( NULL ),
- soundmgr( NULL ),
- airports( NULL ),
ATC_mgr( NULL ),
AI_mgr( NULL ),
controls( NULL ),
viewmgr( NULL ),
- props( new SGPropertyNode ),
- initial_state( NULL ),
- locale( NULL ),
commands( SGCommandMgr::instance() ),
acmodel( NULL ),
model_mgr( 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 ),
channellist( NULL ),
- fixlist( NULL ),
airwaynet( NULL ),
multiplayer_mgr( NULL )
{
// 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");
+ subsystem_mgr->unbind();
delete subsystem_mgr;
delete event_mgr;
delete time_params;
delete matlib;
delete route_mgr;
delete current_panel;
- delete soundmgr;
- delete airports;
delete ATC_mgr;
delete AI_mgr;
delete initial_waypoints;
delete tile_mgr;
delete scenery;
- delete io;
delete fontcache;
delete navlist;
delete loclist;
delete gslist;
delete dmelist;
- delete mkrlist;
delete tacanlist;
delete carrierlist;
delete channellist;
- delete fixlist;
delete airwaynet;
delete multiplayer_mgr;
+
+ soundmgr->unbind();
+ delete soundmgr;
}
tmp.append( "data" );
tmp.append( "version" );
if ( ulFileExists( tmp.c_str() ) ) {
+ fgGetNode("BAD_FG_ROOT", true)->setStringValue(fg_root);
fg_root += "/data";
- SG_LOG(SG_GENERAL, SG_WARN, "Warning: changing bad FG_ROOT/--fg-root to '"
- << fg_root << '\'');
+ fgGetNode("GOOD_FG_ROOT", true)->setStringValue(fg_root);
+ SG_LOG(SG_GENERAL, SG_ALERT, "***\n***\n*** Warning: changing bad FG_ROOT/--fg-root to '"
+ << fg_root << "'\n***\n***");
}
// remove /sim/fg-root before writing to prevent hijacking
ulDir *td = ulOpenDir( pt.c_str() );
ulDir *od = ulOpenDir( po.c_str() );
- if (td == NULL && od == NULL)
+ // "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 {
+ //else {
if (td != NULL) {
fg_scenery.push_back( pt.str() );
ulCloseDir( td );
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", ""]
subsystem_mgr->add(name, subsystem, type, min_time_sec);
}
+SGSoundMgr *
+FGGlobals::get_soundmgr () const
+{
+ return soundmgr;
+}
SGEventMgr *
FGGlobals::get_event_mgr () const