use std::cmp::PartialOrd; use std::ops::{Mul, Sub}; use super::numeric::Float; #[inline] pub fn min(a: T, b: T) -> T where T: PartialOrd, { if a.lt(&b) { a } else { b } } #[inline] pub fn max(a: T, b: T) -> T where T: PartialOrd, { if a.gt(&b) { a } else { b } } #[inline] pub fn sqr(a: T) -> T where T: Mul + Copy, { a * a } #[inline] pub fn clamp(low: T, high: T, value: T) -> T where T: PartialOrd, { min(max(value, low), high) } #[inline] pub fn linear_step(low: T, high: T, value: T) -> T where T: Float + PartialOrd, { clamp(T::zero(), T::one(), (value - low) / (high - low)) } #[inline] pub fn smooth_step(low: T, high: T, value: T) -> T where T: Float + PartialOrd, f32: Mul + Sub, { let x = linear_step(low, high, value); x * x * (3.0 - 2.0 * x) }