reaction 0.2.0

Universal low-latency input handling for game engines
Documentation
use crate::modifier::deadzone::{apply_deadzone, DeadzoneType};
use crate::modifier::sensitivity::{apply_sensitivity, SensitivityCurve};

impl Default for ModifierPipeline {
    fn default() -> Self {
        Self::new()
    }
}

pub struct ModifierPipeline {
    deadzone: f32,
    sensitivity: f32,
    curve_exponent: f32,
}

impl ModifierPipeline {
    pub fn new() -> Self {
        Self {
            deadzone: 0.1,
            sensitivity: 1.0,
            curve_exponent: 1.0,
        }
    }

    pub fn process(&self, x: f32, y: f32) -> (f32, f32) {
        let (dx, dy) = apply_deadzone(x, y, self.deadzone, DeadzoneType::Radial);
        let sx = apply_sensitivity(
            dx,
            self.sensitivity,
            SensitivityCurve::Exponential(self.curve_exponent),
        );
        let sy = apply_sensitivity(
            dy,
            self.sensitivity,
            SensitivityCurve::Exponential(self.curve_exponent),
        );
        (sx, sy)
    }
}