Merge branch 'main' into prestartup-window

This commit is contained in:
Jan Hohenheim 2025-07-07 22:54:13 +02:00 committed by GitHub
commit ab0914c800
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 63 additions and 66 deletions

View File

@ -294,7 +294,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Check for typos - name: Check for typos
uses: crate-ci/typos@v1.33.1 uses: crate-ci/typos@v1.34.0
- name: Typos info - name: Typos info
if: failure() if: failure()
run: | run: |

View File

@ -176,7 +176,7 @@ impl Default for SliderRange {
} }
/// Defines the amount by which to increment or decrement the slider value when using keyboard /// Defines the amount by which to increment or decrement the slider value when using keyboard
/// shorctuts. Defaults to 1.0. /// shortcuts. Defaults to 1.0.
#[derive(Component, Debug, PartialEq, Clone)] #[derive(Component, Debug, PartialEq, Clone)]
#[component(immutable)] #[component(immutable)]
pub struct SliderStep(pub f32); pub struct SliderStep(pub f32);

View File

@ -630,7 +630,7 @@ impl Archetype {
#[inline] #[inline]
pub fn len(&self) -> u32 { pub fn len(&self) -> u32 {
// No entity may have more than one archetype row, so there are no duplicates, // No entity may have more than one archetype row, so there are no duplicates,
// and there may only ever be u32::MAX entities, so the length never exceeds u32's cappacity. // and there may only ever be u32::MAX entities, so the length never exceeds u32's capacity.
self.entities.len() as u32 self.entities.len() as u32
} }

View File

@ -597,7 +597,7 @@ impl Table {
#[inline] #[inline]
pub fn entity_count(&self) -> u32 { pub fn entity_count(&self) -> u32 {
// No entity may have more than one table row, so there are no duplicates, // No entity may have more than one table row, so there are no duplicates,
// and there may only ever be u32::MAX entities, so the length never exceeds u32's cappacity. // and there may only ever be u32::MAX entities, so the length never exceeds u32's capacity.
self.entities.len() as u32 self.entities.len() as u32
} }

View File

@ -27,7 +27,7 @@ use cluster::{
mod ambient_light; mod ambient_light;
pub use ambient_light::AmbientLight; pub use ambient_light::AmbientLight;
mod probe; mod probe;
pub use probe::{EnvironmentMapLight, LightProbe}; pub use probe::{EnvironmentMapLight, IrradianceVolume, LightProbe};
mod volumetric; mod volumetric;
pub use volumetric::{FogVolume, VolumetricFog, VolumetricLight}; pub use volumetric::{FogVolume, VolumetricFog, VolumetricLight};
pub mod cascade; pub mod cascade;
@ -121,6 +121,7 @@ impl Plugin for LightPlugin {
.register_type::<PointLight>() .register_type::<PointLight>()
.register_type::<LightProbe>() .register_type::<LightProbe>()
.register_type::<EnvironmentMapLight>() .register_type::<EnvironmentMapLight>()
.register_type::<IrradianceVolume>()
.register_type::<VolumetricFog>() .register_type::<VolumetricFog>()
.register_type::<VolumetricLight>() .register_type::<VolumetricLight>()
.register_type::<PointLightShadowMap>() .register_type::<PointLightShadowMap>()

View File

@ -107,3 +107,50 @@ impl Default for EnvironmentMapLight {
} }
} }
} }
/// The component that defines an irradiance volume.
///
/// See `bevy_pbr::irradiance_volume` for detailed information.
///
/// This component requires the [`LightProbe`] component, and is typically used with
/// [`bevy_transform::components::Transform`] to place the volume appropriately.
#[derive(Clone, Reflect, Component, Debug)]
#[reflect(Component, Default, Debug, Clone)]
#[require(LightProbe)]
pub struct IrradianceVolume {
/// The 3D texture that represents the ambient cubes, encoded in the format
/// described in `bevy_pbr::irradiance_volume`.
pub voxels: Handle<Image>,
/// Scale factor applied to the diffuse and specular light generated by this component.
///
/// After applying this multiplier, the resulting values should
/// be in units of [cd/m^2](https://en.wikipedia.org/wiki/Candela_per_square_metre).
///
/// See also <https://google.github.io/filament/Filament.html#lighting/imagebasedlights/iblunit>.
pub intensity: f32,
/// Whether the light from this irradiance volume has an effect on meshes
/// with lightmaps.
///
/// Set this to false if your lightmap baking tool bakes the light from this
/// irradiance volume into the lightmaps in order to avoid counting the
/// irradiance twice. Frequently, applications use irradiance volumes as a
/// lower-quality alternative to lightmaps for capturing indirect
/// illumination on dynamic objects, and such applications will want to set
/// this value to false.
///
/// By default, this is set to true.
pub affects_lightmapped_meshes: bool,
}
impl Default for IrradianceVolume {
#[inline]
fn default() -> Self {
IrradianceVolume {
voxels: Handle::default(),
intensity: 0.0,
affects_lightmapped_meshes: true,
}
}
}

