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