From 1a67c495062948640bb2999c61d116c681315230 Mon Sep 17 00:00:00 2001 From: Jonah Henriksson <33059163+JonahPlusPlus@users.noreply.github.com> Date: Sat, 18 Mar 2023 22:33:23 -0400 Subject: [PATCH 01/13] Added `init_resources` --- crates/bevy_a11y/src/lib.rs | 3 +- crates/bevy_app/src/app.rs | 56 +++++++++++++++++-- crates/bevy_app/src/main_schedule.rs | 2 +- crates/bevy_audio/src/lib.rs | 6 +- crates/bevy_core/src/lib.rs | 2 +- crates/bevy_core_pipeline/src/blit/mod.rs | 4 +- crates/bevy_core_pipeline/src/bloom/mod.rs | 10 ++-- crates/bevy_core_pipeline/src/core_2d/mod.rs | 2 +- crates/bevy_core_pipeline/src/core_3d/mod.rs | 8 ++- crates/bevy_core_pipeline/src/fxaa/mod.rs | 3 +- crates/bevy_core_pipeline/src/lib.rs | 2 +- .../bevy_core_pipeline/src/tonemapping/mod.rs | 6 +- crates/bevy_diagnostic/src/lib.rs | 2 +- crates/bevy_ecs/src/lib.rs | 5 +- crates/bevy_ecs/src/system/system_param.rs | 22 ++++++++ crates/bevy_ecs/src/world/mod.rs | 7 ++- .../src/valid_parent_check_plugin.rs | 2 +- crates/bevy_input/src/lib.rs | 19 ++++--- crates/bevy_pbr/src/lib.rs | 14 ++--- crates/bevy_pbr/src/material.rs | 12 ++-- crates/bevy_pbr/src/prepass/mod.rs | 14 +++-- crates/bevy_pbr/src/render/fog.rs | 2 +- crates/bevy_pbr/src/render/mesh.rs | 3 +- crates/bevy_pbr/src/wireframe.rs | 8 ++- crates/bevy_render/src/camera/mod.rs | 2 +- crates/bevy_render/src/globals.rs | 3 +- crates/bevy_render/src/lib.rs | 4 +- crates/bevy_render/src/render_asset.rs | 8 ++- crates/bevy_render/src/texture/mod.rs | 12 ++-- crates/bevy_render/src/view/mod.rs | 4 +- crates/bevy_render/src/view/window.rs | 3 +- crates/bevy_scene/src/lib.rs | 2 +- crates/bevy_sprite/src/lib.rs | 14 +++-- crates/bevy_sprite/src/mesh2d/material.rs | 10 ++-- crates/bevy_sprite/src/mesh2d/mesh.rs | 3 +- crates/bevy_text/src/lib.rs | 3 +- crates/bevy_time/src/lib.rs | 4 +- crates/bevy_ui/src/lib.rs | 4 +- crates/bevy_ui/src/render/mod.rs | 14 +++-- crates/bevy_winit/src/accessibility.rs | 2 +- crates/bevy_winit/src/lib.rs | 2 +- examples/2d/mesh2d_manual.rs | 6 +- examples/2d/texture_atlas.rs | 2 +- examples/3d/tonemapping.rs | 2 +- examples/asset/custom_asset.rs | 2 +- examples/ecs/apply_system_buffers.rs | 2 +- examples/ecs/ecs_guide.rs | 2 +- examples/ecs/event.rs | 2 +- examples/ecs/nondeterministic_system_order.rs | 3 +- examples/ecs/run_conditions.rs | 2 +- examples/ecs/timers.rs | 2 +- examples/games/alien_cake_addict.rs | 2 +- examples/games/contributors.rs | 2 +- .../shader/compute_shader_game_of_life.rs | 2 +- examples/shader/post_process_pass.rs | 2 +- examples/shader/shader_instancing.rs | 3 +- examples/stress_tests/many_buttons.rs | 2 +- examples/tools/gamepad_viewer.rs | 4 +- .../tools/scene_viewer/scene_viewer_plugin.rs | 2 +- examples/ui/font_atlas_debug.rs | 2 +- 60 files changed, 219 insertions(+), 135 deletions(-) diff --git a/crates/bevy_a11y/src/lib.rs b/crates/bevy_a11y/src/lib.rs index ed91fe26e0415..d03ee91254932 100644 --- a/crates/bevy_a11y/src/lib.rs +++ b/crates/bevy_a11y/src/lib.rs @@ -64,7 +64,6 @@ pub struct AccessibilityPlugin; impl Plugin for AccessibilityPlugin { fn build(&self, app: &mut bevy_app::App) { - app.init_resource::() - .init_resource::(); + app.init_resources::<(AccessibilityRequested, Focus)>(); } } diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index d7a4da63cd1b0..73d535bb12a6a 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -188,7 +188,7 @@ impl Default for App { fn default() -> Self { let mut app = App::empty(); #[cfg(feature = "bevy_reflect")] - app.init_resource::(); + app.init_resources::(); app.add_plugin(MainSchedulePlugin); app.add_event::(); @@ -322,8 +322,7 @@ impl App { /// Note that you can also apply state transitions at other points in the schedule /// by adding the [`apply_state_transition`] system manually. pub fn add_state(&mut self) -> &mut Self { - self.init_resource::>() - .init_resource::>() + self.init_resources::<(State, NextState)>() .add_systems( StateTransition, ( @@ -511,7 +510,7 @@ impl App { T: Event, { if !self.world.contains_resource::>() { - self.init_resource::>() + self.init_resources::>() .add_systems(First, Events::::update_system); } self @@ -596,11 +595,60 @@ impl App { /// App::new() /// .init_resource::(); /// ``` + #[deprecated(since = "0.11.0", note = "Please use `init_resources::()` instead.")] pub fn init_resource(&mut self) -> &mut Self { self.world.init_resource::(); self } + /// Initialize a [`Resource`] with standard starting values by adding it to the [`World`]. + /// + /// If the [`Resource`] already exists, nothing happens. + /// + /// The [`Resource`] must implement the [`FromWorld`] trait. + /// If the [`Default`] trait is implemented, the [`FromWorld`] trait will use + /// the [`Default::default`] method to initialize the [`Resource`]. + /// + /// # Examples + /// + /// ``` + /// # use bevy_app::prelude::*; + /// # use bevy_ecs::prelude::*; + /// # + /// #[derive(Resource)] + /// struct MyCounter { + /// counter: usize, + /// } + /// + /// impl Default for MyCounter { + /// fn default() -> MyCounter { + /// MyCounter { + /// counter: 100 + /// } + /// } + /// } + /// + /// #[derive(Resource)] + /// struct MyValue { + /// value: f32, + /// } + /// + /// impl Default for MyValue { + /// fn default() -> MyValue { + /// MyValue { + /// value: 20.0 + /// } + /// } + /// } + /// + /// App::new() + /// .init_resources::<(MyCounter, MyValue)>(); + /// ``` + pub fn init_resources(&mut self) -> &mut Self { + self.world.init_resources::(); + self + } + /// Initialize a non-send [`Resource`] with standard starting values by adding it to the [`World`]. /// /// The [`Resource`] must implement the [`FromWorld`] trait. diff --git a/crates/bevy_app/src/main_schedule.rs b/crates/bevy_app/src/main_schedule.rs index 2042b9e01f4e8..3c1415ead56c8 100644 --- a/crates/bevy_app/src/main_schedule.rs +++ b/crates/bevy_app/src/main_schedule.rs @@ -162,7 +162,7 @@ impl Plugin for MainSchedulePlugin { app.add_schedule(Main, main_schedule) .add_schedule(RunFixedUpdateLoop, fixed_update_loop_schedule) - .init_resource::() + .init_resources::() .add_systems(Main, Main::run_main); } } diff --git a/crates/bevy_audio/src/lib.rs b/crates/bevy_audio/src/lib.rs index 468ff3d622c24..4bdeb825f1306 100644 --- a/crates/bevy_audio/src/lib.rs +++ b/crates/bevy_audio/src/lib.rs @@ -56,11 +56,10 @@ pub struct AudioPlugin; impl Plugin for AudioPlugin { fn build(&self, app: &mut App) { - app.init_resource::>() + app.init_resources::<(AudioOutput, Audio)>() .add_asset::() .add_asset::() .add_asset::() - .init_resource::>() .add_systems(PostUpdate, play_queued_audio_system::); #[cfg(any(feature = "mp3", feature = "flac", feature = "wav", feature = "vorbis"))] @@ -75,8 +74,7 @@ impl AddAudioSource for App { f32: rodio::cpal::FromSample, { self.add_asset::() - .init_resource::>() - .init_resource::>() + .init_resources::<(Audio, AudioOutput)>() .add_systems(PostUpdate, play_queued_audio_system::) } } diff --git a/crates/bevy_core/src/lib.rs b/crates/bevy_core/src/lib.rs index daf43cf86e63b..3d673d17055a0 100644 --- a/crates/bevy_core/src/lib.rs +++ b/crates/bevy_core/src/lib.rs @@ -141,7 +141,7 @@ pub struct FrameCountPlugin; impl Plugin for FrameCountPlugin { fn build(&self, app: &mut App) { - app.init_resource::(); + app.init_resources::(); app.add_systems(Last, update_frame_count); } } diff --git a/crates/bevy_core_pipeline/src/blit/mod.rs b/crates/bevy_core_pipeline/src/blit/mod.rs index 3cb17d0864db4..8d38369ab2b7e 100644 --- a/crates/bevy_core_pipeline/src/blit/mod.rs +++ b/crates/bevy_core_pipeline/src/blit/mod.rs @@ -19,9 +19,7 @@ impl Plugin for BlitPlugin { return }; - render_app - .init_resource::() - .init_resource::>(); + render_app.init_resources::<(BlitPipeline, SpecializedRenderPipelines)>(); } } diff --git a/crates/bevy_core_pipeline/src/bloom/mod.rs b/crates/bevy_core_pipeline/src/bloom/mod.rs index 62e577ea23f13..e78082e112f27 100644 --- a/crates/bevy_core_pipeline/src/bloom/mod.rs +++ b/crates/bevy_core_pipeline/src/bloom/mod.rs @@ -61,10 +61,12 @@ impl Plugin for BloomPlugin { }; render_app - .init_resource::() - .init_resource::() - .init_resource::>() - .init_resource::>() + .init_resources::<( + BloomDownsamplingPipeline, + BloomUpsamplingPipeline, + SpecializedRenderPipelines, + SpecializedRenderPipelines, + )>() .add_systems( Render, ( diff --git a/crates/bevy_core_pipeline/src/core_2d/mod.rs b/crates/bevy_core_pipeline/src/core_2d/mod.rs index e682257dc980a..ff771b59fb96b 100644 --- a/crates/bevy_core_pipeline/src/core_2d/mod.rs +++ b/crates/bevy_core_pipeline/src/core_2d/mod.rs @@ -51,7 +51,7 @@ impl Plugin for Core2dPlugin { }; render_app - .init_resource::>() + .init_resources::>() .add_systems(ExtractSchedule, extract_core_2d_camera_phases) .add_systems( Render, diff --git a/crates/bevy_core_pipeline/src/core_3d/mod.rs b/crates/bevy_core_pipeline/src/core_3d/mod.rs index 9bfa5486dfb8e..cae671ed8d181 100644 --- a/crates/bevy_core_pipeline/src/core_3d/mod.rs +++ b/crates/bevy_core_pipeline/src/core_3d/mod.rs @@ -65,9 +65,11 @@ impl Plugin for Core3dPlugin { }; render_app - .init_resource::>() - .init_resource::>() - .init_resource::>() + .init_resources::<( + DrawFunctions, + DrawFunctions, + DrawFunctions, + )>() .add_systems(ExtractSchedule, extract_core_3d_camera_phases) .add_systems( Render, diff --git a/crates/bevy_core_pipeline/src/fxaa/mod.rs b/crates/bevy_core_pipeline/src/fxaa/mod.rs index 943e2d39b8eb2..ecffab16bd77e 100644 --- a/crates/bevy_core_pipeline/src/fxaa/mod.rs +++ b/crates/bevy_core_pipeline/src/fxaa/mod.rs @@ -88,8 +88,7 @@ impl Plugin for FxaaPlugin { Err(_) => return, }; render_app - .init_resource::() - .init_resource::>() + .init_resources::<(FxaaPipeline, SpecializedRenderPipelines)>() .add_systems(Render, prepare_fxaa_pipelines.in_set(RenderSet::Prepare)); { diff --git a/crates/bevy_core_pipeline/src/lib.rs b/crates/bevy_core_pipeline/src/lib.rs index 4faa1cd83f7f9..1de34868e01c8 100644 --- a/crates/bevy_core_pipeline/src/lib.rs +++ b/crates/bevy_core_pipeline/src/lib.rs @@ -52,7 +52,7 @@ impl Plugin for CorePipelinePlugin { .register_type::() .register_type::() .register_type::() - .init_resource::() + .init_resources::() .add_plugin(ExtractResourcePlugin::::default()) .add_plugin(Core2dPlugin) .add_plugin(Core3dPlugin) diff --git a/crates/bevy_core_pipeline/src/tonemapping/mod.rs b/crates/bevy_core_pipeline/src/tonemapping/mod.rs index 31ecd12177d93..219135f18607b 100644 --- a/crates/bevy_core_pipeline/src/tonemapping/mod.rs +++ b/crates/bevy_core_pipeline/src/tonemapping/mod.rs @@ -92,8 +92,10 @@ impl Plugin for TonemappingPlugin { if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app - .init_resource::() - .init_resource::>() + .init_resources::<( + TonemappingPipeline, + SpecializedRenderPipelines, + )>() .add_systems( Render, queue_view_tonemapping_pipelines.in_set(RenderSet::Queue), diff --git a/crates/bevy_diagnostic/src/lib.rs b/crates/bevy_diagnostic/src/lib.rs index 854f6e74cd854..5d12869459d14 100644 --- a/crates/bevy_diagnostic/src/lib.rs +++ b/crates/bevy_diagnostic/src/lib.rs @@ -17,7 +17,7 @@ pub struct DiagnosticsPlugin; impl Plugin for DiagnosticsPlugin { fn build(&self, app: &mut App) { - app.init_resource::().add_systems( + app.init_resources::().add_systems( Startup, system_information_diagnostics_plugin::internal::log_system_info, ); diff --git a/crates/bevy_ecs/src/lib.rs b/crates/bevy_ecs/src/lib.rs index 8107de37e88a4..95f099bef021d 100644 --- a/crates/bevy_ecs/src/lib.rs +++ b/crates/bevy_ecs/src/lib.rs @@ -45,8 +45,9 @@ pub mod prelude { system::{ adapter as system_adapter, adapter::{dbg, error, ignore, info, unwrap, warn}, - Commands, Deferred, In, IntoPipeSystem, IntoSystem, Local, NonSend, NonSendMut, - ParallelCommands, ParamSet, Query, Res, ResMut, Resource, System, SystemParamFunction, + Commands, Deferred, In, InitResources, IntoPipeSystem, IntoSystem, Local, NonSend, + NonSendMut, ParallelCommands, ParamSet, Query, Res, ResMut, Resource, System, + SystemParamFunction, }, world::{FromWorld, World}, }; diff --git a/crates/bevy_ecs/src/system/system_param.rs b/crates/bevy_ecs/src/system/system_param.rs index 47f668d8ae340..0c81b827e70e4 100644 --- a/crates/bevy_ecs/src/system/system_param.rs +++ b/crates/bevy_ecs/src/system/system_param.rs @@ -401,6 +401,28 @@ impl_param_set!(); /// [`Exclusive`]: https://doc.rust-lang.org/nightly/std/sync/struct.Exclusive.html pub trait Resource: Send + Sync + 'static {} +pub trait InitResources { + fn init_resources(world: &mut World) -> Vec; +} + +impl InitResources for P0 { + fn init_resources(world: &mut World) -> Vec { + [world.init_resource::()].into() + } +} + +macro_rules! impl_init_resources { + ($($param: ident),*) => { + impl <$($param: Resource + FromWorld,)*> InitResources for ($($param,)*) { + fn init_resources(_world: &mut World) -> Vec { + [$(_world.init_resource::<$param>(),)*].into() + } + } + } +} + +all_tuples!(impl_init_resources, 1, 16, P); + // SAFETY: Res only reads a single World resource unsafe impl<'a, T: Resource> ReadOnlySystemParam for Res<'a, T> {} diff --git a/crates/bevy_ecs/src/world/mod.rs b/crates/bevy_ecs/src/world/mod.rs index 288650a1b951c..c438f6c8718cd 100644 --- a/crates/bevy_ecs/src/world/mod.rs +++ b/crates/bevy_ecs/src/world/mod.rs @@ -20,7 +20,7 @@ use crate::{ removal_detection::RemovedComponentEvents, schedule::{Schedule, ScheduleLabel, Schedules}, storage::{ResourceData, Storages}, - system::Resource, + system::{InitResources, Resource}, world::error::TryRunScheduleError, }; use bevy_ptr::{OwningPtr, Ptr}; @@ -819,6 +819,11 @@ impl World { component_id } + #[inline] + pub fn init_resources(&mut self) -> Vec { + R::init_resources(self) + } + /// Inserts a new resource with the given `value`. /// /// Resources are "unique" data of a given type. diff --git a/crates/bevy_hierarchy/src/valid_parent_check_plugin.rs b/crates/bevy_hierarchy/src/valid_parent_check_plugin.rs index ad8c6c1ec3dd4..2f9e006dd10a2 100644 --- a/crates/bevy_hierarchy/src/valid_parent_check_plugin.rs +++ b/crates/bevy_hierarchy/src/valid_parent_check_plugin.rs @@ -96,7 +96,7 @@ impl Default for ValidParentCheckPlugin { impl Plugin for ValidParentCheckPlugin { fn build(&self, app: &mut App) { - app.init_resource::>().add_systems( + app.init_resources::>().add_systems( Last, check_hierarchy_component_has_valid_parent:: .run_if(resource_equals(ReportHierarchyIssue::::new(true))), diff --git a/crates/bevy_input/src/lib.rs b/crates/bevy_input/src/lib.rs index 9da05a2e25caf..bf316e88926df 100644 --- a/crates/bevy_input/src/lib.rs +++ b/crates/bevy_input/src/lib.rs @@ -56,25 +56,26 @@ impl Plugin for InputPlugin { app // keyboard .add_event::() - .init_resource::>() - .init_resource::>() + .init_resources::<(Input, Input)>() .add_systems(PreUpdate, keyboard_input_system.in_set(InputSystem)) // mouse .add_event::() .add_event::() .add_event::() - .init_resource::>() + .init_resources::>() .add_systems(PreUpdate, mouse_button_input_system.in_set(InputSystem)) // gamepad .add_event::() .add_event::() .add_event::() .add_event::() - .init_resource::() - .init_resource::() - .init_resource::>() - .init_resource::>() - .init_resource::>() + .init_resources::<( + GamepadSettings, + Gamepads, + Input, + Axis, + Axis, + )>() .add_systems( PreUpdate, ( @@ -91,7 +92,7 @@ impl Plugin for InputPlugin { ) // touch .add_event::() - .init_resource::() + .init_resources::() .add_systems(PreUpdate, touch_screen_input_system.in_set(InputSystem)); // Register common types diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index bf47c70450994..9b9ae442b0fda 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -170,10 +170,12 @@ impl Plugin for PbrPlugin { ..Default::default() }) .add_plugin(EnvironmentMapPlugin) - .init_resource::() - .init_resource::() - .init_resource::() - .init_resource::() + .init_resources::<( + AmbientLight, + GlobalVisiblePointLights, + DirectionalLightShadowMap, + PointLightShadowMap, + )>() .add_plugin(ExtractResourcePlugin::::default()) .configure_sets( PostUpdate, @@ -280,9 +282,7 @@ impl Plugin for PbrPlugin { sort_phase_system::.in_set(RenderSet::PhaseSort), ), ) - .init_resource::() - .init_resource::() - .init_resource::(); + .init_resources::<(ShadowSamplers, LightMeta, GlobalLightMeta)>(); let shadow_pass_node = ShadowPassNode::new(&mut render_app.world); let mut graph = render_app.world.resource_mut::(); diff --git a/crates/bevy_pbr/src/material.rs b/crates/bevy_pbr/src/material.rs index be28f2e13a5e9..589c5fe4072fd 100644 --- a/crates/bevy_pbr/src/material.rs +++ b/crates/bevy_pbr/src/material.rs @@ -190,15 +190,17 @@ where if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app - .init_resource::>() + .init_resources::>() .add_render_command::>() .add_render_command::>() .add_render_command::>() .add_render_command::>() - .init_resource::>() - .init_resource::>() - .init_resource::>() - .init_resource::>>() + .init_resources::<( + MaterialPipeline, + ExtractedMaterials, + RenderMaterials, + SpecializedMeshPipelines>, + )>() .add_systems(ExtractSchedule, extract_materials::) .add_systems( Render, diff --git a/crates/bevy_pbr/src/prepass/mod.rs b/crates/bevy_pbr/src/prepass/mod.rs index b2a50c5f37576..fc22ca851ddd2 100644 --- a/crates/bevy_pbr/src/prepass/mod.rs +++ b/crates/bevy_pbr/src/prepass/mod.rs @@ -106,9 +106,11 @@ where Render, queue_prepass_view_bind_group::.in_set(RenderSet::Queue), ) - .init_resource::>() - .init_resource::() - .init_resource::>>(); + .init_resources::<( + PrepassPipeline, + PrepassViewBindGroup, + SpecializedMeshPipelines>, + )>(); } } @@ -145,8 +147,10 @@ where sort_phase_system::.in_set(RenderSet::PhaseSort), ), ) - .init_resource::>() - .init_resource::>() + .init_resources::<( + DrawFunctions, + DrawFunctions, + )>() .add_render_command::>() .add_render_command::>(); } diff --git a/crates/bevy_pbr/src/render/fog.rs b/crates/bevy_pbr/src/render/fog.rs index efa9a4c15f0fe..86b053c9b1def 100644 --- a/crates/bevy_pbr/src/render/fog.rs +++ b/crates/bevy_pbr/src/render/fog.rs @@ -141,7 +141,7 @@ impl Plugin for FogPlugin { if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app - .init_resource::() + .init_resources::() .add_systems(Render, prepare_fog.in_set(RenderFogSystems::PrepareFog)) .configure_set( Render, diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index a76ff0f470712..5c63a6a1b7b42 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -105,8 +105,7 @@ impl Plugin for MeshRenderPlugin { if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app - .init_resource::() - .init_resource::() + .init_resources::<(MeshPipeline, SkinnedMeshUniform)>() .add_systems(ExtractSchedule, (extract_meshes, extract_skinned_meshes)) .add_systems( Render, diff --git a/crates/bevy_pbr/src/wireframe.rs b/crates/bevy_pbr/src/wireframe.rs index 7e885f9231558..0dc511d147532 100644 --- a/crates/bevy_pbr/src/wireframe.rs +++ b/crates/bevy_pbr/src/wireframe.rs @@ -39,15 +39,17 @@ impl Plugin for WireframePlugin { app.register_type::() .register_type::() - .init_resource::() + .init_resources::() .add_plugin(ExtractResourcePlugin::::default()) .add_plugin(ExtractComponentPlugin::::default()); if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app .add_render_command::() - .init_resource::() - .init_resource::>() + .init_resources::<( + WireframePipeline, + SpecializedMeshPipelines, + )>() .add_systems(Render, queue_wireframes.in_set(RenderSet::Queue)); } } diff --git a/crates/bevy_render/src/camera/mod.rs b/crates/bevy_render/src/camera/mod.rs index 44d72cb03e886..85fc7065e0ba7 100644 --- a/crates/bevy_render/src/camera/mod.rs +++ b/crates/bevy_render/src/camera/mod.rs @@ -28,7 +28,7 @@ impl Plugin for CameraPlugin { if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app - .init_resource::() + .init_resources::() .add_systems(ExtractSchedule, extract_cameras) .add_systems(Render, sort_cameras.in_set(RenderSet::Prepare)); let camera_driver_node = CameraDriverNode::new(&mut render_app.world); diff --git a/crates/bevy_render/src/globals.rs b/crates/bevy_render/src/globals.rs index ef585000b84ce..c02f0871c52db 100644 --- a/crates/bevy_render/src/globals.rs +++ b/crates/bevy_render/src/globals.rs @@ -24,8 +24,7 @@ impl Plugin for GlobalsPlugin { if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app - .init_resource::() - .init_resource::