View File

@ -51,9 +51,9 @@ use bevy_light::SimulationLightSystems;
pub use bevy_light::{ pub use bevy_light::{
light_consts, AmbientLight, CascadeShadowConfig, CascadeShadowConfigBuilder, Cascades, light_consts, AmbientLight, CascadeShadowConfig, CascadeShadowConfigBuilder, Cascades,
ClusteredDecal, DirectionalLight, DirectionalLightShadowMap, DirectionalLightTexture, ClusteredDecal, DirectionalLight, DirectionalLightShadowMap, DirectionalLightTexture,
FogVolume, LightPlugin, LightProbe, NotShadowCaster, NotShadowReceiver, PointLight, FogVolume, IrradianceVolume, LightPlugin, LightProbe, NotShadowCaster, NotShadowReceiver,
PointLightShadowMap, PointLightTexture, ShadowFilteringMethod, SpotLight, SpotLightTexture, PointLight, PointLightShadowMap, PointLightTexture, ShadowFilteringMethod, SpotLight,
TransmittedShadowReceiver, VolumetricFog, VolumetricLight, SpotLightTexture, TransmittedShadowReceiver, VolumetricFog, VolumetricLight,
}; };
pub use cluster::*; pub use cluster::*;
pub use components::*; pub use components::*;

View File

