]> git.mxchange.org Git - flightgear.git/blobdiff - src/Environment/fgclouds.cxx
Port over remaining Point3D usage to the more type and unit safe SG* classes.
[flightgear.git] / src / Environment / fgclouds.cxx
index 0f414321a9ac4ab76207a5ba3b0d29f86721cf5b..905ddfc4af4aa46952846ad893d94e9ca2e6bc1c 100644 (file)
@@ -51,13 +51,12 @@ FGClouds::FGClouds(FGEnvironmentCtrl * controller) :
        station_elevation_ft(0.0),
        _controller( controller ),
        snd_lightning(NULL),
-        rebuild_required(true),
-    last_scenario( "none" ),
+    clouds_3d_enabled(false),
+    last_scenario( "unset" ),
     last_env_config( new SGPropertyNode() ),
     last_env_clouds( new SGPropertyNode() )
 {
        update_event = 0;
-       fgSetString("/environment/weather-scenario", last_scenario.c_str());
 }
 FGClouds::~FGClouds() {
 }
@@ -67,7 +66,7 @@ int FGClouds::get_update_event(void) const {
 }
 void FGClouds::set_update_event(int count) {
        update_event = count;
-       build();
+       buildCloudLayers();
 }
 
 void FGClouds::init(void) {
@@ -79,8 +78,6 @@ void FGClouds::init(void) {
                soundMgr->add( snd_lightning, "thunder" );
                sgEnviro.set_soundMgr( soundMgr );
        }
-        
-        rebuild_required = true;
 }
 
 void FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode  *box_def_root, const string& name, sgVec3 pos, SGCloudField *layer) {
@@ -158,23 +155,22 @@ void FGClouds::buildLayer(int iLayer, const string& name, double alt, double cov
        int CloudVarietyCount = 0;
        double totalCount = 0.0;
         
-        if (! clouds_3d_enabled) return;
-        
        SGPropertyNode *cloud_def_root = fgGetNode("/environment/cloudlayers/clouds", false);
        SGPropertyNode *box_def_root   = fgGetNode("/environment/cloudlayers/boxes", false);
        SGPropertyNode *layer_def_root = fgGetNode("/environment/cloudlayers/layers", false);
         SGCloudField *layer = thesky->get_cloud_layer(iLayer)->get_layer3D();
-
        layer->clear();
         
-       // when we don't generate clouds the layer is rendered in 2D
-       if( coverage == 0.0 )
-               return;
-       if( layer_def_root == NULL || cloud_def_root == NULL || box_def_root == NULL)
+       // If we don't have the required properties, then render the cloud in 2D
+        if ((! clouds_3d_enabled) || coverage == 0.0 ||
+           layer_def_root == NULL || cloud_def_root == NULL || box_def_root == NULL)
+        {
+                thesky->get_cloud_layer(iLayer)->set_enable3dClouds(false);
                return;
-       
+        }
+        
+        // If we can't find a definition for this cloud type, then render the cloud in 2D
        SGPropertyNode *layer_def=NULL;
-
        layer_def = layer_def_root->getChild(name.c_str());
        if( !layer_def ) {
                if( name[2] == '-' ) {
@@ -182,9 +178,15 @@ void FGClouds::buildLayer(int iLayer, const string& name, double alt, double cov
                        layer_def = layer_def_root->getChild(base_name.c_str());
                }
                if( !layer_def )
-                       return;
+                {
+                        thesky->get_cloud_layer(iLayer)->set_enable3dClouds(false);
+                        return;
+                }
        }
         
+        // At this point, we know we've got some 3D clouds to generate.
+        thesky->get_cloud_layer(iLayer)->set_enable3dClouds(true);
+
        double grid_x_size = layer_def->getDoubleValue("grid-x-size", 1000.0);
        double grid_y_size = layer_def->getDoubleValue("grid-y-size", 1000.0);
        double grid_x_rand = layer_def->getDoubleValue("grid-x-rand", grid_x_size);
@@ -217,27 +219,35 @@ void FGClouds::buildLayer(int iLayer, const string& name, double alt, double cov
                for(double py = 0.0; py < SGCloudField::fieldSize; py += grid_y_size) {
                        double x = px + grid_x_rand * (sg_random() - 0.5) - (SGCloudField::fieldSize / 2.0);
                        double y = py + grid_y_rand * (sg_random() - 0.5) - (SGCloudField::fieldSize / 2.0);
-                       double z = alt + grid_z_rand * (sg_random() - 0.5);
-                       double choice = sg_random();
-
-                       for(int i = 0; i < CloudVarietyCount ; i ++) {
-                               choice -= tCloudVariety[i].count * totalCount;
-                               if( choice <= 0.0 ) {
-                                       sgVec3 pos={x,z,y};
-                                        buildCloud(cloud_def_root, box_def_root, tCloudVariety[i].name, pos, layer);
-                                       break;
-                               }
-                       }
+                       double z = grid_z_rand * (sg_random() - 0.5);
+                        
+                        if (sg_random() < coverage)
+                        {
+                            double choice = sg_random();
+    
+                            for(int i = 0; i < CloudVarietyCount ; i ++) {
+                                    choice -= tCloudVariety[i].count * totalCount;
+                                    if( choice <= 0.0 ) {
+                                            sgVec3 pos={x,z,y};
+                                            
+                                            buildCloud(cloud_def_root, 
+                                                       box_def_root, 
+                                                       tCloudVariety[i].name, 
+                                                       pos, 
+                                                       layer);
+                                            break;
+                                    }
+                            }
+                        }
                }
        }
 
         // Now we've built any clouds, enable them and set the density (coverage)
-        layer->setCoverage(coverage);
-        layer->applyCoverage();
+        //layer->setCoverage(coverage);
+        //layer->applyCoverage();
         thesky->get_cloud_layer(iLayer)->set_enable3dClouds(clouds_3d_enabled);
 }
 
-// TODO:call this after real metar updates
 void FGClouds::buildCloudLayers(void) {
        SGPropertyNode *metar_root = fgGetNode("/environment", true);
         
@@ -283,7 +293,7 @@ void FGClouds::buildCloudLayers(void) {
                } else if( alt_ft > 6500 ) {
 //                     layer_type = "as|ac|ns";
                        layer_type = "ac";
-                       if( pressure_mb < 1005.0 && coverage_norm >= 5.5 )
+                       if( pressure_mb < 1005.0 && coverage_norm >= 0.5 )
                                layer_type = "ns";
                } else {
 //                     layer_type = "st|cu|cb|sc";
@@ -295,7 +305,7 @@ void FGClouds::buildCloudLayers(void) {
                                 layer_type = "st";
                         } else {
                                // above formulae is far from perfect
-                               if ( alt_ft < 2000 )
+                                if ( alt_ft < 2000 )
                                        layer_type = "st";
                                else if( alt_ft < 4500 )
                                        layer_type = "cu";
@@ -303,7 +313,7 @@ void FGClouds::buildCloudLayers(void) {
                                        layer_type = "sc";
                        }
                }
-
+                
                buildLayer(iLayer, layer_type, alt_m, coverage_norm);
        }
 }
@@ -433,7 +443,6 @@ FGClouds::update_env_config ()
                            fgGetDouble("/environment/metar/pressure-inhg") );
 }
 
