@@ -18,7 +18,7 @@ pub use texture::*;
1818
1919use std:: {
2020 any:: { Any , TypeId } ,
21- collections:: { hash_map, HashMap , HashSet } ,
21+ collections:: { hash_map, hash_set , HashMap , HashSet } ,
2222 sync:: { mpsc, Arc , Mutex } ,
2323 vec:: Vec ,
2424} ;
@@ -41,6 +41,15 @@ impl<T: Asset> AssetSet for HashMap<Id<T>, T> {
4141 }
4242}
4343
44+ impl < T : Asset > AssetSet for HashSet < Id < T > > {
45+ fn as_any_ref ( & self ) -> & dyn Any {
46+ self
47+ }
48+ fn as_any_mut ( & mut self ) -> & mut dyn Any {
49+ self
50+ }
51+ }
52+
4453/// Any struct can be an asset
4554pub trait Asset : Any + Send + Sync + ' static { }
4655impl < T : Send + Sync + ' static > Asset for T { }
@@ -63,7 +72,7 @@ pub struct Assets {
6372 sender : mpsc:: Sender < Request > ,
6473 receiver : mpsc:: Receiver < Response > ,
6574 id_generator : u64 ,
66- removed_shaders : HashSet < Id < Shader > > ,
75+ removed_assets : HashMap < TypeId , Box < dyn AssetSet > > ,
6776 hot_reload : bool ,
6877 root : std:: path:: PathBuf ,
6978}
@@ -95,7 +104,7 @@ impl Assets {
95104 sender,
96105 receiver,
97106 id_generator : 1 ,
98- removed_shaders : HashSet :: new ( ) ,
107+ removed_assets : HashMap :: new ( ) ,
99108 hot_reload : true ,
100109 root,
101110 }
@@ -213,7 +222,7 @@ impl Assets {
213222 where
214223 Self : AssetMapGetter < T > ,
215224 {
216- self . map_removed_mut ( ) . map ( |l| l . insert ( handle) ) ;
225+ self . map_removed_mut ( ) . insert ( handle) ;
217226 self . map_mut ( ) . remove ( & handle)
218227 }
219228
@@ -235,6 +244,30 @@ impl Assets {
235244 self . map_mut ( ) . iter_mut ( )
236245 }
237246
247+ /// Returns an iter to the removed asset list
248+ pub fn iter_removed < T : Asset > ( & mut self ) -> hash_set:: Iter < ' _ , Id < T > >
249+ where
250+ Self : AssetMapGetter < T > ,
251+ {
252+ self . map_removed_mut ( ) . iter ( )
253+ }
254+
255+ /// Returns the removed asset list
256+ pub fn get_removed_ref < T : Asset > ( & mut self ) -> Option < & HashSet < Id < T > > >
257+ where
258+ Self : AssetMapGetter < T > ,
259+ {
260+ self . map_removed ( )
261+ }
262+
263+ /// Returns the mutable removed asset list
264+ pub fn get_removed_mut < T : Asset > ( & mut self ) -> & mut HashSet < Id < T > >
265+ where
266+ Self : AssetMapGetter < T > ,
267+ {
268+ self . map_removed_mut ( )
269+ }
270+
238271 fn next_id ( & mut self ) -> u64 {
239272 let result = self . id_generator ;
240273 self . id_generator += 1 ;
@@ -279,12 +312,18 @@ pub fn release(mut assets: Mut<Assets>, mut renderer: Mut<Renderer>) {
279312 }
280313 // Shaders that no longer exist need to be removed from the renderer
281314 // by dropping their pipeline
282- for removed_shader in & assets. removed_shaders {
283- if assets. get :: < Shader > ( * removed_shader) . is_none ( ) {
284- renderer. drop_pipeline ( * removed_shader) ;
315+ for removed_shader in assets
316+ . iter_removed :: < Shader > ( )
317+ . copied ( )
318+ . collect :: < Vec < Id < Shader > > > ( )
319+ {
320+ if assets. get :: < Shader > ( removed_shader) . is_none ( ) {
321+ renderer. drop_pipeline ( removed_shader) ;
285322 }
286323 }
287- assets. removed_shaders . clear ( ) ;
324+ // assets.get_removed_mut::<Shader>().clear();
325+ // TODO: Find a better way to cleanup deleted assets
326+ assets. removed_assets . clear ( ) ;
288327
289328 // Any shader that has its shader module dropped/uninitalised should have it's
290329 // pipeline dropped from the renderer
@@ -307,14 +346,10 @@ pub trait AssetMapGetter<T> {
307346
308347 /// Returns HashSet reference for selected asset type that have been removed
309348 /// since last clean up
310- fn map_removed ( & self ) -> Option < & HashSet < Id < T > > > {
311- None
312- }
349+ fn map_removed ( & self ) -> Option < & HashSet < Id < T > > > ;
313350 /// Returns mutable HashSet reference for selected asset type that have been removed
314351 /// since last clean up
315- fn map_removed_mut ( & mut self ) -> Option < & mut HashSet < Id < T > > > {
316- None
317- }
352+ fn map_removed_mut ( & mut self ) -> & mut HashSet < Id < T > > ;
318353}
319354
320355impl < T : Asset > AssetMapGetter < T > for Assets {
@@ -336,6 +371,23 @@ impl<T: Asset> AssetMapGetter<T> for Assets {
336371 . downcast_mut :: < HashMap < Id < T > , T > > ( )
337372 . unwrap ( )
338373 }
374+ fn map_removed ( & self ) -> Option < & HashSet < Id < T > > > {
375+ self . removed_assets
376+ . get ( & TypeId :: of :: < T > ( ) ) ?
377+ . as_any_ref ( )
378+ . downcast_ref :: < HashSet < Id < T > > > ( )
379+ }
380+ fn map_removed_mut ( & mut self ) -> & mut HashSet < Id < T > > {
381+ self . removed_assets
382+ . entry ( TypeId :: of :: < T > ( ) )
383+ . or_insert_with ( || {
384+ let empty: HashSet < Id < T > > = Default :: default ( ) ;
385+ Box :: new ( empty)
386+ } )
387+ . as_any_mut ( )
388+ . downcast_mut :: < HashSet < Id < T > > > ( )
389+ . unwrap ( )
390+ }
339391}
340392
341393impl Drop for Assets {
0 commit comments