Skip to main content

bevy_light/
probe.rs

1use bevy_asset::{Assets, Handle, HandleTemplate, RenderAssetUsages};
2use bevy_camera::visibility::{self, ViewVisibility, Visibility, VisibilityClass};
3use bevy_color::{Color, ColorToComponents, LinearRgba};
4use bevy_ecs::prelude::*;
5use bevy_ecs::template::{FromTemplate, OptionTemplate};
6use bevy_image::Image;
7use bevy_math::{Quat, UVec2, Vec3};
8use bevy_reflect::prelude::*;
9use bevy_transform::components::Transform;
10use wgpu_types::{
11    Extent3d, TextureDimension, TextureFormat, TextureViewDescriptor, TextureViewDimension,
12};
13
14use crate::cluster::ClusterVisibilityClass;
15
16/// A marker component for a light probe, which is a cuboid region that provides
17/// global illumination to all fragments inside it.
18///
19/// Note that a light probe will have no effect unless the entity contains some
20/// kind of illumination, which can either be an [`EnvironmentMapLight`] or an
21/// [`IrradianceVolume`].
22///
23/// The light probe range is conceptually a unit cube (1×1×1) centered on the
24/// origin. The [`Transform`] applied to this entity can scale, rotate, or
25/// translate that cube so that it contains all fragments that should take this
26/// light probe into account.
27///
28/// Light probes may specify a *falloff* range over which their influence tapers
29/// off. The falloff range is expressed as a range from 0, representing
30/// infinitely-sharp falloff, to 1, representing the most gradual falloff,
31/// *inside* the 1×1×1 cube. So, for example, if you set the falloff to 0.5 on
32/// an axis, then any fragments with positions between 0.0 units to 0.25 units
33/// on that axis will receive 100% influence from the light probe, while
34/// fragments with positions between 0.25 units to 0.5 units on that axis will
35/// receive gradually-diminished influence, and fragments more than 0.5 units
36/// from the center of the light probe will receive no influence at all.
37///
38/// When multiple sources of indirect illumination can be applied to a fragment,
39/// the highest-quality ones are chosen. Diffuse and specular illumination are
40/// considered separately, so, for example, Bevy may decide to sample the
41/// diffuse illumination from an irradiance volume and the specular illumination
42/// from a reflection probe. From highest priority to lowest priority, the
43/// ranking is as follows:
44///
45/// | Rank | Diffuse              | Specular             |
46/// | ---- | -------------------- | -------------------- |
47/// | 1    | Lightmap             | Lightmap             |
48/// | 2    | Irradiance volume    | Reflection probe     |
49/// | 3    | Reflection probe     | View environment map |
50/// | 4    | View environment map |                      |
51///
52/// Note that ambient light is always added to the diffuse component and does
53/// not participate in the ranking. That is, ambient light is applied in
54/// addition to, not instead of, the light sources above.
55///
56/// Multiple light probes of the same type can apply to a single fragment. By
57/// setting falloff regions appropriately, one can achieve a gradual blend from
58/// one reflection probe and/or irradiance volume to another as objects move
59/// between them.
60///
61/// A terminology note: Unfortunately, there is little agreement across game and
62/// graphics engines as to what to call the various techniques that Bevy groups
63/// under the term *light probe*. In Bevy, a *light probe* is the generic term
64/// that encompasses both *reflection probes* and *irradiance volumes*. In
65/// object-oriented terms, *light probe* is the superclass, and *reflection
66/// probe* and *irradiance volume* are subclasses. In other engines, you may see
67/// the term *light probe* refer to an irradiance volume with a single voxel, or
68/// perhaps some other technique, while in Bevy *light probe* refers not to a
69/// specific technique but rather to a class of techniques. Developers familiar
70/// with other engines should be aware of this terminology difference.
71#[derive(#[doc =
"**Required Components**: [`Transform`], [`ViewVisibility`], [`Visibility`], [`VisibilityClass`]. \n\n A component's Required Components are inserted whenever it is inserted. Note that this will also insert the required components _of_ the required components, recursively, in depth-first order."]
impl bevy_ecs::component::Component for LightProbe where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {
        required_components.register_required::<Transform>(<Transform as
                ::core::default::Default>::default);
        required_components.register_required::<ViewVisibility>(<ViewVisibility
                as ::core::default::Default>::default);
        required_components.register_required::<Visibility>(<Visibility as
                ::core::default::Default>::default);
        required_components.register_required::<VisibilityClass>(<VisibilityClass
                as ::core::default::Default>::default);
    }
    fn on_add()
        -> ::core::option::Option<bevy_ecs::lifecycle::ComponentHook> {
        ::core::option::Option::Some(visibility::add_visibility_class::<ClusterVisibilityClass>)
    }
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, #[automatically_derived]
impl ::core::fmt::Debug for LightProbe {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "LightProbe",
            "falloff", &&self.falloff)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for LightProbe {
    #[inline]
    fn clone(&self) -> LightProbe {
        let _: ::core::clone::AssertParamIsClone<Vec3>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LightProbe { }Copy, #[automatically_derived]
impl ::core::default::Default for LightProbe {
    #[inline]
    fn default() -> LightProbe {
        LightProbe { falloff: ::core::default::Default::default() }
    }
}Default, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for LightProbe where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Vec3 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for LightProbe where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Vec3>("falloff")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for LightProbe where  {
            fn type_path() -> &'static str { "bevy_light::probe::LightProbe" }
            fn short_type_path() -> &'static str { "LightProbe" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("LightProbe")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe")
            }
        }
        impl bevy_reflect::Reflect for LightProbe where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<LightProbe
                                        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 LightProbe where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "falloff" => ::core::option::Option::Some(&self.falloff),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "falloff" =>
                        ::core::option::Option::Some(&mut self.falloff),
                    _ => ::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.falloff),
                    _ => ::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.falloff),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("falloff"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "falloff" => ::core::option::Option::Some(0usize),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_len(&self) -> usize { 1usize }
            fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
                bevy_reflect::structs::FieldIter::new(self)
            }
            fn to_dynamic_struct(&self)
                -> bevy_reflect::structs::DynamicStruct {
                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("falloff",
                    bevy_reflect::PartialReflect::to_dynamic(&self.falloff));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for LightProbe 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)
            }
            fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
                -> ::core::fmt::Result {
                ::core::fmt::Debug::fmt(self, f)
            }
            #[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 LightProbe 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) =
                            (||
                                        <Vec3 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "falloff")?))() {
                        __this.falloff = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect)]
