From 84d2627236ffa2134378b9a66b0e5236df8b54eb Mon Sep 17 00:00:00 2001
From: david <david>
Date: Fri, 27 Sep 2002 22:01:33 +0000
Subject: [PATCH] Globally-useful functions, starting with Alex Perry's
 low-pass function from steam.cxx.

---
 src/Main/util.cxx | 53 +++++++++++++++++++++++++++++++++++++++++++++++
 src/Main/util.hxx | 43 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+)
 create mode 100644 src/Main/util.cxx
 create mode 100644 src/Main/util.hxx

diff --git a/src/Main/util.cxx b/src/Main/util.cxx
new file mode 100644
index 000000000..61e068165
--- /dev/null
+++ b/src/Main/util.cxx
@@ -0,0 +1,53 @@
+// util.cxx - general-purpose utility functions.
+// Copyright (C) 2002  Curtis L. Olson  - curt@me.umn.edu
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// $Id$
+
+
+#include <math.h>
+#include "util.hxx"
+
+
+// Originally written by Alex Perry.
+double
+fgGetLowPass (double current, double target, double timeratio)
+{
+    if ( timeratio < 0.0 ) {
+	if ( timeratio < -1.0 ) {
+                                // time went backwards; kill the filter
+                current = target;
+        } else {
+                                // ignore mildly negative time
+        }
+    } else if ( timeratio < 0.2 ) {
+                                // Normal mode of operation; fast
+                                // approximation to exp(-timeratio)
+        current = current * (1.0 - timeratio) + target * timeratio;
+    } else if ( timeratio > 5.0 ) {
+                                // Huge time step; assume filter has settled
+        current = target;
+    } else {
+                                // Moderate time step; non linear response
+        double keep = exp(-timeratio);
+        current = current * keep + target * (1.0 - keep);
+    }
+
+    return current;
+}
+
+// end of util.cxx
+
diff --git a/src/Main/util.hxx b/src/Main/util.hxx
new file mode 100644
index 000000000..91c34a1b9
--- /dev/null
+++ b/src/Main/util.hxx
@@ -0,0 +1,43 @@
+// util.hxx - general-purpose utility functions.
+// Copyright (C) 2002  Curtis L. Olson  - curt@me.umn.edu
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+// $Id$
+
+
+#ifndef __UTIL_HXX
+#define __UTIL_HXX 1
+
+#ifndef __cplusplus
+# error This library requires C++
+#endif
+
+
+/**
+ * Move a value towards a target.
+ *
+ * This function was originally written by Alex Perry.
+ *
+ * @param current The current value.
+ * @param target The target value.
+ * @param timeratio The percentage of smoothing time that has passed 
+ *        (elapsed time/smoothing time)
+ * @return The new value.
+ */
+extern double fgGetLowPass (double current, double target, double timeratio);
+
+
+#endif // __UTIL_HXX