From fe7f98f7f07403accb34b7912e16bb99bb831339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Harabie=C5=84?= Date: Sat, 19 Oct 2024 17:13:14 +0200 Subject: [PATCH] Fix deactivated camera still being used in render world (#15946) # Objective Switch to retained render world causes the extracted cameras in render world to not be removed until camera in main world is despawned. When extracting data from main world inactive cameras are skipped. Therefore camera that was active and became inactive has a retained `ExtractedCamera` component from previous frames (when it was active) and is processed the same way as if it were active (there is no `active` field on `ExtractedCamera`). This breakes switching between cameras in `render_primitives` example. Fixes #15822 ## Solution Fix it by removing `ExtractedCamera` and related components from inactive cameras. Note that despawning inactive camera seems to be bad option because they are spawned using `SyncToRenderWorld` component. ## Testing Switching camera in `render_primitives` example now works correctly. --------- Co-authored-by: akimakinai <105044389+akimakinai@users.noreply.github.com> --- crates/bevy_render/src/camera/camera.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index dfd395ed7916d..f00ebb5e9d5f3 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -1054,8 +1054,18 @@ pub fn extract_cameras( ) in query.iter() { if !camera.is_active { + commands.entity(render_entity).remove::<( + ExtractedCamera, + ExtractedView, + RenderVisibleEntities, + TemporalJitter, + RenderLayers, + Projection, + GpuCulling, + )>(); continue; } + let color_grading = color_grading.unwrap_or(&ColorGrading::default()).clone(); if let (