psychopath/src/triangle.rs

35 lines
899 B
Rust

#![allow(dead_code)]
use std;
use ray::Ray;
use math::{Point, cross, dot};
/// Intersects ray with tri, returning (t, u, v), or None if no intersection.
pub fn intersect_ray(ray: &Ray, tri: (Point, Point, Point)) -> Option<(f32, f32, f32)> {
let edge1 = tri.1 - tri.0;
let edge2 = tri.2 - tri.0;
let pvec = cross(ray.dir, edge2);
let det = dot(edge1, pvec);
if det <= -std::f32::EPSILON || det >= std::f32::EPSILON {
let inv_det = 1.0 / det;
let tvec = ray.orig - tri.0;
let qvec = cross(tvec, edge1);
let u = dot(tvec, pvec) * inv_det;
if u < 0.0 || u > 1.0 {
return None;
}
let v = dot(ray.dir, qvec) * inv_det;
if v < 0.0 || (u + v) > 1.0 {
return None;
}
let t = dot(edge2, qvec) * inv_det;
return Some((t, u, v));
} else {
return None;
}
}