From e776925533d09a436210d51273da3994c685c40a Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 28 Sep 2026 18:45:51 +0200 Subject: feat(engine): add Assets::get_mut fn --- engine/src/asset.rs | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) (limited to 'engine/src') diff --git a/engine/src/asset.rs b/engine/src/asset.rs index 04cb385..7aacc5b 100644 --- a/engine/src/asset.rs +++ b/engine/src/asset.rs @@ -13,7 +13,6 @@ use std::sync::mpsc::{ Receiver as MpscReceiver, Sender as MpscSender, }; -use std::sync::Arc; use ecs::actions::Actions; @@ -170,7 +169,40 @@ impl Assets unreachable!(); }; - let Some(asset) = stored_asset.strong.downcast_ref::() else { + let Some(asset) = stored_asset.inner.downcast_ref::() else { + tracing::error!("Wrong asset type"); + return None; + }; + + Some(asset) + } + + #[tracing::instrument( + skip_all, + fields(asset_label, asset_type = %type_name::()) + )] + pub fn get_mut(&mut self, handle: &Handle) -> Option<&mut AssetT> + where + AssetT: Asset, + { + let id = handle.id.into_valid()?; + + let asset_lookup = self.asset_lookup.borrow(); + + let AssetState::Ready(asset_index, asset_label) = + &asset_lookup.get(&id.label_hash)?.state + else { + return None; + }; + + tracing::Span::current() + .record("asset_label", tracing::field::display(&asset_label)); + + let Some(stored_asset) = self.store.get_mut(*asset_index) else { + unreachable!(); + }; + + let Some(asset) = stored_asset.inner.downcast_mut::() else { tracing::error!("Wrong asset type"); return None; }; @@ -203,7 +235,7 @@ impl Assets unreachable!(); }; - if stored_asset.strong.downcast_ref::().is_none() { + if stored_asset.inner.downcast_ref::().is_none() { tracing::error!("Wrong asset type"); return None; } @@ -231,7 +263,7 @@ impl Assets unreachable!(); }; - stored_asset.strong.downcast_ref::().is_some() + stored_asset.inner.downcast_ref::().is_some() } pub fn get_label(&self, handle: &Handle) -> Option> @@ -1049,16 +1081,14 @@ enum AssetState #[derive(Debug)] struct StoredAsset { - strong: Arc, + inner: Box, } impl StoredAsset { fn new(asset: AssetT) -> Self { - let strong = Arc::new(asset); - - Self { strong } + Self { inner: Box::new(asset) } } } -- cgit v1.2.3-18-g5258