]> git.mxchange.org Git - flightgear.git/blobdiff - Main/fg_init.cxx
Attempting to iron out seg faults and crashes.
[flightgear.git] / Main / fg_init.cxx
index dd0890bd8096053664c9f712ae8385409ab57ffe..3a1726fbc80a203c8ed7932bf830433605bfdb5f 100644 (file)
 
 #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>
@@ -45,7 +52,9 @@
 #include <Cockpit/cockpit.hxx>
 #include <Debug/fg_debug.h>
 #include <Joystick/joystick.h>
+#include <Math/fg_geodesy.h>
 #include <Math/fg_random.h>
+#include <Math/polar3d.hxx>
 #include <Scenery/scenery.hxx>
 #include <Scenery/tilemgr.hxx>
 #include <Time/event.hxx>
 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 = &current_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 near KHSP (Hot Springs, VA)
-    // FG_Longitude = (-79.8338964 + 0.01) * DEG_TO_RAD;
-    // FG_Latitude  = ( 37.9514564 + 0.008) * DEG_TO_RAD;
-    // FG_Runway_altitude = (3792 + 2800);
-    // FG_Altitude = FG_Runway_altitude + 3.758099;
-
-    // Initial Position at (SEZ) SEDONA airport
-    // FG_Longitude = (-111.7884614 + 0.01) * DEG_TO_RAD;
-    // FG_Latitude  = (  34.8486289 - 0.015) * DEG_TO_RAD;
-    // FG_Runway_altitude = (4827 + 450);
-    // 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 = (  8.5 ) * DEG_TO_RAD;
-    // FG_Latitude  = ( 47.5 ) * DEG_TO_RAD;
-    FG_Runway_altitude = ( 6000 );
-    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);
+       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 + 200 );
-           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, 
@@ -171,23 +125,26 @@ int fgInitPosition( void ) {
 // General house keeping initializations
 int fgInitGeneral( void ) {
     fgGENERAL *g;
-    fgOPTIONS *o;
+    char root[256];
     int i;
 
     g = &general;
-    o = &current_options;
 
     fgPrintf( FG_GENERAL, FG_INFO, "General Initialization\n" );
     fgPrintf( FG_GENERAL, FG_INFO, "======= ==============\n" );
 
-    if ( !strlen(o->fg_root) ) { 
-       // No root path set? Then assume, we will exit if this is
-       // wrong when looking for support files.
+    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", o->fg_root);
+    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++ ) {
@@ -198,17 +155,44 @@ int fgInitGeneral( void ) {
 }
 
 
+// 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;
     fgLIGHT *l;
     fgTIME *t;
     fgVIEW *v;
+    double geod_pos[3];
+    fgPoint3d abs_view_pos;
 
     l = &cur_light_params;
     t = &cur_time_params;
@@ -220,27 +204,66 @@ int fgInitSubsystems( void ) {
     // 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;
@@ -274,7 +297,7 @@ int fgInitSubsystems( void ) {
 
     // Initialize view parameters
     v->Init();
-    v->Update(f);
+    v->UpdateViewMath(f);
     v->UpdateWorldToEye(f);
 
     // Initialize the orbital elements of sun, moon and mayor planets
@@ -328,43 +351,25 @@ int fgInitSubsystems( void ) {
     // 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;
+    }
+
+    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) ) {
@@ -383,6 +388,69 @@ int fgInitSubsystems( void ) {
 
 
 // $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.