]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/main.cxx
Added a specific "altas" format for output which includes a proprietary string
[flightgear.git] / src / Main / main.cxx
index 96d8fe16e59ad4ffe32e83365cb2dd00bf05f489..419614ed303a4fff1afd412bb1d99adbe61cdcf4 100644 (file)
@@ -81,6 +81,7 @@
 
 #include <FDM/UIUCModel/uiuc_aircraftdir.h>
 #include <GUI/gui.h>
+#include <GUI/sgVec3Slider.hxx>
 #include <Joystick/joystick.hxx>
 #ifdef FG_NETWORK_OLK
 #include <NetworkOLK/network.h>
@@ -135,14 +136,11 @@ FGGeneral general;
 // our initializations out of the glutIdleLoop() so that we can get a
 // splash screen up and running right away.
 static int idle_state = 0;
-static int global_multi_loop;
+static long global_multi_loop;
 
 // attempt to avoid a large bounce at startup
 static bool initial_freeze = true;
 
-// Another hack
-int use_signals = 0;
-
 // forward declaration
 void fgReshape( int width, int height );
 
@@ -271,7 +269,7 @@ void fgInitVisuals( void ) {
 
 #ifndef GLUT_WRONG_VERSION
     // Go full screen if requested ...
-    if ( globals->get_options()->get_fullscreen() ) {
+    if ( fgGetBool("/sim/startup/fullscreen") ) {
        glutFullScreen();
     }
 #endif
@@ -290,14 +288,14 @@ void fgInitVisuals( void ) {
 
     // glFogi (GL_FOG_MODE, GL_LINEAR);
     glFogi (GL_FOG_MODE, GL_EXP2);
-    if ( (globals->get_options()->get_fog() == 1) || 
-        (globals->get_options()->get_shading() == 0) ) {
+    if ( (fgGetString("/sim/rendering/fog") == "disabled") || 
+        (!fgGetBool("/sim/rendering/shading"))) {
        // if fastest fog requested, or if flat shading force fastest
        glHint ( GL_FOG_HINT, GL_FASTEST );
-    } else if ( globals->get_options()->get_fog() == 2 ) {
+    } else if ( fgGetString("/sim/rendering/fog") == "nicest" ) {
        glHint ( GL_FOG_HINT, GL_NICEST );
     }
-    if ( globals->get_options()->get_wireframe() ) {
+    if ( fgGetBool("/sim/rendering/wireframe") ) {
        // draw wire frame
        glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
     }
@@ -333,7 +331,7 @@ void fgRenderFrame( void ) {
     
     if ( idle_state != 1000 ) {
        // still initializing, draw the splash screen
-       if ( globals->get_options()->get_splash_screen() == 1 ) {
+       if ( fgGetBool("/sim/startup/splash-screen") ) {
            fgSplashUpdate(0.0);
        }
     } else {
@@ -380,7 +378,8 @@ void fgRenderFrame( void ) {
                       cur_fdm_state->get_Psi() * RAD_TO_DEG,
                       wup );
        sgVec3 npo;             // new pilot offset after rotation
-       sgXformVec3( po, po, pilot_view->get_UP() );
+        sgVec3 *pPO = PilotOffsetGet();
+       sgXformVec3( po, *pPO, pilot_view->get_UP() );
        sgXformVec3( npo, po, CXFM );
 
        chase_view->set_geod_view_pos( cur_fdm_state->get_Longitude(), 
@@ -418,24 +417,24 @@ void fgRenderFrame( void ) {
 #endif
 
        // update view port
-       fgReshape( globals->get_options()->get_xsize(),
-                  globals->get_options()->get_ysize() );
+       fgReshape( fgGetInt("/sim/startup/xsize"),
+                  fgGetInt("/sim/startup/ysize") );
 
 #if 0
        // swing and a miss
 
        if ( ! fgPanelVisible() ) {
            xglViewport( 0, 0 ,
-                        (GLint)(globals->get_options()->get_xsize()),
-                        (GLint)(globals->get_options()->get_ysize()) );
+                        (GLint)(fgGetInt("/sim/startup/xsize")),
+                        (GLint)(fgGetInt("/sim/startup/ysize")) );
        } else {
            int view_h =
                int( (current_panel->getViewHeight() -
                      current_panel->getYOffset())
-                    * (globals->get_options()->get_ysize() / 768.0) );
+                    * (fgGetInt("/sim/startup/ysize") / 768.0) );
            glViewport( 0, 
-                       (GLint)(globals->get_options()->get_ysize() - view_h),
-                       (GLint)(globals->get_options()->get_xsize()),
+                       (GLint)(fgGetInt("/sim/startup/ysize") - view_h),
+                       (GLint)(fgGetInt("/sim/startup/xsize")),
                        (GLint)(view_h) );
        }
 #endif
@@ -444,12 +443,12 @@ void fgRenderFrame( void ) {
        glLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
 
        clear_mask = GL_DEPTH_BUFFER_BIT;
-       if ( globals->get_options()->get_wireframe() ) {
+       if ( fgGetBool("/sim/rendering/wireframe") ) {
            clear_mask |= GL_COLOR_BUFFER_BIT;
        }
 
-       if ( globals->get_options()->get_skyblend() ) {
-           if ( globals->get_options()->get_textures() ) {
+       if ( fgGetBool("/sim/rendering/skyblend") ) {
+           if ( fgGetBool("/sim/rendering/textures") ) {
                // glClearColor(black[0], black[1], black[2], black[3]);
                glClearColor(l->adj_fog_color[0], l->adj_fog_color[1], 
                             l->adj_fog_color[2], l->adj_fog_color[3]);
@@ -483,10 +482,9 @@ void fgRenderFrame( void ) {
 #endif
 
        thesky->modify_vis( cur_fdm_state->get_Altitude() * FEET_TO_METER,
-                               
                            ( global_multi_loop * 
-                             globals->get_options()->get_speed_up() ) /
-                           (double)globals->get_options()->get_model_hz() );
+                             fgGetInt("/sim/speed-up") ) /
+                           (double)fgGetInt("/sim/model-hz") );
 
        double actual_visibility = thesky->get_visibility();
        // cout << "actual visibility = " << actual_visibility << endl;
@@ -509,7 +507,7 @@ void fgRenderFrame( void ) {
        glFogf (GL_FOG_DENSITY, fog_exp2_density);
 
        // update the sky dome
-       if ( globals->get_options()->get_skyblend() ) {
+       if ( fgGetBool("/sim/rendering/skyblend") ) {
            /* cout << "thesky->repaint() sky_color = "
                 << cur_light_params.sky_color[0] << " "
                 << cur_light_params.sky_color[1] << " "
@@ -562,7 +560,7 @@ void fgRenderFrame( void ) {
        }
 
        glEnable( GL_DEPTH_TEST );
-       if ( globals->get_options()->get_fog() > 0 ) {
+       if ( fgGetString("/sim/rendering/fog") != "disabled" ) {
            glEnable( GL_FOG );
            glFogi( GL_FOG_MODE, GL_EXP2 );
            glFogfv( GL_FOG_COLOR, l->adj_fog_color );
@@ -642,7 +640,7 @@ void fgRenderFrame( void ) {
 
            // set up moving parts
            if (flaps_selector != NULL) {
-             flaps_selector->select( (FGBFI::getFlaps() > 0.5f) ? 1 : 2 );
+             flaps_selector->select( (controls.get_flaps() > 0.5f) ? 1 : 2 );
            }
 
            if (prop_selector != NULL) {
@@ -662,7 +660,7 @@ void fgRenderFrame( void ) {
        // $$$ end - added VS Renganthan 17 Oct 2K
 
 # ifdef FG_NETWORK_OLK
-       if ( globals->get_options()->get_network_olk() ) {
+       if ( fgGetBool("/sim/networking/network-olk") ) {
            sgCoord fgdpos;
            other = head->next;             /* put listpointer to start  */
            while ( other != tail) {        /* display all except myself */
@@ -685,8 +683,10 @@ void fgRenderFrame( void ) {
        // position tile nodes and update range selectors
        global_tile_mgr.prep_ssg_nodes();
 
-       // draw the sky backdrop
-       thesky->preDraw();
+       if ( fgGetBool("/sim/rendering/skyblend") ) {
+           // draw the sky backdrop
+           thesky->preDraw();
+       }
 
        // draw the ssg scene
        glEnable( GL_DEPTH_TEST );
@@ -700,17 +700,27 @@ void fgRenderFrame( void ) {
 
        ssgCullAndDraw( lighting );
 
-       // draw the sky cloud layers
-       thesky->postDraw( cur_fdm_state->get_Altitude() * FEET_TO_METER );
+       if ( fgGetBool("/sim/rendering/skyblend") ) {
+           // draw the sky cloud layers
+           thesky->postDraw( cur_fdm_state->get_Altitude() * FEET_TO_METER );
+       }
 
        // display HUD && Panel
        glDisable( GL_FOG );
        glDisable( GL_DEPTH_TEST );
        // glDisable( GL_CULL_FACE );
        // glDisable( GL_TEXTURE_2D );
+
+       // update the controls subsystem
+       controls.update();
+
        hud_and_panel->apply();
        fgCockpitUpdate();
 
+       // update the panel subsystem
+       if (current_panel != 0)
+         current_panel->update();
+
        // We can do translucent menus, so why not. :-)
        menus->apply();
        glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
@@ -725,31 +735,54 @@ void fgRenderFrame( void ) {
 
 
 // Update internal time dependent calculations (i.e. flight model)
-void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
-    static fdm_state_list fdm_list;
+void fgUpdateTimeDepCalcs() {
+    static bool inited = false;
+
     fgLIGHT *l = &cur_light_params;
     int i;
 
-    // update the flight model
-    if ( multi_loop < 0 ) {
-       multi_loop = 1;
-    }
+    long multi_loop = 1;
 
     if ( !globals->get_freeze() && !initial_freeze ) {
-       // run Autopilot system
-       current_autopilot->run();
-
-       // printf("updating flight model x %d\n", multi_loop);
-       /* fgFDMUpdate( globals->get_options()->get_flight_model(), 
-                    fdm_state, 
-                    multi_loop * globals->get_options()->get_speed_up(),
-                    remainder ); */
-       cur_fdm_state->update( multi_loop *
-                              globals->get_options()->get_speed_up() );
-       FGSteam::update( multi_loop * globals->get_options()->get_speed_up() );
+       // conceptually, this could be done for each fdm instance ...
+
+       if ( !inited ) {
+           cur_fdm_state->stamp();
+           inited = true;
+       }
+
+       SGTimeStamp current;
+       current.stamp();
+       long elapsed = current - cur_fdm_state->get_time_stamp();
+       cur_fdm_state->set_time_stamp( current );
+       elapsed += cur_fdm_state->get_remainder();
+       // cout << "elapsed = " << elapsed << endl;
+       // cout << "dt = " << cur_fdm_state->get_delta_t() << endl;
+       multi_loop = (long)(((double)elapsed * 0.000001) /
+                              cur_fdm_state->get_delta_t() );
+       cur_fdm_state->set_multi_loop( multi_loop );
+       long remainder = elapsed - ( (multi_loop*1000000) *
+                                    cur_fdm_state->get_delta_t() );
+       cur_fdm_state->set_remainder( remainder );
+       // cout << "remainder = " << remainder << endl;
+
+       // chop max interations to something reasonable if the sim was
+       // delayed for an excesive amount of time
+       if ( multi_loop > 2.0 / cur_fdm_state->get_delta_t() ) {
+           multi_loop = (int)(2.0 / cur_fdm_state->get_delta_t());
+           cur_fdm_state->set_remainder( 0 );
+       }
+
+       // cout << "multi_loop = " << multi_loop << endl;
+       for ( i = 0; i < multi_loop * fgGetInt("/sim/speed-up"); ++i ) {
+           // run Autopilot system
+           current_autopilot->run();
+
+           // update autopilot
+           cur_fdm_state->update( 1 );
+       }
+       FGSteam::update( multi_loop * fgGetInt("/sim/speed-up") );
     } else {
-       // fgFDMUpdate( globals->get_options()->get_flight_model(), 
-       //              fdm_state, 0, remainder );
        cur_fdm_state->update( 0 );
        FGSteam::update( 0 );
 
@@ -758,18 +791,9 @@ void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
        }
     }
 
-    fdm_list.push_back( *cur_fdm_state );
-    while ( fdm_list.size() > 15 ) {
-       fdm_list.pop_front();
-    }
-
-    if ( globals->get_options()->get_view_mode() == FGOptions::FG_VIEW_PILOT ) {
+    if ( fgGetString("/sim/view-mode") == "pilot" ) {
        cur_view_fdm = *cur_fdm_state;
        // do nothing
-    } else if ( globals->get_options()->get_view_mode()
-               == FGOptions::FG_VIEW_FOLLOW )
-    {
-       cur_view_fdm = fdm_list.front();
     }
 
     // update the view angle
@@ -823,9 +847,7 @@ void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
                                  cur_fdm_state->get_Latitude() );
 
     // Update radio stack model
-    current_radiostack->update( cur_fdm_state->get_Longitude(),
-                               cur_fdm_state->get_Latitude(),
-                               cur_fdm_state->get_Altitude() * FEET_TO_METER );
+    current_radiostack->update();
 }
 
 
@@ -833,7 +855,7 @@ void fgInitTimeDepCalcs( void ) {
     // initialize timer
 
     // #ifdef HAVE_SETITIMER
-    //   fgTimerInit( 1.0 / globals->get_options()->get_model_hz(), 
+    //   fgTimerInit( 1.0 / fgGetInt("/sim/model-hz"), 
     //                fgUpdateTimeDepCalcs );
     // #endif HAVE_SETITIMER
 }
@@ -862,7 +884,7 @@ static void fgMainLoop( void ) {
     FG_LOG( FG_ALL, FG_DEBUG, "======= ==== ====");
 
 #ifdef FG_NETWORK_OLK
-    if ( globals->get_options()->get_network_olk() ) {
+    if ( fgGetBool("/sim/networking/network-olk") ) {
        if ( net_is_registered == 0 ) {      // We first have to reg. to fgd
            // printf("FGD: Netupdate\n");
            fgd_send_com( "A", FGFS_host);   // Send Mat4 data
@@ -873,7 +895,7 @@ static void fgMainLoop( void ) {
 
 #if defined( ENABLE_PLIB_JOYSTICK )
     // Read joystick and update control settings
-    if ( globals->get_options()->get_control_mode() == FGOptions::FG_JOYSTICK )
+    if ( fgGetString("/sim/control-mode") == "joystick" )
     {
        fgJoystickRead();
     }
@@ -903,7 +925,7 @@ static void fgMainLoop( void ) {
                   cur_fdm_state->get_Altitude() * FEET_TO_METER,
                   scenery.cur_elev + alt_adjust_m - 3.0,
                   scenery.cur_elev + alt_adjust_m );
-           fgFDMForceAltitude( globals->get_options()->get_flight_model(), 
+           fgFDMForceAltitude( fgGetString("/sim/flight-model"), 
                                scenery.cur_elev + alt_adjust_m );
 
            FG_LOG( FG_ALL, FG_DEBUG, 
@@ -911,8 +933,6 @@ static void fgMainLoop( void ) {
                    << cur_fdm_state->get_Altitude() * FEET_TO_METER
                    << " meters" );
        }
-       //fgFDMSetGroundElevation( globals->get_options()->get_flight_model(),
-       //                       scenery.cur_elev );  // meters
     }
 
     /* printf("Adjustment - ground = %.2f  runway = %.2f  alt = %.2f\n",
@@ -976,25 +996,31 @@ static void fgMainLoop( void ) {
 #endif
 
     // Run flight model
-    if ( ! use_signals ) {
-       // Calculate model iterations needed for next frame
-       elapsed += remainder;
-
-       global_multi_loop = (int)(((double)elapsed * 0.000001) * 
-                          globals->get_options()->get_model_hz());
-       remainder = elapsed - ( (global_multi_loop*1000000) / 
-                               globals->get_options()->get_model_hz() );
-       FG_LOG( FG_ALL, FG_DEBUG, 
-               "Model iterations needed = " << global_multi_loop
-               << ", new remainder = " << remainder );
+
+    // Calculate model iterations needed for next frame
+    elapsed += remainder;
+
+    global_multi_loop = (long)(((double)elapsed * 0.000001) * 
+                             fgGetInt("/sim/model-hz"));
+    remainder = elapsed - ( (global_multi_loop*1000000) / 
+                           fgGetInt("/sim/model-hz") );
+    FG_LOG( FG_ALL, FG_DEBUG, 
+           "Model iterations needed = " << global_multi_loop
+           << ", new remainder = " << remainder );
        
-       // flight model
-       if ( global_multi_loop > 0 ) {
-           fgUpdateTimeDepCalcs(global_multi_loop, remainder);
-       } else {
-           FG_LOG( FG_ALL, FG_DEBUG, 
-                   "Elapsed time is zero ... we're zinging" );
-       }
+    // chop max interations to something reasonable if the sim was
+    // delayed for an excesive amount of time
+    if ( global_multi_loop > 2.0 * fgGetInt("/sim/model-hz") ) {
+       global_multi_loop = (int)(2.0 * fgGetInt("/sim/model-hz") );
+       remainder = 0;
+    }
+
+    // flight model
+    if ( global_multi_loop > 0 ) {
+       fgUpdateTimeDepCalcs();
+    } else {
+       FG_LOG( FG_ALL, FG_DEBUG, 
+               "Elapsed time is zero ... we're zinging" );
     }
 
 #if ! defined( macintosh )
@@ -1011,9 +1037,9 @@ static void fgMainLoop( void ) {
 
     // Run audio scheduler
 #ifdef ENABLE_AUDIO_SUPPORT
-    if ( globals->get_options()->get_sound() && !audio_sched->not_working() ) {
+    if ( fgGetBool("/sim/sound") && !audio_sched->not_working() ) {
 
-       if ( globals->get_options()->get_aircraft() == "c172" ) {
+       if ( fgGetString("/sim/aircraft") == "c172" ) {
            // pitch corresponds to rpm
            // volume corresponds to manifold pressure
 
@@ -1037,18 +1063,18 @@ static void fgMainLoop( void ) {
            double mp_factor;
            if ( cur_fdm_state->get_engine(0) != NULL ) {
                mp_factor = 
-                   cur_fdm_state->get_engine(0)->get_Manifold_Pressure() / 28;
+                   cur_fdm_state->get_engine(0)->get_Manifold_Pressure() / 100;
            } else {
-               mp_factor = 1.0;
+               mp_factor = 0.3;
            }
-           // cout << "mp = " 
-           //      << cur_fdm_state->get_engine(0)->get_Manifold_Pressure()
-           //      << endl;
+           /* cout << "mp = " 
+                << cur_fdm_state->get_engine(0)->get_Manifold_Pressure()
+                << endl; */
 
-           double volume = mp_factor;
+           double volume = 0.3 + mp_factor;
 
            if ( volume < 0.3 ) { volume = 0.3; }
-           if ( volume > 2.0 ) { volume = 2.0; }
+           if ( volume > 1.0 ) { volume = 1.0; }
            // cout << "volume = " << volume << endl;
 
            pitch_envelope.setStep  ( 0, 0.01, pitch );
@@ -1083,7 +1109,7 @@ static void fgIdleFunction ( void ) {
 
     if ( idle_state == 0 ) {
        // Initialize the splash screen right away
-       if ( globals->get_options()->get_splash_screen() ) {
+       if ( fgGetBool("/sim/startup/splash-screen") ) {
            fgSplashInit();
        }
        
@@ -1091,9 +1117,9 @@ static void fgIdleFunction ( void ) {
     } else if ( idle_state == 1 ) {
        // Start the intro music
 #if !defined(WIN32)
-       if ( globals->get_options()->get_intro_music() ) {
+       if ( fgGetBool("/sim/startup/intro-music") ) {
            string lockfile = "/tmp/mpg123.running";
-           FGPath mp3file( globals->get_options()->get_fg_root() );
+           FGPath mp3file( globals->get_fg_root() );
            mp3file.append( "Sounds/intro.mp3" );
 
            string command = "(touch " + lockfile + "; mpg123 "
@@ -1133,12 +1159,6 @@ static void fgIdleFunction ( void ) {
        // setup OpenGL view parameters
        fgInitVisuals();
 
-       if ( use_signals ) {
-           // init timer routines, signals, etc.  Arrange for an alarm
-           // signal to be generated, etc.
-           fgInitTimeDepCalcs();
-       }
-
        idle_state++;
     } else if ( idle_state == 5 ) {
 
@@ -1148,7 +1168,7 @@ static void fgIdleFunction ( void ) {
 #ifdef ENABLE_AUDIO_SUPPORT
 
 #if !defined(WIN32)
-       if ( globals->get_options()->get_intro_music() ) {
+       if ( fgGetBool("/sim/startup/intro-music") ) {
            // Let's wait for mpg123 to finish
            string lockfile = "/tmp/mpg123.running";
            struct stat stat_buf;
@@ -1164,13 +1184,13 @@ static void fgIdleFunction ( void ) {
        }
 #endif // WIN32
 
-       if ( globals->get_options()->get_sound() ) {
+       if ( fgGetBool("/sim/sound") ) {
            audio_sched = new slScheduler ( 8000 );
            audio_mixer = new smMixer;
            audio_mixer -> setMasterVolume ( 80 ) ;  /* 80% of max volume. */
            audio_sched -> setSafetyMargin ( 1.0 ) ;
 
-           FGPath slfile( globals->get_options()->get_fg_root() );
+           FGPath slfile( globals->get_fg_root() );
            slfile.append( "Sounds/wasp.wav" );
 
            s1 = new slSample ( (char *)slfile.c_str() );
@@ -1206,8 +1226,8 @@ static void fgIdleFunction ( void ) {
        idle_state = 1000;
 
        cout << "Panel visible = " << fgPanelVisible() << endl;
-       fgReshape( globals->get_options()->get_xsize(),
-                  globals->get_options()->get_ysize() );
+       fgReshape( fgGetInt("/sim/startup/xsize"),
+                  fgGetInt("/sim/startup/ysize") );
     } 
 
     if ( idle_state == 1000 ) {
@@ -1216,7 +1236,7 @@ static void fgIdleFunction ( void ) {
 
        fgMainLoop();
     } else {
-       if ( globals->get_options()->get_splash_screen() == 1 ) {
+       if ( fgGetBool("/sim/startup/splash-screen") ) {
            fgSplashUpdate(0.0);
        }
     }
@@ -1250,8 +1270,8 @@ void fgReshape( int width, int height ) {
                   (GLint)(width), (GLint)(view_h) );
     }
 
-    globals->get_options()->set_xsize( width );
-    globals->get_options()->set_ysize( height );
+    fgSetInt("/sim/startup/xsize", width);
+    fgSetInt("/sim/startup/ysize", height);
 
     float fov = globals->get_current_view()->get_fov();
     ssgSetFOV(fov, fov * globals->get_current_view()->get_win_ratio());
@@ -1273,15 +1293,15 @@ int fgGlutInit( int *argc, char **argv ) {
     glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
 
     FG_LOG( FG_GENERAL, FG_INFO, "Opening a window: " <<
-           globals->get_options()->get_xsize() << "x"
-           << globals->get_options()->get_ysize() );
+           fgGetInt("/sim/startup/xsize") << "x"
+           << fgGetInt("/sim/startup/ysize") );
 
     // Define initial window size
-    glutInitWindowSize( globals->get_options()->get_xsize(),
-                        globals->get_options()->get_ysize() );
+    glutInitWindowSize( fgGetInt("/sim/startup/xsize"),
+                       fgGetInt("/sim/startup/ysize") );
 
     // Initialize windows
-    if ( globals->get_options()->get_game_mode() == 0 ) {
+    if ( !fgGetBool("/sim/startup/game-mode")) {
        // Open the regular window
        glutCreateWindow("FlightGear");
 #ifndef GLUT_WRONG_VERSION
@@ -1289,9 +1309,9 @@ int fgGlutInit( int *argc, char **argv ) {
        // Open the cool new 'game mode' window
        char game_mode_str[256];
        sprintf( game_mode_str, "width=%d height=%d bpp=%d",
-                globals->get_options()->get_xsize(),
-                globals->get_options()->get_ysize(),
-                globals->get_options()->get_bpp());
+                fgGetInt("/sim/startup/xsize"),
+                fgGetInt("/sim/startup/ysize"),
+                fgGetInt("/sim/rendering/bits-per-pixel"));
 
        FG_LOG( FG_GENERAL, FG_INFO, 
                "game mode params = " << game_mode_str );
@@ -1317,43 +1337,7 @@ int fgGlutInit( int *argc, char **argv ) {
     general.set_glDepthBits( tmp );
     FG_LOG ( FG_GENERAL, FG_INFO, "Depth buffer bits = " << tmp );
 
-#if 0
-    // try to determine if we should adjust the initial default
-    // display resolution.  The options class defaults (is
-    // initialized) to 640x480.
-    string renderer = general.glRenderer;
-
-    // currently we only know how to deal with Mesa/Glide/Voodoo cards
-    if ( renderer.find( "Glide" ) != string::npos ) {
-       FG_LOG( FG_GENERAL, FG_INFO, "Detected a Glide driver" );
-       if ( renderer.find( "FB/8" ) != string::npos ) {
-           // probably a voodoo-2
-           if ( renderer.find( "TMU/SLI" ) != string::npos ) {
-               // probably two SLI'd Voodoo-2's
-               globals->get_options()->set_xsize( 1024 );
-               globals->get_options()->set_ysize( 768 );
-               FG_LOG( FG_GENERAL, FG_INFO,
-                       "It looks like you have two sli'd voodoo-2's." << endl
-                       << "upgrading your win resolution to 1024 x 768" );
-               glutReshapeWindow(1024, 768);
-           } else {
-               // probably a single non-SLI'd Voodoo-2
-               globals->get_options()->set_xsize( 800 );
-               globals->get_options()->set_ysize( 600 );
-               FG_LOG( FG_GENERAL, FG_INFO,
-                       "It looks like you have a voodoo-2." << endl
-                       << "upgrading your win resolution to 800 x 600" );
-               glutReshapeWindow(800, 600);
-           }
-       } else if ( renderer.find( "FB/2" ) != string::npos ) {
-           // probably a voodoo-1, stick with the default
-       }
-    } else {
-       // we have no special knowledge of this card, stick with the default
-    }
-#endif
-
-    return(1);
+    return 1;
 }
 
 
@@ -1398,22 +1382,28 @@ int main( int argc, char **argv ) {
     // set default log levels
     fglog().setLogLevels( FG_ALL, FG_INFO );
 
+    string version;
+#ifdef FLIGHTGEAR_VERSION
+    version = FLIGHTGEAR_VERSION;
+#else
+    version = "unknown version";
+#endif
     FG_LOG( FG_GENERAL, FG_INFO, "FlightGear:  Version "
-           << FLIGHTGEAR_VERSION << endl );
-
-    // seed the random number generater
-    sg_srandom_time();
+           << version << endl );
 
     // Allocate global data structures.  This needs to happen before
     // we parse command line options
+
+    SGPropertyNode *props = new SGPropertyNode;
     globals = new FGGlobals;
+    globals->set_props( props );
+
+    // seed the random number generater
+    sg_srandom_time();
 
     SGRoute *route = new SGRoute;
     globals->set_route( route );
 
-    FGOptions *options = new FGOptions;
-    globals->set_options( options );
-
     FGViewMgr *viewmgr = new FGViewMgr;
     globals->set_viewmgr( viewmgr );
 
@@ -1423,31 +1413,16 @@ int main( int argc, char **argv ) {
     FGViewerLookAt *chase = new FGViewerLookAt;
     globals->get_viewmgr()->add_view( chase );
 
+    string_list *col = new string_list;
+    globals->set_channel_options_list( col );
+
     // set current view to 0 (first) which is our main pilot view
     globals->set_current_view( globals->get_viewmgr()->get_view( 0 ) );
 
-    SGPropertyNode *props = new SGPropertyNode;
-    globals->set_props( props );
-
     // Scan the config file(s) and command line options to see if
     // fg_root was specified (ignore all other options for now)
     fgInitFGRoot(argc, argv);
 
-    // cout << "1. airport_id = " << globals->get_options()->get_airport_id() << endl;
-
-    // Read global preferences from $FG_ROOT/preferences.xml
-    FGPath props_path(globals->get_options()->get_fg_root());
-    props_path.append("preferences.xml");
-    FG_LOG(FG_INPUT, FG_INFO, "Reading global preferences");
-    if (!readProperties(props_path.str(), globals->get_props())) {
-      FG_LOG(FG_INPUT, FG_ALERT, "Failed to read global preferences from "
-            << props_path.str());
-    } else {
-      FG_LOG(FG_INPUT, FG_INFO, "Finished Reading global preferences");
-    }
-
-    // cout << "2. airport_id = " << globals->get_options()->get_airport_id() << endl;
-
     // Initialize the Aircraft directory to "" (UIUC)
     aircraft_dir = "";
 
@@ -1480,18 +1455,18 @@ int main( int argc, char **argv ) {
     guiInit();
 
     // set current_options lon/lat if an airport id is specified
-    // cout << "3. airport_id = " << globals->get_options()->get_airport_id() << endl;
-    if ( globals->get_options()->get_airport_id().length() ) {
-       // fgSetPosFromAirportID( globals->get_options()->get_airport_id() );
-       fgSetPosFromAirportIDandHdg( globals->get_options()->get_airport_id(),
-                                    globals->get_options()->get_heading() );
+    // cout << "3. airport_id = " << fgGetString("/sim/startup/airport-id") << endl;
+    if ( fgGetString("/sim/startup/airport-id").length() ) {
+       // fgSetPosFromAirportID( fgGetString("/sim/startup/airport-id") );
+       fgSetPosFromAirportIDandHdg( fgGetString("/sim/startup/airport-id"),
+                                    fgGetDouble("/orientation/heading") );
     }
 
     // Initialize time
-    FGPath zone( globals->get_options()->get_fg_root() );
+    FGPath zone( globals->get_fg_root() );
     zone.append( "Timezone" );
-    SGTime *t = new SGTime( globals->get_options()->get_lon() * DEG_TO_RAD,
-                           globals->get_options()->get_lat() * DEG_TO_RAD,
+    SGTime *t = new SGTime( fgGetDouble("/position/longitude") * DEG_TO_RAD,
+                           fgGetDouble("/position/latitude") * DEG_TO_RAD,
                            zone.str() );
 
     // Handle potential user specified time offsets
@@ -1502,34 +1477,24 @@ int main( int argc, char **argv ) {
        sgTimeGetGMT( fgLocaltime(&cur_time, t->get_zonename() ) );
 
     // Okay, we now have six possible scenarios
-    switch ( globals->get_options()->get_time_offset_type() ) {
-    case FGOptions::FG_TIME_SYS_OFFSET:
-       globals->set_warp( globals->get_options()->get_time_offset() );
-       break;
-    case FGOptions::FG_TIME_GMT_OFFSET:
-       globals->set_warp( globals->get_options()->get_time_offset() - 
-                          (currGMT - systemLocalTime) );
-       break;
-    case FGOptions::FG_TIME_LAT_OFFSET:
-       globals->set_warp( globals->get_options()->get_time_offset() - 
-                          (aircraftLocalTime - systemLocalTime) );
-       break;
-    case FGOptions::FG_TIME_SYS_ABSOLUTE:
-       globals->set_warp( globals->get_options()->get_time_offset() -
-                          cur_time );
-       //printf("warp = %d\n", warp); 
-       break;
-    case FGOptions::FG_TIME_GMT_ABSOLUTE:
-       globals->set_warp( globals->get_options()->get_time_offset() -
-                          currGMT );
-       break;
-    case FGOptions::FG_TIME_LAT_ABSOLUTE:
-       globals->set_warp( globals->get_options()->get_time_offset() - 
-                          (aircraftLocalTime - systemLocalTime) - 
+    int offset = fgGetInt("/sim/startup/time-offset");
+    const string &offset_type = fgGetString("/sim/startup/time-offset-type");
+    if (offset_type == "system-offset") {
+       globals->set_warp( offset );
+    } else if (offset_type == "gmt-offset") {
+       globals->set_warp( offset - (currGMT - systemLocalTime) );
+    } else if (offset_type == "latitude-offset") {
+       globals->set_warp( offset - (aircraftLocalTime - systemLocalTime) );
+    } else if (offset_type == "system") {
+       globals->set_warp( offset - cur_time );
+    } else if (offset_type == "gmt") {
+       globals->set_warp( offset - currGMT );
+    } else if (offset_type == "latitude") {
+       globals->set_warp( offset - (aircraftLocalTime - systemLocalTime) - 
                           cur_time ); 
-       break;
-    default:
-       FG_LOG( FG_GENERAL, FG_ALERT, "Unsupported type" );
+    } else {
+        FG_LOG( FG_GENERAL, FG_ALERT,
+               "Unsupported offset type " << offset_type );
        exit( -1 );
     }
 
@@ -1549,17 +1514,9 @@ int main( int argc, char **argv ) {
        exit(-1);
     }
 
-    FGPath modelpath( globals->get_options()->get_fg_root() );
-    // modelpath.append( "Models" );
-    // modelpath.append( "Geometry" );
-  
-    FGPath texturepath( globals->get_options()->get_fg_root() );
-    texturepath.append( "Models" );
-    texturepath.append( "Textures" );
-  
+    FGPath modelpath( globals->get_fg_root() );
     ssgModelPath( (char *)modelpath.c_str() );
-    ssgTexturePath( (char *)texturepath.c_str() );
-
+  
     // Scene graph root
     scene = new ssgRoot;
     scene->setName( "Scene" );
@@ -1568,7 +1525,7 @@ int main( int argc, char **argv ) {
     lighting->setName( "Lighting" );
 
     // Initialize the sky
-    FGPath ephem_data_path( globals->get_options()->get_fg_root() );
+    FGPath ephem_data_path( globals->get_fg_root() );
     ephem_data_path.append( "Astro" );
     SGEphemeris *ephem = new SGEphemeris( ephem_data_path.c_str() );
     ephem->update( globals->get_time_params()->getMjd(),
@@ -1576,7 +1533,7 @@ int main( int argc, char **argv ) {
                   0.0 );
     globals->set_ephem( ephem );
 
-    FGPath sky_tex_path( globals->get_options()->get_fg_root() );
+    FGPath sky_tex_path( globals->get_fg_root() );
     sky_tex_path.append( "Textures" );
     sky_tex_path.append( "Sky" );
     thesky = new SGSky;
@@ -1588,7 +1545,7 @@ int main( int argc, char **argv ) {
                   globals->get_ephem()->getNumStars(),
                   globals->get_ephem()->getStars(), 60000.0 );
 
-    if ( globals->get_options()->get_clouds() == true ) {
+    if ( fgGetBool("/environment/clouds/status") ) {
        thesky->add_cloud_layer( 2600.0, 200.0, 50.0, 40000.0,
                                 SG_CLOUD_MOSTLY_SUNNY );
        thesky->add_cloud_layer( 6000.0, 20.0, 10.0, 40000.0,
@@ -1622,8 +1579,16 @@ int main( int argc, char **argv ) {
     acmodel_pos = new ssgTransform;
 
     string acmodel_path =
-       globals->get_props()->getStringValue("/sim/model/path",
-                                       "Models/Geometry/glider.ac");
+       fgGetString("/sim/model/path", "Models/Geometry/glider.ac");
+
+    string full_model = globals->get_fg_root() + "/"
+       + acmodel_path;
+    int pos = full_model.rfind("/");
+    
+    FGPath texturepath( full_model.substr(0, pos) );
+    cout << "Texture path = " << texturepath.str() << endl;
+    ssgTexturePath( (char *)texturepath.c_str() );
+
     ssgEntity *acmodel_obj = ssgLoad((char *)(acmodel_path.c_str()));
 
     // find moving parts (if this is an MDL model)
@@ -1655,18 +1620,12 @@ int main( int argc, char **argv ) {
     sgMat4 rot_matrix;
     sgMat4 off_matrix;
     sgMat4 res_matrix;
-    float h_rot =
-      globals->get_props()->getFloatValue("/sim/model/h-rotation", 0.0);
-    float p_rot =
-      globals->get_props()->getFloatValue("/sim/model/p-rotation", 0.0);
-    float r_rot =
-      globals->get_props()->getFloatValue("/sim/model/r-rotation", 0.0);
-    float x_off =
-      globals->get_props()->getFloatValue("/sim/model/x-offset", 0.0);
-    float y_off =
-      globals->get_props()->getFloatValue("/sim/model/y-offset", 0.0);
-    float z_off =
-      globals->get_props()->getFloatValue("/sim/model/z-offset", 0.0);
+    float h_rot = fgGetFloat("/sim/model/h-rotation", 0.0);
+    float p_rot = fgGetFloat("/sim/model/p-rotation", 0.0);
+    float r_rot = fgGetFloat("/sim/model/r-rotation", 0.0);
+    float x_off = fgGetFloat("/sim/model/x-offset", 0.0);
+    float y_off = fgGetFloat("/sim/model/y-offset", 0.0);
+    float z_off = fgGetFloat("/sim/model/z-offset", 0.0);
     sgMakeRotMat4(rot_matrix, h_rot, p_rot, r_rot);
     sgMakeTransMat4(off_matrix, x_off, y_off, z_off);
     sgMultMat4(res_matrix, off_matrix, rot_matrix);
@@ -1685,7 +1644,7 @@ int main( int argc, char **argv ) {
 
 #ifdef FG_NETWORK_OLK
     // Do the network intialization
-    if ( globals->get_options()->get_network_olk() ) {
+    if ( fgGetBool("/sim/networking/network-olk") ) {
        printf("Multipilot mode %s\n", fg_net_init( scene ) );
     }
 #endif
@@ -1707,9 +1666,9 @@ int main( int argc, char **argv ) {
 
 void fgLoadDCS(void) {
 
-    ssgEntity *ship_obj;
-    double bz[3];
-    int j=0;
+    ssgEntity *ship_obj = NULL;
+    // double bz[3];
+    // int j=0;
     char obj_filename[25];
 
     for (int k=0;k<32;k++)
@@ -1717,7 +1676,7 @@ void fgLoadDCS(void) {
         ship_pos[k]=NULL;
     }
 
-    FGPath tile_path( globals->get_options()->get_fg_root());
+    FGPath tile_path( globals->get_fg_root());
     tile_path.append( "Scenery" );
     tile_path.append( "Objects.txt" );
     fg_gzifstream in( tile_path.str() );
@@ -1725,11 +1684,11 @@ void fgLoadDCS(void) {
        FG_LOG( FG_TERRAIN, FG_ALERT, "Cannot open file: " << tile_path.str() );
     }
 
-    FGPath modelpath( globals->get_options()->get_fg_root() );
+    FGPath modelpath( globals->get_fg_root() );
     modelpath.append( "Models" );
     modelpath.append( "Geometry" );
   
-    FGPath texturepath( globals->get_options()->get_fg_root() );
+    FGPath texturepath( globals->get_fg_root() );
     texturepath.append( "Models" );
     texturepath.append( "Textures" );
  
@@ -1785,11 +1744,11 @@ void fgLoadDCS(void) {
 
 void fgUpdateDCS (void) {
 
-    double eye_lat,eye_lon,eye_alt;
-    static double obj_head;
+    // double eye_lat,eye_lon,eye_alt;
+    // static double obj_head;
     double sl_radius,obj_latgc;
-    float nresultmat[4][4];
-    sgMat4 Trans,rothead,rotlon,rot180,rotlat,resultmat1,resultmat2,resultmat3;
+    // float nresultmat[4][4];
+    // sgMat4 Trans,rothead,rotlon,rot180,rotlat,resultmat1,resultmat2,resultmat3;
     double bz[3];
 
     // Instantaneous Geodetic Lat/Lon/Alt of moving object
@@ -1797,7 +1756,7 @@ void fgUpdateDCS (void) {
     
     // Deck should be the first object in objects.txt in case of fdm=ada
 
-    if ((globals->get_options()->get_flight_model()) == 4 )
+    if (fgGetString("/sim/flight-model") == "ada")
     {
       obj_lon[0] = fdm->get_aux5()*DEG_TO_RAD;
       obj_lat[0] = fdm->get_aux6()*DEG_TO_RAD;