diff --git a/rtchallenge/src/spheres.rs b/rtchallenge/src/spheres.rs index 64bc3e3..ac85002 100644 --- a/rtchallenge/src/spheres.rs +++ b/rtchallenge/src/spheres.rs @@ -193,6 +193,10 @@ impl Sphere { /// assert_eq!(xs.len(), 0); /// ``` pub fn intersect<'s>(sphere: &'s Sphere, ray: &Ray) -> Intersections<'s> { + intersect_rtc(sphere, ray) +} + +fn intersect_rtc<'s>(sphere: &'s Sphere, ray: &Ray) -> Intersections<'s> { let ray = ray.transform(sphere.inverse_transform); let sphere_to_ray = ray.origin - Tuple::point(0., 0., 0.); let a = dot(ray.direction, ray.direction); @@ -200,11 +204,25 @@ pub fn intersect<'s>(sphere: &'s Sphere, ray: &Ray) -> Intersections<'s> { let c = dot(sphere_to_ray, sphere_to_ray) - 1.; let discriminant = b * b - 4. * a * c; if discriminant < 0. { - Intersections::default() - } else { - Intersections::new(vec![ - Intersection::new((-b - discriminant.sqrt()) / (2. * a), &sphere), - Intersection::new((-b + discriminant.sqrt()) / (2. * a), &sphere), - ]) + return Intersections::default(); } + Intersections::new(vec![ + Intersection::new((-b - discriminant.sqrt()) / (2. * a), &sphere), + Intersection::new((-b + discriminant.sqrt()) / (2. * a), &sphere), + ]) +} +fn intersect_rtiow<'s>(sphere: &'s Sphere, ray: &Ray) -> Intersections<'s> { + let ray = ray.transform(sphere.inverse_transform); + let oc = ray.origin - Tuple::point(0., 0., 0.); + let a = dot(ray.direction, ray.direction); + let b = dot(oc, ray.direction); + let c = dot(oc, oc) - 1.; + let discriminant = b * b - a * c; + if discriminant < 0. { + return Intersections::default(); + } + Intersections::new(vec![ + Intersection::new((-b - discriminant.sqrt()) / a, &sphere), + Intersection::new((-b + discriminant.sqrt()) / a, &sphere), + ]) }