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#[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 time: f32,
49 delta_time: f32,
51 frame_count: u32,
54 #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))]
56 _webgl2_padding: f32,
57}
58
59#[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}