1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ix!();

use crate::MyFloat;

#[inline] 
pub fn cubic_interpolate(
    y0: f32,
    y1: f32,
    y2: f32,
    y3: f32,
    mu: f32) -> f32 
{
    let mu2: f32 = mu * mu;
    let a0: f32  = y3 - y2 - y0 + y1;
    let a1: f32  = y0 - y1 - a0;
    let a2: f32  = y2 - y0;
    let a3: f32  = y1;

    a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3
}

#[inline] 
pub fn lerp<T: MyFloat>(x: T, a: T, b: T) -> T {
    {
        let valid_range = T::from(0.0)..T::from(1.0);
        assert!(valid_range.contains(&Some(x)));
    }

    (T::from(1.0).unwrap() - x) * a + x * b
}