Skip to content

Commit e29981d

Browse files
tim-blackbirdcart
andauthored
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 <mcanders1@gmail.com>
1 parent 418d327 commit e29981d

File tree

4 files changed

+39
-9
lines changed

4 files changed

+39
-9
lines changed

crates/bevy_gizmos/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ use bevy_render::{
5050
VertexFormat, VertexStepMode,
5151
},
5252
renderer::RenderDevice,
53+
view::RenderLayers,
5354
Extract, ExtractSchedule, Render, RenderApp, RenderSet,
5455
};
5556
use bevy_transform::components::{GlobalTransform, Transform};
@@ -161,6 +162,10 @@ pub struct GizmoConfig {
161162
pub depth_bias: f32,
162163
/// Configuration for the [`AabbGizmo`].
163164
pub aabb: AabbGizmoConfig,
165+
/// Describes which rendering layers gizmos will be rendered to.
166+
///
167+
/// Gizmos will only be rendered to cameras with intersecting layers.
168+
pub render_layers: RenderLayers,
164169
}
165170

166171
impl Default for GizmoConfig {
@@ -171,6 +176,7 @@ impl Default for GizmoConfig {
171176
line_perspective: false,
172177
depth_bias: 0.,
173178
aabb: Default::default(),
179+
render_layers: Default::default(),
174180
}
175181
}
176182
}

crates/bevy_gizmos/src/pipeline_2d.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
2-
line_gizmo_vertex_buffer_layouts, DrawLineGizmo, LineGizmo, LineGizmoUniformBindgroupLayout,
3-
SetLineGizmoBindGroup, LINE_SHADER_HANDLE,
2+
line_gizmo_vertex_buffer_layouts, DrawLineGizmo, GizmoConfig, LineGizmo,
3+
LineGizmoUniformBindgroupLayout, SetLineGizmoBindGroup, LINE_SHADER_HANDLE,
44
};
55
use bevy_app::{App, Plugin};
66
use bevy_asset::Handle;
@@ -17,7 +17,7 @@ use bevy_render::{
1717
render_phase::{AddRenderCommand, DrawFunctions, RenderPhase, SetItemPipeline},
1818
render_resource::*,
1919
texture::BevyDefault,
20-
view::{ExtractedView, Msaa, ViewTarget},
20+
view::{ExtractedView, Msaa, RenderLayers, ViewTarget},
2121
Render, RenderApp, RenderSet,
2222
};
2323
use bevy_sprite::{Mesh2dPipeline, Mesh2dPipelineKey, SetMesh2dViewBindGroup};
@@ -131,13 +131,22 @@ fn queue_line_gizmos_2d(
131131
mut pipelines: ResMut<SpecializedRenderPipelines<LineGizmoPipeline>>,
132132
pipeline_cache: Res<PipelineCache>,
133133
msaa: Res<Msaa>,
134+
config: Res<GizmoConfig>,
134135
line_gizmos: Query<(Entity, &Handle<LineGizmo>)>,
135136
line_gizmo_assets: Res<RenderAssets<LineGizmo>>,
136-
mut views: Query<(&ExtractedView, &mut RenderPhase<Transparent2d>)>,
137+
mut views: Query<(
138+
&ExtractedView,
139+
&mut RenderPhase<Transparent2d>,
140+
Option<&RenderLayers>,
141+
)>,
137142
) {
138143
let draw_function = draw_functions.read().get_id::<DrawLineGizmo2d>().unwrap();
139144

140-
for (view, mut transparent_phase) in &mut views {
145+
for (view, mut transparent_phase, render_layers) in &mut views {
146+
let render_layers = render_layers.copied().unwrap_or_default();
147+
if !config.render_layers.intersects(&render_layers) {
148+
continue;
149+
}
141150
let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples())
142151
| Mesh2dPipelineKey::from_hdr(view.hdr);
143152

crates/bevy_gizmos/src/pipeline_3d.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use bevy_render::{
1818
render_phase::{AddRenderCommand, DrawFunctions, RenderPhase, SetItemPipeline},
1919
render_resource::*,
2020
texture::BevyDefault,
21-
view::{ExtractedView, Msaa, ViewTarget},
21+
view::{ExtractedView, Msaa, RenderLayers, ViewTarget},
2222
Render, RenderApp, RenderSet,
2323
};
2424

@@ -147,11 +147,20 @@ fn queue_line_gizmos_3d(
147147
config: Res<GizmoConfig>,
148148
line_gizmos: Query<(Entity, &Handle<LineGizmo>)>,
149149
line_gizmo_assets: Res<RenderAssets<LineGizmo>>,
150-
mut views: Query<(&ExtractedView, &mut RenderPhase<Transparent3d>)>,
150+
mut views: Query<(
151+
&ExtractedView,
152+
&mut RenderPhase<Transparent3d>,
153+
Option<&RenderLayers>,
154+
)>,
151155
) {
152156
let draw_function = draw_functions.read().get_id::<DrawLineGizmo3d>().unwrap();
153157

154-
for (view, mut transparent_phase) in &mut views {
158+
for (view, mut transparent_phase, render_layers) in &mut views {
159+
let render_layers = render_layers.copied().unwrap_or_default();
160+
if !config.render_layers.intersects(&render_layers) {
161+
continue;
162+
}
163+
155164
let mesh_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
156165
| MeshPipelineKey::from_hdr(view.hdr);
157166

crates/bevy_render/src/camera/camera.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::{
44
prelude::Image,
55
render_asset::RenderAssets,
66
render_resource::TextureView,
7-
view::{ColorGrading, ExtractedView, ExtractedWindows, VisibleEntities},
7+
view::{ColorGrading, ExtractedView, ExtractedWindows, RenderLayers, VisibleEntities},
88
Extract,
99
};
1010
use bevy_asset::{AssetEvent, Assets, Handle};
@@ -615,6 +615,7 @@ pub fn extract_cameras(
615615
&VisibleEntities,
616616
Option<&ColorGrading>,
617617
Option<&TemporalJitter>,
618+
Option<&RenderLayers>,
618619
)>,
619620
>,
620621
primary_window: Extract<Query<Entity, With<PrimaryWindow>>>,
@@ -628,6 +629,7 @@ pub fn extract_cameras(
628629
visible_entities,
629630
color_grading,
630631
temporal_jitter,
632+
render_layers,
631633
) in query.iter()
632634
{
633635
let color_grading = *color_grading.unwrap_or(&ColorGrading::default());
@@ -679,6 +681,10 @@ pub fn extract_cameras(
679681
if let Some(temporal_jitter) = temporal_jitter {
680682
commands.insert(temporal_jitter.clone());
681683
}
684+
685+
if let Some(render_layers) = render_layers {
686+
commands.insert(*render_layers);
687+
}
682688
}
683689
}
684690
}

0 commit comments

Comments
 (0)