From 7e51fc0749a5d3034ac9eb859a6c5ff7c20fdea7 Mon Sep 17 00:00:00 2001 From: shishanyue <62888460+shishanyue@users.noreply.github.com> Date: Wed, 18 Jun 2025 23:31:39 +0800 Subject: [PATCH] maybe ok? --- crates/bevy_asset/src/folder.rs | 4 ++-- crates/bevy_asset/src/server/mod.rs | 25 +++++++++++++++++++------ examples/asset/folder_filter.rs | 9 +++++---- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/crates/bevy_asset/src/folder.rs b/crates/bevy_asset/src/folder.rs index 83e7a2082f..a0ae548b72 100644 --- a/crates/bevy_asset/src/folder.rs +++ b/crates/bevy_asset/src/folder.rs @@ -2,7 +2,7 @@ use std::{path::Path, sync::Arc}; use alloc::vec::Vec; -use crate::{io::ErasedAssetReader, Asset, UntypedHandle}; +use crate::{Asset, UntypedHandle}; use bevy_reflect::TypePath; /// A "loaded folder" containing handles for all assets stored in a given [`AssetPath`]. @@ -15,5 +15,5 @@ pub struct LoadedFolder { /// The handles of all assets stored in the folder. #[dependency] pub handles: Vec, - pub filter: Option bool + Send + Sync + 'static>> + pub filter: Option bool + Send + Sync + 'static>> } diff --git a/crates/bevy_asset/src/server/mod.rs b/crates/bevy_asset/src/server/mod.rs index fa201ddd66..bd60d6d2af 100644 --- a/crates/bevy_asset/src/server/mod.rs +++ b/crates/bevy_asset/src/server/mod.rs @@ -947,7 +947,7 @@ impl AssetServer { pub fn load_folder<'a>( &self, path: impl Into>, - filter: Option bool + Send + Sync + 'static>>, + filter: Option bool + Send + Sync + 'static>>, ) -> Handle { let path = path.into().into_owned(); let (handle, should_load) = self @@ -972,7 +972,7 @@ impl AssetServer { &self, id: UntypedAssetId, path: AssetPath, - filter: Option bool + Send + Sync + 'static>>, + filter: Option bool + Send + Sync + 'static>>, ) { async fn load_folder<'a>( source: AssetSourceId<'static>, @@ -980,18 +980,19 @@ impl AssetServer { reader: &'a dyn ErasedAssetReader, server: &'a AssetServer, handles: &'a mut Vec, - filter: Option bool + Send + Sync + 'static>>, + filter: Option bool + Send + Sync + 'static>>, ) -> Result<(), AssetLoadError> { let is_dir = reader.is_directory(path).await?; if is_dir { let mut path_stream = reader.read_directory(path.as_ref()).await?; while let Some(child_path) = path_stream.next().await { + let child_is_dir = reader.is_directory(&child_path).await?; if let Some(ref filter_fn) = filter { - if !filter_fn(path) { + if !filter_fn(&child_path, child_is_dir) { continue; } } - if reader.is_directory(&child_path).await? { + if child_is_dir { Box::pin(load_folder( source.clone(), &child_path, @@ -1003,6 +1004,11 @@ impl AssetServer { .await?; } else { let path = child_path.to_str().expect("Path should be a valid string."); + if let Some(ref filter_fn) = filter { + if !filter_fn(&child_path, false) { + continue; + } + } let asset_path = AssetPath::parse(path).with_source(source.clone()); match server.load_untyped_async(asset_path).await { Ok(handle) => handles.push(handle), @@ -1637,6 +1643,13 @@ impl AssetServer { /// A system that manages internal [`AssetServer`] events, such as finalizing asset loads. pub fn handle_internal_asset_events(world: &mut World) { world.resource_scope(|world, server: Mut| { + let mut folder_filters: HashMap< + AssetPath<'_>, + Option bool + Send + Sync + 'static>>, + > = HashMap::new(); + for (id, loaded_folder) in world.get_resource::>().unwrap().iter() { + folder_filters.insert(server.get_path(id).unwrap(), loaded_folder.filter.clone()); + } let mut infos = server.data.infos.write(); let var_name = vec![]; let mut untyped_failures = var_name; @@ -1710,7 +1723,7 @@ pub fn handle_internal_asset_events(world: &mut World) { server.load_folder_internal( folder_handle.id(), parent_asset_path.clone(), - None, + folder_filters.get(&parent_asset_path).unwrap().clone(), ); } } diff --git a/examples/asset/folder_filter.rs b/examples/asset/folder_filter.rs index a4fb9f5598..e199a06957 100644 --- a/examples/asset/folder_filter.rs +++ b/examples/asset/folder_filter.rs @@ -35,9 +35,10 @@ fn load_textures(mut commands: Commands, asset_server: Res) { // Load multiple, individual sprites from a folder commands.insert_resource(RpgSpriteFolder(asset_server.load_folder( "textures/rpg_with_waste", - Some(Arc::new(|path| { - info!("{:?}", path); - !path.is_dir() && path.extension().unwrap() == "png" + Some(Arc::new(|path,is_dir| { + let a = is_dir || path.extension().unwrap_or_default() == "png"; + info!("is_dir:{},path:{:?} {}",is_dir,path,a); + a })), ))); } @@ -149,7 +150,7 @@ fn setup( // Get handle to a sprite to render let vendor_handle: Handle = asset_server - .get_handle("textures/rpg/chars/vendor/generic-rpg-vendor.png") + .get_handle("textures/rpg_with_waste/chars/vendor/generic-rpg-vendor.png") .unwrap(); // Configuration array to render sprites through iteration