Remove the meta field from LoadedAsset and ErasedLoadedAsset. (#15487)

# Objective

Fixes #15485.

## Solution

Deletes the field! The `meta` field had no way to access or mutate it.

## Testing

- It builds!

---

## Migration Guide

- `ErasedAssetLoader` now takes a borrow to `AssetMetaDyn` instead of a
`Box`.
- `LoadedAsset::new_with_dependencies` no longer requires a `meta`
argument.
- `LoadContext::finish` no longer requires a `meta` argument.
This commit is contained in:
andriyDev 2024-12-13 12:40:02 -08:00 committed by GitHub
parent 72079cf8e0
commit 4ba47ed8bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 26 additions and 40 deletions

View File

@ -50,7 +50,7 @@ pub trait ErasedAssetLoader: Send + Sync + 'static {
fn load<'a>( fn load<'a>(
&'a self, &'a self,
reader: &'a mut dyn Reader, reader: &'a mut dyn Reader,
meta: Box<dyn AssetMetaDyn>, meta: &'a dyn AssetMetaDyn,
load_context: LoadContext<'a>, load_context: LoadContext<'a>,
) -> BoxedFuture< ) -> BoxedFuture<
'a, 'a,
@ -81,7 +81,7 @@ where
fn load<'a>( fn load<'a>(
&'a self, &'a self,
reader: &'a mut dyn Reader, reader: &'a mut dyn Reader,
meta: Box<dyn AssetMetaDyn>, meta: &'a dyn AssetMetaDyn,
mut load_context: LoadContext<'a>, mut load_context: LoadContext<'a>,
) -> BoxedFuture< ) -> BoxedFuture<
'a, 'a,
@ -96,7 +96,7 @@ where
let asset = <L as AssetLoader>::load(self, reader, settings, &mut load_context) let asset = <L as AssetLoader>::load(self, reader, settings, &mut load_context)
.await .await
.map_err(Into::into)?; .map_err(Into::into)?;
Ok(load_context.finish(asset, Some(meta)).into()) Ok(load_context.finish(asset).into())
}) })
} }
@ -147,12 +147,11 @@ pub struct LoadedAsset<A: Asset> {
pub(crate) dependencies: HashSet<UntypedAssetId>, pub(crate) dependencies: HashSet<UntypedAssetId>,
pub(crate) loader_dependencies: HashMap<AssetPath<'static>, AssetHash>, pub(crate) loader_dependencies: HashMap<AssetPath<'static>, AssetHash>,
pub(crate) labeled_assets: HashMap<CowArc<'static, str>, LabeledAsset>, pub(crate) labeled_assets: HashMap<CowArc<'static, str>, LabeledAsset>,
pub(crate) meta: Option<Box<dyn AssetMetaDyn>>,
} }
impl<A: Asset> LoadedAsset<A> { impl<A: Asset> LoadedAsset<A> {
/// Create a new loaded asset. This will use [`VisitAssetDependencies`](crate::VisitAssetDependencies) to populate `dependencies`. /// Create a new loaded asset. This will use [`VisitAssetDependencies`](crate::VisitAssetDependencies) to populate `dependencies`.
pub fn new_with_dependencies(value: A, meta: Option<Box<dyn AssetMetaDyn>>) -> Self { pub fn new_with_dependencies(value: A) -> Self {
let mut dependencies = <HashSet<_>>::default(); let mut dependencies = <HashSet<_>>::default();
value.visit_dependencies(&mut |id| { value.visit_dependencies(&mut |id| {
dependencies.insert(id); dependencies.insert(id);
@ -162,7 +161,6 @@ impl<A: Asset> LoadedAsset<A> {
dependencies, dependencies,
loader_dependencies: HashMap::default(), loader_dependencies: HashMap::default(),
labeled_assets: HashMap::default(), labeled_assets: HashMap::default(),
meta,
} }
} }
@ -192,7 +190,7 @@ impl<A: Asset> LoadedAsset<A> {
impl<A: Asset> From<A> for LoadedAsset<A> { impl<A: Asset> From<A> for LoadedAsset<A> {
fn from(asset: A) -> Self { fn from(asset: A) -> Self {
LoadedAsset::new_with_dependencies(asset, None) LoadedAsset::new_with_dependencies(asset)
} }
} }
@ -202,7 +200,6 @@ pub struct ErasedLoadedAsset {
pub(crate) dependencies: HashSet<UntypedAssetId>, pub(crate) dependencies: HashSet<UntypedAssetId>,
pub(crate) loader_dependencies: HashMap<AssetPath<'static>, AssetHash>, pub(crate) loader_dependencies: HashMap<AssetPath<'static>, AssetHash>,
pub(crate) labeled_assets: HashMap<CowArc<'static, str>, LabeledAsset>, pub(crate) labeled_assets: HashMap<CowArc<'static, str>, LabeledAsset>,
pub(crate) meta: Option<Box<dyn AssetMetaDyn>>,
} }
impl<A: Asset> From<LoadedAsset<A>> for ErasedLoadedAsset { impl<A: Asset> From<LoadedAsset<A>> for ErasedLoadedAsset {
@ -212,7 +209,6 @@ impl<A: Asset> From<LoadedAsset<A>> for ErasedLoadedAsset {
dependencies: asset.dependencies, dependencies: asset.dependencies,
loader_dependencies: asset.loader_dependencies, loader_dependencies: asset.loader_dependencies,
labeled_assets: asset.labeled_assets, labeled_assets: asset.labeled_assets,
meta: asset.meta,
} }
} }
} }
@ -254,7 +250,6 @@ impl ErasedLoadedAsset {
/// Cast this loaded asset as the given type. If the type does not match, /// Cast this loaded asset as the given type. If the type does not match,
/// the original type-erased asset is returned. /// the original type-erased asset is returned.
#[expect(clippy::result_large_err, reason = "Function returns `Self` on error.")]
pub fn downcast<A: Asset>(mut self) -> Result<LoadedAsset<A>, ErasedLoadedAsset> { pub fn downcast<A: Asset>(mut self) -> Result<LoadedAsset<A>, ErasedLoadedAsset> {
match self.value.downcast::<A>() { match self.value.downcast::<A>() {
Ok(value) => Ok(LoadedAsset { Ok(value) => Ok(LoadedAsset {
@ -262,7 +257,6 @@ impl ErasedLoadedAsset {
dependencies: self.dependencies, dependencies: self.dependencies,
loader_dependencies: self.loader_dependencies, loader_dependencies: self.loader_dependencies,
labeled_assets: self.labeled_assets, labeled_assets: self.labeled_assets,
meta: self.meta,
}), }),
Err(value) => { Err(value) => {
self.value = value; self.value = value;
@ -364,7 +358,7 @@ impl<'a> LoadContext<'a> {
/// for i in 0..2 { /// for i in 0..2 {
/// let mut labeled = load_context.begin_labeled_asset(); /// let mut labeled = load_context.begin_labeled_asset();
/// handles.push(std::thread::spawn(move || { /// handles.push(std::thread::spawn(move || {
/// (i.to_string(), labeled.finish(Image::default(), None)) /// (i.to_string(), labeled.finish(Image::default()))
/// })); /// }));
/// } /// }
/// ///
@ -397,7 +391,7 @@ impl<'a> LoadContext<'a> {
) -> Handle<A> { ) -> Handle<A> {
let mut context = self.begin_labeled_asset(); let mut context = self.begin_labeled_asset();
let asset = load(&mut context); let asset = load(&mut context);
let loaded_asset = context.finish(asset, None); let loaded_asset = context.finish(asset);
self.add_loaded_labeled_asset(label, loaded_asset) self.add_loaded_labeled_asset(label, loaded_asset)
} }
@ -451,13 +445,12 @@ impl<'a> LoadContext<'a> {
/// "Finishes" this context by populating the final [`Asset`] value (and the erased [`AssetMeta`] value, if it exists). /// "Finishes" this context by populating the final [`Asset`] value (and the erased [`AssetMeta`] value, if it exists).
/// The relevant asset metadata collected in this context will be stored in the returned [`LoadedAsset`]. /// The relevant asset metadata collected in this context will be stored in the returned [`LoadedAsset`].
pub fn finish<A: Asset>(self, value: A, meta: Option<Box<dyn AssetMetaDyn>>) -> LoadedAsset<A> { pub fn finish<A: Asset>(self, value: A) -> LoadedAsset<A> {
LoadedAsset { LoadedAsset {
value, value,
dependencies: self.dependencies, dependencies: self.dependencies,
loader_dependencies: self.loader_dependencies, loader_dependencies: self.loader_dependencies,
labeled_assets: self.labeled_assets, labeled_assets: self.labeled_assets,
meta,
} }
} }
@ -524,7 +517,7 @@ impl<'a> LoadContext<'a> {
pub(crate) async fn load_direct_internal( pub(crate) async fn load_direct_internal(
&mut self, &mut self,
path: AssetPath<'static>, path: AssetPath<'static>,
meta: Box<dyn AssetMetaDyn>, meta: &dyn AssetMetaDyn,
loader: &dyn ErasedAssetLoader, loader: &dyn ErasedAssetLoader,
reader: &mut dyn Reader, reader: &mut dyn Reader,
) -> Result<ErasedLoadedAsset, LoadDirectError> { ) -> Result<ErasedLoadedAsset, LoadDirectError> {
@ -543,10 +536,7 @@ impl<'a> LoadContext<'a> {
dependency: path.clone(), dependency: path.clone(),
error, error,
})?; })?;
let info = loaded_asset let info = meta.processed_info().as_ref();
.meta
.as_ref()
.and_then(|m| m.processed_info().as_ref());
let hash = info.map(|i| i.full_hash).unwrap_or_default(); let hash = info.map(|i| i.full_hash).unwrap_or_default();
self.loader_dependencies.insert(path, hash); self.loader_dependencies.insert(path, hash);
Ok(loaded_asset) Ok(loaded_asset)

View File

@ -428,7 +428,7 @@ impl<'builder, 'reader, T> NestedLoader<'_, '_, T, Immediate<'builder, 'reader>>
let asset = self let asset = self
.load_context .load_context
.load_direct_internal(path.clone(), meta, &*loader, reader.as_mut()) .load_direct_internal(path.clone(), meta.as_ref(), &*loader, reader.as_mut())
.await?; .await?;
Ok((loader, asset)) Ok((loader, asset))
} }

View File

@ -326,14 +326,7 @@ impl<'a> ProcessContext<'a> {
let loader = server.get_asset_loader_with_type_name(loader_name).await?; let loader = server.get_asset_loader_with_type_name(loader_name).await?;
let mut reader = SliceReader::new(self.asset_bytes); let mut reader = SliceReader::new(self.asset_bytes);
let loaded_asset = server let loaded_asset = server
.load_with_meta_loader_and_reader( .load_with_meta_loader_and_reader(self.path, &meta, &*loader, &mut reader, false, true)
self.path,
Box::new(meta),
&*loader,
&mut reader,
false,
true,
)
.await?; .await?;
for (path, full_hash) in &loaded_asset.loader_dependencies { for (path, full_hash) in &loaded_asset.loader_dependencies {
self.new_processed_info self.new_processed_info

View File

@ -488,11 +488,8 @@ impl AssetServer {
match server.load_untyped_async(path).await { match server.load_untyped_async(path).await {
Ok(handle) => server.send_asset_event(InternalAssetEvent::Loaded { Ok(handle) => server.send_asset_event(InternalAssetEvent::Loaded {
id, id,
loaded_asset: LoadedAsset::new_with_dependencies( loaded_asset: LoadedAsset::new_with_dependencies(LoadedUntypedAsset { handle })
LoadedUntypedAsset { handle }, .into(),
None,
)
.into(),
}), }),
Err(err) => { Err(err) => {
error!("{err}"); error!("{err}");
@ -647,7 +644,14 @@ impl AssetServer {
}; };
match self match self
.load_with_meta_loader_and_reader(&base_path, meta, &*loader, &mut *reader, true, false) .load_with_meta_loader_and_reader(
&base_path,
meta.as_ref(),
&*loader,
&mut *reader,
true,
false,
)
.await .await
{ {
Ok(loaded_asset) => { Ok(loaded_asset) => {
@ -735,7 +739,7 @@ impl AssetServer {
/// After the asset has been fully loaded by the [`AssetServer`], it will show up in the relevant [`Assets`] storage. /// After the asset has been fully loaded by the [`AssetServer`], it will show up in the relevant [`Assets`] storage.
#[must_use = "not using the returned strong handle may result in the unexpected release of the asset"] #[must_use = "not using the returned strong handle may result in the unexpected release of the asset"]
pub fn add<A: Asset>(&self, asset: A) -> Handle<A> { pub fn add<A: Asset>(&self, asset: A) -> Handle<A> {
self.load_asset(LoadedAsset::new_with_dependencies(asset, None)) self.load_asset(LoadedAsset::new_with_dependencies(asset))
} }
pub(crate) fn load_asset<A: Asset>(&self, asset: impl Into<LoadedAsset<A>>) -> Handle<A> { pub(crate) fn load_asset<A: Asset>(&self, asset: impl Into<LoadedAsset<A>>) -> Handle<A> {
@ -798,7 +802,7 @@ impl AssetServer {
let task = IoTaskPool::get().spawn(async move { let task = IoTaskPool::get().spawn(async move {
match future.await { match future.await {
Ok(asset) => { Ok(asset) => {
let loaded_asset = LoadedAsset::new_with_dependencies(asset, None).into(); let loaded_asset = LoadedAsset::new_with_dependencies(asset).into();
event_sender event_sender
.send(InternalAssetEvent::Loaded { id, loaded_asset }) .send(InternalAssetEvent::Loaded { id, loaded_asset })
.unwrap(); .unwrap();
@ -928,7 +932,6 @@ impl AssetServer {
id, id,
loaded_asset: LoadedAsset::new_with_dependencies( loaded_asset: LoadedAsset::new_with_dependencies(
LoadedFolder { handles }, LoadedFolder { handles },
None,
) )
.into(), .into(),
}), }),
@ -1314,7 +1317,7 @@ impl AssetServer {
pub(crate) async fn load_with_meta_loader_and_reader( pub(crate) async fn load_with_meta_loader_and_reader(
&self, &self,
asset_path: &AssetPath<'_>, asset_path: &AssetPath<'_>,
meta: Box<dyn AssetMetaDyn>, meta: &dyn AssetMetaDyn,
loader: &dyn ErasedAssetLoader, loader: &dyn ErasedAssetLoader,
reader: &mut dyn Reader, reader: &mut dyn Reader,
load_dependencies: bool, load_dependencies: bool,

View File

@ -923,7 +923,7 @@ async fn load_gltf<'a, 'b, 'c>(
joints: joint_entities, joints: joint_entities,
}); });
} }
let loaded_scene = scene_load_context.finish(Scene::new(world), None); let loaded_scene = scene_load_context.finish(Scene::new(world));
let scene_handle = load_context.add_loaded_labeled_asset(scene_label(&scene), loaded_scene); let scene_handle = load_context.add_loaded_labeled_asset(scene_label(&scene), loaded_scene);
if let Some(name) = scene.name() { if let Some(name) = scene.name() {