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:
parent
dde2115a59
commit
56afb80358
13 changed files with 5825 additions and 281 deletions
64
Effects/cloud-static.eff
Normal file
64
Effects/cloud-static.eff
Normal 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>
|
|
@ -4,6 +4,9 @@
|
|||
<parameters>
|
||||
<texture n ="0">
|
||||
</texture>
|
||||
<range>
|
||||
<use>/sim/rendering/clouds3d-vis-range</use>
|
||||
</range>
|
||||
</parameters>
|
||||
<technique n="10">
|
||||
<predicate>
|
||||
|
@ -36,7 +39,7 @@
|
|||
<write-mask>false</write-mask>
|
||||
</depth>
|
||||
<render-bin>
|
||||
<bin-number>10</bin-number>
|
||||
<bin-number>9</bin-number>
|
||||
<bin-name>DepthSortedBin</bin-name>
|
||||
</render-bin>
|
||||
<texture-unit>
|
||||
|
@ -58,6 +61,12 @@
|
|||
<type>sampler-2d</type>
|
||||
<value type="int">0</value>
|
||||
</uniform>
|
||||
<uniform>
|
||||
<name>range</name>
|
||||
<type>float</type>
|
||||
<value><use>range</use></value>
|
||||
</uniform>
|
||||
|
||||
<vertex-program-two-side>true</vertex-program-two-side>
|
||||
</pass>
|
||||
</technique>
|
||||
|
|
4761
Nasal/local_weather.nas
Normal file
4761
Nasal/local_weather.nas
Normal file
File diff suppressed because it is too large
Load diff
|
@ -485,7 +485,7 @@ else if (type == "Stratocumulus bottom"){
|
|||
{
|
||||
cloudAssembly = local_weather.cloud.new(type, subtype);
|
||||
|
||||
mult = 1.0;
|
||||
|
||||
|
||||
# characterize the basic texture sheet
|
||||
cloudAssembly.texture_sheet = "/Models/Weather/cumulus_bottom_sheet1.rgb";
|
||||
|
@ -520,6 +520,46 @@ else if (type == "Stratocumulus bottom"){
|
|||
|
||||
}
|
||||
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 (rn > 0.875) {path = "Models/Weather/cumulonimbus_sl1.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 {path = "Models/Weather/cumulonimbus_sl8.xml";}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -885,24 +926,34 @@ else if (type == "Stratus") {
|
|||
{
|
||||
cloudAssembly = local_weather.cloud.new(type, subtype);
|
||||
|
||||
if (subtype == "small") {var mult = 0.8;}
|
||||
else {var mult = 1.0;}
|
||||
|
||||
# characterize the basic texture sheet
|
||||
cloudAssembly.texture_sheet = "/Models/Weather/stratus_sheet1.rgb";
|
||||
cloudAssembly.num_tex_x = 3;
|
||||
cloudAssembly.num_tex_y = 2;
|
||||
if (subtype == "small")
|
||||
{
|
||||
var mult = 0.8;
|
||||
cloudAssembly.texture_sheet = "/Models/Weather/cirrocumulus_sheet1.rgb";
|
||||
cloudAssembly.num_tex_x = 3;
|
||||
cloudAssembly.num_tex_y = 3;
|
||||
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
|
||||
cloudAssembly.bottom_shade = 0.4;
|
||||
cloudAssembly.n_sprites = 20;
|
||||
cloudAssembly.min_width = 1900.0 * mult;
|
||||
cloudAssembly.max_width = 2400.0 * mult;
|
||||
cloudAssembly.min_height = 1900.0 * mult;
|
||||
cloudAssembly.max_height = 2400.0 * mult;
|
||||
cloudAssembly.min_cloud_width = 5000.0 * mult;
|
||||
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;
|
||||
cloudAssembly.z_scale = 0.4;
|
||||
|
||||
|
||||
#signal that new routines are used
|
||||
path = "new";
|
||||
|
@ -957,11 +1008,11 @@ else if (type == "Stratus (thin)") {
|
|||
|
||||
#characterize the cloud
|
||||
cloudAssembly.bottom_shade = 0.8;
|
||||
cloudAssembly.min_width = 1500.0 * mult;
|
||||
cloudAssembly.max_width = 2000.0 * mult;
|
||||
cloudAssembly.min_height = 1500.0 * mult;
|
||||
cloudAssembly.max_height = 2000.0 * mult;
|
||||
cloudAssembly.min_cloud_width = 2500.0;
|
||||
cloudAssembly.min_width = 1900.0 * mult;
|
||||
cloudAssembly.max_width = 2400.0 * mult;
|
||||
cloudAssembly.min_height = 1900.0 * mult;
|
||||
cloudAssembly.max_height = 2400.0 * mult;
|
||||
cloudAssembly.min_cloud_width = 4200.0;
|
||||
cloudAssembly.min_cloud_height = 50.0;
|
||||
|
||||
|
||||
|
@ -1055,6 +1106,49 @@ else if (type == "Fog (thin)") {
|
|||
}
|
||||
}
|
||||
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 (rn > 0.8) {path = "Models/Weather/stratus_thick1.xml";}
|
||||
else if (rn > 0.6) {path = "Models/Weather/stratus_thick2.xml";}
|
||||
|
@ -1068,6 +1162,7 @@ else if (type == "Fog (thick)") {
|
|||
else if (rn > 0.4) {path = "Models/Weather/stratus_thick3.xml";}
|
||||
else if (rn > 0.2) {path = "Models/Weather/stratus_thick4.xml";}
|
||||
else {path = "Models/Weather/stratus_thick5.xml";}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type == "Test") {path="Models/Weather/single_cloud.xml";}
|
||||
|
|
|
@ -170,7 +170,7 @@ else
|
|||
|
||||
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);
|
||||
|
||||
# layer wrapping off
|
||||
|
@ -347,6 +347,7 @@ else
|
|||
|
||||
var setTemperature = func (T) {
|
||||
|
||||
|
||||
if (features.can_disable_environment == 1)
|
||||
{
|
||||
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-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
|
||||
{
|
||||
# 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,
|
||||
"max-sprite-height-m": c.max_height,
|
||||
"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,
|
||||
"num-textures-x": c.num_tex_x,
|
||||
"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,
|
||||
"z-scale": c.z_scale,
|
||||
"height-map-texture": 0,
|
||||
"alt-ft" : c.alt});
|
||||
"alt-ft" : c.alt });
|
||||
fgcommand("add-cloud", p);
|
||||
|
||||
# print("alt: ", c.alt);
|
||||
#print("alt: ", c.alt);
|
||||
|
||||
# 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
|
||||
###########################################################
|
||||
|
@ -811,13 +827,22 @@ if ((i < 0) or (i==0))
|
|||
{
|
||||
if (local_weather.debug_output_flag == 1)
|
||||
{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");
|
||||
|
||||
# now set flag that tile has been completely processed
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -410,8 +410,8 @@ else
|
|||
|
||||
if (debug_output_flag == 1)
|
||||
{
|
||||
print("Boundary layer thickness: ",base_layer_thickness);
|
||||
print("Boundary layer slowdown: ", f_slow);
|
||||
#print("Boundary layer thickness: ",base_layer_thickness);
|
||||
#print("Boundary layer slowdown: ", f_slow);
|
||||
}
|
||||
return f_slow;
|
||||
}
|
||||
|
@ -509,8 +509,8 @@ setprop(lwi~"station-number", i+1);
|
|||
var ialt = sum_alt/sum_norm;
|
||||
var vis = sum_vis/sum_norm;
|
||||
var p = sum_p/sum_norm;
|
||||
var D = sum_D/sum_norm;
|
||||
var T = sum_T/sum_norm;
|
||||
var D = sum_D/sum_norm + temperature_offset;
|
||||
var T = sum_T/sum_norm + temperature_offset;
|
||||
|
||||
|
||||
# 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
|
||||
|
||||
vis = vis * ground_haze_factor;
|
||||
|
||||
var altitude = getprop("position/altitude-ft");
|
||||
current_mean_terrain_elevation = ialt;
|
||||
|
@ -593,6 +594,8 @@ current_mean_terrain_elevation = ialt;
|
|||
var alt1 = vis_alt1;
|
||||
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
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
# limit visibility (otherwise memory consumption is very bad...)
|
||||
# limit visibility (otherwise memory consumption may be very bad...)
|
||||
|
||||
if (vis > 120000.0)
|
||||
{vis = 120000.0;}
|
||||
if (vis > max_vis_range)
|
||||
{vis = max_vis_range;}
|
||||
|
||||
# determine scattering shader parameters if scattering shader is on
|
||||
|
||||
|
@ -641,6 +644,8 @@ if (scattering_shader_flag == 1)
|
|||
var mie = 0.003;
|
||||
var density = 0.3;
|
||||
|
||||
|
||||
|
||||
if (altitude < 30000.0)
|
||||
{
|
||||
rayleigh = 0.0004 - altitude/30000.0 * 0.0001;
|
||||
|
@ -660,37 +665,37 @@ if (scattering_shader_flag == 1)
|
|||
{rayleigh = 0.0001; mie = 0.002;}
|
||||
}
|
||||
# otherwise compute normal skydome shader parameters
|
||||
else
|
||||
|
||||
|
||||
|
||||
# compute the horizon shading
|
||||
|
||||
if (altitude < scatt_alt_low)
|
||||
{
|
||||
|
||||
# compute the horizon shading
|
||||
|
||||
if (altitude < scatt_alt_low)
|
||||
{
|
||||
var scatt = scatt_max;
|
||||
}
|
||||
else if (altitude < scatt_alt_high)
|
||||
{
|
||||
var scatt = scatt_max + (0.95 - scatt_max) * (altitude - scatt_alt_low)/(scatt_alt_high-scatt_alt_low);
|
||||
}
|
||||
else
|
||||
{var scatt = 0.95;}
|
||||
var scatt = scatt_max;
|
||||
}
|
||||
else if (altitude < scatt_alt_high)
|
||||
{
|
||||
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
|
||||
|
||||
if (altitude < ovcst_alt_low)
|
||||
{
|
||||
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;}
|
||||
|
||||
if (altitude < ovcst_alt_low)
|
||||
{
|
||||
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;}
|
||||
|
||||
|
||||
|
||||
|
||||
# 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);
|
||||
}
|
||||
else
|
||||
{
|
||||
local_weather.setScattering(scatt);
|
||||
local_weather.setOvercast(ovcst);
|
||||
}
|
||||
|
||||
local_weather.setScattering(scatt);
|
||||
local_weather.setOvercast(ovcst);
|
||||
|
||||
|
||||
# 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
|
||||
|
||||
#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");
|
||||
|
||||
if (wind_model_flag ==1) # constant
|
||||
{
|
||||
var winddir = weather_dynamics.tile_wind_direction[0];
|
||||
var windspeed = weather_dynamics.tile_wind_speed[0];
|
||||
|
||||
wind.cloudlayer = [winddir,windspeed];
|
||||
|
||||
}
|
||||
else if (wind_model_flag ==2) # constant in tile
|
||||
{
|
||||
var winddir = weather_dynamics.tile_wind_direction[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
|
||||
{
|
||||
|
@ -785,6 +795,9 @@ else if (wind_model_flag ==3) # aloft interpolated, constant in tiles
|
|||
var res = wind_altitude_interpolation(altitude,w);
|
||||
var winddir = res[0];
|
||||
var windspeed = res[1];
|
||||
|
||||
wind.cloudlayer = wind_altitude_interpolation(0.0,w);
|
||||
|
||||
}
|
||||
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 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
|
||||
|
||||
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
|
||||
|
||||
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);
|
||||
|
||||
|
||||
# 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);}
|
||||
|
||||
|
@ -1472,14 +1505,18 @@ if (path == "new") # we have to switch to new cloud generating routines
|
|||
local_weather.cloudAssembly.lon = long;
|
||||
local_weather.cloudAssembly.alt = alt;
|
||||
|
||||
#print(lat," ",long, " ", alt);
|
||||
|
||||
if (dynamics_flag == 1)
|
||||
{
|
||||
local_weather.cloudAssembly.mean_alt = cloud_mean_altitude;
|
||||
local_weather.cloudAssembly.flt = cloud_fractional_lifetime;
|
||||
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;
|
||||
}
|
||||
|
@ -1736,7 +1773,7 @@ else
|
|||
var alpha = rand() * 180.0;
|
||||
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 height = 400;
|
||||
|
@ -1747,12 +1784,12 @@ else
|
|||
|
||||
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 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)
|
||||
|
@ -1768,9 +1805,9 @@ else
|
|||
|
||||
var alpha = rand() * 180.0;
|
||||
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)
|
||||
|
@ -1784,13 +1821,13 @@ else
|
|||
|
||||
var alpha = rand() * 180.0;
|
||||
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;
|
||||
x = 700.0;
|
||||
y = 200.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)
|
||||
|
@ -1804,7 +1841,7 @@ else
|
|||
|
||||
var alpha = rand() * 180.0;
|
||||
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
|
||||
{
|
||||
|
@ -1817,7 +1854,7 @@ else
|
|||
|
||||
var alpha = rand() * 180.0;
|
||||
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) {
|
||||
|
||||
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
|
||||
{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) {
|
||||
|
||||
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
|
||||
{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
|
||||
|
||||
if (detailed_terrain_interaction_flag == 1)
|
||||
{
|
||||
var tile_index = getprop(lw~"tiles/tile-counter");
|
||||
var tile_index = getprop(lw~"tiles/tile-counter");
|
||||
var alt_base = alt_20_array[tile_index -1];
|
||||
|
||||
#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_mean = alt_mean_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_mean = getprop(lw~"tmp/tile-alt-mean-ft");
|
||||
#var alt_median = getprop(lw~"tmp/tile-alt-median-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
|
||||
|
||||
|
@ -2003,7 +2043,13 @@ while (i < nc) {
|
|||
if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];}
|
||||
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
|
||||
|
@ -2056,8 +2102,10 @@ while (i < nc) {
|
|||
}
|
||||
|
||||
|
||||
# now decide on the strength of the thermal
|
||||
strength = (1.5 * rand() + (2.0 * p * terrain_strength_factor)) * t_factor2; # the strength of thermal activity at the spot
|
||||
# now decide on the strength of the thermal at the spot and on cloud size
|
||||
|
||||
var rn = rand();
|
||||
strength = (1.5 * rn + (2.0 * p * terrain_strength_factor)) * t_factor2;
|
||||
if (strength > 1.0)
|
||||
{
|
||||
# we place a large cloud, and we generate lift
|
||||
|
@ -2065,7 +2113,15 @@ while (i < nc) {
|
|||
}
|
||||
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_fractional_lifetime = rand();
|
||||
|
@ -2168,6 +2224,7 @@ nc = t_factor1 * nc * math.cos(blat/180.0*math.pi);
|
|||
|
||||
var thermal_conditions = getprop(lw~"config/thermal-properties");
|
||||
|
||||
var alt_base = alt_20_array[tile_index -1];
|
||||
|
||||
while (i < nc) {
|
||||
|
||||
|
@ -2198,7 +2255,13 @@ while (i < nc) {
|
|||
if (contains(landcover_map,landcover)) {p = p + landcover_map[landcover];}
|
||||
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
|
||||
|
@ -2578,6 +2641,8 @@ var n = int(area/80000000.0 * 100 * density);
|
|||
var m = int(circ/63000.0 * 40 * rain_density);
|
||||
var path = "Models/Weather/blank.ac";
|
||||
|
||||
#print("density: ",n);
|
||||
|
||||
phi = phi * math.pi/180.0;
|
||||
|
||||
if (contains(cloud_vertical_size_map, type))
|
||||
|
@ -2599,7 +2664,10 @@ while(i<n)
|
|||
{
|
||||
if (rand() > 0.4) {
|
||||
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 {
|
||||
|
@ -2617,6 +2685,8 @@ i = 0;
|
|||
|
||||
if (rainflag ==1){
|
||||
|
||||
if (local_weather.hardcoded_clouds_flag == 1) {balt = balt + local_weather.offset_map[type]; }
|
||||
|
||||
while(i<m)
|
||||
{
|
||||
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};
|
||||
|
||||
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");
|
||||
detailed_clouds_flag = getprop(lw~"config/detailed-clouds-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
|
||||
|
||||
|
@ -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_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))
|
||||
{
|
||||
|
@ -3880,6 +3966,8 @@ if (metar_flag == 1) # the winds from current METAR are used
|
|||
}
|
||||
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
|
||||
{
|
||||
|
@ -3887,16 +3975,36 @@ else
|
|||
|
||||
append(weather_dynamics.tile_wind_direction,res[0]);
|
||||
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
|
||||
{
|
||||
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"));
|
||||
|
||||
# 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
|
||||
{
|
||||
append(weather_dynamics.tile_wind_direction, getprop(lw~"tmp/tile-orientation-deg"));
|
||||
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
|
||||
|
@ -3964,6 +4072,8 @@ else if (type == "Warmfront-3")
|
|||
{weather_tiles.set_warmfront3_tile();}
|
||||
else if (type == "Warmfront-4")
|
||||
{weather_tiles.set_warmfront4_tile();}
|
||||
else if (type == "Thunderstorms")
|
||||
{weather_tiles.set_thunderstorms_tile();}
|
||||
else if (type == "METAR")
|
||||
{weather_tiles.set_METAR_tile();}
|
||||
else if (type == "Altocumulus sky")
|
||||
|
@ -4018,11 +4128,12 @@ if (getprop(lw~"effect-loop-flag") == 0)
|
|||
|
||||
# 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 (getprop(lw~"timing-loop-flag") == 0)
|
||||
{setprop(lw~"timing-loop-flag",1); weather_dynamics.timing_loop();}
|
||||
|
||||
|
||||
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
|
||||
|
||||
#if (getprop(lw~"config/buffer-flag") ==1)
|
||||
if (buffer_flag == 1)
|
||||
{
|
||||
if (getprop(lw~"buffer-loop-flag") == 0)
|
||||
|
@ -4128,8 +4238,8 @@ setprop(lw~"METAR/available-flag",1);
|
|||
|
||||
# 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/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/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/effect-thread-status", func {var s = size(effects_geo); effect_placement_loop(s); });
|
||||
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/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"); });
|
||||
}
|
||||
|
@ -4179,7 +4293,7 @@ presampling_flag = 0;
|
|||
|
||||
#var pos = geo.aircraft_position();
|
||||
|
||||
#debug.dump(geodinfo(lat, lon));
|
||||
debug.dump(geodinfo(lat, lon));
|
||||
|
||||
#create_cumulonimbus_cloud(lat, lon, 6000.0, 2.5);
|
||||
|
||||
|
@ -4190,7 +4304,7 @@ presampling_flag = 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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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 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 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
|
||||
|
||||
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-sat",0);
|
||||
|
||||
setprop(lw~"config/max-vis-range-m", 120000.0);
|
||||
setprop(lw~"config/temperature-offset-degc", 0.0);
|
||||
|
||||
# create properties for tile management
|
||||
|
||||
|
|
|
@ -27,7 +27,19 @@
|
|||
|
||||
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_y = -windspeed * math.cos(wind_direction * math.pi/180.0);
|
||||
|
||||
append(windfield,windfield_x);
|
||||
append(windfield,windfield_y);
|
||||
|
||||
return windfield;
|
||||
return [windfield_x,windfield_y];
|
||||
}
|
||||
|
||||
|
||||
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))
|
||||
{
|
||||
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) {
|
||||
|
||||
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))
|
||||
{
|
||||
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");
|
||||
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);}
|
||||
|
||||
}
|
||||
|
|
|
@ -43,8 +43,8 @@ var code = getprop(lw~"tiles/tile[4]/code");
|
|||
var i = 0;
|
||||
var d_min = 100000.0;
|
||||
var i_min = 0;
|
||||
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_load = getprop(lw~"config/distance-to-load-tile-m");
|
||||
# var distance_to_remove = getprop(lw~"config/distance-to-remove-tile-m");
|
||||
var current_visibility = getprop(lw~"interpolation/visibility-m");
|
||||
var current_heading = getprop("orientation/heading-deg");
|
||||
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);
|
||||
#append(active_tile_list,0); # tile zero formally containing static objects is always active
|
||||
|
||||
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_load = current_visibility;
|
||||
|
||||
if (distance_to_load > 65000.0) {distance_to_load = 65000.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
|
||||
|
||||
|
@ -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 == "warm_sector") {weather_tiles.set_warm_sector_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
|
||||
{
|
||||
|
|
|
@ -96,22 +96,29 @@ calc_geo(blat);
|
|||
|
||||
# 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);
|
||||
|
||||
#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_4_8_tstratus_patches(blat, blon, 5000+alt_offset, alpha) ;
|
||||
#create_4_8_sstratus_patches(blat, blon, 12000+alt_offset, alpha) ;
|
||||
#create_4_8_cirrostratus_patches(blat, blon, 20000+alt_offset, alpha) ;
|
||||
#create_4_8_sstratus_patches(blat, blon, 5000+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_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_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) ;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -160,12 +167,14 @@ calc_geo(blat);
|
|||
|
||||
# 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 spread = 14.0 + 8.0 * rand();
|
||||
var D = T - spread;
|
||||
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
|
||||
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
|
||||
|
||||
var vis = 25000.0 + rand() * 15000.0;
|
||||
var vis = 20000.0 + rand() * 10000.0;
|
||||
var T = 15.0 + rand() * 10.0;
|
||||
var spread = 10.0 + 4.0 * rand();
|
||||
var D = T - spread;
|
||||
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
|
||||
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
|
||||
|
||||
var vis = 20000.0 + rand() * 12000.0;
|
||||
var vis = 15000.0 + rand() * 7000.0;
|
||||
var T = 12.0 + rand() * 10.0;
|
||||
var spread = 7.0 + 4.0 * rand();
|
||||
var D = T - spread;
|
||||
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
|
||||
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
|
||||
|
||||
var vis = 12000.0 + rand() * 9000.0;
|
||||
var vis = 8000.0 + rand() * 8000.0;
|
||||
var T = 10.0 + rand() * 10.0;
|
||||
var spread = 6.0 + 2.0 * rand();
|
||||
var D = T - spread;
|
||||
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
|
||||
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;
|
||||
|
||||
|
||||
if (getprop(lw~"tmp/presampling-flag") == 0)
|
||||
if (local_weather.presampling_flag == 0)
|
||||
{var alt_offset = getprop(lw~"tmp/tile-alt-offset-ft");}
|
||||
else
|
||||
{var alt_offset = getprop(lw~"tmp/tile-alt-layered-ft");}
|
||||
|
@ -815,13 +830,13 @@ calc_geo(blat);
|
|||
|
||||
# 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 spread = 5.0 + 2.0 * rand();
|
||||
var D = T - spread;
|
||||
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
|
||||
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();
|
||||
|
||||
|
||||
|
||||
if (rand() < small_scale_persistence)
|
||||
{rn = rnd_store;}
|
||||
else
|
||||
{rnd_store = rn;}
|
||||
|
||||
rn = 0.1;
|
||||
|
||||
|
||||
if (rn > 0.8)
|
||||
{
|
||||
|
@ -849,7 +868,10 @@ if (rn > 0.8)
|
|||
y = 2.0 * (rand()-0.5) * 11000.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), 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;
|
||||
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), 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 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");}
|
||||
else
|
||||
{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 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
|
||||
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 strength = 0.0;
|
||||
|
||||
#var alt = 3000.0;
|
||||
|
||||
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
|
||||
|
||||
var vis = 45000.0 + rand() * 20000.0;
|
||||
var vis = 40000.0 + rand() * 15000.0;
|
||||
var T = 8.0 + rand() * 8.0;
|
||||
var spread = 7.0 + 3.0 * rand();
|
||||
var D = T - spread;
|
||||
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
|
||||
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
|
||||
|
||||
var vis = 12000.0 + rand() * 10000.0;
|
||||
var vis = 8000.0 + rand() * 5000.0;
|
||||
var T = 16.0 + rand() * 10.0;
|
||||
var spread = 6.0 + 3.0 * rand();
|
||||
var D = T - spread;
|
||||
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
|
||||
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 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)
|
||||
|
||||
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
|
||||
####################################
|
||||
|
@ -1410,6 +1517,8 @@ var spread = 8.0 + 2.0 * rand();
|
|||
var D = T - spread;
|
||||
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)
|
||||
|
||||
# after the front
|
||||
|
@ -1525,7 +1634,7 @@ var lon = 0.0;
|
|||
var alpha = getprop(lw~"tmp/tile-orientation-deg");
|
||||
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");}
|
||||
else
|
||||
{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 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)
|
||||
|
||||
# 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 y = 2.0 * (rand()-0.5) * 10000 + 10000;
|
||||
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 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");}
|
||||
else
|
||||
{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 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)
|
||||
|
||||
# after the front
|
||||
|
@ -1668,12 +1784,15 @@ var strength = 0.0;
|
|||
|
||||
# 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)
|
||||
{
|
||||
var x = 2.0 * (rand()-0.5) * 18000;
|
||||
var y = 2.0 * (rand()-0.5) * 5000 - 15000;
|
||||
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 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");}
|
||||
else
|
||||
{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 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)
|
||||
|
||||
# after the front
|
||||
|
@ -1849,7 +1970,7 @@ var lon = 0.0;
|
|||
var alpha = getprop(lw~"tmp/tile-orientation-deg");
|
||||
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");}
|
||||
else
|
||||
{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 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)
|
||||
|
||||
# after the front
|
||||
|
@ -1951,7 +2074,10 @@ var lon = 0.0;
|
|||
|
||||
var alpha = getprop("/environment/metar/base-wind-dir-deg");
|
||||
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);
|
||||
|
||||
|
@ -2263,11 +2389,13 @@ var set_METAR_weather_station = func {
|
|||
|
||||
if (is_visibility_max == 1)
|
||||
{
|
||||
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 < 1020.0) {vis = 22000.0 + 14000.0 * rand();}
|
||||
else {vis = 30000.0 + 15000.0 * 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 < 1020.0) {vis = 22000.0 + 14000.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
|
||||
####################################
|
||||
|
||||
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) {
|
||||
|
||||
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 650.0;}
|
||||
|
||||
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);
|
||||
|
||||
if (local_weather.hardcoded_clouds_flag == 1)
|
||||
{
|
||||
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) {
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
@ -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) {
|
||||
|
||||
if (local_weather.hardcoded_clouds_flag == 1) {var alt_eff = alt - local_weather.offset_map["Nimbus"]; }
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -2434,9 +2563,11 @@ for (var i = 0; i < 3; i=i+1)
|
|||
|
||||
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;
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -2452,10 +2583,12 @@ for (var i=0; i<8; i=i+1)
|
|||
|
||||
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;
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
# 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) {
|
||||
|
||||
if (local_weather.hardcoded_clouds_flag == 1) {alt = alt - 3000.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);}
|
||||
else
|
||||
{
|
||||
#print(local_weather.offset_map["Nimbus"]);
|
||||
var rn = rand();
|
||||
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);}
|
||||
|
@ -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) {
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -2520,9 +2656,22 @@ else
|
|||
|
||||
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"];
|
||||
|
||||
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, lon, alt,500.0,20,0.0,0.2,20000.0,20,0.0,0.2,20000.0,alpha,1.0);
|
||||
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;
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -2540,7 +2691,7 @@ for (var i = 0; i < 3; i = i + 1)
|
|||
var y = 2.0 * (rand()-0.5) * 12000.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)
|
||||
{
|
||||
|
@ -2562,7 +2713,9 @@ var create_6_8_stratus_rain = func (lat, lon, alt, alpha, rain) {
|
|||
|
||||
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)
|
||||
{
|
||||
|
@ -2570,7 +2723,7 @@ for (var i = 0; i < 3; i = i + 1)
|
|||
var y = 2.0 * (rand()-0.5) * 12000.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)
|
||||
{
|
||||
|
@ -2589,21 +2742,21 @@ for (var i = 0; i < 3; i = i + 1)
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -2633,7 +2786,7 @@ else
|
|||
|
||||
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 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;
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -2679,7 +2832,7 @@ var create_4_8_tstratus_patches = func (lat, lon, alt, alpha) {
|
|||
|
||||
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)
|
||||
{
|
||||
|
@ -2701,7 +2854,7 @@ var create_4_8_sstratus_patches = func (lat, lon, alt, alpha) {
|
|||
|
||||
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)
|
||||
{
|
||||
|
@ -2719,7 +2872,7 @@ for (var i=0; i<22; i=i+1)
|
|||
|
||||
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;
|
||||
|
||||
|
@ -2736,7 +2889,7 @@ for (var i=0; i<6; i=i+1)
|
|||
|
||||
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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
||||
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 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) {
|
||||
|
||||
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 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) {
|
||||
|
||||
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 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) {
|
||||
|
||||
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;
|
||||
|
||||
|
@ -2878,7 +3031,7 @@ for (var i=0; i<10; i=i+1)
|
|||
|
||||
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;
|
||||
|
||||
|
@ -2909,7 +3062,7 @@ else
|
|||
|
||||
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;
|
||||
|
||||
|
@ -2926,7 +3079,7 @@ for (var i=0; i<8; i=i+1)
|
|||
|
||||
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;
|
||||
|
||||
|
@ -2944,7 +3097,7 @@ for (var i=0; i<8; i=i+1)
|
|||
|
||||
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;
|
||||
|
||||
|
@ -2967,7 +3120,7 @@ for (var i=0; i<8; i=i+1)
|
|||
|
||||
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;
|
||||
|
||||
|
@ -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) {
|
||||
|
||||
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;
|
||||
|
||||
|
@ -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) {
|
||||
|
||||
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;
|
||||
|
||||
|
@ -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) {
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -3265,9 +3418,12 @@ var create_small_thunderstorm = func(lat, lon, alt, alpha) {
|
|||
|
||||
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
|
||||
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;
|
||||
|
||||
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_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("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_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
|
||||
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;
|
||||
|
||||
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_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_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_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_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_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
|
||||
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 lw = "/local-weather/";
|
||||
|
||||
var realistic_visibility_multiplyer = 1.5;
|
||||
|
||||
var small_scale_persistence = getprop(lw~"config/small-scale-persistence");
|
||||
var rnd_store = rand();
|
||||
|
||||
|
|
10
Shaders/cloud-static.frag
Normal file
10
Shaders/cloud-static.frag
Normal 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
55
Shaders/cloud-static.vert
Normal 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);
|
||||
}
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
varying float fogFactor;
|
||||
|
||||
uniform float range; // From /sim/rendering/clouds3d-vis-range
|
||||
|
||||
float shade = 0.8;
|
||||
float cloud_height = 1000.0;
|
||||
|
||||
|
@ -45,7 +47,7 @@ void main(void)
|
|||
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(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;
|
||||
|
||||
// Fog doesn't affect rain as much as other objects.
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<!-- Weather tiles -->
|
||||
|
||||
<name>local_weather_tiles</name>
|
||||
<width>310</width>
|
||||
<width>470</width>
|
||||
<height>385</height>
|
||||
<modal>false</modal>
|
||||
|
||||
|
@ -35,6 +35,7 @@
|
|||
<value>Coldfront</value>
|
||||
<value>Warmfront</value>
|
||||
<value>Tropical</value>
|
||||
<value>Thunderstorms</value>
|
||||
<value>Test tile</value>
|
||||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
|
@ -49,6 +50,24 @@
|
|||
</enable>-->
|
||||
</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>
|
||||
<x>5</x>
|
||||
<y>295</y>
|
||||
|
@ -77,34 +96,19 @@
|
|||
<property>/local-weather/tmp/windspeed-kt</property>
|
||||
</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>
|
||||
<x>5</x>
|
||||
<y>265</y>
|
||||
<x>157</x>
|
||||
<y>295</y>
|
||||
<label>gust freq.</label>
|
||||
</text>
|
||||
|
||||
|
||||
|
||||
<slider>
|
||||
<x>65</x>
|
||||
<y>265</y>
|
||||
<x>225</x>
|
||||
<y>295</y>
|
||||
<width>50</width>
|
||||
<height>20</height>
|
||||
<min>0.0</min>
|
||||
|
@ -118,15 +122,15 @@
|
|||
|
||||
|
||||
<text>
|
||||
<x>112</x>
|
||||
<y>265</y>
|
||||
<x>275</x>
|
||||
<y>295</y>
|
||||
<label>strength</label>
|
||||
</text>
|
||||
|
||||
|
||||
<slider>
|
||||
<x>167</x>
|
||||
<y>265</y>
|
||||
<x>333</x>
|
||||
<y>295</y>
|
||||
<width>50</width>
|
||||
<height>20</height>
|
||||
<min>0.0</min>
|
||||
|
@ -138,15 +142,15 @@
|
|||
</slider>
|
||||
|
||||
<text>
|
||||
<x>215</x>
|
||||
<y>265</y>
|
||||
<x>380</x>
|
||||
<y>295</y>
|
||||
<label>dir.</label>
|
||||
</text>
|
||||
|
||||
|
||||
<slider>
|
||||
<x>240</x>
|
||||
<y>265</y>
|
||||
<x>410</x>
|
||||
<y>295</y>
|
||||
<width>50</width>
|
||||
<height>20</height>
|
||||
<min>0.0</min>
|
||||
|
@ -162,14 +166,14 @@
|
|||
|
||||
<text>
|
||||
<x>5</x>
|
||||
<y>235</y>
|
||||
<y>265</y>
|
||||
<label>wind model</label>
|
||||
</text>
|
||||
|
||||
|
||||
<combo>
|
||||
<x>150</x>
|
||||
<y>235</y>
|
||||
<y>265</y>
|
||||
<width>140</width>
|
||||
<height>25</height>
|
||||
<live>true</live>
|
||||
|
@ -185,15 +189,32 @@
|
|||
</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>
|
||||
<x>5</x>
|
||||
<y>205</y>
|
||||
<y>235</y>
|
||||
<label>tile selection mode</label>
|
||||
</text>
|
||||
|
||||
<combo>
|
||||
<x>150</x>
|
||||
<y>205</y>
|
||||
<y>235</y>
|
||||
<width>140</width>
|
||||
<height>25</height>
|
||||
<live>true</live>
|
||||
|
@ -207,33 +228,10 @@
|
|||
</binding>
|
||||
</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>
|
||||
<x>10</x>
|
||||
<y>150</y>
|
||||
<y>205</y>
|
||||
<width>15</width>
|
||||
<height>15</height>
|
||||
<label>debug output</label>
|
||||
|
@ -243,7 +241,7 @@
|
|||
</binding>
|
||||
</checkbox>
|
||||
|
||||
<checkbox>
|
||||
<!--<checkbox>
|
||||
<x>150</x>
|
||||
<y>150</y>
|
||||
<width>15</width>
|
||||
|
@ -253,9 +251,9 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</checkbox>
|
||||
</checkbox>-->
|
||||
|
||||
<checkbox>
|
||||
<!--<checkbox>
|
||||
<x>10</x>
|
||||
<y>125</y>
|
||||
<width>15</width>
|
||||
|
@ -265,9 +263,9 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</checkbox>
|
||||
</checkbox>-->
|
||||
|
||||
<checkbox>
|
||||
<!--<checkbox>
|
||||
<x>150</x>
|
||||
<y>125</y>
|
||||
<width>15</width>
|
||||
|
@ -277,11 +275,11 @@
|
|||
<binding>
|
||||
<command>dialog-apply</command>
|
||||
</binding>
|
||||
</checkbox>
|
||||
</checkbox>-->
|
||||
|
||||
<checkbox>
|
||||
<x>10</x>
|
||||
<y>100</y>
|
||||
<x>150</x>
|
||||
<y>205</y>
|
||||
<width>15</width>
|
||||
<height>15</height>
|
||||
<label>terrain effects</label>
|
||||
|
@ -292,8 +290,8 @@
|
|||
</checkbox>
|
||||
|
||||
<checkbox>
|
||||
<x>150</x>
|
||||
<y>100</y>
|
||||
<x>290</x>
|
||||
<y>205</y>
|
||||
<width>15</width>
|
||||
<height>15</height>
|
||||
<label>realistic visibility</label>
|
||||
|
@ -303,21 +301,46 @@
|
|||
</binding>
|
||||
</checkbox>
|
||||
|
||||
<text>
|
||||
<checkbox>
|
||||
<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>
|
||||
</text>
|
||||
|
||||
<text>
|
||||
<x>10</x>
|
||||
<y>50</y>
|
||||
<x>160</x>
|
||||
<y>150</y>
|
||||
<label>rough day</label>
|
||||
</text>
|
||||
|
||||
<slider>
|
||||
<x>80</x>
|
||||
<y>50</y>
|
||||
<x>230</x>
|
||||
<y>150</y>
|
||||
<width>90</width>
|
||||
<height>20</height>
|
||||
<min>0.3</min>
|
||||
|
@ -329,11 +352,147 @@
|
|||
</slider>
|
||||
|
||||
<text>
|
||||
<x>180</x>
|
||||
<y>50</y>
|
||||
<x>330</x>
|
||||
<y>150</y>
|
||||
<label>low convection</label>
|
||||
</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>
|
||||
<x>10</x>
|
||||
<y>10</y>
|
||||
|
|
Loading…
Reference in a new issue