From 6df4294eee7ffab6d223edfec2f77ecf2e961c03 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Fri, 27 Dec 2024 14:21:05 -0800 Subject: [PATCH 01/12] add a wrapper system type --- crates/bevy_ecs/src/schedule/config.rs | 6 +- crates/bevy_ecs/src/system/schedule_system.rs | 79 +++++++++++++++++++ 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/config.rs b/crates/bevy_ecs/src/schedule/config.rs index a4518c0255773..feee3210e555b 100644 --- a/crates/bevy_ecs/src/schedule/config.rs +++ b/crates/bevy_ecs/src/schedule/config.rs @@ -9,7 +9,7 @@ use crate::{ set::{InternedSystemSet, IntoSystemSet, SystemSet}, Chain, }, - system::{BoxedSystem, IntoSystem, ScheduleSystem, System}, + system::{BoxedSystem, IntoSystem, OkWrapperSystem, ScheduleSystem, System}, }; fn new_condition(condition: impl Condition) -> BoxedCondition { @@ -527,8 +527,8 @@ where F: IntoSystem<(), (), Marker>, { fn into_configs(self) -> SystemConfigs { - let boxed_system = Box::new(IntoSystem::into_system(self)); - SystemConfigs::new_system(ScheduleSystem::Infallible(boxed_system)) + let wrapper = OkWrapperSystem::new(IntoSystem::into_system(self)); + SystemConfigs::new_system(ScheduleSystem::Fallible(Box::new(wrapper))) } } diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index 042e69b675955..16ba00c1b9576 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -11,6 +11,85 @@ use crate::{ world::{unsafe_world_cell::UnsafeWorldCell, DeferredWorld, World}, }; +use super::IntoSystem; + +/// Wraps a system that returns `()` to return `Ok(())` to make it compatible with `Schedule` +pub struct OkWrapperSystem>(S); + +impl> OkWrapperSystem { + /// Create a new `OkWrapperSystem` + pub fn new(system: S) -> Self { + Self(IntoSystem::into_system(system)) + } +} + +impl> System for OkWrapperSystem { + type In = (); + type Out = Result; + + fn name(&self) -> Cow<'static, str> { + self.0.name() + } + + fn component_access(&self) -> &Access { + self.0.component_access() + } + + fn archetype_component_access(&self) -> &Access { + self.0.archetype_component_access() + } + + fn is_send(&self) -> bool { + self.0.is_send() + } + + fn is_exclusive(&self) -> bool { + self.0.is_exclusive() + } + + fn has_deferred(&self) -> bool { + self.0.has_deferred() + } + + unsafe fn run_unsafe(&mut self, input: SystemIn<'_, Self>, world: UnsafeWorldCell) + -> Self::Out { + self.0.run_unsafe(input, world); + Ok(()) + } + + fn apply_deferred(&mut self, world: &mut World) { + self.0.apply_deferred(world); + } + + fn queue_deferred(&mut self, world: DeferredWorld) { + self.0.queue_deferred(world); + } + + unsafe fn validate_param_unsafe(&mut self, world: UnsafeWorldCell) -> bool { + self.0.validate_param_unsafe(world) + } + + fn initialize(&mut self, world: &mut World) { + self.0.initialize(world); + } + + fn update_archetype_component_access(&mut self, world: UnsafeWorldCell) { + self.0.update_archetype_component_access(world); + } + + fn check_change_tick(&mut self, change_tick: Tick) { + self.0.check_change_tick(change_tick); + } + + fn get_last_run(&self) -> Tick { + self.0.get_last_run() + } + + fn set_last_run(&mut self, last_run: Tick) { + self.0.set_last_run(last_run); + } +} + /// A type which wraps and unifies the different sorts of systems that can be added to a schedule. pub enum ScheduleSystem { /// A system that does not return a result. From f1dc29c00eda495230716da29bc011dc361f048b Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Fri, 27 Dec 2024 14:44:05 -0800 Subject: [PATCH 02/12] remove enum --- crates/bevy_ecs/src/schedule/config.rs | 18 +- crates/bevy_ecs/src/schedule/executor/mod.rs | 7 +- crates/bevy_ecs/src/schedule/schedule.rs | 4 +- crates/bevy_ecs/src/system/schedule_system.rs | 170 +----------------- 4 files changed, 18 insertions(+), 181 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/config.rs b/crates/bevy_ecs/src/schedule/config.rs index feee3210e555b..bb30e32b18de9 100644 --- a/crates/bevy_ecs/src/schedule/config.rs +++ b/crates/bevy_ecs/src/schedule/config.rs @@ -528,15 +528,17 @@ where { fn into_configs(self) -> SystemConfigs { let wrapper = OkWrapperSystem::new(IntoSystem::into_system(self)); - SystemConfigs::new_system(ScheduleSystem::Fallible(Box::new(wrapper))) + SystemConfigs::new_system(Box::new(wrapper)) } } -impl IntoSystemConfigs<()> for BoxedSystem<(), ()> { - fn into_configs(self) -> SystemConfigs { - SystemConfigs::new_system(ScheduleSystem::Infallible(self)) - } -} +// TODO: not sure how to make this work or even if it's needed. +// impl IntoSystemConfigs<()> for BoxedSystem<(), ()> { +// fn into_configs(self) -> SystemConfigs { +// let wrapper = OkWrapperSystem::new(self); +// SystemConfigs::new_system(Box::new(wrapper)) +// } +// } #[doc(hidden)] pub struct Fallible; @@ -547,13 +549,13 @@ where { fn into_configs(self) -> SystemConfigs { let boxed_system = Box::new(IntoSystem::into_system(self)); - SystemConfigs::new_system(ScheduleSystem::Fallible(boxed_system)) + SystemConfigs::new_system(boxed_system) } } impl IntoSystemConfigs<()> for BoxedSystem<(), Result> { fn into_configs(self) -> SystemConfigs { - SystemConfigs::new_system(ScheduleSystem::Fallible(self)) + SystemConfigs::new_system(self) } } diff --git a/crates/bevy_ecs/src/schedule/executor/mod.rs b/crates/bevy_ecs/src/schedule/executor/mod.rs index f87bbcd10d425..89d7d2d8f0bbe 100644 --- a/crates/bevy_ecs/src/schedule/executor/mod.rs +++ b/crates/bevy_ecs/src/schedule/executor/mod.rs @@ -21,6 +21,7 @@ use crate::{ schedule::{BoxedCondition, InternedSystemSet, NodeId, SystemTypeSet}, system::{ScheduleSystem, System, SystemIn}, world::{unsafe_world_cell::UnsafeWorldCell, DeferredWorld, World}, + result::Result, }; /// Types that can run a [`SystemSchedule`] on a [`World`]. @@ -158,7 +159,7 @@ pub(super) fn is_apply_deferred(system: &ScheduleSystem) -> bool { impl System for ApplyDeferred { type In = (); - type Out = (); + type Out = Result<(), >; fn name(&self) -> Cow<'static, str> { Cow::Borrowed("bevy_ecs::apply_deferred") @@ -203,11 +204,13 @@ impl System for ApplyDeferred { ) -> Self::Out { // This system does nothing on its own. The executor will apply deferred // commands from other systems instead of running this system. + Ok(()) } fn run(&mut self, _input: SystemIn<'_, Self>, _world: &mut World) -> Self::Out { // This system does nothing on its own. The executor will apply deferred // commands from other systems instead of running this system. + Ok(()) } fn apply_deferred(&mut self, _world: &mut World) {} @@ -259,7 +262,7 @@ mod __rust_begin_short_backtrace { use crate::{ result::Result, - system::{ReadOnlySystem, ScheduleSystem, System}, + system::{ReadOnlySystem, ScheduleSystem}, world::{unsafe_world_cell::UnsafeWorldCell, World}, }; diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index ff1d8283e8d6c..03b0f84fff7b2 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -1200,9 +1200,9 @@ impl ScheduleGraph { let id = NodeId::System(self.systems.len()); self.systems - .push(SystemNode::new(ScheduleSystem::Infallible(Box::new( + .push(SystemNode::new(Box::new( IntoSystem::into_system(ApplyDeferred), - )))); + ))); self.system_conditions.push(Vec::new()); // ignore ambiguities with auto sync points diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index 16ba00c1b9576..281a146836bc7 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -90,173 +90,5 @@ impl> System for OkWrapperSystem { } } -/// A type which wraps and unifies the different sorts of systems that can be added to a schedule. -pub enum ScheduleSystem { - /// A system that does not return a result. - Infallible(BoxedSystem<(), ()>), - /// A system that does return a result. - Fallible(BoxedSystem<(), Result>), -} - -impl System for ScheduleSystem { - type In = (); - type Out = Result; - - #[inline(always)] - fn name(&self) -> Cow<'static, str> { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.name(), - ScheduleSystem::Fallible(inner_system) => inner_system.name(), - } - } - - #[inline(always)] - fn type_id(&self) -> TypeId { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.type_id(), - ScheduleSystem::Fallible(inner_system) => inner_system.type_id(), - } - } - - #[inline(always)] - fn component_access(&self) -> &Access { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.component_access(), - ScheduleSystem::Fallible(inner_system) => inner_system.component_access(), - } - } - - #[inline(always)] - fn archetype_component_access(&self) -> &Access { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.archetype_component_access(), - ScheduleSystem::Fallible(inner_system) => inner_system.archetype_component_access(), - } - } - - #[inline(always)] - fn is_exclusive(&self) -> bool { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.is_exclusive(), - ScheduleSystem::Fallible(inner_system) => inner_system.is_exclusive(), - } - } - - #[inline(always)] - fn has_deferred(&self) -> bool { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.has_deferred(), - ScheduleSystem::Fallible(inner_system) => inner_system.has_deferred(), - } - } - - #[inline(always)] - unsafe fn run_unsafe( - &mut self, - input: SystemIn<'_, Self>, - world: UnsafeWorldCell, - ) -> Self::Out { - match self { - ScheduleSystem::Infallible(inner_system) => { - inner_system.run_unsafe(input, world); - Ok(()) - } - ScheduleSystem::Fallible(inner_system) => inner_system.run_unsafe(input, world), - } - } - - #[inline(always)] - fn run(&mut self, input: SystemIn<'_, Self>, world: &mut World) -> Self::Out { - match self { - ScheduleSystem::Infallible(inner_system) => { - inner_system.run(input, world); - Ok(()) - } - ScheduleSystem::Fallible(inner_system) => inner_system.run(input, world), - } - } - - #[inline(always)] - fn apply_deferred(&mut self, world: &mut World) { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.apply_deferred(world), - ScheduleSystem::Fallible(inner_system) => inner_system.apply_deferred(world), - } - } - - #[inline(always)] - fn queue_deferred(&mut self, world: DeferredWorld) { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.queue_deferred(world), - ScheduleSystem::Fallible(inner_system) => inner_system.queue_deferred(world), - } - } - - #[inline(always)] - fn is_send(&self) -> bool { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.is_send(), - ScheduleSystem::Fallible(inner_system) => inner_system.is_send(), - } - } - #[inline(always)] - unsafe fn validate_param_unsafe(&mut self, world: UnsafeWorldCell) -> bool { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.validate_param_unsafe(world), - ScheduleSystem::Fallible(inner_system) => inner_system.validate_param_unsafe(world), - } - } - - #[inline(always)] - fn initialize(&mut self, world: &mut World) { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.initialize(world), - ScheduleSystem::Fallible(inner_system) => inner_system.initialize(world), - } - } - - #[inline(always)] - fn update_archetype_component_access(&mut self, world: UnsafeWorldCell) { - match self { - ScheduleSystem::Infallible(inner_system) => { - inner_system.update_archetype_component_access(world); - } - ScheduleSystem::Fallible(inner_system) => { - inner_system.update_archetype_component_access(world); - } - } - } - - #[inline(always)] - fn check_change_tick(&mut self, change_tick: Tick) { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.check_change_tick(change_tick), - ScheduleSystem::Fallible(inner_system) => inner_system.check_change_tick(change_tick), - } - } - - #[inline(always)] - fn default_system_sets(&self) -> Vec { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.default_system_sets(), - ScheduleSystem::Fallible(inner_system) => inner_system.default_system_sets(), - } - } - - #[inline(always)] - fn get_last_run(&self) -> Tick { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.get_last_run(), - ScheduleSystem::Fallible(inner_system) => inner_system.get_last_run(), - } - } - - #[inline(always)] - fn set_last_run(&mut self, last_run: Tick) { - match self { - ScheduleSystem::Infallible(inner_system) => inner_system.set_last_run(last_run), - ScheduleSystem::Fallible(inner_system) => inner_system.set_last_run(last_run), - } - } -} +pub type ScheduleSystem = BoxedSystem<(), Result>; \ No newline at end of file From 05ac0d92cf988e9c3c4f5658fdc45e7d6bf20c88 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Sun, 29 Dec 2024 14:04:39 -0800 Subject: [PATCH 03/12] update docs --- crates/bevy_ecs/src/schedule/config.rs | 2 ++ crates/bevy_ecs/src/system/schedule_system.rs | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/config.rs b/crates/bevy_ecs/src/schedule/config.rs index bb30e32b18de9..9caf026660164 100644 --- a/crates/bevy_ecs/src/schedule/config.rs +++ b/crates/bevy_ecs/src/schedule/config.rs @@ -519,6 +519,7 @@ impl IntoSystemConfigs<()> for SystemConfigs { } } +/// Marker component to allow for conflicting implementations of [`IntoSystemConfigs`] #[doc(hidden)] pub struct Infallible; @@ -540,6 +541,7 @@ where // } // } +/// Marker component to allow for conflicting implementations of [`IntoSystemConfigs`] #[doc(hidden)] pub struct Fallible; diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index 281a146836bc7..16454ac2aa859 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -1,19 +1,17 @@ -use alloc::{borrow::Cow, vec::Vec}; -use core::any::TypeId; +use alloc::borrow::Cow; use crate::{ archetype::ArchetypeComponentId, component::{ComponentId, Tick}, query::Access, result::Result, - schedule::InternedSystemSet, system::{input::SystemIn, BoxedSystem, System}, world::{unsafe_world_cell::UnsafeWorldCell, DeferredWorld, World}, }; use super::IntoSystem; -/// Wraps a system that returns `()` to return `Ok(())` to make it compatible with `Schedule` +/// Wrapper for a system that returns `()` to return `Ok(())` to make it into a [`ScheduleSystem`] pub struct OkWrapperSystem>(S); impl> OkWrapperSystem { @@ -90,5 +88,5 @@ impl> System for OkWrapperSystem { } } - +/// Type alias for a `BoxedSystem` that a `Schedule` can store. pub type ScheduleSystem = BoxedSystem<(), Result>; \ No newline at end of file From e86b35a23acc3f4a8d91e25519a75e8e69e39537 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Sun, 29 Dec 2024 14:17:18 -0800 Subject: [PATCH 04/12] add inline --- crates/bevy_ecs/src/system/schedule_system.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index 16454ac2aa859..cced48278cd5d 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -25,64 +25,79 @@ impl> System for OkWrapperSystem { type In = (); type Out = Result; + #[inline] fn name(&self) -> Cow<'static, str> { self.0.name() } + #[inline] fn component_access(&self) -> &Access { self.0.component_access() } + #[inline] fn archetype_component_access(&self) -> &Access { self.0.archetype_component_access() } + #[inline] fn is_send(&self) -> bool { self.0.is_send() } + #[inline] fn is_exclusive(&self) -> bool { self.0.is_exclusive() } + #[inline] fn has_deferred(&self) -> bool { self.0.has_deferred() } + #[inline] unsafe fn run_unsafe(&mut self, input: SystemIn<'_, Self>, world: UnsafeWorldCell) -> Self::Out { self.0.run_unsafe(input, world); Ok(()) } + #[inline] fn apply_deferred(&mut self, world: &mut World) { self.0.apply_deferred(world); } + #[inline] fn queue_deferred(&mut self, world: DeferredWorld) { self.0.queue_deferred(world); } + #[inline] unsafe fn validate_param_unsafe(&mut self, world: UnsafeWorldCell) -> bool { self.0.validate_param_unsafe(world) } + #[inline] fn initialize(&mut self, world: &mut World) { self.0.initialize(world); } + #[inline] fn update_archetype_component_access(&mut self, world: UnsafeWorldCell) { self.0.update_archetype_component_access(world); } + #[inline] fn check_change_tick(&mut self, change_tick: Tick) { self.0.check_change_tick(change_tick); } + #[inline] fn get_last_run(&self) -> Tick { self.0.get_last_run() } + #[inline] fn set_last_run(&mut self, last_run: Tick) { self.0.set_last_run(last_run); } From 97ada0403a078afa5453a62dd4ff8fa17d9c8504 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Sun, 29 Dec 2024 14:31:50 -0800 Subject: [PATCH 05/12] delete IntoSystemConfigs for boxed () () systems --- crates/bevy_ecs/src/schedule/config.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/config.rs b/crates/bevy_ecs/src/schedule/config.rs index 9caf026660164..ebd2773ca7e13 100644 --- a/crates/bevy_ecs/src/schedule/config.rs +++ b/crates/bevy_ecs/src/schedule/config.rs @@ -533,14 +533,6 @@ where } } -// TODO: not sure how to make this work or even if it's needed. -// impl IntoSystemConfigs<()> for BoxedSystem<(), ()> { -// fn into_configs(self) -> SystemConfigs { -// let wrapper = OkWrapperSystem::new(self); -// SystemConfigs::new_system(Box::new(wrapper)) -// } -// } - /// Marker component to allow for conflicting implementations of [`IntoSystemConfigs`] #[doc(hidden)] pub struct Fallible; From a01462b2ac2d557ede2ad0b4dec5a28a05df389b Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Sun, 29 Dec 2024 23:24:10 -0800 Subject: [PATCH 06/12] fmt --- crates/bevy_ecs/src/schedule/executor/mod.rs | 4 ++-- crates/bevy_ecs/src/schedule/schedule.rs | 6 +++--- crates/bevy_ecs/src/system/schedule_system.rs | 15 +++++++++------ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/executor/mod.rs b/crates/bevy_ecs/src/schedule/executor/mod.rs index 89d7d2d8f0bbe..660e35bb76df2 100644 --- a/crates/bevy_ecs/src/schedule/executor/mod.rs +++ b/crates/bevy_ecs/src/schedule/executor/mod.rs @@ -18,10 +18,10 @@ use crate::{ component::{ComponentId, Tick}, prelude::{IntoSystemSet, SystemSet}, query::Access, + result::Result, schedule::{BoxedCondition, InternedSystemSet, NodeId, SystemTypeSet}, system::{ScheduleSystem, System, SystemIn}, world::{unsafe_world_cell::UnsafeWorldCell, DeferredWorld, World}, - result::Result, }; /// Types that can run a [`SystemSchedule`] on a [`World`]. @@ -159,7 +159,7 @@ pub(super) fn is_apply_deferred(system: &ScheduleSystem) -> bool { impl System for ApplyDeferred { type In = (); - type Out = Result<(), >; + type Out = Result<()>; fn name(&self) -> Cow<'static, str> { Cow::Borrowed("bevy_ecs::apply_deferred") diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index 03b0f84fff7b2..9eb181d3030d0 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -1200,9 +1200,9 @@ impl ScheduleGraph { let id = NodeId::System(self.systems.len()); self.systems - .push(SystemNode::new(Box::new( - IntoSystem::into_system(ApplyDeferred), - ))); + .push(SystemNode::new(Box::new(IntoSystem::into_system( + ApplyDeferred, + )))); self.system_conditions.push(Vec::new()); // ignore ambiguities with auto sync points diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index cced48278cd5d..dd3aa04c59531 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -12,16 +12,16 @@ use crate::{ use super::IntoSystem; /// Wrapper for a system that returns `()` to return `Ok(())` to make it into a [`ScheduleSystem`] -pub struct OkWrapperSystem>(S); +pub struct OkWrapperSystem>(S); -impl> OkWrapperSystem { +impl> OkWrapperSystem { /// Create a new `OkWrapperSystem` pub fn new(system: S) -> Self { Self(IntoSystem::into_system(system)) } } -impl> System for OkWrapperSystem { +impl> System for OkWrapperSystem { type In = (); type Out = Result; @@ -56,8 +56,11 @@ impl> System for OkWrapperSystem { } #[inline] - unsafe fn run_unsafe(&mut self, input: SystemIn<'_, Self>, world: UnsafeWorldCell) - -> Self::Out { + unsafe fn run_unsafe( + &mut self, + input: SystemIn<'_, Self>, + world: UnsafeWorldCell, + ) -> Self::Out { self.0.run_unsafe(input, world); Ok(()) } @@ -104,4 +107,4 @@ impl> System for OkWrapperSystem { } /// Type alias for a `BoxedSystem` that a `Schedule` can store. -pub type ScheduleSystem = BoxedSystem<(), Result>; \ No newline at end of file +pub type ScheduleSystem = BoxedSystem<(), Result>; From 0f093fb1dbcd1f681cc7dd7e57f686123a9ddd25 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Sun, 29 Dec 2024 23:42:57 -0800 Subject: [PATCH 07/12] clippy --- crates/bevy_ecs/src/schedule/executor/multi_threaded.rs | 2 +- crates/bevy_ecs/src/schedule/executor/simple.rs | 1 - crates/bevy_ecs/src/schedule/executor/single_threaded.rs | 1 - crates/bevy_ecs/src/schedule/schedule.rs | 2 +- crates/bevy_ecs/src/schedule/stepping.rs | 2 +- 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs b/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs index 213e438ddb476..87f58a52de4fb 100644 --- a/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs +++ b/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs @@ -20,7 +20,7 @@ use crate::{ prelude::Resource, query::Access, schedule::{is_apply_deferred, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule}, - system::{ScheduleSystem, System}, + system::ScheduleSystem, world::{unsafe_world_cell::UnsafeWorldCell, World}, }; diff --git a/crates/bevy_ecs/src/schedule/executor/simple.rs b/crates/bevy_ecs/src/schedule/executor/simple.rs index e21530736eab0..b26478905afa1 100644 --- a/crates/bevy_ecs/src/schedule/executor/simple.rs +++ b/crates/bevy_ecs/src/schedule/executor/simple.rs @@ -7,7 +7,6 @@ use crate::{ schedule::{ executor::is_apply_deferred, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule, }, - system::System, world::World, }; diff --git a/crates/bevy_ecs/src/schedule/executor/single_threaded.rs b/crates/bevy_ecs/src/schedule/executor/single_threaded.rs index d329d0e09c196..d92519ee63f24 100644 --- a/crates/bevy_ecs/src/schedule/executor/single_threaded.rs +++ b/crates/bevy_ecs/src/schedule/executor/single_threaded.rs @@ -5,7 +5,6 @@ use tracing::info_span; use crate::{ schedule::{is_apply_deferred, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule}, - system::System, world::World, }; diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index 9eb181d3030d0..eeb5a584e2838 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -21,7 +21,7 @@ use crate::{ prelude::Component, result::Result, schedule::*, - system::{IntoSystem, Resource, ScheduleSystem, System}, + system::{IntoSystem, Resource, ScheduleSystem}, world::World, }; diff --git a/crates/bevy_ecs/src/schedule/stepping.rs b/crates/bevy_ecs/src/schedule/stepping.rs index 87929c6163b4b..df71139db400e 100644 --- a/crates/bevy_ecs/src/schedule/stepping.rs +++ b/crates/bevy_ecs/src/schedule/stepping.rs @@ -1,6 +1,6 @@ use crate::{ schedule::{InternedScheduleLabel, NodeId, Schedule, ScheduleLabel}, - system::{IntoSystem, ResMut, Resource, System}, + system::{IntoSystem, ResMut, Resource}, }; use alloc::vec::Vec; use bevy_utils::{HashMap, TypeIdMap}; From a30fa890b3ea7f606c521b4bd05a410ed664ecb9 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Sun, 29 Dec 2024 23:43:40 -0800 Subject: [PATCH 08/12] temp commit --- crates/bevy_ecs/src/system/schedule_system.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index dd3aa04c59531..b8e832d087d33 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -11,6 +11,7 @@ use crate::{ use super::IntoSystem; +// This is breaking some things because the system type set is now wrong. /// Wrapper for a system that returns `()` to return `Ok(())` to make it into a [`ScheduleSystem`] pub struct OkWrapperSystem>(S); From 1cd7d80b131faa308d86bd10ca7362c54a27328d Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Mon, 30 Dec 2024 20:23:07 -0800 Subject: [PATCH 09/12] defer run call to child system for exclusive systems --- crates/bevy_ecs/src/system/schedule_system.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index b8e832d087d33..419c347eff5b0 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -66,6 +66,12 @@ impl> System for OkWrapperSystem { Ok(()) } + #[inline] + fn run(&mut self, input: SystemIn<'_, Self>, world: &mut World) -> Self::Out { + self.0.run(input, world); + Ok(()) + } + #[inline] fn apply_deferred(&mut self, world: &mut World) { self.0.apply_deferred(world); @@ -105,6 +111,10 @@ impl> System for OkWrapperSystem { fn set_last_run(&mut self, last_run: Tick) { self.0.set_last_run(last_run); } + + fn default_system_sets(&self) -> Vec { + self.0.default_system_sets() + } } /// Type alias for a `BoxedSystem` that a `Schedule` can store. From 6c97696afe7c84909a2809744872fcb837e11cd3 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Mon, 30 Dec 2024 22:30:12 -0800 Subject: [PATCH 10/12] rename wrapper --- crates/bevy_ecs/src/schedule/config.rs | 4 ++-- crates/bevy_ecs/src/system/schedule_system.rs | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/config.rs b/crates/bevy_ecs/src/schedule/config.rs index ebd2773ca7e13..9a7b92064250b 100644 --- a/crates/bevy_ecs/src/schedule/config.rs +++ b/crates/bevy_ecs/src/schedule/config.rs @@ -9,7 +9,7 @@ use crate::{ set::{InternedSystemSet, IntoSystemSet, SystemSet}, Chain, }, - system::{BoxedSystem, IntoSystem, OkWrapperSystem, ScheduleSystem, System}, + system::{BoxedSystem, IntoSystem, InfallibleSystemWrapper, ScheduleSystem, System}, }; fn new_condition(condition: impl Condition) -> BoxedCondition { @@ -528,7 +528,7 @@ where F: IntoSystem<(), (), Marker>, { fn into_configs(self) -> SystemConfigs { - let wrapper = OkWrapperSystem::new(IntoSystem::into_system(self)); + let wrapper = InfallibleSystemWrapper::new(IntoSystem::into_system(self)); SystemConfigs::new_system(Box::new(wrapper)) } } diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index 419c347eff5b0..c8bcb833ddca9 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -11,18 +11,17 @@ use crate::{ use super::IntoSystem; -// This is breaking some things because the system type set is now wrong. -/// Wrapper for a system that returns `()` to return `Ok(())` to make it into a [`ScheduleSystem`] -pub struct OkWrapperSystem>(S); +/// A wrapper system to change a system that returns `()` to return `Ok(())` to make it into a [`ScheduleSystem`] +pub struct InfallibleSystemWrapper>(S); -impl> OkWrapperSystem { +impl> InfallibleSystemWrapper { /// Create a new `OkWrapperSystem` pub fn new(system: S) -> Self { Self(IntoSystem::into_system(system)) } } -impl> System for OkWrapperSystem { +impl> System for InfallibleSystemWrapper { type In = (); type Out = Result; From e7dad5c4157672ee7d33fabc0e478a3ee186d363 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Mon, 30 Dec 2024 22:49:47 -0800 Subject: [PATCH 11/12] fmt --- crates/bevy_ecs/src/schedule/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/schedule/config.rs b/crates/bevy_ecs/src/schedule/config.rs index 9a7b92064250b..7dc8ea03f798e 100644 --- a/crates/bevy_ecs/src/schedule/config.rs +++ b/crates/bevy_ecs/src/schedule/config.rs @@ -9,7 +9,7 @@ use crate::{ set::{InternedSystemSet, IntoSystemSet, SystemSet}, Chain, }, - system::{BoxedSystem, IntoSystem, InfallibleSystemWrapper, ScheduleSystem, System}, + system::{BoxedSystem, InfallibleSystemWrapper, IntoSystem, ScheduleSystem, System}, }; fn new_condition(condition: impl Condition) -> BoxedCondition { From 4dca3b9185974cb6cd217a8c9b60ce91452adc85 Mon Sep 17 00:00:00 2001 From: Mike Hsu Date: Mon, 30 Dec 2024 16:27:38 -0800 Subject: [PATCH 12/12] fix docs --- crates/bevy_ecs/src/schedule/executor/simple.rs | 2 +- crates/bevy_ecs/src/schedule/schedule.rs | 2 +- crates/bevy_ecs/src/system/schedule_system.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/executor/simple.rs b/crates/bevy_ecs/src/schedule/executor/simple.rs index b26478905afa1..91a3d83b3df14 100644 --- a/crates/bevy_ecs/src/schedule/executor/simple.rs +++ b/crates/bevy_ecs/src/schedule/executor/simple.rs @@ -135,7 +135,7 @@ impl SystemExecutor for SimpleExecutor { impl SimpleExecutor { /// Creates a new simple executor for use in a [`Schedule`](crate::schedule::Schedule). - /// This calls each system in order and immediately calls [`System::apply_deferred`]. + /// This calls each system in order and immediately calls [`System::apply_deferred`](crate::system::System). pub const fn new() -> Self { Self { evaluated_sets: FixedBitSet::new(), diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index eeb5a584e2838..e406d0555ef11 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -1053,7 +1053,7 @@ impl ScheduleGraph { Ok(()) } - /// Initializes any newly-added systems and conditions by calling [`System::initialize`] + /// Initializes any newly-added systems and conditions by calling [`System::initialize`](crate::system::System) pub fn initialize(&mut self, world: &mut World) { for (id, i) in self.uninit.drain(..) { match id { diff --git a/crates/bevy_ecs/src/system/schedule_system.rs b/crates/bevy_ecs/src/system/schedule_system.rs index c8bcb833ddca9..e0005f06f46d9 100644 --- a/crates/bevy_ecs/src/system/schedule_system.rs +++ b/crates/bevy_ecs/src/system/schedule_system.rs @@ -1,4 +1,4 @@ -use alloc::borrow::Cow; +use alloc::{borrow::Cow, vec::Vec}; use crate::{ archetype::ArchetypeComponentId,