pbrt_r3/core/display/
multiple_display.rs

1use super::display::{Display, DisplayTile};
2use crate::core::error::*;
3use std::sync::Arc;
4use std::sync::RwLock;
5
6pub struct MutipleDisplay {
7    pub displays: Vec<Arc<RwLock<dyn Display>>>,
8}
9
10impl MutipleDisplay {
11    pub fn new() -> Self {
12        MutipleDisplay {
13            displays: Vec::new(),
14        }
15    }
16
17    pub fn add_display(&mut self, display: &Arc<RwLock<dyn Display>>) {
18        self.displays.push(display.clone());
19    }
20
21    pub fn len(&self) -> usize {
22        return self.displays.len();
23    }
24
25    pub fn is_empty(&self) -> bool {
26        return self.displays.is_empty();
27    }
28}
29
30unsafe impl Sync for MutipleDisplay {}
31
32impl Display for MutipleDisplay {
33    fn start(
34        &mut self,
35        title: &str,
36        resolution: &[usize; 2],
37        channel_names: &[&str],
38    ) -> Result<(), PbrtError> {
39        for d in self.displays.iter() {
40            let mut display = d.write().unwrap();
41            display.start(title, resolution, channel_names)?;
42        }
43        return Ok(());
44    }
45
46    fn update(&mut self, tile: &DisplayTile) -> Result<(), PbrtError> {
47        //TODO:multi thread
48        for d in self.displays.iter() {
49            let mut display = d.write().unwrap();
50            display.update(tile)?;
51        }
52        return Ok(());
53    }
54
55    fn end(&mut self) -> Result<(), PbrtError> {
56        for d in self.displays.iter() {
57            let mut display = d.write().unwrap();
58            display.end()?;
59        }
60        return Ok(());
61    }
62}