Skip to content

Commit 64faadb

Browse files
authored
Fix gizmo crash when prepass enabled (#10360)
# Objective - Fix gizmo crash when prepass enabled ## Solution - Add the prepass to the view key Fixes: #10347
1 parent 49bc6cf commit 64faadb

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

crates/bevy_gizmos/src/pipeline_3d.rs

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ use crate::{
44
};
55
use bevy_app::{App, Plugin};
66
use bevy_asset::Handle;
7-
use bevy_core_pipeline::core_3d::{Transparent3d, CORE_3D_DEPTH_FORMAT};
7+
use bevy_core_pipeline::{
8+
core_3d::{Transparent3d, CORE_3D_DEPTH_FORMAT},
9+
prepass::{DeferredPrepass, DepthPrepass, MotionVectorPrepass, NormalPrepass},
10+
};
811

912
use bevy_ecs::{
1013
prelude::Entity,
14+
query::Has,
1115
schedule::IntoSystemConfigs,
1216
system::{Query, Res, ResMut, Resource},
1317
world::{FromWorld, World},
@@ -69,7 +73,7 @@ impl FromWorld for LineGizmoPipeline {
6973

7074
#[derive(PartialEq, Eq, Hash, Clone)]
7175
struct LineGizmoPipelineKey {
72-
mesh_key: MeshPipelineKey,
76+
view_key: MeshPipelineKey,
7377
strip: bool,
7478
perspective: bool,
7579
}
@@ -87,15 +91,15 @@ impl SpecializedRenderPipeline for LineGizmoPipeline {
8791
shader_defs.push("PERSPECTIVE".into());
8892
}
8993

90-
let format = if key.mesh_key.contains(MeshPipelineKey::HDR) {
94+
let format = if key.view_key.contains(MeshPipelineKey::HDR) {
9195
ViewTarget::TEXTURE_FORMAT_HDR
9296
} else {
9397
TextureFormat::bevy_default()
9498
};
9599

96100
let view_layout = self
97101
.mesh_pipeline
98-
.get_view_layout(key.mesh_key.into())
102+
.get_view_layout(key.view_key.into())
99103
.clone();
100104

101105
let layout = vec![view_layout, self.uniform_layout.clone()];
@@ -127,7 +131,7 @@ impl SpecializedRenderPipeline for LineGizmoPipeline {
127131
bias: DepthBiasState::default(),
128132
}),
129133
multisample: MultisampleState {
130-
count: key.mesh_key.msaa_samples(),
134+
count: key.view_key.msaa_samples(),
131135
mask: !0,
132136
alpha_to_coverage_enabled: false,
133137
},
@@ -158,19 +162,47 @@ fn queue_line_gizmos_3d(
158162
&ExtractedView,
159163
&mut RenderPhase<Transparent3d>,
160164
Option<&RenderLayers>,
165+
(
166+
Has<NormalPrepass>,
167+
Has<DepthPrepass>,
168+
Has<MotionVectorPrepass>,
169+
Has<DeferredPrepass>,
170+
),
161171
)>,
162172
) {
163173
let draw_function = draw_functions.read().get_id::<DrawLineGizmo3d>().unwrap();
164174

165-
for (view, mut transparent_phase, render_layers) in &mut views {
175+
for (
176+
view,
177+
mut transparent_phase,
178+
render_layers,
179+
(normal_prepass, depth_prepass, motion_vector_prepass, deferred_prepass),
180+
) in &mut views
181+
{
166182
let render_layers = render_layers.copied().unwrap_or_default();
167183
if !config.render_layers.intersects(&render_layers) {
168184
continue;
169185
}
170186

171-
let mesh_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
187+
let mut view_key = MeshPipelineKey::from_msaa_samples(msaa.samples())
172188
| MeshPipelineKey::from_hdr(view.hdr);
173189

190+
if normal_prepass {
191+
view_key |= MeshPipelineKey::NORMAL_PREPASS;
192+
}
193+
194+
if depth_prepass {
195+
view_key |= MeshPipelineKey::DEPTH_PREPASS;
196+
}
197+
198+
if motion_vector_prepass {
199+
view_key |= MeshPipelineKey::MOTION_VECTOR_PREPASS;
200+
}
201+
202+
if deferred_prepass {
203+
view_key |= MeshPipelineKey::DEFERRED_PREPASS;
204+
}
205+
174206
for (entity, handle) in &line_gizmos {
175207
let Some(line_gizmo) = line_gizmo_assets.get(handle) else {
176208
continue;
@@ -180,7 +212,7 @@ fn queue_line_gizmos_3d(
180212
&pipeline_cache,
181213
&pipeline,
182214
LineGizmoPipelineKey {
183-
mesh_key,
215+
view_key,
184216
strip: line_gizmo.strip,
185217
perspective: config.line_perspective,
186218
},

0 commit comments

Comments
 (0)