pbrt_r3/core/sampler/
base_sampler.rs1use 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); 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); 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}