From c3d31458176dbfa4fc5e64f7f236a18137292ad4 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Thu, 2 Jun 2016 22:36:02 -0700 Subject: [PATCH] Fixed bug in ray intersection code. The max_t was getting overwritten during transforms. --- src/ray.rs | 10 ++++++++++ src/tracer.rs | 10 ++++------ todo.txt | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/ray.rs b/src/ray.rs index ef1cc24..02bdb9f 100644 --- a/src/ray.rs +++ b/src/ray.rs @@ -34,4 +34,14 @@ impl Ray { self.dir = self.dir * *mat; self.dir_inv = Vector { co: Float4::new(1.0, 1.0, 1.0, 1.0) / self.dir.co }; } + + pub fn update_from_world_ray(&mut self, wr: &Ray) { + self.orig = wr.orig; + self.dir = wr.dir; + } + + pub fn update_from_xformed_world_ray(&mut self, wr: &Ray, mat: &Matrix4x4) { + self.update_from_world_ray(wr); + self.transform(mat); + } } diff --git a/src/tracer.rs b/src/tracer.rs index 95b394f..ff2b8af 100644 --- a/src/tracer.rs +++ b/src/tracer.rs @@ -68,8 +68,7 @@ impl<'a> Tracer<'a> { for ray in &mut rs[..] { let id = ray.id; let t = ray.time; - *ray = wrays[id as usize]; - ray.transform(&lerp_slice(xforms, t)); + ray.update_from_xformed_world_ray(&wrays[id as usize], &lerp_slice(xforms, t)); } } @@ -95,14 +94,13 @@ impl<'a> Tracer<'a> { for ray in &mut rs[..] { let id = ray.id; let t = ray.time; - *ray = wrays[id as usize]; - ray.transform(&lerp_slice(xforms, t)); + ray.update_from_xformed_world_ray(&wrays[id as usize], + &lerp_slice(xforms, t)); } } else { for ray in &mut rs[..] { let id = ray.id; - let t = ray.time; - *ray = wrays[id as usize]; + ray.update_from_world_ray(&wrays[id as usize]); } } } diff --git a/todo.txt b/todo.txt index f547868..490f5a9 100644 --- a/todo.txt +++ b/todo.txt @@ -1,2 +1,2 @@ -- Basic scene parsing with triangle meshes. +//- Basic scene parsing with triangle meshes. - Unit tests for scene parsing. \ No newline at end of file