Explicitly order CameraUpdateSystem before UiSystem::Prepare (#14609)

# Objective

Fixes https://github.com/bevyengine/bevy/issues/14277.

May also fix https://github.com/bevyengine/bevy/issues/14255, needs
verification.

## Solution

Explicitly order `CameraUpdateSystem` before `UiSystem::Prepare`, so
that when the window resizes, `camera_system` will update the `Camera`'s
viewport size before `ui_layout_system` also reacts to the window resize
and tries to read the new `Camera` viewport size to set UI node sizes
accordingly.

## Testing

I tested that explicitly ordering `CameraUpdateSystem` _after_ triggers
the buggy behavior, and explicitly ordering it _before_ does not trigger
the buggy behavior or crash the app (which also demonstrates that the
system sets are ambiguous).

---

## Migration Guide

`CameraUpdateSystem` is now explicitly ordered before
`UiSystem::Prepare` instead of being ambiguous with it.
This commit is contained in:
Ben Frankel 2024-08-04 16:34:51 +03:00 committed by GitHub
parent 4b20d822e9
commit 9b254aab1e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 3 additions and 6 deletions

View file

@ -54,6 +54,7 @@ use bevy_app::prelude::*;
use bevy_ecs::prelude::*; use bevy_ecs::prelude::*;
use bevy_input::InputSystem; use bevy_input::InputSystem;
use bevy_render::{ use bevy_render::{
camera::CameraUpdateSystem,
view::{check_visibility, VisibilitySystems}, view::{check_visibility, VisibilitySystems},
RenderApp, RenderApp,
}; };
@ -146,6 +147,7 @@ impl Plugin for UiPlugin {
.configure_sets( .configure_sets(
PostUpdate, PostUpdate,
( (
CameraUpdateSystem,
UiSystem::Prepare.before(UiSystem::Stack), UiSystem::Prepare.before(UiSystem::Stack),
UiSystem::Layout, UiSystem::Layout,
(UiSystem::PostLayout, UiSystem::Outlines), (UiSystem::PostLayout, UiSystem::Outlines),
@ -226,11 +228,6 @@ fn build_text_interop(app: &mut App) {
widget::measure_text_system widget::measure_text_system
.in_set(UiSystem::Prepare) .in_set(UiSystem::Prepare)
// Potential conflict: `Assets<Image>` // Potential conflict: `Assets<Image>`
// In practice, they run independently since `bevy_render::camera_update_system`
// will only ever observe its own render target, and `widget::measure_text_system`
// will never modify a pre-existing `Image` asset.
.ambiguous_with(bevy_render::camera::CameraUpdateSystem)
// Potential conflict: `Assets<Image>`
// Since both systems will only ever insert new [`Image`] assets, // Since both systems will only ever insert new [`Image`] assets,
// they will never observe each other's effects. // they will never observe each other's effects.
.ambiguous_with(bevy_text::update_text2d_layout) .ambiguous_with(bevy_text::update_text2d_layout)

View file

@ -69,7 +69,7 @@ pub fn main() {
let total_ambiguities = ambiguities.total(); let total_ambiguities = ambiguities.total();
assert_eq!( assert_eq!(
total_ambiguities, 81, total_ambiguities, 72,
"Main app does not have an expected conflicting systems count, \ "Main app does not have an expected conflicting systems count, \
you might consider verifying if it's normal, or change the expected number.\n\ you might consider verifying if it's normal, or change the expected number.\n\
Details:\n{:#?}", Details:\n{:#?}",