@@ -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 , RenderLayers , ViewUniforms } ,
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,19 @@ 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 <
238
+ Query <
239
+ (
240
+ Entity ,
241
+ & Camera ,
242
+ Option < & UiCameraConfig > ,
243
+ Option < & RenderLayers > ,
244
+ ) ,
245
+ With < T > ,
246
+ > ,
247
+ > ,
235
248
) {
236
- for ( entity, camera, camera_ui) in & query {
249
+ for ( entity, camera, camera_ui, render_layers ) in & query {
237
250
// ignore cameras with disabled ui
238
251
if matches ! ( camera_ui, Some ( & UiCameraConfig { show_ui: false , .. } ) ) {
239
252
continue ;
@@ -265,6 +278,9 @@ pub fn extract_default_ui_camera_view<T: Component>(
265
278
color_grading : Default :: default ( ) ,
266
279
} )
267
280
. id ( ) ;
281
+ if let Some ( render_layers) = render_layers {
282
+ commands. entity ( default_camera_view) . insert ( * render_layers) ;
283
+ }
268
284
commands. get_or_spawn ( entity) . insert ( (
269
285
DefaultCameraView ( default_camera_view) ,
270
286
RenderPhase :: < TransparentUi > :: default ( ) ,
@@ -287,6 +303,7 @@ pub fn extract_text_uinodes(
287
303
& TextLayoutInfo ,
288
304
& ComputedVisibility ,
289
305
Option < & CalculatedClip > ,
306
+ Option < & RenderLayers > ,
290
307
) > ,
291
308
> ,
292
309
) {
@@ -299,8 +316,15 @@ pub fn extract_text_uinodes(
299
316
let inverse_scale_factor = scale_factor. recip ( ) ;
300
317
301
318
for ( stack_index, entity) in ui_stack. uinodes . iter ( ) . enumerate ( ) {
302
- if let Ok ( ( uinode, global_transform, text, text_layout_info, visibility, clip) ) =
303
- uinode_query. get ( * entity)
319
+ if let Ok ( (
320
+ uinode,
321
+ global_transform,
322
+ text,
323
+ text_layout_info,
324
+ visibility,
325
+ clip,
326
+ render_layers,
327
+ ) ) = uinode_query. get ( * entity)
304
328
{
305
329
// Skip if not visible or if size is set to zero (e.g. when a parent is set to `Display::None`)
306
330
if !visibility. is_visible ( ) || uinode. size ( ) . x == 0. || uinode. size ( ) . y == 0. {
@@ -338,6 +362,7 @@ pub fn extract_text_uinodes(
338
362
clip : clip. map ( |clip| clip. clip ) ,
339
363
flip_x : false ,
340
364
flip_y : false ,
365
+ render_layers : render_layers. cloned ( ) ,
341
366
} ) ;
342
367
}
343
368
}
@@ -381,6 +406,7 @@ pub struct UiBatch {
381
406
pub range : Range < u32 > ,
382
407
pub image : Handle < Image > ,
383
408
pub z : f32 ,
409
+ pub render_layers : Option < RenderLayers > ,
384
410
}
385
411
386
412
pub fn prepare_uinodes (
@@ -401,17 +427,22 @@ pub fn prepare_uinodes(
401
427
let mut end = 0 ;
402
428
let mut current_batch_handle = Default :: default ( ) ;
403
429
let mut last_z = 0.0 ;
430
+ let mut current_render_layers: Option < RenderLayers > = None ;
404
431
for extracted_uinode in & extracted_uinodes. uinodes {
405
- if current_batch_handle != extracted_uinode. image {
432
+ if current_batch_handle != extracted_uinode. image
433
+ || current_render_layers != extracted_uinode. render_layers
434
+ {
406
435
if start != end {
407
436
commands. spawn ( UiBatch {
408
437
range : start..end,
409
438
image : current_batch_handle,
410
439
z : last_z,
440
+ render_layers : current_render_layers,
411
441
} ) ;
412
442
start = end;
413
443
}
414
444
current_batch_handle = extracted_uinode. image . clone_weak ( ) ;
445
+ current_render_layers = extracted_uinode. render_layers ;
415
446
}
416
447
417
448
let uinode_rect = extracted_uinode. rect ;
@@ -521,6 +552,7 @@ pub fn prepare_uinodes(
521
552
range : start..end,
522
553
image : current_batch_handle,
523
554
z : last_z,
555
+ render_layers : current_render_layers,
524
556
} ) ;
525
557
}
526
558
@@ -544,7 +576,11 @@ pub fn queue_uinodes(
544
576
mut image_bind_groups : ResMut < UiImageBindGroups > ,
545
577
gpu_images : Res < RenderAssets < Image > > ,
546
578
ui_batches : Query < ( Entity , & UiBatch ) > ,
547
- mut views : Query < ( & ExtractedView , & mut RenderPhase < TransparentUi > ) > ,
579
+ mut views : Query < (
580
+ & ExtractedView ,
581
+ & mut RenderPhase < TransparentUi > ,
582
+ Option < & RenderLayers > ,
583
+ ) > ,
548
584
events : Res < SpriteAssetEvents > ,
549
585
) {
550
586
// If an image has changed, the GpuImage has (probably) changed
@@ -567,13 +603,18 @@ pub fn queue_uinodes(
567
603
layout : & ui_pipeline. view_layout ,
568
604
} ) ) ;
569
605
let draw_ui_function = draw_functions. read ( ) . id :: < DrawUi > ( ) ;
570
- for ( view, mut transparent_phase) in & mut views {
606
+ for ( view, mut transparent_phase, render_layers) in & mut views {
607
+ let view_layers = render_layers. cloned ( ) . unwrap_or_default ( ) ;
571
608
let pipeline = pipelines. specialize (
572
609
& pipeline_cache,
573
610
& ui_pipeline,
574
611
UiPipelineKey { hdr : view. hdr } ,
575
612
) ;
576
613
for ( entity, batch) in & ui_batches {
614
+ let batch_layers = batch. render_layers . unwrap_or_default ( ) ;
615
+ if !view_layers. intersects ( & batch_layers) {
616
+ continue ;
617
+ }
577
618
image_bind_groups
578
619
. values
579
620
. entry ( batch. image . clone_weak ( ) )
0 commit comments