From 80eb4f44caf843503bf8f7f5488005af18da1c80 Mon Sep 17 00:00:00 2001 From: ThorstenB <brehmt@gmail.com> Date: Sun, 10 Oct 2010 14:05:42 +0200 Subject: [PATCH 01/14] Fixed "Position aircraft in air" in dialog. Setting a parking position (e.g. by default via command-line) caused "Position aircraft in air" to not work as expected. The "parkpos" property must be reset, otherwise heading/glidepath/azimuth do not have any effect when repositioning. --- gui/dialogs/location-in-air.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gui/dialogs/location-in-air.xml b/gui/dialogs/location-in-air.xml index 63e104414..ce16f3fae 100644 --- a/gui/dialogs/location-in-air.xml +++ b/gui/dialogs/location-in-air.xml @@ -260,6 +260,8 @@ <binding> <command>nasal</command> <script> + setprop("/sim/presets/parkpos", ""); + if (!mode.airport.getBoolValue()) { setprop("/sim/presets/airport-id", ""); setprop("/sim/presets/runway", ""); From 757ec0e6bed0efe42162fe32a15f620b8fdd306b Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Fri, 29 Oct 2010 20:39:40 +0200 Subject: [PATCH 02/14] preferences.xml: Manual revert of unintended changes from Alexis merge. --- preferences.xml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/preferences.xml b/preferences.xml index 940cbd3bc..334cfa354 100644 --- a/preferences.xml +++ b/preferences.xml @@ -54,7 +54,7 @@ Started September 2000 by David Megginson, david@megginson.com <terminal-ansi-colors type="bool">true</terminal-ansi-colors> <season type="string">summer</season> </startup> - <rendering> <multithreading-mode>AutomaticSelection</multithreading-mode> + <rendering> <debug type="bool">false</debug> <realism>5</realism> <filtering>8</filtering> @@ -281,12 +281,11 @@ Started September 2000 by David Megginson, david@megginson.com <systems> <path>Aircraft/Generic/generic-systems.xml</path> <autopilot> + <name>generic autopilot</name> <path>Aircraft/Generic/generic-autopilot.xml</path> </autopilot> - <!-- - replace the hard coded helpers, which are gone now - --> <autopilot> + <name>autopilot helpers</name> <path>Aircraft/Generic/generic-autopilot-helper.xml</path> </autopilot> <property-rule> @@ -593,7 +592,7 @@ Started September 2000 by David Megginson, david@megginson.com </airport> <atc> - <enabled type="bool">false</enabled> + <enabled type="bool">true</enabled> </atc> <ai-traffic> @@ -602,7 +601,7 @@ Started September 2000 by David Megginson, david@megginson.com </ai-traffic> <traffic-manager> - <enabled type="bool">false</enabled> + <enabled type="bool">true</enabled> <heuristics type="bool">true</heuristics> <datafile type="string"></datafile> <instantaneous-action type="bool">false</instantaneous-action> @@ -612,13 +611,12 @@ Started September 2000 by David Megginson, david@megginson.com <ai> <enabled type="bool">true</enabled> - <!-- <scenario>nimitz_demo</scenario> --> + <scenario>nimitz_demo</scenario> <!-- <scenario>balloon_demo</scenario> --> <!-- <scenario>aircraft_demo</scenario> --> <!-- <scenario>refueling_demo</scenario> --> <!-- <scenario>lead_aircraft</scenario> --> <!-- <scenario>vinson_demo</scenario> --> - <!-- <scenario>mp-carriers</scenario> --> </ai> <multiplay> From 357335521b76c6c2b3eb9b01d3747db25ec5673a Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Fri, 29 Oct 2010 20:40:18 +0200 Subject: [PATCH 03/14] joysticks.xml: Manual revert of unintended changes from Alexis merge. --- joysticks.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/joysticks.xml b/joysticks.xml index 3f800d4d3..0062f800e 100644 --- a/joysticks.xml +++ b/joysticks.xml @@ -20,5 +20,4 @@ <js n="0" include="Input/Joysticks/Local/joystick_0.xml"/> --> - <js-named include="Input/Joysticks/ThrustMaster/joystick-hotas.xml"/> </PropertyList> From d373245285aab944aef3bdb1165b3751e5d28b92 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Mon, 17 May 2010 21:51:16 +0200 Subject: [PATCH 04/14] Nasal/controls.nas: Added per-engine axis handlers. --- Nasal/controls.nas | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Nasal/controls.nas b/Nasal/controls.nas index 016a35402..2d3f41441 100644 --- a/Nasal/controls.nas +++ b/Nasal/controls.nas @@ -74,6 +74,51 @@ var mixtureAxis = axisHandler("/controls/engines/engine[", "]/mixture"); var propellerAxis = axisHandler("/controls/engines/engine[", "]/propeller-pitch"); var carbHeatAxis = axisHandler("/controls/anti-ice/engine[", "]/carb-heat"); +# Joystick axis handler for controlling subsets of similar properties. +# Shouldn't be called from other contexts. +# The argument engine can be either an index number or a list of +# index numbers. +# Use only when perEngineSelectedAxisHandler() below will not do. +var perIndexAxisHandler = func(pre, post) { + return + func(index, invert = 0) { + var val = cmdarg().getNode("setting").getValue(); + if(invert) val = -val; + if (typeof(index) == "scalar") { + setprop(pre ~ index ~ post, (1 - val) / 2); + } else { + foreach (var e; index) { + setprop(pre ~ e ~ post, (1 - val) / 2); + } + } + }; +} + +# Joystick axis handler for controlling a selected axis on specific engines. +# Shouldn't be called from other contexts. +# The argument mode can be +# 0 - throttle +# 1 - mixture +# 2 - propeller-pitch +# The argument engine to the returned function can be either an +# engine number or a list of engine numbers. +# Usage example (controlling the mixture of engines 1 and 2): +# <script> +# controls.perEngineSelectedAxisHandler(1)([1,2]); +# </script> +var _axisMode = { + 0: perIndexAxisHandler("/controls/engines/engine[", + "]/throttle"), + 1: perIndexAxisHandler("/controls/engines/engine[", + "]/mixture"), + 2: perIndexAxisHandler("/controls/engines/engine[", + "]/propeller-pitch") +}; +var perEngineSelectedAxisHandler = func(mode) { + return _axisMode[mode]; +} + + ## # Wrapper around stepProps() which emulates the "old" flap behavior for # configurations that aren't using the new mechanism. From 00cbdf38b79b231a7b17393f7494398843c802e9 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Sat, 30 Oct 2010 13:31:15 +0200 Subject: [PATCH 05/14] Input/Joysticks/Saitek/Aviator.xml: Improved the joystick configuration. - Prepared all bindings for per-OS number selection - Use the new per-engine axis handlers. - Added missing var keywords. --- Input/Joysticks/Saitek/Aviator.xml | 206 ++++++++++++++++++++++------- 1 file changed, 159 insertions(+), 47 deletions(-) diff --git a/Input/Joysticks/Saitek/Aviator.xml b/Input/Joysticks/Saitek/Aviator.xml index 4d3febc29..1f0e6b23b 100644 --- a/Input/Joysticks/Saitek/Aviator.xml +++ b/Input/Joysticks/Saitek/Aviator.xml @@ -1,9 +1,8 @@ <?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="joystick.xsl"?> -<!-- $Id$ --> <!-- Saitek AV8R/Aviator - Copyright (C) 2007 - 2009 Anders Gidenstam (anders(at)gidenstam.org) + Copyright (C) 2007 - 2010 Anders Gidenstam (anders(at)gidenstam.org) This file is released under the GPL license v2 or later. --> <PropertyList> @@ -21,18 +20,27 @@ # TM0: All selected; TM1: #1 & #2; TM2: #3 & #4 var engine_axis_mode = 0; # Valid only in TM1 and TM2. - # EA0: throttle, +mod: propeller - # EA1: propeller, +mod: throttle + # EA0: throttle + # EA1: mixture + # EA2: propeller var quick_view_active = 0; var old_view = view.point.save(); var pressed = [0,0,0,0,0,0,0,0,0,0,0,0]; + # Map engines to throttles for TM1 (0, 1) and TM2 (2, 3) var engine = [0, 1, 2, 3]; - # Do per-aircraft modifications - if (getprop("/sim/model/path") == - "Aircraft/Short_Empire/Models/Short_Empire-model.xml") { + # Do per-aircraft modifications + if (contains({"Aircraft/Short_Empire/Models/Short_Empire-model.xml" : 0, + "Aircraft/Lockheed1049/Models/Lockheed1049_twa.xml" : 0}, + getprop("/sim/model/path"))) { + # TM1: the outer engines, TM2: the inner engines engine = [0, 3, 1, 2]; } + if (contains({"Aircraft/DO-X/Models/dox.xml" : 0}, + getprop("/sim/model/path"))) { + engine = [[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], + [0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]; + } var goal_heading_offset = @@ -46,7 +54,7 @@ var kbdalt = props.globals.getNode("/devices/status/keyboard/alt", 1); var quick_view = func { - dir = arg[0]; + var dir = arg[0]; if (dir == 0) { quick_view_active = 0; view.point.move(old_view, 0.1); @@ -99,7 +107,13 @@ </nasal> <!-- Analog axis 0. Aileron --> - <axis n="0"> + <axis> + <name>Stick left/right</name> + <number> + <unix>0</unix> + <mac>0</mac> + <windows>0</windows> + </number> <desc>aileron</desc> <binding> <command>property-scale</command> @@ -111,7 +125,13 @@ </axis> <!-- Analog axis 1. Elevator --> - <axis n="1"> + <axis> + <name>Stick forward/back</name> + <number> + <unix>1</unix> + <mac>1</mac> + <windows>1</windows> + </number> <desc>elevator</desc> <binding> <command>property-scale</command> @@ -125,6 +145,7 @@ <!-- Analog axis 3. Rudder --> <axis> + <name>Stick twist</name> <number> <unix>3</unix> <mac>2</mac> @@ -139,10 +160,18 @@ <factor type="double">1.0</factor> <squared type="bool">true</squared> </binding> + <!-- binding> + <command>nasal</command> + <script> + setprop("sim/current-view/goal-heading-offset-deg", + -90.0*cmdarg().getNode("setting").getValue()); + </script> + </binding --> </axis> <!-- Analog axis 2. Throttle 1 --> <axis> + <name>Left throttle</name> <number> <unix>2</unix> <mac>3</mac> @@ -155,43 +184,43 @@ if (engine_select_mode == 0) { controls.throttleAxis(); } else { - var val = cmdarg().getNode("setting").getValue(); - var ctrl_pp = - "/controls/engines/engine[" ~ - ((engine_select_mode == 1) ? engine[0] : engine[2]) ~ "]/" ~ - (engine_axis_mode ? "propeller-pitch" : "throttle"); - setprop(ctrl_pp, (1 - val)/2); + controls.perEngineSelectedAxisHandler(engine_axis_mode) + ((engine_select_mode == 1) ? engine[0] : engine[2]); } </script> </binding> </axis> <!-- Analog axis 4. Throttle 2 --> - <axis n="4"> - <desc>TM0: mixture, +mod: propeller pitch, TM1: throttle/propeller 2, TM2: throttle/propeller 4</desc> + <axis> + <name>Right throttle</name> + <number> + <unix>4</unix> + <mac>4</mac> + <windows>4</windows> + </number> + <desc>TM0: mixture, TM1: throttle/propeller 2, TM2: throttle/propeller 4</desc> <binding> <command>nasal</command> <script> if (engine_select_mode == 0) { - if (!modifier) { - controls.mixtureAxis(); - } else { - controls.propellerAxis(); - } + controls.mixtureAxis(); } else { - var val = cmdarg().getNode("setting").getValue(); - var ctrl_pp = - "/controls/engines/engine[" ~ - ((engine_select_mode == 1) ? engine[1] : engine[3]) ~ "]/" ~ - (engine_axis_mode ? "propeller-pitch" : "throttle"); - setprop(ctrl_pp, (1 - val)/2); + controls.perEngineSelectedAxisHandler(engine_axis_mode) + ((engine_select_mode == 1) ? engine[1] : engine[3]); } </script> </binding> </axis> <!-- Axis 5. Hat left/right --> - <axis n="5"> + <axis> + <name>Hat left/right</name> + <number> + <unix>5</unix> + <mac>5</mac> + <windows>5</windows> + </number> <desc>quick view left/right, +mod: horizontal view pan</desc> <low> <repeatable type="bool">true</repeatable> @@ -238,10 +267,12 @@ <binding> <command>nasal</command> <script> + <![CDATA[ trace("Axis 5, Hat: low released!"); if (!modifier) { quick_view(0); } + ]]> </script> </binding> </mod-up> @@ -249,7 +280,13 @@ </axis> <!-- Axis 6. Hat up/down --> - <axis n="6"> + <axis> + <name>Hat up/down</name> + <number> + <unix>6</unix> + <mac>6</mac> + <windows>6</windows> + </number> <desc>view reset/quick view front, +mod: vertical view pan</desc> <low> <repeatable type="bool">true</repeatable> @@ -270,9 +307,11 @@ <binding> <command>nasal</command> <script> + <![CDATA[ if (!modifier) { #quick_view(0); } + ]]> </script> </binding> </mod-up> @@ -296,9 +335,11 @@ <binding> <command>nasal</command> <script> + <![CDATA[ if (!modifier) { quick_view(0); } + ]]> </script> </binding> </mod-up> @@ -306,8 +347,13 @@ </axis> <!-- Trigger Button --> - <button n="0"> + <button> <name>Trigger</name> + <number> + <unix>0</unix> + <mac>0</mac> + <windows>0</windows> + </number> <desc>function modifier (mod)</desc> <binding> <command>nasal</command> @@ -327,8 +373,13 @@ </button> <!-- Center Button --> - <button n="2"> + <button> <name>Center button</name> + <number> + <unix>2</unix> + <mac>2</mac> + <windows>2</windows> + </number> <desc>brakes, +mod: Toggle parking brake</desc> <binding> <command>nasal</command> @@ -352,8 +403,13 @@ </button> <!-- Left Button --> - <button n="1"> + <button> <name>Left button</name> + <number> + <unix>1</unix> + <mac>1</mac> + <windows>1</windows> + </number> <desc>left brake, +mod: PTT</desc> <binding> <command>nasal</command> @@ -378,8 +434,13 @@ </button> <!-- Right Button --> - <button n="3"> + <button> <name>Right button</name> + <number> + <unix>3</unix> + <mac>3</mac> + <windows>3</windows> + </number> <desc>right brake, +mod: trigger</desc> <binding> <command>nasal</command> @@ -404,8 +465,13 @@ </button> <!-- Button: T1 --> - <button n="4"> + <button> <name>T1</name> + <number> + <unix>4</unix> + <mac>4</mac> + <windows>4</windows> + </number> <desc>next view, +mod: zoom in +Shift: next weapon</desc> <repeatable type="bool">true</repeatable> <binding> @@ -442,8 +508,13 @@ </button> <!-- Button: T2 --> - <button n="5"> + <button> <name>T2</name> + <number> + <unix>5</unix> + <mac>5</mac> + <windows>5</windows> + </number> <desc>previous view, +mod: zoom out, +Shift: previous weapon</desc> <repeatable type="bool">true</repeatable> <binding> @@ -480,8 +551,13 @@ </button> <!-- Button: T3 --> - <button n="6"> + <button> <name>T3</name> + <number> + <unix>6</unix> + <mac>6</mac> + <windows>6</windows> + </number> <desc>trim nose down, +mod: disarm speed brakes</desc> <repeatable type="bool">true</repeatable> <binding> @@ -498,8 +574,13 @@ </button> <!-- Button: T4 --> - <button n="7"> + <button> <name>T4</name> + <number> + <unix>7</unix> + <mac>7</mac> + <windows>7</windows> + </number> <desc>trim nose up, +mod: deploy speed brakes</desc> <repeatable type="bool">true</repeatable> <binding> @@ -516,8 +597,13 @@ </button> <!-- Button: T5 --> - <button n="8"> + <button> <name>T5</name> + <number> + <unix>8</unix> + <mac>8</mac> + <windows>8</windows> + </number> <desc>retract flaps one step, +mod: gear up</desc> <binding> <command>nasal</command> @@ -542,8 +628,13 @@ </button> <!-- Button: T6 --> - <button n="9"> + <button> <name>T6</name> + <number> + <unix>9</unix> + <mac>9</mac> + <windows>9</windows> + </number> <desc>deploy flaps one step, +mod: gear down</desc> <binding> <command>nasal</command> @@ -568,8 +659,13 @@ </button> <!-- Button: T7 --> - <button n="10"> + <button> <name>T7</name> + <number> + <unix>10</unix> + <mac>10</mac> + <windows>10</windows> + </number> <desc>Increase magnetos, +mod: Engine throttle/propeller axis swap</desc> <binding> <command>nasal</command> @@ -578,14 +674,19 @@ if (!modifier) { controls.stepMagnetos(1); } else { - engine_axis_mode = !engine_axis_mode; + engine_axis_mode = 2*!engine_axis_mode; } </script> </binding> </button> <!-- Button: T8 --> - <button n="11"> + <button> + <number> + <unix>11</unix> + <mac>11</mac> + <windows>11</windows> + </number> <name>T8</name> <desc>Decrease magnetos, +mod: Engine throttle/propeller axis swap</desc> <binding> @@ -595,15 +696,20 @@ if (!modifier) { controls.stepMagnetos(-1); } else { - engine_axis_mode = !engine_axis_mode; + engine_axis_mode = 2*!engine_axis_mode; } </script> </binding> </button> <!-- Button: 3-way Mode switch --> - <button n="12"> + <button> <name>Mode 1</name> + <number> + <unix>12</unix> + <mac>12</mac> + <windows>12</windows> + </number> <desc>Engine 0/1 throttle mode</desc> <binding> <command>nasal</command> @@ -622,7 +728,13 @@ </binding> </mod-up> </button> - <button n="13"> + <button> + <name>Mode 2</name> + <number> + <unix>13</unix> + <mac>13</mac> + <windows>13</windows> + </number> <name>Mode 2</name> <desc>Engine 2/3 throttle mode</desc> <binding> From 81e0e06a31d905f23b15610a2ce925bcfeabea52 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Sat, 30 Oct 2010 16:42:07 +0200 Subject: [PATCH 06/14] Input/Joysticks/Saitek/Pro-Flight-Quadrant.xml: - Improved multi-mode axis control with the new per-engine axis handlers. - Prepared all bindings for per-OS number selection --- .../Joysticks/Saitek/Pro-Flight-Quadrant.xml | 237 ++++++++++++++++-- 1 file changed, 221 insertions(+), 16 deletions(-) diff --git a/Input/Joysticks/Saitek/Pro-Flight-Quadrant.xml b/Input/Joysticks/Saitek/Pro-Flight-Quadrant.xml index a0ba91fee..bb9ac4ccd 100644 --- a/Input/Joysticks/Saitek/Pro-Flight-Quadrant.xml +++ b/Input/Joysticks/Saitek/Pro-Flight-Quadrant.xml @@ -1,35 +1,122 @@ <?xml version="1.0"?> <!-- Saitek Pro Flight Quadrant - Copyright (C) 2008 Ronald Jensen (wino(at)jentronics.com) - This file is released under the GPL license. + Copyright (C) 2008 Ronald Jensen (wino(at)jentronics.com) + Copyright (C) 2009 - 2010 Anders Gidenstam (anders(at)gidenstam.org) + This file is released under the GPL license version 2. --> <PropertyList> <name>Saitek Saitek Pro Flight Quadrant</name> <name>Saitek Pro Flight Quadrant</name> <name>Saitek Pro Flight Throttle Quadrant</name> - <axis n="0"> - <desc>Throttle</desc> + + <nasal> + <script> + <![CDATA[ + var self = cmdarg().getParent(); + var data = self.getNode("data"); + var engine_select_mode = 0; + # TM0: All selected; TM1: #1-#3; TM2: #3-#6 + var engine_axis_mode = 0; + # Valid only in TM1 and TM2. + # EA0: throttle + # EA1: mixure + # EA2: propeller + var pressed = [0,0,0,0,0,0]; + var engine = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + + # Do per-aircraft modifications + if (contains({"Aircraft/Short_Empire/Models/Short_Empire-model.xml" : 0, + "Aircraft/Lockheed1049/Models/Lockheed1049_twa.xml" : 0}, + getprop("/sim/model/path"))) { + # Map port outer to axis 0, starboard outer to axis 2 and + # the inner engines to axis 1. + engine = [0, [1, 2], 3]; + } + if (contains({"Aircraft/DO-X/Models/dox.xml" : 0}, + getprop("/sim/model/path"))) { + engine = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]; + } + if (contains({"Aircraft/Nordstern/Models/Nordstern.xml" : 0}, + getprop("/sim/model/path"))) { + engine = [0, 1, [2, 3]]; + } + + var kbdctrl = props.globals.getNode("/devices/status/keyboard/ctrl", 1); + var kbdalt = props.globals.getNode("/devices/status/keyboard/alt", 1); + + var axis_handler = func(axis) { + if (engine_select_mode == 0) { + if (axis == 0) { + controls.throttleAxis(); + } elsif (axis == 1) { + controls.propellerAxis(); + } elsif (axis == 2) { + controls.mixtureAxis(); + } + } else { + controls.perEngineSelectedAxisHandler(engine_axis_mode) + (engine[axis + 3*(engine_select_mode - 1)]); + } + } + + var trace = func(str) { + # Uncomment the line below to trace button presses. + #print("Pro-Flight-Quadrant.xml: " ~ str); + } + ]]> + </script> + </nasal> + + <!-- Levers left to right. --> + <axis> + <name>Left lever</name> + <number> + <unix>0</unix> + <mac>0</mac> + <windows>0</windows> + </number> + <desc>TM0: throttle, TM1: throttle/propeller 1, TM2: throttle/propeller 4</desc> <binding> <command>nasal</command> - <script>controls.throttleAxis()</script> + <script>axis_handler(0)</script> </binding> </axis> - <axis n="1"> - <desc>Prop Pitch</desc> + <axis> + <name>Middle lever</name> + <number> + <unix>1</unix> + <mac>1</mac> + <windows>1</windows> + </number> + <desc>TM0: propeller, TM1: throttle/propeller 2, TM2: throttle/propeller 5</desc> <binding> <command>nasal</command> - <script>controls.propellerAxis()</script> + <script>axis_handler(1)</script> </binding> </axis> - <axis n="2"> - <desc>Mixture </desc> + <axis> + <name>Right lever</name> + <number> + <unix>2</unix> + <mac>2</mac> + <windows>2</windows> + </number> + <desc>TM0: mixture, TM1: throttle/propeller 3, TM2: throttle/propeller 6</desc> <binding> <command>nasal</command> - <script>controls.mixtureAxis()</script> + <script>axis_handler(2)</script> </binding> </axis> - <button n="0"> + + <!-- 2-way rocker switches. Left to right. --> + <button> + <name>Left button up</name> + <number> + <unix>0</unix> + <mac>0</mac> + <windows>0</windows> + </number> <desc>Flaps up</desc> <repeatable>false</repeatable> <binding> @@ -42,14 +129,40 @@ <script>controls.flapsDown(0)</script> </binding> </mod-up> + <mod-shift> + <binding> + <command>nasal</command> + <script> + trace("Button 0 + shift pressed!"); + gui.popupTip("Saitek Quadrant: Throttle Mode 1"); + engine_select_mode = 1; + </script> + </binding> + </mod-shift> </button> <button n="1"> + <name>Left button down</name> + <number> + <unix>1</unix> + <mac>1</mac> + <windows>1</windows> + </number> <desc>Flaps down</desc> <repeatable>false</repeatable> <binding> <command>nasal</command> <script>controls.flapsDown(1)</script> </binding> + <mod-shift> + <binding> + <command>nasal</command> + <script> + trace("Button 1 + shift pressed!"); + gui.popupTip("Saitek Quadrant: Throttle Mode 0"); + engine_select_mode = 0; + </script> + </binding> + </mod-shift> <mod-up> <binding> <command>nasal</command> @@ -57,23 +170,64 @@ </binding> </mod-up> </button> - <button n="2"> + + <button> + <name>Middle button up</name> + <number> + <unix>2</unix> + <mac>2</mac> + <windows>2</windows> + </number> <desc>Elevator trim up</desc> <repeatable>true</repeatable> <binding> <command>nasal</command> <script>controls.elevatorTrim(-0.75)</script> </binding> + <mod-shift> + <binding> + <command>nasal</command> + <script> + trace("Button 2 + shift pressed!"); + if (engine_select_mode) gui.popupTip("Saitek Quadrant: Throttle control"); + engine_axis_mode = 0; + </script> + </binding> + </mod-shift> </button> - <button n="3"> + <button> + <name>Middle button down</name> + <number> + <unix>3</unix> + <mac>3</mac> + <windows>3</windows> + </number> <desc>Elevator trim down</desc> <repeatable>true</repeatable> <binding> <command>nasal</command> <script>controls.elevatorTrim(0.75)</script> </binding> + <mod-shift> + <binding> + <command>nasal</command> + <script> + trace("Button 3 + shift pressed!"); + if (engine_select_mode) + gui.popupTip("Saitek Quadrant: Propeller control"); + engine_axis_mode = 2; + </script> + </binding> + </mod-shift> </button> - <button n="4"> + + <button> + <name>Right button up</name> + <number> + <unix>4</unix> + <mac>4</mac> + <windows>4</windows> + </number> <desc>Gear up</desc> <repeatable>false</repeatable> <binding> @@ -81,7 +235,13 @@ <script>controls.gearDown(-1)</script> </binding> </button> - <button n="5"> + <button> + <name>Right button down</name> + <number> + <unix>5</unix> + <mac>5</mac> + <windows>5</windows> + </number> <desc>Gear down</desc> <repeatable>false</repeatable> <binding> @@ -89,4 +249,49 @@ <script>controls.gearDown(1)</script> </binding> </button> + + <!-- Axis reverse area switches. --> + <button> + <name>Left lever reverse</name> + <number> + <unix>6</unix> + <mac>6</mac> + <windows>6</windows> + </number> + <desc></desc> + <repeatable>false</repeatable> + <binding> + <command>nasal</command> + <script></script> + </binding> + </button> + <button> + <name>Middle lever reverse</name> + <number> + <unix>7</unix> + <mac>7</mac> + <windows>7</windows> + </number> + <desc></desc> + <repeatable>false</repeatable> + <binding> + <command>nasal</command> + <script></script> + </binding> + </button> + <button> + <name>Right lever reverse</name> + <number> + <unix>8</unix> + <mac>8</mac> + <windows>8</windows> + </number> + <desc></desc> + <repeatable>false</repeatable> + <binding> + <command>nasal</command> + <script></script> + </binding> + </button> + </PropertyList> From 1ff1469fc11f70dd18bb02cd3dacfac9854d5942 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Sun, 31 Oct 2010 12:29:02 +0100 Subject: [PATCH 07/14] Updated WalkView: - Added a default key binding file. - Improved the documentation. --- Aircraft/Generic/WalkView/walk-view-keys.xml | 198 +++++++++++++++++++ Aircraft/Generic/WalkView/walkview.nas | 7 +- 2 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 Aircraft/Generic/WalkView/walk-view-keys.xml diff --git a/Aircraft/Generic/WalkView/walk-view-keys.xml b/Aircraft/Generic/WalkView/walk-view-keys.xml new file mode 100644 index 000000000..5471e9026 --- /dev/null +++ b/Aircraft/Generic/WalkView/walk-view-keys.xml @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Walk view module for FlightGear. + + Copyright (C) 2010 Anders Gidenstam (anders(at)gidenstam.org) + This file is licensed under the GPL license v2 or later. +--> +<PropertyList> + + <!-- + This module can be used to add suitable key bindings for walk views + to any aircraft. + + Usage example: + + Include it in the keybord section of the aircraft's -set file. + + <keyboard include="../Generic/WalkView/walk-view-keys.xml"> + + + Note: If the aircraft use other custom key bindings for the same keys + the walk view bindings should be merged into the aircraft specific + bindings. The walk view API commands return false if not currently + in a walk view so the other alternative action can be put in an + if statement. E.g. + if (!walkview.forward(4.0)) { + # Perform the non-walk view action of this key. + } + --> + + <!-- Keyboard commands --> + <key n="87"> + <name>W</name> + <desc>Walk view: Run forward.</desc> + <binding> + <command>nasal</command> + <script> + if (!walkview.forward(4.0)) { + } + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.forward(0); + </script> + </binding> + </mod-up> + </key> + + <key n="119"> + <name>w</name> + <desc>Walk view: Walk forward.</desc> + <binding> + <command>nasal</command> + <script> + if (!walkview.forward(1.0)) { + } + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.forward(0); + </script> + </binding> + </mod-up> + </key> + + <key n="100"> + <name>d</name> + <desc>Walk view: Side step right.</desc> + <repeatable type="bool">true</repeatable> + <binding> + <command>nasal</command> + <script> + if (!walkview.side_step(0.5)) { + } + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.side_step(0); + </script> + </binding> + </mod-up> + </key> + + <key n="68"> + <name>D</name> + <desc>Walk view: Fast side step right.</desc> + <repeatable type="bool">true</repeatable> + <binding> + <command>nasal</command> + <script> + if (!walkview.side_step(1.0)) { + } + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.side_step(0); + </script> + </binding> + </mod-up> + </key> + + <key n="97"> + <name>a</name> + <desc>Walk view: Side step left.</desc> + <repeatable type="bool">true</repeatable> + <binding> + <command>nasal</command> + <script> + if (!walkview.side_step(-0.5)) { + } + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.side_step(0); + </script> + </binding> + </mod-up> + </key> + <key n="65"> + <name>A</name> + <desc>Walk view: Fast side step left.</desc> + <repeatable type="bool">true</repeatable> + <binding> + <command>nasal</command> + <script> + if (!walkview.side_step(-1.0)) { + } + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.side_step(0); + </script> + </binding> + </mod-up> + </key> + + <key n="115"> + <name>s</name> + <desc>Walk view: Walk backwards.</desc> + <binding> + <command>nasal</command> + <script> + if (!walkview.forward(-1.0)) { + controls.startEngine(1); + } + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.forward(0); + controls.startEngine(0); + </script> + </binding> + </mod-up> + </key> + <!-- Remove this if you for some reason have 2d panels and want the default + Swap panels function on 'S'. + --> + <!-- key n="83"> + <name>S</name> + <desc>Walk view: Walk backwards.</desc> + <binding> + <command>nasal</command> + <script> + walkview.forward(-1.0); + </script> + </binding> + <mod-up> + <binding> + <command>nasal</command> + <script> + walkview.forward(0); + </script> + </binding> + </mod-up> + </key --> + +</PropertyList> diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index cecd081c6..105015900 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -100,7 +100,8 @@ var active_walker = func { # NOTES: # Currently there can only be one view manager per view so the # walk view should not have any other view manager. -# +# See Aircraft/Nordstern, Aircraft/Short_Empire or Aircraft/ZLT-NT +# for working examples of walk views. var walker = { new : func (view_name, constraints = nil, managers = nil) { var obj = { parents : [walker] }; @@ -124,7 +125,7 @@ var walker = { view.manager.register(view_name, obj); walkers[obj.view.getPath()] = obj; - debug.dump(obj); + #debug.dump(obj); return obj; }, active : func { @@ -216,6 +217,8 @@ var walker = { ############################################################################### # Constraint classes. Determines where the view can walk. +# + # The union of two constraints. # c1, c2 - the constraints : constraint From e00d8d30ea3c36875c7fd70b36ca6e91beb106dc Mon Sep 17 00:00:00 2001 From: Detlef Faber <don@Pasyphae.(none)> Date: Sun, 31 Oct 2010 16:36:20 +0100 Subject: [PATCH 08/14] generic logos: add Logo of the day >:) --- Aircraft/Generic/Logos/pumpkin.png | Bin 0 -> 57809 bytes Aircraft/Generic/Logos/pumpkin.xml | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 Aircraft/Generic/Logos/pumpkin.png create mode 100644 Aircraft/Generic/Logos/pumpkin.xml diff --git a/Aircraft/Generic/Logos/pumpkin.png b/Aircraft/Generic/Logos/pumpkin.png new file mode 100644 index 0000000000000000000000000000000000000000..98edaa7b7ec2a54d7b01add92a9e9c8d51b90013 GIT binary patch literal 57809 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�hkS$j$}}VeZ}&9*rs$Tm=|Z9g<3?S=PfPFY z;_u$1ZEvwi<UGr^I#D;ghfF4c9%Cb(y+2L{o;s20<%-S70EE?aO%)9J(lqdb?xvKg zI|bNSUw<<{==n*EBMKe_jrH|QjM%}f=$HnyX<SG)!b!R+WsTjMS8P;Z^p;_LuF>li z&t5EU5K9Zcr$Ob*t?d`b3UcE%c5+6;bdVKT?cskJX&yVqb1(Le59=Ouc$3(iO1h}Y z>rG7AFe^A+JG{};fF$I~>VM>Q(izIqnm0FmmP`5XoD(syUaj2MTUJ``K9ko?2Bp#M zP?hdUK~W!yqwB{_GUSXIZoFTE%cCd<)<o3<nY;r(mvRKkypxfZ+dHm9eD370h}SRP zauJP>5}1r}%5xbG9H@KhMZ#s_G`g8C!@4<K&S-kl(KOvu;k&DNe$Lz@vm}J(rH`na z8LO`m&@VH97Z;UHjHd-O08PNJ>(K-BA0uGT$<A^W$uKB3Y2(g&<-4xBslG3q^$J<M z<<l>5|G)+sm6hKF5D^O2o~ax0VZjt$eiEkI@~3(2dUM&bP4aGSV=Frxfk*RuBHs2d ztX04+NPkB&CtL5gdvriAp>ECE{x&ZK>)ZP6%!vcY`zE5{;o_|{Ju;_kBJmufr-imW z1&!LacKEA9MPhoD^cgZ?M!EbXT{HkFfx5UR3e8LW1uf;-21#@qG3Yrbfdt3pDQo#* z8U=~Jf0zE(>eH}k8_?CKTXOXp@4YASp63*l8G-D<b2&4VQmXWt6!u-|m3<e#3j0dq zqh&@^_ENy0YVdDybYsMa=m<giM=b}pGCR8jJG&(3z69eW4!I-+^QLdUf$+shd@fC? zf~XY&I-)N)wcy4VVYnB+kg)d?EkYlW^>=wU^|(dXb~C=W66lHCZ|_KDuZjThF>8zc z=g3NUtfV8;iQdk9W&3k1qX+ejpn(@j+(Xi-%MF8)Zo4s<5XrVGAJRrZ)C<kXe4yO# zr0wNH7uZfBtp=<NlF)y9XdV0XGL=SBWJb)Cmd;y@-G&_d+==Q7_Sl}xQiDuzA(o}Z za?`7hbTb+ejv9p)WUfTc@+7U_`-b%+)l(V_lepB71f+C)(Es0yS=YI6003~Oqp9}n jfA!%1m7A$v--hJjJ&01KFpt7@1VHDBfo8Qj4Eg^683ZmE literal 0 HcmV?d00001 diff --git a/Aircraft/Generic/Logos/pumpkin.xml b/Aircraft/Generic/Logos/pumpkin.xml new file mode 100644 index 000000000..fe685794d --- /dev/null +++ b/Aircraft/Generic/Logos/pumpkin.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> + +<PropertyList> +<sim> + <model> + <logo> + <name type="string">Pumpkin</name> + <texture>../../Generic/Logos/pumpkin.png</texture> + </logo> + </model> +</sim> +</PropertyList> From 4692db87d6504664b724fce62792f78d9e1bc561 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Sun, 31 Oct 2010 22:06:44 +0100 Subject: [PATCH 09/14] Updated WalkView: Added a more general area constraint: linePlane. --- Aircraft/Generic/WalkView/walkview.nas | 94 +++++++++++++++++++++----- 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index 105015900..8ed1bb61f 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -97,11 +97,12 @@ var active_walker = func { # [19.5, 0.3, -8.85]); # var walker = walkview.walker.new("Passenger View", constraint); # +# See Aircraft/Nordstern, Aircraft/Short_Empire and Aircraft/ZLT-NT +# for working examples of walk views. +# # NOTES: # Currently there can only be one view manager per view so the # walk view should not have any other view manager. -# See Aircraft/Nordstern, Aircraft/Short_Empire or Aircraft/ZLT-NT -# for working examples of walk views. var walker = { new : func (view_name, constraints = nil, managers = nil) { var obj = { parents : [walker] }; @@ -259,26 +260,55 @@ var makeUnionConstraint = func (cs) { return ret; } +# Rectangular plane defined by a straight line and a width. +# The line is extruded horizontally on each side by width/2 into a +# planar surface. +# p1, p2 - the line endpoints. +# width - total width of the plane. +var linePlane = { + new : func (p1, p2, width) { + var obj = { parents : [linePlane] }; + obj.p1 = p1; + obj.p2 = p2; + obj.halfwidth = width/2; + obj.length = vec2.length(vec2.sub(p2, p1)); + obj.e1 = vec2.normalize(vec2.sub(p2, p1)); + obj.e2 = [obj.e1[1], -obj.e1[0]]; + obj.k = (p2[2] - p1[2]) / obj.length; + + return obj; + }, + constrain : func (pos) { + var p = [pos[0], pos[1], pos[2]]; + var pXY = vec2.sub(pos, me.p1); + var along = vec2.dot(pXY, me.e1); + var across = vec2.dot(pXY, me.e2); + + var along2 = max(0, min(along, me.length)); + var across2 = max(-me.halfwidth, min(across, me.halfwidth)); + if (along2 != along or across2 != across) { + # Compute new XY position. + var t = vec2.add(vec2.mul(along2, me.e1), vec2.mul(across2, me.e2)); + p[0] = me.p1[0] + t[0]; + p[1] = me.p1[1] + t[1]; + } + + # Compute Z positition. + p[2] = me.p1[2] + me.k * along2; + return p; + } +}; + # Mostly aligned plane sloping along the X axis. +# NOTE: Obsolete. Use linePlane instead. # minp - the X,Y minimum point : position (meter) # maxp - the X,Y maximum point : position (meter) var slopingYAlignedPlane = { new : func (minp, maxp) { - var obj = { parents : [slopingYAlignedPlane] }; - obj.minp = minp; - obj.maxp = maxp; - obj.kxz = (maxp[2] - minp[2])/(maxp[0] - minp[0]); - return obj; - }, - constrain : func (pos) { - var p = [pos[0], pos[1], pos[2]]; - if (pos[0] < me.minp[0]) p[0] = me.minp[0]; - if (pos[0] > me.maxp[0]) p[0] = me.maxp[0]; - if (pos[1] < me.minp[1]) p[1] = me.minp[1]; - if (pos[1] > me.maxp[1]) p[1] = me.maxp[1]; - p[2] = me.minp[2] + me.kxz * (pos[0] - me.minp[0]); - return p; - }, + return linePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], + [maxp[0], (minp[1] + maxp[1])/2, maxp[2]], + (maxp[1] - minp[1])); + } }; # Action constraint @@ -369,3 +399,33 @@ var closerXY = func (pos, p1, p2) { 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]); } + +var max = func (a, b) { + return b > a ? b : a; +} +var min = func (a, b) { + return a > b ? b : a; +} + +# 2D vector math. +var vec2 = { + add : func (a, b) { + return [a[0] + b[0], a[1] + b[1]]; + }, + sub : func (a, b) { + return [a[0] - b[0], a[1] - b[1]]; + }, + mul : func (k, a) { + return [k * a[0], k * a[1]]; + }, + length : func (a) { + return math.sqrt(a[0]*a[0] + a[1]*a[1]); + }, + dot : func (a, b) { + return a[0]*b[0] + a[1]*b[1]; + }, + normalize : func (a) { + var s = 1/vec2.length(a); + return [s * a[0], s * a[1]]; + } +} From 5612cd36dde115425da9e4e35ceb7ed1ce7bbc7a Mon Sep 17 00:00:00 2001 From: ThorstenB <brehmt@gmail.com> Date: Mon, 1 Nov 2010 17:47:08 +0100 Subject: [PATCH 10/14] Horse/cow (scenery) culling... Removed since this caused severe scenery (un)loading issues with osg. Scenery nodes with too many parents cause extreme delays when unloading tiles. => Need a better cow/horse-herd implementation! :) --- materials.xml | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/materials.xml b/materials.xml index e3f79bf99..828bc5cdf 100644 --- a/materials.xml +++ b/materials.xml @@ -1320,6 +1320,9 @@ Shared parameters for various materials. <heading-type>random</heading-type> </object> </object-group> + <!-- Disabled to avoid a tremendous osg performance penalty when + deleting scenery tiles, caused by tens of thousands of shared + horse/cow objects. Need a better implementation! <object-group> <range-m>1000</range-m> <object> @@ -1332,7 +1335,7 @@ Shared parameters for various materials. <coverage-m2>300000</coverage-m2> <heading-type>random</heading-type> </object> - </object-group> + </object-group> --> <wood-coverage>1000000.0</wood-coverage> <wood-size>20000.0</wood-size> <tree-density>4000.0</tree-density> @@ -1383,6 +1386,9 @@ Shared parameters for various materials. <heading-type>random</heading-type> </object> </object-group> + <!-- Disabled to avoid a tremendous osg performance penalty when + deleting scenery tiles, caused by tens of thousands of shared + horse/cow objects. Need a better implementation! <object-group> <range-m>1000</range-m> <object> @@ -1395,7 +1401,7 @@ Shared parameters for various materials. <coverage-m2>300000</coverage-m2> <heading-type>random</heading-type> </object> - </object-group> + </object-group> --> <wood-coverage>500000.0</wood-coverage> <tree-texture>Textures/Trees/mixed-summer.png</tree-texture> <tree-varieties>8</tree-varieties> @@ -1444,6 +1450,9 @@ Shared parameters for various materials. <heading-type>random</heading-type> </object> </object-group> + <!-- Disabled to avoid a tremendous osg performance penalty when + deleting scenery tiles, caused by tens of thousands of shared + horse/cow objects. Need a better implementation! <object-group> <range-m>1000</range-m> <object> @@ -1456,7 +1465,7 @@ Shared parameters for various materials. <coverage-m2>300000</coverage-m2> <heading-type>random</heading-type> </object> - </object-group> + </object-group> --> <wood-coverage>500000.0</wood-coverage> <wood-size>20000.0</wood-size> <tree-density>5000.0</tree-density> @@ -2140,6 +2149,9 @@ Shared parameters for various materials. <heading-type>random</heading-type> </object> </object-group> + <!-- Disabled to avoid a tremendous osg performance penalty when + deleting scenery tiles, caused by tens of thousands of shared + horse/cow objects. Need a better implementation! <object-group> <range-m>1000</range-m> <object> @@ -2152,7 +2164,7 @@ Shared parameters for various materials. <coverage-m2>300000</coverage-m2> <heading-type>random</heading-type> </object> - </object-group> + </object-group> --> <wood-coverage>1000000.0</wood-coverage> <wood-size>20000.0</wood-size> <tree-density>4000.0</tree-density> @@ -2202,6 +2214,9 @@ Shared parameters for various materials. <heading-type>random</heading-type> </object> </object-group> + <!-- Disabled to avoid a tremendous osg performance penalty when + deleting scenery tiles, caused by tens of thousands of shared + horse/cow objects. Need a better implementation! <object-group> <range-m>1000</range-m> <object> @@ -2214,7 +2229,7 @@ Shared parameters for various materials. <coverage-m2>300000</coverage-m2> <heading-type>random</heading-type> </object> - </object-group> + </object-group> --> <wood-coverage>150000.0</wood-coverage> <wood-size>10000.0</wood-size> <tree-density>5000.0</tree-density> @@ -2264,6 +2279,9 @@ Shared parameters for various materials. <heading-type>random</heading-type> </object> </object-group> + <!-- Disabled to avoid a tremendous osg performance penalty when + deleting scenery tiles, caused by tens of thousands of shared + horse/cow objects. Need a better implementation! <object-group> <range-m>1000</range-m> <object> @@ -2276,7 +2294,7 @@ Shared parameters for various materials. <coverage-m2>300000</coverage-m2> <heading-type>random</heading-type> </object> - </object-group> + </object-group> --> <wood-coverage>150000.0</wood-coverage> <wood-size>10000.0</wood-size> <tree-density>5000.0</tree-density> From 4c694b2bc2a830550a14b2082aad360d517573be Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Mon, 1 Nov 2010 21:12:39 +0100 Subject: [PATCH 11/14] Updated WalkView: Added a circular surface constraint. --- Aircraft/Generic/WalkView/walkview.nas | 38 ++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index 8ed1bb61f..239ab575c 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -83,7 +83,8 @@ var active_walker = func { # speed ... speed in m/sec : double # # set_pos(pos) -# get_pos() : position +# pos ... position in meter : [double, double, double] +# get_pos() : position ([meter, meter, meter]) # # set_eye_height(h) # get_eye_height() : int (meter) @@ -263,8 +264,8 @@ var makeUnionConstraint = func (cs) { # Rectangular plane defined by a straight line and a width. # The line is extruded horizontally on each side by width/2 into a # planar surface. -# p1, p2 - the line endpoints. -# width - total width of the plane. +# p1, p2 - the line endpoints. : position ([meter, meter, meter]) +# width - total width of the plane. : length (meter) var linePlane = { new : func (p1, p2, width) { var obj = { parents : [linePlane] }; @@ -283,7 +284,7 @@ var linePlane = { var pXY = vec2.sub(pos, me.p1); var along = vec2.dot(pXY, me.e1); var across = vec2.dot(pXY, me.e2); - + var along2 = max(0, min(along, me.length)); var across2 = max(-me.halfwidth, min(across, me.halfwidth)); if (along2 != along or across2 != across) { @@ -299,10 +300,35 @@ var linePlane = { } }; +# Circular surface aligned with the XY plane +# center - the center point : position ([meter, meter, meter]) +# radius - radius in the XY plane : length (meter) +var CircularXYSurface = { + new : func (center, radius) { + var obj = { parents : [CircularXYSurface] }; + obj.center = center; + obj.radius = radius; + + return obj; + }, + constrain : func (pos) { + var p = [pos[0], pos[1], me.center[2]]; + var pXY = vec2.sub(pos, me.center); + var lXY = vec2.length(pXY); + + if (lXY > me.radius) { + var t = vec2.add(me.center, vec2.mul(me.radius/lXY, pXY)); + p[0] = t[0]; + p[1] = t[1]; + } + return p; + }, +}; + # Mostly aligned plane sloping along the X axis. # NOTE: Obsolete. Use linePlane instead. -# minp - the X,Y minimum point : position (meter) -# maxp - the X,Y maximum point : position (meter) +# minp - the X,Y minimum point : position ([meter, meter, meter]) +# maxp - the X,Y maximum point : position ([meter, meter, meter]) var slopingYAlignedPlane = { new : func (minp, maxp) { return linePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], From 7b08e91f7b62c4b39ad7cc472f5c0e49233f17a6 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Mon, 1 Nov 2010 21:31:15 +0100 Subject: [PATCH 12/14] Updated Walk View: Unified all "class"/"type" names to begin with a capital letter. --- Aircraft/Generic/WalkView/walkview.nas | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index 239ab575c..c329f88dc 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -104,9 +104,9 @@ var active_walker = func { # NOTES: # Currently there can only be one view manager per view so the # walk view should not have any other view manager. -var walker = { +var Walker = { new : func (view_name, constraints = nil, managers = nil) { - var obj = { parents : [walker] }; + var obj = { parents : [Walker] }; obj.view = view.views[view.indexof(view_name)]; obj.constraints = constraints; obj.managers = managers; @@ -225,9 +225,9 @@ var walker = { # The union of two constraints. # c1, c2 - the constraints : constraint # NOTE: Assumes that the constraints are convex. -var unionConstraint = { +var UnionConstraint = { new : func (c1, c2) { - var obj = { parents : [unionConstraint] }; + var obj = { parents : [UnionConstraint] }; obj.c1 = c1; obj.c2 = c2; return obj; @@ -256,7 +256,7 @@ var makeUnionConstraint = func (cs) { var ret = cs[0]; for (var i = 1; i < size(cs); i += 1) { - ret = unionConstraint.new(ret, cs[i]); + ret = UnionConstraint.new(ret, cs[i]); } return ret; } @@ -266,9 +266,9 @@ var makeUnionConstraint = func (cs) { # planar surface. # p1, p2 - the line endpoints. : position ([meter, meter, meter]) # width - total width of the plane. : length (meter) -var linePlane = { +var LinePlane = { new : func (p1, p2, width) { - var obj = { parents : [linePlane] }; + var obj = { parents : [LinePlane] }; obj.p1 = p1; obj.p2 = p2; obj.halfwidth = width/2; @@ -329,9 +329,9 @@ var CircularXYSurface = { # NOTE: Obsolete. Use linePlane instead. # minp - the X,Y minimum point : position ([meter, meter, meter]) # maxp - the X,Y maximum point : position ([meter, meter, meter]) -var slopingYAlignedPlane = { +var SlopingYAlignedPlane = { new : func (minp, maxp) { - return linePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], + return LinePlane.new([minp[0], (minp[1] + maxp[1])/2, minp[2]], [maxp[0], (minp[1] + maxp[1])/2, maxp[2]], (maxp[1] - minp[1])); } @@ -344,9 +344,9 @@ var slopingYAlignedPlane = { # on_exit(x, y) - function that is called when the walker leaves the area. # x and y are <0, 0 or >0 depending on in which direction(s) # the walker left the constraint. -var actionConstraint = { +var ActionConstraint = { new : func (constraint, on_enter = nil, on_exit = nil) { - var obj = { parents : [actionConstraint] }; + var obj = { parents : [ActionConstraint] }; obj.constraint = constraint; obj.on_enter = on_enter; obj.on_exit = on_exit; From 5ecdf0f8787b62b3f1b38d0c718fd3f52e2a19c0 Mon Sep 17 00:00:00 2001 From: Anders Gidenstam <anders@gidenstam.org> Date: Mon, 1 Nov 2010 22:44:10 +0100 Subject: [PATCH 13/14] Updated WalkView: Added a makePolylinePath convenience function. --- Aircraft/Generic/WalkView/walkview.nas | 49 +++++++++++++++++++------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas index c329f88dc..b7bad57c1 100644 --- a/Aircraft/Generic/WalkView/walkview.nas +++ b/Aircraft/Generic/WalkView/walkview.nas @@ -221,6 +221,43 @@ var Walker = { # Constraint classes. Determines where the view can walk. # +# Convenience functions. + +# Build a UnionConstraint hierarchy from a list of constraints. +# cs - list of constraints : [constraint] +var makeUnionConstraint = func (cs) { + if (size(cs) < 2) return cs[0]; + + var ret = cs[0]; + for (var i = 1; i < size(cs); i += 1) { + ret = UnionConstraint.new(ret, cs[i]); + } + return ret; +} + +# Build a UnionConstraint hierachy that represents a polyline path +# with a certain width. Each internal point gets a circular surface. +# points - list of points : [position] ([[meter, meter, meter]]) +# width - width of the path : length (meter) +# round_ends - put a circle also on the first and last points : bool +var makePolylinePath = func (points, width, round_ends = 0) { + if (size(points) < 2) return nil; + var ret = LinePlane.new(points[0], points[1], width); + if (round_ends) { + ret = UnionConstraint.new(line, + CircularXYSurface.new(points[0], width/2)); + } + for (var i = 2; i < size(points); i += 1) { + var line = LinePlane.new(points[i-1], points[i], width); + if (i + 1 < size(points) or round_ends) { + line = UnionConstraint.new + (line, + CircularXYSurface.new(points[i], width/2)); + } + ret = UnionConstraint.new(line, ret); + } + return ret; +} # The union of two constraints. # c1, c2 - the constraints : constraint @@ -249,18 +286,6 @@ var UnionConstraint = { } }; -# Build a unionConstraint hierarchy from a list of constraints. -# cs - list of constraints : [constraint] -var makeUnionConstraint = func (cs) { - if (size(cs) < 2) return cs[0]; - - var ret = cs[0]; - for (var i = 1; i < size(cs); i += 1) { - ret = UnionConstraint.new(ret, cs[i]); - } - return ret; -} - # Rectangular plane defined by a straight line and a width. # The line is extruded horizontally on each side by width/2 into a # planar surface. From 9a590d3e61f21c7cc98ef15bb722a1ef41baa365 Mon Sep 17 00:00:00 2001 From: ThorstenB <brehmt@gmail.com> Date: Tue, 2 Nov 2010 19:41:00 +0100 Subject: [PATCH 14/14] Added missing buttons to AI options dialog. Renamed "ATC/AI" to "AI" since ATC options are no longer available. --- gui/dialogs/ai.xml | 52 +++++++++++++++++++++++++++++++++++++++++++++- gui/menubar.xml | 4 ++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/gui/dialogs/ai.xml b/gui/dialogs/ai.xml index bba1c22eb..56898b8c9 100644 --- a/gui/dialogs/ai.xml +++ b/gui/dialogs/ai.xml @@ -71,4 +71,54 @@ <stretch>true</stretch> </empty> </group> -</PropertyList> \ No newline at end of file + + <group> + <layout>hbox</layout> + <default-padding>6</default-padding> + <empty> + <stretch>true</stretch> + </empty> + + <button> + <legend>OK</legend> + <default>true</default> + <equal>true</equal> + <binding> + <command>dialog-apply</command> + </binding> + <binding> + <command>dialog-close</command> + </binding> + </button> + + <button> + <legend>Apply</legend> + <equal>true</equal> + <binding> + <command>dialog-apply</command> + </binding> + </button> + + <button> + <legend>Reset</legend> + <equal>true</equal> + <binding> + <command>dialog-update</command> + </binding> + </button> + + <button> + <legend>Cancel</legend> + <equal>true</equal> + <key>Esc</key> + <binding> + <command>dialog-close</command> + </binding> + </button> + + <empty> + <stretch>true</stretch> + </empty> + </group> + +</PropertyList> diff --git a/gui/menubar.xml b/gui/menubar.xml index 39045e82f..29295d576 100644 --- a/gui/menubar.xml +++ b/gui/menubar.xml @@ -457,9 +457,9 @@ </menu> <menu> - <label>ATC/AI</label> + <label>AI</label> <item> - <label>ATC Options</label> + <label>AI Options</label> <binding> <command>dialog-show</command> <dialog-name>ai</dialog-name>