diff options
Diffstat (limited to 'src/material')
-rw-r--r-- | src/material/mod.rs | 2 | ||||
-rw-r--r-- | src/material/reflectant.rs | 39 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/material/mod.rs b/src/material/mod.rs index 62cbf9a..c939385 100644 --- a/src/material/mod.rs +++ b/src/material/mod.rs @@ -2,8 +2,10 @@ use crate::core::{Ray, Intersection, Spectrum}; use crate::sample::Sampler; mod lambertian; +mod reflectant; pub use lambertian::Lambertian; +pub use reflectant::Reflectant; pub trait Material { fn scatter(&self, ray: &Ray, i: &Intersection, sampler: &mut dyn Sampler) -> Option<(Spectrum, Ray)>; diff --git a/src/material/reflectant.rs b/src/material/reflectant.rs new file mode 100644 index 0000000..f4b110c --- /dev/null +++ b/src/material/reflectant.rs @@ -0,0 +1,39 @@ +use crate::Float; +use crate::core::{Ray, Intersection, Spectrum, Vector3f}; +use super::Material; +use crate::sample::Sampler; + +pub struct Reflectant { + color: Spectrum, + fuzz: Option<Float>, +} + +impl Reflectant { + pub fn new(c: Spectrum, fuzz: Option<Float>) -> Reflectant { + Reflectant { + color: c, + fuzz, + } + } +} + +fn reflect(v: &Vector3f, n: &Vector3f) -> Vector3f { + *v - *n * (2.0 * v.dot(n)) +} + +impl Material for Reflectant { + fn scatter(&self, ray: &Ray, i: &Intersection, sampler: &mut dyn Sampler) -> Option<(Spectrum, Ray)> { + // Find reflectance vector + let mut reflected = reflect(&ray.direction, &i.n); + if let Some(fuzz) = self.fuzz { + reflected += &(sampler.get_unit_vector() * fuzz); + } + + Some(( + self.color, + Ray::new(i.p, reflected.norm()), + )) + } +} + + |