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
34
35
36
use std::f32;
use enum_set::EnumSet;
use linalg::Vector;
use film::Colorf;
use bxdf::{BxDF, BxDFType};
#[derive(Clone, Copy, Debug)]
pub struct Lambertian {
reflectance: Colorf,
}
impl Lambertian {
pub fn new(c: &Colorf) -> Lambertian {
Lambertian { reflectance: *c }
}
}
impl BxDF for Lambertian {
fn bxdf_type(&self) -> EnumSet<BxDFType> {
let mut e = EnumSet::new();
e.insert(BxDFType::Diffuse);
e.insert(BxDFType::Reflection);
e
}
fn eval(&self, _: &Vector, _: &Vector) -> Colorf {
self.reflectance * f32::consts::FRAC_1_PI
}
}