use super::{angle::Angle, numeric::Float}; pub fn animate(low: T, high: T, value: T, f: F) -> T where T: Float, F: FnOnce(T) -> T, { low + f(value) * (high - low) } pub fn zero(_: T) -> T { T::zero() } pub fn one(_: T) -> T { T::one() } pub fn step(value: T) -> T { if value < T::new(0.5) { T::zero() } else { T::one() } } pub fn linear(value: T) -> T { value } pub fn invert(value: T) -> T { T::one() - value } pub fn sinus(value: T) -> T { Angle::Deg(T::new(360.0) * value) .into_rad() .into_inner() .sin() } pub fn cosinus(value: T) -> T { Angle::Deg(T::new(360.0) * value) .into_rad() .into_inner() .cos() } pub fn ease_in_quadric(value: T) -> T { value * value } pub fn ease_in_cubic(value: T) -> T { value * value * value } pub fn ease_in_quartic(value: T) -> T { value * value * value * value } pub fn ease_in_quintic(value: T) -> T { value * value * value * value * value } pub fn ease_in_sinusoidal(value: T) -> T { Angle::Deg(T::new(90.0) * value + T::one()) .into_rad() .into_inner() .cos() .neg() } pub fn ease_in_circular(value: T) -> T { if value > T::one() { T::one() } else { T::one() - (T::one() - value * value) } } pub fn ease_in_back_cubic(value: T) -> T { T::new(4.0) * value * value * value - T::new(3.0) * value * value } pub fn ease_in_back_quadric(value: T) -> T { T::new(2.0) * value * value * value * value + T::new(2.0) * value * value * value - T::new(3.0) * value * value } pub fn ease_in_elastic_small(value: T) -> T { T::new(33.0) * value * value * value * value * value - T::new(59.0) * value * value * value * value + T::new(32.0) * value * value * value - T::new(5.0) * value * value } pub fn ease_in_elastic_big(value: T) -> T { T::new(56.0) * value * value * value * value * value - T::new(105.0) * value * value * value * value + T::new(60.0) * value * value * value - T::new(10.0) * value * value } pub fn ease_out_quadric(value: T) -> T { -value * (value - T::new(2.0)) } pub fn ease_out_cubic(value: T) -> T { let value = value - T::one(); value * value * value + T::one() } pub fn ease_out_quartic(value: T) -> T { let value = value - T::one(); -value * value * value * value + T::one() } pub fn ease_out_quintic(value: T) -> T { let value = value - T::one(); value * value * value * value * value + T::one() } pub fn ease_out_sinusoidal(value: T) -> T { Angle::Deg(T::new(90.0) * value) .into_rad() .into_inner() .sin() } pub fn ease_out_circular(value: T) -> T { if value < T::zero() { T::zero() } else { let value = value - T::one(); (T::one() - value * value).sqrt() } } pub fn ease_out_back_cubic(value: T) -> T { T::new(4.0) * value * value * value - T::new(9.0) * value * value + T::new(6.0) * value } pub fn ease_out_back_quadric(value: T) -> T { -T::new(2.0) * value * value * value * value + T::new(10.0) * value * value * value - T::new(15.0) * value * value + T::new(8.0) * value } pub fn ease_out_elastic_small(value: T) -> T { T::new(33.0) * value * value * value * value * value - T::new(106.0) * value * value * value * value + T::new(126.0) * value * value * value - T::new(67.0) * value * value + T::new(15.0) * value } pub fn ease_out_elastic_big(value: T) -> T { T::new(56.0) * value * value * value * value * value - T::new(175.0) * value * value * value * value + T::new(200.0) * value * value * value - T::new(100.0) * value * value + T::new(20.0) * value } pub fn ease_in_out_quadric(value: T) -> T { ease_in_out(value, ease_in_quadric, ease_out_quadric) } pub fn ease_in_out_cubic(value: T) -> T { ease_in_out(value, ease_in_cubic, ease_out_cubic) } pub fn ease_in_out_quartic(value: T) -> T { ease_in_out(value, ease_in_quartic, ease_out_quartic) } pub fn ease_in_out_quintic(value: T) -> T { ease_in_out(value, ease_in_quintic, ease_out_quintic) } pub fn ease_in_out_sinusodial(value: T) -> T { -T::new(0.5) * (Angle::Deg(T::new(180.0) * value) .into_rad() .into_inner() .cos() - T::one()) } pub fn ease_in_out_circular(value: T) -> T { ease_in_out(value, ease_in_circular, ease_out_circular) } pub fn ease_in_out_back_cubic(value: T) -> T { ease_in_out(value, ease_in_back_cubic, ease_out_back_cubic) } pub fn ease_in_out_back_quadtric(value: T) -> T { ease_in_out(value, ease_in_back_quadric, ease_out_back_quadric) } pub fn ease_in_out_elasic_small(value: T) -> T { ease_in_out(value, ease_in_elastic_small, ease_out_elastic_small) } pub fn ease_in_out_elasic_big(value: T) -> T { ease_in_out(value, ease_in_elastic_big, ease_out_elastic_big) } pub fn ease_in_out(value: T, f1: F1, f2: F2) -> T where T: Float + Ord, F1: FnOnce(T) -> T, F2: FnOnce(T) -> T, { if value < T::new(0.5) { T::new(0.5) * f1(T::new(2.0) * value) } else { T::new(0.5) * f2(T::new(2.0) * (value - T::new(0.5))) + T::new(0.5) } }