pbrt_r3/core/lightdistrib/
power.rs

1use super::lightdistrib::*;
2use crate::core::base::*;
3use crate::core::sampling::*;
4use crate::core::scene::*;
5
6use std::sync::Arc;
7
8// Ported from integrator.cpp
9pub 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}