diff --git a/crates/bevy_app/src/propagate.rs b/crates/bevy_app/src/propagate.rs index d851f0dd38402..e0a02c86f2df5 100644 --- a/crates/bevy_app/src/propagate.rs +++ b/crates/bevy_app/src/propagate.rs @@ -1,17 +1,18 @@ use alloc::vec::Vec; use core::marker::PhantomData; -use crate::{App, Plugin, Update}; +use crate::{App, Plugin}; #[cfg(feature = "bevy_reflect")] use bevy_ecs::reflect::ReflectComponent; use bevy_ecs::{ component::Component, entity::Entity, hierarchy::ChildOf, + intern::Interned, lifecycle::RemovedComponents, query::{Changed, Or, QueryFilter, With, Without}, relationship::{Relationship, RelationshipTarget}, - schedule::{IntoScheduleConfigs, SystemSet}, + schedule::{IntoScheduleConfigs, ScheduleLabel, SystemSet}, system::{Commands, Local, Query}, }; #[cfg(feature = "bevy_reflect")] @@ -33,7 +34,7 @@ use bevy_reflect::Reflect; /// Individual entities can be skipped or terminate the propagation with the [`PropagateOver`] /// and [`PropagateStop`] components. /// -/// Propagation occurs during [`Update`] in the [`PropagateSet`] system set. +/// The schedule can be configured via [`HierarchyPropagatePlugin::new`]. /// You should be sure to schedule your logic relative to this set: making changes /// that modify component values before this logic, and reading the propagated /// values after it. @@ -41,7 +42,22 @@ pub struct HierarchyPropagatePlugin< C: Component + Clone + PartialEq, F: QueryFilter = (), R: Relationship = ChildOf, ->(PhantomData (C, F, R)>); +> { + schedule: Interned, + _marker: PhantomData (C, F, R)>, +} + +impl + HierarchyPropagatePlugin +{ + /// Construct the plugin. The propagation systems will be placed in the specified schedule. + pub fn new(schedule: impl ScheduleLabel) -> Self { + Self { + schedule: schedule.intern(), + _marker: PhantomData, + } + } +} /// Causes the inner component to be added to this entity and all direct and transient relationship /// targets. A target with a [`Propagate`] component of its own will override propagation from @@ -80,14 +96,6 @@ pub struct PropagateSet { )] pub struct Inherited(pub C); -impl Default - for HierarchyPropagatePlugin -{ - fn default() -> Self { - Self(Default::default()) - } -} - impl Default for PropagateOver { fn default() -> Self { Self(Default::default()) @@ -129,7 +137,7 @@ impl, update_stopped::, @@ -295,7 +303,7 @@ mod tests { fn test_simple_propagate() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let intermediate = app @@ -322,7 +330,7 @@ mod tests { fn test_reparented() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let propagatee = app @@ -344,7 +352,7 @@ mod tests { fn test_reparented_with_prior() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator_a = app.world_mut().spawn(Propagate(TestValue(1))).id(); let propagator_b = app.world_mut().spawn(Propagate(TestValue(2))).id(); @@ -378,7 +386,7 @@ mod tests { fn test_remove_orphan() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let propagatee = app @@ -409,7 +417,7 @@ mod tests { fn test_remove_propagated() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let propagatee = app @@ -440,7 +448,7 @@ mod tests { fn test_propagate_over() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let propagate_over = app @@ -467,7 +475,7 @@ mod tests { fn test_propagate_stop() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let propagate_stop = app @@ -493,7 +501,7 @@ mod tests { fn test_intermediate_override() { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::::default()); + app.add_plugins(HierarchyPropagatePlugin::::new(Update)); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let intermediate = app @@ -534,7 +542,9 @@ mod tests { let mut app = App::new(); app.add_schedule(Schedule::new(Update)); - app.add_plugins(HierarchyPropagatePlugin::>::default()); + app.add_plugins(HierarchyPropagatePlugin::>::new( + Update, + )); let propagator = app.world_mut().spawn(Propagate(TestValue(1))).id(); let propagatee = app diff --git a/crates/bevy_feathers/src/lib.rs b/crates/bevy_feathers/src/lib.rs index d6ec11e7b6707..ef70be1844ed0 100644 --- a/crates/bevy_feathers/src/lib.rs +++ b/crates/bevy_feathers/src/lib.rs @@ -18,7 +18,7 @@ //! Please report issues, submit fixes and propose changes. //! Thanks for stress-testing; let's build something better together. -use bevy_app::{HierarchyPropagatePlugin, Plugin, PostUpdate}; +use bevy_app::{HierarchyPropagatePlugin, Plugin, PostUpdate, Update}; use bevy_asset::embedded_asset; use bevy_ecs::query::With; use bevy_text::{TextColor, TextFont}; @@ -63,8 +63,8 @@ impl Plugin for FeathersPlugin { app.add_plugins(( ControlsPlugin, CursorIconPlugin, - HierarchyPropagatePlugin::>::default(), - HierarchyPropagatePlugin::>::default(), + HierarchyPropagatePlugin::>::new(Update), + HierarchyPropagatePlugin::>::new(Update), UiMaterialPlugin::::default(), ));