From af9eeeeca0879d34ea6c87072ffbebbb788cd7d7 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath <legoboyvdlp@gmail.com> Date: Tue, 7 Aug 2018 14:32:40 +0100 Subject: [PATCH] Add ALS lights --- A320-main.xml | 1 + Nasal/libraries.nas | 4 +- Nasal/light-manager.nas | 337 ++++++++++++++++++++++++++++++++++++++++ revision.txt | 2 +- 4 files changed, 341 insertions(+), 3 deletions(-) create mode 100644 Nasal/light-manager.nas diff --git a/A320-main.xml b/A320-main.xml index 7f1be5e4..551f6524 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1429,6 +1429,7 @@ <file>Aircraft/IDG-A32X/Nasal/efis.nas</file> <file>Aircraft/IDG-A32X/Nasal/ECAM.nas</file> <file>Aircraft/IDG-A32X/Nasal/shake.nas</file> + <file>Aircraft/IDG-A32X/Nasal/light-manager.nas</file> </libraries> <acconfig> <file>Aircraft/IDG-A32X/AircraftConfig/acconfig.nas</file> diff --git a/Nasal/libraries.nas b/Nasal/libraries.nas index 28272cb8..557de5b0 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -521,13 +521,13 @@ var lightsLoop = maketimer(0.2, func { landl = getprop("/controls/lighting/landing-lights[1]"); landr = getprop("/controls/lighting/landing-lights[2]"); - if (landl == 1) { + if (landl == 1 and getprop("sim/current-view/internal") == 1) { setprop("/sim/rendering/als-secondary-lights/use-landing-light", 1); } else { setprop("/sim/rendering/als-secondary-lights/use-landing-light", 0); } - if (landr == 1) { + if (landr == 1 and getprop("sim/current-view/internal") == 1) { setprop("/sim/rendering/als-secondary-lights/use-alt-landing-light", 1); } else { setprop("/sim/rendering/als-secondary-lights/use-alt-landing-light", 0); diff --git a/Nasal/light-manager.nas b/Nasal/light-manager.nas new file mode 100644 index 00000000..29fa5eff --- /dev/null +++ b/Nasal/light-manager.nas @@ -0,0 +1,337 @@ +# provides relative vectors from eye-point to aircraft lights +# in east/north/up coordinates the renderer uses +# Thanks to BAWV12 / Thorsten + +var light_manager = { + + run: 0, + + lat_to_m: 110952.0, + lon_to_m: 0.0, + + light1_xpos: 0.0, + light1_ypos: 0.0, + light1_zpos: 0.0, + light1_r: 0.0, + light1_g: 0.0, + light1_b: 0.0, + light1_size: 0.0, + light1_stretch: 0.0, + light1_is_on: 0, + + light2_xpos: 0.0, + light2_ypos: 0.0, + light2_zpos: 0.0, + light2_r: 0.0, + light2_g: 0.0, + light2_b: 0.0, + light2_size: 0.0, + light2_stretch: 0.0, + light2_is_on: 0, + + light3_xpos: 0.0, + light3_ypos: 0.0, + light3_zpos: 0.0, + light3_r: 0.0, + light3_g: 0.0, + light3_b: 0.0, + light3_size: 0.0, + light3_stretch: 0.0, + light3_is_on: 0, + + light3_xpos: 0.0, + light3_ypos: 0.0, + light3_zpos: 0.0, + light3_r: 0.0, + light3_g: 0.0, + light3_b: 0.0, + light3_size: 0.0, + light3_stretch: 0.0, + light4_is_on: 0, + + flcpt: 0, + prev_view : 1, + + nd_ref_light1_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m", 1), + nd_ref_light1_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m", 1), + nd_ref_light1_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m", 1), + nd_ref_light1_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir", 1), + + nd_ref_light2_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[1]", 1), + nd_ref_light2_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[1]", 1), + nd_ref_light2_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[1]", 1), + nd_ref_light2_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[1]", 1), + + nd_ref_light3_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[2]", 1), + nd_ref_light3_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[2]", 1), + nd_ref_light3_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[2]", 1), + nd_ref_light3_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[2]", 1), + + nd_ref_light4_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[3]", 1), + nd_ref_light4_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[3]", 1), + nd_ref_light4_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[3]", 1), + nd_ref_light4_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[3]", 1), + + init: func { + # define your lights here + + # lights ######## + # offsets to aircraft center + + me.light1_xpos = 70.0; + me.light1_ypos = 3.0; + me.light1_zpos = 2.0; + + me.light2_xpos = 70.0; + me.light2_ypos = -3.0; + me.light2_zpos = 2.0; + + me.light3_xpos = 35.0; + me.light3_ypos = 0.5; + me.light3_zpos = 2.0; + + me.light4_xpos = 35.0; + me.light4_ypos = -0.5; + me.light4_zpos = 2.0; + + # color values + me.light1_r = 0.5; + me.light1_g = 0.5; + me.light1_b = 0.5; + me.light2_r = 0.5; + me.light2_g = 0.5; + me.light2_b = 0.5; + me.light3_r = 0.5; + me.light3_g = 0.5; + me.light3_b = 0.5; + me.light4_r = 0.5; + me.light4_g = 0.5; + me.light4_b = 0.5; + + # spot size + me.light1_size = 12; + me.light1_stretch = 6; + me.light2_size = 12; + me.light2_stretch = 6; + me.light3_size = 6; + me.light3_stretch = 8; + me.light4_size = 9; + me.light4_stretch = 8; + + setprop("sim/rendering/als-secondary-lights/flash-radius", 13); + + me.start(); + }, + + start: func { + setprop("/sim/rendering/als-secondary-lights/num-lightspots", 4); + + setprop("/sim/rendering/als-secondary-lights/lightspot/size", me.light1_size); + setprop("/sim/rendering/als-secondary-lights/lightspot/size[1]", me.light2_size); + setprop("/sim/rendering/als-secondary-lights/lightspot/size[2]", me.light3_size); + setprop("/sim/rendering/als-secondary-lights/lightspot/size[3]", me.light4_size); + + setprop("/sim/rendering/als-secondary-lights/lightspot/stretch", me.light1_stretch); + setprop("/sim/rendering/als-secondary-lights/lightspot/stretch[1]", me.light2_stretch); + setprop("/sim/rendering/als-secondary-lights/lightspot/stretch[2]", me.light3_stretch); + setprop("/sim/rendering/als-secondary-lights/lightspot/stretch[3]", me.light4_stretch); + + me.run = 1; + me.update(); + }, + + stop: func { + me.run = 0; + }, + + update: func { + if (me.run == 0) { + return; + } + + als_on = getprop("/sim/rendering/shaders/skydome"); + alt_agl = getprop("/position/gear-agl-ft"); + type_of_view = getprop("sim/current-view/internal"); + + if (als_on == 1 and alt_agl < 100.0) { + ll1 = getprop("controls/lighting/landing-lights[1]"); + ll2 = getprop("controls/lighting/landing-lights[2]"); + ll3 = getprop("sim/model/lights/nose-lights"); + + var apos = geo.aircraft_position(); + var vpos = geo.viewer_position(); + + me.lon_to_m = math.cos(apos.lat()*math.pi/180.0) * me.lat_to_m; + + var heading = getprop("/orientation/heading-deg") * math.pi/180.0; + + var lat = apos.lat(); + var lon = apos.lon(); + var alt = apos.alt(); + + var sh = math.sin(heading); + var ch = math.cos(heading); + + if (ll1 == 1 and type_of_view == 0) { + me.light1_on(); + } else { + me.light1_off(); + } + + if (ll2 == 1 and type_of_view == 0) { + me.light2_on(); + } else { + me.light2_off(); + } + + if (ll3 == 0.85) { + me.light3_on(); + } else { + me.light3_off(); + } + + if (ll3 == 1) { + me.light4_on(); + } else { + me.light4_off(); + } + + + # light 1 position + + #var alt_agl = getprop("/position/altitude-agl-ft"); + + var proj_x = alt_agl; + var proj_z = alt_agl/10.0; + + apos.set_lat(lat + ((me.light1_xpos + proj_x) * ch + me.light1_ypos * sh) / me.lat_to_m); + apos.set_lon(lon + ((me.light1_xpos + proj_x)* sh - me.light1_ypos * ch) / me.lon_to_m); + + delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m; + delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m; + var delta_z = apos.alt()- proj_z - vpos.alt(); + + me.nd_ref_light1_x.setValue(delta_x); + me.nd_ref_light1_y.setValue(delta_y); + me.nd_ref_light1_z.setValue(delta_z); + me.nd_ref_light1_dir.setValue(heading); + + + + # light 2 position + + apos.set_lat(lat + (me.light2_xpos * ch + me.light2_ypos * sh) / me.lat_to_m); + apos.set_lon(lon + (me.light2_xpos * sh - me.light2_ypos * ch) / me.lon_to_m); + + delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m; + delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m; + delta_z = apos.alt() - vpos.alt(); + + me.nd_ref_light2_x.setValue(delta_x); + me.nd_ref_light2_y.setValue(delta_y); + me.nd_ref_light2_z.setValue(delta_z); + me.nd_ref_light2_dir.setValue(heading); + + + # light 3 position + + apos.set_lat(lat + (me.light3_xpos * ch + me.light3_ypos * sh) / me.lat_to_m); + apos.set_lon(lon + (me.light3_xpos * sh - me.light3_ypos * ch) / me.lon_to_m); + + delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m; + delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m; + delta_z = apos.alt() - vpos.alt(); + + me.nd_ref_light3_x.setValue(delta_x); + me.nd_ref_light3_y.setValue(delta_y); + me.nd_ref_light3_z.setValue(delta_z); + me.nd_ref_light3_dir.setValue(heading); + + + # light 4 position + + apos.set_lat(lat + (me.light4_xpos * ch + me.light4_ypos * sh) / me.lat_to_m); + apos.set_lon(lon + (me.light4_xpos * sh - me.light4_ypos * ch) / me.lon_to_m); + + delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m; + delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m; + delta_z = apos.alt() - vpos.alt(); + + me.nd_ref_light4_x.setValue(delta_x); + me.nd_ref_light4_y.setValue(delta_y); + me.nd_ref_light4_z.setValue(delta_z); + me.nd_ref_light4_dir.setValue(heading); + } + + settimer ( func me.update(), 0.0); + }, + + light1_on : func { + if (me.light1_is_on == 1) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r", me.light1_r); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g", me.light1_g); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b", me.light1_b); + me.light1_is_on = 1; + }, + + light1_off : func { + if (me.light1_is_on == 0) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b", 0.0); + me.light1_is_on = 0; + }, + + light2_on : func { + if (me.light2_is_on == 1) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[1]", me.light2_r); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[1]", me.light2_g); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[1]", me.light2_b); + me.light2_is_on = 1; + }, + + light2_off : func { + if (me.light2_is_on == 0) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[1]", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[1]", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[1]", 0.0); + me.light2_is_on = 0; + }, + + light3_on : func { + if (me.light3_is_on == 1) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[2]", me.light3_r); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[2]", me.light3_g); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[2]", me.light3_b); + me.light3_is_on = 1; + }, + + light3_off : func { + if (me.light3_is_on == 0) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[2]", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[2]", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[2]", 0.0); + me.light3_is_on = 0; + }, + + light4_on : func { + if (me.light4_is_on == 1) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[3]", me.light3_r); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[3]", me.light3_g); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[3]", me.light3_b); + me.light4_is_on = 1; + }, + + light4_off : func { + if (me.light4_is_on == 0) {return;} + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[3]", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[3]", 0.0); + setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[3]", 0.0); + me.light4_is_on = 0; + }, +}; + +light_manager.init(); + + + diff --git a/revision.txt b/revision.txt index 4abc8cfe..81b67cbf 100644 --- a/revision.txt +++ b/revision.txt @@ -1 +1 @@ -4618 \ No newline at end of file +4619 \ No newline at end of file