1
0
Fork 0

Local Weather 1.4 by Thorsten Renk : fixes lots of graphical errors and transparency issues and provides a consistent GUI.

This commit is contained in:
Frederic Bouvier 2012-01-03 20:21:34 +01:00
parent dde2115a59
commit 56afb80358
13 changed files with 5825 additions and 281 deletions

64
Effects/cloud-static.eff Normal file
View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<PropertyList>
<name>Effects/rain-layer</name>
<parameters>
<texture n ="0">
</texture>
</parameters>
<technique n="10">
<predicate>
<and>
<property>/sim/rendering/clouds3d-enable</property>
<less-equal>
<value type="float">1.0</value>
<shader-language/>
</less-equal>
</and>
</predicate>
<pass n="0">
<!-- This is apparently not used, so maybe we'll blow it way soon. -->
<lighting>true</lighting>
<material>
<ambient type="vec4d">0.5 0.5 0.5 1.0</ambient>
<diffuse type="vec4d">0.5 0.5 0.5 1.0</diffuse>
<color-mode>off</color-mode>
</material>
<alpha-test>
<comparison>greater</comparison>
<reference type="float">0.01</reference>
</alpha-test>
<shade-model>smooth</shade-model>
<blend>
<source>src-alpha</source>
<destination>one-minus-src-alpha</destination>
</blend>
<depth>
<write-mask>false</write-mask>
</depth>
<render-bin>
<bin-number>9</bin-number>
<bin-name>DepthSortedBin</bin-name>
</render-bin>
<texture-unit>
<unit>0</unit>
<type><use>texture[0]/type</use></type>
<image><use>texture[0]/image</use></image>
<filter><use>texture[0]/filter</use></filter>
<wrap-s><use>texture[0]/wrap-s</use></wrap-s>
<wrap-t><use>texture[0]/wrap-t</use></wrap-t>
<!--<wrap-s>clamp</wrap-s>
<wrap-t>clamp</wrap-t>-->
</texture-unit>
<program>
<vertex-shader>Shaders/cloud-static.vert</vertex-shader>
<fragment-shader>Shaders/cloud-static.frag</fragment-shader>
</program>
<uniform>
<name>baseTexture</name>
<type>sampler-2d</type>
<value type="int">0</value>
</uniform>
<vertex-program-two-side>true</vertex-program-two-side>
</pass>
</technique>
</PropertyList>

View file

@ -4,6 +4,9 @@
<parameters> <parameters>
<texture n ="0"> <texture n ="0">
</texture> </texture>
<range>
<use>/sim/rendering/clouds3d-vis-range</use>
</range>
</parameters> </parameters>
<technique n="10"> <technique n="10">
<predicate> <predicate>
@ -36,7 +39,7 @@
<write-mask>false</write-mask> <write-mask>false</write-mask>
</depth> </depth>
<render-bin> <render-bin>
<bin-number>10</bin-number> <bin-number>9</bin-number>
<bin-name>DepthSortedBin</bin-name> <bin-name>DepthSortedBin</bin-name>
</render-bin> </render-bin>
<texture-unit> <texture-unit>
@ -58,6 +61,12 @@
<type>sampler-2d</type> <type>sampler-2d</type>
<value type="int">0</value> <value type="int">0</value>
</uniform> </uniform>
<uniform>
<name>range</name>
<type>float</type>
<value><use>range</use></value>
</uniform>
<vertex-program-two-side>true</vertex-program-two-side> <vertex-program-two-side>true</vertex-program-two-side>
</pass> </pass>
</technique> </technique>

4761
Nasal/local_weather.nas Normal file

File diff suppressed because it is too large Load diff

View file

