From 85e6fdddae87308c31525d9877cca106f255dbf3 Mon Sep 17 00:00:00 2001 From: Nicola Papale Date: Tue, 29 Aug 2023 12:49:40 +0200 Subject: [PATCH] Do not panic on non-UI child of UI entity (#9621) Legitimately, bevy emits a WARN when encountering entities in UI trees without NodeBunlde components. Bevy pretty much always panics when such a thing happens, due to the update_clipping system. However, sometimes, it's perfectly legitimate to have a child without UI nodes in a UI tree. For example, as a "seed" entity that is consumed by a 3rd party plugin, which will later spawn a valid UI tree. In loading scenarios, you are pretty much guaranteed to have incomplete children. The presence of the WARN hints that bevy does not intend to panic on such occasion (otherwise the warn! would be a panic!) so I assume panic is an unintended behavior, aka a bug. ## Solution Early-return instead of panicking. I did only test that it indeed fixed the panic, not checked for UI inconsistencies. Though on a logical level, it can only have changed code that would otherwise panic. ## Alternatives Instead of early-returning on invalid entity in `update_clipping`, do not call it with invalid entity in its recursive call. --- ## Changelog - Do not panic on non-UI child of UI entity --- crates/bevy_ui/src/update.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/bevy_ui/src/update.rs b/crates/bevy_ui/src/update.rs index 1da4395b55196..dd524be5172e7 100644 --- a/crates/bevy_ui/src/update.rs +++ b/crates/bevy_ui/src/update.rs @@ -37,8 +37,10 @@ fn update_clipping( entity: Entity, maybe_inherited_clip: Option, ) { - let (node, global_transform, style, maybe_calculated_clip) = - node_query.get_mut(entity).unwrap(); + let Ok((node, global_transform, style, maybe_calculated_clip)) = node_query.get_mut(entity) + else { + return; + }; // Update this node's CalculatedClip component if let Some(mut calculated_clip) = maybe_calculated_clip {