pbrt_r3/core/medium/
medium_interface.rs

1use super::medium::Medium;
2
3use std::sync::Arc;
4//use std::sync::Weak;
5
6#[derive(Clone, Default, Debug)]
7pub struct MediumInterface {
8    pub inside: Option<Arc<dyn Medium>>,
9    pub outside: Option<Arc<dyn Medium>>,
10}
11
12impl MediumInterface {
13    pub fn new() -> Self {
14        MediumInterface {
15            inside: None,
16            outside: None,
17        }
18    }
19
20    pub fn set_inside(&mut self, medium: &Arc<dyn Medium>) {
21        self.inside = Some(Arc::clone(medium));
22    }
23
24    pub fn set_outside(&mut self, medium: &Arc<dyn Medium>) {
25        self.outside = Some(Arc::clone(medium));
26    }
27
28    pub fn get_inside(&self) -> Option<Arc<dyn Medium>> {
29        match &self.inside {
30            Some(inside) => Some(inside.clone()),
31            None => None,
32        }
33    }
34
35    pub fn get_outside(&self) -> Option<Arc<dyn Medium>> {
36        match &self.outside {
37            Some(outside) => Some(outside.clone()),
38            None => None,
39        }
40    }
41
42    pub fn is_medium_transition(&self) -> bool {
43        match (self.inside.as_ref(), self.outside.as_ref()) {
44            (Some(inside), Some(outside)) => {
45                return !std::ptr::eq(inside, outside);
46            }
47            (Some(_), None) => true,
48            (None, Some(_)) => true,
49            (None, None) => false,
50        }
51    }
52}
53
54impl From<&Option<Arc<dyn Medium>>> for MediumInterface {
55    fn from(medium: &Option<Arc<dyn Medium>>) -> Self {
56        match medium {
57            Some(medium) => MediumInterface::from(medium),
58            None => MediumInterface::new(),
59        }
60    }
61}
62
63impl From<&Arc<dyn Medium>> for MediumInterface {
64    fn from(medium: &Arc<dyn Medium>) -> Self {
65        let inside = Arc::clone(medium);
66        let outside = Arc::clone(medium);
67        MediumInterface {
68            inside: Some(inside),
69            outside: Some(outside),
70        }
71    }
72}