@@ -93,7 +93,7 @@ pub fn ui_layout_system(
93
93
children_query : Query < ( Entity , Ref < Children > ) , With < Node > > ,
94
94
just_children_query : Query < & Children > ,
95
95
mut removed_components : UiLayoutSystemRemovedComponentParam ,
96
- mut node_transform_query : Query < ( & mut Node , & mut Transform ) > ,
96
+ mut node_transform_query : Query < ( & mut Node , & mut Transform , Option < & Outline > ) > ,
97
97
) {
98
98
struct CameraLayoutInfo {
99
99
size : UVec2 ,
@@ -232,6 +232,7 @@ pub fn ui_layout_system(
232
232
update_uinode_geometry_recursive (
233
233
* root,
234
234
& ui_surface,
235
+ None ,
235
236
& mut node_transform_query,
236
237
& just_children_query,
237
238
inverse_target_scale_factor,
@@ -244,13 +245,14 @@ pub fn ui_layout_system(
244
245
fn update_uinode_geometry_recursive (
245
246
entity : Entity ,
246
247
ui_surface : & UiSurface ,
247
- node_transform_query : & mut Query < ( & mut Node , & mut Transform ) > ,
248
+ root_size : Option < Vec2 > ,
249
+ node_transform_query : & mut Query < ( & mut Node , & mut Transform , Option < & Outline > ) > ,
248
250
children_query : & Query < & Children > ,
249
251
inverse_target_scale_factor : f32 ,
250
252
parent_size : Vec2 ,
251
253
mut absolute_location : Vec2 ,
252
254
) {
253
- if let Ok ( ( mut node, mut transform) ) = node_transform_query. get_mut ( entity) {
255
+ if let Ok ( ( mut node, mut transform, outline ) ) = node_transform_query. get_mut ( entity) {
254
256
let Ok ( layout) = ui_surface. get_layout ( entity) else {
255
257
return ;
256
258
} ;
@@ -272,14 +274,35 @@ pub fn ui_layout_system(
272
274
node. calculated_size = rounded_size;
273
275
node. unrounded_size = layout_size;
274
276
}
277
+
278
+ let viewport_size = root_size. unwrap_or ( node. calculated_size ) ;
279
+
280
+ if let Some ( outline) = outline {
281
+ // don't trigger change detection when only outlines are changed
282
+ let node = node. bypass_change_detection ( ) ;
283
+ node. outline_width = outline
284
+ . width
285
+ . resolve ( node. size ( ) . x , viewport_size)
286
+ . unwrap_or ( 0. )
287
+ . max ( 0. ) ;
288
+
289
+ node. outline_offset = outline
290
+ . offset
291
+ . resolve ( node. size ( ) . x , viewport_size)
292
+ . unwrap_or ( 0. )
293
+ . max ( 0. ) ;
294
+ }
295
+
275
296
if transform. translation . truncate ( ) != rounded_location {
276
297
transform. translation = rounded_location. extend ( 0. ) ;
277
298
}
299
+
278
300
if let Ok ( children) = children_query. get ( entity) {
279
301
for & child_uinode in children {
280
302
update_uinode_geometry_recursive (
281
303
child_uinode,
282
304
ui_surface,
305
+ Some ( viewport_size) ,
283
306
node_transform_query,
284
307
children_query,
285
308
inverse_target_scale_factor,
@@ -292,34 +315,6 @@ pub fn ui_layout_system(
292
315
}
293
316
}
294
317
295
- /// Resolve and update the widths of Node outlines
296
- pub fn resolve_outlines_system (
297
- primary_window : Query < & Window , With < PrimaryWindow > > ,
298
- ui_scale : Res < UiScale > ,
299
- mut outlines_query : Query < ( & Outline , & mut Node ) > ,
300
- ) {
301
- let viewport_size = primary_window
302
- . get_single ( )
303
- . map ( |window| window. size ( ) )
304
- . unwrap_or ( Vec2 :: ZERO )
305
- / ui_scale. 0 ;
306
-
307
- for ( outline, mut node) in outlines_query. iter_mut ( ) {
308
- let node = node. bypass_change_detection ( ) ;
309
- node. outline_width = outline
310
- . width
311
- . resolve ( node. size ( ) . x , viewport_size)
312
- . unwrap_or ( 0. )
313
- . max ( 0. ) ;
314
-
315
- node. outline_offset = outline
316
- . offset
317
- . resolve ( node. size ( ) . x , viewport_size)
318
- . unwrap_or ( 0. )
319
- . max ( 0. ) ;
320
- }
321
- }
322
-
323
318
#[ inline]
324
319
/// Round `value` to the nearest whole integer, with ties (values with a fractional part equal to 0.5) rounded towards positive infinity.
325
320
fn round_ties_up ( value : f32 ) -> f32 {
0 commit comments