e2rcore/implement/render/
shader_collection.rs1use std::collections::HashMap;
2use std::string::String;
3
4use implement::render::router;
5
6pub struct ShaderCollection {
7 _programs: HashMap< u64, ( router::ShaderType, i64 ) >,
8 _id_to_descrip: HashMap< u64, String >,
9 _descrip_to_id: HashMap< String, u64 >,
10}
11
12
13impl Default for ShaderCollection {
14 fn default() -> ShaderCollection {
15 ShaderCollection {
16 _programs: HashMap::new(),
17 _id_to_descrip: HashMap::new(),
18 _descrip_to_id: HashMap::new(),
19 }
20 }
21}
22
23impl ShaderCollection {
24 pub fn put( & mut self, id: u64, shader_type: router::ShaderType, internal_handle: i64, descrip: String ) -> Result< (), & 'static str > {
25 match self._programs.insert( id, ( shader_type, internal_handle ) ) {
26 None => (),
27 Some( ( shader_type, old_handle ) ) => {
28 router::delete_shader_program( old_handle, shader_type )?;
29 trace!( "removed old shader program( {} ).", old_handle );
30 }
31 }
32 self._id_to_descrip.insert( id, descrip.clone() );
33 self._descrip_to_id.insert( descrip, id );
34 Ok( () )
35 }
36 pub fn clear( & mut self ) -> Result< (), & 'static str > {
37 for ( _, &( ref shader_type, ref handle ) ) in self._programs.iter() {
38 router::delete_shader_program( *handle, (*shader_type).clone() )?;
39 }
40 self._id_to_descrip.clear();
41 self._descrip_to_id.clear();
42 Ok( () )
43 }
44 pub fn remove( & mut self, id: u64 ) -> Result< (), & 'static str > {
45 match self._programs.remove( &id ) {
46 Some( ( shader_type, handle ) ) => {
47 router::delete_shader_program( handle, shader_type )?;
48 if let Some( descrip ) = self._id_to_descrip.remove( &id ) {
49 self._descrip_to_id.remove( &descrip );
50 };
51 ()
52 },
53 None => (),
54 }
55 Ok( () )
56 }
57 pub fn get( & mut self, id: u64 ) -> Option< i64 > {
58 match self._programs.get( &id ) {
59 Some( &( ref _shader_type, ref handle ) ) => {
60 return Some( *handle )
61 },
62 None => return None
63 }
64 }
65}