#include "fg_props.hxx"
#include "positioninit.hxx"
#include "subsystemFactory.hxx"
+#include "options.hxx"
using namespace flightgear;
{
frame_signal->fireValueChanged();
- SG_LOG( SG_GENERAL, SG_DEBUG, "Running Main Loop");
- SG_LOG( SG_GENERAL, SG_DEBUG, "======= ==== ====");
-
// compute simulated time (allowing for pause, warp, etc) and
// real elapsed time
double sim_dt, real_dt;
globals->get_subsystem_mgr()->update(sim_dt);
simgear::AtomicChangeListener::fireChangeListeners();
-
- SG_LOG( SG_GENERAL, SG_DEBUG, "" );
}
+static void initTerrasync()
+{
+ if (fgGetBool("/sim/fghome-readonly", false)) {
+ return;
+ }
+
+ // start TerraSync up now, so it can be synchronizing shared models
+ // and airports data in parallel with a nav-cache rebuild.
+ SGPath tsyncCache(globals->get_fg_home());
+ tsyncCache.append("terrasync-cache.xml");
+
+ // wipe the cache file if requested
+ if (flightgear::Options::sharedInstance()->isOptionSet("restore-defaults")) {
+ SG_LOG(SG_GENERAL, SG_INFO, "restore-defaults requested, wiping terrasync update cache at " <<
+ tsyncCache);
+ if (tsyncCache.exists()) {
+ tsyncCache.remove();
+ }
+ }
+
+ fgSetString("/sim/terrasync/cache-path", tsyncCache.c_str());
+
+ simgear::SGTerraSync* terra_sync = new simgear::SGTerraSync();
+ terra_sync->setRoot(globals->get_props());
+ globals->add_subsystem("terrasync", terra_sync);
+
+ terra_sync->bind();
+ terra_sync->init();
+
+ // add the terrasync root as a data path so data can be retrieved from it
+ std::string terraSyncDir(fgGetString("/sim/terrasync/scenery-dir"));
+ globals->append_data_path(terraSyncDir);
+}
static void registerMainLoop()
{
// per pass) and once everything has been initialized fgMainLoop from
// then on.
+static int idle_state = 0;
+
static void fgIdleFunction ( void ) {
// Specify our current idle function state. This is used to run all
// our initializations out of the idle callback so that we can get a
// splash screen up and running right away.
- static int idle_state = 0;
-
+
if ( idle_state == 0 ) {
if (guiInit())
{
}
} else if ( idle_state == 2 ) {
+ initTerrasync();
idle_state++;
fgSplashProgress("loading-nav-dat");
}
} else if ( idle_state == 4 ) {
- idle_state+=2;
- // based on the requested presets, calculate the true starting
- // lon, lat
- flightgear::initPosition();
- flightgear::initTowerLocationListener();
+ idle_state++;
TimeManager* t = new TimeManager;
globals->add_subsystem("time", t, SGSubsystemMgr::INIT);
- t->init(); // need to init now, not during initSubsystems
// Do some quick general initializations
if( !fgInitGeneral()) {
- SG_LOG( SG_GENERAL, SG_ALERT,
- "General initialization failed ..." );
- exit(-1);
+ throw sg_exception("General initialization failed");
}
////////////////////////////////////////////////////////////////////
// Initialize the material manager
////////////////////////////////////////////////////////////////////
globals->set_matlib( new SGMaterialLib );
- simgear::SGModelLib::init(globals->get_fg_root(), globals->get_props());
simgear::SGModelLib::setPanelFunc(FGPanelNode::load);
-
+
+ } else if (( idle_state == 5 ) || (idle_state == 2005)) {
+ idle_state+=2;
+ flightgear::initPosition();
+ flightgear::initTowerLocationListener();
+
+ simgear::SGModelLib::init(globals->get_fg_root(), globals->get_props());
+
+ TimeManager* timeManager = (TimeManager*) globals->get_subsystem("time");
+ timeManager->init();
+
////////////////////////////////////////////////////////////////////
// Initialize the TG scenery subsystem.
////////////////////////////////////////////////////////////////////
- simgear::SGTerraSync* terra_sync = new simgear::SGTerraSync(globals->get_props());
- globals->add_subsystem("terrasync", terra_sync);
+
globals->set_scenery( new FGScenery );
globals->get_scenery()->init();
globals->get_scenery()->bind();
globals->set_tile_mgr( new FGTileMgr );
-
- fgSplashProgress("loading-aircraft");
-
- } else if ( idle_state == 6 ) {
- idle_state++;
+
fgSplashProgress("creating-subsystems");
-
- } else if ( idle_state == 7 ) {
- idle_state++;
+ } else if (( idle_state == 7 ) || (idle_state == 2007)) {
+ bool isReset = (idle_state == 2007);
+ idle_state = 8; // from the next state on, reset & startup are identical
SGTimeStamp st;
st.stamp();
- fgCreateSubsystems();
+ fgCreateSubsystems(isReset);
SG_LOG(SG_GENERAL, SG_INFO, "Creating subsystems took:" << st.elapsedMSec());
fgSplashProgress("binding-subsystems");
fgSetBool("sim/sceneryloaded", false);
registerMainLoop();
}
+
+ if ( idle_state == 2000 ) {
+ fgStartNewReset();
+ idle_state = 2005;
+ }
}
+void fgResetIdleState()
+{
+ idle_state = 2000;
+ fgRegisterIdleHandler( &fgIdleFunction );
+}
+
+
static void upper_case_property(const char *name)
{
using namespace simgear;
globals->get_renderer()->addCamera(hackCam, false);
}
+// Propose NVIDIA Optimus to use high-end GPU
+#if defined(SG_WINDOWS)
+extern "C" {
+ _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
+}
+#endif
static void logToFile()
{
sglog().setLogLevels( SG_ALL, SG_ALERT );
globals = new FGGlobals;
- fgInitHome();
+ if (!fgInitHome()) {
+ return EXIT_FAILURE;
+ }
- // now home is initialised, we can log to a file inside it
- logToFile();
+ if (!fgGetBool("/sim/fghome-readonly")) {
+ // now home is initialised, we can log to a file inside it
+ logToFile();
+ }
std::string version;
#ifdef FLIGHTGEAR_VERSION
// Load the configuration parameters. (Command line options
// override config file options. Config file options override
// defaults.)
- if ( !fgInitConfig(argc, argv) ) {
- SG_LOG( SG_GENERAL, SG_ALERT, "Config option parsing failed ..." );
- exit(-1);
+ int configResult = fgInitConfig(argc, argv, false);
+ if (configResult == flightgear::FG_OPTIONS_ERROR) {
+ return EXIT_FAILURE;
+ } else if (configResult == flightgear::FG_OPTIONS_EXIT) {
+ return EXIT_SUCCESS;
}
-
+
// Initialize the Window/Graphics environment.
fgOSInit(&argc, argv);
_bootstrap_OSInit++;
// Clouds3D requires an alpha channel
fgOSOpenWindow(true /* request stencil buffer */);
-
+ fgOSResetProperties();
+
// Initialize the splash screen right away
fntInit();
fgSplashInit();
// pass control off to the master event handler
int result = fgOSMainLoop();
+ frame_signal.clear();
+ fgOSCloseWindow();
// clean up here; ensure we null globals to avoid
// confusing the atexit() handler