aboutsummaryrefslogtreecommitdiff
path: root/src/material/reflectant.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/material/reflectant.rs')
-rw-r--r--src/material/reflectant.rs39
1 files changed, 39 insertions, 0 deletions
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()),
+ ))
+ }
+}
+
+