pbrt_r3/core/sampler/
pixel_sampler.rs1use 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}