#[derive(Copy, Clone, Default)]
pub struct Smoothed<T> {
prev: T,
next: T,
progress: f32,
}
impl<T> Smoothed<T> {
pub fn new(x: T) -> Self
where
T: Clone,
{
Self {
prev: x.clone(),
next: x,
progress: 1.0,
}
}
pub fn advance(&mut self, proportion: f32) {
self.progress = (self.progress + proportion).min(1.0);
}
pub fn progress(&self) -> f32 {
self.progress
}
pub fn set(&mut self, value: T)
where
T: Interpolate,
{
self.prev = self.get();
self.next = value;
self.progress = 0.0;
}
pub fn get(&self) -> T
where
T: Interpolate,
{
self.prev.interpolate(&self.next, self.progress)
}
pub fn target(&self) -> &T {
&self.next
}
}
pub trait Interpolate {
fn interpolate(&self, other: &Self, t: f32) -> Self;
}
impl Interpolate for f32 {
fn interpolate(&self, other: &Self, t: f32) -> Self {
let diff = other - self;
self + t * diff
}
}