72#[reflect(Component, Default, Debug, Clone)]
73#[require(Transform, ViewVisibility, Visibility, VisibilityClass)]
74#[component(on_add = visibility::add_visibility_class::<ClusterVisibilityClass>)]
75pub struct LightProbe {
76    /// The distance over which the effect of the light probe becomes weaker, on
77    /// each axis.
78    ///
79    /// This is specified as a ratio of the total distance on each axis. So, for
80    /// example, if you specify `Vec3::splat(0.25)` here, then the light probe
81    /// will consist of a 0.75×0.75×0.75 unit cube within which fragments
82    /// receive the maximum influence from the light probe, contained within a
83    /// 1×1×1 cube which influences fragments inside it in a manner that
84    /// diminishes as fragments get farther from its center.
85    ///
86    /// Falloff doesn't affect the influence range of the light probe itself;
87    /// it's still conceptually a 1×1×1 cube, regardless of the falloff setting.
88    /// In other words, falloff modifies the *interior* of the light probe cube
89    /// instead of increasing the *exterior* boundaries of the cube.
90    pub falloff: Vec3,
91}
92
93impl LightProbe {
94    /// Creates a new light probe component.
95    #[inline]
96    pub fn new() -> Self {
97        Self::default()
98    }
99}
100
101/// A pair of cubemap textures that represent the surroundings of a specific
102/// area in space.
103///
104/// See `bevy_pbr::environment_map` for detailed information.
105#[derive(#[automatically_derived]
impl ::core::clone::Clone for EnvironmentMapLight {
    #[inline]
    fn clone(&self) -> EnvironmentMapLight {
        EnvironmentMapLight {
            diffuse_map: ::core::clone::Clone::clone(&self.diffuse_map),
            specular_map: ::core::clone::Clone::clone(&self.specular_map),
            intensity: ::core::clone::Clone::clone(&self.intensity),
            rotation: ::core::clone::Clone::clone(&self.rotation),
            affects_lightmapped_mesh_diffuse: ::core::clone::Clone::clone(&self.affects_lightmapped_mesh_diffuse),
        }
    }
}Clone, impl bevy_ecs::component::Component for EnvironmentMapLight where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for EnvironmentMapLight where
            {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Handle<Image> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <f32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Quat as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <bool as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for EnvironmentMapLight where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Handle<Image>>("diffuse_map"),
                                                bevy_reflect::NamedField::new::<Handle<Image>>("specular_map"),
                                                bevy_reflect::NamedField::new::<f32>("intensity"),
                                                bevy_reflect::NamedField::new::<Quat>("rotation"),
                                                bevy_reflect::NamedField::new::<bool>("affects_lightmapped_mesh_diffuse")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for EnvironmentMapLight where  {
            fn type_path() -> &'static str {
                "bevy_light::probe::EnvironmentMapLight"
            }
            fn short_type_path() -> &'static str { "EnvironmentMapLight" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("EnvironmentMapLight")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe")
            }
        }
        impl bevy_reflect::Reflect for EnvironmentMapLight where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<EnvironmentMapLight
                                        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 EnvironmentMapLight where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "diffuse_map" =>
                        ::core::option::Option::Some(&self.diffuse_map),
                    "specular_map" =>
                        ::core::option::Option::Some(&self.specular_map),
                    "intensity" =>
                        ::core::option::Option::Some(&self.intensity),
                    "rotation" => ::core::option::Option::Some(&self.rotation),
                    "affects_lightmapped_mesh_diffuse" =>
                        ::core::option::Option::Some(&self.affects_lightmapped_mesh_diffuse),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "diffuse_map" =>
                        ::core::option::Option::Some(&mut self.diffuse_map),
                    "specular_map" =>
                        ::core::option::Option::Some(&mut self.specular_map),
                    "intensity" =>
                        ::core::option::Option::Some(&mut self.intensity),
                    "rotation" =>
                        ::core::option::Option::Some(&mut self.rotation),
                    "affects_lightmapped_mesh_diffuse" =>
                        ::core::option::Option::Some(&mut self.affects_lightmapped_mesh_diffuse),
                    _ => ::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.diffuse_map),
                    1usize => ::core::option::Option::Some(&self.specular_map),
                    2usize => ::core::option::Option::Some(&self.intensity),
                    3usize => ::core::option::Option::Some(&self.rotation),
                    4usize =>
                        ::core::option::Option::Some(&self.affects_lightmapped_mesh_diffuse),
                    _ => ::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.diffuse_map),
                    1usize =>
                        ::core::option::Option::Some(&mut self.specular_map),
                    2usize => ::core::option::Option::Some(&mut self.intensity),
                    3usize => ::core::option::Option::Some(&mut self.rotation),
                    4usize =>
                        ::core::option::Option::Some(&mut self.affects_lightmapped_mesh_diffuse),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("diffuse_map"),
                    1usize => ::core::option::Option::Some("specular_map"),
                    2usize => ::core::option::Option::Some("intensity"),
                    3usize => ::core::option::Option::Some("rotation"),
                    4usize =>
                        ::core::option::Option::Some("affects_lightmapped_mesh_diffuse"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "diffuse_map" => ::core::option::Option::Some(0usize),
                    "specular_map" => ::core::option::Option::Some(1usize),
                    "intensity" => ::core::option::Option::Some(2usize),
                    "rotation" => ::core::option::Option::Some(3usize),
                    "affects_lightmapped_mesh_diffuse" =>
                        ::core::option::Option::Some(4usize),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_len(&self) -> usize { 5usize }
            fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
                bevy_reflect::structs::FieldIter::new(self)
            }
            fn to_dynamic_struct(&self)
                -> bevy_reflect::structs::DynamicStruct {
                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("diffuse_map",
                    bevy_reflect::PartialReflect::to_dynamic(&self.diffuse_map));
                dynamic.insert_boxed("specular_map",
                    bevy_reflect::PartialReflect::to_dynamic(&self.specular_map));
                dynamic.insert_boxed("intensity",
                    bevy_reflect::PartialReflect::to_dynamic(&self.intensity));
                dynamic.insert_boxed("rotation",
                    bevy_reflect::PartialReflect::to_dynamic(&self.rotation));
                dynamic.insert_boxed("affects_lightmapped_mesh_diffuse",
                    bevy_reflect::PartialReflect::to_dynamic(&self.affects_lightmapped_mesh_diffuse));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for EnvironmentMapLight 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 EnvironmentMapLight 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) =
                            (||
                                        <Handle<Image> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "diffuse_map")?))() {
                        __this.diffuse_map = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Handle<Image> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "specular_map")?))() {
                        __this.specular_map = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "intensity")?))() {
                        __this.intensity = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Quat as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "rotation")?))() {
                        __this.rotation = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <bool as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "affects_lightmapped_mesh_diffuse")?))() {
                        __this.affects_lightmapped_mesh_diffuse = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, impl ::core::default::Default for EnvironmentMapLightTemplate {
    fn default() -> Self {
        Self {
            diffuse_map: ::core::default::Default::default(),
            specular_map: ::core::default::Default::default(),
            intensity: ::core::default::Default::default(),
            rotation: ::core::default::Default::default(),
            affects_lightmapped_mesh_diffuse: ::core::default::Default::default(),
        }
    }
}FromTemplate)]
106#[reflect(Component, Default, Clone)]
107pub struct EnvironmentMapLight {
108    /// The blurry image that represents diffuse radiance surrounding a region.
109    pub diffuse_map: Handle<Image>,
110
111    /// The typically-sharper, mipmapped image that represents specular radiance
112    /// surrounding a region.
113    pub specular_map: Handle<Image>,
114
115    /// Scale factor applied to the diffuse and specular light generated by this component.
116    ///
117    /// After applying this multiplier, the resulting values should
118    /// be in units of [cd/m^2](https://en.wikipedia.org/wiki/Candela_per_square_metre).
119    ///
120    /// See also <https://google.github.io/filament/Filament.md.html#lighting/imagebasedlights/iblunit>.
121    pub intensity: f32,
122
123    /// World space rotation applied to the environment light cubemaps.
124    /// This is useful for users who require a different axis, such as the Z-axis, to serve
125    /// as the vertical axis.
126    ///
127    /// Note: This only has an effect if attached to a view.
128    pub rotation: Quat,
129
130    /// Whether the light from this environment map contributes diffuse lighting
131    /// to meshes with lightmaps.
132    ///
133    /// Set this to false if your lightmap baking tool bakes the diffuse light
134    /// from this environment light into the lightmaps in order to avoid
135    /// counting the radiance from this environment map twice.
136    ///
137    /// By default, this is set to true.
138    pub affects_lightmapped_mesh_diffuse: bool,
139}
140
141impl EnvironmentMapLight {
142    /// An environment map with a uniform color, useful for uniform ambient lighting.
143    pub fn solid_color(assets: &mut Assets<Image>, color: impl Into<Color>) -> Self {
144        let color = color.into();
145        Self::hemispherical_gradient(assets, color, color, color)
146    }
147
148    /// An environment map with a hemispherical gradient, fading between the sky and ground colors
149    /// at the horizon. Useful as a very simple 'sky'.
150    pub fn hemispherical_gradient(
151        assets: &mut Assets<Image>,
152        top_color: impl Into<Color>,
153        mid_color: impl Into<Color>,
154        bottom_color: impl Into<Color>,
155    ) -> Self {
156        let handle = assets.add(Self::hemispherical_gradient_cubemap(
157            top_color.into(),
158            mid_color.into(),
159            bottom_color.into(),
160        ));
161
162        Self {
163            diffuse_map: handle.clone(),
164            specular_map: handle,
165            intensity: 1.0,
166            ..Default::default()
167        }
168    }
169
170    pub(crate) fn hemispherical_gradient_cubemap(
171        top_color: Color,
172        mid_color: Color,
173        bottom_color: Color,
174    ) -> Image {
175        let top_color: LinearRgba = top_color.into();
176        let mid_color: LinearRgba = mid_color.into();
177        let bottom_color: LinearRgba = bottom_color.into();
178        Image {
179            texture_view_descriptor: Some(TextureViewDescriptor {
180                dimension: Some(TextureViewDimension::Cube),
181                ..Default::default()
182            }),
183            ..Image::new(
184                Extent3d {
185                    width: 1,
186                    height: 1,
187                    depth_or_array_layers: 6,
188                },
189                TextureDimension::D2,
190                [
191                    mid_color,
192                    mid_color,
193                    top_color,
194                    bottom_color,
195                    mid_color,
196                    mid_color,
197                ]
198                .into_iter()
199                .flat_map(|c| c.to_f32_array().map(half::f16::from_f32))
200                .flat_map(half::f16::to_le_bytes)
201                .collect(),
202                TextureFormat::Rgba16Float,
203                RenderAssetUsages::RENDER_WORLD,
204            )
205        }
206    }
207}
208
209impl Default for EnvironmentMapLight {
210    fn default() -> Self {
211        EnvironmentMapLight {
212            diffuse_map: Handle::default(),
213            specular_map: Handle::default(),
214            intensity: 0.0,
215            rotation: Quat::IDENTITY,
216            affects_lightmapped_mesh_diffuse: true,
217        }
218    }
219}
220
221/// Adds a skybox to a 3D camera, based on a cubemap texture.
222///
223/// Note that this component does not (currently) affect the scene's lighting.
224/// To do so, use [`EnvironmentMapLight`] alongside this component.
225///
226/// See also <https://en.wikipedia.org/wiki/Skybox_(video_games)>.
227#[derive(impl bevy_ecs::component::Component for Skybox where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, #[automatically_derived]
impl ::core::clone::Clone for Skybox {
    #[inline]
    fn clone(&self) -> Skybox {
        Skybox {
            image: ::core::clone::Clone::clone(&self.image),
            brightness: ::core::clone::Clone::clone(&self.brightness),
            rotation: ::core::clone::Clone::clone(&self.rotation),
        }
    }
}Clone, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for Skybox where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Option<Handle<Image>> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <f32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Quat as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for Skybox where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Option<Handle<Image>>>("image"),
                                                bevy_reflect::NamedField::new::<f32>("brightness"),
                                                bevy_reflect::NamedField::new::<Quat>("rotation")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for Skybox where  {
            fn type_path() -> &'static str { "bevy_light::probe::Skybox" }
            fn short_type_path() -> &'static str { "Skybox" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("Skybox")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe")
            }
        }
        impl bevy_reflect::Reflect for Skybox where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<Skybox
                                        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 Skybox where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "image" => ::core::option::Option::Some(&self.image),
                    "brightness" =>
                        ::core::option::Option::Some(&self.brightness),
                    "rotation" => ::core::option::Option::Some(&self.rotation),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "image" => ::core::option::Option::Some(&mut self.image),
                    "brightness" =>
                        ::core::option::Option::Some(&mut self.brightness),
                    "rotation" =>
                        ::core::option::Option::Some(&mut self.rotation),
                    _ => ::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.image),
                    1usize => ::core::option::Option::Some(&self.brightness),
                    2usize => ::core::option::Option::Some(&self.rotation),
                    _ => ::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.image),
                    1usize =>
                        ::core::option::Option::Some(&mut self.brightness),
                    2usize => ::core::option::Option::Some(&mut self.rotation),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("image"),
                    1usize => ::core::option::Option::Some("brightness"),
                    2usize => ::core::option::Option::Some("rotation"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "image" => ::core::option::Option::Some(0usize),
                    "brightness" => ::core::option::Option::Some(1usize),
                    "rotation" => ::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)
                -> bevy_reflect::structs::DynamicStruct {
                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("image",
                    bevy_reflect::PartialReflect::to_dynamic(&self.image));
                dynamic.insert_boxed("brightness",
                    bevy_reflect::PartialReflect::to_dynamic(&self.brightness));
                dynamic.insert_boxed("rotation",
                    bevy_reflect::PartialReflect::to_dynamic(&self.rotation));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for Skybox 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 Skybox 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) =
                            (||
                                        <Option<Handle<Image>> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "image")?))() {
                        __this.image = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "brightness")?))() {
                        __this.brightness = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Quat as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "rotation")?))() {
                        __this.rotation = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, impl ::core::default::Default for SkyboxTemplate {
    fn default() -> Self {
        Self {
            image: ::core::default::Default::default(),
            brightness: ::core::default::Default::default(),
            rotation: ::core::default::Default::default(),
        }
    }
}FromTemplate)]
228#[reflect(Component, Default, Clone)]
229pub struct Skybox {
230    /// The cubemap to use.
231    ///
232    /// If this is [`None`], the skybox will not be rendered, as if it does not exist.
233    /// This allows `Skybox` to implement [`Default`].
234    #[template(OptionTemplate<HandleTemplate<Image>>)]
235    pub image: Option<Handle<Image>>,
236
237    /// Scale factor applied to the skybox image.
238    /// After applying this multiplier to the image samples, the resulting values should
239    /// be in units of [cd/m^2](https://en.wikipedia.org/wiki/Candela_per_square_metre).
240    pub brightness: f32,
241
242    /// View space rotation applied to the skybox cubemap.
243    /// This is useful for users who require a different axis, such as the Z-axis, to serve
244    /// as the vertical axis.
245    pub rotation: Quat,
246}
247
248impl Default for Skybox {
249    fn default() -> Self {
250        Skybox {
251            image: None,
252            brightness: 0.0,
253            rotation: Quat::IDENTITY,
254        }
255    }
256}
257
258/// A generated environment map that is filtered at runtime.
259///
260/// See `bevy_pbr::light_probe::generate` for detailed information.
261#[derive(#[automatically_derived]
impl ::core::clone::Clone for GeneratedEnvironmentMapLight {
    #[inline]
    fn clone(&self) -> GeneratedEnvironmentMapLight {
        GeneratedEnvironmentMapLight {
            environment_map: ::core::clone::Clone::clone(&self.environment_map),
            intensity: ::core::clone::Clone::clone(&self.intensity),
            rotation: ::core::clone::Clone::clone(&self.rotation),
            affects_lightmapped_mesh_diffuse: ::core::clone::Clone::clone(&self.affects_lightmapped_mesh_diffuse),
        }
    }
}Clone, impl bevy_ecs::component::Component for GeneratedEnvironmentMapLight where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for
            GeneratedEnvironmentMapLight where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Handle<Image> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <f32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <Quat as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <bool as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for GeneratedEnvironmentMapLight where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Handle<Image>>("environment_map"),
                                                bevy_reflect::NamedField::new::<f32>("intensity"),
                                                bevy_reflect::NamedField::new::<Quat>("rotation"),
                                                bevy_reflect::NamedField::new::<bool>("affects_lightmapped_mesh_diffuse")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for GeneratedEnvironmentMapLight where  {
            fn type_path() -> &'static str {
                "bevy_light::probe::GeneratedEnvironmentMapLight"
            }
            fn short_type_path() -> &'static str {
                "GeneratedEnvironmentMapLight"
            }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("GeneratedEnvironmentMapLight")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe")
            }
        }
        impl bevy_reflect::Reflect for GeneratedEnvironmentMapLight where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<GeneratedEnvironmentMapLight
                                        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 GeneratedEnvironmentMapLight
            where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "environment_map" =>
                        ::core::option::Option::Some(&self.environment_map),
                    "intensity" =>
                        ::core::option::Option::Some(&self.intensity),
                    "rotation" => ::core::option::Option::Some(&self.rotation),
                    "affects_lightmapped_mesh_diffuse" =>
                        ::core::option::Option::Some(&self.affects_lightmapped_mesh_diffuse),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "environment_map" =>
                        ::core::option::Option::Some(&mut self.environment_map),
                    "intensity" =>
                        ::core::option::Option::Some(&mut self.intensity),
                    "rotation" =>
                        ::core::option::Option::Some(&mut self.rotation),
                    "affects_lightmapped_mesh_diffuse" =>
                        ::core::option::Option::Some(&mut self.affects_lightmapped_mesh_diffuse),
                    _ => ::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.environment_map),
                    1usize => ::core::option::Option::Some(&self.intensity),
                    2usize => ::core::option::Option::Some(&self.rotation),
                    3usize =>
                        ::core::option::Option::Some(&self.affects_lightmapped_mesh_diffuse),
                    _ => ::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.environment_map),
                    1usize => ::core::option::Option::Some(&mut self.intensity),
                    2usize => ::core::option::Option::Some(&mut self.rotation),
                    3usize =>
                        ::core::option::Option::Some(&mut self.affects_lightmapped_mesh_diffuse),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("environment_map"),
                    1usize => ::core::option::Option::Some("intensity"),
                    2usize => ::core::option::Option::Some("rotation"),
                    3usize =>
                        ::core::option::Option::Some("affects_lightmapped_mesh_diffuse"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "environment_map" => ::core::option::Option::Some(0usize),
                    "intensity" => ::core::option::Option::Some(1usize),
                    "rotation" => ::core::option::Option::Some(2usize),
                    "affects_lightmapped_mesh_diffuse" =>
                        ::core::option::Option::Some(3usize),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_len(&self) -> usize { 4usize }
            fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
                bevy_reflect::structs::FieldIter::new(self)
            }
            fn to_dynamic_struct(&self)
                -> bevy_reflect::structs::DynamicStruct {
                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("environment_map",
                    bevy_reflect::PartialReflect::to_dynamic(&self.environment_map));
                dynamic.insert_boxed("intensity",
                    bevy_reflect::PartialReflect::to_dynamic(&self.intensity));
                dynamic.insert_boxed("rotation",
                    bevy_reflect::PartialReflect::to_dynamic(&self.rotation));
                dynamic.insert_boxed("affects_lightmapped_mesh_diffuse",
                    bevy_reflect::PartialReflect::to_dynamic(&self.affects_lightmapped_mesh_diffuse));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for GeneratedEnvironmentMapLight
            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 GeneratedEnvironmentMapLight 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) =
                            (||
                                        <Handle<Image> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "environment_map")?))() {
                        __this.environment_map = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "intensity")?))() {
                        __this.intensity = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <Quat as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "rotation")?))() {
                        __this.rotation = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <bool as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "affects_lightmapped_mesh_diffuse")?))() {
                        __this.affects_lightmapped_mesh_diffuse = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, impl ::core::default::Default for GeneratedEnvironmentMapLightTemplate {
    fn default() -> Self {
        Self {
            environment_map: ::core::default::Default::default(),
            intensity: ::core::default::Default::default(),
            rotation: ::core::default::Default::default(),
            affects_lightmapped_mesh_diffuse: ::core::default::Default::default(),
        }
    }
}FromTemplate)]
262#[reflect(Component, Default, Clone)]
263pub struct GeneratedEnvironmentMapLight {
264    /// Source cubemap to be filtered on the GPU, size must be a power of two.
265    pub environment_map: Handle<Image>,
266
267    /// Scale factor applied to the diffuse and specular light generated by this
268    /// component. Expressed in cd/m² (candela per square meter).
269    pub intensity: f32,
270
271    /// World-space rotation applied to the cubemap.
272    pub rotation: Quat,
273
274    /// Whether this light contributes diffuse lighting to meshes that already
275    /// have baked lightmaps.
276    pub affects_lightmapped_mesh_diffuse: bool,
277}
278
279impl Default for GeneratedEnvironmentMapLight {
280    fn default() -> Self {
281        GeneratedEnvironmentMapLight {
282            environment_map: Handle::default(),
283            intensity: 0.0,
284            rotation: Quat::IDENTITY,
285            affects_lightmapped_mesh_diffuse: true,
286        }
287    }
288}
289
290/// Lets the atmosphere contribute environment lighting (reflections and ambient diffuse) to your scene.
291///
292/// Attach this to a [`Camera3d`](bevy_camera::Camera3d) to light the entire view, or to a
293/// [`LightProbe`] to light only a specific region.
294/// Behind the scenes, this generates an environment map from the atmosphere for image-based lighting
295/// and inserts a corresponding [`GeneratedEnvironmentMapLight`].
296///
297/// For HDRI-based lighting, use a preauthored [`EnvironmentMapLight`] or filter one at runtime with
298/// [`GeneratedEnvironmentMapLight`].
299#[derive(impl bevy_ecs::component::Component for AtmosphereEnvironmentMapLight where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, #[automatically_derived]
impl ::core::clone::Clone for AtmosphereEnvironmentMapLight {
    #[inline]
    fn clone(&self) -> AtmosphereEnvironmentMapLight {
        AtmosphereEnvironmentMapLight {
            intensity: ::core::clone::Clone::clone(&self.intensity),
            affects_lightmapped_mesh_diffuse: ::core::clone::Clone::clone(&self.affects_lightmapped_mesh_diffuse),
            size: ::core::clone::Clone::clone(&self.size),
        }
    }
}Clone)]
300pub struct AtmosphereEnvironmentMapLight {
301    /// Controls how bright the atmosphere's environment lighting is.
302    /// Increase this value to brighten reflections and ambient diffuse lighting.
303    ///
304    /// The default is `1.0` so that the generated environment lighting matches
305    /// the light intensity of the atmosphere in the scene.
306    pub intensity: f32,
307    /// Whether the diffuse contribution should affect meshes that already have lightmaps.
308    pub affects_lightmapped_mesh_diffuse: bool,
309    /// Cubemap resolution in pixels (must be a power-of-two).
310    pub size: UVec2,
311}
312
313impl Default for AtmosphereEnvironmentMapLight {
314    fn default() -> Self {
315        Self {
316            intensity: 1.0,
317            affects_lightmapped_mesh_diffuse: true,
318            size: UVec2::new(512, 512),
319        }
320    }
321}
322
323/// The component that defines an irradiance volume.
324///
325/// See `bevy_pbr::irradiance_volume` for detailed information.
326///
327/// This component requires the [`LightProbe`] component, and is typically used with
328/// [`bevy_transform::components::Transform`] to place the volume appropriately.
329#[derive(#[automatically_derived]
impl ::core::clone::Clone for IrradianceVolume {
    #[inline]
    fn clone(&self) -> IrradianceVolume {
        IrradianceVolume {
            voxels: ::core::clone::Clone::clone(&self.voxels),
            intensity: ::core::clone::Clone::clone(&self.intensity),
            affects_lightmapped_meshes: ::core::clone::Clone::clone(&self.affects_lightmapped_meshes),
        }
    }
}Clone, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for IrradianceVolume where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Handle<Image> as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <f32 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
                <bool as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for IrradianceVolume where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Handle<Image>>("voxels"),
                                                bevy_reflect::NamedField::new::<f32>("intensity"),
                                                bevy_reflect::NamedField::new::<bool>("affects_lightmapped_meshes")]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for IrradianceVolume where  {
            fn type_path() -> &'static str {
                "bevy_light::probe::IrradianceVolume"
            }
            fn short_type_path() -> &'static str { "IrradianceVolume" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("IrradianceVolume")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe")
            }
        }
        impl bevy_reflect::Reflect for IrradianceVolume where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<IrradianceVolume
                                        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 IrradianceVolume where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name {
                    "voxels" => ::core::option::Option::Some(&self.voxels),
                    "intensity" =>
                        ::core::option::Option::Some(&self.intensity),
                    "affects_lightmapped_meshes" =>
                        ::core::option::Option::Some(&self.affects_lightmapped_meshes),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name {
                    "voxels" => ::core::option::Option::Some(&mut self.voxels),
                    "intensity" =>
                        ::core::option::Option::Some(&mut self.intensity),
                    "affects_lightmapped_meshes" =>
                        ::core::option::Option::Some(&mut self.affects_lightmapped_meshes),
                    _ => ::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.voxels),
                    1usize => ::core::option::Option::Some(&self.intensity),
                    2usize =>
                        ::core::option::Option::Some(&self.affects_lightmapped_meshes),
                    _ => ::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.voxels),
                    1usize => ::core::option::Option::Some(&mut self.intensity),
                    2usize =>
                        ::core::option::Option::Some(&mut self.affects_lightmapped_meshes),
                    _ => ::core::option::Option::None,
                }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index {
                    0usize => ::core::option::Option::Some("voxels"),
                    1usize => ::core::option::Option::Some("intensity"),
                    2usize =>
                        ::core::option::Option::Some("affects_lightmapped_meshes"),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name {
                    "voxels" => ::core::option::Option::Some(0usize),
                    "intensity" => ::core::option::Option::Some(1usize),
                    "affects_lightmapped_meshes" =>
                        ::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)
                -> bevy_reflect::structs::DynamicStruct {
                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("voxels",
                    bevy_reflect::PartialReflect::to_dynamic(&self.voxels));
                dynamic.insert_boxed("intensity",
                    bevy_reflect::PartialReflect::to_dynamic(&self.intensity));
                dynamic.insert_boxed("affects_lightmapped_meshes",
                    bevy_reflect::PartialReflect::to_dynamic(&self.affects_lightmapped_meshes));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for IrradianceVolume 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)
            }
            fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
                -> ::core::fmt::Result {
                ::core::fmt::Debug::fmt(self, f)
            }
            #[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 IrradianceVolume 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) =
                            (||
                                        <Handle<Image> as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "voxels")?))() {
                        __this.voxels = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <f32 as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "intensity")?))() {
                        __this.intensity = __field;
                    }
                    if let ::core::option::Option::Some(__field) =
                            (||
                                        <bool as
                                                bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
                                                    "affects_lightmapped_meshes")?))() {
                        __this.affects_lightmapped_meshes = __field;
                    }
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect, #[doc =
"**Required Components**: [`LightProbe`]. \n\n A component's Required Components are inserted whenever it is inserted. Note that this will also insert the required components _of_ the required components, recursively, in depth-first order."]
impl bevy_ecs::component::Component for IrradianceVolume where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {
        required_components.register_required::<LightProbe>(<LightProbe as
                ::core::default::Default>::default);
    }
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, #[automatically_derived]
impl ::core::fmt::Debug for IrradianceVolume {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "IrradianceVolume", "voxels", &self.voxels, "intensity",
            &self.intensity, "affects_lightmapped_meshes",
            &&self.affects_lightmapped_meshes)
    }
}Debug, impl ::core::default::Default for IrradianceVolumeTemplate {
    fn default() -> Self {
        Self {
            voxels: ::core::default::Default::default(),
            intensity: ::core::default::Default::default(),
            affects_lightmapped_meshes: ::core::default::Default::default(),
        }
    }
}FromTemplate)]
330#[reflect(Component, Default, Debug, Clone)]
331#[require(LightProbe)]
332pub struct IrradianceVolume {
333    /// The 3D texture that represents the ambient cubes, encoded in the format
334    /// described in `bevy_pbr::irradiance_volume`.
335    pub voxels: Handle<Image>,
336
337    /// Scale factor applied to the diffuse and specular light generated by this component.
338    ///
339    /// After applying this multiplier, the resulting values should
340    /// be in units of [cd/m^2](https://en.wikipedia.org/wiki/Candela_per_square_metre).
341    ///
342    /// See also <https://google.github.io/filament/Filament.md.html#lighting/imagebasedlights/iblunit>.
343    pub intensity: f32,
344
345    /// Whether the light from this irradiance volume has an effect on meshes
346    /// with lightmaps.
347    ///
348    /// Set this to false if your lightmap baking tool bakes the light from this
349    /// irradiance volume into the lightmaps in order to avoid counting the
350    /// irradiance twice. Frequently, applications use irradiance volumes as a
351    /// lower-quality alternative to lightmaps for capturing indirect
352    /// illumination on dynamic objects, and such applications will want to set
353    /// this value to false.
354    ///
355    /// By default, this is set to true.
356    pub affects_lightmapped_meshes: bool,
357}
358
359impl Default for IrradianceVolume {
360    #[inline]
361    fn default() -> Self {
362        IrradianceVolume {
363            voxels: Handle::default(),
364            intensity: 0.0,
365            affects_lightmapped_meshes: true,
366        }
367    }
368}
369
370/// Add this component to a reflection probe to customize *parallax correction*.
371///
372/// For environment maps added directly to a camera, Bevy renders the reflected
373/// scene that a cubemap captures as though it were infinitely far away. This is
374/// acceptable if the cubemap captures very distant objects, such as distant
375/// mountains in outdoor scenes. It's less ideal, however, if the cubemap
376/// reflects near objects, such as the interior of a room. Therefore, by default
377/// for reflection probes Bevy uses *parallax-corrected cubemaps* (PCCM), which
378/// causes Bevy to treat the reflected scene as though it coincided with the
379/// boundaries of the light probe.
380///
381/// As an example, for indoor scenes, it's common to place reflection probes
382/// inside each room and to make the boundaries of the reflection probe (as
383/// determined by the light probe's [`bevy_transform::components::Transform`])
384/// coincide with the walls of the room. That way, the reflection probes will
385/// (1) apply to the objects inside the room and (2) take the positions of those
386/// objects into account in order to create a realistic reflection.
387///
388/// Instead of having the simulated boundaries of the reflected area coincide
389/// with the boundaries of the light probe, it's also possible to specify
390/// *custom* parallax correction boundaries, so that the region of influence of
391/// the light probe doesn't correspond with the simulated boundaries used for
392/// parallax correction. This is commonly used when the boundaries of the light
393/// probe are slightly larger than the room that the light probe contains, for
394/// instance in order to avoid artifacts along the edges of the room that occur
395/// due to rounding error, or else when the *falloff* feature is used that
396/// blends reflection probes into adjacent ones.
397///
398/// Place this component on an entity that has a [`LightProbe`] and
399/// [`EnvironmentMapLight`] component in order to either (1) opt out of parallax
400/// correction via [`ParallaxCorrection::None`] or (2) specify custom parallax
401/// correction boundaries via [`ParallaxCorrection::Custom`]. If you don't
402/// manually place this component on a reflection probe, Bevy will automatically
403/// add a [`ParallaxCorrection::Auto`] component so that the boundaries of the
404/// light probe will coincide with the simulated boundaries used for parallax
405/// correction.
406///
407/// See the `pccm` example for an example of usage of parallax-corrected
408/// cubemaps and the `light_probe_blending` example for an example of use of
409/// custom parallax correction boundaries.
410#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParallaxCorrection {
    #[inline]
    fn clone(&self) -> ParallaxCorrection {
        let _: ::core::clone::AssertParamIsClone<Vec3>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ParallaxCorrection { }Copy, #[automatically_derived]
impl ::core::default::Default for ParallaxCorrection {
    #[inline]
    fn default() -> ParallaxCorrection { Self::Auto }
}Default, impl bevy_ecs::component::Component for ParallaxCorrection where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn map_entities<M: bevy_ecs::entity::EntityMapper>(this: &mut Self,
        mapper: &mut M) {
        use bevy_ecs::entity::MapEntities;
        match this {
            Self::None { .. } => {}
            Self::Auto { .. } => {}
            Self::Custom { .. } => {}
            _ => {}
        }
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for ParallaxCorrection where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectDefault, Self>();
                registration.register_type_data::<ReflectComponent, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {
                <Vec3 as
                        bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
            }
        }
        impl bevy_reflect::Typed for ParallaxCorrection where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Enum(bevy_reflect::enums::EnumInfo::new::<Self>(&[bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("None")),
                                                bevy_reflect::enums::VariantInfo::Unit(bevy_reflect::enums::UnitVariantInfo::new("Auto")),
                                                bevy_reflect::enums::VariantInfo::Tuple(bevy_reflect::enums::TupleVariantInfo::new("Custom",
                                                        &[bevy_reflect::UnnamedField::new::<Vec3>(0usize)]))]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for ParallaxCorrection where  {
            fn type_path() -> &'static str {
                "bevy_light::probe::ParallaxCorrection"
            }
            fn short_type_path() -> &'static str { "ParallaxCorrection" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("ParallaxCorrection")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_light::probe")
            }
        }
        impl bevy_reflect::Reflect for ParallaxCorrection where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<ParallaxCorrection
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::enums::Enum for ParallaxCorrection where  {
            fn field(&self, __name_param: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match self { _ => ::core::option::Option::None, }
            }
            fn field_at(&self, __index_param: usize)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match self {
                    ParallaxCorrection::Custom { 0: __value, .. } if
                        __index_param == 0usize =>
                        ::core::option::Option::Some(__value),
                    _ => ::core::option::Option::None,
                }
            }
            fn field_mut(&mut self, __name_param: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match self { _ => ::core::option::Option::None, }
            }
            fn field_at_mut(&mut self, __index_param: usize)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match self {
                    ParallaxCorrection::Custom { 0: __value, .. } if
                        __index_param == 0usize =>
                        ::core::option::Option::Some(__value),
                    _ => ::core::option::Option::None,
                }
            }
            fn index_of(&self, __name_param: &str)
                -> ::core::option::Option<usize> {
                match self { _ => ::core::option::Option::None, }
            }
            fn name_at(&self, __index_param: usize)
                -> ::core::option::Option<&str> {
                match self { _ => ::core::option::Option::None, }
            }
            fn iter_fields(&self) -> bevy_reflect::enums::VariantFieldIter {
                bevy_reflect::enums::VariantFieldIter::new(self)
            }
            #[inline]
            fn field_len(&self) -> usize {
                match self {
                    ParallaxCorrection::None { .. } => 0usize,
                    ParallaxCorrection::Auto { .. } => 0usize,
                    ParallaxCorrection::Custom { .. } => 1usize,
                    _ => 0,
                }
            }
            #[inline]
            fn variant_name(&self) -> &str {
                match self {
                    ParallaxCorrection::None { .. } => "None",
                    ParallaxCorrection::Auto { .. } => "Auto",
                    ParallaxCorrection::Custom { .. } => "Custom",
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            #[inline]
            fn variant_index(&self) -> usize {
                match self {
                    ParallaxCorrection::None { .. } => 0usize,
                    ParallaxCorrection::Auto { .. } => 1usize,
                    ParallaxCorrection::Custom { .. } => 2usize,
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            #[inline]
            fn variant_type(&self) -> bevy_reflect::enums::VariantType {
                match self {
                    ParallaxCorrection::None { .. } =>
                        bevy_reflect::enums::VariantType::Unit,
                    ParallaxCorrection::Auto { .. } =>
                        bevy_reflect::enums::VariantType::Unit,
                    ParallaxCorrection::Custom { .. } =>
                        bevy_reflect::enums::VariantType::Tuple,
                    _ =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                }
            }
            fn to_dynamic_enum(&self) -> bevy_reflect::enums::DynamicEnum {
                bevy_reflect::enums::DynamicEnum::from_ref::<Self>(self)
            }
        }
        impl bevy_reflect::PartialReflect for ParallaxCorrection where  {
            #[inline]
            fn get_represented_type_info(&self)
                -> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
                ::core::option::Option::Some(<Self as
                            bevy_reflect::Typed>::type_info())
            }
            #[inline]
            fn try_apply(&mut self,
                __value_param: &dyn bevy_reflect::PartialReflect)
                -> ::core::result::Result<(), bevy_reflect::ApplyError> {
                if let bevy_reflect::ReflectRef::Enum(__value_param) =
                        bevy_reflect::PartialReflect::reflect_ref(__value_param) {
                    if bevy_reflect::enums::Enum::variant_name(self) ==
                            bevy_reflect::enums::Enum::variant_name(__value_param) {
                        match bevy_reflect::enums::Enum::variant_type(__value_param)
                            {
                            bevy_reflect::enums::VariantType::Struct => {
                                for field in
                                    bevy_reflect::enums::Enum::iter_fields(__value_param) {
                                    let name = field.name().unwrap();
                                    if let ::core::option::Option::Some(v) =
                                            bevy_reflect::enums::Enum::field_mut(self, name) {
                                        bevy_reflect::PartialReflect::try_apply(v, field.value())?;
                                    }
                                }
                            }
                            bevy_reflect::enums::VariantType::Tuple => {
                                for (index, field) in
                                    ::core::iter::Iterator::enumerate(bevy_reflect::enums::Enum::iter_fields(__value_param))
                                    {
                                    if let ::core::option::Option::Some(v) =
                                            bevy_reflect::enums::Enum::field_at_mut(self, index) {
                                        bevy_reflect::PartialReflect::try_apply(v, field.value())?;
                                    }
                                }
                            }
                            _ => {}
                        }
                    } else {
                        match bevy_reflect::enums::Enum::variant_name(__value_param)
                            {
                            "None" => { *self = ParallaxCorrection::None {} }
                            "Auto" => { *self = ParallaxCorrection::Auto {} }
                            "Custom" => {
                                *self =
                                    ParallaxCorrection::Custom {
                                        0: {
                                            let __0 = __value_param.field_at(0usize);
                                            let __0 =
                                                __0.ok_or(bevy_reflect::ApplyError::MissingEnumField {
                                                            variant_name: ::core::convert::Into::into("Custom"),
                                                            field_name: ::core::convert::Into::into(".0"),
                                                        })?;
                                            <Vec3 as
                                                            bevy_reflect::FromReflect>::from_reflect(__0).ok_or(bevy_reflect::ApplyError::MismatchedTypes {
                                                        from_type: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(__0)),
                                                        to_type: ::core::convert::Into::into(<Vec3 as
                                                                    bevy_reflect::TypePath>::type_path()),
                                                    })?
                                        },
                                    }
                            }
                            name => {
                                return ::core::result::Result::Err(bevy_reflect::ApplyError::UnknownVariant {
                                            enum_name: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(self)),
                                            variant_name: ::core::convert::Into::into(name),
                                        });
                            }
                        }
                    }
                } else {
                    return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
                                from_kind: bevy_reflect::PartialReflect::reflect_kind(__value_param),
                                to_kind: bevy_reflect::ReflectKind::Enum,
                            });
                }
                ::core::result::Result::Ok(())
            }
            fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
                bevy_reflect::ReflectKind::Enum
            }
            fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
                bevy_reflect::ReflectRef::Enum(self)
            }
            fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
                bevy_reflect::ReflectMut::Enum(self)
            }
            fn reflect_owned(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                -> bevy_reflect::ReflectOwned {
                bevy_reflect::ReflectOwned::Enum(self)
            }
            #[inline]
            fn try_into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
                ::core::result::Result::Ok(self)
            }
            #[inline]
            fn try_as_reflect(&self)
                -> ::core::option::Option<&dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn try_as_reflect_mut(&mut self)
                -> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn into_partial_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
                self
            }
            #[inline]
            fn as_partial_reflect(&self)
                -> &dyn bevy_reflect::PartialReflect {
                self
            }
            #[inline]
            fn as_partial_reflect_mut(&mut self)
                -> &mut dyn bevy_reflect::PartialReflect {
                self
            }
            fn reflect_hash(&self) -> ::core::option::Option<u64> {
                (bevy_reflect::enums::enum_hash)(self)
            }
            fn reflect_partial_eq(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<bool> {
                (bevy_reflect::enums::enum_partial_eq)(self, value)
            }
            fn reflect_partial_cmp(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<::core::cmp::Ordering> {
                (bevy_reflect::enums::enum_partial_cmp)(self, value)
            }
            #[inline]
            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 ParallaxCorrection where  {
            fn from_reflect(__param0: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<Self> {
                if let bevy_reflect::ReflectRef::Enum(__param0) =
                        bevy_reflect::PartialReflect::reflect_ref(__param0) {
                    match bevy_reflect::enums::Enum::variant_name(__param0) {
                        "None" =>
                            ::core::option::Option::Some(ParallaxCorrection::None {}),
                        "Auto" =>
                            ::core::option::Option::Some(ParallaxCorrection::Auto {}),
                        "Custom" =>
                            ::core::option::Option::Some(ParallaxCorrection::Custom {
                                    0: {
                                        let __0 = __param0.field_at(0usize);
                                        let __0 = __0?;
                                        <Vec3 as bevy_reflect::FromReflect>::from_reflect(__0)?
                                    },
                                }),
                        name => ::core::option::Option::None,
                    }
                } else { ::core::option::Option::None }
            }
        }
    };Reflect)]
