Limit stick point to unit vector
[kaka/rust-sdl-test.git] / src / core / controller.rs
index 832480d..9d23257 100644 (file)
@@ -1,5 +1,5 @@
 use common::Point2D;
-use hashmap;
+use {hashmap, point};
 use common::Radians;
 use sdl2::HapticSubsystem;
 use sdl2::JoystickSubsystem;
@@ -68,7 +68,6 @@ pub struct Stick {
     pub x: f32,
     pub y: f32,
     pub a: Radians,
-    pub len: f32,
 }
 
 impl Stick {
@@ -82,11 +81,6 @@ impl Stick {
            Err(_) => panic!("invalid y axis {}", self.idy),
        };
        self.a = Radians(self.y.atan2(self.x) as f64);
-       self.len = {
-           let x = (self.x / self.y).abs().min(1.0);
-           let y = (self.y / self.x).abs().min(1.0);
-           (self.x.powi(2) + self.y.powi(2)).sqrt() / (x.powi(2) + y.powi(2)).sqrt()
-       }
     }
 
     #[inline(always)] #[allow(dead_code)] fn up(&self) -> bool { self.y > 0.99 }
@@ -94,15 +88,17 @@ impl Stick {
     #[inline(always)] #[allow(dead_code)] fn left(&self) -> bool { self.x < -0.99 }
     #[inline(always)] #[allow(dead_code)] fn right(&self) -> bool { self.x > 0.99 }
 
-    pub fn to_point(&self) -> Point2D<f64> {
-       Point2D {
-           x: self.x as f64,
-           y: self.y as f64,
-       }
+    pub fn to_axis_point(&self) -> Point2D<f64> {
+       point!(self.x as f64, self.y as f64)
     }
 
-    pub fn to_adjusted_point(&self) -> Point2D<f64> {
-       Point2D::from(self.a) * self.len as f64
+    pub fn to_point(&self) -> Point2D<f64> {
+       let p = point!(self.x as f64, self.y as f64);
+       if p.length() > 1.0 {
+           p.normalize()
+       } else {
+           p
+       }
     }
 }