pbrt_r3/samplers/
zerotwosequence.rs

1use 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        // Generate 1D and 2D pixel sample components using $(0,2)$-sequence
33        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        // Generate 1D and 2D array samples using $(0,2)$-sequence
50        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}