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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#[inline(always)]
pub fn clamp(v: f64, l: f64, h: f64) -> f64 {
    if v < l {
        l
    } else if v > h {
        h
    } else {
        v
    }
}

#[inline(always)]
pub fn lerp(t: f64, a: f64, b: f64) -> f64 {
    a + t * (b - a)
}

#[inline(always)]
pub fn is_power_of_2(n: f64) -> bool {
    let nn = n as i64;
    ((nn - 1) & nn) != 0
}

#[inline(always)]
pub fn hermite_blend(t: f64) -> f64 {
    (t * t * (3.0 - 2.0 * t))
}

#[inline(always)]
pub fn quintic_blend(t: f64) -> f64 {
    t * t * t * (t * (t * 6.0 - 15.0) + 10.0)
}

#[inline(always)]
pub fn array_dot(arr: &[f64], a: f64, b: f64) -> f64 {
    a * arr[0] + b * arr[1]
}

#[inline(always)]
pub fn array_dot_3(arr: &[f64], a: f64, b: f64, c: f64) -> f64 {
    a * arr[0] + b * arr[1] + c * arr[2]
}

#[inline(always)]
pub fn array_dot_4(arr: &[f64], a: f64, b: f64, c: f64, d: f64) -> f64 {
    a * arr[0] + b * arr[1] + c * arr[2] + d * arr[3]
}

#[inline(always)]
pub fn array_dot_6(arr: &[f64], a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) -> f64 {
    a * arr[0] + b * arr[1] + c * arr[2] + d * arr[3] + e * arr[4] + f * arr[5]
}

#[inline(always)]
pub fn fast_floor(t: f64) -> i32 {
    return if t > 0.0 { t as i32 } else { (t - 1.0) as i32 };
}

#[inline(always)]
pub fn bias(b: f64, t: f64) -> f64 {
    return t.powf(b.ln() / 0.5f64.ln());
}

#[inline(always)]
pub fn gain(g: f64, t: f64) -> f64 {
    if t < 0.5 {
        return bias(1.0 - g, 2.0 * t) / 2.0;
    } else {
        return 1.0 - bias(1.0 - g, 2.0 - 2.0 * t) / 2.0;
    }
}

pub fn min<'a, T>(a: &'a T, b: &'a T) -> &'a T
    where T: ::std::cmp::PartialOrd
{
    match a.partial_cmp(b).unwrap() {
        ::std::cmp::Ordering::Equal |
        ::std::cmp::Ordering::Less => a,
        ::std::cmp::Ordering::Greater => b,
    }
}

pub fn max<'a, T>(a: &'a T, b: &'a T) -> &'a T
    where T: ::std::cmp::PartialOrd
{
    match a.partial_cmp(b).unwrap() {
        ::std::cmp::Ordering::Greater |
        ::std::cmp::Ordering::Equal => a,
        ::std::cmp::Ordering::Less => b,
    }
}