pbrt_r3/core/sampler/
proxy_sampler.rs

1use super::sampler::Sampler;
2use crate::core::base::*;
3use crate::core::camera::*;
4
5use std::sync::Arc;
6use std::sync::RwLock;
7
8#[derive(Clone)]
9pub struct ProxySampler {
10    pub sampler: Arc<RwLock<dyn Sampler>>,
11}
12
13impl ProxySampler {
14    pub fn new(s: &Arc<RwLock<dyn Sampler>>) -> Self {
15        ProxySampler {
16            sampler: Arc::clone(s),
17        }
18    }
19}
20
21impl Sampler for ProxySampler {
22    fn start_pixel(&mut self, p: &Point2i) {
23        let mut s = self.sampler.as_ref().write().unwrap();
24        s.start_pixel(p);
25    }
26    fn get_1d(&mut self) -> Float {
27        let mut s = self.sampler.as_ref().write().unwrap();
28        return s.get_1d();
29    }
30    fn get_2d(&mut self) -> Point2f {
31        let mut s = self.sampler.as_ref().write().unwrap();
32        return s.get_2d();
33    }
34    fn request_1d_array(&mut self, n: u32) {
35        let mut s = self.sampler.as_ref().write().unwrap();
36        s.request_1d_array(n);
37    }
38    fn request_2d_array(&mut self, n: u32) {
39        let mut s = self.sampler.as_ref().write().unwrap();
40        s.request_2d_array(n);
41    }
42    fn get_1d_array(&mut self, n: u32) -> Option<Vec<Float>> {
43        let mut s = self.sampler.as_ref().write().unwrap();
44        return s.get_1d_array(n);
45    }
46    fn get_2d_array(&mut self, n: u32) -> Option<Vec<Vector2f>> {
47        let mut s = self.sampler.as_ref().write().unwrap();
48        return s.get_2d_array(n);
49    }
50    fn round_count(&self, n: u32) -> u32 {
51        let s = self.sampler.as_ref().read().unwrap();
52        return s.round_count(n);
53    }
54    fn get_camera_sample(&mut self, p: &Point2i) -> CameraSample {
55        let mut s = self.sampler.as_ref().write().unwrap();
56        return s.get_camera_sample(p);
57    }
58    fn start_next_sample(&mut self) -> bool {
59        let mut s = self.sampler.as_ref().write().unwrap();
60        return s.start_next_sample();
61    }
62    fn clone_with_seed(&self, seed: u32) -> Arc<RwLock<dyn Sampler>> {
63        return Arc::new(RwLock::new(ProxySampler {
64            sampler: self.sampler.as_ref().read().unwrap().clone_with_seed(seed),
65        }));
66    }
67    fn set_sample_number(&mut self, sample_num: u32) -> bool {
68        let mut s = self.sampler.as_ref().write().unwrap();
69        return s.set_sample_number(sample_num);
70    }
71    fn get_samples_per_pixel(&self) -> u32 {
72        let s = self.sampler.as_ref().read().unwrap();
73        return s.get_samples_per_pixel();
74    }
75}
76
77unsafe impl Sync for ProxySampler {}
78unsafe impl Send for ProxySampler {}