X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_init.cxx;h=fd245f754e788245edc7aa53a1bde06c3d821c65;hb=552c3149aeaaea7abdc00eee644ef81414644e7b;hp=d25cd6fb650698812eb93a62442ff1f1dac4be52;hpb=889f3926f2841e42d4245aea8075c6d8213e5c79;p=flightgear.git diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index d25cd6fb6..fd245f754 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -25,11 +25,6 @@ # include #endif -// For BC 5.01 this must be included before OpenGL includes. -#ifdef SG_MATH_EXCEPTION_CLASH -# include -#endif - #include #include #include // strcmp() @@ -40,6 +35,8 @@ #if defined( _MSC_VER) || defined(__MINGW32__) # include // for getcwd() # define getcwd _getcwd +# include // isatty() +# define isatty _isatty #endif // work around a stdc++ lib bug in some versions of linux, but doesn't @@ -50,13 +47,12 @@ #include -#include STL_STRING +#include #include #include #include #include -#include #include #include #include @@ -67,10 +63,13 @@ #include #include +#include #include #include #include #include +#include + #include #include #include @@ -82,13 +81,13 @@ #ifdef ENABLE_SP_FDM #include #include +#include +#include #endif -#include #include #include #include #include -#include #include #include #include @@ -101,6 +100,8 @@ #include #include #include +#include +#include #include #include #include @@ -124,15 +125,15 @@ #include "options.hxx" #include "globals.hxx" #include "logger.hxx" +#include "renderer.hxx" #include "viewmgr.hxx" #include "main.hxx" -#if defined(FX) && defined(XMESA) -#include +#ifdef __APPLE__ +# include #endif -SG_USING_STD(string); - +using std::string; class Sound; extern const char *default_root; @@ -184,20 +185,9 @@ static string fgScanForOption( const string& option, const string& path ) { int len = option.length(); in >> skipcomment; -#ifndef __MWERKS__ while ( ! in.eof() ) { -#else - char c = '\0'; - while ( in.get(c) && c != '\0' ) { - in.putback(c); -#endif string line; - -#if defined( macintosh ) - getline( in, line, '\r' ); -#else getline( in, line, '\n' ); -#endif // catch extraneous (DOS) line ending character if ( line[line.length() - 1] < 32 ) { @@ -280,25 +270,21 @@ bool fgInitFGRoot ( int argc, char **argv ) { root = "/FlightGear"; #elif defined( WIN32 ) root = "\\FlightGear"; -#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. +#elif defined(__APPLE__) + /* + The following code looks for the base package inside the application + bundle, in the standard Contents/Resources location. */ - CFBundleRef appBundle = CFBundleGetMainBundle(); - CFURLRef appUrl = CFBundleCopyBundleURL(appBundle); - CFRelease(appBundle); + CFURLRef resourcesUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); - // 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); + // look for a 'data' subdir + CFURLRef dataDir = CFURLCreateCopyAppendingPathComponent(NULL, resourcesUrl, 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(resourcesUrl); CFRelease(dataDir); CFRelease(path); #else @@ -426,7 +412,7 @@ SGPropertyNode *fgInitLocale(const char *language) { SGPropertyNode *strings = c_node->getNode("strings"); try { readProperties(d_path.str(), strings); - } catch (const sg_exception &e) { + } catch (const sg_exception &) { SG_LOG(SG_GENERAL, SG_ALERT, "Unable to read the localized strings"); return NULL; } @@ -448,7 +434,7 @@ SGPropertyNode *fgInitLocale(const char *language) { try { readProperties(c_path.str(), strings); - } catch (const sg_exception &e) { + } catch (const sg_exception &) { SG_LOG(SG_GENERAL, SG_ALERT, "Unable to read the localized strings from " << c_path.str()); return NULL; @@ -597,7 +583,7 @@ bool fgInitConfig ( int argc, char **argv ) { } SGPropertyNode autosave; -#ifdef _MSC_VER +#if defined( _MSC_VER ) || defined( __MINGW32__ ) char *envp = ::getenv( "APPDATA" ); if (envp != NULL ) { SGPath config( envp ); @@ -611,6 +597,10 @@ bool fgInitConfig ( int argc, char **argv ) { if (fg_home) config = fg_home; + SGPath home_export(config.str()); + home_export.append("Export/dummy"); + home_export.create_dir(0777); + // Set /sim/fg-home and don't allow malign code to override it until // Nasal security is set up. Use FG_HOME if necessary. SGPropertyNode *home = fgGetNode("/sim", true); @@ -702,45 +692,6 @@ bool fgInitConfig ( int argc, char **argv ) { return true; } - - - - -#if 0 - // - // This function is never used, but maybe useful in the future ??? - // - -// Preset lon/lat given an airport id -static bool fgSetPosFromAirportID( const string& id ) { - FGAirport *a; - // double lon, lat; - - SG_LOG( SG_GENERAL, SG_INFO, - "Attempting to set starting position from airport code " << id ); - - if ( fgFindAirportID( id, &a ) ) { - // presets - fgSetDouble("/sim/presets/longitude-deg", a->longitude ); - fgSetDouble("/sim/presets/latitude-deg", a->latitude ); - - // other code depends on the actual postition being set so set - // that as well - fgSetDouble("/position/longitude-deg", a->longitude ); - fgSetDouble("/position/latitude-deg", a->latitude ); - - SG_LOG( SG_GENERAL, SG_INFO, - "Position for " << id << " is (" << a->longitude - << ", " << a->latitude << ")" ); - - return true; - } else { - return false; - } -} -#endif - - // Set current tower position lon/lat given an airport id static bool fgSetTowerPosFromAirportID( const string& id) { const FGAirport *a = fgFindAirportID( id); @@ -768,10 +719,41 @@ void fgInitTowerLocationListener() { ->addChangeListener( new FGTowerLocationListener(), true ); } +static void fgApplyStartOffset(const SGGeod& aStartPos, double aHeading, double aTargetHeading = HUGE_VAL) +{ + SGGeod startPos(aStartPos); + if (aTargetHeading == HUGE_VAL) { + aTargetHeading = aHeading; + } + + if ( fabs( fgGetDouble("/sim/presets/offset-distance-nm") ) > SG_EPSILON ) { + double offsetDistance = fgGetDouble("/sim/presets/offset-distance-nm"); + offsetDistance *= SG_NM_TO_METER; + double offsetAzimuth = aHeading; + if ( fabs(fgGetDouble("/sim/presets/offset-azimuth-deg")) > SG_EPSILON ) { + offsetAzimuth = fgGetDouble("/sim/presets/offset-azimuth-deg"); + aHeading = aTargetHeading; + } + + SGGeod offset; + double az2; // dummy + SGGeodesy::direct(startPos, offsetAzimuth + 180, offsetDistance, offset, az2); + startPos = offset; + } + + // presets + fgSetDouble("/sim/presets/longitude-deg", startPos.getLongitudeDeg() ); + fgSetDouble("/sim/presets/latitude-deg", startPos.getLatitudeDeg() ); + fgSetDouble("/sim/presets/heading-deg", aHeading ); + + // other code depends on the actual values being set ... + fgSetDouble("/position/longitude-deg", startPos.getLongitudeDeg() ); + fgSetDouble("/position/latitude-deg", startPos.getLatitudeDeg() ); + fgSetDouble("/orientation/heading-deg", aHeading ); +} + // Set current_options lon/lat given an airport id and heading (degrees) static bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) { - FGRunway r; - if ( id.empty() ) return false; @@ -780,58 +762,13 @@ static bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) { "Attempting to set starting position from airport code " << id << " heading " << tgt_hdg ); - 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; - } - fgSetString("/sim/atc/runway", r._rwy_no.c_str()); + const FGAirport* apt = fgFindAirportID(id); + if (!apt) return false; + FGRunway* r = apt->findBestRunwayForHeading(tgt_hdg); + fgSetString("/sim/atc/runway", r->ident().c_str()); - double lat2, lon2, az2; - double heading = r._heading; - double azimuth = heading + 180.0; - while ( azimuth >= 360.0 ) { azimuth -= 360.0; } - - SG_LOG( SG_GENERAL, SG_INFO, - "runway = " << r._lon << ", " << r._lat - << " length = " << r._length * SG_FEET_TO_METER - << " heading = " << azimuth ); - - geo_direct_wgs_84 ( 0, r._lat, r._lon, azimuth, r._length * SG_FEET_TO_METER * 0.5 - - fgGetDouble("/sim/airport/runways/start-offset-m", 5.0), - &lat2, &lon2, &az2 ); - - if ( fabs( fgGetDouble("/sim/presets/offset-distance-nm") ) > SG_EPSILON ) { - double olat, olon; - double odist = fgGetDouble("/sim/presets/offset-distance-nm"); - odist *= SG_NM_TO_METER; - double oaz = azimuth; - if ( fabs(fgGetDouble("/sim/presets/offset-azimuth-deg")) > SG_EPSILON ) { - oaz = fgGetDouble("/sim/presets/offset-azimuth-deg") + 180; - heading = tgt_hdg; - } - while ( oaz >= 360.0 ) { oaz -= 360.0; } - geo_direct_wgs_84 ( 0, lat2, lon2, oaz, odist, &olat, &olon, &az2 ); - lat2=olat; - lon2=olon; - } - - // presets - fgSetDouble("/sim/presets/longitude-deg", lon2 ); - fgSetDouble("/sim/presets/latitude-deg", lat2 ); - fgSetDouble("/sim/presets/heading-deg", heading ); - - // other code depends on the actual values being set ... - fgSetDouble("/position/longitude-deg", lon2 ); - fgSetDouble("/position/latitude-deg", lat2 ); - fgSetDouble("/orientation/heading-deg", heading ); - - SG_LOG( SG_GENERAL, SG_INFO, - "Position for " << id << " is (" - << lon2 << ", " - << lat2 << ") new heading is " - << heading ); - + SGGeod startPos = r->pointOnCenterline(fgGetDouble("/sim/airport/runways/start-offset-m", 5.0)); + fgApplyStartOffset(startPos, r->headingDeg(), tgt_hdg); return true; } @@ -843,8 +780,7 @@ static bool fgSetPosFromAirportIDandParkpos( const string& id, const string& par // can't see an easy way around this const_cast at the moment FGAirport* apt = const_cast(fgFindAirportID(id)); if (!apt) { - SG_LOG( SG_GENERAL, SG_ALERT, - "Failed to find airport " << id ); + SG_LOG( SG_GENERAL, SG_ALERT, "Failed to find airport " << id ); return false; } FGAirportDynamics* dcs = apt->getDynamics(); @@ -864,35 +800,15 @@ static bool fgSetPosFromAirportIDandParkpos( const string& id, const string& par return false; } FGParking* parking = dcs->getParking(park_index); - - double lat = parking->getLatitude(); - double lon = parking->getLongitude(); - double hdg = parking->getHeading(); - - // presets - fgSetDouble("/sim/presets/longitude-deg", lon ); - fgSetDouble("/sim/presets/latitude-deg", lat ); - fgSetDouble("/sim/presets/heading-deg", hdg ); - - // other code depends on the actual values being set ... - fgSetDouble("/position/longitude-deg", lon ); - fgSetDouble("/position/latitude-deg", lat ); - fgSetDouble("/orientation/heading-deg", hdg ); - - SG_LOG( SG_GENERAL, SG_INFO, - "Position for " << id << " is (" - << lon << ", " - << lat << ") new heading is " - << hdg ); - + fgApplyStartOffset( + SGGeod::fromDeg(parking->getLongitude(), parking->getLatitude()), + parking->getHeading()); return true; } // Set current_options lon/lat given an airport id and runway number static bool fgSetPosFromAirportIDandRwy( const string& id, const string& rwy, bool rwy_req ) { - FGRunway r; - if ( id.empty() ) return false; @@ -901,61 +817,23 @@ static bool fgSetPosFromAirportIDandRwy( const string& id, const string& rwy, bo "Attempting to set starting position for " << id << ":" << rwy ); - if ( ! globals->get_runways()->search( id, rwy, &r ) ) { - SG_LOG( SG_GENERAL, rwy_req ? SG_ALERT : SG_INFO, - "Failed to find runway " << rwy << - " at airport " << id << ". Using default runway." ); - return false; + const FGAirport* apt = fgFindAirportID(id); + if (!apt) { + SG_LOG( SG_GENERAL, SG_ALERT, "Failed to find airport:" << id); + return false; } - fgSetString("/sim/atc/runway", r._rwy_no.c_str()); - - double lat2, lon2, az2; - double heading = r._heading; - double azimuth = heading + 180.0; - while ( azimuth >= 360.0 ) { azimuth -= 360.0; } - - SG_LOG( SG_GENERAL, SG_INFO, - "runway = " << r._lon << ", " << r._lat - << " length = " << r._length * SG_FEET_TO_METER - << " heading = " << azimuth ); - - geo_direct_wgs_84 ( 0, r._lat, r._lon, azimuth, r._length * SG_FEET_TO_METER * 0.5 - - fgGetDouble("/sim/airport/runways/start-offset-m", 5.0), - &lat2, &lon2, &az2 ); - if ( fabs( fgGetDouble("/sim/presets/offset-distance-nm") ) > SG_EPSILON ) - { - double olat, olon; - double odist = fgGetDouble("/sim/presets/offset-distance-nm"); - odist *= SG_NM_TO_METER; - double oaz = azimuth; - if ( fabs(fgGetDouble("/sim/presets/offset-azimuth-deg")) > SG_EPSILON ) - { - oaz = fgGetDouble("/sim/presets/offset-azimuth-deg") + 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 ); - lat2=olat; - lon2=olon; + if (!apt->hasRunwayWithIdent(rwy)) { + SG_LOG( SG_GENERAL, rwy_req ? SG_ALERT : SG_INFO, + "Failed to find runway " << rwy << + " at airport " << id << ". Using default runway." ); + return false; } - // presets - fgSetDouble("/sim/presets/longitude-deg", lon2 ); - fgSetDouble("/sim/presets/latitude-deg", lat2 ); - fgSetDouble("/sim/presets/heading-deg", heading ); - - // other code depends on the actual values being set ... - fgSetDouble("/position/longitude-deg", lon2 ); - fgSetDouble("/position/latitude-deg", lat2 ); - fgSetDouble("/orientation/heading-deg", heading ); - - SG_LOG( SG_GENERAL, SG_INFO, - "Position for " << id << " is (" - << lon2 << ", " - << lat2 << ") new heading is " - << heading ); - + FGRunway* r(apt->getRunwayByIdent(rwy)); + fgSetString("/sim/atc/runway", r->ident().c_str()); + SGGeod startPos = r->pointOnCenterline( fgGetDouble("/sim/airport/runways/start-offset-m", 5.0)); + fgApplyStartOffset(startPos, r->headingDeg()); return true; } @@ -1009,48 +887,14 @@ static bool fgSetPosFromNAV( const string& id, const double& freq ) { FGNavRecord *nav = globals->get_navlist()->findByIdentAndFreq( id.c_str(), freq ); - // set initial position from runway and heading - if ( nav != NULL ) { - SG_LOG( SG_GENERAL, SG_INFO, "Attempting to set starting position for " + if (!nav) { + SG_LOG( SG_GENERAL, SG_ALERT, "Failed to locate NAV = " << id << ":" << freq ); - - double lon = nav->get_lon(); - double lat = nav->get_lat(); - - if ( fabs( fgGetDouble("/sim/presets/offset-distance-nm") ) > SG_EPSILON ) - { - double odist = fgGetDouble("/sim/presets/offset-distance-nm") - * SG_NM_TO_METER; - double oaz = fabs(fgGetDouble("/sim/presets/offset-azimuth-deg")) - + 180.0; - while ( oaz >= 360.0 ) { oaz -= 360.0; } - double olat, olon, az2; - geo_direct_wgs_84 ( 0, lat, lon, oaz, odist, &olat, &olon, &az2 ); - - lat = olat; - lon = olon; - } - - // presets - fgSetDouble("/sim/presets/longitude-deg", lon ); - fgSetDouble("/sim/presets/latitude-deg", lat ); - - // other code depends on the actual values being set ... - fgSetDouble("/position/longitude-deg", lon ); - fgSetDouble("/position/latitude-deg", lat ); - fgSetDouble("/orientation/heading-deg", - fgGetDouble("/sim/presets/heading-deg") ); - - SG_LOG( SG_GENERAL, SG_INFO, - "Position for " << id << ":" << freq << " is (" - << lon << ", "<< lat << ")" ); - - return true; - } else { - SG_LOG( SG_GENERAL, SG_ALERT, "Failed to locate NAV = " - << id << ":" << freq ); - return false; - } + return false; + } + + fgApplyStartOffset(nav->geod(), fgGetDouble("/sim/presets/heading-deg")); + return true; } // Set current_options lon/lat given an aircraft carrier id @@ -1097,54 +941,19 @@ static bool fgSetPosFromCarrier( const string& carrier, const string& posid ) { } // Set current_options lon/lat given an airport id and heading (degrees) -static bool fgSetPosFromFix( const string& id ) { - FGFix fix; - - // set initial position from runway and heading - if ( globals->get_fixlist()->query( id.c_str(), &fix ) ) { - SG_LOG( SG_GENERAL, SG_INFO, "Attempting to set starting position for " - << id ); - - double lon = fix.get_lon(); - double lat = fix.get_lat(); - - if ( fabs( fgGetDouble("/sim/presets/offset-distance-nm") ) > SG_EPSILON ) - { - double odist = fgGetDouble("/sim/presets/offset-distance-nm") - * SG_NM_TO_METER; - double oaz = fabs(fgGetDouble("/sim/presets/offset-azimuth-deg")) - + 180.0; - while ( oaz >= 360.0 ) { oaz -= 360.0; } - double olat, olon, az2; - geo_direct_wgs_84 ( 0, lat, lon, oaz, odist, &olat, &olon, &az2 ); - - lat = olat; - lon = olon; - } - - // presets - fgSetDouble("/sim/presets/longitude-deg", lon ); - fgSetDouble("/sim/presets/latitude-deg", lat ); - - // other code depends on the actual values being set ... - fgSetDouble("/position/longitude-deg", lon ); - fgSetDouble("/position/latitude-deg", lat ); - fgSetDouble("/orientation/heading-deg", - fgGetDouble("/sim/presets/heading-deg") ); - - SG_LOG( SG_GENERAL, SG_INFO, - "Position for " << id << " is (" - << lon << ", "<< lat << ")" ); - - return true; - } else { - SG_LOG( SG_GENERAL, SG_ALERT, "Failed to locate NAV = " - << id ); - return false; - } +static bool fgSetPosFromFix( const string& id ) +{ + FGPositioned::TypeFilter fixFilter(FGPositioned::FIX); + FGPositioned* fix = FGPositioned::findNextWithPartialId(NULL, id, &fixFilter); + if (!fix) { + SG_LOG( SG_GENERAL, SG_ALERT, "Failed to locate fix = " << id ); + return false; + } + + fgApplyStartOffset(fix->geod(), fgGetDouble("/sim/presets/heading-deg")); + return true; } - /** * Initialize vor/ndb/ils/fix list management and query systems (as * well as simple airport db list) @@ -1160,18 +969,12 @@ fgInitNav () SGPath p_metar( globals->get_fg_root() ); p_metar.append( "Airports/metar.dat" ); - FGAirportList *airports = new FGAirportList(); - globals->set_airports( airports ); - FGRunwayList *runways = new FGRunwayList(); - globals->set_runways( runways ); - - fgAirportDBLoad( airports, runways, aptdb.str(), p_metar.str() ); + fgAirportDBLoad( aptdb.str(), p_metar.str() ); FGNavList *navlist = new FGNavList; FGNavList *loclist = new FGNavList; FGNavList *gslist = new FGNavList; FGNavList *dmelist = new FGNavList; - FGNavList *mkrlist = new FGNavList; FGNavList *tacanlist = new FGNavList; FGNavList *carrierlist = new FGNavList; FGTACANList *channellist = new FGTACANList; @@ -1180,33 +983,20 @@ fgInitNav () globals->set_loclist( loclist ); globals->set_gslist( gslist ); globals->set_dmelist( dmelist ); - globals->set_mkrlist( mkrlist ); globals->set_tacanlist( tacanlist ); globals->set_carrierlist( carrierlist ); globals->set_channellist( channellist ); - if ( !fgNavDBInit(airports, navlist, loclist, gslist, dmelist, mkrlist, tacanlist, carrierlist, channellist) ) { + if ( !fgNavDBInit(navlist, loclist, gslist, dmelist, tacanlist, carrierlist, channellist) ) { SG_LOG( SG_GENERAL, SG_ALERT, "Problems loading one or more navigational database" ); } - - if ( fgGetBool("/sim/navdb/localizers/auto-align", true) ) { - // align all the localizers with their corresponding runways - // since data sources are good for cockpit navigation - // purposes, but not always to the error tolerances needed to - // exactly place these items. - double threshold - = fgGetDouble( "/sim/navdb/localizers/auto-align-threshold-deg", - 5.0 ); - fgNavDBAlignLOCwithRunway( runways, loclist, threshold ); - } - + SG_LOG(SG_GENERAL, SG_INFO, " Fixes"); SGPath p_fix( globals->get_fg_root() ); p_fix.append( "Navaids/fix.dat" ); FGFixList *fixlist = new FGFixList; fixlist->init( p_fix ); - globals->set_fixlist( fixlist ); SG_LOG(SG_GENERAL, SG_INFO, " Airways"); SGPath p_awy( globals->get_fg_root() ); @@ -1372,10 +1162,6 @@ bool fgInitPosition() { bool fgInitGeneral() { string root; -#if defined(FX) && defined(XMESA) - char *mesa_win_state; -#endif - SG_LOG( SG_GENERAL, SG_INFO, "General Initialization" ); SG_LOG( SG_GENERAL, SG_INFO, "======= ==============" ); @@ -1389,20 +1175,7 @@ bool fgInitGeneral() { } SG_LOG( SG_GENERAL, SG_INFO, "FG_ROOT = " << '"' << root << '"' << endl ); -#if defined(FX) && defined(XMESA) - // initialize full screen flag - globals->set_fullscreen(false); - if ( strstr ( general.get_glRenderer(), "Glide" ) ) { - // Test for the MESA_GLX_FX env variable - if ( (mesa_win_state = getenv( "MESA_GLX_FX" )) != NULL) { - // test if we are fullscreen mesa/glide - if ( (mesa_win_state[0] == 'f') || - (mesa_win_state[0] == 'F') ) { - globals->set_fullscreen(true); - } - } - } -#endif + globals->set_browser(fgGetString("/sim/startup/browser-app", "firefox %u")); char buf[512], *cwd = getcwd(buf, 511); buf[511] = '\0'; @@ -1411,6 +1184,9 @@ bool fgInitGeneral() { curr = curr->getChild("fg-current", 0, true); curr->setStringValue(cwd ? cwd : ""); curr->setAttribute(SGPropertyNode::WRITE, false); + + fgSetBool("/sim/startup/stdout-to-terminal", isatty(1)); + fgSetBool("/sim/startup/stderr-to-terminal", isatty(2)); return true; } @@ -1438,11 +1214,11 @@ void fgInitFDM() { cur_fdm_state = new FGADA( dt ); } else if ( model == "acms" ) { cur_fdm_state = new FGACMS( dt ); -#endif } else if ( model == "balloon" ) { cur_fdm_state = new FGBalloonSim( dt ); } else if ( model == "magic" ) { cur_fdm_state = new FGMagicCarpet( dt ); +#endif } else if ( model == "ufo" ) { cur_fdm_state = new FGUFO( dt ); } else if ( model == "external" ) { @@ -1714,6 +1490,7 @@ bool fgInitSubsystems() { globals->get_scenery()->get_scene_graph() ->addChild(simgear::Particles::getCommonRoot()); + simgear::GlobalParticleCallback::setSwitch(fgGetNode("/sim/rendering/particles", true)); //////////////////////////////////////////////////////////////////// // Initialize the flight model subsystem. @@ -1986,3 +1763,59 @@ void fgReInitSubsystems() fgSetBool("/sim/sceneryloaded",false); } + +void reInit(void) // from gui_local.cxx -- TODO merge with fgReInitSubsystems() +{ + static SGPropertyNode_ptr master_freeze = fgGetNode("/sim/freeze/master", true); + + bool freeze = master_freeze->getBoolValue(); + if (!freeze) + master_freeze->setBoolValue(true); + + fgSetBool("/sim/signals/reinit", true); + cur_fdm_state->unbind(); + + // in case user has changed window size as + // restoreInitialState() overwrites these + int xsize = fgGetInt("/sim/startup/xsize"); + int ysize = fgGetInt("/sim/startup/ysize"); + + // viewports also needs to be saved/restored as + // restoreInitialState() overwrites these + SGPropertyNode *guiNode = new SGPropertyNode; + SGPropertyNode *cameraNode = new SGPropertyNode; + SGPropertyNode *cameraGroupNode = fgGetNode("/sim/rendering/camera-group"); + copyProperties(cameraGroupNode->getChild("camera"), cameraNode); + copyProperties(cameraGroupNode->getChild("gui"), guiNode); + + globals->restoreInitialState(); + + // update our position based on current presets + fgInitPosition(); + + // We don't know how to resize the window, so keep the last values + // for xsize and ysize, and don't use the one set initially + fgSetInt("/sim/startup/xsize", xsize); + fgSetInt("/sim/startup/ysize", ysize); + + copyProperties(cameraNode, cameraGroupNode->getChild("camera")); + copyProperties(guiNode, cameraGroupNode->getChild("gui")); + + delete guiNode; + delete cameraNode; + + SGTime *t = globals->get_time_params(); + delete t; + t = fgInitTime(); + globals->set_time_params(t); + + fgReInitSubsystems(); + + globals->get_tile_mgr()->update(fgGetDouble("/environment/visibility-m")); + globals->get_renderer()->resize(xsize, ysize); + fgSetBool("/sim/signals/reinit", false); + + if (!freeze) + master_freeze->setBoolValue(false); +} +