@@ -24,7 +24,7 @@ use bevy_render::{
24
24
render_resource:: * ,
25
25
renderer:: { RenderDevice , RenderQueue } ,
26
26
texture:: Image ,
27
- view:: { ComputedVisibility , ExtractedView , ViewUniforms } ,
27
+ view:: { ComputedVisibility , ExtractedView , ViewUniforms , RenderLayers } ,
28
28
Extract , RenderApp , RenderSet ,
29
29
} ;
30
30
use bevy_sprite:: SpriteAssetEvents ;
@@ -155,6 +155,7 @@ pub struct ExtractedUiNode {
155
155
pub clip : Option < Rect > ,
156
156
pub flip_x : bool ,
157
157
pub flip_y : bool ,
158
+ pub render_layers : Option < RenderLayers > ,
158
159
}
159
160
160
161
#[ derive( Resource , Default ) ]
@@ -174,12 +175,13 @@ pub fn extract_uinodes(
174
175
Option < & UiImage > ,
175
176
& ComputedVisibility ,
176
177
Option < & CalculatedClip > ,
178
+ Option < & RenderLayers > ,
177
179
) > ,
178
180
> ,
179
181
) {
180
182
extracted_uinodes. uinodes . clear ( ) ;
181
183
for ( stack_index, entity) in ui_stack. uinodes . iter ( ) . enumerate ( ) {
182
- if let Ok ( ( uinode, transform, color, maybe_image, visibility, clip) ) =
184
+ if let Ok ( ( uinode, transform, color, maybe_image, visibility, clip, render_layers ) ) =
183
185
uinode_query. get ( * entity)
184
186
{
185
187
// Skip invisible and completely transparent nodes
@@ -210,6 +212,7 @@ pub fn extract_uinodes(
210
212
clip : clip. map ( |clip| clip. clip ) ,
211
213
flip_x,
212
214
flip_y,
215
+ render_layers : render_layers. cloned ( ) ,
213
216
} ) ;
214
217
}
215
218
}
@@ -231,9 +234,9 @@ pub struct DefaultCameraView(pub Entity);
231
234
232
235
pub fn extract_default_ui_camera_view < T : Component > (
233
236
mut commands : Commands ,
234
- query : Extract < Query < ( Entity , & Camera , Option < & UiCameraConfig > ) , With < T > > > ,
237
+ query : Extract < Query < ( Entity , & Camera , Option < & UiCameraConfig > , Option < & RenderLayers > ) , With < T > > > ,
235
238
) {
236
- for ( entity, camera, camera_ui) in & query {
239
+ for ( entity, camera, camera_ui, render_layers ) in & query {
237
240
// ignore cameras with disabled ui
238
241
if matches ! ( camera_ui, Some ( & UiCameraConfig { show_ui: false , .. } ) ) {
239
242
continue ;
@@ -265,6 +268,9 @@ pub fn extract_default_ui_camera_view<T: Component>(
265
268
color_grading : Default :: default ( ) ,
266
269
} )
267
270
. id ( ) ;
271
+ if let Some ( render_layers) = render_layers {
272
+ commands. entity ( default_camera_view) . insert ( * render_layers) ;
273
+ }
268
274
commands. get_or_spawn ( entity) . insert ( (
269
275
DefaultCameraView ( default_camera_view) ,
270
276
RenderPhase :: < TransparentUi > :: default ( ) ,
@@ -287,6 +293,7 @@ pub fn extract_text_uinodes(
287
293
& TextLayoutInfo ,
288
294
& ComputedVisibility ,
289
295
Option < & CalculatedClip > ,
296
+ Option < & RenderLayers >
290
297
) > ,
291
298
> ,
292
299
) {
@@ -299,7 +306,7 @@ pub fn extract_text_uinodes(
299
306
let inverse_scale_factor = scale_factor. recip ( ) ;
300
307
301
308
for ( stack_index, entity) in ui_stack. uinodes . iter ( ) . enumerate ( ) {
302
- if let Ok ( ( uinode, global_transform, text, text_layout_info, visibility, clip) ) =
309
+ if let Ok ( ( uinode, global_transform, text, text_layout_info, visibility, clip, render_layers ) ) =
303
310
uinode_query. get ( * entity)
304
311
{
305
312
// Skip if not visible or if size is set to zero (e.g. when a parent is set to `Display::None`)
@@ -338,6 +345,7 @@ pub fn extract_text_uinodes(
338
345
clip : clip. map ( |clip| clip. clip ) ,
339
346
flip_x : false ,
340
347
flip_y : false ,
348
+ render_layers : render_layers. cloned ( ) ,
341
349
} ) ;
342
350
}
343
351
}
@@ -381,6 +389,7 @@ pub struct UiBatch {
381
389
pub range : Range < u32 > ,
382
390
pub image : Handle < Image > ,
383
391
pub z : f32 ,
392
+ pub render_layers : Option < RenderLayers > ,
384
393
}
385
394
386
395
pub fn prepare_uinodes (
@@ -401,17 +410,22 @@ pub fn prepare_uinodes(
401
410
let mut end = 0 ;
402
411
let mut current_batch_handle = Default :: default ( ) ;
403
412
let mut last_z = 0.0 ;
413
+ let mut current_render_layers: Option < RenderLayers > = None ;
404
414
for extracted_uinode in & extracted_uinodes. uinodes {
405
- if current_batch_handle != extracted_uinode. image {
415
+ if current_batch_handle != extracted_uinode. image ||
416
+ current_render_layers != extracted_uinode. render_layers
417
+ {
406
418
if start != end {
407
419
commands. spawn ( UiBatch {
408
420
range : start..end,
409
421
image : current_batch_handle,
410
422
z : last_z,
423
+ render_layers : current_render_layers,
411
424
} ) ;
412
425
start = end;
413
426
}
414
427
current_batch_handle = extracted_uinode. image . clone_weak ( ) ;
428
+ current_render_layers = extracted_uinode. render_layers ;
415
429
}
416
430
417
431
let uinode_rect = extracted_uinode. rect ;
@@ -521,6 +535,7 @@ pub fn prepare_uinodes(
521
535
range : start..end,
522
536
image : current_batch_handle,
523
537
z : last_z,
538
+ render_layers : current_render_layers,
524
539
} ) ;
525
540
}
526
541
@@ -544,7 +559,7 @@ pub fn queue_uinodes(
544
559
mut image_bind_groups : ResMut < UiImageBindGroups > ,
545
560
gpu_images : Res < RenderAssets < Image > > ,
546
561
ui_batches : Query < ( Entity , & UiBatch ) > ,
547
- mut views : Query < ( & ExtractedView , & mut RenderPhase < TransparentUi > ) > ,
562
+ mut views : Query < ( & ExtractedView , & mut RenderPhase < TransparentUi > , Option < & RenderLayers > ) > ,
548
563
events : Res < SpriteAssetEvents > ,
549
564
) {
550
565
// If an image has changed, the GpuImage has (probably) changed
@@ -567,13 +582,18 @@ pub fn queue_uinodes(
567
582
layout : & ui_pipeline. view_layout ,
568
583
} ) ) ;
569
584
let draw_ui_function = draw_functions. read ( ) . id :: < DrawUi > ( ) ;
570
- for ( view, mut transparent_phase) in & mut views {
585
+ for ( view, mut transparent_phase, render_layers) in & mut views {
586
+ let view_layers = render_layers. cloned ( ) . unwrap_or_default ( ) ;
571
587
let pipeline = pipelines. specialize (
572
588
& pipeline_cache,
573
589
& ui_pipeline,
574
590
UiPipelineKey { hdr : view. hdr } ,
575
591
) ;
576
592
for ( entity, batch) in & ui_batches {
593
+ let batch_layers = batch. render_layers . unwrap_or_default ( ) ;
594
+ if !view_layers. intersects ( & batch_layers) {
595
+ continue ;
596
+ }
577
597
image_bind_groups
578
598
. values
579
599
. entry ( batch. image . clone_weak ( ) )
0 commit comments