Skip to content

Commit 5e0b61c

Browse files
committed
bevyengine#12502 Remove limit on RenderLayers.
1 parent b8832dc commit 5e0b61c

File tree

14 files changed

+137
-83
lines changed

14 files changed

+137
-83
lines changed

crates/bevy_gizmos/src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ impl From<&GizmoConfig> for GizmoMeshConfig {
197197
GizmoMeshConfig {
198198
line_perspective: item.line_perspective,
199199
line_style: item.line_style,
200-
render_layers: item.render_layers,
200+
render_layers: item.render_layers.clone(),
201201
}
202202
}
203203
}

crates/bevy_gizmos/src/pipeline_2d.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ fn queue_line_gizmos_2d(
269269
let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
270270
| Mesh2dPipelineKey::from_hdr(view.hdr);
271271

272+
let render_layers = render_layers.unwrap_or_default();
272273
for (entity, handle, config) in &line_gizmos {
273-
let render_layers = render_layers.copied().unwrap_or_default();
274274
if !config.render_layers.intersects(&render_layers) {
275275
continue;
276276
}
@@ -325,8 +325,8 @@ fn queue_line_joint_gizmos_2d(
325325
let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
326326
| Mesh2dPipelineKey::from_hdr(view.hdr);
327327

328+
let render_layers = render_layers.unwrap_or_default();
328329
for (entity, handle, config) in &line_gizmos {
329-
let render_layers = render_layers.copied().unwrap_or_default();
330330
if !config.render_layers.intersects(&render_layers) {
331331
continue;
332332
}

crates/bevy_gizmos/src/pipeline_3d.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ fn queue_line_gizmos_3d(
303303
(normal_prepass, depth_prepass, motion_vector_prepass, deferred_prepass),
304304
) in &mut views
305305
{
306-
let render_layers = render_layers.copied().unwrap_or_default();
306+
let render_layers = render_layers.unwrap_or_default();
307307

308308
let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
309309
| MeshPipelineKey::from_hdr(view.hdr);
@@ -389,7 +389,7 @@ fn queue_line_joint_gizmos_3d(
389389
(normal_prepass, depth_prepass, motion_vector_prepass, deferred_prepass),
390390
) in &mut views
391391
{
392-
let render_layers = render_layers.copied().unwrap_or_default();
392+
let render_layers = render_layers.unwrap_or_default();
393393

394394
let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
395395
| MeshPipelineKey::from_hdr(view.hdr);

crates/bevy_pbr/src/light/mod.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::*;
2323

2424
mod ambient_light;
2525
pub use ambient_light::AmbientLight;
26+
2627
mod point_light;
2728
pub use point_light::PointLight;
2829
mod spot_light;
@@ -1015,7 +1016,7 @@ pub(crate) fn directional_light_order(
10151016
.then_with(|| entity_1.cmp(entity_2)) // stable
10161017
}
10171018

1018-
#[derive(Clone, Copy)]
1019+
#[derive(Clone)]
10191020
// data required for assigning lights to clusters
10201021
pub(crate) struct PointLightAssignmentData {
10211022
entity: Entity,
@@ -1105,7 +1106,7 @@ pub(crate) fn assign_lights_to_clusters(
11051106
shadows_enabled: point_light.shadows_enabled,
11061107
range: point_light.range,
11071108
spot_light_angle: None,
1108-
render_layers: maybe_layers.copied().unwrap_or_default(),
1109+
render_layers: maybe_layers.unwrap_or_default().clone(),
11091110
}
11101111
},
11111112
),
@@ -1122,7 +1123,7 @@ pub(crate) fn assign_lights_to_clusters(
11221123
shadows_enabled: spot_light.shadows_enabled,
11231124
range: spot_light.range,
11241125
spot_light_angle: Some(spot_light.outer_angle),
1125-
render_layers: maybe_layers.copied().unwrap_or_default(),
1126+
render_layers: maybe_layers.unwrap_or_default().clone(),
11261127
}
11271128
},
11281129
),
@@ -1196,7 +1197,7 @@ pub(crate) fn assign_lights_to_clusters(
11961197
mut visible_lights,
11971198
) in &mut views
11981199
{
1199-
let view_layers = maybe_layers.copied().unwrap_or_default();
1200+
let view_layers = maybe_layers.unwrap_or_default().clone();
12001201
let clusters = clusters.into_inner();
12011202

12021203
if matches!(config, ClusterConfig::None) {
@@ -1919,7 +1920,7 @@ pub fn check_light_mesh_visibility(
19191920
continue;
19201921
}
19211922

1922-
let view_mask = maybe_view_mask.copied().unwrap_or_default();
1923+
let view_mask = maybe_view_mask.unwrap_or_default().clone();
19231924

19241925
for (
19251926
entity,
@@ -1934,7 +1935,7 @@ pub fn check_light_mesh_visibility(
19341935
continue;
19351936
}
19361937

1937-
let entity_mask = maybe_entity_mask.copied().unwrap_or_default();
1938+
let entity_mask = maybe_entity_mask.unwrap_or_default().clone();
19381939
if !view_mask.intersects(&entity_mask) {
19391940
continue;
19401941
}
@@ -1999,7 +2000,7 @@ pub fn check_light_mesh_visibility(
19992000
continue;
20002001
}
20012002

2002-
let view_mask = maybe_view_mask.copied().unwrap_or_default();
2003+
let view_mask = maybe_view_mask.unwrap_or_default().clone();
20032004
let light_sphere = Sphere {
20042005
center: Vec3A::from(transform.translation()),
20052006
radius: point_light.range,
@@ -2018,7 +2019,7 @@ pub fn check_light_mesh_visibility(
20182019
continue;
20192020
}
20202021

2021-
let entity_mask = maybe_entity_mask.copied().unwrap_or_default();
2022+
let entity_mask = maybe_entity_mask.unwrap_or_default().clone();
20222023
if !view_mask.intersects(&entity_mask) {
20232024
continue;
20242025
}
@@ -2064,7 +2065,7 @@ pub fn check_light_mesh_visibility(
20642065
continue;
20652066
}
20662067

2067-
let view_mask = maybe_view_mask.copied().unwrap_or_default();
2068+
let view_mask = maybe_view_mask.unwrap_or_default().clone();
20682069
let light_sphere = Sphere {
20692070
center: Vec3A::from(transform.translation()),
20702071
radius: point_light.range,
@@ -2083,7 +2084,7 @@ pub fn check_light_mesh_visibility(
20832084
continue;
20842085
}
20852086

2086-
let entity_mask = maybe_entity_mask.copied().unwrap_or_default();
2087+
let entity_mask = maybe_entity_mask.unwrap_or_default().clone();
20872088
if !view_mask.intersects(&entity_mask) {
20882089
continue;
20892090
}

crates/bevy_pbr/src/render/light.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ pub struct GpuDirectionalCascade {
164164

165165
#[derive(Copy, Clone, ShaderType, Default, Debug)]
166166
pub struct GpuDirectionalLight {
167+
skip: u32,
167168
cascades: [GpuDirectionalCascade; MAX_CASCADES_PER_LIGHT],
168169
color: Vec4,
169170
dir_to_light: Vec3,
@@ -173,7 +174,6 @@ pub struct GpuDirectionalLight {
173174
num_cascades: u32,
174175
cascades_overlap_proportion: f32,
175176
depth_texture_base_index: u32,
176-
render_layers: u32,
177177
}
178178

179179
// NOTE: These must match the bit flags in bevy_pbr/src/render/mesh_view_types.wgsl!
@@ -488,7 +488,7 @@ pub fn extract_lights(
488488
cascade_shadow_config: cascade_config.clone(),
489489
cascades: cascades.cascades.clone(),
490490
frusta: frusta.frusta.clone(),
491-
render_layers: maybe_layers.copied().unwrap_or_default(),
491+
render_layers: maybe_layers.unwrap_or_default().clone(),
492492
},
493493
render_visible_entities,
494494
));
@@ -684,7 +684,12 @@ pub fn prepare_lights(
684684
mut global_light_meta: ResMut<GlobalLightMeta>,
685685
mut light_meta: ResMut<LightMeta>,
686686
views: Query<
687-
(Entity, &ExtractedView, &ExtractedClusterConfig),
687+
(
688+
Entity,
689+
&ExtractedView,
690+
&ExtractedClusterConfig,
691+
Option<&RenderLayers>,
692+
),
688693
With<SortedRenderPhase<Transparent3d>>,
689694
>,
690695
ambient_light: Res<AmbientLight>,
@@ -904,6 +909,8 @@ pub fn prepare_lights(
904909
.len()
905910
.min(MAX_CASCADES_PER_LIGHT);
906911
gpu_directional_lights[index] = GpuDirectionalLight {
912+
// Set to true later when necessary.
913+
skip: 0u32,
907914
// Filled in later.
908915
cascades: [GpuDirectionalCascade::default(); MAX_CASCADES_PER_LIGHT],
909916
// premultiply color by illuminance
@@ -917,7 +924,6 @@ pub fn prepare_lights(
917924
num_cascades: num_cascades as u32,
918925
cascades_overlap_proportion: light.cascade_shadow_config.overlap_proportion,
919926
depth_texture_base_index: num_directional_cascades_enabled as u32,
920-
render_layers: light.render_layers.bits(),
921927
};
922928
if index < directional_shadow_enabled_count {
923929
num_directional_cascades_enabled += num_cascades;
@@ -930,7 +936,7 @@ pub fn prepare_lights(
930936
.write_buffer(&render_device, &render_queue);
931937

932938
// set up light data for each view
933-
for (entity, extracted_view, clusters) in &views {
939+
for (entity, extracted_view, clusters, maybe_layers) in &views {
934940
let point_light_depth_texture = texture_cache.get(
935941
&render_device,
936942
TextureDescriptor {
@@ -1128,11 +1134,20 @@ pub fn prepare_lights(
11281134

11291135
// directional lights
11301136
let mut directional_depth_texture_array_index = 0u32;
1137+
let view_layers = maybe_layers.unwrap_or_default();
11311138
for (light_index, &(light_entity, light)) in directional_lights
11321139
.iter()
11331140
.enumerate()
1134-
.take(directional_shadow_enabled_count)
1141+
.take(MAX_DIRECTIONAL_LIGHTS)
11351142
{
1143+
let gpu_light = &mut gpu_lights.directional_lights[light_index];
1144+
1145+
// Check if the light intersects with the view.
1146+
if !view_layers.intersects(&light.render_layers) {
1147+
gpu_light.skip = 1u32;
1148+
continue;
1149+
}
1150+
11361151
let cascades = light
11371152
.cascades
11381153
.get(&entity)

crates/bevy_pbr/src/render/mesh_view_types.wgsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct DirectionalCascade {
2323
}
2424

2525
struct DirectionalLight {
26+
skip: u32,
2627
cascades: array<DirectionalCascade, #{MAX_CASCADES_PER_LIGHT}>,
2728
color: vec4<f32>,
2829
direction_to_light: vec3<f32>,
@@ -33,7 +34,6 @@ struct DirectionalLight {
3334
num_cascades: u32,
3435
cascades_overlap_proportion: f32,
3536
depth_texture_base_index: u32,
36-
render_layers: u32,
3737
};
3838

3939
const DIRECTIONAL_LIGHT_FLAGS_SHADOWS_ENABLED_BIT: u32 = 1u;

crates/bevy_pbr/src/render/pbr_functions.wgsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -281,10 +281,10 @@ fn apply_pbr_lighting(
281281
// directional lights (direct)
282282
let n_directional_lights = view_bindings::lights.n_directional_lights;
283283
for (var i: u32 = 0u; i < n_directional_lights; i = i + 1u) {
284-
// check the directional light render layers intersect the view render layers
285-
// note this is not necessary for point and spot lights, as the relevant lights are filtered in `assign_lights_to_clusters`
284+
// check if this light should be skipped, which occurs if this light does not intersect with the view
285+
// note point and spot lights aren't skippable, as the relevant lights are filtered in `assign_lights_to_clusters`
286286
let light = &view_bindings::lights.directional_lights[i];
287-
if ((*light).render_layers & view_bindings::view.render_layers) == 0u {
287+
if (*light).skip != 0u {
288288
continue;
289289
}
290290

crates/bevy_render/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ profiling = { version = "1", features = [
100100
], optional = true }
101101
async-channel = "2.2.0"
102102
nonmax = "0.5"
103-
smallvec = "1.11"
103+
smallvec = { version = "1.11", features = ["const_new"] }
104104

105105
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
106106
# Omit the `glsl` feature in non-WebAssembly by default.

crates/bevy_render/src/camera/camera.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ pub fn extract_cameras(
916916
}
917917

918918
if let Some(render_layers) = render_layers {
919-
commands.insert(*render_layers);
919+
commands.insert(render_layers.clone());
920920
}
921921

922922
if let Some(perspective) = projection {

crates/bevy_render/src/view/mod.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,6 @@ pub struct ViewUniform {
408408
frustum: [Vec4; 6],
409409
color_grading: ColorGradingUniform,
410410
mip_bias: f32,
411-
render_layers: u32,
412411
}
413412

414413
#[derive(Resource, Default)]
@@ -691,7 +690,6 @@ pub fn prepare_view_uniforms(
691690
Option<&Frustum>,
692691
Option<&TemporalJitter>,
693692
Option<&MipBias>,
694-
Option<&RenderLayers>,
695693
)>,
696694
) {
697695
let view_iter = views.iter();
@@ -710,7 +708,6 @@ pub fn prepare_view_uniforms(
710708
frustum,
711709
temporal_jitter,
712710
mip_bias,
713-
maybe_layers,
714711
) in &views
715712
{
716713
let viewport = extracted_view.viewport.as_vec4();
@@ -755,7 +752,6 @@ pub fn prepare_view_uniforms(
755752
frustum,
756753
color_grading: extracted_view.color_grading.clone().into(),
757754
mip_bias: mip_bias.unwrap_or(&MipBias(0.0)).0,
758-
render_layers: maybe_layers.copied().unwrap_or_default().bits(),
759755
}),
760756
};
761757

crates/bevy_render/src/view/view.wgsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,4 @@ struct View {
2828
frustum: array<vec4<f32>, 6>,
2929
color_grading: ColorGrading,
3030
mip_bias: f32,
31-
render_layers: u32,
3231
};

crates/bevy_render/src/view/visibility/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ pub fn check_visibility<QF>(
422422
continue;
423423
}
424424

425-
let view_mask = maybe_view_mask.copied().unwrap_or_default();
425+
let view_mask = maybe_view_mask.unwrap_or_default();
426426

427427
visible_aabb_query.par_iter_mut().for_each_init(
428428
|| thread_queues.borrow_local_mut(),
@@ -443,7 +443,7 @@ pub fn check_visibility<QF>(
443443
return;
444444
}
445445

446-
let entity_mask = maybe_entity_mask.copied().unwrap_or_default();
446+
let entity_mask = maybe_entity_mask.unwrap_or_default();
447447
if !view_mask.intersects(&entity_mask) {
448448
return;
449449
}

0 commit comments

Comments
 (0)