From 5ba579a374c57949de298f19d3bebc9f309fa26a Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Mon, 10 Sep 2018 21:01:40 -0700 Subject: [PATCH] Use Box instead of reference in HitableList. --- rtiow/src/bin/tracer.rs | 54 +++++++++++---------- rtiow/src/bin/tracer_dielectric.rs | 27 ++++++----- rtiow/src/bin/tracer_material.rs | 21 ++++---- rtiow/src/bin/tracer_positionable_camera.rs | 27 ++++++----- rtiow/src/hitable.rs | 2 +- rtiow/src/hitable_list.rs | 19 ++------ rtiow/src/material.rs | 2 +- 7 files changed, 76 insertions(+), 76 deletions(-) diff --git a/rtiow/src/bin/tracer.rs b/rtiow/src/bin/tracer.rs index 861e4b5..7745348 100644 --- a/rtiow/src/bin/tracer.rs +++ b/rtiow/src/bin/tracer.rs @@ -35,37 +35,41 @@ fn main() -> Result<(), std::io::Error> { let ny = 100; let ns = 100; println!("P3\n{} {}\n255", nx, ny); - let objects = vec![ - Sphere::new( - Vec3::new(0., 0., -1.), - 0.5, - Box::new(Lambertian::new(Vec3::new(0.1, 0.2, 0.5))), - ), - Sphere::new( - Vec3::new(0., -100.5, -1.), - 100., - Box::new(Lambertian::new(Vec3::new(0.8, 0.8, 0.))), - ), - Sphere::new( - Vec3::new(1., 0., -1.), - 0.5, - Box::new(Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.2)), - ), - Sphere::new(Vec3::new(-1., 0., -1.), 0.5, Box::new(Dielectric::new(1.5))), - Sphere::new( - Vec3::new(-1., 0., -1.), - -0.45, - Box::new(Dielectric::new(1.5)), - ), - ]; let cam = Camera::new_lookfrom_vfov( Vec3::new(-2., 2., 1.), Vec3::new(0., 0., -1.), Vec3::new(0., 1., 0.), - 90., + 45., nx as f32 / ny as f32, ); - let world = HitableList::new(objects.iter().map(|o| o).collect()); + // TODO(wathiede): Box this instead of using references. + let world = HitableList::new(vec![ + Box::new(Sphere::new( + Vec3::new(0., 0., -1.), + 0.5, + Box::new(Lambertian::new(Vec3::new(0.1, 0.2, 0.5))), + )), + Box::new(Sphere::new( + Vec3::new(0., -100.5, -1.), + 100., + Box::new(Lambertian::new(Vec3::new(0.8, 0.8, 0.))), + )), + Box::new(Sphere::new( + Vec3::new(1., 0., -1.), + 0.5, + Box::new(Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.2)), + )), + Box::new(Sphere::new( + Vec3::new(-1., 0., -1.), + 0.5, + Box::new(Dielectric::new(1.5)), + )), + Box::new(Sphere::new( + Vec3::new(-1., 0., -1.), + -0.45, + Box::new(Dielectric::new(1.5)), + )), + ]); for j in (0..ny).rev() { for i in 0..nx { let mut col: Vec3 = Default::default(); diff --git a/rtiow/src/bin/tracer_dielectric.rs b/rtiow/src/bin/tracer_dielectric.rs index fd4de3d..a4a4d69 100644 --- a/rtiow/src/bin/tracer_dielectric.rs +++ b/rtiow/src/bin/tracer_dielectric.rs @@ -35,31 +35,34 @@ fn main() -> Result<(), std::io::Error> { let ny = 100; let ns = 100; println!("P3\n{} {}\n255", nx, ny); - let objects = vec![ - Sphere::new( + let world = HitableList::new(vec![ + Box::new(Sphere::new( Vec3::new(0., 0., -1.), 0.5, Box::new(Lambertian::new(Vec3::new(0.1, 0.2, 0.5))), - ), - Sphere::new( + )), + Box::new(Sphere::new( Vec3::new(0., -100.5, -1.), 100., Box::new(Lambertian::new(Vec3::new(0.8, 0.8, 0.))), - ), - Sphere::new( + )), + Box::new(Sphere::new( Vec3::new(1., 0., -1.), 0.5, Box::new(Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.2)), - ), - Sphere::new(Vec3::new(-1., 0., -1.), 0.5, Box::new(Dielectric::new(1.5))), - Sphere::new( + )), + Box::new(Sphere::new( + Vec3::new(-1., 0., -1.), + 0.5, + Box::new(Dielectric::new(1.5)), + )), + Box::new(Sphere::new( Vec3::new(-1., 0., -1.), -0.45, Box::new(Dielectric::new(1.5)), - ), - ]; + )), + ]); let cam = Camera::new2x1(); - let world = HitableList::new(objects.iter().map(|o| o).collect()); for j in (0..ny).rev() { for i in 0..nx { let mut col: Vec3 = Default::default(); diff --git a/rtiow/src/bin/tracer_material.rs b/rtiow/src/bin/tracer_material.rs index 7affaf2..b47e461 100644 --- a/rtiow/src/bin/tracer_material.rs +++ b/rtiow/src/bin/tracer_material.rs @@ -34,30 +34,29 @@ fn main() -> Result<(), std::io::Error> { let ny = 100; let ns = 100; println!("P3\n{} {}\n255", nx, ny); - let objects = vec![ - Sphere::new( + let world = HitableList::new(vec![ + Box::new(Sphere::new( Vec3::new(0., 0., -1.), 0.5, Box::new(Lambertian::new(Vec3::new(0.8, 0.3, 0.3))), - ), - Sphere::new( + )), + Box::new(Sphere::new( Vec3::new(0., -100.5, -1.), 100., Box::new(Lambertian::new(Vec3::new(0.8, 0.8, 0.))), - ), - Sphere::new( + )), + Box::new(Sphere::new( Vec3::new(1., 0., -1.), 0.5, Box::new(Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.2)), - ), - Sphere::new( + )), + Box::new(Sphere::new( Vec3::new(-1., 0., -1.), 0.5, Box::new(Metal::new(Vec3::new(0.8, 0.8, 0.8), 0.8)), - ), - ]; + )), + ]); let cam = Camera::new2x1(); - let world = HitableList::new(objects.iter().map(|o| o).collect()); for j in (0..ny).rev() { for i in 0..nx { let mut col: Vec3 = Default::default(); diff --git a/rtiow/src/bin/tracer_positionable_camera.rs b/rtiow/src/bin/tracer_positionable_camera.rs index 861e4b5..fb58629 100644 --- a/rtiow/src/bin/tracer_positionable_camera.rs +++ b/rtiow/src/bin/tracer_positionable_camera.rs @@ -35,29 +35,33 @@ fn main() -> Result<(), std::io::Error> { let ny = 100; let ns = 100; println!("P3\n{} {}\n255", nx, ny); - let objects = vec![ - Sphere::new( + let world = HitableList::new(vec![ + Box::new(Sphere::new( Vec3::new(0., 0., -1.), 0.5, Box::new(Lambertian::new(Vec3::new(0.1, 0.2, 0.5))), - ), - Sphere::new( + )), + Box::new(Sphere::new( Vec3::new(0., -100.5, -1.), 100., Box::new(Lambertian::new(Vec3::new(0.8, 0.8, 0.))), - ), - Sphere::new( + )), + Box::new(Sphere::new( Vec3::new(1., 0., -1.), 0.5, Box::new(Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.2)), - ), - Sphere::new(Vec3::new(-1., 0., -1.), 0.5, Box::new(Dielectric::new(1.5))), - Sphere::new( + )), + Box::new(Sphere::new( + Vec3::new(-1., 0., -1.), + 0.5, + Box::new(Dielectric::new(1.5)), + )), + Box::new(Sphere::new( Vec3::new(-1., 0., -1.), -0.45, Box::new(Dielectric::new(1.5)), - ), - ]; + )), + ]); let cam = Camera::new_lookfrom_vfov( Vec3::new(-2., 2., 1.), Vec3::new(0., 0., -1.), @@ -65,7 +69,6 @@ fn main() -> Result<(), std::io::Error> { 90., nx as f32 / ny as f32, ); - let world = HitableList::new(objects.iter().map(|o| o).collect()); for j in (0..ny).rev() { for i in 0..nx { let mut col: Vec3 = Default::default(); diff --git a/rtiow/src/hitable.rs b/rtiow/src/hitable.rs index eeec7ea..fc4b955 100644 --- a/rtiow/src/hitable.rs +++ b/rtiow/src/hitable.rs @@ -9,6 +9,6 @@ pub struct HitRecord<'m> { pub material: &'m Material, } -pub trait Hit { +pub trait Hit: Sync { fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option; } diff --git a/rtiow/src/hitable_list.rs b/rtiow/src/hitable_list.rs index 11a271d..c020cbb 100644 --- a/rtiow/src/hitable_list.rs +++ b/rtiow/src/hitable_list.rs @@ -3,26 +3,17 @@ use hitable::HitRecord; use ray::Ray; #[derive(Default)] -pub struct HitableList<'a, H> -where - H: Hit + 'a, -{ - list: Vec<&'a H>, +pub struct HitableList { + list: Vec>, } -impl<'a, H> HitableList<'a, H> -where - H: Hit, -{ - pub fn new(list: Vec<&'a H>) -> HitableList { +impl HitableList { + pub fn new(list: Vec>) -> HitableList { HitableList { list } } } -impl<'a, H> Hit for HitableList<'a, H> -where - H: Hit, -{ +impl Hit for HitableList { fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option { let mut min_hit = None; let mut closest_so_far = t_max; diff --git a/rtiow/src/material.rs b/rtiow/src/material.rs index 3cee78e..7bcf0ac 100644 --- a/rtiow/src/material.rs +++ b/rtiow/src/material.rs @@ -28,7 +28,7 @@ pub struct ScatterResponse { pub reflected: bool, } -pub trait Material { +pub trait Material: Sync { fn scatter(&self, r_in: &Ray, rec: &HitRecord) -> ScatterResponse; }