@ -133,9 +133,8 @@
//! //!
//! [Why ambient cubes?]: #why-ambient-cubes //! [Why ambient cubes?]: #why-ambient-cubes
use bevy_ecs::{component::Component, reflect::ReflectComponent};
use bevy_image::Image; use bevy_image::Image;
use bevy_light::LightProbe; pub use bevy_light::IrradianceVolume;
use bevy_render::{ use bevy_render::{
render_asset::RenderAssets, render_asset::RenderAssets,
render_resource::{ render_resource::{
@ -145,11 +144,9 @@ use bevy_render::{
renderer::{RenderAdapter, RenderDevice}, renderer::{RenderAdapter, RenderDevice},
texture::{FallbackImage, GpuImage}, texture::{FallbackImage, GpuImage},
}; };
use bevy_utils::default;
use core::{num::NonZero, ops::Deref}; use core::{num::NonZero, ops::Deref};
use bevy_asset::{AssetId, Handle}; use bevy_asset::AssetId;
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
use crate::{ use crate::{
add_cubemap_texture_view, binding_arrays_are_usable, RenderViewLightProbes, add_cubemap_texture_view, binding_arrays_are_usable, RenderViewLightProbes,
@ -163,53 +160,6 @@ use super::LightProbeComponent;
/// (see issue #11885). /// (see issue #11885).
pub(crate) const IRRADIANCE_VOLUMES_ARE_USABLE: bool = cfg!(not(target_arch = "wasm32")); pub(crate) const IRRADIANCE_VOLUMES_ARE_USABLE: bool = cfg!(not(target_arch = "wasm32"));
/// The component that defines an irradiance volume.
///
/// See [`crate::irradiance_volume`] for detailed information.
///
/// This component requires the [`LightProbe`] component, and is typically used with
/// [`bevy_transform::components::Transform`] to place the volume appropriately.
#[derive(Clone, Reflect, Component, Debug)]
#[reflect(Component, Default, Debug, Clone)]
#[require(LightProbe)]
pub struct IrradianceVolume {
/// The 3D texture that represents the ambient cubes, encoded in the format
/// described in [`crate::irradiance_volume`].
pub voxels: Handle<Image>,
/// Scale factor applied to the diffuse and specular light generated by this component.
///
/// After applying this multiplier, the resulting values should
/// be in units of [cd/m^2](https://en.wikipedia.org/wiki/Candela_per_square_metre).
///
/// See also <https://google.github.io/filament/Filament.html#lighting/imagebasedlights/iblunit>.
pub intensity: f32,
/// Whether the light from this irradiance volume has an effect on meshes
/// with lightmaps.
///
/// Set this to false if your lightmap baking tool bakes the light from this
/// irradiance volume into the lightmaps in order to avoid counting the
/// irradiance twice. Frequently, applications use irradiance volumes as a
/// lower-quality alternative to lightmaps for capturing indirect
/// illumination on dynamic objects, and such applications will want to set
/// this value to false.
///
/// By default, this is set to true.
pub affects_lightmapped_meshes: bool,
}
impl Default for IrradianceVolume {
#[inline]
fn default() -> Self {
IrradianceVolume {
voxels: default(),
intensity: 0.0,
affects_lightmapped_meshes: true,
}
}
}
/// All the bind group entries necessary for PBR shaders to access the /// All the bind group entries necessary for PBR shaders to access the
/// irradiance volumes exposed to a view. /// irradiance volumes exposed to a view.
pub(crate) enum RenderViewIrradianceVolumeBindGroupEntries<'a> { pub(crate) enum RenderViewIrradianceVolumeBindGroupEntries<'a> {

View File

@ -288,8 +288,7 @@ impl Plugin for LightProbePlugin {
load_shader_library!(app, "environment_map.wgsl"); load_shader_library!(app, "environment_map.wgsl");
load_shader_library!(app, "irradiance_volume.wgsl"); load_shader_library!(app, "irradiance_volume.wgsl");
app.register_type::<IrradianceVolume>() app.add_plugins(ExtractInstancesPlugin::<EnvironmentMapIds>::new());
.add_plugins(ExtractInstancesPlugin::<EnvironmentMapIds>::new());
} }
fn finish(&self, app: &mut App) { fn finish(&self, app: &mut App) {

View File

@ -344,7 +344,7 @@ pub fn update_is_hovered(
} }
// Algorithm: for each entity having a `Hovered` component, we want to know if the current // Algorithm: for each entity having a `Hovered` component, we want to know if the current
// entry in the hover map is "within" (that is, in the set of descenants of) that entity. Rather // entry in the hover map is "within" (that is, in the set of descendants of) that entity. Rather
// than doing an expensive breadth-first traversal of children, instead start with the hovermap // than doing an expensive breadth-first traversal of children, instead start with the hovermap
// entry and search upwards. We can make this even cheaper by building a set of ancestors for // entry and search upwards. We can make this even cheaper by building a set of ancestors for
// the hovermap entry, and then testing each `Hovered` entity against that set. // the hovermap entry, and then testing each `Hovered` entity against that set.

View File

@ -215,7 +215,7 @@ pub enum ReflectRef<'a> {
/// [function-like]: Function /// [function-like]: Function
#[cfg(feature = "functions")] #[cfg(feature = "functions")]
Function(&'a dyn Function), Function(&'a dyn Function),
/// An immutable refeence to an [opaque] type. /// An immutable reference to an [opaque] type.
/// ///
/// [opaque]: ReflectKind::Opaque /// [opaque]: ReflectKind::Opaque
Opaque(&'a dyn PartialReflect), Opaque(&'a dyn PartialReflect),
@ -281,7 +281,7 @@ pub enum ReflectMut<'a> {
/// ///
/// [function-like]: Function /// [function-like]: Function
Function(&'a mut dyn Function), Function(&'a mut dyn Function),
/// A mutable refeence to an [opaque] type. /// A mutable reference to an [opaque] type.
/// ///
/// [opaque]: ReflectKind::Opaque /// [opaque]: ReflectKind::Opaque
Opaque(&'a mut dyn PartialReflect), Opaque(&'a mut dyn PartialReflect),

View File

@ -79,7 +79,7 @@ impl DebugName {
} }
} }
/// Get the [`ShortName`] corresping to this debug name /// Get the [`ShortName`] corresponding to this debug name
/// ///
/// The value will be a static string if the `debug` feature is not enabled /// The value will be a static string if the `debug` feature is not enabled
pub fn shortname(&self) -> ShortName { pub fn shortname(&self) -> ShortName {