#include <stdio.h>
#include <stdlib.h>
+// work around a stdc++ lib bug in some versions of linux, but doesn't
+// seem to hurt to have this here for all versions of Linux.
+#ifdef linux
+# define _G_NO_EXTERN_TEMPLATES
+#endif
+
+#include <string.h>
+
#include <Include/fg_constants.h>
#include <Include/general.h>
#include <Cockpit/cockpit.hxx>
#include <Debug/fg_debug.h>
#include <Joystick/joystick.h>
+#include <Math/fg_geodesy.h>
#include <Math/fg_random.h>
-#include <Scenery/scenery.h>
+#include <Math/polar3d.hxx>
+#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Time/event.hxx>
#include <Time/fg_time.hxx>
#include "options.hxx"
#include "views.hxx"
-// extern int show_hud; // HUD state
-extern int displayInstruments;
+
extern const char *default_root;
-// Set initial position
+// Set initial position and orientation
int fgInitPosition( void ) {
+ char id[5];
fgFLIGHT *f;
- fgOPTIONS *o;
f = current_aircraft.flight;
- o = ¤t_options;
-
- // If nothing else is specified, default initial position is
- // Globe, AZ (P13)
- FG_Longitude = ( -110.6642444 ) * DEG_TO_RAD;
- FG_Latitude = ( 33.3528917 ) * DEG_TO_RAD;
- FG_Runway_altitude = (3234.5 + 300);
- FG_Altitude = FG_Runway_altitude + 3.758099;
-
- // Initial Position north of the city of Globe
- // FG_Longitude = ( -398673.28 / 3600.0 ) * DEG_TO_RAD;
- // FG_Latitude = ( 120625.64 / 3600.0 ) * DEG_TO_RAD;
- // FG_Longitude = ( -397867.44 / 3600.0 ) * DEG_TO_RAD;
- // FG_Latitude = ( 119548.21 / 3600.0 ) * DEG_TO_RAD;
- // FG_Altitude = 0.0 + 3.758099;
-
- // Initial Position near where I used to live in Globe, AZ
- // FG_Longitude = ( -398757.6 / 3600.0 ) * DEG_TO_RAD;
- // FG_Latitude = ( 120160.0 / 3600.0 ) * DEG_TO_RAD;
- // FG_Runway_altitude = 4000.0;
- // FG_Altitude = FG_Runway_altitude + 3.758099;
-
- // Initial Position: 10125 Jewell St. NE
- // FG_Longitude = ( -93.15 ) * DEG_TO_RAD;
- // FG_Latitude = ( 45.15 ) * DEG_TO_RAD;
- // FG_Runway_altitude = 950.0;
- // FG_Altitude = FG_Runway_altitude + 3.758099;
-
- // Initial Position: Somewhere near the Grand Canyon
- // FG_Longitude = ( -112.5 ) * DEG_TO_RAD;
- // FG_Latitude = ( 36.5 ) * DEG_TO_RAD;
- // FG_Runway_altitude = 8000.0;
- // FG_Altitude = FG_Runway_altitude + 3.758099;
-
- // Initial Position: Jim Brennon's Kingmont Observatory
- // FG_Longitude = ( -121.1131667 ) * DEG_TO_RAD;
- // FG_Latitude = ( 38.8293917 ) * DEG_TO_RAD;
- // FG_Runway_altitude = 920.0;
- // FG_Altitude = FG_Runway_altitude + 3.758099;
-
- // probably interesting for european team members
- // That is: If I can get the scenery to work -;) (Durk)
-
- // Eclipse Watching w73.5 n10 (approx) 18:00 UT
- // FG_Longitude = ( -73.5 ) * DEG_TO_RAD;
- // FG_Latitude = ( 10.0 ) * DEG_TO_RAD;
- // FG_Runway_altitude = 0.0;
- // FG_Altitude = FG_Runway_altitude + 3.758099;
-
- // Test Position
- // FG_Longitude = ( -109.5 ) * DEG_TO_RAD;
- // FG_Latitude = ( 32.5 ) * DEG_TO_RAD;
- // FG_Runway_altitude = (2646 + 2000);
- // FG_Altitude = FG_Runway_altitude + 3.758099;
-
- if ( strlen(o->airport_id) ) {
+
+ current_options.get_airport_id(id);
+ if ( strlen(id) ) {
+ // set initial position from airport id
+
fgAIRPORTS airports;
fgAIRPORT a;
fgPrintf( FG_GENERAL, FG_INFO,
"Attempting to set starting position from airport code %s.\n",
- o->airport_id);
+ id);
airports.load("Airports");
- a = airports.search(o->airport_id);
- if ( strcmp(a.id, "none") == 0 ) {
+ a = airports.search(id);
+ if ( (fabs(a.longitude) < FG_EPSILON) &&
+ (fabs(a.latitude) < FG_EPSILON) &&
+ (fabs(a.elevation) < FG_EPSILON) ) {
fgPrintf( FG_GENERAL, FG_EXIT,
- "Failed to find %s in database.\n", o->airport_id);
+ "Failed to find %s in database.\n", id);
} else {
FG_Longitude = ( a.longitude ) * DEG_TO_RAD;
FG_Latitude = ( a.latitude ) * DEG_TO_RAD;
- FG_Runway_altitude = ( a.elevation + 300 );
- FG_Altitude = FG_Runway_altitude + 3.758099;
- }
+ }
+ } else {
+ // set initial position from default or command line coordinates
+
+ FG_Longitude = current_options.get_lon() * DEG_TO_RAD;
+ FG_Latitude = current_options.get_lat() * DEG_TO_RAD;
}
+ printf("starting altitude is = %.2f\n", current_options.get_altitude());
+
+ FG_Altitude = current_options.get_altitude() * METER_TO_FEET;
+ FG_Runway_altitude = FG_Altitude - 3.758099;
+
fgPrintf( FG_GENERAL, FG_INFO,
"Initial position is: (%.4f, %.4f, %.2f)\n",
FG_Longitude * RAD_TO_DEG, FG_Latitude * RAD_TO_DEG,
// General house keeping initializations
int fgInitGeneral( void ) {
fgGENERAL *g;
+ char root[256];
+ int i;
g = &general;
fgPrintf( FG_GENERAL, FG_INFO, "General Initialization\n" );
fgPrintf( FG_GENERAL, FG_INFO, "======= ==============\n" );
- // determine the fg root path.
- if( !(g->root_dir) ) {
- // If not set by command line test for environmental var..
- g->root_dir = getenv("FG_ROOT");
- if ( !g->root_dir ) {
- // No root path set? Then assume, we will exit if this is
- // wrong when looking for support files.
- fgPrintf( FG_GENERAL, FG_EXIT, "%s %s\n",
- "Cannot continue without environment variable FG_ROOT",
- "being defined.");
- }
+ g->glVendor = (char *)glGetString ( GL_VENDOR );
+ g->glRenderer = (char *)glGetString ( GL_RENDERER );
+ g->glVersion = (char *)glGetString ( GL_VERSION );
+
+ current_options.get_fg_root(root);
+ if ( !strlen(root) ) {
+ // No root path set? Then bail ...
+ fgPrintf( FG_GENERAL, FG_EXIT, "%s %s\n",
+ "Cannot continue without environment variable FG_ROOT",
+ "being defined.");
+ }
+ fgPrintf( FG_GENERAL, FG_INFO, "FG_ROOT = %s\n\n", root);
+
+ // prime the frame rate counter pump
+ for ( i = 0; i < FG_FRAME_RATE_HISTORY; i++ ) {
+ g->frames[i] = 0.0;
}
- fgPrintf( FG_GENERAL, FG_INFO, "FG_ROOT = %s\n\n", g->root_dir);
return ( 1 );
}
+// convert a geodetic point lon(radians), lat(radians), elev(meter) to
+// a cartesian point
+fgPoint3d geod_to_cart(double geod[3]) {
+ fgPoint3d cp;
+ fgPoint3d pp;
+ double gc_lon, gc_lat, sl_radius;
+
+ // printf("A geodetic point is (%.2f, %.2f, %.2f)\n",
+ // geod[0], geod[1], geod[2]);
+
+ gc_lon = geod[0];
+ fgGeodToGeoc(geod[1], geod[2], &sl_radius, &gc_lat);
+
+ // printf("A geocentric point is (%.2f, %.2f, %.2f)\n", gc_lon,
+ // gc_lat, sl_radius+geod[2]);
+
+ pp.lon = gc_lon;
+ pp.lat = gc_lat;
+ pp.radius = sl_radius + geod[2];
+ cp = fgPolarToCart3d(pp);
+
+ // printf("A cart point is (%.8f, %.8f, %.8f)\n", cp.x, cp.y, cp.z);
+
+ return(cp);
+}
+
+
// This is the top level init routine which calls all the other
// initialization routines. If you are adding a subsystem to flight
// gear, its initialization call should located in this routine.
// Returns non-zero if a problem encountered.
int fgInitSubsystems( void ) {
- double cur_elev;
-
fgFLIGHT *f;
- struct fgLIGHT *l;
- struct fgTIME *t;
- struct fgVIEW *v;
+ fgLIGHT *l;
+ fgTIME *t;
+ fgVIEW *v;
+ double geod_pos[3];
+ fgPoint3d abs_view_pos;
l = &cur_light_params;
t = &cur_time_params;
// seed the random number generater
fg_srandom();
- // The following section sets up the flight model EOM parameters
- // and should really be read in from one or more files.
-
- // Must happen before any of the flight model or control
- // parameters are set
-
+ // allocates structures so must happen before any of the flight
+ // model or control parameters are set
fgAircraftInit(); // In the future this might not be the case.
f = current_aircraft.flight;
// set the initial position
fgInitPosition();
+ // Initialize the Scenery Management subsystem
+ if ( fgSceneryInit() ) {
+ // Scenery initialized ok.
+ } else {
+ fgPrintf( FG_GENERAL, FG_EXIT, "Error in Scenery initialization!\n" );
+ }
+
+ if( fgTileMgrInit() ) {
+ // Load the local scenery data
+ fgTileMgrUpdate();
+ } else {
+ fgPrintf( FG_GENERAL, FG_EXIT,
+ "Error in Tile Manager initialization!\n" );
+ }
+
+ // calculalate a cartesian point somewhere along the line between
+ // the center of the earth and our view position
+ geod_pos[0] = FG_Longitude;
+ geod_pos[1] = FG_Latitude;
+ // doesn't have to be the exact elevation (this is good because we
+ // don't know it yet :-)
+ geod_pos[2] = 0;
+ abs_view_pos = geod_to_cart(geod_pos);
+
+ // Calculate ground elevation at starting point
+ scenery.cur_elev =
+ fgTileMgrCurElev( FG_Longitude, FG_Latitude, &abs_view_pos );
+ FG_Runway_altitude = scenery.cur_elev * METER_TO_FEET;
+
+ // Reset our altitude if we are below ground
+ if ( FG_Altitude < FG_Runway_altitude + 3.758099) {
+ FG_Altitude = FG_Runway_altitude + 3.758099;
+ }
+
+ fgPrintf( FG_GENERAL, FG_INFO,
+ "Updated position (after elevation adj): (%.4f, %.4f, %.2f)\n",
+ FG_Latitude * RAD_TO_DEG, FG_Longitude * RAD_TO_DEG,
+ FG_Altitude * FEET_TO_METER);
+ // end of thing that I just stuck in that I should probably move
+
+ // The following section sets up the flight model EOM parameters
+ // and should really be read in from one or more files.
+
// Initial Velocity
FG_V_north = 0.0; // 7.287719E+00
FG_V_east = 0.0; // 1.521770E+03
FG_V_down = 0.0; // -1.265722E-05
// Initial Orientation
- FG_Phi = -2.658474E-06;
- FG_Theta = 7.401790E-03;
- FG_Psi = 270.0 * DEG_TO_RAD;
+ FG_Phi = current_options.get_roll() * DEG_TO_RAD;
+ FG_Theta = current_options.get_pitch() * DEG_TO_RAD;
+ FG_Psi = current_options.get_heading() * DEG_TO_RAD;
// Initial Angular B rates
FG_P_body = 7.206685E-05;
FG_Dz_cg = 0.000000E+00;
// Initialize the event manager
- fgEventInit();
+ global_events.Init();
// Output event stats every 60 seconds
- fgEventRegister( "fgEventPrintStats()", fgEventPrintStats,
- FG_EVENT_READY, 60000 );
+ global_events.Register( "fgEventPrintStats()", fgEventPrintStats,
+ FG_EVENT_READY, 60000 );
// Initialize the time dependent variables
fgTimeInit(t);
fgTimeUpdate(f, t);
// Initialize view parameters
- // ---->
- fgViewInit(v);
- fgViewUpdate(f, v, l);
+ v->Init();
+ v->UpdateViewMath(f);
+ v->UpdateWorldToEye(f);
// Initialize the orbital elements of sun, moon and mayor planets
fgSolarSystemInit(*t);
}
// Initialize the planetary subsystem
- fgEventRegister("fgPlanetsInit()", fgPlanetsInit, FG_EVENT_READY, 600000);
+ global_events.Register( "fgPlanetsInit()", fgPlanetsInit,
+ FG_EVENT_READY, 600000);
// Initialize the sun's position
- fgEventRegister("fgSunInit()", fgSunInit, FG_EVENT_READY, 30000 );
+ global_events.Register( "fgSunInit()", fgSunInit,
+ FG_EVENT_READY, 30000 );
// Intialize the moon's position
- fgEventRegister( "fgMoonInit()", fgMoonInit, FG_EVENT_READY, 600000 );
+ global_events.Register( "fgMoonInit()", fgMoonInit,
+ FG_EVENT_READY, 600000 );
// fgUpdateSunPos() needs a few position and view parameters set
// so it can calculate local relative sun angle and a few other
// things for correctly orienting the sky.
- // ---->
fgUpdateSunPos();
// Initialize Lighting interpolation tables
- // ---->
- fgLightInit();
+ l->Init();
// update the lighting parameters (based on sun angle)
- fgEventRegister( "fgLightUpdate()", fgLightUpdate,
- FG_EVENT_READY, 30000 );
+ global_events.Register( "fgLightUpdate()", fgLightUpdate,
+ FG_EVENT_READY, 30000 );
// Initialize the weather modeling subsystem
fgWeatherInit();
// update the weather for our current position
- fgEventRegister( "fgWeatherUpdate()", fgWeatherUpdate,
- FG_EVENT_READY, 120000 );
+ global_events.Register( "fgWeatherUpdate()", fgWeatherUpdate,
+ FG_EVENT_READY, 120000 );
// Initialize the Cockpit subsystem
if( fgCockpitInit( ¤t_aircraft )) {
}
// Initialize the "sky"
- // ---->
fgSkyInit();
- // Initialize the Scenery Management subsystem
- if ( fgSceneryInit() ) {
- // Scenery initialized ok.
- } else {
- fgPrintf( FG_GENERAL, FG_EXIT, "Error in Scenery initialization!\n" );
- }
-
+ // Initialize the flight model subsystem data structures base on
+ // above values
- if( fgTileMgrInit() ) {
- // Load the local scenery data
- fgTileMgrUpdate();
- } else {
- fgPrintf( FG_GENERAL, FG_EXIT,
- "Error in Tile Manager initialization!\n" );
- }
+ fgFlightModelInit( current_options.get_flight_model(), f,
+ 1.0 / DEFAULT_MODEL_HZ );
// I'm just sticking this here for now, it should probably move
// eventually
- cur_elev = FG_Runway_altitude * FEET_TO_METER;
- if ( cur_elev > -9990.0 ) {
- FG_Runway_altitude = cur_elev * METER_TO_FEET;
- }
-
- if ( FG_Altitude < FG_Runway_altitude ) {
- FG_Altitude = FG_Runway_altitude + 3.758099;
- }
-
- fgPrintf( FG_GENERAL, FG_INFO,
- "Updated position (after elevation adj): (%.4f, %.4f, %.2f)\n",
- FG_Latitude * RAD_TO_DEG, FG_Longitude * RAD_TO_DEG,
- FG_Altitude * FEET_TO_METER);
- // end of thing that I just stuck in that I should probably move
-
- // Initialize the flight model subsystem data structures base on
- // above values
+ scenery.cur_elev = FG_Runway_altitude * FEET_TO_METER;
- fgFlightModelInit( FG_LARCSIM, f, 1.0 / DEFAULT_MODEL_HZ );
+ if ( FG_Altitude < FG_Runway_altitude + 3.758099) {
+ FG_Altitude = FG_Runway_altitude + 3.758099;
+ }
- // Let's not show the instrument panel
- displayInstruments = 0;
+ fgPrintf( FG_GENERAL, FG_INFO,
+ "Updated position (after elevation adj): (%.4f, %.4f, %.2f)\n",
+ FG_Latitude * RAD_TO_DEG, FG_Longitude * RAD_TO_DEG,
+ FG_Altitude * FEET_TO_METER);
+ // end of thing that I just stuck in that I should probably move
// Joystick support
if (fgJoystickInit(0) ) {
// $Log$
+// Revision 1.31 1998/08/22 14:49:57 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.30 1998/08/20 20:32:33 curt
+// Reshuffled some of the code in and around views.[ch]xx
+//
+// Revision 1.29 1998/07/30 23:48:27 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.28 1998/07/27 18:41:25 curt
+// Added a pause command "p"
+// Fixed some initialization order problems between pui and glut.
+// Added an --enable/disable-sound option.
+//
+// Revision 1.27 1998/07/24 21:39:10 curt
+// Debugging output tweaks.
+// Cast glGetString to (char *) to avoid compiler errors.
+// Optimizations to fgGluLookAt() by Norman Vine.
+//
+// Revision 1.26 1998/07/22 21:40:44 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.25 1998/07/13 21:01:38 curt
+// Wrote access functions for current fgOPTIONS.
+//
+// Revision 1.24 1998/07/13 15:32:39 curt
+// Clear color buffer if drawing wireframe.
+// When specifying and airport, start elevation at -1000 and let the system
+// position you at ground level.
+//
+// Revision 1.23 1998/07/12 03:14:43 curt
+// Added ground collision detection.
+// Did some serious horsing around to be able to "hug" the ground properly
+// and still be able to take off.
+// Set the near clip plane to 1.0 meters when less than 10 meters above the
+// ground.
+// Did some serious horsing around getting the initial airplane position to be
+// correct based on rendered terrain elevation.
+// Added a little cheat/hack that will prevent the view position from ever
+// dropping below the terrain, even when the flight model doesn't quite
+// put you as high as you'd like.
+//
+// Revision 1.22 1998/07/04 00:52:25 curt
+// Add my own version of gluLookAt() (which is nearly identical to the
+// Mesa/glu version.) But, by calculating the Model View matrix our selves
+// we can save this matrix without having to read it back in from the video
+// card. This hopefully allows us to save a few cpu cycles when rendering
+// out the fragments because we can just use glLoadMatrixd() with the
+// precalculated matrix for each tile rather than doing a push(), translate(),
+// pop() for every fragment.
+//
+// Panel status defaults to off for now until it gets a bit more developed.
+//
+// Extract OpenGL driver info on initialization.
+//
+// Revision 1.21 1998/06/27 16:54:33 curt
+// Replaced "extern displayInstruments" with a entry in fgOPTIONS.
+// Don't change the view port when displaying the panel.
+//
+// Revision 1.20 1998/06/17 21:35:12 curt
+// Refined conditional audio support compilation.
+// Moved texture parameter setup calls to ../Scenery/materials.cxx
+// #include <string.h> before various STL includes.
+// Make HUD default state be enabled.
+//
+// Revision 1.19 1998/06/08 17:57:05 curt
+// Minor sound/startup position tweaks.
+//
+// Revision 1.18 1998/06/03 00:47:14 curt
+// Updated to compile in audio support if OSS available.
+// Updated for new version of Steve's audio library.
+// STL includes don't use .h
+// Small view optimizations.
+//
+// Revision 1.17 1998/06/01 17:54:42 curt
+// Added Linux audio support.
+// avoid glClear( COLOR_BUFFER_BIT ) when not using it to set the sky color.
+// map stl tweaks.
+//
+// Revision 1.16 1998/05/29 20:37:24 curt
+// Tweaked material properties & lighting a bit in GLUTmain.cxx.
+// Read airport list into a "map" STL for dynamic list sizing and fast tree
+// based lookups.
+//
+// Revision 1.15 1998/05/22 21:28:53 curt
+// Modifications to use the new fgEVENT_MGR class.
+//
+// Revision 1.14 1998/05/20 20:51:35 curt
+// Tweaked smooth shaded texture lighting properties.
+// Converted fgLIGHT to a C++ class.
+//
+// Revision 1.13 1998/05/16 13:08:35 curt
+// C++ - ified views.[ch]xx
+// Shuffled some additional view parameters into the fgVIEW class.
+// Changed tile-radius to tile-diameter because it is a much better
+// name.
+// Added a WORLD_TO_EYE transformation to views.cxx. This allows us
+// to transform world space to eye space for view frustum culling.
+//
+// Revision 1.12 1998/05/13 18:29:58 curt
+// Added a keyboard binding to dynamically adjust field of view.
+// Added a command line option to specify fov.
+// Adjusted terrain color.
+// Root path info moved to fgOPTIONS.
+// Added ability to parse options out of a config file.
+//
+// Revision 1.11 1998/05/07 23:14:15 curt
+// Added "D" key binding to set autopilot heading.
+// Made frame rate calculation average out over last 10 frames.
+// Borland C++ floating point exception workaround.
+// Added a --tile-radius=n option.
+//
+// Revision 1.10 1998/05/06 03:16:24 curt
+// Added an averaged global frame rate counter.
+// Added an option to control tile radius.
+//
+// Revision 1.9 1998/05/03 00:47:31 curt
+// Added an option to enable/disable full-screen mode.
+//
+// Revision 1.8 1998/04/30 12:34:18 curt
+// Added command line rendering options:
+// enable/disable fog/haze
+// specify smooth/flat shading
+// disable sky blending and just use a solid color
+// enable wireframe drawing mode
+//
+// Revision 1.7 1998/04/28 01:20:22 curt
+// Type-ified fgTIME and fgVIEW.
+// Added a command line option to disable textures.
+//
+// Revision 1.6 1998/04/26 05:10:03 curt
+// "struct fgLIGHT" -> "fgLIGHT" because fgLIGHT is typedef'd.
+//
// Revision 1.5 1998/04/25 22:06:30 curt
// Edited cvs log messages in source files ... bad bad bad!
//