-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Merged by Bors] - Added the ability to get or set the last change tick of a system. #5838
Changes from 3 commits
0d385d5
fd4132f
06a73ed
e187d70
e7eb188
2d88809
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -31,6 +31,7 @@ pub trait System: Send + Sync + 'static { | |
fn archetype_component_access(&self) -> &Access<ArchetypeComponentId>; | ||
/// 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,10 @@ pub trait System: Send + Sync + 'static { | |
fn default_labels(&self) -> Vec<SystemLabelId> { | ||
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); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As mentioned in #5633, I think this deserves some level of warning around the effects this will have on change detection / that setting it manually could break things if you aren't careful. |
||
} | ||
|
||
/// A convenience type alias for a boxed [`System`] trait object. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
use bevy_utils::tracing::warn; | ||
|
||
use crate::{ | ||
archetype::ArchetypeComponentId, | ||
component::ComponentId, | ||
|
@@ -106,6 +108,15 @@ impl<SystemA: System, SystemB: System<In = SystemA::Out>> 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 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would argue that if we can't implement these functions for every System, they aren't System functions. |
||
warn!("Can't `get_last_change_tick` call on a chained system!"); | ||
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`] | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same here. Why can't we just pipe through the internal system's last_change_tick? |
||
warn!("Cannot use `get_last_change_tick` call on a fixed timestep system!"); | ||
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)] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"Users" in this context is implicit. I think this should just say something like "Gets the system's last change tick". Same for the set method.