diff --git a/crates/bevy_gizmos/src/lib.rs b/crates/bevy_gizmos/src/lib.rs index 23c53c895d719..831f6af0b5020 100644 --- a/crates/bevy_gizmos/src/lib.rs +++ b/crates/bevy_gizmos/src/lib.rs @@ -49,6 +49,7 @@ use bevy_render::{ VertexFormat, VertexStepMode, }, renderer::RenderDevice, + view::RenderLayers, Extract, ExtractSchedule, Render, RenderApp, RenderSet, }; use bevy_transform::components::{GlobalTransform, Transform}; @@ -159,6 +160,10 @@ pub struct GizmoConfig { pub depth_bias: f32, /// Configuration for the [`AabbGizmo`]. pub aabb: AabbGizmoConfig, + /// Describes which rendering layers gizmos will be rendered to. + /// + /// Gizmos will only be rendered to cameras with intersecting layers. + pub render_layers: RenderLayers, } impl Default for GizmoConfig { @@ -169,6 +174,7 @@ impl Default for GizmoConfig { line_perspective: false, depth_bias: 0., aabb: Default::default(), + render_layers: Default::default(), } } } diff --git a/crates/bevy_gizmos/src/pipeline_2d.rs b/crates/bevy_gizmos/src/pipeline_2d.rs index 5e903b8e305da..be983becec9f6 100644 --- a/crates/bevy_gizmos/src/pipeline_2d.rs +++ b/crates/bevy_gizmos/src/pipeline_2d.rs @@ -1,6 +1,6 @@ use crate::{ - line_gizmo_vertex_buffer_layouts, DrawLineGizmo, LineGizmo, LineGizmoUniformBindgroupLayout, - SetLineGizmoBindGroup, LINE_SHADER_HANDLE, + line_gizmo_vertex_buffer_layouts, DrawLineGizmo, GizmoConfig, LineGizmo, + LineGizmoUniformBindgroupLayout, SetLineGizmoBindGroup, LINE_SHADER_HANDLE, }; use bevy_app::{App, Plugin}; use bevy_asset::Handle; @@ -17,7 +17,7 @@ use bevy_render::{ render_phase::{AddRenderCommand, DrawFunctions, RenderPhase, SetItemPipeline}, render_resource::*, texture::BevyDefault, - view::{ExtractedView, Msaa, ViewTarget}, + view::{ExtractedView, Msaa, RenderLayers, ViewTarget}, Render, RenderApp, RenderSet, }; use bevy_sprite::{Mesh2dPipeline, Mesh2dPipelineKey, SetMesh2dViewBindGroup}; @@ -131,13 +131,22 @@ fn queue_line_gizmos_2d( mut pipelines: ResMut>, pipeline_cache: Res, msaa: Res, + config: Res, line_gizmos: Query<(Entity, &Handle)>, line_gizmo_assets: Res>, - mut views: Query<(&ExtractedView, &mut RenderPhase)>, + mut views: Query<( + &ExtractedView, + &mut RenderPhase, + Option<&RenderLayers>, + )>, ) { let draw_function = draw_functions.read().get_id::().unwrap(); - for (view, mut transparent_phase) in &mut views { + for (view, mut transparent_phase, render_layers) in &mut views { + let render_layers = render_layers.copied().unwrap_or_default(); + if !config.render_layers.intersects(&render_layers) { + continue; + } let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples()) | Mesh2dPipelineKey::from_hdr(view.hdr); diff --git a/crates/bevy_gizmos/src/pipeline_3d.rs b/crates/bevy_gizmos/src/pipeline_3d.rs index bfd1ed1a4cd2f..e93725f80ecc2 100644 --- a/crates/bevy_gizmos/src/pipeline_3d.rs +++ b/crates/bevy_gizmos/src/pipeline_3d.rs @@ -21,7 +21,7 @@ use bevy_render::{ render_phase::{AddRenderCommand, DrawFunctions, RenderPhase, SetItemPipeline}, render_resource::*, texture::BevyDefault, - view::{ExtractedView, Msaa, ViewTarget}, + view::{ExtractedView, Msaa, RenderLayers, ViewTarget}, Render, RenderApp, RenderSet, }; @@ -159,11 +159,20 @@ fn queue_line_gizmos_3d( config: Res, line_gizmos: Query<(Entity, &Handle)>, line_gizmo_assets: Res>, - mut views: Query<(&ExtractedView, &mut RenderPhase)>, + mut views: Query<( + &ExtractedView, + &mut RenderPhase, + Option<&RenderLayers>, + )>, ) { let draw_function = draw_functions.read().get_id::().unwrap(); - for (view, mut transparent_phase) in &mut views { + for (view, mut transparent_phase, render_layers) in &mut views { + let render_layers = render_layers.copied().unwrap_or_default(); + if !config.render_layers.intersects(&render_layers) { + continue; + } + let mesh_key = MeshPipelineKey::from_msaa_samples(msaa.samples()) | MeshPipelineKey::from_hdr(view.hdr); diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index f8050ac90cee8..0017bec82a82f 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -4,7 +4,7 @@ use crate::{ prelude::Image, render_asset::RenderAssets, render_resource::TextureView, - view::{ColorGrading, ExtractedView, ExtractedWindows, VisibleEntities}, + view::{ColorGrading, ExtractedView, ExtractedWindows, RenderLayers, VisibleEntities}, Extract, }; use bevy_asset::{AssetEvent, Assets, Handle}; @@ -615,6 +615,7 @@ pub fn extract_cameras( &VisibleEntities, Option<&ColorGrading>, Option<&TemporalJitter>, + Option<&RenderLayers>, )>, >, primary_window: Extract>>, @@ -628,6 +629,7 @@ pub fn extract_cameras( visible_entities, color_grading, temporal_jitter, + render_layers, ) in query.iter() { let color_grading = *color_grading.unwrap_or(&ColorGrading::default()); @@ -679,6 +681,10 @@ pub fn extract_cameras( if let Some(temporal_jitter) = temporal_jitter { commands.insert(temporal_jitter.clone()); } + + if let Some(render_layers) = render_layers { + commands.insert(*render_layers); + } } } }