# include <math.h>
#endif
-#ifdef HAVE_WINDOWS_H
-# include <windows.h>
-#endif
-
-#include GLUT_H
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcmp()
#include <simgear/math/polar3d.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/misc/sg_path.hxx>
+#include <simgear/scene/material/matlib.hxx>
#ifdef FG_USE_CLOUDS_3D
-# include <simgear/sky/clouds3d/SkySceneLoader.hpp>
-# include <simgear/sky/clouds3d/SkyUtil.hpp>
+# include <simgear/scene/sky/clouds3d/SkySceneLoader.hpp>
+# include <simgear/scene/sky/clouds3d/SkyUtil.hpp>
+# include <simgear/screen/texture.hxx>
#endif
#include <simgear/timing/sg_time.hxx>
#include <simgear/timing/lowleveltime.h>
#include <FDM/ExternalNet/ExternalNet.hxx>
#include <FDM/ExternalPipe/ExternalPipe.hxx>
#include <FDM/JSBSim/JSBSim.hxx>
-#include <FDM/LaRCsim.hxx>
+#include <FDM/LaRCsim/LaRCsim.hxx>
#include <FDM/MagicCarpet.hxx>
#include <FDM/UFO.hxx>
#include <FDM/NullFDM.hxx>
#include <Include/general.hxx>
#include <Input/input.hxx>
#include <Instrumentation/instrument_mgr.hxx>
-// #include <Joystick/joystick.hxx>
-#include <Objects/matlib.hxx>
#include <Model/acmodel.hxx>
#include <Navaids/fixlist.hxx>
#include <Navaids/ilslist.hxx>
#include <Navaids/mkrbeacons.hxx>
#include <Navaids/navlist.hxx>
+#include <Replay/replay.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#if defined(HAVE_PLIB_PSL)
// find basic airport location info from airport database
bool fgFindAirportID( const string& id, FGAirport *a ) {
+ FGAirport result;
if ( id.length() ) {
- SGPath path( globals->get_fg_root() );
- path.append( "Airports" );
- path.append( "simple.mk4" );
- FGAirports airports( path.c_str() );
-
SG_LOG( SG_GENERAL, SG_INFO, "Searching for airport code = " << id );
- if ( ! airports.search( id, a ) ) {
+ result = globals->get_airports()->search( id );
+
+ if ( result.id.empty() ) {
SG_LOG( SG_GENERAL, SG_ALERT,
- "Failed to find " << id << " in " << path.str() );
+ "Failed to find " << id << " in basic.dat.gz" );
return false;
}
} else {
return false;
}
+ *a = result;
+
SG_LOG( SG_GENERAL, SG_INFO,
"Position for " << id << " is ("
<< a->longitude << ", "
if ( id.length() ) {
// set initial position from runway and heading
- SGPath path( globals->get_fg_root() );
- path.append( "Airports" );
- path.append( "runways.mk4" );
- FGRunways runways( path.c_str() );
-
SG_LOG( SG_GENERAL, SG_INFO,
"Attempting to set starting position from airport code "
<< id << " heading " << tgt_hdg );
- if ( ! runways.search( id, (int)tgt_hdg, &r ) ) {
+ if ( ! globals->get_runways()->search( id, (int)tgt_hdg, &r ) ) {
SG_LOG( SG_GENERAL, SG_ALERT,
"Failed to find a good runway for " << id << '\n' );
return false;
double oaz = azimuth;
if ( fabs(fgGetDouble("/sim/presets/offset-azimuth")) > SG_EPSILON ) {
oaz = fgGetDouble("/sim/presets/offset-azimuth") + 180;
+ heading = tgt_hdg;
}
while ( oaz >= 360.0 ) { oaz -= 360.0; }
geo_direct_wgs_84 ( 0, lat2, lon2, oaz, odist, &olat, &olon, &az2 );
if ( id.length() ) {
// set initial position from airport and runway number
- SGPath path( globals->get_fg_root() );
- path.append( "Airports" );
- path.append( "runways.mk4" );
- FGRunways runways( path.c_str() );
-
SG_LOG( SG_GENERAL, SG_INFO,
"Attempting to set starting position for "
<< id << ":" << rwy );
- if ( ! runways.search( id, rwy, &r ) ) {
+ if ( ! globals->get_runways()->search( id, rwy, &r ) ) {
SG_LOG( SG_GENERAL, SG_ALERT,
"Failed to find runway " << rwy <<
" at airport " << id );
if ( fabs(fgGetDouble("/sim/presets/offset-azimuth")) > SG_EPSILON )
{
oaz = fgGetDouble("/sim/presets/offset-azimuth") + 180;
+ heading = fgGetDouble("/sim/presets/heading-deg");
}
while ( oaz >= 360.0 ) { oaz -= 360.0; }
geo_direct_wgs_84 ( 0, lat2, lon2, oaz, odist, &olat, &olon, &az2 );
/**
- * Initialize vor/ndb/ils/fix list management and query systems
+ * Initialize vor/ndb/ils/fix list management and query systems (as
+ * well as simple airport db list)
*/
bool
fgInitNav ()
{
+ SG_LOG(SG_GENERAL, SG_INFO, "Loading Simple Airport List");
+ SGPath p_simple( globals->get_fg_root() );
+ p_simple.append( "Airports/basic.dat" );
+ FGAirportList *airports = new FGAirportList( p_simple.str() );
+ globals->set_airports( airports );
+
+ SG_LOG(SG_GENERAL, SG_INFO, "Loading Runway List");
+ SGPath p_runway( globals->get_fg_root() );
+ p_runway.append( "Airports/runways.dat" );
+ FGRunwayList *runways = new FGRunwayList( p_runway.str() );
+ globals->set_runways( runways );
+
SG_LOG(SG_GENERAL, SG_INFO, "Loading Navaids");
SG_LOG(SG_GENERAL, SG_INFO, " VOR/NDB");
bool fgInitPosition() {
bool set_pos = false;
- // Do a first guess if we should be on the ground or in the air
- // (to be refined later based on other input.
+ // If glideslope is specified, then calculate offset-distance or
+ // altitude relative to glide slope if either of those was not
+ // specified.
+ if ( fgGetDouble("/sim/presets/glideslope-deg") > 0.1 ) {
+ fgSetDistOrAltFromGlideSlope();
+ }
+
+ // Select ground or air start depending on if an altitude is
+ // specified (this choice can be refined later based on other
+ // input.)
if ( fgGetDouble("/sim/presets/altitude-ft") > -9990.0 ) {
fgSetBool("/sim/presets/onground", false);
} else {
fgSetBool("/sim/presets/onground", true);
}
- // If glideslope is specified, then calculate offset-distance or
- // altitude relative to glide slope if either of those was not
- // specified.
- fgSetDistOrAltFromGlideSlope();
-
// If we have an explicit, in-range lon/lat, don't change it, just use it.
// If not, check for an airport-id and use that.
// If not, default to the middle of the KSFO field.
string ndb = fgGetString("/sim/presets/ndb-id");
double ndb_freq = fgGetDouble("/sim/presets/ndb-freq");
string fix = fgGetString("/sim/presets/fix");
+
if ( !set_pos && !apt.empty() && !rwy_no.empty() ) {
// An airport + runway is requested
if ( fgSetPosFromAirportIDandRwy( apt, rwy_no ) ) {
- // set position (a little off the heading for single
+ // set tower position (a little off the heading for single
// runway airports)
fgSetTowerPosFromAirportID( apt, hdg );
-
set_pos = true;
}
}
+
if ( !set_pos && !apt.empty() ) {
// An airport is requested (find runway closest to hdg)
- bool ok = false;
- if (fgGetDouble("/sim/presets/altitude-ft") <= 0 &&
- fgGetDouble("/sim/presets/offset-distance") == 0)
- ok = fgSetPosFromAirportIDandHdg( apt, hdg );
- else
- ok = fgSetPosFromAirportID( apt );
-
- if (ok) {
- // set position (a little off the heading for single
- // runway airports)
- fgSetTowerPosFromAirportID( apt, hdg );
-
+ if ( fgSetPosFromAirportIDandHdg( apt, hdg ) ) {
+ // set tower position (a little off the heading for single
+ // runway airports)
+ fgSetTowerPosFromAirportID( apt, hdg );
set_pos = true;
}
}
+
if ( !set_pos && !vor.empty() ) {
// a VOR is requested
if ( fgSetPosFromNAV( vor, vor_freq ) ) {
- if ( fgGetDouble("/sim/presets/altitude-ft") > -9990.0 ) {
- fgSetBool("/sim/presets/onground", false);
- } else {
- fgSetBool("/sim/presets/onground", true);
- }
set_pos = true;
}
}
+
if ( !set_pos && !ndb.empty() ) {
// an NDB is requested
if ( fgSetPosFromNAV( ndb, ndb_freq ) ) {
- if ( fgGetDouble("/sim/presets/altitude-ft") > -9990.0 ) {
- fgSetBool("/sim/presets/onground", false);
- } else {
- fgSetBool("/sim/presets/onground", true);
- }
set_pos = true;
}
}
+
if ( !set_pos && !fix.empty() ) {
// a Fix is requested
if ( fgSetPosFromFix( fix ) ) {
- if ( fgGetDouble("/sim/presets/altitude-ft") > -9990.0 ) {
- fgSetBool("/sim/presets/onground", false);
- } else {
- fgSetBool("/sim/presets/onground", true);
- }
set_pos = true;
}
}
SGPath mpath( globals->get_fg_root() );
mpath.append( "materials.xml" );
- if ( ! material_lib.load( mpath.str() ) ) {
+ if ( ! globals->get_matlib()->load(globals->get_fg_root(), mpath.str()) ) {
SG_LOG( SG_GENERAL, SG_ALERT, "Error loading material lib!" );
exit(-1);
}
global_events.Register( "weather update", &fgUpdateWeatherDatabase,
30000);
#else
- globals->get_environment_mgr()->init();
- globals->get_environment_mgr()->bind();
+ globals->add_subsystem("environment", new FGEnvironmentMgr);
#endif
#ifdef FG_USE_CLOUDS_3D
// Initialize the 3D cloud subsystem.
////////////////////////////////////////////////////////////////////
if ( fgGetBool("/sim/rendering/clouds3d") ) {
+ static const SGPropertyNode *longitude
+ = fgGetNode("/sim/presets/longitude-deg");
+ static const SGPropertyNode *latitude
+ = fgGetNode("/sim/presets/latitude-deg");
+ static const SGPropertyNode *altitude
+ = fgGetNode("/sim/presets/altitude-ft");
+
SGPath cloud_path(globals->get_fg_root());
- cloud_path.append("large.sky");
+#if 0
+ cloud_path.append("Textures/Sky/scattered.rgba");
SG_LOG(SG_GENERAL, SG_INFO, "Loading CLOUDS3d from: " << cloud_path.c_str());
+
+ SGTexture tx;
+ tx.read_rgba_texture(cloud_path.c_str());
+ if ( !sgCloud3d->Load( tx.texture(), tx.width(),
+#else
+ cloud_path.append("large.sky");
if ( !sgCloud3d->Load( cloud_path.str(),
+#endif
latitude->getDoubleValue(),
longitude->getDoubleValue()) )
{
globals->add_subsystem("input", new FGInput);
+ ////////////////////////////////////////////////////////////////////
+ // Initialize the replay subsystem
+ ////////////////////////////////////////////////////////////////////
+ globals->add_subsystem("replay", new FGReplay);
+
////////////////////////////////////////////////////////////////////
// Bind and initialize subsystems.
////////////////////////////////////////////////////////////////////