Add Acceleration Structure Interface
This commit is contained in:
parent
0b3daf9441
commit
24bf8753b2
8 changed files with 519 additions and 2 deletions
43
ray-tracing-scene/src/util.rs
Normal file
43
ray-tracing-scene/src/util.rs
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
use ray_tracing_core::prelude::*;
|
||||
|
||||
pub fn triangle_intersection(ray: Ray, v: [Pos3; 3]) -> Option<Float> {
|
||||
let e1 = v[1] - v[0];
|
||||
let e2 = v[2] - v[0];
|
||||
|
||||
let ray_cross_e2 = Dir3::cross(ray.dir(), e2);
|
||||
let det = e1.dot(ray_cross_e2);
|
||||
|
||||
if det > -f32::EPSILON && det < f32::EPSILON {
|
||||
return None; // This ray is parallel to this triangle.
|
||||
}
|
||||
|
||||
let inv_det = 1.0 / det;
|
||||
let s = ray.start() - v[0];
|
||||
let u = inv_det * s.dot(ray_cross_e2);
|
||||
if !(0.0..=1.0).contains(&u) {
|
||||
return None;
|
||||
}
|
||||
|
||||
let s_cross_e1 = s.cross(e1);
|
||||
let v = inv_det * Dir3::dot(ray.dir(), s_cross_e1);
|
||||
if v < 0.0 || u + v > 1.0 {
|
||||
return None;
|
||||
}
|
||||
// At this stage we can compute t to find out where the intersection point is on the line.
|
||||
let t = inv_det * e2.dot(s_cross_e1);
|
||||
|
||||
if t > Float::EPSILON {
|
||||
// ray intersection
|
||||
Some(t)
|
||||
} else {
|
||||
// This means that there is a line intersection but not a ray intersection.
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn triangle_normal(v: [Pos3; 3]) -> Dir3 {
|
||||
let e1 = v[1] - v[0];
|
||||
let e2 = v[2] - v[0];
|
||||
|
||||
Dir3::cross(e1, e2)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue