]> git.mxchange.org Git - flightgear.git/blobdiff - src/Environment/fgclouds.cxx
don't destroy iterated map entries; delete _menubar; restore closed
[flightgear.git] / src / Environment / fgclouds.cxx
index 044fb885f50536e85c978441b4ed5ea991ca463e..b3964c2961c987bbc4f5d80c7967465369a3db95 100644 (file)
@@ -44,10 +44,13 @@ extern SGSky *thesky;
 FGClouds::FGClouds(FGEnvironmentCtrl * controller) :
        station_elevation_ft(0.0),
        _controller( controller ),
-       snd_lightning(NULL)
+       snd_lightning(NULL),
+    last_scenario( "none" ),
+    last_env_config( new SGPropertyNode() ),
+    last_env_clouds( new SGPropertyNode() )
 {
        update_event = 0;
-       fgSetString("/environment/weather-scenario", "METAR");
+       fgSetString("/environment/weather-scenario", last_scenario.c_str());
 }
 FGClouds::~FGClouds() {
 }
@@ -71,7 +74,7 @@ void FGClouds::init(void) {
        }
 }
 
-SGNewCloud *FGClouds::buildCloud(SGPropertyNode *cloud_def_root, string name) {
+SGNewCloud *FGClouds::buildCloud(SGPropertyNode *cloud_def_root, const string& name) {
        SGPropertyNode *cld_def=NULL;
 
        cld_def = cloud_def_root->getChild(name.c_str());
@@ -100,7 +103,7 @@ SGNewCloud *FGClouds::buildCloud(SGPropertyNode *cloud_def_root, string name) {
        return cld;
 }
 
-void FGClouds::buildLayer(SGCloudField *layer, string name, double alt, double coverage) {
+void FGClouds::buildLayer(SGCloudField *layer, const string& name, double alt, double coverage) {
        struct {
                string name;
                double count;
@@ -272,7 +275,7 @@ FGClouds::update_metar_properties( FGMetar *m )
     fgSetDouble("/environment/metar/max-visibility-m",
                 m->getMaxVisibility().getVisibility_m() );
 
-    SGMetarVisibility *dirvis = m->getDirVisibility();
+    const SGMetarVisibility *dirvis = m->getDirVisibility();
     for (i = 0; i < 8; i++, dirvis++) {
         const char *min = "/environment/metar/visibility[%d]/min-m";
         const char *max = "/environment/metar/visibility[%d]/max-m";
@@ -303,7 +306,7 @@ FGClouds::update_metar_properties( FGMetar *m )
                 m->getPressure_inHg() );
 
     vector<SGMetarCloud> cv = m->getClouds();
-    vector<SGMetarCloud>::iterator cloud;
+    vector<SGMetarCloud>::const_iterator cloud;
 
     const char *cl = "/environment/clouds/layer[%i]";
     for (i = 0, cloud = cv.begin(); cloud != cv.end(); cloud++, i++) {
@@ -375,7 +378,7 @@ FGClouds::update_env_config ()
 }
 
 
-void FGClouds::setLayer( int iLayer, float alt_ft, string coverage, string layer_type ) {
+void FGClouds::setLayer( int iLayer, float alt_ft, const string& coverage, const string& layer_type ) {
        double coverage_norm = 0.0;
        if( coverage == "few" )
                coverage_norm = 2.0/8.0;        // <1-2
@@ -390,7 +393,7 @@ void FGClouds::setLayer( int iLayer, float alt_ft, string coverage, string layer
        buildLayer(layer3D, layer_type, station_elevation_ft + alt_ft * SG_FEET_TO_METER, coverage_norm);
 }
 
-void FGClouds::buildScenario( string scenario ) {
+void FGClouds::buildScenario( const string& scenario ) {
        string fakeMetar="";
        string station = fgGetString("/environment/metar/station-id", "XXXX");
 
@@ -398,8 +401,8 @@ void FGClouds::buildScenario( string scenario ) {
     if( station == "XXXX" )
         station_elevation_ft = fgGetDouble("/position/ground-elev-m", 0.0);
     else {
-        FGAirport a = globals->get_airports()->search( station );
-        station_elevation_ft = a.getElevation();
+        const FGAirport* a = globals->get_airports()->search( station );
+        station_elevation_ft = (a ? a->getElevation() : 0.0);
     }
 
        for(int iLayer = 0 ; iLayer < thesky->get_cloud_layer_count(); iLayer++) {
@@ -433,6 +436,15 @@ void FGClouds::buildScenario( string scenario ) {
 void FGClouds::build(void) {
        string scenario = fgGetString("/environment/weather-scenario", "METAR");
 
+    if( scenario == last_scenario)
+        return;
+    if( last_scenario == "none" ) {
+        // save clouds and weather conditions
+        SGPropertyNode *param = fgGetNode("/environment/config", true);
+        copyProperties( param, last_env_config );
+        param = fgGetNode("/environment/clouds", true);
+        copyProperties( param, last_env_clouds );
+    }
        if( scenario == "METAR" ) {
                string realMetar = fgGetString("/environment/metar/real-metar", "");
                if( realMetar != "" ) {
@@ -445,8 +457,22 @@ void FGClouds::build(void) {
                }
                buildMETAR();
        }
+    else if( scenario == "none" ) {
+        // restore clouds and weather conditions
+        SGPropertyNode *param = fgGetNode("/environment/config", true);
+        copyProperties( last_env_config, param );
+        param = fgGetNode("/environment/clouds", true);
+        copyProperties( last_env_clouds, param );
+        fgSetDouble("/environment/metar/rain-norm", 0.0);
+        fgSetDouble("/environment/metar/snow-norm", 0.0);
+//         update_env_config();
+           // propagate aloft tables
+           _controller->reinit();
+               buildMETAR();
+    }
        else
                buildScenario( scenario );
+    last_scenario = scenario;
 
        // ...
        if( snd_lightning == NULL )