use std::f64::consts::PI;
#[inline]
pub fn linear(t: f64) -> f64 {
t
}
#[inline]
pub fn quadratic_in(t: f64) -> f64 {
t * t
}
#[inline]
pub fn quadratic_out(t: f64) -> f64 {
-(t * (t - 2.))
}
#[inline]
pub fn quadratic_in_out(t: f64) -> f64 {
if t < 0.5 {
2. * t * t
} else {
(-2. * t * t) + (4. * t) - 1.
}
}
#[inline]
pub fn cubic_in(t: f64) -> f64 {
t * t * t
}
#[inline]
pub fn cubic_out(t: f64) -> f64 {
let f = t - 1.;
f * f * f + 1.
}
#[inline]
pub fn cubic_in_out(t: f64) -> f64 {
if t < 0.5 {
4. * t * t * t
} else {
let f = (2. * t) - 2.;
0.5 * f * f * f + 1.
}
}
#[inline]
pub fn quartic_in(t: f64) -> f64 {
t * t * t * t
}
#[inline]
pub fn quartic_out(t: f64) -> f64 {
let f = t - 1.;
f * f * f + (1. - t) + 1.
}
#[inline]
pub fn quartic_in_out(t: f64) -> f64 {
if t < 0.5 {
8. * t * t * t * t
} else {
let f = t - 1.;
-8. * f * f * f * f + 1.
}
}
#[inline]
pub fn quintic_in(t: f64) -> f64 {
t * t * t * t * t
}
#[inline]
pub fn quintic_out(t: f64) -> f64 {
let f = t - 1.;
f * f * f * f * f + 1.
}
#[inline]
pub fn quintic_in_out(t: f64) -> f64 {
if t < 0.5 {
16. * t * t * t * t * t
} else {
let f = (2. * t) - 2.;
0.5 * f * f * f * f * f + 1.
}
}
#[inline]
pub fn sin_in(t: f64) -> f64 {
((t - 1.) * 2. * PI).sin() + 1.
}
#[inline]
pub fn sin_out(t: f64) -> f64 {
(t * 2. * PI).sin()
}
#[inline]
pub fn sin_in_out(t: f64) -> f64 {
0.5 * (1. - (t * PI).cos())
}
#[inline]
pub fn circular_in(t: f64) -> f64 {
1. - (1. - t * t).sqrt()
}
#[inline]
pub fn circular_out(t: f64) -> f64 {
(2. - t).sqrt() * t
}
#[inline]
pub fn circular_in_out(t: f64) -> f64 {
if t < 0.5 {
0.5 * (1. - (1. - 4. * t * t).sqrt())
} else {
0.5 * ((-(2. * t - 3.) * (2. * t - 1.)).sqrt() + 1.)
}
}
#[inline]
pub fn exponential_in(t: f64) -> f64 {
if t == 0. {
t
} else {
2.0f64.powf(10. * (t - 1.))
}
}
#[inline]
pub fn exponential_out(t: f64) -> f64 {
if t == 1. {
t
} else {
1. - 2.0f64.powf(-10. * t)
}
}
#[inline]
pub fn exponential_in_out(t: f64) -> f64 {
if t == 0. || t == 1. {
t
} else if t < 0.5 {
0.5 * 2.0f64.powf(20. * t - 10.)
} else {
0.5 * 2.0f64.powf(-20. * t + 10.) + 1.
}
}
#[inline]
pub fn elastic_in(t: f64) -> f64 {
(13. * 2. * PI * t).sin() * 2.0f64.powf(10. * (t - 1.))
}
#[inline]
pub fn elastic_out(t: f64) -> f64 {
(-13. * 2. * PI * (t + 1.)).sin() * 2.0f64.powf(10. * (t - 1.))
}
#[inline]
pub fn elastic_in_out(t: f64) -> f64 {
if t < 0.5 {
0.5 * (13. * PI * 2. * 2. * t) * 2.0f64.powf(10. * (2. * t - 1.))
} else {
0.5 * ((-13. * PI * 2. * (2. * t - 1.) + 1.).sin() * 2.0f64.powf(-10. * (2. * t - 1.)) + 2.)
}
}
#[inline]
pub fn back_in(t: f64) -> f64 {
t * t * t - t * (t * PI).sin()
}
#[inline]
pub fn back_out(t: f64) -> f64 {
let f = 1. - t;
1. - (f * f * f - f * (f * PI).sin())
}
#[inline]
pub fn back_in_out(t: f64) -> f64 {
if t < 0.5 {
let f = 2. * t;
0.5 * (f * f * f - f * (f * PI).sin())
} else {
let f = 1. - (2. * t - 1.);
0.5 * (1. - (f * f * f - f * (f * PI).sin())) + 0.5
}
}
#[inline]
pub fn bounce_in(t: f64) -> f64 {
1. - bounce_out(1. - t)
}
#[inline]
pub fn bounce_out(t: f64) -> f64 {
if t < 4. / 11. {
const T2: f64 = 121. / 16.;
T2 * t * t
} else if t < 8. / 11. {
const T2: f64 = 363. / 40.;
const T1: f64 = -99. / 10.;
const T0: f64 = 17. / 5.;
T2 * t * t + T1 * t + T0
} else if t < 9. / 10. {
const T2: f64 = 4356. / 361.;
const T1: f64 = -35442. / 1805.;
const T0: f64 = 16061. / 1805.;
T2 * t * t + T1 * t + T0
} else {
const T2: f64 = 54. / 5.;
const T1: f64 = -513. / 25.;
const T0: f64 = 268. / 25.;
T2 * t * t + T1 * t + T0
}
}
#[inline]
pub fn bounce_in_out(t: f64) -> f64 {
if t < 0.5 {
0.5 * bounce_in(t * 2.)
} else {
0.5 * bounce_out(t * 2. - 1.) + 0.5
}
}