summaryrefslogtreecommitdiff
path: root/racer-tracer/src/material/lambertian.rs
blob: 8356685d359f9fe3b22012d28d0b5f08ca676efa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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))
    }
}