diff --git a/Aircraft/Generic/Effects/null_bumpspec.png b/Aircraft/Generic/Effects/null_bumpspec.png
new file mode 100644
index 000000000..8d65741bf
Binary files /dev/null and b/Aircraft/Generic/Effects/null_bumpspec.png differ
diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas
index 0824dc229..cecd081c6 100644
--- a/Aircraft/Generic/WalkView/walkview.nas
+++ b/Aircraft/Generic/WalkView/walkview.nas
@@ -362,7 +362,7 @@ var TO_DEG = 180/math.pi;
var walkers = {};
var closerXY = func (pos, p1, p2) {
- l1 = [p1[0] - pos[0], p1[1] - pos[1]];
- l2 = [p2[0] - pos[0], p2[1] - pos[1]];
+ var l1 = [p1[0] - pos[0], p1[1] - pos[1]];
+ var l2 = [p2[0] - pos[0], p2[1] - pos[1]];
return (l1[0]*l1[0] + l1[1]*l1[1]) - (l2[0]*l2[0] + l2[1]*l2[1]);
}
diff --git a/Aircraft/c172p/Instruments/kap140/KAP140TwoAxisAlt.xml b/Aircraft/c172p/Instruments/kap140/KAP140TwoAxisAlt.xml
index 02ee2b61d..a9666f23c 100644
--- a/Aircraft/c172p/Instruments/kap140/KAP140TwoAxisAlt.xml
+++ b/Aircraft/c172p/Instruments/kap140/KAP140TwoAxisAlt.xml
@@ -279,7 +279,10 @@ properties' values.
select
vs-minus
- vs-digits-minus
+ vs-digit2-minus
+ vs-digit3-minus
+ vs-digit4-minus
+ vs-digit5-minus
@@ -287,15 +290,18 @@ properties' values.
true
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
select
- vs-digits
+ vs-digit2
+ vs-digit3
+ vs-digit4
+ vs-digit5
@@ -303,8 +309,8 @@ properties' values.
true
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
@@ -312,11 +318,10 @@ properties' values.
textranslate
vs-digit5
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -331,11 +336,10 @@ properties' values.
textranslate
vs-digit4
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -350,11 +354,10 @@ properties' values.
textranslate
vs-digit3
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -369,11 +372,10 @@ properties' values.
textranslate
vs-digit2
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -388,11 +390,10 @@ properties' values.
textranslate
vs-digit5-minus
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -407,11 +408,10 @@ properties' values.
textranslate
vs-digit4-minus
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -426,11 +426,10 @@ properties' values.
textranslate
vs-digit3-minus
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -445,11 +444,10 @@ properties' values.
textranslate
vs-digit2-minus
- /autopilot/KAP140/settings/target-pressure-rate
- 0
/autopilot/KAP140/settings/target-pressure-rate
+ 0
/autopilot/KAP140/settings/target-pressure-rate
@@ -911,5 +909,5 @@ properties' values.
-
+
diff --git a/Effects/reflect-bump-spec.eff b/Effects/reflect-bump-spec.eff
new file mode 100644
index 000000000..e9dd7f0c3
--- /dev/null
+++ b/Effects/reflect-bump-spec.eff
@@ -0,0 +1,316 @@
+
+
+
+ Effects/reflect-bump-spec
+ Effects/model-default
+
+
+
+ Aircraft/Generic/Effects/null_bumpspec.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ cubemap
+
+
+
+
+
+ Aircraft/Generic/Effects/CubeMaps/fair-sky/fair-sky_px.png
+ Aircraft/Generic/Effects/CubeMaps/fair-sky/fair-sky_nx.png
+ Aircraft/Generic/Effects/CubeMaps/fair-sky/fair-sky_py.png
+ Aircraft/Generic/Effects/CubeMaps/fair-sky/fair-sky_ny.png
+ Aircraft/Generic/Effects/CubeMaps/fair-sky/fair-sky_pz.png
+ Aircraft/Generic/Effects/CubeMaps/fair-sky/fair-sky_nz.png
+
+
+
+
+ Aircraft/Generic/Effects/Rainbow.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ Aircraft/Generic/Effects/FresnelLookUp.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ Aircraft/737-300/Models/Effects/733LH.ReflectionMap3.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+ transparent
+ smooth
+ 0.01
+ 0.1
+ 0.25
+ 0.0
+ 0.05
+ 0
+
+
+
+ 6
+ 7
+
+
+
+
+
+ /sim/rendering/shader-effects
+
+
+ 2.0
+
+
+
+ GL_ARB_shader_objects
+ GL_ARB_shading_language_100
+ GL_ARB_vertex_shader
+ GL_ARB_fragment_shader
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+ 8
+
+
+
+
+
+
+
+
+ 9
+ noise
+
+
+
+
+ Shaders/reflect-bump-spec.vert
+ Shaders/reflect-bump-spec.frag
+
+ tangent
+ 6
+
+
+ binormal
+ 7
+
+
+
+
+ BaseTex
+ sampler-2d
+ 0
+
+
+
+ NormalTex
+ sampler-2d
+ 4
+
+
+
+ Environment
+ sampler-cube
+ 5
+
+
+
+ Rainbow
+ sampler-2d
+ 6
+
+
+
+ Fresnel
+ sampler-2d
+ 7
+
+
+
+ Map
+ sampler-2d
+ 8
+
+
+
+ Noise
+ sampler-3d
+ 9
+
+
+
+
+ rainbowiness
+ float
+
+
+
+
+
+ fresneliness
+ float
+
+
+
+
+
+ noisiness
+ float
+
+
+
+
+
+ refl_correction
+ float
+
+
+
+
+
+ ambient_correction
+ float
+
+
+
+
+
+ reflect_map
+ float
+
+
+
+
+
+
diff --git a/Effects/water.eff b/Effects/water.eff
index 171ec5c3c..248950cb6 100644
--- a/Effects/water.eff
+++ b/Effects/water.eff
@@ -2,6 +2,150 @@
Effects/water
Effects/terrain-default
+
+
+ Textures/Water/water-reflection.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ Textures/Water/water-refraction.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ Textures/Water/water-normalmap.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+ Textures/Water/water-dudv.png
+ linear-mipmap-linear
+ repeat
+ repeat
+ normalized
+
+
+
+
+
+
+
+
+ /sim/rendering/water-shader
+ /sim/rendering/shader-effects
+
+ 2.0
+ /sim/rendering/quality-level
+
+
+
+ 2.0
+
+
+
+ GL_ARB_shader_objects
+ GL_ARB_shading_language_100
+ GL_ARB_vertex_shader
+ GL_ARB_fragment_shader
+
+
+
+
+
+ true
+
+
+
+
+ ambient-and-diffuse
+
+
+
+ smooth
+ back
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+ Shaders/water.vert
+ Shaders/water.frag
+
+
+ water_reflection
+ sampler-2d
+ 0
+
+
+ water_refraction
+ sampler-2d
+ 1
+
+
+ water_normalmap
+ sampler-2d
+ 2
+
+
+ water_dudvmap
+ sampler-2d
+ 3
+
+
+ saturation
+ float
+ 0.4
+
+
+
+
@@ -42,8 +186,8 @@
noise
- Shaders/water.vert
- Shaders/water.frag
+ Shaders/water-orig.vert
+ Shaders/water-orig.frag
texture
diff --git a/Environment/metarinterpolator.xml b/Environment/metarinterpolator.xml
index 2c027ea10..c67cb2ab5 100644
--- a/Environment/metarinterpolator.xml
+++ b/Environment/metarinterpolator.xml
@@ -28,7 +28,7 @@
-->
MetarController:pressure-sea-level-inhg
noise-spike
- 0.0003
+ 0.006
/environment/metar/valid
diff --git a/Input/Keyboard/multikey.xml b/Input/Keyboard/multikey.xml
index c6b0a1608..6b9e01307 100644
--- a/Input/Keyboard/multikey.xml
+++ b/Input/Keyboard/multikey.xml
@@ -89,16 +89,6 @@
-
- c
- Clouds
-
-
- dialog-show
- clouds
-
-
-
f
Fuel and Payload
@@ -241,7 +231,6 @@
nasal
@@ -253,7 +242,6 @@
nasal
@@ -265,7 +253,6 @@
nasal
@@ -277,7 +264,6 @@
nasal
diff --git a/Nasal/mp_broadcast.nas b/Nasal/mp_broadcast.nas
index cabef40ac..702a3372d 100644
--- a/Nasal/mp_broadcast.nas
+++ b/Nasal/mp_broadcast.nas
@@ -45,24 +45,25 @@ BroadcastChannel.new = func (mpp_path, process,
accept_predicate = nil,
on_disconnect = nil,
enable_send=1) {
- obj = { parents : [BroadcastChannel],
- mpp_path : mpp_path,
- send_node : enable_send ? props.globals.getNode(mpp_path, 1)
- : nil,
- process_msg : process,
- send_to_self : send_to_self,
- accept_predicate : (accept_predicate != nil) ? accept_predicate :
- func (p) { return 1; },
- on_disconnect : (on_disconnect != nil) ? on_disconnect :
- func (p) { return; },
- # Internal state.
- send_buf : [],
- peers : {},
- loopid : 0,
- PERIOD : 1.3,
- last_time : 0.0, # For join handling.
- last_send : 0.0, # For the send queue
- SEND_TIME : 0.5 };
+ var obj = { parents : [BroadcastChannel],
+ mpp_path : mpp_path,
+ send_node : enable_send ? props.globals.getNode(mpp_path, 1)
+ : nil,
+ process_msg : process,
+ send_to_self : send_to_self,
+ accept_predicate :
+ (accept_predicate != nil) ? accept_predicate
+ : func (p) { return 1; },
+ on_disconnect : (on_disconnect != nil) ? on_disconnect
+ : func (p) { return; },
+ # Internal state.
+ send_buf : [],
+ peers : {},
+ loopid : 0,
+ PERIOD : 1.3,
+ last_time : 0.0, # For join handling.
+ last_send : 0.0, # For the send queue
+ SEND_TIME : 0.5 };
if (enable_send and (obj.send_node == nil)) {
printlog("warn",
"BroadcastChannel invalid send node.");
@@ -232,10 +233,10 @@ Binary.decodeCoord = func (str) {
# The same object is seldom used for both sending and receiving.
var MessageChannel = {};
MessageChannel.new = func (n = nil, process = nil) {
- obj = { parents : [MessageChannel],
- node : n,
- process_msg : process,
- old : "" };
+ var obj = { parents : [MessageChannel],
+ node : n,
+ process_msg : process,
+ old : "" };
return obj;
}
MessageChannel.update = func {
diff --git a/Nasal/multiplayer.nas b/Nasal/multiplayer.nas
index 9bf4d351f..f2843b0c6 100644
--- a/Nasal/multiplayer.nas
+++ b/Nasal/multiplayer.nas
@@ -125,8 +125,10 @@ var handle_key = func(key)
{
input = substr(input, 0, size(input) - 1);
gui.popupTip(input, 1000000);
- return 1;
}
+
+ # Always handle key so excessive backspacing doesn't toggle the heading autopilot
+ return 1;
}
elsif (key == 27)
{
diff --git a/Nasal/startup.nas b/Nasal/startup.nas
index 3d7cff973..d2d692a14 100644
--- a/Nasal/startup.nas
+++ b/Nasal/startup.nas
@@ -1,6 +1,6 @@
var set_runway_from_metar_wind = func {
- if (!getprop("/environment/params/real-world-weather-fetch"))
- return printlog("info", "metar-rwy: no live weather");
+ if (!getprop("/environment/metar/valid"))
+ return printlog("info", "metar-rwy: no valid metar");
if (!getprop("/sim/startup/options/airport"))
return printlog("info", "metar-rwy: no airport requested");
if (getprop("/sim/startup/options/runway"))
diff --git a/Nasal/view.nas b/Nasal/view.nas
index 30b4f25a8..3642ac2e3 100644
--- a/Nasal/view.nas
+++ b/Nasal/view.nas
@@ -1,663 +1,663 @@
-##
-## view.nas
-##
-## Nasal code for implementing view-specific functionality.
-
-var index = nil; # current view index
-var views = nil; # list of all view branches (/sim/view[n]) as props.Node
-var current = nil; # current view branch (e.g. /sim/view[1]) as props.Node
-
-
-var hasmember = func(class, member) {
- if (contains(class, member))
- return 1;
- if (!contains(class, "parents"))
- return 0;
- if (typeof(class.parents) != "vector")
- return 0;
- foreach (var parent; class.parents)
- if (hasmember(parent, member))
- return 1;
- return 0;
-}
-
-
-# Dynamically calculate limits so that it takes STEPS iterations to
-# traverse the whole range, the maximum FOV is fixed at 120 degrees,
-# and the minimum corresponds to normal maximum human visual acuity
-# (~1 arc minute of resolution, although apparently people vary widely
-# in this ability). Quick derivation of the math:
-#
-# mul^steps = max/min
-# steps * ln(mul) = ln(max/min)
-# mul = exp(ln(max/min) / steps)
-var STEPS = 40;
-var ACUITY = 1/60; # Maximum angle subtended by one pixel (== 1 arc minute)
-var max = var min = var mul = 0;
-var calcMul = func {
- max = 120; # Fixed at 120 degrees
- min = getprop("/sim/startup/xsize") * ACUITY;
- mul = math.exp(math.ln(max/min) / STEPS);
-}
-
-##
-# Handler. Increase FOV by one step
-#
-var increase = func {
- calcMul();
- var val = fovProp.getValue() * mul;
- if(val == max) { return; }
- if(val > max) { val = max }
- fovProp.setDoubleValue(val);
- var popup=getprop("/sim/view-name-popup");
- if(popup == 1 or popup==nil) gui.popupTip(sprintf("FOV: %.1f", val));
-}
-
-##
-# Handler. Decrease FOV by one step
-#
-var decrease = func {
- calcMul();
- var val = fovProp.getValue() / mul;
- fovProp.setDoubleValue(val);
- var popup=getprop("/sim/view-name-popup");
- if(popup == 1 or popup==nil) gui.popupTip(sprintf("FOV: %.1f%s", val, val < min ? " (overzoom)" : ""));
-}
-
-##
-# Handler. Reset FOV to default.
-#
-var resetFOV = func {
- setprop("/sim/current-view/field-of-view",
- getprop("/sim/current-view/config/default-field-of-view-deg"));
-}
-
-var resetViewPos = func {
- var v = current.getNode("config");
- setprop("/sim/current-view/x-offset-m", v.getNode("x-offset-m", 1).getValue() or 0);
- setprop("/sim/current-view/y-offset-m", v.getNode("y-offset-m", 1).getValue() or 0);
- setprop("/sim/current-view/z-offset-m", v.getNode("z-offset-m", 1).getValue() or 0);
-}
-
-var resetViewDir = func {
- setprop("/sim/current-view/goal-heading-offset-deg",
- getprop("/sim/current-view/config/heading-offset-deg"));
- setprop("/sim/current-view/goal-pitch-offset-deg",
- getprop("/sim/current-view/config/pitch-offset-deg"));
- setprop("/sim/current-view/goal-roll-offset-deg",
- getprop("/sim/current-view/config/roll-offset-deg"));
-}
-
-##
-# Handler. Step to the next (force=1) or next enabled view.
-#
-var stepView = func(step, force = 0) {
- step = step > 0 ? 1 : -1;
- var n = index;
- for (var i = 0; i < size(views); i += 1) {
- n += step;
- if (n < 0)
- n = size(views) - 1;
- elsif (n >= size(views))
- n = 0;
- if (force or (var e = views[n].getNode("enabled")) == nil or e.getBoolValue())
- break;
- }
- setprop("/sim/current-view/view-number", n);
-
- # And pop up a nice reminder
- var popup=getprop("/sim/view-name-popup");
- if(popup == 1 or popup==nil) gui.popupTip(views[n].getNode("name").getValue());
-}
-
-##
-# Get view index by name.
-#
-var indexof = func(name) {
- forindex (var i; views)
- if (views[i].getNode("name", 1).getValue() == name)
- return i;
- return nil;
-}
-
-##
-# Standard view "slew" rate, in degrees/sec.
-#
-var VIEW_PAN_RATE = 60;
-
-##
-# Pans the view horizontally. The argument specifies a relative rate
-# (or number of "steps" -- same thing) to the standard rate.
-#
-var panViewDir = func(step) {
- if (getprop("/sim/freeze/master"))
- var prop = "/sim/current-view/heading-offset-deg";
- else
- var prop = "/sim/current-view/goal-heading-offset-deg";
-
- controls.slewProp(prop, step * VIEW_PAN_RATE);
-}
-
-##
-# Pans the view vertically. The argument specifies a relative rate
-# (or number of "steps" -- same thing) to the standard rate.
-#
-var panViewPitch = func(step) {
- if (getprop("/sim/freeze/master"))
- var prop = "/sim/current-view/pitch-offset-deg";
- else
- var prop = "/sim/current-view/goal-pitch-offset-deg";
-
- controls.slewProp(prop, step * VIEW_PAN_RATE);
-}
-
-
-##
-# Reset view to default using current view manager (see default_handler).
-#
-var resetView = func {
- manager.reset();
-}
-
-
-##
-# Default view handler used by view.manager.
-#
-var default_handler = {
- reset : func {
- resetViewDir();
- resetFOV();
- },
-};
-
-
-##
-# View manager. Administrates optional Nasal view handlers.
-# Usage: view.manager.register(, );
-#
-# view-id: the view's name (e.g. "Chase View") or index number
-# view-handler: a hash with any combination of the functions listed in the
-# following example, or none at all. Only define the interface
-# functions that you really need! The hash may contain local
-# variables and other, non-interface functions.
-#
-# Example:
-#
-# var some_view_handler = {
-# init : func {}, # called only once at startup
-# start : func {}, # called when view is switched to our view
-# stop : func {}, # called when view is switched away from our view
-# reset : func {}, # called with view.resetView()
-# update : func { 0 }, # called iteratively if defined. Must return
-# }; # interval in seconds until next invocation
-# # Don't define it if you don't need it!
-#
-# view.manager.register("Some View", some_view_handler);
-#
-#
-var manager = {
- current : { node: nil, handler: default_handler },
- init : func {
- me.views = {};
- me.loopid = 0;
- var viewnodes = props.globals.getNode("sim").getChildren("view");
- forindex (var i; viewnodes)
- me.views[i] = { node: viewnodes[i], handler: default_handler };
- setlistener("/sim/current-view/view-number", func(n) {
- manager.set_view(n.getValue());
- }, 1);
- },
- register : func(which, handler = nil) {
- if (num(which) == nil)
- which = indexof(which);
- if (handler == nil)
- handler = default_handler;
- me.views[which]["handler"] = handler;
- if (hasmember(handler, "init"))
- handler.init(me.views[which].node);
- me.set_view();
- },
- set_view : func(which = nil) {
- if (which == nil)
- which = index;
- elsif (num(which) == nil)
- which = indexof(which);
-
- me.loopid += 1;
- if (hasmember(me.current.handler, "stop"))
- me.current.handler.stop();
-
- me.current = me.views[which];
-
- if (hasmember(me.current.handler, "start"))
- me.current.handler.start();
- if (hasmember(me.current.handler, "update"))
- me._loop_(me.loopid += 1);
- },
- reset : func {
- if (hasmember(me.current.handler, "reset"))
- me.current.handler.reset();
- else
- default_handler.reset();
- },
- _loop_ : func(id) {
- id == me.loopid or return;
- settimer(func { me._loop_(id) }, me.current.handler.update() or 0);
- },
-};
-
-
-var fly_by_view_handler = {
- init : func {
- me.latN = props.globals.getNode("/sim/viewer/latitude-deg", 1);
- me.lonN = props.globals.getNode("/sim/viewer/longitude-deg", 1);
- me.altN = props.globals.getNode("/sim/viewer/altitude-ft", 1);
- me.hdgN = props.globals.getNode("/orientation/heading-deg", 1);
-
- setlistener("/sim/signals/reinit", func(n) { n.getValue() or me.reset() });
- setlistener("/sim/crashed", func(n) { n.getValue() and me.reset() });
- setlistener("/sim/freeze/replay-state", func {
- settimer(func { me.reset() }, 1); # time for replay to catch up
- });
- me.reset();
- },
- start : func {
- me.reset();
- },
- reset: func {
- me.chase = -getprop("/sim/chase-distance-m");
- me.course = me.hdgN.getValue();
- me.last = geo.aircraft_position();
- me.setpos(1);
- me.dist = 20;
- },
- setpos : func(force = 0) {
- var pos = geo.aircraft_position();
-
- # check if the aircraft has moved enough
- var dist = me.last.distance_to(pos);
- if (dist < 1.7 * me.chase and !force)
- return 1.13;
-
- # "predict" and remember next aircraft position
- var course = me.hdgN.getValue();
- var delta_alt = (pos.alt() - me.last.alt()) * 0.5;
- pos.apply_course_distance(course, dist * 0.8);
- pos.set_alt(pos.alt() + delta_alt);
- me.last.set(pos);
-
- # apply random deviation
- var radius = me.chase * (0.5 * rand() + 0.7);
- var agl = getprop("/position/altitude-agl-ft") * FT2M;
- if (agl > me.chase)
- var angle = rand() * 2 * math.pi;
- else
- var angle = ((2 * rand() - 1) * 0.15 + 0.5) * (rand() < 0.5 ? -math.pi : math.pi);
-
- var dev_alt = math.cos(angle) * radius;
- var dev_side = math.sin(angle) * radius;
- pos.apply_course_distance(course + 90, dev_side);
-
- # and make sure it's not under ground
- var lat = pos.lat();
- var lon = pos.lon();
- var alt = pos.alt();
- var elev = geo.elevation(lat, lon);
- if (elev != nil) {
- elev += 2; # min elevation
- if (alt + dev_alt < elev and dev_alt < 0)
- dev_alt = -dev_alt;
- if (alt + dev_alt < elev)
- alt = elev;
- else
- alt += dev_alt;
- }
-
- # set new view point
- me.latN.setValue(lat);
- me.lonN.setValue(lon);
- me.altN.setValue(alt * M2FT);
- return 7.3;
- },
- update : func {
- return me.setpos();
- },
-};
-
-
-var model_view_handler = {
- init: func(node) {
- me.viewN = node;
- me.current = nil;
- me.legendN = props.globals.initNode("/sim/current-view/model-view", "");
- me.dialog = props.Node.new({ "dialog-name": "model-view" });
- },
- start: func {
- me.listener = setlistener("/sim/signals/multiplayer-updated", func me._update_(), 1);
- me.reset();
- fgcommand("dialog-show", me.dialog);
- },
- stop: func {
- fgcommand("dialog-close", me.dialog);
- removelistener(me.listener);
- },
- reset: func {
- me.select(0);
- },
- find: func(callsign) {
- forindex (var i; me.list)
- if (me.list[i].callsign == callsign)
- return i;
- return nil;
- },
- select: func(which) {
- if (num(which) == nil)
- which = me.find(which) or 0; # turn callsign into index
-
- me.setup(me.list[which]);
- },
- next: func(step) {
- var i = me.find(me.current);
- i = i == nil ? 0 : math.mod(i + step, size(me.list));
- me.setup(me.list[i]);
- },
- _update_: func {
- var self = { callsign: getprop("/sim/multiplay/callsign"), model:,
- node: props.globals, root: '/' };
- me.list = [self] ~ multiplayer.model.list;
- if (!me.find(me.current))
- me.select(0);
- },
- setup: func(data) {
- if (data.root == '/') {
- var zoffset = getprop("/sim/chase-distance-m");
- var ident = '[' ~ data.callsign ~ ']';
- } else {
- var zoffset = 70;
- var ident = '"' ~ data.callsign ~ '" (' ~ data.model ~ ')';
- }
-
- me.current = data.callsign;
- me.legendN.setValue(ident);
- setprop("/sim/current-view/z-offset-m", zoffset);
-
- me.viewN.getNode("config").setValues({
- "eye-lat-deg-path": data.root ~ "/position/latitude-deg",
- "eye-lon-deg-path": data.root ~ "/position/longitude-deg",
- "eye-alt-ft-path": data.root ~ "/position/altitude-ft",
- "eye-heading-deg-path": data.root ~ "/orientation/heading-deg",
- "target-lat-deg-path": data.root ~ "/position/latitude-deg",
- "target-lon-deg-path": data.root ~ "/position/longitude-deg",
- "target-alt-ft-path": data.root ~ "/position/altitude-ft",
- "target-heading-deg-path": data.root ~ "/orientation/heading-deg",
- "target-pitch-deg-path": data.root ~ "/orientation/pitch-deg",
- "target-roll-deg-path": data.root ~ "/orientation/roll-deg",
- });
- },
-};
-
-
-var pilot_view_limiter = {
- new : func {
- return { parents: [pilot_view_limiter] };
- },
- init : func {
- me.hdgN = props.globals.getNode("/sim/current-view/heading-offset-deg");
- me.xoffsetN = props.globals.getNode("/sim/current-view/x-offset-m");
- me.xoffset_lowpass = aircraft.lowpass.new(0.1);
- me.last_offset = 0;
- },
- start : func {
- var limits = current.getNode("config/limits", 1);
- me.left = {
- heading_max : abs(limits.getNode("left/heading-max-deg", 1).getValue() or 1000),
- threshold : abs(limits.getNode("left/x-offset-threshold-deg", 1).getValue() or 0),
- xoffset_max : abs(limits.getNode("left/x-offset-max-m", 1).getValue() or 0),
- };
- me.right = {
- heading_max : -abs(limits.getNode("right/heading-max-deg", 1).getValue() or 1000),
- threshold : -abs(limits.getNode("right/x-offset-threshold-deg", 1).getValue() or 0),
- xoffset_max : -abs(limits.getNode("right/x-offset-max-m", 1).getValue() or 0),
- };
- me.left.scale = me.left.xoffset_max / (me.left.heading_max - me.left.threshold);
- me.right.scale = me.right.xoffset_max / (me.right.heading_max - me.right.threshold);
- me.last_hdg = normdeg(me.hdgN.getValue());
- me.enable_xoffset = me.right.xoffset_max > 0.001 or me.left.xoffset_max > 0.001;
- },
- update : func {
- if (getprop("/devices/status/keyboard/ctrl"))
- return;
-
- var hdg = normdeg(me.hdgN.getValue());
- if (abs(me.last_hdg - hdg) > 180) # avoid wrap-around skips
- me.hdgN.setDoubleValue(hdg = me.last_hdg);
- elsif (hdg > me.left.heading_max)
- me.hdgN.setDoubleValue(hdg = me.left.heading_max);
- elsif (hdg < me.right.heading_max)
- me.hdgN.setDoubleValue(hdg = me.right.heading_max);
- me.last_hdg = hdg;
-
- # translate view on X axis to look far right or far left
- if (me.enable_xoffset) {
- var offset = 0;
- if (hdg > me.left.threshold)
- offset = (me.left.threshold - hdg) * me.left.scale;
- elsif (hdg < me.right.threshold)
- offset = (me.right.threshold - hdg) * me.right.scale;
-
- var new_offset = me.xoffset_lowpass.filter(offset);
- me.xoffsetN.setDoubleValue(me.xoffsetN.getValue() - me.last_offset + new_offset);
- me.last_offset = new_offset;
- }
- return 0;
- },
-};
-
-
-var panViewDir = func(step) { # FIXME overrides panViewDir function from above; needs better integration
- if (getprop("/sim/freeze/master"))
- var prop = "/sim/current-view/heading-offset-deg";
- else
- var prop = "/sim/current-view/goal-heading-offset-deg";
- var viewVal = getprop(prop);
- var delta = step * VIEW_PAN_RATE * getprop("/sim/time/delta-realtime-sec");
- var viewValSlew = normdeg(viewVal + delta);
- var headingMax = abs(current.getNode("config/limits/left/heading-max-deg", 1).getValue() or 1000);
- var headingMin = -abs(current.getNode("config/limits/right/heading-max-deg", 1).getValue() or 1000);
- if (viewValSlew > headingMax)
- viewValSlew = headingMax;
- elsif (viewValSlew < headingMin)
- viewValSlew = headingMin;
- setprop(prop, viewValSlew);
-}
-
-
-#------------------------------------------------------------------------------
-#
-# Saves/restores/moves the view point (position, orientation, field-of-view).
-# Moves are interpolated with sinusoidal characteristic. There's only one
-# instance of this class, available as "view.point".
-#
-# Usage:
-# view.point.save(); ... save current view and return reference to
-# saved values in the form of a props.Node
-#
-# view.point.restore(); ... restore saved view parameters
-#
-# view.point.move( [,
diff --git a/gui/dialogs/osg_display_settings.xml b/gui/dialogs/stereoscopic-view-options.xml
similarity index 54%
rename from gui/dialogs/osg_display_settings.xml
rename to gui/dialogs/stereoscopic-view-options.xml
index da319f633..b873861fa 100644
--- a/gui/dialogs/osg_display_settings.xml
+++ b/gui/dialogs/stereoscopic-view-options.xml
@@ -2,8 +2,7 @@
-
- osg-display-settings
+ stereoscopic-view-options
false
false
vbox
@@ -18,7 +17,7 @@
-
+
@@ -71,7 +70,7 @@
true
0
- 1.0
+ 10.0
/sim/rendering/osg-displaysettings/screen-distance
dialog-apply
@@ -106,77 +105,4 @@
-
- hbox
- 1
-
- true
-
- true
- /sim/rendering/osg-displaysettings/double-buffer
-
- dialog-apply
-
-
-
-
-
- hbox
- 1
-
- true
-
- true
- /sim/rendering/osg-displaysettings/depth-buffer
-
- dialog-apply
-
-
-
-
-
- hbox
- 1
-
- true
-
- true
- /sim/rendering/osg-displaysettings/rgb
-
- dialog-apply
-
-
-
-
-
- hbox
- 1
-
- true
-
- 100
- 25
- true
- /sim/rendering/osg-displaysettings/screen-width
-
- dialog-apply
-
-
-
-
-
- hbox
- 1
-
- true
-
- 100
- 25
- true
- /sim/rendering/osg-displaysettings/screen-height
-
- dialog-apply
-
-
-
diff --git a/gui/dialogs/view.xml b/gui/dialogs/view.xml
index d1c1a2ad7..b105ee1db 100644
--- a/gui/dialogs/view.xml
+++ b/gui/dialogs/view.xml
@@ -6,7 +6,7 @@
vbox
-
+
diff --git a/gui/dialogs/weather.xml b/gui/dialogs/weather.xml
index 362c0e322..b0e8b8a1a 100644
--- a/gui/dialogs/weather.xml
+++ b/gui/dialogs/weather.xml
@@ -1,1051 +1,1664 @@
-
-
-
-
-
- weather
- false
- false
- vbox
- 3
-
-
-
- hbox
- 1
-
-
- true
-
-
-
-
-
-
-
- true
-
-
-
-
-
-
-
- hbox
- 0
-
-
-
- vbox
-
- vbox
- 1
-
-
-
- hbox
-
-
-
-
- true
-
-
-
-
- hbox
-
- table
-
-
-
- 0
- 1
-
-
-
-
- 0
- 2
- 80
-
-
-
-
- 0
- 3
-
-
-
-
-
-
- 1
- 1
- true
- /environment/clouds/layer[4]/elevation-ft
-
- dialog-apply
-
-
-
-
- 1
- 2
- 100
- true
- /environment/clouds/layer[4]/coverage
- clear
- few
- scattered
- broken
- overcast
- cirrus
-
- dialog-apply
-
-
-
-
- 1
- 3
- true
- /environment/clouds/layer[4]/thickness-ft
-
- dialog-apply
-
-
-
-
-
-
-
- 2
- 1
- true
- /environment/clouds/layer[3]/elevation-ft
-
- dialog-apply
-
-
-
-
- 2
- 2
- 100
- true
- /environment/clouds/layer[3]/coverage
- clear
- few
- scattered
- broken
- overcast
- cirrus
-
- dialog-apply
-
-
-
-
- 2
- 3
- true
- /environment/clouds/layer[3]/thickness-ft
-
- dialog-apply
-
-
-
-
-
-
-
- 3
- 1
- true
- /environment/clouds/layer[2]/elevation-ft
-
- dialog-apply
-
-
-
-
- 3
- 2
- 100
- true
- /environment/clouds/layer[2]/coverage
- clear
- few
- scattered
- broken
- overcast
- cirrus
-
- dialog-apply
-
-
-
-
- 3
- 3
- true
- /environment/clouds/layer[2]/thickness-ft
-
- dialog-apply
-
-
-
-
-
-
-
- 4
- 1
- true
- /environment/clouds/layer[1]/elevation-ft
-
- dialog-apply
-
-
-
-
- 4
- 2
- 100
- true
- /environment/clouds/layer[1]/coverage
- clear
- few
- scattered
- broken
- overcast
- cirrus
-
- dialog-apply
-
-
-
-
- 4
- 3
- true
- /environment/clouds/layer[1]/thickness-ft
-
- dialog-apply
-
-
-
-
-
-
-
- 5
- 1
- true
- /environment/clouds/layer[0]/elevation-ft
-
- dialog-apply
-
-
-
-
- 5
- 2
- 100
- true
- false
- /environment/clouds/layer[0]/coverage
- clear
- few
- scattered
- broken
- overcast
- cirrus
-
- dialog-apply
-
-
-
-
- 5
- 3
- true
- /environment/clouds/layer[0]/thickness-ft
-
- dialog-apply
-
-
-
-
-
- true
-
-
-
-
-
-
-
- vbox
- 1
-
-
- hbox
-
-
-
-
- true
-
-
-
-
- hbox
- fill
-
- table
-
- 0
- 0
-
-
-
-
- 0
- 1
-
-
-
-
- 1
- 0
- true
- fill
- /environment/metar/rain-norm
-
- dialog-apply
-
- true
-
-
-
- 1
- 1
- fill
- /environment/metar/snow-norm
- true
- 30
-
- dialog-apply
-
-
-
-
- 0
- 3
-
-
-
-
- 1
- 3
- true
- 50
- /environment/config/boundary/entry[0]/pressure-sea-level-inhg
-
-
-
- 2
- 0
- 3
- 30
-
-
-
-
-
- true
-
-
-
-
-
-
-
-
- true
-
-
-
-
- vbox
-
-
-
- vbox
- 1
-
-
- hbox
-
-
-
-
- true
-
-
-
-
- hbox
-
- table
-
- 0
- 0
-
-
-
-
- 0
- 1
- 2
-
-
-
-
- 0
- 3
-
-
-
-
- 0
- 4
-
-
-
-
- 0
- 5
-
-
-
-
- 1
- 0
- 52
- /environment/config/aloft/entry[4]/elevation-ft
- true
-
-
-
- 1
- 1
- 40
- /environment/config/aloft/entry[4]/wind-from-heading-deg
- true
-
-
-
- 1
- 2
- 35
- /environment/config/aloft/entry[4]/wind-speed-kt
- true
-
-
-
- 1
- 3
- 55
- /environment/config/aloft/entry[4]/visibility-m
- true
-
-
-
- 1
- 4
- 60
- /environment/config/aloft/entry[4]/temperature-degc
- true
-
-
-
- 1
- 5
- 60
- /environment/config/aloft/entry[4]/dewpoint-degc
- true
-
-
-
- 2
- 0
- 52
- /environment/config/aloft/entry[3]/elevation-ft
- true
-
-
-
- 2
- 1
- 40
- /environment/config/aloft/entry[3]/wind-from-heading-deg
- true
-
-
-
- 2
- 2
- 35
- /environment/config/aloft/entry[3]/wind-speed-kt
- true
-
-
-
- 2
- 3
- 55
- /environment/config/aloft/entry[3]/visibility-m
- true
-
-
-
- 2
- 4
- 60
- /environment/config/aloft/entry[3]/temperature-degc
- true
-
-
-
- 2
- 5
- 60
- /environment/config/aloft/entry[3]/dewpoint-degc
- true
-
-
-
- 3
- 0
- 52
- /environment/config/aloft/entry[2]/elevation-ft
- true
-
-
-
- 3
- 1
- 40
- /environment/config/aloft/entry[2]/wind-from-heading-deg
- true
-
-
-
- 3
- 2
- 35
- /environment/config/aloft/entry[2]/wind-speed-kt
- true
-
-
-
- 3
- 3
- 55
- /environment/config/aloft/entry[2]/visibility-m
- true
-
-
-
- 3
- 4
- 60
- /environment/config/aloft/entry[2]/temperature-degc
- true
-
-
-
- 3
- 5
- 60
- /environment/config/aloft/entry[2]/dewpoint-degc
- true
-
-
-
- 4
- 0
- 52
- /environment/config/aloft/entry[1]/elevation-ft
- true
-
-
-
- 4
- 1
- 40
- /environment/config/aloft/entry[1]/wind-from-heading-deg
- true
-
-
-
- 4
- 2
- 35
- /environment/config/aloft/entry[1]/wind-speed-kt
- true
-
-
-
- 4
- 3
- 55
- /environment/config/aloft/entry[1]/visibility-m
- true
-
-
-
- 4
- 4
- 60
- /environment/config/aloft/entry[1]/temperature-degc
- true
-
-
-
- 4
- 5
- 60
- /environment/config/aloft/entry[1]/dewpoint-degc
- true
-
-
-
- 5
- 0
- 52
- /environment/config/aloft/entry[0]/elevation-ft
- true
-
-
-
- 5
- 1
- 40
- /environment/config/aloft/entry[0]/wind-from-heading-deg
- true
-
-
-
- 5
- 2
- 35
- /environment/config/aloft/entry[0]/wind-speed-kt
- true
-
-
-
- 5
- 3
- 55
- /environment/config/aloft/entry[0]/visibility-m
- true
-
-
-
- 5
- 4
- 60
- /environment/config/aloft/entry[0]/temperature-degc
- true
-
-
-
- 5
- 5
- 60
- /environment/config/aloft/entry[0]/dewpoint-degc
- true
-
-
-
- true
-
-
-
-
-
-
-
-
- vbox
- 1
-
-
- hbox
-
-
-
-
- true
-
-
-
-
- hbox
-
-
- table
-
-
- 0
- 0
-
-
-
-
- 0
- 1
- 2
-
-
-
-
- 0
- 3
-
-
-
-
- 0
- 4
-
-
-
-
- 0
- 5
-
-
-
-
- 1
- 0
- 52
- /environment/config/boundary/entry[1]/elevation-ft
- true
-
-
-
- 1
- 1
- 40
- /environment/config/boundary/entry[1]/wind-from-heading-deg
- true
-
-
-
- 1
- 2
- 35
- /environment/config/boundary/entry[1]/wind-speed-kt
- true
-
-
-
- 1
- 3
- 55
- /environment/config/boundary/entry[1]/visibility-m
- true
-
-
-
- 1
- 4
- 60
- /environment/config/boundary/entry[1]/temperature-degc
- true
-
-
-
- 1
- 5
- 60
- /environment/config/boundary/entry[1]/dewpoint-degc
- true
-
-
-
- 2
- 0
- 52
- /environment/config/boundary/entry[0]/elevation-ft
- true
-
-
-
- 2
- 1
- 40
- /environment/config/boundary/entry[0]/wind-from-heading-deg
- true
-
-
-
- 2
- 2
- 35
- /environment/config/boundary/entry[0]/wind-speed-kt
- true
-
-
-
- 2
- 3
- 55
- /environment/config/boundary/entry[0]/visibility-m
- true
-
-
-
- 2
- 4
- 60
- /environment/config/boundary/entry[0]/temperature-degc
- true
-
-
-
- 2
- 5
- 60
- /environment/config/boundary/entry[0]/dewpoint-degc
- true
-
-
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
- vbox
-
-
-
- hbox
-
-
-
-
- true
-
-
-
-
- hbox
-
-
-
-
- source-selection
- fill
- true
- sim/gui/dialogs/weather-scenario/source-selection
-
- dialog-apply
- source-selection
-
-
- dialog-update
- metar
-
-
- nasal
-
-
-
-
-
- /environment/params/metar-updates-winds-aloft
-
- true
-
- dialog-apply
-
- aloft
-
-
-
-
-
- description
- fill
- true
- 180
- 60
- 20
- false
- true
- true
- sim/gui/dialogs/weather-scenario/description
-
-
-
- hbox
-
-
-
-
- true
-
-
-
-
- metar
- fill
- true
- 180
- 50
- 20
- true
- true
- false
- sim/gui/dialogs/weather-scenario/metar
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ weather
+ false
+ false
+ vbox
+ 3
+
+
+
+ hbox
+ 1
+
+
+ true
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+ hbox
+ 0
+
+
+
+ vbox
+
+ vbox
+ 1
+
+
+
+ hbox
+
+
+
+
+ true
+
+
+
+
+ hbox
+
+ table
+
+
+
+ 0
+ 1
+
+
+
+
+ 0
+ 2
+ 80
+
+
+
+
+ 0
+ 3
+
+
+
+
+
+
+ 1
+ 1
+ true
+ /environment/clouds/layer[4]/elevation-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 1
+ 2
+ 100
+ true
+ /environment/clouds/layer[4]/coverage
+ clear
+ few
+ scattered
+ broken
+ overcast
+ cirrus
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 1
+ 3
+ true
+ /environment/clouds/layer[4]/thickness-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+
+
+
+ 2
+ 1
+ true
+ /environment/clouds/layer[3]/elevation-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 2
+ 2
+ 100
+ true
+ /environment/clouds/layer[3]/coverage
+ clear
+ few
+ scattered
+ broken
+ overcast
+ cirrus
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 2
+ 3
+ true
+ /environment/clouds/layer[3]/thickness-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+
+
+
+ 3
+ 1
+ true
+ /environment/clouds/layer[2]/elevation-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 3
+ 2
+ 100
+ true
+ /environment/clouds/layer[2]/coverage
+ clear
+ few
+ scattered
+ broken
+ overcast
+ cirrus
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 3
+ 3
+ true
+ /environment/clouds/layer[2]/thickness-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+
+
+
+ 4
+ 1
+ true
+ /environment/clouds/layer[1]/elevation-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 4
+ 2
+ 100
+ true
+ /environment/clouds/layer[1]/coverage
+ clear
+ few
+ scattered
+ broken
+ overcast
+ cirrus
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 4
+ 3
+ true
+ /environment/clouds/layer[1]/thickness-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+
+
+
+ 5
+ 1
+ true
+ /environment/clouds/layer[0]/elevation-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 5
+ 2
+ 100
+ true
+ false
+ /environment/clouds/layer[0]/coverage
+ clear
+ few
+ scattered
+ broken
+ overcast
+ cirrus
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 5
+ 3
+ true
+ /environment/clouds/layer[0]/thickness-ft
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+ vbox
+ 1
+
+
+ hbox
+
+
+
+
+ true
+
+
+
+
+ hbox
+ fill
+
+ table
+
+ 0
+ 0
+
+
+
+
+ 0
+ 1
+
+
+
+
+ 1
+ 0
+ true
+ fill
+ /environment/metar/rain-norm
+
+ dialog-apply
+
+ true
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 1
+ 1
+ fill
+ /environment/metar/snow-norm
+ true
+ 30
+
+ dialog-apply
+
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+ 0
+ 3
+
+
+
+
+ pressure-sea-level-inhg
+ 1
+ 3
+ 50
+ /environment/config/boundary/entry[0]/pressure-sea-level-inhg
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ true
+
+ dialog-apply
+ pressure-sea-level-inhg
+
+
+
+
+ 2
+ 0
+ 3
+ 30
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+ vbox
+
+
+
+ vbox
+ 1
+
+
+ hbox
+
+
+
+
+ true
+
+
+
+
+ hbox
+
+ table
+
+ 0
+ 0
+
+
+
+
+ 0
+ 1
+ 2
+
+
+
+
+ 0
+ 3
+
+
+
+
+ 0
+ 4
+
+
+
+
+ 0
+ 5
+
+
+
+
+ aloft-4-elevation-ft
+ 1
+ 0
+ 52
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[4]/elevation-ft
+ true
+
+ dialog-apply
+ aloft-4-elevation-ft
+
+
+
+
+ aloft-4-wind-from-heading-deg
+ 1
+ 1
+ 40
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[4]/wind-from-heading-deg
+ true
+
+ dialog-apply
+ aloft-4-wind-from-heading-deg
+
+
+
+
+ aloft-4-wind-speed-kt
+ 1
+ 2
+ 35
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[4]/wind-speed-kt
+ true
+
+ dialog-apply
+ aloft-4-wind-speed-kt
+
+
+
+
+ aloft-4-visibility-m
+ 1
+ 3
+ 55
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[4]/visibility-m
+ true
+
+ dialog-apply
+ aloft-4-visibility-m
+
+
+
+
+ aloft-4-temperature-degc
+ 1
+ 4
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[4]/temperature-degc
+ true
+
+ dialog-apply
+ aloft-4-temperature-degc
+
+
+
+
+ aloft-4-dewpoint-degc
+ 1
+ 5
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[4]/dewpoint-degc
+ true
+
+ dialog-apply
+ aloft-4-dewpoint-degc
+
+
+
+
+ aloft-3-elevation-ft
+ 2
+ 0
+ 52
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[3]/elevation-ft
+ true
+
+ dialog-apply
+ aloft-3-elevation-ft
+
+
+
+
+ aloft-3-wind-from-heading-deg
+ 2
+ 1
+ 40
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[3]/wind-from-heading-deg
+ true
+
+ dialog-apply
+ aloft-3-wind-from-heading-deg
+
+
+
+
+ aloft-3-wind-speed-kt
+ 2
+ 2
+ 35
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[3]/wind-speed-kt
+ true
+
+ dialog-apply
+ aloft-3-wind-speed-kt
+
+
+
+
+ aloft-3-visibility-m
+ 2
+ 3
+ 55
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[3]/visibility-m
+ true
+
+ dialog-apply
+ aloft-3-visibility-m
+
+
+
+
+ aloft-3-temperature-degc
+ 2
+ 4
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[3]/temperature-degc
+ true
+
+ dialog-apply
+ aloft-3-temperature-degc
+
+
+
+
+ aloft-3-dewpoint-degc
+ 2
+ 5
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[3]/dewpoint-degc
+ true
+
+ dialog-apply
+ aloft-3-dewpoint-degc
+
+
+
+
+ aloft-2-elevation-ft
+ 3
+ 0
+ 52
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[2]/elevation-ft
+ true
+
+ dialog-apply
+ aloft-2-elevation-ft
+
+
+
+
+ aloft-2-wind-from-heading-deg
+ 3
+ 1
+ 40
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[2]/wind-from-heading-deg
+ true
+
+ dialog-apply
+ aloft-2-wind-from-heading-deg
+
+
+
+
+ aloft-2-wind-speed-kt
+ 3
+ 2
+ 35
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[2]/wind-speed-kt
+ true
+
+ dialog-apply
+ aloft-2-wind-speed-kt
+
+
+
+
+ aloft-2-visibility-m
+ 3
+ 3
+ 55
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[2]/visibility-m
+ true
+
+ dialog-apply
+ aloft-2-visibility-m
+
+
+
+
+ aloft-2-temperature-degc
+ 3
+ 4
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[2]/temperature-degc
+ true
+
+ dialog-apply
+ aloft-2-temperature-degc
+
+
+
+
+ aloft-2-dewpoint-degc
+ 3
+ 5
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[2]/dewpoint-degc
+ true
+
+ dialog-apply
+ aloft-2-dewpoint-degc
+
+
+
+
+ aloft-1-elevation-ft
+ 4
+ 0
+ 52
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[1]/elevation-ft
+ true
+
+ dialog-apply
+ aloft-1-elevation-ft
+
+
+
+
+ aloft-1-wind-from-heading-deg
+ 4
+ 1
+ 40
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[1]/wind-from-heading-deg
+ true
+
+ dialog-apply
+ aloft-1-wind-from-heading-deg
+
+
+
+
+ aloft-1-wind-speed-kt
+ 4
+ 2
+ 35
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[1]/wind-speed-kt
+ true
+
+ dialog-apply
+ aloft-1-wind-speed-kt
+
+
+
+
+ aloft-1-visibility-m
+ 4
+ 3
+ 55
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[1]/visibility-m
+ true
+
+ dialog-apply
+ aloft-1-visibility-m
+
+
+
+
+ aloft-1-temperature-degc
+ 4
+ 4
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[1]/temperature-degc
+ true
+
+ dialog-apply
+ aloft-1-temperature-degc
+
+
+
+
+ aloft-1-dewpoint-degc
+ 4
+ 5
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[1]/dewpoint-degc
+ true
+
+ dialog-apply
+ aloft-1-dewpoint-degc
+
+
+
+
+ aloft-0-elevation-ft
+ 5
+ 0
+ 52
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[0]/elevation-ft
+ true
+
+ dialog-apply
+ aloft-0-elevation-ft
+
+
+
+
+ aloft-0-wind-from-heading-deg
+ 5
+ 1
+ 40
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[0]/wind-from-heading-deg
+ true
+
+ dialog-apply
+ aloft-0-wind-from-heading-deg
+
+
+
+
+ aloft-0-wind-speed-kt
+ 5
+ 2
+ 35
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[0]/wind-speed-kt
+ true
+
+ dialog-apply
+ aloft-0-wind-speed-kt
+
+
+
+
+ aloft-0-visibility-m
+ 5
+ 3
+ 55
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[0]/visibility-m
+ true
+
+ dialog-apply
+ aloft-0-visibility-m
+
+
+
+
+ aloft-0-temperature-degc
+ 5
+ 4
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[0]/temperature-degc
+ true
+
+ dialog-apply
+ aloft-0-temperature-degc
+
+
+
+
+ aloft-0-dewpoint-degc
+ 5
+ 5
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/aloft/entry[0]/dewpoint-degc
+ true
+
+ dialog-apply
+ aloft-0-dewpoint-degc
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+ vbox
+ 1
+
+
+ hbox
+
+
+
+
+ true
+
+
+
+
+ hbox
+
+
+ table
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 1
+ 2
+
+
+
+
+ 0
+ 3
+
+
+
+
+ 0
+ 4
+
+
+
+
+ 0
+ 5
+
+
+
+
+ boundary-1-elevation-ft
+ 1
+ 0
+ 52
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[1]/elevation-ft
+ true
+
+ dialog-apply
+ boundary-1-elevation-ft
+
+
+
+
+ boundary-1-wind-from-heading-deg
+ 1
+ 1
+ 40
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[1]/wind-from-heading-deg
+ true
+
+ dialog-apply
+ boundary-1-wind-from-heading-deg
+
+
+
+
+ boundary-1-wind-speed-kt
+ 1
+ 2
+ 35
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[1]/wind-speed-kt
+ true
+
+ dialog-apply
+ boundary-1-wind-speed-kt
+
+
+
+
+ boundary-1-visibility-m
+ 1
+ 3
+ 55
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[1]/visibility-m
+ true
+
+ dialog-apply
+ boundary-1-visibility-m
+
+
+
+
+ boundary-1-temperature-degc
+ 1
+ 4
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[1]/temperature-degc
+ true
+
+ dialog-apply
+ boundary-1-temperature-degc
+
+
+
+
+ boundary-1-dewpoint-degc
+ 1
+ 5
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[1]/dewpoint-degc
+ true
+
+ dialog-apply
+ boundary-1-dewpoint-degc
+
+
+
+
+ boundary-0-elevation-ft
+ 2
+ 0
+ 52
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[0]/elevation-ft
+ true
+
+ dialog-apply
+ boundary-0-elevation-ft
+
+
+
+
+ boundary-0-wind-from-heading-deg
+ 2
+ 1
+ 40
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[0]/wind-from-heading-deg
+ true
+
+ dialog-apply
+ boundary-0-wind-from-heading-deg
+
+
+
+
+ boundary-0-wind-speed-kt
+ 2
+ 2
+ 35
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[0]/wind-speed-kt
+ true
+
+ dialog-apply
+ boundary-0-wind-speed-kt
+
+
+
+
+ boundary-0-visibility-m
+ 2
+ 3
+ 55
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[0]/visibility-m
+ true
+
+ dialog-apply
+ boundary-0-visibility-m
+
+
+
+
+ boundary-0-temperature-degc
+ 2
+ 4
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[0]/temperature-degc
+ true
+
+ dialog-apply
+ boundary-0-temperature-degc
+
+
+
+
+ boundary-0-dewpoint-degc
+ 2
+ 5
+ 60
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+ /environment/config/boundary/entry[0]/dewpoint-degc
+ true
+
+ dialog-apply
+ boundary-0-dewpoint-degc
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ vbox
+
+
+
+ hbox
+
+
+
+
+ true
+
+
+
+
+ hbox
+
+
+
+
+ source-selection
+ fill
+ true
+ sim/gui/dialogs/weather-scenario/source-selection
+
+ dialog-apply
+ source-selection
+
+
+ dialog-update
+ metar
+
+
+
+
+ metar-updates-winds-aloft
+ /environment/params/metar-updates-winds-aloft
+
+ true
+
+ dialog-apply
+ metar-updates-winds-aloft
+
+
+
+
+
+
+ description
+ fill
+ true
+ 180
+ 60
+ 20
+ false
+ true
+ true
+ sim/gui/dialogs/weather-scenario/description
+
+
+
+ hbox
+
+
+
+
+ true
+
+
+ /environment/metar/valid
+
+ true
+ false
+
+
+
+
+ metar
+ fill
+ true
+ 180
+ 50
+ 20
+ true
+ true
+ false
+ sim/gui/dialogs/weather-scenario/metar
+
+
+ /sim/gui/dialogs/weather-scenario/state
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gui/menubar.xml b/gui/menubar.xml
index 8126aa4ea..d13b2877c 100644
--- a/gui/menubar.xml
+++ b/gui/menubar.xml
@@ -1,10 +1,11 @@
+
@@ -193,7 +231,7 @@
-
-
+ H
property-assign
/sim/presets/trim
@@ -234,7 +272,7 @@
autopilot
-
-
+
dialog-show
autopilot
@@ -249,45 +287,42 @@
- -
+
-
nasal
-
- -
+
+
-
nasal
-
- -
-
-
- nasal
-
-
-
-
- -
-
-
- dialog-show
- map
-
-
+
+ -
+
+
+ nasal
+
+
+
+
+ -
+
+
+ dialog-show
+ logging
+
+
+
+
+
-
-
-
- dialog-show
- about
-
-
- -
-
+
old-help-dialog
@@ -606,7 +696,11 @@
-
-
+
+
+
+ -
+
nasal
@@ -622,7 +716,7 @@
-
-
+
nasal
@@ -630,15 +724,7 @@
-
-
-
- nasal
-
-
+
-
@@ -659,6 +745,14 @@
+
+ -
+
+
+ dialog-show
+ about
+
+
diff --git a/keyboard.xml b/keyboard.xml
index e4010ac4d..d61f3d731 100644
--- a/keyboard.xml
+++ b/keyboard.xml
@@ -272,7 +272,7 @@ top down before the key bindings are parsed.
SPACE
- PTT - Push To Talk (via VoIP)
+ PTT - Push To Talk (via FGCom)
nasal
diff --git a/preferences.xml b/preferences.xml
index 5a01e6347..df1e8b200 100644
--- a/preferences.xml
+++ b/preferences.xml
@@ -148,6 +148,7 @@ Started September 2000 by David Megginson, david@megginson.com
0
0
+ 0
0
0
0
@@ -290,6 +291,14 @@ Started September 2000 by David Megginson, david@megginson.com
Aircraft/Generic/generic-autopilot-helper.xml
+
+ Environment METAR Interpolation Rule
+ Environment/metarinterpolator.xml
+
+
+ Environment Interpolation Rule
+ Environment/interpolator.xml
+
Aircraft/Generic/generic-instrumentation.xml