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
use crate::prelude::*;

pub fn cross(a: &F3, b: &F3) -> F3 {
    a.cross(b)
}

pub fn dot(a: &F3, b: &F3) -> F {
    a.dot(b)
}

pub fn normalize(a: & F3) -> F3 {
    a.normalize()
}

pub fn length(a: & F3) -> F {
    a.length()
}

pub fn mix(a: &F3, b: &F3, v: &F) -> F3 {
    F3::new(
        (1.0 - v) * a.x + b.x * v,
        (1.0 - v) * a.y + b.y * v,
        (1.0 - v) * a.z + b.z * v
    )
}

pub fn mix_f(a: &F, b: &F, v: &F) -> F {
    (1.0 - v) * a + b * v
}

pub fn smoothstep(e0: F, e1: F, x: F) -> F {
    let t = ((x - e0) / (e1 - e0)). clamp(0.0, 1.0);
    return t * t * (3.0 - 2.0 * t);
}

pub fn pow(a: &F3, exp: &F3) -> F3 {
    F3::new(
        a.x.powf(exp.x),
        a.y.powf(exp.y),
        a.z.powf(exp.z),
    )
}