# define _G_NO_EXTERN_TEMPLATES
#endif
-#include <string.h>
+#include <string>
#include <Include/fg_constants.h>
#include <Include/general.h>
#include <Aircraft/aircraft.h>
-#include <Astro/moon.hxx>
-#include <Astro/planets.hxx>
+#include <Airports/simple.hxx>
+// #include <Astro/moon.hxx>
+// #include <Astro/planets.hxx>
#include <Astro/sky.hxx>
#include <Astro/stars.hxx>
-#include <Astro/sun.hxx>
-#include <Autopilot/autopilot.h>
+// #include <Astro/sun.hxx>
+#include <Astro/solarsystem.hxx>
+#include <Autopilot/autopilot.hxx>
#include <Cockpit/cockpit.hxx>
#include <Debug/fg_debug.h>
#include <Joystick/joystick.h>
+#include <Math/fg_geodesy.hxx>
#include <Math/fg_random.h>
+#include <Math/point3d.hxx>
+#include <Math/polar3d.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Time/event.hxx>
#include <Time/sunpos.hxx>
#include <Weather/weather.h>
-#include "airports.hxx"
#include "fg_init.hxx"
#include "options.hxx"
#include "views.hxx"
extern const char *default_root;
-// Set initial position
+// Set initial position and orientation
int fgInitPosition( void ) {
- char id[5];
+ string id;
fgFLIGHT *f;
f = current_aircraft.flight;
- // 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);
- FG_Altitude = -1000 /* 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;
-
- current_options.get_airport_id(id);
- if ( strlen(id) ) {
+ id = current_options.get_airport_id();
+ if ( id.length() ) {
+ // 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",
- id);
+ id.c_str() );
- airports.load("Airports");
- a = airports.search(id);
- if ( (fabs(a.longitude) < FG_EPSILON) &&
- (fabs(a.latitude) < FG_EPSILON) &&
- (fabs(a.elevation) < FG_EPSILON) ) {
+ airports.load("apt_simple");
+ if ( ! airports.search( id, &a ) ) {
fgPrintf( FG_GENERAL, FG_EXIT,
- "Failed to find %s in database.\n", id);
+ "Failed to find %s in database.\n", id.c_str() );
} else {
- FG_Longitude = ( a.longitude ) * DEG_TO_RAD;
- FG_Latitude = ( a.latitude ) * DEG_TO_RAD;
- FG_Runway_altitude = ( -1000 /* a.elevation */ );
- FG_Altitude = FG_Runway_altitude + 3.758099;
+ FG_Longitude = a.longitude * DEG_TO_RAD;
+ FG_Latitude = a.latitude * DEG_TO_RAD;
}
+ } 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;
}
-
- fgPrintf( FG_GENERAL, FG_INFO,
+ 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,
FG_Altitude * FEET_TO_METER);
// General house keeping initializations
int fgInitGeneral( void ) {
fgGENERAL *g;
- char root[256];
+ string root;
int i;
g = &general;
fgPrintf( FG_GENERAL, FG_INFO, "General Initialization\n" );
fgPrintf( FG_GENERAL, FG_INFO, "======= ==============\n" );
- g->glVendor = glGetString ( GL_VENDOR );
- g->glRenderer = glGetString ( GL_RENDERER );
- g->glVersion = glGetString ( GL_VERSION );
+ 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) ) {
+ root = current_options.get_fg_root();
+ if ( ! root.length() ) {
// 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);
+ fgPrintf( FG_GENERAL, FG_INFO, "FG_ROOT = %s\n\n", root.c_str() );
// prime the frame rate counter pump
for ( i = 0; i < FG_FRAME_RATE_HISTORY; i++ ) {
// 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 ) {
+int fgInitSubsystems( void )
+{
fgFLIGHT *f;
fgLIGHT *l;
fgTIME *t;
fgVIEW *v;
+ Point3D geod_pos, 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. Doesn't have to
+ // be the exact elevation (this is good because we don't know it
+ // yet :-)
+ geod_pos.setvals( FG_Longitude, FG_Latitude, 0.0);
+ abs_view_pos = fgGeodToCart(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;
global_events.Init();
// Output event stats every 60 seconds
- global_events.Register( "fgEventPrintStats()", fgEventPrintStats,
- FG_EVENT_READY, 60000 );
+ global_events.Register( "fgEVENT_MGR::PrintStats()",
+ fgMethodCallback<fgEVENT_MGR>( &global_events,
+ &fgEVENT_MGR::PrintStats),
+ fgEVENT::FG_EVENT_READY, 60000 );
// Initialize the time dependent variables
fgTimeInit(t);
// Initialize view parameters
v->Init();
- v->Update(f);
+ v->UpdateViewMath(f);
v->UpdateWorldToEye(f);
- // Initialize the orbital elements of sun, moon and mayor planets
- fgSolarSystemInit(*t);
+ // Build the solar system
+ //fgSolarSystemInit(*t);
+ fgPrintf(FG_GENERAL, FG_INFO, "Building SolarSystem\n");
+ SolarSystem::theSolarSystem = new SolarSystem(t);
// Initialize the Stars subsystem
if( fgStarsInit() ) {
}
// Initialize the planetary subsystem
- global_events.Register( "fgPlanetsInit()", fgPlanetsInit,
- FG_EVENT_READY, 600000);
+ // global_events.Register( "fgPlanetsInit()", fgPlanetsInit,
+ // fgEVENT::FG_EVENT_READY, 600000);
// Initialize the sun's position
- global_events.Register( "fgSunInit()", fgSunInit,
- FG_EVENT_READY, 30000 );
+ // global_events.Register( "fgSunInit()", fgSunInit,
+ // fgEVENT::FG_EVENT_READY, 30000 );
// Intialize the moon's position
- global_events.Register( "fgMoonInit()", fgMoonInit,
- FG_EVENT_READY, 600000 );
+ // global_events.Register( "fgMoonInit()", fgMoonInit,
+ // fgEVENT::FG_EVENT_READY, 600000 );
+ // register the periodic update of Sun, moon, and planets
+ global_events.Register( "ssolsysUpdate", solarSystemRebuild,
+ fgEVENT::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();
+ global_events.Register( "fgUpdateSunPos()", fgUpdateSunPos,
+ fgEVENT::FG_EVENT_READY, 60000);
// Initialize Lighting interpolation tables
l->Init();
// update the lighting parameters (based on sun angle)
- global_events.Register( "fgLightUpdate()", fgLightUpdate,
- FG_EVENT_READY, 30000 );
+ global_events.Register( "fgLight::Update()",
+ fgMethodCallback<fgLIGHT>( &cur_light_params,
+ &fgLIGHT::Update),
+ fgEVENT::FG_EVENT_READY, 30000 );
// Initialize the weather modeling subsystem
fgWeatherInit();
- // update the weather for our current position
- global_events.Register( "fgWeatherUpdate()", fgWeatherUpdate,
- FG_EVENT_READY, 120000 );
-
// Initialize the Cockpit subsystem
if( fgCockpitInit( ¤t_aircraft )) {
// Cockpit initialized ok.
// 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" );
- }
-
- if( fgTileMgrInit() ) {
- // Load the local scenery data
- fgTileMgrUpdate();
- } else {
- fgPrintf( FG_GENERAL, FG_EXIT,
- "Error in Tile Manager initialization!\n" );
- }
-
- // I'm just sticking this here for now, it should probably move
- // eventually
- scenery.cur_elev = FG_Runway_altitude * FEET_TO_METER;
-
- 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
-
// Initialize the flight model subsystem data structures base on
// above values
- fgFlightModelInit( FG_LARCSIM, f, 1.0 / DEFAULT_MODEL_HZ );
+ 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
// $Log$
+// Revision 1.42 1998/10/16 23:27:54 curt
+// C++-ifying.
+//
+// Revision 1.41 1998/10/16 00:54:01 curt
+// Converted to Point3D class.
+//
+// Revision 1.40 1998/10/02 12:46:49 curt
+// Added an "auto throttle"
+//
+// Revision 1.39 1998/09/29 02:03:39 curt
+// Autopilot mods.
+//
+// Revision 1.38 1998/09/15 04:27:30 curt
+// Changes for new Astro code.
+//
+// Revision 1.37 1998/09/15 02:09:26 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.36 1998/09/08 21:40:08 curt
+// Fixes by Charlie Hotchkiss.
+//
+// Revision 1.35 1998/08/29 13:09:26 curt
+// Changes to event manager from Bernie Bright.
+//
+// Revision 1.34 1998/08/27 17:02:06 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.33 1998/08/25 20:53:32 curt
+// Shuffled $FG_ROOT file layout.
+//
+// Revision 1.32 1998/08/25 16:59:09 curt
+// Directory reshuffling.
+//
+// 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.