]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/fg_init.cxx
Initial commit of the new sound system, expect more updates to follow
[flightgear.git] / src / Main / fg_init.cxx
index 26a9425028d2dde692d95037856787739b750880..10bded7bb6b9970fb9dba081d8c6fc3112ed33c6 100644 (file)
@@ -35,6 +35,8 @@
 #if defined( _MSC_VER) || defined(__MINGW32__)
 #  include <direct.h>           // for getcwd()
 #  define getcwd _getcwd
+#  include <io.h>               // isatty()
+#  define isatty _isatty
 #endif
 
 // work around a stdc++ lib bug in some versions of linux, but doesn't
@@ -51,9 +53,6 @@
 #include <simgear/debug/logstream.hxx>
 #include <simgear/structure/exception.hxx>
 #include <simgear/structure/event_mgr.hxx>
-#include <simgear/math/point3d.hxx>
-#include <simgear/math/polar3d.hxx>
-#include <simgear/math/sg_geodesy.hxx>
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/misc/interpolator.hxx>
 #include <simgear/scene/material/matlib.hxx>
 #include <Navaids/navdb.hxx>
 #include <Navaids/navlist.hxx>
 #include <Navaids/fix.hxx>
+#include <Navaids/fixlist.hxx>
 #include <Scenery/scenery.hxx>
 #include <Scenery/tilemgr.hxx>
 #include <Scripting/NasalSys.hxx>
 #include <MultiPlayer/multiplaymgr.hxx>
 
 #include <Environment/environment_mgr.hxx>
+#include <Environment/ridge_lift.hxx>
 
 #include "fg_init.hxx"
 #include "fg_io.hxx"
 #include "renderer.hxx"
 #include "viewmgr.hxx"
 #include "main.hxx"
+#include "ATCDCL/commlist.hxx"
 
 #ifdef __APPLE__
 #  include <CoreFoundation/CoreFoundation.h>
 using std::string;
 
 class Sound;
+class SGSoundMgr;
 extern const char *default_root;
 float init_volume;
 
@@ -581,7 +584,7 @@ bool fgInitConfig ( int argc, char **argv ) {
     }
 
     SGPropertyNode autosave;
