tuioxide 0.3.1

A Rust implementation of the TUIO 1.1 and TUIO 2.0 protocols, providing both client and server components for sending and receiving multitouch and tangible object data over OSC.
Documentation
use crate::core::math::{Position, Velocity};

#[derive(Debug, Clone, Copy)]
pub(crate) struct Translation {
    pub(crate) position: Position,
    last_position: Position,
    pub(crate) velocity: Velocity,
    last_velocity: Velocity,
    pub(crate) acceleration: f32,
}

impl Translation {
    pub(crate) fn new(position: Position, velocity: Velocity, acceleration: f32) -> Self {
        Self {
            position,
            last_position: position,
            velocity,
            last_velocity: velocity,
            acceleration,
        }
    }

    pub(crate) fn update(&mut self, position: Position, velocity: Velocity, acceleration: f32) {
        self.last_position = self.position;
        self.last_velocity = self.velocity;
        self.position = position;
        if self.should_calculate_motion(position, velocity) {
            self.calculate_motion();
        } else {
            self.velocity = velocity;
            self.acceleration = acceleration;
        }
    }

    fn calculate_motion(&mut self) {
        self.velocity = self.position - self.last_position;
        self.acceleration = self.velocity.speed() - self.last_velocity.speed();
    }

    fn should_calculate_motion(&self, position: Position, velocity: Velocity) -> bool {
        self.last_position != position && velocity.speed() == 0.0
    }
}