
# Objective - Fixes #6370 - Closes #6581 ## Solution - Added the following lints to the workspace: - `std_instead_of_core` - `std_instead_of_alloc` - `alloc_instead_of_core` - Used `cargo +nightly fmt` with [item level use formatting](https://rust-lang.github.io/rustfmt/?version=v1.6.0&search=#Item%5C%3A) to split all `use` statements into single items. - Used `cargo clippy --workspace --all-targets --all-features --fix --allow-dirty` to _attempt_ to resolve the new linting issues, and intervened where the lint was unable to resolve the issue automatically (usually due to needing an `extern crate alloc;` statement in a crate root). - Manually removed certain uses of `std` where negative feature gating prevented `--all-features` from finding the offending uses. - Used `cargo +nightly fmt` with [crate level use formatting](https://rust-lang.github.io/rustfmt/?version=v1.6.0&search=#Crate%5C%3A) to re-merge all `use` statements matching Bevy's previous styling. - Manually fixed cases where the `fmt` tool could not re-merge `use` statements due to conditional compilation attributes. ## Testing - Ran CI locally ## Migration Guide The MSRV is now 1.81. Please update to this version or higher. ## Notes - This is a _massive_ change to try and push through, which is why I've outlined the semi-automatic steps I used to create this PR, in case this fails and someone else tries again in the future. - Making this change has no impact on user code, but does mean Bevy contributors will be warned to use `core` and `alloc` instead of `std` where possible. - This lint is a critical first step towards investigating `no_std` options for Bevy. --------- Co-authored-by: François Mockers <francois.mockers@vleue.com>
63 lines
2.2 KiB
Rust
63 lines
2.2 KiB
Rust
use crate as bevy_ecs;
|
|
use bevy_ecs::{
|
|
change_detection::Mut,
|
|
component::Tick,
|
|
event::EventRegistry,
|
|
system::{Local, Res, ResMut},
|
|
world::World,
|
|
};
|
|
use bevy_ecs_macros::SystemSet;
|
|
#[cfg(feature = "bevy_reflect")]
|
|
use core::hash::Hash;
|
|
|
|
use super::registry::ShouldUpdateEvents;
|
|
|
|
#[doc(hidden)]
|
|
#[derive(SystemSet, Clone, Debug, PartialEq, Eq, Hash)]
|
|
pub struct EventUpdates;
|
|
|
|
/// Signals the [`event_update_system`] to run after `FixedUpdate` systems.
|
|
///
|
|
/// This will change the behavior of the [`EventRegistry`] to only run after a fixed update cycle has passed.
|
|
/// Normally, this will simply run every frame.
|
|
pub fn signal_event_update_system(signal: Option<ResMut<EventRegistry>>) {
|
|
if let Some(mut registry) = signal {
|
|
registry.should_update = ShouldUpdateEvents::Ready;
|
|
}
|
|
}
|
|
|
|
/// A system that calls [`Events::update`](super::Events::update) on all registered [`Events`][super::Events] in the world.
|
|
pub fn event_update_system(world: &mut World, mut last_change_tick: Local<Tick>) {
|
|
if world.contains_resource::<EventRegistry>() {
|
|
world.resource_scope(|world, mut registry: Mut<EventRegistry>| {
|
|
registry.run_updates(world, *last_change_tick);
|
|
|
|
registry.should_update = match registry.should_update {
|
|
// If we're always updating, keep doing so.
|
|
ShouldUpdateEvents::Always => ShouldUpdateEvents::Always,
|
|
// Disable the system until signal_event_update_system runs again.
|
|
ShouldUpdateEvents::Waiting | ShouldUpdateEvents::Ready => {
|
|
ShouldUpdateEvents::Waiting
|
|
}
|
|
};
|
|
});
|
|
}
|
|
*last_change_tick = world.change_tick();
|
|
}
|
|
|
|
/// A run condition for [`event_update_system`].
|
|
///
|
|
/// If [`signal_event_update_system`] has been run at least once,
|
|
/// we will wait for it to be run again before updating the events.
|
|
///
|
|
/// Otherwise, we will always update the events.
|
|
pub fn event_update_condition(maybe_signal: Option<Res<EventRegistry>>) -> bool {
|
|
match maybe_signal {
|
|
Some(signal) => match signal.should_update {
|
|
ShouldUpdateEvents::Always | ShouldUpdateEvents::Ready => true,
|
|
ShouldUpdateEvents::Waiting => false,
|
|
},
|
|
None => true,
|
|
}
|
|
}
|