Skip to main content

bevy_render/
globals.rs

1use crate::{
2    extract_resource::ExtractResource,
3    render_resource::{ShaderType, UniformBuffer},
4    renderer::{RenderDevice, RenderQueue},
5    Extract, ExtractSchedule, GpuResourceAppExt, Render, RenderApp, RenderSystems,
6};
7use bevy_app::{App, Plugin};
8use bevy_diagnostic::FrameCount;
9use bevy_ecs::prelude::*;
10use bevy_reflect::prelude::*;
11use bevy_shader::load_shader_library;
12use bevy_time::Time;
13
14pub struct GlobalsPlugin;
15
16impl Plugin for GlobalsPlugin {
17    fn build(&self, app: &mut App) {
18        {
    {
        let mut embedded =
            app.world_mut().resource_mut::<::bevy_asset::io::embedded::EmbeddedAssetRegistry>();
        let path =
            {
                let crate_name =
                    "bevy_render::globals".split(':').next().unwrap();
                ::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
                    "src".as_ref(), "src/globals.rs".as_ref(),
                    "globals.wesl".as_ref())
            };
        let watched_path =
            ::bevy_asset::io::embedded::watched_path("src/globals.rs",
                "globals.wesl");
        embedded.insert_asset(watched_path, &path,
            b"struct Globals {\n    /// The time since startup in seconds\n    /// Wraps to 0 after 1 hour.\n    time: f32,\n    /// The delta time since the previous frame in seconds\n    delta_time: f32,\n    /// Frame count since the start of the app.\n    /// It wraps to zero when it reaches the maximum value of a u32.\n    frame_count: u32,\n    @if(SIXTEEN_BYTE_ALIGNMENT)\n    // WebGL2 structs must be 16 byte aligned.\n    _webgl2_padding: f32\n};\n");
    }
};
let handle:
        ::bevy_shader::_macro::bevy_asset::prelude::Handle<::bevy_shader::prelude::Shader> =
    {
        let (path, asset_server) =
            {
                let path =
                    {
                        {
                            let crate_name =
                                "bevy_render::globals".split(':').next().unwrap();
                            ::bevy_asset::io::embedded::_embedded_asset_path(crate_name,
                                "src".as_ref(), "src/globals.rs".as_ref(),
                                "globals.wesl".as_ref())
                        }
                    };
                let path =
                    ::bevy_asset::AssetPath::from_path_buf(path).with_source("embedded");
                let asset_server =
                    ::bevy_asset::io::embedded::GetAssetServer::get_asset_server(app);
                (path, asset_server)
            };
        asset_server.load(path)
    };
::core::mem::forget(handle);load_shader_library!(app, "globals.wesl");
19        if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
20            render_app
21                .init_gpu_resource::<GlobalsBuffer>()
22                .init_resource::<Time>()
23                .add_systems(ExtractSchedule, (extract_frame_count, extract_time))
24                .add_systems(
25                    Render,
26                    prepare_globals_buffer.in_set(RenderSystems::PrepareResources),
27                );
28        }
29    }
30}
31
32fn extract_frame_count(mut commands: Commands, frame_count: Extract<Res<FrameCount>>) {
33    commands.insert_resource(**frame_count);
34}
35
36fn extract_time(mut commands: Commands, time: Extract<Res<Time>>) {
37    commands.insert_resource(**time);
38}
39
40/// Contains global values useful when writing shaders.
41/// Currently only contains values related to time.
42#[derive(#[automatically_derived]impl ::core::default::Default for GlobalsUniform {
    #[inline]
    fn default() -> Self {
        GlobalsUniform {
            time: ::core::default::Default::default(),
            delta_time: ::core::default::Default::default(),
            frame_count: ::core::default::Default::default(),
        }
    }
}Default, #[automatically_derived]impl ::core::clone::Clone for GlobalsUniform {
    #[inline]
    fn clone(&self) -> Self {
        GlobalsUniform {
            time: ::core::clone::Clone::clone(&self.time),
            delta_time: ::core::clone::Clone::clone(&self.delta_time),
            frame_count: ::core::clone::Clone::clone(&self.frame_count),
        }
    }
}Clone, impl bevy_ecs::component::Component for GlobalsUniform 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::<GlobalsUniform>()
                {
                id
            } else {
                required_components.components_registrator().register_component::<GlobalsUniform>()
            };
        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 GlobalsUniform where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource, impl bevy_extract::extract_resource::ExtractResource<RenderApp> for
    GlobalsUniform where Self: ::core::clone::Clone {
    type Source = Self;
    fn extract_resource(source: &Self::Source) -> Self { source.clone() }
}ExtractResource, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for GlobalsUniform 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) {
                <f32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <u32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for GlobalsUniform 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::<f32>("time"),
                                                bevy_reflect::NamedField::new::<f32>("delta_time"),
                                                bevy_reflect::NamedField::new::<u32>("frame_count")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for GlobalsUniform where  {
            fn type_path() -> &'static str {
                "bevy_render::globals::GlobalsUniform"
            }
            fn short_type_path() -> &'static str { "GlobalsUniform" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("GlobalsUniform")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_render::globals".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_render::globals")
            }
        }
        impl bevy_reflect::Reflect for GlobalsUniform 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(())
            }
        }
        impl bevy_reflect::func::args::GetOwnership for GlobalsUniform where
            {
            fn ownership() -> bevy_reflect::func::args::Ownership {
                bevy_reflect::func::args::Ownership::Owned
            }
        }
        impl bevy_reflect::func::args::FromArg for GlobalsUniform where  {
            type This<'from_arg> = GlobalsUniform;
            fn from_arg(arg: bevy_reflect::func::args::Arg)
                ->
                    ::core::result::Result<Self::This<'_>,
                    bevy_reflect::func::args::ArgError> {
                arg.take_owned()
            }
        }
        impl bevy_reflect::func::IntoReturn for GlobalsUniform where  {
            fn into_return<'into_return>(self)
                -> bevy_reflect::func::Return<'into_return> where
                Self: 'into_return {
                bevy_reflect::func::Return::Owned(bevy_reflect::__macro_exports::alloc_utils::Box::new(self))
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<GlobalsUniform
                                        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 GlobalsUniform where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "time" => ::core::option::Option::Some(&self.time),
                    "delta_time" =>
                        ::core::option::Option::Some(&self.delta_time),
                    "frame_count" =>
                        ::core::option::Option::Some(&self.frame_count),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "time" => ::core::option::Option::Some(&mut self.time),
                    "delta_time" =>
                        ::core::option::Option::Some(&mut self.delta_time),
                    "frame_count" =>
                        ::core::option::Option::Some(&mut self.frame_count),
                    _ => ::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.time),
                    1usize => ::core::option::Option::Some(&self.delta_time),
                    2usize => ::core::option::Option::Some(&self.frame_count),
                    _ => ::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.time),
                    1usize =>
                        ::core::option::Option::Some(&mut self.delta_time),
                    2usize =>
                        ::core::option::Option::Some(&mut self.frame_count),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("time"),
                    1usize => ::core::option::Option::Some("delta_time"),
                    2usize => ::core::option::Option::Some("frame_count"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "time" => ::core::option::Option::Some(0usize),
                    "delta_time" => ::core::option::Option::Some(1usize),
                    "frame_count" => ::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("time",
                    bevy_reflect::PartialReflect::to_dynamic(&self.time)?);
                dynamic.insert_boxed("delta_time",
                    bevy_reflect::PartialReflect::to_dynamic(&self.delta_time)?);
                dynamic.insert_boxed("frame_count",
                    bevy_reflect::PartialReflect::to_dynamic(&self.frame_count)?);
                ::core::result::Result::Ok(dynamic)
            }
        }
        impl bevy_reflect::PartialReflect for GlobalsUniform 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]
            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(::core::clone::Clone::clone(self)))
            }
        }
        impl bevy_reflect::FromReflect for GlobalsUniform 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) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "time")?))() {
                        __this.time = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "delta_time")?))() {
                        __this.delta_time = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <u32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "frame_count")?))() {
                        __this.frame_count = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, impl encase::private::ShaderType for GlobalsUniform where
    f32: encase::private::ShaderType + encase::private::ShaderSize,
    f32: encase::private::ShaderType + encase::private::ShaderSize,
    u32: encase::private::ShaderType {
    type ExtraMetadata = encase::private::StructMetadata<3usize>;
    const METADATA: encase::private::Metadata<Self::ExtraMetadata> =
        {
            let struct_alignment =
                encase::private::AlignmentValue::max([<f32 as
                                    encase::private::ShaderType>::METADATA.alignment(),
                            <f32 as encase::private::ShaderType>::METADATA.alignment(),
                            <u32 as
                                    encase::private::ShaderType>::METADATA.alignment()]);
            let extra =
                {
                    let mut paddings = [0; 3usize];
                    let mut offsets = [0; 3usize];
                    let mut offset = 0;
                    offset +=
                        <f32 as encase::private::ShaderSize>::SHADER_SIZE.get();
                    offsets[1usize] =
                        <f32 as
                                    encase::private::ShaderType>::METADATA.alignment().round_up(offset);
                    let padding =
                        <f32 as
                                    encase::private::ShaderType>::METADATA.alignment().padding_needed_for(offset);
                    offset += padding;
                    paddings[0usize] = padding;
                    offset +=
                        <f32 as encase::private::ShaderSize>::SHADER_SIZE.get();
                    offsets[2usize] =
                        <u32 as
                                    encase::private::ShaderType>::METADATA.alignment().round_up(offset);
                    let padding =
                        <u32 as
                                    encase::private::ShaderType>::METADATA.alignment().padding_needed_for(offset);
                    offset += padding;
                    paddings[1usize] = padding;
                    offset +=
                        <u32 as encase::private::ShaderSize>::SHADER_SIZE.get();
                    paddings[2usize] =
                        struct_alignment.padding_needed_for(offset);
                    encase::private::StructMetadata { offsets, paddings }
                };
            let min_size =
                {
                    let mut offset = extra.offsets[3usize - 1];
                    offset +=
                        <u32 as
                                    encase::private::ShaderType>::METADATA.min_size().get();
                    encase::private::SizeValue::new(struct_alignment.round_up(offset))
                };
            encase::private::Metadata {
                alignment: struct_alignment,
                has_uniform_min_alignment: true,
                min_size,
                is_pod: false,
                extra,
            }
        };
    const UNIFORM_COMPAT_ASSERT: fn() =
        ||
            encase::private::consume_zsts([<f32 as
                                encase::private::ShaderType>::UNIFORM_COMPAT_ASSERT(),
                        if let ::core::option::Option::Some(min_alignment) =
                                <f32 as
                                        encase::private::ShaderType>::METADATA.uniform_min_alignment()
                            {
                            let offset =
                                <Self as
                                        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 &"time" {
                                                                            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),
                                        }
                                    }
                                }
                            }
                        }, (),
                        <f32 as
                                encase::private::ShaderType>::UNIFORM_COMPAT_ASSERT(),
                        if let ::core::option::Option::Some(min_alignment) =
                                <f32 as
                                        encase::private::ShaderType>::METADATA.uniform_min_alignment()
                            {
                            let offset =
                                <Self as
                                        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 &"delta_time" {
                                                                            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
                                        encase::private::ShaderType>::METADATA.uniform_min_alignment()
                            {
                            let prev_offset =
                                <Self as
                                        encase::private::ShaderType>::METADATA.offset(1usize - 1);
                            let offset =
                                <Self as
                                        encase::private::ShaderType>::METADATA.offset(1usize);
                            let diff = offset - prev_offset;
                            let prev_size =
                                <f32 as 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 &"time" {
                                                                            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 &"delta_time" {
                                                                            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),
                                        }
                                    }
                                }
                            }
                        },
                        <u32 as
                                encase::private::ShaderType>::UNIFORM_COMPAT_ASSERT(),
                        if let ::core::option::Option::Some(min_alignment) =
                                <u32 as
                                        encase::private::ShaderType>::METADATA.uniform_min_alignment()
                            {
                            let offset =
                                <Self as
                                        encase::private::ShaderType>::METADATA.offset(2usize);
                            {

                                #[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 &"frame_count" {
                                                                            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
                                        encase::private::ShaderType>::METADATA.uniform_min_alignment()
                            {
                            let prev_offset =
                                <Self as
                                        encase::private::ShaderType>::METADATA.offset(2usize - 1);
                            let offset =
                                <Self as
                                        encase::private::ShaderType>::METADATA.offset(2usize);
                            let diff = offset - prev_offset;
                            let prev_size =
                                <f32 as 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 &"delta_time" {
                                                                            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 &"frame_count" {
                                                                            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 += encase::private::ShaderType::size(&self.frame_count).get();
        encase::private::SizeValue::new(Self::METADATA.alignment().round_up(offset)).0
    }
}
impl encase::private::WriteInto for GlobalsUniform where
    Self: encase::private::ShaderType<ExtraMetadata =
    encase::private::StructMetadata<3usize>>,
    for<'__> f32: encase::private::WriteInto,
    for<'__> f32: encase::private::WriteInto,
    for<'__> u32: encase::private::WriteInto {
    #[inline]
    fn write_into<B: encase::private::BufferMut>(&self,
        writer: &mut encase::private::Writer<B>) {
        encase::private::WriteInto::write_into(&self.time, writer);
        encase::private::Writer::advance(writer,
            <Self as encase::private::ShaderType>::METADATA.padding(0usize) as
                ::core::primitive::usize);
        encase::private::WriteInto::write_into(&self.delta_time, writer);
        encase::private::Writer::advance(writer,
            <Self as encase::private::ShaderType>::METADATA.padding(1usize) as
                ::core::primitive::usize);
        encase::private::WriteInto::write_into(&self.frame_count, writer);
        encase::private::Writer::advance(writer,
            <Self as encase::private::ShaderType>::METADATA.padding(2usize) as
                ::core::primitive::usize);
    }
}
impl encase::private::ReadFrom for GlobalsUniform where
    Self: encase::private::ShaderType<ExtraMetadata =
    encase::private::StructMetadata<3usize>>,
    for<'__> f32: encase::private::ReadFrom,
    for<'__> f32: encase::private::ReadFrom,
    for<'__> u32: encase::private::ReadFrom {
    #[inline]
    fn read_from<B: encase::private::BufferRef>(&mut self,
        reader: &mut encase::private::Reader<B>) {
        encase::private::ReadFrom::read_from(&mut self.time, reader);
        encase::private::Reader::advance(reader,
            <Self as encase::private::ShaderType>::METADATA.padding(0usize) as
                ::core::primitive::usize);
        encase::private::ReadFrom::read_from(&mut self.delta_time, reader);
        encase::private::Reader::advance(reader,
            <Self as encase::private::ShaderType>::METADATA.padding(1usize) as
                ::core::primitive::usize);
        encase::private::ReadFrom::read_from(&mut self.frame_count, reader);
        encase::private::Reader::advance(reader,
            <Self as encase::private::ShaderType>::METADATA.padding(2usize) as
                ::core::primitive::usize);
    }
}
impl encase::private::CreateFrom for GlobalsUniform where
    Self: encase::private::ShaderType<ExtraMetadata =
    encase::private::StructMetadata<3usize>>,
    for<'__> f32: encase::private::CreateFrom,
    for<'__> f32: encase::private::CreateFrom,
    for<'__> u32: encase::private::CreateFrom {
    #[inline]
    fn create_from<B: encase::private::BufferRef>(reader:
            &mut encase::private::Reader<B>) -> Self {
        let time = encase::private::CreateFrom::create_from(reader);
        encase::private::Reader::advance(reader,
            <Self as encase::private::ShaderType>::METADATA.padding(0usize) as
                ::core::primitive::usize);
        let delta_time = encase::private::CreateFrom::create_from(reader);
        encase::private::Reader::advance(reader,
            <Self as encase::private::ShaderType>::METADATA.padding(1usize) as
                ::core::primitive::usize);
        let frame_count = encase::private::CreateFrom::create_from(reader);
        encase::private::Reader::advance(reader,
            <Self as encase::private::ShaderType>::METADATA.padding(2usize) 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).time };
            unsafe { field_ptr.write(time) };
            ;
            let field_ptr = unsafe { &raw mut (*ptr).delta_time };
            unsafe { field_ptr.write(delta_time) };
            ;
            let field_ptr = unsafe { &raw mut (*ptr).frame_count };
            unsafe { field_ptr.write(frame_count) };
            ;
            unsafe { ::core::mem::MaybeUninit::assume_init(uninit_struct) }
        }
    }
}
impl encase::private::ShaderSize for GlobalsUniform where
    f32: encase::private::ShaderSize, f32: encase::private::ShaderSize,
    u32: encase::private::ShaderSize {}ShaderType)]
