Skip to content

Commit 6b837dd

Browse files
authored
Remove prepasses from the render world when they're removed from the main world. (#17565)
This makes switching rendering modes in `deferred_rendering` work again. Closes #16679.
1 parent 0f1c757 commit 6b837dd

File tree

2 files changed

+56
-27
lines changed
  • crates
    • bevy_core_pipeline/src/core_3d
    • bevy_pbr/src/deferred

2 files changed

+56
-27
lines changed

crates/bevy_core_pipeline/src/core_3d/mod.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -718,13 +718,35 @@ pub fn extract_camera_prepass_phase(
718718
}
719719
live_entities.insert(retained_view_entity);
720720

721-
commands
721+
// Add or remove prepasses as appropriate.
722+
723+
let mut camera_commands = commands
722724
.get_entity(entity)
723-
.expect("Camera entity wasn't synced.")
724-
.insert_if(DepthPrepass, || depth_prepass)
725-
.insert_if(NormalPrepass, || normal_prepass)
726-
.insert_if(MotionVectorPrepass, || motion_vector_prepass)
727-
.insert_if(DeferredPrepass, || deferred_prepass);
725+
.expect("Camera entity wasn't synced.");
726+
727+
if depth_prepass {
728+
camera_commands.insert(DepthPrepass);
729+
} else {
730+
camera_commands.remove::<DepthPrepass>();
731+
}
732+
733+
if normal_prepass {
734+
camera_commands.insert(NormalPrepass);
735+
} else {
736+
camera_commands.remove::<NormalPrepass>();
737+
}
738+
739+
if motion_vector_prepass {
740+
camera_commands.insert(MotionVectorPrepass);
741+
} else {
742+
camera_commands.remove::<MotionVectorPrepass>();
743+
}
744+
745+
if deferred_prepass {
746+
camera_commands.insert(DeferredPrepass);
747+
} else {
748+
camera_commands.remove::<DeferredPrepass>();
749+
}
728750
}
729751

730752
opaque_3d_prepass_phases.retain(|view_entity, _| live_entities.contains(view_entity));
@@ -986,6 +1008,7 @@ pub fn prepare_prepass_textures(
9861008
&& !opaque_3d_deferred_phases.contains_key(&view.retained_view_entity)
9871009
&& !alpha_mask_3d_deferred_phases.contains_key(&view.retained_view_entity)
9881010
{
1011+
commands.entity(entity).remove::<ViewPrepassTextures>();
9891012
continue;
9901013
};
9911014

crates/bevy_pbr/src/deferred/mod.rs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -432,28 +432,26 @@ pub fn prepare_deferred_lighting_pipelines(
432432
pipeline_cache: Res<PipelineCache>,
433433
mut pipelines: ResMut<SpecializedRenderPipelines<DeferredLightingLayout>>,
434434
deferred_lighting_layout: Res<DeferredLightingLayout>,
435-
views: Query<
435+
views: Query<(
436+
Entity,
437+
&ExtractedView,
438+
Option<&Tonemapping>,
439+
Option<&DebandDither>,
440+
Option<&ShadowFilteringMethod>,
436441
(
437-
Entity,
438-
&ExtractedView,
439-
Option<&Tonemapping>,
440-
Option<&DebandDither>,
441-
Option<&ShadowFilteringMethod>,
442-
(
443-
Has<ScreenSpaceAmbientOcclusion>,
444-
Has<ScreenSpaceReflectionsUniform>,
445-
Has<DistanceFog>,
446-
),
447-
(
448-
Has<NormalPrepass>,
449-
Has<DepthPrepass>,
450-
Has<MotionVectorPrepass>,
451-
),
452-
Has<RenderViewLightProbes<EnvironmentMapLight>>,
453-
Has<RenderViewLightProbes<IrradianceVolume>>,
442+
Has<ScreenSpaceAmbientOcclusion>,
443+
Has<ScreenSpaceReflectionsUniform>,
444+
Has<DistanceFog>,
445+
),
446+
(
447+
Has<NormalPrepass>,
448+
Has<DepthPrepass>,
449+
Has<MotionVectorPrepass>,
450+
Has<DeferredPrepass>,
454451
),
455-
With<DeferredPrepass>,
456-
>,
452+
Has<RenderViewLightProbes<EnvironmentMapLight>>,
453+
Has<RenderViewLightProbes<IrradianceVolume>>,
454+
)>,
457455
) {
458456
for (
459457
entity,
@@ -462,11 +460,19 @@ pub fn prepare_deferred_lighting_pipelines(
462460
dither,
463461
shadow_filter_method,
464462
(ssao, ssr, distance_fog),
465-
(normal_prepass, depth_prepass, motion_vector_prepass),
463+
(normal_prepass, depth_prepass, motion_vector_prepass, deferred_prepass),
466464
has_environment_maps,
467465
has_irradiance_volumes,
468466
) in &views
469467
{
468+
// If there is no deferred prepass, remove the old pipeline if there was
469+
// one. This handles the case in which a view using deferred stops using
470+
// it.
471+
if !deferred_prepass {
472+
commands.entity(entity).remove::<DeferredLightingPipeline>();
473+
continue;
474+
}
475+
470476
let mut view_key = MeshPipelineKey::from_hdr(view.hdr);
471477

472478
if normal_prepass {

0 commit comments

Comments
 (0)