pbrt_r3/core/api/scene_context/
graphics_state.rs1use crate::core::base::*;
2use crate::core::material::*;
3use crate::core::param_set::*;
4use crate::core::spectrum::*;
5use crate::core::texture::*;
6use crate::materials::*;
7
8use std::cell::RefCell;
9use std::collections::HashMap;
10use std::ops::Deref;
11use std::sync::Arc;
12
13pub struct MaterialInstance {
19 pub name: String,
20 pub material: Arc<dyn Material>,
21 pub params: ParamSet,
22}
23
24impl MaterialInstance {
25 pub fn new(name: &str, material: Arc<dyn Material>, params: &ParamSet) -> Self {
26 MaterialInstance {
27 name: String::from(name),
28 material,
29 params: params.clone(),
30 }
31 }
32}
33
34type FloatTextureMap = HashMap<String, Arc<dyn Texture<Float>>>;
35type SpectrumTextureMap = HashMap<String, Arc<dyn Texture<Spectrum>>>;
36type NamedMaterialMap = HashMap<String, Arc<RefCell<MaterialInstance>>>;
37
38pub struct GraphicsState {
39 pub current_inside_medium: String,
40 pub current_outside_medium: String,
41 pub float_textures: Arc<RefCell<FloatTextureMap>>,
42 pub float_textures_shared: bool,
43 pub spectrum_textures: Arc<RefCell<SpectrumTextureMap>>,
44 pub spectrum_textures_shared: bool,
45 pub named_materials: Arc<RefCell<NamedMaterialMap>>,
46 pub named_materials_shared: bool,
47 pub current_material: Option<Arc<RefCell<MaterialInstance>>>,
48
49 pub area_light_params: ParamSet,
50 pub area_light_name: String,
51 pub reverse_orientation: bool,
52}
53
54fn create_default_material(
55 f_tex: &Arc<RefCell<FloatTextureMap>>,
56 s_tex: &Arc<RefCell<SpectrumTextureMap>>,
57) -> Arc<dyn Material> {
58 let params = ParamSet::new();
59 let f = f_tex.borrow();
60 let s = s_tex.borrow();
61 let mp = TextureParams::new(¶ms, ¶ms, f.deref(), s.deref());
62 let mat = create_matte_material(&mp).unwrap();
63 return mat;
64}
65
66impl GraphicsState {
67 pub fn new() -> Self {
68 let f_tex = Arc::new(RefCell::new(FloatTextureMap::new()));
69 let s_tex = Arc::new(RefCell::new(SpectrumTextureMap::new()));
70 let mat = create_default_material(&f_tex, &s_tex);
71
72 GraphicsState {
73 current_inside_medium: String::from(""),
74 current_outside_medium: String::from(""),
75 float_textures: f_tex,
76 float_textures_shared: false,
77 spectrum_textures: s_tex,
78 spectrum_textures_shared: false,
79 named_materials: Arc::new(RefCell::new(NamedMaterialMap::new())),
80 named_materials_shared: false,
81 current_material: Some(Arc::new(RefCell::new(MaterialInstance::new(
82 "matte",
83 mat,
84 &ParamSet::new(),
85 )))),
86
87 area_light_params: ParamSet::new(),
88 area_light_name: String::from(""),
89 reverse_orientation: false,
90 }
91 }
92
93 pub fn clone_named_materials(&self) -> Arc<RefCell<NamedMaterialMap>> {
94 let materials = self.named_materials.borrow();
95 return Arc::new(RefCell::new(materials.clone()));
96 }
97}
98
99impl Clone for GraphicsState {
100 fn clone(&self) -> Self {
101 GraphicsState {
102 current_inside_medium: self.current_inside_medium.clone(),
103 current_outside_medium: self.current_outside_medium.clone(),
104 float_textures: Arc::clone(&self.float_textures),
105 float_textures_shared: self.float_textures_shared,
106 spectrum_textures: Arc::clone(&self.spectrum_textures),
107 spectrum_textures_shared: self.spectrum_textures_shared,
108 named_materials: Arc::clone(&self.named_materials),
109 named_materials_shared: self.named_materials_shared,
110 current_material: self.current_material.clone(),
111 area_light_params: self.area_light_params.clone(),
112 area_light_name: self.area_light_name.clone(),
113 reverse_orientation: self.reverse_orientation,
114 }
115 }
116}