Skip to main content

bevy_dev_tools/
render_debug.rs

1//! Renderer debugging overlay
2
3use 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/// Adds a rendering debug overlay to visualize various renderer buffers.
49///
50/// The plugin is part of `DefaultPlugins` when the `dev` feature is enabled.
51/// The overlay is hidden by default. To control it from the keyboard, insert a
52/// [`RenderDebugOverlayKeybindings`] resource with
53/// [`enable_keybindings`](RenderDebugOverlayKeybindings::enable_keybindings) set to `true`:
54///
55/// ```
56/// # use bevy_dev_tools::render_debug::RenderDebugOverlayKeybindings;
57/// # use bevy_ecs::prelude::World;
58/// # use bevy_utils::default;
59/// let mut world = World::new();
60/// world.insert_resource(RenderDebugOverlayKeybindings {
61///     enable_keybindings: true,
62///     ..default()
63/// });
64/// ```
65///
66/// With the default keybindings, `F1` enables the overlay and cycles through the
67/// supported modes, `F2` cycles the overlay opacity. The overlay is drawn on every
68/// camera.
69#[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/// Resource for configuring the [`RenderDebugOverlayPlugin`] keyboard shortcuts.
123///
124/// Keybindings are disabled by default. Set
125/// [`enable_keybindings`](RenderDebugOverlayKeybindings::enable_keybindings)
126/// to `true` to enable them.
127///
128/// Defaults to `F1` for cycling through the debug modes and `F2` for cycling
129/// the overlay opacity.
130#[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    /// Whether to enable the automatic keybindings
133    pub enable_keybindings: bool,
134    /// Key used to cycle to the next supported debug overlay mode. Defaults to F1
135    pub cycle_mode: KeyCode,
136    /// Key used to cycle the overlay opacity. Defaults to F2
137    pub cycle_opacity: KeyCode,
138}
139
140/// Default keybindings are F1 and F2
141impl 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
151/// Attach keybinds to make render debug overlays available to users when keybindings are enabled
152pub 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
169/// Listen to messages to update the debug overlay configuration.
170pub 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                                // We don't have a good way to check for DepthPyramid in the main
216                                // world, but it usually depends on DepthPrepass.
217                                // However, we can at least check if OcclusionCulling is present.
218                                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/// Configure the render debug overlay.
316#[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    /// Cycle to the next debug mode.
320    CycleMode,
321    /// Cycle to the next opacity level.
322    CycleOpacity,
323}
324
325/// Configure the render debug overlay.
326/// Overwrites the default [`GlobalRenderDebugOverlay`] resource.
327#[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    /// Enables or disables drawing the overlay.
332    pub enabled: bool,
333    /// The kind of data to write to the overlay.
334    pub mode: RenderDebugMode,
335    /// The opacity of the overlay, to allow seeing the rendered image underneath.
336    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/// Configure the render debug overlay globally.
350/// Can be overwritten by using a [`RenderDebugOverlay`] component.
351#[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    /// Enables or disables drawing the overlay.
356    pub enabled: bool,
357    /// The kind of data to write to the overlay.
358    pub mode: RenderDebugMode,
359    /// The opacity of the overlay, to allow seeing the rendered image underneath.
360    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/// The kind of renderer data to visualize.
374#[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}