-
-//
// 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
#include <XGL/xgl.h>
#include <stdio.h>
#include <string.h>
+#include <string>
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#include <Include/fg_constants.h> // for VERSION
#include <Include/general.h>
-#include <Aircraft/aircraft.h>
-#include <Astro/moon.hxx>
-#include <Astro/planets.hxx>
+#include <Aircraft/aircraft.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 <Debug/logstream.hxx>
#include <GUI/gui.h>
-#include <Joystick/joystick.h>
-#include <Math/fg_geodesy.h>
+#include <Joystick/joystick.hxx>
+#include <Math/fg_geodesy.hxx>
#include <Math/mat3.h>
#include <Math/polar3d.hxx>
#include <PUI/pu.h>
#include <Time/fg_time.hxx>
#include <Time/fg_timer.hxx>
#include <Time/sunpos.hxx>
-#include <Weather/weather.h>
+#include <Weather/weather.hxx>
#include "GLUTkey.hxx"
#include "fg_init.hxx"
// 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;
}
-// 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 = ¤t_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, 0.5, 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 IS_THIS_BETTER_THAN_A_ZERO_CHARLIE
// Draw a basic instrument panel
static void fgUpdateInstrViewParams( void ) {
fgTIME *t;
fgVIEW *v;
double angle;
+ 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 };
// 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->adj_fog_color[0], l->adj_fog_color[1],
// 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;
// draw stars and planets
fgStarsRender();
- fgPlanetsRender();
-
- // draw the sun
- fgSunRender();
-
- // render the moon
- xglEnable( GL_LIGHTING );
- xglEnable( GL_LIGHT0 );
- // 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();
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 ) ;
}
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 {
}
+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?
int elapsed, multi_loop;
int i;
double accum;
- // double joy_x, joy_y;
- // int joy_b1, joy_b2;
f = current_aircraft.flight;
g = &general;
t = &cur_time_params;
- fgPrintf( FG_ALL, FG_DEBUG, "Running Main Loop\n");
- fgPrintf( FG_ALL, FG_DEBUG, "======= ==== ====\n");
+ FG_LOG( FG_ALL, FG_DEBUG, "Running Main Loop");
+ FG_LOG( FG_ALL, FG_DEBUG, "======= ==== ====");
+
+ fgWeatherUpdate();
// Fix elevation. I'm just sticking this here for now, it should
// probably move eventually
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);
+ scenery.cur_elev + alt_adjust_m - 3.0,
+ scenery.cur_elev + alt_adjust_m );
fgFlightModelSetAltitude( current_options.get_flight_model(), f,
- scenery.cur_elev +
- 3.758099 * FEET_TO_METER);
+ scenery.cur_elev + alt_adjust_m );
- fgPrintf( FG_ALL, FG_BULK,
- "<*> resetting altitude to %.0f meters\n",
- FG_Altitude * FEET_TO_METER);
+ FG_LOG( FG_ALL, FG_BULK,
+ "<*> resetting altitude to "
+ << FG_Altitude * FEET_TO_METER << " meters" );
}
FG_Runway_altitude = scenery.cur_elev * METER_TO_FEET;
}
// update "time"
fgTimeUpdate(f, t);
- // Read joystick
- /* fgJoystickRead( &joy_x, &joy_y, &joy_b1, &joy_b2 );
- printf( "Joystick X %f Y %f B1 %d B2 %d\n",
- joy_x, joy_y, joy_b1, joy_b2 );
- fgElevSet( -joy_y );
- fgAileronSet( joy_x ); */
+#if defined( ENABLE_LINUX_JOYSTICK )
+ // Read joystick and update control settings
+ fgJoystickRead();
+#elif defined( ENABLE_GLUT_JOYSTICK )
+ // Glut joystick support works by feeding a joystick handler
+ // function to glut. This is taken care of once in the joystick
+ // init routine and we don't have to worry about it again.
+#endif
// Get elapsed time for this past frame
elapsed = fgGetTimeInterval();
- fgPrintf( FG_ALL, FG_BULK,
- "Time interval is = %d, previous remainder is = %d\n",
- elapsed, remainder);
+ FG_LOG( FG_ALL, FG_BULK,
+ "Time interval is = " << elapsed
+ << ", previous remainder is = " << remainder );
// Calculate frame rate average
if ( elapsed > 0.0 ) {
}
// Calculate model iterations needed for next frame
- fgPrintf( FG_ALL, FG_DEBUG,
- "--> Frame rate is = %.2f\n", g->frame_rate);
+ FG_LOG( FG_ALL, FG_DEBUG,
+ "--> Frame rate is = " << g->frame_rate );
elapsed += remainder;
multi_loop = (int)(((float)elapsed * 0.001) * DEFAULT_MODEL_HZ);
remainder = elapsed - ((multi_loop*1000) / DEFAULT_MODEL_HZ);
- fgPrintf( FG_ALL, FG_BULK,
- "Model iterations needed = %d, new remainder = %d\n",
- multi_loop, remainder);
+ FG_LOG( FG_ALL, FG_BULK,
+ "Model iterations needed = " << multi_loop
+ << ", new remainder = " << remainder );
/* printf("right before fm - ground = %.2f runway = %.2f alt = %.2f\n",
scenery.cur_elev,
// Run audio scheduler
#ifdef ENABLE_AUDIO_SUPPORT
- if ( current_options.get_sound() ) {
+ if ( current_options.get_sound() && audio_sched->working() ) {
+ double param = controls.get_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
fgRenderFrame();
- fgPrintf( FG_ALL, FG_DEBUG, "\n");
+ FG_LOG( FG_ALL, FG_DEBUG, "" );
}
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);
// 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 );
- fgPrintf( FG_GENERAL, FG_INFO,
- "Starting intro music: %s\n", mp3file);
- system ( command );
+ 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 + ") &";
+ FG_LOG( FG_GENERAL, FG_INFO,
+ "Starting intro music: " << mp3file );
+ system ( command.c_str() );
}
#endif
// a subsystem to flight gear, its initialization call should
// located in this routine.
if( !fgInitSubsystems()) {
- fgPrintf( FG_GENERAL, FG_EXIT,
- "Subsystem initializations failed ...\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT,
+ "Subsystem initializations failed ..." );
+ exit(-1);
}
idle_state++;
#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 ) {
+ FG_LOG( FG_GENERAL, FG_INFO,
+ "Waiting for mpg123 player to finish ..." );
+ while ( stat(lockfile.c_str(), &stat_buf) == 0 ) {
// file exist, wait ...
sleep(1);
- fgPrintf( FG_GENERAL, FG_INFO, ".");
+ FG_LOG( FG_GENERAL, FG_INFO, ".");
}
- fgPrintf( FG_GENERAL, FG_INFO, "\n");
+ FG_LOG( FG_GENERAL, FG_INFO, "");
}
#endif // WIN32
audio_sched = new slScheduler ( 8000 );
audio_mixer = new smMixer;
- audio_mixer -> setMasterVolume ( 80 ) ; /* 80% 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");
+ string slfile = current_options.get_fg_root() + "/Sounds/wasp.wav";
- s1 = new slSample ( slfile );
+ 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 );
// 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;
// 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 );
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);
// Main ...
int main( int argc, char **argv ) {
fgFLIGHT *f;
- char config[256];
- int result; // Used in command line argument.
f = current_aircraft.flight;
_control87(MCW_EM, MCW_EM); /* defined in float.h */
#endif
- // Initialize the debugging output system
- fgInitDebug();
+ // Initialize the [old] debugging output system
+ // fgInitDebug();
- fgPrintf(FG_GENERAL, FG_INFO, "Flight Gear: Version %s\n\n", VERSION);
+ FG_LOG( FG_GENERAL, FG_INFO, "Flight Gear: Version" << VERSION << endl );
// 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");
+ FG_LOG( FG_GENERAL, FG_ALERT, "\nExiting ...");
+ exit(-1);
}
// Initialize the Window/Graphics environment.
if( !fgGlutInit(&argc, argv) ) {
- fgPrintf( FG_GENERAL, FG_EXIT, "GLUT initialization failed ...\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT, "GLUT initialization failed ..." );
+ exit(-1);
}
// Initialize the various GLUT Event Handlers.
if( !fgGlutInitEvents() ) {
- fgPrintf( FG_GENERAL, FG_EXIT,
- "GLUT event handler initialization failed ...\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT,
+ "GLUT event handler initialization failed ..." );
+ exit(-1);
}
// First do some quick general initializations
if( !fgInitGeneral()) {
- fgPrintf( FG_GENERAL, FG_EXIT,
- "General initializations failed ...\n" );
+ FG_LOG( FG_GENERAL, FG_ALERT,
+ "General initializations failed ..." );
+ exit(-1);
}
// Init the user interface (we need to do this before passing off
// $Log$
+// Revision 1.63 1998/11/06 21:18:08 curt
+// Converted to new logstream debugging facility. This allows release
+// builds with no messages at all (and no performance impact) by using
+// the -DFG_NDEBUG flag.
+//
+// Revision 1.62 1998/10/27 02:14:35 curt
+// Changes to support GLUT joystick routines as fall back.
+//
+// Revision 1.61 1998/10/25 14:08:47 curt
+// Turned "struct fgCONTROLS" into a class, with inlined accessor functions.
+//
+// Revision 1.60 1998/10/25 10:57:18 curt
+// Changes to use the new joystick library if it is available.
+//
+// Revision 1.59 1998/10/17 01:34:21 curt
+// C++ ifying ...
+//
+// 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.
//