]> git.mxchange.org Git - flightgear.git/blobdiff - src/Aircraft/aircraft.cxx
Make FGAircraftModel more subsystem-alike, move update to fgMainLoop.
[flightgear.git] / src / Aircraft / aircraft.cxx
index 6679d6486c8f3e578ed1c470807a07c91f9a8049..c3514e29afcc75d02f89075efce8e14a4b170c37 100644 (file)
@@ -2,7 +2,7 @@
 //
 // Written by Curtis Olson, started May 1997.
 //
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
+// Copyright (C) 1997  Curtis L. Olson  - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 //
 // 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
 
-#include <stdio.h>
-#include <string.h>            // strdup
+#include <cstdio>
+#include <cstring>             // strdup
 
 #include <plib/ul.h>
-#include <plib/ssg.h>
 
 #include <simgear/constants.h>
 #include <simgear/debug/logstream.hxx>
 #include <simgear/misc/sg_path.hxx>
-#include <simgear/misc/commands.hxx>
-#include <simgear/misc/exception.hxx>
+#include <simgear/structure/commands.hxx>
+#include <simgear/structure/exception.hxx>
+#include <simgear/sound/soundmgr_openal.hxx>
 
 #include <Main/globals.hxx>
+#include <Main/fg_init.hxx>
 #include <Main/fg_props.hxx>
-#include <Main/fgfs.hxx>
+#include <Main/viewmgr.hxx>
+#include <Cockpit/panel.hxx>
+#include <Cockpit/hud.hxx>
+#include <Cockpit/panel_io.hxx>
+#include <Model/acmodel.hxx>
 
 #include "aircraft.hxx"
 
-extern void fgInitFDM(void);
-class FGFX;
 
 // This is a record containing all the info for the aircraft currently
 // being operated
@@ -84,7 +90,7 @@ void fgAircraftOutputCurrent(fgAIRCRAFT *a) {
 // Show available aircraft types
 void fgReadAircraft(void) {
 
-   SGPropertyNode *aircraft_types = fgGetNode("/sim/aircraft-types", true);
+   // SGPropertyNode *aircraft_types = fgGetNode("/sim/aircraft-types", true);
 
    SGPath path( globals->get_fg_root() );
    path.append("Aircraft");
@@ -121,10 +127,8 @@ void fgReadAircraft(void) {
              SGPropertyNode *desc = node->getNode("description");
 
              if (desc) {
-#endif
-                SGPropertyNode *aircraft =
+                 SGPropertyNode *aircraft =
                                 aircraft_types->getChild(dire->d_name, 0, true);
-#if 0
 
                 aircraft->setStringValue(strdup(desc->getStringValue()));
              }
@@ -138,7 +142,7 @@ void fgReadAircraft(void) {
    globals->get_commands()->addCommand("load-aircraft", fgLoadAircraft);
 }
 
-static inline bool
+bool
 fgLoadAircraft (const SGPropertyNode * arg)
 {
     static const SGPropertyNode *master_freeze
@@ -149,11 +153,19 @@ fgLoadAircraft (const SGPropertyNode * arg)
         fgSetBool("/sim/freeze/master", true);
     }
 
+    // TODO:
+    //    remove electrical system
     cur_fdm_state->unbind();
 
+    // Save the selected aircraft model since restoreInitialState
+    // will obverwrite it.
+    //
     string aircraft = fgGetString("/sim/aircraft", "");
     globals->restoreInitialState();
 
+    fgSetString("/sim/aircraft", aircraft.c_str());
+    fgSetString("/sim/panel/path", "Aircraft/c172p/Panels/c172-vfr-panel.xml");
+
     if ( aircraft.size() > 0 ) {
         SGPath aircraft_path(globals->get_fg_root());
         aircraft_path.append("Aircraft");
@@ -173,19 +185,43 @@ fgLoadAircraft (const SGPropertyNode * arg)
         SG_LOG(SG_INPUT, SG_ALERT, "No default aircraft specified");
     }
 
-    // Update the FDM
+    // Initialize the (new) 2D panel.
+    //
+    string panel_path = fgGetString("/sim/panel/path",
+                                    "Aircraft/c172p/Panels/c172-vfr-panel.xml");
+
+    FGPanel *panel = fgReadPanel(panel_path);
+    if (panel == 0) {
+        SG_LOG( SG_INPUT, SG_ALERT,
+                "Error reading new panel from " << panel_path );
+    } else {
+        SG_LOG( SG_INPUT, SG_INFO, "Loaded new panel from " << panel_path );
+        globals->get_current_panel()->unbind();
+        delete globals->get_current_panel();
+        globals->set_current_panel( panel );
+        globals->get_current_panel()->init();
+        globals->get_current_panel()->bind();
+        globals->get_current_panel()->update(0);
+    }
+
+    globals->get_aircraft_model()->reinit();
+        
+    // TODO:
+    //    load new electrical system
     //
-    fgSetString("/sim/aircraft", aircraft.c_str());
-    fgInitFDM();
 
     // update our position based on current presets
     fgInitPosition();
 
+    // Update the HUD
+    fgHUDInit(&current_aircraft);
+
     SGTime *t = globals->get_time_params();
     delete t;
     t = fgInitTime();
     globals->set_time_params( t );
 
+    globals->get_subsystem("xml-autopilot")->reinit();
     fgReInitSubsystems();
 
     if ( !freeze ) {