declare_tween!(
pub struct ExpoIn;
pub fn expo_in;
pub fn expo_in_at;
pub fn tween<Value: crate::TweenValue>(&mut self, value_delta: Value, percent: f32) -> Value {
if percent == 0.0 {
return value_delta.scale(0.0);
}
let percent = 10.0 * (percent - 1.0);
#[cfg(feature = "libm")]
let scalar = libm::powf(2.0, percent);
#[cfg(feature = "std")]
let scalar = 2.0f32.powf(percent);
value_delta.scale(scalar)
}
);
declare_tween!(
pub struct ExpoOut;
pub fn expo_out;
pub fn expo_out_at;
pub fn tween<Value: crate::TweenValue>(&mut self, value_delta: Value, percent: f32) -> Value {
if percent == 1.0 {
value_delta
} else {
#[cfg(feature = "libm")]
let powf = libm::powf(2.0, -10.0 * percent);
#[cfg(feature = "std")]
let powf = 2.0f32.powf(-10.0 * percent);
value_delta.scale(1.0 - powf)
}
}
);
declare_tween!(
pub struct ExpoInOut;
pub fn expo_in_out;
pub fn expo_in_out_at;
pub fn tween<Value: crate::TweenValue>(&mut self, value_delta: Value, mut percent: f32) -> Value {
if percent == 0.0 {
return value_delta.scale(0.0);
}
if percent == 1.0 {
return value_delta;
}
percent *= 2.0;
let powf = if percent < 1.0 {
#[cfg(feature = "libm")]
let scalar = libm::powf(2.0, 10.0 * (percent - 1.0));
#[cfg(feature = "std")]
let scalar = 2.0f32.powf(10.0 * (percent - 1.0));
scalar / 2.0
} else {
let percent = percent - 1.0;
#[cfg(feature = "libm")]
let scalar = libm::powf(2.0, -10.0 * percent);
#[cfg(feature = "std")]
let scalar = 2.0f32.powf(-10.0 * percent);
(2.0 - scalar) / 2.0
};
value_delta.scale(powf)
}
);
test_tween!(Expo);