From c56653d2039a75becaaac123e53d4da81965efa3 Mon Sep 17 00:00:00 2001 From: mfranz <mfranz> Date: Sun, 5 Oct 2008 23:16:15 +0000 Subject: [PATCH] tyresmoke: make it faster, cleaner, shorter --- Nasal/aircraft.nas | 133 +++++++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 78 deletions(-) diff --git a/Nasal/aircraft.nas b/Nasal/aircraft.nas index 681a67c98..d7deba6c8 100644 --- a/Nasal/aircraft.nas +++ b/Nasal/aircraft.nas @@ -885,6 +885,61 @@ var autotrim = { +# tyre smoke +# ============================================================================= +# Provides a property which can be used to contol particles used to simulate tyre +# smoke on landing. Weight on wheels, vertical speed, ground speed, ground friction +# factor are taken into account. Tyre slip is simulated by low pass filters. +# +# Modifications to the model file are required. +# +# Generic XML particle files are available, but are not mandatory +# (see Hawker Seahawk for an example). +# +# SYNOPSIS: +# aircraft.tyresmoke.new(<gear index>) +# <gear index> - the index of the gear to which the tyre smoke is attached +# aircraft.tyresmoke.update() +# +# EXAMPLE: +# var tyresmoke_0 = aircraft.tyresmoke.new(0); +# tyresmoke_0.update(); +# +var tyresmoke = { + new: func(number) { + var m = { parents: [tyresmoke] }; + m.vertical_speed = props.globals.getNode("velocities/vertical-speed-fps", 1); + m.speed = props.globals.getNode("velocities/groundspeed-kt", 1); + + var gear = props.globals.getNode("gear/gear", number); + m.wow = props.initNode(gear.getNode("wow", 1)); + m.tyresmoke = props.initNode(gear.getNode("tyre-smoke", 1), 0, "BOOL"); + m.friction_factor = props.initNode(gear.getNode("ground-friction-factor", 1), 1); + m.rollspeed = props.initNode(gear.getNode("rollspeed-ms", 1)); + m.lp = lowpass.new(2); + return m; + }, + update: func { + var rollspeed = me.rollspeed.getValue(); + var vert_speed = me.vertical_speed.getValue(); + var groundspeed = me.speed.getValue(); + var friction_factor = me.friction_factor.getValue(); + var wow = me.wow.getValue(); + + var filtered_rollspeed = me.lp.filter(rollspeed); + var diff = math.abs(rollspeed - filtered_rollspeed); + var diff_norm = diff > 0 ? diff / rollspeed : 0; + + if (wow and vert_speed < -0.05 and diff_norm > 0.05 + and friction_factor > 0.7 and groundspeed > 50) + me.tyresmoke.setValue(1); + else + me.tyresmoke.setValue(0); + }, +}; + + + # teleport # ============================================================================= # Usage: aircraft.teleport(lat:48.3, lon:32.4, alt:5000); @@ -988,81 +1043,3 @@ _setlistener("/sim/signals/nasal-dir-initialized", func { } }); -# tyre smoke -# ============================================================================= -# Provides a property which can be used to contol particles used to simulate tyre -# smoke on landing. Weight on wheels, vertical speed, ground speed, ground friction factor -# are taken into account. Tyre slip is simulated be low pass filters. -# -# Modifications to the model file are required. -# -# Generic XML particle files are available, but are not mandatory -# (see Hawker Seahawk for an example). -# -# SYNOPSIS: -# aircraft.tyresmoke.new(<gear index>) -# <gear index> - the index of the gear to which the tyre smoke is attached -# aircraft.tyresmoke.update() -# -# EXAMPLE: -# var tyresmoke_0 = aircraft.tyresmoke.new(0); -# tyresmoke_0.update(); -# - -var tyresmoke = { - new : func (number, - ){ - var m = {parents : [tyresmoke] }; - m.name = "tyre-smoke " ~ number; - m.wow = props.globals.getNode("gear/gear[" ~ number ~"]/wow", 1); - m.tyresmoke = props.globals.getNode("gear/gear[" ~ number ~"]/tyre-smoke", 1); - m.tyresmoke.setBoolValue(0); - m.vertical_speed = props.globals.getNode("velocities/vertical-speed-fps", 1); - m.speed = props.globals.getNode("velocities/groundspeed-kt", 1); - m.friction_factor = props.globals.getNode("gear/gear[" ~ number ~"]/ground-friction-factor", 1); - m.friction_factor.setValue(1); - m.rollspeed = props.globals.getNode("gear/gear[" ~ number ~"]/rollspeed-ms", 1); - m.rollspeed.setValue(0); - m.lp = lowpass.new(2); -# print ("initialising ", obj.name," ", obj.tyresmoke.getValue()); - return m; - }, - - update: func { # set the smoke value according to the conditions - - var vert_speed = me.vertical_speed.getValue(); - var groundspeed = me.speed.getValue(); - var friction_factor = me.friction_factor.getValue(); - var wow = me.wow.getValue(); - var rollspeed = me.rollspeed.getValue(); - var filtered_rollspeed = me.lp.filter(me.rollspeed.getValue()); - - var diff_norm = 0; - -# print (me.name, " rollspeed ", rollspeed, " filtered_rollspeed ",filtered_rollspeed); - - var diff = math.abs(rollspeed - filtered_rollspeed); - - if (diff > 0) - diff_norm = diff/rollspeed; - else - diff_norm = 0; - - if (wow == nil or diff_norm == nil or rollspeed == nil) - return; - - if (wow and vert_speed < -0.05 and diff_norm > 0.05 - and friction_factor > 0.7 and groundspeed > 50){ - me.tyresmoke.setValue(1); - } - else{ - me.tyresmoke.setValue(0); - } - -# print("updating ", me.name, " diff ", diff, -# " diff_norm ", diff_norm, " ", me.tyresmoke.getValue()); - - }, # end function - -}; # -