From e29981dcbd64c29333ee711e0fb900a34daf5ff3 Mon Sep 17 00:00:00 2001 From: ira Date: Thu, 29 Jun 2023 02:56:31 +0200 Subject: [PATCH] Add option to disable gizmo rendering for specific cameras (#8952) Added `GizmoConfig::render_layers`, which will ensure Gizmos are only rendered on cameras that can see those `RenderLayers`. --------- Co-authored-by: Carter Anderson --- crates/bevy_gizmos/src/lib.rs | 6 ++++++ crates/bevy_gizmos/src/pipeline_2d.rs | 19 ++++++++++++++----- crates/bevy_gizmos/src/pipeline_3d.rs | 15 ++++++++++++--- crates/bevy_render/src/camera/camera.rs | 8 +++++++- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/crates/bevy_gizmos/src/lib.rs b/crates/bevy_gizmos/src/lib.rs index a98a95aafa..7ef99e2568 100644 --- a/crates/bevy_gizmos/src/lib.rs +++ b/crates/bevy_gizmos/src/lib.rs @@ -50,6 +50,7 @@ use bevy_render::{ VertexFormat, VertexStepMode, }, renderer::RenderDevice, + view::RenderLayers, Extract, ExtractSchedule, Render, RenderApp, RenderSet, }; use bevy_transform::components::{GlobalTransform, Transform}; @@ -161,6 +162,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 { @@ -171,6 +176,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 5e903b8e30..be983becec 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 2b0add317f..d87c678da2 100644 --- a/crates/bevy_gizmos/src/pipeline_3d.rs +++ b/crates/bevy_gizmos/src/pipeline_3d.rs @@ -18,7 +18,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, }; @@ -147,11 +147,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 f8050ac90c..0017bec82a 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); + } } } }