bevy/crates
John 9e34c748c6 Added the ability to get or set the last change tick of a system. (#5838)
# Objective
I'm build a UI system for bevy. In this UI system there is a concept of a system per UI entity. I had an issue where change detection wasn't working how I would expect and it's because when a function system is ran the `last_change_tick` is updated with the latest tick(from world). In my particular case I want to "wait" to update the `last_change_tick` until after my system runs for each entity.

## Solution
Initially I thought bypassing the change detection all together would be a good fix, but on talking to some users in discord a simpler fix is to just expose `last_change_tick` to the end users. This is achieved by adding the following to the `System` trait:
```rust
    /// 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);
```

This causes a bit of weirdness with two implementors of `System`. `FixedTimestep` and `ChainSystem` both implement system and thus it's required that some sort of implementation be given for the new functions. I solved this by outputting a warning and not doing anything for these systems. 

I think it's important to understand why I can't add the new functions only to the function system and not to the `System` trait. In my code I store the systems generically as `Box<dyn System<...>>`. I do this because I have differing parameters that are being passed in depending on the UI widget's system.  As far as I can tell there isn't a way to take a system trait and cast it into a specific type without knowing what those parameters are.

In my own code this ends up looking something like:
```rust
// Runs per entity.
let old_tick = widget_system.get_last_change_tick();
should_update_children = widget_system.run((widget_tree.clone(), entity.0), world);
widget_system.set_last_change_tick(old_tick);


// later on after all the entities have been processed:
for system in context.systems.values_mut() {
    system.set_last_change_tick(world.read_change_tick());
}
```

## Changelog

- Added `get_last_change_tick` and `set_last_change_tick` to `System`'s.
2022-08-31 01:53:15 +00:00
..
bevy_animation Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_app Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_asset Add note on ordering to AssetServerSettings docs. (#5706) 2022-08-30 02:40:18 +00:00
bevy_audio Remove Sync requirement in Decodable::Decoder (#5819) 2022-08-29 23:02:12 +00:00
bevy_core Add missing type registrations for bevy_math types (#5758) 2022-08-23 21:19:29 +00:00
bevy_core_pipeline register missing reflect types (#5747) 2022-08-23 17:41:39 +00:00
bevy_derive Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_diagnostic Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_dylib Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_dynamic_plugin Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_ecs Added the ability to get or set the last change tick of a system. (#5838) 2022-08-31 01:53:15 +00:00
bevy_ecs_compile_fail_tests Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_encase_derive Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_gilrs Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_gltf Add associated constant IDENTITY to Transform and friends. (#5340) 2022-08-30 22:10:24 +00:00
bevy_hierarchy Remove duplicate asserts in test (#5648) 2022-08-15 23:03:42 +00:00
bevy_input register missing reflect types (#5747) 2022-08-23 17:41:39 +00:00
bevy_internal Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_log Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_macro_utils Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_math Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_mikktspace Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_pbr Add associated constant IDENTITY to Transform and friends. (#5340) 2022-08-30 22:10:24 +00:00
bevy_ptr Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_reflect Remove extra spaces from Range reflect impls (#5839) 2022-08-30 21:39:48 +00:00
bevy_render Add associated constant IDENTITY to Transform and friends. (#5340) 2022-08-30 22:10:24 +00:00
bevy_scene Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_sprite Use 3 bits of PipelineKey to store MSAA sample count (#5826) 2022-08-30 03:00:39 +00:00
bevy_tasks Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_text register missing reflect types (#5747) 2022-08-23 17:41:39 +00:00
bevy_time Added the ability to get or set the last change tick of a system. (#5838) 2022-08-31 01:53:15 +00:00
bevy_transform Add associated constant IDENTITY to Transform and friends. (#5340) 2022-08-30 22:10:24 +00:00
bevy_ui Add associated constant IDENTITY to Transform and friends. (#5340) 2022-08-30 22:10:24 +00:00
bevy_utils Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_window Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_winit Fix window centering when scale_factor is not 1.0 (#5582) 2022-08-30 20:13:38 +00:00