-
-
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
Make default behavior for BackgroundColor
and BorderColor
more intuitive
#14017
Make default behavior for BackgroundColor
and BorderColor
more intuitive
#14017
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.
works for me!
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.
The examples that were updated to use UiImage::color
as a solid background for buttons should be reverted back to BackgroundColor
to be more idiomatic. This isn't blocking 0.14 release though, so it can be a separate PR.
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 think we can follow up with that to the next release, 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.
Small nits. Approved other than that.
/// | ||
/// 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. |
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.
better than a fair dice roll (xkcd)!
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.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How will we find out? Will it fail to compile?
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.
This will panic when the examples are run :)
…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.
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.
# 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 
# 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 
# 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 
- 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.
Objective
In Bevy 0.13,
BackgroundColor
simply 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 removedBackgroundColor
fromImageBundle
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
orNodeBundle
), leaving users with a relatively frustrating upgrade path.Additionally, adding both
BackgroundColor
andUiImage
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:
As laid out by @benfrankel, this involves:
UiImage
to use a transparent texture but a pure white tint.UiImage::solid_color
to quickly set placeholder images.BorderColor
andBackgroundColor
to transparent.BackgroundColor
back toImageBundle
andButtonBundle
.Image::transparent
, which can be accessed fromAssets<Image>
via theTRANSPARENT_IMAGE_HANDLE
constant.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
ui
example as well just to be sure.Migration Guide
BackgroundColor
no longer tints the color of images inImageBundle
orButtonBundle
. SetUiImage::color
to tint images instead.UiImage
is now a transparent white square. UseUiImage::solid_color
to quickly draw debug images.BackgroundColor
andBorderColor
is now transparent. Set the color to white manually to return to previous behavior.