@ -485,7 +485,7 @@ else if (type == "Stratocumulus bottom"){
{ {
cloudAssembly = local_weather.cloud.new(type, subtype); cloudAssembly = local_weather.cloud.new(type, subtype);
mult = 1.0;
# characterize the basic texture sheet # characterize the basic texture sheet
cloudAssembly.texture_sheet = "/Models/Weather/cumulus_bottom_sheet1.rgb"; cloudAssembly.texture_sheet = "/Models/Weather/cumulus_bottom_sheet1.rgb";
@ -520,6 +520,46 @@ else if (type == "Stratocumulus bottom"){
} }
else if (type == "Cumulonimbus (cloudlet)"){ else if (type == "Cumulonimbus (cloudlet)"){
# new code
if (local_weather.hardcoded_clouds_flag == 1)
{
cloudAssembly = local_weather.cloud.new(type, subtype);
# characterize the basic texture sheet
cloudAssembly.num_tex_x = 2;
cloudAssembly.num_tex_y = 2;
if (rand() < 0.5)
{cloudAssembly.texture_sheet = "/Models/Weather/cumulonimbus_sheet2.rgb";}
else
{cloudAssembly.texture_sheet = "/Models/Weather/cumulonimbus_sheet1.rgb";}
var mult = 1.0;
if (subtype == "small") {mult = 0.7;}
#characterize the cloud
cloudAssembly.bottom_shade = 0.6;
cloudAssembly.n_sprites = 5;
cloudAssembly.min_width = 1700.0 * mult;
cloudAssembly.max_width = 2200.0 * mult;
cloudAssembly.min_height = 1700.0 * mult;
cloudAssembly.max_height = 2200.0 * mult;
cloudAssembly.min_cloud_width = 3500.0 * mult;
cloudAssembly.min_cloud_height = 3500.0 * mult;
cloudAssembly.z_scale = 1.0;
#signal that new routines are used
path = "new";
}
else
{
if (subtype == "small") { if (subtype == "small") {
if (rn > 0.875) {path = "Models/Weather/cumulonimbus_sl1.xml";} if (rn > 0.875) {path = "Models/Weather/cumulonimbus_sl1.xml";}
else if (rn > 0.75) {path = "Models/Weather/cumulonimbus_sl2.xml";} else if (rn > 0.75) {path = "Models/Weather/cumulonimbus_sl2.xml";}
@ -540,6 +580,7 @@ else if (type == "Cumulonimbus (cloudlet)"){
else if (rn > 0.125) {path = "Models/Weather/cumulonimbus_sl7.xml";} else if (rn > 0.125) {path = "Models/Weather/cumulonimbus_sl7.xml";}
else {path = "Models/Weather/cumulonimbus_sl8.xml";} else {path = "Models/Weather/cumulonimbus_sl8.xml";}
} }
}
} }
@ -885,24 +926,34 @@ else if (type == "Stratus") {
{ {
cloudAssembly = local_weather.cloud.new(type, subtype); cloudAssembly = local_weather.cloud.new(type, subtype);
if (subtype == "small") {var mult = 0.8;} if (subtype == "small")
else {var mult = 1.0;} {
var mult = 0.8;
# characterize the basic texture sheet cloudAssembly.texture_sheet = "/Models/Weather/cirrocumulus_sheet1.rgb";
cloudAssembly.texture_sheet = "/Models/Weather/stratus_sheet1.rgb"; cloudAssembly.num_tex_x = 3;
cloudAssembly.num_tex_x = 3; cloudAssembly.num_tex_y = 3;
cloudAssembly.num_tex_y = 2; cloudAssembly.n_sprites = 10;
cloudAssembly.z_scale = 0.6;
}
else
{
var mult = 1.0;
cloudAssembly.texture_sheet = "/Models/Weather/stratus_sheet1.rgb";
cloudAssembly.num_tex_x = 3;
cloudAssembly.num_tex_y = 2;
cloudAssembly.n_sprites = 10;
cloudAssembly.z_scale = 0.4;
}
#characterize the cloud #characterize the cloud
cloudAssembly.bottom_shade = 0.4; cloudAssembly.bottom_shade = 0.4;
cloudAssembly.n_sprites = 20; cloudAssembly.min_width = 2000.0 * mult;
cloudAssembly.min_width = 1900.0 * mult; cloudAssembly.max_width = 2500.0 * mult;
cloudAssembly.max_width = 2400.0 * mult; cloudAssembly.min_height = 2000.0 * mult;
cloudAssembly.min_height = 1900.0 * mult; cloudAssembly.max_height = 2500.0 * mult;
cloudAssembly.max_height = 2400.0 * mult; cloudAssembly.min_cloud_width = 5000.0;
cloudAssembly.min_cloud_width = 5000.0 * mult;
cloudAssembly.min_cloud_height = 1.1 * cloudAssembly.max_height; cloudAssembly.min_cloud_height = 1.1 * cloudAssembly.max_height;
cloudAssembly.z_scale = 0.4;
#signal that new routines are used #signal that new routines are used
path = "new"; path = "new";
@ -957,11 +1008,11 @@ else if (type == "Stratus (thin)") {
#characterize the cloud #characterize the cloud
cloudAssembly.bottom_shade = 0.8; cloudAssembly.bottom_shade = 0.8;
cloudAssembly.min_width = 1500.0 * mult; cloudAssembly.min_width = 1900.0 * mult;
cloudAssembly.max_width = 2000.0 * mult; cloudAssembly.max_width = 2400.0 * mult;
cloudAssembly.min_height = 1500.0 * mult; cloudAssembly.min_height = 1900.0 * mult;
cloudAssembly.max_height = 2000.0 * mult; cloudAssembly.max_height = 2400.0 * mult;
cloudAssembly.min_cloud_width = 2500.0; cloudAssembly.min_cloud_width = 4200.0;
cloudAssembly.min_cloud_height = 50.0; cloudAssembly.min_cloud_height = 50.0;
@ -1055,6 +1106,49 @@ else if (type == "Fog (thin)") {
} }
} }
else if (type == "Fog (thick)") { else if (type == "Fog (thick)") {
# new code
if (local_weather.hardcoded_clouds_flag ==1)
{
cloudAssembly = local_weather.cloud.new(type, subtype);
if (subtype == "small")
{
var mult = 0.8;
cloudAssembly.texture_sheet = "/Models/Weather/stratus_sheet1.rgb";
cloudAssembly.num_tex_x = 3;
cloudAssembly.num_tex_y = 2;
cloudAssembly.n_sprites = 5;
cloudAssembly.z_scale = 1.0;
}
else
{
var mult = 1.0;
cloudAssembly.texture_sheet = "/Models/Weather/stratus_sheet1.rgb";
cloudAssembly.num_tex_x = 3;
cloudAssembly.num_tex_y = 2;
cloudAssembly.n_sprites = 5;
cloudAssembly.z_scale = 1.0;
}
#characterize the cloud
cloudAssembly.bottom_shade = 0.4;
cloudAssembly.min_width = 2000.0 * mult;
cloudAssembly.max_width = 2500.0 * mult;
cloudAssembly.min_height = 2000.0 * mult;
cloudAssembly.max_height = 2500.0 * mult;
cloudAssembly.min_cloud_width = 5000.0;
cloudAssembly.min_cloud_height = 1.1 * cloudAssembly.max_height;
#signal that new routines are used
path = "new";
}
else # old code
{
if (subtype == "small") { if (subtype == "small") {
if (rn > 0.8) {path = "Models/Weather/stratus_thick1.xml";} if (rn > 0.8) {path = "Models/Weather/stratus_thick1.xml";}
else if (rn > 0.6) {path = "Models/Weather/stratus_thick2.xml";} else if (rn > 0.6) {path = "Models/Weather/stratus_thick2.xml";}
@ -1069,6 +1163,7 @@ else if (type == "Fog (thick)") {
else if (rn > 0.2) {path = "Models/Weather/stratus_thick4.xml";} else if (rn > 0.2) {path = "Models/Weather/stratus_thick4.xml";}
else {path = "Models/Weather/stratus_thick5.xml";} else {path = "Models/Weather/stratus_thick5.xml";}
} }
}
} }
else if (type == "Test") {path="Models/Weather/single_cloud.xml";} else if (type == "Test") {path="Models/Weather/single_cloud.xml";}
else if (type == "Box_test") { else if (type == "Box_test") {

View file

@ -170,7 +170,7 @@ else
if (local_weather.hardcoded_clouds_flag == 1) if (local_weather.hardcoded_clouds_flag == 1)
{ {
# 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); setprop("/environment/clouds/layer[0]/elevation-ft",0.0);
# layer wrapping off # layer wrapping off
@ -347,6 +347,7 @@ else
var setTemperature = func (T) { var setTemperature = func (T) {
if (features.can_disable_environment == 1) if (features.can_disable_environment == 1)
{ {
setprop("/environment/temperature-sea-level-degc",T); setprop("/environment/temperature-sea-level-degc",T);
@ -503,6 +504,14 @@ if (features.can_disable_environment == 1)
setprop("/environment/wind-from-heading-deg",dir); setprop("/environment/wind-from-heading-deg",dir);
setprop("/environment/wind-speed-kt",speed); setprop("/environment/wind-speed-kt",speed);
} }
# this is needed to trigger the cloud drift to pick up the new wind setting
if (local_weather.hardcoded_clouds_flag == 1)
{
setprop("/environment/clouds/layer[0]/elevation-ft",0.0);
}
else else
{ {
# this is a workaround for systems which lack hard-coded support # this is a workaround for systems which lack hard-coded support
@ -767,7 +776,10 @@ var p = props.Node.new({ "layer" : 0,
"min-sprite-height-m": c.min_height, "min-sprite-height-m": c.min_height,
"max-sprite-height-m": c.max_height, "max-sprite-height-m": c.max_height,
"num-sprites": c.n_sprites, "num-sprites": c.n_sprites,
"bottom-shade": c.bottom_shade, "min-bottom-lighting-factor": c.bottom_shade,
"min-middle-lighting-factor": 0.9,
"min-top-lighting-factor": 1.0,
"min-shade-lighting-factor": c.bottom_shade,
"texture": c.texture_sheet, "texture": c.texture_sheet,
"num-textures-x": c.num_tex_x, "num-textures-x": c.num_tex_x,
"num-textures-y": c.num_tex_y, "num-textures-y": c.num_tex_y,
@ -777,10 +789,10 @@ var p = props.Node.new({ "layer" : 0,
"max-cloud-height-m": c.min_cloud_height, "max-cloud-height-m": c.min_cloud_height,
"z-scale": c.z_scale, "z-scale": c.z_scale,
"height-map-texture": 0, "height-map-texture": 0,
"alt-ft" : c.alt}); "alt-ft" : c.alt });
fgcommand("add-cloud", p); fgcommand("add-cloud", p);
# print("alt: ", c.alt); #print("alt: ", c.alt);
# add other management properties to the hash if dynamics is on # add other management properties to the hash if dynamics is on
@ -799,6 +811,10 @@ append(weather_tile_management.cloudArray,c);
########################################################### ###########################################################
# place a cloud layer from arrays, split across frames # place a cloud layer from arrays, split across frames
########################################################### ###########################################################
@ -811,12 +827,21 @@ if ((i < 0) or (i==0))
{ {
if (local_weather.debug_output_flag == 1) if (local_weather.debug_output_flag == 1)
{print("Cloud placement from array finished!"); } {print("Cloud placement from array finished!"); }
# then place all clouds using the new rendering system
if (local_weather.hardcoded_clouds_flag == 1)
{
var s = size(local_weather.cloudAssemblyArray);
create_new_cloud_array(s,cloudAssemblyArray);
}
setprop(lw~"tmp/thread-status", "idle"); setprop(lw~"tmp/thread-status", "idle");
# now set flag that tile has been completely processed # now set flag that tile has been completely processed
var dir_index = props.globals.getNode(lw~"tiles/tmp/dir-index").getValue(); var dir_index = props.globals.getNode(lw~"tiles/tmp/dir-index").getValue();
props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("generated-flag").setValue(2); #props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("generated-flag").setValue(2);
setprop(lw~"tiles/tile["~dir_index~"]/generated-flag",2);
return; return;
} }
@ -856,9 +881,42 @@ settimer( func {create_cloud_array(i - k, clouds_path, clouds_lat, clouds_lon, c
}; };
var create_new_cloud_array = func (i, cloudArray)
{
#if (getprop(lw~"tmp/thread-status") != "placing") {return;}
#if (getprop(lw~"tmp/convective-status") != "idle") {return;}
if ((i < 0) or (i==0))
{
if (local_weather.debug_output_flag == 1)
{print("Processing add-cloud calls finished!"); }
return;
}
#print("Hello world! i is now: ",i);
var k_max = 20;
var s = size(cloudArray);
if (s < k_max) {k_max = s;}
for (var k = 0; k < k_max; k = k+1)
{
local_weather.create_cloud_new(cloudArray[s-k-1]);
#print(cloudArray[s-k-1].alt);
}
setsize(cloudArray,s-k_max);
settimer( func {create_new_cloud_array(i - k, cloudArray) }, 0 );
}

View file

@ -410,8 +410,8 @@ else
if (debug_output_flag == 1) if (debug_output_flag == 1)
{ {
print("Boundary layer thickness: ",base_layer_thickness); #print("Boundary layer thickness: ",base_layer_thickness);
print("Boundary layer slowdown: ", f_slow); #print("Boundary layer slowdown: ", f_slow);
} }
return f_slow; return f_slow;
} }
@ -509,8 +509,8 @@ setprop(lwi~"station-number", i+1);
var ialt = sum_alt/sum_norm; var ialt = sum_alt/sum_norm;
var vis = sum_vis/sum_norm; var vis = sum_vis/sum_norm;
var p = sum_p/sum_norm; var p = sum_p/sum_norm;
var D = sum_D/sum_norm; var D = sum_D/sum_norm + temperature_offset;
var T = sum_T/sum_norm; var T = sum_T/sum_norm + temperature_offset;
# get an inverse distance weighted average from all defined atmospheric condition points # get an inverse distance weighted average from all defined atmospheric condition points
@ -586,6 +586,7 @@ var scatt_alt_high = sum_scatt_alt_high/sum_norm;
# altitude model for visibility - increase above the lowest inversion layer to simulate ground haze # altitude model for visibility - increase above the lowest inversion layer to simulate ground haze
vis = vis * ground_haze_factor;
var altitude = getprop("position/altitude-ft"); var altitude = getprop("position/altitude-ft");
current_mean_terrain_elevation = ialt; current_mean_terrain_elevation = ialt;
@ -593,6 +594,8 @@ current_mean_terrain_elevation = ialt;
var alt1 = vis_alt1; var alt1 = vis_alt1;
var alt2 = alt1 + 1500.0; var alt2 = alt1 + 1500.0;
setprop("/environment/ground-visibility-m",vis);
setprop("/environment/ground-haze-thickness-m",alt2 * ft_to_m);
# compute the visibility gradients # compute the visibility gradients
@ -628,10 +631,10 @@ else if (altitude > ovcst_alt_high)
vis = vis + inc1 * alt1 + inc2 * (alt2-alt1) + inc3 * (ovcst_alt_high - alt2) + inc4 * (altitude - ovcst_alt_high); vis = vis + inc1 * alt1 + inc2 * (alt2-alt1) + inc3 * (ovcst_alt_high - alt2) + inc4 * (altitude - ovcst_alt_high);
} }
# limit visibility (otherwise memory consumption is very bad...) # limit visibility (otherwise memory consumption may be very bad...)
if (vis > 120000.0) if (vis > max_vis_range)
{vis = 120000.0;} {vis = max_vis_range;}
# determine scattering shader parameters if scattering shader is on # determine scattering shader parameters if scattering shader is on
@ -641,6 +644,8 @@ if (scattering_shader_flag == 1)
var mie = 0.003; var mie = 0.003;
var density = 0.3; var density = 0.3;
if (altitude < 30000.0) if (altitude < 30000.0)
{ {
rayleigh = 0.0004 - altitude/30000.0 * 0.0001; rayleigh = 0.0004 - altitude/30000.0 * 0.0001;
@ -660,37 +665,37 @@ if (scattering_shader_flag == 1)
{rayleigh = 0.0001; mie = 0.002;} {rayleigh = 0.0001; mie = 0.002;}
} }
# otherwise compute normal skydome shader parameters # otherwise compute normal skydome shader parameters
else
# compute the horizon shading
if (altitude < scatt_alt_low)
{ {
var scatt = scatt_max;
# compute the horizon shading }
else if (altitude < scatt_alt_high)
if (altitude < scatt_alt_low) {
{ var scatt = scatt_max + (0.95 - scatt_max) * (altitude - scatt_alt_low)/(scatt_alt_high-scatt_alt_low);
var scatt = scatt_max; }
} else
else if (altitude < scatt_alt_high) {var scatt = 0.95;}
{
var scatt = scatt_max + (0.95 - scatt_max) * (altitude - scatt_alt_low)/(scatt_alt_high-scatt_alt_low);
}
else
{var scatt = 0.95;}
# compute the overcast haze # compute the overcast haze
if (altitude < ovcst_alt_low) if (altitude < ovcst_alt_low)
{ {
var ovcst = ovcst_max; var ovcst = ovcst_max;
}
else if (altitude < ovcst_alt_high)
{
var ovcst = ovcst_max - ovcst_max * (altitude - ovcst_alt_low)/(ovcst_alt_high-ovcst_alt_low);
}
else
{var ovcst = 0.0;}
} }
else if (altitude < ovcst_alt_high)
{
var ovcst = ovcst_max - ovcst_max * (altitude - ovcst_alt_low)/(ovcst_alt_high-ovcst_alt_low);
}
else
{var ovcst = 0.0;}
# limit relative changes of the visibility, will make for gradual transitions # limit relative changes of the visibility, will make for gradual transitions
@ -717,11 +722,10 @@ if (scattering_shader_flag == 1)
{ {
local_weather.setSkydomeShader(rayleigh, mie, density); local_weather.setSkydomeShader(rayleigh, mie, density);
} }
else
{ local_weather.setScattering(scatt);
local_weather.setScattering(scatt); local_weather.setOvercast(ovcst);
local_weather.setOvercast(ovcst);
}
# now check if an effect volume writes the property and set only if not # now check if an effect volume writes the property and set only if not
@ -766,18 +770,24 @@ if (p>0.0)
# now determine the local wind # now determine the local wind
#var tile_index = props.globals.getNode(lw~"tiles").getChild("tile",4).getNode("tile-index").getValue();
var tile_index = getprop(lw~"tiles/tile[4]/tile-index"); var tile_index = getprop(lw~"tiles/tile[4]/tile-index");
if (wind_model_flag ==1) # constant if (wind_model_flag ==1) # constant
{ {
var winddir = weather_dynamics.tile_wind_direction[0]; var winddir = weather_dynamics.tile_wind_direction[0];
var windspeed = weather_dynamics.tile_wind_speed[0]; var windspeed = weather_dynamics.tile_wind_speed[0];
wind.cloudlayer = [winddir,windspeed];
} }
else if (wind_model_flag ==2) # constant in tile else if (wind_model_flag ==2) # constant in tile
{ {
var winddir = weather_dynamics.tile_wind_direction[tile_index-1]; var winddir = weather_dynamics.tile_wind_direction[tile_index-1];
var windspeed = weather_dynamics.tile_wind_speed[tile_index-1]; var windspeed = weather_dynamics.tile_wind_speed[tile_index-1];
wind.cloudlayer = [winddir, windspeed];
} }
else if (wind_model_flag ==3) # aloft interpolated, constant in tiles else if (wind_model_flag ==3) # aloft interpolated, constant in tiles
{ {
@ -785,6 +795,9 @@ else if (wind_model_flag ==3) # aloft interpolated, constant in tiles
var res = wind_altitude_interpolation(altitude,w); var res = wind_altitude_interpolation(altitude,w);
var winddir = res[0]; var winddir = res[0];
var windspeed = res[1]; var windspeed = res[1];
wind.cloudlayer = wind_altitude_interpolation(0.0,w);
} }
else if (wind_model_flag == 5) # aloft waypoint interpolated else if (wind_model_flag == 5) # aloft waypoint interpolated
{ {
@ -792,9 +805,13 @@ else if (wind_model_flag == 5) # aloft waypoint interpolated
var winddir = res[0]; var winddir = res[0];
var windspeed = res[1]; var windspeed = res[1];
wind.cloudlayer = wind_interpolation(viewpos.lat(), viewpos.lon(), 0.0);
} }
wind.surface = [wind.cloudlayer[0], wind.cloudlayer[1] * get_slowdown_fraction()];
# now do the boundary layer computations # now do the boundary layer computations
var altitude_agl = getprop("/position/altitude-agl-ft"); var altitude_agl = getprop("/position/altitude-agl-ft");
@ -843,6 +860,15 @@ else
} }
var windspeed_ground = (1.0-f_min) * windspeed;
# set the wind hash before gusts, it represents mean wind
wind.current = [winddir,windspeed_current];
# determine gusts and turbulence in the bounday layer # determine gusts and turbulence in the bounday layer
var gust_frequency = getprop(lw~"tmp/gust-frequency-hz"); var gust_frequency = getprop(lw~"tmp/gust-frequency-hz");
@ -897,6 +923,13 @@ setprop(lw~"current/wind-from-heading-deg",winddir);
setprop(lw~"current/wind-speed-kt",windspeed_current); setprop(lw~"current/wind-speed-kt",windspeed_current);
# hack to get access to the water shader
setprop("/environment/config/boundary/entry[0]/wind-from-heading-deg",winddir);
setprop("/environment/config/boundary/entry[0]/wind-speed-kt",windspeed_ground);
# end hack
if (getprop(lw~"interpolation-loop-flag") ==1) {settimer(interpolation_loop, interpolation_loop_time);} if (getprop(lw~"interpolation-loop-flag") ==1) {settimer(interpolation_loop, interpolation_loop_time);}
@ -1472,14 +1505,18 @@ if (path == "new") # we have to switch to new cloud generating routines
local_weather.cloudAssembly.lon = long; local_weather.cloudAssembly.lon = long;
local_weather.cloudAssembly.alt = alt; local_weather.cloudAssembly.alt = alt;
#print(lat," ",long, " ", alt);
if (dynamics_flag == 1) if (dynamics_flag == 1)
{ {
local_weather.cloudAssembly.mean_alt = cloud_mean_altitude; local_weather.cloudAssembly.mean_alt = cloud_mean_altitude;
local_weather.cloudAssembly.flt = cloud_fractional_lifetime; local_weather.cloudAssembly.flt = cloud_fractional_lifetime;
local_weather.cloudAssembly.evolution_timestamp = cloud_evolution_timestamp; local_weather.cloudAssembly.evolution_timestamp = cloud_evolution_timestamp;
local_weather.cloudAssembly.rel_alt = c.alt - c.mean_alt; local_weather.cloudAssembly.rel_alt = cloudAssembly.alt - cloud_mean_altitude;
} }
compat_layer.create_cloud_new(local_weather.cloudAssembly); #compat_layer.create_cloud_new(local_weather.cloudAssembly);
append(cloudAssemblyArray,cloudAssembly);
return; return;
} }
@ -1736,7 +1773,7 @@ else
var alpha = rand() * 180.0; var alpha = rand() * 180.0;
edge = edge + edge_bias; edge = edge + edge_bias;
create_streak(type,lat,lon, alt+ 0.3* (height )-600.0, height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0); create_streak(type,lat,lon, alt+ 0.3* (height )-offset_map["Congestus"], height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0);
var type = "Cu (volume)"; var type = "Cu (volume)";
var height = 400; var height = 400;
@ -1747,12 +1784,12 @@ else
edge = edge + edge_bias; edge = edge + edge_bias;
create_streak(type,lat,lon, alt+ 0.3* (height )-600.0, height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0); create_streak(type,lat,lon, alt+ 0.3* (height )-offset_map["Congestus"], height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0);
var btype = "Congestus bottom"; var btype = "Congestus bottom";
var n_b = 6; var n_b = 6;
create_streak(btype,lat,lon, alt - 1100.0, 100.0,n_b,0.0,edge,0.3*x,1,0.0,0.0,0.3*y,alpha,1.0); create_streak(btype,lat,lon, alt -offset_map["Congestus"] -200.0, 100.0,n_b,0.0,edge,0.3*x,1,0.0,0.0,0.3*y,alpha,1.0);
} }
else if (size>1.1) else if (size>1.1)
@ -1768,9 +1805,9 @@ else
var alpha = rand() * 180.0; var alpha = rand() * 180.0;
edge = edge + edge_bias; edge = edge + edge_bias;
create_streak(type,lat,lon, alt+ 0.3* (height )-600.0, height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0); create_streak(type,lat,lon, alt+ 0.3* (height )-offset_map["Cumulus"], height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0);
create_streak(btype,lat,lon, alt -600.0, 100.0,n_b,0.0,edge,0.3*x,1,0.0,0.0,0.3*y,alpha,1.0); create_streak(btype,lat,lon, alt -offset_map["Cumulus"] - 200.0, 100.0,n_b,0.0,edge,0.3*x,1,0.0,0.0,0.3*y,alpha,1.0);
} }
else if (size>0.8) else if (size>0.8)
@ -1784,13 +1821,13 @@ else
var alpha = rand() * 180.0; var alpha = rand() * 180.0;
edge = edge + edge_bias; edge = edge + edge_bias;
create_streak(type,lat,lon, alt+ 0.3* (height )-600.0, height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0); create_streak(type,lat,lon, alt+ 0.3* (height )-offset_map["Cumulus"], height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0);
n = 2; n = 2;
x = 700.0; x = 700.0;
y = 200.0; y = 200.0;
edge = 1.0; edge = 1.0;
create_streak(type,lat,lon, alt+ 0.3* (height )-600.0, height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0); create_streak(type,lat,lon, alt+ 0.3* (height )-offset_map["Cumulus"], height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0);
} }
else if (size>0.4) else if (size>0.4)
@ -1804,7 +1841,7 @@ else
var alpha = rand() * 180.0; var alpha = rand() * 180.0;
edge = edge + edge_bias; edge = edge + edge_bias;
create_streak(type,lat,lon, alt+ 0.3* (height)-600.0, height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0); create_streak(type,lat,lon, alt+ 0.3* (height)-offset_map["Cumulus"], height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0);
} }
else else
{ {
@ -1817,7 +1854,7 @@ else
var alpha = rand() * 180.0; var alpha = rand() * 180.0;
edge = edge + edge_bias; edge = edge + edge_bias;
create_streak(type,lat,lon, alt+ 0.3* (height )-600.0, height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0); create_streak(type,lat,lon, alt+ 0.3* (height )-offset_map["Cumulus"], height,n,0.0,edge,x,1,0.0,0.0,y,alpha,1.0);
} }
} }
@ -1833,7 +1870,7 @@ else
var create_cumulonimbus_cloud = func(lat, lon, alt, size) { var create_cumulonimbus_cloud = func(lat, lon, alt, size) {
if (hardcoded_clouds_flag == 1) if (hardcoded_clouds_flag == 1)
{create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 3.4, 8, 0.9, 0.2, 8);} {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);}
else else
{create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 1.4, 4, 0.9, 0.2, 8);} {create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 1.4, 4, 0.9, 0.2, 8);}
@ -1848,7 +1885,7 @@ else
var create_cumulonimbus_cloud_rain = func(lat, lon, alt, size, rain) { var create_cumulonimbus_cloud_rain = func(lat, lon, alt, size, rain) {
if (hardcoded_clouds_flag == 1) if (hardcoded_clouds_flag == 1)
{create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 3.4, 8, 0.9, 0.2, 8);} {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);}
else else
{create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 1.4, 4, 0.9, 0.2, 8);} {create_cloudbox("Cb_box", lat, lon, alt, 2500.0,2000.0, 1000.0,14, 0.2, 0.1, 1.4, 4, 0.9, 0.2, 8);}
@ -1939,18 +1976,21 @@ var detail_flag = detailed_clouds_flag;
var alpha = getprop(lw~"tmp/tile-orientation-deg") * math.pi/180.0; # the tile orientation var alpha = getprop(lw~"tmp/tile-orientation-deg") * math.pi/180.0; # the tile orientation
if (detailed_terrain_interaction_flag == 1) var tile_index = getprop(lw~"tiles/tile-counter");
{ var alt_base = alt_20_array[tile_index -1];
var tile_index = getprop(lw~"tiles/tile-counter");
#if (detailed_terrain_interaction_flag == 1)
# {
#var tile_index = getprop(lw~"tiles/tile-counter");
#var alt_min = alt_min_array[tile_index-1]; #var alt_min = alt_min_array[tile_index-1];
#var alt_mean = alt_mean_array[tile_index -1]; #var alt_mean = alt_mean_array[tile_index -1];
#var alt_median = alt_50_array[tile_index -1]; #var alt_median = alt_50_array[tile_index -1];
#var alt_base = alt_20_array[tile-index -1]; #var alt_base = alt_20_array[tile_index -1];
#var alt_min = getprop(lw~"tmp/tile-alt-min-ft"); #var alt_min = getprop(lw~"tmp/tile-alt-min-ft");
#var alt_mean = getprop(lw~"tmp/tile-alt-mean-ft"); #var alt_mean = getprop(lw~"tmp/tile-alt-mean-ft");
#var alt_median = getprop(lw~"tmp/tile-alt-median-ft"); #var alt_median = getprop(lw~"tmp/tile-alt-median-ft");
#var alt_base = getprop(lw~"tmp/tile-alt-offset-ft"); #var alt_base = getprop(lw~"tmp/tile-alt-offset-ft");
} # }
var sec_to_rad = 2.0 * math.pi/86400; # conversion factor for sinusoidal dependence on daytime var sec_to_rad = 2.0 * math.pi/86400; # conversion factor for sinusoidal dependence on daytime
@ -2003,7 +2043,13 @@ while (i < nc) {
if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];} if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];}
else {print(p, " ", info[1].names[0]);} else {print(p, " ", info[1].names[0]);}
}} }}
else {continue;} else {
# to avoid gaps, we create default clouds
p = p + 0.1;
var elevation = alt_base;
# continue;
}
# apply some optional corrections, biases clouds towards higher elevations # apply some optional corrections, biases clouds towards higher elevations
@ -2056,8 +2102,10 @@ while (i < nc) {
} }
# now decide on the strength of the thermal # now decide on the strength of the thermal at the spot and on cloud size
strength = (1.5 * rand() + (2.0 * p * terrain_strength_factor)) * t_factor2; # the strength of thermal activity at the spot
var rn = rand();
strength = (1.5 * rn + (2.0 * p * terrain_strength_factor)) * t_factor2;
if (strength > 1.0) if (strength > 1.0)
{ {
# we place a large cloud, and we generate lift # we place a large cloud, and we generate lift
@ -2065,6 +2113,14 @@ while (i < nc) {
} }
else {path = select_cloud_model("Cumulus","small");} else {path = select_cloud_model("Cumulus","small");}
# the terrain effect cannot create Cb development, so we have to curb
# the strength if it would not have been Cb otherwise
if (strength > 2.0)
{
if (((1.5 * rn + (2.0 * p)) * t_factor2) < 2.0)
{strength = 1.7 + rand() * 0.2;}
}
cloud_mean_altitude = place_alt; cloud_mean_altitude = place_alt;
@ -2168,6 +2224,7 @@ nc = t_factor1 * nc * math.cos(blat/180.0*math.pi);
var thermal_conditions = getprop(lw~"config/thermal-properties"); var thermal_conditions = getprop(lw~"config/thermal-properties");
var alt_base = alt_20_array[tile_index -1];
while (i < nc) { while (i < nc) {
@ -2198,7 +2255,13 @@ while (i < nc) {
if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];} if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];}
else {print(p, " ", info[1].names[0]);} else {print(p, " ", info[1].names[0]);}
}} }}
else {continue;} else {
# to avoid gaps, we create default clouds
p = p + 0.1;
var elevation = alt_base;
# continue;
}
# apply some optional corrections, biases clouds towards higher elevations # apply some optional corrections, biases clouds towards higher elevations
@ -2578,6 +2641,8 @@ var n = int(area/80000000.0 * 100 * density);
var m = int(circ/63000.0 * 40 * rain_density); var m = int(circ/63000.0 * 40 * rain_density);
var path = "Models/Weather/blank.ac"; var path = "Models/Weather/blank.ac";
#print("density: ",n);
phi = phi * math.pi/180.0; phi = phi * math.pi/180.0;
if (contains(cloud_vertical_size_map, type)) if (contains(cloud_vertical_size_map, type))
@ -2599,7 +2664,10 @@ while(i<n)
{ {
if (rand() > 0.4) { if (rand() > 0.4) {
path = select_cloud_model(type,"small"); path = select_cloud_model(type,"small");
compat_layer.create_cloud(path, lat, lon, alt, 0.0); if (thread_flag == 1)
{create_cloud_vec(path, lat, lon, alt, 0.0);}
else
{compat_layer.create_cloud(path, lat, lon, alt, 0.0);}
} }
} }
else { else {
@ -2617,6 +2685,8 @@ i = 0;
if (rainflag ==1){ if (rainflag ==1){
if (local_weather.hardcoded_clouds_flag == 1) {balt = balt + local_weather.offset_map[type]; }
while(i<m) while(i<m)
{ {
var alpha = rand() * 2.0 * math.pi; var alpha = rand() * 2.0 * math.pi;
@ -3513,7 +3583,7 @@ if (getprop(lw~"config/generate-thermal-lift-flag") ==1) {generate_thermal_lift_
else {generate_thermal_lift_flag = 0}; else {generate_thermal_lift_flag = 0};
thread_flag = getprop(lw~"config/thread-flag"); thread_flag = getprop(lw~"config/thread-flag");
dynamics_flag = getprop(lw~"config/dynamics-flag"); # dynamics_flag = getprop(lw~"config/dynamics-flag");
presampling_flag = getprop(lw~"config/presampling-flag"); presampling_flag = getprop(lw~"config/presampling-flag");
detailed_clouds_flag = getprop(lw~"config/detailed-clouds-flag"); detailed_clouds_flag = getprop(lw~"config/detailed-clouds-flag");
dynamical_convection_flag = getprop(lw~"config/dynamical-convection-flag"); dynamical_convection_flag = getprop(lw~"config/dynamical-convection-flag");
@ -3781,6 +3851,16 @@ if (dynamical_convection_flag == 1)
} }
} }
if (detailed_terrain_interaction_flag == 1)
{
if (presampling_flag == 0)
{
print("Terrain effect needs terrain presampling to run! Aborting...");
setprop("/sim/messages/pilot", "Local weather: terrain effect needs terrain presampling to run! Aborting...");
return;
}
}
# if we can do so, we switch global weather and METAR parsing in environment off at this point # if we can do so, we switch global weather and METAR parsing in environment off at this point
@ -3851,6 +3931,12 @@ if (metar_flag == 1) # the winds from current METAR are used
var metar_base_wind_deg = getprop("environment/metar/base-wind-dir-deg"); var metar_base_wind_deg = getprop("environment/metar/base-wind-dir-deg");
var metar_base_wind_speed = boundary_correction * getprop("environment/metar/base-wind-speed-kt"); var metar_base_wind_speed = boundary_correction * getprop("environment/metar/base-wind-speed-kt");
# set the wind hash for the new scheme
wind.cloudlayer = [metar_base_wind_deg,metar_base_wind_speed];
wind.surface = [metar_base_wind_deg,metar_base_wind_speed/boundary_correction];
wind.current = wind.surface;
if ((wind_model_flag == 1) or (wind_model_flag == 2)) if ((wind_model_flag == 1) or (wind_model_flag == 2))
{ {
@ -3880,6 +3966,8 @@ if (metar_flag == 1) # the winds from current METAR are used
} }
else else
{ {
setprop(lw~"tiles/tile[4]/tile-index",1);
var boundary_correction = get_slowdown_fraction();
if (wind_model_flag == 5) # it needs to be interpolated if (wind_model_flag == 5) # it needs to be interpolated
{ {
@ -3887,16 +3975,36 @@ else
append(weather_dynamics.tile_wind_direction,res[0]); append(weather_dynamics.tile_wind_direction,res[0]);
append(weather_dynamics.tile_wind_speed,res[1]); append(weather_dynamics.tile_wind_speed,res[1]);
# set the wind hash for the new scheme
wind.surface = [res[0],res[1] * boundary_correction];
wind.cloudlayer = res;
wind.current = wind.surface;
} }
else if (wind_model_flag == 3) # it comes from a different menu else if (wind_model_flag == 3) # it comes from a different menu
{ {
append(weather_dynamics.tile_wind_direction, getprop(lw~"tmp/FL0-wind-from-heading-deg")); append(weather_dynamics.tile_wind_direction, getprop(lw~"tmp/FL0-wind-from-heading-deg"));
append(weather_dynamics.tile_wind_speed, getprop(lw~"tmp/FL0-windspeed-kt")); append(weather_dynamics.tile_wind_speed, getprop(lw~"tmp/FL0-windspeed-kt"));
# set the wind hash for the new scheme
wind.cloudlayer = [getprop(lw~"tmp/FL0-wind-from-heading-deg"),getprop(lw~"tmp/FL0-windspeed-kt") ];
wind.surface = [wind.cloudlayer[0],wind.cloudlayer[1] * boundary_correction];
wind.current = wind.surface;
} }
else # it comes from the standard menu else # it comes from the standard menu
{ {
append(weather_dynamics.tile_wind_direction, getprop(lw~"tmp/tile-orientation-deg")); append(weather_dynamics.tile_wind_direction, getprop(lw~"tmp/tile-orientation-deg"));
append(weather_dynamics.tile_wind_speed, getprop(lw~"tmp/windspeed-kt")); append(weather_dynamics.tile_wind_speed, getprop(lw~"tmp/windspeed-kt"));
# set the wind hash for the new scheme
wind.cloudlayer = [getprop(lw~"tmp/tile-orientation-deg"),getprop(lw~"tmp/windspeed-kt")];
wind.surface = [wind.cloudlayer[0],wind.cloudlayer[1] * boundary_correction];
wind.current = wind.surface;
} }
# when the aloft wind menu is used, the lowest winds should be taken from there # when the aloft wind menu is used, the lowest winds should be taken from there
@ -3964,6 +4072,8 @@ else if (type == "Warmfront-3")
{weather_tiles.set_warmfront3_tile();} {weather_tiles.set_warmfront3_tile();}
else if (type == "Warmfront-4") else if (type == "Warmfront-4")
{weather_tiles.set_warmfront4_tile();} {weather_tiles.set_warmfront4_tile();}
else if (type == "Thunderstorms")
{weather_tiles.set_thunderstorms_tile();}
else if (type == "METAR") else if (type == "METAR")
{weather_tiles.set_METAR_tile();} {weather_tiles.set_METAR_tile();}
else if (type == "Altocumulus sky") else if (type == "Altocumulus sky")
@ -4018,11 +4128,12 @@ if (getprop(lw~"effect-loop-flag") == 0)
# start weather dynamics loops if needed # start weather dynamics loops if needed
if (getprop(lw~"timing-loop-flag") == 0)
{setprop(lw~"timing-loop-flag",1); local_weather.timing_loop();}
if (dynamics_flag ==1) if (dynamics_flag ==1)
{ {
if (getprop(lw~"timing-loop-flag") == 0)
{setprop(lw~"timing-loop-flag",1); weather_dynamics.timing_loop();}
if (getprop(lw~"dynamics-loop-flag") == 0) if (getprop(lw~"dynamics-loop-flag") == 0)
{ {
@ -4042,7 +4153,6 @@ if (dynamics_flag ==1)
# and start the buffer loop and housekeeping loop if needed # and start the buffer loop and housekeeping loop if needed
#if (getprop(lw~"config/buffer-flag") ==1)
if (buffer_flag == 1) if (buffer_flag == 1)
{ {
if (getprop(lw~"buffer-loop-flag") == 0) if (getprop(lw~"buffer-loop-flag") == 0)
@ -4128,8 +4238,8 @@ setprop(lw~"METAR/available-flag",1);
# set listeners # set listeners
setlistener(lw~"tmp/thread-status", func {var s = size(clouds_path); compat_layer.create_cloud_array(s, clouds_path, clouds_lat, clouds_lon, clouds_alt, clouds_orientation); }); setlistener(lw~"tmp/thread-status", func {var s = size(clouds_path); compat_layer.create_cloud_array(s, clouds_path, clouds_lat, clouds_lon, clouds_alt, clouds_orientation); });
setlistener(lw~"tmp/convective-status", func {var s = size(clouds_path); compat_layer.create_cloud_array(s, clouds_path, clouds_lat, clouds_lon, clouds_alt, clouds_orientation); }); setlistener(lw~"tmp/convective-status", func {var s = size(clouds_path); compat_layer.create_cloud_array(s, clouds_path, clouds_lat, clouds_lon, clouds_alt, clouds_orientation); });
setlistener(lw~"tmp/effect-thread-status", func {var s = size(effects_geo); effect_placement_loop(s); }); 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~"tmp/presampling-status", func {manage_presampling(); });
@ -4145,6 +4255,10 @@ setlistener(lw~"config/fps-control-flag", func {fps_control_flag = getprop(lw~"c
setlistener(lw~"config/target-framerate", func {target_framerate = getprop(lw~"config/target-framerate");}); setlistener(lw~"config/target-framerate", func {target_framerate = getprop(lw~"config/target-framerate");});
setlistener(lw~"config/small-scale-persistence", func {weather_tiles.small_scale_persistence = getprop(lw~"config/small-scale-persistence");}); setlistener(lw~"config/small-scale-persistence", func {weather_tiles.small_scale_persistence = getprop(lw~"config/small-scale-persistence");});
setlistener(lw~"config/ground-haze-factor", func {ground_haze_factor = getprop(lw~"config/ground-haze-factor");});
setlistener(lw~"config/max-vis-range-m", func {max_vis_range = getprop(lw~"config/max-vis-range-m");});
setlistener(lw~"config/temperature-offset-degc", func {temperature_offset = getprop(lw~"config/temperature-offset-degc");});
setlistener("/sim/rendering/scattering-shader", func {scattering_shader_flag = getprop("/sim/rendering/scattering-shader"); }); setlistener("/sim/rendering/scattering-shader", func {scattering_shader_flag = getprop("/sim/rendering/scattering-shader"); });
} }
@ -4179,7 +4293,7 @@ presampling_flag = 0;
#var pos = geo.aircraft_position(); #var pos = geo.aircraft_position();
#debug.dump(geodinfo(lat, lon)); debug.dump(geodinfo(lat, lon));
#create_cumulonimbus_cloud(lat, lon, 6000.0, 2.5); #create_cumulonimbus_cloud(lat, lon, 6000.0, 2.5);
@ -4190,7 +4304,7 @@ presampling_flag = 0;
#setprop("/environment/terrain/area[0]/output/valid", 0 ); #setprop("/environment/terrain/area[0]/output/valid", 0 );
elttest(); # elttest();
} }
@ -4471,12 +4585,16 @@ var ec = "/environment/config/";
# a hash map of the strength for convection associated with terrain types # a hash map of the strength for convection associated with terrain types
var landcover_map = {BuiltUpCover: 0.35, Town: 0.35, Freeway:0.35, BarrenCover:0.3, HerbTundraCover: 0.25, GrassCover: 0.2, CropGrassCover: 0.2, EvergreenBroadCover: 0.2, EvergreenNeedleCover: 0.2, Sand: 0.25, Grass: 0.2, Ocean: 0.01, Marsh: 0.05, Lake: 0.01, ShrubCover: 0.15, Landmass: 0.2, CropWoodCover: 0.15, MixedForestCover: 0.15, DryCropPastureCover: 0.25, MixedCropPastureCover: 0.2, IrrCropPastureCover: 0.15, DeciduousBroadCover: 0.1, DeciduousNeedleCover: 0.1, Bog: 0.05, pa_taxiway : 0.35, pa_tiedown: 0.35, pc_taxiway: 0.35, pc_tiedown: 0.35, Glacier: 0.03, DryLake: 0.3, IntermittentStream: 0.2, DryCrop: 0.2, Lava: 0.3, GolfCourse: 0.2}; var landcover_map = {BuiltUpCover: 0.35, Town: 0.35, Freeway:0.35, BarrenCover:0.3, HerbTundraCover: 0.25, GrassCover: 0.2, CropGrassCover: 0.2, EvergreenBroadCover: 0.2, EvergreenNeedleCover: 0.2, Sand: 0.25, Grass: 0.2, Ocean: 0.01, Marsh: 0.05, Lake: 0.01, ShrubCover: 0.15, Landmass: 0.2, CropWoodCover: 0.15, MixedForestCover: 0.15, DryCropPastureCover: 0.25, MixedCropPastureCover: 0.2, IrrCropPastureCover: 0.15, DeciduousBroadCover: 0.1, DeciduousNeedleCover: 0.1, Bog: 0.05, pa_taxiway : 0.35, pa_tiedown: 0.35, pc_taxiway: 0.35, pc_tiedown: 0.35, Glacier: 0.03, SnowCover: 0.04, DryLake: 0.3, IntermittentStream: 0.2, DryCrop: 0.2, Lava: 0.3, GolfCourse: 0.2, Rock: 0.3, Construction: 0.35};
# a hash map of average vertical cloud model sizes # a hash map of average vertical cloud model sizes
var cloud_vertical_size_map = {Altocumulus: 700.0, Cumulus: 600.0, Congestus: 2000.0, Nimbus: 1000.0, Stratus: 800.0, Stratus_structured: 600.0, Stratus_thin: 400.0, Cirrocumulus: 200.0, Cb_box: 2000.0}; var cloud_vertical_size_map = {Altocumulus: 700.0, Cumulus: 600.0, Congestus: 2000.0, Nimbus: 1000.0, Stratus: 800.0, Stratus_structured: 600.0, Stratus_thin: 400.0, Cirrocumulus: 200.0, Cb_box: 2000.0};
# a hash map of offsets for the new cloud rendering system
var offset_map = {Nimbus: 2800.0, Stratus: 2000.0, Stratus_thin: 2500.0, Cirrostratus: 4500.0, Stratus_structured: 1800.0, Stratus_alt: 600.0, Cumulus: 200.0, Congestus: 600.0 };
# the array of aloft wind interpolation altitudes # the array of aloft wind interpolation altitudes
var wind_altitude_array = [0.0, 5000.0, 10000.0, 18000.0, 24000.0, 30000.0, 34000.0, 39000.0, 45000.0]; var wind_altitude_array = [0.0, 5000.0, 10000.0, 18000.0, 24000.0, 30000.0, 34000.0, 39000.0, 45000.0];
@ -4522,6 +4640,9 @@ var n_effectVolumeArray = 0;
var thermal = {}; var thermal = {};
var wave = {}; var wave = {};
# the wind hash stores the current winds
var wind = {surface: [0.0,0.0] , cloudlayer: [0.0,0.0], current: [0.0,0.0]};
@ -4573,6 +4694,11 @@ var hardcoded_clouds_flag = 1;
var realistic_visibility_flag = 0; var realistic_visibility_flag = 0;
var scattering_shader_flag = 0; var scattering_shader_flag = 0;
var ground_haze_factor = 1.0;
var max_vis_range = 120000.0;
var temperature_offset = 0.0;
# globals for framerate controlled cloud management # globals for framerate controlled cloud management
var fps_average = 0.0; var fps_average = 0.0;
@ -4628,6 +4754,8 @@ setprop(lw~"effect-volumes/number-active-turb",0);
setprop(lw~"effect-volumes/number-active-lift",0); setprop(lw~"effect-volumes/number-active-lift",0);
setprop(lw~"effect-volumes/number-active-sat",0); 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);
# create properties for tile management # create properties for tile management

View file

@ -27,7 +27,19 @@
var get_windfield = func (tile_index) { var get_windfield = func (tile_index) {
var windfield = [];
if (hardcoded_clouds_flag == 1)
{
var wind_direction = local_weather.wind.current[0];
var windspeed = local_weather.wind.current[1] * kt_to_ms;
var windfield_x = -windspeed * math.sin(wind_direction * math.pi/180.0);
var windfield_y = -windspeed * math.cos(wind_direction * math.pi/180.0);
return [windfield_x,windfield_y];
}
@ -47,15 +59,17 @@ else if ((local_weather.wind_model_flag ==2) or (local_weather.wind_model_flag =
var windfield_x = -windspeed * math.sin(wind_direction * math.pi/180.0); var windfield_x = -windspeed * math.sin(wind_direction * math.pi/180.0);
var windfield_y = -windspeed * math.cos(wind_direction * math.pi/180.0); var windfield_y = -windspeed * math.cos(wind_direction * math.pi/180.0);
append(windfield,windfield_x); return [windfield_x,windfield_y];
append(windfield,windfield_y);
return windfield;
} }
var get_wind_direction = func (tile_index) { var get_wind_direction = func (tile_index) {
if (hardcoded_clouds_flag == 1)
{
return local_weather.wind.current[0];
}
if ((local_weather.wind_model_flag == 1) or (local_weather.wind_model_flag == 3)) if ((local_weather.wind_model_flag == 1) or (local_weather.wind_model_flag == 3))
{ {
return tile_wind_direction[0]; return tile_wind_direction[0];
@ -69,6 +83,11 @@ else if ((local_weather.wind_model_flag ==2) or (local_weather.wind_model_flag =
var get_wind_speed = func (tile_index) { var get_wind_speed = func (tile_index) {
if (hardcoded_clouds_flag == 1)
{
return local_weather.wind.current[1];
}
if ((local_weather.wind_model_flag == 1) or (local_weather.wind_model_flag == 3)) if ((local_weather.wind_model_flag == 1) or (local_weather.wind_model_flag == 3))
{ {
return tile_wind_speed[0]; return tile_wind_speed[0];
@ -94,6 +113,15 @@ if (local_weather.local_weather_running_flag == 0) {return;}
dt_lw = getprop("/sim/time/delta-sec"); dt_lw = getprop("/sim/time/delta-sec");
time_lw = time_lw + dt_lw; time_lw = time_lw + dt_lw;
# this is a really ugly hack to get the sun angle information to the shaders
# directly referencing /sim/time/sun-angle-rad as uniform doesn't
# work since that is a tied property
var sun_angle = 1.57079632675 - getprop("/sim/time/sun-angle-rad");
var terminator_offset = sun_angle / 0.017451 * 110000.0 + 250000.0;
setprop("/environment/terminator-relative-position-m",terminator_offset);
if (getprop(lw~"timing-loop-flag") ==1) {settimer(timing_loop, 0);} if (getprop(lw~"timing-loop-flag") ==1) {settimer(timing_loop, 0);}
} }

View file

@ -43,8 +43,8 @@ var code = getprop(lw~"tiles/tile[4]/code");
var i = 0; var i = 0;
var d_min = 100000.0; var d_min = 100000.0;
var i_min = 0; var i_min = 0;
var distance_to_load = getprop(lw~"config/distance-to-load-tile-m"); # var distance_to_load = getprop(lw~"config/distance-to-load-tile-m");
var distance_to_remove = getprop(lw~"config/distance-to-remove-tile-m"); # var distance_to_remove = getprop(lw~"config/distance-to-remove-tile-m");
var current_visibility = getprop(lw~"interpolation/visibility-m"); var current_visibility = getprop(lw~"interpolation/visibility-m");
var current_heading = getprop("orientation/heading-deg"); var current_heading = getprop("orientation/heading-deg");
var loading_flag = getprop(lw~"tmp/asymmetric-tile-loading-flag"); var loading_flag = getprop(lw~"tmp/asymmetric-tile-loading-flag");
@ -53,10 +53,18 @@ var this_frame_action_flag = 0; # use this flag to avoid overlapping tile operat
setsize(active_tile_list,0); setsize(active_tile_list,0);
#append(active_tile_list,0); # tile zero formally containing static objects is always active #append(active_tile_list,0); # tile zero formally containing static objects is always active
if (distance_to_load > 3.0 * current_visibility) var distance_to_load = current_visibility;
{distance_to_load = 3.0 * current_visibility;}
if (distance_to_load < 29000.0) if (distance_to_load > 65000.0) {distance_to_load = 65000.0;}
{distance_to_load = 29000.0;} if (distance_to_load < 29000.0) {distance_to_load = 29000.0;}
#if (distance_to_load > 3.0 * current_visibility)
# {distance_to_load = 3.0 * current_visibility;}
#if (distance_to_load < 29000.0)
# {distance_to_load = 29000.0;}
var distance_to_remove = distance_to_load + 500.0;
# check here if we have a new weather station if METAR is running # check here if we have a new weather station if METAR is running
@ -473,6 +481,7 @@ if (getprop(lw~"tmp/tile-management") == "repeat tile")
else if (code == "cold_sector") {weather_tiles.set_cold_sector_tile();} else if (code == "cold_sector") {weather_tiles.set_cold_sector_tile();}
else if (code == "warm_sector") {weather_tiles.set_warm_sector_tile();} else if (code == "warm_sector") {weather_tiles.set_warm_sector_tile();}
else if (code == "tropical_weather") {weather_tiles.set_tropical_weather_tile();} else if (code == "tropical_weather") {weather_tiles.set_tropical_weather_tile();}
else if (code == "thunderstorms") {weather_tiles.set_thunderstorms_tile();}
else if (code == "test") {weather_tiles.set_4_8_stratus_tile();} else if (code == "test") {weather_tiles.set_4_8_stratus_tile();}
else else
{ {

View file

@ -96,22 +96,29 @@ calc_geo(blat);
# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) # first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure)
local_weather.set_weather_station(blat, blon, alt_offset, 20000.0, 14.0, 12.0, 29.78); local_weather.set_weather_station(blat, blon, alt_offset, 30000.0, 14.0, 12.0, 29.78);
#strength = 0.5; alt_offset = 0.0;
#var strength = 0.5;
#local_weather.create_cumosys(blat,blon, 3000.0, get_n(strength), 20000.0); #local_weather.create_cumosys(blat,blon, 3000.0, get_n(strength), 20000.0);
#create_2_8_altocumulus_streaks(blat, blon, 12000+alt_offset, alpha) ; #create_2_8_altocumulus_streaks(blat, blon, 12000+alt_offset, alpha) ;
#create_2_8_altocumulus_streaks(blat, blon, 12000+alt_offset, alpha) ; #create_2_8_altocumulus_streaks(blat, blon, 12000+alt_offset, alpha) ;
#create_6_8_stratus(blat, blon, 3000+alt_offset, alpha) ; #create_6_8_stratus(blat, blon, 3000+alt_offset, alpha) ;
#create_4_8_tstratus_patches(blat, blon, 5000+alt_offset, alpha) ; #create_4_8_tstratus_patches(blat, blon, 5000+alt_offset, alpha) ;
#create_4_8_sstratus_patches(blat, blon, 12000+alt_offset, alpha) ; #create_4_8_sstratus_patches(blat, blon, 5000+alt_offset, alpha) ;
#create_4_8_cirrostratus_patches(blat, blon, 20000+alt_offset, alpha) ; #create_4_8_cirrostratus_patches(blat, blon, 5000+alt_offset, alpha) ;
#create_4_8_cirrocumulus_streaks(blat, blon, 10000.0 + alt_offset, alpha); #create_4_8_cirrocumulus_streaks(blat, blon, 10000.0 + alt_offset, alpha);
create_4_8_alttstratus_streaks(blat, blon, 5000+alt_offset, alpha) ; #create_4_8_alttstratus_streaks(blat, blon, 5000+alt_offset, alpha) ;
#create_2_8_cirrocumulus_patches(blat, blon, 13000+alt_offset, alpha) ; #create_2_8_cirrocumulus_patches(blat, blon, 13000+alt_offset, alpha) ;
#create_8_8_nimbus_rain(blat, blon, 5000+alt_offset, alpha, 0.3) ;
#create_8_8_nimbus_rain(blat, blon, 3000+alt_offset, alpha, 0.3) ;
#create_8_8_tstratus(blat, blon, 5000+alt_offset, alpha);
#create_8_8_cirrostratus(blat, blon, 5000+alt_offset, alpha);
create_thunderstorm_scenario (blat, blon, 3000.0, alpha);
#create_big_thunderstorm (blat, blon, 3000.0, alpha);
#create_4_8_altocumulus_perlucidus(blat, blon, 5000+alt_offset, alpha) ; #create_4_8_altocumulus_perlucidus(blat, blon, 5000+alt_offset, alpha) ;
@ -121,7 +128,7 @@ create_4_8_alttstratus_streaks(blat, blon, 5000+alt_offset, alpha) ;
local_weather.set_atmosphere_ipoint(blat, blon, 45000.0, 10000.0, 45000.0, 0.0, 25000.0, 30000.0, 0.9, 10000.0, 11000.0); local_weather.set_atmosphere_ipoint(blat, blon, 45000.0, 15000.0, 45000.0, 0.0, 15000.0, 17000.0, 0.8, 12000.0, 17000.0);
append(weather_dynamics.tile_convective_altitude,3000.0); append(weather_dynamics.tile_convective_altitude,3000.0);
@ -160,12 +167,14 @@ calc_geo(blat);
# get probabilistic values for the weather parameters # get probabilistic values for the weather parameters
var vis = 30000.0 + rand() * 15000.0; var vis = 25000.0 + rand() * 10000.0;
var T = 20.0 + rand() * 10.0; var T = 20.0 + rand() * 10.0;
var spread = 14.0 + 8.0 * rand(); var spread = 14.0 + 8.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1025.0 + rand() * 6.0; p = adjust_p(p); var p = 1025.0 + rand() * 6.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -298,12 +307,14 @@ calc_geo(blat);
# get probabilistic values for the weather parameters # get probabilistic values for the weather parameters
var vis = 25000.0 + rand() * 15000.0; var vis = 20000.0 + rand() * 10000.0;
var T = 15.0 + rand() * 10.0; var T = 15.0 + rand() * 10.0;
var spread = 10.0 + 4.0 * rand(); var spread = 10.0 + 4.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1019.0 + rand() * 6.0; p = adjust_p(p); var p = 1019.0 + rand() * 6.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -445,12 +456,14 @@ calc_geo(blat);
# get probabilistic values for the weather parameters # get probabilistic values for the weather parameters
var vis = 20000.0 + rand() * 12000.0; var vis = 15000.0 + rand() * 7000.0;
var T = 12.0 + rand() * 10.0; var T = 12.0 + rand() * 10.0;
var spread = 7.0 + 4.0 * rand(); var spread = 7.0 + 4.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1013.0 + rand() * 6.0; p = adjust_p(p); var p = 1013.0 + rand() * 6.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -653,12 +666,14 @@ calc_geo(blat);
# get probabilistic values for the weather parameters # get probabilistic values for the weather parameters
var vis = 12000.0 + rand() * 9000.0; var vis = 8000.0 + rand() * 8000.0;
var T = 10.0 + rand() * 10.0; var T = 10.0 + rand() * 10.0;
var spread = 6.0 + 2.0 * rand(); var spread = 6.0 + 2.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1007.0 + rand() * 6.0; p = adjust_p(p); var p = 1007.0 + rand() * 6.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -802,7 +817,7 @@ var alpha = getprop(lw~"tmp/tile-orientation-deg");
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (getprop(lw~"tmp/presampling-flag") == 0) if (local_weather.presampling_flag == 0)
{var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");}
else else
{var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");}
@ -815,13 +830,13 @@ calc_geo(blat);
# get probabilistic values for the weather parameters # get probabilistic values for the weather parameters
var vis = 9000.0 + rand() * 10000.0; var vis = 8000.0 + rand() * 5000.0;
var T = 5.0 + rand() * 10.0; var T = 5.0 + rand() * 10.0;
var spread = 5.0 + 2.0 * rand(); var spread = 5.0 + 2.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1001.0 + rand() * 6.0; p = adjust_p(p); var p = 1001.0 + rand() * 6.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -832,11 +847,15 @@ var strength = 0.0;
var rn = rand(); var rn = rand();
if (rand() < small_scale_persistence) if (rand() < small_scale_persistence)
{rn = rnd_store;} {rn = rnd_store;}
else else
{rnd_store = rn;} {rnd_store = rn;}
rn = 0.1;
if (rn > 0.8) if (rn > 0.8)
{ {
@ -849,7 +868,10 @@ if (rn > 0.8)
y = 2.0 * (rand()-0.5) * 11000.0; y = 2.0 * (rand()-0.5) * 11000.0;
var beta = rand() * 360.0; var beta = rand() * 360.0;
local_weather.create_layer("Nimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), alt+alt_offset, 500.0, 12000.0, 7000.0, beta, 1.0, 0.2, 1, 1.0); var alt_eff = alt;
if (local_weather.hardcoded_clouds_flag == 1) {alt_eff = alt_eff - 3000.0;}
local_weather.create_layer("Nimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), alt_eff+alt_offset, 500.0, 12000.0, 7000.0, beta, 1.0, 0.2, 1, 1.0);
local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 10000.0, 6000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0,-1 ); local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 10000.0, 6000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0,-1 );
local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0,-1 ); local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0,-1 );
@ -857,7 +879,7 @@ if (rn > 0.8)
y = 2.0 * (rand()-0.5) * 11000.0; y = 2.0 * (rand()-0.5) * 11000.0;
var beta = rand() * 360.0; var beta = rand() * 360.0;
local_weather.create_layer("Nimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), alt+alt_offset, 500.0, 10000.0, 6000.0, beta, 1.0, 0.2, 1, 1.0); local_weather.create_layer("Nimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), alt_eff+alt_offset, 500.0, 10000.0, 6000.0, beta, 1.0, 0.2, 1, 1.0);
local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0 ,-1); local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 9000.0, 5000.0, beta, 0.0, alt + alt_offset, 5000.0, 0.3, -1, -1, -1,0 ,-1);
local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 8000.0, 4000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0,-1 ); local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 8000.0, 4000.0, beta, 0.0, alt+alt_offset-300.0, 1500.0, 0.5, -1, -1, -1,0,-1 );
@ -952,7 +974,7 @@ var lon = 0.0;
var alpha = getprop(lw~"tmp/tile-orientation-deg"); var alpha = getprop(lw~"tmp/tile-orientation-deg");
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (getprop(lw~"tmp/presampling-flag") == 0) if (local_weather.presampling_flag == 0)
{var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");}
else else
{var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");}
@ -971,6 +993,8 @@ var spread = 4.5 + 1.0 * rand();
var D = T - spread; var D = T - spread;
var p = 995.0 + rand() * 6.0; p = adjust_p(p); var p = 995.0 + rand() * 6.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -980,6 +1004,7 @@ local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_i
var alt = spread * 400.0 + local_weather.cloud_vertical_size_map["Nimbus"] * 0.5 * m_to_ft; var alt = spread * 400.0 + local_weather.cloud_vertical_size_map["Nimbus"] * 0.5 * m_to_ft;
var strength = 0.0; var strength = 0.0;
#var alt = 3000.0;
create_8_8_nimbus_rain(blat, blon, alt+alt_offset, alpha,0.4 + rand()*0.2); create_8_8_nimbus_rain(blat, blon, alt+alt_offset, alpha,0.4 + rand()*0.2);
@ -1036,12 +1061,14 @@ calc_geo(blat);
# get probabilistic values for the weather parameters # get probabilistic values for the weather parameters
var vis = 45000.0 + rand() * 20000.0; var vis = 40000.0 + rand() * 15000.0;
var T = 8.0 + rand() * 8.0; var T = 8.0 + rand() * 8.0;
var spread = 7.0 + 3.0 * rand(); var spread = 7.0 + 3.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1005.0 + rand() * 10.0; p = adjust_p(p); var p = 1005.0 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -1131,12 +1158,14 @@ calc_geo(blat);
# get probabilistic values for the weather parameters # get probabilistic values for the weather parameters
var vis = 12000.0 + rand() * 10000.0; var vis = 8000.0 + rand() * 5000.0;
var T = 16.0 + rand() * 10.0; var T = 16.0 + rand() * 10.0;
var spread = 6.0 + 3.0 * rand(); var spread = 6.0 + 3.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1005.0 + rand() * 10.0; p = adjust_p(p); var p = 1005.0 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# and set them at the tile center # and set them at the tile center
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -1273,6 +1302,8 @@ var spread = 8.0 + 2.0 * rand();
var D = T - spread; var D = T - spread;
var p = 970 + rand() * 10.0; p = adjust_p(p); var p = 970 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) # first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure)
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg); local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
@ -1374,6 +1405,82 @@ tile_finished();
} }
####################################
# Thunderstorms
####################################
var set_thunderstorms_tile = func {
setprop(lw~"tiles/code","thunderstorms");
tile_start();
var x = 0.0;
var y = 0.0;
var lat = 0.0;
var lon = 0.0;
var alpha = getprop(lw~"tmp/tile-orientation-deg");
var phi = alpha * math.pi/180.0;
var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");
# get tile center coordinates
var blat = getprop(lw~"tiles/tmp/latitude-deg");
var blon = getprop(lw~"tiles/tmp/longitude-deg");
calc_geo(blat);
# get probabilistic values for the weather parameters
var vis = 9000.0 + rand() * 10000.0;
var T = 10.0 + rand() * 15.0;
var spread = 8.0 + 2.0 * rand();
var D = T - spread;
var p = 1000 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure)
local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_inhg);
# altitude for the lowest layer
var alt = spread * 400.0;
var strength = 0.0;
# bias Cumulus clouds towards larger sizes due to lots of water vapour
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);
var rn = rand();
if (rand() < small_scale_persistence)
{rn = rnd_store;}
else
{rnd_store = rn;}
create_thunderstorm_scenario (blat, blon, alt + alt_offset, alpha);
# store convective altitude and strength
append(weather_dynamics.tile_convective_altitude,alt);
append(weather_dynamics.tile_convective_strength,strength);
tile_finished();
}
#################################### ####################################
# Coldfront # Coldfront
#################################### ####################################
@ -1410,6 +1517,8 @@ var spread = 8.0 + 2.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1005 + rand() * 10.0; p = adjust_p(p); var p = 1005 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# first weather info for tile (lat, lon, visibility, temperature, dew point, pressure) # first weather info for tile (lat, lon, visibility, temperature, dew point, pressure)
# after the front # after the front
@ -1525,7 +1634,7 @@ var lon = 0.0;
var alpha = getprop(lw~"tmp/tile-orientation-deg"); var alpha = getprop(lw~"tmp/tile-orientation-deg");
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (getprop(lw~"tmp/presampling-flag") == 0) if (local_weather.presampling_flag == 0)
{var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");}
else else
{var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");}
@ -1544,6 +1653,8 @@ var spread = 9.0 + 4.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1005 + rand() * 10.0; p = adjust_p(p); var p = 1005 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# first weather info for tile (lat, lon, visibility, temperature, dew point, pressure) # first weather info for tile (lat, lon, visibility, temperature, dew point, pressure)
# after the front # after the front
@ -1587,7 +1698,10 @@ for (var i=0; i<6; i=i+1)
var x = 2.0 * (rand()-0.5) * 15000; var x = 2.0 * (rand()-0.5) * 15000;
var y = 2.0 * (rand()-0.5) * 10000 + 10000; var y = 2.0 * (rand()-0.5) * 10000 + 10000;
var beta = (rand() -0.5) * 180.0; var beta = (rand() -0.5) * 180.0;
local_weather.create_streak("Cirrostratus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 18000 + alt + alt_offset,300.0,4,2300.0,0.2,600.0,4,2300.0,0.2,600.0,alpha+beta,1.0); var alt_shift = 0.0;
if (local_weather.hardcoded_clouds_flag == 1) {alt_shift = local_weather.offset_map["Cirrostratus"];}
local_weather.create_streak("Cirrostratus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 18000 + alt + alt_offset - alt_shift,300.0,4,2300.0,0.2,600.0,4,2300.0,0.2,600.0,alpha+beta,1.0);
} }
@ -1625,7 +1739,7 @@ var lon = 0.0;
var alpha = getprop(lw~"tmp/tile-orientation-deg"); var alpha = getprop(lw~"tmp/tile-orientation-deg");
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (getprop(lw~"tmp/presampling-flag") == 0) if (local_weather.presampling_flag == 0)
{var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");}
else else
{var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");}
@ -1644,6 +1758,8 @@ var spread = 8.0 + 2.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1005 + rand() * 10.0; p = adjust_p(p); var p = 1005 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# first weather info for tile (lat, lon, visibility, temperature, dew point, pressure) # first weather info for tile (lat, lon, visibility, temperature, dew point, pressure)
# after the front # after the front
@ -1668,12 +1784,15 @@ var strength = 0.0;
# followed by random patches of Cirrostratus # followed by random patches of Cirrostratus
var alt_shift = 0.0;
if (local_weather.hardcoded_clouds_flag == 1) {alt_shift = local_weather.offset_map["Cirrostratus"];}
for (var i=0; i<3; i=i+1) for (var i=0; i<3; i=i+1)
{ {
var x = 2.0 * (rand()-0.5) * 18000; var x = 2.0 * (rand()-0.5) * 18000;
var y = 2.0 * (rand()-0.5) * 5000 - 15000; var y = 2.0 * (rand()-0.5) * 5000 - 15000;
var beta = (rand() -0.5) * 180.0; var beta = (rand() -0.5) * 180.0;
local_weather.create_streak("Cirrostratus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 15000 + alt + alt_offset,300.0,4,2300.0,0.2,600.0,4,2300.0,0.2,600.0,alpha+beta,1.0); local_weather.create_streak("Cirrostratus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 15000 + alt + alt_offset - alt_shift,300.0,4,2300.0,0.2,600.0,4,2300.0,0.2,600.0,alpha+beta,1.0);
} }
@ -1742,7 +1861,7 @@ var lon = 0.0;
var alpha = getprop(lw~"tmp/tile-orientation-deg"); var alpha = getprop(lw~"tmp/tile-orientation-deg");
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (getprop(lw~"tmp/presampling-flag") == 0) if (local_weather.presampling_flag == 0)
{var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");}
else else
{var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");}
@ -1761,6 +1880,8 @@ var spread = 7.0 + 2.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1005 + rand() * 10.0; p = adjust_p(p); var p = 1005 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# first weather info for tile (lat, lon, visibility, temperature, dew point, pressure) # first weather info for tile (lat, lon, visibility, temperature, dew point, pressure)
# after the front # after the front
@ -1849,7 +1970,7 @@ var lon = 0.0;
var alpha = getprop(lw~"tmp/tile-orientation-deg"); var alpha = getprop(lw~"tmp/tile-orientation-deg");
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (getprop(lw~"tmp/presampling-flag") == 0) if (local_weather.presampling_flag == 0)
{var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");}
else else
{var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");} {var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");}
@ -1868,6 +1989,8 @@ var spread = 5.0 + 2.0 * rand();
var D = T - spread; var D = T - spread;
var p = 1005 + rand() * 10.0; p = adjust_p(p); var p = 1005 + rand() * 10.0; p = adjust_p(p);
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
# first weather info for tile (lat, lon, visibility, temperature, dew point, pressure) # first weather info for tile (lat, lon, visibility, temperature, dew point, pressure)
# after the front # after the front
@ -1951,7 +2074,10 @@ var lon = 0.0;
var alpha = getprop("/environment/metar/base-wind-dir-deg"); var alpha = getprop("/environment/metar/base-wind-dir-deg");
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
var metar_alt_offset = 700.0 + getprop("/environment/metar/station-elevation-ft");
# it seems more recent Flightgear versions have absolute altitude
# var metar_alt_offset = 700.0 + getprop("/environment/metar/station-elevation-ft");
var metar_alt_offset = 700.0;
# print("metar_alt_offset", metar_alt_offset); # print("metar_alt_offset", metar_alt_offset);
@ -2263,11 +2389,13 @@ var set_METAR_weather_station = func {
if (is_visibility_max == 1) if (is_visibility_max == 1)
{ {
if (p * inhg_to_hp < 1000.0) {vis = 10000.0 + 5000 * rand();} if (p * inhg_to_hp < 1000.0) {vis = 10000.0 + 5000 * rand();}
else if (p * inhg_to_hp < 1010.0) {vis = 15000.0 + 7000 * rand();} else if (p * inhg_to_hp < 1010.0) {vis = 15000.0 + 7000 * rand();}
else if (p * inhg_to_hp < 1020.0) {vis = 22000.0 + 14000.0 * rand();} else if (p * inhg_to_hp < 1020.0) {vis = 22000.0 + 14000.0 * rand();}
else {vis = 30000.0 + 15000.0 * rand();} else {vis = 30000.0 + 15000.0 * rand();}
}
if (realistic_visibility_flag == 1) {vis = vis * realistic_visibility_multiplyer;}
}
@ -2385,32 +2513,31 @@ var set_METAR_weather_station = func {
# mid-level cloud setup calls # mid-level cloud setup calls
#################################### ####################################
var create_8_8_stratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;}
local_weather.create_streak("Stratus",lat, lon, alt,500.0,32,1250.0,0.0,400.0,32,1250.0,0.0,400.0,alpha,1.0);
}
var create_8_8_tstratus = func (lat, lon, alt, alpha) { var create_8_8_tstratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 650.0;} if (local_weather.hardcoded_clouds_flag == 1)
{
local_weather.create_streak("Stratus (thin)",lat, lon, alt,500.0,32,1250.0,0.0,400.0,32,1250.0,0.0,400.0,alpha,1.0); alt = alt - local_weather.offset_map["Stratus_thin"];
local_weather.create_streak("Stratus (thin)",lat, lon, alt,500.0,40,1000.0,0.0,400.0,40,1000.0,0.0,400.0,alpha,1.0);
}
else
{
local_weather.create_streak("Stratus (thin)",lat, lon, alt,500.0,32,1250.0,0.0,400.0,32,1250.0,0.0,400.0,alpha,1.0);
}
} }
var create_8_8_cirrostratus = func (lat, lon, alt, alpha) { var create_8_8_cirrostratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Cirrostratus"];}
local_weather.create_streak("Cirrostratus",lat,lon,alt,500.0,30,1250.0,0.0,400.0,30,1250.0,0.0,400.0,alpha,1.0); local_weather.create_streak("Cirrostratus",lat,lon,alt,500.0,30,1250.0,0.0,400.0,30,1250.0,0.0,400.0,alpha,1.0);
} }
var create_8_8_nimbus = func (lat, lon, alt, alpha) { var create_8_8_nimbus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;}
local_weather.create_streak("Nimbus",lat, lon, alt,500.0,32,1250.0,0.0,200.0,32,1250.0,0.0,200.0,alpha,1.0); local_weather.create_streak("Nimbus",lat, lon, alt,500.0,32,1250.0,0.0,200.0,32,1250.0,0.0,200.0,alpha,1.0);
@ -2419,9 +2546,11 @@ local_weather.create_streak("Nimbus",lat, lon, alt,500.0,32,1250.0,0.0,200.0,32,
var create_8_8_nimbus_var1 = func (lat, lon, alt, alpha) { var create_8_8_nimbus_var1 = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {var alt_eff = alt - local_weather.offset_map["Nimbus"]; }
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
local_weather.create_streak("Nimbus",lat, lon, alt,500.0,35,1111.0,0.0,200.0,35,1111.0,0.0,200.0,alpha,1.0); local_weather.create_streak("Nimbus",lat, lon, alt_eff,500.0,35,1150.0,0.0,200.0,35,1150.0,0.0,200.0,alpha,1.0);
for (var i = 0; i < 3; i=i+1) for (var i = 0; i < 3; i=i+1)
{ {
@ -2434,9 +2563,11 @@ for (var i = 0; i < 3; i=i+1)
var create_8_8_nimbus_var2 = func (lat, lon, alt, alpha) { var create_8_8_nimbus_var2 = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {var alt_eff = alt - local_weather.offset_map["Nimbus"]; }
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
local_weather.create_streak("Nimbus",lat, lon, alt,500.0,35,1111.0,0.0,200.0,35,1111.0,0.0,200.0,alpha,1.0); local_weather.create_streak("Nimbus",lat, lon, alt_eff,500.0,35,1150.0,0.0,200.0,35,1150.0,0.0,200.0,alpha,1.0);
for (var i=0; i<8; i=i+1) for (var i=0; i<8; i=i+1)
{ {
@ -2452,10 +2583,12 @@ for (var i=0; i<8; i=i+1)
var create_8_8_nimbus_var3 = func (lat, lon, alt, alpha) { var create_8_8_nimbus_var3 = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {var alt_eff = alt - local_weather.offset_map["Nimbus"]; }
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
local_weather.create_streak("Nimbus",lat, lon, alt,500.0,35,1111.0,0.0,200.0,35,1111.0,0.0,200.0,alpha,1.0); local_weather.create_streak("Nimbus",lat, lon, alt_eff,500.0,35,1150.0,0.0,200.0,35,1150.0,0.0,200.0,alpha,1.0);
for (var i=0; i<6; i=i+1) for (var i=0; i<6; i=i+1)
{ {
@ -2465,21 +2598,17 @@ for (var i=0; i<6; i=i+1)
local_weather.create_streak("Stratus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt+1600.0,300.0,6,1200.0,0.2,700.0,6,1200.0,0.2,700.0,alpha+beta,1.0); local_weather.create_streak("Stratus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt+1600.0,300.0,6,1200.0,0.2,700.0,6,1200.0,0.2,700.0,alpha+beta,1.0);
} }
# reduced visibility in layer
#local_weather.create_effect_volume(3, lat, lon, 20000.0, 20000.0, alpha, alt-1500.0, alt+900.0, 2000.0, -1 , -1, -1, -1,0 ,-1);
# cloud shade
#local_weather.create_effect_volume(3, lat, lon, 20000.0, 20000.0, alpha, 0.0, alt, -1, -1 , -1, -1, -1,0 ,0.8);
} }
var create_8_8_nimbus_rain = func (lat, lon, alt, alpha, rain) { var create_8_8_nimbus_rain = func (lat, lon, alt, alpha, rain) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 3000.0;}
if (local_weather.detailed_clouds_flag == 0) if (local_weather.detailed_clouds_flag == 0)
{local_weather.create_streak("Nimbus",lat, lon, alt,500.0,32,1250.0,0.0,200.0,32,1250.0,0.0,200.0,alpha,1.0);} {local_weather.create_streak("Nimbus",lat, lon, alt,500.0,32,1250.0,0.0,200.0,32,1250.0,0.0,200.0,alpha,1.0);}
else else
{ {
#print(local_weather.offset_map["Nimbus"]);
var rn = rand(); var rn = rand();
if (rn > 0.66) {create_8_8_nimbus_var1(lat, lon, alt, alpha);} if (rn > 0.66) {create_8_8_nimbus_var1(lat, lon, alt, alpha);}
else if (rn > 0.33) {create_8_8_nimbus_var2(lat, lon, alt, alpha);} else if (rn > 0.33) {create_8_8_nimbus_var2(lat, lon, alt, alpha);}
@ -2499,12 +2628,19 @@ else
} }
var create_8_8_stratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus"];}
local_weather.create_streak("Stratus",lat, lon, alt,500.0,32,1250.0,0.0,400.0,32,1250.0,0.0,400.0,alpha,1.0);
}
var create_8_8_stratus_rain = func (lat, lon, alt, alpha, rain) { var create_8_8_stratus_rain = func (lat, lon, alt, alpha, rain) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;}
local_weather.create_streak("Stratus",lat, lon, alt,500.0,32,1250.0,0.0,400.0,32,1250.0,0.0,400.0,alpha,1.0); create_8_8_stratus(lat, lon, alt, alpha);
if (rain > 0.1) if (rain > 0.1)
{ {
@ -2520,9 +2656,22 @@ else
var create_6_8_stratus = func (lat, lon, alt, alpha) { var create_6_8_stratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;} if (local_weather.hardcoded_clouds_flag == 1)
{
alt = alt - local_weather.offset_map["Stratus"];
local_weather.create_streak("Stratus",lat, lon, alt,500.0,20,0.0,0.2,20000.0,20,0.0,0.2,20000.0,alpha,1.0); for (var i = 0; i < 20; i = i + 1)
{
var phi = alpha * math.pi/180.0;
var x = 2.0 * (rand()-0.5) * 18000;
var y = 2.0 * (rand()-0.5) * 18000;
local_weather.create_streak("Stratus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,500.0,5,2300.0,0.2,500.0,5,2300.0,0.2,500.0,alpha,1.0);
}
}
else
{local_weather.create_streak("Stratus",lat, lon, alt,500.0,20,0.0,0.2,20000.0,20,0.0,0.2,20000.0,alpha,1.0);}
} }
@ -2532,7 +2681,9 @@ var create_6_8_nimbus_rain = func (lat, lon, alt, alpha, rain) {
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 3000.0;} var alt_cloud = alt;
if (local_weather.hardcoded_clouds_flag == 1) {alt_cloud = alt_cloud - 3000.0;}
for (var i = 0; i < 3; i = i + 1) for (var i = 0; i < 3; i = i + 1)
{ {
@ -2540,7 +2691,7 @@ for (var i = 0; i < 3; i = i + 1)
var y = 2.0 * (rand()-0.5) * 12000.0; var y = 2.0 * (rand()-0.5) * 12000.0;
var beta = rand() * 360.0; var beta = rand() * 360.0;
local_weather.create_layer("Nimbus", lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt, 500.0, 12000.0, 7000.0, beta, 1.0, 0.2, 1, 1.0); local_weather.create_layer("Nimbus", lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt_cloud, 500.0, 12000.0, 7000.0, beta, 1.0, 0.2, 1, 1.0);
if (rain > 0.1) if (rain > 0.1)
{ {
@ -2562,7 +2713,9 @@ var create_6_8_stratus_rain = func (lat, lon, alt, alpha, rain) {
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;} var alt_cloud = alt;
if (local_weather.hardcoded_clouds_flag == 1) {alt_cloud = alt_cloud - local_weather.offset_map["Stratus"];}
for (var i = 0; i < 3; i = i + 1) for (var i = 0; i < 3; i = i + 1)
{ {
@ -2570,7 +2723,7 @@ for (var i = 0; i < 3; i = i + 1)
var y = 2.0 * (rand()-0.5) * 12000.0; var y = 2.0 * (rand()-0.5) * 12000.0;
var beta = rand() * 360.0; var beta = rand() * 360.0;
local_weather.create_layer("Stratus", lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt, 500.0, 12000.0, 7000.0, beta, 1.0, 0.2, 0, 0.0); local_weather.create_layer("Stratus", lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt_cloud, 500.0, 12000.0, 7000.0, beta, 1.0, 0.2, 0, 0.0);
if (rain > 0.1) if (rain > 0.1)
{ {
@ -2589,21 +2742,21 @@ for (var i = 0; i < 3; i = i + 1)
var create_6_8_stratus_undulatus = func (lat, lon, alt, alpha) { var create_6_8_stratus_undulatus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus"];}
local_weather.create_undulatus("Stratus",lat, lon, alt,300.0,10,4000.0,0.1,400.0,50,800.0,0.1,100.0, 1000.0, alpha,1.0); local_weather.create_undulatus("Stratus",lat, lon, alt,300.0,10,4000.0,0.1,400.0,50,800.0,0.1,100.0, 1000.0, alpha,1.0);
} }
var create_6_8_tstratus_undulatus = func (lat, lon, alt, alpha) { var create_6_8_tstratus_undulatus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 650.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_thin"];}
local_weather.create_undulatus("Stratus (thin)",lat, lon, alt,300.0,10,4000.0,0.1,400.0,50,800.0,0.1,100.0, 1000.0, alpha,1.0); local_weather.create_undulatus("Stratus (thin)",lat, lon, alt,300.0,10,4000.0,0.1,400.0,50,800.0,0.1,100.0, 1000.0, alpha,1.0);
} }
var create_6_8_cirrostratus = func (lat, lon, alt, alpha) { var create_6_8_cirrostratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Cirrostratus"];}
local_weather.create_streak("Cirrostratus",lat,lon,alt,500.0,24,1500.0,0.0,900.0,24,1500.0,0.0,900.0,alpha,1.0); local_weather.create_streak("Cirrostratus",lat,lon,alt,500.0,24,1500.0,0.0,900.0,24,1500.0,0.0,900.0,alpha,1.0);
} }
@ -2633,7 +2786,7 @@ else
var create_4_8_stratus = func (lat, lon, alt, alpha) { var create_4_8_stratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
var x = 2.0 * (rand()-0.5) * 15000; var x = 2.0 * (rand()-0.5) * 15000;
@ -2662,7 +2815,7 @@ var create_4_8_stratus_patches = func (lat, lon, alt, alpha) {
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus"];}
for (var i=0; i<16; i=i+1) for (var i=0; i<16; i=i+1)
{ {
@ -2679,7 +2832,7 @@ var create_4_8_tstratus_patches = func (lat, lon, alt, alpha) {
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 650.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_thin"];}
for (var i=0; i<22; i=i+1) for (var i=0; i<22; i=i+1)
{ {
@ -2701,7 +2854,7 @@ var create_4_8_sstratus_patches = func (lat, lon, alt, alpha) {
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_structured"];}
for (var i=0; i<22; i=i+1) for (var i=0; i<22; i=i+1)
{ {
@ -2719,7 +2872,7 @@ for (var i=0; i<22; i=i+1)
var create_4_8_cirrostratus_patches = func (lat, lon, alt, alpha) { var create_4_8_cirrostratus_patches = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Cirrostratus"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -2736,7 +2889,7 @@ for (var i=0; i<6; i=i+1)
var create_4_8_cirrostratus_undulatus = func (lat, lon, alt, alpha) { var create_4_8_cirrostratus_undulatus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Cirrostratus"];}
local_weather.create_undulatus("Cirrostratus",lat, lon, alt,300.0,5,8000.0,0.1,400.0,40,1000.0,0.1,100.0, 1500.0, alpha,1.0); local_weather.create_undulatus("Cirrostratus",lat, lon, alt,300.0,5,8000.0,0.1,400.0,40,1000.0,0.1,100.0, 1500.0, alpha,1.0);
} }
@ -2744,7 +2897,7 @@ local_weather.create_undulatus("Cirrostratus",lat, lon, alt,300.0,5,8000.0,0.1,4
var create_4_8_stratus_undulatus = func (lat, lon, alt, alpha) { var create_4_8_stratus_undulatus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
var x = 2.0 * (rand()-0.5) * 5000; var x = 2.0 * (rand()-0.5) * 5000;
@ -2760,7 +2913,7 @@ local_weather.create_streak("Stratus",lat+get_lat(x,y-4000,phi), lon+get_lon(x,y
var create_4_8_tstratus_undulatus = func (lat, lon, alt, alpha) { var create_4_8_tstratus_undulatus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 650.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_thin"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
var x = 2.0 * (rand()-0.5) * 5000; var x = 2.0 * (rand()-0.5) * 5000;
@ -2776,7 +2929,7 @@ local_weather.create_streak("Stratus (thin)",lat+get_lat(x,y-4000,phi), lon+get_
var create_4_8_sstratus_undulatus = func (lat, lon, alt, alpha) { var create_4_8_sstratus_undulatus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_structured"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
var x = 2.0 * (rand()-0.5) * 5000; var x = 2.0 * (rand()-0.5) * 5000;
@ -2858,7 +3011,7 @@ for (var i=0; i<20; i=i+1)
var create_4_8_alttstratus_streaks = func (lat, lon, alt, alpha) { var create_4_8_alttstratus_streaks = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 300.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_alt"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -2878,7 +3031,7 @@ for (var i=0; i<10; i=i+1)
var create_4_8_alttstratus_patches = func (lat, lon, alt, alpha) { var create_4_8_alttstratus_patches = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 300.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_alt"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -2909,7 +3062,7 @@ else
var create_2_8_stratus = func (lat, lon, alt, alpha) { var create_2_8_stratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1500.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -2926,7 +3079,7 @@ for (var i=0; i<8; i=i+1)
var create_2_8_tstratus = func (lat, lon, alt, alpha) { var create_2_8_tstratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 650.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_thin"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -2944,7 +3097,7 @@ for (var i=0; i<8; i=i+1)
var create_2_8_sstratus = func (lat, lon, alt, alpha) { var create_2_8_sstratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_structured"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -2967,7 +3120,7 @@ for (var i=0; i<8; i=i+1)
var create_2_8_sstratus_streak = func (lat, lon, alt, alpha) { var create_2_8_sstratus_streak = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_structured"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -2981,7 +3134,7 @@ local_weather.create_streak("Stratus (structured)",lat+get_lat(x,y,phi), lon+get
var create_2_8_cirrostratus = func (lat, lon, alt, alpha) { var create_2_8_cirrostratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Cirrostratus"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -3027,7 +3180,7 @@ local_weather.create_streak("Cirrus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi),
var create_2_8_alttstratus = func (lat, lon, alt, alpha) { var create_2_8_alttstratus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 300.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Stratus_alt"];}
var phi = alpha * math.pi/180.0; var phi = alpha * math.pi/180.0;
@ -3113,7 +3266,7 @@ local_weather.create_streak("Cirrus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi),
var create_1_8_cirrostratus_undulatus = func (lat, lon, alt, alpha) { var create_1_8_cirrostratus_undulatus = func (lat, lon, alt, alpha) {
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 1800.0;} if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - local_weather.offset_map["Cirrostratus"];}
local_weather.create_undulatus("Cirrostratus",lat, lon, alt,300.0,1,8000.0,0.0,400.0,40,1000.0,0.1,100.0, 1500.0, alpha,1.0); local_weather.create_undulatus("Cirrostratus",lat, lon, alt,300.0,1,8000.0,0.0,400.0,40,1000.0,0.1,100.0, 1500.0, alpha,1.0);
} }
@ -3265,9 +3418,12 @@ var create_small_thunderstorm = func(lat, lon, alt, alpha) {
var scale = 0.7 + rand() * 0.3; var scale = 0.7 + rand() * 0.3;
local_weather.create_layer("Stratus", lat, lon, alt, 1000.0, 4000.0 * scale, 4000.0 * scale, 0.0, 1.0, 0.3, 1, 1.0); var alt_eff = alt;
if (local_weather.hardcoded_clouds_flag == 1) {alt_eff = alt - local_weather.offset_map["Stratus"] - 2000.0; }
local_weather.create_layer("Cumulonimbus (cloudlet)", lat, lon, alt+2000, 15000.0, 3000.0 * scale, 3000.0 * scale, 0.0, 2.0, 0.0, 0, 0.0); local_weather.create_layer("Stratus", lat, lon, alt_eff, 1000.0, 4000.0 * scale, 4000.0 * scale, 0.0, 1.0, 0.3, 1, 1.0);
local_weather.create_layer("Cumulonimbus (cloudlet)", lat, lon, alt_eff+3000.0, 12000.0, 3000.0 * scale, 3000.0 * scale, 0.0, 2.0, 0.0, 0, 0.0);
# set the exclusion region for the Cumulus layer # set the exclusion region for the Cumulus layer
append(elat, lat); append(elon, lon); append(erad, 4000.0 * scale * 1.2); append(elat, lat); append(elon, lon); append(erad, 4000.0 * scale * 1.2);
@ -3282,15 +3438,20 @@ var create_medium_thunderstorm = func(lat, lon, alt, alpha) {
var scale = 0.7 + rand() * 0.3; var scale = 0.7 + rand() * 0.3;
local_weather.create_layer("Nimbus", lat, lon, alt, 500.0, 6000.0 * scale, 6000.0 * scale, 0.0, 1.0, 0.3, 1, 1.5); var alt_eff = alt;
if (local_weather.hardcoded_clouds_flag == 1) {alt_eff = alt - local_weather.offset_map["Nimbus"] - 2000.0; }
#local_weather.create_layer("Stratus", lat, lon, alt+1500, 1000.0, 5500.0 * scale, 5500.0 * scale, 0.0, 1.0, 0.3, 0, 0.0); local_weather.create_layer("Nimbus", lat, lon, alt_eff, 500.0, 6000.0 * scale, 6000.0 * scale, 0.0, 1.0, 0.3, 1, 1.5);
local_weather.create_hollow_layer("Stratus", lat, lon, alt+1500, 1000.0, 5500.0 * scale, 5500.0 * scale, 0.0, 1.0, 0.3, 0.5);
local_weather.create_layer("Fog (thick)", lat, lon, alt+4000, 6000.0, 3400.0 * scale, 3400.0 * scale, 0.0, 1.5, 0.3, 0, 0.0); #local_weather.create_layer("Stratus", lat, lon, alt_eff+1500, 1000.0, 5500.0 * scale, 5500.0 * scale, 0.0, 1.0, 0.3, 0, 0.0);
local_weather.create_layer("Cumulonimbus (cloudlet)", lat, lon, alt+10000, 10000.0, 3600.0 * scale, 3600.0 * scale, 0.0, 1.2, 0.0, 0, 0.0); local_weather.create_hollow_layer("Stratus", lat, lon, alt_eff+1500, 1000.0, 5500.0 * scale, 5500.0 * scale, 0.0, 1.0, 0.3, 0.5);
local_weather.create_layer("Fog (thick)", lat, lon, alt_eff+4000, 6000.0, 3400.0 * scale, 3400.0 * scale, 0.0, 1.5, 0.3, 0, 0.0);
local_weather.create_layer("Cumulonimbus (cloudlet)", lat, lon, alt_eff+10000, 10000.0, 3600.0 * scale, 3600.0 * scale, 0.0, 1.2, 0.0, 0, 0.0);
# set the exclusion region for the Cumulus layer # set the exclusion region for the Cumulus layer
append(elat, lat); append(elon, lon); append(erad, 6000.0 * scale * 1.2); append(elat, lat); append(elon, lon); append(erad, 6000.0 * scale * 1.2);
@ -3307,23 +3468,26 @@ var phi = alpha * math.pi/180.0;
var scale = 0.8; var scale = 0.8;
local_weather.create_layer("Nimbus", lat, lon, alt, 500.0, 7500.0 * scale, 7500.0 * scale, 0.0, 1.0, 0.25, 1, 1.5); var alt_eff = alt;
if (local_weather.hardcoded_clouds_flag == 1) {alt_eff = alt - local_weather.offset_map["Nimbus"]; }
local_weather.create_layer("Nimbus", lat, lon, alt_eff, 500.0, 7500.0 * scale, 7500.0 * scale, 0.0, 1.0, 0.25, 1, 1.5);
#local_weather.create_layer("Stratus", lat, lon, alt+1500, 1000.0, 7200.0 * scale, 7200.0 * scale, 0.0, 1.0, 0.3, 0, 0.0); #local_weather.create_layer("Stratus", lat, lon, alt+1500, 1000.0, 7200.0 * scale, 7200.0 * scale, 0.0, 1.0, 0.3, 0, 0.0);
local_weather.create_hollow_layer("Stratus", lat, lon, alt+1500, 1000.0, 7200.0 * scale, 7200.0 * scale, 0.0, 1.0, 0.3, 0.7); local_weather.create_hollow_layer("Stratus", lat, lon, alt_eff+1500, 1000.0, 7200.0 * scale, 7200.0 * scale, 0.0, 1.0, 0.3, 0.7);
local_weather.create_layer("Fog (thick)", lat, lon, alt+5000, 3000.0, 5500.0 * scale, 5500.0 * scale, 0.0, 0.7, 0.3, 0, 0.0); local_weather.create_layer("Fog (thick)", lat, lon, alt_eff+5000, 3000.0, 5500.0 * scale, 5500.0 * scale, 0.0, 0.7, 0.3, 0, 0.0);
local_weather.create_layer("Fog (thick)", lat+get_lat(0,-1000,phi), lon+get_lon(0,-1000,phi), alt+12000, 4000.0, 6300.0 * scale, 6300.0 * scale, 0.0, 0.7, 0.3, 0, 0.0); local_weather.create_layer("Fog (thick)", lat+get_lat(0,-1000,phi), lon+get_lon(0,-1000,phi), alt_eff+12000, 4000.0, 6300.0 * scale, 6300.0 * scale, 0.0, 0.7, 0.3, 0, 0.0);
#local_weather.create_layer("Stratus", lat+get_lat(0,-2000,phi), lon+get_lon(0,-2000,phi), alt+17000, 1000.0, 7500.0 * scale, 7500.0 * scale, 0.0, 1.0, 0.3, 0, 0.0); #local_weather.create_layer("Stratus", lat+get_lat(0,-2000,phi), lon+get_lon(0,-2000,phi), alt+17000, 1000.0, 7500.0 * scale, 7500.0 * scale, 0.0, 1.0, 0.3, 0, 0.0);
local_weather.create_hollow_layer("Stratus", lat+get_lat(0,-2000,phi), lon+get_lon(0,-2000,phi), alt+17000, 1000.0, 7500.0 * scale, 7500.0 * scale, 0.0, 1.0, 0.3, 0.5); local_weather.create_hollow_layer("Stratus", lat+get_lat(0,-2000,phi), lon+get_lon(0,-2000,phi), alt_eff+17000, 1000.0, 7500.0 * scale, 7500.0 * scale, 0.0, 1.0, 0.3, 0.5);
#local_weather.create_layer("Stratus", lat+get_lat(0,-3000,phi), lon+get_lon(0,-3000,phi), alt+20000, 1000.0, 9500.0 * scale, 9500.0 * scale, 0.0, 1.0, 0.3, 0, 0.0); #local_weather.create_layer("Stratus", lat+get_lat(0,-3000,phi), lon+get_lon(0,-3000,phi), alt_eff+20000, 1000.0, 9500.0 * scale, 9500.0 * scale, 0.0, 1.0, 0.3, 0, 0.0);
local_weather.create_hollow_layer("Stratus", lat+get_lat(0,-3000,phi), lon+get_lon(0,-3000,phi), alt+20000, 1000.0, 9500.0 * scale, 9500.0 * scale, 0.0, 1.0, 0.3, 0.5); local_weather.create_hollow_layer("Stratus", lat+get_lat(0,-3000,phi), lon+get_lon(0,-3000,phi), alt_eff+20000, 1000.0, 9500.0 * scale, 9500.0 * scale, 0.0, 1.0, 0.3, 0.5);
local_weather.create_layer("Stratus (thin)", lat+get_lat(0,-4000,phi), lon+get_lon(0,-4000,phi), alt+24000, 1000.0, 11500.0 * scale, 11500.0 * scale, 0.0, 2.0, 0.3, 0, 0.0); local_weather.create_layer("Stratus (thin)", lat+get_lat(0,-4000,phi), lon+get_lon(0,-4000,phi), alt_eff+24000, 1000.0, 11500.0 * scale, 11500.0 * scale, 0.0, 2.0, 0.0, 0, 0.0);
# set the exclusion region for the Cumulus layer # set the exclusion region for the Cumulus layer
append(elat, lat); append(elon, lon); append(erad, 7500.0 * scale * 1.2); append(elat, lat); append(elon, lon); append(erad, 7500.0 * scale * 1.2);
@ -3420,6 +3584,8 @@ var lon_to_m = 0.0; # needs to be calculated dynamically
var m_to_lon = 0.0; # we do this on startup var m_to_lon = 0.0; # we do this on startup
var lw = "/local-weather/"; var lw = "/local-weather/";
var realistic_visibility_multiplyer = 1.5;
var small_scale_persistence = getprop(lw~"config/small-scale-persistence"); var small_scale_persistence = getprop(lw~"config/small-scale-persistence");
var rnd_store = rand(); var rnd_store = rand();

10
Shaders/cloud-static.frag Normal file
View file

@ -0,0 +1,10 @@
uniform sampler2D baseTexture;
varying float fogFactor;
void main(void)
{
vec4 base = texture2D( baseTexture, gl_TexCoord[0].st);
vec4 finalColor = base * gl_Color;
gl_FragColor.rgb = mix(gl_Fog.color.rgb, finalColor.rgb, fogFactor );
gl_FragColor.a = mix(0.0, finalColor.a, fogFactor);
}

55
Shaders/cloud-static.vert Normal file
View file

@ -0,0 +1,55 @@
// -*-C++-*-
#version 120
varying float fogFactor;
float shade = 0.8;
float cloud_height = 1000.0;
void main(void)
{
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
//gl_TexCoord[0] = gl_MultiTexCoord0 + vec4(textureIndexX, textureIndexY, 0.0, 0.0);
vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
vec4 l = gl_ModelViewMatrixInverse * vec4(0.0,0.0,1.0,1.0);
vec3 u = normalize(ep.xyz - l.xyz);
gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
gl_Position.x = gl_Vertex.x;
gl_Position.y += gl_Vertex.y;
gl_Position.z += gl_Vertex.z;
gl_Position.xyz += gl_Color.xyz;
// Determine a lighting normal based on the vertex position from the
// center of the cloud, so that sprite on the opposite side of the cloud to the sun are darker.
float n = dot(normalize(-gl_LightSource[0].position.xyz),
normalize(mat3x3(gl_ModelViewMatrix) * (- gl_Position.xyz)));;
// Determine the position - used for fog and shading calculations
vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Position);
float fogCoord = abs(ecPosition.z);
float fract = smoothstep(0.0, cloud_height, gl_Position.z + cloud_height);
gl_Position = gl_ModelViewProjectionMatrix * gl_Position;
// Determine the shading of the sprite based on its vertical position and position relative to the sun.
n = min(smoothstep(-0.5, 0.0, n), fract);
// Determine the shading based on a mixture from the backlight to the front
vec4 backlight = gl_LightSource[0].diffuse * shade;
gl_FrontColor = mix(backlight, gl_LightSource[0].diffuse, n);
gl_FrontColor += gl_FrontLightModelProduct.sceneColor;
// 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(100.0, 250.0, fogCoord), 1.0 - smoothstep(70000.0, 75000.0, fogCoord));
gl_BackColor = gl_FrontColor;
// Fog doesn't affect rain as much as other objects.
fogFactor = exp( -gl_Fog.density * fogCoord * 0.4);
fogFactor = clamp(fogFactor, 0.0, 1.0);
}

View file

@ -3,6 +3,8 @@
varying float fogFactor; varying float fogFactor;
uniform float range; // From /sim/rendering/clouds3d-vis-range
float shade = 0.8; float shade = 0.8;
float cloud_height = 1000.0; float cloud_height = 1000.0;
@ -45,7 +47,7 @@ void main(void)
gl_FrontColor += gl_FrontLightModelProduct.sceneColor; gl_FrontColor += gl_FrontLightModelProduct.sceneColor;
// As we get within 100m of the sprite, it is faded out. Equally at large distances it also fades out. // 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(100.0, 250.0, fogCoord), 1.0 - smoothstep(40000.0, 45000.0, fogCoord)); gl_FrontColor.a = min(smoothstep(100.0, 250.0, fogCoord), 1.0 - smoothstep(range*0.9, range, fogCoord));
gl_BackColor = gl_FrontColor; gl_BackColor = gl_FrontColor;
// Fog doesn't affect rain as much as other objects. // Fog doesn't affect rain as much as other objects.

View file

@ -5,7 +5,7 @@
<!-- Weather tiles --> <!-- Weather tiles -->
<name>local_weather_tiles</name> <name>local_weather_tiles</name>
<width>310</width> <width>470</width>
<height>385</height> <height>385</height>
<modal>false</modal> <modal>false</modal>
@ -35,6 +35,7 @@
<value>Coldfront</value> <value>Coldfront</value>
<value>Warmfront</value> <value>Warmfront</value>
<value>Tropical</value> <value>Tropical</value>
<value>Thunderstorms</value>
<value>Test tile</value> <value>Test tile</value>
<binding> <binding>
<command>dialog-apply</command> <command>dialog-apply</command>
@ -49,6 +50,24 @@
</enable>--> </enable>-->
</combo> </combo>
<text>
<x>300</x>
<y>330</y>
<label>alt. offset (ft)</label>
</text>
<input>
<x>390</x>
<y>330</y>
<width>50</width>
<height>25</height>
<property>/local-weather/tmp/tile-alt-offset-ft</property>
</input>
<text> <text>
<x>5</x> <x>5</x>
<y>295</y> <y>295</y>
@ -77,34 +96,19 @@
<property>/local-weather/tmp/windspeed-kt</property> <property>/local-weather/tmp/windspeed-kt</property>
</input> </input>
<text>
<x>155</x>
<y>295</y>
<label>alt. offset (ft)</label>
</text>
<input>
<x>240</x>
<y>295</y>
<width>50</width>
<height>25</height>
<property>/local-weather/tmp/tile-alt-offset-ft</property>
</input>
<text> <text>
<x>5</x> <x>157</x>
<y>265</y> <y>295</y>
<label>gust freq.</label> <label>gust freq.</label>
</text> </text>
<slider> <slider>
<x>65</x> <x>225</x>
<y>265</y> <y>295</y>
<width>50</width> <width>50</width>
<height>20</height> <height>20</height>
<min>0.0</min> <min>0.0</min>
@ -118,15 +122,15 @@
<text> <text>
<x>112</x> <x>275</x>
<y>265</y> <y>295</y>
<label>strength</label> <label>strength</label>
</text> </text>
<slider> <slider>
<x>167</x> <x>333</x>
<y>265</y> <y>295</y>
<width>50</width> <width>50</width>
<height>20</height> <height>20</height>
<min>0.0</min> <min>0.0</min>
@ -138,15 +142,15 @@
</slider> </slider>
<text> <text>
<x>215</x> <x>380</x>
<y>265</y> <y>295</y>
<label>dir.</label> <label>dir.</label>
</text> </text>
<slider> <slider>
<x>240</x> <x>410</x>
<y>265</y> <y>295</y>
<width>50</width> <width>50</width>
<height>20</height> <height>20</height>
<min>0.0</min> <min>0.0</min>
@ -162,14 +166,14 @@
<text> <text>
<x>5</x> <x>5</x>
<y>235</y> <y>265</y>
<label>wind model</label> <label>wind model</label>
</text> </text>
<combo> <combo>
<x>150</x> <x>150</x>
<y>235</y> <y>265</y>
<width>140</width> <width>140</width>
<height>25</height> <height>25</height>
<live>true</live> <live>true</live>
@ -185,15 +189,32 @@
</combo> </combo>
<text>
<x>300</x>
<y>265</y>
<label>T offset (C)</label>
</text>
<input>
<x>390</x>
<y>265</y>
<width>50</width>
<height>25</height>
<property>/local-weather/config/temperature-offset-degc</property>
</input>
<text> <text>
<x>5</x> <x>5</x>
<y>205</y> <y>235</y>
<label>tile selection mode</label> <label>tile selection mode</label>
</text> </text>
<combo> <combo>
<x>150</x> <x>150</x>
<y>205</y> <y>235</y>
<width>140</width> <width>140</width>
<height>25</height> <height>25</height>
<live>true</live> <live>true</live>
@ -207,33 +228,10 @@
</binding> </binding>
</combo> </combo>
<checkbox>
<x>10</x>
<y>175</y>
<width>15</width>
<height>15</height>
<label>terrain presampling</label>
<property>/local-weather/config/presampling-flag</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<checkbox>
<x>150</x>
<y>175</y>
<width>15</width>
<height>15</height>
<label>generate thermals</label>
<property>/local-weather/config/generate-thermal-lift-flag</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<checkbox> <checkbox>
<x>10</x> <x>10</x>
<y>150</y> <y>205</y>
<width>15</width> <width>15</width>
<height>15</height> <height>15</height>
<label>debug output</label> <label>debug output</label>
@ -243,7 +241,7 @@
</binding> </binding>
</checkbox> </checkbox>
<checkbox> <!--<checkbox>
<x>150</x> <x>150</x>
<y>150</y> <y>150</y>
<width>15</width> <width>15</width>
@ -253,9 +251,9 @@
<binding> <binding>
<command>dialog-apply</command> <command>dialog-apply</command>
</binding> </binding>
</checkbox> </checkbox>-->
<checkbox> <!--<checkbox>
<x>10</x> <x>10</x>
<y>125</y> <y>125</y>
<width>15</width> <width>15</width>
@ -265,9 +263,9 @@
<binding> <binding>
<command>dialog-apply</command> <command>dialog-apply</command>
</binding> </binding>
</checkbox> </checkbox>-->
<checkbox> <!--<checkbox>
<x>150</x> <x>150</x>
<y>125</y> <y>125</y>
<width>15</width> <width>15</width>
@ -277,11 +275,11 @@
<binding> <binding>
<command>dialog-apply</command> <command>dialog-apply</command>
</binding> </binding>
</checkbox> </checkbox>-->
<checkbox> <checkbox>
<x>10</x> <x>150</x>
<y>100</y> <y>205</y>
<width>15</width> <width>15</width>
<height>15</height> <height>15</height>
<label>terrain effects</label> <label>terrain effects</label>
@ -292,8 +290,8 @@
</checkbox> </checkbox>
<checkbox> <checkbox>
<x>150</x> <x>290</x>
<y>100</y> <y>205</y>
<width>15</width> <width>15</width>
<height>15</height> <height>15</height>
<label>realistic visibility</label> <label>realistic visibility</label>
@ -303,21 +301,46 @@
</binding> </binding>
</checkbox> </checkbox>
<text> <checkbox>
<x>10</x> <x>10</x>
<y>75</y> <y>180</y>
<width>15</width>
<height>15</height>
<label>generate thermals</label>
<property>/local-weather/config/generate-thermal-lift-flag</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<checkbox>
<x>150</x>
<y>180</y>
<width>15</width>
<height>15</height>
<label>terrain presampling</label>
<property>/local-weather/config/presampling-flag</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<text>
<x>5</x>
<y>150</y>
<label>Thermal properties:</label> <label>Thermal properties:</label>
</text> </text>
<text> <text>
<x>10</x> <x>160</x>
<y>50</y> <y>150</y>
<label>rough day</label> <label>rough day</label>
</text> </text>
<slider> <slider>
<x>80</x> <x>230</x>
<y>50</y> <y>150</y>
<width>90</width> <width>90</width>
<height>20</height> <height>20</height>
<min>0.3</min> <min>0.3</min>
@ -329,11 +352,147 @@
</slider> </slider>
<text> <text>
<x>180</x> <x>330</x>
<y>50</y> <y>150</y>
<label>low convection</label> <label>low convection</label>
</text> </text>
<text>
<x>5</x>
<y>125</y>
<label>Ground haze:</label>
</text>
<text>
<x>160</x>
<y>125</y>
<label>thick</label>
</text>
<slider>
<x>230</x>
<y>125</y>
<width>90</width>
<height>20</height>
<min>0.1</min>
<max>1.0</max>
<property>/local-weather/config/ground-haze-factor</property>
<binding>
<command>dialog-apply</command>
</binding>
</slider>
<text>
<x>330</x>
<y>125</y>
<label>thin</label>
</text>
<text>
<x>5</x>
<y>100</y>
<label>Max. visibility:</label>
</text>
<text>
<x>160</x>
<y>100</y>
<label>30 km</label>
</text>
<slider>
<x>230</x>
<y>100</y>
<width>90</width>
<height>20</height>
<min>30000.0</min>
<max>140000.0</max>
<property>/local-weather/config/max-vis-range-m</property>
<binding>
<command>dialog-apply</command>
</binding>
</slider>
<text>
<x>330</x>
<y>100</y>
<label>140 km</label>
</text>
<text>
<x>5</x>
<y>75</y>
<label>Weather pattern scales</label>
</text>
<text>
<x>15</x>
<y>45</y>
<label>small</label>
</text>
<text>
<x>78</x>
<y>60</y>
<label>airmass</label>
</text>
<slider>
<x>60</x>
<y>45</y>
<width>100</width>
<height>20</height>
<min>0.5</min>
<max>2.0</max>
<property>/local-weather/config/large-scale-persistence</property>
<binding>
<command>dialog-apply</command>
</binding>
</slider>
<text>
<x>165</x>
<y>45</y>
<label>large</label>
</text>
<text>
<x>205</x>
<y>45</y>
<label>small</label>
</text>
<text>
<x>257</x>
<y>60</y>
<label>cloud patterns</label>
</text>
<slider>
<x>250</x>
<y>45</y>
<width>100</width>
<height>20</height>
<min>0.0</min>
<max>1.0</max>
<property>/local-weather/config/small-scale-persistence</property>
<binding>
<command>dialog-apply</command>
</binding>
</slider>
<text>
<x>355</x>
<y>45</y>
<label>large</label>
</text>
<group> <group>
<x>10</x> <x>10</x>
<y>10</y> <y>10</y>