#include <simgear/math/polar3d.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/misc/sg_path.hxx>
+#include <simgear/misc/interpolator.hxx>
#include <simgear/scene/material/matlib.hxx>
#ifdef FG_USE_CLOUDS_3D
# include <simgear/scene/sky/clouds3d/SkySceneLoader.hpp>
#include <ATC/ATCmgr.hxx>
#include <ATC/AIMgr.hxx>
#include <Autopilot/auto_gui.hxx>
-#include <Autopilot/newauto.hxx>
+#include <Autopilot/route_mgr.hxx>
+#include <Autopilot/xmlauto.hxx>
#include <Cockpit/cockpit.hxx>
#include <Cockpit/radiostack.hxx>
#include <Cockpit/panel.hxx>
#include <Input/input.hxx>
#include <Instrumentation/instrument_mgr.hxx>
#include <Model/acmodel.hxx>
+#include <AIModel/AIManager.hxx>
#include <Navaids/fixlist.hxx>
#include <Navaids/ilslist.hxx>
#include <Navaids/mkrbeacons.hxx>
#include <Replay/replay.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
-#if defined(HAVE_PLIB_PSL)
-#include <Scripting/scriptmgr.hxx>
-#endif
+#include <Scripting/NasalSys.hxx>
#include <Sound/fg_fx.hxx>
#include <Systems/system_mgr.hxx>
#include <Time/light.hxx>
root = "/FlightGear";
#elif defined( WIN32 )
root = "\\FlightGear";
-#elif defined( macintosh )
- root = "";
+#elif defined(OSX_BUNDLE)
+ /* the following code looks for the base package directly inside
+ the application bundle. This can be changed fairly easily by
+ fiddling with the code below. And yes, I know it's ugly and verbose.
+ */
+ CFBundleRef appBundle = CFBundleGetMainBundle();
+ CFURLRef appUrl = CFBundleCopyBundleURL(appBundle);
+ CFRelease(appBundle);
+
+ // look for a 'data' subdir directly inside the bundle : is there
+ // a better place? maybe in Resources? I don't know ...
+ CFURLRef dataDir = CFURLCreateCopyAppendingPathComponent(NULL, appUrl, CFSTR("data"), true);
+
+ // now convert down to a path, and the a c-string
+ CFStringRef path = CFURLCopyFileSystemPath(dataDir, kCFURLPOSIXPathStyle);
+ root = CFStringGetCStringPtr(path, CFStringGetSystemEncoding());
+
+ // tidy up.
+ CFRelease(appBundle);
+ CFRelease(dataDir);
+ CFRelease(path);
#else
root = PKGLIBDIR;
#endif
} else {
SG_LOG( SG_INPUT, SG_ALERT, "Cannot find specified aircraft: "
<< aircraft );
+ return false;
}
} else {
static void fgSetDistOrAltFromGlideSlope() {
+ // cout << "fgSetDistOrAltFromGlideSlope()" << endl;
string apt_id = fgGetString("/sim/presets/airport-id");
double gs = fgGetDouble("/sim/presets/glideslope-deg")
* SG_DEGREES_TO_RADIANS ;
// Set the initial position based on presets (or defaults)
bool fgInitPosition() {
+ // cout << "fgInitPosition()" << endl;
+ double gs = fgGetDouble("/sim/presets/glideslope-deg")
+ * SG_DEGREES_TO_RADIANS ;
+ double od = fgGetDouble("/sim/presets/offset-distance");
+ double alt = fgGetDouble("/sim/presets/altitude-ft");
+
bool set_pos = false;
// 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 ) {
+ if ( fabs( gs ) > 0.01 ) {
fgSetDistOrAltFromGlideSlope();
}
fgSetDouble( "/orientation/heading-deg",
fgGetDouble("/sim/presets/heading-deg") );
+ // determine if this should be an on-ground or in-air start
+ if ( fabs(gs) > 0.01 || fabs(od) > 0.1 || alt > 0.1 ) {
+ fgSetBool("/sim/presets/onground", false);
+ } else {
+ fgSetBool("/sim/presets/onground", true);
+ }
+
return true;
}
// Initialize the event manager subsystem.
////////////////////////////////////////////////////////////////////
- globals->get_event_mgr()->bind();
globals->get_event_mgr()->init();
+ globals->get_event_mgr()->setFreezeProperty(fgGetNode("/sim/freeze/clock"));
- // Output event stats every 60 seconds
- globals->get_event_mgr()->add( "SGEventMgr::print_stats()",
- globals->get_event_mgr(),
- &SGEventMgr::print_stats,
- 60000 );
+ ////////////////////////////////////////////////////////////////////
+ // Initialize the property interpolator subsystem
+ ////////////////////////////////////////////////////////////////////
+ globals->add_subsystem("interpolator", new SGInterpolator());
////////////////////////////////////////////////////////////////////
// Initialize the material property subsystem.
}
// cause refresh of viewer scenery timestamps every 15 seconds...
- globals->get_event_mgr()->add( "FGTileMgr::refresh_view_timestamps()",
- globals->get_tile_mgr(),
- &FGTileMgr::refresh_view_timestamps,
- 15000 );
+ globals->get_event_mgr()->addTask( "FGTileMgr::refresh_view_timestamps()",
+ globals->get_tile_mgr(),
+ &FGTileMgr::refresh_view_timestamps,
+ 15 );
SG_LOG( SG_GENERAL, SG_DEBUG,
"Current terrain elevation after tile mgr init " <<
fgAircraftInit(); // In the future this might not be the case.
+ ////////////////////////////////////////////////////////////////////
+ // Initialize the XML Autopilot subsystem.
+ ////////////////////////////////////////////////////////////////////
+
+ globals->add_subsystem( "xml-autopilot", new FGXMLAutopilot );
+ globals->add_subsystem( "route-manager", new FGRouteMgr );
+
////////////////////////////////////////////////////////////////////
// Initialize the view manager subsystem.
////////////////////////////////////////////////////////////////////
fgInitView();
-
////////////////////////////////////////////////////////////////////
// Create and register the logger.
////////////////////////////////////////////////////////////////////
globals->add_subsystem("logger", new FGLogger);
-
-#if defined(HAVE_PLIB_PSL)
- ////////////////////////////////////////////////////////////////////
- // Create and register the script manager.
- ////////////////////////////////////////////////////////////////////
-
- globals->add_subsystem("scripting", new FGScriptMgr);
-#endif // HAVE_PLIB_PSL
-
-
////////////////////////////////////////////////////////////////////
// Create and register the XML GUI.
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
// update the current timezone each 30 minutes
- globals->get_event_mgr()->add( "fgUpdateLocalTime()",
- &fgUpdateLocalTime, 30*60*1000 );
+ globals->get_event_mgr()->addTask( "fgUpdateLocalTime()",
+ &fgUpdateLocalTime, 30*60 );
////////////////////////////////////////////////////////////////////
globals->get_AI_mgr()->init();
+ ////////////////////////////////////////////////////////////////////
+ // Initialise the AI Model Manager
+ ////////////////////////////////////////////////////////////////////
+
+ SG_LOG(SG_GENERAL, SG_INFO, " AI Model Manager");
+ globals->add_subsystem("ai_model", new FGAIManager);
+
+
#ifdef ENABLE_AUDIO_SUPPORT
////////////////////////////////////////////////////////////////////
// Initialize the sound subsystem.
// Initialize the autopilot subsystem.
////////////////////////////////////////////////////////////////////
- globals->set_autopilot(new FGAutopilot);
- globals->get_autopilot()->init();
- globals->get_autopilot()->bind();
-
// FIXME: these should go in the
// GUI initialization code, not here.
- fgAPAdjustInit();
+ // fgAPAdjustInit();
NewTgtAirportInit();
NewHeadingInit();
NewAltitudeInit();
globals->get_multiplayer_rx_mgr()->init();
#endif
+ ////////////////////////////////////////////////////////////////////////
+ // Initialize the Nasal interpreter.
+ // Do this last, so that the loaded scripts see initialized state
+ ////////////////////////////////////////////////////////////////////////
+ FGNasalSys* nasal = new FGNasalSys();
+ globals->add_subsystem("nasal", nasal);
+ nasal->init();
+
////////////////////////////////////////////////////////////////////////
// End of subsystem initialization.
////////////////////////////////////////////////////////////////////
if ( !freeze ) {
fgSetBool("/sim/freeze/master", true);
}
+ fgSetBool("/sim/crashed", false);
// Initialize the FDM
fgInitFDM();
fgInitView();
globals->get_controls()->reset_all();
- globals->get_autopilot()->reset();
fgUpdateLocalTime();
+ // re-init to proper time of day setting
+ fgInitTimeOffset();
+
if ( !freeze ) {
fgSetBool("/sim/freeze/master", false);
}