From 8419dec54a45a0d00eddefd4f36dfaee74882570 Mon Sep 17 00:00:00 2001
From: Richard Harrison <rjh@zaretto.com>
Date: Sat, 29 Jan 2022 12:57:37 +0100
Subject: [PATCH] Fix Tyre Smoke/Spray in air.

Previously it was possible that the smoke/spray would continue if the aircraft went weight off wheels whilst smoke was active.
---
 Nasal/aircraft.nas | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/Nasal/aircraft.nas b/Nasal/aircraft.nas
index be6c2a26e..2831da3f4 100644
--- a/Nasal/aircraft.nas
+++ b/Nasal/aircraft.nas
@@ -770,6 +770,8 @@ var autotrim = {
 
 
 
+
+
 # tyresmoke
 # =============================================================================
 # Provides a property which can be used to contol particles used to simulate tyre
@@ -835,7 +837,8 @@ var tyresmoke = {
 		m.spraydensity = gear.initNode("spray-density", 0, "DOUBLE");
 		m.auto = auto;
 		m.listener = nil;
-		me.lastwow=0;
+		m.lastwow=0;
+		m.active=0;
 
 		if (getprop("sim/flight-model") == "jsb") {
 			var wheel_speed = "fdm/jsbsim/gear/unit[" ~ number ~ "]/wheel-speed-fps";
@@ -846,8 +849,8 @@ var tyresmoke = {
 			m.get_rollspeed = func m.rollspeed_node.getValue();
 		}
 
-		m.lp = lowpass.new(2);
-		m.lpf_touchdown = lowpass.new(0.15);
+		m.lp = aircraft.lowpass.new(2);
+		m.lpf_touchdown = aircraft.lowpass.new(0.15);
 		auto and m.update();
 		return m;
 	},
@@ -899,8 +902,8 @@ var tyresmoke = {
 		return ((0.03048 * 59175231 +  2.38119 * math.pow(groundspeed_kts, 5.08271))
 		       / (59175231 + math.pow(groundspeed_kts, 5.08271)) / 2.38105217250475)
                        ;
-        },
-        update: func {
+	},
+	update: func {
 		me.rollspeed = me.get_rollspeed();
 		me.vert_speed = (me.vertical_speed) != nil ? me.vertical_speed.getValue() : -999;
 		me.groundspeed_kts = me.speed.getValue();
@@ -919,8 +922,9 @@ var tyresmoke = {
 		me.touchdown = 0;
 		if (me.wow != me.lastwow){
 			if (me.wow){
-				me.lpf_touchdown.set(math.abs(me.vert_speed));
+			me.lpf_touchdown.set(math.abs(me.vert_speed));
 			}
+			else me.filtered_touchdown = me.lpf_touchdown.filter(0);
 		}
 		else me.filtered_touchdown = me.lpf_touchdown.filter(0);
 
@@ -933,26 +937,29 @@ var tyresmoke = {
 		# possibly using ground speed is somewhat irrelevant - but I'm leaving that here
 		# as it may filter out unwanted smoke.
 		if (me.filtered_touchdown > 1.0
-			and me.rollspeed_diff_norm > me.diff_norm
-			and me.friction_factor > 0.7
-			and me.groundspeed_kts > 50
-			and me.rain <me.rain_norm_trigger) {
+            and me.rollspeed_diff_norm > me.diff_norm
+		    and me.friction_factor > 0.7
+            and me.groundspeed_kts > 50
+            and me.rain <me.rain_norm_trigger) {
 			me.tyresmoke.setValue(1);
 			me.spray.setValue(0);
 			me.spraydensity.setValue(0);
+			me.active = 1;
 		} elsif (me.wow and me.rain >= me.rain_norm_trigger) {
 			me.tyresmoke.setValue(0);
 			me.spray.setValue(1);
 			me.sprayspeed.setValue(me.rollspeed * 6);
 			me.spraydensity.setValue(me.rain * me.spray_factor * me.groundspeed_kts);
+			me.active = 1;
 		} else {
+			me.active = 0;
 			me.tyresmoke.setValue(0);
 			me.spray.setValue(0);
 			me.sprayspeed.setValue(0);
 			me.spraydensity.setValue(0);
 		}
 		if (me.auto) {
-			if (me.wow) {
+			if (me.active or me.wow) {
 				settimer(func me.update(), 0);
 				if (me.listener != nil) {
 					removelistener(me.listener);
@@ -972,6 +979,7 @@ var tyresmoke = {
 	},
 };
 
+
 # tyresmoke_system
 # =============================================================================
 # Helper class to contain the tyresmoke objects for all the gears.