(
origin: &[f32; 3], dir: &[f32; 3],
v0: &[f32; 3], v1: &[f32; 3], v2: &[f32; 3],
)
| 225 | // ============================================================ |
| 226 | |
| 227 | fn ray_triangle_intersection( |
| 228 | origin: &[f32; 3], dir: &[f32; 3], |
| 229 | v0: &[f32; 3], v1: &[f32; 3], v2: &[f32; 3], |
| 230 | ) -> Option<(f32, f32, f32)> { |
| 231 | const EPSILON: f32 = 1e-7; |
| 232 | |
| 233 | let e1 = [v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2]]; |
| 234 | let e2 = [v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2]]; |
| 235 | |
| 236 | let h = cross(dir, &e2); |
| 237 | let a = dot(&e1, &h); |
| 238 | if a.abs() < EPSILON { return None; } |
| 239 | |
| 240 | let f = 1.0 / a; |
| 241 | let s = [origin[0]-v0[0], origin[1]-v0[1], origin[2]-v0[2]]; |
| 242 | let u = f * dot(&s, &h); |
| 243 | if u < 0.0 || u > 1.0 { return None; } |
| 244 | |
| 245 | let q = cross(&s, &e1); |
| 246 | let v = f * dot(dir, &q); |
| 247 | if v < 0.0 || u + v > 1.0 { return None; } |
| 248 | |
| 249 | let t = f * dot(&e2, &q); |
| 250 | if t > EPSILON { |
| 251 | Some((t, u, v)) |
| 252 | } else { |
| 253 | None |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | fn cross(a: &[f32; 3], b: &[f32; 3]) -> [f32; 3] { |
| 258 | [ |
no test coverage detected