use super::bezier::{Bezier, EASE, EASE_IN, EASE_IN_OUT, EASE_OUT};
#[derive(Debug, Clone, Copy, Default)]
pub enum Curve {
#[default]
Linear,
Ease,
EaseIn,
EaseOut,
EaseInOut,
Bezier(Bezier),
Custom(fn(f32) -> f32),
}
impl Curve {
pub fn value(&self, progress: f32) -> f32 {
match self {
Curve::Linear => progress,
Curve::Ease => EASE.solve(progress),
Curve::EaseIn => EASE_IN.solve(progress),
Curve::EaseOut => EASE_OUT.solve(progress),
Curve::EaseInOut => EASE_IN_OUT.solve(progress),
Curve::Bezier(bezier) => bezier.solve(progress),
Curve::Custom(f) => f(progress),
}
}
}
impl PartialEq for Curve {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Curve::Linear, Curve::Linear) => true,
(Curve::Ease, Curve::Ease) => true,
(Curve::EaseIn, Curve::EaseIn) => true,
(Curve::EaseOut, Curve::EaseOut) => true,
(Curve::EaseInOut, Curve::EaseInOut) => true,
(Curve::Bezier(a), Curve::Bezier(b)) => a == b,
(Curve::Custom(a), Curve::Custom(b)) => std::ptr::fn_addr_eq(*a, *b),
_ => false,
}
}
}