1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
use crate::serde::SceneDeserializer; use anyhow::Result; use bevy_asset::{AssetLoader, LoadContext, LoadedAsset}; use bevy_ecs::{FromResources, Resources}; use bevy_reflect::TypeRegistryArc; use bevy_utils::BoxedFuture; use serde::de::DeserializeSeed; #[derive(Debug)] pub struct SceneLoader { type_registry: TypeRegistryArc, } impl FromResources for SceneLoader { fn from_resources(resources: &Resources) -> Self { let type_registry = resources.get::<TypeRegistryArc>().unwrap(); SceneLoader { type_registry: (&*type_registry).clone(), } } } impl AssetLoader for SceneLoader { fn load<'a>( &'a self, bytes: &'a [u8], load_context: &'a mut LoadContext, ) -> BoxedFuture<'a, Result<()>> { Box::pin(async move { let mut deserializer = ron::de::Deserializer::from_bytes(&bytes)?; let scene_deserializer = SceneDeserializer { type_registry: &*self.type_registry.read(), }; let scene = scene_deserializer.deserialize(&mut deserializer)?; load_context.set_default_asset(LoadedAsset::new(scene)); Ok(()) }) } fn extensions(&self) -> &[&str] { &["scn"] } }