e2rcore/implement/render/
light.rs

1extern crate pretty_env_logger;
2extern crate mazth;
3
4use std::collections::HashMap;
5use std::vec::Vec;
6use std::any::Any;
7
8use interface::i_ads;
9use interface::i_renderobj;
10use interface::i_ele;
11use interface::i_component;
12
13use self::mazth::mat::{ Mat4, Mat3x1 };
14
15#[derive(Clone)]
16pub struct LightAdsPoint {
17    pub _id: u64,
18    pub _pos: Mat3x1< f32 >,
19
20    /// # ads values
21    pub _ads_val_spec: Mat3x1< f32 >,
22    pub _ads_val_diff: Mat3x1< f32 >,
23    pub _ads_val_amb: Mat3x1< f32 >,
24}
25
26impl i_ele::IObjImpl for LightAdsPoint {
27    fn as_any( & self ) -> & Any {
28        self
29    }
30    fn update_components( & mut self, components: & mut Vec< Box< i_component::IComponent > > ) -> Result< (), & 'static str > {
31
32        //store uniform data
33        {
34            //todo: move material properties to its own component 
35            let data_map : HashMap< String, Vec<f32> > =  [ ( String::from("Light.Position\0"), &self._pos._val[..] ),
36                                                            ( String::from("Light.La\0"), &self._ads_val_amb._val[..] ),
37                                                            ( String::from("Light.Ld\0"), &self._ads_val_diff._val[..] ),
38                                                            ( String::from("Light.Ls\0"), &self._ads_val_spec._val[..] ),
39                                                            ( String::from("Material.Ka\0"), &[ 0.2f32, 0.2f32, 0.2f32 ] ),
40                                                            ( String::from("Material.Kd\0"), &[ 0.1f32, 0.1f32, 0.9f32 ] ),
41                                                            ( String::from("Material.Ks\0"), &[ 0.9f32, 0.1f32, 0.1f32 ] ),
42                                                            ( String::from("Material.Shininess\0"), &[ 3f32 ] ),
43            ].into_iter().map(|&( ref k, ref v)| ( k.clone(), v[..].to_vec() ) ).collect();
44
45            let uniform_group_id = 0;
46            let data_group : HashMap< u64, Vec<String> > = [ ( uniform_group_id, [ String::from("Material.Ka\0"), String::from("Material.Kd\0"),
47                                                                                   String::from("Material.Ks\0"), String::from("Material.Shininess\0"),
48                                                                                   String::from("Light.Position\0"), String::from("Light.La\0"),
49                                                                                   String::from("Light.Ld\0"), String::from("Light.Ls\0") ] ),
50            ].into_iter().map(|&( ref k, ref v)| ( k.clone(), v[..].to_vec() ) ).collect();
51            
52            let c = i_component::ComponentRenderUniform {
53                _data_dict_vf: data_map,
54                _data_uniform_group: data_group,
55                ..Default::default()
56            };
57            components.push( Box::new(c) );
58            trace!( "load into render buffer: uniform: light" );
59        }
60        Ok( () )
61    }
62}
63
64impl i_ads::AdsVal for LightAdsPoint {
65    fn get_ads_val_spec( & self ) -> Mat3x1< f32 > {
66        self._ads_val_spec
67    }
68    fn get_ads_val_diff( & self ) -> Mat3x1< f32 > {
69        self._ads_val_spec
70    }
71    fn get_ads_val_amb( & self ) -> Mat3x1< f32 > {
72        self._ads_val_amb
73    }
74}
75
76impl i_renderobj::ObjPos for LightAdsPoint {
77    fn get_pos( & self ) -> Mat3x1< f32 > {
78        self._pos
79    }
80}
81
82pub struct LightAdsSpot {
83    pub _id: u64,
84    pub _pos: Mat3x1< f32 >,
85
86    /// # ads values
87    pub _ads_val_spec: Mat3x1< f32 >,
88    pub _ads_val_diff: Mat3x1< f32 >,
89    pub _ads_val_amb: Mat3x1< f32 >,
90
91    pub _fov: f32,
92    pub _focus: Mat4< f32 >,
93
94    /// # computed view from _pos, _focus
95    pub _light_view_xform: Mat4< f32 >,
96}
97
98impl i_ads::AdsVal for LightAdsSpot {
99    fn get_ads_val_spec( & self ) -> Mat3x1< f32 > {
100        self._ads_val_spec
101    }
102    fn get_ads_val_diff( & self ) -> Mat3x1< f32 > {
103        self._ads_val_spec
104    }
105    fn get_ads_val_amb( & self ) -> Mat3x1< f32 > {
106        self._ads_val_amb
107    }
108}
109
110impl i_renderobj::ObjPos for LightAdsSpot {
111    fn get_pos( & self ) -> Mat3x1< f32 > {
112        self._pos
113    }
114}
115
116pub struct LightAdsDir {
117    pub _id: u64,
118    pub _pos: Mat3x1< f32 >,
119
120    /// # ads values
121    pub _ads_val_spec: Mat3x1< f32 >,
122    pub _ads_val_diff: Mat3x1< f32 >,
123    pub _ads_val_amb: Mat3x1< f32 >,
124
125    pub _dir: Mat3x1< f32 >,
126    pub _light_view_xform: Mat4< f32 >,
127}
128
129impl i_ads::AdsVal for LightAdsDir {
130    fn get_ads_val_spec( & self ) -> Mat3x1< f32 > {
131        self._ads_val_spec
132    }
133    fn get_ads_val_diff( & self ) -> Mat3x1< f32 > {
134        self._ads_val_spec
135    }
136    fn get_ads_val_amb( & self ) -> Mat3x1< f32 > {
137        self._ads_val_amb
138    }
139}