bevy/crates
Félix Lescaudey de Maneville ab16f5ed6a
UI Texture 9 slice (#11600)
> Follow up to #10588 
> Closes #11749 (Supersedes #11756)

Enable Texture slicing for the following UI nodes:
- `ImageBundle`
- `ButtonBundle`

<img width="739" alt="Screenshot 2024-01-29 at 13 57 43"
src="https://github.com/bevyengine/bevy/assets/26703856/37675681-74eb-4689-ab42-024310cf3134">

I also added a collection of `fantazy-ui-borders` from
[Kenney's](www.kenney.nl) assets, with the appropriate license (CC).
If it's a problem I can use the same textures as the `sprite_slice`
example

# Work done

Added the `ImageScaleMode` component to the targetted bundles, most of
the logic is directly reused from `bevy_sprite`.
The only additional internal component is the UI specific
`ComputedSlices`, which does the same thing as its spritee equivalent
but adapted to UI code.

Again the slicing is not compatible with `TextureAtlas`, it's something
I need to tackle more deeply in the future

# Fixes

* [x] I noticed that `TextureSlicer::compute_slices` could infinitely
loop if the border was larger that the image half extents, now an error
is triggered and the texture will fallback to being stretched
* [x] I noticed that when using small textures with very small *tiling*
options we could generate hundred of thousands of slices. Now I set a
minimum size of 1 pixel per slice, which is already ridiculously small,
and a warning will be sent at runtime when slice count goes above 1000
* [x] Sprite slicing with `flip_x` or `flip_y` would give incorrect
results, correct flipping is now supported to both sprites and ui image
nodes thanks to @odecay observation

# GPU Alternative

I create a separate branch attempting to implementing 9 slicing and
tiling directly through the `ui.wgsl` fragment shader. It works but
requires sending more data to the GPU:
- slice border
- tiling factors

And more importantly, the actual quad *scale* which is hard to put in
the shader with the current code, so that would be for a later iteration
2024-02-07 20:07:53 +00:00
..
bevy_a11y Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_animation Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_app Use TypeIdMap whenever possible (#11684) 2024-02-03 23:47:04 +00:00
bevy_asset Add ReflectKind (#11664) 2024-02-07 00:36:23 +00:00
bevy_audio Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_core Missing registrations (#11736) 2024-02-06 16:33:17 +00:00
bevy_core_pipeline Properly check for result when getting pipeline in Msaa (#11758) 2024-02-07 16:05:36 +00:00
bevy_derive Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_diagnostic Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_dylib Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_dynamic_plugin Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_ecs Typo in [ScheduleLabel] derive macro (#11764) 2024-02-07 20:06:40 +00:00
bevy_ecs_compile_fail_tests Deprecated Various Component Methods from Query and QueryState (#9920) 2024-02-04 01:01:59 +00:00
bevy_encase_derive Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_gilrs Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_gizmos fix(primitives): fix polygon gizmo rendering bug (#11699) 2024-02-05 15:09:49 +00:00
bevy_gltf Mesh insert indices (#11745) 2024-02-06 23:31:48 +00:00
bevy_hierarchy Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_input Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_internal Don't unconditionally enable bevy_render or bevy_assets if mutli-threaded feature is enabled (#11726) 2024-02-06 14:40:56 +00:00
bevy_log Update tracing-tracy requirement from 0.10.4 to 0.11.0 and tracy-client requirement from 0.16.4 to 0.17.0 (#11678) 2024-02-03 21:44:38 +00:00
bevy_macro_utils Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_macros_compile_fail_tests Standardize toml format with taplo (#10594) 2023-11-21 01:04:14 +00:00
bevy_math Implement Meshable for some 3D primitives (#11688) 2024-02-06 21:44:13 +00:00
bevy_mikktspace Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_pbr Don't try to create a uniform buffer for light probes if there are no views. (#11751) 2024-02-07 07:17:34 +00:00
bevy_ptr Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_reflect Add ReflectKind (#11664) 2024-02-07 00:36:23 +00:00
bevy_reflect_compile_fail_tests bevy_reflect: Type parameter bounds (#9046) 2024-01-28 16:24:03 +00:00
bevy_render Add ReflectKind (#11664) 2024-02-07 00:36:23 +00:00
bevy_scene Send SceneInstanceReady only once per scene (#11002) 2024-02-05 13:54:54 +00:00
bevy_sprite UI Texture 9 slice (#11600) 2024-02-07 20:07:53 +00:00
bevy_tasks Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_text Use warn_once where relevant instead of manually implementing a single warn check (#11693) 2024-02-05 21:05:43 +00:00
bevy_time Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_transform Inverse missing_docs logic (#11676) 2024-02-03 21:40:55 +00:00
bevy_ui UI Texture 9 slice (#11600) 2024-02-07 20:07:53 +00:00
bevy_utils Deprecating hashbrown reexports (#11721) 2024-02-06 18:04:46 +00:00
bevy_window Add name to bevy:🪟:Window (#7650) 2024-02-05 13:35:35 +00:00
bevy_winit Add name to bevy:🪟:Window (#7650) 2024-02-05 13:35:35 +00:00