Updates to Advanced Weather and cloud shaders - better support for low visibility conditions, improved framerates for Thunderstorm scenario
This commit is contained in:
parent
9ffb8a3d52
commit
f2ebbbbc70
6 changed files with 55 additions and 31 deletions
|
@ -11,6 +11,7 @@
|
|||
<altitude><use>/sim/rendering/eye-altitude-m</use></altitude>
|
||||
<cloud_self_shading><use>/environment/cloud-self-shading</use></cloud_self_shading>
|
||||
<moonlight><use>/environment/moonlight</use></moonlight>
|
||||
<visibility><use>/environment/visibility-m</use></visibility>
|
||||
</parameters>
|
||||
|
||||
<technique n="9">
|
||||
|
@ -106,6 +107,11 @@
|
|||
<type>float</type>
|
||||
<value><use>moonlight</use></value>
|
||||
</uniform>
|
||||
<uniform>
|
||||
<name>visibility</name>
|
||||
<type>float</type>
|
||||
<value><use>visibility</use></value>
|
||||
</uniform>
|
||||
<!--<vertex-program-two-side>true</vertex-program-two-side>-->
|
||||
</pass>
|
||||
</technique>
|
||||
|
|
|
@ -245,7 +245,7 @@ else if (type == "Cumulus (whisp)"){
|
|||
cloudAssembly.num_tex_y = 3;
|
||||
|
||||
#characterize the cloud
|
||||
cloudAssembly.bottom_shade = 0.9;
|
||||
cloudAssembly.bottom_shade = 0.8;
|
||||
cloudAssembly.n_sprites = 4;
|
||||
cloudAssembly.min_width = 400.0 * mult;
|
||||
cloudAssembly.max_width = 600.0 * mult;
|
||||
|
@ -383,7 +383,7 @@ else if (type == "Altocumulus"){
|
|||
cloudAssembly.num_tex_y = 3;
|
||||
|
||||
#characterize the cloud
|
||||
cloudAssembly.bottom_shade = 0.8;
|
||||
cloudAssembly.bottom_shade = 0.7;
|
||||
cloudAssembly.n_sprites = 10;
|
||||
cloudAssembly.min_width = 400.0 * mult;
|
||||
cloudAssembly.max_width = 700.0 * mult;
|
||||
|
@ -806,7 +806,7 @@ else if (type == "Cb_box") {
|
|||
cloudAssembly.n_sprites = 3;
|
||||
cloudAssembly.min_cloud_width = 2200.0;
|
||||
cloudAssembly.min_cloud_height = 1200.0;
|
||||
cloudAssembly.bottom_shade = 0.4;
|
||||
cloudAssembly.bottom_shade = 0.6;
|
||||
cloudAssembly.z_scale = 1.0;
|
||||
}
|
||||
else
|
||||
|
@ -817,7 +817,7 @@ else if (type == "Cb_box") {
|
|||
cloudAssembly.num_tex_y = 2;
|
||||
|
||||
#characterize the cloud
|
||||
cloudAssembly.bottom_shade = 0.4;
|
||||
cloudAssembly.bottom_shade = 0.6;
|
||||
cloudAssembly.n_sprites = 6;
|
||||
cloudAssembly.min_width = 800.0;
|
||||
cloudAssembly.max_width = 1100.0;
|
||||
|
@ -838,8 +838,8 @@ else if (type == "Cb_box") {
|
|||
cloudAssembly.num_tex_y = 2;
|
||||
|
||||
#characterize the cloud
|
||||
cloudAssembly.bottom_shade = 0.4;
|
||||
cloudAssembly.n_sprites = 10;
|
||||
cloudAssembly.bottom_shade = 0.6;
|
||||
cloudAssembly.n_sprites = 20;
|
||||
cloudAssembly.min_width = 1000.0;
|
||||
cloudAssembly.max_width = 1500.0;
|
||||
cloudAssembly.min_height = 1000.0;
|
||||
|
|
|
@ -163,21 +163,24 @@ foreach (var l; layers)
|
|||
|
||||
|
||||
|
||||
# we store that information ourselves, so this should be zero
|
||||
# we store that information ourselves, so this should be zero, but rain forces us to go for an offset
|
||||
setprop("/environment/clouds/layer[0]/elevation-ft",0.0);
|
||||
|
||||
# layer wrapping off
|
||||
setprop("/sim/rendering/clouds3d-wrap",0);
|
||||
|
||||
# Basic Weather rain altitude limit off
|
||||
# rain altitude limit off
|
||||
|
||||
props.globals.getNode("/environment/params/use-external-precipitation-level").setBoolValue("true");
|
||||
|
||||
setprop("/sim/rendering/minimum-sky-visibility", 0.0);
|
||||
|
||||
# rain and snow off for clean startup
|
||||
# just to be sure, set other parameters off
|
||||
|
||||
compat_layer.setRain(0.0);
|
||||
compat_layer.setSnow(0.0);
|
||||
compat_layer.setLight(1.0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -222,9 +225,10 @@ else
|
|||
var vis_goal = visibility_target;
|
||||
if (vis_goal > 1.03 * visibility_current) {vis_goal = 1.03 * visibility_current;}
|
||||
}
|
||||
|
||||
setprop("/environment/visibility-m",vis_goal);
|
||||
visibility_current = vis_goal;
|
||||
# print(vis_goal, " ",local_weather.interpolated_conditions.visibility_m );
|
||||
if (local_weather.interpolated_conditions.visibility_m > vis_goal)
|
||||
{setprop("/environment/visibility-m",vis_goal);}
|
||||
visibility_current = vis_goal;
|
||||
|
||||
settimer( func {visibility_loop(); },0);
|
||||
}
|
||||
|
|
|
@ -605,7 +605,7 @@ if (realistic_visibility_flag == 1)
|
|||
vis_ovcst = vis_ovcst * 3.0;
|
||||
}
|
||||
|
||||
var inc1 = 0.1 * (vis_aloft - vis)/(vis_alt1 - ialt);
|
||||
var inc1 = 0.0 * (vis_aloft - vis)/(vis_alt1 - ialt);
|
||||
var inc2 = 0.9 * (vis_aloft - vis)/1500.0;
|
||||
var inc3 = (vis_ovcst - vis_aloft)/(ovcst_alt_high - vis_alt1+1500);
|
||||
var inc4 = 0.5;
|
||||
|
@ -636,6 +636,7 @@ else if (altitude > ovcst_alt_high)
|
|||
if (vis > max_vis_range)
|
||||
{vis = max_vis_range;}
|
||||
|
||||
|
||||
# determine scattering shader parameters if scattering shader is on
|
||||
|
||||
if (scattering_shader_flag == 1)
|
||||
|
@ -760,6 +761,7 @@ local_weather.setOvercast(ovcst);
|
|||
|
||||
|
||||
# now check if an effect volume writes the property and set only if not
|
||||
# but set visibility if interpolated is smaller than effect-specified
|
||||
|
||||
var flag = getprop("local-weather/effect-volumes/number-active-vis");
|
||||
|
||||
|
@ -767,6 +769,11 @@ if ((flag ==0) and (vis > 0.0) and (getprop(lw~"lift-loop-flag") == 0) and (comp
|
|||
{
|
||||
compat_layer.setVisibility(vis);
|
||||
}
|
||||
else if (getprop("/local-weather/current/visibility-m") > vis)
|
||||
{
|
||||
compat_layer.setVisibility(vis);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1217,6 +1224,7 @@ if (ev.vis_flag ==1)
|
|||
# then set the new value in current and execute change
|
||||
cNode.getNode("visibility-m").setValue(vis);
|
||||
#compat_layer.setVisibility(vis);
|
||||
#print(vis);
|
||||
compat_layer.setVisibilitySmoothly(vis);
|
||||
|
||||
# then count the number of active volumes on entry (we need that to determine
|
||||
|
@ -1230,6 +1238,7 @@ if (ev.vis_flag ==1)
|
|||
if (ev.rain_flag == 1)
|
||||
{
|
||||
var rain = ev.rain;
|
||||
#print("Setting rain to:", rain);
|
||||
ev.rain_r = cNode.getNode("rain-norm").getValue();
|
||||
cNode.getNode("rain-norm").setValue(rain);
|
||||
compat_layer.setRain(rain);
|
||||
|
@ -1711,7 +1720,7 @@ settimer ( func {
|
|||
compat_layer.setOvercast(0.0);
|
||||
setprop(lwi~"ipoint-number",0);
|
||||
setprop(lwi~"atmosphere-ipoint-number", 0);
|
||||
},0.1);
|
||||
},0);
|
||||
|
||||
setprop(lw~"tmp/presampling-status", "idle");
|
||||
|
||||
|
@ -1866,8 +1875,9 @@ if (edge_bias > 0.0) {height_bias = height_bias + 15.0 *edge_bias + 20.0 * rand
|
|||
var create_cumulonimbus_cloud = func(lat, lon, alt, size) {
|
||||
|
||||
|
||||
create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 3.4, 8, 0.8, 0.1, 8);
|
||||
create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,10, 0.2, 0.1, 1.0, 1, 0.8, 0.1, 6);
|
||||
|
||||
#create_cloudbox = func (type, blat, blon, balt, dx,dy,dz,n, f_core, r_core, h_core, n_core, f_bottom, h_bottom, n_bottom)
|
||||
}
|
||||
|
||||
###########################################################
|
||||
|
@ -1877,7 +1887,7 @@ create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 3.4
|
|||
var create_cumulonimbus_cloud_rain = func(lat, lon, alt, size, rain) {
|
||||
|
||||
|
||||
create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 3.4, 8, 0.8, 0.1, 8);
|
||||
create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,10, 0.2, 0.1, 1.0, 1, 0.8, 0.1, 6);
|
||||
|
||||
|
||||
|
||||
|
@ -3384,7 +3394,6 @@ scattering_shader_flag = getprop("/sim/rendering/shaders/skydome");
|
|||
|
||||
air_pollution_norm = getprop("/environment/air-pollution-norm");
|
||||
|
||||
|
||||
}
|
||||
|
||||
###########################################################
|
||||
|
@ -3705,6 +3714,7 @@ else if ((getprop("/environment/metar/valid") == 0) and (getprop(lw~"tmp/tile-ma
|
|||
|
||||
set_wind_model_flag();
|
||||
|
||||
|
||||
if ((wind_model_flag == 3) or ((wind_model_flag ==5) and (getprop(lwi~"ipoint-number") == 0)))
|
||||
{
|
||||
if (metar_flag != 1)
|
||||
|
@ -4058,7 +4068,7 @@ setlistener(lw~"tmp/convective-status", func {var s = size(clouds_path); compat_
|
|||
setlistener(lw~"tmp/effect-thread-status", func {var s = size(effects_geo); effect_placement_loop(s); });
|
||||
setlistener(lw~"tmp/presampling-status", func {manage_presampling(); });
|
||||
|
||||
# setlistener(lw~"config/wind-model", func {set_wind_model_flag();});
|
||||
#setlistener(lw~"config/wind-model", func {set_wind_model_flag();});
|
||||
setlistener(lw~"config/thermal-properties", func {set_texture_mix();});
|
||||
|
||||
setlistener(lw~"config/clouds-in-dynamics-loop", func {weather_dynamics.max_clouds_in_loop = int(getprop(lw~"config/clouds-in-dynamics-loop"));});
|
||||
|
@ -4572,7 +4582,7 @@ setprop(lw~"effect-volumes/number-active-sat",0);
|
|||
# setprop(lw~"config/max-vis-range-m", 120000.0);
|
||||
setprop(lw~"config/temperature-offset-degc", 0.0);
|
||||
|
||||
#setprop("/sim/rendering/eye-altitude-m", getprop("/position/altitude-ft") * ft_to_m);
|
||||
# setprop("/sim/rendering/eye-altitude-m", getprop("/position/altitude-ft") * ft_to_m);
|
||||
|
||||
# create properties for tile management
|
||||
|
||||
|
|
|
@ -1056,7 +1056,7 @@ else if (rn >0.4)
|
|||
create_2_8_tstratus(blat, blon, alt+alt_offset+8000,alpha);
|
||||
|
||||
# and specify the atmosphere
|
||||
local_weather.set_atmosphere_ipoint(blat, blon, vis + 17000.0, alt+alt_offset, vis + 25000.0, 0.35, alt+alt_offset +10000.0, alt+alt_offset + 20000.0, 0.65, alt+alt_offset, alt+alt_offset + 2500.0);
|
||||
local_weather.set_atmosphere_ipoint(blat, blon, vis + 17000.0, alt+alt_offset, vis + 25000.0, 0.35, alt+alt_offset +10000.0, alt+alt_offset + 20000.0, 0.75, alt+alt_offset, alt+alt_offset + 2500.0);
|
||||
}
|
||||
else if (rn >0.2)
|
||||
{
|
||||
|
@ -1068,7 +1068,7 @@ else if (rn >0.2)
|
|||
create_2_8_sstratus(blat, blon, alt+alt_offset+6000,alpha);
|
||||
|
||||
# and specify the atmosphere
|
||||
local_weather.set_atmosphere_ipoint(blat, blon, vis + 15000.0, alt+alt_offset, vis + 24000.0, 0.2, alt+alt_offset +15000.0, alt+alt_offset + 22000.0, 0.6, alt+alt_offset, alt+alt_offset + 2500.0);
|
||||
local_weather.set_atmosphere_ipoint(blat, blon, vis + 15000.0, alt+alt_offset, vis + 24000.0, 0.2, alt+alt_offset +15000.0, alt+alt_offset + 22000.0, 0.7 - rand() * 0.1, alt+alt_offset, alt+alt_offset + 2500.0);
|
||||
}
|
||||
else if (rn >0.0)
|
||||
{
|
||||
|
@ -1579,7 +1579,7 @@ calc_geo(blat);
|
|||
|
||||
var vis = 9000.0 + rand() * 10000.0;
|
||||
var T = 10.0 + rand() * 15.0;
|
||||
var spread = 8.0 + 2.0 * rand();
|
||||
var spread = 6.0 + 2.0 * rand();
|
||||
var D = T - spread;
|
||||
var p = 1000 + rand() * 10.0; p = adjust_p(p);
|
||||
|
||||
|
@ -1598,7 +1598,7 @@ local_weather.convective_size_bias = 0.3 + rand() * 0.3;
|
|||
|
||||
|
||||
# and specify the atmosphere
|
||||
local_weather.set_atmosphere_ipoint(blat, blon, vis + 12000.0, alt+alt_offset, vis + 20000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.65, alt+alt_offset, alt+alt_offset + 2500.0);
|
||||
local_weather.set_atmosphere_ipoint(blat, blon, vis + 12000.0, alt+alt_offset, vis + 20000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.85, alt+alt_offset, alt+alt_offset + 2500.0);
|
||||
|
||||
var rn = rand();
|
||||
|
||||
|
@ -2584,13 +2584,13 @@ var set_METAR_weather_station = func {
|
|||
if (coverage_shade < 1) # clear sky, we need to specify an altitude for the model
|
||||
{shade = 0.9; alt_shade = 9000.0;}
|
||||
else if (coverage_shade < 3)
|
||||
{shade = 0.8;}
|
||||
{shade = 0.85;}
|
||||
else if (coverage_shade < 5)
|
||||
{shade = 0.7;}
|
||||
{shade = 0.8;}
|
||||
else if (coverage_shade < 8)
|
||||
{shade = 0.6;}
|
||||
{shade = 0.75;}
|
||||
else if (coverage_shade == 8)
|
||||
{shade = 0.55;}
|
||||
{shade = 0.7;}
|
||||
|
||||
shade = shade * coverage_mult;
|
||||
|
||||
|
@ -2761,6 +2761,7 @@ else
|
|||
else {create_8_8_nimbus_var3(lat, lon, alt, alpha);}
|
||||
}
|
||||
|
||||
|
||||
if (rain > 0.1)
|
||||
{
|
||||
local_weather.create_effect_volume(3, lat, lon, 20000.0, 20000.0, alpha, 0.0, alt+900.0, 500.0 + (1.0 - 0.5 * rain) * 5500.0, 0.5 * rain , -1, -1, -1,0 ,0.95);
|
||||
|
@ -3521,7 +3522,7 @@ if (rand() > 0.5) # we do a second thunderstorm
|
|||
|
||||
# the convective layer
|
||||
|
||||
var strength = 0.3;
|
||||
var strength = 0.10;
|
||||
var n = int(4000 * strength) * 0.5;
|
||||
local_weather.cumulus_exclusion_layer(lat, lon, alt, n, 20000.0, 20000.0, alpha, 0.3,2.5 , size(elat), elat, elon, erad);
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ uniform float scattering;
|
|||
uniform float terminator;
|
||||
uniform float altitude;
|
||||
uniform float cloud_self_shading;
|
||||
uniform float visibility;
|
||||
uniform float moonlight;
|
||||
|
||||
attribute vec3 usrAttr1;
|
||||
|
@ -181,17 +182,19 @@ void main(void)
|
|||
// As we get within 100m of the sprite, it is faded out. Equally at large distances it also fades out.
|
||||
gl_FrontColor.a = min(smoothstep(10.0, 100.0, fogCoord), 1.0 - smoothstep(0.9 * range, range, fogCoord));
|
||||
}
|
||||
gl_FrontColor.a = gl_FrontColor.a * (1.0 - smoothstep(visibility, 3.0* visibility, fogCoord));
|
||||
|
||||
//gl_BackColor = gl_FrontColor;
|
||||
|
||||
// Fog doesn't affect clouds as much as other objects.
|
||||
float fadeScale = 0.05 + 0.2 * log(fogCoord/1000.0);
|
||||
if (fadeScale < 0.05) fadeScale = 0.05;
|
||||
fogFactor = exp( -gl_Fog.density * fogCoord * fadeScale);
|
||||
//float fadeScale = 0.05 + 0.2 * log(fogCoord/1000.0);
|
||||
//if (fadeScale < 0.05) fadeScale = 0.05;
|
||||
//fogFactor = exp( -gl_Fog.density * fogCoord * fadeScale);
|
||||
|
||||
// Fog doesn't affect clouds as much as other objects.
|
||||
//fogFactor = exp( -gl_Fog.density * fogCoord * 0.5);
|
||||
//fogFactor = clamp(fogFactor, 0.0, 1.0);
|
||||
fogFactor = exp(-fogCoord/visibility);
|
||||
|
||||
// haze of ground haze shader is slightly bluish
|
||||
hazeColor = light_diffuse.rgb;
|
||||
|
|
Loading…
Reference in a new issue