ui material node border calculations fix (#15119)
# Objective Fixes #15115 ## Solution Retrieve the size of the node's parent in a separate query and base percentage border values on the parent node's width (or the width of the viewport in the case of root nodes).
This commit is contained in:
parent
f326705cab
commit
8d143e3ed8
@ -8,6 +8,7 @@ use bevy_ecs::{
|
|||||||
system::lifetimeless::{Read, SRes},
|
system::lifetimeless::{Read, SRes},
|
||||||
system::*,
|
system::*,
|
||||||
};
|
};
|
||||||
|
use bevy_hierarchy::Parent;
|
||||||
use bevy_math::{FloatOrd, Mat4, Rect, Vec2, Vec4Swizzles};
|
use bevy_math::{FloatOrd, Mat4, Rect, Vec2, Vec4Swizzles};
|
||||||
use bevy_render::{
|
use bevy_render::{
|
||||||
extract_component::ExtractComponentPlugin,
|
extract_component::ExtractComponentPlugin,
|
||||||
@ -352,6 +353,7 @@ impl<M: UiMaterial> Default for ExtractedUiMaterialNodes<M> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
pub fn extract_ui_material_nodes<M: UiMaterial>(
|
pub fn extract_ui_material_nodes<M: UiMaterial>(
|
||||||
mut extracted_uinodes: ResMut<ExtractedUiMaterialNodes<M>>,
|
mut extracted_uinodes: ResMut<ExtractedUiMaterialNodes<M>>,
|
||||||
materials: Extract<Res<Assets<M>>>,
|
materials: Extract<Res<Assets<M>>>,
|
||||||
@ -367,12 +369,14 @@ pub fn extract_ui_material_nodes<M: UiMaterial>(
|
|||||||
&ViewVisibility,
|
&ViewVisibility,
|
||||||
Option<&CalculatedClip>,
|
Option<&CalculatedClip>,
|
||||||
Option<&TargetCamera>,
|
Option<&TargetCamera>,
|
||||||
|
Option<&Parent>,
|
||||||
),
|
),
|
||||||
Without<BackgroundColor>,
|
Without<BackgroundColor>,
|
||||||
>,
|
>,
|
||||||
>,
|
>,
|
||||||
windows: Extract<Query<&Window, With<PrimaryWindow>>>,
|
windows: Extract<Query<&Window, With<PrimaryWindow>>>,
|
||||||
ui_scale: Extract<Res<UiScale>>,
|
ui_scale: Extract<Res<UiScale>>,
|
||||||
|
node_query: Extract<Query<&Node>>,
|
||||||
) {
|
) {
|
||||||
let ui_logical_viewport_size = windows
|
let ui_logical_viewport_size = windows
|
||||||
.get_single()
|
.get_single()
|
||||||
@ -385,7 +389,7 @@ pub fn extract_ui_material_nodes<M: UiMaterial>(
|
|||||||
// If there is only one camera, we use it as default
|
// If there is only one camera, we use it as default
|
||||||
let default_single_camera = default_ui_camera.get();
|
let default_single_camera = default_ui_camera.get();
|
||||||
|
|
||||||
for (entity, uinode, style, transform, handle, view_visibility, clip, camera) in
|
for (entity, uinode, style, transform, handle, view_visibility, clip, camera, maybe_parent) in
|
||||||
uinode_query.iter()
|
uinode_query.iter()
|
||||||
{
|
{
|
||||||
let Some(camera_entity) = camera.map(TargetCamera::entity).or(default_single_camera) else {
|
let Some(camera_entity) = camera.map(TargetCamera::entity).or(default_single_camera) else {
|
||||||
@ -404,7 +408,11 @@ pub fn extract_ui_material_nodes<M: UiMaterial>(
|
|||||||
|
|
||||||
// Both vertical and horizontal percentage border values are calculated based on the width of the parent node
|
// Both vertical and horizontal percentage border values are calculated based on the width of the parent node
|
||||||
// <https://developer.mozilla.org/en-US/docs/Web/CSS/border-width>
|
// <https://developer.mozilla.org/en-US/docs/Web/CSS/border-width>
|
||||||
let parent_width = uinode.size().x;
|
let parent_width = maybe_parent
|
||||||
|
.and_then(|parent| node_query.get(parent.get()).ok())
|
||||||
|
.map(|parent_node| parent_node.size().x)
|
||||||
|
.unwrap_or(ui_logical_viewport_size.x);
|
||||||
|
|
||||||
let left =
|
let left =
|
||||||
resolve_border_thickness(style.border.left, parent_width, ui_logical_viewport_size)
|
resolve_border_thickness(style.border.left, parent_width, ui_logical_viewport_size)
|
||||||
/ uinode.size().x;
|
/ uinode.size().x;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user