pbrt_r3/core/sampler/
pixel_sampler.rs

1use super::{base_sampler::BaseSampler, sampler::Sampler};
2use crate::core::base::*;
3use crate::core::profile::*;
4use crate::core::rng::*;
5
6pub trait PixelSampler: Sampler {}
7
8#[derive(Debug, PartialEq, Default, Clone)]
9pub struct BasePixelSampler {
10    pub base: BaseSampler,
11    pub samples1d: Vec<Vec<Float>>,
12    pub samples2d: Vec<Vec<Point2f>>,
13    pub current1d_dimension: u32,
14    pub current2d_dimension: u32,
15    pub rng: RNG,
16}
17
18impl BasePixelSampler {
19    pub fn new(samples_per_pixel: u32, n_sampled_dimensions: u32) -> Self {
20        let dim = n_sampled_dimensions as usize;
21        let mut samples1d = Vec::with_capacity(dim);
22        let mut samples2d = Vec::with_capacity(dim);
23        for _ in 0..dim {
24            samples1d.push(vec![0.0; samples_per_pixel as usize]);
25            samples2d.push(vec![Vector2f::zero(); samples_per_pixel as usize]);
26        }
27        BasePixelSampler {
28            base: BaseSampler::new(samples_per_pixel),
29            samples1d,
30            samples2d,
31            current1d_dimension: 0,
32            current2d_dimension: 0,
33            rng: RNG::new(),
34        }
35    }
36
37    pub fn start_pixel(&mut self, p: &Point2i) {
38        self.base.start_pixel(p);
39    }
40
41    pub fn start_next_sample(&mut self) -> bool {
42        self.current1d_dimension = 0;
43        self.current2d_dimension = 0;
44        return self.base.start_next_sample();
45    }
46
47    pub fn set_sample_number(&mut self, sample_num: u32) -> bool {
48        self.current1d_dimension = 0;
49        self.current2d_dimension = 0;
50        return self.base.set_sample_number(sample_num);
51    }
52
53    pub fn get_1d(&mut self) -> Float {
54        let _p = ProfilePhase::new(Prof::GetSample);
55
56        let dim = self.current1d_dimension as usize;
57        if dim < self.samples1d.len() {
58            self.current1d_dimension += 1;
59            let index = self.base.current_pixel_sample_index as usize;
60            return self.samples1d[dim][index];
61        } else {
62            return self.rng.uniform_float();
63        }
64    }
65
66    pub fn get_2d(&mut self) -> Point2f {
67        let _p = ProfilePhase::new(Prof::GetSample);
68
69        let dim = self.current2d_dimension as usize;
70        if dim < self.samples2d.len() {
71            self.current2d_dimension += 1;
72            let index = self.base.current_pixel_sample_index as usize;
73            return self.samples2d[dim][index];
74        } else {
75            return Point2f::new(self.rng.uniform_float(), self.rng.uniform_float());
76        }
77    }
78
79    pub fn request_1d_array(&mut self, n: u32) {
80        self.base.request_1d_array(n);
81    }
82    pub fn request_2d_array(&mut self, n: u32) {
83        self.base.request_2d_array(n);
84    }
85    pub fn get_1d_array(&mut self, n: u32) -> Option<Vec<Float>> {
86        return self.base.get_1d_array(n);
87    }
88    pub fn get_2d_array(&mut self, n: u32) -> Option<Vec<Vector2f>> {
89        return self.base.get_2d_array(n);
90    }
91}