#include <Aircraft/controls.hxx>
#include <Airports/runways.hxx>
#include <Autopilot/route_mgr.hxx>
-#include <GUI/FGFontCache.hxx>
#include <GUI/gui.h>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Navaids/navlist.hxx>
#include <Viewer/renderer.hxx>
#include <Viewer/viewmgr.hxx>
-#include <Sound/sample_queue.hxx>
#include "globals.hxx"
#include "locale.hxx"
fg_root( "" ),
fg_home( "" ),
time_params( NULL ),
- ephem( NULL ),
- viewmgr( NULL ),
commands( SGCommandMgr::instance() ),
channel_options_list( NULL ),
initial_waypoints( NULL ),
- fontcache ( new FGFontCache ),
channellist( NULL ),
- haveUserSettings(false),
- _chatter_queue(NULL)
+ haveUserSettings(false)
{
SGPropertyNode* root = new SGPropertyNode;
props = SGPropertyNode_ptr(root);
// save user settings (unless already saved)
saveUserSettings();
- // 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.
- SGSubsystemRef ai = subsystem_mgr->get_subsystem("ai-model");
- if (ai) {
- subsystem_mgr->remove("ai-model");
- ai->unbind();
- ai.clear(); // ensure AI is deleted now, not at end of this method
- }
-
- subsystem_mgr->shutdown();
- subsystem_mgr->unbind();
-
- subsystem_mgr->remove("aircraft-model");
- subsystem_mgr->remove("tile-manager");
- subsystem_mgr->remove("model-manager");
- _tile_mgr.clear();
+ // stop OSG threading first, to avoid thread races while we tear down
+ // scene-graph pieces
osg::ref_ptr<osgViewer::Viewer> vw(renderer->getViewer());
if (vw) {
vw->stopThreading();
}
+ subsystem_mgr->shutdown();
+ subsystem_mgr->unbind();
+
+ subsystem_mgr->remove(FGTileMgr::subsystemName());
// don't cancel the pager until after shutdown, since AIModels (and
// potentially others) can queue delete requests on the pager.
if (vw && vw->getDatabasePager()) {
}
osgDB::Registry::instance()->clearObjectCache();
+ subsystem_mgr->remove(FGScenery::subsystemName());
// renderer touches subsystems during its destruction
set_renderer(NULL);
- _scenery.clear();
- _chatter_queue.clear();
delete subsystem_mgr;
subsystem_mgr = NULL; // important so ::get_subsystem returns NULL
delete channel_options_list;
delete initial_waypoints;
- delete fontcache;
delete channellist;
simgear::PropertyObjectBase::setDefaultRoot(NULL);
continue;
}
+ // tell the ResouceManager about the scenery path
+ // needed to load Models from this scenery path
+ simgear::ResourceManager::instance()->addBasePath(abspath.str(),
+ simgear::ResourceManager::PRIORITY_DEFAULT);
+
simgear::Dir dir(abspath);
SGPath terrainDir(dir.file("Terrain"));
SGPath objectsDir(dir.file("Objects"));
subsystem_mgr->add(name, subsystem, type, min_time_sec);
}
-SGSoundMgr *
-FGGlobals::get_soundmgr () const
-{
- return get_subsystem<SGSoundMgr>();
-}
-
SGEventMgr *
FGGlobals::get_event_mgr () const
{
}
}
-FGViewer *
-FGGlobals::get_current_view () const
-{
- return viewmgr->get_current_view();
-}
-
long int FGGlobals::get_warp() const
{
return fgGetInt("/sim/time/warp");
FGScenery* FGGlobals::get_scenery () const
{
- return _scenery.get();
+ return get_subsystem<FGScenery>();
}
-void FGGlobals::set_scenery ( FGScenery *s )
+FGTileMgr* FGGlobals::get_tile_mgr () const
{
- _scenery = s;
+ return get_subsystem<FGTileMgr>();
}
-FGTileMgr* FGGlobals::get_tile_mgr () const
+FGViewMgr *FGGlobals::get_viewmgr() const
{
- return _tile_mgr.get();
+ return get_subsystem<FGViewMgr>();
}
-void FGGlobals::set_tile_mgr ( FGTileMgr *t )
+flightgear::View* FGGlobals::get_current_view () const
{
- _tile_mgr = t;
+ FGViewMgr* vm = get_viewmgr();
+ return vm ? vm->get_current_view() : 0;
}
void FGGlobals::set_matlib( SGMaterialLib *m )
return get_subsystem<FGControls>();
}
-FGSampleQueue* FGGlobals::get_chatter_queue() const
-{
- return _chatter_queue;
-}
-
-void FGGlobals::set_chatter_queue(FGSampleQueue* queue)
-{
- _chatter_queue = queue;
-}
-
void FGGlobals::addListenerToCleanup(SGPropertyChangeListener* l)
{
_listeners_to_cleanup.push_back(l);