43#[reflect(Resource, Default, Clone)]
44#[extract_app(RenderApp)]
45pub struct GlobalsUniform {
46    /// The time since startup in seconds.
47    /// Wraps to 0 after 1 hour.
48    time: f32,
49    /// The delta time since the previous frame in seconds
50    delta_time: f32,
51    /// Frame count since the start of the app.
52    /// It wraps to zero when it reaches `u32::MAX`.
53    frame_count: u32,
54    /// WebGL2 structs must be 16 byte aligned.
55    #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))]
56    _webgl2_padding: f32,
57}
58
59/// The buffer containing the [`GlobalsUniform`]
60#[derive(impl bevy_ecs::component::Component for GlobalsBuffer 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::<GlobalsBuffer>()
                {
                id
            } else {
                required_components.components_registrator().register_component::<GlobalsBuffer>()
            };
        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 GlobalsBuffer where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {}Resource, #[automatically_derived]impl ::core::default::Default for GlobalsBuffer {
    #[inline]
    fn default() -> Self {
        GlobalsBuffer { buffer: ::core::default::Default::default() }
    }
}Default)]
61pub struct GlobalsBuffer {
62    pub buffer: UniformBuffer<GlobalsUniform>,
63}
64
65fn prepare_globals_buffer(
66    render_device: Res<RenderDevice>,
67    render_queue: Res<RenderQueue>,
68    mut globals_buffer: ResMut<GlobalsBuffer>,
69    time: Res<Time>,
70    frame_count: Res<FrameCount>,
71) {
72    let buffer = globals_buffer.buffer.get_mut();
73    buffer.time = time.elapsed_secs_wrapped();
74    buffer.delta_time = time.delta_secs();
75    buffer.frame_count = frame_count.0;
76
77    globals_buffer
78        .buffer
79        .write_buffer(&render_device, &render_queue);
80}