pbrt_r3/core/reflection/
scaled.rs

1use crate::core::base::*;
2use crate::core::reflection::*;
3use crate::core::spectrum::*;
4
5use std::sync::Arc;
6
7pub struct ScaledBxDF {
8    bxdf: Arc<dyn BxDF>,
9    scale: Spectrum,
10}
11
12impl ScaledBxDF {
13    pub fn new(bxdf: &Arc<dyn BxDF>, scale: &Spectrum) -> Self {
14        ScaledBxDF {
15            bxdf: Arc::clone(bxdf),
16            scale: *scale,
17        }
18    }
19}
20
21impl BxDF for ScaledBxDF {
22    fn rho(&self, wo: &Vector3f, samples: &[Point2f]) -> Spectrum {
23        let bxdf = self.bxdf.as_ref();
24        return self.scale * bxdf.rho(wo, samples);
25    }
26
27    fn rho2(&self, samples: &[(Point2f, Point2f)]) -> Spectrum {
28        let bxdf = self.bxdf.as_ref();
29        return self.scale * bxdf.rho2(samples);
30    }
31
32    fn f(&self, wo: &Vector3f, wi: &Vector3f) -> Spectrum {
33        let bxdf = self.bxdf.as_ref();
34        return self.scale * bxdf.f(wo, wi);
35    }
36
37    fn sample_f(
38        &self,
39        wo: &Vector3f,
40        sample: &Vector2f,
41    ) -> Option<(Spectrum, Vector3f, Float, BxDFType)> {
42        let bxdf = self.bxdf.as_ref();
43        if let Some((spec, wi, pdf, t)) = bxdf.sample_f(wo, sample) {
44            return Some((self.scale * spec, wi, pdf, t));
45        }
46        return None;
47    }
48
49    fn pdf(&self, wo: &Vector3f, wi: &Vector3f) -> Float {
50        let bxdf = self.bxdf.as_ref();
51        return bxdf.pdf(wo, wi);
52    }
53
54    fn get_type(&self) -> BxDFType {
55        let bxdf = self.bxdf.as_ref();
56        return bxdf.get_type();
57    }
58
59    fn to_string(&self) -> String {
60        return format!("ScaledBxDF {:?}", self.get_type());
61    }
62}