From 0d385d5f0156b3df13f5a4139dead19a85e85a55 Mon Sep 17 00:00:00 2001 From: StarToaster Date: Tue, 30 Aug 2022 11:39:30 -0400 Subject: [PATCH 1/6] Added the ability to get or set the last change tick of a system. --- crates/bevy_ecs/src/system/function_system.rs | 8 ++++++++ crates/bevy_ecs/src/system/system.rs | 7 +++++++ crates/bevy_ecs/src/system/system_chaining.rs | 11 +++++++++++ crates/bevy_time/src/fixed_timestep.rs | 11 ++++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/system/function_system.rs b/crates/bevy_ecs/src/system/function_system.rs index 8ca47e0f4c311..7344e4463288b 100644 --- a/crates/bevy_ecs/src/system/function_system.rs +++ b/crates/bevy_ecs/src/system/function_system.rs @@ -406,6 +406,14 @@ where out } + fn get_last_change_tick(&self) -> u32 { + self.system_meta.last_change_tick + } + + fn set_last_change_tick(&mut self, last_change_tick: u32) { + self.system_meta.last_change_tick = last_change_tick; + } + #[inline] fn apply_buffers(&mut self, world: &mut World) { let param_state = self.param_state.as_mut().expect(Self::PARAM_MESSAGE); diff --git a/crates/bevy_ecs/src/system/system.rs b/crates/bevy_ecs/src/system/system.rs index 6a7139b25b35d..e2f3d5e242cf8 100644 --- a/crates/bevy_ecs/src/system/system.rs +++ b/crates/bevy_ecs/src/system/system.rs @@ -31,6 +31,7 @@ pub trait System: Send + Sync + 'static { fn archetype_component_access(&self) -> &Access; /// Returns true if the system is [`Send`]. fn is_send(&self) -> bool; + /// Runs the system with the given input in the world. Unlike [`System::run`], this function /// takes a shared reference to [`World`] and may therefore break Rust's aliasing rules, making /// it unsafe to call. @@ -59,6 +60,12 @@ pub trait System: Send + Sync + 'static { fn default_labels(&self) -> Vec { Vec::new() } + + /// Allows users to get the system's last change tick. + fn get_last_change_tick(&self) -> u32; + + /// Allows users to set the system's last change tick. + fn set_last_change_tick(&mut self, last_change_tick: u32); } /// A convenience type alias for a boxed [`System`] trait object. diff --git a/crates/bevy_ecs/src/system/system_chaining.rs b/crates/bevy_ecs/src/system/system_chaining.rs index 0a338cf0f4863..f7bf5047ed9ef 100644 --- a/crates/bevy_ecs/src/system/system_chaining.rs +++ b/crates/bevy_ecs/src/system/system_chaining.rs @@ -1,3 +1,5 @@ +use bevy_utils::tracing::warn; + use crate::{ archetype::ArchetypeComponentId, component::ComponentId, @@ -106,6 +108,15 @@ impl> System for ChainSystem self.system_a.check_change_tick(change_tick); self.system_b.check_change_tick(change_tick); } + + fn get_last_change_tick(&self) -> u32 { + warn!("Can't `get_last_change_tick` call on a chained system!"); + return 0; + } + + fn set_last_change_tick(&mut self, _last_change_tick: u32) { + warn!("Can't `set_last_change_tick` call on a chained system!"); + } } /// An extension trait providing the [`IntoChainSystem::chain`] method for convenient [`System`] diff --git a/crates/bevy_time/src/fixed_timestep.rs b/crates/bevy_time/src/fixed_timestep.rs index 8f1c44065c0af..ae28842429356 100644 --- a/crates/bevy_time/src/fixed_timestep.rs +++ b/crates/bevy_time/src/fixed_timestep.rs @@ -7,7 +7,7 @@ use bevy_ecs::{ system::{IntoSystem, Res, ResMut, Resource, System}, world::World, }; -use bevy_utils::HashMap; +use bevy_utils::{tracing::warn, HashMap}; use std::borrow::Cow; /// The internal state of each [`FixedTimestep`]. @@ -224,6 +224,15 @@ impl System for FixedTimestep { fn check_change_tick(&mut self, change_tick: u32) { self.internal_system.check_change_tick(change_tick); } + + fn get_last_change_tick(&self) -> u32 { + warn!("Cannot use `get_last_change_tick` call on a fixed timestep system!"); + return 0; + } + + fn set_last_change_tick(&mut self, _last_change_tick: u32) { + warn!("Cannot use `get_last_change_tick` call on a fixed timestep system!"); + } } #[cfg(test)] From fd4132f0f90ce1e7a8cb860374744a62a7651796 Mon Sep 17 00:00:00 2001 From: StarToaster Date: Tue, 30 Aug 2022 11:43:43 -0400 Subject: [PATCH 2/6] Removed whitespace --- crates/bevy_ecs/src/system/system.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/bevy_ecs/src/system/system.rs b/crates/bevy_ecs/src/system/system.rs index e2f3d5e242cf8..4c230b59b9da4 100644 --- a/crates/bevy_ecs/src/system/system.rs +++ b/crates/bevy_ecs/src/system/system.rs @@ -60,10 +60,8 @@ pub trait System: Send + Sync + 'static { fn default_labels(&self) -> Vec { Vec::new() } - /// Allows users to get the system's last change tick. fn get_last_change_tick(&self) -> u32; - /// Allows users to set the system's last change tick. fn set_last_change_tick(&mut self, last_change_tick: u32); } From 06a73ed3d72ee644bb617adfbe93153f7a51ea5c Mon Sep 17 00:00:00 2001 From: StarToaster Date: Tue, 30 Aug 2022 11:54:34 -0400 Subject: [PATCH 3/6] Use implicit returns. --- crates/bevy_ecs/src/system/system_chaining.rs | 2 +- crates/bevy_time/src/fixed_timestep.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_ecs/src/system/system_chaining.rs b/crates/bevy_ecs/src/system/system_chaining.rs index f7bf5047ed9ef..fa78121e7d48e 100644 --- a/crates/bevy_ecs/src/system/system_chaining.rs +++ b/crates/bevy_ecs/src/system/system_chaining.rs @@ -111,7 +111,7 @@ impl> System for ChainSystem fn get_last_change_tick(&self) -> u32 { warn!("Can't `get_last_change_tick` call on a chained system!"); - return 0; + 0 } fn set_last_change_tick(&mut self, _last_change_tick: u32) { diff --git a/crates/bevy_time/src/fixed_timestep.rs b/crates/bevy_time/src/fixed_timestep.rs index ae28842429356..5fd8cb7b84866 100644 --- a/crates/bevy_time/src/fixed_timestep.rs +++ b/crates/bevy_time/src/fixed_timestep.rs @@ -227,7 +227,7 @@ impl System for FixedTimestep { fn get_last_change_tick(&self) -> u32 { warn!("Cannot use `get_last_change_tick` call on a fixed timestep system!"); - return 0; + 0 } fn set_last_change_tick(&mut self, _last_change_tick: u32) { From e187d7047fa1f6d9d0f8c92c7cc192c9b0392a85 Mon Sep 17 00:00:00 2001 From: StarToaster Date: Tue, 30 Aug 2022 17:11:40 -0400 Subject: [PATCH 4/6] Added proper support for chained and fixed timestep systems. --- crates/bevy_ecs/src/system/system_chaining.rs | 8 ++++---- crates/bevy_time/src/fixed_timestep.rs | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/crates/bevy_ecs/src/system/system_chaining.rs b/crates/bevy_ecs/src/system/system_chaining.rs index fa78121e7d48e..a6d9fe0e717ad 100644 --- a/crates/bevy_ecs/src/system/system_chaining.rs +++ b/crates/bevy_ecs/src/system/system_chaining.rs @@ -110,12 +110,12 @@ impl> System for ChainSystem } fn get_last_change_tick(&self) -> u32 { - warn!("Can't `get_last_change_tick` call on a chained system!"); - 0 + self.system_a.get_last_change_tick() } - fn set_last_change_tick(&mut self, _last_change_tick: u32) { - warn!("Can't `set_last_change_tick` call on a chained system!"); + fn set_last_change_tick(&mut self, last_change_tick: u32) { + self.system_a.set_last_change_tick(last_change_tick); + self.system_b.set_last_change_tick(last_change_tick); } } diff --git a/crates/bevy_time/src/fixed_timestep.rs b/crates/bevy_time/src/fixed_timestep.rs index 5fd8cb7b84866..41c2a051dfafd 100644 --- a/crates/bevy_time/src/fixed_timestep.rs +++ b/crates/bevy_time/src/fixed_timestep.rs @@ -226,12 +226,11 @@ impl System for FixedTimestep { } fn get_last_change_tick(&self) -> u32 { - warn!("Cannot use `get_last_change_tick` call on a fixed timestep system!"); - 0 + self.internal_system.get_last_change_tick() } - fn set_last_change_tick(&mut self, _last_change_tick: u32) { - warn!("Cannot use `get_last_change_tick` call on a fixed timestep system!"); + fn set_last_change_tick(&mut self, last_change_tick: u32) { + self.internal_system.set_last_change_tick(last_change_tick); } } From e7eb1885b8e38c5da7dc64b92c96d4c74aac9a28 Mon Sep 17 00:00:00 2001 From: StarToaster Date: Tue, 30 Aug 2022 19:33:52 -0400 Subject: [PATCH 5/6] Changed doc comments. --- crates/bevy_ecs/src/system/system.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/bevy_ecs/src/system/system.rs b/crates/bevy_ecs/src/system/system.rs index 4c230b59b9da4..7c48df6910bfb 100644 --- a/crates/bevy_ecs/src/system/system.rs +++ b/crates/bevy_ecs/src/system/system.rs @@ -60,9 +60,13 @@ pub trait System: Send + Sync + 'static { fn default_labels(&self) -> Vec { Vec::new() } - /// Allows users to get the system's last change tick. + /// Gets the system's last change tick fn get_last_change_tick(&self) -> u32; - /// Allows users to set the system's last change tick. + /// Sets the system's last change tick + /// # Warning + /// This is a complex and error-prone operation, that can have unexpected consequences on any system relying on this code. + /// However, it can be an essential escape hatch when, for example, + /// you are trying to synchronize representations using change detection and need to avoid infinite recursion. fn set_last_change_tick(&mut self, last_change_tick: u32); } From 2d88809f46091fc6c5fe09f4f90d011f19a2d39d Mon Sep 17 00:00:00 2001 From: StarToaster Date: Tue, 30 Aug 2022 20:04:34 -0400 Subject: [PATCH 6/6] Removed unused imports. --- crates/bevy_ecs/src/system/system_chaining.rs | 2 -- crates/bevy_time/src/fixed_timestep.rs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/bevy_ecs/src/system/system_chaining.rs b/crates/bevy_ecs/src/system/system_chaining.rs index a6d9fe0e717ad..a4bc85805102e 100644 --- a/crates/bevy_ecs/src/system/system_chaining.rs +++ b/crates/bevy_ecs/src/system/system_chaining.rs @@ -1,5 +1,3 @@ -use bevy_utils::tracing::warn; - use crate::{ archetype::ArchetypeComponentId, component::ComponentId, diff --git a/crates/bevy_time/src/fixed_timestep.rs b/crates/bevy_time/src/fixed_timestep.rs index 41c2a051dfafd..22767033a9dff 100644 --- a/crates/bevy_time/src/fixed_timestep.rs +++ b/crates/bevy_time/src/fixed_timestep.rs @@ -7,7 +7,7 @@ use bevy_ecs::{ system::{IntoSystem, Res, ResMut, Resource, System}, world::World, }; -use bevy_utils::{tracing::warn, HashMap}; +use bevy_utils::HashMap; use std::borrow::Cow; /// The internal state of each [`FixedTimestep`].