411#[reflect(Clone, Default, Component)]
412pub enum ParallaxCorrection {
413    /// No parallax correction is used.
414    ///
415    /// This component causes Bevy to render the reflection as though the
416    /// reflected surface were infinitely distant.
417    None,
418
419    /// The parallax correction boundaries correspond with the boundaries of the
420    /// light probe.
421    ///
422    /// This is the default value. Bevy automatically adds this component value
423    /// to reflection probes that don't have a [`ParallaxCorrection`] component.
424    /// It's equivalent to `ParallaxCorrection::Custom(Vec3::splat(0.5))`.
425    #[default]
426    Auto,
427
428    /// The parallax correction boundaries are specified manually.
429    ///
430    /// The simulated reflection boundaries are specified as an axis-aligned
431    /// cube *in light probe space* with the given *half* extents. Thus, for
432    /// example, if you set the parallax correction boundaries to `vec3(0.5,
433    /// 1.0, 2.0)` and the scale of the light probe is `vec3(3.0, 3.0, 3.0)`,
434    /// then the simulated boundaries of the reflected area used for parallax
435    /// correction will be centered on the reflection probe with a width of 3.0
436    /// m, a height of 6.0 m, and a depth of 12.0 m.
437    Custom(Vec3),
438}
439
440/// A system that automatically adds a [`ParallaxCorrection::Auto`] component to
441/// any reflection probe that doesn't already have a [`ParallaxCorrection`]
442/// component.
443///
444/// A reflection probe is any entity with both an [`EnvironmentMapLight`] and a
445/// [`LightProbe`] component.
446pub fn automatically_add_parallax_correction_components(
447    mut commands: Commands,
448    query: Query<
449        Entity,
450        (
451            With<EnvironmentMapLight>,
452            With<LightProbe>,
453            Without<ParallaxCorrection>,
454        ),
455    >,
456) {
457    for entity in &query {
458        commands
459            .entity(entity)
460            .insert(ParallaxCorrection::default());
461    }
462}