bevy/crates
Alice Cecile 82f01569e8
Make default behavior for BackgroundColor and BorderColor more intuitive (#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.
2024-06-26 00:16:30 +02:00
..
bevy_a11y Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_animation Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_app feat(bevy_app): expose an API to perform updates for a specific sub-app. (#14009) 2024-06-26 00:13:24 +02:00
bevy_asset Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_audio Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_color Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_core Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_core_pipeline Fix meshlet interactions with regular shading passes (#13816) 2024-06-21 21:32:33 +02:00
bevy_derive Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_dev_tools Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_diagnostic Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_dylib Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_dynamic_plugin Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_ecs Don't show .to_bits in Display impl for Entity (#14011) 2024-06-26 00:16:22 +02:00
bevy_encase_derive Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_gilrs Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_gizmos Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_gltf Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_hierarchy Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_input Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_internal Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_log Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_macro_utils Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_math Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_mikktspace Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_pbr Fix MeshletMesh material system ordering (#14016) 2024-06-26 00:16:22 +02:00
bevy_ptr Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_reflect Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_render Make default behavior for BackgroundColor and BorderColor more intuitive (#14017) 2024-06-26 00:16:30 +02:00
bevy_scene Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_sprite bug: Fix 9-slice textures with asymmetric borders. (#13921) 2024-06-21 19:36:48 +02:00
bevy_state Move StateTransitionSteps registration to states plugin (#13939) 2024-06-21 19:36:48 +02:00
bevy_tasks Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_text Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_time Make time_system public (#13879) 2024-06-19 04:14:58 +02:00
bevy_transform Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_ui Make default behavior for BackgroundColor and BorderColor more intuitive (#14017) 2024-06-26 00:16:30 +02:00
bevy_utils Release Candidate 0.14.0-rc.3 2024-06-16 17:50:19 +02:00
bevy_window apply window scale to window size when creating it (#13967) 2024-06-21 20:27:55 +02:00
bevy_winit apply window scale to window size when creating it (#13967) 2024-06-21 20:27:55 +02:00