pbrt_r3/core/display/
multiple_display.rs1use 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 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}