use core::f32::consts::TAU;
#[inline(always)]
pub fn parabolic_sin(t: f32) -> f32 {
wave_sin(t * (1.0 / TAU))
}
#[inline(always)]
pub fn parabolic_cos(t: f32) -> f32 {
wave_sin(t * (1.0 / TAU) + 0.25)
}
#[inline(always)]
pub fn wave_sin(t: f32) -> f32 {
let f = micromath::F32Ext::fract(t);
let x = if f < 0.0 { f + 1.0 } else { f };
let phase: f32 = 1.0 - 2.0 * x;
4.0 * phase * (1.0 - micromath::F32Ext::abs(phase))
}
#[inline(always)]
pub fn wave_cos(t: f32) -> f32 {
wave_sin(t + 0.25)
}
#[inline]
pub(crate) fn sqrt(x: f32) -> f32 {
micromath::F32Ext::sqrt(x)
}
#[inline]
pub(crate) fn sin(x: f32) -> f32 {
parabolic_sin(x)
}
#[inline]
pub(crate) fn cos(x: f32) -> f32 {
parabolic_cos(x)
}
#[cfg(feature = "std")]
#[inline]
pub(crate) fn powf(base: f32, exp: f32) -> f32 {
base.powf(exp)
}
#[cfg(not(feature = "std"))]
#[inline]
pub(crate) fn powf(base: f32, exp: f32) -> f32 {
use micromath::F32Ext;
base.powf(exp)
}
#[cfg(feature = "std")]
#[inline]
pub(crate) fn powi(base: f32, exp: i32) -> f32 {
base.powi(exp)
}
#[cfg(not(feature = "std"))]
#[inline]
pub(crate) fn powi(base: f32, exp: i32) -> f32 {
use micromath::F32Ext;
base.powi(exp)
}
#[inline]
pub(crate) fn round(x: f32) -> f32 {
micromath::F32Ext::round(x)
}
#[inline]
pub(crate) fn floor(x: f32) -> f32 {
micromath::F32Ext::floor(x)
}
#[inline]
pub(crate) fn ceil(x: f32) -> f32 {
micromath::F32Ext::ceil(x)
}