X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FMain%2Ffg_init.cxx;h=7079f3d206fc8e95bd721d75ecf7afbffec93353;hb=b588a92b7f31cc7030077c1906c9014d7e7bb437;hp=07effac561a312cbab482acd13b8a0c1c30358d4;hpb=5d8e5f29e0fe880ddb94856460e1553869c6a576;p=flightgear.git diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 07effac56..7079f3d20 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,29 +47,30 @@ #include -#include STL_STRING +#include #include #include #include #include -#include -#include -#include #include #include #include +#include #include #include #include +#include #include #include #include #include +#include + #include -#include -#include +#include +#include #include #include #include @@ -81,13 +79,13 @@ #ifdef ENABLE_SP_FDM #include #include +#include +#include #endif -#include #include #include #include #include -#include #include #include #include @@ -100,6 +98,8 @@ #include #include #include +#include +#include #include #include #include @@ -115,6 +115,7 @@ #include #include +#include #include "fg_init.hxx" #include "fg_io.hxx" @@ -123,15 +124,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; @@ -183,20 +184,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 ) { @@ -279,25 +269,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 @@ -425,7 +411,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; } @@ -447,7 +433,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; @@ -461,7 +447,7 @@ SGPropertyNode *fgInitLocale(const char *language) { // Initialize the localization routines bool fgDetectLanguage() { - char *language = ::getenv("LANG"); + const char *language = ::getenv("LANG"); if (language == NULL) { SG_LOG(SG_GENERAL, SG_INFO, "Unable to detect the language" ); @@ -596,7 +582,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 ); @@ -606,7 +592,22 @@ bool fgInitConfig ( int argc, char **argv ) { SGPath config( homedir ); config.append( ".fgfs" ); #endif - fgSetString("/sim/fg-home", config.c_str()); + const char *fg_home = getenv("FG_HOME"); + 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); + home->removeChild("fg-home", 0, false); + home = home->getChild("fg-home", 0, true); + home->setStringValue(config.c_str()); + home->setAttribute(SGPropertyNode::WRITE, false); + config.append( "autosave.xml" ); SG_LOG(SG_INPUT, SG_INFO, "Reading user settings from " << config.str()); try { @@ -690,45 +691,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); @@ -756,10 +718,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; @@ -768,66 +761,53 @@ 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 ) ) { + const FGAirport* apt = fgFindAirportID(id); + if (!apt) return false; + FGRunway* r = apt->findBestRunwayForHeading(tgt_hdg); + 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(), tgt_hdg); + return true; +} + +// Set current_options lon/lat given an airport id and parkig position name +static bool fgSetPosFromAirportIDandParkpos( const string& id, const string& parkpos ) { + if ( id.empty() ) + return false; + + // 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 ); + return false; + } + FGAirportDynamics* dcs = apt->getDynamics(); + if (!dcs) { SG_LOG( SG_GENERAL, SG_ALERT, - "Failed to find a good runway for " << id << '\n' ); + "Failed to find parking position " << parkpos << + " at 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 - 5.0, - &lat2, &lon2, &az2 ); - - if ( fabs( fgGetDouble("/sim/presets/offset-distance") ) > SG_EPSILON ) { - double olat, olon; - double odist = fgGetDouble("/sim/presets/offset-distance"); - odist *= SG_NM_TO_METER; - 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 ); - lat2=olat; - lon2=olon; + + int park_index = dcs->getNrOfParkings() - 1; + while (park_index >= 0 && dcs->getParkingName(park_index) != parkpos) park_index--; + if (park_index < 0) { + SG_LOG( SG_GENERAL, SG_ALERT, + "Failed to find parking position " << parkpos << + " at airport " << id ); + 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 ); - + FGParking* parking = dcs->getParking(park_index); + 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; @@ -836,62 +816,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 - 5.0, - &lat2, &lon2, &az2 ); - - if ( fabs( fgGetDouble("/sim/presets/offset-distance") ) > SG_EPSILON ) - { - double olat, olon; - double odist = fgGetDouble("/sim/presets/offset-distance"); - odist *= SG_NM_TO_METER; - double oaz = azimuth; - 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 ); - 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; } @@ -901,7 +842,7 @@ static void fgSetDistOrAltFromGlideSlope() { string apt_id = fgGetString("/sim/presets/airport-id"); double gs = fgGetDouble("/sim/presets/glideslope-deg") * SG_DEGREES_TO_RADIANS ; - double od = fgGetDouble("/sim/presets/offset-distance"); + double od = fgGetDouble("/sim/presets/offset-distance-nm"); double alt = fgGetDouble("/sim/presets/altitude-ft"); double apt_elev = 0.0; @@ -926,7 +867,7 @@ static void fgSetDistOrAltFromGlideSlope() { // set offset-distance from glideslope and altitude od = (alt - apt_elev) / tan(gs); od *= -1*SG_FEET_TO_METER * SG_METER_TO_NM; - fgSetDouble("/sim/presets/offset-distance", od); + fgSetDouble("/sim/presets/offset-distance-nm", od); fgSetBool("/sim/presets/onground", false); SG_LOG( SG_GENERAL, SG_INFO, "Calculated offset distance as: " << od << " nm" ); @@ -936,7 +877,7 @@ static void fgSetDistOrAltFromGlideSlope() { SG_LOG( SG_GENERAL, SG_ALERT, "Resetting glideslope to zero" ); fgSetDouble("/sim/presets/glideslope-deg", 0); fgSetBool("/sim/presets/onground", true); - } + } } @@ -945,48 +886,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 " - << id << ":" << freq ); - - double lon = nav->get_lon(); - double lat = nav->get_lat(); - - if ( fabs( fgGetDouble("/sim/presets/offset-distance") ) > SG_EPSILON ) - { - double odist = fgGetDouble("/sim/presets/offset-distance") - * SG_NM_TO_METER; - double oaz = fabs(fgGetDouble("/sim/presets/offset-azimuth")) - + 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 = " + if (!nav) { + 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 @@ -1033,54 +940,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") ) > SG_EPSILON ) - { - double odist = fgGetDouble("/sim/presets/offset-distance") - * SG_NM_TO_METER; - double oaz = fabs(fgGetDouble("/sim/presets/offset-azimuth")) - + 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) @@ -1096,18 +968,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; @@ -1116,33 +982,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 ); + FGFixList fixlist; + fixlist.init( p_fix ); // adds fixes to the DB in positioned.cxx SG_LOG(SG_GENERAL, SG_INFO, " Airways"); SGPath p_awy( globals->get_fg_root() ); @@ -1163,7 +1016,7 @@ bool fgInitPosition() { // cout << "fgInitPosition()" << endl; double gs = fgGetDouble("/sim/presets/glideslope-deg") * SG_DEGREES_TO_RADIANS ; - double od = fgGetDouble("/sim/presets/offset-distance"); + double od = fgGetDouble("/sim/presets/offset-distance-nm"); double alt = fgGetDouble("/sim/presets/altitude-ft"); bool set_pos = false; @@ -1220,6 +1073,15 @@ bool fgInitPosition() { if (hdg > 9990.0) hdg = fgGetDouble("/environment/config/boundary/entry/wind-from-heading-deg", 270); + if ( !set_pos && !apt.empty() && !parkpos.empty() ) { + // An airport + parking position is requested + if ( fgSetPosFromAirportIDandParkpos( apt, parkpos ) ) { + // set tower position + fgSetString("/sim/tower/airport-id", apt.c_str()); + set_pos = true; + } + } + if ( !set_pos && !apt.empty() && !rwy_no.empty() ) { // An airport + runway is requested if ( fgSetPosFromAirportIDandRwy( apt, rwy_no, rwy_req ) ) { @@ -1299,10 +1161,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, "======= ==============" ); @@ -1316,23 +1174,18 @@ 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, 512); - fgSetString("/sim/fg-current", cwd ? cwd : ""); + char buf[512], *cwd = getcwd(buf, 511); + buf[511] = '\0'; + SGPropertyNode *curr = fgGetNode("/sim", true); + curr->removeChild("fg-current", 0, false); + 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; } @@ -1360,11 +1213,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" ) { @@ -1426,7 +1279,7 @@ void fgInitFDM() { } else if ( model == "yasim" ) { cur_fdm_state = new YASim( dt ); } else { - throw sg_throwable(string("Unrecognized flight model '") + model + throw sg_exception(string("Unrecognized flight model '") + model + "', cannot init flight dynamics model."); } } @@ -1612,8 +1465,8 @@ bool fgInitSubsystems() { SGPath mpath( globals->get_fg_root() ); mpath.append( "materials.xml" ); - string season = fgGetString("/sim/startup/season", "summer"); - if ( ! globals->get_matlib()->load(globals->get_fg_root(), mpath.str(), season.c_str()) ) { + if ( ! globals->get_matlib()->load(globals->get_fg_root(), mpath.str(), + globals->get_props()) ) { SG_LOG( SG_GENERAL, SG_ALERT, "Error loading material lib!" ); exit(-1); } @@ -1633,12 +1486,9 @@ bool fgInitSubsystems() { exit(-1); } - // cause refresh of viewer scenery timestamps every 15 seconds... - globals->get_event_mgr()->addTask( "FGTileMgr::refresh_view_timestamps()", - globals->get_tile_mgr(), - &FGTileMgr::refresh_view_timestamps, - 15 ); - + globals->get_scenery()->get_scene_graph() + ->addChild(simgear::Particles::getCommonRoot()); + simgear::GlobalParticleCallback::setSwitch(fgGetNode("/sim/rendering/particles", true)); //////////////////////////////////////////////////////////////////// // Initialize the flight model subsystem. @@ -1658,6 +1508,13 @@ bool fgInitSubsystems() { // Initialize the weather modeling subsystem globals->add_subsystem("environment", new FGEnvironmentMgr); + //////////////////////////////////////////////////////////////////// + // Initialize the ridge lift simulation. + //////////////////////////////////////////////////////////////////// + + // Initialize the ridgelift subsystem + globals->add_subsystem("ridgelift", new FGRidgeLift); + //////////////////////////////////////////////////////////////////// // Initialize the aircraft systems and instrumentation (before the @@ -1911,3 +1768,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); +} +