pbrt_r3/core/sampler/
base_sampler.rs

1use crate::core::base::*;
2use crate::core::profile::*;
3
4#[derive(Debug, PartialEq, Default, Clone)]
5pub struct BaseSampler {
6    pub samples_per_pixel: u32,
7    pub current_pixel: Point2i,
8    pub current_pixel_sample_index: u32,
9    pub samples1d_array_sizes: Vec<u32>,
10    pub samples2d_array_sizes: Vec<u32>,
11    pub sample_array1d: Vec<Vec<Float>>,
12    pub sample_array2d: Vec<Vec<Point2f>>,
13    pub array1d_offset: u64,
14    pub array2d_offset: u64,
15}
16
17impl BaseSampler {
18    pub fn new(samples_per_pixel: u32) -> Self {
19        BaseSampler {
20            samples_per_pixel,
21            current_pixel: Point2i::zero(),
22            current_pixel_sample_index: 0,
23            samples1d_array_sizes: Vec::new(),
24            samples2d_array_sizes: Vec::new(),
25            sample_array1d: Vec::new(),
26            sample_array2d: Vec::new(),
27            array1d_offset: 0,
28            array2d_offset: 0,
29        }
30    }
31
32    pub fn request_1d_array(&mut self, n: u32) {
33        self.samples1d_array_sizes.push(n);
34        self.sample_array1d
35            .push(vec![0.0; (n * self.samples_per_pixel) as usize]);
36    }
37
38    pub fn request_2d_array(&mut self, n: u32) {
39        self.samples2d_array_sizes.push(n);
40        self.sample_array2d.push(vec![
41            Vector2f::zero();
42            (n * self.samples_per_pixel) as usize
43        ]);
44    }
45
46    pub fn get_1d_array(&mut self, n: u32) -> Option<Vec<Float>> {
47        let _p = ProfilePhase::new(Prof::GetSample); //pbrt-r3
48
49        let n = n as usize;
50        if self.array1d_offset == self.sample_array1d.len() as u64 {
51            return None;
52        }
53        let o1 = self.array1d_offset as usize;
54        let o2 = n * self.current_pixel_sample_index as usize;
55        self.array1d_offset += 1;
56        return Some(self.sample_array1d[o1][o2..(o2 + n)].to_vec());
57    }
58
59    pub fn get_2d_array(&mut self, n: u32) -> Option<Vec<Vector2f>> {
60        let _p = ProfilePhase::new(Prof::GetSample); //pbrt-r3
61
62        let n = n as usize;
63        if self.array2d_offset == self.sample_array2d.len() as u64 {
64            return None;
65        }
66        let o1 = self.array2d_offset as usize;
67        let o2 = n * self.current_pixel_sample_index as usize;
68        self.array2d_offset += 1;
69        return Some(self.sample_array2d[o1][o2..(o2 + n)].to_vec());
70    }
71
72    pub fn start_pixel(&mut self, p: &Point2i) {
73        let _p = ProfilePhase::new(Prof::StartPixel);
74
75        self.current_pixel = *p;
76        self.current_pixel_sample_index = 0;
77        self.array1d_offset = 0;
78        self.array2d_offset = 0;
79    }
80
81    pub fn start_next_sample(&mut self) -> bool {
82        self.array1d_offset = 0;
83        self.array2d_offset = 0;
84        self.current_pixel_sample_index += 1;
85        return self.current_pixel_sample_index < self.samples_per_pixel;
86    }
87
88    pub fn set_sample_number(&mut self, sample_num: u32) -> bool {
89        self.array1d_offset = 0;
90        self.array2d_offset = 0;
91        self.current_pixel_sample_index = sample_num;
92        return self.current_pixel_sample_index < self.samples_per_pixel;
93    }
94
95    pub fn get_samples_per_pixel(&self) -> u32 {
96        return self.samples_per_pixel;
97    }
98}