]> git.mxchange.org Git - flightgear.git/commitdiff
Second update in attempt to create an aircraft selection dialog
authorehofman <ehofman>
Sun, 30 Mar 2003 12:49:05 +0000 (12:49 +0000)
committerehofman <ehofman>
Sun, 30 Mar 2003 12:49:05 +0000 (12:49 +0000)
  New panels are loaded now
  New 3D model gets loaded
  Reinitialize more subsystems
  Add reinit() to FGFX, sound gets reinitialized

  Still a lot needs to be done though.

src/Aircraft/aircraft.cxx
src/Cockpit/panel.hxx
src/Cockpit/panel_io.cxx
src/Cockpit/panel_io.hxx
src/Sound/fg_fx.cxx
src/Sound/fg_fx.hxx
src/Sound/fg_sound.hxx
src/Sound/soundmgr.cxx
src/Sound/soundmgr.hxx

index ac0a8fb16bae3cf5aa285b6d16ac3309a32df8a8..9b667c8f7e842dd64d4e79fa5694486c5dc8bf9a 100644 (file)
 
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
+#include <Main/viewmgr.hxx>
+#include <Sound/fg_fx.hxx>
+#include <Sound/soundmgr.hxx>
+#include <Cockpit/panel.hxx>
+#include <Cockpit/hud.hxx>
+#include <Cockpit/panel_io.hxx>
+#include <Model/acmodel.hxx>
+#include <Autopilot/newauto.hxx>
 #include <Main/fgfs.hxx>
 
 #include "aircraft.hxx"
 
-extern void fgInitFDM(void);
-class FGFX;
 
 // This is a record containing all the info for the aircraft currently
 // being operated
@@ -149,11 +155,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/c172/Panels/c172-vfr-panel.xml");
+
     if ( aircraft.size() > 0 ) {
         SGPath aircraft_path(globals->get_fg_root());
         aircraft_path.append("Aircraft");
@@ -173,19 +187,56 @@ 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/c172/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);
+    }
+
+    // Load the new 3D model
+    //
+    globals->get_aircraft_model()->unbind();
+    delete globals->get_aircraft_model();
+    globals->set_aircraft_model(new FGAircraftModel);
+    globals->get_aircraft_model()->init();
+    globals->get_aircraft_model()->bind();
+
+    // 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 );
 
+    // Reinitialize some subsystems
+    //
+    globals->get_viewmgr()->reinit();
+    globals->get_controls()->reset_all();
+    globals->get_autopilot()->reset();
+    globals->get_aircraft_model()->reinit();
+    globals->get_subsystem("fx")->reinit();
+
     fgReInitSubsystems();
 
     if ( !freeze ) {
index 80f80c6d0d246af3147ffcbd063e31e60c5739e6..12e1a27c92907054277bb976b9afa57a3ab879ea 100644 (file)
@@ -563,14 +563,6 @@ public:
 bool fgPanelVisible ();
 
 
-\f
-////////////////////////////////////////////////////////////////////////
-// The current panel, if any.
-////////////////////////////////////////////////////////////////////////
-
-extern FGPanel * current_panel;        // TODO: move to globals
-
-
 \f
 #endif // __PANEL_HXX
 
index f6b114645575d2ba478f306c779a889e7c009fcd..7bb8f27261712b0f99d1a7ff5348f6860d7073e3 100644 (file)
@@ -44,7 +44,7 @@
 
 #include <GUI/gui.h>
 
-#include "panel.hxx"
+// #include "panel.hxx"
 #include "panel_io.hxx"
 
 //built-in layers
index ab5dba87b70b34dbe24b67b17936b489f60939f2..8c38f8d99cae914c07235ffa6ddfce512840d716 100644 (file)
@@ -35,6 +35,8 @@
 
 SG_USING_STD(istream);
 
+class FGPanel;
+
 extern FGPanel * fgReadPanel (istream &input);
 extern FGPanel * fgReadPanel (const string &relative_path);
 
index 527a5f3a497db67a6099e5e223c0b88feb20ffa3..d13a56f81f7f0ad5e13ab14dc5df01f0ad5bd8ec 100644 (file)
@@ -83,6 +83,13 @@ FGFX::init()
    }
 }
 
+void
+FGFX::reinit()
+{
+   _sound.clear();
+   init();
+};
+
 void
 FGFX::bind ()
 {
index e3c1e7bc6e8e973428685b7a367e3b83494c1f69..1dcfad9cc8f5afe43ae1667ecdbd476c9205e328 100644 (file)
@@ -44,6 +44,7 @@ public:
   virtual ~FGFX ();
 
   virtual void init ();
+  virtual void reinit ();
   virtual void bind ();
   virtual void unbind ();
   virtual void update (double dt);
index 4d4824bb4ef8ee896aa1a4205a1770a0c5a85875..d8f71357d7de3823f23c436d302ac2f7d5ce4009 100644 (file)
@@ -53,6 +53,8 @@ public:
   virtual void unbind ();
   virtual void update (double dt);
 
+  void stop();
+
 protected:
 
   enum { MAXPROP=5 };
index 94e3099a1db6258fffda4142e583d1009cfe2dce..b303a11cdcfe8acf06b38fd16d24df29969c31d7 100644 (file)
@@ -140,6 +140,7 @@ FGSoundMgr::~FGSoundMgr() {
         FGSimpleSound *s = sound_current->second;
 
         audio_sched->stopSample(s->get_sample());
+        delete s->get_sample();
         delete s;
     }
 
@@ -163,6 +164,8 @@ void FGSoundMgr::init() {
     sample_map_iterator sample_end = samples.end();
     for ( ; sample_current != sample_end; ++sample_current ) {
         sample_ref *sr = sample_current->second;
+
+        audio_sched->stopSample(sr->sample);
         delete sr->sample;
         delete sr;
     }
@@ -175,6 +178,8 @@ void FGSoundMgr::init() {
     sound_map_iterator sound_end = sounds.end();
     for ( ; sound_current != sound_end; ++sound_current ) {
        FGSimpleSound *s = sound_current->second;
+
+        audio_sched->stopSample(s->get_sample());
        delete s->get_sample();
        delete s;
     }
@@ -182,11 +187,13 @@ void FGSoundMgr::init() {
 
 }
 
+
 void FGSoundMgr::bind ()
 {
   // no properties yet
 }
 
+
 void FGSoundMgr::unbind ()
 {
   // no properties yet
index 3e89b225bbc63a3ad70b5359580caa6602436946..0cfa7f4680a13f6e973dccd3d7f853a395aea69a 100644 (file)
@@ -123,7 +123,7 @@ public:
 
 
     /**
-     * Initialize the sound manager.
+     * (re) initialize the sound manager.
      */
     void init();
 
@@ -161,6 +161,9 @@ public:
     // is audio working?
     inline bool is_working() const { return !audio_sched->notWorking(); }
 
+    // reinitialize the sound manager
+    inline void reinit() { init(); }
+
     // add a sound effect, return true if successful
     bool add( FGSimpleSound *sound, const string& refname);