pbrt_r3/samplers/
zerotwosequence.rs1use crate::core::prelude::*;
2
3use std::sync::Arc;
4use std::sync::RwLock;
5
6#[derive(Debug, PartialEq, Default, Clone)]
7pub struct ZeroTwoSequenceSampler {
8 base: BasePixelSampler,
9}
10
11impl ZeroTwoSequenceSampler {
12 pub fn new(samples_per_pixel: u32, n_sampled_dimensions: u32) -> Self {
13 let samples_per_pixel_pow2 = round_up_pow2(samples_per_pixel);
14 if !is_power_of_2(samples_per_pixel) {
15 log::warn!(
16 "Pixel samples being rounded up to power of 2 (from \" {} \" to \" {} \").",
17 samples_per_pixel,
18 samples_per_pixel_pow2
19 );
20 }
21
22 ZeroTwoSequenceSampler {
23 base: BasePixelSampler::new(samples_per_pixel_pow2, n_sampled_dimensions),
24 }
25 }
26}
27
28impl Sampler for ZeroTwoSequenceSampler {
29 fn start_pixel(&mut self, p: &Point2i) {
30 let _p = ProfilePhase::new(Prof::StartPixel);
31
32 for i in 0..self.base.samples1d.len() {
34 van_der_corput(
35 1,
36 self.base.base.samples_per_pixel,
37 &mut self.base.samples1d[i],
38 &mut self.base.rng,
39 );
40 }
41 for i in 0..self.base.samples2d.len() {
42 sobol_2d(
43 1,
44 self.base.base.samples_per_pixel,
45 &mut self.base.samples2d[i],
46 &mut self.base.rng,
47 );
48 }
49 for i in 0..self.base.base.samples1d_array_sizes.len() {
51 van_der_corput(
52 self.base.base.samples1d_array_sizes[i],
53 self.base.base.samples_per_pixel,
54 &mut self.base.base.sample_array1d[i],
55 &mut self.base.rng,
56 );
57 }
58 for i in 0..self.base.base.samples2d_array_sizes.len() {
59 sobol_2d(
60 self.base.base.samples2d_array_sizes[i],
61 self.base.base.samples_per_pixel,
62 &mut self.base.base.sample_array2d[i],
63 &mut self.base.rng,
64 );
65 }
66 self.base.start_pixel(p);
67 }
68
69 fn start_next_sample(&mut self) -> bool {
70 return self.base.start_next_sample();
71 }
72
73 fn set_sample_number(&mut self, sample_num: u32) -> bool {
74 return self.base.set_sample_number(sample_num);
75 }
76
77 fn get_1d(&mut self) -> Float {
78 return self.base.get_1d();
79 }
80
81 fn get_2d(&mut self) -> Vector2f {
82 return self.base.get_2d();
83 }
84
85 fn request_1d_array(&mut self, n: u32) {
86 self.base.request_1d_array(n);
87 }
88 fn request_2d_array(&mut self, n: u32) {
89 self.base.request_2d_array(n);
90 }
91 fn get_1d_array(&mut self, n: u32) -> Option<Vec<Float>> {
92 return self.base.get_1d_array(n);
93 }
94 fn get_2d_array(&mut self, n: u32) -> Option<Vec<Vector2f>> {
95 return self.base.get_2d_array(n);
96 }
97
98 fn clone_with_seed(&self, seed: u32) -> Arc<RwLock<dyn Sampler>> {
99 let mut ss = self.clone();
100 ss.base.rng.set_sequence(seed as u64);
101 return Arc::new(RwLock::new(ss));
102 }
103
104 fn get_samples_per_pixel(&self) -> u32 {
105 return self.base.base.samples_per_pixel;
106 }
107}
108
109impl PixelSampler for ZeroTwoSequenceSampler {}
110
111pub fn create_zerotwosequence_sampler(
112 params: &ParamSet,
113) -> Result<Arc<RwLock<dyn Sampler>>, PbrtError> {
114 let mut nsamp = params.find_one_int("pixelsamples", 16) as u32;
115 let sd = params.find_one_int("dimensions", 4) as u32;
116 {
117 let options = PbrtOptions::get();
118 if options.quick_render {
119 nsamp = 1;
120 }
121 }
122 return Ok(Arc::new(RwLock::new(ZeroTwoSequenceSampler::new(
123 nsamp, sd,
124 ))));
125}