From edbff6bd3494d5b8cd21a6fafebce37d211fe673 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer <Torsten@t3r.de> Date: Thu, 19 Jan 2012 00:05:48 +0100 Subject: [PATCH 1/4] Refactor weather-utility.nas A bug in weather-utility.nas caused constant computation of wave parameters due to the fact that the wind speed was ignored. That code was ugly anyway, so it has been replaced by property rules which don't create work for the nasal garbage collector. All required properties for the wave shader are now in interpolator.xml, the snow-line computation lives in metarinterpolator.xml --- Environment/interpolator.xml | 183 ++++++++++++++++++++++++++++ Environment/metarinterpolator.xml | 27 +++++ Nasal/weather-utility.nas | 190 ------------------------------ 3 files changed, 210 insertions(+), 190 deletions(-) delete mode 100644 Nasal/weather-utility.nas diff --git a/Environment/interpolator.xml b/Environment/interpolator.xml index d38bfb1bc..0bb425908 100644 --- a/Environment/interpolator.xml +++ b/Environment/interpolator.xml @@ -196,4 +196,187 @@ <filter-time>1</filter-time> </filter> + <!-- replace weather-utility.nas --> + <!-- + #this utility is a workaround for the fact that a shader uses listeners which cannot + # be used with a tied property + --> + <filter> + <name>EnvironmentInterpolator:wave:wind-from-east-fps</name> + <input>/environment/config/boundary/entry[0]/wind-from-east-fps</input> + <output>/environment/sea/surface/wind-from-east-fps</output> + <type>gain</type> + <gain>1</gain> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:wind-from-north-fps</name> + <input>/environment/config/boundary/entry[0]/wind-from-north-fps</input> + <output>/environment/sea/surface/wind-from-north-fps</output> + <type>gain</type> + <gain>1</gain> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:wind-from-heading-deg</name> + <input>/environment/config/boundary/entry[0]/wind-from-heading-deg</input> + <output>/environment/sea/surface/wind-from-deg</output> + <type>gain</type> + <gain>1</gain> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:wind-speed-kt</name> + <input>/environment/config/boundary/entry[0]/wind-speed-kt</input> + <output>/environment/sea/surface/wind-speed-kt</output> + <type>gain</type> + <gain>1</gain> + </filter> + + <logic> + <name>EnvironmentInterpolator:wave:enabled</name> + <input>/environment/config/enabled</input> + <output>/environment/sea/config/enabled</output> + </logic> + + <filter> + <name>EnvironmentInterpolator:model:heading</name> + <input>/orientation/heading-deg</input> + <output>/orientation/model/heading-deg</output> + <type>gain</type> + <gain>1</gain> + </filter> + + <filter> + <name>EnvironmentInterpolator:model:pitch</name> + <input>/orientation/pitch-deg</input> + <output>/orientation/model/pitch-deg</output> + <type>gain</type> + <gain>1</gain> + </filter> + + <filter> + <name>EnvironmentInterpolator:model:roll</name> + <type>gain</type> + <gain>1</gain> + <input>/orientation/roll-deg</input> + <output>/orientation/model/roll-deg</output> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:amp</name> + <type>gain</type> + <gain>1</gain> + <input> + <expression> + <sum> + <value>1.0</value> + <product> + <value>0.02</value> + <property>/environment/sea/surface/wind-speed-kt</property> + </product> + </sum> + </expression> + </input> + <output>/environment/wave/amp</output> + <min>1.0</min> + <max>2.0</max> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:angle</name> + <type>gain</type> + <gain>1</gain> + <input> + <expression> + <sum> + <value>35.0</value> + <product> + <value>0.2</value> + <property>/environment/sea/surface/wind-speed-kt</property> + </product> + </sum> + </expression> + </input> + <output>/environment/wave/angle</output> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:dangle</name> + <type>gain</type> + <gain>1</gain> + <input> + <expression> + <difference> + <value>20.0</value> + <product> + <value>0.4</value> + <property>/environment/sea/surface/wind-speed-kt</property> + </product> + </difference> + </expression> + </input> + <output>/environment/wave/dangle</output> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:freq</name> + <type>gain</type> + <gain>1</gain> + <input> + <expression> + <sum> + <value>0.01</value> + <product> + <value>0.0008</value> + <property>/environment/sea/surface/wind-speed-kt</property> + </product> + </sum> + </expression> + </input> + <output>/environment/wave/freq</output> + <min>0.01</min> + <max>0.015</max> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:factor</name> + <type>gain</type> + <gain>1</gain> + <input> + <expression> + <difference> + <value>0.0004</value> + <product> + <value>0.00001</value> + <property>/environment/sea/surface/wind-speed-kt</property> + </product> + </difference> + </expression> + </input> + <output>/environment/wave/factor</output> + <min>0.0001</min> + <max>0.0004</max> + </filter> + + <filter> + <name>EnvironmentInterpolator:wave:sharp</name> + <type>gain</type> + <gain>1</gain> + <input> + <expression> + <sum> + <value>1.0</value> + <product> + <value>0.02</value> + <property>/environment/sea/surface/wind-speed-kt</property> + </product> + </sum> + </expression> + </input> + <output>/environment/wave/sharp</output> + <min>1.0</min> + <max>2.0</max> + </filter> + </PropertyList> diff --git a/Environment/metarinterpolator.xml b/Environment/metarinterpolator.xml index f6837c703..5fc5e18b4 100644 --- a/Environment/metarinterpolator.xml +++ b/Environment/metarinterpolator.xml @@ -407,4 +407,31 @@ <input>/environment/metar/clouds/layer[0]/alpha</input> <output>/environment/clouds/layer[0]/alpha</output> </filter> +<!-- replace weather-utility.nas + # Put the snow line slightly below the station's elevation, + # so the station is completely covered with snow +--> + <filter> + <name>MetarController:snow-level</name> + <type>gain</type> + <gain>1.0</gain> + <input> + <condition> + <property>/environment/metar/valid</property> + <property>/environment/metar/snow-cover</property> + </condition> + <expression> + <sum> + <product> + <property>/environment/metar/station-elevation-ft</property> + <value>0.3048</value> + </product> + <value>-50.0</value> + </sum> + </expression> + </input> + <input>3200</input> + <output>/environment/snow-level-m</output> + <max>3200</max> + </filter> </PropertyList> diff --git a/Nasal/weather-utility.nas b/Nasal/weather-utility.nas deleted file mode 100644 index 6c93051b4..000000000 --- a/Nasal/weather-utility.nas +++ /dev/null @@ -1,190 +0,0 @@ -########## -#this utility is a workaround for the fact that a shader uses listeners which cannot -# be used with a tied property -# - -# TODO: Make this optional (when shaders disabled etc), or move computation -# away from Nasal. - -#does what it says on the tin -var clamp = func(v, min, max) { v < min ? min : v > max ? max : v } - -#set global variables -var Amp = 1.0; -var Angle = 35.0; -var DAngle = 20.0; -var Freq = 0.01; -var Factor = 0.0004; -var Sharp = 1.0; - -#add control properies for waves -var wave_amp_Node = props.globals.getNode("/environment/wave/amp" , 1); -wave_amp_Node.setDoubleValue(Amp); - -var wave_freq_Node = props.globals.getNode("/environment/wave/freq" , 1); -wave_freq_Node.setDoubleValue(Freq); - -var wave_sharp_Node = props.globals.getNode("/environment/wave/sharp" , 1); -wave_sharp_Node.setDoubleValue(Sharp); - -var wave_angle_Node = props.globals.getNode("/environment/wave/angle" , 1); -wave_angle_Node.setDoubleValue(Angle); - -var wave_factor_Node = props.globals.getNode("/environment/wave/factor" , 1); -wave_factor_Node.setDoubleValue(Factor); - -var wave_factor_Node = props.globals.getNode("/environment/wave/dangle" , 1); -wave_factor_Node.setDoubleValue(DAngle); - -props.globals.initNode("/environment/sea/surface/wind-speed-kt", 0, "DOUBLE"); -props.globals.initNode("/environment/sea/surface/wind-from-east-fps", 0, "DOUBLE"); -props.globals.initNode("/environment/sea/surface/wind-from-north-fps", 0, "DOUBLE"); -props.globals.initNode("/environment/sea/surface/wind-from-deg", 0, "DOUBLE"); -props.globals.initNode("/environment/sea/surface/config/enabled", 0, "DOUBLE"); -#object rotation values -props.globals.initNode("/orientation/model/heading-deg", 0, "DOUBLE"); -props.globals.initNode("/orientation/model/pitch-deg", 0, "DOUBLE"); -props.globals.initNode("/orientation/model/roll-deg", 0, "DOUBLE"); - - -var update_waves = func (wind) { - var wind = 0; - var amp = 0; - var angle = 0; - var dangle = 0; - var freq = 0; - var factor = 0; - var sharp = 0; - - amp = Amp + 0.02 * wind; - amp = clamp(amp, 1.0, 2.0); - - setprop("/environment/wave/amp", amp); - - angle = Angle + 0.2 * wind; - setprop("/environment/wave/angle", angle); - - dangle = DAngle - 0.4 * wind; - setprop("/environment/wave/dangle", dangle); - - freq = Freq + 0.0008 * wind; - freq = clamp(freq, 0.01, 0.015); - setprop("/environment/wave/freq", freq); - - factor = Factor - 0.00001 * wind; - factor = clamp(factor, 0.0001, 0.0004); - setprop("/environment/wave/factor", factor); - - sharp = Sharp + 0.02 * wind; - sharp = clamp(sharp, 1.0, 2.0); - setprop("/environment/wave/sharp", sharp); -}; - -var is_initialized = 0; -var initialize = func { - if (is_initialized) - return; # only install listeners once - is_initialized = 1; - - var wind_from_east_Node = props.globals.getNode("/environment/config/boundary/entry[0]/wind-from-east-fps", 1); - wind_from_east_Node.setDoubleValue(0); - - var wind_from_north_Node = props.globals.getNode("/environment/config/boundary/entry[0]/wind-from-north-fps", 1); - wind_from_north_Node.setDoubleValue(0); - - var wind_from_Node = props.globals.getNode("/environment/config/boundary/entry[0]/wind-from-heading-deg", 1); - wind_from_Node.setDoubleValue(0); - - var wind_speed_Node = props.globals.getNode("/environment/config/boundary/entry[0]/wind-speed-kt", 1); - wind_speed_Node.setDoubleValue(0); - - var wind_status_Node = props.globals.getNode("/environment/config/enabled", 1); - wind_status_Node.setBoolValue(1); - - var ground_vis_Node = props.globals.getNode("/environment/ground-visibility-m", 1); - ground_vis_Node.setDoubleValue(500); - - var ground_thick_Node = props.globals.getNode("/environment/ground-haze-thickness-m" , 1); - ground_thick_Node.setDoubleValue(300); - - var ground_term_Node = props.globals.getNode("/environment/terminator-relative-position-m" , 1); - ground_term_Node.setDoubleValue(60000); - -# ################## listeners #################### -# -# installing a listener to /environment/sea/surface/wind-speed-kt does not make sense, -# since it's currently being written in _every_ update loop anyway). -# setlistener("/environment/sea/surface/wind-speed-kt", func(n) {update_waves(n.getValue())}, -# 1, -# 0);# end listener - - print("weather util initialized ..."); - loop(); -}# end init - -var loop = func { - var value = getprop("/environment/config/boundary/entry[0]/wind-from-east-fps"); - setprop("/environment/sea/surface/wind-from-east-fps", value); -# print("wind-from-east-fps ", getprop("/environment/sea/surface/wind-from-east-fps")); - - value = getprop("/environment/config/boundary/entry[0]/wind-from-north-fps"); - setprop("/environment/sea/surface/wind-from-north-fps", value); -# print("wind-from-north-fps ", getprop("/environment/sea/surface/wind-from-north-fps")); - - value = getprop("/environment/config/boundary/entry[0]/wind-from-heading-deg"); - setprop("/environment/sea/surface/wind-from-deg", value); -# print("wind-from-deg ", getprop("/environment/sea/surface/wind-from-deg")); - - value = getprop("/environment/config/boundary/entry[0]/wind-speed-kt"); - setprop("/environment/sea/surface/wind-speed-kt", value); -# print("wind-speed-kt ", getprop("/environment/sea/surface/wind-speed-kt")); - # Direct call to update wave settings (much more effective than using a listener, - # since it's written in every loop anyway. - update_waves(value); - - value = getprop("/environment/config/enabled"); - setprop("/environment/sea/config/enabled", value); -# print("wind-speed-kt ", getprop("/environment/config/enabled")); - -# orientation fix -#orientation - value = getprop("/orientation/heading-deg") or 0.0; - setprop("/orientation/model/heading-deg", value); - value = getprop("/orientation/pitch-deg") or 0.0; - setprop("/orientation/model/pitch-deg", value); - value = getprop("/orientation/roll-deg") or 0.0; - setprop("/orientation/model/roll-deg", value); - - settimer(loop,0); - -} - -# Fire it up - -setlistener("sim/signals/fdm-initialized", initialize); - -# end - -### -# Adjust snow line to match METAR -# - -var snowLineDefault = 3200; - -_setlistener("/environment/metar/valid", func { - var snowCover = getprop("/environment/metar/snow-cover"); - var snowLine = getprop("/environment/snow-level-m"); - - # Put the snow line slightly below the station's elevation, - # so the station is completely covered with snow - var stationElev = getprop("/environment/metar/station-elevation-ft") * globals.FT2M - 50; - - if (snowCover == 1){ - if (stationElev > snowLineDefault) { snowLine = snowLineDefault; } - if ((stationElev <= snowLineDefault) and (snowLine > stationElev)) { snowLine = stationElev; } - } - setprop("/environment/snow-level-m",snowLine); -}); - -# -### \ No newline at end of file From 3200e957f8a697be76bd53ad67cc049b1f1424a5 Mon Sep 17 00:00:00 2001 From: Gijs de Rooy <gijsrooy@hotmail.com> Date: Thu, 19 Jan 2012 22:02:09 +0100 Subject: [PATCH 2/4] Hide load and save options from help menu, as they are broken/disabled. --- Nasal/gui.nas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Nasal/gui.nas b/Nasal/gui.nas index 1d52fa82f..ce648a89e 100644 --- a/Nasal/gui.nas +++ b/Nasal/gui.nas @@ -1220,8 +1220,8 @@ var basic_keys = { { name: "_", desc: "compose chat message" }, { name: "F3", desc: "capture screen" }, { name: "F10", desc: "toggle menubar" }, - { name: "Shift-F1", desc: "load flight" }, - { name: "Shift-F2", desc: "save flight" }, + #{ name: "Shift-F1", desc: "load flight" }, + #{ name: "Shift-F2", desc: "save flight" }, { name: "Shift-F10", desc: "cycle through GUI styles" }, ], }; From 22aeda4a0497a584ee1a74c7782944025ca32bf6 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer <Torsten@t3r.de> Date: Fri, 20 Jan 2012 12:47:11 +0100 Subject: [PATCH 3/4] cleanup water shader properties, interpolate sea-surface wind --- Effects/flutter.eff | 8 +++++--- Effects/water.eff | 12 ++++++------ Environment/environment.xml | 6 ++++++ Environment/interpolator.xml | 28 ++++++++++++++-------------- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/Effects/flutter.eff b/Effects/flutter.eff index d4ca7b0cb..238f1b41f 100644 --- a/Effects/flutter.eff +++ b/Effects/flutter.eff @@ -9,10 +9,12 @@ <!-- DIFFUSE --> </material> <shade-model>smooth</shade-model> + <!-- unused ? <wind-speed> - <!--<use>/environment/Vinson/rel-wind-speed-kts</use>--> + <!- -<use>/environment/Vinson/rel-wind-speed-kts</use>- -> <use>/environment/config/boundary/entry[0]/wind-speed-kt</use> </wind-speed> + --> <offset>0.0</offset> <amplitude-factor>0.08</amplitude-factor> <windE> @@ -161,13 +163,13 @@ <use>material/color-mode-uniform</use> </value> </uniform> - <uniform> + <!-- uniform> unused? <name>WindSpeed</name> <type>float</type> <value> <use>wind-speed</use> </value> - </uniform> + </uniform--> <uniform> <name>Offset</name> <type>float</type> diff --git a/Effects/water.eff b/Effects/water.eff index 607027dd2..096033faf 100644 --- a/Effects/water.eff +++ b/Effects/water.eff @@ -86,9 +86,9 @@ <windN> <use>/environment/sea/surface/wind-from-north-fps</use> </windN> - <wind-from> + <!--wind-from> unused? <use>/environment/config/boundary/entry[0]/wind-from-heading-deg</use> - </wind-from> + </wind-from--> <WaveFreq> <use>/environment/wave/freq</use> </WaveFreq> @@ -398,13 +398,13 @@ <use>windN</use> </value> </uniform> - <uniform> + <!-- uniform> unused? <name>WindFrom</name> <type>float</type> <value> <use>wind-from</use> </value> - </uniform> + </uniform--> <uniform> <name>WaveFreq</name> <type>float</type> @@ -765,13 +765,13 @@ <use>windN</use> </value> </uniform> - <uniform> + <!--uniform> unused? <name>WindFrom</name> <type>float</type> <value> <use>wind-from</use> </value> - </uniform> + </uniform--> <uniform> <name>WaveFreq</name> <type>float</type> diff --git a/Environment/environment.xml b/Environment/environment.xml index 4d1466ba4..14e07ba52 100644 --- a/Environment/environment.xml +++ b/Environment/environment.xml @@ -328,4 +328,10 @@ </area> </terrain> + <sea> + <config> + <wind-filter-time type="double">60.0</wind-filter-time> + </config> + </sea> + </PropertyList> diff --git a/Environment/interpolator.xml b/Environment/interpolator.xml index 0bb425908..af1503b70 100644 --- a/Environment/interpolator.xml +++ b/Environment/interpolator.xml @@ -205,33 +205,33 @@ <name>EnvironmentInterpolator:wave:wind-from-east-fps</name> <input>/environment/config/boundary/entry[0]/wind-from-east-fps</input> <output>/environment/sea/surface/wind-from-east-fps</output> - <type>gain</type> - <gain>1</gain> + <type>exponential</type> + <filter-time>/environment/sea/config/wind-filter-time</filter-time> </filter> <filter> <name>EnvironmentInterpolator:wave:wind-from-north-fps</name> <input>/environment/config/boundary/entry[0]/wind-from-north-fps</input> <output>/environment/sea/surface/wind-from-north-fps</output> - <type>gain</type> - <gain>1</gain> + <type>exponential</type> + <filter-time>/environment/sea/config/wind-filter-time</filter-time> </filter> - <filter> + <!--filter> unused? <name>EnvironmentInterpolator:wave:wind-from-heading-deg</name> <input>/environment/config/boundary/entry[0]/wind-from-heading-deg</input> <output>/environment/sea/surface/wind-from-deg</output> <type>gain</type> <gain>1</gain> - </filter> + </filter--> - <filter> + <!--filter> unused? <name>EnvironmentInterpolator:wave:wind-speed-kt</name> <input>/environment/config/boundary/entry[0]/wind-speed-kt</input> <output>/environment/sea/surface/wind-speed-kt</output> <type>gain</type> <gain>1</gain> - </filter> + </filter--> <logic> <name>EnvironmentInterpolator:wave:enabled</name> @@ -273,7 +273,7 @@ <value>1.0</value> <product> <value>0.02</value> - <property>/environment/sea/surface/wind-speed-kt</property> + <property>/environment/config/boundary/entry[0]/wind-speed-kt</property> </product> </sum> </expression> @@ -293,7 +293,7 @@ <value>35.0</value> <product> <value>0.2</value> - <property>/environment/sea/surface/wind-speed-kt</property> + <property>/environment/config/boundary/entry[0]/wind-speed-kt</property> </product> </sum> </expression> @@ -311,7 +311,7 @@ <value>20.0</value> <product> <value>0.4</value> - <property>/environment/sea/surface/wind-speed-kt</property> + <property>/environment/config/boundary/entry[0]/wind-speed-kt</property> </product> </difference> </expression> @@ -329,7 +329,7 @@ <value>0.01</value> <product> <value>0.0008</value> - <property>/environment/sea/surface/wind-speed-kt</property> + <property>/environment/config/boundary/entry[0]/wind-speed-kt</property> </product> </sum> </expression> @@ -349,7 +349,7 @@ <value>0.0004</value> <product> <value>0.00001</value> - <property>/environment/sea/surface/wind-speed-kt</property> + <property>/environment/config/boundary/entry[0]/wind-speed-kt</property> </product> </difference> </expression> @@ -369,7 +369,7 @@ <value>1.0</value> <product> <value>0.02</value> - <property>/environment/sea/surface/wind-speed-kt</property> + <property>/environment/config/boundary/entry[0]/wind-speed-kt</property> </product> </sum> </expression> From 352bbd3cfae82f1a854aea3e0cde98a5eac979dd Mon Sep 17 00:00:00 2001 From: Torsten Dreyer <Torsten@t3r.de> Date: Fri, 20 Jan 2012 19:23:02 +0100 Subject: [PATCH 4/4] missing properties and a terminator - define missing property-definitions for the skydome shader - introduce a property rule for terminator-relative-position-m for local weather --- Environment/environment.xml | 6 +++++ Environment/local-weather-rules.xml | 39 +++++++++++++++++++++++++++++ preferences.xml | 4 +++ 3 files changed, 49 insertions(+) create mode 100644 Environment/local-weather-rules.xml diff --git a/Environment/environment.xml b/Environment/environment.xml index 14e07ba52..a65419ee9 100644 --- a/Environment/environment.xml +++ b/Environment/environment.xml @@ -334,4 +334,10 @@ </config> </sea> + <!-- definitions for the scattering skydome shader --> + <ground-visibility-m type="double" userarchive="n">16000.0</ground-visibility-m> + <ground-haze-thickness-m type="double" userarchive="n">2000.0</ground-haze-thickness-m> + <terminator-relative-position-m type="double" userarchive="n">1000000.0</terminator-relative-position-m> + <mean-terrain-elevation-m type="double" userarchive="n">0.0</mean-terrain-elevation-m> + </PropertyList> diff --git a/Environment/local-weather-rules.xml b/Environment/local-weather-rules.xml new file mode 100644 index 000000000..36cf72347 --- /dev/null +++ b/Environment/local-weather-rules.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" ?> +<!-- + This file is part of FlightGear, the free flight simulator + http://www.flightgear.org/ + + Copyright (C) 2012 Torsten Dreyer, Torsten (at) t3r _dot_ de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. +--> +<!-- + Compute local weather related properties +--> +<PropertyList> + + <!-- (pi/2 - /sim/time/sun-angle-rad) / 0.017451 * 110000.0 --> + <filter> + <name>LocalWeather:terminator-relative-position</name> + <input> + <expression> + <difference> + <value>1.57079632675</value> + <property>/sim/time/sun-angle-rad</property> + </difference> + </expression> + </input> + <output>/environment/terminator-relative-position-m</output> + <type>gain</type> + <gain>6303363.70409</gain> + </filter> + +</PropertyList> diff --git a/preferences.xml b/preferences.xml index 785b5005a..7ae4a3bff 100644 --- a/preferences.xml +++ b/preferences.xml @@ -382,6 +382,10 @@ Started September 2000 by David Megginson, david@megginson.com <name>Environment Interpolation Rule</name> <path>Environment/interpolator.xml</path> </property-rule> + <property-rule> + <name>Local Weather Rules </name> + <path>Environment/local-weather-rules.xml</path> + </property-rule> </systems> <instrumentation> <path>Aircraft/Generic/generic-instrumentation.xml</path>