From a0803ad074c25e39ede8d5e7e2522c9dcb804788 Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Fri, 10 Sep 2010 08:52:21 +0200 Subject: [PATCH] Local Weather v0.85 by Thorsten Renk --- Docs/README.local_weather.html | 55 ++- Docs/menu1.jpg | Bin 62103 -> 79104 bytes Docs/menu4.jpg | Bin 0 -> 22143 bytes Docs/tiles.gif | Bin 0 -> 5169 bytes Nasal/compat_layer.nas | 193 ++++++++- Nasal/local_weather.nas | 178 ++++++-- Nasal/weather_dynamics.nas | 10 +- Nasal/weather_tile_management.nas | 452 +++++++++++++++++++- Nasal/weather_tiles.nas | 589 ++++++++------------------- Shaders/clouds-layered.vert | 2 +- Shaders/clouds-thick.vert | 5 +- Shaders/clouds-thin.vert | 2 +- Shaders/clouds-thinlayer.vert | 2 +- gui/dialogs/local_weather.xml | 1 + gui/dialogs/local_weather_config.xml | 273 +++++++++++++ gui/menubar.xml.alt | 7 + 16 files changed, 1263 insertions(+), 506 deletions(-) create mode 100644 Docs/menu4.jpg create mode 100644 Docs/tiles.gif create mode 100644 gui/dialogs/local_weather_config.xml diff --git a/Docs/README.local_weather.html b/Docs/README.local_weather.html index a2afa3485..505308079 100644 --- a/Docs/README.local_weather.html +++ b/Docs/README.local_weather.html @@ -7,7 +7,7 @@ -

Local Weather Package - v0.8

+

Local Weather Package - v0.85

1. Introduction

@@ -15,7 +15,7 @@ The aim of a local weather system is to simulate weather phenomena tied to speci This is in contrast to the current (v.2.0.0) weather system of Flightgear where weather changes affect the weather everywhere in the simulated world and are (with few exceptions) not tied to specific locations. In such a system, it is impossible to observe e.g. the approach of a rainfront while flying in sunshine.

-The local weather package ultimately aims to provide the functionality to simulate such local phenomena. In version 0.8, the package supplies various cloud placement algorithms, as well as local control over most major weather parameters (wind, visibility, pressure, temperature, rain, snow, thermal lift, turbulence...) through interpolation routines and event volumes. The dynamics of the different systems is tied together - clouds and weather effects drift in the specified wind field. The package also contains a fairly detailed algorithm to generate convective clouds and thermals with a realistic distribution. Unfortunately, as of v0.8, there is no interaction yet between the windfield and the cloud-generating algorithms, i.e. while the placement algorithms create a realistic configuration of thermals and convective clouds, the wind will simply move this configuration, not create, destroy or move clouds in altitude dynamically (which would be realistic).

+The local weather package ultimately aims to provide the functionality to simulate such local phenomena. In version 0.85, the package supplies various cloud placement algorithms, as well as local control over most major weather parameters (wind, visibility, pressure, temperature, rain, snow, thermal lift, turbulence...) through interpolation routines and event volumes. The dynamics of the different systems is tied together - clouds and weather effects drift in the specified wind field. The package also contains a fairly detailed algorithm to generate convective clouds and thermals with a realistic distribution. Unfortunately, as of v0.85, there is no interaction yet between the windfield and the cloud-generating algorithms, i.e. while the placement algorithms create a realistic configuration of thermals and convective clouds, the wind will simply move this configuration, not create, destroy or move clouds in altitude dynamically (which would be realistic).

For long-range flights, the system automatically provides transitions between different weather patterns like fronts and low and high pressure areas. However, basically all features currently present can and will eventually be improved.

@@ -24,7 +24,7 @@ For long-range flights, the system automatically provides transitions between di The package needs to be unpacked in the Flightgear root directory. It writes content into the Nasal/, gui/, gui/dialogs/, Shaders, Effects/, Docs/, and Models/Weather/ subdirectories. The installation does not overwrite any of the default Flightgear files, but to be accessible from the menu, one must copy gui/menubar.xml.alt to the default menubar.xml or copy the last two lines of the environemnt menu calling local_weather and local_weather_tiles into the default file.

-This adds the items Local Weather and Local weather tiles to the Environment menu when Flightgear is up. Most of the basic functionality is contained in local_weather.nas which is loaded at startup and identifies itself with a message, but does not start any functions unless called from the GUI.

+This adds the items Local Weather, Local Weather Tiles and Local Weather Settings to the Environment menu when Flightgear is up. Most of the basic functionality is contained in local_weather.nas which is loaded at startup and identifies itself with a message, but does not start any functions unless called from the GUI.

3. Functionality

@@ -80,8 +80,11 @@ The picture illustrates the result of a layer generation call for Nimbostratus c

+

Cloudbox

+The cloudbox placement is an experimental routine allowing to define a cloud core, border and bottom region and to place different texture types into these regions. The underlying idea is that this would generate better Cumulus clouds from small texture bits. However, currently the Cumulus clouds are generated by multiple layers of whole cloud photographs, creating a more realistic impression. Thus, the cloudbox is not actively developed further.

+

Tile placement

The second menu is used to place complete weather tiles based on low-level calls. It is intended for the user to automatically create the various weather patterns during flight.

@@ -90,7 +93,7 @@ The second menu is used to place complete weather tiles based on low-level calls

-The dropdown menu is used to select the type of weather tile to build. The menu contains two groups of tiles - the first are classified by airmass, whereas the last two are scenarios intended for soaring.

+Weather is created in a series of 40x40 km squares, called tiles. Tiles are classified by airmass, such that the sequence of tiles can describe for example the transition from a high pressure area to a low pressure area. The dropdown menu is used to select the type of weather tile to build initially. The menu contains two groups of tiles - the first are classified by airmass, whereas the last two are scenarios intended for soaring.

Below are entries for three parameters. The first two are the simplified version of wind direction and speed for the user who is not interested in specifying many different wind interpolation points. The third parameter, the altitude offset, is to manually adjust the altitude level of clouds in the absence of terrain presampling. Cloud layer placement calls are then specified for absolute altitudes and calibrated at sea level. As a result, layers are placed too low in mountainous terrain, hence the need for an offset. The offset may at present also be useful for dynamical weather, as convective clouds with terrain presampling follow terrain altitude, which looks strange when the clouds are allowed to drift in the wind without altitude correction.

@@ -108,7 +111,7 @@ Below the menu are five tickboxes. 'Terrain presampling' finds the distribution The option 'dynamical weather' ties all clouds and weather effects to the windfield. If that option is not chosen, the wind is still generated according to the chosen model, but only felt by the aircraft. This makes e.g. soaring unrealistic, as the aircraft continuously drifts out of a static thermal below a static cap cloud. When 'dynamical weather' is selected, aircraft, cloud and thermal are all displaced by the wind.

-The slider 'Thermal properties' is only relevant for soaring scenarios. It governs the rato of maximum lift to radius of a thermal. A setting close to 'low convection' creates large thermals with relatively small lift and virtually no turbulence, a setting close to 'rough day' creates very narrow, turbulent thermals with large lift. Unless thermals are placed, no other weather tile is affected by the settings.

+The slider 'Thermal properties' is mainly relevant for soaring scenarios. It governs the rato of maximum lift to radius of a thermal. A setting close to 'low convection' creates large thermals with relatively small lift and virtually no turbulence, a setting close to 'rough day' creates very narrow, turbulent thermals with large lift. However, it also affects the Cumulus textures to be used. 'low convection' creates well-formed, smooth Cumuli whereas 'rough day' biases the texture selection towards more rugged and diffuse clouds.

The button 'Show winds' brings up the detailed wind menu which is needed for the wind models 'aloft interpolated' and 'aloft waypoints':

@@ -132,9 +135,32 @@ The following pictures show the results of tile setups 'Low-pressure-border' and

+

Performance settings

+ + +The performance setting menu is available from the main menubar. It controls the allocation of system resources to the various tasks.

+ +

+ +

+ +The first part controls the creation of new weather tiles, the second part controls the ranges up to which clouds inside a generated weather tile are shown as part of the scenery (clouds created but not shown are stored and processed in a buffer array). Clouds are visible if and only if they are 1) part of a created tile and 2) closer than the buffering range. This is illustrated in the following figure: Tiles are only created if their center is within range, clouds are only visible if the cloud model itself is within range, the resulting region dependent on the two ranges in which clouds are displayed is shown in red.

+ +

+ +

+ +From this, it is apparent that the two ranges should not be drastically different. Setting tile creation range to 55 km implies lots of work trying to asses the properties of faraway terrain to generate suitable cloud distributions, setting the buffering range to 15 km means that most of these clouds are never visible. Note that in low visibility, a large tile creation range can be problematic, as Flightgear may not have loaded the terrain. Note also that setting the tile creation range above 40 km means a slow startup of the system, as it needs to create 5 tiles on startup instead of just a single one.

+ +There are additional options to do asymmetric buffering, i.e. to 'cut' out a wedge in the rear of the aircraft in which the tile creation radius or the cloud visibility radius are lower. For example, setting the buffering ratio to 0.2 and the angle to 180 degrees corresponds to a very agressive buffering in which clouds in the rear hemisphere of the aircraft are almost absent and shown only to 20% of the set distance. This may increase performance by 20-30%, but only in straight flight - in fast turns, lots of clouds have to be shuffled from the buffer into the scenery and back, which is actually slower than never trying to cut a wedge at all. Also, agressive asymmetric buffering is not nice in external views as the reference is always the aircraft course.

+ +The last option controls the amout of resources allocated to making clouds drift in the wind if dynamical weather is on. In order to avoid freezes, the weather dynamics system processes only a fixed number of clouds per frame inside the field of view. That means that faraway clouds do not necessarily move even with dynamical weather on. The slider indirectly controls the distance out to which clouds are being processed.

+ +All performance setting menu-options work at runtime, but are processed over time rather than instantaneously, i.e. it takes 10-20 seconds till the new balance between buffered clouds and active clouds is reached after the slider is moved.

+

4. Cloud models

-The package contains a number of different cloud models, both static ones for Cirrus and Cirrocumulus clouds as well as rotated ones for Altocumulus, Cirrostratus, Cumulus, Cumulonimbus, Stratus and Nimbostratus cloudlet models. Neither the cloud textures, nor the models nor the transformations are perfected, and any aspect can be improved. Currently the standard clouds cannot quite reach the sophistication of the shader-based standard 3-d clouds of Flightgear, but the detailed Cumulus clouds are on the verge of catching up.

+The package contains a number of different cloud models, both static ones for Cirrus and Cirrocumulus clouds as well as rotated ones for Altocumulus, Cirrostratus, Cumulus, Cumulonimbus, Stratus and Nimbostratus cloudlet models. Neither the cloud textures, nor the models nor the transformations are perfected, and any aspect can be improved.

@@ -186,7 +212,7 @@ Effect volumes are always specified between a minimum and a maximum altitude, an where geometry is a flag (1: circular, 2: elliptical and 3: rectangular), lat and lon are the latitude and longitude, r1 and r2 are the two size parameters for the elliptic or rectangular shape (for the circular shape, only the first is used), phi is the rotation angle of the shape (not used for circular shape), alt_low and alt_high are the altitude boundaries, vis, rain, snow, turb and lift are weather parameters which are either set to the value they should assume, or to -1 if they are not to be used, or to -2 if a function instead of a parameter is to be used. Since thermal lift can be set to negative values in a sink, a separate flag is provided in this case.

