e2rcore/implement/render/
shader_collection.rs

1use 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}