fgTie("/sim/rendering/clouds3d-density", thesky,
&SGSky::get_3dCloudDensity,
&SGSky::set_3dCloudDensity);
+ fgTie("/sim/rendering/clouds3d-vis-range", thesky,
+ &SGSky::get_3dCloudVisRange,
+ &SGSky::set_3dCloudVisRange);
+ fgTie("/sim/rendering/clouds3d-num-flavours", thesky,
+ &SGSky::get_3dCloudNumFlavours,
+ &SGSky::set_3dCloudNumFlavours);
fgTie("/sim/rendering/precipitation-enable", &sgEnviro,
&SGEnviro::get_precipitation_enable_state,
&SGEnviro::set_precipitation_enable_state);
fgUntie("/sim/rendering/clouds3d-enable");
fgUntie("/sim/rendering/clouds3d-vis-range");
fgUntie("/sim/rendering/clouds3d-density");
- fgUntie("/sim/rendering/clouds3d-cache-size");
- fgUntie("/sim/rendering/clouds3d-cache-resolution");
+ fgUntie("/sim/rendering/clouds3d-num-flavours");
fgUntie("/sim/rendering/precipitation-enable");
fgUntie("/environment/rebuild-layers");
fgUntie("/sim/rendering/lightning-enable");
string texture = cld_def->getStringValue("texture", "cl_cumulus.rgb");
SGNewCloud *cld =
- new SGNewCloud(texture_root,
+ new SGNewCloud(type,
+ texture_root,
texture,
min_width,
max_width,
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;
}
}
totalCount = 1.0 / totalCount;
- double currCoverage = 0.0;
for(double px = 0.0; px < SGCloudField::fieldSize; px += grid_x_size) {
for(double py = 0.0; py < SGCloudField::fieldSize; py += grid_y_size) {
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();
- currCoverage += coverage;
- if( currCoverage < 1.0 )
- continue;
- currCoverage -= 1.0;
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
+ // Now we've built any clouds, enable them and set the density (coverage)
+ layer->setCoverage(coverage);
+ layer->applyCoverage();
thesky->get_cloud_layer(iLayer)->set_enable3dClouds(clouds_3d_enabled);
}
double alt_ft = cloud_root->getDoubleValue("elevation-ft");
double alt_m = alt_ft * SG_FEET_TO_METER;
- string coverage = cloud_root->getStringValue("coverage");
+ printf("Alt m: %.0f\n", alt_m);
+ string coverage = cloud_root->getStringValue("coverage");
double coverage_norm = 0.0;
if( coverage == "few" )
coverage_norm = 2.0/8.0; // <1-2
layer_type = "ns";
} else {
// layer_type = "st|cu|cb|sc";
- // +/- 20% from stratus probable base
- if( stratus_base * 0.80 < alt_m && stratus_base * 1.40 > alt_m )
- layer_type = "st";
- // +/- 20% from cumulus probable base
- else if( cumulus_base * 0.80 < alt_m && cumulus_base * 1.20 > alt_m )
- layer_type = "cu";
- else {
+ if( cumulus_base * 0.80 < alt_m && cumulus_base * 1.20 > alt_m ) {
+ // +/- 20% from cumulus probable base
+ layer_type = "cu";
+ } else if( stratus_base * 0.80 < alt_m && stratus_base * 1.40 > alt_m ) {
+ // +/- 20% from stratus probable base
+ layer_type = "st";
+ } else {
// above formulae is far from perfect
if ( alt_ft < 2000 )
layer_type = "st";
string station = fgGetString("/environment/metar/station-id", "XXXX");
// fetch station elevation if exists
- if( station == "XXXX" )
- station_elevation_ft = fgGetDouble("/position/ground-elev-m", 0.0);
- else {
- const FGAirport* a = globals->get_airports()->search( station );
- station_elevation_ft = (a ? a->getElevation() : 0.0);
- }
+ if( station == "XXXX" )
+ station_elevation_ft = fgGetDouble("/position/ground-elev-m", 0.0);
+ else {
+ 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++) {
thesky->get_cloud_layer(iLayer)
if( scenario == "Fair weather" ) {
fakeMetar = "15003KT 12SM SCT033 FEW200 20/08 Q1015 NOSIG";
setLayer(0, 3300.0, "scattered", "cu");
- } else if( scenario == "Thunderstorm" ) {
+ } else if( scenario == "Thunderstorm" ) {
fakeMetar = "15012KT 08SM TSRA SCT040 BKN070 20/12 Q0995";
setLayer(0, 4000.0, "scattered", "cb");
setLayer(1, 7000.0, "scattered", "ns");
if(!rebuild_required && (scenario == last_scenario))
return;
-
-
if( last_scenario == "none" ) {
// save clouds and weather conditions
SGPropertyNode *param = fgGetNode("/environment/config", true);
void FGClouds::set_3dClouds(bool enable)
{
- if (enable != clouds_3d_enabled)
- {
+ 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) {
+ thesky->get_cloud_layer(iLayer)->get_layer3D()->clear();
}
}
-
- if (enable)
- {
+
+ if (enable) {
rebuild_required = true;
build();
}
}
}
-
+
bool FGClouds::get_3dClouds() const {
return clouds_3d_enabled;
}