From c9b42d94b35b926da2daefce07f6a77dbf8155dc Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Fri, 16 Jul 2021 21:14:23 -0700 Subject: [PATCH] intersections: now store object in Intersection. --- rtchallenge/src/intersections.rs | 11 ++++++++++- rtchallenge/src/spheres.rs | 23 +++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/rtchallenge/src/intersections.rs b/rtchallenge/src/intersections.rs index 9e8bba6..72bf17c 100644 --- a/rtchallenge/src/intersections.rs +++ b/rtchallenge/src/intersections.rs @@ -2,6 +2,7 @@ use std::ops::Index; use crate::spheres::Sphere; +#[derive(Debug, PartialEq)] pub struct Intersection<'i> { pub t: f32, pub object: &'i Sphere, @@ -31,7 +32,9 @@ impl<'i> Intersection<'i> { /// ``` /// use rtchallenge::{ /// intersections::{Intersection, Intersections}, -/// spheres::Sphere, +/// rays::Ray, +/// spheres::{intersect, Sphere}, +/// tuples::Tuple, /// }; /// /// let s = Sphere::default(); @@ -41,6 +44,12 @@ impl<'i> Intersection<'i> { /// assert_eq!(xs.len(), 2); /// assert_eq!(xs[0].t, 1.); /// assert_eq!(xs[1].t, 2.); +/// +/// let r = Ray::new(Tuple::point(0., 0., -5.), Tuple::vector(0., 0., 1.)); +/// let xs = intersect(&s, &r); +/// assert_eq!(xs.len(), 2); +/// assert_eq!(xs[0].object, &s); +/// assert_eq!(xs[1].object, &s); /// ``` pub struct Intersections<'i>(Vec>); diff --git a/rtchallenge/src/spheres.rs b/rtchallenge/src/spheres.rs index 7568ebd..cf16436 100644 --- a/rtchallenge/src/spheres.rs +++ b/rtchallenge/src/spheres.rs @@ -1,4 +1,5 @@ use crate::{ + intersections::Intersection, rays::Ray, tuples::{dot, Tuple}, }; @@ -12,6 +13,7 @@ pub struct Sphere {} /// # Examples /// ``` /// use rtchallenge::{ +/// intersections::Intersection, /// rays::Ray, /// spheres::{intersect, Sphere}, /// tuples::Tuple, @@ -21,7 +23,10 @@ pub struct Sphere {} /// let r = Ray::new(Tuple::point(0., 0., -5.), Tuple::vector(0., 0., 1.)); /// let s = Sphere::default(); /// let xs = intersect(&s, &r); -/// assert_eq!(xs, vec![4., 6.]); +/// assert_eq!( +/// xs, +/// vec![Intersection::new(4., &s), Intersection::new(6., &s)] +/// ); /// /// // A ray intersects a sphere at a tangent. /// let r = Ray::new(Tuple::point(0., 2., -5.), Tuple::vector(0., 0., 1.)); @@ -33,15 +38,21 @@ pub struct Sphere {} /// let r = Ray::new(Tuple::point(0., 0., 0.), Tuple::vector(0., 0., 1.)); /// let s = Sphere::default(); /// let xs = intersect(&s, &r); -/// assert_eq!(xs, vec![-1., 1.]); +/// assert_eq!( +/// xs, +/// vec![Intersection::new(-1., &s), Intersection::new(1., &s)] +/// ); /// /// // A sphere is behind a ray. /// let r = Ray::new(Tuple::point(0., 0., 5.), Tuple::vector(0., 0., 1.)); /// let s = Sphere::default(); /// let xs = intersect(&s, &r); -/// assert_eq!(xs, vec![-6., -4.]); +/// assert_eq!( +/// xs, +/// vec![Intersection::new(-6., &s), Intersection::new(-4., &s)] +/// ); /// ``` -pub fn intersect(_sphere: &Sphere, ray: &Ray) -> Vec { +pub fn intersect<'s>(sphere: &'s Sphere, ray: &Ray) -> Vec> { let sphere_to_ray = ray.origin - Tuple::point(0., 0., 0.); let a = dot(ray.direction, ray.direction); let b = 2. * dot(ray.direction, sphere_to_ray); @@ -51,8 +62,8 @@ pub fn intersect(_sphere: &Sphere, ray: &Ray) -> Vec { vec![] } else { vec![ - (-b - discriminant.sqrt()) / (2. * a), - (-b + discriminant.sqrt()) / (2. * a), + Intersection::new((-b - discriminant.sqrt()) / (2. * a), &sphere), + Intersection::new((-b + discriminant.sqrt()) / (2. * a), &sphere), ] } }