1pub fn triangle(
11 origin: [f32; 3],
12 direction: [f32; 3],
13 vertices: [[f32; 3]; 3],
14 maximum: f32,
15) -> Option<f32> {
16 let [a, b, c] = vertices;
17 let e = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];
18 let f = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];
19 let d = direction;
20 let p = [
21 f[2] * d[1] - f[1] * d[2],
22 f[0] * d[2] - f[2] * d[0],
23 f[1] * d[0] - f[0] * d[1],
24 ];
25 let det = p[1] * e[1] + p[0] * e[0] + p[2] * e[2];
26 let s = [origin[0] - a[0], origin[1] - a[1], origin[2] - a[2]];
27 let q = [
28 s[1] * e[2] - s[2] * e[1],
29 s[2] * e[0] - s[0] * e[2],
30 s[0] * e[1] - s[1] * e[0],
31 ];
32 let u = s[1] * p[1] + s[0] * p[0] + s[2] * p[2];
33 let v = q[1] * d[1] + q[0] * d[0] + q[2] * d[2];
34 if !(0.0 < det && 0.0 <= u && u <= det && 0.0 <= v && v + u <= det) {
35 return None;
36 }
37 let t = (q[1] * f[1] + q[0] * f[0] + q[2] * f[2]) * (1.0 / det);
38 (0.0 <= t && t <= maximum).then_some(t)
39}
40
41pub fn face_normal(vertices: [[f32; 3]; 3]) -> [f32; 3] {
44 let [a, b, c] = vertices;
45 let e = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];
46 let f = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];
47 let n = [
48 f[2] * e[1] - f[1] * e[2],
49 f[0] * e[2] - f[2] * e[0],
50 f[1] * e[0] - f[0] * e[1],
51 ];
52 let len = (n[1] * n[1] + n[0] * n[0] + n[2] * n[2]).sqrt();
53 if len == 0.0 {
54 return n;
55 }
56 let inv = 1.0 / len;
57 [inv * n[0], inv * n[1], inv * n[2]]
58}
59
60pub fn point(origin: [f32; 3], direction: [f32; 3], t: f32) -> [f32; 3] {
62 [
63 t * direction[0] + origin[0],
64 t * direction[1] + origin[1],
65 t * direction[2] + origin[2],
66 ]
67}