pbrt_r3/core/reflection/
scaled.rs1use 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}