From 9eb1aeee488684ed607d249f883676f3e711a1d2 Mon Sep 17 00:00:00 2001 From: Nathan Ward Date: Tue, 18 May 2021 19:25:58 +0000 Subject: [PATCH] Expose set_changed() on ResMut and Mut (#2208) This new api stems from this [discord conversation](https://discord.com/channels/691052431525675048/742569353878437978/844057268172357663). This exposes a public facing `set_changed` method on `ResMut` and `Mut`. As a side note: `ResMut` and `Mut` have a lot of duplicated code, I have a PR I may put up later that refactors these commonalities into a trait. Co-authored-by: Carter Anderson --- crates/bevy_ecs/src/system/system_param.rs | 12 +++++++++++- crates/bevy_ecs/src/world/pointer.rs | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/crates/bevy_ecs/src/system/system_param.rs b/crates/bevy_ecs/src/system/system_param.rs index d4561740d6..bd93e844eb 100644 --- a/crates/bevy_ecs/src/system/system_param.rs +++ b/crates/bevy_ecs/src/system/system_param.rs @@ -369,6 +369,16 @@ impl<'w, T: Component> ResMut<'w, T> { self.ticks .is_changed(self.last_change_tick, self.change_tick) } + + /// Manually flags this resource as having been changed. This normally isn't + /// required because accessing this pointer mutably automatically flags this + /// resource as "changed". + /// + /// **Note**: This operation is irreversible. + #[inline] + pub fn set_changed(&mut self) { + self.ticks.set_changed(self.change_tick); + } } impl<'w, T: Component> Deref for ResMut<'w, T> { @@ -381,7 +391,7 @@ impl<'w, T: Component> Deref for ResMut<'w, T> { impl<'w, T: Component> DerefMut for ResMut<'w, T> { fn deref_mut(&mut self) -> &mut Self::Target { - self.ticks.set_changed(self.change_tick); + self.set_changed(); self.value } } diff --git a/crates/bevy_ecs/src/world/pointer.rs b/crates/bevy_ecs/src/world/pointer.rs index 68d3f5d753..dbca45b6f9 100644 --- a/crates/bevy_ecs/src/world/pointer.rs +++ b/crates/bevy_ecs/src/world/pointer.rs @@ -14,6 +14,16 @@ impl<'a, T> Mut<'a, T> { self.component_ticks.set_changed(self.change_tick); self.value } + + /// Manually flags this value as having been changed. This normally isn't + /// required because accessing this pointer mutably automatically flags this + /// value as "changed". + /// + /// **Note**: This operation is irreversible. + #[inline] + pub fn set_changed(&mut self) { + self.component_ticks.set_changed(self.change_tick); + } } impl<'a, T> Deref for Mut<'a, T> { @@ -28,7 +38,7 @@ impl<'a, T> Deref for Mut<'a, T> { impl<'a, T> DerefMut for Mut<'a, T> { #[inline] fn deref_mut(&mut self) -> &mut T { - self.component_ticks.set_changed(self.change_tick); + self.set_changed(); self.value } }