-
-
Notifications
You must be signed in to change notification settings - Fork 3.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Remove custom rounding #16097
Remove custom rounding #16097
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Makes sense to me
…/n` to `1 - 1/n` and now it passes. `ui_rounding_test` was failing after the layout rounding changes but I don't think this is a problem. It only fails at an extremely low scale factor (below ~0.14) but scale factors below 1 aren't common or particularly useful. Even if the node sizes are inaccurate, at that scale a lot of the detail is lost anyway.
|
Co-authored-by: Rob Parrett <robparrett@gmail.com>
@ickshonpe CI is failing on a related test: can you take a look? I suspect the test itself is wrong. |
Yep I'll fix it now |
crates/bevy_ui/src/layout/mod.rs
Outdated
@@ -351,12 +351,10 @@ with UI components as a child of an entity without UI components, your UI layout | |||
|
|||
absolute_location += layout_location; | |||
|
|||
let rounded_size = approx_round_layout_coords(absolute_location + layout_size) | |||
- approx_round_layout_coords(absolute_location); | |||
let rounded_size = (absolute_location + layout_size) - (absolute_location); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Parentheses are redundant
@ickshonpe CI failure is pointing out a real, if minor issue :) Ping me once it's resolved! |
Head branch was pushed to by a user without write access
…pdate_uinode_geometry_recursive`.
…/bevy into remove-custom-rounding
Couldn't decide what to say in the migration guide, so went back and worked out a really wretched method to retrieve the unrounded size from Taffy. I guess it's better this way though, there don't seem to be any problems anymore but it feels safer to stick with using the unrounded size for text. |
Fixed |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Small docs and/or quality request, then this LGTM :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I noticed a small inconsistency with unwrap vs expect in the tests, but other than that, still good.
|
||
let layout = ui_surface | ||
.get_layout(ui_node_entity) | ||
.expect("failed to get layout"); | ||
.expect("failed to get layout") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
expect()
here
let ui_surface = world.resource::<UiSurface>(); | ||
let layout = ui_surface.get_layout(ui_entity).unwrap(); | ||
let mut ui_surface = world.resource_mut::<UiSurface>(); | ||
let layout = ui_surface.get_layout(ui_entity).unwrap().0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unwrap()
here
# Objective Taffy added layout rounding a while ago but it had a couple of bugs and caused some problems with the fussy `ab_glyph` text implementation. So I disabled Taffy's builtin rounding and added some hacks ad hoc that fixed (some) of those issues. Since then though Taffy's rounding algorithm has improved while we've changed layout a lot and migrated to `cosmic-text` so those hacks don't help any more and in some cases cause significant problems. Also our rounding implementation only rounds to the nearest logical pixel, whereas Taffy rounds to the nearest physical pixel meaning it's much more accurate with high dpi displays. fixes #15197 ## Some examples of layout rounding errors visible in the UI examples These errors are much more obvious at high scale factor, you might not see any problems at a scale factor of 1. `cargo run --example text_wrap_debug` <img width="1000" alt="text_debug_gaps" src="https://github.com/user-attachments/assets/5a584016-b8e2-487b-8842-f0f359077391"> The narrow horizontal and vertical lines are gaps in the layout caused by errors in the coordinate rounding. `cargo run --example text_debug` <img width="1000" alt="text_debug" src="https://github.com/user-attachments/assets/a4b37c02-a2fd-441c-a7bd-cd7a1a72e7dd"> The two text blocks here are aligned right to the same boundary but in this screen shot you can see that the lower block is one pixel off to the left. Because the size of this text node changes between frames with the reported framerate the rounding errors cause it to jump left and right. ## Solution Remove all our custom rounding hacks and reenable Taffy's layout rounding. The gaps in the `text_wrap_debug` example are gone: <img width="1000" alt="text_wrap_debug_fix" src="https://github.com/user-attachments/assets/92d2dd97-30c6-4ac8-99f1-6d65358995a7"> This doesn't fix some of the gaps that occur between borders and content but they seem appear to be a rendering problem as they disappear with `UiAntiAlias::Off` set. ## Testing Run the examples as described above in the `Objective` section. With this PR the problems mentioned shouldn't appear. Also added an example in a separate PR #16096 `layout_rounding_debug` for identifying these issues. ## Migration Guide `UiSurface::get_layout` now also returns the final sizes before rounding. Call `.0` on the `Ok` result to get the previously returned `taffy::Layout` value. --------- Co-authored-by: Rob Parrett <robparrett@gmail.com>
Objective
Taffy added layout rounding a while ago but it had a couple of bugs and caused some problems with the fussy
ab_glyph
text implementation. So I disabled Taffy's builtin rounding and added some hacks ad hoc that fixed (some) of those issues. Since then though Taffy's rounding algorithm has improved while we've changed layout a lot and migrated tocosmic-text
so those hacks don't help any more and in some cases cause significant problems.Also our rounding implementation only rounds to the nearest logical pixel, whereas Taffy rounds to the nearest physical pixel meaning it's much more accurate with high dpi displays.
fixes #15197
Some examples of layout rounding errors visible in the UI examples
These errors are much more obvious at high scale factor, you might not see any problems at a scale factor of 1.
cargo run --example text_wrap_debug
The narrow horizontal and vertical lines are gaps in the layout caused by errors in the coordinate rounding.
cargo run --example text_debug
The two text blocks here are aligned right to the same boundary but in this screen shot you can see that the lower block is one pixel off to the left. Because the size of this text node changes between frames with the reported framerate the rounding errors cause it to jump left and right.
Solution
Remove all our custom rounding hacks and reenable Taffy's layout rounding.
The gaps in the

text_wrap_debug
example are gone:This doesn't fix some of the gaps that occur between borders and content but they seem appear to be a rendering problem as they disappear with
UiAntiAlias::Off
set.Testing
Run the examples as described above in the
Objective
section. With this PR the problems mentioned shouldn't appear.Also added an example in a separate PR #16096
layout_rounding_debug
for identifying these issues.Migration Guide
UiSurface::get_layout
now also returns the final sizes before rounding. Call.0
on theOk
result to get the previously returnedtaffy::Layout
value.