diff --git a/src/hittable.rs b/src/hittable.rs index 4a7301b..48b3c9d 100644 --- a/src/hittable.rs +++ b/src/hittable.rs @@ -16,16 +16,16 @@ impl HitRecord<'_> { HitRecord { p: Point3::new(0.0, 0.0, 0.0), normal: Vec3::new(0.0, 0.0, 0.0), t: 0.0, front_face: false, mat_ptr: material } } - pub fn set_face_normal(&mut self, r: &Ray, outward_normal: &Vec3) { - self.front_face = r.direction().dot(outward_normal) < 0.0; + pub fn set_face_normal(&mut self, r: &Ray, outward_normal: Vec3) { + self.front_face = r.direction().dot(&outward_normal) < 0.0; self.normal = if self.front_face { - *outward_normal + outward_normal } else { - *outward_normal * -1.0 + outward_normal * -1.0 } } } pub trait Hittable { - fn hit(&mut self, r: &Ray, t_min: f64, t_max: f64, rec: &mut HitRecord) -> bool; + fn hit(&mut self, r: &Ray, t_min: f64, t_max: f64) -> Option; } \ No newline at end of file diff --git a/src/hittable_list.rs b/src/hittable_list.rs index 1d8d802..1b157c8 100644 --- a/src/hittable_list.rs +++ b/src/hittable_list.rs @@ -19,19 +19,17 @@ impl HittableList { } impl Hittable for HittableList { - fn hit(&mut self, r: &crate::ray::Ray, t_min: f64, t_max: f64, rec: &mut HitRecord) -> bool { - let mut temp_rec = HitRecord::new_empty(rec.mat_ptr.clone()); - let mut hit_anything = false; + fn hit(&mut self, r: &crate::ray::Ray, t_min: f64, t_max: f64) -> Option { + let mut temp_rec = None; let mut closest_so_far = t_max; for object in &mut self.objects { - if object.hit(r, t_min, closest_so_far, &mut temp_rec) { - hit_anything = true; - closest_so_far = temp_rec.t; - *rec = temp_rec.clone(); + if let Some(rec) = object.hit(r, t_min, closest_so_far) { + closest_so_far = rec.t; + temp_rec = Some(rec); } } - hit_anything + temp_rec } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 23ac560..8f08f82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,7 +23,7 @@ use crate::{ camera::*, }; -fn ray_color(r: &Ray, world: &mut dyn Hittable, depth: i32) -> Color { +fn ray_color(r: &Ray, world: &dyn Hittable, depth: i32) -> Color { let mut rec = HitRecord::new_empty(&Metal{ albedo: Color::new_empty() }); // Limit the bounces @@ -31,7 +31,7 @@ fn ray_color(r: &Ray, world: &mut dyn Hittable, depth: i32) -> Color { return Color::new(0.0, 0.0, 0.0); } - if world.hit(r, 0.001, INFINITY, &mut rec) { + if let Some(rec) = world.hit(r, 0.001, INFINITY) { let mut scattered = Ray::new_empty(); let mut attenuation = Color::new_empty(); @@ -54,8 +54,8 @@ fn main() { // World let mut world = HittableList::new_empty(); - //world.add(Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5))); - //world.add(Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0))); + world.add(Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5))); + world.add(Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0))); // Camera let cam = Camera::new();