From 46ec7b8c4f622d4be8b31fdc187d71295ee58312 Mon Sep 17 00:00:00 2001 From: akimakinai <105044389+akimakinai@users.noreply.github.com> Date: Wed, 4 Sep 2024 07:58:43 +0900 Subject: [PATCH 1/3] Fix `load_resource` stops proceeding if any of asset loading failed --- src/asset_tracking.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/asset_tracking.rs b/src/asset_tracking.rs index 265e712..fbad6b8 100644 --- a/src/asset_tracking.rs +++ b/src/asset_tracking.rs @@ -1,5 +1,7 @@ //! A high-level way to load collections of asset handles as resources. +use std::collections::VecDeque; + use bevy::prelude::*; pub(super) fn plugin(app: &mut App) { @@ -22,12 +24,14 @@ impl LoadResource for App { let assets = world.resource::(); let handle = assets.add(value); let mut handles = world.resource_mut::(); - handles.waiting.push((handle.untyped(), |world, handle| { - let assets = world.resource::>(); - if let Some(value) = assets.get(handle.id().typed::()) { - world.insert_resource(value.clone()); - } - })); + handles + .waiting + .push_back((handle.untyped(), |world, handle| { + let assets = world.resource::>(); + if let Some(value) = assets.get(handle.id().typed::()) { + world.insert_resource(value.clone()); + } + })); self } } @@ -37,7 +41,7 @@ type InsertLoadedResource = fn(&mut World, &UntypedHandle); #[derive(Resource, Default)] struct ResourceHandles { - waiting: Vec<(UntypedHandle, InsertLoadedResource)>, + waiting: VecDeque<(UntypedHandle, InsertLoadedResource)>, finished: Vec, } @@ -45,12 +49,12 @@ fn load_resource_assets(world: &mut World) { world.resource_scope(|world, mut resource_handles: Mut| { world.resource_scope(|world, assets: Mut| { for _ in 0..resource_handles.waiting.len() { - let (handle, insert_fn) = resource_handles.waiting.pop().unwrap(); + let (handle, insert_fn) = resource_handles.waiting.pop_front().unwrap(); if assets.is_loaded_with_dependencies(&handle) { insert_fn(world, &handle); resource_handles.finished.push(handle); } else { - resource_handles.waiting.push((handle, insert_fn)); + resource_handles.waiting.push_back((handle, insert_fn)); } } }); From fa34a54224c93820885042251b49466135dbd4b2 Mon Sep 17 00:00:00 2001 From: akimakinai <105044389+akimakinai@users.noreply.github.com> Date: Wed, 4 Sep 2024 21:31:52 +0900 Subject: [PATCH 2/3] Add comment --- src/asset_tracking.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/asset_tracking.rs b/src/asset_tracking.rs index fbad6b8..b911c32 100644 --- a/src/asset_tracking.rs +++ b/src/asset_tracking.rs @@ -41,6 +41,8 @@ type InsertLoadedResource = fn(&mut World, &UntypedHandle); #[derive(Resource, Default)] struct ResourceHandles { + // Not immediately useful for this template, where we wait for all assets anyway, but + // use VecDeque to allow assets to be loaded (or fail to load) in arbitrary order. waiting: VecDeque<(UntypedHandle, InsertLoadedResource)>, finished: Vec, } From 7e4cecd31b20affc3a68ec4076bd145b5deccf58 Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Wed, 4 Sep 2024 20:29:19 +0200 Subject: [PATCH 3/3] Update asset_tracking.rs Co-authored-by: Ben Frankel --- src/asset_tracking.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/asset_tracking.rs b/src/asset_tracking.rs index b911c32..f61992a 100644 --- a/src/asset_tracking.rs +++ b/src/asset_tracking.rs @@ -41,8 +41,8 @@ type InsertLoadedResource = fn(&mut World, &UntypedHandle); #[derive(Resource, Default)] struct ResourceHandles { - // Not immediately useful for this template, where we wait for all assets anyway, but - // use VecDeque to allow assets to be loaded (or fail to load) in arbitrary order. + // Use a queue for waiting assets so they can be cycled through and moved to + // `finished` one at a time. waiting: VecDeque<(UntypedHandle, InsertLoadedResource)>, finished: Vec, }