diff options
Diffstat (limited to 'src/material.rs')
-rw-r--r-- | src/material.rs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/material.rs b/src/material.rs index 91e7c02..9644c2b 100644 --- a/src/material.rs +++ b/src/material.rs @@ -20,11 +20,11 @@ impl Lambertian { } impl Material for Lambertian { - fn scatter(&self, rng: &mut ThreadRng, _ray: &Ray, hit: &Hit) -> Option<NextRay> { + fn scatter(&self, rng: &mut ThreadRng, ray: &Ray, hit: &Hit) -> Option<NextRay> { let scatter_direction = hit.normal + random_unit_vector(rng); Some(NextRay::new( self.albedo, - Ray::new(hit.p, scatter_direction, 0.0), + Ray::new(hit.p, scatter_direction, ray.time), )) } } @@ -47,7 +47,7 @@ impl Material for Metal { let scattered = Ray::new( hit.p, reflected + self.fuzz * random_in_unit_sphere(rng), - 0.0, + ray.time, ); if dot(scattered.dir, hit.normal) > 0.0 { Some(NextRay::new(self.albedo, scattered)) @@ -82,16 +82,25 @@ impl Material for Dielectric { if etai_over_etat * sin_theta > 1.0 { let reflected = reflect(&unit_direction, &hit.normal); - return Some(NextRay::new(attenuation, Ray::new(hit.p, reflected, 0.0))); + return Some(NextRay::new( + attenuation, + Ray::new(hit.p, reflected, ray.time), + )); } let reflect_prob = schlick(cos_theta, etai_over_etat); if rng.gen::<f64>() < reflect_prob { let reflected = reflect(&unit_direction, &hit.normal); - return Some(NextRay::new(attenuation, Ray::new(hit.p, reflected, 0.0))); + return Some(NextRay::new( + attenuation, + Ray::new(hit.p, reflected, ray.time), + )); } let refracted = refract(&unit_direction, &hit.normal, etai_over_etat); - Some(NextRay::new(attenuation, Ray::new(hit.p, refracted, 0.0))) + Some(NextRay::new( + attenuation, + Ray::new(hit.p, refracted, ray.time), + )) } } |