Skip to content

Commit 8d143e3

Browse files
authored
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).
1 parent f326705 commit 8d143e3

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

crates/bevy_ui/src/render/ui_material_pipeline.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use bevy_ecs::{
88
system::lifetimeless::{Read, SRes},
99
system::*,
1010
};
11+
use bevy_hierarchy::Parent;
1112
use bevy_math::{FloatOrd, Mat4, Rect, Vec2, Vec4Swizzles};
1213
use bevy_render::{
1314
extract_component::ExtractComponentPlugin,
@@ -352,6 +353,7 @@ impl<M: UiMaterial> Default for ExtractedUiMaterialNodes<M> {
352353
}
353354
}
354355

356+
#[allow(clippy::too_many_arguments)]
355357
pub fn extract_ui_material_nodes<M: UiMaterial>(
356358
mut extracted_uinodes: ResMut<ExtractedUiMaterialNodes<M>>,
357359
materials: Extract<Res<Assets<M>>>,
@@ -367,12 +369,14 @@ pub fn extract_ui_material_nodes<M: UiMaterial>(
367369
&ViewVisibility,
368370
Option<&CalculatedClip>,
369371
Option<&TargetCamera>,
372+
Option<&Parent>,
370373
),
371374
Without<BackgroundColor>,
372375
>,
373376
>,
374377
windows: Extract<Query<&Window, With<PrimaryWindow>>>,
375378
ui_scale: Extract<Res<UiScale>>,
379+
node_query: Extract<Query<&Node>>,
376380
) {
377381
let ui_logical_viewport_size = windows
378382
.get_single()
@@ -385,7 +389,7 @@ pub fn extract_ui_material_nodes<M: UiMaterial>(
385389
// If there is only one camera, we use it as default
386390
let default_single_camera = default_ui_camera.get();
387391

388-
for (entity, uinode, style, transform, handle, view_visibility, clip, camera) in
392+
for (entity, uinode, style, transform, handle, view_visibility, clip, camera, maybe_parent) in
389393
uinode_query.iter()
390394
{
391395
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>(
404408

405409
// Both vertical and horizontal percentage border values are calculated based on the width of the parent node
406410
// <https://developer.mozilla.org/en-US/docs/Web/CSS/border-width>
407-
let parent_width = uinode.size().x;
411+
let parent_width = maybe_parent
412+
.and_then(|parent| node_query.get(parent.get()).ok())
413+
.map(|parent_node| parent_node.size().x)
414+
.unwrap_or(ui_logical_viewport_size.x);
415+
408416
let left =
409417
resolve_border_thickness(style.border.left, parent_width, ui_logical_viewport_size)
410418
/ uinode.size().x;

0 commit comments

Comments
 (0)