1use bevy_app::{App, Plugin};
4use bevy_asset::{embedded_asset, AssetServer, Handle};
5use bevy_core_pipeline::{
6 mip_generation::experimental::depth::ViewDepthPyramid,
7 schedule::{Core3d, Core3dSystems},
8 upscaling::upscaling,
9 FullscreenShader,
10};
11use bevy_ecs::{
12 component::Component,
13 entity::Entity,
14 message::{Message, MessageReader, MessageWriter},
15 prelude::{Has, ReflectComponent},
16 reflect::ReflectResource,
17 resource::Resource,
18 schedule::IntoScheduleConfigs,
19 system::{Commands, Query, Res, ResMut},
20};
21use bevy_input::{prelude::KeyCode, ButtonInput};
22use bevy_log::info;
23use bevy_reflect::{std_traits::ReflectDefault, Reflect};
24use bevy_render::{
25 extract_component::{ExtractComponent, ExtractComponentPlugin},
26 extract_resource::{ExtractResource, ExtractResourcePlugin},
27 render_resource::{
28 binding_types, BindGroupEntries, BindGroupLayout, BindGroupLayoutDescriptor,
29 BindGroupLayoutEntries, CachedRenderPipelineId, ColorTargetState, ColorWrites,
30 DynamicUniformBuffer, FragmentState, Operations, PipelineCache, RenderPassColorAttachment,
31 RenderPassDescriptor, RenderPipelineDescriptor, Sampler, SamplerDescriptor, ShaderStages,
32 ShaderType, SpecializedRenderPipeline, SpecializedRenderPipelines, TextureFormat,
33 TextureSampleType, VertexState,
34 },
35 renderer::{RenderContext, RenderDevice, RenderQueue, ViewQuery},
36 texture::FallbackImage,
37 view::{ExtractedView, ViewTarget},
38 GpuResourceAppExt, Render, RenderApp, RenderStartup, RenderSystems,
39};
40use bevy_shader::Shader;
41use bevy_ui_render::render_pass::ui_pass;
42
43use bevy_pbr::{
44 MeshPipelineSystems, MeshPipelineViewLayoutKey, MeshPipelineViewLayouts, MeshViewBindGroup,
45 ViewKeyCache,
46};
47
48#[derive(#[automatically_derived]
impl ::core::default::Default for RenderDebugOverlayPlugin {
#[inline]
fn default() -> Self { Self }
}Default)]
70pub struct RenderDebugOverlayPlugin;
71
72impl Plugin for RenderDebugOverlayPlugin {
73 fn build(&self, app: &mut App) {
74 {
{
let mut embedded =
app.world_mut().resource_mut::<::bevy_asset::io::embedded::EmbeddedAssetRegistry>();
let path =
{
let crate_name =
"bevy_dev_tools::render_debug".split(':').next().unwrap();
::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
"src".as_ref(), "src/render_debug.rs".as_ref(),
"debug_overlay.wesl".as_ref())
};
let watched_path =
::bevy_asset::io::embedded::watched_path("src/render_debug.rs",
"debug_overlay.wesl");
embedded.insert_asset(watched_path, &path,
b"import bevy_pbr::render::mesh_view_bindings::view;\nimport bevy_pbr::render::mesh_view_bindings::depth_prepass_texture;\nimport bevy_pbr::render::mesh_view_bindings::normal_prepass_texture;\nimport bevy_pbr::render::mesh_view_bindings::motion_vector_prepass_texture;\nimport bevy_pbr::render::mesh_view_bindings::deferred_prepass_texture;\nimport bevy_pbr::render::view_transformations::depth_ndc_to_view_z;\nimport bevy_pbr::deferred::types::unpack_24bit_normal;\nimport bevy_pbr::deferred::types::unpack_unorm4x8_;\nimport bevy_pbr::deferred::types::unpack_unorm3x4_plus_unorm_20_;\nimport bevy_pbr::render::rgb9e5::rgb9e5_to_vec3_;\nimport bevy_render::utils::octahedral_decode;\n\nstruct DebugBufferConfig {\n opacity: f32,\n mip_level: u32,\n}\n\n@group(1) @binding(0) var<uniform> config: DebugBufferConfig;\n@group(1) @binding(1) var background_texture: texture_2d<f32>;\n@group(1) @binding(2) var background_sampler: sampler;\n\n@if(DEBUG_DEPTH_PYRAMID) {\n@group(1) @binding(3) var depth_pyramid_texture: texture_2d<f32>;\n@group(1) @binding(4) var depth_pyramid_sampler: sampler;\n}\n\n@fragment\nfn fragment(@builtin(position) frag_coord: vec4<f32>) -> @location(0) vec4<f32> {\n let uv = frag_coord.xy / view.viewport.zw;\n let background = textureSampleLevel(background_texture, background_sampler, uv, 0.0);\n var output_color: vec4<f32> = vec4(0.0);\n\n@if(DEBUG_DEPTH) {\n @if(DEPTH_PREPASS) {\n let depth = textureLoad(depth_prepass_texture, vec2<i32>(frag_coord.xy), 0);\n output_color = vec4(vec3(depth), 1.0);\n }\n @else {\n output_color = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n@if(DEBUG_NORMAL) {\n @if(NORMAL_PREPASS) {\n let normal_sample = textureLoad(normal_prepass_texture, vec2<i32>(frag_coord.xy), 0);\n output_color = vec4(normal_sample.xyz, 1.0);\n }\n @else {\n @if(DEFERRED_PREPASS) {\n let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);\n let normal = octahedral_decode(unpack_24bit_normal(deferred.a));\n output_color = vec4(normal * 0.5 + 0.5, 1.0);\n }\n @else {\n output_color = vec4(1.0, 0.0, 1.0, 1.0);\n }\n }\n}\n\n@if(DEBUG_MOTION_VECTORS) {\n @if(MOTION_VECTOR_PREPASS) {\n let motion_vector = textureLoad(motion_vector_prepass_texture, vec2<i32>(frag_coord.xy), 0).rg;\n // These motion vectors are stored in a format where 1.0 represents full-screen movement.\n // We use a power curve to amplify small movements while keeping them centered.\n let mapped_motion = sign(motion_vector) * pow(abs(motion_vector), vec2(0.2)) * 0.5 + 0.5;\n output_color = vec4(mapped_motion, 0.5, 1.0);\n }\n @else {\n output_color = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n@if(DEBUG_DEFERRED) {\n @if(DEFERRED_PREPASS) {\n let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);\n output_color = vec4(vec3(f32(deferred.x) / 255.0, f32(deferred.y) / 255.0, f32(deferred.z) / 255.0), 1.0);\n }\n @else {\n output_color = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n@if(DEBUG_DEFERRED_BASE_COLOR) {\n @if(DEFERRED_PREPASS) {\n let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);\n let base_rough = unpack_unorm4x8_(deferred.x);\n output_color = vec4(pow(base_rough.rgb, vec3(2.2)), 1.0);\n }\n @else {\n output_color = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n@if(DEBUG_DEFERRED_EMISSIVE) {\n @if(DEFERRED_PREPASS) {\n let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);\n let emissive = rgb9e5_to_vec3_(deferred.y);\n output_color = vec4(emissive, 1.0);\n }\n @else {\n output_color = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n@if(DEBUG_DEFERRED_METALLIC_ROUGHNESS) {\n @if(DEFERRED_PREPASS) {\n let deferred = textureLoad(deferred_prepass_texture, vec2<i32>(frag_coord.xy), 0);\n let base_rough = unpack_unorm4x8_(deferred.x);\n let props = unpack_unorm4x8_(deferred.z);\n // R: Reflectance, G: Metallic, B: Occlusion, A: Perceptual Roughness\n output_color = vec4(props.r, props.g, props.b, base_rough.a);\n }\n @else {\n output_color = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n@if(DEBUG_DEPTH_PYRAMID) {\n let depth_pyramid = textureSampleLevel(depth_pyramid_texture, depth_pyramid_sampler, uv, f32(config.mip_level)).r;\n output_color = vec4(vec3(depth_pyramid), 1.0);\n}\n\n let alpha = output_color.a * config.opacity;\n return vec4(mix(background.rgb, output_color.rgb, alpha), 1.0);\n}\n");
}
};embedded_asset!(app, "debug_overlay.wesl");
75
76 app.register_type::<RenderDebugOverlay>()
77 .register_type::<GlobalRenderDebugOverlay>()
78 .init_resource::<GlobalRenderDebugOverlay>()
79 .add_message::<RenderDebugOverlayEvent>()
80 .init_resource::<RenderDebugOverlayKeybindings>()
81 .add_plugins((
82 ExtractResourcePlugin::<GlobalRenderDebugOverlay>::default(),
83 ExtractComponentPlugin::<RenderDebugOverlay>::default(),
84 ))
85 .add_systems(bevy_app::Update, (handle_input, update_overlay).chain());
86
87 let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
88 return;
89 };
90
91 render_app.add_systems(
92 RenderStartup,
93 init_render_debug_overlay_pipeline.after(MeshPipelineSystems),
94 );
95 }
96
97 fn finish(&self, app: &mut App) {
98 let Some(render_app) = app.get_sub_app_mut(RenderApp) else {
99 return;
100 };
101
102 render_app
103 .init_gpu_resource::<SpecializedRenderPipelines<RenderDebugOverlayPipeline>>()
104 .init_gpu_resource::<RenderDebugOverlayUniforms>()
105 .add_systems(
106 Render,
107 (
108 prepare_debug_overlay_pipelines.in_set(RenderSystems::Prepare),
109 prepare_debug_overlay_resources.in_set(RenderSystems::PrepareResources),
110 ),
111 )
112 .add_systems(
113 Core3d,
114 render_debug_overlay
115 .after(Core3dSystems::PostProcess)
116 .before(ui_pass)
117 .before(upscaling),
118 );
119 }
120}
121
122#[derive(impl bevy_ecs::component::Component for RenderDebugOverlayKeybindings where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::SparseSet;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {
let resource_component_id =
if let ::core::option::Option::Some(id) =
required_components.components_registrator().component_id::<RenderDebugOverlayKeybindings>()
{
id
} else {
required_components.components_registrator().register_component::<RenderDebugOverlayKeybindings>()
};
required_components.register_required::<bevy_ecs::resource::IsResource>(move
||
bevy_ecs::resource::IsResource::new(resource_component_id));
}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}
impl bevy_ecs::resource::Resource for RenderDebugOverlayKeybindings where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RenderDebugOverlayKeybindings { }
#[automatically_derived]
impl ::core::clone::Clone for RenderDebugOverlayKeybindings {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<KeyCode>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RenderDebugOverlayKeybindings { }Copy)]
131pub struct RenderDebugOverlayKeybindings {
132 pub enable_keybindings: bool,
134 pub cycle_mode: KeyCode,
136 pub cycle_opacity: KeyCode,
138}
139
140impl Default for RenderDebugOverlayKeybindings {
142 fn default() -> Self {
143 Self {
144 enable_keybindings: false,
145 cycle_mode: KeyCode::F1,
146 cycle_opacity: KeyCode::F2,
147 }
148 }
149}
150
151pub fn handle_input(
153 keyboard: Res<ButtonInput<KeyCode>>,
154 keybindings: Res<RenderDebugOverlayKeybindings>,
155 mut events: MessageWriter<RenderDebugOverlayEvent>,
156) {
157 if !keybindings.enable_keybindings {
158 return;
159 }
160
161 if keyboard.just_pressed(keybindings.cycle_mode) {
162 events.write(RenderDebugOverlayEvent::CycleMode);
163 }
164 if keyboard.just_pressed(keybindings.cycle_opacity) {
165 events.write(RenderDebugOverlayEvent::CycleOpacity);
166 }
167}
168
169pub fn update_overlay(
171 mut commands: Commands,
172 mut events: MessageReader<RenderDebugOverlayEvent>,
173 mut config_res: ResMut<GlobalRenderDebugOverlay>,
174 cameras: Query<
175 (
176 Entity,
177 Option<&RenderDebugOverlay>,
178 Has<bevy_core_pipeline::prepass::DepthPrepass>,
179 Has<bevy_core_pipeline::prepass::NormalPrepass>,
180 Has<bevy_core_pipeline::prepass::MotionVectorPrepass>,
181 Has<bevy_core_pipeline::prepass::DeferredPrepass>,
182 Has<bevy_render::occlusion_culling::OcclusionCulling>,
183 Has<bevy_pbr::ScreenSpaceReflections>,
184 ),
185 bevy_ecs::query::With<bevy_camera::Camera>,
186 >,
187) {
188 let mut changed = false;
189
190 for event in events.read() {
191 match event {
192 RenderDebugOverlayEvent::CycleMode => {
193 let modes = [
194 RenderDebugMode::Depth,
195 RenderDebugMode::Normal,
196 RenderDebugMode::MotionVectors,
197 RenderDebugMode::Deferred,
198 RenderDebugMode::DeferredBaseColor,
199 RenderDebugMode::DeferredEmissive,
200 RenderDebugMode::DeferredMetallicRoughness,
201 RenderDebugMode::DepthPyramid { mip_level: 0 },
202 ];
203
204 let is_supported = |mode: &RenderDebugMode| {
205 cameras.iter().any(
206 |(_, _, depth, normal, motion, deferred, occlusion, _ssr)| {
207 match mode {
208 RenderDebugMode::Depth => depth || deferred,
209 RenderDebugMode::Normal => normal || deferred,
210 RenderDebugMode::MotionVectors => motion,
211 RenderDebugMode::Deferred
212 | RenderDebugMode::DeferredBaseColor
213 | RenderDebugMode::DeferredEmissive
214 | RenderDebugMode::DeferredMetallicRoughness => deferred,
215 RenderDebugMode::DepthPyramid { .. } => depth && occlusion,
219 }
220 },
221 )
222 };
223
224 if !config_res.enabled {
225 for mode in modes {
226 if is_supported(&mode) {
227 config_res.enabled = true;
228 config_res.mode = mode;
229 break;
230 }
231 }
232 } else {
233 let current_index = modes
234 .iter()
235 .position(|m| {
236 core::mem::discriminant(m) == core::mem::discriminant(&config_res.mode)
237 })
238 .unwrap_or(0);
239
240 let mut next_mode = None;
241
242 if let RenderDebugMode::DepthPyramid { mip_level } = config_res.mode
243 && mip_level < 7
244 {
245 config_res.mode = RenderDebugMode::DepthPyramid {
246 mip_level: mip_level + 1,
247 };
248 next_mode = Some(config_res.mode);
249 }
250
251 if next_mode.is_none() {
252 for i in 1..modes.len() {
253 let idx = (current_index + i) % modes.len();
254 if is_supported(&modes[idx]) {
255 next_mode = Some(modes[idx]);
256 break;
257 }
258 }
259
260 if let Some(mode) = next_mode {
261 let next_index = modes
262 .iter()
263 .position(|m| {
264 core::mem::discriminant(m) == core::mem::discriminant(&mode)
265 })
266 .unwrap();
267
268 if next_index <= current_index {
269 config_res.enabled = false;
270 } else {
271 config_res.mode = mode;
272 }
273 } else {
274 config_res.enabled = false;
275 }
276 }
277 }
278 changed = true;
279
280 if config_res.enabled {
281 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event src/render_debug.rs:281",
"bevy_dev_tools::render_debug", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("src/render_debug.rs"),
::tracing_core::__macro_support::Option::Some(281u32),
::tracing_core::__macro_support::Option::Some("bevy_dev_tools::render_debug"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Debug Overlay: {0:?}",
config_res.mode) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("Debug Overlay: {:?}", config_res.mode);
282 } else {
283 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event src/render_debug.rs:283",
"bevy_dev_tools::render_debug", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("src/render_debug.rs"),
::tracing_core::__macro_support::Option::Some(283u32),
::tracing_core::__macro_support::Option::Some("bevy_dev_tools::render_debug"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Debug Overlay Disabled")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("Debug Overlay Disabled");
284 }
285 }
286 RenderDebugOverlayEvent::CycleOpacity => {
287 config_res.opacity = if config_res.opacity < 0.5 {
288 0.5
289 } else if config_res.opacity < 0.8 {
290 0.8
291 } else if config_res.opacity < 1.0 {
292 1.0
293 } else {
294 0.5
295 };
296 changed = true;
297 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event src/render_debug.rs:297",
"bevy_dev_tools::render_debug", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("src/render_debug.rs"),
::tracing_core::__macro_support::Option::Some(297u32),
::tracing_core::__macro_support::Option::Some("bevy_dev_tools::render_debug"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Debug Overlay Opacity: {0}",
config_res.opacity) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("Debug Overlay Opacity: {}", config_res.opacity);
298 }
299 }
300 }
301
302 let config_comp = RenderDebugOverlay {
303 enabled: config_res.enabled,
304 mode: config_res.mode,
305 opacity: config_res.opacity,
306 };
307
308 for (entity, existing_config, ..) in &cameras {
309 if existing_config.is_none() || (changed && Some(&config_comp) != existing_config) {
310 commands.entity(entity).insert(config_comp.clone());
311 }
312 }
313}
314
315#[derive(impl bevy_ecs::message::Message for RenderDebugOverlayEvent where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Message, #[automatically_derived]
impl ::core::fmt::Debug for RenderDebugOverlayEvent {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RenderDebugOverlayEvent::CycleMode => "CycleMode",
RenderDebugOverlayEvent::CycleOpacity => "CycleOpacity",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for RenderDebugOverlayEvent { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RenderDebugOverlayEvent { }
#[automatically_derived]
impl ::core::clone::Clone for RenderDebugOverlayEvent {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RenderDebugOverlayEvent { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RenderDebugOverlayEvent {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RenderDebugOverlayEvent { }Eq, #[automatically_derived]
impl ::core::hash::Hash for RenderDebugOverlayEvent {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl bevy_reflect::GetTypeRegistration for RenderDebugOverlayEvent
where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {}
}
impl bevy_reflect::Typed for RenderDebugOverlayEvent where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Enum(bevy_reflect::enums::EnumInfo::new::<Self>(&[bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("CycleMode")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("CycleOpacity"))]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for RenderDebugOverlayEvent where {
fn type_path() -> &'static str {
"bevy_dev_tools::render_debug::RenderDebugOverlayEvent"
}
fn short_type_path() -> &'static str { "RenderDebugOverlayEvent" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("RenderDebugOverlayEvent")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug")
}
}
impl bevy_reflect::Reflect for RenderDebugOverlayEvent where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<RenderDebugOverlayEvent
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::enums::Enum for RenderDebugOverlayEvent where {
fn field(&self, __name_param: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn field_at(&self, __index_param: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn field_mut(&mut self, __name_param: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn field_at_mut(&mut self, __index_param: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self { _ => ::core::option::Option::None, }
}
fn index_of(&self, __name_param: &str)
-> ::core::option::Option<usize> {
match self { _ => ::core::option::Option::None, }
}
fn name_at(&self, __index_param: usize)
-> ::core::option::Option<&str> {
match self { _ => ::core::option::Option::None, }
}
fn iter_fields(&self) -> bevy_reflect::enums::VariantFieldIter {
bevy_reflect::enums::VariantFieldIter::new(self)
}
#[inline]
fn field_len(&self) -> usize {
match self {
RenderDebugOverlayEvent::CycleMode { .. } => 0usize,
RenderDebugOverlayEvent::CycleOpacity { .. } => 0usize,
_ => 0,
}
}
#[inline]
fn variant_name(&self) -> &str {
match self {
RenderDebugOverlayEvent::CycleMode { .. } => "CycleMode",
RenderDebugOverlayEvent::CycleOpacity { .. } =>
"CycleOpacity",
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_index(&self) -> usize {
match self {
RenderDebugOverlayEvent::CycleMode { .. } => 0usize,
RenderDebugOverlayEvent::CycleOpacity { .. } => 1usize,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_type(&self) -> bevy_reflect::enums::VariantType {
match self {
RenderDebugOverlayEvent::CycleMode { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugOverlayEvent::CycleOpacity { .. } =>
bevy_reflect::enums::VariantType::Unit,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
fn to_dynamic_enum(&self)
->
::core::result::Result<bevy_reflect::enums::DynamicEnum,
bevy_reflect::ReflectCloneError> {
bevy_reflect::enums::DynamicEnum::try_from_ref::<Self>(self)
}
}
impl bevy_reflect::PartialReflect for RenderDebugOverlayEvent where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self,
__value_param: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Enum(__value_param) =
bevy_reflect::PartialReflect::reflect_ref(__value_param) {
if bevy_reflect::enums::Enum::variant_name(self) ==
bevy_reflect::enums::Enum::variant_name(__value_param) {
match bevy_reflect::enums::Enum::variant_type(__value_param)
{
bevy_reflect::enums::VariantType::Struct => {
for field in
bevy_reflect::enums::Enum::iter_fields(__value_param) {
let name = field.name().unwrap();
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
bevy_reflect::enums::VariantType::Tuple => {
for (index, field) in
::core::iter::Iterator::enumerate(bevy_reflect::enums::Enum::iter_fields(__value_param))
{
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_at_mut(self, index) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
_ => {}
}
} else {
match bevy_reflect::enums::Enum::variant_name(__value_param)
{
"CycleMode" => {
*self = RenderDebugOverlayEvent::CycleMode {}
}
"CycleOpacity" => {
*self = RenderDebugOverlayEvent::CycleOpacity {}
}
name => {
return ::core::result::Result::Err(bevy_reflect::ApplyError::UnknownVariant {
enum_name: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(self)),
variant_name: ::core::convert::Into::into(name),
});
}
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(__value_param),
to_kind: bevy_reflect::ReflectKind::Enum,
});
}
::core::result::Result::Ok(())
}
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Enum
}
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Enum(self)
}
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Enum(self)
}
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Enum(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_hash(&self) -> ::core::option::Option<u64> {
use ::core::hash::{Hash, Hasher};
let mut hasher = bevy_reflect::utility::reflect_hasher();
Hash::hash(&::core::any::Any::type_id(self), &mut hasher);
Hash::hash(self, &mut hasher);
::core::option::Option::Some(Hasher::finish(&hasher))
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
let value =
<dyn bevy_reflect::PartialReflect>::try_downcast_ref::<Self>(value);
if let ::core::option::Option::Some(value) = value {
::core::option::Option::Some(::core::cmp::PartialEq::eq(self,
value))
} else { ::core::option::Option::Some(false) }
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::enums::enum_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
#[allow(unreachable_code, reason =
"Ignored fields without a `clone` attribute will early-return with an error")]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
let this = self;
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(match this
{
RenderDebugOverlayEvent::CycleMode {} =>
RenderDebugOverlayEvent::CycleMode {},
RenderDebugOverlayEvent::CycleOpacity {} =>
RenderDebugOverlayEvent::CycleOpacity {},
}))
}
}
impl bevy_reflect::FromReflect for RenderDebugOverlayEvent where {
fn from_reflect(__param0: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Enum(__param0) =
bevy_reflect::PartialReflect::reflect_ref(__param0) {
match bevy_reflect::enums::Enum::variant_name(__param0) {
"CycleMode" =>
::core::option::Option::Some(RenderDebugOverlayEvent::CycleMode {}),
"CycleOpacity" =>
::core::option::Option::Some(RenderDebugOverlayEvent::CycleOpacity {}),
name => ::core::option::Option::None,
}
} else { ::core::option::Option::None }
}
}
};Reflect)]
317#[reflect(Debug, PartialEq, Hash)]
318pub enum RenderDebugOverlayEvent {
319 CycleMode,
321 CycleOpacity,
323}
324
325#[derive(impl bevy_ecs::component::Component for RenderDebugOverlay where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component, #[automatically_derived]
impl ::core::clone::Clone for RenderDebugOverlay {
#[inline]
fn clone(&self) -> Self {
Self {
enabled: ::core::clone::Clone::clone(&self.enabled),
mode: ::core::clone::Clone::clone(&self.mode),
opacity: ::core::clone::Clone::clone(&self.opacity),
}
}
}Clone, impl bevy_extract::sync_component::SyncComponent<RenderApp> for
RenderDebugOverlay where Self: ::core::clone::Clone {
type Target = Self;
}
impl bevy_extract::extract_component::ExtractComponent<RenderApp> for
RenderDebugOverlay where Self: ::core::clone::Clone {
type QueryData = &'static Self;
type QueryFilter = ();
type Out = Self;
fn extract_component(item:
bevy_ecs::query::QueryItem<'_, '_, Self::QueryData>)
-> ::core::option::Option<Self::Out> {
::core::option::Option::Some(item.clone())
}
}ExtractComponent, const _: () =
{
impl bevy_reflect::GetTypeRegistration for RenderDebugOverlay where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectComponent, Self,
_>(());
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<bool as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<RenderDebugMode as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<f32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for RenderDebugOverlay where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<bool>("enabled"),
bevy_reflect::NamedField::new::<RenderDebugMode>("mode"),
bevy_reflect::NamedField::new::<f32>("opacity")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for RenderDebugOverlay where {
fn type_path() -> &'static str {
"bevy_dev_tools::render_debug::RenderDebugOverlay"
}
fn short_type_path() -> &'static str { "RenderDebugOverlay" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("RenderDebugOverlay")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug")
}
}
impl bevy_reflect::Reflect for RenderDebugOverlay where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<RenderDebugOverlay
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for RenderDebugOverlay where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"enabled" => ::core::option::Option::Some(&self.enabled),
"mode" => ::core::option::Option::Some(&self.mode),
"opacity" => ::core::option::Option::Some(&self.opacity),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"enabled" =>
::core::option::Option::Some(&mut self.enabled),
"mode" => ::core::option::Option::Some(&mut self.mode),
"opacity" =>
::core::option::Option::Some(&mut self.opacity),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.enabled),
1usize => ::core::option::Option::Some(&self.mode),
2usize => ::core::option::Option::Some(&self.opacity),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.enabled),
1usize => ::core::option::Option::Some(&mut self.mode),
2usize => ::core::option::Option::Some(&mut self.opacity),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("enabled"),
1usize => ::core::option::Option::Some("mode"),
2usize => ::core::option::Option::Some("opacity"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"enabled" => ::core::option::Option::Some(0usize),
"mode" => ::core::option::Option::Some(1usize),
"opacity" => ::core::option::Option::Some(2usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 3usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("enabled",
bevy_reflect::PartialReflect::to_dynamic(&self.enabled)?);
dynamic.insert_boxed("mode",
bevy_reflect::PartialReflect::to_dynamic(&self.mode)?);
dynamic.insert_boxed("opacity",
bevy_reflect::PartialReflect::to_dynamic(&self.opacity)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for RenderDebugOverlay where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
#[inline]
#[allow(unreachable_code, reason =
"Ignored fields without a `clone` attribute will early-return with an error")]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(Self {
enabled: <bool as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.enabled)?,
mode: <RenderDebugMode as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.mode)?,
opacity: <f32 as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.opacity)?,
}))
}
}
impl bevy_reflect::FromReflect for RenderDebugOverlay where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<bool as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"enabled")?))() {
__this.enabled = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<RenderDebugMode as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"mode")?))() {
__this.mode = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<f32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"opacity")?))() {
__this.opacity = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RenderDebugOverlay { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RenderDebugOverlay {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.enabled == other.enabled && self.opacity == other.opacity &&
self.mode == other.mode
}
}PartialEq)]
328#[reflect(Component, Default)]
329#[extract_app(RenderApp)]
330pub struct RenderDebugOverlay {
331 pub enabled: bool,
333 pub mode: RenderDebugMode,
335 pub opacity: f32,
337}
338
339impl Default for RenderDebugOverlay {
340 fn default() -> Self {
341 Self {
342 enabled: false,
343 mode: RenderDebugMode::Depth,
344 opacity: 1.0,
345 }
346 }
347}
348
349#[derive(impl bevy_ecs::component::Component for GlobalRenderDebugOverlay where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::SparseSet;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {
let resource_component_id =
if let ::core::option::Option::Some(id) =
required_components.components_registrator().component_id::<GlobalRenderDebugOverlay>()
{
id
} else {
required_components.components_registrator().register_component::<GlobalRenderDebugOverlay>()
};
required_components.register_required::<bevy_ecs::resource::IsResource>(move
||
bevy_ecs::resource::IsResource::new(resource_component_id));
}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}
impl bevy_ecs::resource::Resource for GlobalRenderDebugOverlay where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource, #[automatically_derived]
impl ::core::clone::Clone for GlobalRenderDebugOverlay {
#[inline]
fn clone(&self) -> Self {
Self {
enabled: ::core::clone::Clone::clone(&self.enabled),
mode: ::core::clone::Clone::clone(&self.mode),
opacity: ::core::clone::Clone::clone(&self.opacity),
}
}
}Clone, impl bevy_extract::extract_resource::ExtractResource<RenderApp> for
GlobalRenderDebugOverlay where Self: ::core::clone::Clone {
type Source = Self;
fn extract_resource(source: &Self::Source) -> Self { source.clone() }
}ExtractResource, impl bevy_extract::sync_component::SyncComponent<RenderApp> for
GlobalRenderDebugOverlay where Self: ::core::clone::Clone {
type Target = Self;
}
impl bevy_extract::extract_component::ExtractComponent<RenderApp> for
GlobalRenderDebugOverlay where Self: ::core::clone::Clone {
type QueryData = &'static Self;
type QueryFilter = ();
type Out = Self;
fn extract_component(item:
bevy_ecs::query::QueryItem<'_, '_, Self::QueryData>)
-> ::core::option::Option<Self::Out> {
::core::option::Option::Some(item.clone())
}
}ExtractComponent, const _: () =
{
impl bevy_reflect::GetTypeRegistration for GlobalRenderDebugOverlay
where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectResource, Self,
_>(());
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<bool as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<RenderDebugMode as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<f32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for GlobalRenderDebugOverlay where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<bool>("enabled"),
bevy_reflect::NamedField::new::<RenderDebugMode>("mode"),
bevy_reflect::NamedField::new::<f32>("opacity")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for GlobalRenderDebugOverlay where {
fn type_path() -> &'static str {
"bevy_dev_tools::render_debug::GlobalRenderDebugOverlay"
}
fn short_type_path() -> &'static str {
"GlobalRenderDebugOverlay"
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("GlobalRenderDebugOverlay")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug")
}
}
impl bevy_reflect::Reflect for GlobalRenderDebugOverlay where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<GlobalRenderDebugOverlay
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for GlobalRenderDebugOverlay where
{
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"enabled" => ::core::option::Option::Some(&self.enabled),
"mode" => ::core::option::Option::Some(&self.mode),
"opacity" => ::core::option::Option::Some(&self.opacity),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"enabled" =>
::core::option::Option::Some(&mut self.enabled),
"mode" => ::core::option::Option::Some(&mut self.mode),
"opacity" =>
::core::option::Option::Some(&mut self.opacity),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.enabled),
1usize => ::core::option::Option::Some(&self.mode),
2usize => ::core::option::Option::Some(&self.opacity),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.enabled),
1usize => ::core::option::Option::Some(&mut self.mode),
2usize => ::core::option::Option::Some(&mut self.opacity),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("enabled"),
1usize => ::core::option::Option::Some("mode"),
2usize => ::core::option::Option::Some("opacity"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"enabled" => ::core::option::Option::Some(0usize),
"mode" => ::core::option::Option::Some(1usize),
"opacity" => ::core::option::Option::Some(2usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 3usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("enabled",
bevy_reflect::PartialReflect::to_dynamic(&self.enabled)?);
dynamic.insert_boxed("mode",
bevy_reflect::PartialReflect::to_dynamic(&self.mode)?);
dynamic.insert_boxed("opacity",
bevy_reflect::PartialReflect::to_dynamic(&self.opacity)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for GlobalRenderDebugOverlay where
{
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
#[inline]
#[allow(unreachable_code, reason =
"Ignored fields without a `clone` attribute will early-return with an error")]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(Self {
enabled: <bool as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.enabled)?,
mode: <RenderDebugMode as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.mode)?,
opacity: <f32 as
bevy_reflect::PartialReflect>::reflect_clone_and_take(&self.opacity)?,
}))
}
}
impl bevy_reflect::FromReflect for GlobalRenderDebugOverlay where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<bool as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"enabled")?))() {
__this.enabled = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<RenderDebugMode as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"mode")?))() {
__this.mode = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<f32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"opacity")?))() {
__this.opacity = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for GlobalRenderDebugOverlay { }
#[automatically_derived]
impl ::core::cmp::PartialEq for GlobalRenderDebugOverlay {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.enabled == other.enabled && self.opacity == other.opacity &&
self.mode == other.mode
}
}PartialEq)]
352#[reflect(Resource, Default)]
353#[extract_app(RenderApp)]
354pub struct GlobalRenderDebugOverlay {
355 pub enabled: bool,
357 pub mode: RenderDebugMode,
359 pub opacity: f32,
361}
362
363impl Default for GlobalRenderDebugOverlay {
364 fn default() -> Self {
365 Self {
366 enabled: false,
367 mode: RenderDebugMode::Depth,
368 opacity: 1.0,
369 }
370 }
371}
372
373#[expect(missing_docs, reason = "Enum variants are self-explanatory")]
375#[derive(#[automatically_derived]
impl ::core::default::Default for RenderDebugMode {
#[inline]
fn default() -> Self { Self::Depth }
}Default, #[automatically_derived]
impl ::core::fmt::Debug for RenderDebugMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Depth => ::core::fmt::Formatter::write_str(f, "Depth"),
Self::Normal => ::core::fmt::Formatter::write_str(f, "Normal"),
Self::MotionVectors =>
::core::fmt::Formatter::write_str(f, "MotionVectors"),
Self::Deferred =>
::core::fmt::Formatter::write_str(f, "Deferred"),
Self::DeferredBaseColor =>
::core::fmt::Formatter::write_str(f, "DeferredBaseColor"),
Self::DeferredEmissive =>
::core::fmt::Formatter::write_str(f, "DeferredEmissive"),
Self::DeferredMetallicRoughness =>
::core::fmt::Formatter::write_str(f,
"DeferredMetallicRoughness"),
Self::DepthPyramid { mip_level: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"DepthPyramid", "mip_level", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for RenderDebugMode { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RenderDebugMode { }
#[automatically_derived]
impl ::core::clone::Clone for RenderDebugMode {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RenderDebugMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RenderDebugMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::DepthPyramid { mip_level: __self_0 },
Self::DepthPyramid { mip_level: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RenderDebugMode {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u32>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for RenderDebugMode {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::DepthPyramid { mip_level: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl bevy_reflect::GetTypeRegistration for RenderDebugMode where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for RenderDebugMode where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Enum(bevy_reflect::enums::EnumInfo::new::<Self>(&[bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Depth")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Normal")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("MotionVectors")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Deferred")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("DeferredBaseColor")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("DeferredEmissive")),
bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("DeferredMetallicRoughness")),
bevy_reflect::enums::VariantInfo::Struct(bevy_reflect::enums::StructVariantInfo::new("DepthPyramid",
&[bevy_reflect::NamedField::new::<u32>("mip_level")]))]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for RenderDebugMode where {
fn type_path() -> &'static str {
"bevy_dev_tools::render_debug::RenderDebugMode"
}
fn short_type_path() -> &'static str { "RenderDebugMode" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("RenderDebugMode")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_dev_tools::render_debug")
}
}
impl bevy_reflect::Reflect for RenderDebugMode where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<RenderDebugMode
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::enums::Enum for RenderDebugMode where {
fn field(&self, __name_param: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self {
RenderDebugMode::DepthPyramid { mip_level: __value, .. } if
__name_param == "mip_level" =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, __index_param: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self {
RenderDebugMode::DepthPyramid { mip_level: __value, .. } if
__index_param == 0usize =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, __name_param: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self {
RenderDebugMode::DepthPyramid { mip_level: __value, .. } if
__name_param == "mip_level" =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, __index_param: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self {
RenderDebugMode::DepthPyramid { mip_level: __value, .. } if
__index_param == 0usize =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn index_of(&self, __name_param: &str)
-> ::core::option::Option<usize> {
match self {
RenderDebugMode::DepthPyramid { .. } if
__name_param == "mip_level" =>
::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, __index_param: usize)
-> ::core::option::Option<&str> {
match self {
RenderDebugMode::DepthPyramid { .. } if
__index_param == 0usize =>
::core::option::Option::Some("mip_level"),
_ => ::core::option::Option::None,
}
}
fn iter_fields(&self) -> bevy_reflect::enums::VariantFieldIter {
bevy_reflect::enums::VariantFieldIter::new(self)
}
#[inline]
fn field_len(&self) -> usize {
match self {
RenderDebugMode::Depth { .. } => 0usize,
RenderDebugMode::Normal { .. } => 0usize,
RenderDebugMode::MotionVectors { .. } => 0usize,
RenderDebugMode::Deferred { .. } => 0usize,
RenderDebugMode::DeferredBaseColor { .. } => 0usize,
RenderDebugMode::DeferredEmissive { .. } => 0usize,
RenderDebugMode::DeferredMetallicRoughness { .. } => 0usize,
RenderDebugMode::DepthPyramid { .. } => 1usize,
_ => 0,
}
}
#[inline]
fn variant_name(&self) -> &str {
match self {
RenderDebugMode::Depth { .. } => "Depth",
RenderDebugMode::Normal { .. } => "Normal",
RenderDebugMode::MotionVectors { .. } => "MotionVectors",
RenderDebugMode::Deferred { .. } => "Deferred",
RenderDebugMode::DeferredBaseColor { .. } =>
"DeferredBaseColor",
RenderDebugMode::DeferredEmissive { .. } =>
"DeferredEmissive",
RenderDebugMode::DeferredMetallicRoughness { .. } =>
"DeferredMetallicRoughness",
RenderDebugMode::DepthPyramid { .. } => "DepthPyramid",
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_index(&self) -> usize {
match self {
RenderDebugMode::Depth { .. } => 0usize,
RenderDebugMode::Normal { .. } => 1usize,
RenderDebugMode::MotionVectors { .. } => 2usize,
RenderDebugMode::Deferred { .. } => 3usize,
RenderDebugMode::DeferredBaseColor { .. } => 4usize,
RenderDebugMode::DeferredEmissive { .. } => 5usize,
RenderDebugMode::DeferredMetallicRoughness { .. } => 6usize,
RenderDebugMode::DepthPyramid { .. } => 7usize,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_type(&self) -> bevy_reflect::enums::VariantType {
match self {
RenderDebugMode::Depth { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugMode::Normal { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugMode::MotionVectors { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugMode::Deferred { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugMode::DeferredBaseColor { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugMode::DeferredEmissive { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugMode::DeferredMetallicRoughness { .. } =>
bevy_reflect::enums::VariantType::Unit,
RenderDebugMode::DepthPyramid { .. } =>
bevy_reflect::enums::VariantType::Struct,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
fn to_dynamic_enum(&self)
->
::core::result::Result<bevy_reflect::enums::DynamicEnum,
bevy_reflect::ReflectCloneError> {
bevy_reflect::enums::DynamicEnum::try_from_ref::<Self>(self)
}
}
impl bevy_reflect::PartialReflect for RenderDebugMode where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self,
__value_param: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Enum(__value_param) =
bevy_reflect::PartialReflect::reflect_ref(__value_param) {
if bevy_reflect::enums::Enum::variant_name(self) ==
bevy_reflect::enums::Enum::variant_name(__value_param) {
match bevy_reflect::enums::Enum::variant_type(__value_param)
{
bevy_reflect::enums::VariantType::Struct => {
for field in
bevy_reflect::enums::Enum::iter_fields(__value_param) {
let name = field.name().unwrap();
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
bevy_reflect::enums::VariantType::Tuple => {
for (index, field) in
::core::iter::Iterator::enumerate(bevy_reflect::enums::Enum::iter_fields(__value_param))
{
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_at_mut(self, index) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
_ => {}
}
} else {
match bevy_reflect::enums::Enum::variant_name(__value_param)
{
"Depth" => { *self = RenderDebugMode::Depth {} }
"Normal" => { *self = RenderDebugMode::Normal {} }
"MotionVectors" => {
*self = RenderDebugMode::MotionVectors {}
}
"Deferred" => { *self = RenderDebugMode::Deferred {} }
"DeferredBaseColor" => {
*self = RenderDebugMode::DeferredBaseColor {}
}
"DeferredEmissive" => {
*self = RenderDebugMode::DeferredEmissive {}
}
"DeferredMetallicRoughness" => {
*self = RenderDebugMode::DeferredMetallicRoughness {}
}
"DepthPyramid" => {
*self =
RenderDebugMode::DepthPyramid {
mip_level: {
let __mip_level = __value_param.field("mip_level");
let __mip_level =
__mip_level.ok_or(bevy_reflect::ApplyError::MissingEnumField {
variant_name: ::core::convert::Into::into("DepthPyramid"),
field_name: ::core::convert::Into::into("mip_level"),
})?;
<u32 as
bevy_reflect::FromReflect>::from_reflect(__mip_level).ok_or(bevy_reflect::ApplyError::MismatchedTypes {
from_type: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(__mip_level)),
to_type: ::core::convert::Into::into(<u32 as
bevy_reflect::TypePath>::type_path()),
})?
},
}
}
name => {
return ::core::result::Result::Err(bevy_reflect::ApplyError::UnknownVariant {
enum_name: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(self)),
variant_name: ::core::convert::Into::into(name),
});
}
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(__value_param),
to_kind: bevy_reflect::ReflectKind::Enum,
});
}
::core::result::Result::Ok(())
}
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Enum
}
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Enum(self)
}
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Enum(self)
}
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Enum(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_hash(&self) -> ::core::option::Option<u64> {
(bevy_reflect::enums::enum_hash)(self)
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::enums::enum_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::enums::enum_partial_cmp)(self, value)
}
#[inline]
#[allow(unreachable_code, reason =
"Ignored fields without a `clone` attribute will early-return with an error")]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
let this = self;
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(match this
{
RenderDebugMode::Depth {} => RenderDebugMode::Depth {},
RenderDebugMode::Normal {} => RenderDebugMode::Normal {},
RenderDebugMode::MotionVectors {} =>
RenderDebugMode::MotionVectors {},
RenderDebugMode::Deferred {} =>
RenderDebugMode::Deferred {},
RenderDebugMode::DeferredBaseColor {} =>
RenderDebugMode::DeferredBaseColor {},
RenderDebugMode::DeferredEmissive {} =>
RenderDebugMode::DeferredEmissive {},
RenderDebugMode::DeferredMetallicRoughness {} =>
RenderDebugMode::DeferredMetallicRoughness {},
RenderDebugMode::DepthPyramid { mip_level: __mip_level } =>
RenderDebugMode::DepthPyramid {
mip_level: <u32 as
bevy_reflect::PartialReflect>::reflect_clone_and_take(__mip_level)?,
},
}))
}
}
impl bevy_reflect::FromReflect for RenderDebugMode where {
fn from_reflect(__param0: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Enum(__param0) =
bevy_reflect::PartialReflect::reflect_ref(__param0) {
match bevy_reflect::enums::Enum::variant_name(__param0) {
"Depth" =>
::core::option::Option::Some(RenderDebugMode::Depth {}),
"Normal" =>
::core::option::Option::Some(RenderDebugMode::Normal {}),
"MotionVectors" =>
::core::option::Option::Some(RenderDebugMode::MotionVectors {}),
"Deferred" =>
::core::option::Option::Some(RenderDebugMode::Deferred {}),
"DeferredBaseColor" =>
::core::option::Option::Some(RenderDebugMode::DeferredBaseColor {}),
"DeferredEmissive" =>
::core::option::Option::Some(RenderDebugMode::DeferredEmissive {}),
"DeferredMetallicRoughness" =>
::core::option::Option::Some(RenderDebugMode::DeferredMetallicRoughness {}),
"DepthPyramid" =>
::core::option::Option::Some(RenderDebugMode::DepthPyramid {
mip_level: {
let __mip_level = __param0.field("mip_level");
let __mip_level = __mip_level?;
<u32 as
bevy_reflect::FromReflect>::from_reflect(__mip_level)?
},
}),
name => ::core::option::Option::None,
}
} else { ::core::option::Option::None }
}
}
};Reflect)]
376pub enum RenderDebugMode {
377 #[default]
378 Depth,
379 Normal,
380 MotionVectors,
381 Deferred,
382 DeferredBaseColor,
383 DeferredEmissive,
384 DeferredMetallicRoughness,
385 DepthPyramid {
386 mip_level: u32,
387 },
388}
389
390#[derive(impl bevy_render::render_resource::encase::private::ShaderType for
RenderDebugOverlayUniform where
f32: bevy_render::render_resource::encase::private::ShaderType +
bevy_render::render_resource::encase::private::ShaderSize,
u32: bevy_render::render_resource::encase::private::ShaderType {
type ExtraMetadata =
bevy_render::render_resource::encase::private::StructMetadata<2usize>;
const METADATA:
bevy_render::render_resource::encase::private::Metadata<Self::ExtraMetadata>
=
{
let struct_alignment =
bevy_render::render_resource::encase::private::AlignmentValue::max([<f32
as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.alignment(),
<u32 as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.alignment()]);
let extra =
{
let mut paddings = [0; 2usize];
let mut offsets = [0; 2usize];
let mut offset = 0;
offset +=
<f32 as
bevy_render::render_resource::encase::private::ShaderSize>::SHADER_SIZE.get();
offsets[1usize] =
<u32 as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.alignment().round_up(offset);
let padding =
<u32 as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.alignment().padding_needed_for(offset);
offset += padding;
paddings[0usize] = padding;
offset +=
<u32 as
bevy_render::render_resource::encase::private::ShaderSize>::SHADER_SIZE.get();
paddings[1usize] =
struct_alignment.padding_needed_for(offset);
bevy_render::render_resource::encase::private::StructMetadata {
offsets,
paddings,
}
};
let min_size =
{
let mut offset = extra.offsets[2usize - 1];
offset +=
<u32 as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.min_size().get();
bevy_render::render_resource::encase::private::SizeValue::new(struct_alignment.round_up(offset))
};
bevy_render::render_resource::encase::private::Metadata {
alignment: struct_alignment,
has_uniform_min_alignment: true,
min_size,
is_pod: false,
extra,
}
};
const UNIFORM_COMPAT_ASSERT: fn() =
||
bevy_render::render_resource::encase::private::consume_zsts([<f32
as
bevy_render::render_resource::encase::private::ShaderType>::UNIFORM_COMPAT_ASSERT(),
if let ::core::option::Option::Some(min_alignment) =
<f32 as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.uniform_min_alignment()
{
let offset =
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.offset(0usize);
{
#[allow(clippy :: equatable_if_let)]
if let false = min_alignment.is_aligned(offset) {
{
let mut fmt: ::const_panic::FmtArg =
::const_panic::FmtArg::DEBUG;
match &[::const_panic::StdWrapper(&match &"offset of field '"
{
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"opacity" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"' must be a multiple of "
{
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &min_alignment.get() {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt)).deref_panic_vals(),
::const_panic::StdWrapper(&match &" (current offset: " {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &offset {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt)).deref_panic_vals(),
::const_panic::StdWrapper(&match &")" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals()]
{
args => ::const_panic::concat_panic(args),
}
}
}
}
}, (),
<u32 as
bevy_render::render_resource::encase::private::ShaderType>::UNIFORM_COMPAT_ASSERT(),
if let ::core::option::Option::Some(min_alignment) =
<u32 as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.uniform_min_alignment()
{
let offset =
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.offset(1usize);
{
#[allow(clippy :: equatable_if_let)]
if let false = min_alignment.is_aligned(offset) {
{
let mut fmt: ::const_panic::FmtArg =
::const_panic::FmtArg::DEBUG;
match &[::const_panic::StdWrapper(&match &"offset of field '"
{
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"mip_level" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"' must be a multiple of "
{
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &min_alignment.get() {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt)).deref_panic_vals(),
::const_panic::StdWrapper(&match &" (current offset: " {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &offset {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt)).deref_panic_vals(),
::const_panic::StdWrapper(&match &")" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals()]
{
args => ::const_panic::concat_panic(args),
}
}
}
}
},
if let ::core::option::Option::Some(min_alignment) =
<f32 as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.uniform_min_alignment()
{
let prev_offset =
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.offset(1usize
- 1);
let offset =
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.offset(1usize);
let diff = offset - prev_offset;
let prev_size =
<f32 as
bevy_render::render_resource::encase::private::ShaderSize>::SHADER_SIZE.get();
let prev_size = min_alignment.round_up(prev_size);
{
#[allow(clippy :: equatable_if_let)]
if let false = diff >= prev_size {
{
let mut fmt: ::const_panic::FmtArg =
::const_panic::FmtArg::DEBUG;
match &[::const_panic::StdWrapper(&match &"offset between fields '"
{
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"opacity" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"' and '" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"mip_level" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &"' must be at least " {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &min_alignment.get() {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt)).deref_panic_vals(),
::const_panic::StdWrapper(&match &" (currently: " {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals(),
::const_panic::StdWrapper(&match &diff {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt)).deref_panic_vals(),
::const_panic::StdWrapper(&match &")" {
reff =>
::const_panic::__::PanicFmt::PROOF.infer(reff).coerce(reff),
}.to_panicvals(fmt.set_display().set_alternate(false))).deref_panic_vals()]
{
args => ::const_panic::concat_panic(args),
}
}
}
}
}]);
fn size(&self) -> ::core::num::NonZeroU64 {
let mut offset = Self::METADATA.last_offset();
offset +=
bevy_render::render_resource::encase::private::ShaderType::size(&self.mip_level).get();
bevy_render::render_resource::encase::private::SizeValue::new(Self::METADATA.alignment().round_up(offset)).0
}
}
impl bevy_render::render_resource::encase::private::WriteInto for
RenderDebugOverlayUniform where
Self: bevy_render::render_resource::encase::private::ShaderType<ExtraMetadata
= bevy_render::render_resource::encase::private::StructMetadata<2usize>>,
for<'__> f32: bevy_render::render_resource::encase::private::WriteInto,
for<'__> u32: bevy_render::render_resource::encase::private::WriteInto {
#[inline]
fn write_into<B: bevy_render::render_resource::encase::private::BufferMut>(&self,
writer:
&mut bevy_render::render_resource::encase::private::Writer<B>) {
bevy_render::render_resource::encase::private::WriteInto::write_into(&self.opacity,
writer);
bevy_render::render_resource::encase::private::Writer::advance(writer,
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.padding(0usize)
as ::core::primitive::usize);
bevy_render::render_resource::encase::private::WriteInto::write_into(&self.mip_level,
writer);
bevy_render::render_resource::encase::private::Writer::advance(writer,
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.padding(1usize)
as ::core::primitive::usize);
}
}
impl bevy_render::render_resource::encase::private::ReadFrom for
RenderDebugOverlayUniform where
Self: bevy_render::render_resource::encase::private::ShaderType<ExtraMetadata
= bevy_render::render_resource::encase::private::StructMetadata<2usize>>,
for<'__> f32: bevy_render::render_resource::encase::private::ReadFrom,
for<'__> u32: bevy_render::render_resource::encase::private::ReadFrom {
#[inline]
fn read_from<B: bevy_render::render_resource::encase::private::BufferRef>(&mut self,
reader:
&mut bevy_render::render_resource::encase::private::Reader<B>) {
bevy_render::render_resource::encase::private::ReadFrom::read_from(&mut self.opacity,
reader);
bevy_render::render_resource::encase::private::Reader::advance(reader,
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.padding(0usize)
as ::core::primitive::usize);
bevy_render::render_resource::encase::private::ReadFrom::read_from(&mut self.mip_level,
reader);
bevy_render::render_resource::encase::private::Reader::advance(reader,
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.padding(1usize)
as ::core::primitive::usize);
}
}
impl bevy_render::render_resource::encase::private::CreateFrom for
RenderDebugOverlayUniform where
Self: bevy_render::render_resource::encase::private::ShaderType<ExtraMetadata
= bevy_render::render_resource::encase::private::StructMetadata<2usize>>,
for<'__> f32: bevy_render::render_resource::encase::private::CreateFrom,
for<'__> u32: bevy_render::render_resource::encase::private::CreateFrom {
#[inline]
fn create_from<B: bevy_render::render_resource::encase::private::BufferRef>(reader:
&mut bevy_render::render_resource::encase::private::Reader<B>)
-> Self {
let opacity =
bevy_render::render_resource::encase::private::CreateFrom::create_from(reader);
bevy_render::render_resource::encase::private::Reader::advance(reader,
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.padding(0usize)
as ::core::primitive::usize);
let mip_level =
bevy_render::render_resource::encase::private::CreateFrom::create_from(reader);
bevy_render::render_resource::encase::private::Reader::advance(reader,
<Self as
bevy_render::render_resource::encase::private::ShaderType>::METADATA.padding(1usize)
as ::core::primitive::usize);
{
let mut uninit_struct =
::core::mem::MaybeUninit::<Self>::uninit();
let ptr =
::core::mem::MaybeUninit::as_mut_ptr(&mut uninit_struct);
let field_ptr = unsafe { &raw mut (*ptr).opacity };
unsafe { field_ptr.write(opacity) };
;
let field_ptr = unsafe { &raw mut (*ptr).mip_level };
unsafe { field_ptr.write(mip_level) };
;
unsafe { ::core::mem::MaybeUninit::assume_init(uninit_struct) }
}
}
}
impl bevy_render::render_resource::encase::private::ShaderSize for
RenderDebugOverlayUniform where
f32: bevy_render::render_resource::encase::private::ShaderSize,
u32: bevy_render::render_resource::encase::private::ShaderSize {}ShaderType)]
391struct RenderDebugOverlayUniform {
392 pub opacity: f32,
393 pub mip_level: u32,
394}
395
396#[derive(impl bevy_ecs::component::Component for RenderDebugOverlayUniforms where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::SparseSet;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {
let resource_component_id =
if let ::core::option::Option::Some(id) =
required_components.components_registrator().component_id::<RenderDebugOverlayUniforms>()
{
id
} else {
required_components.components_registrator().register_component::<RenderDebugOverlayUniforms>()
};
required_components.register_required::<bevy_ecs::resource::IsResource>(move
||
bevy_ecs::resource::IsResource::new(resource_component_id));
}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}
impl bevy_ecs::resource::Resource for RenderDebugOverlayUniforms where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource, #[automatically_derived]
impl ::core::default::Default for RenderDebugOverlayUniforms {
#[inline]
fn default() -> Self {
Self { uniforms: ::core::default::Default::default() }
}
}Default)]
397struct RenderDebugOverlayUniforms {
398 pub uniforms: DynamicUniformBuffer<RenderDebugOverlayUniform>,
399}
400
401#[derive(impl bevy_ecs::component::Component for RenderDebugOverlayUniformOffset where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component)]
402struct RenderDebugOverlayUniformOffset {
403 pub offset: u32,
404}
405
406#[derive(impl bevy_ecs::component::Component for RenderDebugOverlayPipeline where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::SparseSet;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {
let resource_component_id =
if let ::core::option::Option::Some(id) =
required_components.components_registrator().component_id::<RenderDebugOverlayPipeline>()
{
id
} else {
required_components.components_registrator().register_component::<RenderDebugOverlayPipeline>()
};
required_components.register_required::<bevy_ecs::resource::IsResource>(move
||
bevy_ecs::resource::IsResource::new(resource_component_id));
}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}
impl bevy_ecs::resource::Resource for RenderDebugOverlayPipeline where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource)]
407struct RenderDebugOverlayPipeline {
408 shader: Handle<Shader>,
409 mesh_view_layouts: MeshPipelineViewLayouts,
410 bind_group_layout: BindGroupLayout,
411 bind_group_layout_descriptor: BindGroupLayoutDescriptor,
412 sampler: Sampler,
413 fullscreen_vertex_shader: VertexState,
414}
415
416fn init_render_debug_overlay_pipeline(
417 mut commands: Commands,
418 render_device: Res<RenderDevice>,
419 mesh_view_layouts: Res<MeshPipelineViewLayouts>,
420 asset_server: Res<AssetServer>,
421 fullscreen_shader: Res<FullscreenShader>,
422) {
423 let fullscreen_vertex_shader = fullscreen_shader.to_vertex_state();
424
425 let sampler = render_device.create_sampler(&SamplerDescriptor::default());
426
427 let bind_group_layout_descriptor = BindGroupLayoutDescriptor::new(
428 "debug_overlay_bind_group_layout",
429 &BindGroupLayoutEntries::sequential(
430 ShaderStages::FRAGMENT,
431 (
432 binding_types::uniform_buffer::<RenderDebugOverlayUniform>(true),
433 binding_types::texture_2d(TextureSampleType::Float { filterable: true }),
434 binding_types::sampler(bevy_render::render_resource::SamplerBindingType::Filtering),
435 binding_types::texture_2d(TextureSampleType::Float { filterable: true }),
436 binding_types::sampler(bevy_render::render_resource::SamplerBindingType::Filtering),
437 ),
438 ),
439 );
440
441 let bind_group_layout = render_device.create_bind_group_layout(
442 bind_group_layout_descriptor.label.as_ref(),
443 &bind_group_layout_descriptor.entries,
444 );
445
446 let res = RenderDebugOverlayPipeline {
447 shader: asset_server.load("embedded://bevy_dev_tools/debug_overlay.wesl"),
448 mesh_view_layouts: mesh_view_layouts.clone(),
449 bind_group_layout,
450 bind_group_layout_descriptor,
451 sampler,
452 fullscreen_vertex_shader,
453 };
454 commands.insert_resource(res);
455}
456
457#[derive(#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RenderDebugOverlayPipelineKey { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RenderDebugOverlayPipelineKey {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.mode == other.mode &&
self.view_layout_key == other.view_layout_key &&
self.target_format == other.target_format
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RenderDebugOverlayPipelineKey {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<RenderDebugMode>;
let _: ::core::cmp::AssertParamIsEq<MeshPipelineViewLayoutKey>;
let _: ::core::cmp::AssertParamIsEq<TextureFormat>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for RenderDebugOverlayPipelineKey {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.mode, state);
::core::hash::Hash::hash(&self.view_layout_key, state);
::core::hash::Hash::hash(&self.target_format, state)
}
}Hash, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RenderDebugOverlayPipelineKey { }
#[automatically_derived]
impl ::core::clone::Clone for RenderDebugOverlayPipelineKey {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<RenderDebugMode>;
let _: ::core::clone::AssertParamIsClone<MeshPipelineViewLayoutKey>;
let _: ::core::clone::AssertParamIsClone<TextureFormat>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RenderDebugOverlayPipelineKey { }Copy)]
458struct RenderDebugOverlayPipelineKey {
459 mode: RenderDebugMode,
460 view_layout_key: MeshPipelineViewLayoutKey,
461 target_format: TextureFormat,
462}
463
464impl SpecializedRenderPipeline for RenderDebugOverlayPipeline {
465 type Key = RenderDebugOverlayPipelineKey;
466
467 fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor {
468 let mut shader_defs = Vec::new();
469 match key.mode {
470 RenderDebugMode::Depth => {
471 shader_defs.push("DEBUG_DEPTH".into());
472 if key
473 .view_layout_key
474 .contains(MeshPipelineViewLayoutKey::DEPTH_PREPASS)
475 {
476 shader_defs.push("DEPTH_PREPASS".into());
477 }
478 if key
479 .view_layout_key
480 .contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS)
481 {
482 shader_defs.push("DEFERRED_PREPASS".into());
483 }
484 }
485 RenderDebugMode::Normal => {
486 shader_defs.push("DEBUG_NORMAL".into());
487 if key
488 .view_layout_key
489 .contains(MeshPipelineViewLayoutKey::NORMAL_PREPASS)
490 {
491 shader_defs.push("NORMAL_PREPASS".into());
492 }
493 if key
494 .view_layout_key
495 .contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS)
496 {
497 shader_defs.push("DEFERRED_PREPASS".into());
498 }
499 }
500 RenderDebugMode::MotionVectors => {
501 shader_defs.push("DEBUG_MOTION_VECTORS".into());
502 if key
503 .view_layout_key
504 .contains(MeshPipelineViewLayoutKey::MOTION_VECTOR_PREPASS)
505 {
506 shader_defs.push("MOTION_VECTOR_PREPASS".into());
507 }
508 }
509 RenderDebugMode::Deferred => {
510 shader_defs.push("DEBUG_DEFERRED".into());
511 if key
512 .view_layout_key
513 .contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS)
514 {
515 shader_defs.push("DEFERRED_PREPASS".into());
516 }
517 }
518 RenderDebugMode::DeferredBaseColor => {
519 shader_defs.push("DEBUG_DEFERRED_BASE_COLOR".into());
520 if key
521 .view_layout_key
522 .contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS)
523 {
524 shader_defs.push("DEFERRED_PREPASS".into());
525 }
526 }
527 RenderDebugMode::DeferredEmissive => {
528 shader_defs.push("DEBUG_DEFERRED_EMISSIVE".into());
529 if key
530 .view_layout_key
531 .contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS)
532 {
533 shader_defs.push("DEFERRED_PREPASS".into());
534 }
535 }
536 RenderDebugMode::DeferredMetallicRoughness => {
537 shader_defs.push("DEBUG_DEFERRED_METALLIC_ROUGHNESS".into());
538 if key
539 .view_layout_key
540 .contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS)
541 {
542 shader_defs.push("DEFERRED_PREPASS".into());
543 }
544 }
545 RenderDebugMode::DepthPyramid { .. } => shader_defs.push("DEBUG_DEPTH_PYRAMID".into()),
546 }
547
548 if key
549 .view_layout_key
550 .contains(MeshPipelineViewLayoutKey::MULTISAMPLED)
551 {
552 shader_defs.push("MULTISAMPLED".into());
553 }
554
555 let mesh_view_layout_descriptor = self
556 .mesh_view_layouts
557 .get_view_layout(key.view_layout_key)
558 .main_layout;
559
560 RenderPipelineDescriptor {
561 label: Some("debug_overlay_pipeline".into()),
562 layout: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[mesh_view_layout_descriptor,
self.bind_group_layout_descriptor.clone()]))vec![
563 mesh_view_layout_descriptor,
564 self.bind_group_layout_descriptor.clone(),
565 ],
566 vertex: self.fullscreen_vertex_shader.clone(),
567 fragment: Some(FragmentState {
568 shader: self.shader.clone(),
569 shader_defs,
570 entry_point: Some("fragment".into()),
571 targets: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Some(ColorTargetState {
format: key.target_format,
blend: None,
write_mask: ColorWrites::ALL,
})]))vec![Some(ColorTargetState {
572 format: key.target_format,
573 blend: None,
574 write_mask: ColorWrites::ALL,
575 })],
576 constants: ::alloc::vec::Vec::new()vec![],
577 }),
578 primitive: bevy_render::render_resource::PrimitiveState::default(),
579 depth_stencil: None,
580 multisample: bevy_render::render_resource::MultisampleState::default(),
581 immediate_size: 0,
582 zero_initialize_workgroup_memory: false,
583 }
584 }
585}
586
587fn prepare_debug_overlay_pipelines(
588 mut commands: Commands,
589 pipeline_cache: Res<PipelineCache>,
590 view_key_cache: Res<ViewKeyCache>,
591 mut pipelines: ResMut<SpecializedRenderPipelines<RenderDebugOverlayPipeline>>,
592 pipeline: Res<RenderDebugOverlayPipeline>,
593 views: Query<(Entity, &ExtractedView, &RenderDebugOverlay)>,
594) {
595 for (entity, view, config) in &views {
596 if !config.enabled {
597 continue;
598 }
599 let Some(view_key) = view_key_cache.get(&view.retained_view_entity) else {
600 continue;
601 };
602
603 let pipeline_id = pipelines.specialize(
604 &pipeline_cache,
605 &pipeline,
606 RenderDebugOverlayPipelineKey {
607 mode: config.mode,
608 view_layout_key: (*view_key).into(),
609 target_format: view.target_format,
610 },
611 );
612
613 commands
614 .entity(entity)
615 .insert(RenderDebugOverlayPipelineId(pipeline_id));
616 }
617}
618
619#[derive(impl bevy_ecs::component::Component for RenderDebugOverlayPipelineId where
Self: ::core::marker::Send + ::core::marker::Sync + 'static {
const STORAGE_TYPE: bevy_ecs::component::StorageType =
bevy_ecs::component::StorageType::Table;
type Mutability = bevy_ecs::component::Mutable;
fn register_required_components(_requiree:
bevy_ecs::component::ComponentId,
required_components:
&mut bevy_ecs::component::RequiredComponentsRegistrator) {}
fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
use bevy_ecs::component::{
DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
};
(&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
}
fn relationship_accessor()
->
::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
::core::option::Option::None
}
}Component)]
620struct RenderDebugOverlayPipelineId(CachedRenderPipelineId);
621
622fn prepare_debug_overlay_resources(
623 mut commands: Commands,
624 render_device: Res<RenderDevice>,
625 render_queue: Res<RenderQueue>,
626 mut uniforms: ResMut<RenderDebugOverlayUniforms>,
627 views: Query<(Entity, &RenderDebugOverlay)>,
628) {
629 let len = views.iter().len();
630 if len == 0 {
631 return;
632 }
633
634 let Some(mut writer) = uniforms
635 .uniforms
636 .get_writer(len, &render_device, &render_queue)
637 else {
638 return;
639 };
640
641 for (entity, config) in &views {
642 let offset = writer.write(&RenderDebugOverlayUniform {
643 opacity: config.opacity,
644 mip_level: if let RenderDebugMode::DepthPyramid { mip_level } = config.mode {
645 mip_level
646 } else {
647 0
648 },
649 });
650
651 commands
652 .entity(entity)
653 .insert(RenderDebugOverlayUniformOffset { offset });
654 }
655}
656
657fn render_debug_overlay(
658 view: ViewQuery<(
659 &ViewTarget,
660 &RenderDebugOverlay,
661 &RenderDebugOverlayPipelineId,
662 &RenderDebugOverlayUniformOffset,
663 &MeshViewBindGroup,
664 Option<&ViewDepthPyramid>,
665 )>,
666 pipeline_cache: Res<PipelineCache>,
667 pipeline_res: Res<RenderDebugOverlayPipeline>,
668 uniforms: Res<RenderDebugOverlayUniforms>,
669 fallback_image: Res<FallbackImage>,
670 mut ctx: RenderContext,
671) {
672 let (target, config, pipeline_id, uniform_offset, mesh_view_bind_group, depth_pyramid) =
673 view.into_inner();
674
675 if !config.enabled {
676 return;
677 }
678
679 let Some(pipeline) = pipeline_cache.get_render_pipeline(pipeline_id.0) else {
680 return;
681 };
682
683 let Some(uniform_binding) = uniforms.uniforms.binding() else {
684 return;
685 };
686
687 let post_process = target.post_process_write();
688
689 let depth_pyramid_view = if let Some(dp) = depth_pyramid {
690 &dp.all_mips
691 } else {
692 &fallback_image.d2.texture_view
693 };
694
695 let debug_bind_group = ctx.render_device().create_bind_group(
696 "debug_buffer_bind_group",
697 &pipeline_res.bind_group_layout,
698 &BindGroupEntries::sequential((
699 uniform_binding,
700 post_process.source,
701 &pipeline_res.sampler,
702 depth_pyramid_view,
703 &pipeline_res.sampler,
704 )),
705 );
706
707 let pass_descriptor = RenderPassDescriptor {
708 label: Some("debug_buffer_pass"),
709 color_attachments: &[Some(RenderPassColorAttachment {
710 view: post_process.destination,
711 depth_slice: None,
712 resolve_target: None,
713 ops: Operations {
714 load: bevy_render::render_resource::LoadOp::Clear(Default::default()),
715 store: bevy_render::render_resource::StoreOp::Store,
716 },
717 })],
718 depth_stencil_attachment: None,
719 timestamp_writes: None,
720 occlusion_query_set: None,
721 multiview_mask: None,
722 };
723
724 let mut render_pass = ctx.command_encoder().begin_render_pass(&pass_descriptor);
725
726 render_pass.set_pipeline(pipeline);
727
728 render_pass.set_bind_group(
729 0,
730 &mesh_view_bind_group.main,
731 &mesh_view_bind_group.main_offsets,
732 );
733 render_pass.set_bind_group(1, &debug_bind_group, &[uniform_offset.offset]);
734
735 render_pass.draw(0..3, 0..1);
736}