1use crate::{f32::math, float::FloatExt};
4
5impl crate::sealed::Sealed for f32 {}
6
7impl FloatExt for f32 {
8 #[inline]
9 fn lerp(self, rhs: Self, t: Self) -> Self {
10 self * (1.0 - t) + rhs * t
11 }
12
13 #[inline]
14 fn lerp_monotonic(self, rhs: Self, t: Self) -> Self {
15 self + (rhs - self) * t
16 }
17
18 #[inline]
19 fn inverse_lerp(a: Self, b: Self, v: Self) -> Self {
20 (v - a) / (b - a)
21 }
22
23 #[inline]
24 fn smoothstep(self, edge0: Self, edge1: Self) -> Self {
25 let t = ((self - edge0) / (edge1 - edge0)).clamp(0.0, 1.0);
26 t * t * (3.0 - 2.0 * t)
27 }
28
29 #[inline]
30 fn remap(self, in_start: Self, in_end: Self, out_start: Self, out_end: Self) -> Self {
31 let t = Self::inverse_lerp(in_start, in_end, self);
32 Self::lerp(out_start, out_end, t)
33 }
34
35 #[inline]
36 fn fract_gl(self) -> Self {
37 self - math::floor(self)
38 }
39
40 #[inline]
41 fn step(self, value: Self) -> Self {
42 if value < self { 0.0 } else { 1.0 }
43 }
44
45 #[inline]
46 fn saturate(self) -> Self {
47 self.clamp(0.0, 1.0)
48 }
49
50 #[inline]
51 fn move_towards(self, rhs: Self, d: Self) -> Self {
52 let a = rhs - self;
53 if a.abs() <= d {
54 rhs
55 } else {
56 self + a.signum() * d
57 }
58 }
59}