aboutsummaryrefslogtreecommitdiffstats
path: root/src/material.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/material.rs')
-rw-r--r--src/material.rs21
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),
+ ))
}
}