-In version 0.8, thermal lift is implemented by function. There is no easy way to implement any weather parameter by function in an effect volume, as this requires some amount of Nasal coding. +In version 0.85, thermal lift is implemented by function. There is no easy way to implement any weather parameter by function in an effect volume, as this requires some amount of Nasal coding.

6. Wind models and dynamical weather

@@ -243,19 +269,18 @@ To make your own tile visible, an entry in the menu gui/dialogs/local_weather

9. Performance tuning

-With default settings, the local weather package generates a 40x40 km weather tile when the aircraft is closer than 35 km to the tile center and unloads it when the aircraft is more than 37 km away. This means that the system can generate at most 4 tiles at once and clouds are visible for at least 15 km and up to 30 km (the latter number determined by fading in the shaders). However, rendering and managing multiple overcast cloud layers in a region of 80x80 km is a significant drain on performance. For older systems, a few things can be tried:

+With default settings, the local weather package generates a 40x40 km weather tile when the aircraft is closer than 39 km to the tile center and unloads it when the aircraft is more than 39.5 km away. This means that the system can generate at most 4 tiles at once and clouds are visible for at least 19 km and up to 45 km (the latter number determined by fading in the shaders). However, rendering and managing multiple overcast cloud layers in a region of 80x80 km is a significant drain on performance. For older systems, a few things can be done:

    -
  • the menu option 'asymmetric range' decreases loading and unloading ranges in a 45 degree sector behind the aircraft. This means that in straight flight, less tiles will be loaded at the same time, as tiles in the rear are unloaded more quickly. The option is currently experimental.

    +

  • the menu option 'asymmetric range' decreases loading and unloading ranges in a 90 degree sector behind the aircraft. This means that in straight flight, less tiles will be loaded at the same time, as tiles in the rear are unloaded more quickly.

    -

  • a further reduction in the amount of simultaneously generated tiles can be achieved by changing the ranges. These are exposed in the property tree as local-weather/config/distance-to-load-tile-m and local-weather/config/distance-to-remove-tile-m. Note that the removal range must be larger than the loading range - otherwise just generated tiles will be immediately unloaded! Ranges below 20 km will guarantee that only one tile is loaded at a time, but will create empty spots when no tile is loaded. A range above 28 km will guarantee that the aircraft never flies in an empty tile, but empty sky in front will be visible. Finally, ranges above 56 km guarantee that all 9 tiles (a region of 120x120 km) are managed at all times - but will most likely cause a severe drop in framerate for most scenarios.

    +

  • a further reduction in the amount of simultaneously generated tiles can be achieved by changing the range for tile loading and unloading in the menu. Ranges below 20 km will guarantee that only one tile is loaded at a time, but will create empty spots when no tile is loaded. A range above 28 km will guarantee that the aircraft never flies in an empty tile, but empty sky in front will be visible. Finally, ranges above 56 km would guarantee that all 9 tiles (a region of 120x120 km) are managed at all times - but will most likely cause a severe drop in framerate for most scenarios and is currently not possible from the menu.

    + +

  • a further reduction in workload can be achieved by lowering the visibility range of clouds in the menu. This helps significantly, as clouds in the buffer array do not take significant processing power. Note that this can be done at runtime. Agressive buffering of the rear hemisphere can gain another 20-30% performance, but is only suitable for flying a straight course.

  • if this does not help, try avoiding scenarios with large cloud count. As a rule, low pressure areas have high cloud count, high pressure areas have a low cloud count. Do not use 'detailed clouds', which tend to generate large cloud counts.

    -

  • a drastic solution is to set the visual ranges lower. Currently, cloud models are set to be visible up to 30 km. Changing the visibility range in the range animation of all cloud model xml wrappers will improve performance accordingly. To achieve a nice fading into the background instead of a sudden disappearance, it is recommended to adjust the visibility range in the shaders accordingly. It would probably be good to expose the visual range as a property, but currently it's not yet done, as passing a property to the shader requires Flightgear CVS and cannot be done in 2.0.0. -Performance for overcast layers currently is a limiting issue and there are a few ideas around how to improve it - dependent if these work or not, future releases may work better.

    -

  • a different issue is a characteristic small pause every second. This is caused by the interpolation loop resetting the weather parameters. Currently, a computationally expensive workaround is needed to do so, causing the problem. Work on a better environment controller is on the way, however until that modification to the core Flightgear code is implemented, the best solution is to set the loop time in Nasal/local-weather.nas to a larger value.

  • dynamical weather uses a lot of performance. If framerate is low and you don't need it, don't use it! From fast planes, cloud drift is almost impossible to see against the relative motion of cloud and airplane anyway.

    @@ -278,7 +303,9 @@ Performance for overcast layers currently is a limiting issue and there are a fe

  • For dynamical weather, clouds sometimes appear to 'jump' to a position. The reason is that the control loop of cloud drift accepts for performance reasons only a limited number of clouds. If there are more in the field of view, the most distant clouds are not processed. As nearby clouds drift out of the visual field, more distant clouds move into the loop, at which point their position is suddenly updated, resulting in a jump. Short of committing potentially vast computational resources (if there is a large number of clouds in the visual field), there is no easy fix to the problem.

    -

  • To smooth out changes in wind settings, rather than producing a sudden gust, the wind is changed over about 1 second. In sharp wind gradients, this produces a series of ripples like turbulence. This is actually a realistic behaviour in this situation and hence left as it is. Some systems seem to take an unreasonable effort to reinit the environment (as must be done to set wind) - here the function call setWindSmoothly() in local_weather.nas should perhaps be replace by setWind to ease the load. +
  • To smooth out changes in wind settings, rather than producing a sudden gust, the wind is changed over about 1 second. In sharp wind gradients, this produces a series of ripples like turbulence. This is actually a realistic behaviour in this situation and hence left as it is. Some systems seem to take an unreasonable effort to reinit the environment (as must be done to set wind) - here the function call setWindSmoothly() in local_weather.nas should perhaps be replace by setWind to ease the load.

    + +

  • Large tile creation distances can cause problems in low visibility weather, because Flightgear loads terrain only if it is within visual range. Thus, trying to sample the terrain for a tile 55 km away in 8 km visibility doesn't work because the terrain elevation and altitude is not known. This may cause improper placement of clouds - chiefly convective clouds, but also layered clouds may not appear on the proper altitude. Currently, there is a limit which restricts tile loading range to 3 times the visibility, but presumably a better solution can be found.

  • The thermals in the soaring scenarios need GIT to work.

diff --git a/Docs/menu1.jpg b/Docs/menu1.jpg index 74332557257021557221474e43e445df8e9822f1..69f89877e70815d97f886d195cf8110876cb1ecf 100644 GIT binary patch literal 79104 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 S3+5VksUm<3>~lgkJO2mf3O8>6 literal 62103 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 diff --git a/Docs/menu4.jpg b/Docs/menu4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4394ba1b3f8ac309bb2f6467cc085826f787cf6a GIT binary patch literal 22143 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

