Make default behavior for BackgroundColor and BorderColor more intuitive#14017
Merged
alice-i-cecile merged 13 commits intobevyengine:mainfrom Jun 25, 2024
Merged
Conversation
pablo-lua
reviewed
Jun 25, 2024
benfrankel
reviewed
Jun 25, 2024
pablo-lua
approved these changes
Jun 25, 2024
Contributor
pablo-lua
left a comment
There was a problem hiding this comment.
I think we can follow up with that to the next release, LGTM
benfrankel
suggested changes
Jun 25, 2024
Contributor
benfrankel
left a comment
There was a problem hiding this comment.
Small nits. Approved other than that.
eidloi
reviewed
Jun 25, 2024
| /// | ||
| /// Like [`Handle<Image>::default`], this is a handle to a fallaback image asset. | ||
| /// While that handle points to an opaque white 1 x 1 image, this handle points to a 1 x 1 transparent white image. | ||
| // Number randomly selected by fair WolframAlpha query. Totally arbitrary. |
eidloi
approved these changes
Jun 25, 2024
eidloi
left a comment
There was a problem hiding this comment.
Yeah this is a lot more elegant! Thanks!
| pub fn transparent() -> Image { | ||
| // We rely on the default texture format being RGBA8UnormSrgb | ||
| // when constructing a transparent color from bytes. | ||
| // If this changes, this function will need to be updated. |
There was a problem hiding this comment.
How will we find out? Will it fail to compile?
Member
Author
There was a problem hiding this comment.
This will panic when the examples are run :)
alice-i-cecile
commented
Jun 25, 2024
mockersf
pushed a commit
that referenced
this pull request
Jun 25, 2024
…tuitive (#14017) # Objective In Bevy 0.13, `BackgroundColor` simply tinted the image of any `UiImage`. This was confusing: in every other case (e.g. Text), this added a solid square behind the element. #11165 changed this, but removed `BackgroundColor` from `ImageBundle` to avoid confusion, since the semantic meaning had changed. However, this resulted in a serious UX downgrade / inconsistency, as this behavior was no longer part of the bundle (unlike for `TextBundle` or `NodeBundle`), leaving users with a relatively frustrating upgrade path. Additionally, adding both `BackgroundColor` and `UiImage` resulted in a bizarre effect, where the background color was seemingly ignored as it was covered by a solid white placeholder image. Fixes #13969. ## Solution Per @viridia's design: > - if you don't specify a background color, it's transparent. > - if you don't specify an image color, it's white (because it's a multiplier). > - if you don't specify an image, no image is drawn. > - if you specify both a background color and an image color, they are independent. > - the background color is drawn behind the image (in whatever pixels are transparent) As laid out by @benfrankel, this involves: 1. Changing the default `UiImage` to use a transparent texture but a pure white tint. 2. Adding `UiImage::solid_color` to quickly set placeholder images. 3. Changing the default `BorderColor` and `BackgroundColor` to transparent. 4. Removing the default overrides for these values in the other assorted UI bundles. 5. Adding `BackgroundColor` back to `ImageBundle` and `ButtonBundle`. 6. Adding a 1x1 `Image::transparent`, which can be accessed from `Assets<Image>` via the `TRANSPARENT_IMAGE_HANDLE` constant. Huge thanks to everyone who helped out with the design in the linked issue and [the Discord thread](https://discord.com/channels/691052431525675048/1255209923890118697/1255209999278280844): this was very much a joint design. @cart helped me figure out how to set the UiImage's default texture to a transparent 1x1 image, which is a much nicer fix. ## Testing I've checked the examples modified by this PR, and the `ui` example as well just to be sure. ## Migration Guide - `BackgroundColor` no longer tints the color of images in `ImageBundle` or `ButtonBundle`. Set `UiImage::color` to tint images instead. - The default texture for `UiImage` is now a transparent white square. Use `UiImage::solid_color` to quickly draw debug images. - The default value for `BackgroundColor` and `BorderColor` is now transparent. Set the color to white manually to return to previous behavior.
lufog
reviewed
Jul 1, 2024
github-merge-queue bot
pushed a commit
that referenced
this pull request
Jul 3, 2024
# Objective - After #14017 , I noticed that the drawcall increased 10x in the `many_buttons`, causing the `UIPassNode `to increase from 1.5ms to 6ms. This is because our UI batching is very fragile. ## Solution - skip extract UiImage when its texture is default ## Performance many_buttons UiPassNode 
zmbush
pushed a commit
to zmbush/bevy
that referenced
this pull request
Jul 3, 2024
# Objective - After bevyengine#14017 , I noticed that the drawcall increased 10x in the `many_buttons`, causing the `UIPassNode `to increase from 1.5ms to 6ms. This is because our UI batching is very fragile. ## Solution - skip extract UiImage when its texture is default ## Performance many_buttons UiPassNode 
MrGVSV
pushed a commit
to MrGVSV/bevy
that referenced
this pull request
Jul 5, 2024
# Objective - After bevyengine#14017 , I noticed that the drawcall increased 10x in the `many_buttons`, causing the `UIPassNode `to increase from 1.5ms to 6ms. This is because our UI batching is very fragile. ## Solution - skip extract UiImage when its texture is default ## Performance many_buttons UiPassNode 
AmonDeShir
added a commit
to AmonDeShir/tomt_bevycss
that referenced
this pull request
Sep 18, 2024
- Fixed an error where the application failed to load a CSS asset, resulting in the error:
`tomt_bevycss::system: Failed to load stylesheet from handle StrongHandle<StyleSheetAsset>{ id: Index(AssetIndex { generation: 0, index: 0 }), path: Some(sheets/index.css) }`.
The issue was related to the loading order of systems. Moving the entire schedule right after the update phase resolved the problem.
- Make hot reload enabled when Bevy has the file_watcher feature enabled.
- Updated the alpha demo: due to commit bevyengine/bevy#14017, an image can now have a BackgroundColor. The fix ensures alpha is adjusted based on the component combination: if an entity has a UIImage component, the alpha is set on it; if not, the BackgroundColor component is updated.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Objective
In Bevy 0.13,
BackgroundColorsimply tinted the image of anyUiImage. This was confusing: in every other case (e.g. Text), this added a solid square behind the element. #11165 changed this, but removedBackgroundColorfromImageBundleto avoid confusion, since the semantic meaning had changed.However, this resulted in a serious UX downgrade / inconsistency, as this behavior was no longer part of the bundle (unlike for
TextBundleorNodeBundle), leaving users with a relatively frustrating upgrade path.Additionally, adding both
BackgroundColorandUiImageresulted in a bizarre effect, where the background color was seemingly ignored as it was covered by a solid white placeholder image.Fixes #13969.
Solution
Per @viridia's design:
As laid out by @benfrankel, this involves:
UiImageto use a transparent texture but a pure white tint.UiImage::solid_colorto quickly set placeholder images.BorderColorandBackgroundColorto transparent.BackgroundColorback toImageBundleandButtonBundle.Image::transparent, which can be accessed fromAssets<Image>via theTRANSPARENT_IMAGE_HANDLEconstant.Huge thanks to everyone who helped out with the design in the linked issue and the Discord thread: this was very much a joint design.
@cart helped me figure out how to set the UiImage's default texture to a transparent 1x1 image, which is a much nicer fix.
Testing
I've checked the examples modified by this PR, and the
uiexample as well just to be sure.Migration Guide
BackgroundColorno longer tints the color of images inImageBundleorButtonBundle. SetUiImage::colorto tint images instead.UiImageis now a transparent white square. UseUiImage::solid_colorto quickly draw debug images.BackgroundColorandBorderColoris now transparent. Set the color to white manually to return to previous behavior.