diff options
Diffstat (limited to 'src/sphere.rs')
-rw-r--r-- | src/sphere.rs | 65 |
1 files changed, 15 insertions, 50 deletions
diff --git a/src/sphere.rs b/src/sphere.rs index 59ca498..573f891 100644 --- a/src/sphere.rs +++ b/src/sphere.rs @@ -6,7 +6,10 @@ use cgmath::{dot, Vector3}; use core::borrow::Borrow; pub struct Sphere { - center: Vector3<f64>, + center0: Vector3<f64>, + center1: Vector3<f64>, + time0: f64, + time1: f64, radius: f64, material: Box<dyn Material + std::marker::Sync>, } @@ -14,68 +17,30 @@ pub struct Sphere { impl Sphere { pub fn new( center: Vector3<f64>, + time0: f64, + time1: f64, radius: f64, material: Box<dyn Material + std::marker::Sync>, ) -> Sphere { Sphere { - center, + center0: center, + center1: center, + time0, + time1, radius, material, } } -} - -impl Hittable for Sphere { - fn is_hit(&self, ray: &Ray, t_min: f64, t_max: f64) -> Option<Hit> { - let oc = ray.orig - self.center; - let a = ray.dir.magnitude2(); - let b = dot(oc, ray.dir); - let c = oc.magnitude2() - self.radius * self.radius; - let discriminant = b * b - a * c; - - if discriminant > 0.0 { - let soln = (-b - discriminant.sqrt()) / a; - if soln < t_max && soln > t_min { - return Some(Hit::new( - ray, - soln, - (ray.at(soln) - self.center) / self.radius, - self.material.borrow(), - )); - } - let soln = (-b + discriminant.sqrt()) / a; - if soln < t_max && soln > t_min { - return Some(Hit::new( - ray, - soln, - (ray.at(soln) - self.center) / self.radius, - self.material.borrow(), - )); - } - } - None - } -} -struct MovingSphere { - center0: Vector3<f64>, - center1: Vector3<f64>, - time0: f64, - time1: f64, - radius: f64, - material: Box<dyn Material + std::marker::Sync>, -} - -impl MovingSphere { - pub fn new( + pub fn new_moving( center0: Vector3<f64>, center1: Vector3<f64>, time0: f64, time1: f64, radius: f64, material: Box<dyn Material + std::marker::Sync>, - ) -> MovingSphere { - MovingSphere { + ) -> Sphere { + Sphere { center0, center1, time0, @@ -87,11 +52,11 @@ impl MovingSphere { pub fn center(&self, time: f64) -> Vector3<f64> { self.center0 - + ((time + self.time0) / (self.time0 + self.time1)) * (self.center1 - self.center0) + + ((time - self.time0) / (self.time1 - self.time0)) * (self.center1 - self.center0) } } -impl Hittable for MovingSphere { +impl Hittable for Sphere { fn is_hit(&self, ray: &Ray, t_min: f64, t_max: f64) -> Option<Hit> { let oc = ray.orig - self.center(ray.time); let a = ray.dir.magnitude2(); |