-
 void FGClouds::setLayer( int iLayer, float alt_ft, const string& coverage, const string& layer_type ) {
        double coverage_norm = 0.0;
        if( coverage == "few" )
@@ -456,7 +465,7 @@ void FGClouds::buildScenario( const string& scenario ) {
         if( station == "XXXX" )
             station_elevation_ft = fgGetDouble("/position/ground-elev-m", 0.0);
         else {
-            const FGAirport* a = globals->get_airports()->search( station );
+            const FGAirport* a = FGAirport::findByIdent(station);
             station_elevation_ft = (a ? a->getElevation() : 0.0);
         }
 
@@ -468,7 +477,7 @@ void FGClouds::buildScenario( const string& scenario ) {
 
        station += " 011000Z ";
        if( scenario == "Fair weather" ) {
-               fakeMetar = "15003KT 12SM SCT033 FEW200 20/08 Q1015 NOSIG";
+               fakeMetar = "15003KT 12SM SCT041 FEW200 20/08 Q1015 NOSIG";
                //setLayer(0, 3300.0, "scattered", "cu");
         } else if( scenario == "Thunderstorm" ) {
                fakeMetar = "15012KT 08SM TSRA SCT040 BKN070 20/12 Q0995";
@@ -489,12 +498,12 @@ void FGClouds::buildScenario( const string& scenario ) {
        }
 }
 
+void FGClouds::set_scenario(const char * sc) {
 
-void FGClouds::build() {
-       string scenario = fgGetString("/environment/weather-scenario", "METAR");
-
-        if(!rebuild_required && (scenario == last_scenario))
-            return;
+        scenario = string(sc);
+        
+//        if(!rebuild_required && (scenario == last_scenario))
+//            return;
         
         if( last_scenario == "none" ) {
         // save clouds and weather conditions
@@ -506,6 +515,7 @@ void FGClouds::build() {
                 
         if( scenario == "METAR" ) {
             string realMetar = fgGetString("/environment/metar/real-metar", "");
+
             if( realMetar != "" ) {
                 fgSetString("/environment/metar/last-metar", realMetar.c_str());
                 FGMetar *m = new FGMetar( realMetar );
@@ -536,29 +546,21 @@ void FGClouds::build() {
         }
         
         last_scenario = scenario;
-        rebuild_required = false;
 
         if( snd_lightning == NULL )
             init();
 }
 
+const char * FGClouds::get_scenario(void) const
+{
+    return scenario.c_str();
+}
+
 void FGClouds::set_3dClouds(bool enable)
 {
     if (enable != clouds_3d_enabled) {
         clouds_3d_enabled = enable;
-
-        for(int iLayer = 0 ; iLayer < thesky->get_cloud_layer_count(); iLayer++) {
-            thesky->get_cloud_layer(iLayer)->set_enable3dClouds(enable);
-
-            if (!enable) {
-                thesky->get_cloud_layer(iLayer)->get_layer3D()->clear();
-            }
-        }
-
-        if (enable) {
-            rebuild_required = true;
-            build();
-        }
+        buildCloudLayers();
     }
 }