qt&B3XImMzceQhx6=Aq-p!2 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%0AQ+%{QA32 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 ff8OI<&f%6$*@Ud=o6hN-?&+VN0fsC91poj$=1 for exception occurred (i.e. unsupported API call) + + +var try_call = func(f, params) { +var err=[]; +call(globals[f], params, nil,nil,err); # see http://plausible.org/nasal/lib.html +return size(err); +}; + + +var query = func(api,params) { + if ( has_function(api) ) { + return try_call(api, params ); + } + return 1; # fail +} + +var patches = { geodinfo: "http://flightgear.org/forums/viewtopic.php?f=5&t=7358&st=0&sk=t&sd=a&start=90#p82805", }; + +# query fgfs binary for required APIs and set values in this hash +var features = {}; + + +#fixme: compare results from new and old API +var check_geodinfo_vec = func { + var err=[]; + + if ( query('geodinfo',[ [37.618,-122.374],1000])==0 ) { + printf("geodinfo found"); # now try to use it + var ksfo=[37.618, -122.374]; + var alt=10000; + # see if it returns a vector or not + call( func { print (alt); (typeof(geodinfo(ksfo,alt))=='vector')?return:die(); }, [], caller()[0],nil,err); + print('-','geodinfo:', (size(err) >=1) ? "Vector support unavailable" : "Vector support available"); + if(size(err) and contains(patches,'geodinfo')) print('---> A patch is available at ', patches['geodinfo']); + + return size(err)?0:1; + } + return 0; +} + +_setlistener("/sim/signals/nasal-dir-initialized", func { + print ("Compatibility layer: Checking available Nasal APIs:"); + print ("(this may cause harmless error messages when hard-coded support is lacking)"); + print ("##########################################"); + features.geodinfo_supports_vectors= check_geodinfo_vec (); + print("features.geodinfo_supports_vectors=", features.geodinfo_supports_vectors); + print ("##########################################"); + print("Compatibility checks done."); +}); + +# this is now where we can simply refer to features.geodinfo_supports_vectors +# for checking if vector support is available or not - to use the most appropriate +# APIs + + + #################################### # set visibility to given value #################################### @@ -223,10 +334,47 @@ settimer( func {smooth_wind_loop(vx,vy,vx_old,vy_old,counter-1, count_max); },ti var create_cloud = func(path, lat, long, alt, heading) { var tile_counter = getprop(lw~"tiles/tile-counter"); +var buffer_flag = getprop(lw~"config/buffer-flag"); +var dynamics_flag = getprop(lw~"config/dynamics-flag"); +var d_max = weather_tile_management.cloud_view_distance + 1000.0; + + +# first check if the cloud should be stored in the buffer +# we keep it if it is in visual range or at high altitude (where visual range is different) + +if (buffer_flag == 1) + { + # calculate the distance to the aircraft + var pos = geo.aircraft_position(); + var cpos = geo.Coord.new(); + cpos.set_latlon(lat,long,0.0); + var d = pos.distance_to(cpos); + + if ((d > d_max) and (alt < 20000.0)) # we buffer the cloud + { + var b = weather_tile_management.cloudBuffer.new(lat, long, alt, path, heading, tile_counter); + if (dynamics_flag ==1) {b.timestamp = weather_dynamics.time_lw;} + append(weather_tile_management.cloudBufferArray,b); + return; + } + } + +# now check if we are writing from the buffer, in this case change tile index +# to buffered one + +if (getprop(lw~"tmp/buffer-status") == "placing") + { + tile_counter = getprop(lw~"tmp/buffer-tile-index"); + } + + +# if the cloud is not buffered, get property tree nodes and write it +# into the scenery var n = props.globals.getNode("local-weather/clouds", 1); var c = n.getChild("tile",tile_counter,1); + var cloud_number = n.getNode("placement-index").getValue(); for (var i = cloud_number; 1; i += 1) if (c.getChild("cloud", i, 0) == nil) @@ -266,20 +414,27 @@ model.getNode("load", 1).remove(); n.getNode("cloud-number").setValue(n.getNode("cloud-number").getValue()+1); -# sort the model nodes into a vector +# sort the model node into a vector for easy deletion -append(weather_tile_management.modelArrays[tile_counter-1],model); +# append(weather_tile_management.modelArrays[tile_counter-1],model); +# sort the cloud into the cloud hash array -# if weather dynamics is on, also create a timestamp property and sort into quadtree +if ((buffer_flag == 1) and (getprop(lw~"tmp/tile-management") != "single tile")) + { + var cs = weather_tile_management.cloudScenery.new(tile_counter, cl, model); + append(weather_tile_management.cloudSceneryArray,cs); + } -if (getprop(lw~"config/dynamics-flag") == 1) +# if weather dynamics is on, also create a timestamp property and sort the cloud node into quadtree + +#if (getprop(lw~"config/dynamics-flag") == 1) +if (dynamics_flag == 1) { cl.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); var blat = getprop(lw~"tiles/tmp/latitude-deg"); var blon = getprop(lw~"tiles/tmp/longitude-deg"); var alpha = getprop(lw~"tmp/tile-orientation-deg"); - #weather_dynamics.sort_into_quadtree(blat, blon, alpha, lat, long, weather_dynamics.cloudQuadtree, cl); weather_dynamics.sort_into_quadtree(blat, blon, alpha, lat, long, weather_dynamics.cloudQuadtrees[tile_counter-1], cl); } @@ -298,6 +453,12 @@ if ((i < 0) or (i==0)) { print("Cloud placement from array finished!"); 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(); + # print("dir_index: ",dir_index); + props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("generated-flag").setValue(2); + return; } @@ -309,8 +470,6 @@ if (s < k_max) {k_max = s;} for (var k = 0; k < k_max; k = k+1) { - #print(s, " ", k, " ", s-k-1, " ", clouds_path[s-k-1]); - #create_cloud(clouds_type[s-k-1], clouds_path[s-k-1], clouds_lat[s-k-1], clouds_lon[s-k-1], clouds_alt[s-k-1], 0.0, 0); create_cloud(clouds_path[s-k-1], clouds_lat[s-k-1], clouds_lon[s-k-1], clouds_alt[s-k-1], clouds_orientation[s-k-1]); } @@ -412,6 +571,15 @@ else if (status == "idle") # we initialize the loop { mvec = weather_tile_management.modelArrays[index-1]; msize = size(mvec); + if (msize == 0) + { + print("Tile deletion loop finished!"); + setprop(lw~"tmp/thread-status", "idle"); + setprop(lw~"clouds/placement-index",0); + setprop(lw~"clouds/model-placement-index",0); + setsize(weather_tile_management.modelArrays[index-1],0); + return; + } setprop(lw~"tmp/last-reading-pos-mod", msize); setprop(lw~"tmp/thread-status", "removing"); } @@ -475,9 +643,16 @@ var get_elevation_array = func (lat, lon) { var elevation = []; var n = size(lat); -for(var i = 0; i < n; i=i+1) +if (features.geodinfo_supports_vectors == 0) { - append(elevation, get_elevation(lat[i], lon[i])); + for(var i = 0; i < n; i=i+1) + { + append(elevation, get_elevation(lat[i], lon[i])); + } + } +else + { + elevation = geodinfo(lat,10000); } return elevation; diff --git a/Nasal/local_weather.nas b/Nasal/local_weather.nas index 14994d132..21badfc29 100644 --- a/Nasal/local_weather.nas +++ b/Nasal/local_weather.nas @@ -445,18 +445,18 @@ else if (wind_model_flag == 5) # aloft waypoint interpolated var altitude_agl = getprop("/position/altitude-agl-ft"); -if (getprop("tmp/presampling-flag") == 0) + +if (getprop(lw~"tmp/presampling-flag") == 0) { var boundary_alt = 600.0; - var windspeed_ground = windspeed/3.0; if (altitude_agl < boundary_alt) - {var windspeed_current = windspeed_ground + 2.0 * windspeed_ground * (altitude_agl/boundary_alt);} + {var windspeed_current = windspeed_ground + 2.0 * windspeed_ground * (altitude_agl/boundary_alt);} else {var windspeed_current = windspeed;} } -else +else { var alt_median = alt_50_array[tile_index - 1]; var alt_difference = alt_median - (altitude - altitude_agl); @@ -1022,13 +1022,18 @@ else if ((type == "Cumulonimbus") or (type == "Cumulonimbus (rain)")) { } else if (type == "Cirrus") { if (subtype == "large") { - if (rn > 0.66) {path = "Models/Weather/cirrus1.xml";} - else if (rn > 0.33) {path = "Models/Weather/cirrus2.xml";} - else {path = "Models/Weather/cirrus3.xml";} + if (rn > 0.833) {path = "Models/Weather/cirrus1.xml";} + else if (rn > 0.666) {path = "Models/Weather/cirrus2.xml";} + else if (rn > 0.5) {path = "Models/Weather/cirrus3.xml";} + else if (rn > 0.333) {path = "Models/Weather/cirrus4.xml";} + else if (rn > 0.166) {path = "Models/Weather/cirrus5.xml";} + else {path = "Models/Weather/cirrus6.xml";} } else if (subtype == "small") { - if (rn > 0.5) {path = "Models/Weather/cirrus_amorphous1.xml";} - else {path = "Models/Weather/cirrus_amorphous2.xml";} + if (rn > 0.75) {path = "Models/Weather/cirrus_amorphous1.xml";} + else if (rn > 0.5) {path = "Models/Weather/cirrus_amorphous2.xml";} + else if (rn > 0.25) {path = "Models/Weather/cirrus_amorphous3.xml";} + else {path = "Models/Weather/cirrus_amorphous4.xml";} } } else if (type == "Cirrocumulus") { @@ -1037,8 +1042,14 @@ else if (type == "Cirrocumulus") { else {path = "Models/Weather/cirrocumulus2.xml";} } else if (subtype == "large") { - if (rn > 0.5) {path = "Models/Weather/cirrocumulus1.xml";} - else {path = "Models/Weather/cirrocumulus4.xml";} + if (rn > 0.875) {path = "Models/Weather/cirrocumulus1.xml";} + else if (rn > 0.750){path = "Models/Weather/cirrocumulus4.xml";} + else if (rn > 0.625){path = "Models/Weather/cirrocumulus5.xml";} + else if (rn > 0.500){path = "Models/Weather/cirrocumulus6.xml";} + else if (rn > 0.385){path = "Models/Weather/cirrocumulus7.xml";} + else if (rn > 0.250){path = "Models/Weather/cirrocumulus8.xml";} + else if (rn > 0.125){path = "Models/Weather/cirrocumulus9.xml";} + else {path = "Models/Weather/cirrocumulus10.xml";} } } else if (type == "Cirrocumulus (cloudlet)") { @@ -1238,7 +1249,7 @@ setprop(lwi~"ipoint-number",0); weather_tiles.last_pressure = 0.0; -# stop the effect loop and the interpolation loop, make sure thermal generation is off +# stop all loops make sure thermal generation is off setprop(lw~"effect-loop-flag",0); setprop(lw~"interpolation-loop-flag",0); @@ -1246,6 +1257,8 @@ setprop(lw~"tile-loop-flag",0); setprop(lw~"lift-loop-flag",0); setprop(lw~"dynamics-loop-flag",0); setprop(lw~"timing-loop-flag",0); +setprop(lw~"buffer-loop-flag",0); +setprop(lw~"housekeeping-loop-flag",0); setprop(lw~"tmp/generate-thermal-lift-flag",0); # also remove rain and snow effects @@ -1261,13 +1274,22 @@ setprop(lw~"effect-volumes/effect-placement-index",0); setprop(lw~"effect-volumes/number",0); setprop(lw~"tiles/tile-counter",0); + # remove any quadtrees and arrays settimer ( func { setsize(weather_dynamics.cloudQuadtrees,0);},0.1); # to avoid error generation in this frame setsize(effectVolumeArray,0); n_effectVolumeArray = 0; -setsize(weather_tile_management.modelArrays,0); +settimer ( func { + setsize(weather_tile_management.modelArrays,0); + setsize(weather_dynamics.tile_wind_direction,0); + setsize(weather_dynamics.tile_wind_speed,0); + setsize(weather_tile_management.cloudBufferArray,0); + setsize(weather_tile_management.cloudSceneryArray,0); + setprop(lw~"clouds/buffer-count",0); + setprop(lw~"clouds/cloud-scenery-count",0); + },1.1); } @@ -1280,7 +1302,10 @@ var create_detailed_cumulus_cloud = func (lat, lon, alt, size) { #print(size); -var edge_bias = 0.0; +var edge_bias = convective_texture_mix; + +#print("edge_bias: ",edge_bias); + var size_bias = 0.0; if (size > 2.0) @@ -2015,7 +2040,24 @@ else var terrain_presampling_loop = func (blat, blon, nc, size, alpha) { -var n = 25; # number of geoinfo calls per frame +if (compat_layer.features.geodinfo_supports_vectors == 0) + {var n = 25;} # number of geoinfo calls per frame +else + {var n = 25;} # vector call + +var n_out = 25; + +# dynamically drop accuracy if framerate is low + +var dt = getprop("/sim/time/delta-sec"); + +if (dt > 0.2) # we have below 20 fps + {n = 5;} +else if (dt > 0.1) # we have below 10 fps + {n = 10;} +else if (dt > 0.05) # we have below 5 fps + {n = 15;} + if (nc <= 0) # we're done and may analyze the result { @@ -2027,7 +2069,7 @@ if (nc <= 0) # we're done and may analyze the result terrain_presampling(blat, blon, n, size, alpha); -settimer( func {terrain_presampling_loop(blat, blon, nc-n, size, alpha) },0); +settimer( func {terrain_presampling_loop(blat, blon, nc-n_out, size, alpha) },0); } @@ -2042,21 +2084,34 @@ var elevation = 0.0; var lat_vec = []; var lon_vec = []; +var lat_lon_vec = []; for (var i=0; i 0.2) {convective_texture_mix = 0.2;} +} + ########################################################### # create an effect volume ########################################################### @@ -2618,7 +2688,7 @@ var lon = getprop("position/longitude-deg"); setprop(lw~"tiles/tmp/latitude-deg",lat); setprop(lw~"tiles/tmp/longitude-deg",lon); - +setprop(lw~"tiles/tmp/dir-index",4); # now see if we need to presample the terrain @@ -2792,6 +2862,19 @@ if (getprop(lw~"config/dynamics-flag") ==1) } +# and start the buffer loop and housekeeping loop if needed + +if (getprop(lw~"config/buffer-flag") ==1) + { + if (getprop(lw~"buffer-loop-flag") == 0) + { + setprop(lw~"buffer-loop-flag",1); weather_tile_management.buffer_loop(0); + setprop(lw~"housekeeping-loop-flag",1); weather_tile_management.housekeeping_loop(0); + } + } + +#weather_tile_management.watchdog_loop(); + } @@ -2868,7 +2951,12 @@ setlistener(lw~"tmp/effect-thread-status", func {var s = size(effects_geo); eff setlistener(lw~"tmp/presampling-status", func {manage_presampling(); }); setlistener(lw~"config/wind-model", func {set_wind_model_flag();}); +setlistener(lw~"config/thermal-properties", func {set_texture_mix();}); +setlistener(lw~"config/clouds-in-dynamics-loop", func {weather_dynamics.max_clouds_in_loop = int(getprop(lw~"config/clouds-in-dynamics-loop"));}); + +setlistener(lw~"config/clouds-visible-range-m", func {weather_tile_management.cloud_view_distance = getprop(lw~"config/clouds-visible-range-m");}); +setlistener(lw~"config/distance-to-load-tile-m", func {setprop(lw~"config/distance-to-remove-tile-m",getprop(lw~"config/distance-to-load-tile-m") + 500.0);}); } @@ -2881,7 +2969,18 @@ var test = func { var lat = getprop("position/latitude-deg"); var lon = getprop("position/longitude-deg"); -showDialog("local_weather_winds"); + + +var v = [1,2,3,4,5,6,7]; + +print(v[2]); +v = weather_tile_management.delete_from_vector(v, 2); +v = weather_tile_management.delete_from_vector(v, 2); + +for (var i = 0; i < size(v); i = i + 1) + { + print(v[i]); + } #weather_dynamics.cos_beta = 1; #weather_dynamics.sin_beta = 0; @@ -2912,9 +3011,9 @@ showDialog("local_weather_winds"); -# terrain_presampling_start(lat, lon, 1000, 20000, 0.0); +#terrain_presampling_start(lat, lon, 10000, 20000, 0.0); -# test: 8 identical position tuples for KSFO +#test: 8 identical position tuples for KSFO #var p=[ 37.6189722, -122.3748889, 37.6189722, -122.3748889, # 37.6289722, -122.3748889, 37.6189722, -122.3648889, # 37.6389722, -122.3748889, 37.6189722, -122.3548889, @@ -2975,7 +3074,7 @@ var clouds_orientation = []; var terrain_n = []; var alt_50_array = []; - +var alt_20_array = []; # array of currently existing effect volumes @@ -2987,6 +3086,10 @@ var n_effectVolumeArray = 0; var wind_model_flag = 1; +# a global determining the relative amount of different textures in detailed convective clouds + +var convective_texture_mix = 0.0; + # set all sorts of default properties for the menu @@ -3054,6 +3157,8 @@ setprop(lw~"tmp/last-reading-pos-mod",0); setprop(lw~"tmp/thread-status", "idle"); setprop(lw~"tmp/convective-status", "idle"); setprop(lw~"tmp/presampling-status", "idle"); +setprop(lw~"tmp/buffer-status", "idle"); +setprop(lw~"tmp/buffer-tile-index", 0); setprop(lw~"tmp/FL0-wind-from-heading-deg",0.0); setprop(lw~"tmp/FL0-windspeed-kt",8.0); setprop(lw~"tmp/FL50-wind-from-heading-deg",2.0); @@ -3078,12 +3183,21 @@ setprop(lw~"tmp/ipoint-longitude-deg",getprop("position/longitude-deg")); # set config values -setprop(lw~"config/distance-to-load-tile-m",35000.0); -setprop(lw~"config/distance-to-remove-tile-m",37000.0); +#setprop(lw~"config/distance-to-load-tile-m",35000.0); +#setprop(lw~"config/distance-to-remove-tile-m",37000.0); +setprop(lw~"config/distance-to-load-tile-m",39000.0); +setprop(lw~"config/distance-to-remove-tile-m",39500.0); setprop(lw~"config/detailed-clouds-flag",1); setprop(lw~"config/dynamics-flag",1); setprop(lw~"config/thermal-properties",1.0); setprop(lw~"config/wind-model","constant"); +setprop(lw~"config/buffer-flag",1); +setprop(lw~"config/asymmetric-reduction",0.7); +setprop(lw~"config/clouds-visible-range-m",30000.0); +setprop(lw~"config/asymmetric-buffering-flag",0); +setprop(lw~"config/asymmetric-buffering-reduction",0.3); +setprop(lw~"config/asymmetric-buffering-angle-deg",90.0); +setprop(lw~"config/clouds-in-dynamics-loop",250); # set the default loop flags to loops inactive @@ -3092,6 +3206,8 @@ setprop(lw~"effect-loop-flag",0); setprop(lw~"interpolation-loop-flag",0); setprop(lw~"tile-loop-flag",0); setprop(lw~"lift-loop-flag",0); +setprop(lw~"buffer-loop-flag",0); +setprop(lw~"housekeeping-loop-flag",0); # create other management properties diff --git a/Nasal/weather_dynamics.nas b/Nasal/weather_dynamics.nas index 3f838d820..c92e12095 100644 --- a/Nasal/weather_dynamics.nas +++ b/Nasal/weather_dynamics.nas @@ -102,7 +102,7 @@ foreach (t; tiles) { var generated_flag = t.getNode("generated-flag").getValue(); - if (generated_flag == 1) + if ((generated_flag == 1) or (generated_flag ==2)) { var index = t.getNode("tile-index").getValue(); current_tile_index_wd = index; @@ -127,9 +127,9 @@ foreach (t; tiles) # if there are plenty of moving clouds nearby, no one pays attention to the small motion of distant clouds # price to pay is that some clouds appear to jump once they get into range -if (cloud_counter < 150) {view_distance = view_distance * 1.1;} -else if (cloud_counter > 250) {view_distance = view_distance * 0.9;} -if (view_distance > 30000.0) {view_distance = 30000.0;} +if (cloud_counter < 0.5 * max_clouds_in_loop) {view_distance = view_distance * 1.1;} +else if (cloud_counter > max_clouds_in_loop) {view_distance = view_distance * 0.9;} +if (view_distance > weather_tile_management.cloud_view_distance) {view_distance = weather_tile_management.cloud_view_distance;} #print(cloud_counter, " ", view_distance/1000.0); @@ -477,7 +477,6 @@ return xy_vec; } - ################################ # globals, constants, properties ################################ @@ -505,6 +504,7 @@ var lw = "/local-weather/"; # globals var time_lw = 0.0; +var max_clouds_in_loop = 250; # the quadtree structure diff --git a/Nasal/weather_tile_management.nas b/Nasal/weather_tile_management.nas index 605278025..b6090f3f9 100644 --- a/Nasal/weather_tile_management.nas +++ b/Nasal/weather_tile_management.nas @@ -12,6 +12,7 @@ # copy_entry to copy tile information from one node to another # create_neighbour to set up information for a new neighbouring tile # create_neighbours to initialize the 8 neighbours of the initial tile +# buffer_loop to manage the buffering of faraway clouds in an array # calc_geo to get local Cartesian geometry for latitude conversion # get_lat to get latitude from Cartesian coordinates # get_lon to get longitude from Cartesian coordinates @@ -31,9 +32,17 @@ 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 current_visibility = getprop(lw~"interpolation/visibility-m"); var current_heading = getprop("orientation/heading-deg"); var loading_flag = getprop(lw~"tmp/asymmetric-tile-loading-flag"); -var this_frame_generated_flag = 0; # use this flag to avoid overlapping tile generation calls +var this_frame_action_flag = 0; # use this flag to avoid overlapping tile operations + +setsize(active_tile_list,0); + +if (distance_to_load > 3.0 * current_visibility) + {distance_to_load = 3.0 * current_visibility;} +if (distance_to_load < 25000.0) + {distance_to_load = 25000.0;} foreach (var t; tNode) { @@ -43,12 +52,16 @@ foreach (var t; tNode) { if (d < d_min) {d_min = d; i_min = i;} var flag = t.getNode("generated-flag").getValue(); + if ((flag ==2) or (flag ==1)) {append(active_tile_list,t.getNode("tile-index").getValue());} + var dir = viewpos.course_to(tpos); var d_load = distance_to_load; var d_remove = distance_to_remove; if (loading_flag == 1) { - if ((abs(dir-current_heading) > 135.0) and (abs(dir-current_heading) < 225.0)) + var angle = abs(dir-current_heading); + #if (i==7) {print(angle);} + if ((angle > 135.0) and (angle < 225.0)) { d_load = 0.7 * d_load; d_remove = 0.7 * d_remove; @@ -59,13 +72,15 @@ foreach (var t; tNode) { # and if no other tile has been generated in this loop cycle # and the thread and convective system are idle # (we want to avoid overlapping tile generation) - if ((d < distance_to_load) and (flag==0) and (this_frame_generated_flag == 0) and (getprop(lw~"tmp/thread-status") == "idle") and (getprop(lw~"tmp/convective-status") == "idle")) + + if ((d < d_load) and (flag==0) and (this_frame_action_flag == 0) and (getprop(lw~"tmp/thread-status") == "idle") and (getprop(lw~"tmp/convective-status") == "idle") and (getprop(lw~"tmp/presampling-status") == "idle")) { + this_frame_action_flag = 1; setprop(lw~"tiles/tile-counter",getprop(lw~"tiles/tile-counter")+1); print("Building tile unique index ",getprop(lw~"tiles/tile-counter"), " in direction ",i); - generate_tile(code, tpos.lat(), tpos.lon(),i); + append(active_tile_list,getprop(lw~"tiles/tile-counter")); - if (getprop(lw~"config/dynamics-flag") == 1) + if (getprop(lw~"config/dynamics-flag") == 1) { var quadtree = []; weather_dynamics.generate_quadtree_structure(0, quadtree); @@ -76,24 +91,50 @@ foreach (var t; tNode) { t.getNode("timestamp-sec").setValue(weather_dynamics.time_lw); t.getNode("tile-index",1).setValue(getprop(lw~"tiles/tile-counter")); - this_frame_generated_flag = 1; + generate_tile(code, tpos.lat(), tpos.lon(),i); + } - if ((d > distance_to_remove) and (flag==1)) # the tile needs to be deleted if it exists + if ((d > d_remove) and (flag == 2) and (this_frame_action_flag == 0)) # the tile needs to be deleted if it exists { - print("Removing tile, unique index ", t.getNode("tile-index").getValue()); + print("Removing tile, unique index ", t.getNode("tile-index").getValue()," direction ",i); remove_tile(t.getNode("tile-index").getValue()); t.getNode("generated-flag").setValue(0); + this_frame_action_flag = 1; } i = i + 1; } # end foreach #print("Minimum distance to: ",i_min); - if (i_min != 4) # we've entered a different tile + var presampling_status = getprop(lw~"tmp/presampling-status"); + var convective_status = getprop(lw~"tmp/convective-status"); + var thread_status = getprop(lw~"tmp/thread-status"); + + if ((presampling_status == "idle") and (convective_status == "idle") and (thread_status == "idle")) { + var system_status = "idle"; + } + else + {system_status = "computing";} + + # and (this_frame_action_flag == 0) and (presampling_status == "idle") and (convective_status=="idle")) + + # check if we've entered a different tile and if no operation is in progress + + # var gen_flag = tNode[i_min].getNode("generated-flag").getValue(); + if ((i_min != 4) and (system_status == "idle")) + { + + var gen_flag = tNode[i_min].getNode("generated-flag").getValue(); + if (gen_flag != 2){ + print("Tile direction ",i_min, " not generated!"); + print("Flag: ",gen_flag); + } + print("Changing active tile to direction ", i_min); change_active_tile(i_min); + } @@ -109,17 +150,21 @@ if (getprop(lw~"tile-loop-flag") ==1) {settimer(tile_management_loop, 5.0);} var generate_tile = func (code, lat, lon, dir_index) { -# make sure the last tile call has finished, otherwise put on hold -#if ((getprop(lw~"tmp/thread-status") != "idle") or (getprop(lw~"tmp/convective-status") != "idle")) -# { -# print("Tile generation overlap, delaying..."); -# settimer( func {generate_tile(code, lat, lon, dir_index);}, 1); -# } +# the code should never be NIL, but this appears to happen under certain conditions +# so just to be on the safe side make sure it is set to current tile code if +# it actually is NIL + +if (code == "") + { + print("No tile code - falling back on default!"); + code = getprop(lw~"tiles/code"); + } setprop(lw~"tiles/tmp/latitude-deg", lat); setprop(lw~"tiles/tmp/longitude-deg",lon); setprop(lw~"tiles/tmp/code",code); +setprop(lw~"tiles/tmp/dir-index",dir_index); # do windspeed and orientation before presampling check, but test not to do it again @@ -145,7 +190,7 @@ if (((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling- var windspeed = getprop(lw~"tmp/windspeed-kt"); windspeed = windspeed + 2.0 * (rand()-0.5) * 2.0; if (windspeed < 0) {windspeed = rand();} - setprop(lw~"tmp/windspeed-kt"); + setprop(lw~"tmp/windspeed-kt", windspeed); # store the tile orientation and wind strength in an array for fast processing @@ -180,7 +225,6 @@ if (((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling- if ((getprop(lw~"tmp/presampling-flag") == 1) and (getprop(lw~"tmp/presampling-status") == "idle")) { local_weather.terrain_presampling_start(lat, lon, 1000, 40000, getprop(lw~"tmp/tile-orientation-deg")); - setprop(lw~"tiles/tmp/dir-index",dir_index); return; } @@ -338,7 +382,22 @@ else if (getprop(lw~"tmp/tile-management") == "realistic weather") var remove_tile = func (index) { -compat_layer.remove_clouds(index); +# remove tile from active list + +var s = size(active_tile_list); + +for (var j = 0; j < s; j=j+1) + { + if (index == active_tile_list[j]) + { + active_tile_list = delete_from_vector(active_tile_list,j); + break; + } + } + +settimer( func { props.globals.getNode("local-weather/clouds", 1).removeChild("tile",index) },100); + +#compat_layer.remove_clouds(index); var effectNode = props.globals.getNode("local-weather/effect-volumes").getChildren("effect-volume"); @@ -365,7 +424,7 @@ setprop(lw~"effect-volumes/effect-placement-index",0); if (getprop(lw~"config/dynamics-flag") ==1) { - setsize(weather_dynamics.cloudQuadtrees[index-1],0); + settimer( func {setsize(weather_dynamics.cloudQuadtrees[index-1],0);},1.0); } # rebuild effect volume vector @@ -505,9 +564,16 @@ t.getNode("latitude-deg").setValue(f.getNode("latitude-deg").getValue()); t.getNode("longitude-deg").setValue(f.getNode("longitude-deg").getValue()); t.getNode("generated-flag").setValue(f.getNode("generated-flag").getValue()); t.getNode("tile-index").setValue(f.getNode("tile-index").getValue()); -t.getNode("code").setValue(f.getNode("code").getValue()); t.getNode("timestamp-sec").setValue(f.getNode("timestamp-sec").getValue()); t.getNode("orientation-deg").setValue(f.getNode("orientation-deg").getValue()); +t.getNode("code").setValue(f.getNode("code").getValue()); + +#if (f.getNode("code").getValue() == "") +# {print("Empty tile code copying from ", from_index," to ", to_index, "!");} + +#if (f.getNode("code").getValue() != "") # we don't copy an empty code, that can trigger errors +# {t.getNode("code").setValue(f.getNode("code").getValue());} + } ##################################### @@ -530,11 +596,16 @@ if ((index == 6) or (index == 7) or (index == 8)) {y = -40000.0;} var t = props.globals.getNode(lw~"tiles").getChild("tile",index,0); +# use the last built tile code as default, in case a tile isn't formed when reached, +# the code is not empty but has a plausible value + +var default_code = getprop(lw~"tiles/code"); + t.getNode("latitude-deg",1).setValue(blat + get_lat(x,y,phi)); t.getNode("longitude-deg",1).setValue(blon + get_lon(x,y,phi)); t.getNode("generated-flag",1).setValue(0); t.getNode("tile-index",1).setValue(-1); -t.getNode("code",1).setValue(""); +t.getNode("code",1).setValue(default_code); t.getNode("timestamp-sec",1).setValue(weather_dynamics.time_lw); t.getNode("orientation-deg",1).setValue(0.0); } @@ -636,6 +707,233 @@ setprop(lw~"tiles/tile[8]/timestamp-sec",weather_dynamics.time_lw); setprop(lw~"tiles/tile[8]/orientation-deg",0.0); } + +############################### +# buffer loop +############################### + +var buffer_loop = func (index) { + +var n = 5; +var n_max = size(cloudBufferArray); +var s = size(active_tile_list); + +setprop(lw~"clouds/buffer-count",n_max); + +# don't do anything as long as the buffer is empty + +if (n_max == 0) # nothing to do, loop over + {if (getprop(lw~"buffer-loop-flag") ==1) {settimer( func {buffer_loop(index)}, 0);} return;} + +# don't process the buffer if a tile call is writing clouds into the scenery + +if (getprop(lw~"tmp/thread-status") == "placing") + {if (getprop(lw~"buffer-loop-flag") ==1) {settimer( func {buffer_loop(index)}, 0);} return;} + +# lock the system status for buffer operations and get flags + +setprop(lw~"tmp/buffer-status", "placing"); +var asymmetric_buffering_flag = getprop(lw~"config/asymmetric-buffering-flag"); + +if (asymmetric_buffering_flag ==1) + { + var buffering_angle = getprop(lw~"config/asymmetric-buffering-angle-deg"); + var buffering_reduction = getprop(lw~"config/asymmetric-buffering-reduction"); + var current_heading = getprop("orientation/heading-deg"); + } + +# now process the buffer + + +if (index > n_max-1) {index = 0;} + +var i_max = index + n; +if (i_max > n_max) {i_max = n_max;} + +for (var i = index; i < i_max; i = i+1) + { + var c = cloudBufferArray[i]; + + # check if the cloud is still part of an active tile, if not remove from buffer + + + var flag = 0; + for (var j = 0; j < s; j = j+1) + { + if (active_tile_list[j] == c.index) {flag = 1; break;} + } + + if (flag == 0) + { + cloudBufferArray = delete_from_vector(cloudBufferArray,i); + i = i -1; i_max = i_max - 1; n_max = n_max - 1; + continue; + } + + # if wind drift is on, move the cloud + + if (getprop(lw~"config/dynamics-flag") == 1) + { + c.move(); + } + + + # check distance and decide if the cloud should be created + + var d = c.get_distance(); + var d_comp = cloud_view_distance + 1000.0; + + if (asymmetric_buffering_flag == 1) + { + var dir = c.get_course(); + var angle = abs(dir-current_heading); + if ((angle > 180.0 - 0.5 * buffering_angle) and (angle < 180 + 0.5 * buffering_angle)) + { + d_comp = buffering_reduction * d_comp; + } + } + + + + if (d < d_comp) # insert the cloud into scenery and delete from buffer + { + setprop(lw~"tmp/buffer-tile-index",c.index); + compat_layer.create_cloud(c.path, c.lat, c.lon, c.alt, c.orientation); + cloudBufferArray = delete_from_vector(cloudBufferArray,i); + i = i -1; i_max = i_max - 1; n_max = n_max - 1; + deleted_flag = 1; + } + + + + + } # end for i + + +# unlock the system status for buffer operations + +setprop(lw~"tmp/buffer-status", "idle"); + +if (getprop(lw~"buffer-loop-flag") ==1) {settimer( func {buffer_loop(i)}, 0);} +} + + +############################### +# housekeeping loop +############################### + +var housekeeping_loop = func (index) { + +var n = 5; +var n_max = size(cloudSceneryArray); +var s = size(active_tile_list); + +setprop(lw~"clouds/cloud-scenery-count",n_max); + +# don't do anything as long as the array is empty + +if (n_max == 0) # nothing to do, loop over + {if (getprop(lw~"housekeeping-loop-flag") ==1) {settimer( func {housekeeping_loop(index)}, 0);} return;} + +# parse the flags + +var asymmetric_buffering_flag = getprop(lw~"config/asymmetric-buffering-flag"); + +if (asymmetric_buffering_flag ==1) + { + var buffering_angle = getprop(lw~"config/asymmetric-buffering-angle-deg"); + var buffering_reduction = getprop(lw~"config/asymmetric-buffering-reduction"); + var current_heading = getprop("orientation/heading-deg"); + } + +# now process the array + +if (index > n_max-1) {index = 0;} + +var i_max = index + n; +if (i_max > n_max) {i_max = n_max;} + +for (var i = index; i < i_max; i = i+1) + { + var c = cloudSceneryArray[i]; + + var flag = 0; + + for (var j = 0; j < s; j = j+1) + { + if (active_tile_list[j] == c.index) {flag = 1; break;} + } + + if (flag == 0) + { + c.removeNodes(); + cloudSceneryArray = delete_from_vector(cloudSceneryArray,i); + i = i -1; i_max = i_max - 1; n_max = n_max - 1; + continue; + } + + var d = c.get_distance(); + var alt = c.get_altitude(); + + d_comp = cloud_view_distance + 1000.0; + + + if (asymmetric_buffering_flag == 1) + { + var dir = c.get_course(); + var angle = abs(dir-current_heading); + if ((angle > 180.0 - 0.5 * buffering_angle) and (angle < 180 + 0.5 * buffering_angle)) + { + d_comp = buffering_reduction * d_comp; + } + } + + if ((d > d_comp) and (alt < 20000.0)) + { + append(cloudBufferArray,c.to_buffer()); + cloudSceneryArray = delete_from_vector(cloudSceneryArray,i); + i = i -1; i_max = i_max - 1; n_max = n_max - 1; + continue; + } + + } + + +if (getprop(lw~"housekeeping-loop-flag") ==1) {settimer( func {housekeeping_loop(i)}, 0);} +} + + +############################### +# watchdog loop for debugging +############################### + + +var watchdog_loop = func { + +var tNode = props.globals.getNode(lw~"tiles", 1).getChildren("tile"); + +var i = 0; + +print("===================="); + +foreach(t; tNode) + { + var code = t.getNode("code").getValue(); + var index = t.getNode("tile-index").getValue(); + var flag = t.getNode("generated-flag").getValue(); + + print(i,": code: ", code, " unique id: ", index, " flag: ", flag); + + i = i + 1; + } + +print("===================="); + +settimer(watchdog_loop, 10.0); +} + + + ################### # global variables ################### @@ -652,9 +950,109 @@ var lon_to_m = 0.0; #local_weather.lon_to_m; var m_to_lon = 0.0; # local_weather.m_to_lon; var lw = "/local-weather/"; +var cloud_view_distance = 20000.0; var modelArrays = []; +var active_tile_list = []; + + +##################################################### +# hashes to manage clouds in scenery or in the buffer +##################################################### + +var cloudBufferArray = []; + +var cloudBuffer = { + new: func(lat, lon, alt, path, orientation, index) { + var c = { parents: [cloudBuffer] }; + c.lat = lat; + c.lon = lon; + c.alt = alt; + c.path = path; + c.orientation = orientation; + c.index = index; + return c; + }, + get_distance: func { + var pos = geo.aircraft_position(); + var cpos = geo.Coord.new(); + cpos.set_latlon(me.lat,me.lon,0.0); + return pos.distance_to(cpos); + }, + get_course: func { + var pos = geo.aircraft_position(); + var cpos = geo.Coord.new(); + cpos.set_latlon(me.lat,me.lon,0.0); + return pos.course_to(cpos); + }, + show: func { + print("lat: ",me.lat," lon: ",me.lon," alt: ",me.alt); + print("path: ",me.path); + + }, + move: func { + var windfield = weather_dynamics.get_windfield(me.index); + var dt = weather_dynamics.time_lw - me.timestamp; + me.lat = me.lat + windfield[1] * dt * local_weather.m_to_lat; + me.lon = me.lon + windfield[0] * dt * local_weather.m_to_lon; + me.timestamp = weather_dynamics.time_lw; + }, + +}; + + +var cloudSceneryArray = []; + +var cloudScenery = { + new: func(index, cloudNode, modelNode) { + var c = { parents: [cloudScenery] }; + c.index = index; + c.cloudNode = cloudNode; + c.modelNode = modelNode; + return c; + }, + removeNodes: func { + me.modelNode.remove(); + me.cloudNode.remove(); + }, + to_buffer: func { + var lat = me.cloudNode.getNode("position/latitude-deg").getValue(); + var lon = me.cloudNode.getNode("position/longitude-deg").getValue(); + var alt = me.cloudNode.getNode("position/altitude-ft").getValue(); + var path = me.modelNode.getNode("path").getValue(); + var orientation = me.cloudNode.getNode("orientation/true-heading-deg").getValue(); + var b = cloudBuffer.new(lat, lon, alt, path, orientation, me.index); + + if (getprop(lw~"config/dynamics-flag") == 1) + { + var timestamp = me.cloudNode.getNode("timestamp-sec").getValue(); + b.timestamp = timestamp; + } + + me.removeNodes(); + return b; + }, + get_distance: func { + var pos = geo.aircraft_position(); + var cpos = geo.Coord.new(); + var lat = me.cloudNode.getNode("position/latitude-deg").getValue(); + var lon = me.cloudNode.getNode("position/longitude-deg").getValue(); + cpos.set_latlon(lat,lon,0.0); + return pos.distance_to(cpos); + }, + get_course: func { + var pos = geo.aircraft_position(); + var cpos = geo.Coord.new(); + var lat = me.cloudNode.getNode("position/latitude-deg").getValue(); + var lon = me.cloudNode.getNode("position/longitude-deg").getValue(); + cpos.set_latlon(lat,lon,0.0); + return pos.course_to(cpos); + }, + get_altitude: func { + return me.cloudNode.getNode("position/altitude-ft").getValue(); + }, +}; ################### # helper functions @@ -675,3 +1073,15 @@ var get_lon = func (x,y,phi) { return (x * math.cos(phi) + y * math.sin(phi)) * m_to_lon; } + + +var delete_from_vector = func(vec, index) { + +var n = index+1; + +var vec_end = subvec(vec, n); + +setsize(vec, n-1); +return vec~vec_end; + +} diff --git a/Nasal/weather_tiles.nas b/Nasal/weather_tiles.nas index 84a9a0ced..a7b7bc33d 100644 --- a/Nasal/weather_tiles.nas +++ b/Nasal/weather_tiles.nas @@ -21,8 +21,16 @@ var tile_start = func { +# set thread lock if (getprop(lw~"tmp/thread-flag") == 1){setprop(lw~"tmp/thread-status","computing");} +# set the tile code +var current_code = getprop(lw~"tiles/code"); +var dir_index = getprop(lw~"tiles/tmp/dir-index"); +props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("code").setValue(current_code); + + + # generate a handling array for models var array = []; @@ -39,14 +47,18 @@ setprop(lw~"clouds/placement-index",0); setsize(elat,0); setsize(elon,0); setsize(erad,0); var dir_index = getprop(lw~"tiles/tmp/dir-index"); -props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("code").setValue(current_code); +#props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("code").setValue(current_code); local_weather.assemble_effect_array(); print("Finished setting up tile type ",current_code, " in direction ",dir_index); -if (getprop(lw~"tmp/thread-flag") == 1){setprop(lw~"tmp/thread-status","placing");} -else {local_weather.assemble_effect_array();} # otherwise this is done at the end of the placement loop +if (getprop(lw~"tmp/thread-flag") == 1) + {setprop(lw~"tmp/thread-status","placing");} +else # without worker threads, tile generation is complete at this point + {props.globals.getNode(lw~"tiles").getChild("tile",dir_index).getNode("generated-flag").setValue(2);} + + } @@ -59,10 +71,10 @@ else {local_weather.assemble_effect_array();} # otherwise this is done at the en var set_4_8_stratus_tile = func { -tile_start(); - setprop(lw~"tiles/code","test"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -87,6 +99,8 @@ local_weather.set_weather_station(blat, blon, 20000.0, 14.0, 12.0, 29.78); create_4_8_cirrocumulus_bank(blat, blon, 6000.0, 0.0); +#create_detailed_stratocumulus_bank(blat, blon,5000.0+alt_offset,0.0); + tile_finished(); @@ -99,10 +113,10 @@ tile_finished(); var set_high_pressure_core_tile = func { -tile_start(); - setprop(lw~"tiles/code","high_pressure_core"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -148,10 +162,10 @@ tile_finished(); var set_high_pressure_tile = func { -tile_start(); - setprop(lw~"tiles/code","high_pressure"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -186,36 +200,32 @@ var alt = spread * 1000; var rn = rand(); -if (rn > 0.5) + +if (rn > 0.66) { # cloud scenario 1: possible Cirrus over Cumulus var strength = 0.2 + rand() * 0.4; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); - # if cumulus are weak, increase likelihood of Cirrus (the logic is the other way round - # but this makes no difference and is easier to implement) + # one or two Cirrus clouds - # try to place two spatially separated Cirrus clouds - - if (rand() > 2.0 * strength) - { - x = 2000.0 + rand() * 16000.0; - y = 2.0 * (rand()-0.5) * 18000; - alt = 25000.0 + rand() * 5000.0; - var path = local_weather.select_cloud_model("Cirrus", "small"); - compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset,alpha); - } - - if (rand() > 2.0 * strength) + x = 2000.0 + rand() * 16000.0; + y = 2.0 * (rand()-0.5) * 18000; + alt = 25000.0 + rand() * 5000.0; + var path = local_weather.select_cloud_model("Cirrus", "small"); + compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset,alpha); + + if (rand() > 0.5) { x = -2000.0 - rand() * 16000.0; y = 2.0 * (rand()-0.5) * 18000; alt = 25000.0 + rand() * 5000.0; var path = local_weather.select_cloud_model("Cirrus", "small"); compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset,alpha); - } + } + } -else if (rn > 0.0) +else if (rn > 0.33) { # cloud scenario 2: Cirrostratus over weak Cumulus @@ -225,6 +235,22 @@ else if (rn > 0.0) create_2_8_cirrostratus(blat, blon, alt+alt_offset+25000.0, alpha); } +else if (rn > 0.0) + { + # cloud scenario 3: Cirrocumulus sheet over Cumulus + + var strength = 0.2 + rand() * 0.2; + local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); + + x = 2.0 * (rand()-0.5) * 5000; + y = 2.0 * (rand()-0.5) * 5000; + + + var path = local_weather.select_cloud_model("Cirrocumulus", "large"); + compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset +24000,alpha); + + } + tile_finished(); } @@ -236,10 +262,10 @@ tile_finished(); var set_high_pressure_border_tile = func { -tile_start(); - setprop(lw~"tiles/code","high_pressure_border"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -340,17 +366,23 @@ else if (rn > 0.166) } else if (rn > 0.0) { - # cloud scenario 6: Cirrocumulus + # cloud scenario 6: Cirrocumulus sheets var strength = 0.2 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); - x = 2.0 * (rand()-0.5) * 5000; - y = 2.0 * (rand()-0.5) * 5000; + for (var i = 0; i < 2; i = i + 1) + { + x = 2.0 * (rand()-0.5) * 10000; + y = -6000 + i * 12000 + 2.0 * (rand()-0.5) * 1000; - var path = local_weather.select_cloud_model("Cirrocumulus", "large"); - compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset +22000,alpha); + var beta = rand() * 90; + var alt_variation = rand() * 2000; + + var path = local_weather.select_cloud_model("Cirrocumulus", "large"); + compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset +20000+ alt_variation,alpha+ beta); + } } @@ -366,10 +398,10 @@ tile_finished(); var set_low_pressure_border_tile = func { -tile_start(); - setprop(lw~"tiles/code","low_pressure_border"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -408,7 +440,7 @@ var alt = spread * 1000.0; var rn = rand(); -if (rn > 0.75) +if (rn > 0.8) { # cloud scenario 1: a low 4/8 stratus patches, thin patches above @@ -416,7 +448,7 @@ if (rn > 0.75) create_4_8_stratus_patches(blat, blon, alt+alt_offset,alpha); create_4_8_tstratus_patches(blat, blon, alt+alt_offset+6000,alpha); } -else if (rn > 0.5) +else if (rn > 0.6) { # cloud scenario 2: a low 4/8 undulatus, thin patches above @@ -424,25 +456,33 @@ else if (rn > 0.5) create_4_8_sstratus_undulatus(blat, blon, alt+alt_offset,alpha); create_2_8_tstratus(blat, blon, alt+alt_offset+7000,alpha); } -else if (rn > 0.25) +else if (rn > 0.4) { # cloud scenario 3: low Stratocumulus - alt = alt + local_weather.cloud_vertical_size_map["Stratus"] * 0.5 * m_to_ft; - create_stratocumulus_bank(blat, blon, alt+alt_offset,alpha); - create_2_8_sstratus(blat, blon, alt+alt_offset+3000,alpha); + # alt = alt + local_weather.cloud_vertical_size_map["Cumulus"] * 0.5 * m_to_ft; + create_detailed_stratocumulus_bank(blat, blon, alt+alt_offset,alpha); + create_2_8_sstratus(blat, blon, alt+alt_offset+6000,alpha); create_2_8_tstratus(blat, blon, alt+alt_offset+9000,alpha); } -else if (rn > 0.0) +else if (rn > 0.2) { # cloud scenario 4: dense low Stratocumulus - alt = alt + local_weather.cloud_vertical_size_map["Stratus"] * 0.5 * m_to_ft; - create_stratocumulus_bank(blat, blon, alt+alt_offset,alpha); - create_stratocumulus_bank(blat, blon, alt+alt_offset,alpha); + # alt = alt + local_weather.cloud_vertical_size_map["Cumulus"] * 0.5 * m_to_ft; + create_detailed_stratocumulus_bank(blat, blon, alt+alt_offset,alpha); + create_detailed_stratocumulus_bank(blat, blon, alt+alt_offset,alpha); create_2_8_sstratus(blat, blon, alt+alt_offset+8000,alpha); } +else if (rn > 0.0) + { + # cloud scenario 5: Cirrocumulus over 4/8 Stratus + alt = alt + local_weather.cloud_vertical_size_map["Stratus"] * 0.5 * m_to_ft; + create_4_8_sstratus_patches(blat, blon, alt+alt_offset,alpha); + + create_4_8_cirrocumulus_bank(blat, blon, alt+alt_offset + 12000.0, alpha); + } tile_finished(); @@ -454,10 +494,10 @@ tile_finished(); var set_low_pressure_tile = func { -tile_start(); - setprop(lw~"tiles/code","low_pressure"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -565,10 +605,10 @@ tile_finished(); var set_low_pressure_core_tile = func { -tile_start(); - setprop(lw~"tiles/code","low_pressure_core"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -633,10 +673,10 @@ tile_finished(); var set_cold_sector_tile = func { -tile_start(); - setprop(lw~"tiles/code","cold_sector"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -668,14 +708,37 @@ var alt = spread * 1000.0; var rn = rand(); +#rn = 0.1; -if (rn > 0.0) +if (rn > 0.5) { # cloud scenario 1: strong Cumulus development var strength = 0.8 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); } +else if (rn > 0.0) + { + # cloud scenario 2: Cirrocumulus sheets over Cumulus + + var strength = 0.6 + rand() * 0.2; + local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); + + for (var i = 0; i < 2; i = i + 1) + { + x = 2.0 * (rand()-0.5) * 10000; + y = -6000 + i * 12000 + 2.0 * (rand()-0.5) * 1000; + + var beta = rand() * 90; + var alt_variation = rand() * 2000; + + var path = local_weather.select_cloud_model("Cirrocumulus", "large"); + compat_layer.create_cloud(path, blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), alt + alt_offset +20000+ alt_variation,alpha+ beta); + } + + } + + tile_finished(); } @@ -687,10 +750,10 @@ tile_finished(); var set_warm_sector_tile = func { -tile_start(); - setprop(lw~"tiles/code","warm_sector"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -789,10 +852,10 @@ tile_finished(); var set_tropical_weather_tile = func { -tile_start(); - setprop(lw~"tiles/code","tropical_weather"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -907,10 +970,10 @@ tile_finished(); var set_coldfront_tile = func { -tile_start(); - setprop(lw~"tiles/code","coldfront"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -976,7 +1039,7 @@ y = 5000.0; var strength = 0.3; var n = int(4000 * strength) * 0.2; -local_weather.cumulus_exclusion_layer(blat+get_lat(x,y,phi), blon+ get_lon(x,y,phi), alt+alt_offset, n, 20000.0, 10000.0, alpha, 2.1,2.5 , size(elat), elat, elon, erad); +local_weather.cumulus_exclusion_layer(blat+get_lat(x,y,phi), blon+ get_lon(x,y,phi), alt+alt_offset, n, 20000.0, 10000.0, alpha, 1.5,2.5 , size(elat), elat, elon, erad); # then leading and traling Cumulus @@ -985,14 +1048,14 @@ y = 15500.0; strength = 1.0; n = int(4000 * strength) * 0.15; -local_weather.cumulus_exclusion_layer(blat+get_lat(x,y,phi), blon+ get_lon(x,y,phi), alt+alt_offset, n, 20000.0, 2000.0, alpha, 0.5,1.4 , size(elat), elat, elon, erad); +local_weather.cumulus_exclusion_layer(blat+get_lat(x,y,phi), blon+ get_lon(x,y,phi), alt+alt_offset, n, 20000.0, 2000.0, alpha, 0.5,1.8 , size(elat), elat, elon, erad); x = 0.0; y = -5500.0; strength = 1.0; n = int(4000 * strength) * 0.15; -local_weather.cumulus_exclusion_layer(blat+get_lat(x,y,phi), blon+ get_lon(x,y,phi), alt+alt_offset, n, 20000.0, 2000.0, alpha, 0.5,1.4 , size(elat), elat, elon, erad); +local_weather.cumulus_exclusion_layer(blat+get_lat(x,y,phi), blon+ get_lon(x,y,phi), alt+alt_offset, n, 20000.0, 2000.0, alpha, 0.5,1.8 , size(elat), elat, elon, erad); # finally some thin stratus underneath the Cumulus @@ -1028,10 +1091,10 @@ tile_finished(); var set_warmfront1_tile = func { -tile_start(); - setprop(lw~"tiles/code","warmfront1"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -1084,11 +1147,11 @@ var alt = spread * 1000.0; # high Cirrus leading -x = 2.0 * (rand()-0.5) * 3000; -y = 2.0 * (rand()-0.5) * 3000 - 12000.0; +x = 2.0 * (rand()-0.5) * 1000; +y = 2.0 * (rand()-0.5) * 1000 - 9000.0; -local_weather.create_streak("Cirrus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 25000.0+alt+alt_offset,1500.0,3,11000.0,0.0, 800.0, 1,8000.0,0.0,10000.0,alpha ,1.0); +local_weather.create_streak("Cirrus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 25000.0+alt+alt_offset,1500.0,3,11000.0,0.0, 3000.0, 2,11000.0,0.0,3000.0,alpha ,1.0); # followed by random patches of Cirrostratus @@ -1114,10 +1177,10 @@ tile_finished(); var set_warmfront2_tile = func { -tile_start(); - setprop(lw~"tiles/code","warmfront2"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -1223,10 +1286,10 @@ tile_finished(); var set_warmfront3_tile = func { -tile_start(); - setprop(lw~"tiles/code","warmfront3"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -1320,10 +1383,10 @@ tile_finished(); var set_warmfront4_tile = func { -tile_start(); - setprop(lw~"tiles/code","warmfront4"); +tile_start(); + var x = 0.0; var y = 0.0; var lat = 0.0; @@ -1405,242 +1468,11 @@ tile_finished(); } -#################################### -# Altocumulus sky -# cloud count 1400/tile -#################################### -var set_altocumulus_tile = func { -tile_start(); -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); - -# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) - -local_weather.set_weather_station(blat, blon, 35000.0, 22.0, 14.0, 30.02); - -# then draw the Altocumulus streaks, dense at 15.000 ft, sparse at 17.000 ft - -local_weather.create_streak("Altocumulus",blat, blon, 15000.0+alt_offset,1500.0,40,1000.0,0.2,800.0, 40,1000.0,0.2,800.0,alpha ,1.0); -local_weather.create_streak("Altocumulus",blat, blon, 17000.0+alt_offset,1500.0,18,2000.0,0.35,800.0,18,2000.0,0.35,800.0,alpha,1.0); - - -tile_finished(); - -} - - - - -#################################### -# Overcast stratus sky -# cloud count 1000/tile -#################################### - -var set_overcast_stratus_tile = func { - -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); - -# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) - -local_weather.set_weather_station(blat, blon, 10000.0, 14.0, 12.0, 29.78); - -# then draw the Stratus layers - -var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus"]; -local_weather.create_streak("Stratus",blat, blon, 1500.0+alt_offset+size_offset,0.0,32,1250.0,0.2,600.0, 32,1250.0,0.2,600.0,0.0 ,1.0); - - -size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus_structured"]; -local_weather.create_streak("Stratus (structured)",blat, blon, 5000.0+alt_offset+size_offset,0.0,16,2500.0,0.3,1200.0,16,2500.0,0.3,1200.0,0.0,1.0); - - - -# reduce visibility even more below lowest layer -# and add a slight drizzle by a nested effect volume - -local_weather.create_effect_volume(3, blat, blon, 18000.0, 18000.0, 0.0, 0.0, 1800.0, 8000.0, -1, -1, -1, -1, 0); -local_weather.create_effect_volume(3, blat, blon, 14000.0, 14000.0, 0.0, 0.0, 1500.0, 6000.0, 0.1, -1, -1, -1,0 ); - - -tile_finished(); - -} - - -#################################### -# Incoming rainfront -# cloud count 1500/tile -#################################### - -var set_rainfront_tile = func { - -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); - -# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) -local_weather.set_weather_station(blat, blon, 9000.0, 14.0, 12.0, 990 * hp_to_inhg); - -x = 15000.0; y = 20000.0; -local_weather.set_weather_station(blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 6000.0, 12.0, 10.0, 985 * hp_to_inhg); - -x = -15000.0; y = 20000.0; -local_weather.set_weather_station(blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 6000.0, 12.0, 10.0, 990 * hp_to_inhg); - -# draw two Stratus layers - -x = 0.0; y = -15000.0; -var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus"]; -local_weather.create_streak("Stratus",blat, blon, 3000.0+alt_offset+size_offset,500.0,17,2500.0,0.2,1100.0, 6,2000.0,0.2,1100.0,alpha ,1.0); - - -x = 0.0; y = 0.0; -var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus"]; -local_weather.create_streak("Stratus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 2000.0+alt_offset+size_offset,300.0,40,1000.0,0.2,600.0, 10,1000.0,0.2,600.0,alpha ,1.0); - - -# and a Nimbus layer with precipitation - -x = 0.0; y = 15000.0; -var size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Nimbus"]; -local_weather.create_layer("Nimbus", blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 1000.0+alt_offset, 500.0, 22000.0, 13000.0, alpha, 1.0, 0.2, 1, 1.0); - -# set visibility and rain inside the precipitation area - -local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 19000.0, 10000.0, alpha, 0.0, 2000.0, 5000.0, 0.1, -1, -1, -1,0 ); -local_weather.create_effect_volume(2, blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 16000.0, 7000.0, alpha, 0.0, 1500.0, 1500.0, 0.5, -1, -1, -1,0 ); - -# set visibility good above the clouds - -local_weather.create_effect_volume(3, blat, blon, 20000.0, 20000.0, 0.0, 2100.0, 85000.0, 18000.0, -1, -1, -1, -1,0 ); - -tile_finished(); - - - -} - - -#################################### -# Broken layers -# cloud count 550/tile -#################################### - -var set_broken_layers_tile = func { - -tile_start(); - - -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); - -# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) -local_weather.set_weather_station(blat, blon, 20000.0, 14.0, 12.0, 1005 * hp_to_inhg); - -# set the broken stratus layers - -size_offset = 0.5 * m_to_ft * local_weather.cloud_vertical_size_map["Stratus_structured"]; - -local_weather.create_streak("Stratus (structured)",blat, blon, 4000.0+alt_offset+size_offset,1000.0,22,0.0,0.3,20000.0,22,0.0,0.3,20000.0,0.0,1.0); - - -local_weather.create_streak("Stratus (structured)",blat, blon, 6000.0+alt_offset+size_offset,1000.0,16,0.0,0.4,20000.0,16,0.0,0.4,20000.0,0.0,1.0); - - -local_weather.create_streak("Stratus (structured)",blat, blon, 7000.0+alt_offset+size_offset,1000.0,11,0.0,0.5,20000.0,11,0.0,0.5,20000.0,0.0,1.0); - - -tile_finished(); - - -} - - -#################################### -# Fair weather and Cumulus -# cloud count max. 800/tile -#################################### - -var set_fair_weather_tile = func { - -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); - -# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) -local_weather.set_weather_station(blat, blon, 35000.0, 20.0, 16.0, 1018 * hp_to_inhg); - - -# add convective clouds - - -var strength = 1.0; -var n = int(4000 * strength); # calculate the number of placement tries from tile size 20x20km and strength -local_weather.create_cumosys(blat,blon, 3000.0 + alt_offset, n, 20000.0); - -tile_finished(); - - -} #################################### @@ -1649,6 +1481,8 @@ tile_finished(); var set_gliders_sky_tile = func { +setprop(lw~"tiles/code","glides_sky"); + tile_start(); var x = 0.0; @@ -1691,6 +1525,8 @@ tile_finished(); var set_blue_thermals_tile = func { +setprop(lw~"tiles/code","blue_thermals"); + tile_start(); var x = 0.0; @@ -1728,121 +1564,7 @@ tile_finished(); } -#################################### -# Summer rain -# cloud count max. 1200/tile -#################################### -var set_summer_rain_tile = func { - -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); - -# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) -local_weather.set_weather_station(blat, blon, 25000.0, 25.0, 22.0, 1013 * hp_to_inhg); - -# then add some developing thunderstorms -local_weather.create_streak("Cumulonimbus (rain)",blat, blon, 3000.0+alt_offset,0.0,3,0.0,1.0,20000.0,3,0.0,1.0,20000.0,0.0,1.0); - - - -# add overdeveloped convective clouds - -var strength = 1.5; -var n = int(4000 * strength); # calculate the number of placement tries from tile size 20x20km and strength -local_weather.create_cumosys(blat,blon, 3000.0+alt_offset,n, 20000.0); - -tile_finished(); - - -} - - - -#################################### -# Cirrus sky -#################################### - -var set_cirrus_sky_tile = func { - -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); - -# first weather info for tile center (lat, lon, visibility, temperature, dew point, pressure) - -local_weather.set_weather_station(blat, blon, 20000.0, 20.0, 16.0, 29.80); - -# visibility is slightly worse north, pressure is lower, so set additional stations - -x = -10000.0; y = 18000.0; -lat = blat + (y * math.cos(phi) - x * math.sin(phi)) * m_to_lat; -lon = blon + (x * math.cos(phi) + y * math.sin(phi)) * m_to_lon; -local_weather.set_weather_station(lat, lon, 18000.0, 20.0, 16.0, 29.75); - -x = 10000.0; y = 18000.0; -lat = blat + (y * math.cos(phi) - x * math.sin(phi)) * m_to_lat; -lon = blon + (x * math.cos(phi) + y * math.sin(phi)) * m_to_lon; -local_weather.set_weather_station(lat, lon, 18000.0, 20.0, 16.0, 29.75); - -# now set up the clouds - -x = 0.0; y = 0.0; -compat_layer.create_cloud("Models/Weather/cirrus1.xml", blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), 28000.0 + alt_offset,alpha); - -x = 7500.0; y = 1000.0; -compat_layer.create_cloud("Models/Weather/cirrus2.xml", blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), 28500.0 + alt_offset,alpha); - -x = 16000.0; y = -1000.0; -compat_layer.create_cloud("Models/Weather/cirrus1.xml", blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), 29500.0 + alt_offset,alpha); - -x = -16000.0; y = 2500.0; -compat_layer.create_cloud("Models/Weather/cirrus1.xml",blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), 30000.0 + alt_offset,alpha); - -x = 7000.0; y = 8000.0; -compat_layer.create_cloud("Models/Weather/cirrocumulus1.xml", blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), 22000.0 + alt_offset,alpha); - -x = -3000.0; y = 9000.0; -compat_layer.create_cloud("Models/Weather/cirrocumulus1.xml", blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), 21000.0 + alt_offset,alpha); - -x = -1000.0; y = 14000.0; -compat_layer.create_cloud("Models/Weather/cirrocumulus2.xml", blat + get_lat(x,y,phi), blon+get_lon(x,y,phi), 20000.0 + alt_offset,alpha); - -# add moderately strong convective clouds - -var strength = 0.4; -var n = int(4000 * strength); # calculate the number of placement tries from tile size 20x20km and strength -local_weather.create_cumosys(blat,blon, 4000.0+alt_offset,n, 20000.0); - -tile_finished(); -} #################################### @@ -1851,6 +1573,9 @@ tile_finished(); var set_METAR_tile = func { + +setprop(lw~"tiles/code","METAR"); # to be replaced + tile_start(); var x = 0.0; @@ -1858,7 +1583,7 @@ var y = 0.0; var lat = 0.0; var lon = 0.0; -setprop(lw~"tiles/code","METAR"); # to be replaced + var alpha = getprop(lw~"METAR/wind-direction-deg"); var phi = alpha * math.pi/180.0; @@ -2163,10 +1888,10 @@ var create_4_8_cirrocumulus_bank = func (lat, lon, alt, alpha) { var phi = alpha * math.pi/180.0; var x = 2.0 * (rand()-0.5) * 5000; var y = 2.0 * (rand()-0.5) * 5000; -var tri = 1.4 + 0.6 *rand(); +var tri = 1.5 + 1.5 *rand(); var beta = (rand() -0.5) * 60.0; -local_weather.create_streak("Cirrocumulus (cloudlet)",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,900.0,15,750.0,0.2,400.0,24,750.0,0.2,400.0,alpha+90.0+beta,tri); +local_weather.create_streak("Cirrocumulus (cloudlet)",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,400.0,12,750.0,0.25,400.0,24,750.0,0.2,400.0,alpha+90.0+beta,tri); } @@ -2179,7 +1904,7 @@ var y = 2.0 * (rand()-0.5) * 5000; var tri = 1.4 + 0.6 *rand(); var beta = (rand() -0.5) * 60.0; -local_weather.create_streak("Cirrocumulus (cloudlet)",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,900.0,25,300.0,0.0,900.0,15,1400.0,0.0,300.0,alpha+90.0+beta,tri); +local_weather.create_streak("Cirrocumulus (cloudlet)",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,400.0,25,300.0,0.0,900.0,15,1400.0,0.0,300.0,alpha+90.0+beta,tri); } @@ -2293,6 +2018,28 @@ local_weather.create_streak("Cumulus",lat+get_lat(x,y-6000,phi), lon+get_lon(x,y } +var create_detailed_stratocumulus_bank = func (lat, lon, alt, alpha) { + +var phi = alpha * math.pi/180.0; +var x = 2.0 * (rand()-0.5) * 6000; +var y = 2.0 * (rand()-0.5) * 6000; +var tri = 1.5 + 1.5*rand(); +var beta = (rand() -0.5) * 60.0; + +var alt_offset = 0.5 * local_weather.cloud_vertical_size_map["Cumulus"] * ft_to_m; + +local_weather.create_streak("Congestus",lat+get_lat(x,y+7500,phi), lon+get_lon(x,y+7500,phi), alt + alt_offset,500.0,12,1000.0,0.1,400.0,15,1000.0,0.1,400.0,alpha+90.0+beta,tri); + +local_weather.create_streak("Congestus",lat+get_lat(x,y-7500,phi), lon+get_lon(x,y-7500,phi), alt + alt_offset,500.0,12,1000.0,0.1,400.0,15,1000.0,0.1,400.0,alpha+270.0+beta,tri); + + +local_weather.create_streak("Congestus bottom",lat+get_lat(x,y+5250,phi), lon+get_lon(x,y+5250,phi), alt,0.0,10,700.0,0.2,400.0,15,700.0,0.0,400.0,alpha+90.0+beta,tri); + +local_weather.create_streak("Congestus bottom",lat+get_lat(x,y-5250,phi), lon+get_lon(x,y-5250,phi), alt,0.0,10,700.0,0.2,400.0,15,700.0,0.0,400.0,alpha+270.0+beta,tri); + +} + + var create_cloud_bank = func (type, lat, lon, alt, x1, x2, height, n, alpha) { local_weather.create_streak(type,lat,lon, alt+ 0.5* height,height,n,0.0,0.0,x1,1,0.0,0.0,x2,alpha,1.0); diff --git a/Shaders/clouds-layered.vert b/Shaders/clouds-layered.vert index 8846f0ee5..bb78d1c0e 100644 --- a/Shaders/clouds-layered.vert +++ b/Shaders/clouds-layered.vert @@ -54,7 +54,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, 300.0, fogCoord), 1 - smoothstep(25000.0, 30000.0, fogCoord)); + gl_FrontColor.a = min(smoothstep(100.0, 300.0, fogCoord), 1 - smoothstep(40000.0, 45000.0, fogCoord)); gl_BackColor = gl_FrontColor; // Fog doesn't affect clouds as much as other objects. diff --git a/Shaders/clouds-thick.vert b/Shaders/clouds-thick.vert index 996208295..a25af4ec8 100644 --- a/Shaders/clouds-thick.vert +++ b/Shaders/clouds-thick.vert @@ -3,7 +3,7 @@ varying float fogFactor; -float shade = 0.6; +float shade = 0.4; float cloud_height = 1000.0; void main(void) @@ -39,6 +39,7 @@ void main(void) // 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); float fract = smoothstep(0.0, cloud_height, gl_Position.z + cloud_height); // Final position of the sprite @@ -53,7 +54,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(10.0, 100.0, fogCoord), 1 - smoothstep(15000.0, 20000.0, fogCoord)); + gl_FrontColor.a = min(smoothstep(10.0, 100.0, fogCoord), 1 - smoothstep(40000.0, 45000.0, fogCoord)); gl_BackColor = gl_FrontColor; // Fog doesn't affect clouds as much as other objects. diff --git a/Shaders/clouds-thin.vert b/Shaders/clouds-thin.vert index a1731e96c..d424c6e0f 100644 --- a/Shaders/clouds-thin.vert +++ b/Shaders/clouds-thin.vert @@ -63,7 +63,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(10.0, 100.0, fogCoord), 1 - smoothstep(15000.0, 20000.0, fogCoord)); + gl_FrontColor.a = min(smoothstep(10.0, 100.0, fogCoord), 1 - smoothstep(40000.0, 45000.0, fogCoord)); gl_BackColor = gl_FrontColor; // Fog doesn't affect clouds as much as other objects. diff --git a/Shaders/clouds-thinlayer.vert b/Shaders/clouds-thinlayer.vert index 4f500a151..bcc6e791e 100644 --- a/Shaders/clouds-thinlayer.vert +++ b/Shaders/clouds-thinlayer.vert @@ -54,7 +54,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, 300.0, fogCoord), 1 - smoothstep(25000.0, 30000.0, fogCoord)); + gl_FrontColor.a = min(smoothstep(100.0, 300.0, fogCoord), 1 - smoothstep(40000.0, 45000.0, fogCoord)); gl_BackColor = gl_FrontColor; // Fog doesn't affect clouds as much as other objects. diff --git a/gui/dialogs/local_weather.xml b/gui/dialogs/local_weather.xml index fefc07748..6561adba8 100644 --- a/gui/dialogs/local_weather.xml +++ b/gui/dialogs/local_weather.xml @@ -241,6 +241,7 @@ /local-weather/tmp/cloud-type Altocumulus Cirrus + Cirrocumulus (cloudlet) Cirrostratus Cumulus Cumulus (cloudlet) diff --git a/gui/dialogs/local_weather_config.xml b/gui/dialogs/local_weather_config.xml new file mode 100644 index 000000000..74eb35605 --- /dev/null +++ b/gui/dialogs/local_weather_config.xml @@ -0,0 +1,273 @@ + + + + + + + local_weather_config + 400 + 400 + false + + + + 5 + 370 + + + + + 60 + 340 + + + + + 10 + 320 + + + + + 60 + 320 + 100 + 20 + 25000.0 + 55000.0 + /local-weather/config/distance-to-load-tile-m + + dialog-apply + + + + + 170 + 320 + + + + + + 250 + 350 + 15 + 15 + + /local-weather/tmp/asymmetric-tile-loading-flag + + dialog-apply + + + + + 220 + 320 + + + + + 250 + 320 + 100 + 20 + 0.5 + 1.0 + /local-weather/config/asymmetric-reduction + + dialog-apply + + + + + 360 + 320 + + + + + 5 + 280 + + + + + + 60 + 260 + + + + + 10 + 240 + + + + + 60 + 240 + 100 + 20 + 15000.0 + 45000.0 + /local-weather/config/clouds-visible-range-m + + dialog-apply + + + + + 170 + 240 + + + + + + 250 + 270 + 15 + 15 + + /local-weather/config/asymmetric-buffering-flag + + dialog-apply + + + + + 220 + 240 + + + + + 250 + 240 + 100 + 20 + 0.2 + 1.0 + /local-weather/config/asymmetric-buffering-reduction + + dialog-apply + + + + + 360 + 240 + + + + + + 170 + 210 + + + + + 220 + 210 + + + + + 250 + 210 + 100 + 20 + 0.0 + 180.0 + /local-weather/config/asymmetric-buffering-angle-deg + + dialog-apply + + + + + 360 + 210 + + + + + + + + 5 + 160 + + + + + + 60 + 140 + + + + + 10 + 120 + + + + + 60 + 120 + 100 + 20 + 100 + 400 + /local-weather/config/clouds-in-dynamics-loop + + dialog-apply + + + + + 170 + 120 + + + + + + + + 10 + 10 + + + + + + + + + + + diff --git a/gui/menubar.xml.alt b/gui/menubar.xml.alt index cf844318d..043aa5332 100644 --- a/gui/menubar.xml.alt +++ b/gui/menubar.xml.alt @@ -333,6 +333,13 @@ local_weather_tiles + + + + dialog-show + local_weather_config + +