From c999eea323fd757b06e921e6d3f76b1baed8a4b8 Mon Sep 17 00:00:00 2001 From: devil-ira Date: Fri, 5 Aug 2022 11:08:15 +0200 Subject: [PATCH] Add `AppTypeRegistry` `Resource` to `bevy_app` --- crates/bevy_app/src/app.rs | 12 +++++++++--- crates/bevy_ecs/src/reflect.rs | 5 +---- crates/bevy_scene/src/dynamic_scene.rs | 3 ++- crates/bevy_scene/src/scene_loader.rs | 5 +++-- crates/bevy_scene/src/scene_spawner.rs | 4 ++-- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index 38b2edc2c14a9..483beb656d837 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -1,5 +1,6 @@ use crate::{CoreStage, Plugin, PluginGroup, PluginGroupBuilder, StartupSchedule, StartupStage}; pub use bevy_derive::AppLabel; +use bevy_derive::{Deref, DerefMut}; use bevy_ecs::{ event::{Event, Events}, prelude::{FromWorld, IntoExclusiveSystem}, @@ -22,6 +23,11 @@ bevy_utils::define_label!( AppLabelId, ); +/// The [`Resource`] that stores the [`App`]'s [`TypeRegistry`](bevy_reflect::TypeRegistry). +#[cfg(feature = "bevy_reflect")] +#[derive(Resource, Clone, Deref, DerefMut, Default)] +pub struct AppTypeRegistry(pub bevy_reflect::TypeRegistryArc); + #[allow(clippy::needless_doctest_main)] /// A container of app logic and data. /// @@ -74,7 +80,7 @@ impl Default for App { fn default() -> Self { let mut app = App::empty(); #[cfg(feature = "bevy_reflect")] - app.init_resource::(); + app.init_resource::(); app.add_default_stages() .add_event::() @@ -878,7 +884,7 @@ impl App { #[cfg(feature = "bevy_reflect")] pub fn register_type(&mut self) -> &mut Self { { - let registry = self.world.resource_mut::(); + let registry = self.world.resource_mut::(); registry.write().register::(); } self @@ -911,7 +917,7 @@ impl App { &mut self, ) -> &mut Self { { - let registry = self.world.resource_mut::(); + let registry = self.world.resource_mut::(); registry.write().register_type_data::(); } self diff --git a/crates/bevy_ecs/src/reflect.rs b/crates/bevy_ecs/src/reflect.rs index ae1e970eda5e2..0b288b3aa7ac0 100644 --- a/crates/bevy_ecs/src/reflect.rs +++ b/crates/bevy_ecs/src/reflect.rs @@ -9,7 +9,7 @@ use crate::{ }; use bevy_reflect::{ impl_from_reflect_value, impl_reflect_value, FromType, Reflect, ReflectDeserialize, - ReflectSerialize, TypeRegistryArc, + ReflectSerialize, }; /// A struct used to operate on reflected [`Component`] of a type. @@ -316,6 +316,3 @@ impl FromType for ReflectMapEntities { } } } - -// We cannot implement this in bevy_reflect, or we would create a cyclic dependendency -impl Resource for TypeRegistryArc {} diff --git a/crates/bevy_scene/src/dynamic_scene.rs b/crates/bevy_scene/src/dynamic_scene.rs index 7328f5f366267..1de7202bfab4e 100644 --- a/crates/bevy_scene/src/dynamic_scene.rs +++ b/crates/bevy_scene/src/dynamic_scene.rs @@ -1,5 +1,6 @@ use crate::{serde::SceneSerializer, Scene, SceneSpawnError}; use anyhow::Result; +use bevy_app::AppTypeRegistry; use bevy_ecs::{ entity::EntityMap, reflect::{ReflectComponent, ReflectMapEntities}, @@ -84,7 +85,7 @@ impl DynamicScene { world: &mut World, entity_map: &mut EntityMap, ) -> Result<(), SceneSpawnError> { - let registry = world.resource::().clone(); + let registry = world.resource::().clone(); let type_registry = registry.read(); for scene_entity in &self.entities { diff --git a/crates/bevy_scene/src/scene_loader.rs b/crates/bevy_scene/src/scene_loader.rs index 2a44af0cf51ca..e13b2541eeb13 100644 --- a/crates/bevy_scene/src/scene_loader.rs +++ b/crates/bevy_scene/src/scene_loader.rs @@ -1,5 +1,6 @@ use crate::serde::SceneDeserializer; use anyhow::Result; +use bevy_app::AppTypeRegistry; use bevy_asset::{AssetLoader, LoadContext, LoadedAsset}; use bevy_ecs::world::{FromWorld, World}; use bevy_reflect::TypeRegistryArc; @@ -13,9 +14,9 @@ pub struct SceneLoader { impl FromWorld for SceneLoader { fn from_world(world: &mut World) -> Self { - let type_registry = world.resource::(); + let type_registry = world.resource::(); SceneLoader { - type_registry: (*type_registry).clone(), + type_registry: type_registry.0.clone(), } } } diff --git a/crates/bevy_scene/src/scene_spawner.rs b/crates/bevy_scene/src/scene_spawner.rs index b57324fc57528..d9bfcb213687e 100644 --- a/crates/bevy_scene/src/scene_spawner.rs +++ b/crates/bevy_scene/src/scene_spawner.rs @@ -1,4 +1,5 @@ use crate::{DynamicScene, Scene}; +use bevy_app::AppTypeRegistry; use bevy_asset::{AssetEvent, Assets, Handle}; use bevy_ecs::{ entity::{Entity, EntityMap}, @@ -8,7 +9,6 @@ use bevy_ecs::{ world::{Mut, World}, }; use bevy_hierarchy::{AddChild, Parent}; -use bevy_reflect::TypeRegistryArc; use bevy_utils::{tracing::error, HashMap}; use thiserror::Error; use uuid::Uuid; @@ -164,7 +164,7 @@ impl SceneSpawner { let mut instance_info = InstanceInfo { entity_map: EntityMap::default(), }; - let type_registry = world.resource::().clone(); + let type_registry = world.resource::().clone(); let type_registry = type_registry.read(); world.resource_scope(|world, scenes: Mut>| { let scene =