blob: 638e5e4aeb82ee877580c9b6578fe1b3dd4a3ef1 (
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
|
use super::Material;
use crate::ray::Ray;
use crate::vec3::Color;
use crate::{hittable::HitRecord, vec3::Vec3};
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
}
}
|