From 059a2f2b37f3e8a9b307a1097c399629d0707d8b Mon Sep 17 00:00:00 2001
From: Ingo Ruhnke <grumbel@gmx.de>
Date: Sat, 29 Jan 2011 22:54:17 +0100
Subject: [PATCH] Minor cleanup in AxismapModifier

---
 src/modifier/axismap_modifier.cpp | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/modifier/axismap_modifier.cpp b/src/modifier/axismap_modifier.cpp
index abd68d3..5569554 100644
--- a/src/modifier/axismap_modifier.cpp
+++ b/src/modifier/axismap_modifier.cpp
@@ -21,6 +21,7 @@
 #include <boost/tokenizer.hpp>
 #include <sstream>
 
+#include "axisfilter/invert_axis_filter.hpp"
 #include "helper.hpp"
 
 AxisMapping
@@ -88,7 +89,7 @@ AxismapModifier::update(int msec_delta, XboxGenericMsg& msg)
     }
   }
 
-  // clear all values in the new msg
+  // clear all lhs values in the newmsg, keep rhs
   for(std::vector<AxisMapping>::iterator i = m_axismap.begin(); i != m_axismap.end(); ++i)
   {
     set_axis_float(newmsg, i->lhs, 0);
@@ -100,20 +101,31 @@ AxismapModifier::update(int msec_delta, XboxGenericMsg& msg)
     int max = get_axis_max(i->lhs);
     int value = get_axis(msg, i->lhs);
 
+    if (i->invert)
+    {
+      InvertAxisFilter inv;
+      value = inv.filter(value, min, max);
+    }
+
     for(std::vector<AxisFilterPtr>::iterator j = i->filters.begin(); j != i->filters.end(); ++j)
     {
       value = (*j)->filter(value, min, max);
     }
 
-    float lhs  = to_float(value, min, max);
-    float nrhs = get_axis_float(newmsg, i->rhs);
+    float lhs = to_float(value, min, max);
 
-    if (i->invert)
+    if (i->lhs == i->rhs)
     {
-      lhs = -lhs;
+      set_axis_float(newmsg, i->rhs, lhs);
+    }
+    else
+    {
+      // FIXME: this primitive merge kind of works for regular axis,
+      // but doesn't work for half axis which have their center at
+      // -1.0f
+      float rhs = get_axis_float(newmsg, i->rhs);
+      set_axis_float(newmsg, i->rhs, Math::clamp(-1.0f, lhs + rhs, 1.0f));
     }
-
-    set_axis_float(newmsg, i->rhs, std::max(std::min(nrhs + lhs, 1.0f), -1.0f));
   }
   msg = newmsg;
 }