]> git.mxchange.org Git - flightgear.git/blobdiff - Main/GLUTmain.cxx
C++-ifying.
[flightgear.git] / Main / GLUTmain.cxx
index b073fd5b13431ab5caeb981ad0df77832c89b2d9..ee157faffde093a5fec25e8967becc56350c28d1 100644 (file)
@@ -1,10 +1,8 @@
-
-//
 // GLUTmain.cxx -- top level sim routines
 //
 // Written by Curtis Olson for OpenGL, started May 1997.
 //
-// Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
+// Copyright (C) 1997  Curtis L. Olson  - curt@me.umn.edu
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -37,6 +35,7 @@
 #include <XGL/xgl.h>
 #include <stdio.h>
 #include <string.h>
+#include <string>
 
 #ifdef HAVE_STDLIB_H
 #   include <stdlib.h>
 #include <sys/stat.h> /* for stat() */
 
 #ifdef HAVE_UNISTD_H
-#  include <unistd.h>    /* for fork() && stat() */
+#  include <unistd.h>    /* for stat() */
 #endif
 
 #include <Include/fg_constants.h>  // for VERSION
 #include <Include/general.h>
 
 #include <Aircraft/aircraft.h>
-#include <Astro/moon.hxx>
-#include <Astro/planets.hxx>
 #include <Astro/sky.hxx>
 #include <Astro/stars.hxx>
-#include <Astro/sun.hxx>
+#include <Astro/solarsystem.hxx>
 
 #ifdef ENABLE_AUDIO_SUPPORT
 #  include <Audio/src/sl.h>
 #  include <Audio/src/sm.h>
 #endif
 
+#include <Autopilot/autopilot.hxx>
 #include <Cockpit/cockpit.hxx>
 #include <Debug/fg_debug.h>
 #include <GUI/gui.h>
 #include <Joystick/joystick.h>
-#include <Math/fg_geodesy.h>
+#include <Math/fg_geodesy.hxx>
 #include <Math/mat3.h>
 #include <Math/polar3d.hxx>
 #include <PUI/pu.h>
@@ -92,13 +90,18 @@ fgGENERAL general;
 // Specify our current idle function state.  This is used to run all
 // our initializations out of the glutIdleLoop() so that we can get a
 // splash screen up and running right away.
-static idle_state = 0;
+static int idle_state = 0;
 
 // Another hack
 int use_signals = 0;
 
+// Yet another hack, this time for the panel
+int panel_hist = 0;
+
 // Global structures for the Audio library
 #ifdef ENABLE_AUDIO_SUPPORT
+slEnvelope pitch_envelope ( 1, SL_SAMPLE_ONE_SHOT ) ;
+slEnvelope volume_envelope ( 1, SL_SAMPLE_ONE_SHOT ) ;
 slScheduler *audio_sched;
 smMixer *audio_mixer;
 slSample *s1;
@@ -174,76 +177,7 @@ static void fgInitVisuals( void ) {
 }
 
 
