X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_init.cxx;h=7079f3d206fc8e95bd721d75ecf7afbffec93353;hb=b588a92b7f31cc7030077c1906c9014d7e7bb437;hp=edf601347995641e5763f116d082413ec1eb1db1;hpb=d9bfd5a425df1bad7e3c53a64adce871e299a6b9;p=flightgear.git diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index edf601347..7079f3d20 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -35,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 @@ -51,9 +53,6 @@ #include #include #include -#include -#include -#include #include #include #include @@ -62,10 +61,13 @@ #include #include +#include #include #include #include #include +#include + #include #include #include @@ -96,6 +98,8 @@ #include #include #include +#include +#include #include #include #include @@ -111,6 +115,7 @@ #include #include +#include #include "fg_init.hxx" #include "fg_io.hxx" @@ -123,12 +128,11 @@ #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; @@ -407,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; } @@ -429,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; @@ -578,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 ); @@ -592,6 +596,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); @@ -683,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); @@ -749,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; @@ -761,58 +761,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()); - - 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; - } + const FGAirport* apt = fgFindAirportID(id); + if (!apt) return false; + FGRunway* r = apt->findBestRunwayForHeading(tgt_hdg); + fgSetString("/sim/atc/runway", r->ident().c_str()); - // 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; } @@ -824,8 +779,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(); @@ -845,35 +799,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; @@ -882,61 +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 - - 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; } @@ -990,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 " + 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 @@ -1078,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-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) @@ -1141,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; @@ -1161,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() ); @@ -1353,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, "======= ==============" ); @@ -1372,21 +1176,6 @@ bool fgInitGeneral() { globals->set_browser(fgGetString("/sim/startup/browser-app", "firefox %u")); -#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 - char buf[512], *cwd = getcwd(buf, 511); buf[511] = '\0'; SGPropertyNode *curr = fgGetNode("/sim", true); @@ -1394,6 +1183,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; } @@ -1421,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" ) { @@ -1487,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."); } } @@ -1673,8 +1465,7 @@ 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); @@ -1697,6 +1488,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. @@ -1716,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 @@ -1986,6 +1785,14 @@ void reInit(void) // from gui_local.cxx -- TODO merge with fgReInitSubsystems() 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 @@ -1996,6 +1803,12 @@ void reInit(void) // from gui_local.cxx -- TODO merge with fgReInitSubsystems() 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();