pub type Phase = f32;
pub fn linear(t: Phase) -> Phase {
t.clamp(0.0, 1.0)
}
pub fn ease_in(t: Phase) -> Phase {
let t = t.clamp(0.0, 1.0);
t * t
}
pub fn ease_out(t: Phase) -> Phase {
let t = t.clamp(0.0, 1.0);
1.0 - (1.0 - t) * (1.0 - t)
}
pub fn ease_in_out(t: Phase) -> Phase {
let t = t.clamp(0.0, 1.0);
if t < 0.5 {
4.0 * t * t * t
} else {
let f = -2.0 * t + 2.0;
1.0 - f * f * f / 2.0
}
}
pub fn ping_pong(frame: u64, period: u64) -> Phase {
if period == 0 {
return 0.0;
}
let pos = frame % period;
let half = period as f32 / 2.0;
let up = pos as f32 / half;
if up <= 1.0 { up } else { 2.0 - up }
}
pub fn sawtooth(frame: u64, period: u64) -> Phase {
if period == 0 {
return 0.0;
}
(frame % period) as f32 / period as f32
}