diff --git a/crates/bevy_audio/src/audio_output.rs b/crates/bevy_audio/src/audio_output.rs index d0641dce7c2aa..f7010f2c7d8f3 100644 --- a/crates/bevy_audio/src/audio_output.rs +++ b/crates/bevy_audio/src/audio_output.rs @@ -1,6 +1,6 @@ use crate::{Audio, AudioSource, Decodable}; use bevy_asset::{Asset, Assets}; -use bevy_ecs::world::World; +use bevy_ecs::system::{NonSend, Res, ResMut}; use bevy_reflect::TypeUuid; use bevy_utils::tracing::warn; use rodio::{OutputStream, OutputStreamHandle, Sink, Source}; @@ -85,16 +85,13 @@ where } /// Plays audio currently queued in the [`Audio`] resource through the [`AudioOutput`] resource -pub fn play_queued_audio_system(world: &mut World) -where - Source: Decodable, -{ - let world = world.cell(); - let audio_output = world.get_non_send::>().unwrap(); - let mut audio = world.get_resource_mut::>().unwrap(); - let mut sinks = world.get_resource_mut::>().unwrap(); - - if let Some(audio_sources) = world.get_resource::>() { +pub fn play_queued_audio_system( + audio_output: NonSend>, + audio_sources: Option>>, + mut audio: ResMut>, + mut sinks: ResMut>, +) { + if let Some(audio_sources) = audio_sources { audio_output.try_play_queued(&*audio_sources, &mut *audio, &mut *sinks); }; } diff --git a/crates/bevy_audio/src/lib.rs b/crates/bevy_audio/src/lib.rs index 5aa23f7aa5fd6..e3663e1adf41e 100644 --- a/crates/bevy_audio/src/lib.rs +++ b/crates/bevy_audio/src/lib.rs @@ -44,7 +44,6 @@ pub use audio_source::*; use bevy_app::prelude::*; use bevy_asset::AddAsset; -use bevy_ecs::system::IntoExclusiveSystem; /// Adds support for audio playback to a Bevy Application /// @@ -60,7 +59,7 @@ impl Plugin for AudioPlugin { .init_resource::>() .add_system_to_stage( CoreStage::PostUpdate, - play_queued_audio_system::.exclusive_system(), + play_queued_audio_system::, ); #[cfg(any(feature = "mp3", feature = "flac", feature = "wav", feature = "vorbis"))] diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index 3659a88c088ac..1c191e6b0a041 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -14,6 +14,8 @@ pub use material::*; pub use pbr_material::*; pub use render::*; +use bevy_window::ModifiesWindows; + pub mod prelude { #[doc(hidden)] pub use crate::{ @@ -86,7 +88,8 @@ impl Plugin for PbrPlugin { CoreStage::PostUpdate, assign_lights_to_clusters .label(SimulationLightSystems::AssignLightsToClusters) - .after(TransformSystem::TransformPropagate), + .after(TransformSystem::TransformPropagate) + .after(ModifiesWindows), ) .add_system_to_stage( CoreStage::PostUpdate, diff --git a/crates/bevy_render/src/camera/mod.rs b/crates/bevy_render/src/camera/mod.rs index c58835929af4b..bf1d1d5d8c101 100644 --- a/crates/bevy_render/src/camera/mod.rs +++ b/crates/bevy_render/src/camera/mod.rs @@ -12,6 +12,8 @@ use crate::{ view::{ComputedVisibility, Visibility, VisibleEntities}, }; use bevy_app::{App, CoreStage, Plugin}; +use bevy_ecs::schedule::ParallelSystemDescriptorCoercion; +use bevy_window::ModifiesWindows; #[derive(Default)] pub struct CameraPlugin; @@ -32,11 +34,11 @@ impl Plugin for CameraPlugin { .register_type::() .add_system_to_stage( CoreStage::PostUpdate, - crate::camera::camera_system::, + crate::camera::camera_system::.after(ModifiesWindows), ) .add_system_to_stage( CoreStage::PostUpdate, - crate::camera::camera_system::, + crate::camera::camera_system::.after(ModifiesWindows), ) .add_plugin(CameraTypePlugin::::default()) .add_plugin(CameraTypePlugin::::default()); diff --git a/crates/bevy_text/src/lib.rs b/crates/bevy_text/src/lib.rs index 6ed6009ad7a44..12075643ea2a5 100644 --- a/crates/bevy_text/src/lib.rs +++ b/crates/bevy_text/src/lib.rs @@ -31,6 +31,7 @@ use bevy_asset::AddAsset; use bevy_ecs::{entity::Entity, schedule::ParallelSystemDescriptorCoercion}; use bevy_render::{RenderApp, RenderStage}; use bevy_sprite::SpriteSystem; +use bevy_window::ModifiesWindows; pub type DefaultTextPipeline = TextPipeline; @@ -46,7 +47,7 @@ impl Plugin for TextPlugin { .register_type::() .init_asset_loader::() .insert_resource(DefaultTextPipeline::default()) - .add_system_to_stage(CoreStage::PostUpdate, text2d_system); + .add_system_to_stage(CoreStage::PostUpdate, text2d_system.after(ModifiesWindows)); if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { render_app.add_system_to_stage( diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index 872a2bb9eef85..32dc0f04c2f1b 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -28,6 +28,7 @@ use bevy_ecs::schedule::{ParallelSystemDescriptorCoercion, SystemLabel}; use bevy_input::InputSystem; use bevy_math::{Rect, Size}; use bevy_transform::TransformSystem; +use bevy_window::ModifiesWindows; use update::{ui_z_system, update_clipping_system}; use crate::prelude::CameraUi; @@ -81,7 +82,9 @@ impl Plugin for UiPlugin { // add these stages to front because these must run before transform update systems .add_system_to_stage( CoreStage::PostUpdate, - widget::text_system.before(UiSystem::Flex), + widget::text_system + .before(UiSystem::Flex) + .after(ModifiesWindows), ) .add_system_to_stage( CoreStage::PostUpdate, @@ -91,7 +94,8 @@ impl Plugin for UiPlugin { CoreStage::PostUpdate, flex_node_system .label(UiSystem::Flex) - .before(TransformSystem::TransformPropagate), + .before(TransformSystem::TransformPropagate) + .after(ModifiesWindows), ) .add_system_to_stage( CoreStage::PostUpdate, diff --git a/crates/bevy_window/src/lib.rs b/crates/bevy_window/src/lib.rs index 37cac585e0701..9e191889aafa8 100644 --- a/crates/bevy_window/src/lib.rs +++ b/crates/bevy_window/src/lib.rs @@ -21,7 +21,7 @@ pub mod prelude { } use bevy_app::prelude::*; -use bevy_ecs::event::Events; +use bevy_ecs::{event::Events, schedule::SystemLabel}; pub struct WindowPlugin { pub add_primary_window: bool, @@ -74,3 +74,6 @@ impl Plugin for WindowPlugin { } } } + +#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)] +pub struct ModifiesWindows; diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index 41b952aa65115..fb992f50dc055 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -12,8 +12,9 @@ pub use winit_windows::*; use bevy_app::{App, AppExit, CoreStage, Plugin}; use bevy_ecs::{ - event::{Events, ManualEventReader}, - system::IntoExclusiveSystem, + event::{EventWriter, Events, ManualEventReader}, + schedule::ParallelSystemDescriptorCoercion, + system::{NonSend, ResMut}, world::World, }; use bevy_math::{ivec2, DVec2, Vec2}; @@ -22,9 +23,9 @@ use bevy_utils::{ Instant, }; use bevy_window::{ - CreateWindow, CursorEntered, CursorLeft, CursorMoved, FileDragAndDrop, ReceivedCharacter, - RequestRedraw, WindowBackendScaleFactorChanged, WindowCloseRequested, WindowCreated, - WindowFocused, WindowMoved, WindowResized, WindowScaleFactorChanged, Windows, + CreateWindow, CursorEntered, CursorLeft, CursorMoved, FileDragAndDrop, ModifiesWindows, + ReceivedCharacter, RequestRedraw, WindowBackendScaleFactorChanged, WindowCloseRequested, + WindowCreated, WindowFocused, WindowMoved, WindowResized, WindowScaleFactorChanged, Windows, }; use winit::{ dpi::PhysicalPosition, @@ -42,18 +43,18 @@ impl Plugin for WinitPlugin { app.init_non_send_resource::() .init_resource::() .set_runner(winit_runner) - .add_system_to_stage(CoreStage::PostUpdate, change_window.exclusive_system()); + .add_system_to_stage(CoreStage::PostUpdate, change_window.label(ModifiesWindows)); let event_loop = EventLoop::new(); handle_initial_window_events(&mut app.world, &event_loop); app.insert_non_send_resource(event_loop); } } -fn change_window(world: &mut World) { - let world = world.cell(); - let winit_windows = world.get_non_send::().unwrap(); - let mut windows = world.get_resource_mut::().unwrap(); - +fn change_window( + winit_windows: NonSend, + mut windows: ResMut, + mut window_dpi_changed_events: EventWriter, +) { for bevy_window in windows.iter_mut() { let id = bevy_window.id(); for command in bevy_window.drain_commands() { @@ -88,9 +89,6 @@ fn change_window(world: &mut World) { window.set_title(&title); } bevy_window::WindowCommand::SetScaleFactor { scale_factor } => { - let mut window_dpi_changed_events = world - .get_resource_mut::>() - .unwrap(); window_dpi_changed_events.send(WindowScaleFactorChanged { id, scale_factor }); } bevy_window::WindowCommand::SetResolution {