pbrt_r3/core/lightdistrib/
power.rs1use super::lightdistrib::*;
2use crate::core::base::*;
3use crate::core::sampling::*;
4use crate::core::scene::*;
5
6use std::sync::Arc;
7
8pub fn compute_light_power_distribution(scene: &Scene) -> Arc<Distribution1D> {
10 assert!(!scene.lights.is_empty());
11 let mut light_power = Vec::new();
12 for light in scene.lights.iter() {
13 let light = light.as_ref();
14 light_power.push(light.power().y());
15 }
16 return Arc::new(Distribution1D::new(&light_power));
17}
18
19pub struct PowerLightDistribution {
20 distrib: Arc<Distribution1D>,
21}
22
23impl PowerLightDistribution {
24 pub fn new(scene: &Scene) -> Self {
25 PowerLightDistribution {
26 distrib: compute_light_power_distribution(scene),
27 }
28 }
29}
30
31impl LightDistribution for PowerLightDistribution {
32 fn lookup(&self, _p: &Point3f) -> Arc<Distribution1D> {
33 return self.distrib.clone();
34 }
35}