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
use crate::{serde::SceneDeserializer, Scene}; use anyhow::Result; use bevy_asset::AssetLoader; use bevy_ecs::{FromResources, Resources}; use bevy_property::PropertyTypeRegistry; use bevy_type_registry::TypeRegistry; use serde::de::DeserializeSeed; use std::{ path::Path, sync::{Arc, RwLock}, }; pub struct SceneLoader { property_type_registry: Arc<RwLock<PropertyTypeRegistry>>, } impl FromResources for SceneLoader { fn from_resources(resources: &Resources) -> Self { let type_registry = resources.get::<TypeRegistry>().unwrap(); SceneLoader { property_type_registry: type_registry.property.clone(), } } } impl AssetLoader<Scene> for SceneLoader { fn from_bytes(&self, _asset_path: &Path, bytes: Vec<u8>) -> Result<Scene> { let registry = self.property_type_registry.read().unwrap(); let mut deserializer = bevy_ron::de::Deserializer::from_bytes(&bytes)?; let scene_deserializer = SceneDeserializer { property_type_registry: ®istry, }; let scene = scene_deserializer.deserialize(&mut deserializer)?; Ok(scene) } fn extensions(&self) -> &[&str] { static EXTENSIONS: &[&str] = &["scn"]; EXTENSIONS } }