From 21a875d67b401c36edb9ca2cc0c3f646c2fefbd2 Mon Sep 17 00:00:00 2001 From: Daniel McNab <36049421+DJMcNab@users.noreply.github.com> Date: Thu, 7 Apr 2022 19:08:08 +0000 Subject: [PATCH] Some small changes related to run criteria piping (#3923) Remove the 'chaining' api, as it's peculiar ~~Implement the label traits for `Box` (n.b. I'm not confident about this change, but it was the quickest path to not regressing)~~ Remove the need for '`.system`' when using run criteria piping --- crates/bevy_ecs/src/lib.rs | 4 +- crates/bevy_ecs/src/schedule/run_criteria.rs | 42 ++----------------- crates/bevy_ecs/src/schedule/stage.rs | 44 ++++++++++---------- examples/ecs/system_sets.rs | 5 +-- 4 files changed, 29 insertions(+), 66 deletions(-) diff --git a/crates/bevy_ecs/src/lib.rs b/crates/bevy_ecs/src/lib.rs index ad93f91d0d150..e2f62cca07a7c 100644 --- a/crates/bevy_ecs/src/lib.rs +++ b/crates/bevy_ecs/src/lib.rs @@ -29,8 +29,8 @@ pub mod prelude { query::{Added, AnyOf, ChangeTrackers, Changed, Or, QueryState, With, Without}, schedule::{ AmbiguitySetLabel, ExclusiveSystemDescriptorCoercion, ParallelSystemDescriptorCoercion, - RunCriteria, RunCriteriaDescriptorCoercion, RunCriteriaLabel, RunCriteriaPiping, - Schedule, Stage, StageLabel, State, SystemLabel, SystemSet, SystemStage, + RunCriteria, RunCriteriaDescriptorCoercion, RunCriteriaLabel, Schedule, Stage, + StageLabel, State, SystemLabel, SystemSet, SystemStage, }, system::{ Commands, In, IntoChainSystem, IntoExclusiveSystem, IntoSystem, Local, NonSend, diff --git a/crates/bevy_ecs/src/schedule/run_criteria.rs b/crates/bevy_ecs/src/schedule/run_criteria.rs index f5aa1e0e60b92..7c7b9ecee4f55 100644 --- a/crates/bevy_ecs/src/schedule/run_criteria.rs +++ b/crates/bevy_ecs/src/schedule/run_criteria.rs @@ -240,12 +240,6 @@ where } } -impl IntoRunCriteria for BoxedRunCriteriaLabel { - fn into(self) -> RunCriteriaDescriptorOrLabel { - RunCriteriaDescriptorOrLabel::Label(self) - } -} - impl IntoRunCriteria for L where L: RunCriteriaLabel, @@ -357,44 +351,16 @@ pub struct RunCriteria { impl RunCriteria { /// Constructs a new run criteria that will retrieve the result of the criteria `label` /// and pipe it as input to `system`. - pub fn pipe( + pub fn pipe

( label: impl RunCriteriaLabel, - system: impl System, + system: impl IntoSystem, ) -> RunCriteriaDescriptor { - label.pipe(system) - } -} - -pub trait RunCriteriaPiping { - /// See [`RunCriteria::pipe()`]. - // TODO: Support `IntoSystem` here instead, and stop using - // `IntoSystem::into_system` in the call sites - fn pipe(self, system: impl System) -> RunCriteriaDescriptor; -} - -impl RunCriteriaPiping for BoxedRunCriteriaLabel { - fn pipe(self, system: impl System) -> RunCriteriaDescriptor { - RunCriteriaDescriptor { - system: RunCriteriaSystem::Piped(Box::new(system)), - label: None, - duplicate_label_strategy: DuplicateLabelStrategy::Panic, - before: vec![], - after: vec![self], - } - } -} - -impl RunCriteriaPiping for L -where - L: RunCriteriaLabel, -{ - fn pipe(self, system: impl System) -> RunCriteriaDescriptor { RunCriteriaDescriptor { - system: RunCriteriaSystem::Piped(Box::new(system)), + system: RunCriteriaSystem::Piped(Box::new(IntoSystem::into_system(system))), label: None, duplicate_label_strategy: DuplicateLabelStrategy::Panic, before: vec![], - after: vec![Box::new(self)], + after: vec![Box::new(label)], } } } diff --git a/crates/bevy_ecs/src/schedule/stage.rs b/crates/bevy_ecs/src/schedule/stage.rs index dd8d9976da48f..f53ad9dc49d39 100644 --- a/crates/bevy_ecs/src/schedule/stage.rs +++ b/crates/bevy_ecs/src/schedule/stage.rs @@ -946,10 +946,10 @@ mod tests { query::{ChangeTrackers, Changed}, schedule::{ BoxedSystemLabel, ExclusiveSystemDescriptorCoercion, ParallelSystemDescriptorCoercion, - RunCriteria, RunCriteriaDescriptorCoercion, RunCriteriaPiping, ShouldRun, - SingleThreadedExecutor, Stage, SystemSet, SystemStage, + RunCriteria, RunCriteriaDescriptorCoercion, ShouldRun, SingleThreadedExecutor, Stage, + SystemSet, SystemStage, }, - system::{In, IntoExclusiveSystem, IntoSystem, Local, Query, ResMut}, + system::{In, IntoExclusiveSystem, Local, Query, ResMut}, world::World, }; @@ -1475,25 +1475,25 @@ mod tests { ShouldRun::No } } - let mut stage = SystemStage::parallel() - .with_system(make_parallel(0).label("0")) - .with_system( - make_parallel(1) - .label("1") - .after("0") - .with_run_criteria(every_other_time.label("every other time")), - ) - .with_system(make_parallel(2).label("2").after("1").with_run_criteria( - RunCriteria::pipe("every other time", IntoSystem::into_system(eot_piped)), - )) - .with_system( - make_parallel(3).label("3").after("2").with_run_criteria( - "every other time" - .pipe(IntoSystem::into_system(eot_piped)) - .label("piped"), - ), - ) - .with_system(make_parallel(4).after("3").with_run_criteria("piped")); + let mut stage = + SystemStage::parallel() + .with_system(make_parallel(0).label("0")) + .with_system( + make_parallel(1) + .label("1") + .after("0") + .with_run_criteria(every_other_time.label("every other time")), + ) + .with_system( + make_parallel(2) + .label("2") + .after("1") + .with_run_criteria(RunCriteria::pipe("every other time", eot_piped)), + ) + .with_system(make_parallel(3).label("3").after("2").with_run_criteria( + RunCriteria::pipe("every other time", eot_piped).label("piped"), + )) + .with_system(make_parallel(4).after("3").with_run_criteria("piped")); for _ in 0..4 { stage.run(&mut world); } diff --git a/examples/ecs/system_sets.rs b/examples/ecs/system_sets.rs index fffba8b1b1910..642f9f49d2810 100644 --- a/examples/ecs/system_sets.rs +++ b/examples/ecs/system_sets.rs @@ -70,10 +70,7 @@ fn main() { // Here we create a _not done_ criteria by piping the output of // the `is_done` system and inverting the output. // Notice a string literal also works as a label. - .with_run_criteria(RunCriteria::pipe( - "is_done_label", - IntoSystem::into_system(inverse), - )) + .with_run_criteria(RunCriteria::pipe("is_done_label", inverse)) // `collision` and `sfx` are not ordered with respect to // each other, and may run in any order .with_system(collision)