-// Update the view volume, position, and orientation
-static void fgUpdateViewParams( void ) {
-    fgFLIGHT *f;
-    fgLIGHT *l;
-    fgVIEW *v;
-
-    f = current_aircraft.flight;
-    l = &cur_light_params;
-    v = &current_view;
-
-    v->Update(f);
-    v->UpdateWorldToEye(f);
-
-    // if (!o->panel_status) {
-    // xglViewport( 0, (GLint)((v->winHeight) / 2 ) , 
-    // (GLint)(v->winWidth), (GLint)(v->winHeight) / 2 );
-    // Tell GL we are about to modify the projection parameters
-    // xglMatrixMode(GL_PROJECTION);
-    // xglLoadIdentity();
-    // gluPerspective(o->fov, v->win_ratio / 2.0, 1.0, 100000.0);
-    // } else {
-    xglViewport(0, 0 , (GLint)(v->winWidth), (GLint)(v->winHeight) );
-    // Tell GL we are about to modify the projection parameters
-    xglMatrixMode(GL_PROJECTION);
-    xglLoadIdentity();
-    if ( FG_Altitude * FEET_TO_METER - scenery.cur_elev > 10.0 ) {
-       gluPerspective(current_options.get_fov(), v->win_ratio, 10.0, 100000.0);
-    } else {
-       gluPerspective(current_options.get_fov(), v->win_ratio, 1.0, 100000.0);
-       // printf("Near ground, minimizing near clip plane\n");
-    }
-    // }
-
-    xglMatrixMode(GL_MODELVIEW);
-    xglLoadIdentity();
-    
-    // set up our view volume (default)
-    fg_gluLookAt(v->view_pos.x, v->view_pos.y, v->view_pos.z,
-              v->view_pos.x + v->view_forward[0], 
-              v->view_pos.y + v->view_forward[1], 
-              v->view_pos.z + v->view_forward[2],
-              v->view_up[0], v->view_up[1], v->view_up[2]);
-
-    // look almost straight up (testing and eclipse watching)
-    /* fg_gluLookAt(v->view_pos.x, v->view_pos.y, v->view_pos.z,
-              v->view_pos.x + v->view_up[0] + .001, 
-              v->view_pos.y + v->view_up[1] + .001, 
-              v->view_pos.z + v->view_up[2] + .001,
-              v->view_up[0], v->view_up[1], v->view_up[2]); */
-
-    // lock view horizontally towards sun (testing)
-    /* fg_gluLookAt(v->view_pos.x, v->view_pos.y, v->view_pos.z,
-              v->view_pos.x + v->surface_to_sun[0], 
-              v->view_pos.y + v->surface_to_sun[1], 
-              v->view_pos.z + v->surface_to_sun[2],
-              v->view_up[0], v->view_up[1], v->view_up[2]); */
-
-    // lock view horizontally towards south (testing)
-    /* fg_gluLookAt(v->view_pos.x, v->view_pos.y, v->view_pos.z,
-              v->view_pos.x + v->surface_south[0], 
-              v->view_pos.y + v->surface_south[1], 
-              v->view_pos.z + v->surface_south[2],
-              v->view_up[0], v->view_up[1], v->view_up[2]); */
-
-    // set the sun position
-    xglLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
-}
-
-
-#ifdef 0
+#ifdef IS_THIS_BETTER_THAN_A_ZERO_CHARLIE
 // Draw a basic instrument panel
 static void fgUpdateInstrViewParams( void ) {
 
@@ -298,7 +232,8 @@ static void fgRenderFrame( void ) {
     fgTIME *t;
     fgVIEW *v;
     double angle;
-    GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
+    static int iteration = 0;
+    // GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
     GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
     GLfloat terrain_color[4] = { 0.54, 0.44, 0.29, 1.0 };
     GLbitfield clear_mask;
@@ -322,21 +257,23 @@ static void fgRenderFrame( void ) {
        //        FG_Altitude * FEET_TO_METER);
     
        // this is just a temporary hack, to make me understand Pui
-       timerText -> setLabel (ctime (&t->cur_time));
+       // timerText -> setLabel (ctime (&t->cur_time));
        // end of hack
 
        // update view volume parameters
-       fgUpdateViewParams();
+       v->UpdateViewParams();
 
        clear_mask = GL_DEPTH_BUFFER_BIT;
        if ( current_options.get_wireframe() ) {
            clear_mask |= GL_COLOR_BUFFER_BIT;
        }
-       if ( current_options.get_skyblend() ) {
+       if ( current_options.get_panel_status() ) {
+           // we can't clear the screen when the panel is active
+       } else if ( current_options.get_skyblend() ) {
            if ( current_options.get_textures() ) {
                // glClearColor(black[0], black[1], black[2], black[3]);
-               glClearColor(l->fog_color[0], l->fog_color[1], 
-                            l->fog_color[2], l->fog_color[3]);
+               glClearColor(l->adj_fog_color[0], l->adj_fog_color[1], 
+                            l->adj_fog_color[2], l->adj_fog_color[3]);
                clear_mask |= GL_COLOR_BUFFER_BIT;              
            }
        } else {
@@ -363,7 +300,7 @@ static void fgRenderFrame( void ) {
        // setup transformation for drawing astronomical objects
        xglPushMatrix();
        // Translate to view position
-       xglTranslatef( v->view_pos.x, v->view_pos.y, v->view_pos.z );
+       xglTranslatef( v->view_pos.x(), v->view_pos.y(), v->view_pos.z() );
        // Rotate based on gst (sidereal time)
        // note: constant should be 15.041085, Curt thought it was 15
        angle = t->gst * 15.041085;
@@ -372,23 +309,7 @@ static void fgRenderFrame( void ) {
 
        // draw stars and planets
        fgStarsRender();
-       fgPlanetsRender();
-
-       // draw the sun
-       fgSunRender();
-
-       // render the moon
-       xglEnable( GL_LIGHTING );
-       // set lighting parameters
-       xglLightfv(GL_LIGHT0, GL_AMBIENT, white );
-       xglLightfv(GL_LIGHT0, GL_DIFFUSE, white );
-       xglEnable( GL_CULL_FACE );
-    
-       // Let's try some blending technique's (Durk)
-       glEnable(GL_BLEND);
-       glBlendFunc(GL_ONE, GL_ONE);
-       fgMoonRender();
-       glDisable(GL_BLEND);
+       SolarSystem::theSolarSystem->draw();
 
        xglPopMatrix();
 
@@ -401,7 +322,7 @@ static void fgRenderFrame( void ) {
        xglEnable( GL_DEPTH_TEST );
        if ( current_options.get_fog() > 0 ) {
            xglEnable( GL_FOG );
-           xglFogfv (GL_FOG_COLOR, l->fog_color);
+           xglFogfv (GL_FOG_COLOR, l->adj_fog_color);
        }
        // set lighting parameters
        xglLightfv(GL_LIGHT0, GL_AMBIENT, l->scene_ambient );
@@ -427,13 +348,17 @@ static void fgRenderFrame( void ) {
 
        xglDisable( GL_TEXTURE_2D );
 
+       if ( (iteration == 0) && (current_options.get_panel_status()) ) {   
+           // Did we run this loop before ?? ...and do we need the panel ??
+           fgPanelReInit();
+       }
+
        // display HUD && Panel
+       if ( current_options.get_panel_status() ) {
+           xglViewport(0, 0, v->winWidth, v->winHeight);
+       }
        fgCockpitUpdate();
-       
-       // display instruments
-       // if (!o->panel_status) {
-       // fgUpdateInstrViewParams();
-       // }
+       iteration = 1; // don't ReInit the panel in the future
 
        // We can do translucent menus, so why not. :-)
        xglEnable    ( GL_BLEND ) ;
@@ -449,11 +374,13 @@ static void fgRenderFrame( void ) {
 // Update internal time dependent calculations (i.e. flight model)
 void fgUpdateTimeDepCalcs(int multi_loop) {
     fgFLIGHT *f;
+    fgLIGHT *l;
     fgTIME *t;
     fgVIEW *v;
     int i;
 
     f = current_aircraft.flight;
+    l = &cur_light_params;
     t = &cur_time_params;
     v = &current_view;
 
@@ -462,8 +389,15 @@ void fgUpdateTimeDepCalcs(int multi_loop) {
        multi_loop = DEFAULT_MULTILOOP;
     }
 
-    // printf("updating flight model x %d\n", multi_loop);
-    fgFlightModelUpdate(FG_LARCSIM, f, multi_loop);
+    if ( !t->pause ) {
+       // run Autopilot system
+       fgAPRun();
+
+       // printf("updating flight model x %d\n", multi_loop);
+       fgFlightModelUpdate(current_options.get_flight_model(), f, multi_loop);
+    } else {
+       fgFlightModelUpdate(current_options.get_flight_model(), f, 0);
+    }
 
     // update the view angle
     for ( i = 0; i < multi_loop; i++ ) {
@@ -492,6 +426,18 @@ void fgUpdateTimeDepCalcs(int multi_loop) {
            }
        }
     }
+
+    double tmp = -(l->sun_rotation + FG_PI) - (FG_Psi - v->view_offset);
+    while ( tmp < 0.0 ) {
+       tmp += FG_2PI;
+    }
+    while ( tmp > FG_2PI ) {
+       tmp -= FG_2PI;
+    }
+    /* printf("Psi = %.2f, viewoffset = %.2f sunrot = %.2f rottosun = %.2f\n",
+          FG_Psi * RAD_TO_DEG, v->view_offset * RAD_TO_DEG, 
+          -(l->sun_rotation+FG_PI) * RAD_TO_DEG, tmp * RAD_TO_DEG); */
+    l->UpdateAdjFog();
 }
 
 
@@ -504,10 +450,13 @@ void fgInitTimeDepCalcs( void ) {
 
 }
 
+static const double alt_adjust_ft = 3.758099;
+static const double alt_adjust_m = alt_adjust_ft * FEET_TO_METER;
 
 // What should we do when we have nothing else to do?  Let's get ready
 // for the next move and update the display?
 static void fgMainLoop( void ) {
+    fgCONTROLS *c;
     fgFLIGHT *f;
     fgGENERAL *g;
     fgTIME *t;
@@ -518,6 +467,7 @@ static void fgMainLoop( void ) {
     // double joy_x, joy_y;
     // int joy_b1, joy_b2;
 
+    c = &cur_control_params;
     f = current_aircraft.flight;
     g = &general;
     t = &cur_time_params;
@@ -525,6 +475,8 @@ static void fgMainLoop( void ) {
     fgPrintf( FG_ALL, FG_DEBUG, "Running Main Loop\n");
     fgPrintf( FG_ALL, FG_DEBUG, "======= ==== ====\n");
 
+    fgWeatherUpdate();
+
     // Fix elevation.  I'm just sticking this here for now, it should
     // probably move eventually
 
@@ -535,15 +487,14 @@ static void fgMainLoop( void ) {
 
     if ( scenery.cur_elev > -9990 ) {
        if ( FG_Altitude * FEET_TO_METER < 
-            (scenery.cur_elev + 3.758099 * FEET_TO_METER - 3.0) ) {
+            (scenery.cur_elev + alt_adjust_m - 3.0) ) {
            // now set aircraft altitude above ground
            printf("Current Altitude = %.2f < %.2f forcing to %.2f\n", 
                   FG_Altitude * FEET_TO_METER,
-                  scenery.cur_elev + 3.758099 * FEET_TO_METER - 3.0,
-                  scenery.cur_elev + 3.758099 * FEET_TO_METER);
-           fgFlightModelSetAltitude( FG_LARCSIM, f, 
-                                     scenery.cur_elev + 
-                                     3.758099 * FEET_TO_METER);
+                  scenery.cur_elev + alt_adjust_m - 3.0,
+                  scenery.cur_elev + alt_adjust_m );
+           fgFlightModelSetAltitude( current_options.get_flight_model(), f, 
+                                     scenery.cur_elev + alt_adjust_m );
 
            fgPrintf( FG_ALL, FG_BULK, 
                      "<*> resetting altitude to %.0f meters\n", 
@@ -625,7 +576,14 @@ static void fgMainLoop( void ) {
 
     // Run audio scheduler
 #ifdef ENABLE_AUDIO_SUPPORT
-    audio_sched -> update();
+    if ( current_options.get_sound() && audio_sched->working() ) {
+       double param = c->throttle[0] * 2.0 + 1.0;
+
+       pitch_envelope.setStep  ( 0, 0.01, param );
+       volume_envelope.setStep ( 0, 0.01, param );
+
+       audio_sched -> update();
+    }
 #endif
 
     // redraw display
@@ -645,9 +603,6 @@ static void fgMainLoop( void ) {
 
 static void fgIdleFunction ( void ) {
     fgGENERAL *g;
-    char path[256], mp3file[256], command[256], slfile[256];
-    static char *lockfile = "/tmp/mpg123.running";
-
     g = &general;
 
     // printf("idle state == %d\n", idle_state);
@@ -663,16 +618,14 @@ static void fgIdleFunction ( void ) {
        // Start the intro music
 #if !defined(WIN32)
        if ( current_options.get_intro_music() ) {
-           current_options.get_fg_root(mp3file);
-           strcat(mp3file, "/Sounds/");
-           strcat(mp3file, "intro.mp3");
-
-           sprintf(command, 
-                   "(touch %s; mpg123 %s > /dev/null 2>&1; /bin/rm %s) &", 
-                   lockfile, mp3file, lockfile );
+           string lockfile = "/tmp/mpg123.running";
+           string mp3file = current_options.get_fg_root() +
+               "/Sounds/intro.mp3";
+           string command = "(touch " + lockfile + "; mpg123 " + mp3file +
+                "> /dev/null 2>&1; /bin/rm " + lockfile + ") &";
            fgPrintf( FG_GENERAL, FG_INFO, 
-                     "Starting intro music: %s\n", mp3file);
-           system(command);
+                     "Starting intro music: %s\n", mp3file.c_str() );
+           system ( command.c_str() );
        }
 #endif
 
@@ -680,10 +633,7 @@ static void fgIdleFunction ( void ) {
     } else if ( idle_state == 2 ) {
        // These are a few miscellaneous things that aren't really
        // "subsystems" but still need to be initialized.
-       if( !fgInitGeneral()) {
-           fgPrintf( FG_GENERAL, FG_EXIT, 
-                     "General initializations failed ...\n" );
-       }
+
 #ifdef USE_GLIDE
        if ( strstr ( g->glRenderer, "Glide" ) ) {
            grTexLodBiasValue ( GR_TMU0, 1.0 ) ;
@@ -714,8 +664,6 @@ static void fgIdleFunction ( void ) {
 
        idle_state++;
     } else if ( idle_state == 5 ) {
-       //Init the user interface
-       guiInit();
 
        idle_state++;
     } else if ( idle_state == 6 ) {
@@ -725,11 +673,12 @@ static void fgIdleFunction ( void ) {
 #if !defined(WIN32)
        if ( current_options.get_intro_music() ) {
            // Let's wait for mpg123 to finish
+           string lockfile = "/tmp/mpg123.running";
            struct stat stat_buf;
 
            fgPrintf( FG_GENERAL, FG_INFO, 
                      "Waiting for mpg123 player to finish ...\n" );
-           while ( stat(lockfile, &stat_buf) == 0 ) {
+           while ( stat(lockfile.c_str(), &stat_buf) == 0 ) {
                // file exist, wait ...
                sleep(1);
                fgPrintf( FG_GENERAL, FG_INFO, ".");
@@ -740,20 +689,27 @@ static void fgIdleFunction ( void ) {
 
        audio_sched = new slScheduler ( 8000 );
        audio_mixer = new smMixer;
-       audio_mixer -> setMasterVolume ( 30 ) ;  /* 50% of max volume. */
+       audio_mixer -> setMasterVolume ( 50 ) ;  /* 80% of max volume. */
        audio_sched -> setSafetyMargin ( 1.0 ) ;
-       current_options.get_fg_root(path);
-       strcat(path, "/Sounds/");
-       strcpy(slfile, path);
-       strcat(slfile, "wasp.wav");
-
-       s1 = new slSample ( slfile );
-       // s1 = new slSample ( "/dos/X-System-HSR/sounds/xp_recip.wav", 
-       //                     audio_sched );
+       string slfile = current_options.get_fg_root() + "/Sounds/wasp.wav";
+
+       s1 = new slSample ( (char *)slfile.c_str() );
        printf("Rate = %d  Bps = %d  Stereo = %d\n", 
               s1 -> getRate(), s1 -> getBps(), s1 -> getStereo());
        audio_sched -> loopSample ( s1 );
-       
+
+       if ( audio_sched->working() ) {
+           pitch_envelope.setStep  ( 0, 0.01, 0.6 );
+           volume_envelope.setStep ( 0, 0.01, 0.6 );
+
+           audio_sched -> addSampleEnvelope( s1, 0, 0, &
+                                             pitch_envelope,
+                                             SL_PITCH_ENVELOPE );
+           audio_sched -> addSampleEnvelope( s1, 0, 1, 
+                                             &volume_envelope,
+                                             SL_VOLUME_ENVELOPE );
+       }
+
        // strcpy(slfile, path);
        // strcat(slfile, "thunder.wav");
        // s2 -> loadFile ( slfile );
@@ -761,7 +717,7 @@ static void fgIdleFunction ( void ) {
        // audio_sched -> playSample ( s2 );
 #endif
 
-       sleep(1);
+       // sleep(1);
        idle_state = 1000;
     } 
 
@@ -787,7 +743,11 @@ static void fgReshape( int width, int height ) {
     // Do this so we can call fgReshape(0,0) ourselves without having
     // to know what the values of width & height are.
     if ( (height > 0) && (width > 0) ) {
-       v->win_ratio = (GLfloat) width / (GLfloat) height;
+       if ( ! current_options.get_panel_status() ) {
+           v->win_ratio = (GLfloat) width / (GLfloat) height;
+       } else {
+           v->win_ratio = (GLfloat) width / ((GLfloat) (height)*0.67);
+       }
     }
 
     v->winWidth = width;
@@ -799,7 +759,10 @@ static void fgReshape( int width, int height ) {
        // yes we've finished all our initializations and are running
        // the main loop, so this will now work without seg faulting
        // the system.
-       fgUpdateViewParams();
+       v->UpdateViewParams();
+       if ( current_options.get_panel_status() ) {
+           fgPanelReInit();
+       }
     }
     
     // xglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
@@ -813,13 +776,25 @@ int fgGlutInit( int *argc, char **argv ) {
     xglutInit(argc, argv);
 
     // Define Display Parameters
-    xglutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
+    if ( ! current_options.get_panel_status() ) {
+       xglutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
+    } else {
+       xglutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | 
+                             GLUT_STENCIL);
+    }
 
     // Define initial window size
     xglutInitWindowSize(640, 480);
 
     // Initialize windows
-    xglutCreateWindow("Flight Gear");
+    if ( current_options.get_game_mode() == 0 ) {
+       // Open the regular window
+       xglutCreateWindow("Flight Gear");
+    } else {
+       // Open the cool new 'game mode' window
+       glutGameModeString("width=640 height=480 bpp=16");
+       glutEnterGameMode();
+    }
 
     return(1);
 }
@@ -853,8 +828,6 @@ int fgGlutInitEvents( void ) {
 // Main ...
 int main( int argc, char **argv ) {
     fgFLIGHT *f;
-    char config[256];
-    int result;  // Used in command line argument.
 
     f = current_aircraft.flight;
 
@@ -867,39 +840,50 @@ int main( int argc, char **argv ) {
 
     fgPrintf(FG_GENERAL, FG_INFO, "Flight Gear:  Version %s\n\n", VERSION);
 
-    // Initialize the Window/Graphics environment.
-    if( !fgGlutInit(&argc, argv) ) {
-       fgPrintf( FG_GENERAL, FG_EXIT, "GLUT initialization failed ...\n" );
-    }
-
-    // Initialize the various GLUT Event Handlers.
-    if( !fgGlutInitEvents() ) {
-       fgPrintf( FG_GENERAL, FG_EXIT, 
-                 "GLUT event handler initialization failed ...\n" );
-    }
-
     // Attempt to locate and parse a config file
     // First check fg_root
-    current_options.get_fg_root(config);
-    strcat(config, "/system.fgfsrc");
-    result = current_options.parse_config_file(config);
+    string config = current_options.get_fg_root() + "/system.fgfsrc";
+    current_options.parse_config_file( config );
 
     // Next check home directory
-    if ( getenv("HOME") != NULL ) {
-       strcpy(config, getenv("HOME"));
-       strcat(config, "/.fgfsrc");
-       result = current_options.parse_config_file(config);
+    char* envp = ::getenv( "HOME" );
+    if ( envp != NULL ) {
+       config = envp;
+       config += "/.fgfsrc";
+       current_options.parse_config_file( config );
     }
 
     // Parse remaining command line options
     // These will override anything specified in a config file
-    result = current_options.parse_command_line(argc, argv);
-    if ( result != FG_OPTIONS_OK ) {
+    if ( current_options.parse_command_line(argc, argv) !=
+                                     fgOPTIONS::FG_OPTIONS_OK )
+    {
        // Something must have gone horribly wrong with the command
        // line parsing or maybe the user just requested help ... :-)
        current_options.usage();
        fgPrintf( FG_GENERAL, FG_EXIT, "\nExiting ...\n");
     }
+    
+    // Initialize the Window/Graphics environment.
+    if( !fgGlutInit(&argc, argv) ) {
+       fgPrintf( FG_GENERAL, FG_EXIT, "GLUT initialization failed ...\n" );
+    }
+
+    // Initialize the various GLUT Event Handlers.
+    if( !fgGlutInitEvents() ) {
+       fgPrintf( FG_GENERAL, FG_EXIT, 
+                 "GLUT event handler initialization failed ...\n" );
+    }
+
+    // First do some quick general initializations
+    if( !fgInitGeneral()) {
+       fgPrintf( FG_GENERAL, FG_EXIT, 
+                 "General initializations failed ...\n" );
+    }
+
+    // Init the user interface (we need to do this before passing off
+    // control to glut
+    guiInit();
 
     // pass control off to the master GLUT event handler
     glutMainLoop();
@@ -910,6 +894,105 @@ int main( int argc, char **argv ) {
 
 
 // $Log$
+// Revision 1.58  1998/10/16 23:27:52  curt
+// C++-ifying.
+//
+// Revision 1.57  1998/10/16 00:54:00  curt
+// Converted to Point3D class.
+//
+// Revision 1.56  1998/10/02 12:46:47  curt
+// Added an "auto throttle"
+//
+// Revision 1.55  1998/09/29 14:58:18  curt
+// Use working() instead of !not_working() for audio.
+//
+// Revision 1.54  1998/09/29 02:03:38  curt
+// Autopilot mods.
+//
+// Revision 1.53  1998/09/26 13:18:35  curt
+// Check if audio "working()" before doing audio manipulations.
+//
+// Revision 1.52  1998/09/25 16:02:07  curt
+// Added support for pitch and volume envelopes and tied them to the
+// throttle setting.
+//
+// Revision 1.51  1998/09/15 04:27:28  curt
+// Changes for new Astro code.
+//
+// Revision 1.50  1998/09/15 02:09:24  curt
+// Include/fg_callback.hxx
+//   Moved code inline to stop g++ 2.7 from complaining.
+//
+// Simulator/Time/event.[ch]xx
+//   Changed return type of fgEVENT::printStat().  void caused g++ 2.7 to
+//   complain bitterly.
+//
+// Minor bugfix and changes.
+//
+// Simulator/Main/GLUTmain.cxx
+//   Added missing type to idle_state definition - eliminates a warning.
+//
+// Simulator/Main/fg_init.cxx
+//   Changes to airport lookup.
+//
+// Simulator/Main/options.cxx
+//   Uses fg_gzifstream when loading config file.
+//
+// Revision 1.49  1998/09/09 16:25:39  curt
+// Only use GLUT_STENCIL if the instument panel has been requested.
+//
+// Revision 1.48  1998/08/28 18:15:03  curt
+// Added new cockpit code from Friedemann Reinhard
+// <mpt218@faupt212.physik.uni-erlangen.de>
+//
+// Revision 1.47  1998/08/27 17:02:04  curt
+// Contributions from Bernie Bright <bbright@c031.aone.net.au>
+// - use strings for fg_root and airport_id and added methods to return
+//   them as strings,
+// - inlined all access methods,
+// - made the parsing functions private methods,
+// - deleted some unused functions.
+// - propogated some of these changes out a bit further.
+//
+// Revision 1.46  1998/08/22  14:49:56  curt
+// Attempting to iron out seg faults and crashes.
+// Did some shuffling to fix a initialization order problem between view
+// position, scenery elevation.
+//
+// Revision 1.45  1998/08/20 20:32:31  curt
+// Reshuffled some of the code in and around views.[ch]xx
+//
+// Revision 1.44  1998/08/20 15:10:33  curt
+// Added GameGLUT support.
+//
+// Revision 1.43  1998/08/12 21:01:47  curt
+// Master volume from 30% -> 80%
+//
+// Revision 1.42  1998/07/30 23:48:25  curt
+// Output position & orientation when pausing.
+// Eliminated libtool use.
+// Added options to specify initial position and orientation.
+// Changed default fov to 55 degrees.
+// Added command line option to start in paused or unpaused state.
+//
+// Revision 1.41  1998/07/27 18:41:24  curt
+// Added a pause command "p"
+// Fixed some initialization order problems between pui and glut.
+// Added an --enable/disable-sound option.
+//
+// Revision 1.40  1998/07/24 21:56:59  curt
+// Set near clip plane to 0.5 meters when close to the ground.  Also, let the view get a bit closer to the ground before hitting the hard limit.
+//
+// Revision 1.39  1998/07/24 21:39:08  curt
+// Debugging output tweaks.
+// Cast glGetString to (char *) to avoid compiler errors.
+// Optimizations to fgGluLookAt() by Norman Vine.
+//
+// Revision 1.38  1998/07/22 21:40:43  curt
+// Clear to adjusted fog color (for sunrise/sunset effects)
+// Make call to fog sunrise/sunset adjustment method.
+// Add a stdc++ library bug work around to fg_init.cxx
+//
 // Revision 1.37  1998/07/20 12:49:44  curt
 // Tweaked color buffer clearing defaults.  We clear the color buffer if we
 // are doing textures.  Assumptions:  If we are doing textures we have hardware