]> git.tdb.fi Git - libs/gui.git/blobdiff - source/input/smoothcontrol.cpp
Normalize device axis ranges to [-1, 1]
[libs/gui.git] / source / input / smoothcontrol.cpp
index 69dfacf955049f38000f170cd45e8aa91ddaefe0..d45c9536d5e3a5b586f7d28b27e42d8a629d2ecd 100644 (file)
@@ -12,31 +12,40 @@ namespace Input {
 
 SmoothControl::SmoothControl():
        value(0),
-       paired_ctrl(0)
+       paired_ctrl(0),
+       dead_zone(0.1),
+       threshold(0.9)
 { }
 
 SmoothControl::SmoothControl(const ControlSource &s):
        Control(s),
        value(0),
-       paired_ctrl(0)
+       paired_ctrl(0),
+       dead_zone(0.1),
+       threshold(0.9)
 { }
 
 SmoothControl::SmoothControl(Device &d, ControlSrcType t, unsigned i):
        Control(d, t, i),
        value(0),
-       paired_ctrl(0)
+       paired_ctrl(0),
+       dead_zone(0.1),
+       threshold(0.9)
 { }
 
-SmoothControl &SmoothControl::operator=(const SmoothControl &sc)
+SmoothControl::~SmoothControl()
 {
-       Control::operator=(sc);
+       pair(0);
+}
 
-       return *this;
+void SmoothControl::set_dead_zone(float d)
+{
+       dead_zone=d;
 }
 
-SmoothControl::~SmoothControl()
+void SmoothControl::set_threshold(float t)
 {
-       pair(0);
+       threshold=t;
 }
 
 void SmoothControl::pair(SmoothControl *ctrl)
@@ -68,13 +77,23 @@ void SmoothControl::on_release()
                on_motion(0, -value);
 }
 
-void SmoothControl::on_motion(float v, float)
+void SmoothControl::on_motion(float v, float r)
 {
-       value=v;
+       if(v<-threshold)
+               value=-1;
+       else if(v>threshold)
+               value=1;
+       else if(v<-dead_zone)
+               value=(v+dead_zone)/(threshold-dead_zone);
+       else if(v>dead_zone)
+               value=(v-dead_zone)/(threshold-dead_zone);
+       else
+               value=0;
+
        signal_motion.emit(value);
-       
-       if(paired_ctrl && paired_ctrl->get_value()!=-value)
-               paired_ctrl->on_motion(-value, -value-paired_ctrl->get_value());
+
+       if(paired_ctrl && (v>0 || (v==0 && paired_ctrl->value!=0)))
+               paired_ctrl->on_motion(-v, -r);
 }
 
 } // namespace Input