use crate::easing::Curve;
#[derive(Debug)]
pub struct InBounce;
impl Curve for InBounce {
#[inline]
fn y(&self, p: f32) -> f32 {
1.0 - OutBounce.y(1.0 - p)
}
}
#[test]
fn test_in_bounce() {
let p = InBounce.y(1.0);
assert_eq!(p, 1.0);
}
#[derive(Debug)]
pub struct OutBounce;
impl Curve for OutBounce {
#[inline]
fn y(&self, p: f32) -> f32 {
let t;
let r = 1.0 / 2.75; let k1 = r; let k2 = 2.0 * r; let k3 = 1.5 * r; let k4 = 2.5 * r; let k5 = 2.25 * r; let k6 = 2.625 * r; let k0 = 7.5625;
if p < k1 {
k0 * p * p
} else if p < k2 {
t = p - k3;
k0 * t * t + 0.75 } else if p < k4 {
t = p - k5;
k0 * t * t + 0.9375 } else {
t = p - k6;
k0 * t * t + 0.984375 }
}
}
#[test]
fn test_out_bounce() {
let p = OutBounce.y(1.0);
assert_eq!(p, 1.0);
}
#[derive(Debug)]
pub struct InOutBounce;
impl Curve for InOutBounce {
#[inline]
fn y(&self, p: f32) -> f32 {
let t = p * 2.0;
if t < 1.0 {
return 0.5 - 0.5 * OutBounce.y(1.0 - t);
}
0.5 + 0.5 * OutBounce.y(t - 1.0)
}
}
#[test]
fn test_in_out_bounce() {
let p = InOutBounce.y(1.0);
assert_eq!(p, 1.0);
}