aboutsummaryrefslogtreecommitdiff
path: root/src/material/metal.rs
blob: 2865a2f03dcf1d4d385625e2e32ce16b80c09749 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use super::Material;
use crate::{hittable::HitRecord, vec3::Vec3};
use crate::vec3::Color;
use crate::ray::Ray;

pub struct Metal {
    pub albedo: Color,
    pub fuzz: f64, // TODO: This should have value 0.0 - 1.0; this is not enforced
}

impl Material for Metal {
    fn scatter(&self, ray_in: &Ray, hit_record: &HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool {
        let reflected = ray_in.direction.unit_vector().reflect(&hit_record.normal);
        *scattered = Ray { origin: hit_record.p.clone(), direction: reflected + self.fuzz * Vec3::random_in_unit_sphere(), time: ray_in.time };
        *attenuation = self.albedo.clone();
        scattered.direction.dot(&hit_record.normal) > 0.0
    }
}