pbrt_r3/core/api/scene_context/
graphics_state.rs

1use 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
13/*
14std::string name;
15    std::shared_ptr<Material> material;
16    ParamSet params;
17*/
18pub 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(&params, &params, 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}