double aircraft_alt = fgGetDouble("/position/altitude-ft");
char s[128];
int i;
+ bool rebuild_clouds = false;
for (i = 0, layer = layers.begin(); layer != layers_end; ++layer, i++) {
double currentval;
snprintf(s, 128, cl, i);
strncat(s, "/coverage", 128);
const char* coverage = (*layer)->getStringValue("coverage", "clear");
- if (strncmp(fgGetString(s), coverage, 128) != 0)
+ if (strncmp(fgGetString(s), coverage, 128) != 0) {
fgSetString(s, coverage);
+ rebuild_clouds = true;
+ }
snprintf(s, 128, cl, i);
strncat(s, "/elevation-ft", 128);
}
}
}
-
+
+ if (rebuild_clouds) {
+ // Force an update of the 3D clouds
+ fgSetDouble("/environment/rebuild-layers", 1.0);
+ }
} else {
// We haven't already loaded a METAR, so apply it immediately.
dir_from = fgGetDouble("/environment/metar/base-wind-range-from");
station_elevation_ft(0.0),
_controller( controller ),
snd_lightning(NULL),
- rebuild_required(true),
last_scenario( "unset" ),
last_env_config( new SGPropertyNode() ),
last_env_clouds( new SGPropertyNode() )
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) {
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 ((! 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;
+ }
SGPropertyNode *layer_def=NULL;
layer_def = layer_def_root->getChild(base_name.c_str());
}
if( !layer_def )
- return;
+ {
+ thesky->get_cloud_layer(iLayer)->set_enable3dClouds(false);
+ return;
+ }
}
double grid_x_size = layer_def->getDoubleValue("grid-x-size", 1000.0);
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 = 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;
- }
- }
+
+ 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);
}
} 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";
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";
layer_type = "sc";
}
}
-
+
buildLayer(iLayer, layer_type, alt_m, coverage_norm);
}
}
void FGClouds::build() {
string scenario = fgGetString("/environment/weather-scenario", "METAR");
-
- if(!rebuild_required && (scenario == last_scenario))
- return;
+
+// if(!rebuild_required && (scenario == last_scenario))
+// return;
if( last_scenario == "none" ) {
// save clouds and weather conditions
}
last_scenario = scenario;
- rebuild_required = false;
if( snd_lightning == NULL )
init();
}
if (enable) {
- rebuild_required = true;
build();
}
}