-#ifdef _MSC_VER
+#if defined( _MSC_VER ) || defined( __MINGW32__ )
     char *envp = ::getenv( "APPDATA" );
     if (envp != NULL ) {
         SGPath config( envp );
@@ -595,6 +598,10 @@ bool fgInitConfig ( int argc, char **argv ) {
         if (fg_home)
             config = fg_home;
 
+        SGPath home_export(config.str());
+        home_export.append("Export/dummy");
+        home_export.create_dir(0777);
+
         // Set /sim/fg-home and don't allow malign code to override it until
         // Nasal security is set up.  Use FG_HOME if necessary.
         SGPropertyNode *home = fgGetNode("/sim", true);
@@ -937,11 +944,10 @@ static bool fgSetPosFromCarrier( const string& carrier, const string& posid ) {
 // Set current_options lon/lat given an airport id and heading (degrees)
 static bool fgSetPosFromFix( const string& id )
 {
-  FGFix* fix;
-  
-  // set initial position from runway and heading
-  if ( !globals->get_fixlist()->query( id.c_str(), fix ) ) {
-    SG_LOG( SG_GENERAL, SG_ALERT, "Failed to locate NAV = " << id );
+  FGPositioned::TypeFilter fixFilter(FGPositioned::FIX);
+  FGPositioned* fix = FGPositioned::findNextWithPartialId(NULL, id, &fixFilter);
+  if (!fix) {
+    SG_LOG( SG_GENERAL, SG_ALERT, "Failed to locate fix = " << id );
     return false;
   }
   
@@ -949,7 +955,6 @@ static bool fgSetPosFromFix( const string& id )
   return true;
 }
 
-
 /**
  * Initialize vor/ndb/ils/fix list management and query systems (as
  * well as simple airport db list)
@@ -965,16 +970,16 @@ fgInitNav ()
     SGPath p_metar( globals->get_fg_root() );
     p_metar.append( "Airports/metar.dat" );
 
-    FGAirportList *airports = new FGAirportList();
-    globals->set_airports( airports );
-
-    fgAirportDBLoad( airports, aptdb.str(), p_metar.str() );
+// Initialise the frequency search map BEFORE reading
+// the airport database:
+    current_commlist = new FGCommList;
+    current_commlist->init( globals->get_fg_root() );
+    fgAirportDBLoad( aptdb.str(), current_commlist, p_metar.str() );
 
     FGNavList *navlist = new FGNavList;
     FGNavList *loclist = new FGNavList;
     FGNavList *gslist = new FGNavList;
     FGNavList *dmelist = new FGNavList;
-    FGNavList *mkrlist = new FGNavList;
     FGNavList *tacanlist = new FGNavList;
     FGNavList *carrierlist = new FGNavList;
     FGTACANList *channellist = new FGTACANList;
@@ -983,12 +988,11 @@ fgInitNav ()
     globals->set_loclist( loclist );
     globals->set_gslist( gslist );
     globals->set_dmelist( dmelist );
-    globals->set_mkrlist( mkrlist );
     globals->set_tacanlist( tacanlist );
     globals->set_carrierlist( carrierlist );
     globals->set_channellist( channellist );
 
-    if ( !fgNavDBInit(navlist, loclist, gslist, dmelist, mkrlist, tacanlist, carrierlist, channellist) ) {
+    if ( !fgNavDBInit(navlist, loclist, gslist, dmelist, tacanlist, carrierlist, channellist) ) {
         SG_LOG( SG_GENERAL, SG_ALERT,
                 "Problems loading one or more navigational database" );
     }
@@ -996,9 +1000,8 @@ fgInitNav ()
     SG_LOG(SG_GENERAL, SG_INFO, "  Fixes");
     SGPath p_fix( globals->get_fg_root() );
     p_fix.append( "Navaids/fix.dat" );
-    FGFixList *fixlist = new FGFixList;
-    fixlist->init( p_fix );
-    globals->set_fixlist( fixlist );
+    FGFixList fixlist;
+    fixlist.init( p_fix );  // adds fixes to the DB in positioned.cxx
 
     SG_LOG(SG_GENERAL, SG_INFO, "  Airways");
     SGPath p_awy( globals->get_fg_root() );
@@ -1186,6 +1189,9 @@ bool fgInitGeneral() {
     curr = curr->getChild("fg-current", 0, true);
     curr->setStringValue(cwd ? cwd : "");
     curr->setAttribute(SGPropertyNode::WRITE, false);
+
+    fgSetBool("/sim/startup/stdout-to-terminal", isatty(1));
+    fgSetBool("/sim/startup/stderr-to-terminal", isatty(2));
     return true;
 }
 
@@ -1279,7 +1285,7 @@ void fgInitFDM() {
     } else if ( model == "yasim" ) {
         cur_fdm_state = new YASim( dt );
     } else {
-        throw sg_throwable(string("Unrecognized flight model '") + model
+        throw sg_exception(string("Unrecognized flight model '") + model
                + "', cannot init flight dynamics model.");
     }
 }
@@ -1465,8 +1471,7 @@ bool fgInitSubsystems() {
 
     SGPath mpath( globals->get_fg_root() );
     mpath.append( "materials.xml" );
-    string season = fgGetString("/sim/startup/season", "summer");
-    if ( ! globals->get_matlib()->load(globals->get_fg_root(), mpath.str(), season.c_str(),
+    if ( ! globals->get_matlib()->load(globals->get_fg_root(), mpath.str(),
             globals->get_props()) ) {
         SG_LOG( SG_GENERAL, SG_ALERT, "Error loading material lib!" );
         exit(-1);
@@ -1489,6 +1494,7 @@ bool fgInitSubsystems() {
 
     globals->get_scenery()->get_scene_graph()
         ->addChild(simgear::Particles::getCommonRoot());
+    simgear::GlobalParticleCallback::setSwitch(fgGetNode("/sim/rendering/particles", true));
 
     ////////////////////////////////////////////////////////////////////
     // Initialize the flight model subsystem.
@@ -1508,6 +1514,12 @@ bool fgInitSubsystems() {
     // Initialize the weather modeling subsystem
     globals->add_subsystem("environment", new FGEnvironmentMgr);
 
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the ridge lift simulation.
+    ////////////////////////////////////////////////////////////////////
+
+    // Initialize the ridgelift subsystem
+    globals->add_subsystem("ridgelift", new FGRidgeLift);
 
     ////////////////////////////////////////////////////////////////////
     // Initialize the aircraft systems and instrumentation (before the
@@ -1524,13 +1536,17 @@ bool fgInitSubsystems() {
     globals->add_subsystem( "xml-autopilot", new FGXMLAutopilot );
     globals->add_subsystem( "route-manager", new FGRouteMgr );
 
-  
     ////////////////////////////////////////////////////////////////////
     // Initialize the view manager subsystem.
     ////////////////////////////////////////////////////////////////////
 
     fgInitView();
 
+    ////////////////////////////////////////////////////////////////////
+    // Initialize the Input-Output subsystem
+    ////////////////////////////////////////////////////////////////////
+    globals->add_subsystem( "io", new FGIO );
+
     ////////////////////////////////////////////////////////////////////
     // Create and register the logger.
     ////////////////////////////////////////////////////////////////////
@@ -1566,22 +1582,9 @@ bool fgInitSubsystems() {
     fgGetBool("/sim/rendering/bump-mapping", false);
 
 #ifdef ENABLE_AUDIO_SUPPORT
-    ////////////////////////////////////////////////////////////////////
-    // Initialize the sound subsystem.
-    ////////////////////////////////////////////////////////////////////
-
-    init_volume = fgGetFloat("/sim/sound/volume");
-    fgSetFloat("/sim/sound/volume", 0.0f);
-    globals->set_soundmgr(new SGSoundMgr);
-    globals->get_soundmgr()->init();
-    globals->get_soundmgr()->bind();
-
-
     ////////////////////////////////////////////////////////////////////
     // Initialize the sound-effects subsystem.
     ////////////////////////////////////////////////////////////////////
-
-    globals->add_subsystem("fx", new FGFX);
     globals->add_subsystem("voice", new FGVoiceMgr);
 #endif
 
@@ -1626,14 +1629,6 @@ bool fgInitSubsystems() {
     }
 
 
-    ////////////////////////////////////////////////////////////////////
-    // Initialize I/O subsystem.
-    ////////////////////////////////////////////////////////////////////
-
-    globals->get_io()->init();
-    globals->get_io()->bind();
-
-
     ////////////////////////////////////////////////////////////////////
     // Add a new 2D panel.
     ////////////////////////////////////////////////////////////////////
@@ -1672,6 +1667,19 @@ bool fgInitSubsystems() {
     ////////////////////////////////////////////////////////////////////
     globals->add_subsystem("replay", new FGReplay);
 
+
+    ////////////////////////////////////////////////////////////////////
+    // Add Sound Manager.
+    // Put the sound manager last so it can use the CPU while the GPU
+    // is processing the scenery (doubled the frame-rate for me) -EMH-
+    ////////////////////////////////////////////////////////////////////
+#ifdef ENABLE_AUDIO_SUPPORT
+    init_volume = fgGetFloat("/sim/sound/volume");
+    fgSetFloat("/sim/sound/volume", 0.0f);
+
+    globals->add_subsystem("soundmgr", new SGSoundMgr);
+#endif
+
     ////////////////////////////////////////////////////////////////////
     // Bind and initialize subsystems.
     ////////////////////////////////////////////////////////////////////
@@ -1778,6 +1786,14 @@ void reInit(void)  // from gui_local.cxx -- TODO merge with fgReInitSubsystems()
     int xsize = fgGetInt("/sim/startup/xsize");
     int ysize = fgGetInt("/sim/startup/ysize");
 
+    // viewports also needs to be saved/restored as
+    // restoreInitialState() overwrites these
+    SGPropertyNode *guiNode = new SGPropertyNode;
+    SGPropertyNode *cameraNode = new SGPropertyNode;
+    SGPropertyNode *cameraGroupNode = fgGetNode("/sim/rendering/camera-group");
+    copyProperties(cameraGroupNode->getChild("camera"), cameraNode);
+    copyProperties(cameraGroupNode->getChild("gui"), guiNode);
+
     globals->restoreInitialState();
 
     // update our position based on current presets
@@ -1788,6 +1804,12 @@ void reInit(void)  // from gui_local.cxx -- TODO merge with fgReInitSubsystems()
     fgSetInt("/sim/startup/xsize", xsize);
     fgSetInt("/sim/startup/ysize", ysize);
 
+    copyProperties(cameraNode, cameraGroupNode->getChild("camera"));
+    copyProperties(guiNode, cameraGroupNode->getChild("gui"));
+
+    delete guiNode;
+    delete cameraNode;
+
     SGTime *t = globals->get_time_params();
     delete t;
     t = fgInitTime();