e2rcore/implement/render/
light.rs1extern 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 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 {
34 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 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 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 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}