summaryrefslogtreecommitdiff
path: root/racer-tracer/src/material/lambertian.rs
diff options
context:
space:
mode:
Diffstat (limited to 'racer-tracer/src/material/lambertian.rs')
-rw-r--r--racer-tracer/src/material/lambertian.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/racer-tracer/src/material/lambertian.rs b/racer-tracer/src/material/lambertian.rs
new file mode 100644
index 0000000..8356685
--- /dev/null
+++ b/racer-tracer/src/material/lambertian.rs
@@ -0,0 +1,33 @@
+use crate::{
+ material::Material,
+ ray::Ray,
+ vec3::{random_unit_vector, Color, Vec3},
+};
+
+pub struct Lambertian {
+ color: Color,
+}
+
+impl Lambertian {
+ pub fn new(color: Color) -> Self {
+ Self { color }
+ }
+}
+
+impl Material for Lambertian {
+ fn scatter(
+ &self,
+ ray: &crate::ray::Ray,
+ rec: &crate::geometry::HitRecord,
+ ) -> Option<(Ray, Color)> {
+ let mut scatter_direction = rec.normal + random_unit_vector();
+
+ // Catch bad scatter direction
+ if scatter_direction.near_zero() {
+ scatter_direction = rec.normal;
+ }
+
+ let scattered = Ray::new(rec.point, scatter_direction);
+ Some((scattered, self.color))
+ }
+}