@@ -8,6 +8,7 @@ use bevy_ecs::{
88 system:: lifetimeless:: { Read , SRes } ,
99 system:: * ,
1010} ;
11+ use bevy_hierarchy:: Parent ;
1112use bevy_math:: { FloatOrd , Mat4 , Rect , Vec2 , Vec4Swizzles } ;
1213use 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) ]
355357pub 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