Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
396 commits
Select commit Hold shift + click to select a range
1851512
Removed `visited` flag from `ComputedLayout`.
ickshonpe Aug 31, 2026
c012cc7
mark trees dirty
ickshonpe Aug 31, 2026
29699d4
Merge branch 'main' into ui-layout-tree-transform-tree-changed
ickshonpe Aug 31, 2026
d10e2e1
fix everything
ickshonpe Aug 31, 2026
2ee6bb1
`update_clipping`'s condition is wrong, changed it to return on tree …
ickshonpe Aug 31, 2026
1853eca
Added test for clipping (failing)
ickshonpe Aug 31, 2026
b200f9e
Moved `clipping_updates_on_layout_changes` test into layout module
ickshonpe Aug 31, 2026
1758eca
Deleted the experimental module from layout.
ickshonpe Aug 31, 2026
5bb97d5
Removed `GhostNode`s feature gate
ickshonpe Aug 31, 2026
c30dc7d
unhaunted uistack
ickshonpe Aug 31, 2026
7fd586c
Removed more ghost_nodes gates
ickshonpe Aug 31, 2026
e1f73fa
readded ghost nodes module
ickshonpe Aug 31, 2026
629dc57
Removed ghost nodes feature, ghost nodes always enabled
ickshonpe Aug 31, 2026
f717262
Merge branch 'main' into ui-layout-tree-haunted-2
ickshonpe Sep 1, 2026
9f59c3e
fix layout tests
ickshonpe Sep 1, 2026
02ca897
moved clipping tests to layout module
ickshonpe Sep 1, 2026
6650030
Removed sync_simple_transforms and propagate_parent_transforms from s…
ickshonpe Sep 1, 2026
9af7821
updated stack module to not use the ghost nodes system params
ickshonpe Sep 1, 2026
7a11c9c
Added FixedNode + GhostNode comments
ickshonpe Sep 1, 2026
d3fc014
Changed `Accessibility` to use regular queries
ickshonpe Sep 1, 2026
a18e7ac
Removed redundant comment from TextSpanIter
ickshonpe Sep 1, 2026
6391781
Removed experimental module import
ickshonpe Sep 1, 2026
ed86325
Removed ghost_hierarchy and experimental modules.
ickshonpe Sep 1, 2026
e158f1e
Added another ghostnode doc comment
ickshonpe Sep 1, 2026
5216d23
update update module
ickshonpe Sep 1, 2026
0babe17
more GhostNode doc commentary
ickshonpe Sep 1, 2026
d6783ee
updated debug module
ickshonpe Sep 1, 2026
1a3b0d9
updated ghost nodes example
ickshonpe Sep 1, 2026
1df0bb3
More `GhostNode` doc comments
ickshonpe Sep 2, 2026
fdade0e
Renamed `update_taffy_styles` to `sync_taffy_styles_with_nodes`.
ickshonpe Sep 2, 2026
9f12992
Fixed incorrect assert in unghost_ghost_node_with_fixed_and_normal_c…
ickshonpe Sep 2, 2026
5e5c1ae
more doc comments for fields
ickshonpe Sep 2, 2026
ea0dfb3
Roots were skipped in `mark_dirty_ui_trees` because `ChildOf` in the …
ickshonpe Sep 2, 2026
cdabbcb
Leaf nodes not rendering because they are skipped by
ickshonpe Sep 2, 2026
dfd6b5c
Added regression test for computed nodes leaf nodes bug
ickshonpe Sep 2, 2026
1d5aec8
New clipping submodule of layout, moved `update_clipping_system` ther…
ickshonpe Sep 2, 2026
c20ef94
fixed feather scrollbar schedule
ickshonpe Sep 2, 2026
d41d062
Filter for `ComputedStackIndex` instead of `Node` in ui_stack_system …
ickshonpe Sep 2, 2026
40bf044
Removed unused import
ickshonpe Sep 2, 2026
04335bf
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 2, 2026
14fad39
Removed unused imports.
ickshonpe Sep 2, 2026
4e12e61
Updated release content
ickshonpe Sep 2, 2026
6d9c7c7
release content formatting
ickshonpe Sep 2, 2026
7397ad8
Updated migration guide
ickshonpe Sep 2, 2026
5037254
Fixed typo
ickshonpe Sep 2, 2026
553c528
Removed commented out code.
ickshonpe Sep 2, 2026
de3cf66
removed mark_dirty_trees from test UI schedule
ickshonpe Sep 2, 2026
f797e1c
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 2, 2026
eba3149
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 2, 2026
b35bc27
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 2, 2026
8868f53
Fixed typos
ickshonpe Sep 2, 2026
20c9998
fixed formatting
ickshonpe Sep 2, 2026
df29b34
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 2, 2026
3441eac
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 2, 2026
fc47e6f
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 2, 2026
2ad1c8c
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 2, 2026
2f277a2
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 2, 2026
a6a2d74
Fixed adding_intermediate_ghost_node_includes_child_in_layout test an…
ickshonpe Sep 3, 2026
da83e6a
Fixed another failing test: `unparenting_ghost_child_makes_child_layo…
ickshonpe Sep 3, 2026
d048f61
Fixed same error again in despawning_intermediate_ghost_child_makes_c…
ickshonpe Sep 3, 2026
ffb3c2f
detach all children before despawning in `despawning_intermediate_gho…
ickshonpe Sep 3, 2026
b8c9188
Renamed `build_runtime_layout_tree` to `sync_runtime_layout_tree`. Ea…
ickshonpe Sep 3, 2026
d6e3b1a
Added a new test (failing) `reflowed_siblings_are_updated`.
ickshonpe Sep 4, 2026
b7f361f
Added comment to `update_uinode_geometry_recursive` explaining why `F…
ickshonpe Sep 4, 2026
0fe87f4
Fixed update after reflow bug in `update_uinode_geometry_recursive`.
ickshonpe Sep 4, 2026
95bc725
Added new test `clipping_updates_when_override_clip_is_inserted_or_re…
ickshonpe Sep 4, 2026
f41892e
Improved `mark_dirty_ui_trees` doc comment.
ickshonpe Sep 4, 2026
7ee0d3f
Added tracking for `OverrideClip` adding and removal to `mark_dirty_…
ickshonpe Sep 4, 2026
cb4600f
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 4, 2026
154bafd
Added test `ghost_nodes_ui_transform_can_translates_child`, passing.
ickshonpe Sep 4, 2026
fc5501e
New test `ghost_nodes_global_transform_persists_update`, failing.
ickshonpe Sep 4, 2026
680f88b
Skip `GhostNode`s during clearance after a full walk.
ickshonpe Sep 4, 2026
f2c1f18
More tests:
ickshonpe Sep 4, 2026
17f3fa8
Set `reached` flags for `GhostNode`s during layout.
ickshonpe Sep 4, 2026
527b1a9
Changed collect_ui_children to push the child onto the ghost stack, n…
ickshonpe Sep 4, 2026
bcf10ff
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 5, 2026
cf2c01f
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 14, 2026
eb90b50
Added rem_sized_node_is_rem_sized test changes from main
ickshonpe Sep 14, 2026
9d5b876
Added `root_ghostnode_transform_persists_after_updates` test
ickshonpe Sep 14, 2026
283fcfd
Push root ghost onto ghost stack during layout, `root_ghostnode_trans…
ickshonpe Sep 14, 2026
e98e62d
`return` in ghost nodes branch of update_uinode_geometry_recursive on…
ickshonpe Sep 14, 2026
abbf0c5
Renamed `UiTreeChanged` to `UiTreeDirty`
ickshonpe Sep 17, 2026
1714211
Added more comments
ickshonpe Sep 17, 2026
f6cc2ce
Since `FixedNode`s create a new layout context, changes to a `FixedNo…
ickshonpe Sep 17, 2026
c0ccdf8
Made `compute_layout` function `pub`
ickshonpe Sep 17, 2026
d4a43eb
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 17, 2026
a536b26
renamed release note
ickshonpe Sep 17, 2026
8ee8095
In `ui_layout_system`, before adding a `FixedNode` to `root_stack`, w…
ickshonpe Sep 17, 2026
34330e9
Clarify more doc comments
ickshonpe Sep 17, 2026
324bd20
Added `geometry_updates_skip_clean_subtrees` test, fails.
ickshonpe Sep 17, 2026
92740a5
Added `clear_transient_dirty_flags` system, clear the dirty flags for…
ickshonpe Sep 17, 2026
1a6f85f
updated more doc comments
ickshonpe Sep 17, 2026
4d464bc
removed unused lifetime from sync_runtime_layout_tree
ickshonpe Sep 17, 2026
53aacaa
Removed unused `RemSize` parameters.
ickshonpe Sep 17, 2026
9c42cd9
Fixed doc list indentation
ickshonpe Sep 17, 2026
6a538be
Fixed system ambiguities with `update_border_radius`.
ickshonpe Sep 17, 2026
ed596f5
Updated release content
ickshonpe Sep 17, 2026
ed40a7c
updated release note
ickshonpe Sep 17, 2026
8e6ad4c
Fix release content formatting
ickshonpe Sep 17, 2026
11a14f2
Updated release note
ickshonpe Sep 17, 2026
114e22d
Updated `UiSurface` migration guide.
ickshonpe Sep 17, 2026
eafc177
Removed trailing space from UiSurface migration guide.
ickshonpe Sep 17, 2026
ff6a0ea
Fixed spelling.
ickshonpe Sep 17, 2026
a0022a2
Another migration guide edit.
ickshonpe Sep 17, 2026
8b5a677
Another migration guide edit.
ickshonpe Sep 17, 2026
b31cf54
Added `percentage_sizes_are_based_on_closest_non_ghost_ancestor` test.
ickshonpe Sep 17, 2026
6abd18c
added `percentage_sizes_are_updated_after_ghost_removal` test
ickshonpe Sep 17, 2026
7fa0f26
Added percentage_sizes_are_updated_after_intermediate_ghost_insertion…
ickshonpe Sep 17, 2026
f81d4be
Clear the `ComputedLayout` for each `GhostNode` after compute layout.
ickshonpe Sep 17, 2026
86f48b6
New test `adding_fixednode_clears_inherited_clipping`.
ickshonpe Sep 17, 2026
1ae6dac
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 17, 2026
dfbe602
Added test `adding_fixednode_updates_sibling`.
ickshonpe Sep 17, 2026
0af609b
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 17, 2026
0a766ba
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 17, 2026
cea3c8f
Added `adding_fixednode_updates_sibling_clipping` test (failing).
ickshonpe Sep 17, 2026
9b29360
don't skip if layout dirty in update_clipping
ickshonpe Sep 17, 2026
8dfe18f
Consolidated clipping skip conditions.
ickshonpe Sep 17, 2026
3429064
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 17, 2026
1a48fb1
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 17, 2026
70e122a
Fixed test imports
ickshonpe Sep 17, 2026
abe032a
Fix for consistant formatting lint.
ickshonpe Sep 17, 2026
bbc56ee
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 17, 2026
5e92a8e
removed failing test
ickshonpe Sep 17, 2026
10dc344
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 17, 2026
756cdcc
Added node_parented_to_empty_root_should_be_cleared test (failing).
ickshonpe Sep 17, 2026
3bf9251
Record reachability only on full walks.
ickshonpe Sep 17, 2026
5b882b7
Added note about `GhostNode`s being included in `UiStack` to the migr…
ickshonpe Sep 17, 2026
f3984ed
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 17, 2026
781a228
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 18, 2026
03e5cfd
More docs.
ickshonpe Sep 18, 2026
c884f20
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 18, 2026
aac53ef
More documentation.
ickshonpe Sep 18, 2026
489b917
Added doc comments for `ComputedLayout::is_layout_root`.
ickshonpe Sep 18, 2026
b7ef953
Added `SubtreeState` enum to replace the pair of `bool`s returned by …
ickshonpe Sep 18, 2026
89d4316
Added regression test `computed_node_is_unchanged_after_ui_transform_…
ickshonpe Sep 18, 2026
3292c67
Renamed `sync_runtime_layout_tree` to `sync_layout_tree` and added sh…
ickshonpe Sep 18, 2026
34d26f7
Some cleanup and consolidation for sync_layout_tree.
ickshonpe Sep 18, 2026
7a80ca6
Partially reverted previous commit, returned the `own_dirty` flag and…
ickshonpe Sep 18, 2026
5b01bbe
Set `SubtreeState::merge` `must_use`.
ickshonpe Sep 18, 2026
72e0b1d
Doc comment was a missing the word `be`, added it.
ickshonpe Sep 18, 2026
ad92dd6
Added another test `clipping_updates_skip_clean_subtrees` (fails).
ickshonpe Sep 18, 2026
c2ac6f2
In update_clipping only force updates on tree_changed if the node is …
ickshonpe Sep 18, 2026
a157a3f
Added more regression tests.
ickshonpe Sep 18, 2026
35688da
Added more regression tests.
ickshonpe Sep 18, 2026
346ffcf
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 18, 2026
bb99b5b
Removed doc comment about moving measures during as its no longer done.
ickshonpe Sep 18, 2026
f266c44
Removed `LayoutError`'s `TaffyError` variant, that is part of taffy's…
ickshonpe Sep 18, 2026
6561b28
Synchronises -> Synchronizes, CI wants US spelling
ickshonpe Sep 18, 2026
024c294
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 18, 2026
9bb3aa4
Removed the `Node::VIEWPORT` constant.
ickshonpe Sep 18, 2026
39121b3
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 18, 2026
15ec76a
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 18, 2026
e6d58c8
Removed incomplete comment
ickshonpe Sep 18, 2026
c4140c3
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 18, 2026
1a9b8a9
Added missing word to doc comments
ickshonpe Sep 18, 2026
e5fdedd
Removed three tests that were duplicated except for names during a me…
ickshonpe Sep 18, 2026
a7a8486
Added another regression test covering clipping.
ickshonpe Sep 18, 2026
f25a809
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 18, 2026
ae79d7c
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 18, 2026
977cd4e
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 18, 2026
fefb018
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 22, 2026
f4d8853
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 23, 2026
05256c7
Moved the tests into a separate submodule under layout.
ickshonpe Sep 23, 2026
eb24c92
Simplified `LayoutTree`'s lifetime parameters.
ickshonpe Sep 23, 2026
ce053e6
Updated comments for `ui_layout_tree`
ickshonpe Sep 23, 2026
819b030
Renamed `LayoutError::InvalidHierarchy` to `InvalidUiRoot`
ickshonpe Sep 23, 2026
cc07638
Renamed `layout_changed` to `layout_dirty`.
ickshonpe Sep 23, 2026
9795aff
Edited `GhostNode` doc comments.
ickshonpe Sep 23, 2026
9c70dfb
Added `rounding_is_updated_on_hierarchy_changes_even_if_unrounded_lay…
ickshonpe Sep 23, 2026
797e23a
Also reround layout if `needs_full_walk` set.
ickshonpe Sep 23, 2026
4a19cad
Added invalid UI root warning.
ickshonpe Sep 23, 2026
4fd2004
Code reformatting.
ickshonpe Sep 23, 2026
78b9aab
Added another FixedNode comment
ickshonpe Sep 23, 2026
51227fd
Added `update_ui_roots` system and `UiRoots` resource.
ickshonpe Sep 23, 2026
83c73b3
Added fixed node validation to `update_ui_roots`
ickshonpe Sep 23, 2026
56eee19
Added `UiRoots` and `update_ui_roots` to `UiPlugin. Replaced queries …
ickshonpe Sep 23, 2026
2081a03
Added `UiRoots` and `uipdate_ui_roots` to UI test app.
ickshonpe Sep 23, 2026
d8a828b
Need to track ghost roots as well for geometry updates
ickshonpe Sep 23, 2026
c9565a2
Clear all_roots in UiRoots::Clear
ickshonpe Sep 23, 2026
ad68e6f
`FixedNode`s changed again, a `FixedNode` with all `GhostNode` ancest…
ickshonpe Sep 23, 2026
a1191d3
Added regression test `display_none_on_a_ghost_node_is_ignored`.
ickshonpe Sep 23, 2026
079dc74
Merge branch 'incremental-ui-layout-uiroots' into incremental-ui-layout
ickshonpe Sep 23, 2026
b06db95
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 23, 2026
ff89179
Use `UiRoots` in clipping.
ickshonpe Sep 23, 2026
6231bd4
Cleaned up UiRoots docs and renamed fields for clarity.
ickshonpe Sep 23, 2026
f606b57
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 23, 2026
86e8cf3
Doc comment edit
ickshonpe Sep 23, 2026
5fa0a31
Fixes for CI.
ickshonpe Sep 23, 2026
e5fc046
renamings "unparented*" -> "parentless*"
ickshonpe Sep 23, 2026
a29a373
Added doc comments for UI roots
ickshonpe Sep 24, 2026
d5f36eb
Moved update_clipping_system into new Clipping SystemSet
ickshonpe Sep 24, 2026
03b18f3
New system set `UiSystems::Adjustment`. Between `Layout` and `Clippin…
ickshonpe Sep 24, 2026
cd43189
Moved update_scrollbar_thumb into `Adjustment`.
ickshonpe Sep 24, 2026
6061f11
Removed unused
ickshonpe Sep 24, 2026
aed3c6f
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 24, 2026
7ba9c57
moved `update_ui_roots` into `Layout`
ickshonpe Sep 24, 2026
c15628e
Removed unused `root_stack` param from `ui_layout_system`.
ickshonpe Sep 24, 2026
c61a162
moved `update_scrollbar_visibility` to `PostLayout`.
ickshonpe Sep 24, 2026
9bdae52
Merge branch 'main' of https://github.com/ickshonpe/bevy into increme…
ickshonpe Sep 24, 2026
dbce072
Fix schedule conflicts
ickshonpe Sep 24, 2026
a09114e
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 25, 2026
b570f23
Removed `Adjustment` system set changes as gratuitous.
ickshonpe Sep 25, 2026
ddb550b
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 27, 2026
dc5e8c9
Removed trailing whitespace
ickshonpe Sep 27, 2026
92bee68
Reverted sync_editable_text_viewports schedule changes
ickshonpe Sep 27, 2026
78ebf06
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 28, 2026
84fb033
Fixed remaining system ambiguity by ordering `sync_editable_text_view…
ickshonpe Sep 28, 2026
60ccd77
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 28, 2026
07fd0cb
Added `With<Node>` to the children changed query in ui_layout_system.…
ickshonpe Sep 29, 2026
f5c971a
Collect FixedNode changes into an EntityHashSet instead of a Vec duri…
ickshonpe Sep 29, 2026
2df629d
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 29, 2026
d716366
Merge branch 'main' into incremental-ui-updates
ickshonpe Sep 29, 2026
ad47db1
Removed the outer `Or` from `tree_changed_query`, this was added by m…
ickshonpe Sep 30, 2026
f598229
Merge branch 'incremental-ui-updates' of https://github.com/ickshonpe…
ickshonpe Sep 30, 2026
94f5e45
Added regression test checking that unchanged are nodes not updated.
ickshonpe Sep 30, 2026
64208bb
Added test `root_ghost_resolve_precentage_translations_based_on_targe…
ickshonpe Sep 30, 2026
a732b14
Updated root_ghostnode_transform_persists_after_updates test.
ickshonpe Sep 30, 2026
65d4ae5
Merge branch 'main' into incremental-ui-layout
ickshonpe Sep 30, 2026
ace53b2
fixed typo
ickshonpe Oct 1, 2026
fc10181
Merge branch 'main' into incremental-ui-layout
ickshonpe Oct 1, 2026
9470c33
update bevy_ui bench
ickshonpe Oct 1, 2026
0f2a4ed
Merge branch 'main' into incremental-ui-layout
ickshonpe Oct 6, 2026
e0aa420
Added more doc comments for `update_clipping_system`.
ickshonpe Oct 6, 2026
7512a78
Made corrections to the ghost nodes migration guide.
ickshonpe Oct 6, 2026
6bbed99
Correct `ui_layout_system`'s doc comments.
ickshonpe Oct 6, 2026
8fdd8ce
More doc comments, rearranged order of system functions in layout to …
ickshonpe Oct 6, 2026
3024f70
Renamed `geometry_roots` to `transform_roots`
ickshonpe Oct 6, 2026
fe33580
Added migration guide for `ui_layout_system` split.
ickshonpe Oct 6, 2026
245f7dc
Changed print_ui_layout_tree to take an &World parameter instead of b…
ickshonpe Oct 6, 2026
0839b63
Use `UiRoots` to simplify `print_ui_layout_tree` and removed the quer…
ickshonpe Oct 6, 2026
6e9673a
Removed incomplete doc comment, updated `UiSurface` migration guide.
ickshonpe Oct 6, 2026
f5f9a15
Update `ComputedNode` docs
ickshonpe Oct 6, 2026
bb35122
updated incorrect doc links
ickshonpe Oct 6, 2026
d9279f5
Updated another doc link
ickshonpe Oct 6, 2026
0f00ec7
Add proper doc links
ickshonpe Oct 6, 2026
7dc5ae2
Correction for `NodeMeasure`'s doc comments.
ickshonpe Oct 6, 2026
92e775a
Fixed mistake in comments, "override" should be "overflow".
ickshonpe Oct 6, 2026
a1b00c1
Fixed comments for `GhostNode` percentage resolution, should be neare…
ickshonpe Oct 6, 2026
1ee3204
Updated UiSystems doc comments
ickshonpe Oct 6, 2026
2460110
Fix another schedule comment
ickshonpe Oct 6, 2026
d34631d
Fix comment its UiTreeDirty, not UiDirtyTree.
ickshonpe Oct 6, 2026
4b81386
In `ComputedLayout` clear all the `has_*` component present flags as …
ickshonpe Oct 6, 2026
77fc97e
GhostNode migration guide and comment updates and clarifications.
ickshonpe Oct 6, 2026
5111a63
Should be "nodes" not "node" in UiRoots comment.
ickshonpe Oct 6, 2026
288780a
Clarify `get_layout`'s doc comment.
ickshonpe Oct 6, 2026
91e3745
Removed trailing whitespace.
ickshonpe Oct 6, 2026
aad0d87
Updated `UiTreeDirty` doc comments
ickshonpe Oct 6, 2026
cc8d6d3
Fixed more typos.
ickshonpe Oct 6, 2026
7310d33
Merge branch 'main' into incremental-ui-layout
ickshonpe Oct 6, 2026
f8ccf81
Markdown fixes for release content
ickshonpe Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -729,9 +729,6 @@ reflect_auto_register_static = ["bevy_internal/reflect_auto_register_static"]
# Enable winit custom cursor support
custom_cursor = ["bevy_internal/custom_cursor"]

# Experimental support for nodes that are ignored for UI layouting
ghost_nodes = ["bevy_internal/ghost_nodes"]

# Uses `async-executor` as a task execution backend.
async_executor = ["std", "bevy_internal/async_executor"]

Expand Down Expand Up @@ -4170,7 +4167,6 @@ wasm = true
name = "ghost_nodes"
path = "examples/ui/layout/ghost_nodes.rs"
doc-scrape-examples = true
required-features = ["ghost_nodes"]

[package.metadata.example.ghost_nodes]
name = "Ghost Nodes"
Expand Down
14 changes: 14 additions & 0 deletions _release-content/migration-guides/ghostnodes_reimplementation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
title: "`GhostNode` reimplementation"
pull_requests: [25653]
---

The `ghost_nodes` feature gate has been removed. The `experimental` module and its `ghost_nodes` submodule have been removed.

`GhostNode`s are now always enabled, in the UI prelude, require `Node` and act more like regular UI nodes. The `UiChildren` and `UiRootNodes` system parameters have been removed.

During layout updates a `GhostNode` is replaced by its children recursively, so that its nearest non-ghost descendants become children of its nearest non-ghost ancestor. The `GhostNode` entity itself is set to zero-size. `UiTransform` is propagated through `GhostNode`s normally, except that for percentage translations the closest non-ghost ancestor's base size is used. Otherwise, since GhostNodes always have a size of zero, percentage translations would always resolve to zero.

`GhostNode` transitively requires `ComputedStackIndex`, so `GhostNode`s are included in the `UiStack`, which will shift the stack indices of existing UI layouts.

If a UI node has both the `GhostNode` and `FixedNode` components, `FixedNode` is ignored.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "`Measure` and `NodeMeasure` changes"
pull_requests: [25653]
---

Previously, `NodeMeasure`s were moved out of the `ContentSize` components during layout. Now they are accessed directly by querying for `Ref<ContentSize>`.

As a result, the receiver for the `Measure` trait and its implementation for `NodeMeasure` no longer needs to be mutable, instead `&self` is sufficient.
8 changes: 8 additions & 0 deletions _release-content/migration-guides/removed_uisurface.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "Removed the `UiSurface` resource and `ui_surface` module."
pull_requests: [25653]
---

Instead of maintaining a separate `TaffyTree` in the `UiSurface` resource, `bevy_ui` now has a new `UiLayoutTree` adapter that allows Taffy to access the ECS component data directly. As a consequence, `UiSurface` is no longer needed and it has been removed, along with the `ui_surface` module.

`print_ui_layout_tree` now takes a `&World` instead of a `&UiSurface`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: "`ui_layout_system` has been split up."
pull_requests: [25653]
---

`ui_layout_system` has been split into `update_ui_roots`, `sync_taffy_styles_with_nodes`, `mark_dirty_ui_trees`, `ui_layout_system`, `update_computed_nodes` and `update_border_radius`.

Code that was ordered against `ui_layout_system` should be ordered against the `UiSystems::Layout` system set instead.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: Incremental UI layout updates
authors: ["@ickshonpe"]
pull_requests: [25653]
---

UI layout has been reimplemented so that updates are more incremental. Instead of maintaining a separate `TaffyTree` in `UiSurface`, the new `UiLayoutTree` adapter allows Taffy to access the ECS component data directly. The layout geometry in `ComputedNode` is now updated only in response to changes in the input layout data.
22 changes: 17 additions & 5 deletions benches/benches/bevy_ui/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,18 @@ use bevy_ecs::schedule::IntoScheduleConfigs;
use bevy_ecs::utils::default;
use bevy_ecs::world::World;
use bevy_text::FontCx;
use bevy_ui::clear_transient_dirty_flags;
use bevy_ui::clipping::update_clipping_system;
use bevy_ui::mark_dirty_ui_trees;
use bevy_ui::prelude::*;
use bevy_ui::sync_font_size_to_em_size;
use bevy_ui::sync_taffy_styles_with_nodes;
use bevy_ui::ui_layout_system;
use bevy_ui::ui_surface::UiSurface;
use bevy_ui::update::propagate_ui_target_cameras;
use bevy_ui::update::update_clipping_system;
use bevy_ui::update_border_radius;
use bevy_ui::update_computed_nodes;
use bevy_ui::update_ui_roots;
use bevy_ui::UiRoots;
use criterion::criterion_group;
use criterion::BenchmarkId;
use criterion::Criterion;
Expand Down Expand Up @@ -80,15 +86,21 @@ fn setup_app() -> App {
PostUpdate,
))
.init_resource::<UiScale>()
.init_resource::<UiSurface>()
.init_resource::<UiRoots>()
.init_resource::<FontCx>()
.init_resource::<RemSize>()
.add_systems(
PostUpdate,
(
propagate_ui_target_cameras,
clear_transient_dirty_flags,
update_ui_roots,
sync_font_size_to_em_size,
sync_taffy_styles_with_nodes,
mark_dirty_ui_trees,
ui_layout_system,
update_computed_nodes,
update_border_radius,
update_clipping_system,
)
.chain(),
Expand All @@ -97,13 +109,13 @@ fn setup_app() -> App {
PostUpdate,
PropagateSet::<ComputedUiTargetCamera>::default()
.after(propagate_ui_target_cameras)
.before(ui_layout_system),
.before(sync_font_size_to_em_size),
)
.configure_sets(
PostUpdate,
PropagateSet::<ComputedUiRenderTargetInfo>::default()
.after(propagate_ui_target_cameras)
.before(ui_layout_system),
.before(sync_font_size_to_em_size),
);

let size = UVec2::new(10000, 10000);
Expand Down
3 changes: 1 addition & 2 deletions crates/bevy_feathers/src/controls/scrollbar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,7 @@ impl Plugin for ScrollbarPlugin {
app.add_systems(
PostUpdate,
update_scrollbar_visibility
.after(UiSystems::Layout)
.before(UiSystems::Clipping)
.in_set(UiSystems::PostLayout)
.ambiguous_with(TransformGizmoRenderStep),
);
}
Expand Down
3 changes: 0 additions & 3 deletions crates/bevy_internal/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -425,9 +425,6 @@ custom_cursor = [
"bevy_picking/custom_cursor",
]

# Experimental support for nodes that are ignored for UI layouting
ghost_nodes = ["bevy_ui/ghost_nodes"]

# Allows access to the `std` crate. Enabling this feature will prevent compilation
# on `no_std` targets, but provides access to certain additional features on
# supported platforms.
Expand Down
4 changes: 2 additions & 2 deletions crates/bevy_internal/src/default_plugins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,12 @@ impl Plugin for IgnoreAmbiguitiesPlugin {
app.ignore_ambiguity(
bevy_app::PostUpdate,
bevy_animation::advance_animations,
bevy_ui::ui_layout_system,
bevy_ui::UiSystems::Layout,
);
app.ignore_ambiguity(
bevy_app::PostUpdate,
bevy_animation::animate_targets,
bevy_ui::ui_layout_system,
bevy_ui::UiSystems::Layout,
);
}
}
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_text/src/pipeline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ pub struct TextMeasureInfo {
impl TextMeasureInfo {
/// Computes the size of the text area within the provided bounds.
pub fn compute_size(
&mut self,
&self,
bounds: TextBounds,
computed: &mut ComputedTextBlock,
_font_system: &mut FontCx,
Expand Down
1 change: 0 additions & 1 deletion crates/bevy_text/src/text_access.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ impl<'w, 's, R: TextSection> TextReader<'w, 's, R> {
///
/// Iterates all spans in a text block according to hierarchy traversal order.
/// Does *not* flatten interspersed ghost nodes. Only contiguous spans are traversed.
// TODO: Use this iterator design in UiChildrenIter to reduce allocations.
pub struct TextSpanIter<'a, R: TextSection> {
scratch: &'a mut TextIterScratch,
inline_boxes: &'a Query<'a, 'a, &'static InlineBox>,
Expand Down
4 changes: 0 additions & 4 deletions crates/bevy_ui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ taffy = { version = "0.14", default-features = false, features = [
"flexbox",
"grid",
"content_size",
"taffy_tree",
] }
serde = { version = "1", features = ["derive"], optional = true }
uuid = { version = "1.21.0", features = ["v4"], optional = true }
Expand All @@ -68,9 +67,6 @@ serialize = [
]
bevy_picking = ["dep:bevy_picking", "dep:uuid"]

# Experimental features
ghost_nodes = []

[lints]
workspace = true

Expand Down
17 changes: 11 additions & 6 deletions crates/bevy_ui/src/accessibility.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
)]
use crate::prelude::Button;
use crate::{
experimental::UiChildren,
prelude::Label,
ui_transform::UiGlobalTransform,
widget::{ImageNode, TextUiReader},
Expand All @@ -15,7 +14,7 @@ use bevy_app::{App, Plugin, PostUpdate};
use bevy_ecs::{
change_detection::DetectChanges,
component::Component,
hierarchy::ChildOf,
hierarchy::{ChildOf, Children},
lifecycle::HookContext,
prelude::Entity,
query::{Changed, With, Without},
Expand Down Expand Up @@ -98,11 +97,14 @@ fn sync_bounds_and_transforms(
fn button_changed(
mut commands: Commands,
mut query: Query<(Entity, Option<&mut AccessibilityNode>), Changed<Button>>,
ui_children: UiChildren,
ui_children: Query<&Children, With<crate::Node>>,
mut text_reader: TextUiReader,
) {
for (entity, accessible) in &mut query {
let label = calc_label(&mut text_reader, ui_children.iter_ui_children(entity));
let label = calc_label(
&mut text_reader,
ui_children.get(entity).into_iter().flatten().copied(),
);
if let Some(mut accessible) = accessible {
accessible.set_role(Role::Button);
if let Some(name) = label {
Expand Down Expand Up @@ -132,11 +134,14 @@ fn image_changed(
(Entity, Option<&mut AccessibilityNode>),
(Changed<ImageNode>, Without<Button>),
>,
ui_children: UiChildren,
ui_children: Query<&Children, With<crate::Node>>,
mut text_reader: TextUiReader,
) {
for (entity, accessible) in &mut query {
let label = calc_label(&mut text_reader, ui_children.iter_ui_children(entity));
let label = calc_label(
&mut text_reader,
ui_children.get(entity).into_iter().flatten().copied(),
);
if let Some(mut accessible) = accessible {
accessible.set_role(Role::Image);
if let Some(label) = label {
Expand Down
Loading
Loading