diff --git a/crates/bevy_core_pipeline/src/bloom/settings.rs b/crates/bevy_core_pipeline/src/bloom/settings.rs index 3fc35dc4d5105..effa135677f3b 100644 --- a/crates/bevy_core_pipeline/src/bloom/settings.rs +++ b/crates/bevy_core_pipeline/src/bloom/settings.rs @@ -226,7 +226,9 @@ impl ExtractComponent for Bloom { camera.is_active, camera.hdr, ) { - (Some(URect { min: origin, .. }), Some(size), Some(target_size), true, true) => { + (Some(URect { min: origin, .. }), Some(size), Some(target_size), true, true) + if size.x != 0 && size.y != 0 => + { let threshold = bloom.prefilter.threshold; let threshold_softness = bloom.prefilter.threshold_softness; let knee = threshold * threshold_softness.clamp(0.0, 1.0); diff --git a/crates/bevy_pbr/src/cluster/assign.rs b/crates/bevy_pbr/src/cluster/assign.rs index 046011cb097b7..4c3e22febed65 100644 --- a/crates/bevy_pbr/src/cluster/assign.rs +++ b/crates/bevy_pbr/src/cluster/assign.rs @@ -218,9 +218,12 @@ pub(crate) fn assign_objects_to_clusters( continue; } - let Some(screen_size) = camera.physical_viewport_size() else { - clusters.clear(); - continue; + let screen_size = match camera.physical_viewport_size() { + Some(screen_size) if screen_size.x != 0 && screen_size.y != 0 => screen_size, + _ => { + clusters.clear(); + continue; + } }; let mut requested_cluster_dimensions = config.dimensions_for_screen_size(screen_size); diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index a272df4e6c167..3aded842ea665 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -965,10 +965,14 @@ pub fn camera_system( } camera.computed.target_info = new_computed_target_info; if let Some(size) = camera.logical_viewport_size() { - camera_projection.update(size.x, size.y); - camera.computed.clip_from_view = match &camera.sub_camera_view { - Some(sub_view) => camera_projection.get_clip_from_view_for_sub(sub_view), - None => camera_projection.get_clip_from_view(), + if size.x != 0.0 && size.y != 0.0 { + camera_projection.update(size.x, size.y); + camera.computed.clip_from_view = match &camera.sub_camera_view { + Some(sub_view) => { + camera_projection.get_clip_from_view_for_sub(sub_view) + } + None => camera_projection.get_clip_from_view(), + } } } } diff --git a/crates/bevy_render/src/camera/camera_driver_node.rs b/crates/bevy_render/src/camera/camera_driver_node.rs index 2548c416ce185..f01d781478783 100644 --- a/crates/bevy_render/src/camera/camera_driver_node.rs +++ b/crates/bevy_render/src/camera/camera_driver_node.rs @@ -41,10 +41,14 @@ impl Node for CameraDriverNode { let mut run_graph = true; if let Some(NormalizedRenderTarget::Window(window_ref)) = camera.target { let window_entity = window_ref.entity(); - if windows.windows.get(&window_entity).is_some() { + if windows + .windows + .get(&window_entity) + .is_some_and(|w| w.physical_width > 0 && w.physical_height > 0) + { camera_windows.insert(window_entity); } else { - // The window doesn't exist anymore so we don't need to run the graph + // The window doesn't exist anymore or zero-sized so we don't need to run the graph run_graph = false; } }