pbrt_r3/core/medium/
medium_interface.rs1use super::medium::Medium;
2
3use std::sync::Arc;
4#[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}