Skip to content

Commit 8bee966

Browse files
QuantumEntangledAndyvoxelias
authored andcommitted
Handle deleted assets
1 parent 3c6f391 commit 8bee966

File tree

1 file changed

+66
-14
lines changed

1 file changed

+66
-14
lines changed

dotrix_core/src/assets.rs

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub use texture::*;
1818

1919
use 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
4554
pub trait Asset: Any + Send + Sync + 'static {}
4655
impl<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

320355
impl<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

341393
impl Drop for Assets {

0 commit comments

Comments
 (0)