From a0b90cd6189996cbfa62a533f1308e3ac649f929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?charlotte=20=F0=9F=8C=B8?= Date: Fri, 27 Jun 2025 09:30:54 -0700 Subject: [PATCH 01/68] Resolution override (#19817) Co-authored-by: JMS55 <47158642+JMS55@users.noreply.github.com> Co-authored-by: atlv --- .../src/core_3d/main_opaque_pass_3d_node.rs | 6 +++-- .../core_3d/main_transmissive_pass_3d_node.rs | 9 ++++--- .../core_3d/main_transparent_pass_3d_node.rs | 7 +++--- .../bevy_core_pipeline/src/deferred/node.rs | 8 ++++--- .../src/oit/resolve/node.rs | 7 +++--- crates/bevy_core_pipeline/src/prepass/node.rs | 8 ++++--- .../src/meshlet/material_shade_nodes.rs | 14 +++++++---- crates/bevy_render/src/camera/camera.rs | 24 +++++++++++++++++++ crates/bevy_render/src/camera/mod.rs | 1 + examples/shader/custom_render_phase.rs | 7 +++--- 10 files changed, 67 insertions(+), 24 deletions(-) diff --git a/crates/bevy_core_pipeline/src/core_3d/main_opaque_pass_3d_node.rs b/crates/bevy_core_pipeline/src/core_3d/main_opaque_pass_3d_node.rs index b19268ac1f..c5ee7a798d 100644 --- a/crates/bevy_core_pipeline/src/core_3d/main_opaque_pass_3d_node.rs +++ b/crates/bevy_core_pipeline/src/core_3d/main_opaque_pass_3d_node.rs @@ -4,7 +4,7 @@ use crate::{ }; use bevy_ecs::{prelude::World, query::QueryItem}; use bevy_render::{ - camera::ExtractedCamera, + camera::{ExtractedCamera, MainPassResolutionOverride}, diagnostic::RecordDiagnostics, render_graph::{NodeRunError, RenderGraphContext, ViewNode}, render_phase::{TrackedRenderPass, ViewBinnedRenderPhases}, @@ -31,6 +31,7 @@ impl ViewNode for MainOpaquePass3dNode { Option<&'static SkyboxPipelineId>, Option<&'static SkyboxBindGroup>, &'static ViewUniformOffset, + Option<&'static MainPassResolutionOverride>, ); fn run<'w>( @@ -45,6 +46,7 @@ impl ViewNode for MainOpaquePass3dNode { skybox_pipeline, skybox_bind_group, view_uniform_offset, + resolution_override, ): QueryItem<'w, '_, Self::ViewQuery>, world: &'w World, ) -> Result<(), NodeRunError> { @@ -90,7 +92,7 @@ impl ViewNode for MainOpaquePass3dNode { let pass_span = diagnostics.pass_span(&mut render_pass, "main_opaque_pass_3d"); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } // Opaque draws diff --git a/crates/bevy_core_pipeline/src/core_3d/main_transmissive_pass_3d_node.rs b/crates/bevy_core_pipeline/src/core_3d/main_transmissive_pass_3d_node.rs index 8c656171e7..393167227f 100644 --- a/crates/bevy_core_pipeline/src/core_3d/main_transmissive_pass_3d_node.rs +++ b/crates/bevy_core_pipeline/src/core_3d/main_transmissive_pass_3d_node.rs @@ -3,7 +3,7 @@ use crate::core_3d::Transmissive3d; use bevy_ecs::{prelude::*, query::QueryItem}; use bevy_image::ToExtents; use bevy_render::{ - camera::ExtractedCamera, + camera::{ExtractedCamera, MainPassResolutionOverride}, render_graph::{NodeRunError, RenderGraphContext, ViewNode}, render_phase::ViewSortedRenderPhases, render_resource::{RenderPassDescriptor, StoreOp}, @@ -28,13 +28,16 @@ impl ViewNode for MainTransmissivePass3dNode { &'static ViewTarget, Option<&'static ViewTransmissionTexture>, &'static ViewDepthTexture, + Option<&'static MainPassResolutionOverride>, ); fn run( &self, graph: &mut RenderGraphContext, render_context: &mut RenderContext, - (camera, view, camera_3d, target, transmission, depth): QueryItem, + (camera, view, camera_3d, target, transmission, depth, resolution_override): QueryItem< + Self::ViewQuery, + >, world: &World, ) -> Result<(), NodeRunError> { let view_entity = graph.view_entity(); @@ -108,7 +111,7 @@ impl ViewNode for MainTransmissivePass3dNode { render_context.begin_tracked_render_pass(render_pass_descriptor); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } if let Err(err) = transmissive_phase.render(&mut render_pass, world, view_entity) { diff --git a/crates/bevy_core_pipeline/src/core_3d/main_transparent_pass_3d_node.rs b/crates/bevy_core_pipeline/src/core_3d/main_transparent_pass_3d_node.rs index 36fe8417c4..0c70ec23a0 100644 --- a/crates/bevy_core_pipeline/src/core_3d/main_transparent_pass_3d_node.rs +++ b/crates/bevy_core_pipeline/src/core_3d/main_transparent_pass_3d_node.rs @@ -1,7 +1,7 @@ use crate::core_3d::Transparent3d; use bevy_ecs::{prelude::*, query::QueryItem}; use bevy_render::{ - camera::ExtractedCamera, + camera::{ExtractedCamera, MainPassResolutionOverride}, diagnostic::RecordDiagnostics, render_graph::{NodeRunError, RenderGraphContext, ViewNode}, render_phase::ViewSortedRenderPhases, @@ -24,12 +24,13 @@ impl ViewNode for MainTransparentPass3dNode { &'static ExtractedView, &'static ViewTarget, &'static ViewDepthTexture, + Option<&'static MainPassResolutionOverride>, ); fn run( &self, graph: &mut RenderGraphContext, render_context: &mut RenderContext, - (camera, view, target, depth): QueryItem, + (camera, view, target, depth, resolution_override): QueryItem, world: &World, ) -> Result<(), NodeRunError> { let view_entity = graph.view_entity(); @@ -69,7 +70,7 @@ impl ViewNode for MainTransparentPass3dNode { let pass_span = diagnostics.pass_span(&mut render_pass, "main_transparent_pass_3d"); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } if let Err(err) = transparent_phase.render(&mut render_pass, world, view_entity) { diff --git a/crates/bevy_core_pipeline/src/deferred/node.rs b/crates/bevy_core_pipeline/src/deferred/node.rs index e786d2a222..ab87fccee6 100644 --- a/crates/bevy_core_pipeline/src/deferred/node.rs +++ b/crates/bevy_core_pipeline/src/deferred/node.rs @@ -1,4 +1,5 @@ use bevy_ecs::{prelude::*, query::QueryItem}; +use bevy_render::camera::MainPassResolutionOverride; use bevy_render::experimental::occlusion_culling::OcclusionCulling; use bevy_render::render_graph::ViewNode; @@ -66,6 +67,7 @@ impl ViewNode for LateDeferredGBufferPrepassNode { &'static ExtractedView, &'static ViewDepthTexture, &'static ViewPrepassTextures, + Option<&'static MainPassResolutionOverride>, Has, Has, ); @@ -77,7 +79,7 @@ impl ViewNode for LateDeferredGBufferPrepassNode { view_query: QueryItem<'w, '_, Self::ViewQuery>, world: &'w World, ) -> Result<(), NodeRunError> { - let (_, _, _, _, occlusion_culling, no_indirect_drawing) = view_query; + let (.., occlusion_culling, no_indirect_drawing) = view_query; if !occlusion_culling || no_indirect_drawing { return Ok(()); } @@ -105,7 +107,7 @@ impl ViewNode for LateDeferredGBufferPrepassNode { fn run_deferred_prepass<'w>( graph: &mut RenderGraphContext, render_context: &mut RenderContext<'w>, - (camera, extracted_view, view_depth_texture, view_prepass_textures, _, _): QueryItem< + (camera, extracted_view, view_depth_texture, view_prepass_textures, resolution_override, _, _): QueryItem< 'w, '_, ::ViewQuery, @@ -220,7 +222,7 @@ fn run_deferred_prepass<'w>( }); let mut render_pass = TrackedRenderPass::new(&render_device, render_pass); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } // Opaque draws diff --git a/crates/bevy_core_pipeline/src/oit/resolve/node.rs b/crates/bevy_core_pipeline/src/oit/resolve/node.rs index 14d42235f1..77352e5ecb 100644 --- a/crates/bevy_core_pipeline/src/oit/resolve/node.rs +++ b/crates/bevy_core_pipeline/src/oit/resolve/node.rs @@ -1,6 +1,6 @@ use bevy_ecs::{prelude::*, query::QueryItem}; use bevy_render::{ - camera::ExtractedCamera, + camera::{ExtractedCamera, MainPassResolutionOverride}, render_graph::{NodeRunError, RenderGraphContext, RenderLabel, ViewNode}, render_resource::{BindGroupEntries, PipelineCache, RenderPassDescriptor}, renderer::RenderContext, @@ -23,13 +23,14 @@ impl ViewNode for OitResolveNode { &'static ViewUniformOffset, &'static OitResolvePipelineId, &'static ViewDepthTexture, + Option<&'static MainPassResolutionOverride>, ); fn run( &self, _graph: &mut RenderGraphContext, render_context: &mut RenderContext, - (camera, view_target, view_uniform, oit_resolve_pipeline_id, depth): QueryItem< + (camera, view_target, view_uniform, oit_resolve_pipeline_id, depth, resolution_override): QueryItem< Self::ViewQuery, >, world: &World, @@ -63,7 +64,7 @@ impl ViewNode for OitResolveNode { }); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } render_pass.set_render_pipeline(pipeline); diff --git a/crates/bevy_core_pipeline/src/prepass/node.rs b/crates/bevy_core_pipeline/src/prepass/node.rs index 500cc0a42b..6193aa4f0e 100644 --- a/crates/bevy_core_pipeline/src/prepass/node.rs +++ b/crates/bevy_core_pipeline/src/prepass/node.rs @@ -1,6 +1,6 @@ use bevy_ecs::{prelude::*, query::QueryItem}; use bevy_render::{ - camera::ExtractedCamera, + camera::{ExtractedCamera, MainPassResolutionOverride}, diagnostic::RecordDiagnostics, experimental::occlusion_culling::OcclusionCulling, render_graph::{NodeRunError, RenderGraphContext, ViewNode}, @@ -64,6 +64,7 @@ impl ViewNode for LatePrepassNode { Option<&'static RenderSkyboxPrepassPipeline>, Option<&'static SkyboxPrepassBindGroup>, Option<&'static PreviousViewUniformOffset>, + Option<&'static MainPassResolutionOverride>, Has, Has, Has, @@ -78,7 +79,7 @@ impl ViewNode for LatePrepassNode { ) -> Result<(), NodeRunError> { // We only need a late prepass if we have occlusion culling and indirect // drawing. - let (_, _, _, _, _, _, _, _, _, occlusion_culling, no_indirect_drawing, _) = query; + let (.., occlusion_culling, no_indirect_drawing, _) = query; if !occlusion_culling || no_indirect_drawing { return Ok(()); } @@ -109,6 +110,7 @@ fn run_prepass<'w>( skybox_prepass_pipeline, skybox_prepass_bind_group, view_prev_uniform_offset, + resolution_override, _, _, has_deferred, @@ -183,7 +185,7 @@ fn run_prepass<'w>( let pass_span = diagnostics.pass_span(&mut render_pass, label); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } // Opaque draws diff --git a/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs b/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs index cb05de38fb..9791ef2b02 100644 --- a/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs +++ b/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs @@ -18,7 +18,7 @@ use bevy_ecs::{ world::World, }; use bevy_render::{ - camera::ExtractedCamera, + camera::{ExtractedCamera, MainPassResolutionOverride}, render_graph::{NodeRunError, RenderGraphContext, ViewNode}, render_resource::{ LoadOp, Operations, PipelineCache, RenderPassDepthStencilAttachment, RenderPassDescriptor, @@ -42,6 +42,7 @@ impl ViewNode for MeshletMainOpaquePass3dNode { &'static ViewLightProbesUniformOffset, &'static ViewScreenSpaceReflectionsUniformOffset, &'static ViewEnvironmentMapUniformOffset, + Option<&'static MainPassResolutionOverride>, &'static MeshletViewMaterialsMainOpaquePass, &'static MeshletViewBindGroups, &'static MeshletViewResources, @@ -61,6 +62,7 @@ impl ViewNode for MeshletMainOpaquePass3dNode { view_light_probes_offset, view_ssr_offset, view_environment_map_offset, + resolution_override, meshlet_view_materials, meshlet_view_bind_groups, meshlet_view_resources, @@ -101,7 +103,7 @@ impl ViewNode for MeshletMainOpaquePass3dNode { occlusion_query_set: None, }); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } render_pass.set_bind_group( @@ -147,6 +149,7 @@ impl ViewNode for MeshletPrepassNode { &'static ViewPrepassTextures, &'static ViewUniformOffset, &'static PreviousViewUniformOffset, + Option<&'static MainPassResolutionOverride>, Has, &'static MeshletViewMaterialsPrepass, &'static MeshletViewBindGroups, @@ -162,6 +165,7 @@ impl ViewNode for MeshletPrepassNode { view_prepass_textures, view_uniform_offset, previous_view_uniform_offset, + resolution_override, view_has_motion_vector_prepass, meshlet_view_materials, meshlet_view_bind_groups, @@ -219,7 +223,7 @@ impl ViewNode for MeshletPrepassNode { occlusion_query_set: None, }); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } if view_has_motion_vector_prepass { @@ -270,6 +274,7 @@ impl ViewNode for MeshletDeferredGBufferPrepassNode { &'static ViewPrepassTextures, &'static ViewUniformOffset, &'static PreviousViewUniformOffset, + Option<&'static MainPassResolutionOverride>, Has, &'static MeshletViewMaterialsDeferredGBufferPrepass, &'static MeshletViewBindGroups, @@ -285,6 +290,7 @@ impl ViewNode for MeshletDeferredGBufferPrepassNode { view_prepass_textures, view_uniform_offset, previous_view_uniform_offset, + resolution_override, view_has_motion_vector_prepass, meshlet_view_materials, meshlet_view_bind_groups, @@ -347,7 +353,7 @@ impl ViewNode for MeshletDeferredGBufferPrepassNode { occlusion_query_set: None, }); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } if view_has_motion_vector_prepass { diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index 2732a44316..20ec3f9c9f 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -111,6 +111,17 @@ impl Viewport { } } } + + pub fn with_override( + &self, + main_pass_resolution_override: Option<&MainPassResolutionOverride>, + ) -> Self { + let mut viewport = self.clone(); + if let Some(override_size) = main_pass_resolution_override { + viewport.physical_size = **override_size; + } + viewport + } } /// Settings to define a camera sub view. @@ -1366,6 +1377,19 @@ impl TemporalJitter { #[reflect(Default, Component)] pub struct MipBias(pub f32); +/// Override the resolution a 3d camera's main pass is rendered at. +/// +/// Does not affect post processing. +/// +/// ## Usage +/// +/// * Insert this component on a 3d camera entity in the render world. +/// * The resolution override must be smaller than the camera's viewport size. +/// * The resolution override is specified in physical pixels. +#[derive(Component, Reflect, Deref)] +#[reflect(Component)] +pub struct MainPassResolutionOverride(pub UVec2); + impl Default for MipBias { fn default() -> Self { Self(-1.0) diff --git a/crates/bevy_render/src/camera/mod.rs b/crates/bevy_render/src/camera/mod.rs index a2470a7660..1b2a3bdfd3 100644 --- a/crates/bevy_render/src/camera/mod.rs +++ b/crates/bevy_render/src/camera/mod.rs @@ -29,6 +29,7 @@ impl Plugin for CameraPlugin { .register_type::() .register_type::() .register_type::() + .register_type::() .init_resource::() .init_resource::() .add_plugins(( diff --git a/examples/shader/custom_render_phase.rs b/examples/shader/custom_render_phase.rs index 309954bbe3..30ef057429 100644 --- a/examples/shader/custom_render_phase.rs +++ b/examples/shader/custom_render_phase.rs @@ -34,7 +34,7 @@ use bevy::{ }, GetBatchData, GetFullBatchData, }, - camera::ExtractedCamera, + camera::{ExtractedCamera, MainPassResolutionOverride}, extract_component::{ExtractComponent, ExtractComponentPlugin}, mesh::{allocator::MeshAllocator, MeshVertexBufferLayoutRef, RenderMesh}, render_asset::RenderAssets, @@ -589,13 +589,14 @@ impl ViewNode for CustomDrawNode { &'static ExtractedCamera, &'static ExtractedView, &'static ViewTarget, + Option<&'static MainPassResolutionOverride>, ); fn run<'w>( &self, graph: &mut RenderGraphContext, render_context: &mut RenderContext<'w>, - (camera, view, target): QueryItem<'w, '_, Self::ViewQuery>, + (camera, view, target, resolution_override): QueryItem<'w, '_, Self::ViewQuery>, world: &'w World, ) -> Result<(), NodeRunError> { // First, we need to get our phases resource @@ -625,7 +626,7 @@ impl ViewNode for CustomDrawNode { }); if let Some(viewport) = camera.viewport.as_ref() { - render_pass.set_camera_viewport(viewport); + render_pass.set_camera_viewport(&viewport.with_override(resolution_override)); } // Render the phase From 45a379cf2da72480dd1e9dd0a4869458757d2b70 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Fri, 27 Jun 2025 18:17:09 +0100 Subject: [PATCH 02/68] Opt-out for UI clipping (#19826) # Objective Opt-out for UI clipping, for motivation see issue #19821 ## Solution New zst component `OverrideClip`. A UI node entity with this component will ignore any inherited clipping rect, so it will never get clipped regardless of the `Overflow` settings of its ancestors. #### Why use a marker component and not add a new variant to `Overflow` instead? A separate marker component allows users to set both `Overflow` and `OverrideClip` on the same node. ## Testing Run the `overflow` example with the `OverrideClip` component added to the `ImagNode`s and you will see that clipping is disabled. --- crates/bevy_ui/src/ui_node.rs | 5 +++++ crates/bevy_ui/src/update.rs | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index 6418f69ff8..a3b03238f8 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -2246,6 +2246,11 @@ pub struct CalculatedClip { pub clip: Rect, } +/// UI node entities with this component will ignore any clipping rect they inherit, +/// the node will not be clipped regardless of its ancestors' `Overflow` setting. +#[derive(Component)] +pub struct OverrideClip; + /// Indicates that this [`Node`] entity's front-to-back ordering is not controlled solely /// by its location in the UI hierarchy. A node with a higher z-index will appear on top /// of sibling nodes with a lower z-index. diff --git a/crates/bevy_ui/src/update.rs b/crates/bevy_ui/src/update.rs index c0e9d09d7b..0053e5a406 100644 --- a/crates/bevy_ui/src/update.rs +++ b/crates/bevy_ui/src/update.rs @@ -3,8 +3,8 @@ use crate::{ experimental::{UiChildren, UiRootNodes}, ui_transform::UiGlobalTransform, - CalculatedClip, ComputedNodeTarget, DefaultUiCamera, Display, Node, OverflowAxis, UiScale, - UiTargetCamera, + CalculatedClip, ComputedNodeTarget, DefaultUiCamera, Display, Node, OverflowAxis, OverrideClip, + UiScale, UiTargetCamera, }; use super::ComputedNode; @@ -12,7 +12,7 @@ use bevy_ecs::{ change_detection::DetectChangesMut, entity::Entity, hierarchy::ChildOf, - query::{Changed, With}, + query::{Changed, Has, With}, system::{Commands, Query, Res}, }; use bevy_math::{Rect, UVec2}; @@ -28,6 +28,7 @@ pub fn update_clipping_system( &ComputedNode, &UiGlobalTransform, Option<&mut CalculatedClip>, + Has, )>, ui_children: UiChildren, ) { @@ -50,15 +51,22 @@ fn update_clipping( &ComputedNode, &UiGlobalTransform, Option<&mut CalculatedClip>, + Has, )>, entity: Entity, mut maybe_inherited_clip: Option, ) { - let Ok((node, computed_node, transform, maybe_calculated_clip)) = node_query.get_mut(entity) + let Ok((node, computed_node, transform, maybe_calculated_clip, has_override_clip)) = + node_query.get_mut(entity) else { return; }; + // If the UI node entity has an `OverrideClip` component, discard any inherited clip rect + if has_override_clip { + maybe_inherited_clip = None; + } + // If `display` is None, clip the entire node and all its descendants by replacing the inherited clip with a default rect (which is empty) if node.display == Display::None { maybe_inherited_clip = Some(Rect::default()); From 73a313200dc19ed9ca466d586d305979bb18e81e Mon Sep 17 00:00:00 2001 From: Talin Date: Fri, 27 Jun 2025 11:23:59 -0700 Subject: [PATCH 03/68] CoreRadio should require Checkable, not Checked. (#19836) This was a mistake in my original PR #19778: a holdover from when Checked was not a marker component. --- crates/bevy_core_widgets/src/core_radio.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_core_widgets/src/core_radio.rs b/crates/bevy_core_widgets/src/core_radio.rs index d5dd18fb1a..a0857575c4 100644 --- a/crates/bevy_core_widgets/src/core_radio.rs +++ b/crates/bevy_core_widgets/src/core_radio.rs @@ -15,7 +15,7 @@ use bevy_input::keyboard::{KeyCode, KeyboardInput}; use bevy_input::ButtonState; use bevy_input_focus::FocusedInput; use bevy_picking::events::{Click, Pointer}; -use bevy_ui::{Checked, InteractionDisabled}; +use bevy_ui::{Checkable, Checked, InteractionDisabled}; /// Headless widget implementation for a "radio button group". This component is used to group /// multiple [`CoreRadio`] components together, allowing them to behave as a single unit. It @@ -46,7 +46,7 @@ pub struct CoreRadioGroup { /// but rather the enclosing group should be focusable. /// See / #[derive(Component, Debug)] -#[require(AccessibilityNode(accesskit::Node::new(Role::RadioButton)), Checked)] +#[require(AccessibilityNode(accesskit::Node::new(Role::RadioButton)), Checkable)] pub struct CoreRadio; fn radio_group_on_key_input( From e6ba9a6d181ad20320e4dadc26575b7f5a6c6f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?charlotte=20=F0=9F=8C=B8?= Date: Fri, 27 Jun 2025 15:57:24 -0700 Subject: [PATCH 04/68] Type erased materials (#19667) # Objective Closes #18075 In order to enable a number of patterns for dynamic materials in the engine, it's necessary to decouple the renderer from the `Material` trait. This opens the possibility for: - Materials that aren't coupled to `AsBindGroup`. - 2d using the underlying 3d bindless infrastructure. - Dynamic materials that can change their layout at runtime. - Materials that aren't even backed by a Rust struct at all. ## Solution In short, remove all trait bounds from render world material systems and resources. This means moving a bunch of stuff onto `MaterialProperties` and engaging in some hacks to make specialization work. Rather than storing the bind group data in `MaterialBindGroupAllocator`, right now we're storing it in a closure on `MaterialProperties`. TBD if this has bad performance characteristics. ## Benchmarks - `many_cubes`: `cargo run --example many_cubes --release --features=bevy/trace_tracy -- --vary-material-data-per-instance`: ![Screenshot 2025-06-26 235426](https://github.com/user-attachments/assets/10a0ee29-9932-4f91-ab43-33518b117ac5) - @DGriffin91's Caldera `cargo run --release --features=bevy/trace_tracy -- --random-materials` ![image](https://github.com/user-attachments/assets/ef91ba6a-8e88-4922-a73f-acb0af5b0dbc) - @DGriffin91's Caldera with 20 unique material types (i.e. `MaterialPlugin`) and random materials per mesh `cargo run --release --features=bevy/trace_tracy -- --random-materials` ![Screenshot 2025-06-27 000425](https://github.com/user-attachments/assets/9561388b-881d-46cf-8c3d-b15b3e9aedc7) ### TODO - We almost certainly lost some parallelization from removing the type params that could be gained back from smarter iteration. - Test all the things that could have broken. - ~Fix meshlets~ ## Showcase See [the example](https://github.com/bevyengine/bevy/pull/19667/files#diff-9d768cfe1c3aa81eff365d250d3cbe5a63e8df63e81dd85f64c3c3cd993f6d94) for a custom material implemented without the use of the `Material` trait and thus `AsBindGroup`. ![image](https://github.com/user-attachments/assets/e3fcca7c-e04e-4a4e-9d89-39d697a9e3b8) --------- Co-authored-by: IceSentry Co-authored-by: IceSentry --- Cargo.toml | 13 +- assets/shaders/manual_material.wgsl | 11 + crates/bevy_gizmos/src/pipeline_3d.rs | 4 +- crates/bevy_pbr/Cargo.toml | 2 +- crates/bevy_pbr/src/extended_material.rs | 77 +- crates/bevy_pbr/src/lib.rs | 3 + crates/bevy_pbr/src/material.rs | 755 ++++++++++-------- crates/bevy_pbr/src/material_bind_groups.rs | 265 +++--- .../bevy_pbr/src/meshlet/instance_manager.rs | 30 +- .../src/meshlet/material_pipeline_prepare.rs | 141 ++-- crates/bevy_pbr/src/meshlet/mod.rs | 4 + crates/bevy_pbr/src/pbr_material.rs | 5 +- crates/bevy_pbr/src/prepass/mod.rs | 298 +++---- crates/bevy_pbr/src/render/light.rs | 111 +-- crates/bevy_pbr/src/render/mesh.rs | 2 +- .../bevy_render/macros/src/as_bind_group.rs | 8 +- crates/bevy_render/macros/src/lib.rs | 26 + crates/bevy_render/src/erased_render_asset.rs | 431 ++++++++++ crates/bevy_render/src/lib.rs | 1 + crates/bevy_render/src/render_asset.rs | 4 +- crates/bevy_render/src/render_phase/mod.rs | 29 + .../src/render_resource/bind_group.rs | 28 +- crates/bevy_sprite/src/mesh2d/material.rs | 7 +- .../src/render/ui_material_pipeline.rs | 5 +- crates/bevy_ui/src/ui_material.rs | 2 +- examples/3d/lines.rs | 2 +- examples/3d/manual_material.rs | 315 ++++++++ examples/README.md | 1 + examples/shader/custom_vertex_attribute.rs | 2 +- examples/shader/shader_defs.rs | 15 +- examples/shader/shader_material_glsl.rs | 2 +- examples/shader/shader_material_wesl.rs | 11 +- examples/shader/texture_binding_array.rs | 7 +- 33 files changed, 1672 insertions(+), 945 deletions(-) create mode 100644 assets/shaders/manual_material.wgsl create mode 100644 crates/bevy_render/src/erased_render_asset.rs create mode 100644 examples/3d/manual_material.rs diff --git a/Cargo.toml b/Cargo.toml index 688147ff9b..19a2afc8e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -579,7 +579,7 @@ ron = "0.10" flate2 = "1.0" serde = { version = "1", features = ["derive"] } serde_json = "1.0.140" -bytemuck = "1.7" +bytemuck = "1" bevy_render = { path = "crates/bevy_render", version = "0.17.0-dev", default-features = false } # The following explicit dependencies are needed for proc macros to work inside of examples as they are part of the bevy crate itself. bevy_ecs = { path = "crates/bevy_ecs", version = "0.17.0-dev", default-features = false } @@ -1051,6 +1051,17 @@ description = "Showcases different blend modes" category = "3D Rendering" wasm = true +[[example]] +name = "manual_material" +path = "examples/3d/manual_material.rs" +doc-scrape-examples = true + +[package.metadata.example.manual_material] +name = "Manual Material Implementation" +description = "Demonstrates how to implement a material manually using the mid-level render APIs" +category = "3D Rendering" +wasm = true + [[example]] name = "edit_material_on_gltf" path = "examples/3d/edit_material_on_gltf.rs" diff --git a/assets/shaders/manual_material.wgsl b/assets/shaders/manual_material.wgsl new file mode 100644 index 0000000000..557a1412c7 --- /dev/null +++ b/assets/shaders/manual_material.wgsl @@ -0,0 +1,11 @@ +#import bevy_pbr::forward_io::VertexOutput + +@group(3) @binding(0) var material_color_texture: texture_2d; +@group(3) @binding(1) var material_color_sampler: sampler; + +@fragment +fn fragment( + mesh: VertexOutput, +) -> @location(0) vec4 { + return textureSample(material_color_texture, material_color_sampler, mesh.uv); +} diff --git a/crates/bevy_gizmos/src/pipeline_3d.rs b/crates/bevy_gizmos/src/pipeline_3d.rs index 69854f7de4..92f4ee0228 100644 --- a/crates/bevy_gizmos/src/pipeline_3d.rs +++ b/crates/bevy_gizmos/src/pipeline_3d.rs @@ -50,9 +50,7 @@ impl Plugin for LineGizmo3dPlugin { .init_resource::>() .configure_sets( Render, - GizmoRenderSystems::QueueLineGizmos3d - .in_set(RenderSystems::Queue) - .ambiguous_with(bevy_pbr::queue_material_meshes::), + GizmoRenderSystems::QueueLineGizmos3d.in_set(RenderSystems::Queue), ) .add_systems( Render, diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index f2e973eae5..fb17d84285 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -51,7 +51,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.17.0-dev", default-fea ] } # other -bitflags = "2.3" +bitflags = { version = "2.3", features = ["bytemuck"] } fixedbitset = "0.5" thiserror = { version = "2", default-features = false } derive_more = { version = "2", default-features = false, features = ["from"] } diff --git a/crates/bevy_pbr/src/extended_material.rs b/crates/bevy_pbr/src/extended_material.rs index e01dd0ff14..165debee6f 100644 --- a/crates/bevy_pbr/src/extended_material.rs +++ b/crates/bevy_pbr/src/extended_material.rs @@ -1,6 +1,6 @@ use alloc::borrow::Cow; -use bevy_asset::{Asset, Handle}; +use bevy_asset::Asset; use bevy_ecs::system::SystemParamItem; use bevy_platform::{collections::HashSet, hash::FixedHasher}; use bevy_reflect::{impl_type_path, Reflect}; @@ -9,8 +9,8 @@ use bevy_render::{ mesh::MeshVertexBufferLayoutRef, render_resource::{ AsBindGroup, AsBindGroupError, BindGroupLayout, BindGroupLayoutEntry, BindlessDescriptor, - BindlessResourceType, BindlessSlabResourceLimit, RenderPipelineDescriptor, Shader, - ShaderRef, SpecializedMeshPipelineError, UnpreparedBindGroup, + BindlessResourceType, BindlessSlabResourceLimit, RenderPipelineDescriptor, ShaderRef, + SpecializedMeshPipelineError, UnpreparedBindGroup, }, renderer::RenderDevice, }; @@ -19,10 +19,6 @@ use crate::{Material, MaterialPipeline, MaterialPipelineKey, MeshPipeline, MeshP pub struct MaterialExtensionPipeline { pub mesh_pipeline: MeshPipeline, - pub material_layout: BindGroupLayout, - pub vertex_shader: Option>, - pub fragment_shader: Option>, - pub bindless: bool, } pub struct MaterialExtensionKey { @@ -150,12 +146,19 @@ where } } +#[derive(bytemuck::Pod, bytemuck::Zeroable, Copy, Clone, PartialEq, Eq, Hash)] +#[repr(C, packed)] +pub struct MaterialExtensionBindGroupData { + pub base: B, + pub extension: E, +} + // We don't use the `TypePath` derive here due to a bug where `#[reflect(type_path = false)]` // causes the `TypePath` derive to not generate an implementation. impl_type_path!((in bevy_pbr::extended_material) ExtendedMaterial); impl AsBindGroup for ExtendedMaterial { - type Data = (::Data, ::Data); + type Data = MaterialExtensionBindGroupData; type Param = (::Param, ::Param); fn bindless_slot_count() -> Option { @@ -179,20 +182,24 @@ impl AsBindGroup for ExtendedMaterial { } } + fn bind_group_data(&self) -> Self::Data { + MaterialExtensionBindGroupData { + base: self.base.bind_group_data(), + extension: self.extension.bind_group_data(), + } + } + fn unprepared_bind_group( &self, layout: &BindGroupLayout, render_device: &RenderDevice, (base_param, extended_param): &mut SystemParamItem<'_, '_, Self::Param>, mut force_non_bindless: bool, - ) -> Result, AsBindGroupError> { + ) -> Result { force_non_bindless = force_non_bindless || Self::bindless_slot_count().is_none(); // add together the bindings of the base material and the user material - let UnpreparedBindGroup { - mut bindings, - data: base_data, - } = B::unprepared_bind_group( + let UnpreparedBindGroup { mut bindings } = B::unprepared_bind_group( &self.base, layout, render_device, @@ -209,10 +216,7 @@ impl AsBindGroup for ExtendedMaterial { bindings.extend(extended_bindgroup.bindings.0); - Ok(UnpreparedBindGroup { - bindings, - data: (base_data, extended_bindgroup.data), - }) + Ok(UnpreparedBindGroup { bindings }) } fn bind_group_layout_entries( @@ -373,57 +377,28 @@ impl Material for ExtendedMaterial { } fn specialize( - pipeline: &MaterialPipeline, + pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, layout: &MeshVertexBufferLayoutRef, key: MaterialPipelineKey, ) -> Result<(), SpecializedMeshPipelineError> { // Call the base material's specialize function - let MaterialPipeline:: { - mesh_pipeline, - material_layout, - vertex_shader, - fragment_shader, - bindless, - .. - } = pipeline.clone(); - let base_pipeline = MaterialPipeline:: { - mesh_pipeline, - material_layout, - vertex_shader, - fragment_shader, - bindless, - marker: Default::default(), - }; let base_key = MaterialPipelineKey:: { mesh_key: key.mesh_key, - bind_group_data: key.bind_group_data.0, + bind_group_data: key.bind_group_data.base, }; - B::specialize(&base_pipeline, descriptor, layout, base_key)?; + B::specialize(pipeline, descriptor, layout, base_key)?; // Call the extended material's specialize function afterwards - let MaterialPipeline:: { - mesh_pipeline, - material_layout, - vertex_shader, - fragment_shader, - bindless, - .. - } = pipeline.clone(); - E::specialize( &MaterialExtensionPipeline { - mesh_pipeline, - material_layout, - vertex_shader, - fragment_shader, - bindless, + mesh_pipeline: pipeline.mesh_pipeline.clone(), }, descriptor, layout, MaterialExtensionKey { mesh_key: key.mesh_key, - bind_group_data: key.bind_group_data.1, + bind_group_data: key.bind_group_data.extension, }, ) } diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index 517ef0eb5c..b72c58c2d2 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -239,6 +239,9 @@ impl Plugin for PbrPlugin { use_gpu_instance_buffer_builder: self.use_gpu_instance_buffer_builder, debug_flags: self.debug_flags, }, + MaterialsPlugin { + debug_flags: self.debug_flags, + }, MaterialPlugin:: { prepass_enabled: self.prepass_enabled, debug_flags: self.debug_flags, diff --git a/crates/bevy_pbr/src/material.rs b/crates/bevy_pbr/src/material.rs index f73f1392bb..fb86f411d4 100644 --- a/crates/bevy_pbr/src/material.rs +++ b/crates/bevy_pbr/src/material.rs @@ -1,12 +1,8 @@ use crate::material_bind_groups::{ FallbackBindlessResources, MaterialBindGroupAllocator, MaterialBindingId, }; -#[cfg(feature = "meshlet")] -use crate::meshlet::{ - prepare_material_meshlet_meshes_main_opaque_pass, queue_material_meshlet_meshes, - InstanceManager, -}; use crate::*; +use alloc::sync::Arc; use bevy_asset::prelude::AssetChanged; use bevy_asset::{Asset, AssetEventSystems, AssetId, AssetServer, UntypedAssetId}; use bevy_core_pipeline::deferred::{AlphaMask3dDeferred, Opaque3dDeferred}; @@ -35,14 +31,17 @@ use bevy_platform::hash::FixedHasher; use bevy_reflect::std_traits::ReflectDefault; use bevy_reflect::Reflect; use bevy_render::camera::extract_cameras; +use bevy_render::erased_render_asset::{ + ErasedRenderAsset, ErasedRenderAssetPlugin, ErasedRenderAssets, PrepareAssetError, +}; use bevy_render::mesh::mark_3d_meshes_as_changed_if_their_assets_changed; -use bevy_render::render_asset::prepare_assets; +use bevy_render::render_asset::{prepare_assets, RenderAssets}; use bevy_render::renderer::RenderQueue; use bevy_render::{ batching::gpu_preprocessing::GpuPreprocessingSupport, extract_resource::ExtractResource, mesh::{Mesh3d, MeshVertexBufferLayoutRef, RenderMesh}, - render_asset::{PrepareAssetError, RenderAsset, RenderAssetPlugin, RenderAssets}, + prelude::*, render_phase::*, render_resource::*, renderer::RenderDevice, @@ -53,7 +52,9 @@ use bevy_render::{ use bevy_render::{mesh::allocator::MeshAllocator, sync_world::MainEntityHashMap}; use bevy_render::{texture::FallbackImage, view::RenderVisibleEntities}; use bevy_utils::Parallel; +use core::any::TypeId; use core::{hash::Hash, marker::PhantomData}; +use smallvec::SmallVec; use tracing::error; /// Materials are used alongside [`MaterialPlugin`], [`Mesh3d`], and [`MeshMaterial3d`] @@ -239,7 +240,7 @@ pub trait Material: Asset + AsBindGroup + Clone + Sized { )] #[inline] fn specialize( - pipeline: &MaterialPipeline, + pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, layout: &MeshVertexBufferLayoutRef, key: MaterialPipelineKey, @@ -248,6 +249,74 @@ pub trait Material: Asset + AsBindGroup + Clone + Sized { } } +#[derive(Default)] +pub struct MaterialsPlugin { + /// Debugging flags that can optionally be set when constructing the renderer. + pub debug_flags: RenderDebugFlags, +} + +impl Plugin for MaterialsPlugin { + fn build(&self, app: &mut App) { + app.add_plugins((PrepassPipelinePlugin, PrepassPlugin::new(self.debug_flags))); + if let Some(render_app) = app.get_sub_app_mut(RenderApp) { + render_app + .init_resource::() + .init_resource::() + .init_resource::>() + .init_resource::() + .init_resource::() + .init_resource::() + .add_systems( + Render, + ( + specialize_material_meshes + .in_set(RenderSystems::PrepareMeshes) + .after(prepare_assets::) + .after(collect_meshes_for_gpu_building) + .after(set_mesh_motion_vector_flags), + queue_material_meshes.in_set(RenderSystems::QueueMeshes), + ), + ) + .add_systems( + Render, + ( + prepare_material_bind_groups, + write_material_bind_group_buffers, + ) + .chain() + .in_set(RenderSystems::PrepareBindGroups), + ) + .add_systems( + Render, + ( + check_views_lights_need_specialization.in_set(RenderSystems::PrepareAssets), + // specialize_shadows also needs to run after prepare_assets::, + // which is fine since ManageViews is after PrepareAssets + specialize_shadows + .in_set(RenderSystems::ManageViews) + .after(prepare_lights), + queue_shadows.in_set(RenderSystems::QueueMeshes), + ), + ); + } + } + + fn finish(&self, app: &mut App) { + if let Some(render_app) = app.get_sub_app_mut(RenderApp) { + render_app + .init_resource::>() + .init_resource::() + .init_resource::() + .init_resource::() + .add_render_command::() + .add_render_command::() + .add_render_command::() + .add_render_command::() + .add_render_command::(); + } + } +} + /// Adds the necessary ECS resources and render logic to enable rendering entities using the given [`Material`] /// asset type. pub struct MaterialPlugin { @@ -283,7 +352,7 @@ where app.init_asset::() .register_type::>() .init_resource::>() - .add_plugins((RenderAssetPlugin::>::default(),)) + .add_plugins((ErasedRenderAssetPlugin::>::default(),)) .add_systems( PostUpdate, ( @@ -302,109 +371,41 @@ where } if let Some(render_app) = app.get_sub_app_mut(RenderApp) { - render_app - .init_resource::>() - .init_resource::>() - .init_resource::>() - .init_resource::() - .add_render_command::>() - .add_render_command::>() - .add_render_command::>() - .add_render_command::>() - .add_render_command::>() - .init_resource::>>() - .add_systems( - ExtractSchedule, - ( - extract_mesh_materials::.in_set(MaterialExtractionSystems), - early_sweep_material_instances:: - .after(MaterialExtractionSystems) - .before(late_sweep_material_instances), - extract_entities_needs_specialization::.after(extract_cameras), - ), - ) - .add_systems( - Render, - ( - specialize_material_meshes:: - .in_set(RenderSystems::PrepareMeshes) - .after(prepare_assets::>) - .after(prepare_assets::) - .after(collect_meshes_for_gpu_building) - .after(set_mesh_motion_vector_flags), - queue_material_meshes:: - .in_set(RenderSystems::QueueMeshes) - .after(prepare_assets::>), - ), - ) - .add_systems( - Render, - ( - prepare_material_bind_groups::, - write_material_bind_group_buffers::, - ) - .chain() - .in_set(RenderSystems::PrepareBindGroups) - .after(prepare_assets::>), - ); - - if self.shadows_enabled { - render_app - .init_resource::() - .init_resource::() - .init_resource::>() - .add_systems( - Render, - ( - check_views_lights_need_specialization - .in_set(RenderSystems::PrepareAssets), - // specialize_shadows:: also needs to run after prepare_assets::>, - // which is fine since ManageViews is after PrepareAssets - specialize_shadows:: - .in_set(RenderSystems::ManageViews) - .after(prepare_lights), - queue_shadows:: - .in_set(RenderSystems::QueueMeshes) - .after(prepare_assets::>), - ), - ); - } - - #[cfg(feature = "meshlet")] render_app.add_systems( - Render, - queue_material_meshlet_meshes:: - .in_set(RenderSystems::QueueMeshes) - .run_if(resource_exists::), + ExtractSchedule, + ( + extract_mesh_materials::.in_set(MaterialExtractionSystems), + early_sweep_material_instances:: + .after(MaterialExtractionSystems) + .before(late_sweep_material_instances), + extract_entities_needs_specialization::.after(extract_cameras), + ), ); - - #[cfg(feature = "meshlet")] - render_app.add_systems( - Render, - prepare_material_meshlet_meshes_main_opaque_pass:: - .in_set(RenderSystems::QueueMeshes) - .after(prepare_assets::>) - .before(queue_material_meshlet_meshes::) - .run_if(resource_exists::), - ); - } - - if self.shadows_enabled || self.prepass_enabled { - // PrepassPipelinePlugin is required for shadow mapping and the optional PrepassPlugin - app.add_plugins(PrepassPipelinePlugin::::default()); - } - - if self.prepass_enabled { - app.add_plugins(PrepassPlugin::::new(self.debug_flags)); } } fn finish(&self, app: &mut App) { - if let Some(render_app) = app.get_sub_app_mut(RenderApp) { - render_app - .init_resource::>() - .init_resource::>(); - } + let Some(render_app) = app.get_sub_app_mut(RenderApp) else { + return; + }; + + render_app.world_mut().resource_scope( + |world, mut bind_group_allocators: Mut| { + let render_device = world.resource::(); + bind_group_allocators.insert( + TypeId::of::(), + MaterialBindGroupAllocator::new( + render_device, + M::label(), + material_uses_bindless_resources::(render_device) + .then(|| M::bindless_descriptor()) + .flatten(), + M::bind_group_layout(render_device), + M::bindless_slot_count(), + ), + ); + }, + ); } } @@ -422,91 +423,54 @@ pub struct MaterialPipelineKey { pub bind_group_data: M::Data, } -impl Eq for MaterialPipelineKey where M::Data: PartialEq {} - -impl PartialEq for MaterialPipelineKey -where - M::Data: PartialEq, -{ - fn eq(&self, other: &Self) -> bool { - self.mesh_key == other.mesh_key && self.bind_group_data == other.bind_group_data - } -} - -impl Clone for MaterialPipelineKey -where - M::Data: Clone, -{ - fn clone(&self) -> Self { - Self { - mesh_key: self.mesh_key, - bind_group_data: self.bind_group_data.clone(), - } - } -} - -impl Hash for MaterialPipelineKey -where - M::Data: Hash, -{ - fn hash(&self, state: &mut H) { - self.mesh_key.hash(state); - self.bind_group_data.hash(state); - } +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub struct ErasedMaterialPipelineKey { + pub mesh_key: MeshPipelineKey, + pub material_key: SmallVec<[u8; 8]>, + pub type_id: TypeId, } /// Render pipeline data for a given [`Material`]. -#[derive(Resource)] -pub struct MaterialPipeline { +#[derive(Resource, Clone)] +pub struct MaterialPipeline { pub mesh_pipeline: MeshPipeline, - pub material_layout: BindGroupLayout, - pub vertex_shader: Option>, - pub fragment_shader: Option>, - /// Whether this material *actually* uses bindless resources, taking the - /// platform support (or lack thereof) of bindless resources into account. - pub bindless: bool, - pub marker: PhantomData, } -impl Clone for MaterialPipeline { - fn clone(&self) -> Self { - Self { - mesh_pipeline: self.mesh_pipeline.clone(), - material_layout: self.material_layout.clone(), - vertex_shader: self.vertex_shader.clone(), - fragment_shader: self.fragment_shader.clone(), - bindless: self.bindless, - marker: PhantomData, - } - } +pub struct MaterialPipelineSpecializer { + pub(crate) pipeline: MaterialPipeline, + pub(crate) properties: Arc, } -impl SpecializedMeshPipeline for MaterialPipeline -where - M::Data: PartialEq + Eq + Hash + Clone, -{ - type Key = MaterialPipelineKey; +impl SpecializedMeshPipeline for MaterialPipelineSpecializer { + type Key = ErasedMaterialPipelineKey; fn specialize( &self, key: Self::Key, layout: &MeshVertexBufferLayoutRef, ) -> Result { - let mut descriptor = self.mesh_pipeline.specialize(key.mesh_key, layout)?; - if let Some(vertex_shader) = &self.vertex_shader { + let mut descriptor = self + .pipeline + .mesh_pipeline + .specialize(key.mesh_key, layout)?; + if let Some(vertex_shader) = self.properties.get_shader(MaterialVertexShader) { descriptor.vertex.shader = vertex_shader.clone(); } - if let Some(fragment_shader) = &self.fragment_shader { + if let Some(fragment_shader) = self.properties.get_shader(MaterialFragmentShader) { descriptor.fragment.as_mut().unwrap().shader = fragment_shader.clone(); } - descriptor.layout.insert(3, self.material_layout.clone()); + descriptor + .layout + .insert(3, self.properties.material_layout.as_ref().unwrap().clone()); - M::specialize(self, &mut descriptor, layout, key)?; + if let Some(specialize) = self.properties.specialize { + specialize(&self.pipeline, &mut descriptor, layout, key)?; + } // If bindless mode is on, add a `BINDLESS` define. - if self.bindless { + if self.properties.bindless { descriptor.vertex.shader_defs.push("BINDLESS".into()); if let Some(ref mut fragment) = descriptor.fragment { fragment.shader_defs.push("BINDLESS".into()); @@ -517,46 +481,30 @@ where } } -impl FromWorld for MaterialPipeline { +impl FromWorld for MaterialPipeline { fn from_world(world: &mut World) -> Self { - let asset_server = world.resource::(); - let render_device = world.resource::(); - MaterialPipeline { mesh_pipeline: world.resource::().clone(), - material_layout: M::bind_group_layout(render_device), - vertex_shader: match M::vertex_shader() { - ShaderRef::Default => None, - ShaderRef::Handle(handle) => Some(handle), - ShaderRef::Path(path) => Some(asset_server.load(path)), - }, - fragment_shader: match M::fragment_shader() { - ShaderRef::Default => None, - ShaderRef::Handle(handle) => Some(handle), - ShaderRef::Path(path) => Some(asset_server.load(path)), - }, - bindless: material_uses_bindless_resources::(render_device), - marker: PhantomData, } } } -type DrawMaterial = ( +pub type DrawMaterial = ( SetItemPipeline, SetMeshViewBindGroup<0>, SetMeshViewBindingArrayBindGroup<1>, SetMeshBindGroup<2>, - SetMaterialBindGroup, + SetMaterialBindGroup<3>, DrawMesh, ); /// Sets the bind group for a given [`Material`] at the configured `I` index. -pub struct SetMaterialBindGroup(PhantomData); -impl RenderCommand

for SetMaterialBindGroup { +pub struct SetMaterialBindGroup; +impl RenderCommand

for SetMaterialBindGroup { type Param = ( - SRes>>, + SRes>, SRes, - SRes>, + SRes, ); type ViewQuery = (); type ItemQuery = (); @@ -575,15 +523,17 @@ impl RenderCommand

for SetMaterial ) -> RenderCommandResult { let materials = materials.into_inner(); let material_instances = material_instances.into_inner(); - let material_bind_group_allocator = material_bind_group_allocator.into_inner(); + let material_bind_group_allocators = material_bind_group_allocator.into_inner(); let Some(material_instance) = material_instances.instances.get(&item.main_entity()) else { return RenderCommandResult::Skip; }; - let Ok(material_asset_id) = material_instance.asset_id.try_typed::() else { + let Some(material_bind_group_allocator) = + material_bind_group_allocators.get(&material_instance.asset_id.type_id()) + else { return RenderCommandResult::Skip; }; - let Some(material) = materials.get(material_asset_id) else { + let Some(material) = materials.get(material_instance.asset_id) else { return RenderCommandResult::Skip; }; let Some(material_bind_group) = material_bind_group_allocator.get(material.binding.group) @@ -607,7 +557,7 @@ pub struct RenderMaterialInstances { /// A monotonically-increasing counter, which we use to sweep /// [`RenderMaterialInstances::instances`] when the entities and/or required /// components are removed. - current_change_tick: Tick, + pub current_change_tick: Tick, } impl RenderMaterialInstances { @@ -631,10 +581,10 @@ impl RenderMaterialInstances { /// material type, for simplicity. pub struct RenderMaterialInstance { /// The material asset. - pub(crate) asset_id: UntypedAssetId, + pub asset_id: UntypedAssetId, /// The [`RenderMaterialInstances::current_change_tick`] at which this /// material instance was last modified. - last_change_tick: Tick, + pub last_change_tick: Tick, } /// A [`SystemSet`] that contains all `extract_mesh_materials` systems. @@ -814,14 +764,14 @@ pub(crate) fn late_sweep_material_instances( pub fn extract_entities_needs_specialization( entities_needing_specialization: Extract>>, - mut entity_specialization_ticks: ResMut>, + mut entity_specialization_ticks: ResMut, mut removed_mesh_material_components: Extract>>, - mut specialized_material_pipeline_cache: ResMut>, + mut specialized_material_pipeline_cache: ResMut, mut specialized_prepass_material_pipeline_cache: Option< - ResMut>, + ResMut, >, mut specialized_shadow_material_pipeline_cache: Option< - ResMut>, + ResMut, >, views: Query<&ExtractedView>, ticks: SystemChangeTick, @@ -876,57 +826,27 @@ impl Default for EntitiesNeedingSpecialization { } } -#[derive(Resource, Deref, DerefMut, Clone, Debug)] -pub struct EntitySpecializationTicks { +#[derive(Resource, Deref, DerefMut, Default, Clone, Debug)] +pub struct EntitySpecializationTicks { #[deref] pub entities: MainEntityHashMap, - _marker: PhantomData, -} - -impl Default for EntitySpecializationTicks { - fn default() -> Self { - Self { - entities: MainEntityHashMap::default(), - _marker: Default::default(), - } - } } /// Stores the [`SpecializedMaterialViewPipelineCache`] for each view. -#[derive(Resource, Deref, DerefMut)] -pub struct SpecializedMaterialPipelineCache { +#[derive(Resource, Deref, DerefMut, Default)] +pub struct SpecializedMaterialPipelineCache { // view entity -> view pipeline cache #[deref] - map: HashMap>, - marker: PhantomData, + map: HashMap, } /// Stores the cached render pipeline ID for each entity in a single view, as /// well as the last time it was changed. -#[derive(Deref, DerefMut)] -pub struct SpecializedMaterialViewPipelineCache { +#[derive(Deref, DerefMut, Default)] +pub struct SpecializedMaterialViewPipelineCache { // material entity -> (tick, pipeline_id) #[deref] map: MainEntityHashMap<(Tick, CachedRenderPipelineId)>, - marker: PhantomData, -} - -impl Default for SpecializedMaterialPipelineCache { - fn default() -> Self { - Self { - map: HashMap::default(), - marker: PhantomData, - } - } -} - -impl Default for SpecializedMaterialViewPipelineCache { - fn default() -> Self { - Self { - map: MainEntityHashMap::default(), - marker: PhantomData, - } - } } pub fn check_entities_needing_specialization( @@ -956,21 +876,19 @@ pub fn check_entities_needing_specialization( par_local.drain_into(&mut entities_needing_specialization); } -pub fn specialize_material_meshes( +pub fn specialize_material_meshes( render_meshes: Res>, - render_materials: Res>>, + render_materials: Res>, render_mesh_instances: Res, render_material_instances: Res, render_lightmaps: Res, render_visibility_ranges: Res, ( - material_bind_group_allocator, opaque_render_phases, alpha_mask_render_phases, transmissive_render_phases, transparent_render_phases, ): ( - Res>, Res>, Res>, Res>, @@ -978,16 +896,14 @@ pub fn specialize_material_meshes( ), views: Query<(&ExtractedView, &RenderVisibleEntities)>, view_key_cache: Res, - entity_specialization_ticks: Res>, + entity_specialization_ticks: Res, view_specialization_ticks: Res, - mut specialized_material_pipeline_cache: ResMut>, - mut pipelines: ResMut>>, - pipeline: Res>, + mut specialized_material_pipeline_cache: ResMut, + mut pipelines: ResMut>, + pipeline: Res, pipeline_cache: Res, ticks: SystemChangeTick, -) where - M::Data: PartialEq + Eq + Hash + Clone, -{ +) { // Record the retained IDs of all shadow views so that we can expire old // pipeline IDs. let mut all_views: HashSet = HashSet::default(); @@ -1019,9 +935,6 @@ pub fn specialize_material_meshes( else { continue; }; - let Ok(material_asset_id) = material_instance.asset_id.try_typed::() else { - continue; - }; let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity) else { continue; @@ -1040,12 +953,7 @@ pub fn specialize_material_meshes( let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id) else { continue; }; - let Some(material) = render_materials.get(material_asset_id) else { - continue; - }; - let Some(material_bind_group) = - material_bind_group_allocator.get(material.binding.group) - else { + let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; @@ -1086,13 +994,21 @@ pub fn specialize_material_meshes( } } - let key = MaterialPipelineKey { + let erased_key = ErasedMaterialPipelineKey { + type_id: material_instance.asset_id.type_id(), mesh_key, - bind_group_data: material_bind_group - .get_extra_data(material.binding.slot) - .clone(), + material_key: material.properties.material_key.clone(), }; - let pipeline_id = pipelines.specialize(&pipeline_cache, &pipeline, key, &mesh.layout); + let material_pipeline_specializer = MaterialPipelineSpecializer { + pipeline: pipeline.clone(), + properties: material.properties.clone(), + }; + let pipeline_id = pipelines.specialize( + &pipeline_cache, + &material_pipeline_specializer, + erased_key, + &mesh.layout, + ); let pipeline_id = match pipeline_id { Ok(id) => id, Err(err) => { @@ -1113,8 +1029,8 @@ pub fn specialize_material_meshes( /// For each view, iterates over all the meshes visible from that view and adds /// them to [`BinnedRenderPhase`]s or [`SortedRenderPhase`]s as appropriate. -pub fn queue_material_meshes( - render_materials: Res>>, +pub fn queue_material_meshes( + render_materials: Res>, render_mesh_instances: Res, render_material_instances: Res, mesh_allocator: Res, @@ -1124,10 +1040,8 @@ pub fn queue_material_meshes( mut transmissive_render_phases: ResMut>, mut transparent_render_phases: ResMut>, views: Query<(&ExtractedView, &RenderVisibleEntities)>, - specialized_material_pipeline_cache: ResMut>, -) where - M::Data: PartialEq + Eq + Hash + Clone, -{ + specialized_material_pipeline_cache: ResMut, +) { for (view, visible_entities) in &views { let ( Some(opaque_phase), @@ -1170,19 +1084,20 @@ pub fn queue_material_meshes( else { continue; }; - let Ok(material_asset_id) = material_instance.asset_id.try_typed::() else { - continue; - }; let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity) else { continue; }; - let Some(material) = render_materials.get(material_asset_id) else { + let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; // Fetch the slabs that this mesh resides in. let (vertex_slab, index_slab) = mesh_allocator.mesh_slabs(&mesh_instance.mesh_asset_id); + let Some(draw_function) = material.properties.get_draw_function(MaterialDrawFunction) + else { + continue; + }; match material.properties.render_phase_type { RenderPhaseType::Transmissive => { @@ -1190,7 +1105,7 @@ pub fn queue_material_meshes( + material.properties.depth_bias; transmissive_phase.add(Transmissive3d { entity: (*render_entity, *visible_entity), - draw_function: material.properties.draw_function_id, + draw_function, pipeline: pipeline_id, distance, batch_range: 0..1, @@ -1209,7 +1124,7 @@ pub fn queue_material_meshes( } let batch_set_key = Opaque3dBatchSetKey { pipeline: pipeline_id, - draw_function: material.properties.draw_function_id, + draw_function, material_bind_group_index: Some(material.binding.group.0), vertex_slab: vertex_slab.unwrap_or_default(), index_slab, @@ -1233,7 +1148,7 @@ pub fn queue_material_meshes( // Alpha mask RenderPhaseType::AlphaMask => { let batch_set_key = OpaqueNoLightmap3dBatchSetKey { - draw_function: material.properties.draw_function_id, + draw_function, pipeline: pipeline_id, material_bind_group_index: Some(material.binding.group.0), vertex_slab: vertex_slab.unwrap_or_default(), @@ -1259,7 +1174,7 @@ pub fn queue_material_meshes( + material.properties.depth_bias; transparent_phase.add(Transparent3d { entity: (*render_entity, *visible_entity), - draw_function: material.properties.draw_function_id, + draw_function, pipeline: pipeline_id, distance, batch_range: 0..1, @@ -1322,7 +1237,47 @@ pub enum OpaqueRendererMethod { Auto, } +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct MaterialVertexShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct MaterialFragmentShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct PrepassVertexShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct PrepassFragmentShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct DeferredVertexShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct DeferredFragmentShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct MeshletFragmentShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct MeshletPrepassFragmentShader; + +#[derive(ShaderLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct MeshletDeferredFragmentShader; + +#[derive(DrawFunctionLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct MaterialDrawFunction; + +#[derive(DrawFunctionLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct PrepassDrawFunction; + +#[derive(DrawFunctionLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct DeferredDrawFunction; + +#[derive(DrawFunctionLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct ShadowsDrawFunction; + /// Common [`Material`] properties, calculated for a specific material instance. +#[derive(Default)] pub struct MaterialProperties { /// Is this material should be rendered by the deferred renderer when. /// [`AlphaMode::Opaque`] or [`AlphaMode::Mask`] @@ -1344,13 +1299,54 @@ pub struct MaterialProperties { /// rendering to take place in a separate [`Transmissive3d`] pass. pub reads_view_transmission_texture: bool, pub render_phase_type: RenderPhaseType, - pub draw_function_id: DrawFunctionId, - pub prepass_draw_function_id: Option, - pub deferred_draw_function_id: Option, + pub material_layout: Option, + pub draw_functions: HashMap, + pub shaders: HashMap>, + /// Whether this material *actually* uses bindless resources, taking the + /// platform support (or lack thereof) of bindless resources into account. + pub bindless: bool, + pub specialize: Option< + fn( + &MaterialPipeline, + &mut RenderPipelineDescriptor, + &MeshVertexBufferLayoutRef, + ErasedMaterialPipelineKey, + ) -> Result<(), SpecializedMeshPipelineError>, + >, + /// The key for this material, typically a bitfield of flags that are used to modify + /// the pipeline descriptor used for this material. + pub material_key: SmallVec<[u8; 8]>, } -#[derive(Clone, Copy)] +impl MaterialProperties { + pub fn get_shader(&self, label: impl ShaderLabel) -> Option> { + self.shaders.get(&label.intern()).cloned() + } + + pub fn add_shader( + &mut self, + label: impl ShaderLabel, + shader: Handle, + ) -> Option> { + self.shaders.insert(label.intern(), shader) + } + + pub fn get_draw_function(&self, label: impl DrawFunctionLabel) -> Option { + self.draw_functions.get(&label.intern()).copied() + } + + pub fn add_draw_function( + &mut self, + label: impl DrawFunctionLabel, + draw_function: DrawFunctionId, + ) -> Option { + self.draw_functions.insert(label.intern(), draw_function) + } +} + +#[derive(Clone, Copy, Default)] pub enum RenderPhaseType { + #[default] Opaque, AlphaMask, Transmissive, @@ -1366,20 +1362,23 @@ pub enum RenderPhaseType { pub struct RenderMaterialBindings(HashMap); /// Data prepared for a [`Material`] instance. -pub struct PreparedMaterial { +pub struct PreparedMaterial { pub binding: MaterialBindingId, - pub properties: MaterialProperties, - pub phantom: PhantomData, + pub properties: Arc, } -impl RenderAsset for PreparedMaterial { +// orphan rules T_T +impl ErasedRenderAsset for MeshMaterial3d +where + M::Data: Clone, +{ type SourceAsset = M; + type ErasedAsset = PreparedMaterial; type Param = ( SRes, - SRes>, SRes, - SResMut>, + SResMut, SResMut, SRes>, SRes>, @@ -1389,6 +1388,8 @@ impl RenderAsset for PreparedMaterial { SRes>, SRes>, SRes>, + SRes>, + SRes, M::Param, ); @@ -1397,9 +1398,8 @@ impl RenderAsset for PreparedMaterial { material_id: AssetId, ( render_device, - pipeline, default_opaque_render_method, - bind_group_allocator, + bind_group_allocators, render_material_bindings, opaque_draw_functions, alpha_mask_draw_functions, @@ -1409,26 +1409,27 @@ impl RenderAsset for PreparedMaterial { alpha_mask_prepass_draw_functions, opaque_deferred_draw_functions, alpha_mask_deferred_draw_functions, + shadow_draw_functions, + asset_server, material_param, ): &mut SystemParamItem, - _: Option<&Self>, - ) -> Result> { - let draw_opaque_pbr = opaque_draw_functions.read().id::>(); - let draw_alpha_mask_pbr = alpha_mask_draw_functions.read().id::>(); - let draw_transmissive_pbr = transmissive_draw_functions.read().id::>(); - let draw_transparent_pbr = transparent_draw_functions.read().id::>(); - let draw_opaque_prepass = opaque_prepass_draw_functions - .read() - .get_id::>(); + ) -> Result> { + let material_layout = M::bind_group_layout(render_device); + let draw_opaque_pbr = opaque_draw_functions.read().id::(); + let draw_alpha_mask_pbr = alpha_mask_draw_functions.read().id::(); + let draw_transmissive_pbr = transmissive_draw_functions.read().id::(); + let draw_transparent_pbr = transparent_draw_functions.read().id::(); + let draw_opaque_prepass = opaque_prepass_draw_functions.read().get_id::(); let draw_alpha_mask_prepass = alpha_mask_prepass_draw_functions .read() - .get_id::>(); + .get_id::(); let draw_opaque_deferred = opaque_deferred_draw_functions .read() - .get_id::>(); + .get_id::(); let draw_alpha_mask_deferred = alpha_mask_deferred_draw_functions .read() - .get_id::>(); + .get_id::(); + let shadow_draw_function_id = shadow_draw_functions.read().get_id::(); let render_method = match material.opaque_render_method() { OpaqueRendererMethod::Forward => OpaqueRendererMethod::Forward, @@ -1471,13 +1472,81 @@ impl RenderAsset for PreparedMaterial { _ => None, }; - match material.unprepared_bind_group( - &pipeline.material_layout, - render_device, - material_param, - false, - ) { + let mut draw_functions = HashMap::new(); + draw_functions.insert(MaterialDrawFunction.intern(), draw_function_id); + if let Some(prepass_draw_function_id) = prepass_draw_function_id { + draw_functions.insert(PrepassDrawFunction.intern(), prepass_draw_function_id); + } + if let Some(deferred_draw_function_id) = deferred_draw_function_id { + draw_functions.insert(DeferredDrawFunction.intern(), deferred_draw_function_id); + } + if let Some(shadow_draw_function_id) = shadow_draw_function_id { + draw_functions.insert(ShadowsDrawFunction.intern(), shadow_draw_function_id); + } + + let mut shaders = HashMap::new(); + let mut add_shader = |label: InternedShaderLabel, shader_ref: ShaderRef| { + let mayber_shader = match shader_ref { + ShaderRef::Default => None, + ShaderRef::Handle(handle) => Some(handle), + ShaderRef::Path(path) => Some(asset_server.load(path)), + }; + if let Some(shader) = mayber_shader { + shaders.insert(label, shader); + } + }; + add_shader(MaterialVertexShader.intern(), M::vertex_shader()); + add_shader(MaterialFragmentShader.intern(), M::fragment_shader()); + add_shader(PrepassVertexShader.intern(), M::prepass_vertex_shader()); + add_shader(PrepassFragmentShader.intern(), M::prepass_fragment_shader()); + add_shader(DeferredVertexShader.intern(), M::deferred_vertex_shader()); + add_shader( + DeferredFragmentShader.intern(), + M::deferred_fragment_shader(), + ); + + #[cfg(feature = "meshlet")] + { + add_shader( + MeshletFragmentShader.intern(), + M::meshlet_mesh_fragment_shader(), + ); + add_shader( + MeshletPrepassFragmentShader.intern(), + M::meshlet_mesh_prepass_fragment_shader(), + ); + add_shader( + MeshletDeferredFragmentShader.intern(), + M::meshlet_mesh_deferred_fragment_shader(), + ); + } + + let bindless = material_uses_bindless_resources::(render_device); + let bind_group_data = material.bind_group_data(); + let material_key = SmallVec::from(bytemuck::bytes_of(&bind_group_data)); + fn specialize( + pipeline: &MaterialPipeline, + descriptor: &mut RenderPipelineDescriptor, + mesh_layout: &MeshVertexBufferLayoutRef, + erased_key: ErasedMaterialPipelineKey, + ) -> Result<(), SpecializedMeshPipelineError> { + let material_key = bytemuck::from_bytes(erased_key.material_key.as_slice()); + M::specialize( + pipeline, + descriptor, + mesh_layout, + MaterialPipelineKey { + mesh_key: erased_key.mesh_key, + bind_group_data: *material_key, + }, + ) + } + + match material.unprepared_bind_group(&material_layout, render_device, material_param, false) + { Ok(unprepared) => { + let bind_group_allocator = + bind_group_allocators.get_mut(&TypeId::of::()).unwrap(); // Allocate or update the material. let binding = match render_material_bindings.entry(material_id.into()) { Entry::Occupied(mut occupied_entry) => { @@ -1486,31 +1555,32 @@ impl RenderAsset for PreparedMaterial { // change. For now, we just delete and recreate the bind // group. bind_group_allocator.free(*occupied_entry.get()); - let new_binding = bind_group_allocator - .allocate_unprepared(unprepared, &pipeline.material_layout); + let new_binding = + bind_group_allocator.allocate_unprepared(unprepared, &material_layout); *occupied_entry.get_mut() = new_binding; new_binding } Entry::Vacant(vacant_entry) => *vacant_entry.insert( - bind_group_allocator - .allocate_unprepared(unprepared, &pipeline.material_layout), + bind_group_allocator.allocate_unprepared(unprepared, &material_layout), ), }; Ok(PreparedMaterial { binding, - properties: MaterialProperties { + properties: Arc::new(MaterialProperties { alpha_mode: material.alpha_mode(), depth_bias: material.depth_bias(), reads_view_transmission_texture, render_phase_type, - draw_function_id, - prepass_draw_function_id, render_method, mesh_pipeline_key_bits, - deferred_draw_function_id, - }, - phantom: PhantomData, + material_layout: Some(material_layout), + draw_functions, + shaders, + bindless, + specialize: Some(specialize::), + material_key, + }), }) } @@ -1523,12 +1593,10 @@ impl RenderAsset for PreparedMaterial { // and is requesting a fully-custom bind group. Invoke // `as_bind_group` as requested, and store the resulting bind // group in the slot. - match material.as_bind_group( - &pipeline.material_layout, - render_device, - material_param, - ) { + match material.as_bind_group(&material_layout, render_device, material_param) { Ok(prepared_bind_group) => { + let bind_group_allocator = + bind_group_allocators.get_mut(&TypeId::of::()).unwrap(); // Store the resulting bind group directly in the slot. let material_binding_id = bind_group_allocator.allocate_prepared(prepared_bind_group); @@ -1536,18 +1604,20 @@ impl RenderAsset for PreparedMaterial { Ok(PreparedMaterial { binding: material_binding_id, - properties: MaterialProperties { + properties: Arc::new(MaterialProperties { alpha_mode: material.alpha_mode(), depth_bias: material.depth_bias(), reads_view_transmission_texture, render_phase_type, - draw_function_id, - prepass_draw_function_id, render_method, mesh_pipeline_key_bits, - deferred_draw_function_id, - }, - phantom: PhantomData, + material_layout: Some(material_layout), + draw_functions, + shaders, + bindless, + specialize: Some(specialize::), + material_key, + }), }) } @@ -1565,7 +1635,7 @@ impl RenderAsset for PreparedMaterial { fn unload_asset( source_asset: AssetId, - (_, _, _, bind_group_allocator, render_material_bindings, ..): &mut SystemParamItem< + (_, _, bind_group_allocators, render_material_bindings, ..): &mut SystemParamItem< Self::Param, >, ) { @@ -1573,7 +1643,8 @@ impl RenderAsset for PreparedMaterial { else { return; }; - bind_group_allocator.free(material_binding_id); + let bind_group_allactor = bind_group_allocators.get_mut(&TypeId::of::()).unwrap(); + bind_group_allactor.free(material_binding_id); } } @@ -1594,15 +1665,15 @@ impl From for MaterialBindGroupId { /// Creates and/or recreates any bind groups that contain materials that were /// modified this frame. -pub fn prepare_material_bind_groups( - mut allocator: ResMut>, +pub fn prepare_material_bind_groups( + mut allocators: ResMut, render_device: Res, fallback_image: Res, fallback_resources: Res, -) where - M: Material, -{ - allocator.prepare_bind_groups(&render_device, &fallback_resources, &fallback_image); +) { + for (_, allocator) in allocators.iter_mut() { + allocator.prepare_bind_groups(&render_device, &fallback_resources, &fallback_image); + } } /// Uploads the contents of all buffers that the [`MaterialBindGroupAllocator`] @@ -1610,12 +1681,12 @@ pub fn prepare_material_bind_groups( /// /// Non-bindless allocators don't currently manage any buffers, so this method /// only has an effect for bindless allocators. -pub fn write_material_bind_group_buffers( - mut allocator: ResMut>, +pub fn write_material_bind_group_buffers( + mut allocators: ResMut, render_device: Res, render_queue: Res, -) where - M: Material, -{ - allocator.write_buffers(&render_device, &render_queue); +) { + for (_, allocator) in allocators.iter_mut() { + allocator.write_buffers(&render_device, &render_queue); + } } diff --git a/crates/bevy_pbr/src/material_bind_groups.rs b/crates/bevy_pbr/src/material_bind_groups.rs index 39028fed2d..780ac8e10c 100644 --- a/crates/bevy_pbr/src/material_bind_groups.rs +++ b/crates/bevy_pbr/src/material_bind_groups.rs @@ -4,8 +4,7 @@ //! allocator manages each bind group, assigning slots to materials as //! appropriate. -use core::{cmp::Ordering, iter, marker::PhantomData, mem, ops::Range}; - +use crate::Material; use bevy_derive::{Deref, DerefMut}; use bevy_ecs::{ resource::Resource, @@ -13,6 +12,7 @@ use bevy_ecs::{ }; use bevy_platform::collections::{HashMap, HashSet}; use bevy_reflect::{prelude::ReflectDefault, Reflect}; +use bevy_render::render_resource::BindlessSlabResourceLimit; use bevy_render::{ render_resource::{ BindGroup, BindGroupEntry, BindGroupLayout, BindingNumber, BindingResource, @@ -26,11 +26,14 @@ use bevy_render::{ settings::WgpuFeatures, texture::FallbackImage, }; -use bevy_utils::default; +use bevy_utils::{default, TypeIdMap}; use bytemuck::Pod; +use core::hash::Hash; +use core::{cmp::Ordering, iter, mem, ops::Range}; use tracing::{error, trace}; -use crate::Material; +#[derive(Resource, Deref, DerefMut, Default)] +pub struct MaterialBindGroupAllocators(TypeIdMap); /// A resource that places materials into bind groups and tracks their /// resources. @@ -38,25 +41,20 @@ use crate::Material; /// Internally, Bevy has separate allocators for bindless and non-bindless /// materials. This resource provides a common interface to the specific /// allocator in use. -#[derive(Resource)] -pub enum MaterialBindGroupAllocator -where - M: Material, -{ +pub enum MaterialBindGroupAllocator { /// The allocator used when the material is bindless. - Bindless(Box>), + Bindless(Box), /// The allocator used when the material is non-bindless. - NonBindless(Box>), + NonBindless(Box), } /// The allocator that places bindless materials into bind groups and tracks /// their resources. -pub struct MaterialBindGroupBindlessAllocator -where - M: Material, -{ +pub struct MaterialBindGroupBindlessAllocator { + /// The label of the bind group allocator to use for allocated buffers. + label: Option<&'static str>, /// The slabs, each of which contains a bind group. - slabs: Vec>, + slabs: Vec, /// The layout of the bind groups that we produce. bind_group_layout: BindGroupLayout, /// Information about the bindless resources in the material. @@ -79,10 +77,7 @@ where } /// A single bind group and the bookkeeping necessary to allocate into it. -pub struct MaterialBindlessSlab -where - M: Material, -{ +pub struct MaterialBindlessSlab { /// The current bind group, if it's up to date. /// /// If this is `None`, then the bind group is dirty and needs to be @@ -98,7 +93,7 @@ where /// /// Because the slab binary searches this table, the entries within must be /// sorted by bindless index. - bindless_index_tables: Vec>, + bindless_index_tables: Vec, /// The binding arrays containing samplers. samplers: HashMap>, @@ -110,12 +105,6 @@ where /// `#[data]` attribute of `AsBindGroup`). data_buffers: HashMap, - /// Holds extra CPU-accessible data that the material provides. - /// - /// Typically, this data is used for constructing the material key, for - /// pipeline specialization purposes. - extra_data: Vec>, - /// A list of free slot IDs. free_slots: Vec, /// The total number of materials currently allocated in this slab. @@ -130,10 +119,7 @@ where /// This is conventionally assigned to bind group binding 0, but it can be /// changed by altering the [`Self::binding_number`], which corresponds to the /// `#[bindless(index_table(binding(B)))]` attribute in `AsBindGroup`. -struct MaterialBindlessIndexTable -where - M: Material, -{ +struct MaterialBindlessIndexTable { /// The buffer containing the mappings. buffer: RetainedRawBufferVec, /// The range of bindless indices that this bindless index table covers. @@ -146,7 +132,6 @@ where index_range: Range, /// The binding number that this index table is assigned to in the shader. binding_number: BindingNumber, - phantom: PhantomData, } /// A single binding array for storing bindless resources and the bookkeeping @@ -189,13 +174,12 @@ where } /// The allocator that stores bind groups for non-bindless materials. -pub struct MaterialBindGroupNonBindlessAllocator -where - M: Material, -{ +pub struct MaterialBindGroupNonBindlessAllocator { + /// The label of the bind group allocator to use for allocated buffers. + label: Option<&'static str>, /// A mapping from [`MaterialBindGroupIndex`] to the bind group allocated in /// each slot. - bind_groups: Vec>>, + bind_groups: Vec>, /// The bind groups that are dirty and need to be prepared. /// /// To prepare the bind groups, call @@ -203,15 +187,11 @@ where to_prepare: HashSet, /// A list of free bind group indices. free_indices: Vec, - phantom: PhantomData, } /// A single bind group that a [`MaterialBindGroupNonBindlessAllocator`] is /// currently managing. -enum MaterialNonBindlessAllocatedBindGroup -where - M: Material, -{ +enum MaterialNonBindlessAllocatedBindGroup { /// An unprepared bind group. /// /// The allocator prepares all outstanding unprepared bind groups when @@ -219,13 +199,13 @@ where /// called. Unprepared { /// The unprepared bind group, including extra data. - bind_group: UnpreparedBindGroup, + bind_group: UnpreparedBindGroup, /// The layout of that bind group. layout: BindGroupLayout, }, /// A bind group that's already been prepared. Prepared { - bind_group: PreparedBindGroup, + bind_group: PreparedBindGroup, #[expect(dead_code, reason = "These buffers are only referenced by bind groups")] uniform_buffers: Vec, }, @@ -351,35 +331,27 @@ trait GetBindingResourceId { } /// The public interface to a slab, which represents a single bind group. -pub struct MaterialSlab<'a, M>(MaterialSlabImpl<'a, M>) -where - M: Material; +pub struct MaterialSlab<'a>(MaterialSlabImpl<'a>); /// The actual implementation of a material slab. /// /// This has bindless and non-bindless variants. -enum MaterialSlabImpl<'a, M> -where - M: Material, -{ +enum MaterialSlabImpl<'a> { /// The implementation of the slab interface we use when the slab /// is bindless. - Bindless(&'a MaterialBindlessSlab), + Bindless(&'a MaterialBindlessSlab), /// The implementation of the slab interface we use when the slab /// is non-bindless. - NonBindless(MaterialNonBindlessSlab<'a, M>), + NonBindless(MaterialNonBindlessSlab<'a>), } /// A single bind group that the [`MaterialBindGroupNonBindlessAllocator`] /// manages. -enum MaterialNonBindlessSlab<'a, M> -where - M: Material, -{ +enum MaterialNonBindlessSlab<'a> { /// A slab that has a bind group. - Prepared(&'a PreparedBindGroup), + Prepared(&'a PreparedBindGroup), /// A slab that doesn't yet have a bind group. - Unprepared(&'a UnpreparedBindGroup), + Unprepared, } /// Manages an array of untyped plain old data on GPU and allocates individual @@ -480,26 +452,33 @@ impl GetBindingResourceId for TextureView { } } -impl MaterialBindGroupAllocator -where - M: Material, -{ +impl MaterialBindGroupAllocator { /// Creates a new [`MaterialBindGroupAllocator`] managing the data for a /// single material. - fn new(render_device: &RenderDevice) -> MaterialBindGroupAllocator { - if material_uses_bindless_resources::(render_device) { + pub fn new( + render_device: &RenderDevice, + label: Option<&'static str>, + bindless_descriptor: Option, + bind_group_layout: BindGroupLayout, + slab_capacity: Option, + ) -> MaterialBindGroupAllocator { + if let Some(bindless_descriptor) = bindless_descriptor { MaterialBindGroupAllocator::Bindless(Box::new(MaterialBindGroupBindlessAllocator::new( render_device, + label, + bindless_descriptor, + bind_group_layout, + slab_capacity, ))) } else { MaterialBindGroupAllocator::NonBindless(Box::new( - MaterialBindGroupNonBindlessAllocator::new(), + MaterialBindGroupNonBindlessAllocator::new(label), )) } } /// Returns the slab with the given index, if one exists. - pub fn get(&self, group: MaterialBindGroupIndex) -> Option> { + pub fn get(&self, group: MaterialBindGroupIndex) -> Option { match *self { MaterialBindGroupAllocator::Bindless(ref bindless_allocator) => bindless_allocator .get(group) @@ -520,7 +499,7 @@ where /// you need to prepare the bind group yourself. pub fn allocate_unprepared( &mut self, - unprepared_bind_group: UnpreparedBindGroup, + unprepared_bind_group: UnpreparedBindGroup, bind_group_layout: &BindGroupLayout, ) -> MaterialBindingId { match *self { @@ -545,7 +524,7 @@ where /// this method if you need to prepare the bind group yourself. pub fn allocate_prepared( &mut self, - prepared_bind_group: PreparedBindGroup, + prepared_bind_group: PreparedBindGroup, ) -> MaterialBindingId { match *self { MaterialBindGroupAllocator::Bindless(_) => { @@ -613,14 +592,11 @@ where } } -impl MaterialBindlessIndexTable -where - M: Material, -{ +impl MaterialBindlessIndexTable { /// Creates a new [`MaterialBindlessIndexTable`] for a single slab. fn new( bindless_index_table_descriptor: &BindlessIndexTableDescriptor, - ) -> MaterialBindlessIndexTable { + ) -> MaterialBindlessIndexTable { // Preallocate space for one bindings table, so that there will always be a buffer. let mut buffer = RetainedRawBufferVec::new(BufferUsages::STORAGE); for _ in *bindless_index_table_descriptor.indices.start @@ -633,7 +609,6 @@ where buffer, index_range: bindless_index_table_descriptor.indices.clone(), binding_number: bindless_index_table_descriptor.binding_number, - phantom: PhantomData, } } @@ -747,15 +722,16 @@ where } } -impl MaterialBindGroupBindlessAllocator -where - M: Material, -{ +impl MaterialBindGroupBindlessAllocator { /// Creates a new [`MaterialBindGroupBindlessAllocator`] managing the data /// for a single bindless material. - fn new(render_device: &RenderDevice) -> MaterialBindGroupBindlessAllocator { - let bindless_descriptor = M::bindless_descriptor() - .expect("Non-bindless materials should use the non-bindless allocator"); + fn new( + render_device: &RenderDevice, + label: Option<&'static str>, + bindless_descriptor: BindlessDescriptor, + bind_group_layout: BindGroupLayout, + slab_capacity: Option, + ) -> MaterialBindGroupBindlessAllocator { let fallback_buffers = bindless_descriptor .buffers .iter() @@ -776,11 +752,12 @@ where .collect(); MaterialBindGroupBindlessAllocator { + label, slabs: vec![], - bind_group_layout: M::bind_group_layout(render_device), + bind_group_layout, bindless_descriptor, fallback_buffers, - slab_capacity: M::bindless_slot_count() + slab_capacity: slab_capacity .expect("Non-bindless materials should use the non-bindless allocator") .resolve(), } @@ -796,7 +773,7 @@ where /// created, and the material is allocated into it. fn allocate_unprepared( &mut self, - mut unprepared_bind_group: UnpreparedBindGroup, + mut unprepared_bind_group: UnpreparedBindGroup, ) -> MaterialBindingId { for (slab_index, slab) in self.slabs.iter_mut().enumerate() { trace!("Trying to allocate in slab {}", slab_index); @@ -842,7 +819,7 @@ where /// /// A [`MaterialBindGroupIndex`] can be fetched from a /// [`MaterialBindingId`]. - fn get(&self, group: MaterialBindGroupIndex) -> Option<&MaterialBindlessSlab> { + fn get(&self, group: MaterialBindGroupIndex) -> Option<&MaterialBindlessSlab> { self.slabs.get(group.0 as usize) } @@ -858,6 +835,7 @@ where for slab in &mut self.slabs { slab.prepare( render_device, + self.label, &self.bind_group_layout, fallback_bindless_resources, &self.fallback_buffers, @@ -878,20 +856,7 @@ where } } -impl FromWorld for MaterialBindGroupAllocator -where - M: Material, -{ - fn from_world(world: &mut World) -> Self { - let render_device = world.resource::(); - MaterialBindGroupAllocator::new(render_device) - } -} - -impl MaterialBindlessSlab -where - M: Material, -{ +impl MaterialBindlessSlab { /// Attempts to allocate the given unprepared bind group in this slab. /// /// If the allocation succeeds, this method returns the slot that the @@ -900,9 +865,9 @@ where /// so that it can try to allocate again. fn try_allocate( &mut self, - unprepared_bind_group: UnpreparedBindGroup, + unprepared_bind_group: UnpreparedBindGroup, slot_capacity: u32, - ) -> Result> { + ) -> Result { // Locate pre-existing resources, and determine how many free slots we need. let Some(allocation_candidate) = self.check_allocation(&unprepared_bind_group) else { return Err(unprepared_bind_group); @@ -942,12 +907,6 @@ where bindless_index_table.set(slot, &allocated_resource_slots); } - // Insert extra data. - if self.extra_data.len() < (*slot as usize + 1) { - self.extra_data.resize_with(*slot as usize + 1, || None); - } - self.extra_data[*slot as usize] = Some(unprepared_bind_group.data); - // Invalidate the cached bind group. self.bind_group = None; @@ -958,7 +917,7 @@ where /// bind group can be allocated in this slab. fn check_allocation( &self, - unprepared_bind_group: &UnpreparedBindGroup, + unprepared_bind_group: &UnpreparedBindGroup, ) -> Option { let mut allocation_candidate = BindlessAllocationCandidate { pre_existing_resources: HashMap::default(), @@ -1189,9 +1148,6 @@ where } } - // Clear out the extra data. - self.extra_data[slot.0 as usize] = None; - // Invalidate the cached bind group. self.bind_group = None; @@ -1204,6 +1160,7 @@ where fn prepare( &mut self, render_device: &RenderDevice, + label: Option<&'static str>, bind_group_layout: &BindGroupLayout, fallback_bindless_resources: &FallbackBindlessResources, fallback_buffers: &HashMap, @@ -1224,6 +1181,7 @@ where // Create the bind group if needed. self.prepare_bind_group( render_device, + label, bind_group_layout, fallback_bindless_resources, fallback_buffers, @@ -1238,6 +1196,7 @@ where fn prepare_bind_group( &mut self, render_device: &RenderDevice, + label: Option<&'static str>, bind_group_layout: &BindGroupLayout, fallback_bindless_resources: &FallbackBindlessResources, fallback_buffers: &HashMap, @@ -1304,11 +1263,8 @@ where }); } - self.bind_group = Some(render_device.create_bind_group( - M::label(), - bind_group_layout, - &bind_group_entries, - )); + self.bind_group = + Some(render_device.create_bind_group(label, bind_group_layout, &bind_group_entries)); } /// Writes any buffers that we're managing to the GPU. @@ -1548,19 +1504,11 @@ where self.bind_group.as_ref() } - /// Returns the extra data associated with this material. - fn get_extra_data(&self, slot: MaterialBindGroupSlot) -> &M::Data { - self.extra_data - .get(slot.0 as usize) - .and_then(|data| data.as_ref()) - .expect("Extra data not present") - } - /// Returns the bindless index table containing the given bindless index. fn get_bindless_index_table( &self, bindless_index: BindlessIndex, - ) -> Option<&MaterialBindlessIndexTable> { + ) -> Option<&MaterialBindlessIndexTable> { let table_index = self .bindless_index_tables .binary_search_by(|bindless_index_table| { @@ -1689,15 +1637,12 @@ where }) } -impl MaterialBindlessSlab -where - M: Material, -{ +impl MaterialBindlessSlab { /// Creates a new [`MaterialBindlessSlab`] for a material with the given /// bindless descriptor. /// /// We use this when no existing slab could hold a material to be allocated. - fn new(bindless_descriptor: &BindlessDescriptor) -> MaterialBindlessSlab { + fn new(bindless_descriptor: &BindlessDescriptor) -> MaterialBindlessSlab { let mut buffers = HashMap::default(); let mut samplers = HashMap::default(); let mut textures = HashMap::default(); @@ -1780,7 +1725,7 @@ where let bindless_index_tables = bindless_descriptor .index_tables .iter() - .map(|bindless_index_table| MaterialBindlessIndexTable::new(bindless_index_table)) + .map(MaterialBindlessIndexTable::new) .collect(); MaterialBindlessSlab { @@ -1790,7 +1735,6 @@ where textures, buffers, data_buffers, - extra_data: vec![], free_slots: vec![], live_allocation_count: 0, allocated_resource_count: 0, @@ -1822,18 +1766,15 @@ impl FromWorld for FallbackBindlessResources { } } -impl MaterialBindGroupNonBindlessAllocator -where - M: Material, -{ +impl MaterialBindGroupNonBindlessAllocator { /// Creates a new [`MaterialBindGroupNonBindlessAllocator`] managing the /// bind groups for a single non-bindless material. - fn new() -> MaterialBindGroupNonBindlessAllocator { + fn new(label: Option<&'static str>) -> MaterialBindGroupNonBindlessAllocator { MaterialBindGroupNonBindlessAllocator { + label, bind_groups: vec![], to_prepare: HashSet::default(), free_indices: vec![], - phantom: PhantomData, } } @@ -1842,10 +1783,7 @@ where /// /// The returned [`MaterialBindingId`] can later be used to fetch the bind /// group. - fn allocate( - &mut self, - bind_group: MaterialNonBindlessAllocatedBindGroup, - ) -> MaterialBindingId { + fn allocate(&mut self, bind_group: MaterialNonBindlessAllocatedBindGroup) -> MaterialBindingId { let group_id = self .free_indices .pop() @@ -1874,7 +1812,7 @@ where /// [`MaterialBindingId`]. fn allocate_unprepared( &mut self, - unprepared_bind_group: UnpreparedBindGroup, + unprepared_bind_group: UnpreparedBindGroup, bind_group_layout: BindGroupLayout, ) -> MaterialBindingId { self.allocate(MaterialNonBindlessAllocatedBindGroup::Unprepared { @@ -1885,10 +1823,7 @@ where /// Inserts an prepared bind group into this allocator and returns a /// [`MaterialBindingId`]. - fn allocate_prepared( - &mut self, - prepared_bind_group: PreparedBindGroup, - ) -> MaterialBindingId { + fn allocate_prepared(&mut self, prepared_bind_group: PreparedBindGroup) -> MaterialBindingId { self.allocate(MaterialNonBindlessAllocatedBindGroup::Prepared { bind_group: prepared_bind_group, uniform_buffers: vec![], @@ -1905,15 +1840,15 @@ where } /// Returns a wrapper around the bind group with the given index. - fn get(&self, group: MaterialBindGroupIndex) -> Option> { + fn get(&self, group: MaterialBindGroupIndex) -> Option { self.bind_groups[group.0 as usize] .as_ref() .map(|bind_group| match bind_group { MaterialNonBindlessAllocatedBindGroup::Prepared { bind_group, .. } => { MaterialNonBindlessSlab::Prepared(bind_group) } - MaterialNonBindlessAllocatedBindGroup::Unprepared { bind_group, .. } => { - MaterialNonBindlessSlab::Unprepared(bind_group) + MaterialNonBindlessAllocatedBindGroup::Unprepared { .. } => { + MaterialNonBindlessSlab::Unprepared } }) } @@ -1972,7 +1907,7 @@ where // Create the bind group. let bind_group = render_device.create_bind_group( - M::label(), + self.label, &bind_group_layout, &bind_group_entries, ); @@ -1982,7 +1917,6 @@ where bind_group: PreparedBindGroup { bindings: unprepared_bind_group.bindings, bind_group, - data: unprepared_bind_group.data, }, uniform_buffers, }); @@ -1990,28 +1924,7 @@ where } } -impl<'a, M> MaterialSlab<'a, M> -where - M: Material, -{ - /// Returns the extra data associated with this material. - /// - /// When deriving `AsBindGroup`, this data is given by the - /// `#[bind_group_data(DataType)]` attribute on the material structure. - pub fn get_extra_data(&self, slot: MaterialBindGroupSlot) -> &M::Data { - match self.0 { - MaterialSlabImpl::Bindless(material_bindless_slab) => { - material_bindless_slab.get_extra_data(slot) - } - MaterialSlabImpl::NonBindless(MaterialNonBindlessSlab::Prepared( - prepared_bind_group, - )) => &prepared_bind_group.data, - MaterialSlabImpl::NonBindless(MaterialNonBindlessSlab::Unprepared( - unprepared_bind_group, - )) => &unprepared_bind_group.data, - } - } - +impl<'a> MaterialSlab<'a> { /// Returns the [`BindGroup`] corresponding to this slab, if it's been /// prepared. /// @@ -2026,7 +1939,7 @@ where MaterialSlabImpl::NonBindless(MaterialNonBindlessSlab::Prepared( prepared_bind_group, )) => Some(&prepared_bind_group.bind_group), - MaterialSlabImpl::NonBindless(MaterialNonBindlessSlab::Unprepared(_)) => None, + MaterialSlabImpl::NonBindless(MaterialNonBindlessSlab::Unprepared) => None, } } } diff --git a/crates/bevy_pbr/src/meshlet/instance_manager.rs b/crates/bevy_pbr/src/meshlet/instance_manager.rs index 661d4791ae..6aa5f22665 100644 --- a/crates/bevy_pbr/src/meshlet/instance_manager.rs +++ b/crates/bevy_pbr/src/meshlet/instance_manager.rs @@ -1,8 +1,8 @@ use super::{meshlet_mesh_manager::MeshletMeshManager, MeshletMesh, MeshletMesh3d}; use crate::{ - material::DUMMY_MESH_MATERIAL, Material, MaterialBindingId, MeshFlags, MeshTransforms, - MeshUniform, NotShadowCaster, NotShadowReceiver, PreviousGlobalTransform, - RenderMaterialBindings, RenderMaterialInstances, + material::DUMMY_MESH_MATERIAL, MaterialBindingId, MeshFlags, MeshTransforms, MeshUniform, + NotShadowCaster, NotShadowReceiver, PreviousGlobalTransform, RenderMaterialBindings, + RenderMaterialInstances, }; use bevy_asset::{AssetEvent, AssetServer, Assets, UntypedAssetId}; use bevy_ecs::{ @@ -40,9 +40,9 @@ pub struct InstanceManager { /// Per-view per-instance visibility bit. Used for [`RenderLayers`] and [`NotShadowCaster`] support. pub view_instance_visibility: EntityHashMap>>, - /// Next material ID available for a [`Material`]. + /// Next material ID available. next_material_id: u32, - /// Map of [`Material`] to material ID. + /// Map of material asset to material ID. material_id_lookup: HashMap, /// Set of material IDs used in the scene. material_ids_present_in_scene: HashSet, @@ -272,7 +272,7 @@ pub fn extract_meshlet_mesh_entities( /// For each entity in the scene, record what material ID its material was assigned in the `prepare_material_meshlet_meshes` systems, /// and note that the material is used by at least one entity in the scene. -pub fn queue_material_meshlet_meshes( +pub fn queue_material_meshlet_meshes( mut instance_manager: ResMut, render_material_instances: Res, ) { @@ -280,16 +280,14 @@ pub fn queue_material_meshlet_meshes( for (i, (instance, _, _)) in instance_manager.instances.iter().enumerate() { if let Some(material_instance) = render_material_instances.instances.get(instance) { - if let Ok(material_asset_id) = material_instance.asset_id.try_typed::() { - if let Some(material_id) = instance_manager - .material_id_lookup - .get(&material_asset_id.untyped()) - { - instance_manager - .material_ids_present_in_scene - .insert(*material_id); - instance_manager.instance_material_ids.get_mut()[i] = *material_id; - } + if let Some(material_id) = instance_manager + .material_id_lookup + .get(&material_instance.asset_id) + { + instance_manager + .material_ids_present_in_scene + .insert(*material_id); + instance_manager.instance_material_ids.get_mut()[i] = *material_id; } } } diff --git a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs index 90d35d0514..edb487bbb0 100644 --- a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs +++ b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs @@ -2,11 +2,7 @@ use super::{ instance_manager::InstanceManager, resource_manager::ResourceManager, MESHLET_MESH_MATERIAL_SHADER_HANDLE, }; -use crate::{ - environment_map::EnvironmentMapLight, irradiance_volume::IrradianceVolume, - material_bind_groups::MaterialBindGroupAllocator, *, -}; -use bevy_asset::AssetServer; +use crate::{environment_map::EnvironmentMapLight, irradiance_volume::IrradianceVolume, *}; use bevy_core_pipeline::{ core_3d::Camera3d, prepass::{DeferredPrepass, DepthPrepass, MotionVectorPrepass, NormalPrepass}, @@ -14,14 +10,13 @@ use bevy_core_pipeline::{ }; use bevy_derive::{Deref, DerefMut}; use bevy_platform::collections::{HashMap, HashSet}; +use bevy_render::erased_render_asset::ErasedRenderAssets; use bevy_render::{ camera::TemporalJitter, mesh::{Mesh, MeshVertexBufferLayout, MeshVertexBufferLayoutRef, MeshVertexBufferLayouts}, - render_asset::RenderAssets, render_resource::*, view::ExtractedView, }; -use core::hash::Hash; /// A list of `(Material ID, Pipeline, BindGroup)` for a view for use in [`super::MeshletMainOpaquePass3dNode`]. #[derive(Component, Deref, DerefMut, Default)] @@ -29,17 +24,16 @@ pub struct MeshletViewMaterialsMainOpaquePass(pub Vec<(u32, CachedRenderPipeline /// Prepare [`Material`] pipelines for [`super::MeshletMesh`] entities for use in [`super::MeshletMainOpaquePass3dNode`], /// and register the material with [`InstanceManager`]. -pub fn prepare_material_meshlet_meshes_main_opaque_pass( +pub fn prepare_material_meshlet_meshes_main_opaque_pass( resource_manager: ResMut, mut instance_manager: ResMut, mut cache: Local>, pipeline_cache: Res, - material_pipeline: Res>, + material_pipeline: Res, mesh_pipeline: Res, - render_materials: Res>>, + render_materials: Res>, render_material_instances: Res, - material_bind_group_allocator: Res>, - asset_server: Res, + material_bind_group_allocators: Res, mut mesh_vertex_buffer_layouts: ResMut, mut views: Query< ( @@ -62,9 +56,7 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( ), With, >, -) where - M::Data: PartialEq + Eq + Hash + Clone, -{ +) { let fake_vertex_buffer_layout = &fake_vertex_buffer_layout(&mut mesh_vertex_buffer_layouts); for ( @@ -151,17 +143,12 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( for material_id in render_material_instances .instances .values() - .flat_map(|instance| instance.asset_id.try_typed::().ok()) + .map(|instance| instance.asset_id) .collect::>() { let Some(material) = render_materials.get(material_id) else { continue; }; - let Some(material_bind_group) = - material_bind_group_allocator.get(material.binding.group) - else { - continue; - }; if material.properties.render_method != OpaqueRendererMethod::Forward || material.properties.alpha_mode != AlphaMode::Opaque @@ -170,15 +157,18 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( continue; } - let Ok(material_pipeline_descriptor) = material_pipeline.specialize( - MaterialPipelineKey { - mesh_key: view_key, - bind_group_data: material_bind_group - .get_extra_data(material.binding.slot) - .clone(), - }, - fake_vertex_buffer_layout, - ) else { + let erased_key = ErasedMaterialPipelineKey { + mesh_key: view_key, + material_key: material.properties.material_key.clone(), + type_id: material_id.type_id(), + }; + let material_pipeline_specializer = MaterialPipelineSpecializer { + pipeline: material_pipeline.clone(), + properties: material.properties.clone(), + }; + let Ok(material_pipeline_descriptor) = + material_pipeline_specializer.specialize(erased_key, fake_vertex_buffer_layout) + else { continue; }; let material_fragment = material_pipeline_descriptor.fragment.unwrap(); @@ -191,7 +181,12 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( layout.main_layout.clone(), layout.binding_array_layout.clone(), resource_manager.material_shade_bind_group_layout.clone(), - material_pipeline.material_layout.clone(), + material + .properties + .material_layout + .as_ref() + .unwrap() + .clone(), ]; let pipeline_descriptor = RenderPipelineDescriptor { @@ -214,10 +209,9 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( }), multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: match M::meshlet_mesh_fragment_shader() { - ShaderRef::Default => MESHLET_MESH_MATERIAL_SHADER_HANDLE, - ShaderRef::Handle(handle) => handle, - ShaderRef::Path(path) => asset_server.load(path), + shader: match material.properties.get_shader(MeshletFragmentShader) { + Some(shader) => shader.clone(), + None => MESHLET_MESH_MATERIAL_SHADER_HANDLE, }, shader_defs, entry_point: material_fragment.entry_point, @@ -225,8 +219,12 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( }), zero_initialize_workgroup_memory: false, }; - - let material_id = instance_manager.get_material_id(material_id.untyped()); + let Some(material_bind_group_allocator) = + material_bind_group_allocators.get(&material_id.type_id()) + else { + continue; + }; + let material_id = instance_manager.get_material_id(material_id); let pipeline_id = *cache.entry(view_key).or_insert_with(|| { pipeline_cache.queue_render_pipeline(pipeline_descriptor.clone()) @@ -258,17 +256,16 @@ pub struct MeshletViewMaterialsDeferredGBufferPrepass( /// Prepare [`Material`] pipelines for [`super::MeshletMesh`] entities for use in [`super::MeshletPrepassNode`], /// and [`super::MeshletDeferredGBufferPrepassNode`] and register the material with [`InstanceManager`]. -pub fn prepare_material_meshlet_meshes_prepass( +pub fn prepare_material_meshlet_meshes_prepass( resource_manager: ResMut, mut instance_manager: ResMut, mut cache: Local>, pipeline_cache: Res, - prepass_pipeline: Res>, - render_materials: Res>>, + prepass_pipeline: Res, + material_bind_group_allocators: Res, + render_materials: Res>, render_material_instances: Res, mut mesh_vertex_buffer_layouts: ResMut, - material_bind_group_allocator: Res>, - asset_server: Res, mut views: Query< ( &mut MeshletViewMaterialsPrepass, @@ -278,9 +275,7 @@ pub fn prepare_material_meshlet_meshes_prepass( ), With, >, -) where - M::Data: PartialEq + Eq + Hash + Clone, -{ +) { let fake_vertex_buffer_layout = &fake_vertex_buffer_layout(&mut mesh_vertex_buffer_layouts); for ( @@ -305,14 +300,14 @@ pub fn prepare_material_meshlet_meshes_prepass( for material_id in render_material_instances .instances .values() - .flat_map(|instance| instance.asset_id.try_typed::().ok()) + .map(|instance| instance.asset_id) .collect::>() { let Some(material) = render_materials.get(material_id) else { continue; }; - let Some(material_bind_group) = - material_bind_group_allocator.get(material.binding.group) + let Some(material_bind_group_allocator) = + material_bind_group_allocators.get(&material_id.type_id()) else { continue; }; @@ -333,15 +328,18 @@ pub fn prepare_material_meshlet_meshes_prepass( continue; } - let Ok(material_pipeline_descriptor) = prepass_pipeline.specialize( - MaterialPipelineKey { - mesh_key: view_key, - bind_group_data: material_bind_group - .get_extra_data(material.binding.slot) - .clone(), - }, - fake_vertex_buffer_layout, - ) else { + let erased_key = ErasedMaterialPipelineKey { + mesh_key: view_key, + material_key: material.properties.material_key.clone(), + type_id: material_id.type_id(), + }; + let material_pipeline_specializer = PrepassPipelineSpecializer { + pipeline: prepass_pipeline.clone(), + properties: material.properties.clone(), + }; + let Ok(material_pipeline_descriptor) = + material_pipeline_specializer.specialize(erased_key, fake_vertex_buffer_layout) + else { continue; }; let material_fragment = material_pipeline_descriptor.fragment.unwrap(); @@ -359,13 +357,19 @@ pub fn prepare_material_meshlet_meshes_prepass( }; let fragment_shader = if view_key.contains(MeshPipelineKey::DEFERRED_PREPASS) { - M::meshlet_mesh_deferred_fragment_shader() + material + .properties + .get_shader(MeshletDeferredFragmentShader) + .unwrap_or(MESHLET_MESH_MATERIAL_SHADER_HANDLE) } else { - M::meshlet_mesh_prepass_fragment_shader() + material + .properties + .get_shader(MeshletPrepassFragmentShader) + .unwrap_or(MESHLET_MESH_MATERIAL_SHADER_HANDLE) }; - let entry_point = match fragment_shader { - ShaderRef::Default => "prepass_fragment".into(), + let entry_point = match &fragment_shader { + x if x == &MESHLET_MESH_MATERIAL_SHADER_HANDLE => "prepass_fragment".into(), _ => material_fragment.entry_point, }; @@ -374,7 +378,12 @@ pub fn prepare_material_meshlet_meshes_prepass( layout: vec![ view_layout, resource_manager.material_shade_bind_group_layout.clone(), - prepass_pipeline.internal.material_layout.clone(), + material + .properties + .material_layout + .as_ref() + .unwrap() + .clone(), ], push_constant_ranges: vec![], vertex: VertexState { @@ -393,11 +402,7 @@ pub fn prepare_material_meshlet_meshes_prepass( }), multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: match fragment_shader { - ShaderRef::Default => MESHLET_MESH_MATERIAL_SHADER_HANDLE, - ShaderRef::Handle(handle) => handle, - ShaderRef::Path(path) => asset_server.load(path), - }, + shader: fragment_shader, shader_defs, entry_point, targets: material_fragment.targets, @@ -405,7 +410,7 @@ pub fn prepare_material_meshlet_meshes_prepass( zero_initialize_workgroup_memory: false, }; - let material_id = instance_manager.get_material_id(material_id.untyped()); + let material_id = instance_manager.get_material_id(material_id); let pipeline_id = *cache.entry(view_key).or_insert_with(|| { pipeline_cache.queue_render_pipeline(pipeline_descriptor.clone()) diff --git a/crates/bevy_pbr/src/meshlet/mod.rs b/crates/bevy_pbr/src/meshlet/mod.rs index 2375894613..60cf680ac0 100644 --- a/crates/bevy_pbr/src/meshlet/mod.rs +++ b/crates/bevy_pbr/src/meshlet/mod.rs @@ -283,6 +283,10 @@ impl Plugin for MeshletPlugin { .in_set(RenderSystems::ManageViews), prepare_meshlet_per_frame_resources.in_set(RenderSystems::PrepareResources), prepare_meshlet_view_bind_groups.in_set(RenderSystems::PrepareBindGroups), + queue_material_meshlet_meshes.in_set(RenderSystems::QueueMeshes), + prepare_material_meshlet_meshes_main_opaque_pass + .in_set(RenderSystems::QueueMeshes) + .before(queue_material_meshlet_meshes), ), ); } diff --git a/crates/bevy_pbr/src/pbr_material.rs b/crates/bevy_pbr/src/pbr_material.rs index cbd8445483..0207a81ed0 100644 --- a/crates/bevy_pbr/src/pbr_material.rs +++ b/crates/bevy_pbr/src/pbr_material.rs @@ -1185,7 +1185,8 @@ impl AsBindGroupShaderType for StandardMaterial { bitflags! { /// The pipeline key for `StandardMaterial`, packed into 64 bits. - #[derive(Clone, Copy, PartialEq, Eq, Hash)] + #[repr(C)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, bytemuck::Pod, bytemuck::Zeroable)] pub struct StandardMaterialKey: u64 { const CULL_FRONT = 0x000001; const CULL_BACK = 0x000002; @@ -1404,7 +1405,7 @@ impl Material for StandardMaterial { } fn specialize( - _pipeline: &MaterialPipeline, + _pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, _layout: &MeshVertexBufferLayoutRef, key: MaterialPipelineKey, diff --git a/crates/bevy_pbr/src/prepass/mod.rs b/crates/bevy_pbr/src/prepass/mod.rs index 8732f92e82..13b44edbdd 100644 --- a/crates/bevy_pbr/src/prepass/mod.rs +++ b/crates/bevy_pbr/src/prepass/mod.rs @@ -2,12 +2,13 @@ mod prepass_bindings; use crate::{ alpha_mode_pipeline_key, binding_arrays_are_usable, buffer_layout, - collect_meshes_for_gpu_building, material_bind_groups::MaterialBindGroupAllocator, - queue_material_meshes, set_mesh_motion_vector_flags, setup_morph_and_skinning_defs, skin, - DrawMesh, EntitySpecializationTicks, Material, MaterialPipeline, MaterialPipelineKey, + collect_meshes_for_gpu_building, set_mesh_motion_vector_flags, setup_morph_and_skinning_defs, + skin, DeferredDrawFunction, DeferredFragmentShader, DeferredVertexShader, DrawMesh, + EntitySpecializationTicks, ErasedMaterialPipelineKey, MaterialPipeline, MaterialProperties, MeshLayouts, MeshPipeline, MeshPipelineKey, OpaqueRendererMethod, PreparedMaterial, - RenderLightmaps, RenderMaterialInstances, RenderMeshInstanceFlags, RenderMeshInstances, - RenderPhaseType, SetMaterialBindGroup, SetMeshBindGroup, ShadowView, StandardMaterial, + PrepassDrawFunction, PrepassFragmentShader, PrepassVertexShader, RenderLightmaps, + RenderMaterialInstances, RenderMeshInstanceFlags, RenderMeshInstances, RenderPhaseType, + SetMaterialBindGroup, SetMeshBindGroup, ShadowView, }; use bevy_app::{App, Plugin, PreUpdate}; use bevy_render::{ @@ -24,7 +25,7 @@ use bevy_render::{ }; pub use prepass_bindings::*; -use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer, Handle}; +use bevy_asset::{embedded_asset, load_embedded_asset, Handle}; use bevy_core_pipeline::{ core_3d::CORE_3D_DEPTH_FORMAT, deferred::*, prelude::Camera3d, prepass::*, }; @@ -55,30 +56,22 @@ use crate::meshlet::{ MeshletMesh3d, }; +use alloc::sync::Arc; use bevy_derive::{Deref, DerefMut}; use bevy_ecs::component::Tick; use bevy_ecs::system::SystemChangeTick; use bevy_platform::collections::HashMap; +use bevy_render::erased_render_asset::ErasedRenderAssets; use bevy_render::sync_world::MainEntityHashMap; use bevy_render::view::RenderVisibleEntities; use bevy_render::RenderSystems::{PrepareAssets, PrepareResources}; -use core::{hash::Hash, marker::PhantomData}; /// Sets up everything required to use the prepass pipeline. /// /// This does not add the actual prepasses, see [`PrepassPlugin`] for that. -pub struct PrepassPipelinePlugin(PhantomData); +pub struct PrepassPipelinePlugin; -impl Default for PrepassPipelinePlugin { - fn default() -> Self { - Self(Default::default()) - } -} - -impl Plugin for PrepassPipelinePlugin -where - M::Data: PartialEq + Eq + Hash + Clone, -{ +impl Plugin for PrepassPipelinePlugin { fn build(&self, app: &mut App) { embedded_asset!(app, "prepass.wgsl"); @@ -93,10 +86,9 @@ where render_app .add_systems( Render, - prepare_prepass_view_bind_group::.in_set(RenderSystems::PrepareBindGroups), + prepare_prepass_view_bind_group.in_set(RenderSystems::PrepareBindGroups), ) - .init_resource::>>() - .allow_ambiguous_resource::>>(); + .init_resource::>(); } fn finish(&self, app: &mut App) { @@ -105,34 +97,27 @@ where }; render_app - .init_resource::>() + .init_resource::() .init_resource::(); } } -/// Sets up the prepasses for a [`Material`]. +/// Sets up the prepasses for a material. /// /// This depends on the [`PrepassPipelinePlugin`]. -pub struct PrepassPlugin { +pub struct PrepassPlugin { /// Debugging flags that can optionally be set when constructing the renderer. pub debug_flags: RenderDebugFlags, - pub phantom: PhantomData, } -impl PrepassPlugin { +impl PrepassPlugin { /// Creates a new [`PrepassPlugin`] with the given debug flags. pub fn new(debug_flags: RenderDebugFlags) -> Self { - PrepassPlugin { - debug_flags, - phantom: PhantomData, - } + PrepassPlugin { debug_flags } } } -impl Plugin for PrepassPlugin -where - M::Data: PartialEq + Eq + Hash + Clone, -{ +impl Plugin for PrepassPlugin { fn build(&self, app: &mut App) { let no_prepass_plugin_loaded = app .world() @@ -174,36 +159,30 @@ where render_app .init_resource::() .init_resource::() - .init_resource::>() - .add_render_command::>() - .add_render_command::>() - .add_render_command::>() - .add_render_command::>() + .init_resource::() + .add_render_command::() + .add_render_command::() + .add_render_command::() + .add_render_command::() .add_systems( Render, ( check_prepass_views_need_specialization.in_set(PrepareAssets), - specialize_prepass_material_meshes:: + specialize_prepass_material_meshes .in_set(RenderSystems::PrepareMeshes) - .after(prepare_assets::>) .after(prepare_assets::) .after(collect_meshes_for_gpu_building) .after(set_mesh_motion_vector_flags), - queue_prepass_material_meshes:: - .in_set(RenderSystems::QueueMeshes) - .after(prepare_assets::>) - // queue_material_meshes only writes to `material_bind_group_id`, which `queue_prepass_material_meshes` doesn't read - .ambiguous_with(queue_material_meshes::), + queue_prepass_material_meshes.in_set(RenderSystems::QueueMeshes), ), ); #[cfg(feature = "meshlet")] render_app.add_systems( Render, - prepare_material_meshlet_meshes_prepass:: + prepare_material_meshlet_meshes_prepass .in_set(RenderSystems::QueueMeshes) - .after(prepare_assets::>) - .before(queue_material_meshlet_meshes::) + .before(queue_material_meshlet_meshes) .run_if(resource_exists::), ); } @@ -261,24 +240,20 @@ pub fn update_mesh_previous_global_transforms( } } -#[derive(Resource)] -pub struct PrepassPipeline { +#[derive(Resource, Clone)] +pub struct PrepassPipeline { pub internal: PrepassPipelineInternal, - pub material_pipeline: MaterialPipeline, + pub material_pipeline: MaterialPipeline, } /// Internal fields of the `PrepassPipeline` that don't need the generic bound /// This is done as an optimization to not recompile the same code multiple time +#[derive(Clone)] pub struct PrepassPipelineInternal { pub view_layout_motion_vectors: BindGroupLayout, pub view_layout_no_motion_vectors: BindGroupLayout, pub mesh_layouts: MeshLayouts, pub empty_layout: BindGroupLayout, - pub material_layout: BindGroupLayout, - pub prepass_material_vertex_shader: Option>, - pub prepass_material_fragment_shader: Option>, - pub deferred_material_vertex_shader: Option>, - pub deferred_material_fragment_shader: Option>, pub default_prepass_shader: Handle, /// Whether skins will use uniform buffers on account of storage buffers @@ -292,12 +267,10 @@ pub struct PrepassPipelineInternal { pub binding_arrays_are_usable: bool, } -impl FromWorld for PrepassPipeline { +impl FromWorld for PrepassPipeline { fn from_world(world: &mut World) -> Self { let render_device = world.resource::(); let render_adapter = world.resource::(); - let asset_server = world.resource::(); - let visibility_ranges_buffer_binding_type = render_device .get_supported_read_only_binding_type(VISIBILITY_RANGES_STORAGE_BUFFER_COUNT); @@ -358,28 +331,7 @@ impl FromWorld for PrepassPipeline { view_layout_motion_vectors, view_layout_no_motion_vectors, mesh_layouts: mesh_pipeline.mesh_layouts.clone(), - prepass_material_vertex_shader: match M::prepass_vertex_shader() { - ShaderRef::Default => None, - ShaderRef::Handle(handle) => Some(handle), - ShaderRef::Path(path) => Some(asset_server.load(path)), - }, - prepass_material_fragment_shader: match M::prepass_fragment_shader() { - ShaderRef::Default => None, - ShaderRef::Handle(handle) => Some(handle), - ShaderRef::Path(path) => Some(asset_server.load(path)), - }, - deferred_material_vertex_shader: match M::deferred_vertex_shader() { - ShaderRef::Default => None, - ShaderRef::Handle(handle) => Some(handle), - ShaderRef::Path(path) => Some(asset_server.load(path)), - }, - deferred_material_fragment_shader: match M::deferred_fragment_shader() { - ShaderRef::Default => None, - ShaderRef::Handle(handle) => Some(handle), - ShaderRef::Path(path) => Some(asset_server.load(path)), - }, default_prepass_shader: load_embedded_asset!(world, "prepass.wgsl"), - material_layout: M::bind_group_layout(render_device), skins_use_uniform_buffers: skin::skins_use_uniform_buffers(render_device), depth_clip_control_supported, binding_arrays_are_usable: binding_arrays_are_usable(render_device, render_adapter), @@ -387,16 +339,18 @@ impl FromWorld for PrepassPipeline { }; PrepassPipeline { internal, - material_pipeline: world.resource::>().clone(), + material_pipeline: world.resource::().clone(), } } } -impl SpecializedMeshPipeline for PrepassPipeline -where - M::Data: PartialEq + Eq + Hash + Clone, -{ - type Key = MaterialPipelineKey; +pub struct PrepassPipelineSpecializer { + pub(crate) pipeline: PrepassPipeline, + pub(crate) properties: Arc, +} + +impl SpecializedMeshPipeline for PrepassPipelineSpecializer { + type Key = ErasedMaterialPipelineKey; fn specialize( &self, @@ -404,17 +358,27 @@ where layout: &MeshVertexBufferLayoutRef, ) -> Result { let mut shader_defs = Vec::new(); - if self.material_pipeline.bindless { + if self.properties.bindless { shader_defs.push("BINDLESS".into()); } - let mut descriptor = self - .internal - .specialize(key.mesh_key, shader_defs, layout)?; + let mut descriptor = self.pipeline.internal.specialize( + key.mesh_key, + shader_defs, + layout, + &self.properties, + )?; // This is a bit risky because it's possible to change something that would // break the prepass but be fine in the main pass. // Since this api is pretty low-level it doesn't matter that much, but it is a potential issue. - M::specialize(&self.material_pipeline, &mut descriptor, layout, key)?; + if let Some(specialize) = self.properties.specialize { + specialize( + &self.pipeline.material_pipeline, + &mut descriptor, + layout, + key, + )?; + } Ok(descriptor) } @@ -426,6 +390,7 @@ impl PrepassPipelineInternal { mesh_key: MeshPipelineKey, shader_defs: Vec, layout: &MeshVertexBufferLayoutRef, + material_properties: &MaterialProperties, ) -> Result { let mut shader_defs = shader_defs; let mut bind_group_layouts = vec![ @@ -445,7 +410,13 @@ impl PrepassPipelineInternal { // NOTE: Eventually, it would be nice to only add this when the shaders are overloaded by the Material. // The main limitation right now is that bind group order is hardcoded in shaders. - bind_group_layouts.push(self.material_layout.clone()); + bind_group_layouts.push( + material_properties + .material_layout + .as_ref() + .unwrap() + .clone(), + ); #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] shader_defs.push("WEBGL2".into()); shader_defs.push("VERTEX_OUTPUT_INSTANCE_INDEX".into()); @@ -581,17 +552,28 @@ impl PrepassPipelineInternal { let fragment_required = !targets.is_empty() || emulate_unclipped_depth || (mesh_key.contains(MeshPipelineKey::MAY_DISCARD) - && self.prepass_material_fragment_shader.is_some()); + && material_properties + .shaders + .get(&PrepassFragmentShader.intern()) + .is_some()); let fragment = fragment_required.then(|| { // Use the fragment shader from the material let frag_shader_handle = if mesh_key.contains(MeshPipelineKey::DEFERRED_PREPASS) { - match self.deferred_material_fragment_shader.clone() { + match material_properties + .shaders + .get(&DeferredFragmentShader.intern()) + .cloned() + { Some(frag_shader_handle) => frag_shader_handle, None => self.default_prepass_shader.clone(), } } else { - match self.prepass_material_fragment_shader.clone() { + match material_properties + .shaders + .get(&PrepassFragmentShader.intern()) + .cloned() + { Some(frag_shader_handle) => frag_shader_handle, None => self.default_prepass_shader.clone(), } @@ -607,13 +589,13 @@ impl PrepassPipelineInternal { // Use the vertex shader from the material if present let vert_shader_handle = if mesh_key.contains(MeshPipelineKey::DEFERRED_PREPASS) { - if let Some(handle) = &self.deferred_material_vertex_shader { - handle.clone() + if let Some(handle) = material_properties.get_shader(DeferredVertexShader) { + handle } else { self.default_prepass_shader.clone() } - } else if let Some(handle) = &self.prepass_material_vertex_shader { - handle.clone() + } else if let Some(handle) = material_properties.get_shader(PrepassVertexShader) { + handle } else { self.default_prepass_shader.clone() }; @@ -736,7 +718,7 @@ pub struct PrepassViewBindGroup { impl FromWorld for PrepassViewBindGroup { fn from_world(world: &mut World) -> Self { - let pipeline = world.resource::>(); + let pipeline = world.resource::(); let render_device = world.resource::(); let empty_bind_group = render_device.create_bind_group( @@ -752,9 +734,9 @@ impl FromWorld for PrepassViewBindGroup { } } -pub fn prepare_prepass_view_bind_group( +pub fn prepare_prepass_view_bind_group( render_device: Res, - prepass_pipeline: Res>, + prepass_pipeline: Res, view_uniforms: Res, globals_buffer: Res, previous_view_uniforms: Res, @@ -792,40 +774,20 @@ pub fn prepare_prepass_view_bind_group( } /// Stores the [`SpecializedPrepassMaterialViewPipelineCache`] for each view. -#[derive(Resource, Deref, DerefMut)] -pub struct SpecializedPrepassMaterialPipelineCache { +#[derive(Resource, Deref, DerefMut, Default)] +pub struct SpecializedPrepassMaterialPipelineCache { // view_entity -> view pipeline cache #[deref] - map: HashMap>, - marker: PhantomData, + map: HashMap, } /// Stores the cached render pipeline ID for each entity in a single view, as /// well as the last time it was changed. -#[derive(Deref, DerefMut)] -pub struct SpecializedPrepassMaterialViewPipelineCache { +#[derive(Deref, DerefMut, Default)] +pub struct SpecializedPrepassMaterialViewPipelineCache { // material entity -> (tick, pipeline_id) #[deref] map: MainEntityHashMap<(Tick, CachedRenderPipelineId)>, - marker: PhantomData, -} - -impl Default for SpecializedPrepassMaterialPipelineCache { - fn default() -> Self { - Self { - map: HashMap::default(), - marker: PhantomData, - } - } -} - -impl Default for SpecializedPrepassMaterialViewPipelineCache { - fn default() -> Self { - Self { - map: HashMap::default(), - marker: PhantomData, - } - } } #[derive(Resource, Deref, DerefMut, Default, Clone)] @@ -870,14 +832,13 @@ pub fn check_prepass_views_need_specialization( } } -pub fn specialize_prepass_material_meshes( +pub fn specialize_prepass_material_meshes( render_meshes: Res>, - render_materials: Res>>, + render_materials: Res>, render_mesh_instances: Res, render_material_instances: Res, render_lightmaps: Res, render_visibility_ranges: Res, - material_bind_group_allocator: Res>, view_key_cache: Res, views: Query<( &ExtractedView, @@ -906,18 +867,15 @@ pub fn specialize_prepass_material_meshes( view_specialization_ticks, entity_specialization_ticks, ): ( - ResMut>, + ResMut, SystemChangeTick, - Res>, - ResMut>>, + Res, + ResMut>, Res, Res, - Res>, + Res, ), -) where - M: Material, - M::Data: PartialEq + Eq + Hash + Clone, -{ +) { for (extracted_view, visible_entities, msaa, motion_vector_prepass, deferred_prepass) in &views { if !opaque_deferred_render_phases.contains_key(&extracted_view.retained_view_entity) @@ -944,9 +902,6 @@ pub fn specialize_prepass_material_meshes( else { continue; }; - let Ok(material_asset_id) = material_instance.asset_id.try_typed::() else { - continue; - }; let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity) else { continue; @@ -962,13 +917,7 @@ pub fn specialize_prepass_material_meshes( if !needs_specialization { continue; } - let Some(material) = render_materials.get(material_asset_id) else { - continue; - }; - let Some(material_bind_group) = - material_bind_group_allocator.get(material.binding.group) - else { - warn!("Couldn't get bind group for material"); + let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id) else { @@ -1045,15 +994,19 @@ pub fn specialize_prepass_material_meshes( } } + let erased_key = ErasedMaterialPipelineKey { + mesh_key, + material_key: material.properties.material_key.clone(), + type_id: material_instance.asset_id.type_id(), + }; + let prepass_pipeline_specializer = PrepassPipelineSpecializer { + pipeline: prepass_pipeline.clone(), + properties: material.properties.clone(), + }; let pipeline_id = pipelines.specialize( &pipeline_cache, - &prepass_pipeline, - MaterialPipelineKey { - mesh_key, - bind_group_data: material_bind_group - .get_extra_data(material.binding.slot) - .clone(), - }, + &prepass_pipeline_specializer, + erased_key, &mesh.layout, ); let pipeline_id = match pipeline_id { @@ -1070,9 +1023,9 @@ pub fn specialize_prepass_material_meshes( } } -pub fn queue_prepass_material_meshes( +pub fn queue_prepass_material_meshes( render_mesh_instances: Res, - render_materials: Res>>, + render_materials: Res>, render_material_instances: Res, mesh_allocator: Res, gpu_preprocessing_support: Res, @@ -1081,10 +1034,8 @@ pub fn queue_prepass_material_meshes( mut opaque_deferred_render_phases: ResMut>, mut alpha_mask_deferred_render_phases: ResMut>, views: Query<(&ExtractedView, &RenderVisibleEntities)>, - specialized_material_pipeline_cache: Res>, -) where - M::Data: PartialEq + Eq + Hash + Clone, -{ + specialized_material_pipeline_cache: Res, +) { for (extracted_view, visible_entities) in &views { let ( mut opaque_phase, @@ -1137,14 +1088,11 @@ pub fn queue_prepass_material_meshes( else { continue; }; - let Ok(material_asset_id) = material_instance.asset_id.try_typed::() else { - continue; - }; let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(*visible_entity) else { continue; }; - let Some(material) = render_materials.get(material_asset_id) else { + let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; let (vertex_slab, index_slab) = mesh_allocator.mesh_slabs(&mesh_instance.mesh_asset_id); @@ -1162,7 +1110,7 @@ pub fn queue_prepass_material_meshes( OpaqueNoLightmap3dBatchSetKey { draw_function: material .properties - .deferred_draw_function_id + .get_draw_function(DeferredDrawFunction) .unwrap(), pipeline: *pipeline_id, material_bind_group_index: Some(material.binding.group.0), @@ -1187,7 +1135,7 @@ pub fn queue_prepass_material_meshes( OpaqueNoLightmap3dBatchSetKey { draw_function: material .properties - .prepass_draw_function_id + .get_draw_function(PrepassDrawFunction) .unwrap(), pipeline: *pipeline_id, material_bind_group_index: Some(material.binding.group.0), @@ -1212,7 +1160,10 @@ pub fn queue_prepass_material_meshes( let (vertex_slab, index_slab) = mesh_allocator.mesh_slabs(&mesh_instance.mesh_asset_id); let batch_set_key = OpaqueNoLightmap3dBatchSetKey { - draw_function: material.properties.deferred_draw_function_id.unwrap(), + draw_function: material + .properties + .get_draw_function(DeferredDrawFunction) + .unwrap(), pipeline: *pipeline_id, material_bind_group_index: Some(material.binding.group.0), vertex_slab: vertex_slab.unwrap_or_default(), @@ -1236,7 +1187,10 @@ pub fn queue_prepass_material_meshes( let (vertex_slab, index_slab) = mesh_allocator.mesh_slabs(&mesh_instance.mesh_asset_id); let batch_set_key = OpaqueNoLightmap3dBatchSetKey { - draw_function: material.properties.prepass_draw_function_id.unwrap(), + draw_function: material + .properties + .get_draw_function(PrepassDrawFunction) + .unwrap(), pipeline: *pipeline_id, material_bind_group_index: Some(material.binding.group.0), vertex_slab: vertex_slab.unwrap_or_default(), @@ -1331,11 +1285,11 @@ impl RenderCommand

for SetPrepassViewEmptyBindG } } -pub type DrawPrepass = ( +pub type DrawPrepass = ( SetItemPipeline, SetPrepassViewBindGroup<0>, SetPrepassViewEmptyBindGroup<1>, SetMeshBindGroup<2>, - SetMaterialBindGroup, + SetMaterialBindGroup<3>, DrawMesh, ); diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 83d28a7da7..ddf9d831f0 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -1,5 +1,4 @@ use self::assign::ClusterableObjectType; -use crate::material_bind_groups::MaterialBindGroupAllocator; use crate::*; use bevy_asset::UntypedAssetId; use bevy_color::ColorToComponents; @@ -15,6 +14,7 @@ use bevy_ecs::{ use bevy_math::{ops, Mat4, UVec4, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; use bevy_platform::collections::{HashMap, HashSet}; use bevy_platform::hash::FixedHasher; +use bevy_render::erased_render_asset::ErasedRenderAssets; use bevy_render::experimental::occlusion_culling::{ OcclusionCulling, OcclusionCullingSubview, OcclusionCullingSubviewEntities, }; @@ -44,7 +44,7 @@ use bevy_render::{ }; use bevy_transform::{components::GlobalTransform, prelude::Transform}; use bevy_utils::default; -use core::{hash::Hash, marker::PhantomData, ops::Range}; +use core::{hash::Hash, ops::Range}; #[cfg(feature = "trace")] use tracing::info_span; use tracing::{error, warn}; @@ -1717,37 +1717,17 @@ pub struct LightKeyCache(HashMap); #[derive(Resource, Deref, DerefMut, Default, Debug, Clone)] pub struct LightSpecializationTicks(HashMap); -#[derive(Resource, Deref, DerefMut)] -pub struct SpecializedShadowMaterialPipelineCache { +#[derive(Resource, Deref, DerefMut, Default)] +pub struct SpecializedShadowMaterialPipelineCache { // view light entity -> view pipeline cache #[deref] - map: HashMap>, - marker: PhantomData, + map: HashMap, } -#[derive(Deref, DerefMut)] -pub struct SpecializedShadowMaterialViewPipelineCache { +#[derive(Deref, DerefMut, Default)] +pub struct SpecializedShadowMaterialViewPipelineCache { #[deref] map: MainEntityHashMap<(Tick, CachedRenderPipelineId)>, - marker: PhantomData, -} - -impl Default for SpecializedShadowMaterialPipelineCache { - fn default() -> Self { - Self { - map: HashMap::default(), - marker: PhantomData, - } - } -} - -impl Default for SpecializedShadowMaterialViewPipelineCache { - fn default() -> Self { - Self { - map: MainEntityHashMap::default(), - marker: PhantomData, - } - } } pub fn check_views_lights_need_specialization( @@ -1789,23 +1769,16 @@ pub fn check_views_lights_need_specialization( } } -pub fn specialize_shadows( - prepass_pipeline: Res>, - ( - render_meshes, - render_mesh_instances, - render_materials, - render_material_instances, - material_bind_group_allocator, - ): ( +pub fn specialize_shadows( + prepass_pipeline: Res, + (render_meshes, render_mesh_instances, render_materials, render_material_instances): ( Res>, Res, - Res>>, + Res>, Res, - Res>, ), shadow_render_phases: Res>, - mut pipelines: ResMut>>, + mut pipelines: ResMut>, pipeline_cache: Res, render_lightmaps: Res, view_lights: Query<(Entity, &ViewLightEntities), With>, @@ -1817,13 +1790,11 @@ pub fn specialize_shadows( >, spot_light_entities: Query<&RenderVisibleMeshEntities, With>, light_key_cache: Res, - mut specialized_material_pipeline_cache: ResMut>, + mut specialized_material_pipeline_cache: ResMut, light_specialization_ticks: Res, - entity_specialization_ticks: Res>, + entity_specialization_ticks: Res, ticks: SystemChangeTick, -) where - M::Data: PartialEq + Eq + Hash + Clone, -{ +) { // Record the retained IDs of all shadow views so that we can expire old // pipeline IDs. let mut all_shadow_views: HashSet = HashSet::default(); @@ -1881,14 +1852,12 @@ pub fn specialize_shadows( .or_default(); for (_, visible_entity) in visible_entities.iter().copied() { - let Some(material_instances) = + let Some(material_instance) = render_material_instances.instances.get(&visible_entity) else { continue; }; - let Ok(material_asset_id) = material_instances.asset_id.try_typed::() else { - continue; - }; + let Some(mesh_instance) = render_mesh_instances.render_mesh_queue_data(visible_entity) else { @@ -1905,7 +1874,7 @@ pub fn specialize_shadows( if !needs_specialization { continue; } - let Some(material) = render_materials.get(material_asset_id) else { + let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; if !mesh_instance @@ -1914,11 +1883,6 @@ pub fn specialize_shadows( { continue; } - let Some(material_bind_group) = - material_bind_group_allocator.get(material.binding.group) - else { - continue; - }; let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id) else { continue; }; @@ -1946,18 +1910,21 @@ pub fn specialize_shadows( | AlphaMode::AlphaToCoverage => MeshPipelineKey::MAY_DISCARD, _ => MeshPipelineKey::NONE, }; + let erased_key = ErasedMaterialPipelineKey { + mesh_key, + material_key: material.properties.material_key.clone(), + type_id: material_instance.asset_id.type_id(), + }; + let material_pipeline_specializer = PrepassPipelineSpecializer { + pipeline: prepass_pipeline.clone(), + properties: material.properties.clone(), + }; let pipeline_id = pipelines.specialize( &pipeline_cache, - &prepass_pipeline, - MaterialPipelineKey { - mesh_key, - bind_group_data: material_bind_group - .get_extra_data(material.binding.slot) - .clone(), - }, + &material_pipeline_specializer, + erased_key, &mesh.layout, ); - let pipeline_id = match pipeline_id { Ok(id) => id, Err(err) => { @@ -1979,10 +1946,9 @@ pub fn specialize_shadows( /// For each shadow cascade, iterates over all the meshes "visible" from it and /// adds them to [`BinnedRenderPhase`]s or [`SortedRenderPhase`]s as /// appropriate. -pub fn queue_shadows( - shadow_draw_functions: Res>, +pub fn queue_shadows( render_mesh_instances: Res, - render_materials: Res>>, + render_materials: Res>, render_material_instances: Res, mut shadow_render_phases: ResMut>, gpu_preprocessing_support: Res, @@ -1995,11 +1961,8 @@ pub fn queue_shadows( With, >, spot_light_entities: Query<&RenderVisibleMeshEntities, With>, - specialized_material_pipeline_cache: Res>, -) where - M::Data: PartialEq + Eq + Hash + Clone, -{ - let draw_shadow_mesh = shadow_draw_functions.read().id::>(); + specialized_material_pipeline_cache: Res, +) { for (entity, view_lights) in &view_lights { for view_light_entity in view_lights.lights.iter().copied() { let Ok((light_entity, extracted_view_light)) = @@ -2070,10 +2033,12 @@ pub fn queue_shadows( else { continue; }; - let Ok(material_asset_id) = material_instance.asset_id.try_typed::() else { + let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; - let Some(material) = render_materials.get(material_asset_id) else { + let Some(draw_function) = + material.properties.get_draw_function(ShadowsDrawFunction) + else { continue; }; @@ -2082,7 +2047,7 @@ pub fn queue_shadows( let batch_set_key = ShadowBatchSetKey { pipeline: *pipeline_id, - draw_function: draw_shadow_mesh, + draw_function, material_bind_group_index: Some(material.binding.group.0), vertex_slab: vertex_slab.unwrap_or_default(), index_slab, diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 50d7e98a48..fa30a2e5a8 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -2039,7 +2039,7 @@ impl GetFullBatchData for MeshPipeline { } bitflags::bitflags! { - #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] + #[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)] #[repr(transparent)] // NOTE: Apparently quadro drivers support up to 64x MSAA. /// MSAA uses the highest 3 bits for the MSAA log2(sample count) to support up to 128x MSAA. diff --git a/crates/bevy_render/macros/src/as_bind_group.rs b/crates/bevy_render/macros/src/as_bind_group.rs index 7bac6796ac..b426088e22 100644 --- a/crates/bevy_render/macros/src/as_bind_group.rs +++ b/crates/bevy_render/macros/src/as_bind_group.rs @@ -1061,17 +1061,21 @@ pub fn derive_as_bind_group(ast: syn::DeriveInput) -> Result { render_device: &#render_path::renderer::RenderDevice, (images, fallback_image, storage_buffers): &mut #ecs_path::system::SystemParamItem<'_, '_, Self::Param>, force_no_bindless: bool, - ) -> Result<#render_path::render_resource::UnpreparedBindGroup, #render_path::render_resource::AsBindGroupError> { + ) -> Result<#render_path::render_resource::UnpreparedBindGroup, #render_path::render_resource::AsBindGroupError> { #uniform_binding_type_declarations let bindings = #render_path::render_resource::BindingResources(vec![#(#binding_impls,)*]); Ok(#render_path::render_resource::UnpreparedBindGroup { bindings, - data: #get_prepared_data, }) } + #[allow(clippy::unused_unit)] + fn bind_group_data(&self) -> Self::Data { + #get_prepared_data + } + fn bind_group_layout_entries( render_device: &#render_path::renderer::RenderDevice, force_no_bindless: bool diff --git a/crates/bevy_render/macros/src/lib.rs b/crates/bevy_render/macros/src/lib.rs index 75cbdfa959..c58a8fd146 100644 --- a/crates/bevy_render/macros/src/lib.rs +++ b/crates/bevy_render/macros/src/lib.rs @@ -101,3 +101,29 @@ pub fn derive_render_sub_graph(input: TokenStream) -> TokenStream { .push(format_ident!("RenderSubGraph").into()); derive_label(input, "RenderSubGraph", &trait_path) } + +#[proc_macro_derive(ShaderLabel)] +pub fn derive_shader_label(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + let mut trait_path = bevy_render_path(); + trait_path + .segments + .push(format_ident!("render_phase").into()); + trait_path + .segments + .push(format_ident!("ShaderLabel").into()); + derive_label(input, "ShaderLabel", &trait_path) +} + +#[proc_macro_derive(DrawFunctionLabel)] +pub fn derive_draw_function_label(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + let mut trait_path = bevy_render_path(); + trait_path + .segments + .push(format_ident!("render_phase").into()); + trait_path + .segments + .push(format_ident!("DrawFunctionLabel").into()); + derive_label(input, "DrawFunctionLabel", &trait_path) +} diff --git a/crates/bevy_render/src/erased_render_asset.rs b/crates/bevy_render/src/erased_render_asset.rs new file mode 100644 index 0000000000..ac2423990b --- /dev/null +++ b/crates/bevy_render/src/erased_render_asset.rs @@ -0,0 +1,431 @@ +use crate::{ + render_resource::AsBindGroupError, ExtractSchedule, MainWorld, Render, RenderApp, + RenderSystems, Res, +}; +use bevy_app::{App, Plugin, SubApp}; +pub use bevy_asset::RenderAssetUsages; +use bevy_asset::{Asset, AssetEvent, AssetId, Assets, UntypedAssetId}; +use bevy_ecs::{ + prelude::{Commands, EventReader, IntoScheduleConfigs, ResMut, Resource}, + schedule::{ScheduleConfigs, SystemSet}, + system::{ScheduleSystem, StaticSystemParam, SystemParam, SystemParamItem, SystemState}, + world::{FromWorld, Mut}, +}; +use bevy_platform::collections::{HashMap, HashSet}; +use bevy_render::render_asset::RenderAssetBytesPerFrameLimiter; +use core::marker::PhantomData; +use thiserror::Error; +use tracing::{debug, error}; + +#[derive(Debug, Error)] +pub enum PrepareAssetError { + #[error("Failed to prepare asset")] + RetryNextUpdate(E), + #[error("Failed to build bind group: {0}")] + AsBindGroupError(AsBindGroupError), +} + +/// The system set during which we extract modified assets to the render world. +#[derive(SystemSet, Clone, PartialEq, Eq, Debug, Hash)] +pub struct AssetExtractionSystems; + +/// Deprecated alias for [`AssetExtractionSystems`]. +#[deprecated(since = "0.17.0", note = "Renamed to `AssetExtractionSystems`.")] +pub type ExtractAssetsSet = AssetExtractionSystems; + +/// Describes how an asset gets extracted and prepared for rendering. +/// +/// In the [`ExtractSchedule`] step the [`ErasedRenderAsset::SourceAsset`] is transferred +/// from the "main world" into the "render world". +/// +/// After that in the [`RenderSystems::PrepareAssets`] step the extracted asset +/// is transformed into its GPU-representation of type [`ErasedRenderAsset`]. +pub trait ErasedRenderAsset: Send + Sync + 'static { + /// The representation of the asset in the "main world". + type SourceAsset: Asset + Clone; + /// The target representation of the asset in the "render world". + type ErasedAsset: Send + Sync + 'static + Sized; + + /// Specifies all ECS data required by [`ErasedRenderAsset::prepare_asset`]. + /// + /// For convenience use the [`lifetimeless`](bevy_ecs::system::lifetimeless) [`SystemParam`]. + type Param: SystemParam; + + /// Whether or not to unload the asset after extracting it to the render world. + #[inline] + fn asset_usage(_source_asset: &Self::SourceAsset) -> RenderAssetUsages { + RenderAssetUsages::default() + } + + /// Size of the data the asset will upload to the gpu. Specifying a return value + /// will allow the asset to be throttled via [`RenderAssetBytesPerFrameLimiter`]. + #[inline] + #[expect( + unused_variables, + reason = "The parameters here are intentionally unused by the default implementation; however, putting underscores here will result in the underscores being copied by rust-analyzer's tab completion." + )] + fn byte_len(erased_asset: &Self::SourceAsset) -> Option { + None + } + + /// Prepares the [`ErasedRenderAsset::SourceAsset`] for the GPU by transforming it into a [`ErasedRenderAsset`]. + /// + /// ECS data may be accessed via `param`. + fn prepare_asset( + source_asset: Self::SourceAsset, + asset_id: AssetId, + param: &mut SystemParamItem, + ) -> Result>; + + /// Called whenever the [`ErasedRenderAsset::SourceAsset`] has been removed. + /// + /// You can implement this method if you need to access ECS data (via + /// `_param`) in order to perform cleanup tasks when the asset is removed. + /// + /// The default implementation does nothing. + fn unload_asset( + _source_asset: AssetId, + _param: &mut SystemParamItem, + ) { + } +} + +/// This plugin extracts the changed assets from the "app world" into the "render world" +/// and prepares them for the GPU. They can then be accessed from the [`ErasedRenderAssets`] resource. +/// +/// Therefore it sets up the [`ExtractSchedule`] and +/// [`RenderSystems::PrepareAssets`] steps for the specified [`ErasedRenderAsset`]. +/// +/// The `AFTER` generic parameter can be used to specify that `A::prepare_asset` should not be run until +/// `prepare_assets::` has completed. This allows the `prepare_asset` function to depend on another +/// prepared [`ErasedRenderAsset`], for example `Mesh::prepare_asset` relies on `ErasedRenderAssets::` for morph +/// targets, so the plugin is created as `ErasedRenderAssetPlugin::::default()`. +pub struct ErasedRenderAssetPlugin< + A: ErasedRenderAsset, + AFTER: ErasedRenderAssetDependency + 'static = (), +> { + phantom: PhantomData (A, AFTER)>, +} + +impl Default + for ErasedRenderAssetPlugin +{ + fn default() -> Self { + Self { + phantom: Default::default(), + } + } +} + +impl Plugin + for ErasedRenderAssetPlugin +{ + fn build(&self, app: &mut App) { + app.init_resource::>(); + } + + fn finish(&self, app: &mut App) { + if let Some(render_app) = app.get_sub_app_mut(RenderApp) { + render_app + .init_resource::>() + .init_resource::>() + .init_resource::>() + .add_systems( + ExtractSchedule, + extract_erased_render_asset::.in_set(AssetExtractionSystems), + ); + AFTER::register_system( + render_app, + prepare_erased_assets::.in_set(RenderSystems::PrepareAssets), + ); + } + } +} + +// helper to allow specifying dependencies between render assets +pub trait ErasedRenderAssetDependency { + fn register_system(render_app: &mut SubApp, system: ScheduleConfigs); +} + +impl ErasedRenderAssetDependency for () { + fn register_system(render_app: &mut SubApp, system: ScheduleConfigs) { + render_app.add_systems(Render, system); + } +} + +impl ErasedRenderAssetDependency for A { + fn register_system(render_app: &mut SubApp, system: ScheduleConfigs) { + render_app.add_systems(Render, system.after(prepare_erased_assets::)); + } +} + +/// Temporarily stores the extracted and removed assets of the current frame. +#[derive(Resource)] +pub struct ExtractedAssets { + /// The assets extracted this frame. + /// + /// These are assets that were either added or modified this frame. + pub extracted: Vec<(AssetId, A::SourceAsset)>, + + /// IDs of the assets that were removed this frame. + /// + /// These assets will not be present in [`ExtractedAssets::extracted`]. + pub removed: HashSet>, + + /// IDs of the assets that were modified this frame. + pub modified: HashSet>, + + /// IDs of the assets that were added this frame. + pub added: HashSet>, +} + +impl Default for ExtractedAssets { + fn default() -> Self { + Self { + extracted: Default::default(), + removed: Default::default(), + modified: Default::default(), + added: Default::default(), + } + } +} + +/// Stores all GPU representations ([`ErasedRenderAsset`]) +/// of [`ErasedRenderAsset::SourceAsset`] as long as they exist. +#[derive(Resource)] +pub struct ErasedRenderAssets(HashMap); + +impl Default for ErasedRenderAssets { + fn default() -> Self { + Self(Default::default()) + } +} + +impl ErasedRenderAssets { + pub fn get(&self, id: impl Into) -> Option<&ERA> { + self.0.get(&id.into()) + } + + pub fn get_mut(&mut self, id: impl Into) -> Option<&mut ERA> { + self.0.get_mut(&id.into()) + } + + pub fn insert(&mut self, id: impl Into, value: ERA) -> Option { + self.0.insert(id.into(), value) + } + + pub fn remove(&mut self, id: impl Into) -> Option { + self.0.remove(&id.into()) + } + + pub fn iter(&self) -> impl Iterator { + self.0.iter().map(|(k, v)| (*k, v)) + } + + pub fn iter_mut(&mut self) -> impl Iterator { + self.0.iter_mut().map(|(k, v)| (*k, v)) + } +} + +#[derive(Resource)] +struct CachedExtractErasedRenderAssetSystemState { + state: SystemState<( + EventReader<'static, 'static, AssetEvent>, + ResMut<'static, Assets>, + )>, +} + +impl FromWorld for CachedExtractErasedRenderAssetSystemState { + fn from_world(world: &mut bevy_ecs::world::World) -> Self { + Self { + state: SystemState::new(world), + } + } +} + +/// This system extracts all created or modified assets of the corresponding [`ErasedRenderAsset::SourceAsset`] type +/// into the "render world". +pub(crate) fn extract_erased_render_asset( + mut commands: Commands, + mut main_world: ResMut, +) { + main_world.resource_scope( + |world, mut cached_state: Mut>| { + let (mut events, mut assets) = cached_state.state.get_mut(world); + + let mut needs_extracting = >::default(); + let mut removed = >::default(); + let mut modified = >::default(); + + for event in events.read() { + #[expect( + clippy::match_same_arms, + reason = "LoadedWithDependencies is marked as a TODO, so it's likely this will no longer lint soon." + )] + match event { + AssetEvent::Added { id } => { + needs_extracting.insert(*id); + } + AssetEvent::Modified { id } => { + needs_extracting.insert(*id); + modified.insert(*id); + } + AssetEvent::Removed { .. } => { + // We don't care that the asset was removed from Assets in the main world. + // An asset is only removed from ErasedRenderAssets when its last handle is dropped (AssetEvent::Unused). + } + AssetEvent::Unused { id } => { + needs_extracting.remove(id); + modified.remove(id); + removed.insert(*id); + } + AssetEvent::LoadedWithDependencies { .. } => { + // TODO: handle this + } + } + } + + let mut extracted_assets = Vec::new(); + let mut added = >::default(); + for id in needs_extracting.drain() { + if let Some(asset) = assets.get(id) { + let asset_usage = A::asset_usage(asset); + if asset_usage.contains(RenderAssetUsages::RENDER_WORLD) { + if asset_usage == RenderAssetUsages::RENDER_WORLD { + if let Some(asset) = assets.remove(id) { + extracted_assets.push((id, asset)); + added.insert(id); + } + } else { + extracted_assets.push((id, asset.clone())); + added.insert(id); + } + } + } + } + + commands.insert_resource(ExtractedAssets:: { + extracted: extracted_assets, + removed, + modified, + added, + }); + cached_state.state.apply(world); + }, + ); +} + +// TODO: consider storing inside system? +/// All assets that should be prepared next frame. +#[derive(Resource)] +pub struct PrepareNextFrameAssets { + assets: Vec<(AssetId, A::SourceAsset)>, +} + +impl Default for PrepareNextFrameAssets { + fn default() -> Self { + Self { + assets: Default::default(), + } + } +} + +/// This system prepares all assets of the corresponding [`ErasedRenderAsset::SourceAsset`] type +/// which where extracted this frame for the GPU. +pub fn prepare_erased_assets( + mut extracted_assets: ResMut>, + mut render_assets: ResMut>, + mut prepare_next_frame: ResMut>, + param: StaticSystemParam<::Param>, + bpf: Res, +) { + let mut wrote_asset_count = 0; + + let mut param = param.into_inner(); + let queued_assets = core::mem::take(&mut prepare_next_frame.assets); + for (id, extracted_asset) in queued_assets { + if extracted_assets.removed.contains(&id) || extracted_assets.added.contains(&id) { + // skip previous frame's assets that have been removed or updated + continue; + } + + let write_bytes = if let Some(size) = A::byte_len(&extracted_asset) { + // we could check if available bytes > byte_len here, but we want to make some + // forward progress even if the asset is larger than the max bytes per frame. + // this way we always write at least one (sized) asset per frame. + // in future we could also consider partial asset uploads. + if bpf.exhausted() { + prepare_next_frame.assets.push((id, extracted_asset)); + continue; + } + size + } else { + 0 + }; + + match A::prepare_asset(extracted_asset, id, &mut param) { + Ok(prepared_asset) => { + render_assets.insert(id, prepared_asset); + bpf.write_bytes(write_bytes); + wrote_asset_count += 1; + } + Err(PrepareAssetError::RetryNextUpdate(extracted_asset)) => { + prepare_next_frame.assets.push((id, extracted_asset)); + } + Err(PrepareAssetError::AsBindGroupError(e)) => { + error!( + "{} Bind group construction failed: {e}", + core::any::type_name::() + ); + } + } + } + + for removed in extracted_assets.removed.drain() { + render_assets.remove(removed); + A::unload_asset(removed, &mut param); + } + + for (id, extracted_asset) in extracted_assets.extracted.drain(..) { + // we remove previous here to ensure that if we are updating the asset then + // any users will not see the old asset after a new asset is extracted, + // even if the new asset is not yet ready or we are out of bytes to write. + render_assets.remove(id); + + let write_bytes = if let Some(size) = A::byte_len(&extracted_asset) { + if bpf.exhausted() { + prepare_next_frame.assets.push((id, extracted_asset)); + continue; + } + size + } else { + 0 + }; + + match A::prepare_asset(extracted_asset, id, &mut param) { + Ok(prepared_asset) => { + render_assets.insert(id, prepared_asset); + bpf.write_bytes(write_bytes); + wrote_asset_count += 1; + } + Err(PrepareAssetError::RetryNextUpdate(extracted_asset)) => { + prepare_next_frame.assets.push((id, extracted_asset)); + } + Err(PrepareAssetError::AsBindGroupError(e)) => { + error!( + "{} Bind group construction failed: {e}", + core::any::type_name::() + ); + } + } + } + + if bpf.exhausted() && !prepare_next_frame.assets.is_empty() { + debug!( + "{} write budget exhausted with {} assets remaining (wrote {})", + core::any::type_name::(), + prepare_next_frame.assets.len(), + wrote_asset_count + ); + } +} diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index aa1e2da676..8bf7f41195 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -26,6 +26,7 @@ pub mod alpha; pub mod batching; pub mod camera; pub mod diagnostic; +pub mod erased_render_asset; pub mod experimental; pub mod extract_component; pub mod extract_instances; diff --git a/crates/bevy_render/src/render_asset.rs b/crates/bevy_render/src/render_asset.rs index 0a5ad3e4ec..c35062eb85 100644 --- a/crates/bevy_render/src/render_asset.rs +++ b/crates/bevy_render/src/render_asset.rs @@ -499,14 +499,14 @@ impl RenderAssetBytesPerFrameLimiter { } /// Decreases the available bytes for the current frame. - fn write_bytes(&self, bytes: usize) { + pub(crate) fn write_bytes(&self, bytes: usize) { if self.max_bytes.is_some() && bytes > 0 { self.bytes_written.fetch_add(bytes, Ordering::Relaxed); } } /// Returns `true` if there are no remaining bytes available for writing this frame. - fn exhausted(&self) -> bool { + pub(crate) fn exhausted(&self) -> bool { if let Some(max_bytes) = self.max_bytes { let bytes_written = self.bytes_written.load(Ordering::Relaxed); bytes_written >= max_bytes diff --git a/crates/bevy_render/src/render_phase/mod.rs b/crates/bevy_render/src/render_phase/mod.rs index 272418f67f..c58318f654 100644 --- a/crates/bevy_render/src/render_phase/mod.rs +++ b/crates/bevy_render/src/render_phase/mod.rs @@ -61,7 +61,9 @@ use crate::{ render_resource::{CachedRenderPipelineId, GpuArrayBufferIndex, PipelineCache}, Render, RenderApp, RenderSystems, }; +use bevy_ecs::intern::Interned; use bevy_ecs::{ + define_label, prelude::*, system::{lifetimeless::SRes, SystemParamItem}, }; @@ -69,6 +71,33 @@ use core::{fmt::Debug, hash::Hash, iter, marker::PhantomData, ops::Range, slice: use smallvec::SmallVec; use tracing::warn; +pub use bevy_render_macros::ShaderLabel; + +define_label!( + #[diagnostic::on_unimplemented( + note = "consider annotating `{Self}` with `#[derive(ShaderLabel)]`" + )] + /// Labels used to uniquely identify types of material shaders + ShaderLabel, + SHADER_LABEL_INTERNER +); + +/// A shorthand for `Interned`. +pub type InternedShaderLabel = Interned; + +pub use bevy_render_macros::DrawFunctionLabel; + +define_label!( + #[diagnostic::on_unimplemented( + note = "consider annotating `{Self}` with `#[derive(DrawFunctionLabel)]`" + )] + /// Labels used to uniquely identify types of material shaders + DrawFunctionLabel, + DRAW_FUNCTION_LABEL_INTERNER +); + +pub type InternedDrawFunctionLabel = Interned; + /// Stores the rendering instructions for a single phase that uses bins in all /// views. /// diff --git a/crates/bevy_render/src/render_resource/bind_group.rs b/crates/bevy_render/src/render_resource/bind_group.rs index 17de8455da..04b7747179 100644 --- a/crates/bevy_render/src/render_resource/bind_group.rs +++ b/crates/bevy_render/src/render_resource/bind_group.rs @@ -481,22 +481,27 @@ impl Deref for BindGroup { /// is_shaded: bool, /// } /// -/// #[derive(Copy, Clone, Hash, Eq, PartialEq)] +/// // Materials keys are intended to be small, cheap to hash, and +/// // uniquely identify a specific material permutation, which +/// // is why they are required to be `bytemuck::Pod` and `bytemuck::Zeroable` +/// // when using the `AsBindGroup` derive macro. +/// #[repr(C)] +/// #[derive(Copy, Clone, Hash, Eq, PartialEq, bytemuck::Pod, bytemuck::Zeroable)] /// struct CoolMaterialKey { -/// is_shaded: bool, +/// is_shaded: u32, /// } /// /// impl From<&CoolMaterial> for CoolMaterialKey { /// fn from(material: &CoolMaterial) -> CoolMaterialKey { /// CoolMaterialKey { -/// is_shaded: material.is_shaded, +/// is_shaded: material.is_shaded as u32, /// } /// } /// } /// ``` pub trait AsBindGroup { /// Data that will be stored alongside the "prepared" bind group. - type Data: Send + Sync; + type Data: bytemuck::Pod + bytemuck::Zeroable + Send + Sync; type Param: SystemParam + 'static; @@ -531,8 +536,8 @@ pub trait AsBindGroup { layout: &BindGroupLayout, render_device: &RenderDevice, param: &mut SystemParamItem<'_, '_, Self::Param>, - ) -> Result, AsBindGroupError> { - let UnpreparedBindGroup { bindings, data } = + ) -> Result { + let UnpreparedBindGroup { bindings } = Self::unprepared_bind_group(self, layout, render_device, param, false)?; let entries = bindings @@ -548,10 +553,11 @@ pub trait AsBindGroup { Ok(PreparedBindGroup { bindings, bind_group, - data, }) } + fn bind_group_data(&self) -> Self::Data; + /// Returns a vec of (binding index, `OwnedBindingResource`). /// /// In cases where `OwnedBindingResource` is not available (as for bindless @@ -569,7 +575,7 @@ pub trait AsBindGroup { render_device: &RenderDevice, param: &mut SystemParamItem<'_, '_, Self::Param>, force_no_bindless: bool, - ) -> Result, AsBindGroupError>; + ) -> Result; /// Creates the bind group layout matching all bind groups returned by /// [`AsBindGroup::as_bind_group`] @@ -613,16 +619,14 @@ pub enum AsBindGroupError { } /// A prepared bind group returned as a result of [`AsBindGroup::as_bind_group`]. -pub struct PreparedBindGroup { +pub struct PreparedBindGroup { pub bindings: BindingResources, pub bind_group: BindGroup, - pub data: T, } /// a map containing `OwnedBindingResource`s, keyed by the target binding index -pub struct UnpreparedBindGroup { +pub struct UnpreparedBindGroup { pub bindings: BindingResources, - pub data: T, } /// A pair of binding index and binding resource, used as part of diff --git a/crates/bevy_sprite/src/mesh2d/material.rs b/crates/bevy_sprite/src/mesh2d/material.rs index fa784bd9af..06914690ca 100644 --- a/crates/bevy_sprite/src/mesh2d/material.rs +++ b/crates/bevy_sprite/src/mesh2d/material.rs @@ -410,7 +410,7 @@ where fn clone(&self) -> Self { Self { mesh_key: self.mesh_key, - bind_group_data: self.bind_group_data.clone(), + bind_group_data: self.bind_group_data, } } } @@ -753,7 +753,7 @@ pub fn specialize_material2d_meshes( &material2d_pipeline, Material2dKey { mesh_key, - bind_group_data: material_2d.key.clone(), + bind_group_data: material_2d.key, }, &mesh.layout, ); @@ -969,6 +969,7 @@ impl RenderAsset for PreparedMaterial2d { ): &mut SystemParamItem, _: Option<&Self>, ) -> Result> { + let bind_group_data = material.bind_group_data(); match material.as_bind_group(&pipeline.material2d_layout, render_device, material_param) { Ok(prepared) => { let mut mesh_pipeline_key_bits = Mesh2dPipelineKey::empty(); @@ -987,7 +988,7 @@ impl RenderAsset for PreparedMaterial2d { Ok(PreparedMaterial2d { bindings: prepared.bindings, bind_group: prepared.bind_group, - key: prepared.data, + key: bind_group_data, properties: Material2dProperties { depth_bias: material.depth_bias(), alpha_mode: material.alpha_mode(), diff --git a/crates/bevy_ui/src/render/ui_material_pipeline.rs b/crates/bevy_ui/src/render/ui_material_pipeline.rs index 5d2201e609..94de7afd23 100644 --- a/crates/bevy_ui/src/render/ui_material_pipeline.rs +++ b/crates/bevy_ui/src/render/ui_material_pipeline.rs @@ -583,11 +583,12 @@ impl RenderAsset for PreparedUiMaterial { (render_device, pipeline, material_param): &mut SystemParamItem, _: Option<&Self>, ) -> Result> { + let bind_group_data = material.bind_group_data(); match material.as_bind_group(&pipeline.ui_layout, render_device, material_param) { Ok(prepared) => Ok(PreparedUiMaterial { bindings: prepared.bindings, bind_group: prepared.bind_group, - key: prepared.data, + key: bind_group_data, }), Err(AsBindGroupError::RetryNextUpdate) => { Err(PrepareAssetError::RetryNextUpdate(material)) @@ -637,7 +638,7 @@ pub fn queue_ui_material_nodes( &ui_material_pipeline, UiMaterialKey { hdr: view.hdr, - bind_group_data: material.key.clone(), + bind_group_data: material.key, }, ); if transparent_phase.items.capacity() < extracted_uinodes.uinodes.len() { diff --git a/crates/bevy_ui/src/ui_material.rs b/crates/bevy_ui/src/ui_material.rs index 9f56e834a4..89a8df948c 100644 --- a/crates/bevy_ui/src/ui_material.rs +++ b/crates/bevy_ui/src/ui_material.rs @@ -141,7 +141,7 @@ where fn clone(&self) -> Self { Self { hdr: self.hdr, - bind_group_data: self.bind_group_data.clone(), + bind_group_data: self.bind_group_data, } } } diff --git a/examples/3d/lines.rs b/examples/3d/lines.rs index d755aa434a..0ee62f599c 100644 --- a/examples/3d/lines.rs +++ b/examples/3d/lines.rs @@ -77,7 +77,7 @@ impl Material for LineMaterial { } fn specialize( - _pipeline: &MaterialPipeline, + _pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, _layout: &MeshVertexBufferLayoutRef, _key: MaterialPipelineKey, diff --git a/examples/3d/manual_material.rs b/examples/3d/manual_material.rs new file mode 100644 index 0000000000..f93265a50a --- /dev/null +++ b/examples/3d/manual_material.rs @@ -0,0 +1,315 @@ +//! A simple 3D scene with light shining over a cube sitting on a plane. + +use bevy::{ + asset::{AsAssetId, AssetEventSystems}, + core_pipeline::core_3d::Opaque3d, + ecs::system::{ + lifetimeless::{SRes, SResMut}, + SystemChangeTick, SystemParamItem, + }, + pbr::{ + DrawMaterial, EntitiesNeedingSpecialization, EntitySpecializationTicks, + MaterialBindGroupAllocator, MaterialBindGroupAllocators, MaterialDrawFunction, + MaterialFragmentShader, MaterialProperties, PreparedMaterial, RenderMaterialBindings, + RenderMaterialInstance, RenderMaterialInstances, SpecializedMaterialPipelineCache, + }, + platform::collections::hash_map::Entry, + prelude::*, + render::{ + erased_render_asset::{ErasedRenderAsset, ErasedRenderAssetPlugin, PrepareAssetError}, + render_asset::RenderAssets, + render_phase::DrawFunctions, + render_resource::{ + binding_types::{sampler, texture_2d}, + AsBindGroup, BindGroupLayout, BindGroupLayoutEntries, BindingResources, + OwnedBindingResource, Sampler, SamplerBindingType, SamplerDescriptor, ShaderStages, + TextureSampleType, TextureViewDimension, UnpreparedBindGroup, + }, + renderer::RenderDevice, + sync_world::MainEntity, + texture::GpuImage, + view::ExtractedView, + Extract, RenderApp, + }, + utils::Parallel, +}; +use std::{any::TypeId, sync::Arc}; + +const SHADER_ASSET_PATH: &str = "shaders/manual_material.wgsl"; + +fn main() { + App::new() + .add_plugins((DefaultPlugins, ImageMaterialPlugin)) + .add_systems(Startup, setup) + .run(); +} + +struct ImageMaterialPlugin; + +impl Plugin for ImageMaterialPlugin { + fn build(&self, app: &mut App) { + app.init_asset::() + .add_plugins(ErasedRenderAssetPlugin::::default()) + .add_systems( + PostUpdate, + check_entities_needing_specialization.after(AssetEventSystems), + ) + .init_resource::>(); + } + + fn finish(&self, app: &mut App) { + let Some(render_app) = app.get_sub_app_mut(RenderApp) else { + return; + }; + + render_app.add_systems( + ExtractSchedule, + ( + extract_image_materials, + extract_image_materials_needing_specialization, + ), + ); + + render_app.world_mut().resource_scope( + |world: &mut World, mut bind_group_allocators: Mut| { + world.resource_scope(|world: &mut World, render_device: Mut| { + let bind_group_layout = render_device.create_bind_group_layout( + "image_material_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::FRAGMENT, + ( + texture_2d(TextureSampleType::Float { filterable: false }), + sampler(SamplerBindingType::NonFiltering), + ), + ), + ); + let sampler = render_device.create_sampler(&SamplerDescriptor::default()); + world.insert_resource(ImageMaterialBindGroupLayout(bind_group_layout.clone())); + world.insert_resource(ImageMaterialBindGroupSampler(sampler)); + + bind_group_allocators.insert( + TypeId::of::(), + MaterialBindGroupAllocator::new( + &render_device, + None, + None, + bind_group_layout, + None, + ), + ); + }); + }, + ); + } +} + +#[derive(Resource)] +struct ImageMaterialBindGroupLayout(BindGroupLayout); + +#[derive(Resource)] +struct ImageMaterialBindGroupSampler(Sampler); + +#[derive(Component)] +struct ImageMaterial3d(Handle); + +impl AsAssetId for ImageMaterial3d { + type Asset = ImageMaterial; + + fn as_asset_id(&self) -> AssetId { + self.0.id() + } +} + +#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] +struct ImageMaterial { + image: Handle, +} + +impl ErasedRenderAsset for ImageMaterial { + type SourceAsset = ImageMaterial; + type ErasedAsset = PreparedMaterial; + type Param = ( + SRes>, + SRes, + SRes, + SResMut, + SResMut, + SRes>, + SRes, + ); + + fn prepare_asset( + source_asset: Self::SourceAsset, + asset_id: AssetId, + ( + opaque_draw_functions, + material_layout, + asset_server, + bind_group_allocators, + render_material_bindings, + gpu_images, + image_material_sampler, + ): &mut SystemParamItem, + ) -> std::result::Result> { + let material_layout = material_layout.0.clone(); + let draw_function_id = opaque_draw_functions.read().id::(); + let bind_group_allocator = bind_group_allocators + .get_mut(&TypeId::of::()) + .unwrap(); + let Some(image) = gpu_images.get(&source_asset.image) else { + return Err(PrepareAssetError::RetryNextUpdate(source_asset)); + }; + let unprepared = UnpreparedBindGroup { + bindings: BindingResources(vec![ + ( + 0, + OwnedBindingResource::TextureView( + TextureViewDimension::D2, + image.texture_view.clone(), + ), + ), + ( + 1, + OwnedBindingResource::Sampler( + SamplerBindingType::NonFiltering, + image_material_sampler.0.clone(), + ), + ), + ]), + }; + let binding = match render_material_bindings.entry(asset_id.into()) { + Entry::Occupied(mut occupied_entry) => { + bind_group_allocator.free(*occupied_entry.get()); + let new_binding = + bind_group_allocator.allocate_unprepared(unprepared, &material_layout); + *occupied_entry.get_mut() = new_binding; + new_binding + } + Entry::Vacant(vacant_entry) => *vacant_entry + .insert(bind_group_allocator.allocate_unprepared(unprepared, &material_layout)), + }; + + let mut properties = MaterialProperties { + material_layout: Some(material_layout), + ..Default::default() + }; + properties.add_draw_function(MaterialDrawFunction, draw_function_id); + properties.add_shader(MaterialFragmentShader, asset_server.load(SHADER_ASSET_PATH)); + + Ok(PreparedMaterial { + binding, + properties: Arc::new(properties), + }) + } +} + +/// set up a simple 3D scene +fn setup( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, + asset_server: Res, +) { + // cube + commands.spawn(( + Mesh3d(meshes.add(Cuboid::new(2.0, 2.0, 2.0))), + ImageMaterial3d(materials.add(ImageMaterial { + image: asset_server.load("branding/icon.png"), + })), + Transform::from_xyz(0.0, 0.5, 0.0), + )); + // light + commands.spawn(( + PointLight { + shadows_enabled: true, + ..default() + }, + Transform::from_xyz(4.0, 8.0, 4.0), + )); + // camera + commands.spawn(( + Camera3d::default(), + Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y), + )); +} + +fn extract_image_materials( + mut material_instances: ResMut, + changed_meshes_query: Extract< + Query< + (Entity, &ViewVisibility, &ImageMaterial3d), + Or<(Changed, Changed)>, + >, + >, +) { + let last_change_tick = material_instances.current_change_tick; + + for (entity, view_visibility, material) in &changed_meshes_query { + if view_visibility.get() { + material_instances.instances.insert( + entity.into(), + RenderMaterialInstance { + asset_id: material.0.id().untyped(), + last_change_tick, + }, + ); + } else { + material_instances + .instances + .remove(&MainEntity::from(entity)); + } + } +} + +fn check_entities_needing_specialization( + needs_specialization: Query< + Entity, + ( + Or<( + Changed, + AssetChanged, + Changed, + AssetChanged, + )>, + With, + ), + >, + mut par_local: Local>>, + mut entities_needing_specialization: ResMut>, +) { + entities_needing_specialization.clear(); + + needs_specialization + .par_iter() + .for_each(|entity| par_local.borrow_local_mut().push(entity)); + + par_local.drain_into(&mut entities_needing_specialization); +} + +fn extract_image_materials_needing_specialization( + entities_needing_specialization: Extract>>, + mut entity_specialization_ticks: ResMut, + mut removed_mesh_material_components: Extract>, + mut specialized_material_pipeline_cache: ResMut, + views: Query<&ExtractedView>, + ticks: SystemChangeTick, +) { + // Clean up any despawned entities, we do this first in case the removed material was re-added + // the same frame, thus will appear both in the removed components list and have been added to + // the `EntitiesNeedingSpecialization` collection by triggering the `Changed` filter + for entity in removed_mesh_material_components.read() { + entity_specialization_ticks.remove(&MainEntity::from(entity)); + for view in views { + if let Some(cache) = + specialized_material_pipeline_cache.get_mut(&view.retained_view_entity) + { + cache.remove(&MainEntity::from(entity)); + } + } + } + + for entity in entities_needing_specialization.iter() { + // Update the entity's specialization tick with this run's tick + entity_specialization_ticks.insert((*entity).into(), ticks.this_run()); + } +} diff --git a/examples/README.md b/examples/README.md index b966e75d1d..a8b9bfb3b4 100644 --- a/examples/README.md +++ b/examples/README.md @@ -165,6 +165,7 @@ Example | Description [Lines](../examples/3d/lines.rs) | Create a custom material to draw 3d lines [Load glTF](../examples/3d/load_gltf.rs) | Loads and renders a glTF file as a scene [Load glTF extras](../examples/3d/load_gltf_extras.rs) | Loads and renders a glTF file as a scene, including the gltf extras +[Manual Material Implementation](../examples/3d/manual_material.rs) | Demonstrates how to implement a material manually using the mid-level render APIs [Mesh Ray Cast](../examples/3d/mesh_ray_cast.rs) | Demonstrates ray casting with the `MeshRayCast` system parameter [Meshlet](../examples/3d/meshlet.rs) | Meshlet rendering for dense high-poly scenes (experimental) [Mixed lighting](../examples/3d/mixed_lighting.rs) | Demonstrates how to combine baked and dynamic lighting diff --git a/examples/shader/custom_vertex_attribute.rs b/examples/shader/custom_vertex_attribute.rs index 4cc8ea7dc5..46ab930851 100644 --- a/examples/shader/custom_vertex_attribute.rs +++ b/examples/shader/custom_vertex_attribute.rs @@ -74,7 +74,7 @@ impl Material for CustomMaterial { } fn specialize( - _pipeline: &MaterialPipeline, + _pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, layout: &MeshVertexBufferLayoutRef, _key: MaterialPipelineKey, diff --git a/examples/shader/shader_defs.rs b/examples/shader/shader_defs.rs index 950ec182b4..1944040142 100644 --- a/examples/shader/shader_defs.rs +++ b/examples/shader/shader_defs.rs @@ -61,12 +61,12 @@ impl Material for CustomMaterial { } fn specialize( - _pipeline: &MaterialPipeline, + _pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, _layout: &MeshVertexBufferLayoutRef, key: MaterialPipelineKey, ) -> Result<(), SpecializedMeshPipelineError> { - if key.bind_group_data.is_red { + if key.bind_group_data.is_red == 1 { let fragment = descriptor.fragment.as_mut().unwrap(); fragment.shader_defs.push("IS_RED".into()); } @@ -86,16 +86,19 @@ struct CustomMaterial { // This key is used to identify a specific permutation of this material pipeline. // In this case, we specialize on whether or not to configure the "IS_RED" shader def. // Specialization keys should be kept as small / cheap to hash as possible, -// as they will be used to look up the pipeline for each drawn entity with this material type. -#[derive(Eq, PartialEq, Hash, Clone)] +// as they will be used to look up the pipeline for each drawn entity with this material type, +// Which is why they are required to be `bytemuck::Pod` and `bytemuck::Zeroable` for materials +// that use the `AsBindGroup` derive macro. +#[repr(C)] +#[derive(Eq, PartialEq, Hash, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] struct CustomMaterialKey { - is_red: bool, + is_red: u32, } impl From<&CustomMaterial> for CustomMaterialKey { fn from(material: &CustomMaterial) -> Self { Self { - is_red: material.is_red, + is_red: material.is_red as u32, } } } diff --git a/examples/shader/shader_material_glsl.rs b/examples/shader/shader_material_glsl.rs index 1f25302a72..9692020389 100644 --- a/examples/shader/shader_material_glsl.rs +++ b/examples/shader/shader_material_glsl.rs @@ -79,7 +79,7 @@ impl Material for CustomMaterial { // and fragment shaders use the "fragment" entry point (for WGSL shaders). // GLSL uses "main" as the entry point, so we must override the defaults here fn specialize( - _pipeline: &MaterialPipeline, + _pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, _layout: &MeshVertexBufferLayoutRef, _key: MaterialPipelineKey, diff --git a/examples/shader/shader_material_wesl.rs b/examples/shader/shader_material_wesl.rs index 108093de78..c6db617542 100644 --- a/examples/shader/shader_material_wesl.rs +++ b/examples/shader/shader_material_wesl.rs @@ -101,15 +101,16 @@ struct CustomMaterial { party_mode: bool, } -#[derive(Eq, PartialEq, Hash, Clone)] +#[repr(C)] +#[derive(Eq, PartialEq, Hash, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] struct CustomMaterialKey { - party_mode: bool, + party_mode: u32, } impl From<&CustomMaterial> for CustomMaterialKey { fn from(material: &CustomMaterial) -> Self { Self { - party_mode: material.party_mode, + party_mode: material.party_mode as u32, } } } @@ -120,7 +121,7 @@ impl Material for CustomMaterial { } fn specialize( - _pipeline: &MaterialPipeline, + _pipeline: &MaterialPipeline, descriptor: &mut RenderPipelineDescriptor, _layout: &MeshVertexBufferLayoutRef, key: MaterialPipelineKey, @@ -128,7 +129,7 @@ impl Material for CustomMaterial { let fragment = descriptor.fragment.as_mut().unwrap(); fragment.shader_defs.push(ShaderDefVal::Bool( "PARTY_MODE".to_string(), - key.bind_group_data.party_mode, + key.bind_group_data.party_mode == 1, )); Ok(()) } diff --git a/examples/shader/texture_binding_array.rs b/examples/shader/texture_binding_array.rs index e4939edf6a..bfb439d81f 100644 --- a/examples/shader/texture_binding_array.rs +++ b/examples/shader/texture_binding_array.rs @@ -104,7 +104,7 @@ impl AsBindGroup for BindlessMaterial { layout: &BindGroupLayout, render_device: &RenderDevice, (image_assets, fallback_image): &mut SystemParamItem<'_, '_, Self::Param>, - ) -> Result, AsBindGroupError> { + ) -> Result { // retrieve the render resources from handles let mut images = vec![]; for handle in self.textures.iter().take(MAX_TEXTURE_COUNT) { @@ -135,17 +135,18 @@ impl AsBindGroup for BindlessMaterial { Ok(PreparedBindGroup { bindings: BindingResources(vec![]), bind_group, - data: (), }) } + fn bind_group_data(&self) -> Self::Data {} + fn unprepared_bind_group( &self, _layout: &BindGroupLayout, _render_device: &RenderDevice, _param: &mut SystemParamItem<'_, '_, Self::Param>, _force_no_bindless: bool, - ) -> Result, AsBindGroupError> { + ) -> Result { // We implement `as_bind_group`` directly because bindless texture // arrays can't be owned. // Or rather, they can be owned, but then you can't make a `&'a [&'a From fb2bbb043cf252eace9c99e26db8a95609987c4a Mon Sep 17 00:00:00 2001 From: Jan Hohenheim Date: Sat, 28 Jun 2025 20:35:41 +0200 Subject: [PATCH 05/68] Nudge users into migrating to new default glTF coordinate conversion (#19816) # Objective *Step towards https://github.com/bevyengine/bevy/issues/19686* We now have all the infrastructure in place to migrate Bevy's default behavior when loading glTF files to respect their coordinate system. Let's start migrating! For motivation, see the issue linked above ## Solution - Introduce a feature flag called `gltf_convert_coordinates_default` - Currently,`GltfPlugin::convert_coordinates` defaults to `false` - If `gltf_convert_coordinates_default` is enabled, `GltfPlugin::convert_coordinates` will default to `true` - If `gltf_convert_coordinates_default` is not enabled *and* `GltfPlugin::convert_coordinates` is false, we assume the user is implicitly using the old behavior. Print a warning *once* in that case, but only when a glTF was actually loaded - A user can opt into the new behavior either - Globally, by enabling `gltf_convert_coordinates_default` in their `Cargo.toml` - Globally, by enabling `GltfPlugin::convert_coordinates` - Per asset, by enabling `GltfLoaderSettings::convert_coordinates` - A user can explicitly opt out of the new behavior and silence the warning by - Enabling `gltf_convert_coordinates_default` in their `Cargo.toml` and disabling `GltfPlugin::convert_coordinates` - This PR also moves the existing release note into a migration guide Note that I'm very open to change any features, mechanisms, warning texts, etc. as needed :) ## Future Work - This PR leaves all examples fully functional by not enabling this flag internally yet. A followup PR will enable it as a `dev-dependency` and migrate all of our examples involving glTFs to the new behavior. - After 0.17 (and the RC before) lands, we'll gather feedback to see if anything breaks or the suggested migration is inconvenient in some way - If all goes well, we'll kill this flag and change the default of `GltfPlugin::convert_coordinates` to `true` in 0.18 ## Testing - Ran examples with and without the flag --------- Co-authored-by: Carter Anderson Co-authored-by: AlephCubed <76791009+AlephCubed@users.noreply.github.com> --- Cargo.toml | 5 ++++ crates/bevy_gltf/Cargo.toml | 3 +- crates/bevy_gltf/src/lib.rs | 2 +- crates/bevy_gltf/src/loader/mod.rs | 14 ++++++++- crates/bevy_internal/Cargo.toml | 4 +++ docs/cargo_features.md | 1 + .../convert-coordinates.md | 29 +++++++++++++++++-- 7 files changed, 51 insertions(+), 7 deletions(-) rename release-content/{release-notes => migration-guides}/convert-coordinates.md (58%) diff --git a/Cargo.toml b/Cargo.toml index 19a2afc8e8..d8a9255c52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -561,6 +561,11 @@ web = ["bevy_internal/web"] # Enable hotpatching of Bevy systems hotpatching = ["bevy_internal/hotpatching"] +# Enable converting glTF coordinates to Bevy's coordinate system by default. This will be Bevy's default behavior starting in 0.18. +gltf_convert_coordinates_default = [ + "bevy_internal/gltf_convert_coordinates_default", +] + # Enable collecting debug information about systems and components to help with diagnostics debug = ["bevy_internal/debug"] diff --git a/crates/bevy_gltf/Cargo.toml b/crates/bevy_gltf/Cargo.toml index c46b74b7ca..36e9508f4c 100644 --- a/crates/bevy_gltf/Cargo.toml +++ b/crates/bevy_gltf/Cargo.toml @@ -15,6 +15,7 @@ pbr_multi_layer_material_textures = [ ] pbr_anisotropy_texture = ["bevy_pbr/pbr_anisotropy_texture"] pbr_specular_textures = ["bevy_pbr/pbr_specular_textures"] +gltf_convert_coordinates_default = [] [dependencies] # bevy @@ -64,8 +65,6 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.140" smallvec = "1.11" tracing = { version = "0.1", default-features = false, features = ["std"] } - -[dev-dependencies] bevy_log = { path = "../bevy_log", version = "0.17.0-dev" } [lints] diff --git a/crates/bevy_gltf/src/lib.rs b/crates/bevy_gltf/src/lib.rs index bbcb13a908..6b90a4d99b 100644 --- a/crates/bevy_gltf/src/lib.rs +++ b/crates/bevy_gltf/src/lib.rs @@ -185,7 +185,7 @@ impl Default for GltfPlugin { GltfPlugin { default_sampler: ImageSamplerDescriptor::linear(), custom_vertex_attributes: HashMap::default(), - convert_coordinates: false, + convert_coordinates: cfg!(feature = "gltf_convert_coordinates_default"), } } } diff --git a/crates/bevy_gltf/src/loader/mod.rs b/crates/bevy_gltf/src/loader/mod.rs index a326af0526..3e4c384532 100644 --- a/crates/bevy_gltf/src/loader/mod.rs +++ b/crates/bevy_gltf/src/loader/mod.rs @@ -2,6 +2,7 @@ mod extensions; mod gltf_ext; use alloc::sync::Arc; +use bevy_log::warn_once; use std::{ io::Error, path::{Path, PathBuf}, @@ -297,7 +298,18 @@ async fn load_gltf<'a, 'b, 'c>( let convert_coordinates = match settings.convert_coordinates { Some(convert_coordinates) => convert_coordinates, - None => loader.default_convert_coordinates, + None => { + let convert_by_default = loader.default_convert_coordinates; + if !convert_by_default && !cfg!(feature = "gltf_convert_coordinates_default") { + warn_once!( + "Starting from Bevy 0.18, by default all imported glTF models will be rotated by 180 degrees around the Y axis to align with Bevy's coordinate system. \ + You are currently importing glTF files using the old behavior. Consider opting-in to the new import behavior by enabling the `gltf_convert_coordinates_default` feature. \ + If you encounter any issues please file a bug! \ + If you want to continue using the old behavior going forward (even when the default changes in 0.18), manually set the corresponding option in the `GltfPlugin` or `GltfLoaderSettings`. See the migration guide for more details." + ); + } + convert_by_default + } }; #[cfg(feature = "bevy_animation")] diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index 5e5c95f3ec..402ff45060 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -355,6 +355,10 @@ web = [ hotpatching = ["bevy_app/hotpatching", "bevy_ecs/hotpatching"] +gltf_convert_coordinates_default = [ + "bevy_gltf?/gltf_convert_coordinates_default", +] + debug = ["bevy_utils/debug"] [dependencies] diff --git a/docs/cargo_features.md b/docs/cargo_features.md index 0f9bdc507a..fc38577509 100644 --- a/docs/cargo_features.md +++ b/docs/cargo_features.md @@ -89,6 +89,7 @@ The default feature set enables most of the expected features of a game engine, |ghost_nodes|Experimental support for nodes that are ignored for UI layouting| |gif|GIF image format support| |glam_assert|Enable assertions to check the validity of parameters passed to glam| +|gltf_convert_coordinates_default|Enable converting glTF coordinates to Bevy's coordinate system by default. This will be Bevy's default behavior starting in 0.18.| |hotpatching|Enable hotpatching of Bevy systems| |ico|ICO image format support| |jpeg|JPEG image format support| diff --git a/release-content/release-notes/convert-coordinates.md b/release-content/migration-guides/convert-coordinates.md similarity index 58% rename from release-content/release-notes/convert-coordinates.md rename to release-content/migration-guides/convert-coordinates.md index 957508e15b..85ab80ed20 100644 --- a/release-content/release-notes/convert-coordinates.md +++ b/release-content/migration-guides/convert-coordinates.md @@ -1,7 +1,7 @@ --- title: Allow importing glTFs with a corrected coordinate system authors: ["@janhohenheim"] -pull_requests: [19633, 19685] +pull_requests: [19633, 19685, 19816] --- glTF uses the following coordinate system: @@ -24,7 +24,27 @@ Long-term, we'd like to fix our glTF imports to use the correct coordinate syste But changing the import behavior would mean that *all* imported glTFs of *all* users would suddenly look different, breaking their scenes! Not to mention that any bugs in the conversion code would be incredibly frustating for users. -This is why we are now gradually rolling out support for corrected glTF imports. Starting now you can opt into the new behavior by setting `convert_coordinates` on `GltfPlugin`: +This is why we are now gradually rolling out support for corrected glTF imports. You will now be greeted by the following warning when using the old behavior: + +> Starting from Bevy 0.18, by default all imported glTF models will be rotated by 180 degrees around the Y axis to align with Bevy's coordinate system. +> You are currently importing glTF files using the old behavior. Consider opting-in to the new import behavior by enabling the `gltf_convert_coordinates_default` feature. +> If you encounter any issues please file a bug! +> If you want to continue using the old behavior going forward (even when the default changes in 0.18), manually set the corresponding option in the `GltfPlugin` or `GltfLoaderSettings`. +> See the migration guide for more details. + +As the warning says, you can opt into the new behavior by enabling the `gltf_convert_coordinates_default` feature in your `Cargo.toml`: + +```toml +# old behavior, ignores glTF's coordinate system +[dependencies] +bevy = "0.17.0" + +# new behavior, converts the coordinate system of all glTF assets into Bevy's coordinate system +[dependencies] +bevy = { version = "0.17.0", features = ["gltf_convert_coordinates_default"] } +``` + +If you prefer, you can also do this in code by setting `convert_coordinates` on `GltfPlugin`: ```rust // old behavior, ignores glTF's coordinate system @@ -41,6 +61,9 @@ App::new() .run(); ``` +If you want to continue using the old behavior in the future, you can silence the warning by enabling the `gltf_convert_coordinates_default` feature +and explicitly setting `convert_coordinates: false` on `GltfPlugin`. + You can also control this on a per-asset-level: ```rust @@ -56,7 +79,7 @@ let handle = asset_server.load_with_settings( ); ``` -Afterwards, your scene will be oriented such that your modeling software's forward direction correctly corresponds to Bevy's forward direction. +After opting into the new behavior, your scene will be oriented such that your modeling software's forward direction correctly corresponds to Bevy's forward direction. For example, Blender assumes -Y to be forward, so exporting the following model to glTF and loading it in Bevy with the new settings will ensure everything is oriented the right way across all programs in your pipeline: From 37bbbf753d503dcab97e1e5766d5e43669261b5e Mon Sep 17 00:00:00 2001 From: IceSentry Date: Sat, 28 Jun 2025 14:43:56 -0400 Subject: [PATCH 06/68] Use SmallVec instead of HashMap in MaterialProperties (#19846) # Objective - MaterialProperties uses HashMap for some data that is generally going to be really small. This is likely using more memory than necessary ## Solution - Use a SmallVec instead - I used the size a StandardMaterial would need for all the backing arrays ## Testing - Tested the 3d_scene to confirm it still works ## Notes I'm not sure if it made a measurable difference since I'm not sure how to measure this. It's a bit hard to create an artificial workflow where this would be the main bottleneck. This is very in the realm of microoptimization. --- crates/bevy_pbr/src/material.rs | 45 +++++++++++++++++------------- crates/bevy_pbr/src/prepass/mod.rs | 15 ++-------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/crates/bevy_pbr/src/material.rs b/crates/bevy_pbr/src/material.rs index fb86f411d4..0b86cd95e1 100644 --- a/crates/bevy_pbr/src/material.rs +++ b/crates/bevy_pbr/src/material.rs @@ -1300,8 +1300,11 @@ pub struct MaterialProperties { pub reads_view_transmission_texture: bool, pub render_phase_type: RenderPhaseType, pub material_layout: Option, - pub draw_functions: HashMap, - pub shaders: HashMap>, + /// Backing array is a size of 4 because the `StandardMaterial` needs 4 draw functions by default + pub draw_functions: SmallVec<[(InternedDrawFunctionLabel, DrawFunctionId); 4]>, + /// Backing array is a size of 3 because the `StandardMaterial` has 3 custom shaders (`frag`, `prepass_frag`, `deferred_frag`) which is the + /// most common use case + pub shaders: SmallVec<[(InternedShaderLabel, Handle); 3]>, /// Whether this material *actually* uses bindless resources, taking the /// platform support (or lack thereof) of bindless resources into account. pub bindless: bool, @@ -1320,27 +1323,31 @@ pub struct MaterialProperties { impl MaterialProperties { pub fn get_shader(&self, label: impl ShaderLabel) -> Option> { - self.shaders.get(&label.intern()).cloned() + self.shaders + .iter() + .find(|(inner_label, _)| inner_label == &label.intern()) + .map(|(_, shader)| shader) + .cloned() } - pub fn add_shader( - &mut self, - label: impl ShaderLabel, - shader: Handle, - ) -> Option> { - self.shaders.insert(label.intern(), shader) + pub fn add_shader(&mut self, label: impl ShaderLabel, shader: Handle) { + self.shaders.push((label.intern(), shader)); } pub fn get_draw_function(&self, label: impl DrawFunctionLabel) -> Option { - self.draw_functions.get(&label.intern()).copied() + self.draw_functions + .iter() + .find(|(inner_label, _)| inner_label == &label.intern()) + .map(|(_, shader)| shader) + .cloned() } pub fn add_draw_function( &mut self, label: impl DrawFunctionLabel, draw_function: DrawFunctionId, - ) -> Option { - self.draw_functions.insert(label.intern(), draw_function) + ) { + self.draw_functions.push((label.intern(), draw_function)); } } @@ -1472,19 +1479,19 @@ where _ => None, }; - let mut draw_functions = HashMap::new(); - draw_functions.insert(MaterialDrawFunction.intern(), draw_function_id); + let mut draw_functions = SmallVec::new(); + draw_functions.push((MaterialDrawFunction.intern(), draw_function_id)); if let Some(prepass_draw_function_id) = prepass_draw_function_id { - draw_functions.insert(PrepassDrawFunction.intern(), prepass_draw_function_id); + draw_functions.push((PrepassDrawFunction.intern(), prepass_draw_function_id)); } if let Some(deferred_draw_function_id) = deferred_draw_function_id { - draw_functions.insert(DeferredDrawFunction.intern(), deferred_draw_function_id); + draw_functions.push((DeferredDrawFunction.intern(), deferred_draw_function_id)); } if let Some(shadow_draw_function_id) = shadow_draw_function_id { - draw_functions.insert(ShadowsDrawFunction.intern(), shadow_draw_function_id); + draw_functions.push((ShadowsDrawFunction.intern(), shadow_draw_function_id)); } - let mut shaders = HashMap::new(); + let mut shaders = SmallVec::new(); let mut add_shader = |label: InternedShaderLabel, shader_ref: ShaderRef| { let mayber_shader = match shader_ref { ShaderRef::Default => None, @@ -1492,7 +1499,7 @@ where ShaderRef::Path(path) => Some(asset_server.load(path)), }; if let Some(shader) = mayber_shader { - shaders.insert(label, shader); + shaders.push((label, shader)); } }; add_shader(MaterialVertexShader.intern(), M::vertex_shader()); diff --git a/crates/bevy_pbr/src/prepass/mod.rs b/crates/bevy_pbr/src/prepass/mod.rs index 13b44edbdd..42b2c28c15 100644 --- a/crates/bevy_pbr/src/prepass/mod.rs +++ b/crates/bevy_pbr/src/prepass/mod.rs @@ -553,27 +553,18 @@ impl PrepassPipelineInternal { || emulate_unclipped_depth || (mesh_key.contains(MeshPipelineKey::MAY_DISCARD) && material_properties - .shaders - .get(&PrepassFragmentShader.intern()) + .get_shader(PrepassFragmentShader) .is_some()); let fragment = fragment_required.then(|| { // Use the fragment shader from the material let frag_shader_handle = if mesh_key.contains(MeshPipelineKey::DEFERRED_PREPASS) { - match material_properties - .shaders - .get(&DeferredFragmentShader.intern()) - .cloned() - { + match material_properties.get_shader(DeferredFragmentShader) { Some(frag_shader_handle) => frag_shader_handle, None => self.default_prepass_shader.clone(), } } else { - match material_properties - .shaders - .get(&PrepassFragmentShader.intern()) - .cloned() - { + match material_properties.get_shader(PrepassFragmentShader) { Some(frag_shader_handle) => frag_shader_handle, None => self.default_prepass_shader.clone(), } From fa9e303e61916d295bbc2fe4b9694215996da276 Mon Sep 17 00:00:00 2001 From: jf908 Date: Sat, 28 Jun 2025 19:54:21 +0100 Subject: [PATCH 07/68] Doc for X11 CursorGrabMode support (#19811) # Objective - Clarify that `CursorGrabMode::Locked` isn't supported on X11 Source: https://docs.rs/winit/latest/winit/window/enum.CursorGrabMode.html#variant.Locked ## Solution - Add it to the platform-specific docs --- crates/bevy_window/src/window.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/bevy_window/src/window.rs b/crates/bevy_window/src/window.rs index 6f61eae2de..5ea8b72402 100644 --- a/crates/bevy_window/src/window.rs +++ b/crates/bevy_window/src/window.rs @@ -750,9 +750,10 @@ pub struct CursorOptions { /// ## Platform-specific /// /// - **`macOS`** doesn't support [`CursorGrabMode::Confined`] + /// - **`X11`** doesn't support [`CursorGrabMode::Locked`] /// - **`iOS/Android`** don't have cursors. /// - /// Since `macOS` doesn't have full [`CursorGrabMode`] support, we first try to set the grab mode that was asked for. If it doesn't work then use the alternate grab mode. + /// Since `macOS` and `X11` don't have full [`CursorGrabMode`] support, we first try to set the grab mode that was asked for. If it doesn't work then use the alternate grab mode. pub grab_mode: CursorGrabMode, /// Set whether or not mouse events within *this* window are captured or fall through to the Window below. @@ -1062,9 +1063,10 @@ impl From for WindowResolution { /// ## Platform-specific /// /// - **`macOS`** doesn't support [`CursorGrabMode::Confined`] +/// - **`X11`** doesn't support [`CursorGrabMode::Locked`] /// - **`iOS/Android`** don't have cursors. /// -/// Since `macOS` doesn't have full [`CursorGrabMode`] support, we first try to set the grab mode that was asked for. If it doesn't work then use the alternate grab mode. +/// Since `macOS` and `X11` don't have full [`CursorGrabMode`] support, we first try to set the grab mode that was asked for. If it doesn't work then use the alternate grab mode. #[derive(Default, Debug, Clone, Copy, PartialEq, Eq)] #[cfg_attr( feature = "bevy_reflect", From 65bddbd3e4791371d8932eec4487a432d897cd46 Mon Sep 17 00:00:00 2001 From: Talin Date: Sat, 28 Jun 2025 12:52:13 -0700 Subject: [PATCH 08/68] Bevy Feathers: an opinionated widget toolkit for building Bevy tooling (#19730) # Objective This PR introduces Bevy Feathers, an opinionated widget toolkit and theming system intended for use by the Bevy Editor, World Inspector, and other tools. The `bevy_feathers` crate is incomplete and hidden behind an experimental feature flag. The API is going to change significantly before release. --------- Co-authored-by: Alice Cecile --- Cargo.toml | 16 ++ crates/bevy_core_widgets/src/core_button.rs | 2 +- crates/bevy_core_widgets/src/core_slider.rs | 2 + crates/bevy_feathers/Cargo.toml | 40 ++++ .../src/assets/fonts/FiraMono-LICENSE | 93 ++++++++ .../src/assets/fonts/FiraMono-Medium.ttf | Bin 0 -> 173516 bytes .../src/assets/fonts/FiraSans-Bold.ttf | Bin 0 -> 473876 bytes .../src/assets/fonts/FiraSans-BoldItalic.ttf | Bin 0 -> 491048 bytes .../src/assets/fonts/FiraSans-Italic.ttf | Bin 0 -> 456436 bytes .../src/assets/fonts/FiraSans-License.txt | 93 ++++++++ .../src/assets/fonts/FiraSans-Regular.ttf | Bin 0 -> 440984 bytes crates/bevy_feathers/src/constants.rs | 23 ++ crates/bevy_feathers/src/controls/button.rs | 208 +++++++++++++++++ crates/bevy_feathers/src/controls/mod.rs | 17 ++ crates/bevy_feathers/src/controls/slider.rs | 209 ++++++++++++++++++ crates/bevy_feathers/src/cursor.rs | 70 ++++++ crates/bevy_feathers/src/dark_theme.rs | 53 +++++ crates/bevy_feathers/src/font_styles.rs | 62 ++++++ crates/bevy_feathers/src/handle_or_path.rs | 61 +++++ crates/bevy_feathers/src/lib.rs | 73 ++++++ crates/bevy_feathers/src/palette.rs | 29 +++ crates/bevy_feathers/src/rounded_corners.rs | 96 ++++++++ crates/bevy_feathers/src/theme.rs | 114 ++++++++++ crates/bevy_feathers/src/tokens.rs | 76 +++++++ crates/bevy_internal/Cargo.toml | 1 + crates/bevy_internal/src/lib.rs | 2 + crates/bevy_text/src/text.rs | 2 +- docs/cargo_features.md | 1 + examples/ui/feathers.rs | 180 +++++++++++++++ release-content/release-notes/feathers.md | 26 +++ 30 files changed, 1547 insertions(+), 2 deletions(-) create mode 100644 crates/bevy_feathers/Cargo.toml create mode 100644 crates/bevy_feathers/src/assets/fonts/FiraMono-LICENSE create mode 100755 crates/bevy_feathers/src/assets/fonts/FiraMono-Medium.ttf create mode 100644 crates/bevy_feathers/src/assets/fonts/FiraSans-Bold.ttf create mode 100644 crates/bevy_feathers/src/assets/fonts/FiraSans-BoldItalic.ttf create mode 100644 crates/bevy_feathers/src/assets/fonts/FiraSans-Italic.ttf create mode 100644 crates/bevy_feathers/src/assets/fonts/FiraSans-License.txt create mode 100644 crates/bevy_feathers/src/assets/fonts/FiraSans-Regular.ttf create mode 100644 crates/bevy_feathers/src/constants.rs create mode 100644 crates/bevy_feathers/src/controls/button.rs create mode 100644 crates/bevy_feathers/src/controls/mod.rs create mode 100644 crates/bevy_feathers/src/controls/slider.rs create mode 100644 crates/bevy_feathers/src/cursor.rs create mode 100644 crates/bevy_feathers/src/dark_theme.rs create mode 100644 crates/bevy_feathers/src/font_styles.rs create mode 100644 crates/bevy_feathers/src/handle_or_path.rs create mode 100644 crates/bevy_feathers/src/lib.rs create mode 100644 crates/bevy_feathers/src/palette.rs create mode 100644 crates/bevy_feathers/src/rounded_corners.rs create mode 100644 crates/bevy_feathers/src/theme.rs create mode 100644 crates/bevy_feathers/src/tokens.rs create mode 100644 examples/ui/feathers.rs create mode 100644 release-content/release-notes/feathers.md diff --git a/Cargo.toml b/Cargo.toml index d8a9255c52..bde47050a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -306,6 +306,9 @@ bevy_input_focus = ["bevy_internal/bevy_input_focus"] # Headless widget collection for Bevy UI. bevy_core_widgets = ["bevy_internal/bevy_core_widgets"] +# Feathers widget collection. +experimental_bevy_feathers = ["bevy_internal/bevy_feathers"] + # Enable passthrough loading for SPIR-V shaders (Only supported on Vulkan, shader capabilities and extensions must agree with the platform implementation) spirv_shader_passthrough = ["bevy_internal/spirv_shader_passthrough"] @@ -4526,3 +4529,16 @@ name = "Core Widgets (w/Observers)" description = "Demonstrates use of core (headless) widgets in Bevy UI, with Observers" category = "UI (User Interface)" wasm = true + +[[example]] +name = "feathers" +path = "examples/ui/feathers.rs" +doc-scrape-examples = true +required-features = ["experimental_bevy_feathers"] + +[package.metadata.example.feathers] +name = "Feathers Widgets" +description = "Gallery of Feathers Widgets" +category = "UI (User Interface)" +wasm = true +hidden = true diff --git a/crates/bevy_core_widgets/src/core_button.rs b/crates/bevy_core_widgets/src/core_button.rs index 97b15b878d..0c0c638d20 100644 --- a/crates/bevy_core_widgets/src/core_button.rs +++ b/crates/bevy_core_widgets/src/core_button.rs @@ -18,7 +18,7 @@ use bevy_ui::{InteractionDisabled, Pressed}; /// Headless button widget. This widget maintains a "pressed" state, which is used to /// indicate whether the button is currently being pressed by the user. It emits a `ButtonClicked` /// event when the button is un-pressed. -#[derive(Component, Debug)] +#[derive(Component, Default, Debug)] #[require(AccessibilityNode(accesskit::Node::new(Role::Button)))] pub struct CoreButton { /// Optional system to run when the button is clicked, or when the Enter or Space key diff --git a/crates/bevy_core_widgets/src/core_slider.rs b/crates/bevy_core_widgets/src/core_slider.rs index d85f12dd22..2fab75738a 100644 --- a/crates/bevy_core_widgets/src/core_slider.rs +++ b/crates/bevy_core_widgets/src/core_slider.rs @@ -92,7 +92,9 @@ pub struct SliderValue(pub f32); #[derive(Component, Debug, PartialEq, Clone, Copy)] #[component(immutable)] pub struct SliderRange { + /// The beginning of the allowed range for the slider value. start: f32, + /// The end of the allowed range for the slider value. end: f32, } diff --git a/crates/bevy_feathers/Cargo.toml b/crates/bevy_feathers/Cargo.toml new file mode 100644 index 0000000000..2f8174c756 --- /dev/null +++ b/crates/bevy_feathers/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "bevy_feathers" +version = "0.17.0-dev" +edition = "2024" +description = "A collection of UI widgets for building editors and utilities in Bevy" +homepage = "https://bevyengine.org" +repository = "https://github.com/bevyengine/bevy" +license = "MIT OR Apache-2.0" +keywords = ["bevy"] + +[dependencies] +# bevy +bevy_app = { path = "../bevy_app", version = "0.17.0-dev" } +bevy_asset = { path = "../bevy_asset", version = "0.17.0-dev" } +bevy_color = { path = "../bevy_color", version = "0.17.0-dev" } +bevy_core_widgets = { path = "../bevy_core_widgets", version = "0.17.0-dev" } +bevy_ecs = { path = "../bevy_ecs", version = "0.17.0-dev" } +bevy_input_focus = { path = "../bevy_input_focus", version = "0.17.0-dev" } +bevy_log = { path = "../bevy_log", version = "0.17.0-dev" } +bevy_picking = { path = "../bevy_picking", version = "0.17.0-dev" } +bevy_platform = { path = "../bevy_platform", version = "0.17.0-dev" } +bevy_text = { path = "../bevy_text", version = "0.17.0-dev" } +bevy_ui = { path = "../bevy_ui", version = "0.17.0-dev", features = [ + "bevy_ui_picking_backend", +] } +bevy_window = { path = "../bevy_window", version = "0.17.0-dev" } +bevy_winit = { path = "../bevy_winit", version = "0.17.0-dev" } + +# other +accesskit = "0.19" + +[features] +default = [] + +[lints] +workspace = true + +[package.metadata.docs.rs] +rustdoc-args = ["-Zunstable-options", "--generate-link-to-definition"] +all-features = true diff --git a/crates/bevy_feathers/src/assets/fonts/FiraMono-LICENSE b/crates/bevy_feathers/src/assets/fonts/FiraMono-LICENSE new file mode 100644 index 0000000000..5e4608f24a --- /dev/null +++ b/crates/bevy_feathers/src/assets/fonts/FiraMono-LICENSE @@ -0,0 +1,93 @@ +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/crates/bevy_feathers/src/assets/fonts/FiraMono-Medium.ttf b/crates/bevy_feathers/src/assets/fonts/FiraMono-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..1e95ced4c44be8648f1555ab8c135a6799f8c5a5 GIT binary patch literal 173516 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

>(@<@>0tc& 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 z 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

*N&HECA^t4B6n_zy#b3o&;&0-L_`CR8{6kz7 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 H_|N|V7~3XI literal 0 HcmV?d00001 diff --git a/crates/bevy_feathers/src/assets/fonts/FiraSans-Bold.ttf b/crates/bevy_feathers/src/assets/fonts/FiraSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e3593fb0f3bd412542237820f34fbe74308bfada GIT binary patch literal 473876 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ÜlZa2d#87uVzd%VdDc4MO6yRc;CWgcyT+sPQxL?| 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

-8@@DNZE+$-g!C4QUN?(4pA^H0iaHtoE2K}osc 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%0A-#k^QB9wDbO|@cX0p(@y)$ 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

+-5eP>SOub=c42j}@5 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 a>$-zdR<@(M+0wmb?LpCMbyPQk=lb8x)RBS! literal 0 HcmV?d00001 diff --git a/crates/bevy_feathers/src/assets/fonts/FiraSans-BoldItalic.ttf b/crates/bevy_feathers/src/assets/fonts/FiraSans-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..305b0b8bad1c47b87f942d663bb9b3552bfc71b5 GIT binary patch literal 491048 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%0DfN_8}b2u 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

!mI~>bw%hXIzE}H^SM4Nu_W) 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

~=a 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
+pub const BLACK: Color = Color::oklcha(0.0, 0.0, 0.0, 1.0); +///
- window background +pub const GRAY_0: Color = Color::oklcha(0.2414, 0.0095, 285.67, 1.0); +///
- pane background +pub const GRAY_1: Color = Color::oklcha(0.2866, 0.0072, 285.93, 1.0); +///
- item background +pub const GRAY_2: Color = Color::oklcha(0.3373, 0.0071, 274.77, 1.0); +///
- item background (active) +pub const GRAY_3: Color = Color::oklcha(0.3992, 0.0101, 278.38, 1.0); +///
- border +pub const WARM_GRAY_1: Color = Color::oklcha(0.3757, 0.0017, 286.32, 1.0); +///
- bright label text +pub const LIGHT_GRAY_1: Color = Color::oklcha(0.7607, 0.0014, 286.37, 1.0); +///
- dim label text +pub const LIGHT_GRAY_2: Color = Color::oklcha(0.6106, 0.003, 286.31, 1.0); +///
- button label text +pub const WHITE: Color = Color::oklcha(1.0, 0.000000059604645, 90.0, 1.0); +///
- call-to-action and selection color +pub const ACCENT: Color = Color::oklcha(0.542, 0.1594, 255.4, 1.0); +///
- for X-axis inputs and drag handles +pub const X_AXIS: Color = Color::oklcha(0.5232, 0.1404, 13.84, 1.0); +///
- for Y-axis inputs and drag handles +pub const Y_AXIS: Color = Color::oklcha(0.5866, 0.1543, 129.84, 1.0); +///
- for Z-axis inputs and drag handles +pub const Z_AXIS: Color = Color::oklcha(0.4847, 0.1249, 253.08, 1.0); diff --git a/crates/bevy_feathers/src/rounded_corners.rs b/crates/bevy_feathers/src/rounded_corners.rs new file mode 100644 index 0000000000..4d2be9e0a8 --- /dev/null +++ b/crates/bevy_feathers/src/rounded_corners.rs @@ -0,0 +1,96 @@ +//! Mechanism for specifying which corners of a widget are rounded, used for segmented buttons +//! and control groups. +use bevy_ui::{BorderRadius, Val}; + +/// Allows specifying which corners are rounded and which are sharp. All rounded corners +/// have the same radius. Not all combinations are supported, only the ones that make +/// sense for a segmented buttons. +/// +/// A typical use case would be a segmented button consisting of 3 individual buttons in a +/// row. In that case, you would have the leftmost button have rounded corners on the left, +/// the right-most button have rounded corners on the right, and the center button have +/// only sharp corners. +#[derive(Debug, Clone, Copy, Default, PartialEq)] +pub enum RoundedCorners { + /// No corners are rounded. + None, + #[default] + /// All corners are rounded. + All, + /// Top-left corner is rounded. + TopLeft, + /// Top-right corner is rounded. + TopRight, + /// Bottom-right corner is rounded. + BottomRight, + /// Bottom-left corner is rounded. + BottomLeft, + /// Top corners are rounded. + Top, + /// Right corners are rounded. + Right, + /// Bottom corners are rounded. + Bottom, + /// Left corners are rounded. + Left, +} + +impl RoundedCorners { + /// Convert the `RoundedCorners` to a `BorderRadius` for use in a `Node`. + pub fn to_border_radius(&self, radius: f32) -> BorderRadius { + let radius = Val::Px(radius); + let zero = Val::ZERO; + match self { + RoundedCorners::None => BorderRadius::all(zero), + RoundedCorners::All => BorderRadius::all(radius), + RoundedCorners::TopLeft => BorderRadius { + top_left: radius, + top_right: zero, + bottom_right: zero, + bottom_left: zero, + }, + RoundedCorners::TopRight => BorderRadius { + top_left: zero, + top_right: radius, + bottom_right: zero, + bottom_left: zero, + }, + RoundedCorners::BottomRight => BorderRadius { + top_left: zero, + top_right: zero, + bottom_right: radius, + bottom_left: zero, + }, + RoundedCorners::BottomLeft => BorderRadius { + top_left: zero, + top_right: zero, + bottom_right: zero, + bottom_left: radius, + }, + RoundedCorners::Top => BorderRadius { + top_left: radius, + top_right: radius, + bottom_right: zero, + bottom_left: zero, + }, + RoundedCorners::Right => BorderRadius { + top_left: zero, + top_right: radius, + bottom_right: radius, + bottom_left: zero, + }, + RoundedCorners::Bottom => BorderRadius { + top_left: zero, + top_right: zero, + bottom_right: radius, + bottom_left: radius, + }, + RoundedCorners::Left => BorderRadius { + top_left: radius, + top_right: zero, + bottom_right: zero, + bottom_left: radius, + }, + } + } +} diff --git a/crates/bevy_feathers/src/theme.rs b/crates/bevy_feathers/src/theme.rs new file mode 100644 index 0000000000..fdca99fcbe --- /dev/null +++ b/crates/bevy_feathers/src/theme.rs @@ -0,0 +1,114 @@ +//! A framework for theming. +use bevy_app::Propagate; +use bevy_color::{palettes, Color}; +use bevy_ecs::{ + change_detection::DetectChanges, + component::Component, + lifecycle::Insert, + observer::On, + query::Changed, + resource::Resource, + system::{Commands, Query, Res}, +}; +use bevy_log::warn_once; +use bevy_platform::collections::HashMap; +use bevy_text::TextColor; +use bevy_ui::{BackgroundColor, BorderColor}; + +/// A collection of properties that make up a theme. +#[derive(Default, Clone)] +pub struct ThemeProps { + /// Map of design tokens to colors. + pub color: HashMap, + // Other style property types to be added later. +} + +/// The currently selected user interface theme. Overwriting this resource changes the theme. +#[derive(Resource, Default)] +pub struct UiTheme(pub ThemeProps); + +impl UiTheme { + /// Lookup a color by design token. If the theme does not have an entry for that token, + /// logs a warning and returns an error color. + pub fn color<'a>(&self, token: &'a str) -> Color { + let color = self.0.color.get(token); + match color { + Some(c) => *c, + None => { + warn_once!("Theme color {} not found.", token); + // Return a bright obnoxious color to make the error obvious. + palettes::basic::FUCHSIA.into() + } + } + } + + /// Associate a design token with a given color. + pub fn set_color(&mut self, token: impl Into, color: Color) { + self.0.color.insert(token.into(), color); + } +} + +/// Component which causes the background color of an entity to be set based on a theme color. +#[derive(Component, Clone, Copy)] +#[require(BackgroundColor)] +#[component(immutable)] +pub struct ThemeBackgroundColor(pub &'static str); + +/// Component which causes the border color of an entity to be set based on a theme color. +/// Only supports setting all borders to the same color. +#[derive(Component, Clone, Copy)] +#[require(BorderColor)] +#[component(immutable)] +pub struct ThemeBorderColor(pub &'static str); + +/// Component which causes the inherited text color of an entity to be set based on a theme color. +#[derive(Component, Clone, Copy)] +#[component(immutable)] +pub struct ThemeFontColor(pub &'static str); + +/// A marker component that is used to indicate that the text entity wants to opt-in to using +/// inherited text styles. +#[derive(Component)] +pub struct ThemedText; + +pub(crate) fn update_theme( + mut q_background: Query<(&mut BackgroundColor, &ThemeBackgroundColor)>, + theme: Res, +) { + if theme.is_changed() { + // Update all background colors + for (mut bg, theme_bg) in q_background.iter_mut() { + bg.0 = theme.color(theme_bg.0); + } + } +} + +pub(crate) fn on_changed_background( + ev: On, + mut q_background: Query< + (&mut BackgroundColor, &ThemeBackgroundColor), + Changed, + >, + theme: Res, +) { + // Update background colors where the design token has changed. + if let Ok((mut bg, theme_bg)) = q_background.get_mut(ev.target()) { + bg.0 = theme.color(theme_bg.0); + } +} + +/// An observer which looks for changes to the [`ThemeFontColor`] component on an entity, and +/// propagates downward the text color to all participating text entities. +pub(crate) fn on_changed_font_color( + ev: On, + font_color: Query<&ThemeFontColor>, + theme: Res, + mut commands: Commands, +) { + if let Ok(token) = font_color.get(ev.target()) { + let color = theme.color(token.0); + commands + .entity(ev.target()) + .insert(Propagate(TextColor(color))); + } +} diff --git a/crates/bevy_feathers/src/tokens.rs b/crates/bevy_feathers/src/tokens.rs new file mode 100644 index 0000000000..d254d1a09b --- /dev/null +++ b/crates/bevy_feathers/src/tokens.rs @@ -0,0 +1,76 @@ +//! Design tokens used by Feathers themes. +//! +//! The term "design token" is commonly used in UX design to mean the smallest unit of a theme, +//! similar in concept to a CSS variable. Each token represents an assignment of a color or +//! value to a specific visual aspect of a widget, such as background or border. + +/// Window background +pub const WINDOW_BG: &str = "feathers.window.bg"; + +/// Focus ring +pub const FOCUS_RING: &str = "feathers.focus"; + +/// Regular text +pub const TEXT_MAIN: &str = "feathers.text.main"; +/// Dim text +pub const TEXT_DIM: &str = "feathers.text.dim"; + +// Normal buttons + +/// Regular button background +pub const BUTTON_BG: &str = "feathers.button.bg"; +/// Regular button background (hovered) +pub const BUTTON_BG_HOVER: &str = "feathers.button.bg.hover"; +/// Regular button background (disabled) +pub const BUTTON_BG_DISABLED: &str = "feathers.button.bg.disabled"; +/// Regular button background (pressed) +pub const BUTTON_BG_PRESSED: &str = "feathers.button.bg.pressed"; +/// Regular button text +pub const BUTTON_TEXT: &str = "feathers.button.txt"; +/// Regular button text (disabled) +pub const BUTTON_TEXT_DISABLED: &str = "feathers.button.txt.disabled"; + +// Primary ("default") buttons + +/// Primary button background +pub const BUTTON_PRIMARY_BG: &str = "feathers.button.primary.bg"; +/// Primary button background (hovered) +pub const BUTTON_PRIMARY_BG_HOVER: &str = "feathers.button.primary.bg.hover"; +/// Primary button background (disabled) +pub const BUTTON_PRIMARY_BG_DISABLED: &str = "feathers.button.primary.bg.disabled"; +/// Primary button background (pressed) +pub const BUTTON_PRIMARY_BG_PRESSED: &str = "feathers.button.primary.bg.pressed"; +/// Primary button text +pub const BUTTON_PRIMARY_TEXT: &str = "feathers.button.primary.txt"; +/// Primary button text (disabled) +pub const BUTTON_PRIMARY_TEXT_DISABLED: &str = "feathers.button.primary.txt.disabled"; + +// Slider + +/// Background for slider +pub const SLIDER_BG: &str = "feathers.slider.bg"; +/// Background for slider moving bar +pub const SLIDER_BAR: &str = "feathers.slider.bar"; +/// Background for slider moving bar (disabled) +pub const SLIDER_BAR_DISABLED: &str = "feathers.slider.bar.disabled"; +/// Background for slider text +pub const SLIDER_TEXT: &str = "feathers.slider.text"; +/// Background for slider text (disabled) +pub const SLIDER_TEXT_DISABLED: &str = "feathers.slider.text.disabled"; + +// Checkbox + +/// Checkbox border around the checkmark +pub const CHECKBOX_BORDER: &str = "feathers.checkbox.border"; +/// Checkbox border around the checkmark (hovered) +pub const CHECKBOX_BORDER_HOVER: &str = "feathers.checkbox.border.hover"; +/// Checkbox border around the checkmark (disabled) +pub const CHECKBOX_BORDER_DISABLED: &str = "feathers.checkbox.border.disabled"; +/// Checkbox check mark +pub const CHECKBOX_MARK: &str = "feathers.checkbox.mark"; +/// Checkbox check mark (disabled) +pub const CHECKBOX_MARK_DISABLED: &str = "feathers.checkbox.mark.disabled"; +/// Checkbox label text +pub const CHECKBOX_TEXT: &str = "feathers.checkbox.text"; +/// Checkbox label text (disabled) +pub const CHECKBOX_TEXT_DISABLED: &str = "feathers.checkbox.text.disabled"; diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index 402ff45060..f418bc0edc 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -416,6 +416,7 @@ bevy_dev_tools = { path = "../bevy_dev_tools", optional = true, version = "0.17. bevy_gilrs = { path = "../bevy_gilrs", optional = true, version = "0.17.0-dev" } bevy_gizmos = { path = "../bevy_gizmos", optional = true, version = "0.17.0-dev", default-features = false } bevy_gltf = { path = "../bevy_gltf", optional = true, version = "0.17.0-dev" } +bevy_feathers = { path = "../bevy_feathers", optional = true, version = "0.17.0-dev" } bevy_image = { path = "../bevy_image", optional = true, version = "0.17.0-dev" } bevy_input_focus = { path = "../bevy_input_focus", optional = true, version = "0.17.0-dev", default-features = false, features = [ "bevy_reflect", diff --git a/crates/bevy_internal/src/lib.rs b/crates/bevy_internal/src/lib.rs index b9934088f1..107c84b180 100644 --- a/crates/bevy_internal/src/lib.rs +++ b/crates/bevy_internal/src/lib.rs @@ -35,6 +35,8 @@ pub use bevy_core_widgets as core_widgets; pub use bevy_dev_tools as dev_tools; pub use bevy_diagnostic as diagnostic; pub use bevy_ecs as ecs; +#[cfg(feature = "bevy_feathers")] +pub use bevy_feathers as feathers; #[cfg(feature = "bevy_gilrs")] pub use bevy_gilrs as gilrs; #[cfg(feature = "bevy_gizmos")] diff --git a/crates/bevy_text/src/text.rs b/crates/bevy_text/src/text.rs index ccfdb2a372..330f0d977a 100644 --- a/crates/bevy_text/src/text.rs +++ b/crates/bevy_text/src/text.rs @@ -276,7 +276,7 @@ impl From for cosmic_text::Align { /// `TextFont` determines the style of a text span within a [`ComputedTextBlock`], specifically /// the font face, the font size, and the color. -#[derive(Component, Clone, Debug, Reflect)] +#[derive(Component, Clone, Debug, Reflect, PartialEq)] #[reflect(Component, Default, Debug, Clone)] pub struct TextFont { /// The specific font face to use, as a `Handle` to a [`Font`] asset. diff --git a/docs/cargo_features.md b/docs/cargo_features.md index fc38577509..0b12f1ffec 100644 --- a/docs/cargo_features.md +++ b/docs/cargo_features.md @@ -81,6 +81,7 @@ The default feature set enables most of the expected features of a game engine, |detailed_trace|Enable detailed trace event logging. These trace events are expensive even when off, thus they require compile time opt-in| |dynamic_linking|Force dynamic linking, which improves iterative compile times| |embedded_watcher|Enables watching in memory asset providers for Bevy Asset hot-reloading| +|experimental_bevy_feathers|Feathers widget collection.| |experimental_pbr_pcss|Enable support for PCSS, at the risk of blowing past the global, per-shader sampler limit on older/lower-end GPUs| |exr|EXR image format support| |ff|Farbfeld image format support| diff --git a/examples/ui/feathers.rs b/examples/ui/feathers.rs new file mode 100644 index 0000000000..54bae222ec --- /dev/null +++ b/examples/ui/feathers.rs @@ -0,0 +1,180 @@ +//! This example shows off the various Bevy Feathers widgets. + +use bevy::{ + core_widgets::{CoreWidgetsPlugin, SliderStep}, + feathers::{ + controls::{button, slider, ButtonProps, ButtonVariant, SliderProps}, + dark_theme::create_dark_theme, + rounded_corners::RoundedCorners, + theme::{ThemeBackgroundColor, ThemedText, UiTheme}, + tokens, FeathersPlugin, + }, + input_focus::{ + tab_navigation::{TabGroup, TabNavigationPlugin}, + InputDispatchPlugin, + }, + prelude::*, + ui::InteractionDisabled, + winit::WinitSettings, +}; + +fn main() { + App::new() + .add_plugins(( + DefaultPlugins, + CoreWidgetsPlugin, + InputDispatchPlugin, + TabNavigationPlugin, + FeathersPlugin, + )) + .insert_resource(UiTheme(create_dark_theme())) + // Only run the app when there is user input. This will significantly reduce CPU/GPU use. + .insert_resource(WinitSettings::desktop_app()) + .add_systems(Startup, setup) + .run(); +} + +fn setup(mut commands: Commands) { + // ui camera + commands.spawn(Camera2d); + let root = demo_root(&mut commands); + commands.spawn(root); +} + +fn demo_root(commands: &mut Commands) -> impl Bundle { + ( + Node { + width: Val::Percent(100.0), + height: Val::Percent(100.0), + align_items: AlignItems::Start, + justify_content: JustifyContent::Start, + display: Display::Flex, + flex_direction: FlexDirection::Column, + row_gap: Val::Px(10.0), + ..default() + }, + TabGroup::default(), + ThemeBackgroundColor(tokens::WINDOW_BG), + children![( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Column, + align_items: AlignItems::Stretch, + justify_content: JustifyContent::Start, + padding: UiRect::all(Val::Px(8.0)), + row_gap: Val::Px(8.0), + width: Val::Percent(30.), + min_width: Val::Px(200.), + ..default() + }, + children![ + ( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Row, + align_items: AlignItems::Center, + justify_content: JustifyContent::Start, + column_gap: Val::Px(8.0), + ..default() + }, + children![ + button( + ButtonProps { + on_click: Some(commands.register_system(|| { + info!("Normal button clicked!"); + })), + ..default() + }, + (), + Spawn((Text::new("Normal"), ThemedText)) + ), + button( + ButtonProps { + on_click: Some(commands.register_system(|| { + info!("Disabled button clicked!"); + })), + ..default() + }, + InteractionDisabled, + Spawn((Text::new("Disabled"), ThemedText)) + ), + button( + ButtonProps { + on_click: Some(commands.register_system(|| { + info!("Primary button clicked!"); + })), + variant: ButtonVariant::Primary, + ..default() + }, + (), + Spawn((Text::new("Primary"), ThemedText)) + ), + ] + ), + ( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Row, + align_items: AlignItems::Center, + justify_content: JustifyContent::Start, + column_gap: Val::Px(1.0), + ..default() + }, + children![ + button( + ButtonProps { + on_click: Some(commands.register_system(|| { + info!("Left button clicked!"); + })), + corners: RoundedCorners::Left, + ..default() + }, + (), + Spawn((Text::new("Left"), ThemedText)) + ), + button( + ButtonProps { + on_click: Some(commands.register_system(|| { + info!("Center button clicked!"); + })), + corners: RoundedCorners::None, + ..default() + }, + (), + Spawn((Text::new("Center"), ThemedText)) + ), + button( + ButtonProps { + on_click: Some(commands.register_system(|| { + info!("Right button clicked!"); + })), + variant: ButtonVariant::Primary, + corners: RoundedCorners::Right, + }, + (), + Spawn((Text::new("Right"), ThemedText)) + ), + ] + ), + button( + ButtonProps { + on_click: Some(commands.register_system(|| { + info!("Wide button clicked!"); + })), + ..default() + }, + (), + Spawn((Text::new("Button"), ThemedText)) + ), + slider( + SliderProps { + max: 100.0, + value: 20.0, + ..default() + }, + SliderStep(10.) + ), + ] + ),], + ) +} diff --git a/release-content/release-notes/feathers.md b/release-content/release-notes/feathers.md new file mode 100644 index 0000000000..199a406db6 --- /dev/null +++ b/release-content/release-notes/feathers.md @@ -0,0 +1,26 @@ +--- +title: Bevy Feathers +authors: ["@viridia", "@Atlas16A"] +pull_requests: [19730] +--- + +To make it easier for Bevy engine developers and third-party tool creators to make comfortable, visually cohesive tooling, +we're pleased to introduce "Feathers" - a comprehensive widget set that offers: + +- Standard widgets designed to match the look and feel of the planned Bevy Editor +- Components that can be leveraged to build custom editors, inspectors, and utility interfaces +- Essential UI elements including buttons, sliders, checkboxes, menu buttons, and more +- Layout containers for organizing and structuring UI elements +- Decorative elements such as icons for visual enhancement +- Robust theming support ensuring consistent visual styling across applications +- Accessibility features with built-in screen reader and assistive technology support +- Interactive cursor behavior that changes appropriately when hovering over widgets + +Feathers isn't meant as a toolkit for building exciting and cool game UIs: it has a somewhat plain +and utilitarian look and feel suitable for editors and graphical utilities. That being said, using +the themeing framework, you can spice up the colors quite a bit. +It can also serve as a helpful base to understand how to extend and style `bevy_ui` and our new core widgets; +copy the code into your project and start hacking! + +Feathers is still in development, and is currently hidden behind an experimental feature flag, +`experimental_bevy_feathers`. From 57e58ef997f72f3dcb5535f07137e9d159eb095f Mon Sep 17 00:00:00 2001 From: atlv Date: Sat, 28 Jun 2025 20:04:21 -0400 Subject: [PATCH 09/68] Meshlet BVH Culling (#19318) # Objective - Merge @SparkyPotato 's efforts to implement BVH-accelerated meshlet culling. ## Solution - Add hot reloading support - Fix near-plane overculling - Fix hzb sampling - Fix orthographic error metric ## Testing - Meshlet example, Nsight, hot-reloading and careful thinking --------- Co-authored-by: SparkyPotato Co-authored-by: JMS55 <47158642+JMS55@users.noreply.github.com> Co-authored-by: charlotte --- crates/bevy_pbr/src/lib.rs | 14 +- crates/bevy_pbr/src/meshlet/asset.rs | 99 +- crates/bevy_pbr/src/meshlet/cull_bvh.wgsl | 110 ++ .../bevy_pbr/src/meshlet/cull_clusters.wgsl | 231 ++-- .../bevy_pbr/src/meshlet/cull_instances.wgsl | 76 ++ .../src/meshlet/fill_cluster_buffers.wgsl | 50 - crates/bevy_pbr/src/meshlet/fill_counts.wgsl | 35 + crates/bevy_pbr/src/meshlet/from_mesh.rs | 766 +++++++++---- .../bevy_pbr/src/meshlet/instance_manager.rs | 61 +- .../src/meshlet/material_pipeline_prepare.rs | 43 +- .../src/meshlet/material_shade_nodes.rs | 11 +- .../src/meshlet/meshlet_bindings.wgsl | 195 +++- .../src/meshlet/meshlet_cull_shared.wgsl | 207 ++++ .../src/meshlet/meshlet_mesh_manager.rs | 96 +- crates/bevy_pbr/src/meshlet/mod.rs | 82 +- .../bevy_pbr/src/meshlet/persistent_buffer.rs | 9 +- .../src/meshlet/persistent_buffer_impls.rs | 92 +- crates/bevy_pbr/src/meshlet/pipelines.rs | 225 ++-- .../src/meshlet/remap_1d_to_2d_dispatch.wgsl | 7 +- .../src/meshlet/resolve_render_targets.wgsl | 5 +- .../bevy_pbr/src/meshlet/resource_manager.rs | 1006 +++++++++++------ .../visibility_buffer_hardware_raster.wgsl | 13 +- .../meshlet/visibility_buffer_raster_node.rs | 452 +++++--- .../meshlet/visibility_buffer_resolve.wgsl | 8 +- .../visibility_buffer_software_raster.wgsl | 10 +- examples/3d/meshlet.rs | 4 +- 26 files changed, 2636 insertions(+), 1271 deletions(-) create mode 100644 crates/bevy_pbr/src/meshlet/cull_bvh.wgsl create mode 100644 crates/bevy_pbr/src/meshlet/cull_instances.wgsl delete mode 100644 crates/bevy_pbr/src/meshlet/fill_cluster_buffers.wgsl create mode 100644 crates/bevy_pbr/src/meshlet/fill_counts.wgsl create mode 100644 crates/bevy_pbr/src/meshlet/meshlet_cull_shared.wgsl diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index b72c58c2d2..f0e6fa90d7 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -124,7 +124,7 @@ pub mod graph { use crate::{deferred::DeferredPbrLightingPlugin, graph::NodePbr}; use bevy_app::prelude::*; -use bevy_asset::{load_internal_asset, weak_handle, AssetApp, AssetPath, Assets, Handle}; +use bevy_asset::{AssetApp, AssetPath, Assets, Handle}; use bevy_core_pipeline::core_3d::graph::{Core3d, Node3d}; use bevy_ecs::prelude::*; use bevy_image::Image; @@ -135,7 +135,7 @@ use bevy_render::{ extract_resource::ExtractResourcePlugin, load_shader_library, render_graph::RenderGraph, - render_resource::{Shader, ShaderRef}, + render_resource::ShaderRef, sync_component::SyncComponentPlugin, view::VisibilitySystems, ExtractSchedule, Render, RenderApp, RenderDebugFlags, RenderSystems, @@ -149,9 +149,6 @@ fn shader_ref(path: PathBuf) -> ShaderRef { ShaderRef::Path(AssetPath::from_path_buf(path).with_source("embedded")) } -const MESHLET_VISIBILITY_BUFFER_RESOLVE_SHADER_HANDLE: Handle = - weak_handle!("69187376-3dea-4d0f-b3f5-185bde63d6a2"); - pub const TONEMAPPING_LUT_TEXTURE_BINDING_INDEX: u32 = 18; pub const TONEMAPPING_LUT_SAMPLER_BINDING_INDEX: u32 = 19; @@ -205,12 +202,7 @@ impl Plugin for PbrPlugin { load_shader_library!(app, "render/view_transformations.wgsl"); // Setup dummy shaders for when MeshletPlugin is not used to prevent shader import errors. - load_internal_asset!( - app, - MESHLET_VISIBILITY_BUFFER_RESOLVE_SHADER_HANDLE, - "meshlet/dummy_visibility_buffer_resolve.wgsl", - Shader::from_wgsl - ); + load_shader_library!(app, "meshlet/dummy_visibility_buffer_resolve.wgsl"); app.register_asset_reflect::() .register_type::() diff --git a/crates/bevy_pbr/src/meshlet/asset.rs b/crates/bevy_pbr/src/meshlet/asset.rs index c158650d1b..584ea345e3 100644 --- a/crates/bevy_pbr/src/meshlet/asset.rs +++ b/crates/bevy_pbr/src/meshlet/asset.rs @@ -6,9 +6,9 @@ use bevy_asset::{ }; use bevy_math::{Vec2, Vec3}; use bevy_reflect::TypePath; +use bevy_render::render_resource::ShaderType; use bevy_tasks::block_on; use bytemuck::{Pod, Zeroable}; -use half::f16; use lz4_flex::frame::{FrameDecoder, FrameEncoder}; use std::io::{Read, Write}; use thiserror::Error; @@ -17,7 +17,7 @@ use thiserror::Error; const MESHLET_MESH_ASSET_MAGIC: u64 = 1717551717668; /// The current version of the [`MeshletMesh`] asset format. -pub const MESHLET_MESH_ASSET_VERSION: u64 = 1; +pub const MESHLET_MESH_ASSET_VERSION: u64 = 2; /// A mesh that has been pre-processed into multiple small clusters of triangles called meshlets. /// @@ -47,12 +47,32 @@ pub struct MeshletMesh { pub(crate) vertex_uvs: Arc<[Vec2]>, /// Triangle indices for meshlets. pub(crate) indices: Arc<[u8]>, + /// The BVH8 used for culling and LOD selection of the meshlets. The root is at index 0. + pub(crate) bvh: Arc<[BvhNode]>, /// The list of meshlets making up this mesh. pub(crate) meshlets: Arc<[Meshlet]>, /// Spherical bounding volumes. - pub(crate) meshlet_bounding_spheres: Arc<[MeshletBoundingSpheres]>, - /// Meshlet group and parent group simplification errors. - pub(crate) meshlet_simplification_errors: Arc<[MeshletSimplificationError]>, + pub(crate) meshlet_cull_data: Arc<[MeshletCullData]>, + /// The tight AABB of the meshlet mesh, used for frustum and occlusion culling at the instance + /// level. + pub(crate) aabb: MeshletAabb, + /// The depth of the culling BVH, used to determine the number of dispatches at runtime. + pub(crate) bvh_depth: u32, +} + +/// A single BVH8 node in the BVH used for culling and LOD selection of a [`MeshletMesh`]. +#[derive(Copy, Clone, Default, Pod, Zeroable)] +#[repr(C)] +pub struct BvhNode { + /// The tight AABBs of this node's children, used for frustum and occlusion during BVH + /// traversal. + pub aabbs: [MeshletAabbErrorOffset; 8], + /// The LOD bounding spheres of this node's children, used for LOD selection during BVH + /// traversal. + pub lod_bounds: [MeshletBoundingSphere; 8], + /// If `u8::MAX`, it indicates that the child of each children is a BVH node, otherwise it is the number of meshlets in the group. + pub child_counts: [u8; 8], + pub _padding: [u32; 2], } /// A single meshlet within a [`MeshletMesh`]. @@ -91,33 +111,39 @@ pub struct Meshlet { /// Bounding spheres used for culling and choosing level of detail for a [`Meshlet`]. #[derive(Copy, Clone, Pod, Zeroable)] #[repr(C)] -pub struct MeshletBoundingSpheres { - /// Bounding sphere used for frustum and occlusion culling for this meshlet. - pub culling_sphere: MeshletBoundingSphere, +pub struct MeshletCullData { + /// Tight bounding box, used for frustum and occlusion culling for this meshlet. + pub aabb: MeshletAabbErrorOffset, /// Bounding sphere used for determining if this meshlet's group is at the correct level of detail for a given view. pub lod_group_sphere: MeshletBoundingSphere, - /// Bounding sphere used for determining if this meshlet's parent group is at the correct level of detail for a given view. - pub lod_parent_group_sphere: MeshletBoundingSphere, +} + +/// An axis-aligned bounding box used for a [`Meshlet`]. +#[derive(Copy, Clone, Default, Pod, Zeroable, ShaderType)] +#[repr(C)] +pub struct MeshletAabb { + pub center: Vec3, + pub half_extent: Vec3, +} + +// An axis-aligned bounding box used for a [`Meshlet`]. +#[derive(Copy, Clone, Default, Pod, Zeroable, ShaderType)] +#[repr(C)] +pub struct MeshletAabbErrorOffset { + pub center: Vec3, + pub error: f32, + pub half_extent: Vec3, + pub child_offset: u32, } /// A spherical bounding volume used for a [`Meshlet`]. -#[derive(Copy, Clone, Pod, Zeroable)] +#[derive(Copy, Clone, Default, Pod, Zeroable)] #[repr(C)] pub struct MeshletBoundingSphere { pub center: Vec3, pub radius: f32, } -/// Simplification error used for choosing level of detail for a [`Meshlet`]. -#[derive(Copy, Clone, Pod, Zeroable)] -#[repr(C)] -pub struct MeshletSimplificationError { - /// Simplification error used for determining if this meshlet's group is at the correct level of detail for a given view. - pub group_error: f16, - /// Simplification error used for determining if this meshlet's parent group is at the correct level of detail for a given view. - pub parent_group_error: f16, -} - /// An [`AssetSaver`] for `.meshlet_mesh` [`MeshletMesh`] assets. pub struct MeshletMeshSaver; @@ -143,15 +169,23 @@ impl AssetSaver for MeshletMeshSaver { .write_all(&MESHLET_MESH_ASSET_VERSION.to_le_bytes()) .await?; + writer.write_all(bytemuck::bytes_of(&asset.aabb)).await?; + writer + .write_all(bytemuck::bytes_of(&asset.bvh_depth)) + .await?; + // Compress and write asset data let mut writer = FrameEncoder::new(AsyncWriteSyncAdapter(writer)); write_slice(&asset.vertex_positions, &mut writer)?; write_slice(&asset.vertex_normals, &mut writer)?; write_slice(&asset.vertex_uvs, &mut writer)?; write_slice(&asset.indices, &mut writer)?; + write_slice(&asset.bvh, &mut writer)?; write_slice(&asset.meshlets, &mut writer)?; - write_slice(&asset.meshlet_bounding_spheres, &mut writer)?; - write_slice(&asset.meshlet_simplification_errors, &mut writer)?; + write_slice(&asset.meshlet_cull_data, &mut writer)?; + // BUG: Flushing helps with an async_fs bug, but it still fails sometimes. https://github.com/smol-rs/async-fs/issues/45 + // ERROR bevy_asset::server: Failed to load asset with asset loader MeshletMeshLoader: failed to fill whole buffer + writer.flush()?; writer.finish()?; Ok(()) @@ -184,24 +218,33 @@ impl AssetLoader for MeshletMeshLoader { return Err(MeshletMeshSaveOrLoadError::WrongVersion { found: version }); } + let mut bytes = [0u8; size_of::()]; + reader.read_exact(&mut bytes).await?; + let aabb = bytemuck::cast(bytes); + let mut bytes = [0u8; size_of::()]; + reader.read_exact(&mut bytes).await?; + let bvh_depth = u32::from_le_bytes(bytes); + // Load and decompress asset data let reader = &mut FrameDecoder::new(AsyncReadSyncAdapter(reader)); let vertex_positions = read_slice(reader)?; let vertex_normals = read_slice(reader)?; let vertex_uvs = read_slice(reader)?; let indices = read_slice(reader)?; + let bvh = read_slice(reader)?; let meshlets = read_slice(reader)?; - let meshlet_bounding_spheres = read_slice(reader)?; - let meshlet_simplification_errors = read_slice(reader)?; + let meshlet_cull_data = read_slice(reader)?; Ok(MeshletMesh { vertex_positions, vertex_normals, vertex_uvs, indices, + bvh, meshlets, - meshlet_bounding_spheres, - meshlet_simplification_errors, + meshlet_cull_data, + aabb, + bvh_depth, }) } @@ -218,7 +261,7 @@ pub enum MeshletMeshSaveOrLoadError { WrongVersion { found: u64 }, #[error("failed to compress or decompress asset data")] CompressionOrDecompression(#[from] lz4_flex::frame::Error), - #[error("failed to read or write asset data")] + #[error(transparent)] Io(#[from] std::io::Error), } diff --git a/crates/bevy_pbr/src/meshlet/cull_bvh.wgsl b/crates/bevy_pbr/src/meshlet/cull_bvh.wgsl new file mode 100644 index 0000000000..b0bbb5f89b --- /dev/null +++ b/crates/bevy_pbr/src/meshlet/cull_bvh.wgsl @@ -0,0 +1,110 @@ +#import bevy_pbr::meshlet_bindings::{ + InstancedOffset, + get_aabb, + get_aabb_error, + get_aabb_child_offset, + constants, + meshlet_bvh_nodes, + meshlet_bvh_cull_count_read, + meshlet_bvh_cull_count_write, + meshlet_bvh_cull_dispatch, + meshlet_bvh_cull_queue, + meshlet_meshlet_cull_count_early, + meshlet_meshlet_cull_count_late, + meshlet_meshlet_cull_dispatch_early, + meshlet_meshlet_cull_dispatch_late, + meshlet_meshlet_cull_queue, + meshlet_second_pass_bvh_count, + meshlet_second_pass_bvh_dispatch, + meshlet_second_pass_bvh_queue, +} +#import bevy_pbr::meshlet_cull_shared::{ + lod_error_is_imperceptible, + aabb_in_frustum, + should_occlusion_cull_aabb, +} + +@compute +@workgroup_size(128, 1, 1) // 8 threads per node, 16 nodes per workgroup +fn cull_bvh(@builtin(global_invocation_id) global_invocation_id: vec3) { + // Calculate the queue ID for this thread + let dispatch_id = global_invocation_id.x; + var node = dispatch_id >> 3u; + let subnode = dispatch_id & 7u; + if node >= meshlet_bvh_cull_count_read { return; } + + node = select(node, constants.rightmost_slot - node, constants.read_from_front == 0u); + let instanced_offset = meshlet_bvh_cull_queue[node]; + let instance_id = instanced_offset.instance_id; + let bvh_node = &meshlet_bvh_nodes[instanced_offset.offset]; + + var aabb_error_offset = (*bvh_node).aabbs[subnode]; + let aabb = get_aabb(&aabb_error_offset); + let parent_error = get_aabb_error(&aabb_error_offset); + let lod_sphere = (*bvh_node).lod_bounds[subnode]; + + let parent_is_imperceptible = lod_error_is_imperceptible(lod_sphere, parent_error, instance_id); + // Error and frustum cull, in both passes + if parent_is_imperceptible || !aabb_in_frustum(aabb, instance_id) { return; } + + let child_offset = get_aabb_child_offset(&aabb_error_offset); + let index = subnode >> 2u; + let bit_offset = subnode & 3u; + let packed_child_count = (*bvh_node).child_counts[index]; + let child_count = extractBits(packed_child_count, bit_offset * 8u, 8u); + var value = InstancedOffset(instance_id, child_offset); + + // If we pass, try occlusion culling + // If this node was occluded, push it's children to the second pass to check against this frame's HZB + if should_occlusion_cull_aabb(aabb, instance_id) { +#ifdef MESHLET_FIRST_CULLING_PASS + if child_count == 255u { + let id = atomicAdd(&meshlet_second_pass_bvh_count, 1u); + meshlet_second_pass_bvh_queue[id] = value; + if ((id & 15u) == 0u) { + atomicAdd(&meshlet_second_pass_bvh_dispatch.x, 1u); + } + } else { + let base = atomicAdd(&meshlet_meshlet_cull_count_late, child_count); + let start = constants.rightmost_slot - base; + for (var i = start; i < start - child_count; i--) { + meshlet_meshlet_cull_queue[i] = value; + value.offset += 1u; + } + let req = (base + child_count + 127u) >> 7u; + atomicMax(&meshlet_meshlet_cull_dispatch_late.x, req); + } +#endif + return; + } + + // If we pass, push the children to the next BVH cull + if child_count == 255u { + let id = atomicAdd(&meshlet_bvh_cull_count_write, 1u); + let index = select(constants.rightmost_slot - id, id, constants.read_from_front == 0u); + meshlet_bvh_cull_queue[index] = value; + if ((id & 15u) == 0u) { + atomicAdd(&meshlet_bvh_cull_dispatch.x, 1u); + } + } else { +#ifdef MESHLET_FIRST_CULLING_PASS + let base = atomicAdd(&meshlet_meshlet_cull_count_early, child_count); + let end = base + child_count; + for (var i = base; i < end; i++) { + meshlet_meshlet_cull_queue[i] = value; + value.offset += 1u; + } + let req = (end + 127u) >> 7u; + atomicMax(&meshlet_meshlet_cull_dispatch_early.x, req); +#else + let base = atomicAdd(&meshlet_meshlet_cull_count_late, child_count); + let start = constants.rightmost_slot - base; + for (var i = start; i < start - child_count; i--) { + meshlet_meshlet_cull_queue[i] = value; + value.offset += 1u; + } + let req = (base + child_count + 127u) >> 7u; + atomicMax(&meshlet_meshlet_cull_dispatch_late.x, req); +#endif + } +} diff --git a/crates/bevy_pbr/src/meshlet/cull_clusters.wgsl b/crates/bevy_pbr/src/meshlet/cull_clusters.wgsl index 47f6dbb04b..85cbc0654d 100644 --- a/crates/bevy_pbr/src/meshlet/cull_clusters.wgsl +++ b/crates/bevy_pbr/src/meshlet/cull_clusters.wgsl @@ -1,194 +1,93 @@ #import bevy_pbr::meshlet_bindings::{ - meshlet_cluster_meshlet_ids, - meshlet_bounding_spheres, - meshlet_simplification_errors, - meshlet_cluster_instance_ids, - meshlet_instance_uniforms, - meshlet_second_pass_candidates, - depth_pyramid, + InstancedOffset, + get_aabb, + get_aabb_error, + constants, view, - previous_view, - should_cull_instance, - cluster_is_second_pass_candidate, + meshlet_instance_uniforms, + meshlet_cull_data, meshlet_software_raster_indirect_args, meshlet_hardware_raster_indirect_args, + meshlet_previous_raster_counts, meshlet_raster_clusters, - constants, - MeshletBoundingSphere, + meshlet_meshlet_cull_count_read, + meshlet_meshlet_cull_count_write, + meshlet_meshlet_cull_dispatch, + meshlet_meshlet_cull_queue, +} +#import bevy_pbr::meshlet_cull_shared::{ + ScreenAabb, + project_aabb, + lod_error_is_imperceptible, + aabb_in_frustum, + should_occlusion_cull_aabb, } #import bevy_render::maths::affine3_to_square -/// Culls individual clusters (1 per thread) in two passes (two pass occlusion culling), and outputs a bitmask of which clusters survived. -/// 1. The first pass tests instance visibility, frustum culling, LOD selection, and finally occlusion culling using last frame's depth pyramid. -/// 2. The second pass performs occlusion culling (using the depth buffer generated from the first pass) on all clusters that passed -/// the instance, frustum, and LOD tests in the first pass, but were not visible last frame according to the occlusion culling. - @compute -@workgroup_size(128, 1, 1) // 128 threads per workgroup, 1 cluster per thread -fn cull_clusters( - @builtin(workgroup_id) workgroup_id: vec3, - @builtin(num_workgroups) num_workgroups: vec3, - @builtin(local_invocation_index) local_invocation_index: u32, -) { - // Calculate the cluster ID for this thread - let cluster_id = local_invocation_index + 128u * dot(workgroup_id, vec3(num_workgroups.x * num_workgroups.x, num_workgroups.x, 1u)); - if cluster_id >= constants.scene_cluster_count { return; } - -#ifdef MESHLET_SECOND_CULLING_PASS - if !cluster_is_second_pass_candidate(cluster_id) { return; } -#endif - - // Check for instance culling - let instance_id = meshlet_cluster_instance_ids[cluster_id]; -#ifdef MESHLET_FIRST_CULLING_PASS - if should_cull_instance(instance_id) { return; } -#endif - - // Calculate world-space culling bounding sphere for the cluster - let instance_uniform = meshlet_instance_uniforms[instance_id]; - let meshlet_id = meshlet_cluster_meshlet_ids[cluster_id]; - let world_from_local = affine3_to_square(instance_uniform.world_from_local); - let world_scale = max(length(world_from_local[0]), max(length(world_from_local[1]), length(world_from_local[2]))); - let bounding_spheres = meshlet_bounding_spheres[meshlet_id]; - let culling_bounding_sphere_center = world_from_local * vec4(bounding_spheres.culling_sphere.center, 1.0); - let culling_bounding_sphere_radius = world_scale * bounding_spheres.culling_sphere.radius; +@workgroup_size(128, 1, 1) // 1 cluster per thread +fn cull_clusters(@builtin(global_invocation_id) global_invocation_id: vec3) { + if global_invocation_id.x >= meshlet_meshlet_cull_count_read { return; } #ifdef MESHLET_FIRST_CULLING_PASS - // Frustum culling - // TODO: Faster method from https://vkguide.dev/docs/gpudriven/compute_culling/#frustum-culling-function - for (var i = 0u; i < 6u; i++) { - if dot(view.frustum[i], culling_bounding_sphere_center) + culling_bounding_sphere_radius <= 0.0 { - return; - } - } - - // Check LOD cut (cluster group error imperceptible, and parent group error not imperceptible) - let simplification_errors = unpack2x16float(meshlet_simplification_errors[meshlet_id]); - let lod_is_ok = lod_error_is_imperceptible(bounding_spheres.lod_group_sphere, simplification_errors.x, world_from_local, world_scale); - let parent_lod_is_ok = lod_error_is_imperceptible(bounding_spheres.lod_parent_group_sphere, simplification_errors.y, world_from_local, world_scale); - if !lod_is_ok || parent_lod_is_ok { return; } -#endif - - // Project the culling bounding sphere to view-space for occlusion culling -#ifdef MESHLET_FIRST_CULLING_PASS - let previous_world_from_local = affine3_to_square(instance_uniform.previous_world_from_local); - let previous_world_from_local_scale = max(length(previous_world_from_local[0]), max(length(previous_world_from_local[1]), length(previous_world_from_local[2]))); - let occlusion_culling_bounding_sphere_center = previous_world_from_local * vec4(bounding_spheres.culling_sphere.center, 1.0); - let occlusion_culling_bounding_sphere_radius = previous_world_from_local_scale * bounding_spheres.culling_sphere.radius; - let occlusion_culling_bounding_sphere_center_view_space = (previous_view.view_from_world * vec4(occlusion_culling_bounding_sphere_center.xyz, 1.0)).xyz; + let meshlet_id = global_invocation_id.x; #else - let occlusion_culling_bounding_sphere_center = culling_bounding_sphere_center; - let occlusion_culling_bounding_sphere_radius = culling_bounding_sphere_radius; - let occlusion_culling_bounding_sphere_center_view_space = (view.view_from_world * vec4(occlusion_culling_bounding_sphere_center.xyz, 1.0)).xyz; + let meshlet_id = constants.rightmost_slot - global_invocation_id.x; #endif + let instanced_offset = meshlet_meshlet_cull_queue[meshlet_id]; + let instance_id = instanced_offset.instance_id; + let cull_data = &meshlet_cull_data[instanced_offset.offset]; + var aabb_error_offset = (*cull_data).aabb; + let aabb = get_aabb(&aabb_error_offset); + let error = get_aabb_error(&aabb_error_offset); + let lod_sphere = (*cull_data).lod_group_sphere; - var aabb = project_view_space_sphere_to_screen_space_aabb(occlusion_culling_bounding_sphere_center_view_space, occlusion_culling_bounding_sphere_radius); - let depth_pyramid_size_mip_0 = vec2(textureDimensions(depth_pyramid, 0)); - var aabb_width_pixels = (aabb.z - aabb.x) * depth_pyramid_size_mip_0.x; - var aabb_height_pixels = (aabb.w - aabb.y) * depth_pyramid_size_mip_0.y; - let depth_level = max(0, i32(ceil(log2(max(aabb_width_pixels, aabb_height_pixels))))); // TODO: Naga doesn't like this being a u32 - let depth_pyramid_size = vec2(textureDimensions(depth_pyramid, depth_level)); - let aabb_top_left = vec2(aabb.xy * depth_pyramid_size); + let is_imperceptible = lod_error_is_imperceptible(lod_sphere, error, instance_id); + // Error and frustum cull, in both passes + if !is_imperceptible || !aabb_in_frustum(aabb, instance_id) { return; } - let depth_quad_a = textureLoad(depth_pyramid, aabb_top_left, depth_level).x; - let depth_quad_b = textureLoad(depth_pyramid, aabb_top_left + vec2(1u, 0u), depth_level).x; - let depth_quad_c = textureLoad(depth_pyramid, aabb_top_left + vec2(0u, 1u), depth_level).x; - let depth_quad_d = textureLoad(depth_pyramid, aabb_top_left + vec2(1u, 1u), depth_level).x; - let occluder_depth = min(min(depth_quad_a, depth_quad_b), min(depth_quad_c, depth_quad_d)); - - // Check whether or not the cluster would be occluded if drawn - var cluster_visible: bool; - if view.clip_from_view[3][3] == 1.0 { - // Orthographic - let sphere_depth = view.clip_from_view[3][2] + (occlusion_culling_bounding_sphere_center_view_space.z + occlusion_culling_bounding_sphere_radius) * view.clip_from_view[2][2]; - cluster_visible = sphere_depth >= occluder_depth; - } else { - // Perspective - let sphere_depth = -view.clip_from_view[3][2] / (occlusion_culling_bounding_sphere_center_view_space.z + occlusion_culling_bounding_sphere_radius); - cluster_visible = sphere_depth >= occluder_depth; - } - - // Write if the cluster should be occlusion tested in the second pass + // If we pass, try occlusion culling + // If this node was occluded, push it's children to the second pass to check against this frame's HZB + if should_occlusion_cull_aabb(aabb, instance_id) { #ifdef MESHLET_FIRST_CULLING_PASS - if !cluster_visible { - let bit = 1u << cluster_id % 32u; - atomicOr(&meshlet_second_pass_candidates[cluster_id / 32u], bit); - } + let id = atomicAdd(&meshlet_meshlet_cull_count_write, 1u); + let value = InstancedOffset(instance_id, instanced_offset.offset); + meshlet_meshlet_cull_queue[constants.rightmost_slot - id] = value; + if ((id & 127u) == 0) { + atomicAdd(&meshlet_meshlet_cull_dispatch.x, 1u); + } #endif + return; + } - // Cluster would be occluded if drawn, so don't setup a draw for it - if !cluster_visible { return; } - + // If we pass, rasterize the meshlet // Check how big the cluster is in screen space -#ifdef MESHLET_FIRST_CULLING_PASS - let culling_bounding_sphere_center_view_space = (view.view_from_world * vec4(culling_bounding_sphere_center.xyz, 1.0)).xyz; - aabb = project_view_space_sphere_to_screen_space_aabb(culling_bounding_sphere_center_view_space, culling_bounding_sphere_radius); - aabb_width_pixels = (aabb.z - aabb.x) * view.viewport.z; - aabb_height_pixels = (aabb.w - aabb.y) * view.viewport.w; -#endif - let cluster_is_small = all(vec2(aabb_width_pixels, aabb_height_pixels) < vec2(64.0)); - - // Let the hardware rasterizer handle near-plane clipping - let not_intersects_near_plane = dot(view.frustum[4u], culling_bounding_sphere_center) > culling_bounding_sphere_radius; + let world_from_local = affine3_to_square(meshlet_instance_uniforms[instance_id].world_from_local); + let clip_from_local = view.clip_from_world * world_from_local; + let projection = view.clip_from_world; + var near: f32; + if projection[3][3] == 1.0 { + near = projection[3][2] / projection[2][2]; + } else { + near = projection[3][2]; + } + var screen_aabb = ScreenAabb(vec3(0.0), vec3(0.0)); + var sw_raster = project_aabb(clip_from_local, near, aabb, &screen_aabb); + if sw_raster { + let aabb_size = (screen_aabb.max.xy - screen_aabb.min.xy) * view.viewport.zw; + sw_raster = all(aabb_size <= vec2(64.0)); + } var buffer_slot: u32; - if cluster_is_small && not_intersects_near_plane { + if sw_raster { // Append this cluster to the list for software rasterization buffer_slot = atomicAdd(&meshlet_software_raster_indirect_args.x, 1u); + buffer_slot += meshlet_previous_raster_counts[0]; } else { // Append this cluster to the list for hardware rasterization buffer_slot = atomicAdd(&meshlet_hardware_raster_indirect_args.instance_count, 1u); - buffer_slot = constants.meshlet_raster_cluster_rightmost_slot - buffer_slot; - } - meshlet_raster_clusters[buffer_slot] = cluster_id; -} - -// https://github.com/zeux/meshoptimizer/blob/1e48e96c7e8059321de492865165e9ef071bffba/demo/nanite.cpp#L115 -fn lod_error_is_imperceptible(lod_sphere: MeshletBoundingSphere, simplification_error: f32, world_from_local: mat4x4, world_scale: f32) -> bool { - let sphere_world_space = (world_from_local * vec4(lod_sphere.center, 1.0)).xyz; - let radius_world_space = world_scale * lod_sphere.radius; - let error_world_space = world_scale * simplification_error; - - var projected_error = error_world_space; - if view.clip_from_view[3][3] != 1.0 { - // Perspective - let distance_to_closest_point_on_sphere = distance(sphere_world_space, view.world_position) - radius_world_space; - let distance_to_closest_point_on_sphere_clamped_to_znear = max(distance_to_closest_point_on_sphere, view.clip_from_view[3][2]); - projected_error /= distance_to_closest_point_on_sphere_clamped_to_znear; - } - projected_error *= view.clip_from_view[1][1] * 0.5; - projected_error *= view.viewport.w; - - return projected_error < 1.0; -} - -// https://zeux.io/2023/01/12/approximate-projected-bounds -fn project_view_space_sphere_to_screen_space_aabb(cp: vec3, r: f32) -> vec4 { - let inv_width = view.clip_from_view[0][0] * 0.5; - let inv_height = view.clip_from_view[1][1] * 0.5; - if view.clip_from_view[3][3] == 1.0 { - // Orthographic - let min_x = cp.x - r; - let max_x = cp.x + r; - - let min_y = cp.y - r; - let max_y = cp.y + r; - - return vec4(min_x * inv_width, 1.0 - max_y * inv_height, max_x * inv_width, 1.0 - min_y * inv_height); - } else { - // Perspective - let c = vec3(cp.xy, -cp.z); - let cr = c * r; - let czr2 = c.z * c.z - r * r; - - let vx = sqrt(c.x * c.x + czr2); - let min_x = (vx * c.x - cr.z) / (vx * c.z + cr.x); - let max_x = (vx * c.x + cr.z) / (vx * c.z - cr.x); - - let vy = sqrt(c.y * c.y + czr2); - let min_y = (vy * c.y - cr.z) / (vy * c.z + cr.y); - let max_y = (vy * c.y + cr.z) / (vy * c.z - cr.y); - - return vec4(min_x * inv_width, -max_y * inv_height, max_x * inv_width, -min_y * inv_height) + vec4(0.5); + buffer_slot += meshlet_previous_raster_counts[1]; + buffer_slot = constants.rightmost_slot - buffer_slot; } + meshlet_raster_clusters[buffer_slot] = InstancedOffset(instance_id, instanced_offset.offset); } diff --git a/crates/bevy_pbr/src/meshlet/cull_instances.wgsl b/crates/bevy_pbr/src/meshlet/cull_instances.wgsl new file mode 100644 index 0000000000..5d14d10b6f --- /dev/null +++ b/crates/bevy_pbr/src/meshlet/cull_instances.wgsl @@ -0,0 +1,76 @@ +#import bevy_pbr::meshlet_bindings::{ + InstancedOffset, + constants, + meshlet_view_instance_visibility, + meshlet_instance_aabbs, + meshlet_instance_bvh_root_nodes, + meshlet_bvh_cull_count_write, + meshlet_bvh_cull_dispatch, + meshlet_bvh_cull_queue, + meshlet_second_pass_instance_count, + meshlet_second_pass_instance_dispatch, + meshlet_second_pass_instance_candidates, +} +#import bevy_pbr::meshlet_cull_shared::{ + aabb_in_frustum, + should_occlusion_cull_aabb, +} + +fn instance_count() -> u32 { +#ifdef MESHLET_FIRST_CULLING_PASS + return constants.scene_instance_count; +#else + return meshlet_second_pass_instance_count; +#endif +} + +fn map_instance_id(id: u32) -> u32 { +#ifdef MESHLET_FIRST_CULLING_PASS + return id; +#else + return meshlet_second_pass_instance_candidates[id]; +#endif +} + +fn should_cull_instance(instance_id: u32) -> bool { + let bit_offset = instance_id >> 5u; + let packed_visibility = meshlet_view_instance_visibility[instance_id & 31u]; + return bool(extractBits(packed_visibility, bit_offset, 1u)); +} + +@compute +@workgroup_size(128, 1, 1) // 1 instance per thread +fn cull_instances(@builtin(global_invocation_id) global_invocation_id: vec3) { + // Calculate the instance ID for this thread + let dispatch_id = global_invocation_id.x; + if dispatch_id >= instance_count() { return; } + + let instance_id = map_instance_id(dispatch_id); + let aabb = meshlet_instance_aabbs[instance_id]; + + // Visibility and frustum cull, but only in the first pass +#ifdef MESHLET_FIRST_CULLING_PASS + if should_cull_instance(instance_id) || !aabb_in_frustum(aabb, instance_id) { return; } +#endif + + // If we pass, try occlusion culling + // If this instance was occluded, push it to the second pass to check against this frame's HZB + if should_occlusion_cull_aabb(aabb, instance_id) { +#ifdef MESHLET_FIRST_CULLING_PASS + let id = atomicAdd(&meshlet_second_pass_instance_count, 1u); + meshlet_second_pass_instance_candidates[id] = instance_id; + if ((id & 127u) == 0u) { + atomicAdd(&meshlet_second_pass_instance_dispatch.x, 1u); + } +#endif + return; + } + + // If we pass, push the instance's root node to BVH cull + let root_node = meshlet_instance_bvh_root_nodes[instance_id]; + let id = atomicAdd(&meshlet_bvh_cull_count_write, 1u); + meshlet_bvh_cull_queue[id] = InstancedOffset(instance_id, root_node); + if ((id & 15u) == 0u) { + atomicAdd(&meshlet_bvh_cull_dispatch.x, 1u); + } +} diff --git a/crates/bevy_pbr/src/meshlet/fill_cluster_buffers.wgsl b/crates/bevy_pbr/src/meshlet/fill_cluster_buffers.wgsl deleted file mode 100644 index db39ae2bce..0000000000 --- a/crates/bevy_pbr/src/meshlet/fill_cluster_buffers.wgsl +++ /dev/null @@ -1,50 +0,0 @@ -#import bevy_pbr::meshlet_bindings::{ - scene_instance_count, - meshlet_global_cluster_count, - meshlet_instance_meshlet_counts, - meshlet_instance_meshlet_slice_starts, - meshlet_cluster_instance_ids, - meshlet_cluster_meshlet_ids, -} - -/// Writes out instance_id and meshlet_id to the global buffers for each cluster in the scene. - -var cluster_slice_start_workgroup: u32; - -@compute -@workgroup_size(1024, 1, 1) // 1024 threads per workgroup, 1 instance per workgroup -fn fill_cluster_buffers( - @builtin(workgroup_id) workgroup_id: vec3, - @builtin(num_workgroups) num_workgroups: vec3, - @builtin(local_invocation_index) local_invocation_index: u32, -) { - // Calculate the instance ID for this workgroup - var instance_id = workgroup_id.x + (workgroup_id.y * num_workgroups.x); - if instance_id >= scene_instance_count { return; } - - let instance_meshlet_count = meshlet_instance_meshlet_counts[instance_id]; - let instance_meshlet_slice_start = meshlet_instance_meshlet_slice_starts[instance_id]; - - // Reserve cluster slots for the instance and broadcast to the workgroup - if local_invocation_index == 0u { - cluster_slice_start_workgroup = atomicAdd(&meshlet_global_cluster_count, instance_meshlet_count); - } - let cluster_slice_start = workgroupUniformLoad(&cluster_slice_start_workgroup); - - // Loop enough times to write out all the meshlets for the instance given that each thread writes 1 meshlet in each iteration - for (var clusters_written = 0u; clusters_written < instance_meshlet_count; clusters_written += 1024u) { - // Calculate meshlet ID within this instance's MeshletMesh to process for this thread - let meshlet_id_local = clusters_written + local_invocation_index; - if meshlet_id_local >= instance_meshlet_count { return; } - - // Find the overall cluster ID in the global cluster buffer - let cluster_id = cluster_slice_start + meshlet_id_local; - - // Find the overall meshlet ID in the global meshlet buffer - let meshlet_id = instance_meshlet_slice_start + meshlet_id_local; - - // Write results to buffers - meshlet_cluster_instance_ids[cluster_id] = instance_id; - meshlet_cluster_meshlet_ids[cluster_id] = meshlet_id; - } -} diff --git a/crates/bevy_pbr/src/meshlet/fill_counts.wgsl b/crates/bevy_pbr/src/meshlet/fill_counts.wgsl new file mode 100644 index 0000000000..f319e395d9 --- /dev/null +++ b/crates/bevy_pbr/src/meshlet/fill_counts.wgsl @@ -0,0 +1,35 @@ +/// Copies the counts of meshlets in the hardware and software buckets, resetting the counters in the process. + +struct DispatchIndirectArgs { + x: u32, + y: u32, + z: u32, +} + +struct DrawIndirectArgs { + vertex_count: u32, + instance_count: u32, + first_vertex: u32, + first_instance: u32, +} + +@group(0) @binding(0) var meshlet_software_raster_indirect_args: DispatchIndirectArgs; +@group(0) @binding(1) var meshlet_hardware_raster_indirect_args: DrawIndirectArgs; +@group(0) @binding(2) var meshlet_previous_raster_counts: array; +#ifdef MESHLET_2D_DISPATCH +@group(0) @binding(3) var meshlet_software_raster_cluster_count: u32; +#endif + +@compute +@workgroup_size(1, 1, 1) +fn fill_counts() { +#ifdef MESHLET_2D_DISPATCH + meshlet_previous_raster_counts[0] += meshlet_software_raster_cluster_count; +#else + meshlet_previous_raster_counts[0] += meshlet_software_raster_indirect_args.x; +#endif + meshlet_software_raster_indirect_args.x = 0; + + meshlet_previous_raster_counts[1] += meshlet_hardware_raster_indirect_args.instance_count; + meshlet_hardware_raster_indirect_args.instance_count = 0; +} diff --git a/crates/bevy_pbr/src/meshlet/from_mesh.rs b/crates/bevy_pbr/src/meshlet/from_mesh.rs index ed2be52f53..db8b8a96cf 100644 --- a/crates/bevy_pbr/src/meshlet/from_mesh.rs +++ b/crates/bevy_pbr/src/meshlet/from_mesh.rs @@ -1,16 +1,20 @@ -use super::asset::{ - Meshlet, MeshletBoundingSphere, MeshletBoundingSpheres, MeshletMesh, MeshletSimplificationError, -}; +use crate::meshlet::asset::{MeshletAabb, MeshletAabbErrorOffset, MeshletCullData}; + +use super::asset::{BvhNode, Meshlet, MeshletBoundingSphere, MeshletMesh}; use alloc::borrow::Cow; -use bevy_math::{ops::log2, IVec3, Vec2, Vec3, Vec3Swizzles}; +use bevy_math::{ + bounding::{Aabb3d, BoundingSphere, BoundingVolume}, + ops::log2, + IVec3, Isometry3d, Vec2, Vec3, Vec3A, Vec3Swizzles, +}; use bevy_platform::collections::HashMap; use bevy_render::{ mesh::{Indices, Mesh}, render_resource::PrimitiveTopology, }; +use bevy_tasks::{AsyncComputeTaskPool, ParallelSlice}; use bitvec::{order::Lsb0, vec::BitVec, view::BitView}; -use core::{iter, ops::Range}; -use half::f16; +use core::{f32, ops::Range}; use itertools::Itertools; use meshopt::{ build_meshlets, ffi::meshopt_Meshlet, generate_vertex_remap_multi, @@ -19,11 +23,13 @@ use meshopt::{ use metis::{option::Opt, Graph}; use smallvec::SmallVec; use thiserror::Error; +use tracing::debug_span; // Aim to have 8 meshlets per group const TARGET_MESHLETS_PER_GROUP: usize = 8; -// Reject groups that keep over 95% of their original triangles -const SIMPLIFICATION_FAILURE_PERCENTAGE: f32 = 0.95; +// Reject groups that keep over 60% of their original triangles. We'd much rather render a few +// extra triangles than create too many meshlets, increasing cull overhead. +const SIMPLIFICATION_FAILURE_PERCENTAGE: f32 = 0.60; /// Default vertex position quantization factor for use with [`MeshletMesh::from_mesh`]. /// @@ -64,6 +70,9 @@ impl MeshletMesh { mesh: &Mesh, vertex_position_quantization_factor: u8, ) -> Result { + let s = debug_span!("build meshlet mesh"); + let _e = s.enter(); + // Validate mesh format let indices = validate_input_mesh(mesh)?; @@ -84,41 +93,28 @@ impl MeshletMesh { ); // Split the mesh into an initial list of meshlets (LOD 0) - let mut meshlets = compute_meshlets( + let (mut meshlets, mut cull_data) = compute_meshlets( &indices, &vertices, &position_only_vertex_remap, position_only_vertex_count, + None, ); - let mut bounding_spheres = meshlets - .iter() - .map(|meshlet| compute_meshlet_bounds(meshlet, &vertices)) - .map(|bounding_sphere| MeshletBoundingSpheres { - culling_sphere: bounding_sphere, - lod_group_sphere: bounding_sphere, - lod_parent_group_sphere: MeshletBoundingSphere { - center: Vec3::ZERO, - radius: 0.0, - }, - }) - .collect::>(); - let mut simplification_errors = iter::repeat_n( - MeshletSimplificationError { - group_error: f16::ZERO, - parent_group_error: f16::MAX, - }, - meshlets.len(), - ) - .collect::>(); let mut vertex_locks = vec![false; vertices.vertex_count]; // Build further LODs - let mut simplification_queue = 0..meshlets.len(); - while simplification_queue.len() > 1 { + let mut bvh = BvhBuilder::default(); + let mut all_groups = Vec::new(); + let mut simplification_queue: Vec<_> = (0..meshlets.len() as u32).collect(); + let mut stuck = Vec::new(); + while !simplification_queue.is_empty() { + let s = debug_span!("simplify lod", meshlets = simplification_queue.len()); + let _e = s.enter(); + // For each meshlet build a list of connected meshlets (meshlets that share a vertex) let connected_meshlets_per_meshlet = find_connected_meshlets( - simplification_queue.clone(), + &simplification_queue, &meshlets, &position_only_vertex_remap, position_only_vertex_count, @@ -127,9 +123,11 @@ impl MeshletMesh { // Group meshlets into roughly groups of size TARGET_MESHLETS_PER_GROUP, // grouping meshlets with a high number of shared vertices let groups = group_meshlets( + &simplification_queue, + &cull_data, &connected_meshlets_per_meshlet, - simplification_queue.clone(), ); + simplification_queue.clear(); // Lock borders between groups to prevent cracks when simplifying lock_group_borders( @@ -140,16 +138,20 @@ impl MeshletMesh { position_only_vertex_count, ); - let next_lod_start = meshlets.len(); - for group_meshlets in groups.into_iter() { + let simplified = groups.par_chunk_map(AsyncComputeTaskPool::get(), 1, |_, groups| { + let mut group = groups[0].clone(); + // If the group only has a single meshlet we can't simplify it - if group_meshlets.len() == 1 { - continue; + if group.meshlets.len() == 1 { + return Err(group); } + let s = debug_span!("simplify group", meshlets = group.meshlets.len()); + let _e = s.enter(); + // Simplify the group to ~50% triangle count let Some((simplified_group_indices, mut group_error)) = simplify_meshlet_group( - &group_meshlets, + &group, &meshlets, &vertices, vertex_normals, @@ -157,51 +159,70 @@ impl MeshletMesh { &vertex_locks, ) else { // Couldn't simplify the group enough - continue; + return Err(group); }; - // Compute LOD data for the group - let group_bounding_sphere = compute_lod_group_data( - &group_meshlets, - &mut group_error, - &mut bounding_spheres, - &mut simplification_errors, - ); + // Force the group error to be atleast as large as all of its constituent meshlet's + // individual errors. + for &id in group.meshlets.iter() { + group_error = group_error.max(cull_data[id as usize].error); + } + group.parent_error = group_error; // Build new meshlets using the simplified group - let new_meshlets_count = split_simplified_group_into_new_meshlets( + let new_meshlets = compute_meshlets( &simplified_group_indices, &vertices, &position_only_vertex_remap, position_only_vertex_count, - &mut meshlets, + Some((group.lod_bounds, group.parent_error)), ); - // Calculate the culling bounding sphere for the new meshlets and set their LOD group data - let new_meshlet_ids = (meshlets.len() - new_meshlets_count)..meshlets.len(); - bounding_spheres.extend(new_meshlet_ids.clone().map(|meshlet_id| { - MeshletBoundingSpheres { - culling_sphere: compute_meshlet_bounds(meshlets.get(meshlet_id), &vertices), - lod_group_sphere: group_bounding_sphere, - lod_parent_group_sphere: MeshletBoundingSphere { - center: Vec3::ZERO, - radius: 0.0, - }, + Ok((group, new_meshlets)) + }); + + let first_group = all_groups.len() as u32; + let mut passed_tris = 0; + let mut stuck_tris = 0; + for group in simplified { + match group { + Ok((group, (new_meshlets, new_cull_data))) => { + let start = meshlets.len(); + merge_meshlets(&mut meshlets, new_meshlets); + cull_data.extend(new_cull_data); + let end = meshlets.len(); + let new_meshlet_ids = start as u32..end as u32; + + passed_tris += triangles_in_meshlets(&meshlets, new_meshlet_ids.clone()); + simplification_queue.extend(new_meshlet_ids); + all_groups.push(group); } - })); - simplification_errors.extend(iter::repeat_n( - MeshletSimplificationError { - group_error, - parent_group_error: f16::MAX, - }, - new_meshlet_ids.len(), - )); + Err(group) => { + stuck_tris += + triangles_in_meshlets(&meshlets, group.meshlets.iter().copied()); + stuck.push(group); + } + } } - // Set simplification queue to the list of newly created meshlets - simplification_queue = next_lod_start..meshlets.len(); + // If we have enough triangles that passed, we can retry simplifying the stuck + // meshlets. + if passed_tris > stuck_tris / 3 { + simplification_queue.extend(stuck.drain(..).flat_map(|group| group.meshlets)); + } + + bvh.add_lod(first_group, &all_groups); } + // If there's any stuck meshlets left, add another LOD level with only them + if !stuck.is_empty() { + let first_group = all_groups.len() as u32; + all_groups.extend(stuck); + bvh.add_lod(first_group, &all_groups); + } + + let (bvh, aabb, depth) = bvh.build(&mut meshlets, all_groups, &mut cull_data); + // Copy vertex attributes per meshlet and compress let mut vertex_positions = BitVec::::new(); let mut vertex_normals = Vec::new(); @@ -227,9 +248,17 @@ impl MeshletMesh { vertex_normals: vertex_normals.into(), vertex_uvs: vertex_uvs.into(), indices: meshlets.triangles.into(), + bvh: bvh.into(), meshlets: bevy_meshlets.into(), - meshlet_bounding_spheres: bounding_spheres.into(), - meshlet_simplification_errors: simplification_errors.into(), + meshlet_cull_data: cull_data + .into_iter() + .map(|cull_data| MeshletCullData { + aabb: aabb_to_meshlet(cull_data.aabb, cull_data.error, 0), + lod_group_sphere: sphere_to_meshlet(cull_data.lod_group_sphere), + }) + .collect(), + aabb, + bvh_depth: depth, }) } } @@ -244,7 +273,11 @@ fn validate_input_mesh(mesh: &Mesh) -> Result, MeshToMeshletMeshC Mesh::ATTRIBUTE_NORMAL.id, Mesh::ATTRIBUTE_UV_0.id, ]) { - return Err(MeshToMeshletMeshConversionError::WrongMeshVertexAttributes); + return Err(MeshToMeshletMeshConversionError::WrongMeshVertexAttributes( + mesh.attributes() + .map(|(attribute, _)| format!("{attribute:?}")) + .collect(), + )); } match mesh.indices() { @@ -254,12 +287,19 @@ fn validate_input_mesh(mesh: &Mesh) -> Result, MeshToMeshletMeshC } } +fn triangles_in_meshlets(meshlets: &Meshlets, ids: impl IntoIterator) -> u32 { + ids.into_iter() + .map(|id| meshlets.get(id as _).triangles.len() as u32 / 3) + .sum() +} + fn compute_meshlets( indices: &[u32], vertices: &VertexDataAdapter, position_only_vertex_remap: &[u32], position_only_vertex_count: usize, -) -> Meshlets { + prev_lod_data: Option<(BoundingSphere, f32)>, +) -> (Meshlets, Vec) { // For each vertex, build a list of all triangles that use it let mut vertices_to_triangles = vec![Vec::new(); position_only_vertex_count]; for (i, index) in indices.iter().enumerate() { @@ -293,6 +333,7 @@ fn compute_meshlets( } // The order of triangles depends on hash traversal order; to produce deterministic results, sort them + // TODO: Wouldn't it be faster to use a `BTreeMap` above instead of `HashMap` + sorting? for list in connected_triangles_per_triangle.iter_mut() { list.sort_unstable(); } @@ -336,40 +377,52 @@ fn compute_meshlets( vertices: Vec::new(), triangles: Vec::new(), }; + let mut cull_data = Vec::new(); + let get_vertex = |&v: &u32| { + *bytemuck::from_bytes::( + &vertices.reader.get_ref() + [vertices.position_offset + v as usize * vertices.vertex_stride..][..12], + ) + }; for meshlet_indices in &indices_per_meshlet { let meshlet = build_meshlets(meshlet_indices, vertices, 255, 128, 0.0); - let vertex_offset = meshlets.vertices.len() as u32; - let triangle_offset = meshlets.triangles.len() as u32; - meshlets.vertices.extend_from_slice(&meshlet.vertices); - meshlets.triangles.extend_from_slice(&meshlet.triangles); - meshlets - .meshlets - .extend(meshlet.meshlets.into_iter().map(|mut meshlet| { - meshlet.vertex_offset += vertex_offset; - meshlet.triangle_offset += triangle_offset; - meshlet - })); + for meshlet in meshlet.iter() { + let (lod_group_sphere, error) = prev_lod_data.unwrap_or_else(|| { + let bounds = meshopt::compute_meshlet_bounds(meshlet, vertices); + (BoundingSphere::new(bounds.center, bounds.radius), 0.0) + }); + + cull_data.push(TempMeshletCullData { + aabb: Aabb3d::from_point_cloud( + Isometry3d::IDENTITY, + meshlet.vertices.iter().map(get_vertex), + ), + lod_group_sphere, + error, + }); + } + merge_meshlets(&mut meshlets, meshlet); } - meshlets + (meshlets, cull_data) } fn find_connected_meshlets( - simplification_queue: Range, + simplification_queue: &[u32], meshlets: &Meshlets, position_only_vertex_remap: &[u32], position_only_vertex_count: usize, ) -> Vec> { // For each vertex, build a list of all meshlets that use it let mut vertices_to_meshlets = vec![Vec::new(); position_only_vertex_count]; - for meshlet_id in simplification_queue.clone() { - let meshlet = meshlets.get(meshlet_id); + for (id_index, &meshlet_id) in simplification_queue.iter().enumerate() { + let meshlet = meshlets.get(meshlet_id as _); for index in meshlet.triangles { let vertex_id = position_only_vertex_remap[meshlet.vertices[*index as usize] as usize]; let vertex_to_meshlets = &mut vertices_to_meshlets[vertex_id as usize]; // Meshlets are added in order, so we can just check the last element to deduplicate, // in the case of two triangles sharing the same vertex within a single meshlet - if vertex_to_meshlets.last() != Some(&meshlet_id) { - vertex_to_meshlets.push(meshlet_id); + if vertex_to_meshlets.last() != Some(&id_index) { + vertex_to_meshlets.push(id_index); } } } @@ -389,13 +442,12 @@ fn find_connected_meshlets( let mut connected_meshlets_per_meshlet = vec![Vec::new(); simplification_queue.len()]; for ((meshlet_id1, meshlet_id2), shared_vertex_count) in meshlet_pair_to_shared_vertex_count { // We record both id1->id2 and id2->id1 as adjacency is symmetrical - connected_meshlets_per_meshlet[meshlet_id1 - simplification_queue.start] - .push((meshlet_id2, shared_vertex_count)); - connected_meshlets_per_meshlet[meshlet_id2 - simplification_queue.start] - .push((meshlet_id1, shared_vertex_count)); + connected_meshlets_per_meshlet[meshlet_id1].push((meshlet_id2, shared_vertex_count)); + connected_meshlets_per_meshlet[meshlet_id2].push((meshlet_id1, shared_vertex_count)); } // The order of meshlets depends on hash traversal order; to produce deterministic results, sort them + // TODO: Wouldn't it be faster to use a `BTreeMap` above instead of `HashMap` + sorting? for list in connected_meshlets_per_meshlet.iter_mut() { list.sort_unstable(); } @@ -405,16 +457,17 @@ fn find_connected_meshlets( // METIS manual: https://github.com/KarypisLab/METIS/blob/e0f1b88b8efcb24ffa0ec55eabb78fbe61e58ae7/manual/manual.pdf fn group_meshlets( + simplification_queue: &[u32], + meshlet_cull_data: &[TempMeshletCullData], connected_meshlets_per_meshlet: &[Vec<(usize, usize)>], - simplification_queue: Range, -) -> Vec> { +) -> Vec { let mut xadj = Vec::with_capacity(simplification_queue.len() + 1); let mut adjncy = Vec::new(); let mut adjwgt = Vec::new(); for connected_meshlets in connected_meshlets_per_meshlet { xadj.push(adjncy.len() as i32); for (connected_meshlet_id, shared_vertex_count) in connected_meshlets { - adjncy.push((connected_meshlet_id - simplification_queue.start) as i32); + adjncy.push(*connected_meshlet_id as i32); adjwgt.push(*shared_vertex_count as i32); // TODO: Additional weight based on meshlet spatial proximity } @@ -436,16 +489,22 @@ fn group_meshlets( .part_recursive(&mut group_per_meshlet) .unwrap(); - let mut groups = vec![SmallVec::new(); partition_count]; + let mut groups = vec![TempMeshletGroup::default(); partition_count]; for (i, meshlet_group) in group_per_meshlet.into_iter().enumerate() { - groups[meshlet_group as usize].push(i + simplification_queue.start); + let group = &mut groups[meshlet_group as usize]; + let meshlet_id = simplification_queue[i]; + + group.meshlets.push(meshlet_id); + let data = &meshlet_cull_data[meshlet_id as usize]; + group.aabb = group.aabb.merge(&data.aabb); + group.lod_bounds = merge_spheres(group.lod_bounds, data.lod_group_sphere); } groups } fn lock_group_borders( vertex_locks: &mut [bool], - groups: &[SmallVec<[usize; TARGET_MESHLETS_PER_GROUP]>], + groups: &[TempMeshletGroup], meshlets: &Meshlets, position_only_vertex_remap: &[u32], position_only_vertex_count: usize, @@ -453,9 +512,9 @@ fn lock_group_borders( let mut position_only_locks = vec![-1; position_only_vertex_count]; // Iterate over position-only based vertices of all meshlets in all groups - for (group_id, group_meshlets) in groups.iter().enumerate() { - for meshlet_id in group_meshlets { - let meshlet = meshlets.get(*meshlet_id); + for (group_id, group) in groups.iter().enumerate() { + for &meshlet_id in group.meshlets.iter() { + let meshlet = meshlets.get(meshlet_id as usize); for index in meshlet.triangles { let vertex_id = position_only_vertex_remap[meshlet.vertices[*index as usize] as usize] as usize; @@ -480,21 +539,25 @@ fn lock_group_borders( } fn simplify_meshlet_group( - group_meshlets: &[usize], + group: &TempMeshletGroup, meshlets: &Meshlets, vertices: &VertexDataAdapter<'_>, vertex_normals: &[f32], vertex_stride: usize, vertex_locks: &[bool], -) -> Option<(Vec, f16)> { +) -> Option<(Vec, f32)> { // Build a new index buffer into the mesh vertex data by combining all meshlet data in the group - let mut group_indices = Vec::new(); - for meshlet_id in group_meshlets { - let meshlet = meshlets.get(*meshlet_id); - for meshlet_index in meshlet.triangles { - group_indices.push(meshlet.vertices[*meshlet_index as usize]); - } - } + let group_indices = group + .meshlets + .iter() + .flat_map(|&meshlet_id| { + let meshlet = meshlets.get(meshlet_id as _); + meshlet + .triangles + .iter() + .map(|&meshlet_index| meshlet.vertices[meshlet_index as usize]) + }) + .collect::>(); // Simplify the group to ~50% triangle count let mut error = 0.0; @@ -511,96 +574,28 @@ fn simplify_meshlet_group( Some(&mut error), ); - // Check if we were able to simplify at least a little + // Check if we were able to simplify if simplified_group_indices.len() as f32 / group_indices.len() as f32 > SIMPLIFICATION_FAILURE_PERCENTAGE { return None; } - Some((simplified_group_indices, f16::from_f32(error))) + Some((simplified_group_indices, error)) } -fn compute_lod_group_data( - group_meshlets: &[usize], - group_error: &mut f16, - bounding_spheres: &mut [MeshletBoundingSpheres], - simplification_errors: &mut [MeshletSimplificationError], -) -> MeshletBoundingSphere { - let mut group_bounding_sphere = MeshletBoundingSphere { - center: Vec3::ZERO, - radius: 0.0, - }; - - // Compute the lod group sphere center as a weighted average of the children spheres - let mut weight = 0.0; - for meshlet_id in group_meshlets { - let meshlet_lod_bounding_sphere = bounding_spheres[*meshlet_id].lod_group_sphere; - group_bounding_sphere.center += - meshlet_lod_bounding_sphere.center * meshlet_lod_bounding_sphere.radius; - weight += meshlet_lod_bounding_sphere.radius; - } - group_bounding_sphere.center /= weight; - - // Force parent group sphere to contain all child group spheres (we're currently building the parent from its children) - // TODO: This does not produce the absolute minimal bounding sphere. Doing so is non-trivial. - // "Smallest enclosing balls of balls" http://www.inf.ethz.ch/personal/emo/DoctThesisFiles/fischer05.pdf - for meshlet_id in group_meshlets { - let meshlet_lod_bounding_sphere = bounding_spheres[*meshlet_id].lod_group_sphere; - let d = meshlet_lod_bounding_sphere - .center - .distance(group_bounding_sphere.center); - group_bounding_sphere.radius = group_bounding_sphere - .radius - .max(meshlet_lod_bounding_sphere.radius + d); - } - - // Force parent error to be >= child error (we're currently building the parent from its children) - for meshlet_id in group_meshlets { - *group_error = group_error.max(simplification_errors[*meshlet_id].group_error); - } - - // Set the children's lod parent group data to the new lod group we just made - for meshlet_id in group_meshlets { - bounding_spheres[*meshlet_id].lod_parent_group_sphere = group_bounding_sphere; - simplification_errors[*meshlet_id].parent_group_error = *group_error; - } - - group_bounding_sphere -} - -fn split_simplified_group_into_new_meshlets( - simplified_group_indices: &[u32], - vertices: &VertexDataAdapter<'_>, - position_only_vertex_remap: &[u32], - position_only_vertex_count: usize, - meshlets: &mut Meshlets, -) -> usize { - let simplified_meshlets = compute_meshlets( - simplified_group_indices, - vertices, - position_only_vertex_remap, - position_only_vertex_count, - ); - let new_meshlets_count = simplified_meshlets.len(); - +fn merge_meshlets(meshlets: &mut Meshlets, merge: Meshlets) { let vertex_offset = meshlets.vertices.len() as u32; let triangle_offset = meshlets.triangles.len() as u32; - meshlets - .vertices - .extend_from_slice(&simplified_meshlets.vertices); - meshlets - .triangles - .extend_from_slice(&simplified_meshlets.triangles); + meshlets.vertices.extend_from_slice(&merge.vertices); + meshlets.triangles.extend_from_slice(&merge.triangles); meshlets .meshlets - .extend(simplified_meshlets.meshlets.into_iter().map(|mut meshlet| { + .extend(merge.meshlets.into_iter().map(|mut meshlet| { meshlet.vertex_offset += vertex_offset; meshlet.triangle_offset += triangle_offset; meshlet })); - - new_meshlets_count } fn build_and_compress_per_meshlet_vertex_data( @@ -688,14 +683,397 @@ fn build_and_compress_per_meshlet_vertex_data( }); } -fn compute_meshlet_bounds( - meshlet: meshopt::Meshlet<'_>, - vertices: &VertexDataAdapter<'_>, -) -> MeshletBoundingSphere { - let bounds = meshopt::compute_meshlet_bounds(meshlet, vertices); +fn merge_spheres(a: BoundingSphere, b: BoundingSphere) -> BoundingSphere { + let sr = a.radius().min(b.radius()); + let br = a.radius().max(b.radius()); + let len = a.center.distance(b.center); + if len + sr <= br || sr == 0.0 || len == 0.0 { + if a.radius() > b.radius() { + a + } else { + b + } + } else { + let radius = (sr + br + len) / 2.0; + let center = + (a.center + b.center + (a.radius() - b.radius()) * (a.center - b.center) / len) / 2.0; + BoundingSphere::new(center, radius) + } +} + +#[derive(Copy, Clone)] +struct TempMeshletCullData { + aabb: Aabb3d, + lod_group_sphere: BoundingSphere, + error: f32, +} + +#[derive(Clone)] +struct TempMeshletGroup { + aabb: Aabb3d, + lod_bounds: BoundingSphere, + parent_error: f32, + meshlets: SmallVec<[u32; TARGET_MESHLETS_PER_GROUP]>, +} + +impl Default for TempMeshletGroup { + fn default() -> Self { + Self { + aabb: aabb_default(), // Default AABB to merge into + lod_bounds: BoundingSphere::new(Vec3A::ZERO, 0.0), + parent_error: f32::MAX, + meshlets: SmallVec::new(), + } + } +} + +// All the BVH build code was stolen from https://github.com/SparkyPotato/radiance/blob/4aa17a3a5be7a0466dc69713e249bbcee9f46057/crates/rad-renderer/src/assets/mesh/virtual_mesh.rs because it works and I'm lazy and don't want to reimplement it +struct TempBvhNode { + group: u32, + aabb: Aabb3d, + children: SmallVec<[u32; 8]>, +} + +#[derive(Default)] +struct BvhBuilder { + nodes: Vec, + lods: Vec>, +} + +impl BvhBuilder { + fn add_lod(&mut self, offset: u32, all_groups: &[TempMeshletGroup]) { + let first = self.nodes.len() as u32; + self.nodes.extend( + all_groups + .iter() + .enumerate() + .skip(offset as _) + .map(|(i, group)| TempBvhNode { + group: i as u32, + aabb: group.aabb, + children: SmallVec::new(), + }), + ); + let end = self.nodes.len() as u32; + if first != end { + self.lods.push(first..end); + } + } + + fn surface_area(&self, nodes: &[u32]) -> f32 { + nodes + .iter() + .map(|&x| self.nodes[x as usize].aabb) + .reduce(|a, b| a.merge(&b)) + .expect("cannot find surface area of zero nodes") + .visible_area() + } + + fn sort_nodes_by_sah(&self, nodes: &mut [u32], splits: [usize; 8]) { + // We use a BVH8, so just recursively binary split 3 times for near-optimal SAH + for i in 0..3 { + let parts = 1 << i; // 2^i + let nodes_per_split = 8 >> i; // 8 / 2^i + let half_count = nodes_per_split / 2; + let mut offset = 0; + for p in 0..parts { + let first = p * nodes_per_split; + let mut s0 = 0; + let mut s1 = 0; + for i in 0..half_count { + s0 += splits[first + i]; + s1 += splits[first + half_count + i]; + } + let c = s0 + s1; + let nodes = &mut nodes[offset..(offset + c)]; + offset += c; + + let mut cost = f32::MAX; + let mut axis = 0; + let key = |x, ax| self.nodes[x as usize].aabb.center()[ax]; + for ax in 0..3 { + nodes.sort_unstable_by(|&x, &y| key(x, ax).partial_cmp(&key(y, ax)).unwrap()); + let (left, right) = nodes.split_at(s0); + let c = self.surface_area(left) + self.surface_area(right); + if c < cost { + axis = ax; + cost = c; + } + } + if axis != 2 { + nodes.sort_unstable_by(|&x, &y| { + key(x, axis).partial_cmp(&key(y, axis)).unwrap() + }); + } + } + } + } + + fn build_temp_inner(&mut self, nodes: &mut [u32], optimize: bool) -> u32 { + let count = nodes.len(); + if count == 1 { + nodes[0] + } else if count <= 8 { + let i = self.nodes.len(); + self.nodes.push(TempBvhNode { + group: u32::MAX, + aabb: aabb_default(), + children: nodes.iter().copied().collect(), + }); + i as _ + } else { + // We need to split the nodes into 8 groups, with the smallest possible tree depth. + // Additionally, no child should be more than one level deeper than the others. + // At `l` levels, we can fit upto 8^l nodes. + // The `max_child_size` is the largest power of 8 <= `count` (any larger and we'd have + // unfilled nodes). + // The `min_child_size` is thus 1 level (8 times) smaller. + // After distributing `min_child_size` to all children, we have distributed + // `min_child_size * 8` nodes (== `max_child_size`). + // The remaining nodes are then distributed left to right. + let max_child_size = 1 << ((count.ilog2() / 3) * 3); + let min_child_size = max_child_size >> 3; + let max_extra_per_node = max_child_size - min_child_size; + let mut extra = count - max_child_size; // 8 * min_child_size + let splits = core::array::from_fn(|_| { + let size = extra.min(max_extra_per_node); + extra -= size; + min_child_size + size + }); + + if optimize { + self.sort_nodes_by_sah(nodes, splits); + } + + let mut offset = 0; + let children = splits + .into_iter() + .map(|size| { + let i = self.build_temp_inner(&mut nodes[offset..(offset + size)], optimize); + offset += size; + i + }) + .collect(); + + let i = self.nodes.len(); + self.nodes.push(TempBvhNode { + group: u32::MAX, + aabb: aabb_default(), + children, + }); + i as _ + } + } + + fn build_temp(&mut self) -> u32 { + let mut lods = Vec::with_capacity(self.lods.len()); + for lod in core::mem::take(&mut self.lods) { + let mut lod: Vec<_> = lod.collect(); + let root = self.build_temp_inner(&mut lod, true); + let node = &self.nodes[root as usize]; + if node.group != u32::MAX || node.children.len() == 8 { + lods.push(root); + } else { + lods.extend(node.children.iter().copied()); + } + } + self.build_temp_inner(&mut lods, false) + } + + fn build_inner( + &self, + groups: &[TempMeshletGroup], + out: &mut Vec, + max_depth: &mut u32, + node: u32, + depth: u32, + ) -> u32 { + *max_depth = depth.max(*max_depth); + let node = &self.nodes[node as usize]; + let onode = out.len(); + out.push(BvhNode::default()); + + for (i, &child_id) in node.children.iter().enumerate() { + let child = &self.nodes[child_id as usize]; + if child.group != u32::MAX { + let group = &groups[child.group as usize]; + let out = &mut out[onode]; + out.aabbs[i] = aabb_to_meshlet(group.aabb, group.parent_error, group.meshlets[0]); + out.lod_bounds[i] = sphere_to_meshlet(group.lod_bounds); + out.child_counts[i] = group.meshlets[1] as _; + } else { + let child_id = self.build_inner(groups, out, max_depth, child_id, depth + 1); + let child = &out[child_id as usize]; + let mut aabb = aabb_default(); + let mut parent_error = 0.0f32; + let mut lod_bounds = BoundingSphere::new(Vec3A::ZERO, 0.0); + for i in 0..8 { + if child.child_counts[i] == 0 { + break; + } + + aabb = aabb.merge(&Aabb3d::new( + child.aabbs[i].center, + child.aabbs[i].half_extent, + )); + lod_bounds = merge_spheres( + lod_bounds, + BoundingSphere::new(child.lod_bounds[i].center, child.lod_bounds[i].radius), + ); + parent_error = parent_error.max(child.aabbs[i].error); + } + + let out = &mut out[onode]; + out.aabbs[i] = aabb_to_meshlet(aabb, parent_error, child_id); + out.lod_bounds[i] = sphere_to_meshlet(lod_bounds); + out.child_counts[i] = u8::MAX; + } + } + + onode as _ + } + + fn build( + mut self, + meshlets: &mut Meshlets, + mut groups: Vec, + cull_data: &mut Vec, + ) -> (Vec, MeshletAabb, u32) { + // The BVH requires group meshlets to be contiguous, so remap them first. + let mut remap = Vec::with_capacity(meshlets.meshlets.len()); + let mut remapped_cull_data = Vec::with_capacity(cull_data.len()); + for group in groups.iter_mut() { + let first = remap.len() as u32; + let count = group.meshlets.len() as u32; + remap.extend( + group + .meshlets + .iter() + .map(|&m| meshlets.meshlets[m as usize]), + ); + remapped_cull_data.extend(group.meshlets.iter().map(|&m| cull_data[m as usize])); + group.meshlets.resize(2, 0); + group.meshlets[0] = first; + group.meshlets[1] = count; + } + meshlets.meshlets = remap; + *cull_data = remapped_cull_data; + + let mut out = vec![]; + let mut aabb = aabb_default(); + let mut max_depth = 0; + + if self.nodes.len() == 1 { + let mut o = BvhNode::default(); + let group = &groups[0]; + o.aabbs[0] = aabb_to_meshlet(group.aabb, group.parent_error, group.meshlets[0]); + o.lod_bounds[0] = sphere_to_meshlet(group.lod_bounds); + o.child_counts[0] = group.meshlets[1] as _; + out.push(o); + aabb = group.aabb; + max_depth = 1; + } else { + let root = self.build_temp(); + let root = self.build_inner(&groups, &mut out, &mut max_depth, root, 1); + assert_eq!(root, 0, "root must be 0"); + + let root = &out[0]; + for i in 0..8 { + if root.child_counts[i] == 0 { + break; + } + + aabb = aabb.merge(&Aabb3d::new( + root.aabbs[i].center, + root.aabbs[i].half_extent, + )); + } + } + + let mut reachable = vec![false; meshlets.meshlets.len()]; + verify_bvh(&out, cull_data, &mut reachable, 0); + assert!( + reachable.iter().all(|&x| x), + "all meshlets must be reachable" + ); + + ( + out, + MeshletAabb { + center: aabb.center().into(), + half_extent: aabb.half_size().into(), + }, + max_depth, + ) + } +} + +fn verify_bvh( + out: &[BvhNode], + cull_data: &[TempMeshletCullData], + reachable: &mut [bool], + node: u32, +) { + let node = &out[node as usize]; + for i in 0..8 { + let sphere = node.lod_bounds[i]; + let error = node.aabbs[i].error; + if node.child_counts[i] == u8::MAX { + let child = &out[node.aabbs[i].child_offset as usize]; + for i in 0..8 { + if child.child_counts[i] == 0 { + break; + } + assert!( + child.aabbs[i].error <= error, + "BVH errors are not monotonic" + ); + let sphere_error = (sphere.center - child.lod_bounds[i].center).length() + - (sphere.radius - child.lod_bounds[i].radius); + assert!( + sphere_error <= 0.0001, + "BVH lod spheres are not monotonic ({sphere_error})" + ); + } + verify_bvh(out, cull_data, reachable, node.aabbs[i].child_offset); + } else { + for m in 0..node.child_counts[i] as u32 { + let mid = (m + node.aabbs[i].child_offset) as usize; + let meshlet = &cull_data[mid]; + assert!(meshlet.error <= error, "meshlet errors are not monotonic"); + let sphere_error = (Vec3A::from(sphere.center) - meshlet.lod_group_sphere.center) + .length() + - (sphere.radius - meshlet.lod_group_sphere.radius()); + assert!( + sphere_error <= 0.0001, + "meshlet lod spheres are not monotonic: ({sphere_error})" + ); + reachable[mid] = true; + } + } + } +} + +fn aabb_default() -> Aabb3d { + Aabb3d { + min: Vec3A::INFINITY, + max: Vec3A::NEG_INFINITY, + } +} + +fn aabb_to_meshlet(aabb: Aabb3d, error: f32, child_offset: u32) -> MeshletAabbErrorOffset { + MeshletAabbErrorOffset { + center: aabb.center().into(), + error, + half_extent: aabb.half_size().into(), + child_offset, + } +} + +fn sphere_to_meshlet(sphere: BoundingSphere) -> MeshletBoundingSphere { MeshletBoundingSphere { - center: bounds.center.into(), - radius: bounds.radius, + center: sphere.center.into(), + radius: sphere.radius(), } } @@ -726,8 +1104,8 @@ fn pack2x16snorm(v: Vec2) -> u32 { pub enum MeshToMeshletMeshConversionError { #[error("Mesh primitive topology is not TriangleList")] WrongMeshPrimitiveTopology, - #[error("Mesh vertex attributes are not {{POSITION, NORMAL, UV_0}}")] - WrongMeshVertexAttributes, + #[error("Mesh vertex attributes are not {{POSITION, NORMAL, UV_0}}: {0:?}")] + WrongMeshVertexAttributes(Vec), #[error("Mesh has no indices")] MeshMissingIndices, } diff --git a/crates/bevy_pbr/src/meshlet/instance_manager.rs b/crates/bevy_pbr/src/meshlet/instance_manager.rs index 6aa5f22665..94d03a925a 100644 --- a/crates/bevy_pbr/src/meshlet/instance_manager.rs +++ b/crates/bevy_pbr/src/meshlet/instance_manager.rs @@ -1,6 +1,7 @@ use super::{meshlet_mesh_manager::MeshletMeshManager, MeshletMesh, MeshletMesh3d}; +use crate::DUMMY_MESH_MATERIAL; use crate::{ - material::DUMMY_MESH_MATERIAL, MaterialBindingId, MeshFlags, MeshTransforms, MeshUniform, + meshlet::asset::MeshletAabb, MaterialBindingId, MeshFlags, MeshTransforms, MeshUniform, NotShadowCaster, NotShadowReceiver, PreviousGlobalTransform, RenderMaterialBindings, RenderMaterialInstances, }; @@ -17,26 +18,27 @@ use bevy_render::{ render_resource::StorageBuffer, sync_world::MainEntity, view::RenderLayers, MainWorld, }; use bevy_transform::components::GlobalTransform; -use core::ops::{DerefMut, Range}; +use core::ops::DerefMut; /// Manages data for each entity with a [`MeshletMesh`]. #[derive(Resource)] pub struct InstanceManager { /// Amount of instances in the scene. pub scene_instance_count: u32, - /// Amount of clusters in the scene. - pub scene_cluster_count: u32, + /// The max BVH depth of any instance in the scene. This is used to control the number of + /// dependent dispatches emitted for BVH traversal. + pub max_bvh_depth: u32, /// Per-instance [`MainEntity`], [`RenderLayers`], and [`NotShadowCaster`]. pub instances: Vec<(MainEntity, RenderLayers, bool)>, /// Per-instance [`MeshUniform`]. pub instance_uniforms: StorageBuffer>, + /// Per-instance model-space AABB. + pub instance_aabbs: StorageBuffer>, /// Per-instance material ID. pub instance_material_ids: StorageBuffer>, - /// Per-instance count of meshlets in the instance's [`MeshletMesh`]. - pub instance_meshlet_counts: StorageBuffer>, - /// Per-instance index to the start of the instance's slice of the meshlets buffer. - pub instance_meshlet_slice_starts: StorageBuffer>, + /// Per-instance index to the root node of the instance's BVH. + pub instance_bvh_root_nodes: StorageBuffer>, /// Per-view per-instance visibility bit. Used for [`RenderLayers`] and [`NotShadowCaster`] support. pub view_instance_visibility: EntityHashMap>>, @@ -52,7 +54,7 @@ impl InstanceManager { pub fn new() -> Self { Self { scene_instance_count: 0, - scene_cluster_count: 0, + max_bvh_depth: 0, instances: Vec::new(), instance_uniforms: { @@ -60,19 +62,19 @@ impl InstanceManager { buffer.set_label(Some("meshlet_instance_uniforms")); buffer }, + instance_aabbs: { + let mut buffer = StorageBuffer::default(); + buffer.set_label(Some("meshlet_instance_aabbs")); + buffer + }, instance_material_ids: { let mut buffer = StorageBuffer::default(); buffer.set_label(Some("meshlet_instance_material_ids")); buffer }, - instance_meshlet_counts: { + instance_bvh_root_nodes: { let mut buffer = StorageBuffer::default(); - buffer.set_label(Some("meshlet_instance_meshlet_counts")); - buffer - }, - instance_meshlet_slice_starts: { - let mut buffer = StorageBuffer::default(); - buffer.set_label(Some("meshlet_instance_meshlet_slice_starts")); + buffer.set_label(Some("meshlet_instance_bvh_root_nodes")); buffer }, view_instance_visibility: EntityHashMap::default(), @@ -86,7 +88,9 @@ impl InstanceManager { pub fn add_instance( &mut self, instance: MainEntity, - meshlets_slice: Range, + root_bvh_node: u32, + aabb: MeshletAabb, + bvh_depth: u32, transform: &GlobalTransform, previous_transform: Option<&PreviousGlobalTransform>, render_layers: Option<&RenderLayers>, @@ -139,16 +143,12 @@ impl InstanceManager { not_shadow_caster, )); self.instance_uniforms.get_mut().push(mesh_uniform); + self.instance_aabbs.get_mut().push(aabb); self.instance_material_ids.get_mut().push(0); - self.instance_meshlet_counts - .get_mut() - .push(meshlets_slice.len() as u32); - self.instance_meshlet_slice_starts - .get_mut() - .push(meshlets_slice.start); + self.instance_bvh_root_nodes.get_mut().push(root_bvh_node); self.scene_instance_count += 1; - self.scene_cluster_count += meshlets_slice.len() as u32; + self.max_bvh_depth = self.max_bvh_depth.max(bvh_depth); } /// Get the material ID for a [`crate::Material`]. @@ -168,13 +168,13 @@ impl InstanceManager { pub fn reset(&mut self, entities: &Entities) { self.scene_instance_count = 0; - self.scene_cluster_count = 0; + self.max_bvh_depth = 0; self.instances.clear(); self.instance_uniforms.get_mut().clear(); + self.instance_aabbs.get_mut().clear(); self.instance_material_ids.get_mut().clear(); - self.instance_meshlet_counts.get_mut().clear(); - self.instance_meshlet_slice_starts.get_mut().clear(); + self.instance_bvh_root_nodes.get_mut().clear(); self.view_instance_visibility .retain(|view_entity, _| entities.contains(*view_entity)); self.view_instance_visibility @@ -233,6 +233,7 @@ pub fn extract_meshlet_mesh_entities( } // Iterate over every instance + // TODO: Switch to change events to not upload every instance every frame. for ( instance, meshlet_mesh, @@ -252,13 +253,15 @@ pub fn extract_meshlet_mesh_entities( } // Upload the instance's MeshletMesh asset data if not done already done - let meshlets_slice = + let (root_bvh_node, aabb, bvh_depth) = meshlet_mesh_manager.queue_upload_if_needed(meshlet_mesh.id(), &mut assets); // Add the instance's data to the instance manager instance_manager.add_instance( instance.into(), - meshlets_slice, + root_bvh_node, + aabb, + bvh_depth, transform, previous_transform, render_layers, diff --git a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs index edb487bbb0..536451a673 100644 --- a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs +++ b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs @@ -1,6 +1,6 @@ use super::{ - instance_manager::InstanceManager, resource_manager::ResourceManager, - MESHLET_MESH_MATERIAL_SHADER_HANDLE, + instance_manager::InstanceManager, pipelines::MeshletPipelines, + resource_manager::ResourceManager, }; use crate::{environment_map::EnvironmentMapLight, irradiance_volume::IrradianceVolume, *}; use bevy_core_pipeline::{ @@ -17,6 +17,7 @@ use bevy_render::{ render_resource::*, view::ExtractedView, }; +use core::any::{Any, TypeId}; /// A list of `(Material ID, Pipeline, BindGroup)` for a view for use in [`super::MeshletMainOpaquePass3dNode`]. #[derive(Component, Deref, DerefMut, Default)] @@ -27,11 +28,12 @@ pub struct MeshletViewMaterialsMainOpaquePass(pub Vec<(u32, CachedRenderPipeline pub fn prepare_material_meshlet_meshes_main_opaque_pass( resource_manager: ResMut, mut instance_manager: ResMut, - mut cache: Local>, + mut cache: Local>, pipeline_cache: Res, material_pipeline: Res, mesh_pipeline: Res, render_materials: Res>, + meshlet_pipelines: Res, render_material_instances: Res, material_bind_group_allocators: Res, mut mesh_vertex_buffer_layouts: ResMut, @@ -194,7 +196,7 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( layout, push_constant_ranges: vec![], vertex: VertexState { - shader: MESHLET_MESH_MATERIAL_SHADER_HANDLE, + shader: meshlet_pipelines.meshlet_mesh_material.clone(), shader_defs: shader_defs.clone(), entry_point: material_pipeline_descriptor.vertex.entry_point, buffers: Vec::new(), @@ -211,7 +213,7 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( fragment: Some(FragmentState { shader: match material.properties.get_shader(MeshletFragmentShader) { Some(shader) => shader.clone(), - None => MESHLET_MESH_MATERIAL_SHADER_HANDLE, + None => meshlet_pipelines.meshlet_mesh_material.clone(), }, shader_defs, entry_point: material_fragment.entry_point, @@ -219,14 +221,14 @@ pub fn prepare_material_meshlet_meshes_main_opaque_pass( }), zero_initialize_workgroup_memory: false, }; - let Some(material_bind_group_allocator) = - material_bind_group_allocators.get(&material_id.type_id()) + let type_id = material_id.type_id(); + let Some(material_bind_group_allocator) = material_bind_group_allocators.get(&type_id) else { continue; }; let material_id = instance_manager.get_material_id(material_id); - let pipeline_id = *cache.entry(view_key).or_insert_with(|| { + let pipeline_id = *cache.entry((view_key, type_id)).or_insert_with(|| { pipeline_cache.queue_render_pipeline(pipeline_descriptor.clone()) }); @@ -259,11 +261,12 @@ pub struct MeshletViewMaterialsDeferredGBufferPrepass( pub fn prepare_material_meshlet_meshes_prepass( resource_manager: ResMut, mut instance_manager: ResMut, - mut cache: Local>, + mut cache: Local>, pipeline_cache: Res, prepass_pipeline: Res, material_bind_group_allocators: Res, render_materials: Res>, + meshlet_pipelines: Res, render_material_instances: Res, mut mesh_vertex_buffer_layouts: ResMut, mut views: Query< @@ -360,23 +363,25 @@ pub fn prepare_material_meshlet_meshes_prepass( material .properties .get_shader(MeshletDeferredFragmentShader) - .unwrap_or(MESHLET_MESH_MATERIAL_SHADER_HANDLE) + .unwrap_or(meshlet_pipelines.meshlet_mesh_material.clone()) } else { material .properties .get_shader(MeshletPrepassFragmentShader) - .unwrap_or(MESHLET_MESH_MATERIAL_SHADER_HANDLE) + .unwrap_or(meshlet_pipelines.meshlet_mesh_material.clone()) }; - let entry_point = match &fragment_shader { - x if x == &MESHLET_MESH_MATERIAL_SHADER_HANDLE => "prepass_fragment".into(), - _ => material_fragment.entry_point, + let entry_point = if fragment_shader == meshlet_pipelines.meshlet_mesh_material { + material_fragment.entry_point.clone() + } else { + "prepass_fragment".into() }; let pipeline_descriptor = RenderPipelineDescriptor { label: material_pipeline_descriptor.label, layout: vec![ view_layout, + prepass_pipeline.internal.empty_layout.clone(), resource_manager.material_shade_bind_group_layout.clone(), material .properties @@ -387,7 +392,7 @@ pub fn prepare_material_meshlet_meshes_prepass( ], push_constant_ranges: vec![], vertex: VertexState { - shader: MESHLET_MESH_MATERIAL_SHADER_HANDLE, + shader: meshlet_pipelines.meshlet_mesh_material.clone(), shader_defs: shader_defs.clone(), entry_point: material_pipeline_descriptor.vertex.entry_point, buffers: Vec::new(), @@ -412,9 +417,11 @@ pub fn prepare_material_meshlet_meshes_prepass( let material_id = instance_manager.get_material_id(material_id); - let pipeline_id = *cache.entry(view_key).or_insert_with(|| { - pipeline_cache.queue_render_pipeline(pipeline_descriptor.clone()) - }); + let pipeline_id = *cache + .entry((view_key, material_id.type_id())) + .or_insert_with(|| { + pipeline_cache.queue_render_pipeline(pipeline_descriptor.clone()) + }); let Some(material_bind_group) = material_bind_group_allocator.get(material.binding.group) diff --git a/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs b/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs index 9791ef2b02..39dcb0c169 100644 --- a/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs +++ b/crates/bevy_pbr/src/meshlet/material_shade_nodes.rs @@ -118,7 +118,8 @@ impl ViewNode for MeshletMainOpaquePass3dNode { **view_environment_map_offset, ], ); - render_pass.set_bind_group(1, meshlet_material_shade_bind_group, &[]); + render_pass.set_bind_group(1, &mesh_view_bind_group.binding_array, &[]); + render_pass.set_bind_group(2, meshlet_material_shade_bind_group, &[]); // 1 fullscreen triangle draw per material for (material_id, material_pipeline_id, material_bind_group) in @@ -130,7 +131,7 @@ impl ViewNode for MeshletMainOpaquePass3dNode { { let x = *material_id * 3; render_pass.set_render_pipeline(material_pipeline); - render_pass.set_bind_group(2, material_bind_group, &[]); + render_pass.set_bind_group(3, material_bind_group, &[]); render_pass.draw(x..(x + 3), 0..1); } } @@ -243,7 +244,8 @@ impl ViewNode for MeshletPrepassNode { ); } - render_pass.set_bind_group(1, meshlet_material_shade_bind_group, &[]); + render_pass.set_bind_group(1, &prepass_view_bind_group.empty_bind_group, &[]); + render_pass.set_bind_group(2, meshlet_material_shade_bind_group, &[]); // 1 fullscreen triangle draw per material for (material_id, material_pipeline_id, material_bind_group) in @@ -373,7 +375,8 @@ impl ViewNode for MeshletDeferredGBufferPrepassNode { ); } - render_pass.set_bind_group(1, meshlet_material_shade_bind_group, &[]); + render_pass.set_bind_group(1, &prepass_view_bind_group.empty_bind_group, &[]); + render_pass.set_bind_group(2, meshlet_material_shade_bind_group, &[]); // 1 fullscreen triangle draw per material for (material_id, material_pipeline_id, material_bind_group) in diff --git a/crates/bevy_pbr/src/meshlet/meshlet_bindings.wgsl b/crates/bevy_pbr/src/meshlet/meshlet_bindings.wgsl index 63e92f15e6..4533b2bd7f 100644 --- a/crates/bevy_pbr/src/meshlet/meshlet_bindings.wgsl +++ b/crates/bevy_pbr/src/meshlet/meshlet_bindings.wgsl @@ -5,6 +5,13 @@ #import bevy_pbr::prepass_bindings::PreviousViewUniforms #import bevy_pbr::utils::octahedral_decode_signed +struct BvhNode { + aabbs: array, + lod_bounds: array, 8>, + child_counts: array, + _padding: vec2, +} + struct Meshlet { start_vertex_position_bit: u32, start_vertex_attribute_id: u32, @@ -24,15 +31,34 @@ fn get_meshlet_triangle_count(meshlet: ptr) -> u32 { return extractBits((*meshlet).packed_a, 8u, 8u); } -struct MeshletBoundingSpheres { - culling_sphere: MeshletBoundingSphere, - lod_group_sphere: MeshletBoundingSphere, - lod_parent_group_sphere: MeshletBoundingSphere, +struct MeshletCullData { + aabb: MeshletAabbErrorOffset, + lod_group_sphere: vec4, } -struct MeshletBoundingSphere { +struct MeshletAabb { center: vec3, - radius: f32, + half_extent: vec3, +} + +struct MeshletAabbErrorOffset { + center_and_error: vec4, + half_extent_and_child_offset: vec4, +} + +fn get_aabb(aabb: ptr) -> MeshletAabb { + return MeshletAabb( + (*aabb).center_and_error.xyz, + (*aabb).half_extent_and_child_offset.xyz, + ); +} + +fn get_aabb_error(aabb: ptr) -> f32 { + return (*aabb).center_and_error.w; +} + +fn get_aabb_child_offset(aabb: ptr) -> u32 { + return bitcast((*aabb).half_extent_and_child_offset.w); } struct DispatchIndirectArgs { @@ -48,63 +74,133 @@ struct DrawIndirectArgs { first_instance: u32, } +// Either a BVH node or a meshlet, along with the instance it is associated with. +// Refers to BVH nodes in `meshlet_bvh_cull_queue` and `meshlet_second_pass_bvh_queue`, where `offset` is the index into `meshlet_bvh_nodes`. +// Refers to meshlets in `meshlet_meshlet_cull_queue` and `meshlet_raster_clusters`. +// In `meshlet_meshlet_cull_queue`, `offset` is the index into `meshlet_cull_data`. +// In `meshlet_raster_clusters`, `offset` is the index into `meshlets`. +struct InstancedOffset { + instance_id: u32, + offset: u32, +} + const CENTIMETERS_PER_METER = 100.0; -#ifdef MESHLET_FILL_CLUSTER_BUFFERS_PASS -var scene_instance_count: u32; -@group(0) @binding(0) var meshlet_instance_meshlet_counts: array; // Per entity instance -@group(0) @binding(1) var meshlet_instance_meshlet_slice_starts: array; // Per entity instance -@group(0) @binding(2) var meshlet_cluster_instance_ids: array; // Per cluster -@group(0) @binding(3) var meshlet_cluster_meshlet_ids: array; // Per cluster -@group(0) @binding(4) var meshlet_global_cluster_count: atomic; // Single object shared between all workgroups +#ifdef MESHLET_INSTANCE_CULLING_PASS +struct Constants { scene_instance_count: u32 } +var constants: Constants; + +// Cull data +@group(0) @binding(0) var depth_pyramid: texture_2d; +@group(0) @binding(1) var view: View; +@group(0) @binding(2) var previous_view: PreviousViewUniforms; + +// Per entity instance data +@group(0) @binding(3) var meshlet_instance_uniforms: array; +@group(0) @binding(4) var meshlet_view_instance_visibility: array; // 1 bit per entity instance, packed as a bitmask +@group(0) @binding(5) var meshlet_instance_aabbs: array; +@group(0) @binding(6) var meshlet_instance_bvh_root_nodes: array; + +// BVH cull queue data +@group(0) @binding(7) var meshlet_bvh_cull_count_write: atomic; +@group(0) @binding(8) var meshlet_bvh_cull_dispatch: DispatchIndirectArgs; +@group(0) @binding(9) var meshlet_bvh_cull_queue: array; + +// Second pass queue data +#ifdef MESHLET_FIRST_CULLING_PASS +@group(0) @binding(10) var meshlet_second_pass_instance_count: atomic; +@group(0) @binding(11) var meshlet_second_pass_instance_dispatch: DispatchIndirectArgs; +@group(0) @binding(12) var meshlet_second_pass_instance_candidates: array; +#else +@group(0) @binding(10) var meshlet_second_pass_instance_count: u32; +@group(0) @binding(11) var meshlet_second_pass_instance_candidates: array; +#endif #endif -#ifdef MESHLET_CULLING_PASS -struct Constants { scene_cluster_count: u32, meshlet_raster_cluster_rightmost_slot: u32 } +#ifdef MESHLET_BVH_CULLING_PASS +struct Constants { read_from_front: u32, rightmost_slot: u32 } var constants: Constants; -@group(0) @binding(0) var meshlet_cluster_meshlet_ids: array; // Per cluster -@group(0) @binding(1) var meshlet_bounding_spheres: array; // Per meshlet -@group(0) @binding(2) var meshlet_simplification_errors: array; // Per meshlet -@group(0) @binding(3) var meshlet_cluster_instance_ids: array; // Per cluster -@group(0) @binding(4) var meshlet_instance_uniforms: array; // Per entity instance -@group(0) @binding(5) var meshlet_view_instance_visibility: array; // 1 bit per entity instance, packed as a bitmask -@group(0) @binding(6) var meshlet_second_pass_candidates: array>; // 1 bit per cluster , packed as a bitmask -@group(0) @binding(7) var meshlet_software_raster_indirect_args: DispatchIndirectArgs; // Single object shared between all workgroups -@group(0) @binding(8) var meshlet_hardware_raster_indirect_args: DrawIndirectArgs; // Single object shared between all workgroups -@group(0) @binding(9) var meshlet_raster_clusters: array; // Single object shared between all workgroups -@group(0) @binding(10) var depth_pyramid: texture_2d; // From the end of the last frame for the first culling pass, and from the first raster pass for the second culling pass -@group(0) @binding(11) var view: View; -@group(0) @binding(12) var previous_view: PreviousViewUniforms; -fn should_cull_instance(instance_id: u32) -> bool { - let bit_offset = instance_id % 32u; - let packed_visibility = meshlet_view_instance_visibility[instance_id / 32u]; - return bool(extractBits(packed_visibility, bit_offset, 1u)); -} +// Cull data +@group(0) @binding(0) var depth_pyramid: texture_2d; // From the end of the last frame for the first culling pass, and from the first raster pass for the second culling pass +@group(0) @binding(1) var view: View; +@group(0) @binding(2) var previous_view: PreviousViewUniforms; -// TODO: Load 4x per workgroup instead of once per thread? -fn cluster_is_second_pass_candidate(cluster_id: u32) -> bool { - let packed_candidates = meshlet_second_pass_candidates[cluster_id / 32u]; - let bit_offset = cluster_id % 32u; - return bool(extractBits(packed_candidates, bit_offset, 1u)); -} +// Global mesh data +@group(0) @binding(3) var meshlet_bvh_nodes: array; + +// Per entity instance data +@group(0) @binding(4) var meshlet_instance_uniforms: array; + +// BVH cull queue data +@group(0) @binding(5) var meshlet_bvh_cull_count_read: u32; +@group(0) @binding(6) var meshlet_bvh_cull_count_write: atomic; +@group(0) @binding(7) var meshlet_bvh_cull_dispatch: DispatchIndirectArgs; +@group(0) @binding(8) var meshlet_bvh_cull_queue: array; + +// Meshlet cull queue data +@group(0) @binding(9) var meshlet_meshlet_cull_count_early: atomic; +@group(0) @binding(10) var meshlet_meshlet_cull_count_late: atomic; +@group(0) @binding(11) var meshlet_meshlet_cull_dispatch_early: DispatchIndirectArgs; +@group(0) @binding(12) var meshlet_meshlet_cull_dispatch_late: DispatchIndirectArgs; +@group(0) @binding(13) var meshlet_meshlet_cull_queue: array; + +// Second pass queue data +#ifdef MESHLET_FIRST_CULLING_PASS +@group(0) @binding(14) var meshlet_second_pass_bvh_count: atomic; +@group(0) @binding(15) var meshlet_second_pass_bvh_dispatch: DispatchIndirectArgs; +@group(0) @binding(16) var meshlet_second_pass_bvh_queue: array; +#endif +#endif + +#ifdef MESHLET_CLUSTER_CULLING_PASS +struct Constants { rightmost_slot: u32 } +var constants: Constants; + +// Cull data +@group(0) @binding(0) var depth_pyramid: texture_2d; // From the end of the last frame for the first culling pass, and from the first raster pass for the second culling pass +@group(0) @binding(1) var view: View; +@group(0) @binding(2) var previous_view: PreviousViewUniforms; + +// Global mesh data +@group(0) @binding(3) var meshlet_cull_data: array; + +// Per entity instance data +@group(0) @binding(4) var meshlet_instance_uniforms: array; + +// Raster queue data +@group(0) @binding(5) var meshlet_software_raster_indirect_args: DispatchIndirectArgs; +@group(0) @binding(6) var meshlet_hardware_raster_indirect_args: DrawIndirectArgs; +@group(0) @binding(7) var meshlet_previous_raster_counts: array; +@group(0) @binding(8) var meshlet_raster_clusters: array; + +// Meshlet cull queue data +@group(0) @binding(9) var meshlet_meshlet_cull_count_read: u32; + +// Second pass queue data +#ifdef MESHLET_FIRST_CULLING_PASS +@group(0) @binding(10) var meshlet_meshlet_cull_count_write: atomic; +@group(0) @binding(11) var meshlet_meshlet_cull_dispatch: DispatchIndirectArgs; +@group(0) @binding(12) var meshlet_meshlet_cull_queue: array; +#else +@group(0) @binding(10) var meshlet_meshlet_cull_queue: array; +#endif #endif #ifdef MESHLET_VISIBILITY_BUFFER_RASTER_PASS -@group(0) @binding(0) var meshlet_cluster_meshlet_ids: array; // Per cluster +@group(0) @binding(0) var meshlet_raster_clusters: array; // Per cluster @group(0) @binding(1) var meshlets: array; // Per meshlet @group(0) @binding(2) var meshlet_indices: array; // Many per meshlet @group(0) @binding(3) var meshlet_vertex_positions: array; // Many per meshlet -@group(0) @binding(4) var meshlet_cluster_instance_ids: array; // Per cluster -@group(0) @binding(5) var meshlet_instance_uniforms: array; // Per entity instance -@group(0) @binding(6) var meshlet_raster_clusters: array; // Single object shared between all workgroups -@group(0) @binding(7) var meshlet_software_raster_cluster_count: u32; +@group(0) @binding(4) var meshlet_instance_uniforms: array; // Per entity instance +@group(0) @binding(5) var meshlet_previous_raster_counts: array; +@group(0) @binding(6) var meshlet_software_raster_cluster_count: u32; #ifdef MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT -@group(0) @binding(8) var meshlet_visibility_buffer: texture_storage_2d; +@group(0) @binding(7) var meshlet_visibility_buffer: texture_storage_2d; #else -@group(0) @binding(8) var meshlet_visibility_buffer: texture_storage_2d; +@group(0) @binding(7) var meshlet_visibility_buffer: texture_storage_2d; #endif -@group(0) @binding(9) var view: View; +@group(0) @binding(8) var view: View; // TODO: Load only twice, instead of 3x in cases where you load 3 indices per thread? fn get_meshlet_vertex_id(index_id: u32) -> u32 { @@ -150,14 +246,13 @@ fn get_meshlet_vertex_position(meshlet: ptr, vertex_id: u32) #ifdef MESHLET_MESH_MATERIAL_PASS @group(2) @binding(0) var meshlet_visibility_buffer: texture_storage_2d; -@group(2) @binding(1) var meshlet_cluster_meshlet_ids: array; // Per cluster +@group(2) @binding(1) var meshlet_raster_clusters: array; // Per cluster @group(2) @binding(2) var meshlets: array; // Per meshlet @group(2) @binding(3) var meshlet_indices: array; // Many per meshlet @group(2) @binding(4) var meshlet_vertex_positions: array; // Many per meshlet @group(2) @binding(5) var meshlet_vertex_normals: array; // Many per meshlet @group(2) @binding(6) var meshlet_vertex_uvs: array>; // Many per meshlet -@group(2) @binding(7) var meshlet_cluster_instance_ids: array; // Per cluster -@group(2) @binding(8) var meshlet_instance_uniforms: array; // Per entity instance +@group(2) @binding(7) var meshlet_instance_uniforms: array; // Per entity instance // TODO: Load only twice, instead of 3x in cases where you load 3 indices per thread? fn get_meshlet_vertex_id(index_id: u32) -> u32 { diff --git a/crates/bevy_pbr/src/meshlet/meshlet_cull_shared.wgsl b/crates/bevy_pbr/src/meshlet/meshlet_cull_shared.wgsl new file mode 100644 index 0000000000..975dd74f1c --- /dev/null +++ b/crates/bevy_pbr/src/meshlet/meshlet_cull_shared.wgsl @@ -0,0 +1,207 @@ +#define_import_path bevy_pbr::meshlet_cull_shared + +#import bevy_pbr::meshlet_bindings::{ + MeshletAabb, + DispatchIndirectArgs, + InstancedOffset, + depth_pyramid, + view, + previous_view, + meshlet_instance_uniforms, +} +#import bevy_render::maths::affine3_to_square + +// https://github.com/zeux/meshoptimizer/blob/1e48e96c7e8059321de492865165e9ef071bffba/demo/nanite.cpp#L115 +fn lod_error_is_imperceptible(lod_sphere: vec4, simplification_error: f32, instance_id: u32) -> bool { + let world_from_local = affine3_to_square(meshlet_instance_uniforms[instance_id].world_from_local); + let world_scale = max(length(world_from_local[0]), max(length(world_from_local[1]), length(world_from_local[2]))); + let camera_pos = view.world_position; + + let projection = view.clip_from_view; + if projection[3][3] == 1.0 { + // Orthographic + let world_error = simplification_error * world_scale; + let proj = projection[1][1]; + let height = 2.0 / proj; + let norm_error = world_error / height; + return norm_error * view.viewport.w < 1.0; + } else { + // Perspective + var near = projection[3][2]; + let world_sphere_center = (world_from_local * vec4(lod_sphere.xyz, 1.0)).xyz; + let world_sphere_radius = lod_sphere.w * world_scale; + let d_pos = world_sphere_center - camera_pos; + let d = sqrt(dot(d_pos, d_pos)) - world_sphere_radius; + let norm_error = simplification_error / max(d, near) * projection[1][1] * 0.5; + return norm_error * view.viewport.w < 1.0; + } +} + +fn normalize_plane(p: vec4) -> vec4 { + return p / length(p.xyz); +} + +// https://fgiesen.wordpress.com/2012/08/31/frustum-planes-from-the-projection-matrix/ +// https://fgiesen.wordpress.com/2010/10/17/view-frustum-culling/ +fn aabb_in_frustum(aabb: MeshletAabb, instance_id: u32) -> bool { + let world_from_local = affine3_to_square(meshlet_instance_uniforms[instance_id].world_from_local); + let clip_from_local = view.clip_from_world * world_from_local; + let row_major = transpose(clip_from_local); + let planes = array( + row_major[3] + row_major[0], + row_major[3] - row_major[0], + row_major[3] + row_major[1], + row_major[3] - row_major[1], + row_major[2], + ); + + for (var i = 0; i < 5; i++) { + let plane = normalize_plane(planes[i]); + let flipped = aabb.half_extent * sign(plane.xyz); + if dot(aabb.center + flipped, plane.xyz) <= -plane.w { + return false; + } + } + return true; +} + +struct ScreenAabb { + min: vec3, + max: vec3, +} + +fn min8(a: vec3, b: vec3, c: vec3, d: vec3, e: vec3, f: vec3, g: vec3, h: vec3) -> vec3 { + return min(min(min(a, b), min(c, d)), min(min(e, f), min(g, h))); +} + +fn max8(a: vec3, b: vec3, c: vec3, d: vec3, e: vec3, f: vec3, g: vec3, h: vec3) -> vec3 { + return max(max(max(a, b), max(c, d)), max(max(e, f), max(g, h))); +} + +fn min8_4(a: vec4, b: vec4, c: vec4, d: vec4, e: vec4, f: vec4, g: vec4, h: vec4) -> vec4 { + return min(min(min(a, b), min(c, d)), min(min(e, f), min(g, h))); +} + +// https://zeux.io/2023/01/12/approximate-projected-bounds/ +fn project_aabb(clip_from_local: mat4x4, near: f32, aabb: MeshletAabb, out: ptr) -> bool { + let extent = aabb.half_extent * 2.0; + let sx = clip_from_local * vec4(extent.x, 0.0, 0.0, 0.0); + let sy = clip_from_local * vec4(0.0, extent.y, 0.0, 0.0); + let sz = clip_from_local * vec4(0.0, 0.0, extent.z, 0.0); + + let p0 = clip_from_local * vec4(aabb.center - aabb.half_extent, 1.0); + let p1 = p0 + sz; + let p2 = p0 + sy; + let p3 = p2 + sz; + let p4 = p0 + sx; + let p5 = p4 + sz; + let p6 = p4 + sy; + let p7 = p6 + sz; + + let depth = min8_4(p0, p1, p2, p3, p4, p5, p6, p7).w; + // do not occlusion cull if we are inside the aabb + if depth < near { + return false; + } + + let dp0 = p0.xyz / p0.w; + let dp1 = p1.xyz / p1.w; + let dp2 = p2.xyz / p2.w; + let dp3 = p3.xyz / p3.w; + let dp4 = p4.xyz / p4.w; + let dp5 = p5.xyz / p5.w; + let dp6 = p6.xyz / p6.w; + let dp7 = p7.xyz / p7.w; + let min = min8(dp0, dp1, dp2, dp3, dp4, dp5, dp6, dp7); + let max = max8(dp0, dp1, dp2, dp3, dp4, dp5, dp6, dp7); + var vaabb = vec4(min.xy, max.xy); + // convert ndc to texture coordinates by rescaling and flipping Y + vaabb = vaabb.xwzy * vec4(0.5, -0.5, 0.5, -0.5) + 0.5; + (*out).min = vec3(vaabb.xy, min.z); + (*out).max = vec3(vaabb.zw, max.z); + return true; +} + +fn sample_hzb(smin: vec2, smax: vec2, mip: i32) -> f32 { + let texel = vec4(0, 1, 2, 3); + let sx = min(smin.x + texel, smax.xxxx); + let sy = min(smin.y + texel, smax.yyyy); + // TODO: switch to min samplers when wgpu has them + // sampling 16 times a finer mip is worth the extra cost for better culling + let a = sample_hzb_row(sx, sy.x, mip); + let b = sample_hzb_row(sx, sy.y, mip); + let c = sample_hzb_row(sx, sy.z, mip); + let d = sample_hzb_row(sx, sy.w, mip); + return min(min(a, b), min(c, d)); +} + +fn sample_hzb_row(sx: vec4, sy: u32, mip: i32) -> f32 { + let a = textureLoad(depth_pyramid, vec2(sx.x, sy), mip).x; + let b = textureLoad(depth_pyramid, vec2(sx.y, sy), mip).x; + let c = textureLoad(depth_pyramid, vec2(sx.z, sy), mip).x; + let d = textureLoad(depth_pyramid, vec2(sx.w, sy), mip).x; + return min(min(a, b), min(c, d)); +} + +// TODO: We should probably be using a POT HZB texture? +fn occlusion_cull_screen_aabb(aabb: ScreenAabb, screen: vec2) -> bool { + let hzb_size = ceil(screen * 0.5); + let aabb_min = aabb.min.xy * hzb_size; + let aabb_max = aabb.max.xy * hzb_size; + + let min_texel = vec2(max(aabb_min, vec2(0.0))); + let max_texel = vec2(min(aabb_max, hzb_size - 1.0)); + let size = max_texel - min_texel; + let max_size = max(size.x, size.y); + + // note: add 1 before max because the unsigned overflow behavior is intentional + // it wraps around firstLeadingBit(0) = ~0 to 0 + // TODO: we actually sample a 4x4 block, so ideally this would be `max(..., 3u) - 3u`. + // However, since our HZB is not a power of two, we need to be extra-conservative to not over-cull, so we go up a mip. + var mip = max(firstLeadingBit(max_size) + 1u, 2u) - 2u; + + if any((max_texel >> vec2(mip)) > (min_texel >> vec2(mip)) + 3) { + mip += 1u; + } + + let smin = min_texel >> vec2(mip); + let smax = max_texel >> vec2(mip); + + let curr_depth = sample_hzb(smin, smax, i32(mip)); + return aabb.max.z <= curr_depth; +} + +fn occlusion_cull_projection() -> mat4x4 { +#ifdef FIRST_CULLING_PASS + return view.clip_from_world; +#else + return previous_view.clip_from_world; +#endif +} + +fn occlusion_cull_clip_from_local(instance_id: u32) -> mat4x4 { +#ifdef FIRST_CULLING_PASS + let prev_world_from_local = affine3_to_square(meshlet_instance_uniforms[instance_id].previous_world_from_local); + return previous_view.clip_from_world * prev_world_from_local; +#else + let world_from_local = affine3_to_square(meshlet_instance_uniforms[instance_id].world_from_local); + return view.clip_from_world * world_from_local; +#endif +} + +fn should_occlusion_cull_aabb(aabb: MeshletAabb, instance_id: u32) -> bool { + let projection = occlusion_cull_projection(); + var near: f32; + if projection[3][3] == 1.0 { + near = projection[3][2] / projection[2][2]; + } else { + near = projection[3][2]; + } + + let clip_from_local = occlusion_cull_clip_from_local(instance_id); + var screen_aabb = ScreenAabb(vec3(0.0), vec3(0.0)); + if project_aabb(clip_from_local, near, aabb, &screen_aabb) { + return occlusion_cull_screen_aabb(screen_aabb, view.viewport.zw); + } + return false; +} diff --git a/crates/bevy_pbr/src/meshlet/meshlet_mesh_manager.rs b/crates/bevy_pbr/src/meshlet/meshlet_mesh_manager.rs index 0f4aab7509..93eb5a1afe 100644 --- a/crates/bevy_pbr/src/meshlet/meshlet_mesh_manager.rs +++ b/crates/bevy_pbr/src/meshlet/meshlet_mesh_manager.rs @@ -1,8 +1,6 @@ -use super::{ - asset::{Meshlet, MeshletBoundingSpheres, MeshletSimplificationError}, - persistent_buffer::PersistentGpuBuffer, - MeshletMesh, -}; +use crate::meshlet::asset::{BvhNode, MeshletAabb, MeshletCullData}; + +use super::{asset::Meshlet, persistent_buffer::PersistentGpuBuffer, MeshletMesh}; use alloc::sync::Arc; use bevy_asset::{AssetId, Assets}; use bevy_ecs::{ @@ -25,10 +23,11 @@ pub struct MeshletMeshManager { pub vertex_normals: PersistentGpuBuffer>, pub vertex_uvs: PersistentGpuBuffer>, pub indices: PersistentGpuBuffer>, + pub bvh_nodes: PersistentGpuBuffer>, pub meshlets: PersistentGpuBuffer>, - pub meshlet_bounding_spheres: PersistentGpuBuffer>, - pub meshlet_simplification_errors: PersistentGpuBuffer>, - meshlet_mesh_slices: HashMap, [Range; 7]>, + pub meshlet_cull_data: PersistentGpuBuffer>, + meshlet_mesh_slices: + HashMap, ([Range; 7], MeshletAabb, u32)>, } impl FromWorld for MeshletMeshManager { @@ -39,26 +38,21 @@ impl FromWorld for MeshletMeshManager { vertex_normals: PersistentGpuBuffer::new("meshlet_vertex_normals", render_device), vertex_uvs: PersistentGpuBuffer::new("meshlet_vertex_uvs", render_device), indices: PersistentGpuBuffer::new("meshlet_indices", render_device), + bvh_nodes: PersistentGpuBuffer::new("meshlet_bvh_nodes", render_device), meshlets: PersistentGpuBuffer::new("meshlets", render_device), - meshlet_bounding_spheres: PersistentGpuBuffer::new( - "meshlet_bounding_spheres", - render_device, - ), - meshlet_simplification_errors: PersistentGpuBuffer::new( - "meshlet_simplification_errors", - render_device, - ), + meshlet_cull_data: PersistentGpuBuffer::new("meshlet_cull_data", render_device), meshlet_mesh_slices: HashMap::default(), } } } impl MeshletMeshManager { + // Returns the index of the root BVH node, as well as the depth of the BVH. pub fn queue_upload_if_needed( &mut self, asset_id: AssetId, assets: &mut Assets, - ) -> Range { + ) -> (u32, MeshletAabb, u32) { let queue_meshlet_mesh = |asset_id: &AssetId| { let meshlet_mesh = assets.remove_untracked(*asset_id).expect( "MeshletMesh asset was already unloaded but is not registered with MeshletMeshManager", @@ -84,51 +78,59 @@ impl MeshletMeshManager { indices_slice.start, ), ); - let meshlet_bounding_spheres_slice = self - .meshlet_bounding_spheres - .queue_write(Arc::clone(&meshlet_mesh.meshlet_bounding_spheres), ()); - let meshlet_simplification_errors_slice = self - .meshlet_simplification_errors - .queue_write(Arc::clone(&meshlet_mesh.meshlet_simplification_errors), ()); + let base_meshlet_index = (meshlets_slice.start / size_of::() as u64) as u32; + let bvh_node_slice = self + .bvh_nodes + .queue_write(Arc::clone(&meshlet_mesh.bvh), base_meshlet_index); + let meshlet_cull_data_slice = self + .meshlet_cull_data + .queue_write(Arc::clone(&meshlet_mesh.meshlet_cull_data), ()); - [ - vertex_positions_slice, - vertex_normals_slice, - vertex_uvs_slice, - indices_slice, - meshlets_slice, - meshlet_bounding_spheres_slice, - meshlet_simplification_errors_slice, - ] + ( + [ + vertex_positions_slice, + vertex_normals_slice, + vertex_uvs_slice, + indices_slice, + bvh_node_slice, + meshlets_slice, + meshlet_cull_data_slice, + ], + meshlet_mesh.aabb, + meshlet_mesh.bvh_depth, + ) }; // If the MeshletMesh asset has not been uploaded to the GPU yet, queue it for uploading - let [_, _, _, _, meshlets_slice, _, _] = self + let ([_, _, _, _, bvh_node_slice, _, _], aabb, bvh_depth) = self .meshlet_mesh_slices .entry(asset_id) .or_insert_with_key(queue_meshlet_mesh) .clone(); - let meshlets_slice_start = meshlets_slice.start as u32 / size_of::() as u32; - let meshlets_slice_end = meshlets_slice.end as u32 / size_of::() as u32; - meshlets_slice_start..meshlets_slice_end + ( + (bvh_node_slice.start / size_of::() as u64) as u32, + aabb, + bvh_depth, + ) } pub fn remove(&mut self, asset_id: &AssetId) { - if let Some( - [vertex_positions_slice, vertex_normals_slice, vertex_uvs_slice, indices_slice, meshlets_slice, meshlet_bounding_spheres_slice, meshlet_simplification_errors_slice], - ) = self.meshlet_mesh_slices.remove(asset_id) + if let Some(( + [vertex_positions_slice, vertex_normals_slice, vertex_uvs_slice, indices_slice, bvh_node_slice, meshlets_slice, meshlet_cull_data_slice], + _, + _, + )) = self.meshlet_mesh_slices.remove(asset_id) { self.vertex_positions .mark_slice_unused(vertex_positions_slice); self.vertex_normals.mark_slice_unused(vertex_normals_slice); self.vertex_uvs.mark_slice_unused(vertex_uvs_slice); self.indices.mark_slice_unused(indices_slice); + self.bvh_nodes.mark_slice_unused(bvh_node_slice); self.meshlets.mark_slice_unused(meshlets_slice); - self.meshlet_bounding_spheres - .mark_slice_unused(meshlet_bounding_spheres_slice); - self.meshlet_simplification_errors - .mark_slice_unused(meshlet_simplification_errors_slice); + self.meshlet_cull_data + .mark_slice_unused(meshlet_cull_data_slice); } } } @@ -151,13 +153,13 @@ pub fn perform_pending_meshlet_mesh_writes( meshlet_mesh_manager .indices .perform_writes(&render_queue, &render_device); + meshlet_mesh_manager + .bvh_nodes + .perform_writes(&render_queue, &render_device); meshlet_mesh_manager .meshlets .perform_writes(&render_queue, &render_device); meshlet_mesh_manager - .meshlet_bounding_spheres - .perform_writes(&render_queue, &render_device); - meshlet_mesh_manager - .meshlet_simplification_errors + .meshlet_cull_data .perform_writes(&render_queue, &render_device); } diff --git a/crates/bevy_pbr/src/meshlet/mod.rs b/crates/bevy_pbr/src/meshlet/mod.rs index 60cf680ac0..237ff9aa1b 100644 --- a/crates/bevy_pbr/src/meshlet/mod.rs +++ b/crates/bevy_pbr/src/meshlet/mod.rs @@ -58,7 +58,7 @@ use self::{ }; use crate::{graph::NodePbr, PreviousGlobalTransform}; use bevy_app::{App, Plugin}; -use bevy_asset::{load_internal_asset, weak_handle, AssetApp, AssetId, Handle}; +use bevy_asset::{embedded_asset, AssetApp, AssetId, Handle}; use bevy_core_pipeline::{ core_3d::graph::{Core3d, Node3d}, prepass::{DeferredPrepass, MotionVectorPrepass, NormalPrepass}, @@ -74,8 +74,8 @@ use bevy_ecs::{ }; use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ + load_shader_library, render_graph::{RenderGraphApp, ViewNodeRunner}, - render_resource::Shader, renderer::RenderDevice, settings::WgpuFeatures, view::{self, prepare_view_targets, Msaa, Visibility, VisibilityClass}, @@ -85,11 +85,6 @@ use bevy_transform::components::Transform; use derive_more::From; use tracing::error; -const MESHLET_BINDINGS_SHADER_HANDLE: Handle = - weak_handle!("d90ac78c-500f-48aa-b488-cc98eb3f6314"); -const MESHLET_MESH_MATERIAL_SHADER_HANDLE: Handle = - weak_handle!("db8d9001-6ca7-4d00-968a-d5f5b96b89c3"); - /// Provides a plugin for rendering large amounts of high-poly 3d meshes using an efficient GPU-driven method. See also [`MeshletMesh`]. /// /// Rendering dense scenes made of high-poly meshes with thousands or millions of triangles is extremely expensive in Bevy's standard renderer. @@ -152,66 +147,19 @@ impl Plugin for MeshletPlugin { std::process::exit(1); } - load_internal_asset!( - app, - MESHLET_CLEAR_VISIBILITY_BUFFER_SHADER_HANDLE, - "clear_visibility_buffer.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_BINDINGS_SHADER_HANDLE, - "meshlet_bindings.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - super::MESHLET_VISIBILITY_BUFFER_RESOLVE_SHADER_HANDLE, - "visibility_buffer_resolve.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_FILL_CLUSTER_BUFFERS_SHADER_HANDLE, - "fill_cluster_buffers.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_CULLING_SHADER_HANDLE, - "cull_clusters.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_VISIBILITY_BUFFER_SOFTWARE_RASTER_SHADER_HANDLE, - "visibility_buffer_software_raster.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE, - "visibility_buffer_hardware_raster.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_MESH_MATERIAL_SHADER_HANDLE, - "meshlet_mesh_material.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_RESOLVE_RENDER_TARGETS_SHADER_HANDLE, - "resolve_render_targets.wgsl", - Shader::from_wgsl - ); - load_internal_asset!( - app, - MESHLET_REMAP_1D_TO_2D_DISPATCH_SHADER_HANDLE, - "remap_1d_to_2d_dispatch.wgsl", - Shader::from_wgsl - ); + load_shader_library!(app, "meshlet_bindings.wgsl"); + load_shader_library!(app, "visibility_buffer_resolve.wgsl"); + load_shader_library!(app, "meshlet_cull_shared.wgsl"); + embedded_asset!(app, "clear_visibility_buffer.wgsl"); + embedded_asset!(app, "cull_instances.wgsl"); + embedded_asset!(app, "cull_bvh.wgsl"); + embedded_asset!(app, "cull_clusters.wgsl"); + embedded_asset!(app, "visibility_buffer_software_raster.wgsl"); + embedded_asset!(app, "visibility_buffer_hardware_raster.wgsl"); + embedded_asset!(app, "meshlet_mesh_material.wgsl"); + embedded_asset!(app, "resolve_render_targets.wgsl"); + embedded_asset!(app, "remap_1d_to_2d_dispatch.wgsl"); + embedded_asset!(app, "fill_counts.wgsl"); app.init_asset::() .register_asset_loader(MeshletMeshLoader); diff --git a/crates/bevy_pbr/src/meshlet/persistent_buffer.rs b/crates/bevy_pbr/src/meshlet/persistent_buffer.rs index 85dec457f9..e8f4669227 100644 --- a/crates/bevy_pbr/src/meshlet/persistent_buffer.rs +++ b/crates/bevy_pbr/src/meshlet/persistent_buffer.rs @@ -71,7 +71,7 @@ impl PersistentGpuBuffer { let mut buffer_view = render_queue .write_buffer_with(&self.buffer, buffer_slice.start, buffer_slice_size) .unwrap(); - data.write_bytes_le(metadata, &mut buffer_view); + data.write_bytes_le(metadata, &mut buffer_view, buffer_slice.start); } let queue_saturation = queue_count as f32 / self.write_queue.capacity() as f32; @@ -123,5 +123,10 @@ pub trait PersistentGpuBufferable { /// Convert `self` + `metadata` into bytes (little-endian), and write to the provided buffer slice. /// Any bytes not written to in the slice will be zeroed out when uploaded to the GPU. - fn write_bytes_le(&self, metadata: Self::Metadata, buffer_slice: &mut [u8]); + fn write_bytes_le( + &self, + metadata: Self::Metadata, + buffer_slice: &mut [u8], + buffer_offset: BufferAddress, + ); } diff --git a/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs b/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs index 9c2667d3f3..210a52becd 100644 --- a/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs +++ b/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs @@ -1,9 +1,50 @@ -use super::{ - asset::{Meshlet, MeshletBoundingSpheres, MeshletSimplificationError}, - persistent_buffer::PersistentGpuBufferable, -}; +use crate::meshlet::asset::{BvhNode, MeshletCullData}; + +use super::{asset::Meshlet, persistent_buffer::PersistentGpuBufferable}; use alloc::sync::Arc; use bevy_math::Vec2; +use bevy_render::render_resource::BufferAddress; + +impl PersistentGpuBufferable for Arc<[BvhNode]> { + type Metadata = u32; + + fn size_in_bytes(&self) -> usize { + self.len() * size_of::() + } + + fn write_bytes_le( + &self, + base_meshlet_index: Self::Metadata, + buffer_slice: &mut [u8], + buffer_offset: BufferAddress, + ) { + const SIZE: usize = size_of::(); + for (i, &node) in self.iter().enumerate() { + let bytes: [u8; SIZE] = + bytemuck::cast(node.offset_aabbs(base_meshlet_index, buffer_offset)); + buffer_slice[i * SIZE..(i + 1) * SIZE].copy_from_slice(&bytes); + } + } +} + +impl BvhNode { + fn offset_aabbs(mut self, base_meshlet_index: u32, buffer_offset: BufferAddress) -> Self { + let size = size_of::(); + let base_bvh_node_index = (buffer_offset / size as u64) as u32; + for i in 0..self.aabbs.len() { + self.aabbs[i].child_offset += if self.child_is_bvh_node(i) { + base_bvh_node_index + } else { + base_meshlet_index + }; + } + self + } + + fn child_is_bvh_node(&self, i: usize) -> bool { + self.child_counts[i] == u8::MAX + } +} impl PersistentGpuBufferable for Arc<[Meshlet]> { type Metadata = (u64, u64, u64); @@ -16,6 +57,7 @@ impl PersistentGpuBufferable for Arc<[Meshlet]> { &self, (vertex_position_offset, vertex_attribute_offset, index_offset): Self::Metadata, buffer_slice: &mut [u8], + _: BufferAddress, ) { let vertex_position_offset = (vertex_position_offset * 8) as u32; let vertex_attribute_offset = (vertex_attribute_offset as usize / size_of::()) as u32; @@ -37,6 +79,18 @@ impl PersistentGpuBufferable for Arc<[Meshlet]> { } } +impl PersistentGpuBufferable for Arc<[MeshletCullData]> { + type Metadata = (); + + fn size_in_bytes(&self) -> usize { + self.len() * size_of::() + } + + fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) { + buffer_slice.clone_from_slice(bytemuck::cast_slice(self)); + } +} + impl PersistentGpuBufferable for Arc<[u8]> { type Metadata = (); @@ -44,7 +98,7 @@ impl PersistentGpuBufferable for Arc<[u8]> { self.len() } - fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8]) { + fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) { buffer_slice.clone_from_slice(self); } } @@ -56,7 +110,7 @@ impl PersistentGpuBufferable for Arc<[u32]> { self.len() * size_of::() } - fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8]) { + fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) { buffer_slice.clone_from_slice(bytemuck::cast_slice(self)); } } @@ -68,31 +122,7 @@ impl PersistentGpuBufferable for Arc<[Vec2]> { self.len() * size_of::() } - fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8]) { - buffer_slice.clone_from_slice(bytemuck::cast_slice(self)); - } -} - -impl PersistentGpuBufferable for Arc<[MeshletBoundingSpheres]> { - type Metadata = (); - - fn size_in_bytes(&self) -> usize { - self.len() * size_of::() - } - - fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8]) { - buffer_slice.clone_from_slice(bytemuck::cast_slice(self)); - } -} - -impl PersistentGpuBufferable for Arc<[MeshletSimplificationError]> { - type Metadata = (); - - fn size_in_bytes(&self) -> usize { - self.len() * size_of::() - } - - fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8]) { + fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) { buffer_slice.clone_from_slice(bytemuck::cast_slice(self)); } } diff --git a/crates/bevy_pbr/src/meshlet/pipelines.rs b/crates/bevy_pbr/src/meshlet/pipelines.rs index 243bbddf22..8e112d0ad9 100644 --- a/crates/bevy_pbr/src/meshlet/pipelines.rs +++ b/crates/bevy_pbr/src/meshlet/pipelines.rs @@ -1,5 +1,5 @@ use super::resource_manager::ResourceManager; -use bevy_asset::{weak_handle, Handle}; +use bevy_asset::{load_embedded_asset, Handle}; use bevy_core_pipeline::{ core_3d::CORE_3D_DEPTH_FORMAT, experimental::mip_generation::DOWNSAMPLE_DEPTH_SHADER_HANDLE, FullscreenShader, @@ -10,28 +10,16 @@ use bevy_ecs::{ }; use bevy_render::render_resource::*; -pub const MESHLET_CLEAR_VISIBILITY_BUFFER_SHADER_HANDLE: Handle = - weak_handle!("a4bf48e4-5605-4d1c-987e-29c7b1ec95dc"); -pub const MESHLET_FILL_CLUSTER_BUFFERS_SHADER_HANDLE: Handle = - weak_handle!("80ccea4a-8234-4ee0-af74-77b3cad503cf"); -pub const MESHLET_CULLING_SHADER_HANDLE: Handle = - weak_handle!("d71c5879-97fa-49d1-943e-ed9162fe8adb"); -pub const MESHLET_VISIBILITY_BUFFER_SOFTWARE_RASTER_SHADER_HANDLE: Handle = - weak_handle!("68cc6826-8321-43d1-93d5-4f61f0456c13"); -pub const MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE: Handle = - weak_handle!("4b4e3020-748f-4baf-b011-87d9d2a12796"); -pub const MESHLET_RESOLVE_RENDER_TARGETS_SHADER_HANDLE: Handle = - weak_handle!("c218ce17-cf59-4268-8898-13ecf384f133"); -pub const MESHLET_REMAP_1D_TO_2D_DISPATCH_SHADER_HANDLE: Handle = - weak_handle!("f5b7edfc-2eac-4407-8f5c-1265d4d795c2"); - #[derive(Resource)] pub struct MeshletPipelines { - fill_cluster_buffers: CachedComputePipelineId, clear_visibility_buffer: CachedComputePipelineId, clear_visibility_buffer_shadow_view: CachedComputePipelineId, - cull_first: CachedComputePipelineId, - cull_second: CachedComputePipelineId, + first_instance_cull: CachedComputePipelineId, + second_instance_cull: CachedComputePipelineId, + first_bvh_cull: CachedComputePipelineId, + second_bvh_cull: CachedComputePipelineId, + first_meshlet_cull: CachedComputePipelineId, + second_meshlet_cull: CachedComputePipelineId, downsample_depth_first: CachedComputePipelineId, downsample_depth_second: CachedComputePipelineId, downsample_depth_first_shadow_view: CachedComputePipelineId, @@ -45,21 +33,35 @@ pub struct MeshletPipelines { resolve_depth_shadow_view: CachedRenderPipelineId, resolve_material_depth: CachedRenderPipelineId, remap_1d_to_2d_dispatch: Option, + fill_counts: CachedComputePipelineId, + pub(crate) meshlet_mesh_material: Handle, } impl FromWorld for MeshletPipelines { fn from_world(world: &mut World) -> Self { let resource_manager = world.resource::(); - let fill_cluster_buffers_bind_group_layout = resource_manager - .fill_cluster_buffers_bind_group_layout - .clone(); let clear_visibility_buffer_bind_group_layout = resource_manager .clear_visibility_buffer_bind_group_layout .clone(); let clear_visibility_buffer_shadow_view_bind_group_layout = resource_manager .clear_visibility_buffer_shadow_view_bind_group_layout .clone(); - let cull_layout = resource_manager.culling_bind_group_layout.clone(); + let first_instance_cull_bind_group_layout = resource_manager + .first_instance_cull_bind_group_layout + .clone(); + let second_instance_cull_bind_group_layout = resource_manager + .second_instance_cull_bind_group_layout + .clone(); + let first_bvh_cull_bind_group_layout = + resource_manager.first_bvh_cull_bind_group_layout.clone(); + let second_bvh_cull_bind_group_layout = + resource_manager.second_bvh_cull_bind_group_layout.clone(); + let first_meshlet_cull_bind_group_layout = resource_manager + .first_meshlet_cull_bind_group_layout + .clone(); + let second_meshlet_cull_bind_group_layout = resource_manager + .second_meshlet_cull_bind_group_layout + .clone(); let downsample_depth_layout = resource_manager.downsample_depth_bind_group_layout.clone(); let downsample_depth_shadow_view_layout = resource_manager .downsample_depth_shadow_view_bind_group_layout @@ -82,24 +84,24 @@ impl FromWorld for MeshletPipelines { .clone(); let vertex_state = world.resource::().to_vertex_state(); + let fill_counts_layout = resource_manager.fill_counts_bind_group_layout.clone(); + + let clear_visibility_buffer = load_embedded_asset!(world, "clear_visibility_buffer.wgsl"); + let cull_instances = load_embedded_asset!(world, "cull_instances.wgsl"); + let cull_bvh = load_embedded_asset!(world, "cull_bvh.wgsl"); + let cull_clusters = load_embedded_asset!(world, "cull_clusters.wgsl"); + let visibility_buffer_software_raster = + load_embedded_asset!(world, "visibility_buffer_software_raster.wgsl"); + let visibility_buffer_hardware_raster = + load_embedded_asset!(world, "visibility_buffer_hardware_raster.wgsl"); + let resolve_render_targets = load_embedded_asset!(world, "resolve_render_targets.wgsl"); + let remap_1d_to_2d_dispatch = load_embedded_asset!(world, "remap_1d_to_2d_dispatch.wgsl"); + let fill_counts = load_embedded_asset!(world, "fill_counts.wgsl"); + let meshlet_mesh_material = load_embedded_asset!(world, "meshlet_mesh_material.wgsl"); + let pipeline_cache = world.resource_mut::(); Self { - fill_cluster_buffers: pipeline_cache.queue_compute_pipeline( - ComputePipelineDescriptor { - label: Some("meshlet_fill_cluster_buffers_pipeline".into()), - layout: vec![fill_cluster_buffers_bind_group_layout], - push_constant_ranges: vec![PushConstantRange { - stages: ShaderStages::COMPUTE, - range: 0..4, - }], - shader: MESHLET_FILL_CLUSTER_BUFFERS_SHADER_HANDLE, - shader_defs: vec!["MESHLET_FILL_CLUSTER_BUFFERS_PASS".into()], - entry_point: "fill_cluster_buffers".into(), - zero_initialize_workgroup_memory: false, - }, - ), - clear_visibility_buffer: pipeline_cache.queue_compute_pipeline( ComputePipelineDescriptor { label: Some("meshlet_clear_visibility_buffer_pipeline".into()), @@ -108,7 +110,7 @@ impl FromWorld for MeshletPipelines { stages: ShaderStages::COMPUTE, range: 0..8, }], - shader: MESHLET_CLEAR_VISIBILITY_BUFFER_SHADER_HANDLE, + shader: clear_visibility_buffer.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()], entry_point: "clear_visibility_buffer".into(), zero_initialize_workgroup_memory: false, @@ -123,39 +125,105 @@ impl FromWorld for MeshletPipelines { stages: ShaderStages::COMPUTE, range: 0..8, }], - shader: MESHLET_CLEAR_VISIBILITY_BUFFER_SHADER_HANDLE, + shader: clear_visibility_buffer, shader_defs: vec![], entry_point: "clear_visibility_buffer".into(), zero_initialize_workgroup_memory: false, }, ), - cull_first: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { - label: Some("meshlet_culling_first_pipeline".into()), - layout: vec![cull_layout.clone()], + first_instance_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { + label: Some("meshlet_first_instance_cull_pipeline".into()), + layout: vec![first_instance_cull_bind_group_layout.clone()], + push_constant_ranges: vec![PushConstantRange { + stages: ShaderStages::COMPUTE, + range: 0..4, + }], + shader: cull_instances.clone(), + shader_defs: vec![ + "MESHLET_INSTANCE_CULLING_PASS".into(), + "MESHLET_FIRST_CULLING_PASS".into(), + ], + entry_point: "cull_instances".into(), + zero_initialize_workgroup_memory: false, + }), + + second_instance_cull: pipeline_cache.queue_compute_pipeline( + ComputePipelineDescriptor { + label: Some("meshlet_second_instance_cull_pipeline".into()), + layout: vec![second_instance_cull_bind_group_layout.clone()], + push_constant_ranges: vec![PushConstantRange { + stages: ShaderStages::COMPUTE, + range: 0..4, + }], + shader: cull_instances, + shader_defs: vec![ + "MESHLET_INSTANCE_CULLING_PASS".into(), + "MESHLET_SECOND_CULLING_PASS".into(), + ], + entry_point: "cull_instances".into(), + zero_initialize_workgroup_memory: false, + }, + ), + + first_bvh_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { + label: Some("meshlet_first_bvh_cull_pipeline".into()), + layout: vec![first_bvh_cull_bind_group_layout.clone()], push_constant_ranges: vec![PushConstantRange { stages: ShaderStages::COMPUTE, range: 0..8, }], - shader: MESHLET_CULLING_SHADER_HANDLE, + shader: cull_bvh.clone(), shader_defs: vec![ - "MESHLET_CULLING_PASS".into(), + "MESHLET_BVH_CULLING_PASS".into(), + "MESHLET_FIRST_CULLING_PASS".into(), + ], + entry_point: "cull_bvh".into(), + zero_initialize_workgroup_memory: false, + }), + + second_bvh_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { + label: Some("meshlet_second_bvh_cull_pipeline".into()), + layout: vec![second_bvh_cull_bind_group_layout.clone()], + push_constant_ranges: vec![PushConstantRange { + stages: ShaderStages::COMPUTE, + range: 0..8, + }], + shader: cull_bvh, + shader_defs: vec![ + "MESHLET_BVH_CULLING_PASS".into(), + "MESHLET_SECOND_CULLING_PASS".into(), + ], + entry_point: "cull_bvh".into(), + zero_initialize_workgroup_memory: false, + }), + + first_meshlet_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { + label: Some("meshlet_first_meshlet_cull_pipeline".into()), + layout: vec![first_meshlet_cull_bind_group_layout.clone()], + push_constant_ranges: vec![PushConstantRange { + stages: ShaderStages::COMPUTE, + range: 0..4, + }], + shader: cull_clusters.clone(), + shader_defs: vec![ + "MESHLET_CLUSTER_CULLING_PASS".into(), "MESHLET_FIRST_CULLING_PASS".into(), ], entry_point: "cull_clusters".into(), zero_initialize_workgroup_memory: false, }), - cull_second: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { - label: Some("meshlet_culling_second_pipeline".into()), - layout: vec![cull_layout], + second_meshlet_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { + label: Some("meshlet_second_meshlet_cull_pipeline".into()), + layout: vec![second_meshlet_cull_bind_group_layout.clone()], push_constant_ranges: vec![PushConstantRange { stages: ShaderStages::COMPUTE, - range: 0..8, + range: 0..4, }], - shader: MESHLET_CULLING_SHADER_HANDLE, + shader: cull_clusters, shader_defs: vec![ - "MESHLET_CULLING_PASS".into(), + "MESHLET_CLUSTER_CULLING_PASS".into(), "MESHLET_SECOND_CULLING_PASS".into(), ], entry_point: "cull_clusters".into(), @@ -233,7 +301,7 @@ impl FromWorld for MeshletPipelines { label: Some("meshlet_visibility_buffer_software_raster_pipeline".into()), layout: vec![visibility_buffer_raster_layout.clone()], push_constant_ranges: vec![], - shader: MESHLET_VISIBILITY_BUFFER_SOFTWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_software_raster.clone(), shader_defs: vec![ "MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(), "MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(), @@ -256,7 +324,7 @@ impl FromWorld for MeshletPipelines { ), layout: vec![visibility_buffer_raster_shadow_view_layout.clone()], push_constant_ranges: vec![], - shader: MESHLET_VISIBILITY_BUFFER_SOFTWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_software_raster, shader_defs: vec![ "MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(), if remap_1d_to_2d_dispatch_layout.is_some() { @@ -280,7 +348,7 @@ impl FromWorld for MeshletPipelines { range: 0..4, }], vertex: VertexState { - shader: MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec![ "MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(), "MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(), @@ -300,7 +368,7 @@ impl FromWorld for MeshletPipelines { depth_stencil: None, multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec![ "MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(), "MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(), @@ -327,7 +395,7 @@ impl FromWorld for MeshletPipelines { range: 0..4, }], vertex: VertexState { - shader: MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], entry_point: "vertex".into(), buffers: vec![], @@ -344,7 +412,7 @@ impl FromWorld for MeshletPipelines { depth_stencil: None, multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { @@ -369,7 +437,7 @@ impl FromWorld for MeshletPipelines { range: 0..4, }], vertex: VertexState { - shader: MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], entry_point: "vertex".into(), buffers: vec![], @@ -386,7 +454,7 @@ impl FromWorld for MeshletPipelines { depth_stencil: None, multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: MESHLET_VISIBILITY_BUFFER_HARDWARE_RASTER_SHADER_HANDLE, + shader: visibility_buffer_hardware_raster, shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { @@ -413,7 +481,7 @@ impl FromWorld for MeshletPipelines { }), multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: MESHLET_RESOLVE_RENDER_TARGETS_SHADER_HANDLE, + shader: resolve_render_targets.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()], entry_point: "resolve_depth".into(), targets: vec![], @@ -437,7 +505,7 @@ impl FromWorld for MeshletPipelines { }), multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: MESHLET_RESOLVE_RENDER_TARGETS_SHADER_HANDLE, + shader: resolve_render_targets.clone(), shader_defs: vec![], entry_point: "resolve_depth".into(), targets: vec![], @@ -462,7 +530,7 @@ impl FromWorld for MeshletPipelines { }), multisample: MultisampleState::default(), fragment: Some(FragmentState { - shader: MESHLET_RESOLVE_RENDER_TARGETS_SHADER_HANDLE, + shader: resolve_render_targets, shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()], entry_point: "resolve_material_depth".into(), targets: vec![], @@ -471,6 +539,21 @@ impl FromWorld for MeshletPipelines { }, ), + fill_counts: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { + label: Some("meshlet_fill_counts_pipeline".into()), + layout: vec![fill_counts_layout], + push_constant_ranges: vec![], + shader: fill_counts, + shader_defs: vec![if remap_1d_to_2d_dispatch_layout.is_some() { + "MESHLET_2D_DISPATCH" + } else { + "" + } + .into()], + entry_point: "fill_counts".into(), + zero_initialize_workgroup_memory: false, + }), + remap_1d_to_2d_dispatch: remap_1d_to_2d_dispatch_layout.map(|layout| { pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { label: Some("meshlet_remap_1d_to_2d_dispatch_pipeline".into()), @@ -479,12 +562,14 @@ impl FromWorld for MeshletPipelines { stages: ShaderStages::COMPUTE, range: 0..4, }], - shader: MESHLET_REMAP_1D_TO_2D_DISPATCH_SHADER_HANDLE, + shader: remap_1d_to_2d_dispatch, shader_defs: vec![], entry_point: "remap_dispatch".into(), zero_initialize_workgroup_memory: false, }) }), + + meshlet_mesh_material, } } } @@ -504,6 +589,9 @@ impl MeshletPipelines { &ComputePipeline, &ComputePipeline, &ComputePipeline, + &ComputePipeline, + &ComputePipeline, + &ComputePipeline, &RenderPipeline, &RenderPipeline, &RenderPipeline, @@ -511,15 +599,19 @@ impl MeshletPipelines { &RenderPipeline, &RenderPipeline, Option<&ComputePipeline>, + &ComputePipeline, )> { let pipeline_cache = world.get_resource::()?; let pipeline = world.get_resource::()?; Some(( - pipeline_cache.get_compute_pipeline(pipeline.fill_cluster_buffers)?, pipeline_cache.get_compute_pipeline(pipeline.clear_visibility_buffer)?, pipeline_cache.get_compute_pipeline(pipeline.clear_visibility_buffer_shadow_view)?, - pipeline_cache.get_compute_pipeline(pipeline.cull_first)?, - pipeline_cache.get_compute_pipeline(pipeline.cull_second)?, + pipeline_cache.get_compute_pipeline(pipeline.first_instance_cull)?, + pipeline_cache.get_compute_pipeline(pipeline.second_instance_cull)?, + pipeline_cache.get_compute_pipeline(pipeline.first_bvh_cull)?, + pipeline_cache.get_compute_pipeline(pipeline.second_bvh_cull)?, + pipeline_cache.get_compute_pipeline(pipeline.first_meshlet_cull)?, + pipeline_cache.get_compute_pipeline(pipeline.second_meshlet_cull)?, pipeline_cache.get_compute_pipeline(pipeline.downsample_depth_first)?, pipeline_cache.get_compute_pipeline(pipeline.downsample_depth_second)?, pipeline_cache.get_compute_pipeline(pipeline.downsample_depth_first_shadow_view)?, @@ -540,6 +632,7 @@ impl MeshletPipelines { Some(id) => Some(pipeline_cache.get_compute_pipeline(id)?), None => None, }, + pipeline_cache.get_compute_pipeline(pipeline.fill_counts)?, )) } } diff --git a/crates/bevy_pbr/src/meshlet/remap_1d_to_2d_dispatch.wgsl b/crates/bevy_pbr/src/meshlet/remap_1d_to_2d_dispatch.wgsl index fc98443634..b9970c42b4 100644 --- a/crates/bevy_pbr/src/meshlet/remap_1d_to_2d_dispatch.wgsl +++ b/crates/bevy_pbr/src/meshlet/remap_1d_to_2d_dispatch.wgsl @@ -13,11 +13,12 @@ var max_compute_workgroups_per_dimension: u32; @compute @workgroup_size(1, 1, 1) fn remap_dispatch() { - meshlet_software_raster_cluster_count = meshlet_software_raster_indirect_args.x; + let cluster_count = meshlet_software_raster_indirect_args.x; - if meshlet_software_raster_cluster_count > max_compute_workgroups_per_dimension { - let n = u32(ceil(sqrt(f32(meshlet_software_raster_cluster_count)))); + if cluster_count > max_compute_workgroups_per_dimension { + let n = u32(ceil(sqrt(f32(cluster_count)))); meshlet_software_raster_indirect_args.x = n; meshlet_software_raster_indirect_args.y = n; + meshlet_software_raster_cluster_count = cluster_count; } } diff --git a/crates/bevy_pbr/src/meshlet/resolve_render_targets.wgsl b/crates/bevy_pbr/src/meshlet/resolve_render_targets.wgsl index eaa4eed6c4..6fef0cc227 100644 --- a/crates/bevy_pbr/src/meshlet/resolve_render_targets.wgsl +++ b/crates/bevy_pbr/src/meshlet/resolve_render_targets.wgsl @@ -1,11 +1,12 @@ #import bevy_core_pipeline::fullscreen_vertex_shader::FullscreenVertexOutput +#import bevy_pbr::meshlet_bindings::InstancedOffset #ifdef MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT @group(0) @binding(0) var meshlet_visibility_buffer: texture_storage_2d; #else @group(0) @binding(0) var meshlet_visibility_buffer: texture_storage_2d; #endif -@group(0) @binding(1) var meshlet_cluster_instance_ids: array; // Per cluster +@group(0) @binding(1) var meshlet_raster_clusters: array; // Per cluster @group(0) @binding(2) var meshlet_instance_material_ids: array; // Per entity instance /// This pass writes out the depth texture. @@ -33,7 +34,7 @@ fn resolve_material_depth(in: FullscreenVertexOutput) -> @builtin(frag_depth) f3 if depth == 0lu { discard; } let cluster_id = u32(visibility) >> 7u; - let instance_id = meshlet_cluster_instance_ids[cluster_id]; + let instance_id = meshlet_raster_clusters[cluster_id].instance_id; let material_id = meshlet_instance_material_ids[instance_id]; return f32(material_id) / 65535.0; } diff --git a/crates/bevy_pbr/src/meshlet/resource_manager.rs b/crates/bevy_pbr/src/meshlet/resource_manager.rs index d33752d426..dacab4afc4 100644 --- a/crates/bevy_pbr/src/meshlet/resource_manager.rs +++ b/crates/bevy_pbr/src/meshlet/resource_manager.rs @@ -1,6 +1,5 @@ use super::{instance_manager::InstanceManager, meshlet_mesh_manager::MeshletMeshManager}; use crate::ShadowView; -use alloc::sync::Arc; use bevy_core_pipeline::{ core_3d::Camera3d, experimental::mip_generation::{self, ViewDepthPyramid}, @@ -13,6 +12,7 @@ use bevy_ecs::{ resource::Resource, system::{Commands, Query, Res, ResMut}, }; +use bevy_image::ToExtents; use bevy_math::{UVec2, Vec4Swizzles}; use bevy_render::{ render_resource::*, @@ -21,25 +21,26 @@ use bevy_render::{ view::{ExtractedView, RenderLayers, ViewUniform, ViewUniforms}, }; use binding_types::*; -use core::{iter, sync::atomic::AtomicBool}; -use encase::internal::WriteInto; +use core::iter; /// Manages per-view and per-cluster GPU resources for [`super::MeshletPlugin`]. #[derive(Resource)] pub struct ResourceManager { /// Intermediate buffer of cluster IDs for use with rasterizing the visibility buffer visibility_buffer_raster_clusters: Buffer, + /// Intermediate buffer of previous counts of clusters in rasterizer buckets + pub visibility_buffer_raster_cluster_prev_counts: Buffer, /// Intermediate buffer of count of clusters to software rasterize software_raster_cluster_count: Buffer, - /// Rightmost slot index of [`Self::visibility_buffer_raster_clusters`] - raster_cluster_rightmost_slot: u32, + /// BVH traversal queues + bvh_traversal_queues: [Buffer; 2], + /// Cluster cull candidate queue + cluster_cull_candidate_queue: Buffer, + /// Rightmost slot index of [`Self::visibility_buffer_raster_clusters`], [`Self::bvh_traversal_queues`], and [`Self::cluster_cull_candidate_queue`] + cull_queue_rightmost_slot: u32, - /// Per-cluster instance ID - cluster_instance_ids: Option, - /// Per-cluster meshlet ID - cluster_meshlet_ids: Option, - /// Per-cluster bitmask of whether or not it's a candidate for the second raster pass - second_pass_candidates_buffer: Option, + /// Second pass instance candidates + second_pass_candidates: Option, /// Sampler for a depth pyramid depth_pyramid_sampler: Sampler, /// Dummy texture view for binding depth pyramids with less than the maximum amount of mips @@ -49,10 +50,14 @@ pub struct ResourceManager { previous_depth_pyramids: EntityHashMap, // Bind group layouts - pub fill_cluster_buffers_bind_group_layout: BindGroupLayout, pub clear_visibility_buffer_bind_group_layout: BindGroupLayout, pub clear_visibility_buffer_shadow_view_bind_group_layout: BindGroupLayout, - pub culling_bind_group_layout: BindGroupLayout, + pub first_instance_cull_bind_group_layout: BindGroupLayout, + pub second_instance_cull_bind_group_layout: BindGroupLayout, + pub first_bvh_cull_bind_group_layout: BindGroupLayout, + pub second_bvh_cull_bind_group_layout: BindGroupLayout, + pub first_meshlet_cull_bind_group_layout: BindGroupLayout, + pub second_meshlet_cull_bind_group_layout: BindGroupLayout, pub visibility_buffer_raster_bind_group_layout: BindGroupLayout, pub visibility_buffer_raster_shadow_view_bind_group_layout: BindGroupLayout, pub downsample_depth_bind_group_layout: BindGroupLayout, @@ -61,6 +66,7 @@ pub struct ResourceManager { pub resolve_depth_shadow_view_bind_group_layout: BindGroupLayout, pub resolve_material_depth_bind_group_layout: BindGroupLayout, pub material_shade_bind_group_layout: BindGroupLayout, + pub fill_counts_bind_group_layout: BindGroupLayout, pub remap_1d_to_2d_dispatch_bind_group_layout: Option, } @@ -68,25 +74,53 @@ impl ResourceManager { pub fn new(cluster_buffer_slots: u32, render_device: &RenderDevice) -> Self { let needs_dispatch_remap = cluster_buffer_slots > render_device.limits().max_compute_workgroups_per_dimension; + // The IDs are a (u32, u32) of instance and index. + let cull_queue_size = 2 * cluster_buffer_slots as u64 * size_of::() as u64; Self { visibility_buffer_raster_clusters: render_device.create_buffer(&BufferDescriptor { label: Some("meshlet_visibility_buffer_raster_clusters"), - size: cluster_buffer_slots as u64 * size_of::() as u64, + size: cull_queue_size, usage: BufferUsages::STORAGE, mapped_at_creation: false, }), + visibility_buffer_raster_cluster_prev_counts: render_device.create_buffer( + &BufferDescriptor { + label: Some("meshlet_visibility_buffer_raster_cluster_prev_counts"), + size: size_of::() as u64 * 2, + usage: BufferUsages::STORAGE | BufferUsages::COPY_DST, + mapped_at_creation: false, + }, + ), software_raster_cluster_count: render_device.create_buffer(&BufferDescriptor { label: Some("meshlet_software_raster_cluster_count"), size: size_of::() as u64, usage: BufferUsages::STORAGE, mapped_at_creation: false, }), - raster_cluster_rightmost_slot: cluster_buffer_slots - 1, + bvh_traversal_queues: [ + render_device.create_buffer(&BufferDescriptor { + label: Some("meshlet_bvh_traversal_queue_0"), + size: cull_queue_size, + usage: BufferUsages::STORAGE, + mapped_at_creation: false, + }), + render_device.create_buffer(&BufferDescriptor { + label: Some("meshlet_bvh_traversal_queue_1"), + size: cull_queue_size, + usage: BufferUsages::STORAGE, + mapped_at_creation: false, + }), + ], + cluster_cull_candidate_queue: render_device.create_buffer(&BufferDescriptor { + label: Some("meshlet_cluster_cull_candidate_queue"), + size: cull_queue_size, + usage: BufferUsages::STORAGE, + mapped_at_creation: false, + }), + cull_queue_rightmost_slot: cluster_buffer_slots - 1, - cluster_instance_ids: None, - cluster_meshlet_ids: None, - second_pass_candidates_buffer: None, + second_pass_candidates: None, depth_pyramid_sampler: render_device.create_sampler(&SamplerDescriptor { label: Some("meshlet_depth_pyramid_sampler"), ..SamplerDescriptor::default() @@ -100,19 +134,6 @@ impl ResourceManager { previous_depth_pyramids: EntityHashMap::default(), // TODO: Buffer min sizes - fill_cluster_buffers_bind_group_layout: render_device.create_bind_group_layout( - "meshlet_fill_cluster_buffers_bind_group_layout", - &BindGroupLayoutEntries::sequential( - ShaderStages::COMPUTE, - ( - storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), - storage_buffer_sized(false, None), - storage_buffer_sized(false, None), - storage_buffer_sized(false, None), - ), - ), - ), clear_visibility_buffer_bind_group_layout: render_device.create_bind_group_layout( "meshlet_clear_visibility_buffer_bind_group_layout", &BindGroupLayoutEntries::single( @@ -128,24 +149,131 @@ impl ResourceManager { texture_storage_2d(TextureFormat::R32Uint, StorageTextureAccess::WriteOnly), ), ), - culling_bind_group_layout: render_device.create_bind_group_layout( - "meshlet_culling_bind_group_layout", + first_instance_cull_bind_group_layout: render_device.create_bind_group_layout( + "meshlet_first_instance_culling_bind_group_layout", &BindGroupLayoutEntries::sequential( ShaderStages::COMPUTE, ( - storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), - storage_buffer_sized(false, None), - storage_buffer_sized(false, None), - storage_buffer_sized(false, None), - storage_buffer_sized(false, None), texture_2d(TextureSampleType::Float { filterable: false }), uniform_buffer::(true), uniform_buffer::(true), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + ), + ), + ), + second_instance_cull_bind_group_layout: render_device.create_bind_group_layout( + "meshlet_second_instance_culling_bind_group_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::COMPUTE, + ( + texture_2d(TextureSampleType::Float { filterable: false }), + uniform_buffer::(true), + uniform_buffer::(true), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + ), + ), + ), + first_bvh_cull_bind_group_layout: render_device.create_bind_group_layout( + "meshlet_first_bvh_culling_bind_group_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::COMPUTE, + ( + texture_2d(TextureSampleType::Float { filterable: false }), + uniform_buffer::(true), + uniform_buffer::(true), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + ), + ), + ), + second_bvh_cull_bind_group_layout: render_device.create_bind_group_layout( + "meshlet_second_bvh_culling_bind_group_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::COMPUTE, + ( + texture_2d(TextureSampleType::Float { filterable: false }), + uniform_buffer::(true), + uniform_buffer::(true), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + ), + ), + ), + first_meshlet_cull_bind_group_layout: render_device.create_bind_group_layout( + "meshlet_first_meshlet_culling_bind_group_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::COMPUTE, + ( + texture_2d(TextureSampleType::Float { filterable: false }), + uniform_buffer::(true), + uniform_buffer::(true), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + ), + ), + ), + second_meshlet_cull_bind_group_layout: render_device.create_bind_group_layout( + "meshlet_second_meshlet_culling_bind_group_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::COMPUTE, + ( + texture_2d(TextureSampleType::Float { filterable: false }), + uniform_buffer::(true), + uniform_buffer::(true), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), ), ), ), @@ -215,7 +343,6 @@ impl ResourceManager { storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), texture_storage_2d(TextureFormat::R64Uint, StorageTextureAccess::Atomic), uniform_buffer::(true), ), @@ -234,7 +361,6 @@ impl ResourceManager { storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), texture_storage_2d( TextureFormat::R32Uint, StorageTextureAccess::Atomic, @@ -281,10 +407,35 @@ impl ResourceManager { storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), - storage_buffer_read_only_sized(false, None), ), ), ), + fill_counts_bind_group_layout: if needs_dispatch_remap { + render_device.create_bind_group_layout( + "meshlet_fill_counts_bind_group_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::COMPUTE, + ( + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + ), + ), + ) + } else { + render_device.create_bind_group_layout( + "meshlet_fill_counts_bind_group_layout", + &BindGroupLayoutEntries::sequential( + ShaderStages::COMPUTE, + ( + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + storage_buffer_sized(false, None), + ), + ), + ) + }, remap_1d_to_2d_dispatch_bind_group_layout: needs_dispatch_remap.then(|| { render_device.create_bind_group_layout( "meshlet_remap_1d_to_2d_dispatch_bind_group_layout", @@ -306,57 +457,56 @@ impl ResourceManager { #[derive(Component)] pub struct MeshletViewResources { pub scene_instance_count: u32, - pub scene_cluster_count: u32, - pub second_pass_candidates_buffer: Buffer, + pub rightmost_slot: u32, + pub max_bvh_depth: u32, instance_visibility: Buffer, pub dummy_render_target: CachedTexture, pub visibility_buffer: CachedTexture, - pub visibility_buffer_software_raster_indirect_args_first: Buffer, - pub visibility_buffer_software_raster_indirect_args_second: Buffer, - pub visibility_buffer_hardware_raster_indirect_args_first: Buffer, - pub visibility_buffer_hardware_raster_indirect_args_second: Buffer, + pub second_pass_count: Buffer, + pub second_pass_dispatch: Buffer, + pub second_pass_candidates: Buffer, + pub first_bvh_cull_count_front: Buffer, + pub first_bvh_cull_dispatch_front: Buffer, + pub first_bvh_cull_count_back: Buffer, + pub first_bvh_cull_dispatch_back: Buffer, + pub first_bvh_cull_queue: Buffer, + pub second_bvh_cull_count_front: Buffer, + pub second_bvh_cull_dispatch_front: Buffer, + pub second_bvh_cull_count_back: Buffer, + pub second_bvh_cull_dispatch_back: Buffer, + pub second_bvh_cull_queue: Buffer, + pub front_meshlet_cull_count: Buffer, + pub front_meshlet_cull_dispatch: Buffer, + pub back_meshlet_cull_count: Buffer, + pub back_meshlet_cull_dispatch: Buffer, + pub meshlet_cull_queue: Buffer, + pub visibility_buffer_software_raster_indirect_args: Buffer, + pub visibility_buffer_hardware_raster_indirect_args: Buffer, pub depth_pyramid: ViewDepthPyramid, previous_depth_pyramid: TextureView, pub material_depth: Option, pub view_size: UVec2, - pub raster_cluster_rightmost_slot: u32, not_shadow_view: bool, } #[derive(Component)] pub struct MeshletViewBindGroups { - pub first_node: Arc, - pub fill_cluster_buffers: BindGroup, pub clear_visibility_buffer: BindGroup, - pub culling_first: BindGroup, - pub culling_second: BindGroup, + pub first_instance_cull: BindGroup, + pub second_instance_cull: BindGroup, + pub first_bvh_cull_ping: BindGroup, + pub first_bvh_cull_pong: BindGroup, + pub second_bvh_cull_ping: BindGroup, + pub second_bvh_cull_pong: BindGroup, + pub first_meshlet_cull: BindGroup, + pub second_meshlet_cull: BindGroup, pub downsample_depth: BindGroup, pub visibility_buffer_raster: BindGroup, pub resolve_depth: BindGroup, pub resolve_material_depth: Option, pub material_shade: Option, - pub remap_1d_to_2d_dispatch: Option<(BindGroup, BindGroup)>, -} - -// TODO: Try using Queue::write_buffer_with() in queue_meshlet_mesh_upload() to reduce copies -fn upload_storage_buffer( - buffer: &mut StorageBuffer>, - render_device: &RenderDevice, - render_queue: &RenderQueue, -) where - Vec: WriteInto, -{ - let inner = buffer.buffer(); - let capacity = inner.map_or(0, |b| b.size()); - let size = buffer.get().size().get() as BufferAddress; - - if capacity >= size { - let inner = inner.unwrap(); - let bytes = bytemuck::must_cast_slice(buffer.get().as_slice()); - render_queue.write_buffer(inner, 0, bytes); - } else { - buffer.write_buffer(render_device, render_queue); - } + pub remap_1d_to_2d_dispatch: Option, + pub fill_counts: BindGroup, } // TODO: Cache things per-view and skip running this system / optimize this system @@ -374,7 +524,7 @@ pub fn prepare_meshlet_per_frame_resources( render_device: Res, mut commands: Commands, ) { - if instance_manager.scene_cluster_count == 0 { + if instance_manager.scene_instance_count == 0 { return; } @@ -384,41 +534,22 @@ pub fn prepare_meshlet_per_frame_resources( instance_manager .instance_uniforms .write_buffer(&render_device, &render_queue); - upload_storage_buffer( - &mut instance_manager.instance_material_ids, - &render_device, - &render_queue, - ); - upload_storage_buffer( - &mut instance_manager.instance_meshlet_counts, - &render_device, - &render_queue, - ); - upload_storage_buffer( - &mut instance_manager.instance_meshlet_slice_starts, - &render_device, - &render_queue, - ); + instance_manager + .instance_aabbs + .write_buffer(&render_device, &render_queue); + instance_manager + .instance_material_ids + .write_buffer(&render_device, &render_queue); + instance_manager + .instance_bvh_root_nodes + .write_buffer(&render_device, &render_queue); - let needed_buffer_size = 4 * instance_manager.scene_cluster_count as u64; - match &mut resource_manager.cluster_instance_ids { + let needed_buffer_size = 4 * instance_manager.scene_instance_count as u64; + let second_pass_candidates = match &mut resource_manager.second_pass_candidates { Some(buffer) if buffer.size() >= needed_buffer_size => buffer.clone(), slot => { let buffer = render_device.create_buffer(&BufferDescriptor { - label: Some("meshlet_cluster_instance_ids"), - size: needed_buffer_size, - usage: BufferUsages::STORAGE, - mapped_at_creation: false, - }); - *slot = Some(buffer.clone()); - buffer - } - }; - match &mut resource_manager.cluster_meshlet_ids { - Some(buffer) if buffer.size() >= needed_buffer_size => buffer.clone(), - slot => { - let buffer = render_device.create_buffer(&BufferDescriptor { - label: Some("meshlet_cluster_meshlet_ids"), + label: Some("meshlet_second_pass_candidates"), size: needed_buffer_size, usage: BufferUsages::STORAGE, mapped_at_creation: false, @@ -428,8 +559,6 @@ pub fn prepare_meshlet_per_frame_resources( } }; - let needed_buffer_size = - instance_manager.scene_cluster_count.div_ceil(u32::BITS) as u64 * size_of::() as u64; for (view_entity, view, render_layers, (_, shadow_view)) in &views { let not_shadow_view = shadow_view.is_none(); @@ -460,34 +589,15 @@ pub fn prepare_meshlet_per_frame_resources( vec[index] |= 1 << bit; } } - upload_storage_buffer(instance_visibility, &render_device, &render_queue); + instance_visibility.write_buffer(&render_device, &render_queue); let instance_visibility = instance_visibility.buffer().unwrap().clone(); - let second_pass_candidates_buffer = - match &mut resource_manager.second_pass_candidates_buffer { - Some(buffer) if buffer.size() >= needed_buffer_size => buffer.clone(), - slot => { - let buffer = render_device.create_buffer(&BufferDescriptor { - label: Some("meshlet_second_pass_candidates"), - size: needed_buffer_size, - usage: BufferUsages::STORAGE | BufferUsages::COPY_DST, - mapped_at_creation: false, - }); - *slot = Some(buffer.clone()); - buffer - } - }; - // TODO: Remove this once wgpu allows render passes with no attachments let dummy_render_target = texture_cache.get( &render_device, TextureDescriptor { label: Some("meshlet_dummy_render_target"), - size: Extent3d { - width: view.viewport.z, - height: view.viewport.w, - depth_or_array_layers: 1, - }, + size: view.viewport.zw().to_extents(), mip_level_count: 1, sample_count: 1, dimension: TextureDimension::D2, @@ -501,11 +611,7 @@ pub fn prepare_meshlet_per_frame_resources( &render_device, TextureDescriptor { label: Some("meshlet_visibility_buffer"), - size: Extent3d { - width: view.viewport.z, - height: view.viewport.w, - depth_or_array_layers: 1, - }, + size: view.viewport.zw().to_extents(), mip_level_count: 1, sample_count: 1, dimension: TextureDimension::D2, @@ -519,34 +625,102 @@ pub fn prepare_meshlet_per_frame_resources( }, ); - let visibility_buffer_software_raster_indirect_args_first = render_device - .create_buffer_with_data(&BufferInitDescriptor { - label: Some("meshlet_visibility_buffer_software_raster_indirect_args_first"), + let second_pass_count = render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_second_pass_count"), + contents: bytemuck::bytes_of(&0u32), + usage: BufferUsages::STORAGE, + }); + let second_pass_dispatch = render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_second_pass_dispatch"), + contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), + usage: BufferUsages::STORAGE | BufferUsages::INDIRECT, + }); + + let first_bvh_cull_count_front = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_first_bvh_cull_count_front"), + contents: bytemuck::bytes_of(&0u32), + usage: BufferUsages::STORAGE | BufferUsages::COPY_DST, + }); + let first_bvh_cull_dispatch_front = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_first_bvh_cull_dispatch_front"), + contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), + usage: BufferUsages::STORAGE | BufferUsages::INDIRECT | BufferUsages::COPY_DST, + }); + let first_bvh_cull_count_back = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_first_bvh_cull_count_back"), + contents: bytemuck::bytes_of(&0u32), + usage: BufferUsages::STORAGE | BufferUsages::COPY_DST, + }); + let first_bvh_cull_dispatch_back = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_first_bvh_cull_dispatch_back"), + contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), + usage: BufferUsages::STORAGE | BufferUsages::INDIRECT | BufferUsages::COPY_DST, + }); + + let second_bvh_cull_count_front = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_second_bvh_cull_count_front"), + contents: bytemuck::bytes_of(&0u32), + usage: BufferUsages::STORAGE | BufferUsages::COPY_DST, + }); + let second_bvh_cull_dispatch_front = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_second_bvh_cull_dispatch_front"), + contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), + usage: BufferUsages::STORAGE | BufferUsages::INDIRECT | BufferUsages::COPY_DST, + }); + let second_bvh_cull_count_back = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_second_bvh_cull_count_back"), + contents: bytemuck::bytes_of(&0u32), + usage: BufferUsages::STORAGE | BufferUsages::COPY_DST, + }); + let second_bvh_cull_dispatch_back = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_second_bvh_cull_dispatch_back"), + contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), + usage: BufferUsages::STORAGE | BufferUsages::INDIRECT | BufferUsages::COPY_DST, + }); + + let front_meshlet_cull_count = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_front_meshlet_cull_count"), + contents: bytemuck::bytes_of(&0u32), + usage: BufferUsages::STORAGE, + }); + let front_meshlet_cull_dispatch = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_front_meshlet_cull_dispatch"), contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), usage: BufferUsages::STORAGE | BufferUsages::INDIRECT, }); - let visibility_buffer_software_raster_indirect_args_second = render_device - .create_buffer_with_data(&BufferInitDescriptor { - label: Some("visibility_buffer_software_raster_indirect_args_second"), + let back_meshlet_cull_count = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_back_meshlet_cull_count"), + contents: bytemuck::bytes_of(&0u32), + usage: BufferUsages::STORAGE, + }); + let back_meshlet_cull_dispatch = + render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("meshlet_back_meshlet_cull_dispatch"), contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), usage: BufferUsages::STORAGE | BufferUsages::INDIRECT, }); - let visibility_buffer_hardware_raster_indirect_args_first = render_device + let visibility_buffer_software_raster_indirect_args = render_device .create_buffer_with_data(&BufferInitDescriptor { - label: Some("meshlet_visibility_buffer_hardware_raster_indirect_args_first"), - contents: DrawIndirectArgs { - vertex_count: 128 * 3, - instance_count: 0, - first_vertex: 0, - first_instance: 0, - } - .as_bytes(), + label: Some("meshlet_visibility_buffer_software_raster_indirect_args"), + contents: DispatchIndirectArgs { x: 0, y: 1, z: 1 }.as_bytes(), usage: BufferUsages::STORAGE | BufferUsages::INDIRECT, }); - let visibility_buffer_hardware_raster_indirect_args_second = render_device + + let visibility_buffer_hardware_raster_indirect_args = render_device .create_buffer_with_data(&BufferInitDescriptor { - label: Some("visibility_buffer_hardware_raster_indirect_args_second"), + label: Some("meshlet_visibility_buffer_hardware_raster_indirect_args"), contents: DrawIndirectArgs { vertex_count: 128 * 3, instance_count: 0, @@ -577,11 +751,7 @@ pub fn prepare_meshlet_per_frame_resources( let material_depth = TextureDescriptor { label: Some("meshlet_material_depth"), - size: Extent3d { - width: view.viewport.z, - height: view.viewport.w, - depth_or_array_layers: 1, - }, + size: view.viewport.zw().to_extents(), mip_level_count: 1, sample_count: 1, dimension: TextureDimension::D2, @@ -592,21 +762,36 @@ pub fn prepare_meshlet_per_frame_resources( commands.entity(view_entity).insert(MeshletViewResources { scene_instance_count: instance_manager.scene_instance_count, - scene_cluster_count: instance_manager.scene_cluster_count, - second_pass_candidates_buffer, + rightmost_slot: resource_manager.cull_queue_rightmost_slot, + max_bvh_depth: instance_manager.max_bvh_depth, instance_visibility, dummy_render_target, visibility_buffer, - visibility_buffer_software_raster_indirect_args_first, - visibility_buffer_software_raster_indirect_args_second, - visibility_buffer_hardware_raster_indirect_args_first, - visibility_buffer_hardware_raster_indirect_args_second, + second_pass_count, + second_pass_dispatch, + second_pass_candidates: second_pass_candidates.clone(), + first_bvh_cull_count_front, + first_bvh_cull_dispatch_front, + first_bvh_cull_count_back, + first_bvh_cull_dispatch_back, + first_bvh_cull_queue: resource_manager.bvh_traversal_queues[0].clone(), + second_bvh_cull_count_front, + second_bvh_cull_dispatch_front, + second_bvh_cull_count_back, + second_bvh_cull_dispatch_back, + second_bvh_cull_queue: resource_manager.bvh_traversal_queues[1].clone(), + front_meshlet_cull_count, + front_meshlet_cull_dispatch, + back_meshlet_cull_count, + back_meshlet_cull_dispatch, + meshlet_cull_queue: resource_manager.cluster_cull_candidate_queue.clone(), + visibility_buffer_software_raster_indirect_args, + visibility_buffer_hardware_raster_indirect_args, depth_pyramid, previous_depth_pyramid, material_depth: not_shadow_view .then(|| texture_cache.get(&render_device, material_depth)), view_size: view.viewport.zw(), - raster_cluster_rightmost_slot: resource_manager.raster_cluster_rightmost_slot, not_shadow_view, }); } @@ -622,49 +807,15 @@ pub fn prepare_meshlet_view_bind_groups( render_device: Res, mut commands: Commands, ) { - let ( - Some(cluster_instance_ids), - Some(cluster_meshlet_ids), - Some(view_uniforms), - Some(previous_view_uniforms), - ) = ( - resource_manager.cluster_instance_ids.as_ref(), - resource_manager.cluster_meshlet_ids.as_ref(), + let (Some(view_uniforms), Some(previous_view_uniforms)) = ( view_uniforms.uniforms.binding(), previous_view_uniforms.uniforms.binding(), - ) - else { + ) else { return; }; - let first_node = Arc::new(AtomicBool::new(true)); - - let fill_cluster_buffers_global_cluster_count = - render_device.create_buffer(&BufferDescriptor { - label: Some("meshlet_fill_cluster_buffers_global_cluster_count"), - size: 4, - usage: BufferUsages::STORAGE, - mapped_at_creation: false, - }); - // TODO: Some of these bind groups can be reused across multiple views for (view_entity, view_resources) in &views { - let entries = BindGroupEntries::sequential(( - instance_manager.instance_meshlet_counts.binding().unwrap(), - instance_manager - .instance_meshlet_slice_starts - .binding() - .unwrap(), - cluster_instance_ids.as_entire_binding(), - cluster_meshlet_ids.as_entire_binding(), - fill_cluster_buffers_global_cluster_count.as_entire_binding(), - )); - let fill_cluster_buffers = render_device.create_bind_group( - "meshlet_fill_cluster_buffers", - &resource_manager.fill_cluster_buffers_bind_group_layout, - &entries, - ); - let clear_visibility_buffer = render_device.create_bind_group( "meshlet_clear_visibility_buffer_bind_group", if view_resources.not_shadow_view { @@ -675,62 +826,241 @@ pub fn prepare_meshlet_view_bind_groups( &BindGroupEntries::single(&view_resources.visibility_buffer.default_view), ); - let entries = BindGroupEntries::sequential(( - cluster_meshlet_ids.as_entire_binding(), - meshlet_mesh_manager.meshlet_bounding_spheres.binding(), - meshlet_mesh_manager.meshlet_simplification_errors.binding(), - cluster_instance_ids.as_entire_binding(), - instance_manager.instance_uniforms.binding().unwrap(), - view_resources.instance_visibility.as_entire_binding(), - view_resources - .second_pass_candidates_buffer - .as_entire_binding(), - view_resources - .visibility_buffer_software_raster_indirect_args_first - .as_entire_binding(), - view_resources - .visibility_buffer_hardware_raster_indirect_args_first - .as_entire_binding(), - resource_manager - .visibility_buffer_raster_clusters - .as_entire_binding(), - &view_resources.previous_depth_pyramid, - view_uniforms.clone(), - previous_view_uniforms.clone(), - )); - let culling_first = render_device.create_bind_group( - "meshlet_culling_first_bind_group", - &resource_manager.culling_bind_group_layout, - &entries, + let first_instance_cull = render_device.create_bind_group( + "meshlet_first_instance_cull_bind_group", + &resource_manager.first_instance_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources.instance_visibility.as_entire_binding(), + instance_manager.instance_aabbs.binding().unwrap(), + instance_manager.instance_bvh_root_nodes.binding().unwrap(), + view_resources + .first_bvh_cull_count_front + .as_entire_binding(), + view_resources + .first_bvh_cull_dispatch_front + .as_entire_binding(), + view_resources.first_bvh_cull_queue.as_entire_binding(), + view_resources.second_pass_count.as_entire_binding(), + view_resources.second_pass_dispatch.as_entire_binding(), + view_resources.second_pass_candidates.as_entire_binding(), + )), ); - let entries = BindGroupEntries::sequential(( - cluster_meshlet_ids.as_entire_binding(), - meshlet_mesh_manager.meshlet_bounding_spheres.binding(), - meshlet_mesh_manager.meshlet_simplification_errors.binding(), - cluster_instance_ids.as_entire_binding(), - instance_manager.instance_uniforms.binding().unwrap(), - view_resources.instance_visibility.as_entire_binding(), - view_resources - .second_pass_candidates_buffer - .as_entire_binding(), - view_resources - .visibility_buffer_software_raster_indirect_args_second - .as_entire_binding(), - view_resources - .visibility_buffer_hardware_raster_indirect_args_second - .as_entire_binding(), - resource_manager - .visibility_buffer_raster_clusters - .as_entire_binding(), - &view_resources.depth_pyramid.all_mips, - view_uniforms.clone(), - previous_view_uniforms.clone(), - )); - let culling_second = render_device.create_bind_group( - "meshlet_culling_second_bind_group", - &resource_manager.culling_bind_group_layout, - &entries, + let second_instance_cull = render_device.create_bind_group( + "meshlet_second_instance_cull_bind_group", + &resource_manager.second_instance_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources.instance_visibility.as_entire_binding(), + instance_manager.instance_aabbs.binding().unwrap(), + instance_manager.instance_bvh_root_nodes.binding().unwrap(), + view_resources + .second_bvh_cull_count_front + .as_entire_binding(), + view_resources + .second_bvh_cull_dispatch_front + .as_entire_binding(), + view_resources.second_bvh_cull_queue.as_entire_binding(), + view_resources.second_pass_count.as_entire_binding(), + view_resources.second_pass_candidates.as_entire_binding(), + )), + ); + + let first_bvh_cull_ping = render_device.create_bind_group( + "meshlet_first_bvh_cull_ping_bind_group", + &resource_manager.first_bvh_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + meshlet_mesh_manager.bvh_nodes.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources + .first_bvh_cull_count_front + .as_entire_binding(), + view_resources.first_bvh_cull_count_back.as_entire_binding(), + view_resources + .first_bvh_cull_dispatch_back + .as_entire_binding(), + view_resources.first_bvh_cull_queue.as_entire_binding(), + view_resources.front_meshlet_cull_count.as_entire_binding(), + view_resources.back_meshlet_cull_count.as_entire_binding(), + view_resources + .front_meshlet_cull_dispatch + .as_entire_binding(), + view_resources + .back_meshlet_cull_dispatch + .as_entire_binding(), + view_resources.meshlet_cull_queue.as_entire_binding(), + view_resources + .second_bvh_cull_count_front + .as_entire_binding(), + view_resources + .second_bvh_cull_dispatch_front + .as_entire_binding(), + view_resources.second_bvh_cull_queue.as_entire_binding(), + )), + ); + + let first_bvh_cull_pong = render_device.create_bind_group( + "meshlet_first_bvh_cull_pong_bind_group", + &resource_manager.first_bvh_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + meshlet_mesh_manager.bvh_nodes.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources.first_bvh_cull_count_back.as_entire_binding(), + view_resources + .first_bvh_cull_count_front + .as_entire_binding(), + view_resources + .first_bvh_cull_dispatch_front + .as_entire_binding(), + view_resources.first_bvh_cull_queue.as_entire_binding(), + view_resources.front_meshlet_cull_count.as_entire_binding(), + view_resources.back_meshlet_cull_count.as_entire_binding(), + view_resources + .front_meshlet_cull_dispatch + .as_entire_binding(), + view_resources + .back_meshlet_cull_dispatch + .as_entire_binding(), + view_resources.meshlet_cull_queue.as_entire_binding(), + view_resources + .second_bvh_cull_count_front + .as_entire_binding(), + view_resources + .second_bvh_cull_dispatch_front + .as_entire_binding(), + view_resources.second_bvh_cull_queue.as_entire_binding(), + )), + ); + + let second_bvh_cull_ping = render_device.create_bind_group( + "meshlet_second_bvh_cull_ping_bind_group", + &resource_manager.second_bvh_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + meshlet_mesh_manager.bvh_nodes.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources + .second_bvh_cull_count_front + .as_entire_binding(), + view_resources + .second_bvh_cull_count_back + .as_entire_binding(), + view_resources + .second_bvh_cull_dispatch_back + .as_entire_binding(), + view_resources.second_bvh_cull_queue.as_entire_binding(), + view_resources.front_meshlet_cull_count.as_entire_binding(), + view_resources.back_meshlet_cull_count.as_entire_binding(), + view_resources + .front_meshlet_cull_dispatch + .as_entire_binding(), + view_resources + .back_meshlet_cull_dispatch + .as_entire_binding(), + view_resources.meshlet_cull_queue.as_entire_binding(), + )), + ); + + let second_bvh_cull_pong = render_device.create_bind_group( + "meshlet_second_bvh_cull_pong_bind_group", + &resource_manager.second_bvh_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + meshlet_mesh_manager.bvh_nodes.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources + .second_bvh_cull_count_back + .as_entire_binding(), + view_resources + .second_bvh_cull_count_front + .as_entire_binding(), + view_resources + .second_bvh_cull_dispatch_front + .as_entire_binding(), + view_resources.second_bvh_cull_queue.as_entire_binding(), + view_resources.front_meshlet_cull_count.as_entire_binding(), + view_resources.back_meshlet_cull_count.as_entire_binding(), + view_resources + .front_meshlet_cull_dispatch + .as_entire_binding(), + view_resources + .back_meshlet_cull_dispatch + .as_entire_binding(), + view_resources.meshlet_cull_queue.as_entire_binding(), + )), + ); + + let first_meshlet_cull = render_device.create_bind_group( + "meshlet_first_meshlet_cull_bind_group", + &resource_manager.first_meshlet_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + meshlet_mesh_manager.meshlet_cull_data.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources + .visibility_buffer_software_raster_indirect_args + .as_entire_binding(), + view_resources + .visibility_buffer_hardware_raster_indirect_args + .as_entire_binding(), + resource_manager + .visibility_buffer_raster_cluster_prev_counts + .as_entire_binding(), + resource_manager + .visibility_buffer_raster_clusters + .as_entire_binding(), + view_resources.front_meshlet_cull_count.as_entire_binding(), + view_resources.back_meshlet_cull_count.as_entire_binding(), + view_resources + .back_meshlet_cull_dispatch + .as_entire_binding(), + view_resources.meshlet_cull_queue.as_entire_binding(), + )), + ); + + let second_meshlet_cull = render_device.create_bind_group( + "meshlet_second_meshlet_cull_bind_group", + &resource_manager.second_meshlet_cull_bind_group_layout, + &BindGroupEntries::sequential(( + &view_resources.previous_depth_pyramid, + view_uniforms.clone(), + previous_view_uniforms.clone(), + meshlet_mesh_manager.meshlet_cull_data.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + view_resources + .visibility_buffer_software_raster_indirect_args + .as_entire_binding(), + view_resources + .visibility_buffer_hardware_raster_indirect_args + .as_entire_binding(), + resource_manager + .visibility_buffer_raster_cluster_prev_counts + .as_entire_binding(), + resource_manager + .visibility_buffer_raster_clusters + .as_entire_binding(), + view_resources.back_meshlet_cull_count.as_entire_binding(), + view_resources.meshlet_cull_queue.as_entire_binding(), + )), ); let downsample_depth = view_resources.depth_pyramid.create_bind_group( @@ -745,22 +1075,6 @@ pub fn prepare_meshlet_view_bind_groups( &resource_manager.depth_pyramid_sampler, ); - let entries = BindGroupEntries::sequential(( - cluster_meshlet_ids.as_entire_binding(), - meshlet_mesh_manager.meshlets.binding(), - meshlet_mesh_manager.indices.binding(), - meshlet_mesh_manager.vertex_positions.binding(), - cluster_instance_ids.as_entire_binding(), - instance_manager.instance_uniforms.binding().unwrap(), - resource_manager - .visibility_buffer_raster_clusters - .as_entire_binding(), - resource_manager - .software_raster_cluster_count - .as_entire_binding(), - &view_resources.visibility_buffer.default_view, - view_uniforms.clone(), - )); let visibility_buffer_raster = render_device.create_bind_group( "meshlet_visibility_raster_buffer_bind_group", if view_resources.not_shadow_view { @@ -768,7 +1082,23 @@ pub fn prepare_meshlet_view_bind_groups( } else { &resource_manager.visibility_buffer_raster_shadow_view_bind_group_layout }, - &entries, + &BindGroupEntries::sequential(( + resource_manager + .visibility_buffer_raster_clusters + .as_entire_binding(), + meshlet_mesh_manager.meshlets.binding(), + meshlet_mesh_manager.indices.binding(), + meshlet_mesh_manager.vertex_positions.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + resource_manager + .visibility_buffer_raster_cluster_prev_counts + .as_entire_binding(), + resource_manager + .software_raster_cluster_count + .as_entire_binding(), + &view_resources.visibility_buffer.default_view, + view_uniforms.clone(), + )), ); let resolve_depth = render_device.create_bind_group( @@ -782,34 +1112,35 @@ pub fn prepare_meshlet_view_bind_groups( ); let resolve_material_depth = view_resources.material_depth.as_ref().map(|_| { - let entries = BindGroupEntries::sequential(( - &view_resources.visibility_buffer.default_view, - cluster_instance_ids.as_entire_binding(), - instance_manager.instance_material_ids.binding().unwrap(), - )); render_device.create_bind_group( "meshlet_resolve_material_depth_bind_group", &resource_manager.resolve_material_depth_bind_group_layout, - &entries, + &BindGroupEntries::sequential(( + &view_resources.visibility_buffer.default_view, + resource_manager + .visibility_buffer_raster_clusters + .as_entire_binding(), + instance_manager.instance_material_ids.binding().unwrap(), + )), ) }); let material_shade = view_resources.material_depth.as_ref().map(|_| { - let entries = BindGroupEntries::sequential(( - &view_resources.visibility_buffer.default_view, - cluster_meshlet_ids.as_entire_binding(), - meshlet_mesh_manager.meshlets.binding(), - meshlet_mesh_manager.indices.binding(), - meshlet_mesh_manager.vertex_positions.binding(), - meshlet_mesh_manager.vertex_normals.binding(), - meshlet_mesh_manager.vertex_uvs.binding(), - cluster_instance_ids.as_entire_binding(), - instance_manager.instance_uniforms.binding().unwrap(), - )); render_device.create_bind_group( "meshlet_mesh_material_shade_bind_group", &resource_manager.material_shade_bind_group_layout, - &entries, + &BindGroupEntries::sequential(( + &view_resources.visibility_buffer.default_view, + resource_manager + .visibility_buffer_raster_clusters + .as_entire_binding(), + meshlet_mesh_manager.meshlets.binding(), + meshlet_mesh_manager.indices.binding(), + meshlet_mesh_manager.vertex_positions.binding(), + meshlet_mesh_manager.vertex_normals.binding(), + meshlet_mesh_manager.vertex_uvs.binding(), + instance_manager.instance_uniforms.binding().unwrap(), + )), ) }); @@ -817,46 +1148,77 @@ pub fn prepare_meshlet_view_bind_groups( .remap_1d_to_2d_dispatch_bind_group_layout .as_ref() .map(|layout| { - ( - render_device.create_bind_group( - "meshlet_remap_1d_to_2d_dispatch_first_bind_group", - layout, - &BindGroupEntries::sequential(( - view_resources - .visibility_buffer_software_raster_indirect_args_first - .as_entire_binding(), - resource_manager - .software_raster_cluster_count - .as_entire_binding(), - )), - ), - render_device.create_bind_group( - "meshlet_remap_1d_to_2d_dispatch_second_bind_group", - layout, - &BindGroupEntries::sequential(( - view_resources - .visibility_buffer_software_raster_indirect_args_second - .as_entire_binding(), - resource_manager - .software_raster_cluster_count - .as_entire_binding(), - )), - ), + render_device.create_bind_group( + "meshlet_remap_1d_to_2d_dispatch_bind_group", + layout, + &BindGroupEntries::sequential(( + view_resources + .visibility_buffer_software_raster_indirect_args + .as_entire_binding(), + resource_manager + .software_raster_cluster_count + .as_entire_binding(), + )), ) }); + let fill_counts = if resource_manager + .remap_1d_to_2d_dispatch_bind_group_layout + .is_some() + { + render_device.create_bind_group( + "meshlet_fill_counts_bind_group", + &resource_manager.fill_counts_bind_group_layout, + &BindGroupEntries::sequential(( + view_resources + .visibility_buffer_software_raster_indirect_args + .as_entire_binding(), + view_resources + .visibility_buffer_hardware_raster_indirect_args + .as_entire_binding(), + resource_manager + .visibility_buffer_raster_cluster_prev_counts + .as_entire_binding(), + resource_manager + .software_raster_cluster_count + .as_entire_binding(), + )), + ) + } else { + render_device.create_bind_group( + "meshlet_fill_counts_bind_group", + &resource_manager.fill_counts_bind_group_layout, + &BindGroupEntries::sequential(( + view_resources + .visibility_buffer_software_raster_indirect_args + .as_entire_binding(), + view_resources + .visibility_buffer_hardware_raster_indirect_args + .as_entire_binding(), + resource_manager + .visibility_buffer_raster_cluster_prev_counts + .as_entire_binding(), + )), + ) + }; + commands.entity(view_entity).insert(MeshletViewBindGroups { - first_node: Arc::clone(&first_node), - fill_cluster_buffers, clear_visibility_buffer, - culling_first, - culling_second, + first_instance_cull, + second_instance_cull, + first_bvh_cull_ping, + first_bvh_cull_pong, + second_bvh_cull_ping, + second_bvh_cull_pong, + first_meshlet_cull, + second_meshlet_cull, downsample_depth, visibility_buffer_raster, resolve_depth, resolve_material_depth, material_shade, remap_1d_to_2d_dispatch, + fill_counts, }); } } diff --git a/crates/bevy_pbr/src/meshlet/visibility_buffer_hardware_raster.wgsl b/crates/bevy_pbr/src/meshlet/visibility_buffer_hardware_raster.wgsl index 3525d38e6d..2a251443fb 100644 --- a/crates/bevy_pbr/src/meshlet/visibility_buffer_hardware_raster.wgsl +++ b/crates/bevy_pbr/src/meshlet/visibility_buffer_hardware_raster.wgsl @@ -5,6 +5,7 @@ meshlet_cluster_instance_ids, meshlet_instance_uniforms, meshlet_raster_clusters, + meshlet_previous_raster_counts, meshlet_visibility_buffer, view, get_meshlet_triangle_count, @@ -27,17 +28,17 @@ struct VertexOutput { @vertex fn vertex(@builtin(instance_index) instance_index: u32, @builtin(vertex_index) vertex_index: u32) -> VertexOutput { - let cluster_id = meshlet_raster_clusters[meshlet_raster_cluster_rightmost_slot - instance_index]; - let meshlet_id = meshlet_cluster_meshlet_ids[cluster_id]; - var meshlet = meshlets[meshlet_id]; + let cluster_in_draw = meshlet_previous_raster_counts[1] + instance_index; + let cluster_id = meshlet_raster_cluster_rightmost_slot - cluster_in_draw; + let instanced_offset = meshlet_raster_clusters[cluster_id]; + var meshlet = meshlets[instanced_offset.offset]; let triangle_id = vertex_index / 3u; if triangle_id >= get_meshlet_triangle_count(&meshlet) { return dummy_vertex(); } - let index_id = (triangle_id * 3u) + (vertex_index % 3u); + let index_id = vertex_index; let vertex_id = get_meshlet_vertex_id(meshlet.start_index_id + index_id); - let instance_id = meshlet_cluster_instance_ids[cluster_id]; - let instance_uniform = meshlet_instance_uniforms[instance_id]; + let instance_uniform = meshlet_instance_uniforms[instanced_offset.instance_id]; let vertex_position = get_meshlet_vertex_position(&meshlet, vertex_id); let world_from_local = affine3_to_square(instance_uniform.world_from_local); diff --git a/crates/bevy_pbr/src/meshlet/visibility_buffer_raster_node.rs b/crates/bevy_pbr/src/meshlet/visibility_buffer_raster_node.rs index 20054d2d2f..160097fc50 100644 --- a/crates/bevy_pbr/src/meshlet/visibility_buffer_raster_node.rs +++ b/crates/bevy_pbr/src/meshlet/visibility_buffer_raster_node.rs @@ -2,14 +2,16 @@ use super::{ pipelines::MeshletPipelines, resource_manager::{MeshletViewBindGroups, MeshletViewResources}, }; -use crate::{LightEntity, ShadowView, ViewLightEntities}; +use crate::{ + meshlet::resource_manager::ResourceManager, LightEntity, ShadowView, ViewLightEntities, +}; use bevy_color::LinearRgba; use bevy_core_pipeline::prepass::PreviousViewUniformOffset; use bevy_ecs::{ query::QueryState, world::{FromWorld, World}, }; -use bevy_math::{ops, UVec2}; +use bevy_math::UVec2; use bevy_render::{ camera::ExtractedCamera, render_graph::{Node, NodeRunError, RenderGraphContext}, @@ -17,7 +19,6 @@ use bevy_render::{ renderer::RenderContext, view::{ViewDepthTexture, ViewUniformOffset}, }; -use core::sync::atomic::Ordering; /// Rasterize meshlets into a depth buffer, and optional visibility buffer + material depth buffer for shading passes. pub struct MeshletVisibilityBufferRasterPassNode { @@ -76,11 +77,14 @@ impl Node for MeshletVisibilityBufferRasterPassNode { }; let Some(( - fill_cluster_buffers_pipeline, clear_visibility_buffer_pipeline, clear_visibility_buffer_shadow_view_pipeline, - culling_first_pipeline, - culling_second_pipeline, + first_instance_cull_pipeline, + second_instance_cull_pipeline, + first_bvh_cull_pipeline, + second_bvh_cull_pipeline, + first_meshlet_cull_pipeline, + second_meshlet_cull_pipeline, downsample_depth_first_pipeline, downsample_depth_second_pipeline, downsample_depth_first_shadow_view_pipeline, @@ -94,69 +98,60 @@ impl Node for MeshletVisibilityBufferRasterPassNode { resolve_depth_shadow_view_pipeline, resolve_material_depth_pipeline, remap_1d_to_2d_dispatch_pipeline, + fill_counts_pipeline, )) = MeshletPipelines::get(world) else { return Ok(()); }; - let first_node = meshlet_view_bind_groups - .first_node - .fetch_and(false, Ordering::SeqCst); - - let div_ceil = meshlet_view_resources.scene_cluster_count.div_ceil(128); - let thread_per_cluster_workgroups = ops::cbrt(div_ceil as f32).ceil() as u32; - render_context .command_encoder() .push_debug_group("meshlet_visibility_buffer_raster"); - if first_node { - fill_cluster_buffers_pass( - render_context, - &meshlet_view_bind_groups.fill_cluster_buffers, - fill_cluster_buffers_pipeline, - meshlet_view_resources.scene_instance_count, - ); - } + + let resource_manager = world.get_resource::().unwrap(); + render_context.command_encoder().clear_buffer( + &resource_manager.visibility_buffer_raster_cluster_prev_counts, + 0, + None, + ); + clear_visibility_buffer_pass( render_context, &meshlet_view_bind_groups.clear_visibility_buffer, clear_visibility_buffer_pipeline, meshlet_view_resources.view_size, ); - render_context.command_encoder().clear_buffer( - &meshlet_view_resources.second_pass_candidates_buffer, - 0, - None, - ); - cull_pass( - "culling_first", + + render_context + .command_encoder() + .push_debug_group("meshlet_first_pass"); + first_cull( render_context, - &meshlet_view_bind_groups.culling_first, + meshlet_view_bind_groups, + meshlet_view_resources, view_offset, previous_view_offset, - culling_first_pipeline, - thread_per_cluster_workgroups, - meshlet_view_resources.scene_cluster_count, - meshlet_view_resources.raster_cluster_rightmost_slot, - meshlet_view_bind_groups - .remap_1d_to_2d_dispatch - .as_ref() - .map(|(bg1, _)| bg1), + first_instance_cull_pipeline, + first_bvh_cull_pipeline, + first_meshlet_cull_pipeline, remap_1d_to_2d_dispatch_pipeline, ); raster_pass( true, render_context, - &meshlet_view_resources.visibility_buffer_software_raster_indirect_args_first, - &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args_first, + &meshlet_view_resources.visibility_buffer_software_raster_indirect_args, + &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args, &meshlet_view_resources.dummy_render_target.default_view, meshlet_view_bind_groups, view_offset, visibility_buffer_software_raster_pipeline, visibility_buffer_hardware_raster_pipeline, + fill_counts_pipeline, Some(camera), - meshlet_view_resources.raster_cluster_rightmost_slot, + meshlet_view_resources.rightmost_slot, ); + render_context.command_encoder().pop_debug_group(); + meshlet_view_resources.depth_pyramid.downsample_depth( "downsample_depth", render_context, @@ -165,35 +160,37 @@ impl Node for MeshletVisibilityBufferRasterPassNode { downsample_depth_first_pipeline, downsample_depth_second_pipeline, ); - cull_pass( - "culling_second", + + render_context + .command_encoder() + .push_debug_group("meshlet_second_pass"); + second_cull( render_context, - &meshlet_view_bind_groups.culling_second, + meshlet_view_bind_groups, + meshlet_view_resources, view_offset, previous_view_offset, - culling_second_pipeline, - thread_per_cluster_workgroups, - meshlet_view_resources.scene_cluster_count, - meshlet_view_resources.raster_cluster_rightmost_slot, - meshlet_view_bind_groups - .remap_1d_to_2d_dispatch - .as_ref() - .map(|(_, bg2)| bg2), + second_instance_cull_pipeline, + second_bvh_cull_pipeline, + second_meshlet_cull_pipeline, remap_1d_to_2d_dispatch_pipeline, ); raster_pass( false, render_context, - &meshlet_view_resources.visibility_buffer_software_raster_indirect_args_second, - &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args_second, + &meshlet_view_resources.visibility_buffer_software_raster_indirect_args, + &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args, &meshlet_view_resources.dummy_render_target.default_view, meshlet_view_bind_groups, view_offset, visibility_buffer_software_raster_pipeline, visibility_buffer_hardware_raster_pipeline, + fill_counts_pipeline, Some(camera), - meshlet_view_resources.raster_cluster_rightmost_slot, + meshlet_view_resources.rightmost_slot, ); + render_context.command_encoder().pop_debug_group(); + resolve_depth( render_context, view_depth.get_attachment(StoreOp::Store), @@ -248,40 +245,37 @@ impl Node for MeshletVisibilityBufferRasterPassNode { clear_visibility_buffer_shadow_view_pipeline, meshlet_view_resources.view_size, ); - render_context.command_encoder().clear_buffer( - &meshlet_view_resources.second_pass_candidates_buffer, - 0, - None, - ); - cull_pass( - "culling_first", + + render_context + .command_encoder() + .push_debug_group("meshlet_first_pass"); + first_cull( render_context, - &meshlet_view_bind_groups.culling_first, + meshlet_view_bind_groups, + meshlet_view_resources, view_offset, previous_view_offset, - culling_first_pipeline, - thread_per_cluster_workgroups, - meshlet_view_resources.scene_cluster_count, - meshlet_view_resources.raster_cluster_rightmost_slot, - meshlet_view_bind_groups - .remap_1d_to_2d_dispatch - .as_ref() - .map(|(bg1, _)| bg1), + first_instance_cull_pipeline, + first_bvh_cull_pipeline, + first_meshlet_cull_pipeline, remap_1d_to_2d_dispatch_pipeline, ); raster_pass( true, render_context, - &meshlet_view_resources.visibility_buffer_software_raster_indirect_args_first, - &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args_first, + &meshlet_view_resources.visibility_buffer_software_raster_indirect_args, + &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args, &meshlet_view_resources.dummy_render_target.default_view, meshlet_view_bind_groups, view_offset, visibility_buffer_software_raster_shadow_view_pipeline, shadow_visibility_buffer_hardware_raster_pipeline, + fill_counts_pipeline, None, - meshlet_view_resources.raster_cluster_rightmost_slot, + meshlet_view_resources.rightmost_slot, ); + render_context.command_encoder().pop_debug_group(); + meshlet_view_resources.depth_pyramid.downsample_depth( "downsample_depth", render_context, @@ -290,35 +284,37 @@ impl Node for MeshletVisibilityBufferRasterPassNode { downsample_depth_first_shadow_view_pipeline, downsample_depth_second_shadow_view_pipeline, ); - cull_pass( - "culling_second", + + render_context + .command_encoder() + .push_debug_group("meshlet_second_pass"); + second_cull( render_context, - &meshlet_view_bind_groups.culling_second, + meshlet_view_bind_groups, + meshlet_view_resources, view_offset, previous_view_offset, - culling_second_pipeline, - thread_per_cluster_workgroups, - meshlet_view_resources.scene_cluster_count, - meshlet_view_resources.raster_cluster_rightmost_slot, - meshlet_view_bind_groups - .remap_1d_to_2d_dispatch - .as_ref() - .map(|(_, bg2)| bg2), + second_instance_cull_pipeline, + second_bvh_cull_pipeline, + second_meshlet_cull_pipeline, remap_1d_to_2d_dispatch_pipeline, ); raster_pass( false, render_context, - &meshlet_view_resources.visibility_buffer_software_raster_indirect_args_second, - &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args_second, + &meshlet_view_resources.visibility_buffer_software_raster_indirect_args, + &meshlet_view_resources.visibility_buffer_hardware_raster_indirect_args, &meshlet_view_resources.dummy_render_target.default_view, meshlet_view_bind_groups, view_offset, visibility_buffer_software_raster_shadow_view_pipeline, shadow_visibility_buffer_hardware_raster_pipeline, + fill_counts_pipeline, None, - meshlet_view_resources.raster_cluster_rightmost_slot, + meshlet_view_resources.rightmost_slot, ); + render_context.command_encoder().pop_debug_group(); + resolve_depth( render_context, shadow_view.depth_attachment.get_attachment(StoreOp::Store), @@ -341,39 +337,6 @@ impl Node for MeshletVisibilityBufferRasterPassNode { } } -fn fill_cluster_buffers_pass( - render_context: &mut RenderContext, - fill_cluster_buffers_bind_group: &BindGroup, - fill_cluster_buffers_pass_pipeline: &ComputePipeline, - scene_instance_count: u32, -) { - let mut fill_cluster_buffers_pass_workgroups_x = scene_instance_count; - let mut fill_cluster_buffers_pass_workgroups_y = 1; - if scene_instance_count - > render_context - .render_device() - .limits() - .max_compute_workgroups_per_dimension - { - fill_cluster_buffers_pass_workgroups_x = (scene_instance_count as f32).sqrt().ceil() as u32; - fill_cluster_buffers_pass_workgroups_y = fill_cluster_buffers_pass_workgroups_x; - } - - let command_encoder = render_context.command_encoder(); - let mut fill_pass = command_encoder.begin_compute_pass(&ComputePassDescriptor { - label: Some("fill_cluster_buffers"), - timestamp_writes: None, - }); - fill_pass.set_pipeline(fill_cluster_buffers_pass_pipeline); - fill_pass.set_push_constants(0, &scene_instance_count.to_le_bytes()); - fill_pass.set_bind_group(0, fill_cluster_buffers_bind_group, &[]); - fill_pass.dispatch_workgroups( - fill_cluster_buffers_pass_workgroups_x, - fill_cluster_buffers_pass_workgroups_y, - 1, - ); -} - // TODO: Replace this with vkCmdClearColorImage once wgpu supports it fn clear_visibility_buffer_pass( render_context: &mut RenderContext, @@ -397,82 +360,231 @@ fn clear_visibility_buffer_pass( ); } -fn cull_pass( - label: &'static str, +fn first_cull( render_context: &mut RenderContext, - culling_bind_group: &BindGroup, + meshlet_view_bind_groups: &MeshletViewBindGroups, + meshlet_view_resources: &MeshletViewResources, view_offset: &ViewUniformOffset, previous_view_offset: &PreviousViewUniformOffset, - culling_pipeline: &ComputePipeline, - culling_workgroups: u32, - scene_cluster_count: u32, - raster_cluster_rightmost_slot: u32, - remap_1d_to_2d_dispatch_bind_group: Option<&BindGroup>, - remap_1d_to_2d_dispatch_pipeline: Option<&ComputePipeline>, + first_instance_cull_pipeline: &ComputePipeline, + first_bvh_cull_pipeline: &ComputePipeline, + first_meshlet_cull_pipeline: &ComputePipeline, + remap_1d_to_2d_pipeline: Option<&ComputePipeline>, ) { - let max_compute_workgroups_per_dimension = render_context - .render_device() - .limits() - .max_compute_workgroups_per_dimension; + let workgroups = meshlet_view_resources.scene_instance_count.div_ceil(128); + cull_pass( + "meshlet_first_instance_cull", + render_context, + &meshlet_view_bind_groups.first_instance_cull, + view_offset, + previous_view_offset, + first_instance_cull_pipeline, + &[meshlet_view_resources.scene_instance_count], + ) + .dispatch_workgroups(workgroups, 1, 1); + render_context + .command_encoder() + .push_debug_group("meshlet_first_bvh_cull"); + let mut ping = true; + for _ in 0..meshlet_view_resources.max_bvh_depth { + cull_pass( + "meshlet_first_bvh_cull_dispatch", + render_context, + if ping { + &meshlet_view_bind_groups.first_bvh_cull_ping + } else { + &meshlet_view_bind_groups.first_bvh_cull_pong + }, + view_offset, + previous_view_offset, + first_bvh_cull_pipeline, + &[ping as u32, meshlet_view_resources.rightmost_slot], + ) + .dispatch_workgroups_indirect( + if ping { + &meshlet_view_resources.first_bvh_cull_dispatch_front + } else { + &meshlet_view_resources.first_bvh_cull_dispatch_back + }, + 0, + ); + render_context.command_encoder().clear_buffer( + if ping { + &meshlet_view_resources.first_bvh_cull_count_front + } else { + &meshlet_view_resources.first_bvh_cull_count_back + }, + 0, + Some(4), + ); + render_context.command_encoder().clear_buffer( + if ping { + &meshlet_view_resources.first_bvh_cull_dispatch_front + } else { + &meshlet_view_resources.first_bvh_cull_dispatch_back + }, + 0, + Some(4), + ); + ping = !ping; + } + render_context.command_encoder().pop_debug_group(); + + let mut pass = cull_pass( + "meshlet_first_meshlet_cull", + render_context, + &meshlet_view_bind_groups.first_meshlet_cull, + view_offset, + previous_view_offset, + first_meshlet_cull_pipeline, + &[meshlet_view_resources.rightmost_slot], + ); + pass.dispatch_workgroups_indirect(&meshlet_view_resources.front_meshlet_cull_dispatch, 0); + remap_1d_to_2d( + pass, + remap_1d_to_2d_pipeline, + meshlet_view_bind_groups.remap_1d_to_2d_dispatch.as_ref(), + ); +} + +fn second_cull( + render_context: &mut RenderContext, + meshlet_view_bind_groups: &MeshletViewBindGroups, + meshlet_view_resources: &MeshletViewResources, + view_offset: &ViewUniformOffset, + previous_view_offset: &PreviousViewUniformOffset, + second_instance_cull_pipeline: &ComputePipeline, + second_bvh_cull_pipeline: &ComputePipeline, + second_meshlet_cull_pipeline: &ComputePipeline, + remap_1d_to_2d_pipeline: Option<&ComputePipeline>, +) { + cull_pass( + "meshlet_second_instance_cull", + render_context, + &meshlet_view_bind_groups.second_instance_cull, + view_offset, + previous_view_offset, + second_instance_cull_pipeline, + &[meshlet_view_resources.scene_instance_count], + ) + .dispatch_workgroups_indirect(&meshlet_view_resources.second_pass_dispatch, 0); + + render_context + .command_encoder() + .push_debug_group("meshlet_second_bvh_cull"); + let mut ping = true; + for _ in 0..meshlet_view_resources.max_bvh_depth { + cull_pass( + "meshlet_second_bvh_cull_dispatch", + render_context, + if ping { + &meshlet_view_bind_groups.second_bvh_cull_ping + } else { + &meshlet_view_bind_groups.second_bvh_cull_pong + }, + view_offset, + previous_view_offset, + second_bvh_cull_pipeline, + &[ping as u32, meshlet_view_resources.rightmost_slot], + ) + .dispatch_workgroups_indirect( + if ping { + &meshlet_view_resources.second_bvh_cull_dispatch_front + } else { + &meshlet_view_resources.second_bvh_cull_dispatch_back + }, + 0, + ); + ping = !ping; + } + render_context.command_encoder().pop_debug_group(); + + let mut pass = cull_pass( + "meshlet_second_meshlet_cull", + render_context, + &meshlet_view_bind_groups.second_meshlet_cull, + view_offset, + previous_view_offset, + second_meshlet_cull_pipeline, + &[meshlet_view_resources.rightmost_slot], + ); + pass.dispatch_workgroups_indirect(&meshlet_view_resources.back_meshlet_cull_dispatch, 0); + remap_1d_to_2d( + pass, + remap_1d_to_2d_pipeline, + meshlet_view_bind_groups.remap_1d_to_2d_dispatch.as_ref(), + ); +} + +fn cull_pass<'a>( + label: &'static str, + render_context: &'a mut RenderContext, + bind_group: &'a BindGroup, + view_offset: &'a ViewUniformOffset, + previous_view_offset: &'a PreviousViewUniformOffset, + pipeline: &'a ComputePipeline, + push_constants: &[u32], +) -> ComputePass<'a> { let command_encoder = render_context.command_encoder(); - let mut cull_pass = command_encoder.begin_compute_pass(&ComputePassDescriptor { + let mut pass = command_encoder.begin_compute_pass(&ComputePassDescriptor { label: Some(label), timestamp_writes: None, }); - cull_pass.set_pipeline(culling_pipeline); - cull_pass.set_push_constants( + pass.set_pipeline(pipeline); + pass.set_bind_group( 0, - bytemuck::cast_slice(&[scene_cluster_count, raster_cluster_rightmost_slot]), - ); - cull_pass.set_bind_group( - 0, - culling_bind_group, + bind_group, &[view_offset.offset, previous_view_offset.offset], ); - cull_pass.dispatch_workgroups(culling_workgroups, culling_workgroups, culling_workgroups); + pass.set_push_constants(0, bytemuck::cast_slice(push_constants)); + pass +} - if let (Some(remap_1d_to_2d_dispatch_pipeline), Some(remap_1d_to_2d_dispatch_bind_group)) = ( - remap_1d_to_2d_dispatch_pipeline, - remap_1d_to_2d_dispatch_bind_group, - ) { - cull_pass.set_pipeline(remap_1d_to_2d_dispatch_pipeline); - cull_pass.set_push_constants(0, &max_compute_workgroups_per_dimension.to_be_bytes()); - cull_pass.set_bind_group(0, remap_1d_to_2d_dispatch_bind_group, &[]); - cull_pass.dispatch_workgroups(1, 1, 1); +fn remap_1d_to_2d( + mut pass: ComputePass, + pipeline: Option<&ComputePipeline>, + bind_group: Option<&BindGroup>, +) { + if let (Some(pipeline), Some(bind_group)) = (pipeline, bind_group) { + pass.set_pipeline(pipeline); + pass.set_bind_group(0, bind_group, &[]); + pass.dispatch_workgroups(1, 1, 1); } } fn raster_pass( first_pass: bool, render_context: &mut RenderContext, - visibility_buffer_hardware_software_indirect_args: &Buffer, + visibility_buffer_software_raster_indirect_args: &Buffer, visibility_buffer_hardware_raster_indirect_args: &Buffer, dummy_render_target: &TextureView, meshlet_view_bind_groups: &MeshletViewBindGroups, view_offset: &ViewUniformOffset, - visibility_buffer_hardware_software_pipeline: &ComputePipeline, + visibility_buffer_software_raster_pipeline: &ComputePipeline, visibility_buffer_hardware_raster_pipeline: &RenderPipeline, + fill_counts_pipeline: &ComputePipeline, camera: Option<&ExtractedCamera>, raster_cluster_rightmost_slot: u32, ) { - let command_encoder = render_context.command_encoder(); - let mut software_pass = command_encoder.begin_compute_pass(&ComputePassDescriptor { - label: Some(if first_pass { - "raster_software_first" - } else { - "raster_software_second" - }), - timestamp_writes: None, - }); - software_pass.set_pipeline(visibility_buffer_hardware_software_pipeline); + let mut software_pass = + render_context + .command_encoder() + .begin_compute_pass(&ComputePassDescriptor { + label: Some(if first_pass { + "raster_software_first" + } else { + "raster_software_second" + }), + timestamp_writes: None, + }); + software_pass.set_pipeline(visibility_buffer_software_raster_pipeline); software_pass.set_bind_group( 0, &meshlet_view_bind_groups.visibility_buffer_raster, &[view_offset.offset], ); - software_pass - .dispatch_workgroups_indirect(visibility_buffer_hardware_software_indirect_args, 0); + software_pass.dispatch_workgroups_indirect(visibility_buffer_software_raster_indirect_args, 0); drop(software_pass); let mut hardware_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor { @@ -508,6 +620,18 @@ fn raster_pass( &[view_offset.offset], ); hardware_pass.draw_indirect(visibility_buffer_hardware_raster_indirect_args, 0); + drop(hardware_pass); + + let mut fill_counts_pass = + render_context + .command_encoder() + .begin_compute_pass(&ComputePassDescriptor { + label: Some("fill_counts"), + timestamp_writes: None, + }); + fill_counts_pass.set_pipeline(fill_counts_pipeline); + fill_counts_pass.set_bind_group(0, &meshlet_view_bind_groups.fill_counts, &[]); + fill_counts_pass.dispatch_workgroups(1, 1, 1); } fn resolve_depth( diff --git a/crates/bevy_pbr/src/meshlet/visibility_buffer_resolve.wgsl b/crates/bevy_pbr/src/meshlet/visibility_buffer_resolve.wgsl index 4c56c5874a..8d8a22b943 100644 --- a/crates/bevy_pbr/src/meshlet/visibility_buffer_resolve.wgsl +++ b/crates/bevy_pbr/src/meshlet/visibility_buffer_resolve.wgsl @@ -4,9 +4,8 @@ meshlet_bindings::{ Meshlet, meshlet_visibility_buffer, - meshlet_cluster_meshlet_ids, + meshlet_raster_clusters, meshlets, - meshlet_cluster_instance_ids, meshlet_instance_uniforms, get_meshlet_vertex_id, get_meshlet_vertex_position, @@ -106,7 +105,8 @@ struct VertexOutput { fn resolve_vertex_output(frag_coord: vec4) -> VertexOutput { let packed_ids = u32(textureLoad(meshlet_visibility_buffer, vec2(frag_coord.xy)).r); let cluster_id = packed_ids >> 7u; - let meshlet_id = meshlet_cluster_meshlet_ids[cluster_id]; + let instanced_offset = meshlet_raster_clusters[cluster_id]; + let meshlet_id = instanced_offset.offset; var meshlet = meshlets[meshlet_id]; let triangle_id = extractBits(packed_ids, 0u, 7u); @@ -116,7 +116,7 @@ fn resolve_vertex_output(frag_coord: vec4) -> VertexOutput { let vertex_1 = load_vertex(&meshlet, vertex_ids[1]); let vertex_2 = load_vertex(&meshlet, vertex_ids[2]); - let instance_id = meshlet_cluster_instance_ids[cluster_id]; + let instance_id = instanced_offset.instance_id; var instance_uniform = meshlet_instance_uniforms[instance_id]; let world_from_local = affine3_to_square(instance_uniform.world_from_local); diff --git a/crates/bevy_pbr/src/meshlet/visibility_buffer_software_raster.wgsl b/crates/bevy_pbr/src/meshlet/visibility_buffer_software_raster.wgsl index 60f6f1b3ea..0ddfff8964 100644 --- a/crates/bevy_pbr/src/meshlet/visibility_buffer_software_raster.wgsl +++ b/crates/bevy_pbr/src/meshlet/visibility_buffer_software_raster.wgsl @@ -5,6 +5,7 @@ meshlet_cluster_instance_ids, meshlet_instance_uniforms, meshlet_raster_clusters, + meshlet_previous_raster_counts, meshlet_software_raster_cluster_count, meshlet_visibility_buffer, view, @@ -40,12 +41,11 @@ fn rasterize_cluster( if workgroup_id_1d >= meshlet_software_raster_cluster_count { return; } #endif - let cluster_id = meshlet_raster_clusters[workgroup_id_1d]; - let meshlet_id = meshlet_cluster_meshlet_ids[cluster_id]; - var meshlet = meshlets[meshlet_id]; + let cluster_id = workgroup_id_1d + meshlet_previous_raster_counts[0]; + let instanced_offset = meshlet_raster_clusters[cluster_id]; + var meshlet = meshlets[instanced_offset.offset]; - let instance_id = meshlet_cluster_instance_ids[cluster_id]; - let instance_uniform = meshlet_instance_uniforms[instance_id]; + let instance_uniform = meshlet_instance_uniforms[instanced_offset.instance_id]; let world_from_local = affine3_to_square(instance_uniform.world_from_local); // Load and project 1 vertex per thread, and then again if there are more than 128 vertices in the meshlet diff --git a/examples/3d/meshlet.rs b/examples/3d/meshlet.rs index 88678b90ac..8cab04ae99 100644 --- a/examples/3d/meshlet.rs +++ b/examples/3d/meshlet.rs @@ -17,7 +17,7 @@ use camera_controller::{CameraController, CameraControllerPlugin}; use std::{f32::consts::PI, path::Path, process::ExitCode}; const ASSET_URL: &str = - "https://raw.githubusercontent.com/JMS55/bevy_meshlet_asset/7a7c14138021f63904b584d5f7b73b695c7f4bbf/bunny.meshlet_mesh"; + "https://raw.githubusercontent.com/atlv24/assets/69bb39164fd35aadf863f6009520d4981eafcea0/bunny.meshlet_mesh"; fn main() -> ExitCode { if !Path::new("./assets/external/models/bunny.meshlet_mesh").exists() { @@ -30,7 +30,7 @@ fn main() -> ExitCode { .add_plugins(( DefaultPlugins, MeshletPlugin { - cluster_buffer_slots: 8192, + cluster_buffer_slots: 1 << 14, }, MaterialPlugin::::default(), CameraControllerPlugin, From 85448b767e40f3347523282520f47d662f1f9204 Mon Sep 17 00:00:00 2001 From: Chris Russell <8494645+chescock@users.noreply.github.com> Date: Sat, 28 Jun 2025 22:45:41 -0400 Subject: [PATCH 10/68] Make `DebugName` work when building with no default features (#19824) # Objective Let `bevy_utils` build with no default features. `cargo build -p bevy_utils --no-default-features` currently fails with ``` error[E0433]: failed to resolve: use of unresolved module or unlinked crate `alloc` --> crates\bevy_utils\src\debug_info.rs:1:5 | 1 | use alloc::{borrow::Cow, fmt, string::String}; | ^^^^^ use of unresolved module or unlinked crate `alloc` | = help: add `extern crate alloc` to use the `alloc` crate error[E0432]: unresolved import `alloc` --> crates\bevy_utils\src\debug_info.rs:1:5 | 1 | use alloc::{borrow::Cow, fmt, string::String}; | ^^^^^ help: a similar path exists: `core::alloc` ``` I would have expected CI to catch this earlier, but I have not investigated why it did not. ## Solution Wrap the parts of `DebugName` that use `Cow` and `String` in `cfg::alloc!`. If the `debug` feature is enabled, then `DebugName` itself stores a `Cow`, so make the `debug` feature require `bevy_platform/alloc`. That is, you can use `DebugName` in no-std contexts when it's just a ZST! (I bet it's even possible to support no-std `debug` by storing `&'static str` instead of `Cow<'static, str>`, but that seemed like too much complexity for now.) --- crates/bevy_utils/Cargo.toml | 2 +- crates/bevy_utils/src/debug_info.rs | 61 +++++++++++++++++------------ 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/crates/bevy_utils/Cargo.toml b/crates/bevy_utils/Cargo.toml index 4e74e6ea94..447c9966f4 100644 --- a/crates/bevy_utils/Cargo.toml +++ b/crates/bevy_utils/Cargo.toml @@ -18,7 +18,7 @@ parallel = ["bevy_platform/std", "dep:thread_local"] std = ["disqualified/alloc"] -debug = [] +debug = ["bevy_platform/alloc"] [dependencies] bevy_platform = { path = "../bevy_platform", version = "0.17.0-dev", default-features = false } diff --git a/crates/bevy_utils/src/debug_info.rs b/crates/bevy_utils/src/debug_info.rs index c79c5ebe60..84232c9d3d 100644 --- a/crates/bevy_utils/src/debug_info.rs +++ b/crates/bevy_utils/src/debug_info.rs @@ -1,4 +1,7 @@ -use alloc::{borrow::Cow, fmt, string::String}; +use crate::cfg; +cfg::alloc! { + use alloc::{borrow::Cow, fmt, string::String}; +} #[cfg(feature = "debug")] use core::any::type_name; use disqualified::ShortName; @@ -16,14 +19,16 @@ pub struct DebugName { name: Cow<'static, str>, } -impl fmt::Display for DebugName { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - #[cfg(feature = "debug")] - f.write_str(self.name.as_ref())?; - #[cfg(not(feature = "debug"))] - f.write_str(FEATURE_DISABLED)?; +cfg::alloc! { + impl fmt::Display for DebugName { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + #[cfg(feature = "debug")] + f.write_str(self.name.as_ref())?; + #[cfg(not(feature = "debug"))] + f.write_str(FEATURE_DISABLED)?; - Ok(()) + Ok(()) + } } } @@ -39,14 +44,16 @@ impl DebugName { } } - /// Create a new `DebugName` from a `String` - /// - /// The value will be ignored if the `debug` feature is not enabled - #[cfg_attr(not(feature = "debug"), expect(unused_variables))] - pub fn owned(value: String) -> Self { - DebugName { - #[cfg(feature = "debug")] - name: Cow::Owned(value), + cfg::alloc! { + /// Create a new `DebugName` from a `String` + /// + /// The value will be ignored if the `debug` feature is not enabled + #[cfg_attr(not(feature = "debug"), expect(unused_variables))] + pub fn owned(value: String) -> Self { + DebugName { + #[cfg(feature = "debug")] + name: Cow::Owned(value), + } } } @@ -79,19 +86,21 @@ impl DebugName { } } -impl From> for DebugName { - #[cfg_attr(not(feature = "debug"), expect(unused_variables))] - fn from(value: Cow<'static, str>) -> Self { - Self { - #[cfg(feature = "debug")] - name: value, +cfg::alloc! { + impl From> for DebugName { + #[cfg_attr(not(feature = "debug"), expect(unused_variables))] + fn from(value: Cow<'static, str>) -> Self { + Self { + #[cfg(feature = "debug")] + name: value, + } } } -} -impl From for DebugName { - fn from(value: String) -> Self { - Self::owned(value) + impl From for DebugName { + fn from(value: String) -> Self { + Self::owned(value) + } } } From 795e273a9ac09ee482bfc1919e9b85ee8bdf95af Mon Sep 17 00:00:00 2001 From: Brian Reavis Date: Sun, 29 Jun 2025 09:34:20 -0700 Subject: [PATCH 11/68] Don't create errors for ignored failed commands (#19718) # Objective 1. Reduce overhead from error handling for ECS commands that intentionally ignore errors, such as `try_despawn`. These commands currently allocate error objects and pass them to a no-op handler (`ignore`), which can impact performance when many operations fail. 2. Fix a hang when removing `ChildOf` components during entity despawning. Excessive logging of these failures can cause significant hangs (I'm noticing around 100ms). - Fixes https://github.com/bevyengine/bevy/issues/19777 - Fixes https://github.com/bevyengine/bevy/issues/19753 image ## Solution * Added a `ignore_error` method to the `HandleError` trait to use instead of `handle_error_with(ignore)`. It swallows errors and does not create error objects. * Replaced `remove::` with `try_remove::` to suppress expected (?) errors and reduce log noise. ## Testing - I ran these changes on a local project. --- crates/bevy_ecs/src/error/command_handling.rs | 19 ++++++++++++ crates/bevy_ecs/src/relationship/mod.rs | 8 ++--- crates/bevy_ecs/src/system/commands/mod.rs | 30 ++++++++++++++----- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/crates/bevy_ecs/src/error/command_handling.rs b/crates/bevy_ecs/src/error/command_handling.rs index c303b76d17..13ec866ec1 100644 --- a/crates/bevy_ecs/src/error/command_handling.rs +++ b/crates/bevy_ecs/src/error/command_handling.rs @@ -20,6 +20,8 @@ pub trait HandleError: Send + 'static { /// Takes a [`Command`] that returns a Result and uses the default error handler function to convert it into /// a [`Command`] that internally handles an error if it occurs and returns `()`. fn handle_error(self) -> impl Command; + /// Takes a [`Command`] that returns a Result and ignores any error that occurs. + fn ignore_error(self) -> impl Command; } impl HandleError> for C @@ -50,6 +52,12 @@ where ), } } + + fn ignore_error(self) -> impl Command { + move |world: &mut World| { + let _ = self.apply(world); + } + } } impl HandleError for C @@ -68,6 +76,13 @@ where self.apply(world); } } + + #[inline] + fn ignore_error(self) -> impl Command { + move |world: &mut World| { + self.apply(world); + } + } } impl HandleError for C @@ -82,6 +97,10 @@ where fn handle_error(self) -> impl Command { self } + #[inline] + fn ignore_error(self) -> impl Command { + self + } } /// Passes in a specific entity to an [`EntityCommand`], resulting in a [`Command`] that diff --git a/crates/bevy_ecs/src/relationship/mod.rs b/crates/bevy_ecs/src/relationship/mod.rs index 8830998663..12def083bd 100644 --- a/crates/bevy_ecs/src/relationship/mod.rs +++ b/crates/bevy_ecs/src/relationship/mod.rs @@ -14,7 +14,7 @@ pub use relationship_source_collection::*; use crate::{ component::{Component, Mutable}, entity::{ComponentCloneCtx, Entity, SourceComponent}, - error::{ignore, CommandWithEntity, HandleError}, + error::CommandWithEntity, lifecycle::HookContext, world::{DeferredWorld, EntityWorldMut}, }; @@ -187,7 +187,7 @@ pub trait Relationship: Component + Sized { world .commands() - .queue(command.with_entity(target_entity).handle_error_with(ignore)); + .queue_silenced(command.with_entity(target_entity)); } } } @@ -244,7 +244,7 @@ pub trait RelationshipTarget: Component + Sized { for source_entity in relationship_target.iter() { commands .entity(source_entity) - .remove::(); + .try_remove::(); } } @@ -255,7 +255,7 @@ pub trait RelationshipTarget: Component + Sized { let (entities, mut commands) = world.entities_and_commands(); let relationship_target = entities.get(entity).unwrap().get::().unwrap(); for source_entity in relationship_target.iter() { - commands.entity(source_entity).despawn(); + commands.entity(source_entity).try_despawn(); } } diff --git a/crates/bevy_ecs/src/system/commands/mod.rs b/crates/bevy_ecs/src/system/commands/mod.rs index 0751e26770..e066446b51 100644 --- a/crates/bevy_ecs/src/system/commands/mod.rs +++ b/crates/bevy_ecs/src/system/commands/mod.rs @@ -19,7 +19,7 @@ use crate::{ change_detection::{MaybeLocation, Mut}, component::{Component, ComponentId, Mutable}, entity::{Entities, Entity, EntityClonerBuilder, EntityDoesNotExistError, OptIn, OptOut}, - error::{ignore, warn, BevyError, CommandWithEntity, ErrorContext, HandleError}, + error::{warn, BevyError, CommandWithEntity, ErrorContext, HandleError}, event::{BufferedEvent, EntityEvent, Event}, observer::{Observer, TriggerTargets}, resource::Resource, @@ -641,6 +641,11 @@ impl<'w, 's> Commands<'w, 's> { self.queue_internal(command.handle_error_with(error_handler)); } + /// Pushes a generic [`Command`] to the queue like [`Commands::queue_handled`], but instead silently ignores any errors. + pub fn queue_silenced + HandleError, T>(&mut self, command: C) { + self.queue_internal(command.ignore_error()); + } + fn queue_internal(&mut self, command: impl Command) { match &mut self.queue { InternalQueue::CommandQueue(queue) => { @@ -1466,12 +1471,11 @@ impl<'a> EntityCommands<'a> { component_id: ComponentId, value: T, ) -> &mut Self { - self.queue_handled( + self.queue_silenced( // SAFETY: // - `ComponentId` safety is ensured by the caller. // - `T` safety is ensured by the caller. unsafe { entity_command::insert_by_id(component_id, value, InsertMode::Replace) }, - ignore, ) } @@ -1523,7 +1527,7 @@ impl<'a> EntityCommands<'a> { /// ``` #[track_caller] pub fn try_insert(&mut self, bundle: impl Bundle) -> &mut Self { - self.queue_handled(entity_command::insert(bundle, InsertMode::Replace), ignore) + self.queue_silenced(entity_command::insert(bundle, InsertMode::Replace)) } /// Adds a [`Bundle`] of components to the entity if the predicate returns true. @@ -1579,7 +1583,7 @@ impl<'a> EntityCommands<'a> { /// the resulting error will be ignored. #[track_caller] pub fn try_insert_if_new(&mut self, bundle: impl Bundle) -> &mut Self { - self.queue_handled(entity_command::insert(bundle, InsertMode::Keep), ignore) + self.queue_silenced(entity_command::insert(bundle, InsertMode::Keep)) } /// Removes a [`Bundle`] of components from the entity. @@ -1724,7 +1728,7 @@ impl<'a> EntityCommands<'a> { /// # bevy_ecs::system::assert_is_system(remove_combat_stats_system); /// ``` pub fn try_remove(&mut self) -> &mut Self { - self.queue_handled(entity_command::remove::(), ignore) + self.queue_silenced(entity_command::remove::()) } /// Removes a [`Bundle`] of components from the entity, @@ -1818,7 +1822,7 @@ impl<'a> EntityCommands<'a> { /// /// For example, this will recursively despawn [`Children`](crate::hierarchy::Children). pub fn try_despawn(&mut self) { - self.queue_handled(entity_command::despawn(), ignore); + self.queue_silenced(entity_command::despawn()); } /// Pushes an [`EntityCommand`] to the queue, @@ -1907,6 +1911,18 @@ impl<'a> EntityCommands<'a> { self } + /// Pushes an [`EntityCommand`] to the queue, which will get executed for the current [`Entity`]. + /// + /// Unlike [`EntityCommands::queue_handled`], this will completely ignore any errors that occur. + pub fn queue_silenced + CommandWithEntity, T, M>( + &mut self, + command: C, + ) -> &mut Self { + self.commands + .queue_silenced(command.with_entity(self.entity)); + self + } + /// Removes all components except the given [`Bundle`] from the entity. /// /// # Example From 8e12b1f0b2cd8b92f64cc8b081c8e54212a96bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sun, 29 Jun 2025 19:12:11 +0200 Subject: [PATCH 12/68] bevy_ui compilation (#19858) # Objective - `bevy_ui` has errors and warnings when building independently ## Solution - properly use the `bevy_ui_picking_backend` feature ## Testing `cargo build -p bevy_ui` --- crates/bevy_ui/src/focus.rs | 29 +++++++++++++++++++++++---- crates/bevy_ui/src/picking_backend.rs | 26 +----------------------- crates/bevy_ui/src/widget/viewport.rs | 18 +++++++++++++---- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/crates/bevy_ui/src/focus.rs b/crates/bevy_ui/src/focus.rs index f55cbb92b8..549d26a262 100644 --- a/crates/bevy_ui/src/focus.rs +++ b/crates/bevy_ui/src/focus.rs @@ -1,7 +1,4 @@ -use crate::{ - picking_backend::clip_check_recursive, ui_transform::UiGlobalTransform, ComputedNode, - ComputedNodeTarget, Node, UiStack, -}; +use crate::{ui_transform::UiGlobalTransform, ComputedNode, ComputedNodeTarget, Node, UiStack}; use bevy_ecs::{ change_detection::DetectChangesMut, entity::{ContainsEntity, Entity}, @@ -322,3 +319,27 @@ pub fn ui_focus_system( } } } + +/// Walk up the tree child-to-parent checking that `point` is not clipped by any ancestor node. +pub fn clip_check_recursive( + point: Vec2, + entity: Entity, + clipping_query: &Query<'_, '_, (&ComputedNode, &UiGlobalTransform, &Node)>, + child_of_query: &Query<&ChildOf>, +) -> bool { + if let Ok(child_of) = child_of_query.get(entity) { + let parent = child_of.0; + if let Ok((computed_node, transform, node)) = clipping_query.get(parent) { + if !computed_node + .resolve_clip_rect(node.overflow, node.overflow_clip_margin) + .contains(transform.inverse().transform_point2(point)) + { + // The point is clipped and should be ignored by picking + return false; + } + } + return clip_check_recursive(point, parent, clipping_query, child_of_query); + } + // Reached root, point unclipped by all ancestors + true +} diff --git a/crates/bevy_ui/src/picking_backend.rs b/crates/bevy_ui/src/picking_backend.rs index 5647baee12..5ca59ceeaf 100644 --- a/crates/bevy_ui/src/picking_backend.rs +++ b/crates/bevy_ui/src/picking_backend.rs @@ -24,7 +24,7 @@ #![deny(missing_docs)] -use crate::{prelude::*, ui_transform::UiGlobalTransform, UiStack}; +use crate::{clip_check_recursive, prelude::*, ui_transform::UiGlobalTransform, UiStack}; use bevy_app::prelude::*; use bevy_ecs::{prelude::*, query::QueryData}; use bevy_math::Vec2; @@ -252,27 +252,3 @@ pub fn ui_picking( output.write(PointerHits::new(*pointer, picks, order)); } } - -/// Walk up the tree child-to-parent checking that `point` is not clipped by any ancestor node. -pub fn clip_check_recursive( - point: Vec2, - entity: Entity, - clipping_query: &Query<'_, '_, (&ComputedNode, &UiGlobalTransform, &Node)>, - child_of_query: &Query<&ChildOf>, -) -> bool { - if let Ok(child_of) = child_of_query.get(entity) { - let parent = child_of.0; - if let Ok((computed_node, transform, node)) = clipping_query.get(parent) { - if !computed_node - .resolve_clip_rect(node.overflow, node.overflow_clip_margin) - .contains(transform.inverse().transform_point2(point)) - { - // The point is clipped and should be ignored by picking - return false; - } - } - return clip_check_recursive(point, parent, clipping_query, child_of_query); - } - // Reached root, point unclipped by all ancestors - true -} diff --git a/crates/bevy_ui/src/widget/viewport.rs b/crates/bevy_ui/src/widget/viewport.rs index fe5b6eeb6d..120c3335c2 100644 --- a/crates/bevy_ui/src/widget/viewport.rs +++ b/crates/bevy_ui/src/widget/viewport.rs @@ -2,22 +2,32 @@ use bevy_asset::Assets; use bevy_ecs::{ component::Component, entity::Entity, - event::EventReader, query::{Changed, Or}, reflect::ReflectComponent, - system::{Commands, Query, Res, ResMut}, + system::{Query, ResMut}, +}; +#[cfg(feature = "bevy_ui_picking_backend")] +use bevy_ecs::{ + event::EventReader, + system::{Commands, Res}, }; use bevy_image::{Image, ToExtents}; -use bevy_math::{Rect, UVec2}; +#[cfg(feature = "bevy_ui_picking_backend")] +use bevy_math::Rect; +use bevy_math::UVec2; #[cfg(feature = "bevy_ui_picking_backend")] use bevy_picking::{ events::PointerState, hover::HoverMap, pointer::{Location, PointerId, PointerInput, PointerLocation}, }; +#[cfg(feature = "bevy_ui_picking_backend")] use bevy_platform::collections::HashMap; use bevy_reflect::Reflect; -use bevy_render::camera::{Camera, NormalizedRenderTarget}; +use bevy_render::camera::Camera; +#[cfg(feature = "bevy_ui_picking_backend")] +use bevy_render::camera::NormalizedRenderTarget; +#[cfg(feature = "bevy_ui_picking_backend")] use bevy_transform::components::GlobalTransform; #[cfg(feature = "bevy_ui_picking_backend")] use uuid::Uuid; From 1fe559730ce05184c926160f044ad53c77b28c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sun, 29 Jun 2025 19:12:33 +0200 Subject: [PATCH 13/68] bevy_ecs: remove use of needless_return (#19859) # Objective - bevy_ecs has a expected lint that is both needed and unneeded ## Solution - Change the logic so that it's always not needed ## Testing `cargo clippy -p bevy_ecs --no-default-features --no-deps -- -D warnings` --- crates/bevy_ecs/src/storage/resource.rs | 39 ++++++++++--------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/crates/bevy_ecs/src/storage/resource.rs b/crates/bevy_ecs/src/storage/resource.rs index 29752ae2e5..1a90cc511c 100644 --- a/crates/bevy_ecs/src/storage/resource.rs +++ b/crates/bevy_ecs/src/storage/resource.rs @@ -64,32 +64,23 @@ impl ResourceData { /// If `SEND` is false, this will panic if called from a different thread than the one it was inserted from. #[inline] fn validate_access(&self) { - if SEND { - #[cfg_attr( - not(feature = "std"), - expect( - clippy::needless_return, - reason = "needless until no_std is addressed (see below)", - ) - )] - return; - } + if !SEND { + #[cfg(feature = "std")] + if self.origin_thread_id != Some(std::thread::current().id()) { + // Panic in tests, as testing for aborting is nearly impossible + panic!( + "Attempted to access or drop non-send resource {} from thread {:?} on a thread {:?}. This is not allowed. Aborting.", + self.type_name, + self.origin_thread_id, + std::thread::current().id() + ); + } - #[cfg(feature = "std")] - if self.origin_thread_id != Some(std::thread::current().id()) { - // Panic in tests, as testing for aborting is nearly impossible - panic!( - "Attempted to access or drop non-send resource {} from thread {:?} on a thread {:?}. This is not allowed. Aborting.", - self.type_name, - self.origin_thread_id, - std::thread::current().id() - ); + // TODO: Handle no_std non-send. + // Currently, no_std is single-threaded only, so this is safe to ignore. + // To support no_std multithreading, an alternative will be required. + // Remove the #[expect] attribute above when this is addressed. } - - // TODO: Handle no_std non-send. - // Currently, no_std is single-threaded only, so this is safe to ignore. - // To support no_std multithreading, an alternative will be required. - // Remove the #[expect] attribute above when this is addressed. } /// Returns true if the resource is populated. From 5f497efe90273c1964d9c8723267e51470c22015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sun, 29 Jun 2025 19:12:57 +0200 Subject: [PATCH 14/68] bevy_platform: clippy without default features (#19860) # Objective - bevy_platform has clippy warnings when building without default features ## Solution - Fix them ## Testing `cargo clippy -p bevy_platform --no-default-features --no-deps -- -D warnings` --- crates/bevy_platform/src/thread.rs | 2 +- crates/bevy_platform/src/time/fallback.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/bevy_platform/src/thread.rs b/crates/bevy_platform/src/thread.rs index 6e4650382e..7fc7413bc6 100644 --- a/crates/bevy_platform/src/thread.rs +++ b/crates/bevy_platform/src/thread.rs @@ -21,7 +21,7 @@ crate::cfg::switch! { let start = Instant::now(); while start.elapsed() < dur { - spin_loop() + spin_loop(); } } } diff --git a/crates/bevy_platform/src/time/fallback.rs b/crates/bevy_platform/src/time/fallback.rs index c649f6a49d..2964c9d980 100644 --- a/crates/bevy_platform/src/time/fallback.rs +++ b/crates/bevy_platform/src/time/fallback.rs @@ -155,14 +155,14 @@ fn unset_getter() -> Duration { let nanos = unsafe { core::arch::x86::_rdtsc() }; - return Duration::from_nanos(nanos); + Duration::from_nanos(nanos) } #[cfg(target_arch = "x86_64")] => { // SAFETY: standard technique for getting a nanosecond counter on x86_64 let nanos = unsafe { core::arch::x86_64::_rdtsc() }; - return Duration::from_nanos(nanos); + Duration::from_nanos(nanos) } #[cfg(target_arch = "aarch64")] => { // SAFETY: standard technique for getting a nanosecond counter of aarch64 @@ -171,7 +171,7 @@ fn unset_getter() -> Duration { core::arch::asm!("mrs {}, cntvct_el0", out(reg) ticks); ticks }; - return Duration::from_nanos(nanos); + Duration::from_nanos(nanos) } _ => { panic!("An elapsed time getter has not been provided to `Instant`. Please use `Instant::set_elapsed(...)` before calling `Instant::now()`") From c077c65ddd3e4c94be8d43d179ad3338f254dacd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sun, 29 Jun 2025 19:13:27 +0200 Subject: [PATCH 15/68] bevy_utils: clippy without debug feature enabled (#19861) # Objective - bevy_utils has warnings with clippy ## Solution - Fix them ## Testing `cargo clippy -p bevy_utils --no-deps -- -D warnings` --- crates/bevy_utils/src/debug_info.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/crates/bevy_utils/src/debug_info.rs b/crates/bevy_utils/src/debug_info.rs index 84232c9d3d..c50917d279 100644 --- a/crates/bevy_utils/src/debug_info.rs +++ b/crates/bevy_utils/src/debug_info.rs @@ -7,7 +7,7 @@ use core::any::type_name; use disqualified::ShortName; #[cfg(not(feature = "debug"))] -const FEATURE_DISABLED: &'static str = "Enable the debug feature to see the name"; +const FEATURE_DISABLED: &str = "Enable the debug feature to see the name"; /// Wrapper to help debugging ECS issues. This is used to display the names of systems, components, ... /// @@ -36,7 +36,13 @@ impl DebugName { /// Create a new `DebugName` from a `&str` /// /// The value will be ignored if the `debug` feature is not enabled - #[cfg_attr(not(feature = "debug"), expect(unused_variables))] + #[cfg_attr( + not(feature = "debug"), + expect( + unused_variables, + reason = "The value will be ignored if the `debug` feature is not enabled" + ) + )] pub fn borrowed(value: &'static str) -> Self { DebugName { #[cfg(feature = "debug")] @@ -48,7 +54,13 @@ impl DebugName { /// Create a new `DebugName` from a `String` /// /// The value will be ignored if the `debug` feature is not enabled - #[cfg_attr(not(feature = "debug"), expect(unused_variables))] + #[cfg_attr( + not(feature = "debug"), + expect( + unused_variables, + reason = "The value will be ignored if the `debug` feature is not enabled" + ) + )] pub fn owned(value: String) -> Self { DebugName { #[cfg(feature = "debug")] @@ -88,7 +100,13 @@ impl DebugName { cfg::alloc! { impl From> for DebugName { - #[cfg_attr(not(feature = "debug"), expect(unused_variables))] + #[cfg_attr( + not(feature = "debug"), + expect( + unused_variables, + reason = "The value will be ignored if the `debug` feature is not enabled" + ) + )] fn from(value: Cow<'static, str>) -> Self { Self { #[cfg(feature = "debug")] From e6e731017d42b7f31d6b36518e60dce81bc3a493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sun, 29 Jun 2025 19:13:43 +0200 Subject: [PATCH 16/68] bevy_input: build warnings without bevy_reflect (#19862) # Objective - bevy_input has build warnings when bevy_reflect isn't enabled ## Solution - Fix them ## Testing `cargo build -p bevy_input --no-default-features --features bevy_math/libm` --- crates/bevy_input/src/lib.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/bevy_input/src/lib.rs b/crates/bevy_input/src/lib.rs index 5a6a177223..77cbe96822 100644 --- a/crates/bevy_input/src/lib.rs +++ b/crates/bevy_input/src/lib.rs @@ -60,12 +60,13 @@ use touch::{touch_screen_input_system, TouchInput, Touches}; #[cfg(feature = "bevy_reflect")] use gamepad::Gamepad; use gamepad::{ - gamepad_connection_system, gamepad_event_processing_system, GamepadAxis, - GamepadAxisChangedEvent, GamepadButton, GamepadButtonChangedEvent, - GamepadButtonStateChangedEvent, GamepadConnection, GamepadConnectionEvent, GamepadEvent, - GamepadInput, GamepadRumbleRequest, GamepadSettings, RawGamepadAxisChangedEvent, - RawGamepadButtonChangedEvent, RawGamepadEvent, + gamepad_connection_system, gamepad_event_processing_system, GamepadAxisChangedEvent, + GamepadButtonChangedEvent, GamepadButtonStateChangedEvent, GamepadConnectionEvent, + GamepadEvent, GamepadRumbleRequest, RawGamepadAxisChangedEvent, RawGamepadButtonChangedEvent, + RawGamepadEvent, }; +#[cfg(feature = "bevy_reflect")] +use gamepad::{GamepadAxis, GamepadButton, GamepadConnection, GamepadInput, GamepadSettings}; #[cfg(all(feature = "serialize", feature = "bevy_reflect"))] use bevy_reflect::{ReflectDeserialize, ReflectSerialize}; From e9daac4f11b4652df03decaffb68d34cbaea8422 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Sun, 29 Jun 2025 18:37:04 +0100 Subject: [PATCH 17/68] Move `TextShadow` to `text` widget module (#19579) # Objective It's odd that `TextShadow` is accessible by importing `bevy::ui::*` but `Text` isn't. Move the `TextShadow` component to `text` widget module and move its type registration to the `build_text_interop` function. --- crates/bevy_ui/src/lib.rs | 8 +++---- crates/bevy_ui/src/render/mod.rs | 4 ++-- crates/bevy_ui/src/ui_node.rs | 22 ------------------- crates/bevy_ui/src/widget/text.rs | 22 +++++++++++++++++++ ...xtshadow_is_moved_to_widget_text_module.md | 6 +++++ 5 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 release-content/migration-guides/textshadow_is_moved_to_widget_text_module.md diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index 47d396b201..03c7cc5239 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -60,7 +60,7 @@ pub mod prelude { #[cfg(feature = "bevy_ui_debug")] pub use crate::render::UiDebugOptions; #[doc(hidden)] - pub use crate::widget::{Text, TextUiReader, TextUiWriter}; + pub use crate::widget::{Text, TextShadow, TextUiReader, TextUiWriter}; #[doc(hidden)] pub use { crate::{ @@ -184,7 +184,6 @@ impl Plugin for UiPlugin { .register_type::() .register_type::() .register_type::() - .register_type::() .register_type::() .register_type::() .register_type::() @@ -284,11 +283,12 @@ impl Plugin for UiPlugin { fn build_text_interop(app: &mut App) { use crate::widget::TextNodeFlags; use bevy_text::TextLayoutInfo; - use widget::Text; + use widget::{Text, TextShadow}; app.register_type::() .register_type::() - .register_type::(); + .register_type::() + .register_type::(); app.add_systems( PostUpdate, diff --git a/crates/bevy_ui/src/render/mod.rs b/crates/bevy_ui/src/render/mod.rs index 61319eda9b..b3d0117801 100644 --- a/crates/bevy_ui/src/render/mod.rs +++ b/crates/bevy_ui/src/render/mod.rs @@ -9,11 +9,11 @@ mod debug_overlay; mod gradient; use crate::prelude::UiGlobalTransform; -use crate::widget::{ImageNode, ViewportNode}; +use crate::widget::{ImageNode, TextShadow, ViewportNode}; use crate::{ BackgroundColor, BorderColor, BoxShadowSamples, CalculatedClip, ComputedNode, - ComputedNodeTarget, Outline, ResolvedBorderRadius, TextShadow, UiAntiAlias, + ComputedNodeTarget, Outline, ResolvedBorderRadius, UiAntiAlias, }; use bevy_app::prelude::*; use bevy_asset::{AssetEvent, AssetId, Assets}; diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index a3b03238f8..09ae4bf56e 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -2881,28 +2881,6 @@ impl ComputedNodeTarget { } } -/// Adds a shadow behind text -/// -/// Not supported by `Text2d` -#[derive(Component, Copy, Clone, Debug, PartialEq, Reflect)] -#[reflect(Component, Default, Debug, Clone, PartialEq)] -pub struct TextShadow { - /// Shadow displacement in logical pixels - /// With a value of zero the shadow will be hidden directly behind the text - pub offset: Vec2, - /// Color of the shadow - pub color: Color, -} - -impl Default for TextShadow { - fn default() -> Self { - Self { - offset: Vec2::splat(4.), - color: Color::linear_rgba(0., 0., 0., 0.75), - } - } -} - #[cfg(test)] mod tests { use crate::GridPlacement; diff --git a/crates/bevy_ui/src/widget/text.rs b/crates/bevy_ui/src/widget/text.rs index d7f8e243a4..1544a5ff7a 100644 --- a/crates/bevy_ui/src/widget/text.rs +++ b/crates/bevy_ui/src/widget/text.rs @@ -128,6 +128,28 @@ impl From for Text { } } +/// Adds a shadow behind text +/// +/// Not supported by `Text2d` +#[derive(Component, Copy, Clone, Debug, PartialEq, Reflect)] +#[reflect(Component, Default, Debug, Clone, PartialEq)] +pub struct TextShadow { + /// Shadow displacement in logical pixels + /// With a value of zero the shadow will be hidden directly behind the text + pub offset: Vec2, + /// Color of the shadow + pub color: Color, +} + +impl Default for TextShadow { + fn default() -> Self { + Self { + offset: Vec2::splat(4.), + color: Color::linear_rgba(0., 0., 0., 0.75), + } + } +} + /// UI alias for [`TextReader`]. pub type TextUiReader<'w, 's> = TextReader<'w, 's, Text>; diff --git a/release-content/migration-guides/textshadow_is_moved_to_widget_text_module.md b/release-content/migration-guides/textshadow_is_moved_to_widget_text_module.md new file mode 100644 index 0000000000..4e23abc36b --- /dev/null +++ b/release-content/migration-guides/textshadow_is_moved_to_widget_text_module.md @@ -0,0 +1,6 @@ +--- +title: `TextShadow` has been moved to `bevy::ui::widget::text` +pull_requests: [] +--- + +`TextShadow` has been moved to `bevy::ui::widget::text`. From 8d70649e7d52359f078b8ff12604a2fd1d3da691 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Sun, 29 Jun 2025 18:41:41 +0100 Subject: [PATCH 18/68] `core_widgets` example slider fix (#19810) # Objective When dragging the slider thumb the thumb is only highlighted while the pointer is hovering the widget. If the pointer moves off the widget during a drag the thumb reverts to its normal unhovered colour. ## Solution Query for `CoreSliderDragState` in the slider update systems and set the lighter color if the thumb is dragged or hovered. --- examples/ui/core_widgets.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/examples/ui/core_widgets.rs b/examples/ui/core_widgets.rs index ca91605206..7bf1e99966 100644 --- a/examples/ui/core_widgets.rs +++ b/examples/ui/core_widgets.rs @@ -3,8 +3,8 @@ use bevy::{ color::palettes::basic::*, core_widgets::{ - CoreButton, CoreCheckbox, CoreRadio, CoreRadioGroup, CoreSlider, CoreSliderThumb, - CoreWidgetsPlugin, SliderRange, SliderValue, TrackClick, + CoreButton, CoreCheckbox, CoreRadio, CoreRadioGroup, CoreSlider, CoreSliderDragState, + CoreSliderThumb, CoreWidgetsPlugin, SliderRange, SliderValue, TrackClick, }, ecs::system::SystemId, input_focus::{ @@ -398,6 +398,7 @@ fn update_slider_style( &SliderValue, &SliderRange, &Hovered, + &CoreSliderDragState, Has, ), ( @@ -405,6 +406,7 @@ fn update_slider_style( Changed, Changed, Changed, + Changed, Added, )>, With, @@ -413,12 +415,12 @@ fn update_slider_style( children: Query<&Children>, mut thumbs: Query<(&mut Node, &mut BackgroundColor, Has), Without>, ) { - for (slider_ent, value, range, hovered, disabled) in sliders.iter() { + for (slider_ent, value, range, hovered, drag_state, disabled) in sliders.iter() { for child in children.iter_descendants(slider_ent) { if let Ok((mut thumb_node, mut thumb_bg, is_thumb)) = thumbs.get_mut(child) { if is_thumb { thumb_node.left = Val::Percent(range.thumb_position(value.0) * 100.0); - thumb_bg.0 = thumb_color(disabled, hovered.0); + thumb_bg.0 = thumb_color(disabled, hovered.0 | drag_state.dragging); } } } @@ -426,17 +428,25 @@ fn update_slider_style( } fn update_slider_style2( - sliders: Query<(Entity, &Hovered, Has), With>, + sliders: Query< + ( + Entity, + &Hovered, + &CoreSliderDragState, + Has, + ), + With, + >, children: Query<&Children>, mut thumbs: Query<(&mut BackgroundColor, Has), Without>, mut removed_disabled: RemovedComponents, ) { removed_disabled.read().for_each(|entity| { - if let Ok((slider_ent, hovered, disabled)) = sliders.get(entity) { + if let Ok((slider_ent, hovered, drag_state, disabled)) = sliders.get(entity) { for child in children.iter_descendants(slider_ent) { if let Ok((mut thumb_bg, is_thumb)) = thumbs.get_mut(child) { if is_thumb { - thumb_bg.0 = thumb_color(disabled, hovered.0); + thumb_bg.0 = thumb_color(disabled, hovered.0 | drag_state.dragging); } } } From 37aae001206ed48d80c1fb3a454e7cb1fed2251a Mon Sep 17 00:00:00 2001 From: IceSentry Date: Sun, 29 Jun 2025 14:14:10 -0400 Subject: [PATCH 19/68] Add RenderStartup schedule to the RenderApp (#19841) # Objective - We sometimes want to spawn things on startup that only exist in the RenderApp but right now there's no equivalent to the Startup schedule on the RenderApp so we need to do all of that in the plugin build/finish code ## Solution - Add a RenderStartup schedule that runs on the RenderApp after the plugins are initialized ## Testing - I ported the custom_post_processing example to use this new schedule and things worked as expected. I will push the change in a follow up PR --- crates/bevy_render/src/lib.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 8bf7f41195..526d75dccd 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -217,10 +217,30 @@ pub enum RenderSystems { PostCleanup, } +/// The schedule that contains the app logic that is evaluated each tick +/// +/// This is highly inspired by [`bevy_app::Main`] +#[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash, Default)] +pub struct MainRender; +impl MainRender { + pub fn run(world: &mut World, mut run_at_least_once: Local) { + if !*run_at_least_once { + let _ = world.try_run_schedule(RenderStartup); + *run_at_least_once = true; + } + + let _ = world.try_run_schedule(Render); + } +} + /// Deprecated alias for [`RenderSystems`]. #[deprecated(since = "0.17.0", note = "Renamed to `RenderSystems`.")] pub type RenderSet = RenderSystems; +/// The startup schedule of the [`RenderApp`] +#[derive(ScheduleLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] +pub struct RenderStartup; + /// The main render schedule. #[derive(ScheduleLabel, Debug, Hash, PartialEq, Eq, Clone, Default)] pub struct Render; @@ -531,7 +551,7 @@ unsafe fn initialize_render_app(app: &mut App) { app.init_resource::(); let mut render_app = SubApp::new(); - render_app.update_schedule = Some(Render.intern()); + render_app.update_schedule = Some(MainRender.intern()); let mut extract_schedule = Schedule::new(ExtractSchedule); // We skip applying any commands during the ExtractSchedule @@ -546,6 +566,7 @@ unsafe fn initialize_render_app(app: &mut App) { .add_schedule(extract_schedule) .add_schedule(Render::base_schedule()) .init_resource::() + .add_systems(MainRender, MainRender::run) .insert_resource(app.world().resource::().clone()) .add_systems(ExtractSchedule, PipelineCache::extract_shaders) .add_systems( From ec1916a24008d5d931761affb16c09b972bbf7d3 Mon Sep 17 00:00:00 2001 From: atlv Date: Sun, 29 Jun 2025 14:19:05 -0400 Subject: [PATCH 20/68] Dds transcode channel order fix (#19849) # Objective - Fix bug in dds channel order transcode - taken from #18411 ## Solution - fix it - improve docs a bit ## Testing - example in linked pr --- crates/bevy_image/src/dds.rs | 4 ++-- crates/bevy_image/src/image.rs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/bevy_image/src/dds.rs b/crates/bevy_image/src/dds.rs index 8dc58ad482..28bf637333 100644 --- a/crates/bevy_image/src/dds.rs +++ b/crates/bevy_image/src/dds.rs @@ -23,9 +23,9 @@ pub fn dds_buffer_to_image( Ok(format) => (format, None), Err(TextureError::FormatRequiresTranscodingError(TranscodeFormat::Rgb8)) => { let format = if is_srgb { - TextureFormat::Bgra8UnormSrgb + TextureFormat::Rgba8UnormSrgb } else { - TextureFormat::Bgra8Unorm + TextureFormat::Rgba8Unorm }; (format, Some(TranscodeFormat::Rgb8)) } diff --git a/crates/bevy_image/src/image.rs b/crates/bevy_image/src/image.rs index b6da5c5333..195debc1d4 100644 --- a/crates/bevy_image/src/image.rs +++ b/crates/bevy_image/src/image.rs @@ -1558,11 +1558,11 @@ pub enum DataFormat { pub enum TranscodeFormat { Etc1s, Uastc(DataFormat), - // Has to be transcoded to R8Unorm for use with `wgpu`. + /// Has to be transcoded from `R8UnormSrgb` to `R8Unorm` for use with `wgpu`. R8UnormSrgb, - // Has to be transcoded to R8G8Unorm for use with `wgpu`. + /// Has to be transcoded from `Rg8UnormSrgb` to `R8G8Unorm` for use with `wgpu`. Rg8UnormSrgb, - // Has to be transcoded to Rgba8 for use with `wgpu`. + /// Has to be transcoded from `Rgb8` to `Rgba8` for use with `wgpu`. Rgb8, } From 56710df934406797b1f19becf9cdbb70887dbfb4 Mon Sep 17 00:00:00 2001 From: JMS55 <47158642+JMS55@users.noreply.github.com> Date: Sun, 29 Jun 2025 12:01:32 -0700 Subject: [PATCH 21/68] bevy_solari ReSTIR DI (#19790) # Objective - Add temporal and spatial resampling to bevy_solari. # Showcase ReSTIR: ![image](https://github.com/user-attachments/assets/9b563713-d0cb-4f33-b402-dfa5a13ef3e2) Previous RIS: ![455750793-b70b968d-9c73-4983-9b6b-b60cace9b47a](https://github.com/user-attachments/assets/e62c852b-1f2c-4e86-ab35-a8058e9339d6) --- crates/bevy_core_pipeline/src/core_3d/mod.rs | 6 +- .../src/skybox/skybox_prepass.wgsl | 3 + crates/bevy_solari/src/realtime/node.rs | 50 +++++++- crates/bevy_solari/src/realtime/prepare.rs | 35 +++++- .../bevy_solari/src/realtime/reservoir.wgsl | 62 +++++++++- .../bevy_solari/src/realtime/restir_di.wgsl | 114 ++++++++++++++++-- crates/bevy_solari/src/scene/binder.rs | 45 ++++++- .../src/scene/raytracing_scene_bindings.wgsl | 3 + crates/bevy_solari/src/scene/sampling.wgsl | 24 +++- release-content/release-notes/bevy_solari.md | 4 +- 10 files changed, 320 insertions(+), 26 deletions(-) diff --git a/crates/bevy_core_pipeline/src/core_3d/mod.rs b/crates/bevy_core_pipeline/src/core_3d/mod.rs index 6fcccd3a72..2fc7e80a5e 100644 --- a/crates/bevy_core_pipeline/src/core_3d/mod.rs +++ b/crates/bevy_core_pipeline/src/core_3d/mod.rs @@ -1026,7 +1026,8 @@ pub fn prepare_prepass_textures( format: CORE_3D_DEPTH_FORMAT, usage: TextureUsages::COPY_DST | TextureUsages::RENDER_ATTACHMENT - | TextureUsages::TEXTURE_BINDING, + | TextureUsages::TEXTURE_BINDING + | TextureUsages::COPY_SRC, // TODO: Remove COPY_SRC, double buffer instead (for bevy_solari) view_formats: &[], }; texture_cache.get(&render_device, descriptor) @@ -1092,7 +1093,8 @@ pub fn prepare_prepass_textures( dimension: TextureDimension::D2, format: DEFERRED_PREPASS_FORMAT, usage: TextureUsages::RENDER_ATTACHMENT - | TextureUsages::TEXTURE_BINDING, + | TextureUsages::TEXTURE_BINDING + | TextureUsages::COPY_SRC, // TODO: Remove COPY_SRC, double buffer instead (for bevy_solari) view_formats: &[], }, ) diff --git a/crates/bevy_core_pipeline/src/skybox/skybox_prepass.wgsl b/crates/bevy_core_pipeline/src/skybox/skybox_prepass.wgsl index 1ef8156fe3..e4ecb4703c 100644 --- a/crates/bevy_core_pipeline/src/skybox/skybox_prepass.wgsl +++ b/crates/bevy_core_pipeline/src/skybox/skybox_prepass.wgsl @@ -5,6 +5,9 @@ struct PreviousViewUniforms { view_from_world: mat4x4, clip_from_world: mat4x4, + clip_from_view: mat4x4, + world_from_clip: mat4x4, + view_from_clip: mat4x4, } @group(0) @binding(0) var view: View; diff --git a/crates/bevy_solari/src/realtime/node.rs b/crates/bevy_solari/src/realtime/node.rs index 6060bb3c15..8fb97f84b2 100644 --- a/crates/bevy_solari/src/realtime/node.rs +++ b/crates/bevy_solari/src/realtime/node.rs @@ -1,12 +1,15 @@ use super::{prepare::SolariLightingResources, SolariLighting}; use crate::scene::RaytracingSceneBindings; use bevy_asset::load_embedded_asset; -use bevy_core_pipeline::prepass::ViewPrepassTextures; +use bevy_core_pipeline::prepass::{ + PreviousViewData, PreviousViewUniformOffset, PreviousViewUniforms, ViewPrepassTextures, +}; use bevy_diagnostic::FrameCount; use bevy_ecs::{ query::QueryItem, world::{FromWorld, World}, }; +use bevy_image::ToExtents; use bevy_render::{ camera::ExtractedCamera, diagnostic::RecordDiagnostics, @@ -44,6 +47,7 @@ impl ViewNode for SolariLightingNode { &'static ViewTarget, &'static ViewPrepassTextures, &'static ViewUniformOffset, + &'static PreviousViewUniformOffset, ); fn run( @@ -57,12 +61,14 @@ impl ViewNode for SolariLightingNode { view_target, view_prepass_textures, view_uniform_offset, + previous_view_uniform_offset, ): QueryItem, world: &World, ) -> Result<(), NodeRunError> { let pipeline_cache = world.resource::(); let scene_bindings = world.resource::(); let view_uniforms = world.resource::(); + let previous_view_uniforms = world.resource::(); let frame_count = world.resource::(); let ( Some(initial_and_temporal_pipeline), @@ -73,6 +79,7 @@ impl ViewNode for SolariLightingNode { Some(depth_buffer), Some(motion_vectors), Some(view_uniforms), + Some(previous_view_uniforms), ) = ( pipeline_cache.get_compute_pipeline(self.initial_and_temporal_pipeline), pipeline_cache.get_compute_pipeline(self.spatial_and_shade_pipeline), @@ -82,6 +89,7 @@ impl ViewNode for SolariLightingNode { view_prepass_textures.depth_view(), view_prepass_textures.motion_vectors_view(), view_uniforms.uniforms.binding(), + previous_view_uniforms.uniforms.binding(), ) else { return Ok(()); @@ -97,7 +105,10 @@ impl ViewNode for SolariLightingNode { gbuffer, depth_buffer, motion_vectors, + &solari_lighting_resources.previous_gbuffer.1, + &solari_lighting_resources.previous_depth.1, view_uniforms, + previous_view_uniforms, )), ); @@ -114,7 +125,14 @@ impl ViewNode for SolariLightingNode { let pass_span = diagnostics.pass_span(&mut pass, "solari_lighting"); pass.set_bind_group(0, scene_bindings, &[]); - pass.set_bind_group(1, &bind_group, &[view_uniform_offset.offset]); + pass.set_bind_group( + 1, + &bind_group, + &[ + view_uniform_offset.offset, + previous_view_uniform_offset.offset, + ], + ); pass.set_pipeline(initial_and_temporal_pipeline); pass.set_push_constants( @@ -127,6 +145,31 @@ impl ViewNode for SolariLightingNode { pass.dispatch_workgroups(viewport.x.div_ceil(8), viewport.y.div_ceil(8), 1); pass_span.end(&mut pass); + drop(pass); + + // TODO: Remove these copies, and double buffer instead + command_encoder.copy_texture_to_texture( + view_prepass_textures + .deferred + .clone() + .unwrap() + .texture + .texture + .as_image_copy(), + solari_lighting_resources.previous_gbuffer.0.as_image_copy(), + viewport.to_extents(), + ); + command_encoder.copy_texture_to_texture( + view_prepass_textures + .depth + .clone() + .unwrap() + .texture + .texture + .as_image_copy(), + solari_lighting_resources.previous_depth.0.as_image_copy(), + viewport.to_extents(), + ); Ok(()) } @@ -152,7 +195,10 @@ impl FromWorld for SolariLightingNode { texture_2d(TextureSampleType::Uint), texture_depth_2d(), texture_2d(TextureSampleType::Float { filterable: true }), + texture_2d(TextureSampleType::Uint), + texture_depth_2d(), uniform_buffer::(true), + uniform_buffer::(true), ), ), ); diff --git a/crates/bevy_solari/src/realtime/prepare.rs b/crates/bevy_solari/src/realtime/prepare.rs index 4f153bf0dc..992a75c451 100644 --- a/crates/bevy_solari/src/realtime/prepare.rs +++ b/crates/bevy_solari/src/realtime/prepare.rs @@ -1,14 +1,19 @@ use super::SolariLighting; +use bevy_core_pipeline::{core_3d::CORE_3D_DEPTH_FORMAT, deferred::DEFERRED_PREPASS_FORMAT}; use bevy_ecs::{ component::Component, entity::Entity, query::With, system::{Commands, Query, Res}, }; +use bevy_image::ToExtents; use bevy_math::UVec2; use bevy_render::{ camera::ExtractedCamera, - render_resource::{Buffer, BufferDescriptor, BufferUsages}, + render_resource::{ + Buffer, BufferDescriptor, BufferUsages, Texture, TextureDescriptor, TextureDimension, + TextureUsages, TextureView, TextureViewDescriptor, + }, renderer::RenderDevice, }; @@ -20,6 +25,8 @@ const RESERVOIR_STRUCT_SIZE: u64 = 32; pub struct SolariLightingResources { pub reservoirs_a: Buffer, pub reservoirs_b: Buffer, + pub previous_gbuffer: (Texture, TextureView), + pub previous_depth: (Texture, TextureView), pub view_size: UVec2, } @@ -56,9 +63,35 @@ pub fn prepare_solari_lighting_resources( mapped_at_creation: false, }); + let previous_gbuffer = render_device.create_texture(&TextureDescriptor { + label: Some("solari_lighting_previous_gbuffer"), + size: view_size.to_extents(), + mip_level_count: 1, + sample_count: 1, + dimension: TextureDimension::D2, + format: DEFERRED_PREPASS_FORMAT, + usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST, + view_formats: &[], + }); + let previous_gbuffer_view = previous_gbuffer.create_view(&TextureViewDescriptor::default()); + + let previous_depth = render_device.create_texture(&TextureDescriptor { + label: Some("solari_lighting_previous_depth"), + size: view_size.to_extents(), + mip_level_count: 1, + sample_count: 1, + dimension: TextureDimension::D2, + format: CORE_3D_DEPTH_FORMAT, + usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST, + view_formats: &[], + }); + let previous_depth_view = previous_depth.create_view(&TextureViewDescriptor::default()); + commands.entity(entity).insert(SolariLightingResources { reservoirs_a, reservoirs_b, + previous_gbuffer: (previous_gbuffer, previous_gbuffer_view), + previous_depth: (previous_depth, previous_depth_view), view_size, }); } diff --git a/crates/bevy_solari/src/realtime/reservoir.wgsl b/crates/bevy_solari/src/realtime/reservoir.wgsl index 08a7e26f7c..16887667a5 100644 --- a/crates/bevy_solari/src/realtime/reservoir.wgsl +++ b/crates/bevy_solari/src/realtime/reservoir.wgsl @@ -2,7 +2,9 @@ #define_import_path bevy_solari::reservoir -#import bevy_solari::sampling::LightSample +#import bevy_core_pipeline::tonemapping::tonemapping_luminance as luminance +#import bevy_pbr::utils::rand_f +#import bevy_solari::sampling::{LightSample, calculate_light_contribution} const NULL_RESERVOIR_SAMPLE = 0xFFFFFFFFu; @@ -12,7 +14,7 @@ struct Reservoir { weight_sum: f32, confidence_weight: f32, unbiased_contribution_weight: f32, - _padding: f32, + visibility: f32, } fn empty_reservoir() -> Reservoir { @@ -28,3 +30,59 @@ fn empty_reservoir() -> Reservoir { fn reservoir_valid(reservoir: Reservoir) -> bool { return reservoir.sample.light_id.x != NULL_RESERVOIR_SAMPLE; } + +struct ReservoirMergeResult { + merged_reservoir: Reservoir, + selected_sample_radiance: vec3, +} + +fn merge_reservoirs( + canonical_reservoir: Reservoir, + other_reservoir: Reservoir, + world_position: vec3, + world_normal: vec3, + diffuse_brdf: vec3, + rng: ptr, +) -> ReservoirMergeResult { + // TODO: Balance heuristic MIS weights + let mis_weight_denominator = 1.0 / (canonical_reservoir.confidence_weight + other_reservoir.confidence_weight); + + let canonical_mis_weight = canonical_reservoir.confidence_weight * mis_weight_denominator; + let canonical_target_function = reservoir_target_function(canonical_reservoir, world_position, world_normal, diffuse_brdf); + let canonical_resampling_weight = canonical_mis_weight * (canonical_target_function.a * canonical_reservoir.unbiased_contribution_weight); + + let other_mis_weight = other_reservoir.confidence_weight * mis_weight_denominator; + let other_target_function = reservoir_target_function(other_reservoir, world_position, world_normal, diffuse_brdf); + let other_resampling_weight = other_mis_weight * (other_target_function.a * other_reservoir.unbiased_contribution_weight); + + var combined_reservoir = empty_reservoir(); + combined_reservoir.weight_sum = canonical_resampling_weight + other_resampling_weight; + combined_reservoir.confidence_weight = canonical_reservoir.confidence_weight + other_reservoir.confidence_weight; + + // https://yusuketokuyoshi.com/papers/2024/Efficient_Visibility_Reuse_for_Real-time_ReSTIR_(Supplementary_Document).pdf + combined_reservoir.visibility = max(0.0, (canonical_reservoir.visibility * canonical_resampling_weight + + other_reservoir.visibility * other_resampling_weight) / combined_reservoir.weight_sum); + + if rand_f(rng) < other_resampling_weight / combined_reservoir.weight_sum { + combined_reservoir.sample = other_reservoir.sample; + + let inverse_target_function = select(0.0, 1.0 / other_target_function.a, other_target_function.a > 0.0); + combined_reservoir.unbiased_contribution_weight = combined_reservoir.weight_sum * inverse_target_function; + + return ReservoirMergeResult(combined_reservoir, other_target_function.rgb); + } else { + combined_reservoir.sample = canonical_reservoir.sample; + + let inverse_target_function = select(0.0, 1.0 / canonical_target_function.a, canonical_target_function.a > 0.0); + combined_reservoir.unbiased_contribution_weight = combined_reservoir.weight_sum * inverse_target_function; + + return ReservoirMergeResult(combined_reservoir, canonical_target_function.rgb); + } +} + +fn reservoir_target_function(reservoir: Reservoir, world_position: vec3, world_normal: vec3, diffuse_brdf: vec3) -> vec4 { + if !reservoir_valid(reservoir) { return vec4(0.0); } + let light_contribution = calculate_light_contribution(reservoir.sample, world_position, world_normal).radiance; + let target_function = luminance(light_contribution * diffuse_brdf); + return vec4(light_contribution, target_function); +} diff --git a/crates/bevy_solari/src/realtime/restir_di.wgsl b/crates/bevy_solari/src/realtime/restir_di.wgsl index 511fd63d12..fbc6d6820f 100644 --- a/crates/bevy_solari/src/realtime/restir_di.wgsl +++ b/crates/bevy_solari/src/realtime/restir_di.wgsl @@ -1,11 +1,13 @@ #import bevy_core_pipeline::tonemapping::tonemapping_luminance as luminance #import bevy_pbr::pbr_deferred_types::unpack_24bit_normal +#import bevy_pbr::prepass_bindings::PreviousViewUniforms #import bevy_pbr::rgb9e5::rgb9e5_to_vec3_ #import bevy_pbr::utils::{rand_f, octahedral_decode} #import bevy_render::maths::PI #import bevy_render::view::View -#import bevy_solari::reservoir::{Reservoir, empty_reservoir, reservoir_valid} -#import bevy_solari::sampling::{generate_random_light_sample, calculate_light_contribution, trace_light_visibility} +#import bevy_solari::reservoir::{Reservoir, empty_reservoir, reservoir_valid, merge_reservoirs} +#import bevy_solari::sampling::{generate_random_light_sample, calculate_light_contribution, trace_light_visibility, sample_disk} +#import bevy_solari::scene_bindings::{previous_frame_light_id_translations, LIGHT_NOT_PRESENT_THIS_FRAME} @group(1) @binding(0) var view_output: texture_storage_2d; @group(1) @binding(1) var reservoirs_a: array; @@ -13,7 +15,10 @@ @group(1) @binding(3) var gbuffer: texture_2d; @group(1) @binding(4) var depth_buffer: texture_depth_2d; @group(1) @binding(5) var motion_vectors: texture_2d; -@group(1) @binding(6) var view: View; +@group(1) @binding(6) var previous_gbuffer: texture_2d; +@group(1) @binding(7) var previous_depth_buffer: texture_depth_2d; +@group(1) @binding(8) var view: View; +@group(1) @binding(9) var previous_view: PreviousViewUniforms; struct PushConstants { frame_index: u32, reset: u32 } var constants: PushConstants; @@ -40,8 +45,10 @@ fn initial_and_temporal(@builtin(global_invocation_id) global_id: vec3) { let diffuse_brdf = base_color / PI; let initial_reservoir = generate_initial_reservoir(world_position, world_normal, diffuse_brdf, &rng); + let temporal_reservoir = load_temporal_reservoir(global_id.xy, depth, world_position, world_normal); + let combined_reservoir = merge_reservoirs(initial_reservoir, temporal_reservoir, world_position, world_normal, diffuse_brdf, &rng); - reservoirs_b[pixel_index] = initial_reservoir; + reservoirs_b[pixel_index] = combined_reservoir.merged_reservoir; } @compute @workgroup_size(8, 8, 1) @@ -65,15 +72,13 @@ fn spatial_and_shade(@builtin(global_invocation_id) global_id: vec3) { let emissive = rgb9e5_to_vec3_(gpixel.g); let input_reservoir = reservoirs_b[pixel_index]; + let spatial_reservoir = load_spatial_reservoir(global_id.xy, depth, world_position, world_normal, &rng); + let merge_result = merge_reservoirs(input_reservoir, spatial_reservoir, world_position, world_normal, diffuse_brdf, &rng); + let combined_reservoir = merge_result.merged_reservoir; - var radiance = vec3(0.0); - if reservoir_valid(input_reservoir) { - radiance = calculate_light_contribution(input_reservoir.sample, world_position, world_normal).radiance; - } + reservoirs_a[pixel_index] = combined_reservoir; - reservoirs_a[pixel_index] = input_reservoir; - - var pixel_color = radiance * input_reservoir.unbiased_contribution_weight; + var pixel_color = merge_result.selected_sample_radiance * combined_reservoir.unbiased_contribution_weight * combined_reservoir.visibility; pixel_color *= view.exposure; pixel_color *= diffuse_brdf; pixel_color += emissive; @@ -102,16 +107,101 @@ fn generate_initial_reservoir(world_position: vec3, world_normal: vec3 if reservoir_valid(reservoir) { let inverse_target_function = select(0.0, 1.0 / reservoir_target_function, reservoir_target_function > 0.0); reservoir.unbiased_contribution_weight = reservoir.weight_sum * inverse_target_function; - reservoir.unbiased_contribution_weight *= trace_light_visibility(reservoir.sample, world_position); + + reservoir.visibility = trace_light_visibility(reservoir.sample, world_position); + reservoir.unbiased_contribution_weight *= reservoir.visibility; } reservoir.confidence_weight = f32(INITIAL_SAMPLES); return reservoir; } +fn load_temporal_reservoir(pixel_id: vec2, depth: f32, world_position: vec3, world_normal: vec3) -> Reservoir { + let motion_vector = textureLoad(motion_vectors, pixel_id, 0).xy; + let temporal_pixel_id_float = round(vec2(pixel_id) - (motion_vector * view.viewport.zw)); + let temporal_pixel_id = vec2(temporal_pixel_id_float); + if any(temporal_pixel_id_float < vec2(0.0)) || any(temporal_pixel_id_float >= view.viewport.zw) || bool(constants.reset) { + return empty_reservoir(); + } + + let temporal_depth = textureLoad(previous_depth_buffer, temporal_pixel_id, 0); + let temporal_gpixel = textureLoad(previous_gbuffer, temporal_pixel_id, 0); + let temporal_world_position = reconstruct_previous_world_position(temporal_pixel_id, temporal_depth); + let temporal_world_normal = octahedral_decode(unpack_24bit_normal(temporal_gpixel.a)); + if pixel_dissimilar(depth, world_position, temporal_world_position, world_normal, temporal_world_normal) { + return empty_reservoir(); + } + + let temporal_pixel_index = temporal_pixel_id.x + temporal_pixel_id.y * u32(view.viewport.z); + var temporal_reservoir = reservoirs_a[temporal_pixel_index]; + + temporal_reservoir.sample.light_id.x = previous_frame_light_id_translations[temporal_reservoir.sample.light_id.x]; + if temporal_reservoir.sample.light_id.x == LIGHT_NOT_PRESENT_THIS_FRAME { + return empty_reservoir(); + } + + temporal_reservoir.confidence_weight = min(temporal_reservoir.confidence_weight, CONFIDENCE_WEIGHT_CAP); + + return temporal_reservoir; +} + +fn load_spatial_reservoir(pixel_id: vec2, depth: f32, world_position: vec3, world_normal: vec3, rng: ptr) -> Reservoir { + let spatial_pixel_id = get_neighbor_pixel_id(pixel_id, rng); + + let spatial_depth = textureLoad(depth_buffer, spatial_pixel_id, 0); + let spatial_gpixel = textureLoad(gbuffer, spatial_pixel_id, 0); + let spatial_world_position = reconstruct_world_position(spatial_pixel_id, spatial_depth); + let spatial_world_normal = octahedral_decode(unpack_24bit_normal(spatial_gpixel.a)); + if pixel_dissimilar(depth, world_position, spatial_world_position, world_normal, spatial_world_normal) { + return empty_reservoir(); + } + + let spatial_pixel_index = spatial_pixel_id.x + spatial_pixel_id.y * u32(view.viewport.z); + var spatial_reservoir = reservoirs_b[spatial_pixel_index]; + + if reservoir_valid(spatial_reservoir) { + spatial_reservoir.visibility = trace_light_visibility(spatial_reservoir.sample, world_position); + } + + return spatial_reservoir; +} + +fn get_neighbor_pixel_id(center_pixel_id: vec2, rng: ptr) -> vec2 { + var spatial_id = vec2(center_pixel_id) + vec2(sample_disk(SPATIAL_REUSE_RADIUS_PIXELS, rng)); + spatial_id = clamp(spatial_id, vec2(0i), vec2(view.viewport.zw) - 1i); + return vec2(spatial_id); +} + fn reconstruct_world_position(pixel_id: vec2, depth: f32) -> vec3 { let uv = (vec2(pixel_id) + 0.5) / view.viewport.zw; let xy_ndc = (uv - vec2(0.5)) * vec2(2.0, -2.0); let world_pos = view.world_from_clip * vec4(xy_ndc, depth, 1.0); return world_pos.xyz / world_pos.w; } + +fn reconstruct_previous_world_position(pixel_id: vec2, depth: f32) -> vec3 { + let uv = (vec2(pixel_id) + 0.5) / view.viewport.zw; + let xy_ndc = (uv - vec2(0.5)) * vec2(2.0, -2.0); + let world_pos = previous_view.world_from_clip * vec4(xy_ndc, depth, 1.0); + return world_pos.xyz / world_pos.w; +} + +// Reject if tangent plane difference difference more than 0.3% or angle between normals more than 25 degrees +fn pixel_dissimilar(depth: f32, world_position: vec3, other_world_position: vec3, normal: vec3, other_normal: vec3) -> bool { + // https://developer.download.nvidia.com/video/gputechconf/gtc/2020/presentations/s22699-fast-denoising-with-self-stabilizing-recurrent-blurs.pdf#page=45 + let tangent_plane_distance = abs(dot(normal, other_world_position - world_position)); + let view_z = -depth_ndc_to_view_z(depth); + + return tangent_plane_distance / view_z > 0.003 || dot(normal, other_normal) < 0.906; +} + +fn depth_ndc_to_view_z(ndc_depth: f32) -> f32 { +#ifdef VIEW_PROJECTION_PERSPECTIVE + return -view.clip_from_view[3][2]() / ndc_depth; +#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC + return -(view.clip_from_view[3][2] - ndc_depth) / view.clip_from_view[2][2]; +#else + let view_pos = view.view_from_clip * vec4(0.0, 0.0, ndc_depth, 1.0); + return view_pos.z / view_pos.w; +#endif +} diff --git a/crates/bevy_solari/src/scene/binder.rs b/crates/bevy_solari/src/scene/binder.rs index 889efb538e..f14b5dbe23 100644 --- a/crates/bevy_solari/src/scene/binder.rs +++ b/crates/bevy_solari/src/scene/binder.rs @@ -2,6 +2,7 @@ use super::{blas::BlasManager, extract::StandardMaterialAssets, RaytracingMesh3d use bevy_asset::{AssetId, Handle}; use bevy_color::{ColorToComponents, LinearRgba}; use bevy_ecs::{ + entity::{Entity, EntityHashMap}, resource::Resource, system::{Query, Res, ResMut}, world::{FromWorld, World}, @@ -26,19 +27,24 @@ const MAX_TEXTURE_COUNT: NonZeroU32 = NonZeroU32::new(5_000).unwrap(); /// const SUN_ANGULAR_DIAMETER_RADIANS: f32 = 0.00930842; +const TEXTURE_MAP_NONE: u32 = u32::MAX; +const LIGHT_NOT_PRESENT_THIS_FRAME: u32 = u32::MAX; + #[derive(Resource)] pub struct RaytracingSceneBindings { pub bind_group: Option, pub bind_group_layout: BindGroupLayout, + previous_frame_light_entities: Vec, } pub fn prepare_raytracing_scene_bindings( instances_query: Query<( + Entity, &RaytracingMesh3d, &MeshMaterial3d, &GlobalTransform, )>, - directional_lights_query: Query<&ExtractedDirectionalLight>, + directional_lights_query: Query<(Entity, &ExtractedDirectionalLight)>, mesh_allocator: Res, blas_manager: Res, material_assets: Res, @@ -50,6 +56,12 @@ pub fn prepare_raytracing_scene_bindings( ) { raytracing_scene_bindings.bind_group = None; + let mut this_frame_entity_to_light_id = EntityHashMap::::default(); + let previous_frame_light_entities: Vec<_> = raytracing_scene_bindings + .previous_frame_light_entities + .drain(..) + .collect(); + if instances_query.iter().len() == 0 { return; } @@ -72,6 +84,7 @@ pub fn prepare_raytracing_scene_bindings( let mut material_ids = StorageBufferList::::default(); let mut light_sources = StorageBufferList::::default(); let mut directional_lights = StorageBufferList::::default(); + let mut previous_frame_light_id_translations = StorageBufferList::::default(); let mut material_id_map: HashMap, u32, FixedHasher> = HashMap::default(); @@ -89,7 +102,7 @@ pub fn prepare_raytracing_scene_bindings( } None => None, }, - None => Some(u32::MAX), + None => Some(TEXTURE_MAP_NONE), } }; for (asset_id, material) in material_assets.iter() { @@ -126,7 +139,7 @@ pub fn prepare_raytracing_scene_bindings( } let mut instance_id = 0; - for (mesh, material, transform) in &instances_query { + for (entity, mesh, material, transform) in &instances_query { let Some(blas) = blas_manager.get(&mesh.id()) else { continue; }; @@ -178,6 +191,11 @@ pub fn prepare_raytracing_scene_bindings( instance_id as u32, (index_slice.range.len() / 3) as u32, )); + + this_frame_entity_to_light_id.insert(entity, light_sources.get().len() as u32 - 1); + raytracing_scene_bindings + .previous_frame_light_entities + .push(entity); } instance_id += 1; @@ -187,7 +205,7 @@ pub fn prepare_raytracing_scene_bindings( return; } - for directional_light in &directional_lights_query { + for (entity, directional_light) in &directional_lights_query { let directional_lights = directional_lights.get_mut(); let directional_light_id = directional_lights.len() as u32; @@ -196,6 +214,21 @@ pub fn prepare_raytracing_scene_bindings( light_sources .get_mut() .push(GpuLightSource::new_directional_light(directional_light_id)); + + this_frame_entity_to_light_id.insert(entity, light_sources.get().len() as u32 - 1); + raytracing_scene_bindings + .previous_frame_light_entities + .push(entity); + } + + for previous_frame_light_entity in previous_frame_light_entities { + let current_frame_index = this_frame_entity_to_light_id + .get(&previous_frame_light_entity) + .copied() + .unwrap_or(LIGHT_NOT_PRESENT_THIS_FRAME); + previous_frame_light_id_translations + .get_mut() + .push(current_frame_index); } materials.write_buffer(&render_device, &render_queue); @@ -204,6 +237,7 @@ pub fn prepare_raytracing_scene_bindings( material_ids.write_buffer(&render_device, &render_queue); light_sources.write_buffer(&render_device, &render_queue); directional_lights.write_buffer(&render_device, &render_queue); + previous_frame_light_id_translations.write_buffer(&render_device, &render_queue); let mut command_encoder = render_device.create_command_encoder(&CommandEncoderDescriptor { label: Some("build_tlas_command_encoder"), @@ -226,6 +260,7 @@ pub fn prepare_raytracing_scene_bindings( material_ids.binding().unwrap(), light_sources.binding().unwrap(), directional_lights.binding().unwrap(), + previous_frame_light_id_translations.binding().unwrap(), )), )); } @@ -253,9 +288,11 @@ impl FromWorld for RaytracingSceneBindings { storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), storage_buffer_read_only_sized(false, None), + storage_buffer_read_only_sized(false, None), ), ), ), + previous_frame_light_entities: Vec::new(), } } } diff --git a/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl b/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl index 974ee50d7d..eeed96ad8e 100644 --- a/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl +++ b/crates/bevy_solari/src/scene/raytracing_scene_bindings.wgsl @@ -59,6 +59,8 @@ struct DirectionalLight { inverse_pdf: f32, } +const LIGHT_NOT_PRESENT_THIS_FRAME = 0xFFFFFFFFu; + @group(0) @binding(0) var vertex_buffers: binding_array; @group(0) @binding(1) var index_buffers: binding_array; @group(0) @binding(2) var textures: binding_array>; @@ -70,6 +72,7 @@ struct DirectionalLight { @group(0) @binding(8) var material_ids: array; // TODO: Store material_id in instance_custom_index instead? @group(0) @binding(9) var light_sources: array; @group(0) @binding(10) var directional_lights: array; +@group(0) @binding(11) var previous_frame_light_id_translations: array; const RAY_T_MIN = 0.01f; const RAY_T_MAX = 100000.0f; diff --git a/crates/bevy_solari/src/scene/sampling.wgsl b/crates/bevy_solari/src/scene/sampling.wgsl index 06142192b6..be709f0bc8 100644 --- a/crates/bevy_solari/src/scene/sampling.wgsl +++ b/crates/bevy_solari/src/scene/sampling.wgsl @@ -1,7 +1,7 @@ #define_import_path bevy_solari::sampling #import bevy_pbr::utils::{rand_f, rand_vec2f, rand_range_u} -#import bevy_render::maths::PI_2 +#import bevy_render::maths::{PI, PI_2} #import bevy_solari::scene_bindings::{trace_ray, RAY_T_MIN, RAY_T_MAX, light_sources, directional_lights, LIGHT_SOURCE_KIND_DIRECTIONAL, resolve_triangle_data_full} // https://www.realtimerendering.com/raytracinggems/unofficial_RayTracingGems_v1.9.pdf#0004286901.INDD%3ASec28%3A303 @@ -15,6 +15,28 @@ fn sample_cosine_hemisphere(normal: vec3, rng: ptr) -> vec3< return vec3(x, y, z); } +// https://www.realtimerendering.com/raytracinggems/unofficial_RayTracingGems_v1.9.pdf#0004286901.INDD%3ASec19%3A294 +fn sample_disk(disk_radius: f32, rng: ptr) -> vec2 { + let ab = 2.0 * rand_vec2f(rng) - 1.0; + let a = ab.x; + var b = ab.y; + if (b == 0.0) { b = 1.0; } + + var phi: f32; + var r: f32; + if (a * a > b * b) { + r = disk_radius * a; + phi = (PI / 4.0) * (b / a); + } else { + r = disk_radius * b; + phi = (PI / 2.0) - (PI / 4.0) * (a / b); + } + + let x = r * cos(phi); + let y = r * sin(phi); + return vec2(x, y); +} + fn sample_random_light(ray_origin: vec3, origin_world_normal: vec3, rng: ptr) -> vec3 { let light_sample = generate_random_light_sample(rng); let light_contribution = calculate_light_contribution(light_sample, ray_origin, origin_world_normal); diff --git a/release-content/release-notes/bevy_solari.md b/release-content/release-notes/bevy_solari.md index 7e7d36ac31..ac1b1abe1c 100644 --- a/release-content/release-notes/bevy_solari.md +++ b/release-content/release-notes/bevy_solari.md @@ -1,7 +1,7 @@ --- title: Initial raytraced lighting progress (bevy_solari) authors: ["@JMS55"] -pull_requests: [19058] +pull_requests: [19058, 19620, 19790] --- (TODO: Embed solari example screenshot here) @@ -25,7 +25,7 @@ The problem with these methods is that they all have large downsides: Bevy Solari is intended as a completely alternate, high-end lighting solution for Bevy that uses GPU-accelerated raytracing to fix all of the above problems. Emissive meshes will properly cast light and shadows, you will be able to have hundreds of shadow casting lights, quality will be much better, it will require no baking time, and it will support _fully_ dynamic scenes! -While Bevy 0.17 adds the bevy_solari crate, it's intended as a long-term project. Currently there is only a non-realtime path tracer intended as a reference and testbed for developing Bevy Solari. There is nothing usable yet for game developers. However, feel free to run the solari example to see the path tracer in action, and look forward to more work on Bevy Solari in future releases! (TODO: Is this burying the lede?) +While Bevy 0.17 adds the bevy_solari crate, it's intended as a long-term project. It is not yet usable by game developers. However, feel free to run the solari example (`cargo run --release --example solari --features bevy_solari` (realtime direct lighting, no denoising) or `cargo run --release --example solari --features bevy_solari -- --pathtracer` (non-realtime pathtracing)) to check out the progress we've made, and look forward to more work on Bevy Solari in future releases! (TODO: Embed bevy_solari logo here, or somewhere else that looks good) From a98b5683aeb4bf03246048448d11d3d0a800eda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sun, 29 Jun 2025 22:36:53 +0200 Subject: [PATCH 22/68] bevy_asset: fix clippy in wasm (#19865) # Objective - bevy_asset has a clippy warning in wasm: [`clippy::io_other_error`](https://rust-lang.github.io/rust-clippy/master/index.html#io_other_error) ``` error: this can be `std::io::Error::other(_)` --> crates/bevy_asset/src/io/wasm.rs:50:9 | 50 | std::io::Error::new(std::io::ErrorKind::Other, message) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#io_other_error = note: `-D clippy::io-other-error` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::io_other_error)]` help: use `std::io::Error::other` | 50 - std::io::Error::new(std::io::ErrorKind::Other, message) 50 + std::io::Error::other(message) ``` ## Solution - Fix it ## Testing `cargo clippy --target wasm32-unknown-unknown -p bevy_asset --no-deps -- -D warnings` --- crates/bevy_asset/src/io/wasm.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/crates/bevy_asset/src/io/wasm.rs b/crates/bevy_asset/src/io/wasm.rs index 4080e03ecd..4ed7162d2b 100644 --- a/crates/bevy_asset/src/io/wasm.rs +++ b/crates/bevy_asset/src/io/wasm.rs @@ -47,7 +47,7 @@ fn js_value_to_err(context: &str) -> impl FnOnce(JsValue) -> std::io::Error + '_ } }; - std::io::Error::new(std::io::ErrorKind::Other, message) + std::io::Error::other(message) } } @@ -62,10 +62,7 @@ impl HttpWasmAssetReader { let worker: web_sys::WorkerGlobalScope = global.unchecked_into(); worker.fetch_with_str(path.to_str().unwrap()) } else { - let error = std::io::Error::new( - std::io::ErrorKind::Other, - "Unsupported JavaScript global context", - ); + let error = std::io::Error::other("Unsupported JavaScript global context"); return Err(AssetReaderError::Io(error.into())); }; let resp_value = JsFuture::from(promise) From 764be9199c8879ccf20cdfcf4dc35f0541006c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sun, 29 Jun 2025 23:30:28 +0200 Subject: [PATCH 23/68] bevy_winit: fix compile and clippy on wasm (#19869) # Objective - bevy_winit has a warning when compiling without default feature on linux - bevy_winit has a clippy warning when compiling in wasm ## Solution - Fix them ## Testing ``` cargo build -p bevy_winit --no-default-features --features winit/x11 cargo clippy --target wasm32-unknown-unknown -p bevy_winit --no-deps -- -D warnings ``` --- crates/bevy_winit/src/winit_windows.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/crates/bevy_winit/src/winit_windows.rs b/crates/bevy_winit/src/winit_windows.rs index f238da2e20..8cc5dcfac7 100644 --- a/crates/bevy_winit/src/winit_windows.rs +++ b/crates/bevy_winit/src/winit_windows.rs @@ -190,11 +190,16 @@ impl WinitWindows { bevy_log::debug!("{display_info}"); #[cfg(any( - target_os = "linux", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd", + all( + any(feature = "wayland", feature = "x11"), + any( + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd", + ) + ), target_os = "windows" ))] if let Some(name) = &window.name { @@ -285,7 +290,7 @@ impl WinitWindows { let canvas = canvas.dyn_into::().ok(); winit_window_attributes = winit_window_attributes.with_canvas(canvas); } else { - panic!("Cannot find element: {}.", selector); + panic!("Cannot find element: {selector}."); } } From a8bb208ed31b41850e6c4dd562aeb43206af22d3 Mon Sep 17 00:00:00 2001 From: atlv Date: Sun, 29 Jun 2025 17:59:56 -0400 Subject: [PATCH 24/68] optimize ktx2 level data concatenation (#19845) # Objective - avoid several internal vec copies while collecting all the level data in ktx2 load - merge another little piece of #18411 (benchmarks there found this to be a significant win) ## Solution - reserve and extend ## Testing - ran a few examples that load ktx2 images, like ssr. looks fine ## Future work - fast path logic to skip the reading into different vecs and just read it all in one go into the final buffer instead - as above, but directly into gpu staging buffer perhaps --- crates/bevy_image/src/ktx2.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/bevy_image/src/ktx2.rs b/crates/bevy_image/src/ktx2.rs index b4d838b4a9..61304c2145 100644 --- a/crates/bevy_image/src/ktx2.rs +++ b/crates/bevy_image/src/ktx2.rs @@ -238,11 +238,16 @@ pub fn ktx2_buffer_to_image( ))); } + // Collect all level data into a contiguous buffer + let mut image_data = Vec::new(); + image_data.reserve_exact(levels.iter().map(Vec::len).sum()); + levels.iter().for_each(|level| image_data.extend(level)); + // Assign the data and fill in the rest of the metadata now the possible // error cases have been handled let mut image = Image::default(); image.texture_descriptor.format = texture_format; - image.data = Some(levels.into_iter().flatten().collect::>()); + image.data = Some(image_data); image.data_order = wgpu_types::TextureDataOrder::MipMajor; // Note: we must give wgpu the logical texture dimensions, so it can correctly compute mip sizes. // However this currently causes wgpu to panic if the dimensions arent a multiple of blocksize. From 01eff3ea937535bc7384ff361029129475d98263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Mon, 30 Jun 2025 00:09:37 +0200 Subject: [PATCH 25/68] bevy_render: fix clippy on wasm (#19872) # Objective - bevy_render has unfulfilled expected clippy lints in wasm ## Solution - Don't expect them in wasm ## Testing `cargo clippy --target wasm32-unknown-unknown -p bevy_render --no-deps -- -D warnings` --- .../src/batching/gpu_preprocessing.rs | 9 ++++++--- .../src/render_resource/pipeline_cache.rs | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/crates/bevy_render/src/batching/gpu_preprocessing.rs b/crates/bevy_render/src/batching/gpu_preprocessing.rs index ea5970431a..2fb0172b21 100644 --- a/crates/bevy_render/src/batching/gpu_preprocessing.rs +++ b/crates/bevy_render/src/batching/gpu_preprocessing.rs @@ -392,9 +392,12 @@ where } /// The buffer of GPU preprocessing work items for a single view. -#[expect( - clippy::large_enum_variant, - reason = "See https://github.com/bevyengine/bevy/issues/19220" +#[cfg_attr( + not(target_arch = "wasm32"), + expect( + clippy::large_enum_variant, + reason = "See https://github.com/bevyengine/bevy/issues/19220" + ) )] pub enum PreprocessWorkItemBuffers { /// The work items we use if we aren't using indirect drawing. diff --git a/crates/bevy_render/src/render_resource/pipeline_cache.rs b/crates/bevy_render/src/render_resource/pipeline_cache.rs index ebd3229636..0c75a5ca06 100644 --- a/crates/bevy_render/src/render_resource/pipeline_cache.rs +++ b/crates/bevy_render/src/render_resource/pipeline_cache.rs @@ -80,9 +80,12 @@ pub struct CachedPipeline { } /// State of a cached pipeline inserted into a [`PipelineCache`]. -#[expect( - clippy::large_enum_variant, - reason = "See https://github.com/bevyengine/bevy/issues/19220" +#[cfg_attr( + not(target_arch = "wasm32"), + expect( + clippy::large_enum_variant, + reason = "See https://github.com/bevyengine/bevy/issues/19220" + ) )] #[derive(Debug)] pub enum CachedPipelineState { @@ -1114,9 +1117,12 @@ fn create_pipeline_task( } /// Type of error returned by a [`PipelineCache`] when the creation of a GPU pipeline object failed. -#[expect( - clippy::large_enum_variant, - reason = "See https://github.com/bevyengine/bevy/issues/19220" +#[cfg_attr( + not(target_arch = "wasm32"), + expect( + clippy::large_enum_variant, + reason = "See https://github.com/bevyengine/bevy/issues/19220" + ) )] #[derive(Error, Debug)] pub enum PipelineCacheError { From c6a6afc60a6439998c6bfa42604885fde0f59e60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 18:56:00 +0200 Subject: [PATCH 26/68] Update petgraph requirement from 0.7 to 0.8 (#19878) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- crates/bevy_animation/Cargo.toml | 2 +- crates/bevy_reflect/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_animation/Cargo.toml b/crates/bevy_animation/Cargo.toml index 637231fd4c..380c276539 100644 --- a/crates/bevy_animation/Cargo.toml +++ b/crates/bevy_animation/Cargo.toml @@ -31,7 +31,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.17.0-dev", default-fea ] } # other -petgraph = { version = "0.7", features = ["serde-1"] } +petgraph = { version = "0.8", features = ["serde-1"] } ron = "0.10" serde = "1" blake3 = { version = "1.0" } diff --git a/crates/bevy_reflect/Cargo.toml b/crates/bevy_reflect/Cargo.toml index ae3a3a856e..aba26258b6 100644 --- a/crates/bevy_reflect/Cargo.toml +++ b/crates/bevy_reflect/Cargo.toml @@ -100,7 +100,7 @@ smallvec = { version = "1.11", default-features = false, optional = true } glam = { version = "0.29.3", default-features = false, features = [ "serde", ], optional = true } -petgraph = { version = "0.7", features = ["serde-1"], optional = true } +petgraph = { version = "0.8", features = ["serde-1"], optional = true } smol_str = { version = "0.2.0", default-features = false, features = [ "serde", ], optional = true } From d7ce35234f9fd8554a3c480057c87c3ad0f18fd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Maita?= <47983254+mnmaita@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:19:46 +0200 Subject: [PATCH 27/68] Update ui_test requirement from 0.29.1 to 0.30.1 (#19799) # Objective - Fixes #19670 ## Solution - Updated breaking code to be able to upgrade `ui_test` to the latest version. ## Testing - CI checks. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/compile_fail_utils/Cargo.toml | 2 +- tools/compile_fail_utils/src/lib.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/compile_fail_utils/Cargo.toml b/tools/compile_fail_utils/Cargo.toml index 453b7ea7ad..8668fdaa9e 100644 --- a/tools/compile_fail_utils/Cargo.toml +++ b/tools/compile_fail_utils/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0" publish = false [dependencies] -ui_test = "0.29.1" +ui_test = "0.30.1" [[test]] name = "example" diff --git a/tools/compile_fail_utils/src/lib.rs b/tools/compile_fail_utils/src/lib.rs index ecd4f34c68..28157400a7 100644 --- a/tools/compile_fail_utils/src/lib.rs +++ b/tools/compile_fail_utils/src/lib.rs @@ -123,7 +123,8 @@ pub fn test_with_multiple_configs( let emitter: Box = if env::var_os("CI").is_some() { Box::new(( Text::verbose(), - Gha:: { + Gha { + group: true, name: test_name.into(), }, )) From bcb552074259e4a98591842f219201b46440b0fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Mon, 30 Jun 2025 22:51:52 +0200 Subject: [PATCH 28/68] bevy_window: fix compilation without default features (#19870) # Objective - bevy_window fails to compile without default features ``` error: cannot find derive macro `Reflect` in this scope --> crates/bevy_window/src/window.rs:1474:60 | 1474 | #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Reflect)] | ^^^^^^^ warning: unused import: `format` --> crates/bevy_window/src/window.rs:1:30 | 1 | use alloc::{borrow::ToOwned, format, string::String}; | ^^^^^^ | = note: `#[warn(unused_imports)]` on by default warning: `bevy_window` (lib) generated 1 warning error: could not compile `bevy_window` (lib) due to 1 previous error; 1 warning emitted ``` ## Solution - Fix them ## Testing `cargo build -p bevy_window --no-default-features --features bevy_math/libm` --- crates/bevy_window/src/window.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/bevy_window/src/window.rs b/crates/bevy_window/src/window.rs index 5ea8b72402..4fc039d7c7 100644 --- a/crates/bevy_window/src/window.rs +++ b/crates/bevy_window/src/window.rs @@ -1,4 +1,6 @@ -use alloc::{borrow::ToOwned, format, string::String}; +#[cfg(feature = "std")] +use alloc::format; +use alloc::{borrow::ToOwned, string::String}; use core::num::NonZero; use bevy_ecs::{ @@ -1471,7 +1473,8 @@ pub struct ClosingWindow; /// - Only used on iOS. /// /// [`winit::platform::ios::ScreenEdge`]: https://docs.rs/winit/latest/x86_64-apple-darwin/winit/platform/ios/struct.ScreenEdge.html -#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, Reflect)] +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "bevy_reflect", derive(Reflect))] #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))] pub enum ScreenEdge { #[default] From a2992fcffd4e977075aea28801ffbb5d7aaefd91 Mon Sep 17 00:00:00 2001 From: robtfm <50659922+robtfm@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:56:17 +0100 Subject: [PATCH 29/68] Light Textures (#18031) # Objective add support for light textures (also known as light cookies, light functions, and light projectors) ![image](https://github.com/user-attachments/assets/afdb23e2-b35f-4bf0-bf92-f883cd7db771) ## Solution - add components: ```rs /// Add to a [`PointLight`] to add a light texture effect. /// A texture mask is applied to the light source to modulate its intensity, /// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs. pub struct PointLightTexture { /// The texture image. Only the R channel is read. pub image: Handle, /// The cubemap layout. The image should be a packed cubemap in one of the formats described by the [`CubemapLayout`] enum. pub cubemap_layout: CubemapLayout, } /// Add to a [`SpotLight`] to add a light texture effect. /// A texture mask is applied to the light source to modulate its intensity, /// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs. pub struct SpotLightTexture { /// The texture image. Only the R channel is read. /// Note the border of the image should be entirely black to avoid leaking light. pub image: Handle, } /// Add to a [`DirectionalLight`] to add a light texture effect. /// A texture mask is applied to the light source to modulate its intensity, /// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs. pub struct DirectionalLightTexture { /// The texture image. Only the R channel is read. pub image: Handle, /// Whether to tile the image infinitely, or use only a single tile centered at the light's translation pub tiled: bool, } ``` - store images to the `RenderClusteredDecals` buffer - read the image and modulate the lights - add `light_textures` example to showcase the new features ## Testing see light_textures example --- Cargo.toml | 17 + .../lightmaps/caustic_directional_texture.png | Bin 0 -> 234106 bytes .../faces_pointlight_texture_blurred.png | Bin 0 -> 564555 bytes assets/lightmaps/torch_spotlight_texture.png | Bin 0 -> 94995 bytes assets/models/Faces/faces.glb | Bin 0 -> 85436 bytes crates/bevy_internal/Cargo.toml | 9 + crates/bevy_pbr/Cargo.toml | 2 + crates/bevy_pbr/src/cluster/mod.rs | 4 +- crates/bevy_pbr/src/decal/clustered.rs | 185 ++++- crates/bevy_pbr/src/render/light.rs | 22 +- crates/bevy_pbr/src/render/mesh.rs | 3 + .../bevy_pbr/src/render/mesh_view_types.wgsl | 3 +- crates/bevy_pbr/src/render/pbr_functions.wgsl | 4 +- crates/bevy_pbr/src/render/pbr_lighting.wgsl | 141 +++- docs/cargo_features.md | 2 + examples/3d/clustered_decals.rs | 6 + examples/3d/light_textures.rs | 706 ++++++++++++++++++ examples/README.md | 1 + 18 files changed, 1076 insertions(+), 29 deletions(-) create mode 100644 assets/lightmaps/caustic_directional_texture.png create mode 100644 assets/lightmaps/faces_pointlight_texture_blurred.png create mode 100644 assets/lightmaps/torch_spotlight_texture.png create mode 100644 assets/models/Faces/faces.glb create mode 100644 examples/3d/light_textures.rs diff --git a/Cargo.toml b/Cargo.toml index bde47050a9..173d9e1f03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -487,6 +487,12 @@ shader_format_wesl = ["bevy_internal/shader_format_wesl"] # Enable support for transmission-related textures in the `StandardMaterial`, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs pbr_transmission_textures = ["bevy_internal/pbr_transmission_textures"] +# Enable support for Clustered Decals +pbr_clustered_decals = ["bevy_internal/pbr_clustered_decals"] + +# Enable support for Light Textures +pbr_light_textures = ["bevy_internal/pbr_light_textures"] + # Enable support for multi-layer material textures in the `StandardMaterial`, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs pbr_multi_layer_material_textures = [ "bevy_internal/pbr_multi_layer_material_textures", @@ -4427,6 +4433,17 @@ description = "Demonstrates clustered decals" category = "3D Rendering" wasm = false +[[example]] +name = "light_textures" +path = "examples/3d/light_textures.rs" +doc-scrape-examples = true + +[package.metadata.example.light_textures] +name = "Light Textures" +description = "Demonstrates light textures" +category = "3D Rendering" +wasm = false + [[example]] name = "occlusion_culling" path = "examples/3d/occlusion_culling.rs" diff --git a/assets/lightmaps/caustic_directional_texture.png b/assets/lightmaps/caustic_directional_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..0c082a46cf09b17142b3b917b6eca0eb8b3372f0 GIT binary patch literal 234106 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¨YYTqbRn%xj1DoW4+E1(q9hDWZCYkGvJt{C`Et6{ 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 z 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 DUC=f1 literal 0 HcmV?d00001 diff --git a/assets/lightmaps/faces_pointlight_texture_blurred.png b/assets/lightmaps/faces_pointlight_texture_blurred.png new file mode 100644 index 0000000000000000000000000000000000000000..1adf2e954dda878df377b9acc51c1d1eada0c5e3 GIT binary patch literal 564555 zcmeFZWl&|w(k_gi(-iYu1 zJ46tyy(;sm%BQljDs!=RsJyHgJPbAr5D*Z>)LG5D>)2B@_@8$j2X>S{ncm5Q4qC zvbv)pz=hD(-p1I>(umN}&DMy}$kogk2*`E0Al1Ttl>s5({TkH+tX%>(m~^nTtqb3W zPkeh|QC6QK^U5?gMi?31k^SK3YsWkOJ%P7<<=pPHdx9nppGHk@SMb?+mR%cUR@Hq{ z))U9G<67GqI%fh$;d7X`-dWGcV-h4!B;cZ?)k9t{ihl1JBlg_jga9A)T&M4_L>PsB20oxP`aEH7A7JAMcE zx!~i4h&vudI|1kYK+%IIZ{bC%nA}w3xU;4BgPrT$MkP^&?mM`hzhslM8Af)y0=| zH+vIF&5kyj=oTHmS2;j0{Mbrr5j_qs_mwi(0QhQozu5D&ZQ@D=e0m{yIPPW_g=L#z z*g44<;U`TOlOI9bNLm;m=wbE!T1}}H3gw$|Pht#hBOOhbje>z5=>i{A7zO!>IEYS~ zob(e=eY9k8S0knt6j%-DLq2 zp3E{JrP2K_0iHAHW#!GwM^f{X#S)u{70Y#H z2aA9>$uH+M$JQ-2OWV=r6isn*oVRr|QR$c8HC^LR2Nn?JVG(Dy0^@ZSbrrTPE$E}5 zL@D|hKz|(A16>+_ik_TexaQfxh3D)UmCC1q+InE4vw`*n>d5k>ch!=>nK^fSe( z_K4iiz7CObEJr@!GiGbOoWkwWUPmHB6;pxR(4+0=Ut%Xcy=Ogk#bqF08RJtBFrwOa zxsazBr7|=ofK}SY%`G0eo+9I!1cu0V^!3$OM}mtCv?}1uOl}qBxID(q5EpqC80+B1 zt}UsnFJE%a*Q;5;DwLDmwNYNX?2ykL;2Xw$qcCk)60^2>G|d-G>vi&~w{VHhZOv&G z!g*E|63=o#;~i&Ng>=S~b@b!gq;5A@V%&MCEa`oZ&4-K3=+fYDyb4N*fYBwSWBD1= zpqO|Dvxv;4p1`^fpQA?x>Rb=3gDIK$^veqtzw-t~?Q(>z?VG+|J^xQk6i2YQ|<)Y)19vaK3$N=Rx*lA_1jcT6>Fs9^|Eg#cI6L?9`8M5F}5#?-C z(tKe$C|1Vb%>aq`q#wCvm`PnFfjjyHl$EbFet41?#w`F^l ztHMIYsaCuUHtJ1nJ30DLD;QWpfGUi6l+D&Ro>QVqq}Eo}swyqc@(6x~Z4$bG>SWjx z^y@cZ#W2w;6A(SW-MPPS_Gx;2Z9CJmZde?})Io7zyh1b_1 zGp1iw>SPL;lkt^H-z&}*?B9{#0j!sZd5kh~Y;=77C8$Yrp!=qUNFp zE((V93U8pJs!K7SU0$f8Rdn4bes=b(ds9584zI6<1ft!i{YBh_!mCQC4OKxRoUXA=hd0|I!y4Q5xK z*tfBJ_YFy0$t*t@Wrb1{gd~NEHsI zKkVHB_=t|8w6Wj?DMfmkygy^T!7gcTnY78IAb=!}?t;cd80A=59$wkd{VeB3Lo7OC zMvHZeA@|*`vHO0gh$;shqomkgJ^)vJW?^IEKnEhJ?ieQSL+_V^{16 zyctZhS1_1J>OvdLMr%O8M_GX#HJYCbUpiKw*c}0u|Gs6lf7REFb5Qx~6T^4Puse;x zwQnPJ^N}EM;*r+@Z59Xyxgu5#o!b35*ImhU#MzAYGlQ5ik^rIw*yC0%-q^{S7b#!xD{yz~G2I9OOK#>grN2C1$rM#_H$0&v|g-H7VLh)% zNBcg2n0+ava`j^ZU8dKnUL_oZGw3uK^+bYz2Nl?5<1mRT7M5><*S|6}1>*W{6f5Tx zv7|#pRI{K%UXGXBH@nc1Lc(Cb<5 z(@(URL8(|Oh}NOb=}kX#(D1DMVech@7r-o{v(ko%i6Uf%%q0_@L-DUW!&|0^Hsx~o zM)fJ0@g5X_pfPCzox|~&rHQHqi?WxAAx1(B)R$#3iGwve@6AV3V=7A}MGt-*z}wUi z%j8Z_nB~zVR-j0UwW{+fcKH(_=MliNF^5lv8>PxfrBsMT&a3b~EQ6=$RHC+r)_nz? zJc!Nlw@vg}v~UjziL!)UMhC<6kiDi#(FN*-IXUbZ8_{-wZYJd}b68!4Z4`27tL|6lD zVSw|_eq+b4)3?*R#+F~#r{a060%!uvauU0hOL=-ffO>g{P`Qn8EWDV?&xAhT21id{ zm~b0GJ0y)Lp~rddC2KRGNa3?OFov8Ph$MY!QFW}M2*0uDG0z;pLoU=|kKK@dtrNP8 zrjOdyQ9c00gcYvn5&EBe#yUPVG;l%1REsY)c%noUN7ZYjKVL% zBW;<8LfcuzuqMiYJ$iGY(GMjL0Rtm*9>Q|0Jzyd30EQ989z00(_KRp%aIYc!u7~?# zsnDVzvRczYwG|ZZ`-pNfgx+wTTj{G=9@iJ5=#5|B4D=h!(y3B=$*~+@lcq#hc=bx} zlAxhS(fz*@Mz;+-8Alu$OXgsT(Bj@j`$4TVeD$mdmir?E;_&#V}NZo*=Q2sn7H7}5Zza@ke~29q3tOej>yld&;OgK-rW)uvH&eZNg$bPSJ< z%?WPG2amP2Bx$@Ws}nSPF7x8J&xrVWe$vx)ZrST)LNM;7#$&5>Ub?%@7Gw3K*|oZB zZ}XJtF>_yZyOjyESFc-%G{dvilKN<$^tdKs>$8aG3cN2dUKw$KxcE~pZPcep=E%GL z@)c$hH1ob?)aIeQ)KNUGvTy200l$Iq+jd^bxvLC5LKV8?IU#a`N_>D3b&%II{m|;e zzEHOOAa6-PeB5?MCdRoM(=LFVTrs1LMm_OBgB2c_7nmLAy=}F6H zlHFxXO=a4dw1yH5>GOsXJT$3B35-fqI~pAGt)tYTc-|xf+JoZxEdE!t=`(tlUOuAJ zcIbMmG^+Hz_zEmzK|Bh9_j(1O6))${hPm@q8&iy-XmFXi1$d@&@G>09?VxQ|TNZ_5 zPe3o{x&`wxnyMh_1ez6M+}Y;aMtN3_Z*=1m3}|MS(JY0 zByMm?n7p=-g*TyAw|$aml}>^TvaF+R(2H+iyj3J;s~`}@(!9`@fjf&UC{Ur9!YZlF z`Lz!E7T)-*WA*;cBkVat z<*`8tdY_~Iz4X$D7K)E!Ne|Tq2naa9Oh`yxLP+R8+2=>jneG+yMZ8BIHR!!iQiK}8 zSsrOrK7-~#5VzpF$Pf8tm{wI`v99`!4TI{Vjji%B|1v@-Uj9{Z3K0yd z%hmiz;(plR=galy_jC_B!r2jN)-V0QDz)K;G}Oj5W%?UvAP~htj6{q|QAOx87utIF z7niSe-L4qJ@=*reV&%_mnl`+hwj z6L46EJKT05>NIuLtNrDs#l17V0FgOLy}_U5wrgAEiDl(W6g~ikqKf>VvaA7^iJ!zk zhz*q$1hLSG>n!q<#i!k7d-x6>PoM5 zfqZqc6>3k<4OXnvf!<6uBrP64JAJ*2yU~<_B>-+)>Fjfoio5?df|va+kpwps^P()s zi`beq#ct%=u9fXEmZ5cxTZG7;YFzILii-=92R^KO@9LuVy!zHQlfI5v_+a14+Yavd zQ6<1M`=|z}%Sdw>*jUj43~ls{=v=LAKdJ>lK-_$;wg3YQBS%7gBNH=g9^&(s4q`$x zLmpx^Rv88vTOlJ;GjVr&BPDlPWdnB$15QI?K3*7ZSFR5LDg7iKyedlPy_PEJmG1}1tYCfW}PS_e04M}RA>wFAj-h(9rejT{W@ z&1@abY^(`?V*>PToE&+Gi9gy2|1&--TN#wTmCTT-vjwj{~PyzNdL$7 zKZHM|WMsI6Z48`#4^Kjvhxm8@T!uCVW`eCt-aWc`eaIhNDa&j^N zXc<{p4fUBhS&bPOjQ<5CVeQ}uur@II4fO#|XZC@^#L2|K0RS-2axk;9)3PuDm}vn3 zMgv+#BQ^sA77l$zMpn*$LCD#geRw6n^53KS4Q2QN#bU%_$jrgcLd#-c$U)0u%*;*; z_!tH)yFLdiI};NdCnJO5A5ew{T%tDiR)CM`G_wMj7}48WoBYx6n{X}xc?lk3COU?H z?#NpL9F0E|KGuMlwV{oR!#_>RW>!W@j)32MGP1KUu&^?6u(2{Ra(p=HKSHWT_6{Gu z_#2gxfsXl44!BRF7$^rgp_}gN%cSFT}+LBGsVEfO3T1R%fzb8z{JJM$i=`) zO#hd$^uO2if2`%E|Nrp8{fEH6g20E~pZ7k3%SWuD|2tUy#n*2N{~!MRH4py}d-#C< zZzumNe*a6?f9d*PG4Q_<{;zlam#+U61OF@G|9aQ|Z*;-@lkONQ7vW4$SKk_h=P}!$dDJ?98yt@Av0-dXLBN%M|a=>~60pE>R&fu%lZ^d@i*c=X=KtnLbbbUdju{zfQfQ z_6Zgtc?J~tx_{BWKHt{t2cj=P{!-)9f4y)+S%25l=A#c*^mckDTyEBBIp&J-STcC! z9;Pnz(Sme)<-P;(9`6|6;T9z=tkO$Cdb~H#&A*-AmLMfoif~T7H0(A`9OB^TxN*(2 zD&Vq3Rwc-ZolSsKg*EZ+a^^cOPXO~Ad%jaIi{`4W9%=BsOWwuKCEa?dFPwS@Gd!0^ z;2*#9toXK$WWwWl2(MP}fXua_k+uGkFv8>7y{8r%cYo6|OeCbe ztl&ViZPODUSJ8cO8})Ze;;iw^SlX?vaN;wymS@&iG0$Io6XiC>_~`AtQ(IcRbY80M z0f?v^t|0wVeZvh0KnNLJZ5W0TI=Gd0BKMUz+}fj9JT?06@UJa6XU(#OL4+t zb#)%`G9MkwF>AV>oZX;K?iTRr3eekUSYE4+F?e63r$$yOr+5As&3Qjz)zQ<_PF_lv zdlK!cdVF2|{O!a&?OFDbE|DSqgz5bZL!H+#xDQ$`EZ!Mjd*Hmj(;Kg*s7PY9@#VE) z{o$#3PM_YpLqlI7)XYYV2k2)BGphQm8)gf_*KeEOqAAAx*8JlB3?!CXb&-ploUF_riI=#Mh(jc%>d#Heh4tpR4Idtn; zeCgeP`h0EQdB2i+djIY@%JYIn^6KVe^E|X!(_FQAz5QmVrJe0DZbb>{CPcYXBw zHUT@Fvn=Bf*m&zTPsM$#aiS6Dlrqh?Q{N^>Ak3JEK2WvY%15lkIT6ZD&}JQVjIHAn zoA~RJ>5*&0MBuJS+h)t!E7Y^?+P%kQg8Q>iHq!7@g~79@bttmDjCFt~lTXvw1iRn6 z^YweJ$uwWf^V?9`0N=~?LE5z*pV>X@)xAlGUSkvChl_!Te*zPD&8-%6ndc^y-9gBP=Nb*1EZU1I=}tVw50pW1!B< z`k%kk?SxU4b`? z-btUGitW>IZ_Z1#(!gmDGs`*3DK3FKqMK}#mV%x`AcRK6ra|G#2 zpHX}izsqqiuz7LBe3fQSnU*nm#U!tRTcgG=7;BDav!z4wTyd#aZdclX0U1Go;1u(C z7Ll-Beuohia|OX&WZ}+#nX)xo%+iBpRg9*m=8O9DPW+DvFwi$usQiS|7w@L=lPgf{ zFRfWr8TdYr@m~`uu2fYzYanf|D=XAL&!eFaCX)_~UDw#&CrnBYm~pN5e^1TK=ZYC3 z%az5Zs?}J(nR)mHh4JvjMQF4{ zN>Xkto^E%=RjF~q!4kDH2E>5v;>)g{|49J_UTBydFK5c5ad~E=Jt9sc*aa^Oz2!QB zE-$wACwq+Em>naQvqP*{g0!B!_kmBqWdB%G1u@=snT2B$;t5Lr+T*z2@Z|CE)8k@W z{WT#Dv?1HpJ{9qMfblm%z!TTaIsO0*f1uCIC=YiH`_(VvR?XrtwVwyF8 zLJ24CF!Y+&G6q0KifyPSDR!pr5{o?g^2P2PC(9cr9t#bECzMn55-830zdysD{ z4pey9by`Gr`bNu~-}cwbD1-Zw=%xQz4~V^p8r*%bO8vuSLoecdkDWqBFc61mT-1qLyWpzxP{HKE zTVApOpD)E1Rg#vlin+w~dfv#5cjl~QGq6J7h8hN_hPf$gsm>5o_`LNuss+(XTAl;P zu6nZiiLF}=raq#a835~c_s9kQTpl4f!MFpD&OKR z$SKyzY-&r6#i>ZbqSKiv!u3*FlWq1f(nGXaiW&+h^^@;Up(d8bSnp1FNlQ{Mw0+LU zx7Lppwlagm9DeB?5NV5{14n_s(QsVhx+im4P8q{cNItHrDW{3v0YPRaXjmxg@Lp-u zST`eFd)&c!Bsw2_cA3ClNJpDL#O;}_7qlIbTZmy&a@~@(?#arGIz7vqzye2u{xFpI z+efSjc!%bgVEdfBH(8ePrQt4pPpcldiKtUDnu^`H@bFQ=j@AgjH#e$1y#$N6;M|{6 zZbRjV?E?*6W9V+wc9Cbs?6j`i?vF}>9w-^1NGRB749*$AMBi||5=t7VgRAikVXiBw zHttecX2fX;d#fI}q|ZiTWT^;D8fJ6GkLz-VLM9gvwNJdcCPW(S%peN4pCaR?t+Gq{ zYlC3f3uG!{A5e|s69<<=Ijl*=<$`er+=bcm>}klPyS#aA} zQT&YKu$ORf3~Pz6?6osN(}Y0BDpTUFvXgL;E`=%2v3HrQ@+}uN&ebqX@Q%^*Jy~j-uc-fo5%|1 z;!YOc(NGqsuw^d5o6Vs&hSo5awPYbV_7mtf3HCN^&`Fje0k&wq0y9U!$t54U)x0M? z?K4kV{mU;q0$;KAb#cH*-mZpUC)(ydTh_2DM4C~LQpXE(uip)@`sLmPDQ9Xy3#Ft6 z72Eb}w!>vS6>_94l$MN30~;{);mioRTY;sen*zUT-F|)25c=eb-$Z~hMQ#@YMTwoW zU9erAq>IKy1w(JVaq9p&H$)7RRDW8;V*PoIi-8@u7D5S{uJM@@?bj%J(6|}qKQE2`vraL6c7IHZr)q8+JUiIBAGe>~P**1JE_B3Xe)jI*KgCiq zmZ50xjNzE(cK&V|a3~`dO(+N_=%MfKd zy8Vhwsg)O1GAFb!qBOKv1_t$*hEr{8WwrN}{bUYMV0D(3&RJw|-2rSzf=Ue1&q zOP!BiKh9zXIaEWlQSB{zFw&fK%%f9Di6REYuJtF`^C3Xc?CEM6a2tQw!)&6b;Sgd2 z*-YW`u3(kTi0u3tR3i>qc=A4qqV>M?d*XzFen*mbh~kE960sxFEhQ#t;Yb=#X(KlV z2sZ`iVa#Mc!UbLO0~htE>!=e$|`%FsNT8rGMH#8SU7%b03ZVdn5StMg+fO5OA@{y5y^{ zH%BQn%QJx!WH(8_)^RzOipn6QFm5^#z==~JGSS`IwuJS=)e~Pyg`rGyLp;mD_7FJ& ziKv>^CLVWbPRFge9a0(Bv5K!VOyw7U8!fCXDU$h5q>#@Qs8a}{rKFpT>v#qYfx><_zN8sTv$utZXQHejz`BAPqKHZNq}1n__)qh-)iT+l(m z#L5fX=9CBIJiGRUk8ow92;7I6{8e4cjs#j%Nj&mYSr9qJ#rlK$8L(vXou!S=-00*@ z5RA*X`zb=>WLCj&N9l(In)u-nCt4S`%9#iy?&i=;Y%ymK)FM~m(T7b$^H8htlL*{zV971+-<6^@r!MVT(%>||AF%!_(!Aq@PgIwDZ)Y0eBG(%5Hlm&L1KKv* z5&N+h^eu^>6l*aZQz6!xCkQhR>DVIiqecEg*py*QL9|%l??}_c7*=-5qSR zXvx(~Efz&l!ts7;ze;k8NH#RYDfc-}mp`ouFre$)_XCS$8UkYxp?regPp}a<1+?D?9t^&KZO`^q+xc zY*aq>!2cwg-wAZU)z0PK0inMFL1=_{2OaJ#;j4HS&eVr5n|$6bWyX}T2E`p%L?N!e zAp}4H0-y8>INi8l-Ic$D&Ew&+XXFx>2SnV?Y00CA>E^wr2bA9UyD;Hr>3HujaX!Xz zpY5s9CCJ02eUf(O5LbK0%U6vtaGtIPXJQP;zsFFd3CA4@r5mMg5D({ix3LSv_f@svo7;!Y1-w0DBx-%-h7*PN5A|Sj?ZIQvcp7G08iV&Rb^QM??>hS5Z8*eQmRD5e<|XNGWm7z1s^uMFNxM z!{MOvE9`eBlC^pZE(YHOEn@J36bE+Y8Kf)$t6{t8>aVt^Z8-i_y?7Wv6+(0mp} zeXXSxU#>q)w{4e_-BtOem?|m+OeG=rfVfyDl78L#$WG2q8WYNg3;%Us?GTAKH|Kif zHwB-o09vuf6nh4HBW*)X`gBAXt53EMV}vppdqi^vp%JS6URMX&A17w*5*1jTpMwk$ zFV^+-kehcJ5Jymct@MjAiIxG=#!y>-1~VlX)Ue|2r=xDa#}0imZV-9?i4x9<{l(TT zd&W;HA7qZZC}_!Bd8I&HMa})%V@LHP0fPOP8c^CF^yODnVN9TBdHV!fu%vz)08PXN zMCkdH;S888WDyQgp_=AJD{86{dI;U~Ri&VSNO;w;=7Es(VJj>txe4jJ10nbR0hT9; z+uAJV*RET6Qcncm z#A)MYm{>C9H4Hl+NpEhpOlb;&R7;7zE$D6uChyvGd%TU z#M86*48;1EFz`lXH^q7p5={StTHo%-?iFQbq{IsDprHlG9xok`Nm0-Vy@*5jCGq`QG5I*6LNNT z4_h2y%A(F0wm8g6osq|~)myDO=DHS@M--iQr4-69-J3GEa_xds^|wEN8sGj*%Rr2x zCUY_Nlq5~;crI;i&WAWLGZ^8oI)|{c6y*cssDpEUp=k~^T(skGxNUSs^gX1dqrClk zoF9PV5!paxV$y=0&ZNqsOZq%p14b_Q9N(D>o4kCCVzkM;WwZbu1PPve zI~qDkJ_#+}1Vr3x%6e_mKj1?-mj_c*aNGIup3TaYy`6)Wx-qZra9^5CRD1dR+yI}5 zHj3y=rnA(8CFQjrZmyK^%uKH)DasVwv}?%^An;F?X00-1ab-})xe9FcNj!Qq_C>v3 z0t3NmoD2dQVPK86!axqC@8bU|2;lQ;4@zEA_5dR60__QirJ#4{3p2CN?_rfp(Gdt| zkT`(RVS2@DzH)wenU+=dY~cG+MMETQtY_*L~IA)ZZ27_n5QUA$}`W z3pn2te*K1qfX-RV=UMA}c)n$N<rZ+pF*A!DMur21PFrSCbC}OrUSBy)s^Y98Nt~1$r zpHP>*6gm4tgfhLTv?2} z7`F4mhka|$b|lk81vVSVP9sNi$_T+VW<)Lk182Dp-xu=uOg*Cx_(kLWK zF|oB8aabEj;eLF3wn=j~z7sIfj$%>yS=@9Gqn12IYvOTOJ4TNbE90ab!yU>q$uy#_ zTIPfo%)y&pPV9{m7n(KhjCVQWXUQ66{Y}$w#M5AL@R?D>@4)`U_MVax!m zai8{sZ=e+KiS#@0r7fR+3JNKk zP3XJv561Z?CXz#eQ#FBFsAj0c=8?gKi1`TU2>#0KVGb{x_2E3kC$&COhZNMUxn;bqd}%&X*g>DtQAtgUCQ;nPOwJAh3fckSMS! z>183yp9-U?aKwnZ%CtF!mE>w1X3!kV;j3@j6K#3fM74}_PMFs3mA{ul0^QEDl_88( zjyz{1{^Oh=kYK%QQ~BtSJW!?7RRhR|n8r0y`HT`uTZ%&OwE|{9i>5a*F5z^;f@pDBl6m@LDgfz<) zXOHeBU)XV&Xq6=e-UHdxG~!j2$aKdwW~tYnIL(J!gYI}OKHn2kTjM)6tXJ|RGPkCC zf@xd3lVa2_rY#g!3>x%NzpIER_IBRE!j!DsaCKw-imFQ#meoj@@pB(j3*+ZuUPqqsYS#f|FK zniVVa^&;;rPd3ERYH(V~lQ(N%`if|~IfoKdGLJ#QHM%)oVKU~Hl8wDlw%n0qG=Hlr zEX91p;e-VO8gd(Q23Q-ZRcDX6U~}jGu%Sj!<-snvG1IB#t8#2{N$NFroHSqizAwhS*RfpHVga>4sLvrmr`^xzZO-Ywmk2cn^NMsr{rqaDlq zsLRFpO#euj6I69BVg&J|!Q)b%j1&13D#Y&xWq&<`A~U^`Vk9pQhwFeB;Taf+`Y}osYbc%4#GM0Ilz9IYfaLPymBv(rp zs%IQ#4{zYcCIuHXDLvi`yE=o+`Nt`!qeD5SS4Z2;Hjvef^CXpjGBq6ztkEa6t@}Z| zaNv@~XP~1PlmbyO)U(dn8_9@Eph(RZPg_tl9$A;@M_ba7yKWlI z6!JVP)8H;dc-5uvMhHA-6a}H|k%Vk5)wvmn+#7&PiRcKs1o_Ak5CCihd!Z%{p%^8a z>%4aS55pcjsJ)UoHxuJu=3>s>j(EN?b}zv)J{$`^Qx(bU`M6D&UTajG^A~7d`(Izs zN6bJZFc39Ux3j2B>U!lTwjO#1H>~aQtG{uPLM)=gMp&!fWq*D@;@g#T@Gm0%oxJ>+ zq4{7XN$0iH9rR9*g!f;P(~O9A+tzG}fwbqa$%+Nk7w=W-9-_zU`p=1=f9+sWt?~yq zi6~B;C0oHW?lq6^3BRIB>OBAijrt@bM!`lN9ITWsQLUS_*`^Qa5(X5M8!qP5z?*Lq zoj~m0B^MoI?i)s{R(zJ#VN(udLGsMl{xVyP(xc3BReV{RrfZqC(lRvC_K9A%^e|{t zvsGU(-7DmxJo}J4iK}Wd>6F#+%P#0~9Rh149zHo6n9XxGd>wj_(Jp{4;i}LepoY_+&1ncdqr4LU31d%bvIpv-l0b*huiBBJ_cLJ3sKQ^_q2kXOjN1B zFUdKkn=5hy#<{q&!d6~a_*NsCh={p`-sl6?#KClOEV)oxXY>)naqD8VJfC_OjN>SJ z)T1ew*`?+)@;slbSMO)G1{x)OduG8GPEJ-=`I9lraSY#EpD7B(`(k@J)4Ca#vXMwG z5*$nYokpqpK4H;&6q8pB>U@ZT_h~{{U!f_e`dmf4q((79|}d zaC}0WYu0Yqd_5+2vG5}vrHo?AAp9`c*dH1%XVWVYef#;f-TOY$|9+KlegZttZ<}D$ zH6_xwH%o9yUEUYsvSBuKJ$2oL81>00@aR6%rn?D_f=pFe33U5)2X^EpckHpN18l22 zG~=$kV|fWKK<#qXS3)VMT86Kj`%>X9Y*3k#eQbxFRmfU>`vuDK_E45RQMukpeL{o8 zUmMTl)jdL#dq3%XiA8n!)sMjoMQlkT{l|p{La18Bk{R?D<31r6djF7IPu8Z-A9Mry-Ci28ScFRBv&dYcYTQ`aUqSg%1=1QqULM)S&l-=ZT*Cs^yxbL=-XiIrD9dPNdLX8JhL9(B1s!Z<4Xg~<~9{MoY znqU{i^w5k=Y}ANk_UgW7VlbQNtbB^Iq&YSZ98rfa8yAKii>6jvlInRH;Ny=@a0wxJ zI`R5hUqVJpA>=0&A)UB-Ek{dPai=6mb2s0Y|Y$x(Z= zQqcpxdsG%G!2bI`=W`QOSlldn6G&Kfo%IW`fJQ8c;D}+S@}_>%niK8ZRSnYPDQ=o| z_KDn#7^-E0DhIRZo^NIyI3eXC;I}r1BO#dcIFXbt(Q;jDsTI0S4ctU|;-tHf0*x*c zc{$v&9h01=lwsf8-?`GsDqUkP$qfR{&F=F4nLAivzu=Lr*qU162(xxlj^l+IXG>g{SQbNL z@6}Ty8S})u+&EFWN!#-qEN?3|QdmVDyn}CrQKB_W<#DE%PziO+9fhb^cCJ%E<*z-2 z%BZWb8g9MYb#0b?p9?4{gnl`O=Ui9PC@*U+J^r*Ve7VRO@y-}$Z;!h?n!FJ^6dcu9 zFEF5GZEYj6!B5YM-T`=fpZx8~0UiEA7??Pyc3*=SStA03Z=)sRn4so{({xF|uMtyg zvlj=Y47ld{q*IvKdfU|}*zSCF4dMVcY#ITIM#;i4=f8dViFPOwyDEW)W}xX7#%`{YbrPF8pDLtuWoC^EFsf@4N>Sx2O? zXWx0=oW-v4;IaaE>k1B=N6H8{tN`q>FGDiqy35y%ec6(_ehLl#@Jk@n2}Exh z-z79Y4UUa~??>8lS&v2bb}o7b)EX>oDM=0Iom>@68KOi2nW$)xypgf2B2_!5j_Oay z;U$CwX_Vb2s_W*Fsa?<4Yn7)?{BnLnpY=-guD+E+D7)}lvOLwG9ZfKYp>O0QPEDMRRKQnknom!YN^`vKhXB1L2L@8 zquXZ$vCP-vjMeCxsRYrMjx&Ys?OUK;7oz=LK=MJY(gVJ~G@j55s;&~zp9~4gR*|{o z5PzxI_8c)n1-v#|yfrPw75nSwOY4^^tN>?-1{Ok(!n6?cD%cXt3gC6P@0}YJs#dd9t)8r3IdaVF>!EU1_FICSMoTIzFa) z@XeXTa2aI2C`{lA);{Qd(^_~;YU_$i$!%lgyZA>@QR>{`yb`@7bEf2HY~XyQ)=TUh zyqYIx&hYD+Wzq2sh8*bq zyu(~7UitcXiJ1Jk1O_pR+q(T0_ZO=orY}S_@__-pZjo*pc=^qn76FU9z;res!=;m( zH1*4_kXX-#ct~x~gPLr_$z0|&iOk;*4mT&ZypnC%eAT!>b>q@z^*|-vOVD>hCmGEq zg2(7ZpNq`6;qgvsLWM*g5uo>kZm%gg(SxatB-wS?Y74wCzn z02T3dk?^USDnL(f?(yyX+PSLoDr`d>4~04JoW(3&$rW~)!BFy>PL+)Gwl*7Q+Sj@5 zpLhEyS`knlfWq@`Ig{o{zqq;K+rx$Hj8G}MoyH>YpJGV>U)X(>e;TdPYtOx`8m$51 zB=DzDbD0alpq>o@>Q@Fj#t~zO7bC^tb2*CXdSaz#bsM|2GE|RJzP_8E8F_vqVZoJj zOry09L#{WR``gb2M_sJeu`Hl6Si0sUw}{AI?p_DG|SFUO{R8rHnn*3G+`M}Awexb~rz!M%UGE%0zxcIa+ntXyLTfUWIUt^$;5iMpR zAo-~CEW}dHMHhD4@4ioKFM_al>dS2B91HSK2qskBTo@U#uQMN8ZL1ONFFBM@1_u^b zmBuv}OUJ7{ip7QxjH!`O`hj6EESu3VWz#D?;*4jISgZHV;>FpU_^IjsdT& z*&;WwbHP}8fH9D6Mk9l*T?4Vx8;7=p#^RJ1|LW9eB+~Oc3YMl3bVXX|m4~&HsFIr_ zu|E@1Jl+q^(iGes(&>`5+)=9pe4d_k%lx@5aripszWdM^e6Ejg5W1=vf7&#E2#wEi zPkF=aS|xUFtS^*5vM|!GL$${i;c1)3;fbOsv?)rQL@(D(t#Z9A=4@@Y` z8!hpB_u+*~#EL&cgLj|}KO!3P56=w;H_1RZP$^56!TlcBfIWZqYH$xej?&;qtKq2B zh_=q*D6qdk){F9!qt^_UDdJzINbmb~t zX-wd*!w$Zxgs@5nK|4*4DdeN@7<^pA#uK?Gs6{ngTN5u@*)Y_-_ow~l?%9ulqt(u< z<5p)xKhISm8gp+NRp3M+0#(&-2BLs^B{zs;@%uR}rk`LYu8j;6vez`(xidQtHuQor zz2b?d6fg)AIsMc^S7wWCViioP8HVa|F$UGbV&3b1oBRJR8oWglf(&2pd0Z70$Q<2+ zQDq9KU7iv~YUTt*zpSDysnRz@jevZ$H!t!4NrpCRXAD;cT)ebxx z=vz182$h;dqn9MZm1AwuE9cB0&xOdWogSCFSfIFLGP2*$S1Uy$Z##cJ4wM|Jw|0~e zp^6T&mI7&+OJ4>~t`_E*ieGgor`vCyY-sJtF187!SOsVH_6eZtsdo{h<>5?cJ9s&n zis53b-O93w)wyuFy-KUCruunZR*W?LL{yA|xE2fN!zMN&@JH+!$y>RV{Tsx8 zIW8SAiya_h%H>7WF_U*aeEGX%ljzw@GP}{aJ}bE_^raQ-pK0fkZFD6a=DFhYPZ`U3 zA@-}q7=0q3Mz~o>%pejWjG4Esn-5NmDiQ)CnHQIaA^o=ad|sh;Jg4^4w+h6Q04#$> zDb0IYCXvgR8`H!9f}8>9<`r6R=T^PCz>qV&v29SqRY2|%+nd(hNH$zir6N8Iq1cVx)7yX7;6&lQ8_4K8oV>R{M&uR+@ zd7KBeVbzykpSt71$Y&dbo9j`-^>@7g?76(3u5_414y4fUj&^juNb@X0stTM7yw!1W zF1_nxGHhdR=!jR)Ml%JK*h~fQz2RLy-A~u(es|b()*&hPJjo?sb@}k*IfAU)F*pg9 zwlYqXQrD6_06c&1^yWk|eXuFJB{D6P(jSZeX}%LwTv%@D0IwBILZtcOutMZbX=mv; zDG6vAM{aCAn7d^np#@q_a}h>5QND_hj8I>+Ex@kOY-sjks&d*# zm7dOx?nCB6NRO1yeL5Q;BmTyx?n``v=dkvllM|HRx29Uu-ciB#8R>{?A;7Pk*>qaQ z5k1DNU{3Pb)oYR>{wP`INbr6nxX|A5Ynf_)(UUFo2FvO-Hl@Q-Lzd7IXZs02LV^eu<dBq0#oSdh3a{nyCcYPh%WP)rV8A*Aw4y zYQwItO`s4=b(U0qDj&s@|9r=De$TN?ad}5RzI6xGy0Hkqq>`h@1^1i9y6DVH%AkP? zWKylZ#A=mrvuAkBIq!?6-n0>MVn0*`x0m)3LE;9TfN?OmbWH!psP?^F3kjuQ~Gnhx&mpaL%TQz@UzHfzIm}~D|KUK@a*U^cY;EK z1`9$KKb z4)5)(eD;dq%%W68x0vbUC`HD=1Wyz1NFX)?XGvLD-`0Ya>v1%mjI+Ej`(*zFROgLcB(o_$ z4@c3)L8=ejs-gvQTKk&sq9)f?^g(h~zM*tdKUFumTLQ&&bK)27@-J*Kc>>j2T2e?k zeW7z~T7W6qH)I!M!9FRU_)6ztJWqE(exF@}E{6OvAL5dls&0qtrAn2&(7?=vHR3W- zxYkI2lg{;La8BzhM|ET{&LU#&Hu*fl4beZU!qG^AdB{oLffBQ@4y-<5l*1gnjq^(^ z?oJi8Jt4B5WtLi^{>A#8TH^k&L9l|F3dFQj$sYJuz_%B%Dk)T~qc~C^vC60ul2fCw zr~%zavl<5SieMr;qaV*u-d&sH?QERyWW40*F7TWVqg58QPD>@E?eSV#Nyd!p%WLWd zRg_4|#JFW7?>bm?hlth^6Q$BKvM#s8f<&D3Ay(f8?4{+^FAv;aoG_<@VfX<#mn}WQ zv~LlvJNECZ_%GIb(@Ozm@to^|qC$w}DkR&n* zDFhN-KAiYN@eCSnd0ZaWKm?{WcH1VZI(vUv-UibjtYC`BdE=@&fV0@4wJW^^L_mFM70Xi4Fkz7v+gdFcTZ=7DIR zuls>DR+C#xmrm6N=*1-659BB1b6?Hn%O7Q*G4&Yh3d&|>gPTr#;=*T&h=1ZJ^K?`c znTk=NeG{|Mk{x(GU<6Cm-z-*9=1O3?JuI$lJHC}7H%j8t|FzbC+uV8Kv%SwUTi6(= z^~&t(bfT?=W9)}&37BPRoZWBuE81TjT_bIWSD?i-j_d5E@uUHGrm%tieHeF6LqeYv zU}^Lrl9HpwndT1Urq^eq9!SdIYXvP_@v4hZP1&X^=hJfao7pWlCcXAYnKq2*)Y`54 zd>5LQDKUGcbx5!jp(kgi9beGPyK60y+L-UZwm8(JJd%WuqH%)L7FA-_Eodc`jVxdg zc%3D}F+q^_2bC9i!+M1u>{EJp#E@*9HO9`k(1Z6h=G1VC5!56&#(D9GJx#zmX`lsg za#K8JIPayVwkhQNQSOnE*l?>C`TwR!m3wqH7+7mFj`WvsoNC0Rv zdFk=whZ9!ZGJ0QOJ_lqlvboPV#}YRa!1V=jqfES)2obDX?Ov1`%pP1P{A||< z=oQe8ql)XYYzIBT-UfY!fz$^g3^2JeK|x#Xe8B@u)3@I2&SI4KZ%3>o;3Z-pMii#cl!Lr}q zgD%^;O)MY7@5PAz9n3ZXwp)xh(R#K9gIYW9bPv6A)l1e`OUe}D#=$wTTiwX7w?021 zb~(?6G>wbS+~WQEUejbRmC*Z`lszBvPEj-1j=uV~_eg{wCPf_@DtCBr`FIwp0Yp?0 z64;@quV()H`nhcjT)oxwqfj!$rf_DTg)$ zkcH|t94I%_K+J#vTKu~5V;4RKrKDUTvz%a z{(a9u(i&uD>68x5*%1P}^X9RwhvgW1{87Y^94jVZD6UZwKRvD$)Rz^A7@Z{05Yi{2 zvR#=P!BX;sG~{tG4ppvadsk&=pbx)9fJ%hVPSh59!$c!#B)ah@Zsva76*BG_>WuqsBL7GK!DA+F-}WS?wPew+M}I4mBF)MkM*1Xp)B!Vma4yzLUu%v zt(Uip+zSb~Zb$7k#Gp7oajEI>;bH7klF>#O5oqx%5^of_@VyKA4DZZx(4`W-a{&Ap zJwltjBxWPbcogM@*on5ugy@BFeTx=L-W;J#aJQJby>sNwRg)V4Z&g^BMpH$mxMok{ zR9KQ*7o2tt6-hX0KL-6=t=kc!==(N&Dlid-NbonC{8a-ZpP|z{Qd3znfIQi$$o+^U zpfcZxOj%YXDG_OQHvMH%gX{Hll7b?DlUIjDzw<|1=p=FxtO(=v-tY^fh6x60%u^mF zj6LDGx%mQc4lMF_0%=d)S)q$xU+O<@WFFidTQFTtn}S{O{Uju(>p0j<2T7gP9wVcBaC`J?UYR5h-*BV{fic%j7^#`J+Va5CUhDc zWN)(@F|^W}FT;WQrtSTEG{E-+rVG?RHgYs98LCrZX=(=bIIzkSia;2%HouJmSlwuF zmi=gUen{2HA+dbcqG*;4ovfcvO{AIgU-AnBRxx|%s}Wpr?~Y@?v-pWD_-9}8K$Szc zk;MV5;AdQOJ=wHy@8{y(Uo-y6N^qKCzMb3Qr;4x;%^7zd z$;Lyu!n_Ba^AJMAGoAh8dn}GR=_kqNYbtRgn|Yv4zyEjv{Mfi9%sId%?Xv_=(7sJi zSz&gvQdUhz+vd9D0MTz^vLBek7JpS~9(y@k^;>x}AWjVPJa+YS$J!!T&Lpo}VF~(v z(cfVZmli9#-J}_T58v2a(c+^@{fuyCSw{)W745W zjcktf{J!!VN-XRs@oEUJg5Ezl)z2Hu)DfC};PcP%tQx2SJEBB+^Nd0(sY**p2t&VUA3 zA?7^BiF$bZuoFbRSgCV1gQ!EO%>%NPnH7ur;W5P71mR;_=|}n1nX!o(e)>`pvw1ZY zs8OdC8R0gyn-+Vs%5B1i&bfJlO-xj<&0VuBg=eHvs+y_8zD_EOMQ!V-79Kp_& znT@9SpWQr3#TAd^`{tAnQ2w~go)b+kLIko=$_ zF<_xEiNt}Sa|uQ^X$^iKbcUz z5Bh~xjQ@qT|84T%jpcb)AzM3ay3jc3CBS*PSz?!VSFy(YW*W+5C5p7Ng#>P6c@fOd zk<;Fq6fwBjPP_#!bC4j1zWM{%C*ekY0Ch?1qS`fSXfUyBo>fH#5joI9pt>f8h$mBI z-j|624g8H1>T^u=K6bE_0Y@Ye`_5kLO_?oh<%!*KrgEwg5$Eg|g;aB;8!RkN4KU77 z_4Pm^Z!@(`ft(-o%}}*-!GS7<{=v0SP2|-FphrruOrR5n3{k8{U^l4WQG|UzO*7I% zXRYB;T$zq3gg#wnn8_v;6N?6acLo`-Ih2~BsOo!ElR?kzMmZktRE&>x5`^w(UA9sd zbv$wMKV5xO(Y~2KEw&m0$pyuGWv96>{K7CR-e=(gsQ@(c={~>Xv&V8tzUPWSu&PL_ zxu4Jx^{~WwP6Av<^Gp7#HjpS7onrgL_#(O`-e`xFe9J_5EEBS#)6hvF($L(4OAO#j zt+@M;cx_jGa$Y;QA4YR_^Ce8U&p7b(YR~bMhlP9C|6iRF*|1v=T_G^*JRv`{M!|GQnUg<5Um^( zS6$l7pVFPK?ODm5^|5;4#RFJL<=i8d)b{0`>;S!dxLUk9&R9SE_IrxN_}^@3W0UZ` zKY>%NeH)0!GFO*1+i6Zd1!gak1?BNYa)tKN==HH{d9 z%nr-woKlalQ9y26s3l7u=#kP zmGAkP-fz{~;HVhJ3W-B52u%Arv!C2enSoR)SuUrW8=(kl)euFQX4*u1;gHOD|4Wlo z>s2p@xWw0P*EU^XC(~Po#Jpw%PIf%-O@awlah;eB8ZX!~+N|+W2Qu;BLq$k@8oyr; zdM8!>sGo0vEJ7xIVr@omz$^X+dvdNDVe!)!S%-#?Ss!Kv{JRnTLTIojpp&Fg*dP5_GjF@)H zZz8PW!VSqE{XwjMyzFj5_aKk~!%~Rla(tl&*vXH!KNrA~GK?x4+$*+!$=ABu9WIC1 zq>mV&q%N|ap;rykt|E9<9qkShsbdUiC-fNVydJPw=vZfEPmJEC;XS|E;+@1c_9?IE z8b{shGlO0I3B@%_q*Xs3;V_V+=15V!FcrU@h|`!lU1-PgQce)w>AJwr zjC^ARK8*qoLI{WjRM_Tv^z}QYZz~~XS1pCf5<~niwh8TB(8Ti>`ds7%=OZRNr2)6V zQ5uVtyErXRUh{w@#x;^W6N2#U+7fZ?`4f<0u(ySMo$%I z-+>^nl-?k?n*Oi}HZ(9QiE8>WnVuk_r|eR=8OXDfkOsmu$P67;Xr$MTJ2m0ox@mfspx5rheo*L`zDW96)7*>f#fSow%+|RfB}Q zLYR9uV`LT2oXs{&&_VONYAPr{yBdRX0an;X4}^fl7Io)UW_i?$0%>WV{RP7A^mn-` zY$$r3>eM_P_1&vI6%v{BsAHr%(YN&+NIJqbC?plJc@d!v7hAV%n-+TgdNdlG{4&Tt z6O1u7@W80ToU;;r&mTgRKkBXCu*Rqe!KYNoP#Q7Tw^2xk3KPJ%rd_77HeKSCyOZpFF3dbGz3o;!7x*&ph#$JlV zz4!YUGA$oK9h+X~Q|ASkSGhm2UaAL=b|5gvecfL=6Uk)e#w()IDnw#cq-oC_Ayivt zhvUf6gw*i~Ibeq*d5*h3uQ{TpRw+y3Sg~_{>(yS!ir{R|pjrnD2l8X0wJhOADH(j= zvJLke=+?<}E?u$=v{a%N32Aq-(0`i%yP9Zl?Ch;ZglZNtJi~6?Z=#&rjTkZe5D%R#wTxJx0go%#}<|qR|AiIuT%Xt*v z5Y&Ug``&UhfERsumOvfRBiv)7PlhNDLYXG?gVhgVfCNG4!<1;2N}Dn{?+yNF7$loT z+!0rkuk|SJH}7H&al(YD(xzRlE%GvlBq)R~X~$~OD$62LugrhTDTQ;5_uMPeI$z*O zF2T-57)x0IX~sd@*#+w2skN0IS30tu3&k=)1>@zdv^wB*&_@g-zkA9#l zI&qazX!rdwx{2$eyb4(#L$8bVdNmy5Mo??<&*2V4`}m^&+;QKgiFJ*SO~y;?0?S5 zrN8uT8v^rmbJV@tI5EfxT>_;o>#jDTMK= zn@rY(e+*qHuD?2b3o)J=6xL~($I;m>{G|hO=?ucgu{AR=;y{G*bx0s8HkSWYRw>|xoG0Px06uNG_o*$=3)LuQ@PN3UbxcWGcabT6-+RwV94JrXCw&du~JXBMs zrZm;B?oHfdj5X*3gDH_7~GDv;!02B#j(!3~Hb;LiQ$Z?(qyRz<}fJrJF#DC6i^u z#`*l&dos?4+1uPW>}5ksf0%S_@cqjDc_^uELQPy0Vz8)KPCW3{nhD(~QPP;qmNO#O zI$^#1imt|q>to1ZAMJ_2cCs##d2XhO42CmrWDVtw<(;c*G{}m5aWGO~8Al@8Hsmr>l(XL zXIM)xeJY#8T4Ma=qZX`h2&Hc$9WPHw0&L(3F#s#uPr{iXnn|`Y^4#>C|FWl>y${Vh zIvDVH{NO)H_lKP0D#wqB%(Bp1)Pg?a8o&Er8*2j?Bm3O4_tq?B^psg=6B@qd>`weD zB9fl%{1>4Fehkm8pM|A5tkvroQ0gOKQ|973noy)%lpW9^SAX?PN9SmL@I3$lSZ2bk zqe~)*D0r8OkXB9l>0@V;u^W!2z*9o@Dnn)_ku&A2ebI5npzn_3`dR<+Qo&DkxMh$i zdS&UK{(GA9m*$N)6!JMq(%A~K$9F31xb3KyJn&UAv)k`mPpT~jVL63+Zi;V`lBpdl zle1~8#6t_ZEN+Xi2--kgkOaCME?7Xp&7)Yb^o{0W(evXk?v!~WBzQ#zugNtvw7DgD zV$?PI6)e6tf%VqeLaAe3ryc$Z-|QsvEE9@w{X9m%8Yp4m>FgPt(+JCnVNqI>PgiYU z@p5L)qB=`?t%041Ax!gQVcnWvZIu4qD1;C@k3e1fj3qH){|iXfgQ46sg>lI_17VTG zz)ULKPITwMc!c?F{D~>AX&Q(fo!EGeXk`9-?{9Mlu$biUH=c`S+Zwe^fjYj7SL7;3 z`&`jeIOZ6Uc{P!14P1Z*KF&YOFA|TVUdCm*;wP<|`hc#HPPJOX7#RGM_FxCgbS9Xb zUoAw6B_t9>Z@+XR*m~?E5hVI$EuAr<^GbLhW^}Wr6v9s|6YzNzexW9xyQKi-$4z6M zenq`+O+=Amp8C3Cy)j+E zd=3(BdlZgoZ}(js$E1^(8L+RYN3ARy+YNJw39>-@sI^u)kBR>cqVm&a*{BrI0Y`or z=4qhz8=mDMsXhWexPN{No;X-C>ElGCjqx#}ut)C+0Fc<>fFrGdasY{Hpfrk>rSdZJ zbh+9V`&*fF+j`|bH@0hODGdnQ;o@K}yQ?upfA{}DI?g7ngd*~mZ6onyNpRzbmtR1Z z8DLtI7YSRfeSk*gt1h@=sgS88EDsl1J`*zu)|S3Vz#kA{)U?)SkEZ60HCvePfEe4> za`&zOz3P9D128*!Ad|VQzNeNU1TznO9`OpHCW+}varf`sq?5{-Q#8E8y5=eiNH$fs zq7IFgNU6jct2qU2BF>pnep+=kyeQ3-m2ze6on|V}rqF^vjWqG=o2^Kv2i!ck->q&a zfB~k0!LAsbBa9}fr4R!BOp0;8)1Jd2YcNYyKuM|Sx#L2fYl3}oOSDbavVNs)i74<&nK#jwD^(9O#2L!_0)DED zMP=r!6YhT3b?nGQA-DD%ScF2C-oqEO%+Wz!>IKu}LB9gp7uF*3+;*YEPv-wh7x=I_ z=v=t11%O4Sg>psu`$WzuK2Q`B_3YyLb65}qlk6(?0IY&V$5KDk) z65TX=OfcvjtILa>-tKiV7yD`!Z`J3*8OolP6clxS1mEVh!{01s@ytm2E&!** zY$RPdR(?bfI+2M5m!9COr%a_9X>INrOcC|g%ETVRQBF^4x=>F36?ekjjtOPE_G3!c z<*0+8gA4RBv!gocZJ3@J{NB__6$iMD=GThi9AI zL#7QIHlX`#3bQIVFVvp)O}aH3>3zZMd2A|@ImnZt0l(!g$hox5e2ROAbG@i)rpQVg zlr%6#_l>?%P_ISL#T|+Jx{yi8VqU@-nc(LZOHGG(<8VDvAQP*_PP9m)%)bT6tNt^Y zth=R&;S-yF`&{7x=zgeibn>va09n$ni-(FVSHi98Ld(ZGhOvMvNv<nYk-kAR4}wDTM4gx*$)F_o`mA&?~%%I5gqT zdpqLlN)61JvPIKN)|=q%qqKwWW@Qk)wX5TXumL)R)r;~BG9H^#ts(>2EMT_DWDwMS zD3m^+#=J3N#=#Ch4B)c9W^l2vp&Tak(ILtmlCceVycAFcYqR)TbT~Gq;M7^jH8S=E zM(Z^t@%ieIfqz4PDfkWT_q+Z>l11FO*|Bgd$zj&i<>j0T$v~m{DNXe4`dWQMP?agH z68BP^VE7NXI;K=JD^eb&MNi7&g)Kk6S9^o198VF=j9X=nsOaPXp^`yM6#^Loyfdx4 z_brP?mBBQG%0F0Zh(-ESCz8}`gdvX7HtX+w`d zmyVMw>Mv}S+43K3weiq8c>V2-m1X>H9tn1K<@8k6#lUPy zNpm-N31q5#M+PcA=fbPX+o7V=BU?sY#r$ZGhcD~$YSiK!JkZHt_ErH@PujG#Z##m= z2d6O7% z(fqGBgS1kjb&$zN>hLo6aapE!K*=%jM=((`tFFzpj^fi1O+@g3vaV*1NVP0Pazy=F zA27MAm2mVcMwVx8CaytJJprgdK85^@G5ky5(@1jd(pr0lxgi|v5a~O`IrZAx%U+9` zCE}?HPe^GCp=;=v>G!4XW}|TgVIQ$d`%?-sE8%(xW}E*Fu1=@^4X#?l|2Me$bk8Le z`a^r|0e7gG!-?zBVHjWZzG*bee5#Npa0dwQuQ=a-&Kyu4 zHGjL_?v!c(;FSgS4jb=sj^IB(0eO@IAAme(DQEi~6Mf zA9r3)_t4{gz$Yr9ft2oy10Q)_Sp72eY;40b+HJG%^F!))3N&lO!B-q~+f7$l#Snuw zKM{5@jD4=V$8PK@0rovaZi{zP7mcCUt9{D~wv1P3o_jO3Syw35Q|&~)+j5G2MS@YA z4KzLptHqka2VZUZi5;AIXTRpR#Gd_9e0PW>Ie*HuTh)1fSV z{wSdGwM_Hdv_BWyiWU+%=^vZK;kITWkXFFz@r!esD)6pdQlwnAWH!_^>)e3(C130@ z4rW^F3dxs?Tic^yt$-FX_9)^=pZHdzw%!P}Nc$9dp8YsK$a(1b>Zfnb71$W>*^F-tO2^=R}Svo-VD&q*T~a}XW@1$R~Hrf<;^ zHhR6v$@oZM<|B?|P>DGjrJ^(p*TtSv)ms*FxV6}&@cOT$Ao!zn6(sGE70Giq{bbTo zLPq>50{n%3YW_V0_RKFyQIufrN^mDCrAax-tQg@XJTHok?jiHtnhSH)8_yl@DJqdQ zLQKQ15>_>JYNQU%f)(g*WgTs5KAt&p(aRf|6{lYT&t#iFn`{h60VJfXM16RQeJ|y?;>nghfE&FT zSu+{MGA7t$=lNGSz2wEKnFGSJ+|)>RYZE5z{VvRCz$n^Xr;)a1c!l!H%;3|qehW!2 z+k^E#I93(u?X9<6)=R%v%-74zDM?3I;&;@MLUjR-rk>-TgNIbeKyUS&=Z?d4TiRan z(9iR8-LAY(J%A1~2k%QdKQ>E)BJR^FXBLp{c}if(G(d#)v;KZ)bgiyX;Yf=)X;%q` zeJ|#rs9u?@OKVMjDURJ;2D64}*>1UR)pW?=>os@!fJB=vVxi3rIcKN?1`!!Mu}%ZM z;qd7`nF?3_B_M?Sq@8}G@AZ86kAeRk{j*Xt*2<51CCUq2$B8SZXm)*2Qb}O~&aq=L z!(f}bb$dwp=Nbo*!aLgJoJz8wKJnq1B2KLi{R;fjyecUhJWkgm?^IqGg8j!}E&l{h zP0P4f;SkUa7)T6q68(DDC~>_51n;Xr>65y2e+M4pR z&$Ncj<(N{|#Oy;bib-GYck%FtMmYNryzVD#tiOtn4o_`4*6oC*%VeC*yk;?XywL7S z;&?iencjmw6~24kNXNQtlCP~eD_!_w>RSUqR| z23lRno~r-j1^EAfTNNNJAZv|O$1s+6syuFY6P~h@|F*G8>{xaX!xf<0{4C?H2ZXp`)!Rp2hm9f zhoW#`jyf9ZDy<=w;)bqDN|fR%bzOg;HDlY-({Okydonl%z`s)X)VI20;=wabFi?Pq z9qHpYk+-(1A~J$LXm7$(#HJK4BJbKX!baMHXCbTn3Yy|9l;iDD_q@6K~APiM~=6FVe_Zjcl48krK8!;30vK2%ZkpSDB{(Cgh|e zCQ+12W_47hT_MaKFeg2T&hc|Zpr9f#Gy2qI1Oc!0?9`ETcRuGhdL}TXE=yvNo|%h= z#_iC#X(ppwCP)J2k3}XPlIVulJULZ~Ys-jP$-3gWuRMbip7bSd2GbCPa^*&EF|Rl^0+wpoQgNAggyCjLrrI0MfN5djB2~k zp*=CmfC^5YI32g(+)wUj$D{GnC0yV%Le&~>hnm3!uqBnsPq*$YIEP9Sji3DjDBK4x z_U14}kux`CjGK-Z{7w-Igj_Mc^*Br$e0-d!n5SB;gC@{_;nG;~59QjnSzRGl6QC~N zaTS^Naeq^D@+BSmu5gw2j<}G>b;5EPH$7q+jmDT-#J#Hpi%T{5@UQ5BzdehR&0Ul} z;2huWue)Y`e*CcacgEeU!|pReg(sAt9LKcRyANo*lY*F1sq%vT4s+Slb^E%7>t)Tv z`sEgLqnMmbOBQdi@E7d*U@AotK0taibC07|q+B>#JbNFY|CQQEdYY=inWZ({R~hJO zNeC&423p$U9$^l4N+V#0oT9QK4!pPo82qqj zD|i!pMDs)Pt2{)%SZbdN)i#m5fZ!c6Y_XjGSDML&zgX98e6Gm0F0xCcP^p&9qR;k7 zH<|hyG>1S`f1$1xB-at^0ZoivEbMWe(Vr~9(0i}#rBSH-a=rG9@hWMZO@gUKzYa+| zGCT?B7%#~ z47P*jBWAcFwgRz4k3`l)m=DlApX|VRnU@+y^Mxty;78 z79Set%=^oxd(;JHY6xF|8q{sgY+X;poCy$B$H#(r5K>&|*P_1c0cq1|InpH3|KeSh z5uu(vT-*PZB_Fd9G9>blP(&z;Z7_RI+cVStC-qv69b7B9uw#B?W-3k$SkcL7W3(5e z$1AlI8)rhpob$kfdNhlzyz5@M`q`P&R9Vks;U7Rz_N}mdXCB0unmoC6ptabvPFlPD z)Bk{8bNAN!*lv%$?!1}nG&+E>y+PqV)d*MuY-D_3l(f5+ucSQiGEhEm_?0loH3^4a z6w(!f7BDAbzpc$=7|UdT&UEI|C3;>OyVG$~>`r&Ic(lFj*6+A9YaFlBOa2q~=YwfD z4ZtFWkvG6~I-@`h&?mO|pax)rBPbjb&61c5Z`x#&6}-MX5^9h2%<(K}X55rF6h13T zMX$0`Hn+PToe=hNaeh%)W~M*4rRRREmCdp$8xlK4GKp90ZOIAe>6Y0roLp`iFO9*sjJ-(ru#ziX80?5(oyWR+ zZtg~P!05lzbyWh~6!%_7_Nxi{dxP=_sa^u23djTvM!^#i+&vMGxP~RJ1y0fdZVNxzJ zLCF#mpgM7Yy5Tp`ys?k92`Dad2}Zqq(H%E8TnVcR3eZZ}x0W*yK2sb~KtR?xO*M70 zz~-F7;2wZ9m@~gt(w)S{b~tsk%7=8oxE4dXbbhytn~B8Op4D8sK6^X2z5pG z-^xU4W9ZJuhsC*rNJnxU;R!|efM=)6+DI*+Jgo;Dv8xEAt0HX{K&m%IBq>KV+CqXo zSqZ=n71vs+#!ZehrUbo-G)}hDxe&P;u#Gwqkwoxen(5WEAtG5EI#A81`UHXfuJ*Bv(ZT8F^iyxiJjDoqUezys__ z)Ss8GN}7vjdY}Ys(Zj9(glqXAl`&BUL1hj6`dR(_^MsemScbq)6JQy#kNN!yz4&?W zrs3e3;7e|N_H6@Oi3k>3l^y&^r;hBQ#(UsAqaOkaOH{d(ZoeeiVIDs7yE~{Pr5SVo z|3$t=cBT9;@|DL&P$G6%`P~7^_+bBdj6w}^46so~bjO1Z5b6w9$GlE|$;0)aza9cYJH9;{y71fZ z`09BPwM?{wO^0A_JPkGIwK96JS}Um(1ptiH0BGARM*n=_3;0MS2m&k|5b&KV{+E zN#r?gt5)#UM-E6OZ1y8Fms3MqPImuEabC%??VQ@nFTvM&|HYqeN&J zDPZUHfvq{@ag#f8rD;F8RRX$_!MASDif`XR1V!m~B<(y_Y%(xMBZ`Eh%Xv6+T6+vI zN?LoVKB%nWPDxI`J;Hd4q~Ltz%!F<GrN``oqh26 zJ}!;opyhD)V7k~xd;{WzvB&`(GcG%iI6AT-tZ>Oz^YF-|m3imBNk7<34EysH z|GEi?H;$@-3}Q8UrIHU&T&3g8c9CvMuZe@p|1>e-qD~J!TUv>juW3r4e7y&s=>MmQ zr~5IU0U*8DO;JS_)NrMz`F1hBX%q*m^9DkP&Yt;sn~NU!v`SB)Q3EIoX1Z-4-@_K4 zJMCGtSUtiXCDlhfr>1J%y+va850rxSb|NtUX3{lE1n2v4xS4MaeE-e5$Uuc`rgghp}A4?L|1J5rE5s4W2p2?o`Z!a9;gi zOe_>0DoDp4arhmvGSpyydO>&j@Wzh{K(XJB7LR@gXzun230um4{(wgA%= zN8K87zk#(18jthW1@X2H>;}#Xs-HuD&;TxH@OU%Ma>MMi!ZT4k4|7@v2NX=Av`Mja7oV8kdE$r)=S_TNid7a{Ysuq_+H!H1WZdBDre#Is@dtp zYdLb1>0dKu{;7r83oipeGB*@YKoXVrIubGh?%zGo`h3zK(BvLT2uO0a2^fk}+f$(J zyo;-%UosCb8jT}gVrM^2_0Fi_`W=J&k8yfY{u{yW{tAzZ0Ca{-Fc(a%6ztm5eN08aYs`J)5O=G)p?L%V&w`kq=8bjYB-n<$Q6-zX^fnO%RhJV5Q8Ex270wxQ@=QD z!JADnPf6wT{z^vQc2Ioe>&*mlX#-G^J>Du(!RT0aogeRwY;z(`I)0AS&aJx;9kscR z{5faI(vpO4fPL@VX5(BXPA1YOhq8;fVyP$jbA_6SGF`e^?GtY;RmUQk=zem9i3?zV^R*tTukwr$&X(xkC%+g4*Vwynmt+9ql6?3{Do|I_h~@qUB-+Y58fwdS?1 zHV5H6x5m}R7~_Pr$Eo7HVzKAN0m=Ul8@sO|l0{|NQ#?`LHl5a{K?jw%-JTcoJZ%ZX zGT5tJTjfP%-Tq4=-D#hY;dsmrdjK%d|2$((C|-v;qTD?xfdB`)X0uhZYO0G|g4bjx zHLXf&&Ox{|F{v273YA_`+gFk*fb02&oJhuHN<~L8Q&BHU0g_?DLu2^|eum7*MN@i*<{j@etkL%Rh$qb7Pa8`npT zz#R;+#zakS(s(hWBMqC{?e3sydbi?%1gG3gDV3Wuw=XsaIkI|ED{M|}$%}l>^8Xr# z2+8~wH2aNv209S=LW2vEIo8TfPi7p~$fY!r^C;UkRBUe1HYYG2$JTNQe&mR8ds64bt`YtP5 zFoUd6@I3$tgNVfn%8kSLZqtGpzazrlna7`DK zYA>7F*VNM-Q-0r_VQ{((o+TB`q_7$x3A=}b;QGhQLuo!VuTa?FO z6#z{rnZ@YJgTmHXc8P9@VR}#gfW_tDr;G>^+SNBKzdH}SJ&e{{?5em<*{Yq zd^&w;(=jvAGU}-``!IoINzoo3!noL%45w2Wip+uwh0}tG*N>;rW7i5s*hnFRs}<*4 z7d}HZG6{;8mH)RQh_G$<~$B&IMnwic!#VgaW|?Vmc_$F1wZ0CqOP;Xv~%mG$%W z%%dltxtjo!3cApA)V{x9*$F?d7_S~z>_$0P|BAS&y=hVbLh;Wh4E~`>8KBwXTve^r z-uDVc0I!!krS?83mPmh_Ylow5)gbkGow!&$*z$3h=mO1!lhK5s*Ff`N+ z-IV~zokVnMm5nY(<_Z(3M#fJK>c!x2A(BHaGoF=dZ6=FqE$(iXqdTsM=qM;nn`0;x zIo85y)N%g+>9EHvQq96>&MHPy_75v7{!^ekub%cFR(73213u>0+t+1;|8_?KcIu~K zC|!)mHI!6pUI;c!q{lBGTa!b};l5LUBAjImmq2r8Whbl;V75C-cInU+I<7tA>Weu7 zCyQUvu9IyG4gSnnb;cfPn#VGs_L@605Y&Wg;3J5tW$bPx+=J;WN|?A#=7 z20646gu%n#iKVfW%K%qOE=EA{D9Y3p|c^B3ydPBr;8m1hihFAKoX!$NTafJihdH$-fqwLL(DJ^+j zN%aLclj3X6R#e7&f|D*IXKrG6^Z%+HQYn?#!>*2Ak}_rtCVfoKkU}#f6xBx)7nTaI z@usVwL=hF=$Q`gHk`7+Da>KGf5MJ~O{gFWIV`EMm=|PXeb>(4v>7L1{=dqp`j`T^3 z6rDqSWGrg=nL1@YRT3`#+~_Es)|wn8)A7`m=ro^RIKB2kr|3x+sTdDBqs|!BIj3;B zz(lxW(ShIJTqSa4%T9{^5191;HAwaShP##Op6i9Yy(i)%Zt!I(hd_7mUS$4{H)4PR zv}&L3y@DXwR{lK8WI@0b;j&f&sC;uC&Zio+j_Q32bm z8le0>Sh>ZY9^uJiel;R+g^HbMJiRX6sIJ>KLCpSVyA@Jr?qYd8JV(13>`S;!?Qow3 z%eNr{&{`%fYDGv3zVFbr#jeS#3yJt^Bm`4zu;|9B{mlsXJ`w*v#4LMs$Mx{vcsr&w zp@ATuwDLWY6uivJ5Ru!!W&SWc=?uA`d4=utp4+>il$wx{NawijlWhLW3R?JnV%AQ~ z4fdMp4+<_8GX_V^8^H-nG1X3M-akB*1Z`kqC^z{g#f(S8Wyn8b*y2t&KSnUeif1P6 z7^b-C)#J!uIvOHL1@R>WRg)68w1R_GAQPOHe5IiiB%|FU#wND^;)Wdd4mV3ufqszdd^XQao|VguPr#|Mc}gLEIJA?AoN8#< z!~$>T=zVof@VhJ26?`^k|1ZCND(1C2-ybk79@>} zU~NSy;4iQV)HyjWd@Xe%6AyyZL*R)ZEEK|FBX|M))(kIa#c{<~V0rrRI!Ol-O>Hpr zK3*xiR2n$E*3ns0#Nue!roU+v+jizM?I#QeQVpd^zQ7KhDa$M}Yb8D4sk9Nrgjp=c zSg?`G`(`_1o$6ZwO|?k?+6O?Z;A@>Sf3LTJw)`2EqCtONxC1$oluQr!3Dpp}Mq^j( zePX~YJv~-_yIDI*Zys(Pv&xq2*DJC?4v^38eavomag4_vj%^67h?7@-v9$mA@ZW05 zT&ZP4r~2Fm zAXhG)HBZQ0@GK4w2CZ7zx+@XS4J$Vq3{D`P%t)V7j>sir)*MAelC}u~_^W2cnG?7$ z&pUvpHM`AX0KFnBog|pPerN}2gO3h9?(ZpW;c9VY(j3X-enVOuFp9PUD<@Ba4v!== z&rQ4d#!EWvJpx&^7^kSLhAK|%1&TYF5q5PAzhaW_r;{@6Q=P&?3DdL12Deq0t%vVl zMHC%KSY{C%_)(2(Ln}MRk&PRNV>qCg?z3g8X2dL4KpnMK7s`wf~aEs@cN z-+ZE~b?j4-2~vE>Hi4FGTK@fLOO+Dg;;&lT=tieaH?HHvHC!Q5PBr(hvug~(c8n4h z;_InSIZ6ysGUq2*=B>=#BC_Tj)Nryx;0jG@&)G(IggeQ-S3){N32HGA=`@L&*oCIS zb`J$qcwkpd&`nRY;`Z#C zT`$~s#+X+Z-nGBbGh-~w+}=)gHmpOpza>xhd$5~8K`Dx`AbU+%CI4Uo8}91V`{gW! zBq8Ca`OyHx-`NrCzMJ^ImKA*m=9i5)XSk*`7}+n<~b5SZI64IHHG-0 zQN3)#4g~o8+7YNu|OH=p^p3kYyk1ZXh^J> zTh$|T$2|2ksYvkjqop{?;!TaB$(LaD0$ursPfAY#q5b@^M$VUy;?@5Rx&LAKDr=z} zKe4161p{(221Gc>jgdL@ z4M&oz=o7qcfUBEuKFh39Yfa2NgRPumt9p(ZS)d|BU^ewMuEeFNA+*%wfKw1UJ~lQ6 zQe_b`4*)qk+m40$VvTNnlf%`JPc8QFIPrj^Xl8{;!2X90Wk_6QNF9dYUcS9QP+bhI z1M$lL&*w@8RsxK2%e6x5>fX58J}&3^23aOl4V_~Hrks9295^V5*sKtB`}w<5q@a0P z)N*+F&=(dtaseJN8*aMqsmTTE29dW-IY=afsN>_k%Vea|x$@nh!<@RqD7n9Qlxadp zD}dCjxzTAwOQ()^SI>+b0iBl$B()yTdz(A|_5!#kz>t8hCA)B}$!dsBRMUU+D(%R| zAQCAfBW(#M!S!)Ikv{7Hjl(gh^16BJC$W3U$e*-GbaxO_k&;^`sm^}n_pYD2PkoNl zJ!C$aW4Jk)06gu8$x-$l_5%8c&YlY&_m57=>^zO>0Kf+?+x%xq*M3PIacm}M*M-JD zyNYH$7bxH!dhdFv)_0ari7Scpldv)vLz*bDu|=T^tF+tcIt>4*!cqY3YFDmD_nImhVXA2ob2Zbv;ifw^07U@36?C>fRJ zu~9dZ%`icpN3F;N-hJ5Y1&s2)`&d0xghx<=k9A6-W)}p5>Y>A7lmGi>F{Yq4^c01y zi?9t}<6^%A8`w|`7jh6IQApm?f2dqYFX6~MP*1SV1eyRATk&x!0F`^VLMa_M{T|SE zy04l5W|}GiIdLjhO^3dZqG)xIvlKk?N`ou~R-iOVN|~ZWZi*%cRW+qF@7ri87=7qk zvr#`1sDE|tnrIZ}xt2_WURbPe1bW)XM3+IHPc1Q4-Na(d69R*M?ad{>MliaQB$n;0 z9iJbPN@!>6evoY@CF3B(+hqvn2cU9~irX=H*FUM;3C>8vgbw-^xM~DQx=t+Bwa*<4 zLg;hoJ7I-Y>KoE%4Iz@p;Ak78e={2CCZxiJp43uNU;Xmgj=FhHuVq`~BGu>*$^qR+ zhAVNT^Tp<_gv1A9=Ei#e1qH#dj`8(`katz&rQVqr2na+E9umR#9Oec=)g#EdbA4Zo zU;e1fDI;<{$mlf~Aice3gqtnK?{0nT^V zS*iz9_>u8Hf|gM|Z-)~r4S$WVA&mvoN2Z~sO3$GU8E4GlK3@T9qh6}_6xbequd0M^ zazrfx!AQa&*E3UK1y=VFuT_;V9uv3}G8+G0`sn~W5e)`uBW8GtKSJh^goXJYA>Uo) zzFpjzt(N>EY6{orG@<%wILI zCHRbMI;um^i7i)k+`Zmd1&o*-GDg{J8gb*?pKLp$M&IMMzcwy$W~rkU%!diQ@3ZOZ zKeHD+-foMP_f1l9Y4JYZb&C@6bH4!~-H)Jom%)R+TZ7OT!|VcP}cbbZMVf zqa0Apg||m9ME5eS)b@x#;Q-Ip@)-jY)g2$n2#nMdkc!Jue0V8Xt zxX!F2yO^!4LXF7AIvHX~rC_FctQ`90Tsl?C=*8!!=U8wvTqM)PZ;}DY@I|ZV5j=OkSsqa&H`e-N;Zt?j$)5McAIfjc&v0HZUu`6l=*uIO5y$4 z33bkdV8gY5kF=IYCL{49C>OzHBw%k~%|&cBjAlcTr?`=n6Qhn>ATta}b0jL^2Pw6} zAG@H8hOxqiq_1mfc#G*#NG9hA_g% zn=EY_S^C;pbb;;Y zl$WV{R1;5Qpfn;xm3&5&LEBYRPcj6YWco<&f=nyWNJ$5ADai;YjbZJ{i!5J)>_mhX zU7xrHF!u2lye2aGijb6pYS&Y{p9l^7D;P<7+b2+|;_z_F^3R&S9T$e&dLn6&*`@Z< zFs_09>J1xSQ!*BIf%0%2!Fj^WjlN{GdZ(NXh&1=s8VGJx6`{$^!)gL{oVeWx9{(}mhaZIxUG>og={J{M|xn9N1m|D)~_D?vs{!jXpyQ#?&^{A zNd`HkR@u^E$<7l&On6#VHBGMlX28w^iYaX%%5ZJ1zn)(5z=-yL5?3;=LL3)jd6kF7HIh^;An8x=-7pXD7MYLO`ysOaepw#zA5}7HR97wNZnAL8GZ;3fS7R>>7Yrb|orLx@nDkh3M(8)` zyzCLjC^N>OLTla)Bmpyf<4|6XxCA~F%Wkdz`|6b+ueb%v-$8hE?bKX&!%BdSNgY#FP#WwGx8S2neVZim z-nt39O@yGa!{G6SFfRI1$S+mZFwG!OLNNoW7g0z`JBUWnPZIZTk!#Qh{Sj!naT1-t z+Lyjf9+R<{S0Er-XHuomvv!kVtWjztl5R|^nbRAew%@-&q?P*S%w2#L?v|V@Tt($^ zE6|-vkzWQ5M^HiKVk49xAN95d9F4R^0YV5Q6sXY(7iK4O7->w&t5|%DVLrGqT|T9N zscZ(~1k@ggjLJ`dJ~nL!Ze4_G{1L215(=x76aeyuN;c*xQ|j}Df9}W2Koy^>*)E2H z#ZOyx&Ysc8Hr50Aa2PSBY-F_AKQJsZ?@V@mI3dt$Rnis+NIhs)wR9GV-cM!i%H)dc z^#mWdlX;L%f`;&Xwp{o@Y5?Df1N0N+8=&ORh561%Xdc|3zNdt`us>SvC55NP2Ep;1 zP~c+G-DHI;S{>SVSTHOcbS1Sg=6Z~u(JsR_ItLSH$A}eWl1M=}W04zAx&%ESV&)r+ zRr|nNtwY$_@Xko+mD83y%d~M{67&#ybR+c`EL5UU5oHc>A$6N4HzvNh4%MmBq+|;R z%epp{Z~6;OsPXgv4t=ssjLe9blg&|7dt(T4WETl_%{T zdt#3-Z6=WhS|M(5b!~lzp8xUuwV#hA20|8hq|7x|=Y&e42CI4~=H!`+2Bd>JKdbuC z;i11^^i1zjh5UUjQKDkj-*#{TGz<8MG+W7Ur4a$>w8fX4+r}`eE{qsVPrI3*ey{!S?eH?1n!_hABye3 zFR8?F+kMxp0n*T5J1+p(OZUs(y1o50rg_f$TgF)0V39W%`YU0g5A-n(>cS0mSEyo? zu|b09VNZymEd#Ip z2=i652R4?AP7Zvg3OVbfiw|(@CMVvf`LOS9xUR}n%z;&?7EMkOxnhL$=i6U>7t zNy3?%i8^1pOvYzW2YT2VpA=SzE~~<8Nv@PURlYAg*6HmiAKcnQi3jV}e3n2su78{( znwvN-?bqOnt)}5y?uxqGzy?^F0B~=UKg)F3@89!W>CpySHM4jGko4}o{>@P&_p)l> zQleIBpT{CNK%ar_f}mxYd&|1$6_Y8I`BWKDW_gT2`bhS)ZNW}BoU?EX6%+qTtGysb=qz0WCwZGoG&*^?}V2q z0yAnVwVk%`rhJ&PVA`h)mzME69i`wAfqgCEmskX`&m#k$YG&$0y^2OS&-`EhN<$Sp z)K-jv8=98VjM0(l92Aj9W=K_zP^<3v3M82hNK+=lS{#;BHPV6-b)_#Al2YeMLsQM_ zV@s%Ik-evysgyu+K(K)!YHg0;WJGGz4*;kyby={glKK^lBBT*8E5+>(UpFPsP}UMF z$s)A~1arixVNkYNDtJc2I9i0wSs4Y)4cDkJVIp3)7|q*xEw1!eijI8bubNgba?H5Z zaL*sz%iDRi+#zy9&~InJO3pNs!T>bELx$?1`MXSpY(>on zI_^Af%~dysrX_i^JzsrCC^!1Vn?t{!=;0CJl@dAy30MZni&=#=KjLLfic^{{j(GL3 zB&%hF>BJ(jM_+5G1?FTvhOVoU{G8g=h073#N>v_lmq7q!Kb7}sM^v68^TyIjj8-V-n6%Qz3GUGJk$>cjphKz^ zl3U`Hi&9j=uKenEEUx6jtY%4Ftz_fY)px*RgK%JH%e9WxDI-=0=M3MR$Z&=rvgq|* zJ!Z@Y{uY4(t1N7H6BtWdym`(&(!*NhZM=#*%cy~GGVCnJblUiO*(Bc*W;IyQwj2C+ zh)%`^M(Tc7el-z98!v{G8JE2Ti+dl&5P6b`|$m- z%6Bpk+5pDF;QhAW?%p2j{+yl(*3M+bSD`Id-f|MxQK8B56NpJjX8)P#0_t2V-8T!-r0b!XCe$ zBF5uETqI1$bC$BxA>vuKVnP{1(^@xStwWd|6lQ{7cvM&0qGo9@jO(!1d7;;2S6{%~ zl8=-FE&@u7Cs6og^jgkEA3uTMhGc`P^RP#Q?zs@H-^2sWL1hmaLv^%!&;sU&XtuR5 zZBH=>CiLUY-Js(txDG#&oI6#IYJ-Q(Nf6dxI!9oYNzxcnJ z(`G34)_8zBq342zu1NJ@cQl~yAg?m1FN+jbNe7N%D;zcMsGBsRLHC~ODr?RF_ezr% z4L1B@`o%X_3Zw1?;(`N0vOZ-p^uD|3ZG2{>C?8iPyd(3-a=0fyU{ZDQj&?VyINBHe zd#R!0r|TPYEzbx_zQq?yo%F8p(|W!7)$Z8g z&6JEEF#&?)2J&^it&Eiah?JF4;c#U3S!kJO$yl5$E1)5egCp4!KszwQoa zxuDkIr;M`1C>-Qzlaq+oQ22bKbWA@X^B+Ui zubc1YH=&was!4>Bc|OTtsa$t@ak-|3nrdVQQs$bCV3aIk^tz@n=nKpqAR^csBhIO2 z&9Al(X>9p$@VO2sKKoUulwC{TE#+>u!|yt<0ch|SpP+7P!5ue}`z=nGwpO}a-nrZ? z|8$eyVR__mq}HqQ|J$T4;#yY43Ssj7u$#S!LpuoM;k5>h@}a7EEPATUxxbAWj}I0W zAkwO3)9fl&WyB#)f~bIKI&PQ6bCUhmcMnyi$*?n^mi>9MhVyMYg{Z zWnASxSW%6RV{Vk=d!s7leMcydv^8nUI{{B)z_JC`fZ9MJtJ9yiGy>Hf*ChLN-P)WK z@5Lqqt*WiOIm03WwX?b@*@)4%a(>lNot?HrYTUy=pwC2Ls+IG7f4W-Xr-SaULeec7 ziu__c^ESUPgCFr8Gqyc9_Z6K_^1vUpVxmpZm*=`MWGYTD0UgWMGnsP^8>^bF@vl>m z9c_y*_R8RMGa^!8L|8nkC_*?SwzPA88< z3Stti7rXc6otwGyt&k5;fFvDWkdholo>EfHxfR$vhr$>7=883(o+n`s2ZQAEcTe+ki~k&*(rUiavxH z)u<4+PwDL~^|}z+4fqY;zVil7>wcQbVRE4d9_gAlCdPz4{mwI&1H}hGdMlt%ZquzJ z_fp)B}FTDO)-*XWQRJa zLMpZ!%Vu3fR?#igeMj2}n;mUkMUP1j zEm(V=*)O`#=9>3VwTnmYQ~&dUe7V_A*1r8D@$>ta4yjAbYKU|7w(r@=r*XSn^?`25 zvC0r>C>W&tJ9^-G)gelMU%iMH7x47bc=Ce`NH`=ztDdEj;pte?Lo#Cr3TsJ~Vv8dz zePy!$aR9`#Y)b(81j2Tko6x7yCa^m2AFWWRlZp5VJvZU?iL1J`O{~rllVr@2jC#)?L3|h= z418BJU|_lzwPSM_#TI*vCF{duJFei~UYF=gjWS&Zq1NT6S88UT!vKLh2BmTDZC`j| zd^v2MCGWQDp(nb347em@!ZGfb5_hwu+$?qlJa$p@RZO2_{%?R*V3Wbr zM&nkxN&q`z6UG)6Wv`;f2q$~jXzV@WfJuIBE1uir_lr?!wr(n~+;ZLvJK)Q8Q&5U1XpW4d$3-j18oWwh8r_00AZ?8j zWeF!EJ3Nbd!gPW^G}HUO5uF-%(cAhEBhhU)KX6O>8j{jY%je3IfOd?6li%*HmdLU_ z!L7IU$6_B+JW(#6?L2#g0F>$e5>%x9HCE$4Zd|lKhXeX#!S?!(D%hW}@Wva*c4yo* z4RDBYuol!~;&QV{NX#?{4Zpu802Uq)OI6=jG+EqcJM33kX3_$2<{*AgsZ8vFp%C7w zEYAi0tL-U$0uXvDGmNVnjkcLXMtnBqRRrOw#zk9*6hqRan+41UovHMb&=f^wd7UW| zo36yYJ;M;8kHy{LDk~>M0`Im(Km=0E+g}|2xMFu3)--EdcPxbch&LqxhL@Q zQ8xZ8+ibAv{(x=*4zOo-=&8et2@Dl^$KmNo*tj;}%rLR>;00%Xw2biPh!eb9T4FFd z7&6R#VBU;l_Sl0vvGk<*|AJWc&$iT+;52P!Y@x`C;U-EVh<+(G=`c(cJRC%oaq>kA zi@P1idRp?2_irTlW`$V-Y2{phbZpgrR%Z~Tx~n;PIWt#Bqdi>ejg7UMFmYc+6!OLS zt)RmmWGG$KD=fdH+wP80z$0&ur9=fUm;I2AkhK1@w=G}hBI7YKJi$Ejz909=4Lh}B zp{Dr>Kfe?a($B==05cQd2ldc$qG-5YtoAFGK&lQ-{j_QRK}KuL;Qiir+V*X+fRRxZ z*MHoFLpv4tF#F*Ch(MQZ{SoQ+ob@A#uTR!a)O(E4t>Lp;pl;>I-d|NP=X_iwJK}&0 z*GgTpwXPU;8l)0>(3`&ez z2O3#fExArmFB7$jes?YP0}Jg&5fN9I<|PIC%o@VG&8kwx7anZYzTY2crKpP%zU)FX zruOcRN+!W;)hVTTWPB@&tLNXG?E+a{VvvU_77r`C^8~moexFH2Liv4S!%L)_gR#;O zO=nTX5#?7$uI5{ZDWnvC(tK`JJM`dTx}D4bha6~U3SLJ=mymXO9@SIwb3wm{<|`{69O z@!ZL~0R7UombTY6#T@oDMQ!?aOij~4ORpj_J}vgnU(QR~!N)RIKo+zBTv?noF04V3 zyQX`%u8~npnUNf;H9cV~oTKNQe9}_;l5tO7=ddaF=EUv>ZeC$XAt=GrCY8dQw^Hj( z(!1WgwWlH$cJ|dr0Di*qkPy=PD_Q2BwfjmgC2OM~B)l|{m%q<#$;aw{iuzgw>X`GL zARoIqp`d`(_(BB%L$&Wsm(R#3*8HFzo2@wOciLyqCXUd zW`|cl#NmMq3>P86qWdwCPt|$s`7B@cY}m3CPsZD0W~xbtgxl2co?idIScH)3K$TLy8vbb*#Mlw6DVvRTfzGqd0@kkaY@kjG64h+jW$RN0 z98?IKqB>Hn4$W?xT3V#6v;3<<-kVQr)i!N!1AEQYm4(U->1n;afbq>;jqU+f!Q0m~rOr26fWL>tt=BR+j#LbV42t0n{=hyX6X!~|WDJf2 z!ds(cggK35$Xnx&|6ixD${hS$g)?`{mHAFFJKMPVDJg*pdBmw>sN?!0S<{e}aio~~ zODFwX->wl|Ld?T9SU?eS^RBB+aEL?rNLm);1_n$ts$Td=!KSS2@hV%WOC;LrY8(I8HRNUcbbOB2FuoJMGb?P#c`b1RirV@o`KIF zy?t)O?`^oG*~m|r;z*58AOR?J(LXrtBv84MI!Z8qvW|(M8h&K|ceVOJe}1|7@s<#U zwE==Lz@>{U190gUH=lt2@!KB)tjs``b{wVL%E*$mv}_70$`WA1$p@7!BqTFjH3qRB zd}|BzMuC*7Hikny=7lOFEJjYG7_fNd>ClAz%W$0RI5y( zS86&2S;KVnFcbxOgurrm`PjNVt-(~Z9R~I2*`f`@bozT-s;;V9(g#oyS^$+Uo!1B7 zn+%circ=F)vG)D6yj$>d?A4i^`1L&^rZ?wie1)Zn8N?$mH*r^@`AdklQ-^}ku>j89Ad`CL{luMAZavZXGpZ^tPaXx~8#}9c z3)n4aU>HwSl=4rGg}yv(!sJ}}Ozbw~O$ZXyUZ&_ZebuIx;MG9nuut zT7b?YbCtC>joizP1fU#FA#EFb}P$5HG;REl+#7+w)> z9#ntowx8tOs1i=4Dw7Kj?)a@JXRZ5!^#FxI}YYvf?p7eRpe_J$tJ4T@0mimiAM}xMuVz&Yj77poR8Ve`D|y ziUq&ZRy)MJ2sm$)*@P0|kx^73@aS0AN?N^R>0PYSYV>tAuYzix6_cU(tIP0(cM^|o z{Gq&L%;HyLueX#u`a{lxv!8X!ce2^gx2!X|C<&8NXLJ_{BU;PkIw2Ib_h^vR09?$Y zZb)4E!IDw3FECspdCDHnCA)dPFTJF*AFn<=$I_Ng5{uyKYUO;wm0a?Xp!0m`m95i0 zoG5Z<2@G0lLBE%p0k23P zj|2J*I^R4>_Ip>zhwX~6aM~nA-s^o|#;KAChQ8|ea>5z%t!q~ZxRa$T%n+-w!4!%k zF^+8Il(jOn9f_0Jc;_^bX(Nj1aw_+U&v26_8Yw`-m4IxNnJYFfSFtz4_P9TsX&gOM z+5JS^HfDD5bMPzAN_p#%h$Ca&oOEyh#}Mlnzq)Uc(y!*e-f7hSIZLw1vomxhS=7hd zJ*B6Tl}gb&Z>s26NyIN=O3|F0=y%dj1yr{te`Wl=YMbhZE*(OtAjc7Uu6b}%1|vr@ z3gYIWB%|Q%UFzvPt0b(InGnmh!~@hB!G zuTmnqM+55IU;~;CO~xN<1SLYW1(mo+ncj)!Q+41vPOe?~hXd`TI5S-gd|-*aM9Crv z2=~ET>IFlKCyhRn9BA^Hc)`iG8B6)dZ5k}u6o>@b```W4U8{`wa173PSDGSv97tdq zanxSpm|#_Dlb^yEhp$fN?a2U~n2*I*ch+)r(a!Rk zU=|wsHYmaU1!-4XiV)s%m`nE)FFQ) zo8?k%h9+T$8`TG;U7I$CwA)cQA%o_x;+^petdlrKO^1Cw$2gP@|HYHW47ZY$29g!{j(JZVyb^Q^wYO1@%1e;Xqw4UEs}u% z27YvV?V936F2J${KfYf=_^%s&ifnIk6*yUx=|dA?EwBxnC4abH%D(7jvI`KANJJ1M=8C7zxT*hg#TLv(yyf`OMr3ne zwW*S6l+;r9;V7dF=;@1%y&$ z`r4m?J^~ZhHZ3UMlj#f!4lWQkZu8X)v{>a)$|}W-W8fHV;T-08u=vypo#gC|~iT32N(XyPuQLmO)|D{__3gul&(Kc<$9< zoh%-&=%LlS6y9F-aq*mU3WF?CdR86k&dFx(5N#Kno5dq3!VllKhcn*$#Tm|3w*uQN zw;y<$9GEZ)#-zaaI;_-%APN0cF^}~6RzrQ7K_oh!Ke>ivLZeKpV%kOg!4uRDr8X(% z)=K+H;n(-R64teRa~;>Hv%<=~y_!{Ni4>w!x`W@lG>sE=M*yPO1Z!M4sS8T~lPC^7 z%|Q|(g`FEg9STh}cSnS8+`Flckh30=)nd}?Z>K}z%7s^YLb|L?A7*cPk|;PcYyO^)V#W@HE7WJz6f8PGzWmr$ zlUV+V6q_ZIq$t|sK@=+M1chx;fnl)HMWSLq<_cg}&|}F1ffZ#A%`X=;Z|=Fkdac8G zljyIydw)kISMEF^m%!{79)X>%j}QZxWe5Pap&g(WPWxeYH2vW~?;Dl1^IlfjyPvx| zz@ti9Fz}QC%yP&8126H8F!!`fi&u4bae~mp4tzZD|W);PbL)@_?+ieJqsOCqv2x~7W@Ay z3DAK%7#kr~Dw|CET!DqZk1mxdIUkV_J_yv*EI|4c{Pd0}l&;y$A;&IP(>kiU=I*T` z@eSiVe6Il!*wU(S+0K+r8$aWKl-i)ZWxrAS2s6>_QehJcH|Usk31pdTMm=E=4q!{o zFXzzB89KF?G+tvO78q5Q&7}cXiZ4S(=0gTx#d9Sr#Q;4WX(Q?kZT*3B?P&PRl4a%b zqU`x79|Gtmw0em{P4(>x0$Xi}`Nbz!{0zz5zOVkt74ImP1Gr+3P;hWrVIs6a50a)fA zEO=bHu!wk)16Km1q&?{?s#EmSy0O;Ve#E)f)hMe@j1goSo5u2Y?l^H(5eXN+=p!qf z<||t-u7-KNgTb(BAeP5Ia2M^Y-^0BPkmgnx=$Z_H4z z*SK15)xWZjyu%nlT@1U5Q@L*Vp={)Wnv}IV5JN-FR`3t~PQ=*K?ffmwR)VsFXb&uX zHlEto4ka#h8VP#HP1B#Y!SH0VXt>nylDf)3`xwkFWEZDfculO%+0L?YX0V8~@2f4H z;WFDFNpA?f=~b85XrhK0H6Q@xyvE>5i_)e(oOWr0Ry=s0d&?$-UKS|_PWKgU)` zn48n_$Nr=r@iTovslO?4>Ffxssz5?(et{BX+`dxS;nz}n!xOFtVcZ#&ZB#&I!{oU; zJh9j1;!!xwFeioj>#Yd<(cz710uQamzk@w+xBgpggQ(l;B4YY%l_;G~c z_(S|F_I!#1Pp)5%TAVHpo(a2uRBCTZv^qJD9N28j#c~}`{Jn@gMj4)LC}|@QCI#2R zvhgA7G_g`94qXn5leI{5b_S zecY#&cV8RKbolB2k@k+km9|aWXl&cIZQC{`<^&UC!ihDpGqG*kwv$OFw(Y%Up8I+4 z`QH82{BSrRwUdb#@;|_c+(XVKK_YqFl&O)PR+9B5CcmTiihpZ5Y-Amel0+ zs`|pc+X>tsoY8++XfLXVo-s<5-OH!Ph!M=vy4rCTC#I;v*l5PY@TSUIBDzX2Mu~bU zdw~h13=?1$@2yQD`Q6_;oH6yu!c0|BP*6$5^ANi$`7obuXNF>}#Q`+qPjOmV2U%5; zmNR{Mex&uY!=t(hHV8(`+y!5`Yuq`Ggx;zsw?>O%q$WWe91~Pr;D$z_ngdJ89JzwU zrxEvXo}g&kVSh%vFJ3Y$nh7-!J>RZdY#`MCoRTRyJ-N8D zttapmb>^*(9z!6BMU$8rv9~6v7}a;_iZn_o5|+6*U^b7ruJq7A!<=$5ai_foWXsiQ z7PL;n^``H7gimpb+*mK52~i-~Vz}eTR^%uikWE&o_$si+m2@j(KBmLn0+l~6+&)`2 z>SQa9dr9{!_z8Ghkkq#HuGY;ZF4Lv1Xh6GZJvy{Vvz_v*|InbDV!X8h$)@`0Zs;*) zwfKKw3**{PR$cqMU0c6=KK^j6Ua~pX1`~Ja%G@s1&@~H$6fXDq%V-J2WuX=l)q#T< zUIdcydc#FS!G>t2J|fRh`tJd1r`hWu(n1AnkAD%ppH`X-Gv^g^pOQ~~=XFG<{!XFw zS|)UXr4nZgq&5h%qf~HSqf%f-=C+8%?XHp_!hs|wG>2a=ya=sTb{%>S&C;LhY*}9& z+-+WdoM_*x%LTP+gkpN78NO;=>3Zk1-N$f!GV;H|ir4NwG!^owY)L%=aD~AcgMT4CD-(#O{(u#f z4sbkF@@OT}5*^jwi^HVB@-4^1WUm0M=cP0yC~CI|{f6>o6V0i_>nSZj zr+uZzKA>ed)AWeOS=z;b4ve2^RgNy&FhrqGE?Yrfx3_g1Kow3rV}S-?OE?N2;(nO< z-&En#-T#9s>@+8nYeHePo*uW1|H};F!$EGlM0Jlm{}C$-j>gPTkSDJqB{34wRNSpWQ|rx2*#Dm z<|e%dlsH+78HfSnfwRjEWTxdVcBj1y9OdKGN>oJwC8h}wU^2#7qxEacHDWrIujidB zqmObA<#>!gyvf^n8V-S_HR#};UDzOhnQ#q}#HVQNKuIR(J>bNx@@P|>)`+RotPPLf z2C13jEVLKa=rqBYhhn$Eo=^@vv6|upEw_UI|Dp@u{*`;6eeC9vvf0fyNV6boX>S-Z zrnCa#!$N?;DP!=OsmG!Cj?$r*Au5JFn5M{hIYZ4m4pYxUm5v4oMTk1WWg=l`N-5k| zP+&_R+ic@g32=}n9o8>FSK6O9kz~t^m1tqpm~lYHGB{UrDiQNJlE#Wg5TT1fR8#KR zR411QC!l`IqpSiO!nm#V=si^ZN>!VK>E;vYxF25^gP|-hq~qPIU`X!6kPg1sf+|hS ztR7K*{#p+8DQA!N2ES?8WHLv8V=A!?L6p%(&UcE|+*}v1m4&iuw)qy2!r#~bRo%dc zNv9wxV_&Mw^YT~QfeWCa94`FB5Js0K<*Q5-qKYrA2-6UF46g6Q8H}$Gm4~B(!1iEB z)67nz68o$i$IuVcrKgqoJ#Ew!CjBVf-NaMMjJbsNm95D?CiHXKGn~^pfFJDo;eZ-L zJgrO~P&2xY2dgL7ZB<}})-kwTI1tm8i}<;{i>GI}^p3!3y~hhqW1(7FYsAthg8r*l zacVGCS$jd>J;u#%axjAL%6pfcM*t?{{e!Z=Hn(yEvDFS%3(u(0L+=;L$tm>hf}f^B zg!f|6@y_$5!%0j4jy9zdD`+>Q=HKkmWTgLZcJSx+{~-qt_v69(S-p76=pF(wQq4r+ zt6%C`wY=Ax6I6zi@KYjpVJ)9-+D0%4fJ-lE70iTbXw&qQXBq|~kqTspQsZ{fGp9<8 zk#2tHQW8mwRAwSBW)T&?8OVIgxGb1I)7yKM7LIz~ff47C+Z3 z{t-NNO=Yb5_)9m+^~+Zbtv}^}KN&|yPL|RK;uw$_eBK68EVhO*=7m9bV>ZBzc+kqo z@G5>^emEe%B#B}*M#B)QaaN1WSG8&uq%j!mksOUfj|*t&5`t|sTb>s^9H*L>XOVzL z&%4CJ&tm0Q)lAsp-YfF+=mSR>TV{T3!UiYgzE9UF>wo+P3yU)aSx100sVD|b3@$s* z%t??#DX#?6*M414-~5Jl@Q_odC?yd$m6W@STnyOV3ugj8N{x!MEyQW|N^54=CsxNU zOc2X&YGAdUPQm6JCZZ+te7H>q(YyCED-!mrdzgPhI!;+K#7h@Q6 zovVjh($fn1Ct2Ei?`?gJ5s{`Ws2AT^`K>IzM&y+q6b|ff#xO*>%+t*@{W}E4jZ^l= z*2#hGlr^&feJA;ilq+EtwtLJYsr-cX8@t^RkYk(kuB~i%5u+h&LsVIi_ zHm{KaS9_o`_*W78-dccE2KZeXK2sQ{9NYQ}O|EAJa%XQLys-H{3Sq?u8Tii?;hJ-V zmc)cUANvm;%B^mJ{a-l4^H|;mwy#$IlZ>@~1=+Q3a0%1pfFH@Yp58X7L~<&Vd_lgYH$l>H((rs zgtqOe`dnSkEI8uOqV)h2Xx>pP1I-h(41u(To_n}y;nx=W40q@V+c_s`fxzFSVcj!+ zVmZmU5e2>Ds6;52jTQ>bjzCtJSWzoyoz|5+`s!wj2GeAp_g`R~I$x-01EO+%(%q^< zhjFCeiZLCeqbM#PIPRmf(9*flfv;CkzIx%Ic)&dmQE$?ouK(2obt5y@Vp7@4Sj<(L zqPsS$JtGN7e;UQ|gaIB@9{@k?gM2<*iL|9=k<11#hSl*Y@9?E&;PZKCXT`Y>GVqBd z&Ap=x+Y_=V8!}HN;u8<^Z4G)DWb~-yz5RJKF5v=tRzB#54w%AJauiN`=D6^MsHIKmLONH)q2_iAZNjNxW;mkiMI^PZUtcyyVfcHX;Ma|5zjLJhA-JYEE z09$@BZabukh=&&VKYv3Wh*01}a7%C~OZmO!*Ay-l+F4izSz04AJMIT`g6-dA;e^z0 zKVa-eXzJUre@`d*X9mrW>nvdWdynH>Goy@AL<7W4HCK{5Zjdv_5(Z&F#Mk1#lF%JrF@)FvoZ*6SQZYm9@On!O-M|-- zZ8>#xO*#lrW6PED?aB+Uy@kqOo_>$VwT*(f@8Ch64b^_K7^v&CU=my)7hlmlF`Uwx zw=*|2K}ph9_M6xi6cQQ)N)o0~bH9I{LI6i%g78riBvbm|Y~dDzYd=>3jdA>|BMzi} zRJyAI7`L$>s(0$3O5#BT#pt{vixw3?gvjMjE-Fd7ge3!kbF! zryIJg`a>8d4`z~M|5R`g`UN)nKXhS)=-Eef0AaW~e{=}AfOJ4Yed-5Y6dd~D$e#Ci zCGCVC&W3u;%???^P{b%GI=h_2Y%2x5dflC1Wl=-rrh^#E{V}{5!ZmO(9{uNG#>h0%#ua+{sui9awGqxVTqw|5Aq0&k)Jii?TB!d}fa+UuO0l z{Amb!g}S}W^3x7f_(2o<1z#-a&OK6O7WEDPEkH+oYpgX&F9w%q=(Yo}h0TcK%2W*o zt3Vjp)VNv{k9SW_pr{%V*UV9ROfzbU(6;z!bK#%E(A9xA!|Cd3novI_TTqx)x>mZZ z(83x-77DN=I?gAs8V7cFXeuqC*)*rBYYJyub|s?!a-bxVD%f=W^1V}iSNNI|g* z;v5czM~H*$>k%KfchSj+9==(wDO%ztp{WTA+UgUA`KAEJNx4#EHBfrCg^X@fVMXQ$ zc1(exouz5!cFmuUG+O6Qq~r;b?%Rvs#B7H{C!9`T!)*QIr?`-7@xP!fuk*TMt~=8i+Q7~Q?{Af`74E%z_B z^p&>k@f&jE5Rk>+zu3f0$brqsGR>BaLc=VySt@{kI@kwr=rtbuF6jaxfY#(Q03$o- z0>ouMp**9GL($s7%m!nJ6rNd%KE|-WM{H@E)U=>TpL_X9NqtG~ABWmCj-D_A(TS`K z_z0}amXOWdG=*%T#W6Q}&62^^|BW51Xqz=*6b3x@&x*#_sd^?ndX7SKV;`HAi)sJ3 z6t7K!9J$0cWq&_ln%+wn7sx6sC6@25^Cnsv+_gv|THxL!%VrQaMW#g%N)<+i;jICh z8}f|>AEy-MC+hpL>th;$#0HY*cR|~TGCwfzh1M8l9iWTNs4qkhU10bWo|5h%@oM!O zS=K2^vtt()mbrXCkK?MY(|zHV-ud*PPG5L!6p?`!a4_4!Vd6knd3;5Sz4pY*cH2HO z;>G#ScLf%|>EeGBn1~sq`iVChd}iSuUeqG!nYqfCj(t1zi>2}2O#%UgNi(j+CGEmLBOEdBVnH$!04aBq*5Cq zrw!4WU5AFI;8ZN~wc-f3x6I!{no}&D-0l21o^Qpt1MiKu2V2v7wGPrh8BlwWjC&rl zzlOq*LEdznP4Jee6}t7jc9=rtniE<_=jP{$=)54zuc&i2G*n;r!R0^&~nxT%H3toL8m`#|>E>4k=s()>*$l!qoU0Z($FY2fOyX4)h3 z;S;$IHWKPdlKPemf+H6)+zZh)Z2-5FH17QH5s{f|slt-Csjm1NU;*R({r&Twb9Ds( z{a*wE*(Sd`w(toE2ng~E`g;0!dV0FM`~CPO&#;Bk{JP^$1TE)3tAot127%Wl3*vxO z@U&Q@y_6GIl@e5Ao1sP7_>>=}|HM$n5_e<}WWux^xcV)G0=|T!i=e48X#>Mon3}S{ zZ6%xLWNov*u|o{9rs!msj~6F42_hqbndE@|e5r3ijU&GE3)H@3nZ?SxGlOS|aTY|s z>Q(Ig43-++IE$>;{waAV;R~(oYlh#q=FVh6lX4S}H7JEaR}fa=_-Dg?m@yT9yNY zY%Fj1pQwqOlg$smbGEOd7s?0Cgfc_!U;UQC*;*5!pwH{`-O1V6+1uM2 zKnc)*u8i%XRZ6WkX&_Av*6PtkG!Z1pY}7}Vi|bPm5fP)Kqo<~(7#SH21UiQ?S7KsH zmyuQB_+~D6R4u%bC&XDw>TT`pQ6yC7TE&a7$ORll_s_pU!qc4yN4gc93C+Fukr*t? z(YAQ7W*wb-%&3>cy(V$?5=EIIr9SIP`6P|5#_qmw4tPMcw9$BYTsi}_^(!!3aN$NM zmf$%j&f0ZOWRgaHhRjOtf~mBcB<)&JpxQfSI$h0E%>Oq(S?pjUlHLF|pwiI8aT4g|;iaLRx$_JPC|^fip#Wk}|4f7u@k6X`#zf6qqId-iDOc%dl>JT)f?j%2 zCE=1mm(Sbd)y`Uz{brZ%$JNeIltA{!XQ0sW&ztRnSpweAuTM8aLm{OC0{j5g0T6S~ znyMJI@mO-&a{_wPYKNnjW-d54x7ifD-c2ugb@f%XY%K3b5R$zZ-M>5aw+$az9~`Eh z^|e5bl1$4HOM=RMDJ>AeXTUxzPrV@FvU1pQZw3t!A9;IHr^NbJJ0Gn!< zRrxQ~VS^S?e@F+uy2vnjKz-S%ayoQ^7+fu#l#+O86+Vz)b5JucndRG+!TieuGDajz zSl`|A)zuY1T~3y&>^D2#P7FStccKM--d|goiR_(zmG7fnRwz$(MUiei7cwDP-@JQ0 zUGKfU>5FA%W`6qg2_Pvp%uB}^Trak~2}w&JdC!I>hbQ9=cD6GMR1gEW^qKu1D*dvE z2{G7`5(GQNlSgq$Mbao=(6}^(veY#TwaK_piUycD(#~A!+E^?3x*Lw=tm0Q6Z(OZn z{Fd8=2ts$=?ook;-qJVgUd8DjUi29D&C@PUDUkNt0^B;3F$#N-60!m>spb^E+5IaS zS-3#xG8M$9V_1!1pUqU(*TO4Bt+&U@MOh$k z)0kkc0<*LXq$k}(8)G0c#45PuH<7l)vl}trSC`!cEEN>7gZyPCwEH_(2o0}+9~ljO z#mb6hEE^9-wBG}+D(jn7?Bsyl6OOApmeryl%Za7f#g2L0`UI}@*TY^oID`F%#i~ta zOel3Ofjc@nem^6?VSKzE2>QN00*uC07U%YZ`&V%(VsgmA!2zQ|m(A?~z}xNsyseNR z#}Inra5RrWzbSLU_igBsDDlKL3mfXmoL8~?N02Ba8WSR(PjCI;s?qgDJC%-)%08mL zs?(Z|X`pa2#zGB+LY9K+^hViyvasjWzJjyobzdlPcG$~f&%mOq2bWt;mQMwR#`g^9 zIivG`)TR8y*ciROI~M*spuz@BezTFJRmM?PLzgYnA~fhi&q|kcdy=5n5!lNS+)3#$ z*}mjxS=EV*hNOXUVR0+hQUvf{$NNtK0HxEJ>3y%K$49I)!_7|bm%EdtmzS3=SfGlc z^qI2i$EmJd`j@A@y}j!%PXM`a+`)-dnKVXRQcGF+J=0T))6vg>vUn0Z{kY(an;(py zd!aqe4catar)8hb{T?^qbB{Vv($kN!p8qE4fqj*d2sd8pS_s)}`n`?HIB$1-M6$Of z6Gkx4xiI2O0SiuKd)=-b9d+>N%!A+&c4Seo9YyErTl8ODKK&6XddU;tVkfyBcYJt( zpomY|Da1Riv{1sQxG%mQmLigL5xC}T;aUz(do>bf6YT2LvTY$yBz19(#fN*2*dqUpkghpff7t2x1$7<6oT=_MR(qr$kX(`4qP|@46 zyM=N5PwYwfG-W0iS zfe;59bn40-zf&hZK0N}48`8k!J?=Eh=}^Z&{2Pk?hBN)-oLgnoSKjN9dWo`Zd&gBuC@IGI(Z|U=8**#{m!nO(>gfmU*fwL zv+kb5;+i}uo@vX@b5f@CfC1{Z_!G6I^XKPZT&E?D{f2HSx<7in8%GWSDUJF4>+9s1tm8t?@Ioq;jnl=tRWGU@s|O1y9bE) zB-enmROAQ0Gj&M)6%gy?Jf{g1fzC!-^?=*9Dq(UDSn} z2K2NjxU*lc3Slp#mbNQCfzw_IwyfTfU!QA zh>3Ch*socx$A}EvqV|Xi+~)Q<+csLsp<>_ZGrE#c1zO?sK2zVGrr&Vyf3l)y!Lqlu z^Sn&d8T#~K46Jz}V(QX>#jidwH`#*do3YDGiCtDx>QR7Ru%$~#4Nff{E7(AblZsl{ zJZN)w(WCt@BYFNe43QwRPp#qIU~In&He?ms&*8w56uH zfLJ%U?la>d%#7+EO$Q%--h|sW4)o=5k3L2`w1TLa$kZb)HrnHv%-M^AhMUa#vS1Zr=P+6$}s* zAMxYGvTt6OfkLEDwojWEAs{yt|?|3*@r1<-S(dG4Y_OJ;^!dqjr z6|?>%*#ZLR`Z^y7&vmg?XZ?WhuK~)KoSa;AP!tjp@iGye=AaRhq$wK|C2eMZ-(>0}F}{&X>fWc>j?}V1=IFG1m3B z3jz!`{!@Zz@B-e&7n)Ap?i%V$(_hBh`z6c-#!tC<9NnVtBHicBBR)Hwiw*hwQ$#r# zRn!ba|kakN}nGutGWGtr{u?f1=J;sS4_17uDq0d$8M-JJtJoRZ$@d+L_$Of#6;s1_f~*mt z+pVoFfX-Z8T##G?oHQUKe|U&ad9z8lh|Fs9Fg87^TspycyV)6v7JPp+`OJhZ=;7t% zp^RxpRyc9v{oGKQu*Z%!OjhOb?&ECLmY-FPnd zSqkA9>WYI>=e^YCdb{e_1=C{Dn;ppc(W4MQ-Z_7_Q2&`@k%@$)qff&syAVW7Qu%3b zuVt+B3c9v0-7kkv++d0%so+*MpIT~CCeI_uY0`QEUUChKZZ?F(E4)45N??mW+R@Vq z$ouX2?&#>~?(S{}v|aEsc1aiM+lo0r0q;%#as?y+xQNey`|rcW<^#7ua)dquV)EEd zU*8f%%z^H2=86sgDTE?mUIS*y ziHp!V1;op}7dUGv)0OgQt25%3WQx+I^Cgb4k*KVKO#se|UanKcx5R~E*2~VP$jrJS zu-O7}pd>A!4)nLHBnAOD#{FxXQx~suE%+{?U7VoChVf#=jiK+vegwp*+Z-{iGVmtN zOk{IIIVKxB`;`%;EP?pAZP{jU#sS+!a|aTCRnabJRTyTq4MixZUSv4q5u~}B1;AUz zfmH7I+81x)RI0%d_ZIl{rA)DNYYr=@CP+P1VW0_h7%4~qo(dNl;LAIIyhmDpbx0hV zet<6rjI#g~4LaJ}Z6-9<4(xU|?;MpE06KO+3T+v&|MYyypSt5Y>4An5Fzur;x@kj=s`q}uw5Hl zbf7Mr#4ZFI@BNJfSY3sp92Cr^0bF1#UIh#maq`K}e?wy{sO{#Vq6BGpkOST64Ny7F z4VPD4#a5YBwt}B>JN1a~LuQE3!R9v}q)vUo@2-Q=JM*l2#A2{tV!DzLPn>W%9Ckn1 zpY8w(2Id!2+@RMtU5$C3-rhgcS{juOwhm|d!f&cwO!@f*_yuimehK>e{Jt4rfYuY^ zEQ}d5zA*yDUEtf9lYc;EO@-Bv{?Mr@Y^FN1gVR z=|F>5h4l(s(J~gmws5$toV&c72;1nThR)$VUn$dnE1FZXy$UBvA#Wk-5ni00n9AjgevmznKMADVE3~E zRTHuvx9q+lD3x9#facFJboLfQh7{pQ`3Hu9e!k4r?cn z1*Oxo!GSETD!$JvhUBiY8l1n1W}wmSlIC4yDuNQGDMfVq-`nz)dA$kZE&4QW%JfOL}{Mgxthtymv|iev4dP{s7ys zt;yV3a!c5$N6wIsfA8PK=hwbn+G@g(Oq?qATq!Mt@1bgbhti;X#rQdE?%F`hnX*im zQ$~Akkox)5I{l1yJuvet9(_?Sim$gD?()?&#PViK>j`6;@1ZvpDR#&?|MSh+DTmFj zf!#C}su^2P@kJH3Obdi+=1%AWgFl;3g>`%9 zs}*~x^Vg;R2MZ7}90~l}B>tNRg;Xw;^~X--!#Li_Wj>zM;wKK9-7Ydti3+E55>$~$ z=}9Kjb&5!K=JBnPx;0gF8e&2V(|lWDZZEzcvM*_6-Hh1nO=RzG&<&UHd?h%9y9EXP z2`sJG_~FKseWm+8OBWZ}Qzd-q57RL{{ISm{fn9h-0Nby?$cY%5aq| zr@V78ncW&R!xGbwXtsIY*N^VaNX=Ep%aEnX9Gaew$6dEr7$|k}97@gsu|4>uEN_DG zr*Q9cd-dmv&cWZK;CSUZC2yeQb;cz!CG+{NLtF}A8qJLsZ&FTa$FFi9x{H(pRMwJthYXI5FZu#r$5pkSnA6=^&Yn*>LSjo5bY=GKjNM6P#8|M`y!(dT%45 zQEv%k-Va~+NTy#BqVza1NodRBd)AsMg=~}hBrVII4UPKd&21xzJ`;^~2urJJS*n?{ z`QvL97xQ~BFAZsQe`A$|6sT>Z5$%9ux!3)If~BihH3Jh^W{bxs?OMoGG%nrQ5JRu* zud}J!VfA-OaY~uu@T5ES%Bdzn`~2)uo1FYWx??5OaF9*p z{W_>c%Dwn@b>sUGL2AKD84n<)2F5U_w#UWHG;}k-xEXm~ zY!8Vu5fe;c{ILlD-Wbw{g`c-fM?da>#I4LMSrP&}K};>n9fw+7Sn-ueco7Ne8@CLW zWDe+Zu4J61`mEGl_?|iuGnehb-iD{L>jsy*i zh7e)>LP!hoDeHdCE=4TBndA?b10w%JS!Zvrt2&WTjcf{W{~Syy=4|(-P!(FXn_o%L zncx1--I$6|sv7{Mwy}`Ne;4WA1$~;jo{t(m0Ro_{lW1;i^OQPPd`*)SXe1FM676Mk z37k2jp}tS2D@oEt!&&@7ZTy{An9q|1PQaj{ebNh9eSS|xIT;UnZ^rQs$UAuGTg_d0 zh3{=-ZCKlPg~aazi8{{m#9)}{|57C-r1~mx}6AVgF3VR9a&Yv zqhnd`YzTF>=mR(1%C-bU_#v%l#$hE66%VzzSB8vMh(Rr9prsJGNEM7c zx>H|lvS1T(#-+j+zBZ^g2D7K!DY$8}i`hqsTlUTLZlQB00O5o7%5L-v$4v9kBt3x_ z@pUrGeCR!32rC3bBCerG#}EPbU8{|}MnHC8Dh8`7H4z7(ra2J;(H>~Gwh#Szy`xW{gJ5mcvtcqhJXqfEu{U~UIjM?u@{%|AP z8Hji@hn6oTB2Aj_+|@Vfdr%v6gcgJoNLHd;FX33ekKckFtIU0a9H*Bo@+uOrM zDscPY(Ajr%s%rUJcRIRXqFWWOJA?Z@fH}^fQ2Xq9eTj)7^Eae^VTJMsu1p(vWTs;i z_my?;bWSN6T0R`Mc03#e8|`SY&ud?FH$9%vcw4l@VrAz!*2`41lDwQyC(5qP@f0m+ z9GkG9nwuASo-1q`1XQBylP!5}Lap2SxlQ4@n%$5g&i4`N9xK=ctw97>OOUMp?Npp7 zxO99nQQj?+G42}?Gw+cfX2ik9lrN>;3K$&w1kJf<&e$K`>Ndba^_lA{xvdK@Z8%z8 z4B3N)6;s?U^fsHBIlukd+j*DmnyJ0iy(q98b~&YD10{Il2u&Fkcz9Xhr3sXTFpptQ zR&lOB8k(8?Y&E z;QG6#yP@a67&m!&8?rValqA z*nO_IHuO0Jh^QSVnGPsqprCL|e($0da=sH?-U|c$X@Do&vwW808`Ju{OgVo>A5P2F z+}NW=mGQv!L}Fis;l1`p*}tVXmnopo%LF{j-kq;2F=;gW*vBJErPxn#UK6Ak@kNJ3 z7WK2Cdr#V&^24PE-(D6Q!wD;%RkKGF67a%=GeT7Gh-NOY51IzTf%U62Su^#cm|H2- zUDEJH=kLjFh|&&N78Q}W3^fZ5Y@Td{t(qepNvED zHWi8{GyrqJ+#08>SR|OppJ94h8#q(|YZ+b)1Q32_PyZd?PU!G4ywR>ASCke;>@nMT z=|Amp%}E_FRfzvoq8oS=33c!dDsnRo-I1qiYw~grBLk|r0I>b~K6=``2F~tFu2-*I zZzOU5O!W}giVu3kdCG^lz%U=Q{uVtXM0H<;tAel|GvjC2j|fDj!n%V=EK7bAX>8T_ z)$-lZM~{~jr^*%Sgz-Qe8Xr*^oEG*^@sw9)_00CV$+g}yvWe-S>q9{vv|ow9lxn3m zv~5a}M*BRsq4rEi4u^C4?N;tvwAJI>sQK_-PZCu#2YxcUnbk<$R!f34xI3vLX9XgL zgE0P`JIFTZi!-eKA|@vj50Cvs30jxz(BjCE3H`!oJi!M2?J~1!#!R&#*FCSNRX-QN zSDy={{^Ux5!StDXrW6i?L(`HIDJ=Nu3f=iJey^1|Ldo?3juLr=EQX$)D!%|PK6h!{ zE!P7;RyPcq;)1O`+R@cQ~xQoEPBh{QGh8WJV*FYc`;wOG10}SNu{d&B7PrTJ^}S@fQQ9> zBU1m#JID$=LA+3CJUPY&76#l;EZ&@C9=Js*bK5WWh{ZCxKa5rf^X(Pe{4k2foh> zfWFeAzH<9RU6-JfO$lj`&|yNekAyGU&$hw6g48B|jGRE!ov{_ntd(N~8wu<^fZ=S} zW!2fw#y!WTo+~-rN81x(dYDFbH+^i(ocdn0GPw>|6HPAtLNVtB8J1Dy5%QmTU!;$ePEg+DKm{jvRwG*@USsMT#;Jn`<%U z4NajDE?JrgEue1#Uby1~Q0RA_(Y$O|Cd>nZlH-NSObR+N#degU0tyb3=0pfw+Yq)~ zYnH?H4Wkp%HSO-J4-9Sn!6pVoB}iA)2?~&}S{dT!T(wuanuLKJ4#iK)MD4R=g*QUe zSdXW6*zS-D*p{oK_=P@#QjUk?kjciae9`1_R;=T$93Sh;SE(^{XI{@YZu0F#_6DEU z=1Pv}FR~U)AX7&6NNf@RO|n`k@q-Goz6DB!lEX7XMO3L%K*XVK04odYV7LIKI0o%} zF1_>f0LgUx7Cec1%SW#GF#z^hhDh>52KE-n*x1|@6cE^m{#eH8WRbf9pw_mw0ClIWt)36S zC!?3LD6lX@EENvjit2Wcrg@FQi-SZu!8PR0t}gqc%Oz~3J$oFR&#%PpX<8A7z}kc8 z=vT$|ZD~BrSCa#w;M8DDRnm4rO0*hW8C(mnhqx#PD)}`D)nFujv)^bK+HHRxi(T_T z$qlI@PnNtGbp7tU{zJ2z?(6H*u(OoGy1Rv}m1TMB@sKN-8mRRTiv1y%Y`MW&QpILE zw_jHrY#Xw&+{a*2)_3!}xpuQ@Rx_Q`Uaz(^!t5+PVl7pZzhxGTehtTQ&5(aJgc~YM z5KbokqAo!FZ08(1bQJxKn~731At}#P?zG#$NfysaU@7Xcy{oIsA0V2I4G5rBETrm+ zt%sH7skuMrvG4vsJ^*qr=I9q8a$eJ?!&XO10__~VDge0WH@fF{@v^hi4(pH+BztVH z)+p2H^R)&4`;up+cB!*4eoY5Ed19XoN_qVFD?h%FKh-o4DCTly0Rg(v$)886^@b<1^#y&oG;jvLKW zCpiX?TpnM&@!<}4s%Q07F_(cz`W{&ir*8h7BE_u14+Jc>FJVf$@u0El`w0)7sX>#S zfO_xJ($d9mB-s1g!BkdNRTZEE^TA6vZS#oJOevBjS+w=_nzH!^X^3`eMc~)<#|eRR zW6q|C9rM03u=@@^+z7~S%Ii3N1+zoNRsSnJ%dV907~$|{+Uqb_9>`=)t6zn4+>3w4 z3H(#p|3vT>9bKse6%b5m+j&A%L2P2(z>C8MUjcH~KiuRyQh7le0 z*H7g{247u9Cx@59V_xc@9#V&@K>HFPAk*wvXQG4s5Osb$OVB5eusK=a#Pp-t1Fr4e;v4etWpk70d%~(=+ zLJ+U~H{TNWJig*Cc3v6gsAh+>xRd9!+<$rb`oa5q8qz-#%oTZbz=%p4)27+N zUy*#aO8S|dt$vD#^D}~!jMGfhsiN0Et)0eRkdDxAzXVqgNJ!f!6D*ikVtH7>*ioRb zhJTw23dcire6_<;qGI@w6ISUlOn~yXIYXFrAluigDEr2I;q|Eft;tM}6l0ByI?t^u z0ofn^_U7uU#s~l-=maPSpvwg8_q#KE0)RmE3AI65PR+GQ5Ka)0W(LC{)YfFeKidEu z-W*K*Zo$3tWsd|)m3|$aBZRTsKZ(9uSGWWS>bI6Hb-mwB`M%%0JX`>D&36%O_a;*k zb6GTBAJmpy-k|UL z=I!O-V`!tzt|@kRwN>bvVI=wZ?Y(OGto9sbWLYpKteah`ZT)M;T)!TFyNxypD=Fz* zP&6v4;?(a>aTVhaU>CyaZQ!`up(ei(Fv~u_lwhQ1qh}{Kw};D1Ap>F=5e*{cd)fzW zLj~ZbYWaoBaX&zd^*2Hbfa-XDmZ8Yr{0tmFBRKnRayVtzv~$zZ)|R(9XMhZ$qCB0p zPelikG7yj+bY5e6txra7^a0F--KRpG#U+mrO1>qJJ!`c)IX1vEM0>=vw zQIL-Ng$7rjUt9p<1mHIz0Ra@WH0`wGqW_yb0`=56zJQ1|80q94Ku-a^(59xQoh$b! z&|xM?)+bpApi~9UdmiTF)~+r}l=`)^VfcPmN>*$Bozg9-o@#j(yf=)8cw?T1pFTIe zu>j5>^IX`@;B9mFDFLCF!wP9nJ2QNOxE*FjCCu^#{(-zOw&~sjVwW{K^j+#!6wvnac6TS57q=r4 z(eK8{G*vX`&tx7(Ix+Eb)fTw@#h|3vSdcdj_Uz6!ZVD5e^LPtZOUaN;FEteJlg#zL zVjr2`$L5YOwpJ<}QS1y5(|`5IS2d1h9NqwFN)6_PG{tgQBYWeC+?H$5jr1sb1cjx8 zY5G;^9tx?U_!fmRLKr#JQ{_%w0veMFSIn$w5h6Z);##6Esx}kt%N3_sBHamKXVnv8 zNdsP)|Ag}PM#jvv8|S;6h(8rBIR*H^O=?^wKt}-90%!>M3cLek1~3^wm;KMrqZ9zl zc$a8yt~`Z#K%Ndk#Yz?4RtZ(El#ESRx20Kz-WS`qb@}=#H%OQ(IBVhT>)VxaZJt($ zeI{1%-Dpl#Yj;jrc?nnBe;Ca4o@OrU9T)l@Z{ZFr6t}1NAVL|_+=ozUjfy zq0vcZ6pWyMS~F(G@NBs?>Pgv0*}sC^pBIY`+h$}!n2$+pIj-4G7P;gaaaQ)H6T(e# zg*G5x)dYa{*Hb1R8*2q5R(%HT@|+-UhJ^~B+;?-vD$pp8YQ*+mSS{isoqs$b)Sv2` zTFc!m&;Y&Wx^`4BXVw@sziHU5@i?;s~}JxG-3`N2lwS61O4i5~mX@HXPQD zNnBSgdlmLremP+h#?(A0Ji^?wWuQL>c1$>8)|Xk#LpvFiF^7PVL7%VpU~zvO%01zw z0{eTgahZZvBF;}|U6q%mWN^f&p#eduKz7v z!sPMngP~jSkpOUCz}YGQ9sF5X>(9mf;J@x`1g)I3a{?sExx|LMJOf)jf`EBqHp{Xd zt}o>{-}({Q9sn_{DwPpM4r;VtAUAsx1f%L2D}>8vm~xBPuwQh)EAp zIHZP*vfgfOW+_mD@Z$-*G4vD9nRoNC5;?hqsa`@%0u}TSdS%?wRuB{8J~!;pi(Qm_ z-gZgxV1C+0;JwC<-I1oSR!zCb%cq~LdGXtA=G3!G4LvlY*Gw`vsX+M(O}dtVJ-?R) zAa7B^fbI{CSW?VLhZi!?P%VOJCGq<*wV&MNiT68!|8egBNQdVCq3SDus{FdIFAY)` zK^iXI-QC@#q%@aC5Tqn74bmaqC?FvX64KqJbhngr!}svU|NVW>3^Oouhnc&dbM{$# z@3q!>3XtSEzTPlD?k61n{zA%GV7~?HYy{AEqI7T+Y1t2E59eMz(0yqF=%z&oCoP$R*Yu}u6Wfh`?rRUnqxAXqt{9ZV~MXp@x;i*xT z!lB=npfzc45>X&#;JY3p`d)s^OG=e4>IE;Q8Cg(wk&hA0Sm0RF7$5@)+WwXmBhLjH zSkS(OZ7XAZx7BpeMi({&Y50ul;s+cAd=LOF$11Bc7WE%z>*C;!Gv27XRh?$C;I(YC zG;2(F)%~EXT>zau^6o+_o|nykGJH8F#f@SOHb18LM|s|1fzmTy^5}tRtU!Z_-%!6$ zHziuPb@j}zlc!z#H)Xko4BoQy_PYJrwme^c>`HR<3q9q7S-Feo8e#;>NX6LJg26b1d_vY*h&$I-$_~kbyd7?1@C3M; zLb@!>->Q=KK_e$8r|)ZDGIkTF0#6VjlHJdm&;2bt zqkkkXcI6@i|DCBzp~4EC;Fz}kWye=?m*O0d0DTs1eIb>^S0Fr~Vjw3e@fSgFF;w1^ zMt$Z)8YUVI`ZiFQdh#j>t#KDOX0g&e>UP?4J!&8xiC>ptLtEd{!Tv}dUxlt*0^ec) zHw@+z@?~Sa6qq#Xd!LIBU+ZZF%Ta2~C0uqXuj1`S=x(ovMuPi3B7i{Z68_%aRL9tP zIsQ*~E5I_MxRquUvAoXbZXiQNC4vG2n2cayQmGoM^49uScG~OMZ%aa0nN=HIuC0pZmPCli7{ z^LOu`CbVi@C*YmTb>9qUlvs2s#)Jo&B`S-&c=0;g8iS6&LOAp+VRX4oXm^aRp=5HPD6_0!W{&K4!==Zz!sf92+t&yrtnJ zhULFdhZ?q{`V)fA0Z#G4VRm-*?|t5YqO%*7Ht4x^oq=j8t+O}p3V{o}j!6KzcIIv+ z<9Ir$1VAErt_=WQ7EmQzg*`xj7H-=AapCrr7Sg({t*!QroBA|*<%N?~ILHSt0aJ{^ zPAn|B@WuqI1{xM?{N(|yy_DLjPBZ0F`Hf2(|((Qi!;hZPuzh?lU765G^2fmE1HHqCY z3RFS!FKFSXE(|Pl%@$I~GN4^6oQ8yn{j!;T+w|q-<^DpNcesjjZX9RRg|(DNDKhUQ zLE)nhK+v9cp6+viH$sXPcId>cDq)wEF$fYOkA*;TBG>k^P%;68r^!DDt)awl6CnqH z&wPvK&Ya!8)%zBqku)JmL!%EEmsVGD7%lI z32jV3yZcKyzQ*7(6dS6@*LwA-oPTb@8`|;ujXxs~;$S*FMbuvoL`1Vy;!4Pc{3Y|# z*^o_M>7M$~Z`CIp=gMKCQY}S>c`!~5CGN$0Cz;p7;~q*+Yl}H!W9ly+8k?J`&!5XI zpd9zrm%#|%!zOyY+3kh^Q{my_%moT*Aq=8g6^aOBAc1}!Rsv2HiqLNr1S1{Nr5APv zCmF~rK|x^^&9Z19#|Fb{F`P@PecU3l8#WGc1mpUasu{&Xx{0*OK%o0XJ(Y8j9#%GB zrT;gW7|F)#MRBw*=E|C5;t1B6cz>1+H=03slsE4WaFJC_8nND=`6S12$ngD9#4-Cl zBk%4wYpy2}dT#O#y##N-bKUe`;NkuE53LAZ7rdr@h*hAI59mJ+0NBfgd*&`6Rp5DbG0I3R$M9XSRJi60IxveL(x_B)J` zlkp~4XLl>M^qxPy!hl^<9I{PfgyY|@tp)sE9L39^lks^bl;8XKe=MlUMYYSW>Ajgc zCGF}k@MmF)?H3r4nxf+scOb4SnzM>F%v+27mjvg`VrpsGliap8oARvQcD!}O^*zer|)9MY2y^f~% z$&p!EC%Y=oX?@2x*^wng&LZFY8`v-2TmYf+2h@T<#-c|V2gsuXsICH}Ki)E<%WevCsp;cXe!$y>2wq$Q4_bBS|msja7eV#MRu%T3D zLN`C8S=kF)s9xXtmo?XSwmD=07iCK-K4eH?Az=Ei&0i&%548U;x4G@F(m$;dFBT2X zaActuGf*+=FRh2!X-Wz(UAiHa8q@o;yB?WsD+m;e+0eS?(ZpS2wMWY~d_6YpF!a%S z!j`*7kpf4U?`dorw6oL zANDKS`r%}NUv57eaa0E>5}T>G;Wdq$n=_xY+0!ff&vLqn|%pFtex8Krz(_@%`pA>bkC(8!fje5aBVS3jGKDHw^e7+ir5kr40qslN?B z_@Un6yG8(JSc#}9gF!Z4rJHwl=XZqLYd2D^H)b`$hRx+E`0;{?B-(HgNiNSX7OBjZ z2lz7|ehOvL8P_OUPu+hYf4n$9?*{FjoW$>q-T265+T6b4^{;xosPOl_yHxe|KcHbD z3aYD}58mP@BkZCMWyyYYcH$XJp!e=UCR&oI|4c{W&sf2}LH{~;5uN03Fp;Wd%FW~OX+(>;Yo{)vrd?u2Ea-hio=LZ+>@$@G2`~xX89f3J52ShDJWM1 zQ6YEx1Y>XkIV)+ji;hA)%TM|x0w)@ms$POqu?U^ZTbjc^ap)4;h`v5Pf77%w$luZl z38xeJ3y`W6B^vp7?SGhpFjTDEkFc)Rn^6}<8HCY@80ROtb?Tz~{XW+EyLXZ95%cb~ zKe`de`9P6Tq)DH~!b&!S?*DB%om&&l3Nw&^mo7Fn#8(c}moENWh>(;GU)bx{oK4sY zk4v5hG4uigBiT4a#4q*fJ=MH5f-a1#gA1EK!&9x>y`O1L`t7$dolusDwS>nO`)9a< zpj51d7!5NTy?D!Xs-=cY^?i$(N0jm4@GyEbsrCBtQH=m-1z!MvK3<-kB@S!6d_U*% zUUfMF!DDzUH9P69oxzC3lWUWE)!J#l59yP!l-2j{do&7u@!F`z>uc)^MEl#w;H!%z z9gEfHT>ftW;Y5t2=|w?rhxrFnt?lpMcKXK>K$3@Iyo+XZfYd+VQKsUA&KJBaNb5Jw zD<3S1Kl1v`vJ!Wc+iMd}Ro5;lUr^g{U~2VTY~UNKvtO(x4%>~_SwX=#+*{rbCNFgB z_FOE2bqKRK5X^5~#d2(q?)=)?nwyI>k44Vkj^3N!PQ^NBqs+WRbdKPt?o<69-7T?j zh##yU(ITD|)zUTv`Gzx0Xqg(Tq4oaF7j5a^>=O{QqQDf#lOxOpN}K@dPrLaVf6ngi zgtKt6P$$^(Ke+weJ=m>?>7$MfhS11`$bWRi#hsrscJFOzX^ysVv8h+e=-I46UpJm# zC66(tX(@8J6p?+$TWMVWmrs5HYAE-w=ET1fRE9SAo^ydJS!uR1RT2}yB{hbJ<@`pN z(2ecf34P{aO%SJNJ=J^QhoICsg-Jk-2r+|7V)RA?ZeXqz5mm`o)F5Im!Z&0{x_1cS z<)Wk}QHr!^okKhZdtG#$Ux^4!U>v|RmhUcN04MZtC3^sRQD)}Nxf2GW zI~g0meo?}2QdAaJnqh@VW;IODAAv2_U=QzPpl^&ziQ5#(91M_%S_Eu3J9Uc+Be}_?6?GGc(73xpPWl43Z2>EkkK7Wga zM$^fa*kdJ=rC0CCmJc?Vd29>7d<=i0+;KzhXtc}B_rH>3@0+^< zgtf(3BmmR+tZaMMKkXh`Gs(7b{lV}p08`wbOE7!KQ>NYQ``R_yOV}rYaQ#W z**{Q4xV#>Jec|ZRaYbAs4=&+RhpauIhzD?69;b zFks|wGc|2s0qVXH@DbXX@)C0;f=2xCO?}H68+m(juKy*1+m*S|5!oXeNhq$?&Q8NTf8-`|$DRBn7hn9=$KFvP zjnd_zcn3pIYmvY*&Fi=d$KT^&;W?Wl!JfnA7GzgQXEYcJ6~o}?HPgH2kf{2#p(UTS zpdX5O6J@B@&iQ%resBc;(5GESY(2p%L2?B;ta&PFMXE zb^DP$yS$a4=9h=a$y+DoHVq4miKsag4#S0`n7L!@ux4S--K=e&39y?GwQU@wO!Z%! z1p|S1+v3El8QX?vZ|oaxs}Xs$qsEdrzzDfO`3yTH-Q!1J6UrhOOP5tc4QN)acN$p0 zgiqa#f8n7r;G{iV=JJClkkupU-Sz2}r(D@|Yys`eC0j3giXxZNK=sz1ihz}>agX0~ zc>dk(aWa@>pGq%au~{NzqU`zgiE=8hEz8-wa@{cB8wZt;3R^z}T4(Z9Fsk{6^=1BL zlA7pA_Xoe}xK#}zh*OD!RTd~t&I9)^(!DECWi{+yPUKv8s}A>c;>8M{CL$eT z+ua1eOK<40+*G5;U2@;vJL3rcAhm3a5&tKoOp_4jaeUp5;#(bG=8VbCEimIE)#svjF8A_@7t-0JlfRi zZQ71g-KUv3__L~}e;|1D9WFxhl{KC*4Wt6v|Lu$JsgH%*>;D0SCf@svaxn6be)BFq z*PC@PlAb}QQis*={@7~FHk%0}uaacdS4`0e_*XoJaDiB1+kO%4-XI3WIM&Zdz_oXHOS-+KiReL)?6cVq-n9w?9?{vg|PQ+CzCxd3`gv^~Q1`*1gSdiBsq@^YtLB zUpR1UdW^ro(R@};LQ=5)`R;jP{Rg0DXdv)P(w$EPe<)D3`fXdL64UvHJvIPZ6a*z@ zGDWgh4)GV}?bk0TcK*SIYW?Zv_Fg`KUTQ`{PeSodOAiGq-P&Fk^)_wX%t1p8(}R;3 zRPh(Gz!zT?u9@TjJxMVxL`plI!~eV3E}vmJ0OE3gDTS6hmEzGIaCw*YMf|%-dCJIb z{-vdxn+aUcjHP|7JX0rGjfD``RYCd8`4NVE>Z7v^7XSDMj#HFK51kD0{XxrSQW?z^ z?g>4O8EDO%6CVa__5*Fjl8>ErHauU>tL?X+DDPHRroL*P%}dl7V#S4hSY#PaCsIW= zy2W1K#mc%ND+z=7TAjq9=U_Za;uNJ?tP1g{>pUzn{2wl7T1rqkh83SDa}{8YuerJM)qYl^v731q2ANxL2R4X{v*QB&o1YBZc#HK|Jo_@~0cVKPPV7jdz9 z{phq5kSf<8lszYw`OSj5iMyg)F|(cY6E3SQa?CiYQH*RxJWb@5hbjjRR&&sVJl@Ia3DV-e+z%i z!_z>cJ>1?JJmCocGi)g8drEApbGUJDtb{tl+3NGL|KIE!$)lj-tvmsOt7OS`26zlw~tzWnt;fPmD>Ntb7GYSJj}9q9UJ5afL)& zWAnMF8O-3Ev!6V%GM7XT`Ef$6@$?s13WI>=I2Gq~o$CUh5=9B0eIN}EY!-gu{Zqe! zfB(X}#<=_q1`PgV-!^U$B0$J3LRSDc>-8I z4#T|8c;e}IX=!@S^IQ4#X>!<#Qw~zHR?abPrDCTqZ=De z7dP0gRTGPi-VZZCYrgJHq(6Rwr!sfE>B0aeDd9kA$OqT{?}F&jF!ELTl~YYFT0W4q_&@;;zS^g)3s-Yw4%s&(b0Z%v5XiIDY~D= z++ObV!}bo6RI~W)87g8zSOVK`(MtjYT8KD=3U1;HO}f<}=&>5ulV{Sc(<8Hix_@NXUCi)_F$I`~N@XQ^ zQUe-Wi#o(cZZ4R#K;H?YO67@)mJ_-mypSJ^6Msv~%)l zD+9KsNJ5e#-!SLOaybh7`5WTNCKnAtnoSr~$MXu}vGvZ%Pd zQ6Myn-Q{gGqt<|s)3&#RfQbs!bm&p|1XI5v6_yQ=SOJ_lblzk3?e5oI zgwgIk=2E{8=%#+H%Zy$23oLa>+?|`8mLMA+J4%h~9gP0t%*qAS_bB@Izqjd#;*7k! zw9tPFTQ{(l7a5RNex#$R*?1Seu$X^T!r?pD@;auq?Rk()E?UMiBW-+D3(E^4xaE<)h5k)G z51%XS++J_U&!j^z_!#~TGOl;F8BY>rHEtFpP$BPRx-{})Eof9=-T=L6 zQl<5kD0>uhxm4~ys(!3{SeiXgm(2k`f1IjWraC8+M&4X2W!PI4Y#oiC z8E7Nm=s>{hCQ7z{40iQd4=hhL*v3*+K#w9lZb#DCsVK1-StvBlPzHrQGamxiss^RhVR8sa*&q{I-3EsS@q zlsP5!oqf~5<#P5``N|95&DSyT<3E>XJlw@39H=-1aNq2#;-!2*LuXa{8GqBf<`HO< zI%r4v`qz(k3+$r%*<+R}!UPqQeM3pj(YoAgo-|3n>l915Nj4n!umQd}`}9hkRkb_b zoqi+ZUMur<8<9U;syyVxr%KS)492z!x&1mk1y5y4;Jh=B!8YMfXf6ZX;O*DTX%|UvW-!euC4NM)8IsE(f~F zQef#GbbPr{R#JCVdLJpb0D8Llkg18p;u{a^z(gmwR&XyI=#l>LJ~DCiw#cndzv<_~ z)@w}{16B2FJGi}|U`_9EX-SJTvdLw3Rc>}`&Y-VW!w#&Csrrj`UYmnG)8blB*Z)9V z#E%hv@6yd39tIi(&9Z{>$-7{vmaMN{xPwAzF=Zh3SLW=0KnaW-K_{a1#b*(ej+>Sz zzp~!`v@BQA2{R!Q_jMSTrtcH9y4cB?-pKDgKln`4A@rZjQ!tqi4&sUC$Fh)3i%|)5lb_6H2d;o+8Hk;0wf6$r=RqxQPdK{ zS;Vds&r<6y+SL{BGF~f3>w9qVM?{zqI?IqW|6@iacPH*JkQoFNXSc861;i;-)WUT$ zpy7fTo);a$g#k&&NUhFpg?R`QeS)Q72ql-yR>bQjWW}d+WM@b2u>ro}tZfm+RGZYx zT@O_vzmxkuKAiod?l-hEom4k4S|rw^HjvT@m%F6Po_3B^9Jk+AqEiHH(5dJzW~VxG z(K^T8^FcPGlQ2a4XwqKWb=2CrVpNC88ZfmecYZ98a^kJN$t_NFaZfeEL~;S)sUVda z=*+I-wwQAqsL0;uhj_g7XL%lym+$%SUnp@=)IX6b7H#ag36ZG>2b`CE#Rw7TpPjy` zrldVYd;gIty^Hl@-@A*+|HzMgr9@Iy!LK&`^ z1Ije68y^=^5PyU#F#p~eWc_vJRQ_KsfcSX3`|>w?n))~BFO$+mkypy+SQK9HIoDP` znpsH?N??*%u&3@Ts+{JXbB}ngt2o4kE&-j3|CMHjxby1eUHYcueFh#xkM5_Y~>$oyyx1jBHQC4_dL)DuG13?FIO$|m|E|- zO?aYUL2C1pDyPf~@O`tUJ{WwR-}Jw{^z=9Sim-=9GL636yylheOvBiDEgf?Z=BeAZja$vwLH!h8qBc3ZKHPfBXiqD zOx3{4Y&Cr@na1eM7vks{BzE`~27?hLoW;h2hb|l1{TfEQe|$AFq|E%x-Lm@uo(>h? zg0&fE)Ad^{Mv&jmV8mqyZ-PAhdc+@3r@Wm1g^5bitD~YcE0@jWz^8rRr?C#hBmBJSx(5?nAe3Cy9)i$#$0FKft+WnB4Vrp)3vk4;OC=1QFC!3 zwAziJ-1;v)y12dYV5G`xi)MoOYnBl~IT@Kknv4qJhp`xn3(W;=Vn z54kaoNp2zO7Tw&K?UJbS@W&~G*=TxsuhItZmg=%j-wsH3`&=cy8%HN*l5QW-ZRUC1rJgdX@aMu-!yS7DNB#zb0RFH=wOJ>&o}b za~P-EodofGIj3xE&@TRrgLW_l)62f0-&D&jhi`#h6UD*m$&-n;BH?rF(`#3ME9+!B0a6*jb7iSSTzQ|A>LB!At*1rf_@l9lJfef;%;ylnJ=+bHxrhUvNi% zzJSI2rHzsw3OnI3vqi~|q%WxtoG`UT zV}$GtT($;e$3<(-IT*d12uW7Z#EJu?uAA|5FK~FwKr(S#stRc^nLXipmN^Tx+{h@> z%kwZFPJjjF!vR=w0Z(YuIMJcIuoz>Z0UY>#$91JbLJAr*ux3KXVVq5uwRG1f{IOzm zhug4WcBK~l{TB}^| zsQR{weoxxm5BuyxZ$5C&Dc+<1+du@v4{s`nW7Ju5N1PY=-*SXlsvGCY2lZMg>bFJQ@8(O`JbtFbimaFPW?JjiV~-YZP>qx`k`x7)Ca{}p}szqEeiN+BAe+1o3Qm$(1qPEDY|7C>$L$QSo*TuKR~&+X^niyaQk9uTRS%pmBh=1w2Dk12B-=AMK&ol0D)4 zxk@HQ$S|UdqW`t&EPW0JW;N{aSqE6TGBKADp8w|qY zpM5x;*W76r-$guP#LmiPR&<`u|A9?2*`S5UD}^N849qm;>BN6EN?;|X2EaHFb>cVz zulpjE&k7cU9!~}?39#p|e2a~A6-RqLPOh`}>ySgIQ<6kC;eGrK5{l~)ijCs$fMg6aT6avXklj`C=M}zH(Z*R0Xe6<7uxdKTKk@<@>E*ii^`~gys5Pu< zLmb^VBk)-rMdx&Wvq1^DN)F#wr&lF@e^~6LJ)}Gk;tKAsjbrfMVwa!f+F+dQ+00of zg&+BRfx;m;7EaQ@OXd+;4+_+ z%zb?I`q)MxAVR`vT*Rj49I@E`z(*>E zMDHi~Dp>kfia{{Y9?&w08RQeb&gzg`D`UctA!DTm|0-uDG40pvhBykQaaCL(U@$qgDv zkJ`>NWF}J%hsw)ocdMKFrAy${AG&W$x4QV^8N6kw|aNQrmM_Ibu zLwDvq><1;&5G_A3ad9+75m8YxEMQ_v;mF%f)^CDKuGr$up<>iIS4(M_zY7AGV~j-L zc%14dF#ei02brUrr=@+qub-2(>&M5Jm97!oX9Ebwz4(c_e}7^;0QQHLzvYU&M9ASx z>z@v;++HcT1-=9gh*UU-b+1H7ZWJxe&R1_5Dv<~YBphpbbEVdPxEL81Y1eYJA4kSE zyG!5xI8po&LaHp zAjOUBrQrZNKjhWrL#)6Q1WE<0FTmyTYGZ@CBfhUsURo~oQA9*!acKz$dH&FSl8pMe z0IjMHJ>`@Nfl7`pq2{)wF0D5EmsiNg*Y19t5Am6i@Gxk9-3sLLW0UdnI*rFW_hV%r z7GJOP3^+a|TgD%imsT5CPU@E-JuTZWS5&f_Qbj56ws6|m#D)1k4Xo10ex=V|uz|qq zp^g8$@tm9sWam$Cb;wz8ydV`6z8f!|?fv&QwTiLXLkT_RQ<3eU*1wQUF{@eLd|TnXA6yoD;A?*TSZ}cfIoMK3xd;d)(oC zzL-I+j`D-f`SvLJrA!R&rjgJO^(DP=f-7ef0Vkvyal}JCBdXlQ~^$rmNxKmn)WQ z;cvke@j_W@!2y9d25c+yt}n=M)qLFnmCJA=IRw%;QZCIl@r|BU%_j!hMM$v_&yzcR zGw6iqA7o9vw$p}WRfk^nO+5QAqun)~hAC05AjT7E9Gg_y$FEo_lV0zMKc!rxaCLY5 zYu5E|MS&sS*Em>o?>K5F4vNW_=tkH>2U1~hIXLiDZVpRw9eUc;A2PE;u46(s+vsLf z)zkDSQ%2qEr+jG0W-pzV8w50&a zoQL(Jk`YpA5s*wg(~TFOMPw_${N5#1^N$^o`8O~~@rW9zV6US^cm^s{^2DFx`YiW6 z+fj!~_@rYrhEI{<$M+26So{t_p^GjJi0BxV`215VpMPp$#0Od5GxpEw7xMxDnSlRov6jgwahd7e}knRhoz^{B5GLNzlF8!o6P&1kU~< zG(^q&H-+y%>~_{F1e=JI%A_?PG3zhV$=0o}=_9@PaJ?L4Q7)xVO{|3SR=RbRxUf-4 zLIWxg+>mgPH7IOtbsF_@r7S;Itx~72k{7aAl~Nuk__JJm=9AOw>t$dnQTu6T7ToK$ zk;(xFusB+jIYEFxP&8)@0LW8R#>{9kDq^*pGUTl+{&t=Eu0rJM&~@QPKh(%LAh#>- ziI>;?vZLJ_`OkrINz}jwcfVz4(b=Pwi^eQTofSk&JGwtq7 zI$U8KQ2sA0km#4DKF0M#%r9QvJwR&!_Z+e2rLeuIJvq;!yLZ&a(jMBVW)>xpC0j3K zkmDX6k!N@e)8yl1s!#Rj7jGI^A=8CbnNzgKY`ZZIjQ_CCMtjmdWCZwMn0aU19pX|Tlcj>pfEnq}cj4W>05 zz_3Rzh$rRDz=n!VeLXwk8f&7FA*9(rv>Bdj4y@UxGN4&PwmLku!$VS~2@z@o(o+9| z6sWjPj%NMvkoAjrw@fi_ghj;HR}7>xtO4OZWQF3>$QM^*ZT^oBiRGLCuBdod!GrsA z>X{7bdnbnxF2WW0V4c7hXY+00vq0<~whM%KT#XeP45Pg{EgGh09@E)2OG@3r@>fQuB&MJ`dcvd9YGplJs?SZf$J zdht!8NqJ(-?(|`caUXAK>p`1)s~D^-++Gw^Po;D#Gp9lPp{;Xee-~4!ur30N_6QWf z_19J}Jz}#fXxj8KH01lKKB|T+f`ZX@kB(v%();tJ&cloY2mu&gS|l#=Evt+_8;%p1 zYax4~uOAE0te;#y{tK2qySFO_ynUUO1o&C!&UkOuH4%aNVwjk!XAM+&j8Ur&?oa3ilFV<_bl{UKE zw)W$$`ld1|5|I#=J3bUt|tMW8XHyLKl$;Lh38gc7KHbz=##3zxoaA9FJg}(N#Z&7jb@GUU|9Ze~`E%CSHQ# zfA~h3YyxWQi^Gd&`-7X1?Og3YXH#cWLqkJ%3z^|6g{f(e_ZKtIymz=~n`A&@Va}PU zdB|PgG=lj3t9UJij3a(iaM4smT%4d)SBvG&%y8rKG5~P<)#8S*=p%tEbK=rze3`ls0SG)_PJQ$wg_9 zn0gVM*9-}?GB^RBYJy*&{~PZc1OgkliB}ONuH0WHdVsMcRFWgG>b{ef-z2e_lX#09 zj_xd->_=rhVmb>kCgtGvLBIZXB}Ng%pB@sFLo~h9C#_s6c^GpNP4WWqFOLoB2z%md z`&-N>mG`@K{o?5s?|&qhMz&6E{(HYpz3%2ZZmn-+|1_J~n!qQ)VZf??yGhtZzISfzXL~%TD z0e^+!!@|3Z20-Czmw>uuH&#TI&InlGfFpCMy1@F!`W+vHTRJ-NVzGruB3)v)cZ~D< zCip!;=!d2q9joO|j#EiWV*ImnGh<|O2nUB0JvTR?ayTA=hBJm?!{FBqNNfKb3CNNY zDU?|#yR0B`Qm_cgTl7k-b_z>Gn_(fu2Hln*6;ari1bk#bRu^ML==eSR9jWU!c03eU z(a37FbEAmi-7Gxb2L*Gpu3g-S-baB4edEfx^Wr!~S%$$oI+hmPMz)fY8G7YtQvl7; zXDQ!yos0or8DJOpbqzVuk*oHA6k?+JSvAFO!{EU52jDBpb5{{^NsKN)u@Z5ED(FH( zL?qK>8J)PsOVzI&2~ws3Hzsc~y1oSa7XivN*ev%&%PtV4Yhn+-_>(@v%rAh8ay!0; zlz4&Y7govG&&P3Gzoi}!SIM?a>cu<2BDoPGFzAl_+5Ei){jl~}lTo7S=}pBjUA)CH z9F9?@`vbM!|Hvmb5(gDALhFcMTq z(O`PPen9t${~OK&uppQ%;sKYJsdqF)n$5^f4_{DpC7Z=&LqKt)f9UssHV$886hgQS zF?Q@uu04L%0ia7W%*5EdeSElUcxTe)dpC$r&%KHf;8cf|3-|F_Q^8UM9ItrTdh)`p zDNdG#%7Piu@stcu_59AICyh6o6m0T}e8h@IC8$N-==Q$L#Ish7&?5JH^-r}Or!4;G zlXgaF|4zj})d{wWD}xLfg+1)FI55cV(Ucc5q?4P!N-l#>sHGJZvr{|9A0I(1e{g8~ zkB}aG0;e7(T+sWjB;^vZh8kInP-V16ekFZFy$^SZgT^!>yh6UXYj{X%l(ll1J@C1< z07t|7CtXw3l2apnWO(nMn>ljrlG7YIH%Ouvj)tVe6Jzeg)8Q~mU;xT@;ECL@LGCr-`e`|7}rb&c=^@_XL4 zU!Ozz)Om)SAcI`o%JB`~;EU_0tWbUbzbRA@MtFgo&xbVCel8W7tl_Vb`PT^UDkRPK z@<-K~+y%}eaA-KveJ{R;F_UW}xde0n82ek}Y2Z#&tg^DW3Wi#Iyv2obq@9U2@Lgcv zhny+2V8N?Rv)82?*!v;B5x^8J%W=&1Kp&l!E_PnJANR(dxMl{dpPH9CCsDhyOfoK@ zHA@G;q%lGP(=7Mu%A*<;2gMAJs~@z^X!`z~P#;=|rdxUleCW^}U{#{VYgph-K*$GM z0a5%xEA{b01(s(5DGCT!kQc5e1L+;snNno%>|!Q^?|_j`#-Teq)Nf?k8Vv*}(V7V# z#NhNA(i{6IUkoI$u=I?u%?{08c@M`OPfbtH#t}&Cn1OFMCQmLJgCERmHU=JF*XSQ# zc6SJ&a7!R_@7aF(Zj!F{ygUD+>%4{h;;IY>X^e zRZ5G-I8S0$Xg?=Zqib2sH0UDjCRhE2r%^n}8K@B>%c&3YHjY@&?8W&oB2`QnJ`w29 z&y9#p@s$5A9f8&?9I2J!=7Fccc<)G23yr$I_UCbY>qa~og|WTpigD1$g1g{0D2LvS zxdR^sVCtH4uG#D9RvB`9c>eP{pzs=yY$5uT7LGR+3{Z%SEBYM)LUijbl}u7_ zXlu=tb$X%GwGsn@cnB!c&aw8^3maa9mDaA6|w% z0LM|+%X<~z4%xHA1%C1ewx6;VsSH=Ig1={mx6jin&Uy%0HiK5r=A~P4^Y#2REVYLX zv^}n5W3h)Hb0@+%xxhWEENy$c%+&MHK4NKi13vo2X0c&HN!O`^pJmc;ie2OXK-)Q(D@Q# zv9!fOaq+ve8&9t`R~YtV&c1%Yfv@@S=*XFWO=f`CGI>o=FA`^43W{oci|pmF;|>*% zJg+~u$Lryfv`jU3khB=x^3v3uacWpN^pLRxqzZ57>i>dqIc*pVUcD5F$3L%GI=%|) zB1nv&idb-!86C@aRje;Tu> z-E{%sdwA#qj$*(+=6%(YqCsX^YcNM)5%4W$82YkZ_7#lp@&Bb`hl8OIH1msCGFTb8Y0=O zgm0DZ8$;#|+%xA~E2+Y7uq&2Et6s00bJfWE-pPnaP=_-VXphzAdDX@^u#(m zHiZ^pAvszoon9S>I#WFHkT6qxLD&)S93R`pHCjr%M5y{k&yrvjNn}PRC61_nd3O_y z3W`sKo9O0LTBb}ePbrn%#&bqr_zpM_ROCT<)EbQ|W&|jCa+le>)+aYMBwy0o;i}Ca zV|#ei3`MBLQp^B?Zoq}-OV0pICsMZkC76z^5NYptJE-Fz@rjg-Hz4=L1*WL-0071FJ*pr{bwO&Dof_B2M;A}MzBQA0N+P9Ol5v?w z=)YV5P@IsT=rVJ5UKiWTU`f3AP4g2Rs??hBTLJHx*Kee6Ng;P12ojd2e$1-ir+AFKo~~t6)auOywr$(CZQDkdZQHhOtIO!J zt8cA+&e^N)e3@@^jGUPf8TjMNf_u=D&-^43ta;zw-EaRVG|K-B2j@2F?2+?A+r`cP zJ3OR*I=&rbm<=;mCl!uIownI86~cscZnV&VREZvXIF3jA$3~zt_nBM7bIUHeM3}{I z?3G5?T0FA9hxzajxDbw{)2BiV47se&D=t40S+Ng06COs5A<{o^G!Wll%VEPcH9aFF z&dbF}>(O5#H^?S4YG~1CTHsRIGHj9`i_|5TO)HEqETxH(UL%!O7kqn5(f7VZ__wzL zV?n)U-GqWo-}7kSMWW4V)9x45g|_wnb~6y0C7aSVxvZFl54#WIhGk0{^tnqQ!fT<% zzVGInJUz$3#DkCtKzM3`u6N`5^*2<=HlP2Ur&;^9%mr5Yu5EPX;~V)JAgq?g#-1B4 zzw|vfIi3G~>@%lJ1h{f%wm?R%O9250L7Q}jOvw(kf!o&(jD`I2nD7VXJ6dVKxkRqY z_D@24w|){QL~WF6%Z{*C^+&DbegVGm0b(ROZ_JmT6 z6*5(J@;HClEgSW)o<4RNfm5D7EoN$$T(?sCQeh)6xe00(M|qd?M8TSPxX(EO zHOE+1Pd(#p+)t3ds-7*$9-M+L^l#A{NCniRtAMe#H5ROOg=qRp^pQ}gKq36toZTov za$_d@KXbAzw1QFt=Cm@*~d zJ9hq#tA8}=*0f{I-1Zd%5KrmP79I|tt zo}qZVYyp;!1%!_yJFI{BcE8d0npP)^5nXalFA7|(jWIk2P6l-%wHN|5uNf2{l={J# z&nU!3koGAENl7b4;Ld{QWs3gL43#$6@j zTHgMibJHv|-;uH)D)F^?y{y0o23w|nZKAiZ*n>hx5>RrnT3X2 zxF!wv4AeJOBmNA_gY$drRzkjcNExrpD5|t^k^bfNVYbxOmJ~RHe8KQXM(d!ZNVL^4 zFXLLc)@nn$ua8V03rz(+J`@8F|1F1}25O($SiaiC(09o!d6VAr_c4b? zcI!+qc(skBXmxqgFEYKgURJ*oZpuxnApCj zK~!Y%*2vUb6f>-?tsIlYEAy>g-8YZS3K&M~WwHWG;-A>{x14l)#6FC~|vveP}4pL17*VnLE?K{TG?lmYeWt=KL#y71i+GYG5}* z1oO%@H|KOi1W0fF0VTW}zsWnJ=>YJhEO0ZLg?+Dopo&61vqEW<@19}wBd27(n6K98 z&W5dQ847O=cuTga%g;uk8RGr29m?8?Q?k-fxxL{5^kKa^0&6Bta6gsVO%=BEFr9=p z3^o2ulsZtJjHWOPzY2@neieXh4b@bowKjG*9B{6~e&7-_O#YB)OC`1s=zn<50t-p1 z@bp<04v7HpAeCxyUJn>viL)+aLffJVW&A4h=0gTE5@Ob(p-0m;7MgPh&_0$*)Y~6Q znp$HqcUEkSDWJs#*Lre)d?U5s2Diu{ZQNUJ;u&E&Lmk8vAfLMmNYqZF5~+2yHN#6m zQSXoz)9}smF0)KqO+4+&ASM3M#-A5;B6Tz66O!FtcQMK$z3z5&+yDuKc82^dNl&a=_Gn#<>D?FCuHxnKjT7?Xc+Kx!+Y z*^&U34&DkG1Xv1ohJ&dog-Qpi;7NvQV*FcXOC1mb<{5PnscgNNjz!GTL|$1kVM?tcihSv_BW~22M0QcidM^1$zb@XXLUOgvg{ej1M zX<^H9{-BzM9{|>9sX)mTxy;a7FU>8n0SK{~Qv?s^^MPY;j~NZTh#MQnS?CROL-*vcl!P1}{kr+Zq?&Wr&e8-XH&^pdiq~592K-Ok)>auk1#cBC z6BOS#m*d?q!fzt_=1hZ$^AhOIIE!6`{BkIOHNypaDOieU#Y;sqo&d)P!N#)gp&u<3 zg0ZlH)%hp7pMX2W6v1n)(<9e=$&cKb1_tbm^i|4<1|7`QOEjj@MaS|v>!2nYlFr!E zG8thYI_J(N{fIU?>X#=}Z4)PbuWln>yiA(3!M1m)Cq|j6_{Mxxb!@?cmX=XBZKhg!(;C3> z;2GQ-4y6@uFe9@<^)J)f+Oj0I(0?gdHx;cKbh}@sZIsgsX-x~xi+g1oQIMAd8p0K| zN%0N_yP33CCH@5dLGeC^ESp_c!F_U+?7sfdl;+>VOLN$YX$;gW9SI|c1Nqb3U$6~~ zIG9LA+UaJw*>_X`6eio)>h@RCaHE~-UD}8?xJH55ICb<77>S5{bYcM!1udDjf^hJT zc~f5WXft~<;Hq8u5pM#vu7Vg^44=6>SC~2MMZETCQ0{VDG3|krQL!J_HE3YFSnG*+ zC)EX@cFq1k6Y&;qEDZR(CHqv25F^iY;ZcU7U@gd7N7(e{8Y0mAX@M09FfcZu^BO!J zSiwf~Ljna|k4G|^7=PuZt<+s5Lysmw5c;hBw1@2?q+Vmma(7Cfm-JI)uRw18vtRTv z#3kkrK&7Bb)r|+<0B**hEqt1<)BV_1^A844e8CcQ`d}~%r9>QP8x0z&tLyFJi>U?} zd1mRa47#cB;p!wDLX=(hgP2%gM+G9`0d;9UNDl>++pSq78a(jst4Izp8g1XuE zFB^DmvyYS#Z4zcO4ziK!2K>nlnK&Yh&YrV|Q?vr518(*~5Mh>kiw!(UiI;^QKWG#; zF-FCScKjF9f8Xp?gJ53*vvSBbM!gZi)1=ytbHB`&wV~$zJ&?f~4_CpVJyNINb26dH z3_V;|T=JVJ+6?Q_Q<_r%zJc829!0|rtAq&@lGh1X*hpNxaTqB7!P0ne>FVwv@o~~c zUwLLcw%r$De;}D$W7lzWKGD-CbX15j2pWv)28Y%HG~T>B!l<{u1>w~OXz<9+`8p>m z45wy|y`$6YEfN@&zNW0iwa2p@LpqBKX&yA4D(*hx-3LH&3jAKcC?j2prDq)@_x8$Y z+OP&erNwyWV(|wr;q!faHjMCvD{I=k)J@RfcvnU=5~dTzVuy*N$H$A3(K2VNj#1guk}gsKj3)fdjNJT5hHS8)ksc55&dUbU22)XK@<$8^Ob%m=kmI=O zQMyNP9PEbV`0V8dmOnT19(XDVBR{W_E&-cG=3De!ruI#j%O%cb2Afe2bs7y8kc2P9 zlyb_Y+-K-**AFP&Lj1fvR^v37FXF8FX)qAiG641dtyDFhhFQh6FA4NH+{6*UHU!^` zw0$yfD&~^ld*DVy`@$=VJAsCa4N%xKFfYg0yBlK71vN?r-JhfF+WY88b4Jn}RK}?cvYWlK)`qiWUjWcO z>YutRZtJAiQV)`X{?$G)3L)B7@mcT1r%#J{2U;!1=_IzkDBUJ~y$%5wY&n4F zy@W`9B65dHy!aFCn#x6~^@WzcZUmY+cx+*fvBzbY)qjjE?LaD+9)#LoCXaFFYfQWS zuWt1pxn&~95EKI38;~!i^Rc_dN<-(Ql>R&X7 zL3jzjYCdEoYx2vlQrlQsX@Ul@qkYC7*w&3i`G@Smv(t^qV0ewlLFYaaq8;{g4f##c zruP7VU-$>D2!Cev#!3)-U$m_YDDoQtF@MZFXL}SN)aU{nZq0f2!ZoUa_cG#DtF)2PejpqcQ5AjW!Rc+s!QfmA)N2U52M)x$jyEcotUvz9isha%RhEIoM8{Qu>S70I@1<~9FOGF4SqY?p}fHtr+)?SIoAmNBA#b{zzARYV5o7d--6Bkys*G{Zlz9GH%TB57# zAHY()x_X3)o5|7C5L~TMqiN%;VPNv7dL(yM(d9G_5k}21SI2|g*(Fz83nq^%gZr*hhRoc&$u%dz#P7+G092A-e~N+X*ZeGQB0}_2H>a z(iyozJ#gsRs;9)g-K8t_%LK%Zp57hzXWaR?leT83! z*N5EdM`D2PVCw}=L^4ntenVUk;X=EnrgCRQhh3f*6K%SyoPN|fZ^))L9|?^PCNZXx z_$NZoD>j>{B#+56mQG^=$IhdO3VhMtfMe`1@}Zt{x~@yEqUL1z^jaC#5KxOg z%;TVEg|VjGuz2K*M^J^4=D-%GofkfaQ7K*Y@(vhF0A1lniEtDREV+a!W)gQjeu!xYIB>wZvcl`h_~BoQPBDMS)eUAE#rNUB})7lywd)g;yfbd&7tXtGfRT6 zO?s~bKV9JdA5;o!?uuT;*XLhZh6tqb2~_~C9q6N`-nbN8Y_bm;(*@=MhVEr3xJRUetj2X{WbM@brP z7#0&BDetPZ9wd(OgeU1>#6jzONMMgh?Y#Aq7dDmAA0k9DlbVFC+2DrE=o5MrarAZX zjI=o8A14^m+bVO>Kx5VxUYX~zv?f(nuOc|5o*$w~=ctKp12DMu#ucPlRu;JZLLxPRwxpR^8#LJ#VmnP{g~DQ!f{CX+tB7^EFHq zUTW#BxLzl+Obz8g`G)!*zDXY9uPYdkC;bm=cMrVVc4>BzdR`xQZT2V|`axLdAazvy z?8lyetpESWXX45yL$XNGetjj37tE?0^jHOPTQH!Ut&L{b9ksyl3bMVd%EQ=}{2>{X zNy_5#$aFAoi!b_XjWt5WJ``0zhw=D-4%}@f?4&P@e?fPD6`{aZs{lFyLR*7u03yqF zwjwPsv^_A=j3v+V>Sg)a4^V6se2EAeqXJ=Ch%TbJz@nj*75IT5>m}_8&Ch}#!H9B= zUm0*-8t+W!T5tAa036m)DUrSaN6h5Ju#RQlgHbb`g-ob^!`O49$Di!n9FH zVR}3?ipvLbgy>_oTBukJmaxF>F5;zVxtBG^!qs|!x!oK6 z5*WOp(aVGBa$-r*2Fj&D0*EbTp^R_`$bz*7otS|m@)pnwe?MwS-I=ZPz<&OLduPYot{o^kl$4HR|zdo&eh|JBd z!2^7(*H4x7t9Nrqz+mjrHPM3uNP?^>n8WxeQ>p2aMpx;)=!$YpIV?aM$9jhP^+Zc6 zI3--97Q&#^Hq55-4o6VcYfeBkQ7m?R)ITB6L)We-;g~BME>8id2C-j1VG@DydcN_W zFV%_7C&BeB@G{11gWHTo3R~AjvxJ*5c|x)H=P=kxOesRae!o}jyo187a-UivZAa#& zk5v&Olv z6SL{eN?y>Jki|CtfAu3BlaLM?2l@Ok2Zi%{F`srW@Hv(qxZJo4s>(Ty!B|8Cg85$> zQKPb(g5AT+fQe~qu%5zB8eGq(8jIbD8Z<>J6GIb%E4TZIv0|&_nK`fyoXv9gk7$He z$B6IbxfozHT@N%FfxzR;Z&97wa8S>HJMm3g=>lrLaC-MBUKX1C)0eE~t2>kXyiI;l zuC6M7K#`z>`zg{UvmZ%7N*cYXM(Pa@&eg{V!K-@nNL{$PVxKU;r$HmFg48b=nNF5J zs4g-YoQwO*&KRfsXLA-!$;c{o{+#|5uAn|ZP!`uItNsTy@;>LAV}iuO24Y?^9HL>) zyjNvDMil>Ac4W{vKOzewG=?s$>MvlrWzR3{DYRzHETgoxK-ewC=spY`(-1Kbv0SW{ zRt784?wy500U!zkZH;+IzzZduWt6iOnT~NE$o>G72fovHoK&=*HbMemH3r#>u5H3r z%AJQY9i!}2Hxirb)JY{(e7k-QQ-jNVEbFTMr!lEg%Q_Vg!rCOkVZ>U^?>=@~@9qg( zI3m4s?S{wb@a~k=D|UDXW7YdaA&Nt@UEL#GCE6%ifNo+|c2n6Yd<3+cn&v+U`~L;N zMOo5bEw6I)H~>i-{V+4$+mb(W^44DyV|w|EF4EyPVg?4zwRm~)_IhmI)s)HFmADV88vK0A))q#dHhq#*6f66@o)WaLDjX!oQ)^KrR-QfRG*0OqGTD9R}`>+<5&S?bz?Vu-L;R7?Z~i^7Yt}Ylxmf zC-*qeR8x{I`MYGkTd;1F8P=dj_zfIEZ*6}ynrWF{%Oi7Y7?BA_`!8#xF7uVTbn<8O zzpm+lue@K|K;ub@72!$Ad6hp39^&hmpnjhO8y`nH&<%`EYJ!(kqg8S|aTa;u=WmUB z1U^zy3h(T`6o0_ihHcRT!JJLqf*kya@c|3-pn+Ld^>I~dex}jwoKDC}*YwfqMHtaY zAXs*5o%&Rabxm^#RLjWKKt^6`w#HE)cJO`-H`DSu<2tT6X1Q?-+n#0GY$38H&FYnl zZw-=0?W%AfZ9HAD!;$LTk7I8GM4b@lL1}oV&Gjwey~BS{Bt~Zwd$k^B(O7zXo@f%$17mcF+W4`c{h)Hmb;8&)tqE*_}rcig+#>`$*ETKDki&3l(; z`u5#yK?R5V673uV>lggn`u7~dKdd$z*34zg z;n2Jf3;;CS@sck03J8W9A?Ddg`s}bR4@kX^8wRZw|u5IZ?@E-~W3#|J;dQlee?V^r2Jx zDIo+H4f97T>2Isx!5qd9Fv3!dntJ^H5F5M_5UD0M+fJs{%4X4V!G2Y@WXRI>m&R?| z?*lS8ILIvXEf@Z0tfG1M=H~i(4Ki5LiLt(3HG8w&4xs60g8&rTikv0fjkAYLOtnQ0 z*;@QFG9Ne9UEtm$>h6D;pzT{ z7RYSVL-@OP4C;5l=U~a$HiKN@UDm|j%KBOX^j3NR+G9MNUqSFwJyAdc$&87NU;>=d zT||JSPRP$wq0~wih`K7NxcK)NSyx)?p>=jNqdHjv)c{jQyaEtCX}HzfaF&2kd}1aJ zG~61juWD^ewVhUPETa@x&1?SRV5klD9?mrb0R8ZXJ_%SgkMFs58wU3b`Vic^YMVvI zO6H?&D;GBGw;)DpQ*r%l4;X#SUWB*?za%nwbKMIzTyu;5no7_Ct^H?q@za; z4{2*lmr_Q@;lSs5(y@*^d>F}knM>=UCw2D=0w&YXd?fMX(Mc@h>q(*b06qPZM-tzT zex`osQqyV8OS;Z*>L84$VW0nr>i>sE%L*c>5b|tEPo1bDaABFo?mmEzc#Kx_v`8A> zra*!Pi}I#nOoRDqXf0ZmPtaoyX7J}M8^;_hCM0|U8a-q8htfr)A42*DS14VHF!V)V z+OT^oLWOEG0?-6))8$1#*>)8m^nsM~G#~FT4i;=?0ef^qe;x2Zd$81cVUx0%8c`PqF7I1Y69 zG-XYXYI6fn8!T<$QLqMG&MIhu(IsAv@q_i@#RZlc4LzflDA(eY{{gzGwu>F-{@`hK zOAHl>B-&1>@t3JsnpOannxf+TjAFg?U+094r09&r0-%~&`G6K00RGWZJ12_XG(BjN zhjd+@cvcBN!mt@EwC4DMW7;+v!Q3y&jNb`{Lx!MQ{!<2FEWAAtmVPF*N?-~2d zXPH27s1($i+?o7Eav2(HLYv7O`Wq6D1r65sE5qQbJ2A}kshT@Ao)E-pf!Ye|85rc0 zNs|rM1$V817>Mybt2g%r*2VXGR9AS*w)NX+zGoHy;1LSGr8nExuwg(afHI3q`L(C- zo&0cHkT3f9KlOI>+1cir9s}IE^EM)fbYFeE*mCQBfUJsdQ7im89e5`kDFq;5_8TWJ zC%cCa@sj?!f;N$_)0xAN7(=5Rn7Fo0!I#^X(f5V4g7*G*-YBNL{V9^9a`^bT<oy7&&P*J_o>bTIslGDvMNORFZH-EQ17s6eCI@heH0oph1|DDTBs~ zF3xW1z<4CGpA^H30oqK$t49-{$a~^@TL3t*VFBtiYRg}vPUC`wv*4ZCvB3choN0qZ zTP}xAz(6z`RqB=*)-?Cs1;k*32z*GBvwe6BjIyx>PH*I0`6xb!+xGPf5usQuxC&WS z+}@)`I8)w+QmJ|(9#BI_95L}N)QtcvqvP#GC_VnF?fPjb54ec})f14AJ7PbKS2)!C zl7>q*fhSEF@p-cKY#YdhJkh!>y}*|y{Cs>QJK|v*(f}2-k0(S~1x90I5Lut4ydnuS z@m=ehMOUm`DmZQ^skG7KA$=JX!b|xb=d%Hflvzd^S!X$V#5+TaD4sLI&6 zzgOKOv+*6yX^n<}alfL$9H*`6@tq9RzGqkLVHmht!f6}3OUl|VAPwjZ zO^utJYIs{mzr#H+NFXoyn+Vg*HM^koBem?*qFK`cK;FtmS238nB*PW<)Zpsrp}QYa zGk!U{ktxS&=Y3oAB(CKOd9m7LZ(|tYjx?gGmapXgtOnu)wlHC7gVrYm?K=54SZ!Tt z{{jstXTn{KiSec8si zUgKN4Y2OfVdcSFK@6^fIVZ7np0FW02G@~Lx*TGa*>`X*V9W-aoaVv@1ol{fOwRq!-}q*DXBoGw;8=4MRz-ukt> zxtjR3Vi-@)(qrfMuqJ&9c0s1=(o5Tx%>n%hg_ahGmt-?)^Bw$;U z(%#-oTTwD0<3M!i60h>HM$P;^DboPw{j3fA6ID(&&sM~Y)hG9wi03Spx;xE45@ zT@)86=hBi)6W`BlL-`vJV8>4)V4sa)hI$Mq}eE@hr;s2+{k<@ zEy4+uDh!DsUOY^5rJ(PHheF^F(nBA@eS+cNM-R#Ab>+SqH%Ex4f-R5#VVY0a2Qd^r z;-W8nFoi4`M-`ngg^NH{RfHhIS$W4vndSSncI0z>FYchYiG+5+E3qQ7V@Doq4>GfS z!J3TwqY}wOi8m^1nd*}OZNG6$uCO@STxs3NO6bylGKaV=g~Z%W&WrbP4k;b?JH%zyVeJk=k` z3ej^+I}^WEB%7^hi9~#?FQLBgY-txUWdvgmkNH);#POQPxL^^oWJmc$bd^z(sHKxwy@NtF^5uzVM zy?%4oWr9ZpEx6|&y|Mcm%*^nor!k;VgDc06qp%l7e;R9x?L>+N|QadZ$kl}`|kKn(=(V<^>|WM zUxy@{od<&TGS3a)+iLJ*j2?RMB?@~Exe#D>k6l* zeT;1J8BNcG2qFG(3U$7~n-pUVgPI_iJj6&!Q6Wr8-Lr$MvdKIn)%Z8-hs&fB{i!Fo>`wA}?eX$*Dh{K+apELNR3ybrxR%d?24067CQXCw zqSqlBWWs~$Nw(^HfJ0?2$k57>mNpAT2UaXCB;B~sZ9x4L@RKo5_UD;*4Dh5=M_s)=vnxDLhx@=iB;$F1R zzLZvd6G3eL>x$pXGc|I$wHUj$;G)4E%Ul2}bO8?3~AzHiY&8>uLmMN%9u zc>yO0A$B!7_+yjl0D?WPv9PMk<_(?($@t$D&s)Z-%In4M!QyKa#xyX}lEs~XeDYSl zGU8tVTMKK;S6{*Hoh!;b^{S)YHg~PyP!ofzgANCorx0aV5&jZN?{bk3!a8=UQ9v+7^hL!h@>aPs3l0d!j3#Jk4CalwxRw8ImvOqhO`-m}=NP1(im;2@E)*tSj z%Ud(pMcElo80=mFDbXg7MW&k#PDK$Hl0!s*IWac1dJz&^r>im(Mq_P~Exq38-2CG< zujh{o;SBGejbc0vMx_#Z({Zu7A)}4p56tlf0kUT|%+<4*x-U2q+W@k$=Ms4P>agn; zO`}~@O6LQ__-Yq5=6=~KiUTu5R2kZ?XDYV(u{hZ7U*FWmCR>YIyzTj_tbw zA^Vgbe_XOWY~l7RM~QUajx(Qbor*IhsJ&VjrT5L79mEbyBa5_h3DWX?B5h=E0kPWj zak;DjD&JL5S2FHBNw@kWX2HJ$cf{2aX5i>6+875hRIP*_Cr-3Omm|zT+%aTz*l`Z8_4`IfdCC z7LcSWxTysqIUdW_92)T8F16NXC1=?iN`viUHmib+;cB&<*t663P>m?uf#=yeHx0$; zQ>Pt*@wVF`%EL)q%8-BEIf2coOOD=VhxOT(anl7BT+Rf{Y<^J^j%Vk1?)_tDm*6J> z2y49{NRAJXzcs^WFp)k^L(b+G_z0&B6En@PHVC?msG$)eL&+OIIgLjpy!!Wff`%yI zXNj>!OZV@woeBn}I7^AwiN_L7!)r-pylgj-pWfr> za{wQyMrsv6(vd>3@G62z2sEPXa$f82YX2w;!ekQIJGSSS5|@Kj2enLlgAHc!-PO(o zMMTSkae2g1g#dIx6CeS7B^@7UI^3>hBV>iLrgwB<*8xH`$J-#O9@ReCO>UhO;r^L& ziP^hD!C!#?TsHp`I}zpd*5eVnlvGgM8eX}nv*VkDGg#z>Jy3axpnNQ<4dV+#KKjV= zsD@^t)YnzP6{ILeM7JfQPCrZt*9XvAKn7AQD-;;(NY6*TL~(1dI?kR_VdX}-GYnTX ze*-~b?+bvbx%kR5+-SM($7=C4IBZ$=`|IZvQ&E_!p`R( z6+9Z~j7gMdV_4*o7!y6>mjdIJ=)1o=c%+ZvsKp^;RFH5e@e*aXY5TcFe6rfWz3v%0 zim5j4$7;T`q~vbPHNu_fLTv~Fy9$0>+ z#@CooCmf9PIM>=u_|sn`KOS-_WF%7%b1P(JI?DXs-6KGjWgq+X0z+6gCMsRvV(g$et0X=;vz$GLzyguS|Oqz{)TzMIO@97 zbLH}xQX;L^*kR&%^3A(sq}mD!N|8)izO-(*rvdE(wGY?f4W1i-aKP0>Afla^2#_5SlLLJdy5cwM9mEFzTv9 ztAq&S5PH{xU^j^xqn}zT|29z;zaJn0HNWu~{Hf)@LhH0CrzOJX(To=7I63HXS-Ov< zy-Jltjmnj8py5~&Hu5DQ_3J{WxZy@|?|zK=BE&&{+AnIj7yf#xMR2UvDsf>AOcXy+XL62D9(=+bX>$(x9I^kAyK)|Li(pgzushb~8(v<_vUtrMO45 zDw^G6=Un<#FkF2XC20j>qhtd+hplkV-36cYSYj>YRZI;L7{{hDP{LT2AR)5oq^PV$vP=5 z?j6I8QH;`C3GR{ij-h!tmHTmGs%g3X#Pr9}3#lbi6E~&ZKJUqk-@F^?qD=v*li1E{ zEUF5U)xCh{n@Mbyw<;8FWUX20Gp&Gs6Dd|BOOK!EwYp=Y13D}7kQ27cRJkJm`8YG7 zfZT)70Gl>L#5`sxDN%jI3|8&ov*rz4$XqeQ4+@cT@=Ci{k)uFqnz)jD#vk3#O z{{+eZlm1z~DA%e1iU@xbn8wUEmwUNEB_?tA1VdUT<~28L`n(iJ2hbInR^onV`fC=s zhV4I8GRy0i{%D?Lryu0bBA~HYqh;o*Xd;T}oKlS2+BCm+U5{3b>L5ZDm5gdcnwNt^ zGT~`qLut0rV96(qq>713W!D3x-7;wzHfaZ5Cq||3j!~Mk50e&%Mi@@i;P0@Bxr}rF zJRe_QjF4U$?@3_tS3|+e26QvgBhv|XYlqiN5R1#$G_q3HCHL&T0i2^UfMh4R`Ax9@ zrJbw+3S#`K5<}xa_|O!c$6w|TeA)vy$wc$Y;d+w!?WCZQ{wd^)=m{cxb?MS&ovJEh zh@%kosbg%{{Ls^rYY2JM@q~#<*}!`W*`9PhpMzZ%*|boZ6-iXGF`TMj!!6xyZU;;h zE|)xe(?vt&FB3^+PxNx84ZFndxT4rX8>0I;guUH|qx`Czf;^GS;t6V$PfKkJDEf$2 z>iDclIAc7q6T^K4g`uE7jp0k~L5#ILCgMm{$Hd!|AGRKrq0tE9_0zI?x=)p{X&4u% znqHm44h)sE7viUh?cD}v1C&-#P`YV8p*3ZjV*DzRcZssuN(($lJrD{=)!bQxQke6D zKaGB~Ec>AoEdR=oq+*fhK4CRGMZy;IZxI8^ye7>25OT>>&aZ8WxO)`wdc^>tA04>? z6VL&Jx*t`TpsGIzgRIEE8)OVwMwTQ8voiktgO15TpvXUZ98t&!rZ0yX&HJtFFi%6l zOf4w2X!hje-YX=Pn_I%3nM!7>No32*g)maE-YdJ5%Pwt#H3e>eB92&r8|1(~84(AF zxf88LT%!g*TGVv$w0qtIhIb%hCj_+5(`qTLlp!yp%0A_pqcy1My*feJ@~-#-q#_PB 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� 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%0DOp!1HAtPb-?nE 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

}h47 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 kdpJ^H|hxW%6e|s4|jIfTc6grVemsPLHEFR z8g=KnAVv9O<{_umF(9ogPxRB7$($Kx?Dlud~}Oih-+*`6MwpCfvJ&a(Ip5to@LKj z(CAS_Rkx6VovSASnbM)ve2HO@88QX5uSGQZXm)}>#8Ok$p_N>SMtirrQj^U`YEPNq zV4-`UXFvd-ThsR$i??>~k1PxzOD@mgEV=g}%7dm+?otG(#;Hjp_u42V7nE3ASg^qx zu*H}k5$cKgS5518>KJ~edG9T=USzz)Hy->HLvXOxa^>AQo}?}dhs~{?cZ0s*qHg6< z#X+G=VS?j}JTi*3C}9jDq5p?-{*O9>=}XZO*YB4fy(KIlyKq%)f&Xsu8i`q29}}yS z$ve1N>S-}UFw!1`Vh0@4TiQ;9k_OT%FfcSW?d&J5mv^ZA#2tTYY055G#on2O`mKsG zNb4>kpVv`ZoW$r*fKp95f(Arb&WNepyfv1jA z$Ci7cH{xmyAR>>CR&ctaGfj-WKOO~-LDVd3ELi;-)LD&JaH>3b`UcrL7Ve--f4hhH zRrtq#aXNl{R>m7~k8~xh$g=`{FX6xb>`fr!q0WN%~)Ck;Ui&Yqa!x;rb`ZHlca zJO{Lluv8K@iuUi=Kx=j=*Aj8yU9EMU?p+af1==JVc_tS&aj8#OXUkv6`;z*T1oYg{u6C_q|q^D1;@` zM16qQE8v{UO0>|SKSw3>E$u_;2Rn>n>SR$hJ~cE5u6U8|$mOv>`G4`&iJ8+gUrRgp zO^4;P>`4}c`{@|;34^%{l&3|&n8}T$w@s^yG$SgJs`5U^)4Sp^v6=DC_0q7n^n}%6 z8_?&v4GGb^6n(qF-`}$CMxl03W#;UAF2jjnT!s&-ic3aVQEBkD;0jvPUi)fmkEfT8 zFk50jV3LSv@J$j#Yv6%}Kv!iVz%?;mB2!4^q4;k9KeU#*X zK;Qe3s>a@J#eN<&RndvNwG?>f*7mRCv~#IDS+4z#RLm09YDKMrkx4b^gW@qji_XIFe1O_;BhOReO+OJ_#A;{z71Bhb1Z%G zaj>I20Dl#V8$7fL@!k8PlI9x!ouN>yKUO#NY={A?7RS8rP%FJO^l<O77t_sf5#&si(r85y+L^#X6gO-?P zq0wOx2np^jMZAh*PLTsdI|1Ldl2=x*|IzpU!#OO<&{XIeD>7q9jO2=w2xQk^Q0JJo z=QZD;W^PvMP>?Fo=8Sxq`80+|Qs)?W;FbL1WjGkX91+8KvbFcUxZzO{duHE#e z(ac^qex(q}&Idswk-lC-+?JOev6;W9M>2Dmy?(;0MsD91wMeh(Vh@d^#4@Uw=u$5_ zwu{IlQ%UASf^cgDnuiOtl0#<~H|QW^dk)OVEBwM$-rAN?Pn(VM@X&?nt|RZb^>mo% zztrAX>P1qkMz;`}Twh@kCCXA@U*Bs`7NTgB#mzk$U< zbYysP^2jis^jEW0jo6K=((QRq7_IZ=RD4?MDYE79wS3ld;_&DbhG^PhFp?m z2l*`dUs~;8zKZta%kil;Sm}u$4`J&Zor<|aoX#Bc&v*kP)V&Bo)x>?Br}id{vmlAB zH>YxOUj*=y*J<9}-mTP(>BP_UWt_OOrvzF)n(XSDx)x3RKVw9uKY>|ZR0s=Lr+MVo zF3XaD+5_!>OQgk?Cs-8Pd6%QJ8BGNch@XY1g5y-hdk8lZvZ0hpabd5s!EUCkwDbG| zhX7esoz-vUr`Cy7-ZWcvKspR%} z-yNh_^#{o$-^_P4VckJ5J2ceHCeG2ML`K{l9QgnbuCEYru-hzSZPO{M<_n}L`WiWJ zq61o;H;1Ph;BFK!6yBc3knpt>(kqt8C|_w}#Ye~Cm z`;T&M+bjbTw#DF|wbKjTJQ*-j( zjwB0)Uhf%Uhbqo1Vt5zuLdn!gK@2#a*%V~}=$T!hL6^Ym@>^@uTfgdU3({sio|;%> z$}D%4Rjp52j#~xbM+SP6uV@#sS^(>5TT8gpPuWAcZ%+CMuo^IRYhkk${ulO3-&QEy z3@lr(&Ty3q;hd8k5>#@S51*iH{*VFIMX9Mv_3WHkeAXcRrB8?5t9D7ISZX(%btewm z9>mGf-l9Iu`FSLg8hhpY#nee{{hd;!3Wc(~QLKgsUIVgK1()%ynn?0mJ`CuGdZ>aA z6?4)o!gHH#Z8b9pnDe4(=H$p+8JktGM7b8a4QEM2s4$(nN(SpCmw)=$y=6qoZotR0 zDl@hHeTVfu5J~OSBUp9l> z?^5}5#QCTWL0u-@0D0{Go@`&J^e;yElmfTNA;`zZR_2`d9rG2a;eLKpA9zZbA?tp! zRDQL^y%wfMBQp7{UhfwP0gE^<&MO9nYG>wB;a-%g>w1;Ju%_38%Ev|MO+N6X4=ylL+%^VWR80T9L z1|3g2!gSY+EmU{EX4F)*-=2M*jc+1)j8u;x#>Rn)rliAI^}_%q*43*y zSjF|)`t*tsEw=BS0ub4T=}CRA>nm%KJ~k18)H^t!Tf{_owh*HnM$;}cd)-w(Vcl9g zLm&UnaYN!FPH9BliP+L=OR=sd&u^}>dU|~_>nl{4k|?+#kQyB6sARoSOS5}wO0trD zT3x?}$_7_4TKjcL1JPh(iXM81>ttSFc(Tbauou#3 zMBwyb%cb4y6`~oqf8x`ey2FqBlogyQRCSkM(gO)&xU;U%9|&h5FUXCEK|I-|uMq*9 z+-yaDfng)?M>_MMZMCOeW9I+jji@U$IY8r*-fV%9HGQzbF-6BuH)T=yup>FOO8%9D z1tG$V%{Hi`cXm+i?E2R>#6Q|M$UpO(gQ8$%CuJIF<&e~IBG~se1^7RL#>sZ`f#q6Z zPtx+v*lNqFgu!7JwBs#|H6nDhB^#b#Ia9B?p>2)v;#qG>Y*j38@?uBBl;w#jlU;G5 z(y>Zc*WL^TC{iu`9K{EMspCGaHBl4^3Y`q_*8y`WrqZe@tBGXWlld*87oWT&J#;{& zJbj2Z)Qn}}KD+mLgs<^hBzvYSFTZZSZ>uaK;h-(lA$F|p^pIrb)w_oW7zb3g=Zco* z8G){|5`!UZQ_mYLZK4;DD+pid%Eqc{t(aNbgHit{*jz32yYEE+V0k{-&&l0^;DW>y z&BM^<|P>| z@Kdco>Der!#6lXgT$zp^QyVrtXcVl;pJ-Kj!$;K~N*(;TK2MBWt6zl?KDzD6O&vY^ zyrjxnI`ZWpwFLkYitJSzE~#<=dHWpdR(Fh3524Fo2lJ<5U4-p%{=z>~dG)?9?)q6RIvkAF_o`#zzzz4RV)LJ?8H=QqOPm$XsO(@UZ>U{Zaqa8v!dx!iZQ_S#(-ydZN;x z3UeE}qBlqk7HX@D`5AGgXGfGzagBcr1FOIuO~Z8OoaU}svD;gTHfOXQ5yDHTRo&O=sJnu?2!sFenVy1A-;>1Pv8t`!LS zdVzUonDc@}%9&fu#Sz694HJU2NHr$`#U5>EYAM^_5E7Y@EydDpTI~&$qeb2>9d;RI z(Hm@ZQxoyDW&VH^m+gk-^gRlWj~BbbWg*3=zscOG+*dzo;S_VPA{{pqGqV&MX1|wz zQ4!!@y3KJ!`Qcajw`SjtgJyb-Km=K^C&s$dut~r9$WY>&onP?cvQe;>@ofNMA?#QR z{}Ax3>OjhU|4GS4X%%(Sd@ij|dY^N6p78aDDsUlW+q3+N&wtsSUUguDra5U-|8@?~;8YGgv-`Sl?)lM0NfMfU z>$f1u&h9OicrHblaYni|nBT_;iBYCYV5UcYsLQYxU#4kDf}ryXO6BG3TI}FfC7N3k zWDx#|-nfYeO*_T|g16&iqw5jq}L%v8Y>47s16Qtpl? z=CI0_u-&xjfoYNj@V||>>ESG8VU9+?t4RMnqT`ls>>8cj88K^ROf~+N zq9_8sU_JvocSKzpUE=7p2Nc!pX&&MLee=;mF%4WPmVy+oK6$sWN}57IF{TMEg<8eO zy0$@6l5YyJYs_p+L)4QHo5@D=q(PP}P_?$R<}2?Y%BdW z)Ct*@j2gehQI&$!CS?(-^+@P;qN?kVX1V4X6Dy=BeCy%Vpi6awCg$7gAeVu)0+)2y zccnkt)0YN~5T$==b$Z}yd0CB4^n5=))G~vmF*W3aT_RtR#iUW7C{PzRA~9mvfekP5 zh~cFw;D47^VQ3)X?3k+w#CF}C;L^ySDdIeU$>}-CK1%5sZP)xmRf`KY$K491 zKlv+$uTX`xA}xn10Ze_P`Nh#m{&H+zlkhKPf-kdC493Ob^KJpe^f@q|RL zQG~xV4_ap@X@iEI%{2kSSYYHX3ifNs!Tv%G;}1R7V>#W0(chpU>T7Yd5&N}z;%N2B zGF{K%^fD)19?hI^Gbq-X6EckY=NGezQT7T}iDy6Excgu*eY7ennmm0e86r)SqrTD% zoz(H-h+*`#oGRr?{JWWI?s~|FCx~>vTf{d$Br(J4mW2r?C9DX#ujk8M$BDA=>aKy3so*=Z4K8*Q2#3?}?u zG3yOEP#|`GXqAo_nhFgG`W{JY6D!0mRJbTQEiIkgvD$tUAC)>S;iqSV)1`g8>gl5? zB0FhX1avvlluYeY4GJ60t!Ug->blBFc9YPucHUwjIn_SqQy!`08d$^A!F@FlVUj6W zNO?p%qJ?*(?9_#W{qB&}zn=i=coeZ3kNBDKRgz<6&n7DC&nopChT#7Z_Rj5fcU!!7 zY$q$WZ99!^+qT)*wr$(CoyN8rvuXOY_rCYpeXjGzc?0XZ#v1cC`2EbuImsyN&O1vB z`7V;RBl+sC-qjXhBCd6mNZ;$4RL7`c30pRmOsT;odcGdRPJO`t&lLFID8tQSN?qs$ z;Lwy!zz9kYH^y^~6Du#MN z*2^Gd-y@R+i?_jBk^LqKz=Q9*Z5SEtZ^jop2oHRM_2JK>xIeJ@u>YCA_4{e-42qwX z)Y@U!HiJClBbJ)%Lpe1(G?!n^^CQQN*+zC(2dB72C`ip)WEb6eyb22v0GPq-Uram5 z6UaRtx<8&74@8oSHowZ=mmp)R>&$+|G3kjx0!ZuNZJqPEfbqikY(~%3+B|#k8km}q zoo|_JxX0@Xwf*&Fj_Bx{TkoqJm@QF)G!_$wMH0MJGVGB33UO73z^F!#(Tr$CkMRxu zv2k;U&fO4TyZj^ql|~UMg9xtgkC${QSxv_$gwM|tg2=d~=g`K|)EFq=$J!279-z;` z6m{dzyEJ8SWg58iW8prF_mJx?Q&v}+kO{%Me_P(Aj)`s5tw3y)s2(GTaMcME6Lw~V z&i~XkvM5Vfc@c$prUv%_7vdK+E(_VSawM$m_aPSB}yk)obv7 z`Q-Ed_Izw7A*#r!sm9v%V&aRp4NY)zOe%bXr&Z$;1-?sW+RX)ym;cw)K;M2jtHVKo zObh;5B$y~@mWzk@0H9#Z%s~Vh2D+?@@|n@Xt}48&0@8U$ZL^hIJp*~_S%-r0m3u|( zP!98%%Z@ppicy?v@R+t3*8C^a*62}(1og?$;=!hqj<&b~xN5bTM(sl#x-fcll0Fls z^)F-jQx#34)m&+&Rm}44t+Ze2Eb_Sssn{*(o|qoVGRvx}uLDv&@;Aj~b_0RH{wiv*Xon=U*hf-bSD@H&0gX9F1_@&0QFb}@U#i3l>7Ko%Hc1x8dvZOZ0PsNuabr}!uO!D0sZOnp&qb7RCgEfGbbEe-Xwvf{hJ znCz+YIN4-)FjDt=Ianw;cMz4fjG$}zcBtdj_Ni*U&1})K zpwa|l_GloH8Dt5Bl|I=#zTEk(0~RoX26FM7>^N9HR5$um#^CG`p%m|MR0x9_kcB3y zz#H8+v2eC%XDogDZa~`&*4HgN`KNAhpeOb2JSexbFsu-hRU(jdm6C*7IW~X7Xw0sRw$!83*T@i z2L<V0@5(s?1phyo3vs!l=vtdKYZWZN0gh3_H{?r%$nQdf~^s+^T1W3T8Bdk$d| z0m$%0F@qd~woHWrM^B0=O=Ykd`M-sRJqL+!G*lasEfh3MlM+iysxNtLp087R$_fzb zemb;+-2>jJd1NwJ*fSC*6PGOU6~PcDpJp-O9Z1ws5P=F1F!TB3ekZI2Jb!Z2zb5ne z&pVAw0(3P>15B7fl2g<+Rrg-Kn3HDB&ox<7oxXbMukFZCU|fs-;&jzIwl3IHslfDQ zZ5_LKaVfSJ+nZMM8a$?->GslwQDtA>2cM-Ry+%wJ9E$wqTaznPGX3@3Cu~ca?HNvs zkYU;lMC=Wb!uiF9cxNEF1>3tt-a;gl-TbwnM!ZolW?OFiCr>szTvsq&Ri{30o4eS z5=Nn5i6R#M{0J0%ref-oo=D{H6CDiBXOmY>DGsa*U+;N}>|LctCvQVoUgrfIF&zZ~ zQJ@}stuql0{sbWoWhXC&MU%f9eS>voEV~z~W>ULT`~7QjU3jI7viq~EqOKjZKk0XY z5h?x1sF?I3Jp{@DkgHrT0G{u76u>MrI*-qW82byNRiYVvBq#`nbXfc{V-Um95 zQ{wpIRe%mRHU~)vq%!qc3^kEi?Zr-hX}h@s3GtU6ZnDVe0&hSW&+feDW^!DqtHc|0 z)?R%Np)sL0>gT^%EKVyvV5U?6u(LPb07t z7+*`VJ3?0%7>zWbqBKw*GDLU7y7FSPBjs1OODE}$A=cXO=Wn5fzy7qR|1x9hG8}^Pz?ut^ z&`jQLne9Pmw|$NU^R(liN~8Cs#wp9DhTbyO-sT1nuS+Df5prTbxB92S_hA&kQ8bjc4ey3vKP3Zo7B?!YCZdCI?@P|~b7u22 zK zYn0$;lwlg`T(B{!zgknF6j(nP+x$%V9Aa8z4hJRI1&~*&Ar3r9Dv&vJ-P~u~ z${9Yj?~f5hSyLyDY=%J|PN+pg z?D51Kw2~FxL(2*;hAK)uhCMgSv1rXhR<>jZS2{e4kX@~bqK0iaCN!wINM>Y*NsFXy zVz3omKDi&*i-&h-61$;{=@^KV?RmRiyWJy(oXvr z8e?wiR5)-EFlL5p?4nE|g*?XQs}OLBtT#Y3q?|tPzn_$5m0#es^O`gGY1iM2g;wGG z29utnO~i9#>LBMN*670+WIcsQ8XVP5@;PkXB4*4A(ez$fQ^(2L_BiSy`PZ zPjE^h#{{F*BXGc0IV46$OH(lvL(|+SJC}^J&G54gEu2e;$@)w~qruymxC_(+tN-gy z1k+_pttvErh`7F7&pmqvt*Z2Ib0Wl-tG_R9MXub`UdOp#V7ImVWAuM(E4ulyx~pLC zpWnJty&NT`K6TvWQgT<=;RBmQs9TGWY#o9JwljY)hEx3R0?7{VIg-#2Zi_n=U>Cv4 zc{B#&8u_QnL2xQ~Xm^y44yOsOaA+`~A_sMe*3!q3>*R`@1hE0IA%3VKF#TgrF+t=^ zHKWM5j!wI8x@$1%LVYNrs^lBv73Z*((<+s3Ffn-A;5^})U9e;A`}KY(A)%oIsD#pf z8kGIZPzrd0z)z3UV!=9MuyvbP(u%OoQ zlz(-CAKOeXQ1g|T22j;wMzr?z7}H7qa%dnR5_5u7?U$btkpe}jQqx1ugM6CBiL`hi zEx4(>vkCb*dJ%Vx*@Pki7>g;s6ci-ZIkMfLWE|QnC^^sE13#~Ss^vWVhea&}BKY89 zdoJZ*8j>ttu_Gx4i3hHh>|%ay%#nO+4rZ?d8$~bZE9uj!ND$C9GoJ( z@!ew^-5P6T&{nB_2$8@}sMxS@Rfaa%cxfwOcGN8I=Y{s>edzF7H9QZgxw!EiB|cbz zSv{UOU(~I9CQQMlt-Lof4sz)4FL3{srImR;Jnv=`{4~!UrlUXtznY$GeQ%> z+G>qdW5UWXDw&d8nT0_~%~vw**fzm?0Et_(b6dB3Dw8c&8`6~B>BLuPag@o)Jv(R{ zXE2A1Up*mBZq{G(Dk3(?Ww~=*+Ava5WXL?F4+ZNl8nA)tY!;EC&4(?UT^X*IGwbi_y;53EcXGAq%+#jvzN~om-bP5s?jh@qAHXQGef3> z_nZNhr4~(gG-u&;(*DoWmImSY&+wS)KgiUB`OyhdO`S(!eK|<}iU> z#UZ3U_O@1AZ&I=7RzPBbh3=Rf2k3?bP(^~JrShyszT0brDZ+dh>WEQX$}p?|cJNNF zK(e~lPrir|GGjY@a~x$43qeQr83bKC1NqByl+s%Zl;kq|q&%?Wa*I1aQJ2q(Bu{&vb|2pg!2SgNm4(risJi8EXs{gZ@* zKPh`g+b`4r3Kf;QZv}hhH^d4_9?-( z1vW*40YZ`lhcuO5s~PTkf(5DR)P$_NJl`w{Zhk`<)>zjX_^x6PYS!W$+)8$~?E`!B zLgZ2};Iu{i3K*?>N3f1N@-$FPRcM&q$Z)m|E+GVc>u;*l=_<;QbFOS<>WyF4mLrRx z1|=;LYbod@tx(}vZsTl&@aw>22e-srs#jNJQ?eoNj;!i{+%~B6dv%a>nMLxdq>>04 zu8{0{c`}Xla*zc_l^ZB9>pb7oY@cZ~#Ff<4x0~C>qrKFI0?E{J_Z9^&*b>K@mW_W1 zR*Y7ue+X8Vl)9ZY`+Zo5)AmnwEHEK%4cp4!@5I^d!xOR@pwD^8)x@6G$S6dZZWDwS z1r+FEK@;-Vrx)#L9^N0RQOQx@E|Fcdef++FPfw&Bm9W~s5G$Lkle+eUqXBsl6vP{i`la35P7}OyC^+r>NSZDz;1}j zn9egP)KLQw_R{$jfCMpUB8O?t7>!*0cu($9$X%#tch>3&DHvnJ-@^Y4#%2_(@G$H9 zhhlAWs|lHGnDGmAKRL{OLhj<#Ug14w{e7VZ_zi3GH#@cW%Jk;-h+NDIA9-0-D2m_u zD|-h{_QR{4uL0XF))J)fsrcO7h~!%T2nYUQR7Q4VUpdjKg{ZTqw9qbMVtQptU1e1Zn)BvCb}kKw#n;81$$DsvYUTDAs^g({`O^d$?ds)*kMw;nFHlz{ zsqGAyC{Gb3Ic&NFWh^?SC>+9cTRD@&h!OOEajhFmWz7t6;9&*-<66zG|I4*Is!lYQzM-|5g(6lmmN|vw8)b>tRC{WjgZo?zy@+>GZ{0 z2STe&FwH#AfZ%hFw98NuNMvmn-LVtq_vGd@aO5w2+iTFFZc0xTl$l7#G`RWco62qa zd4ZeaX^aId++IE=C&P4U;M>Q88`N${5^{hM!q&(I&psZW@VQd^na+-N6XA-k+uwX^ zMeflbzBRw7*&XSU5q+o2rq$H`r9>z=ow@kl>d2+WE5@V~Ix}HhLw>px>_gUI(23u z^p^e=lF65iBDQqEr+P2_2Av0FsgR#eJRMi0+uxgIJIu3k;!XyX6n!dHk+tncRK+~b zD*d{hQDK2JHUN=`FmBXDA()9MV>_ynf*S^_R~c40MoUv~qgKv0Vx-K_Nc#js=dqk5 zpFpT|+vyXI86zCW-Jj)NT}wbhUIY&GS^J;4_wwjyy_yeG)<0+->Q=R@zYkg(v50_R z54qPf4sS!40ILxa23bQQbCPF@uxNj5uh26HtbyY`!htc_?p@8B@zn?DmlH6y;{>b&`e7!tFe<_+iY$X)h9laTp zE_fIU`crT+=?lyX^W7)XyzmlRzl?1H8i<`tdKx|$ugjdGVNrY|WG$>?n2U07rBM??Wji6Yh<*u@~(@%NZdb>q=c6b-8nT7z6(Nog& zz1W0=t5jg;+=E+X+h;1459;xs?U6g)qW;jQj}3w5;Lq=xrg=5)JW-xv=)!N9O^z{7 zH?~p9D)E9}bI}!R78vNCd3Aeoti-c&q4wz~y(lRWmH$Cp%e6I*+Iwvad0gYTOonW4 z`k}(enmS?|QYYX79gaD;Y8&1H2Ov#r(aWb$rzIu@{+B-ky}4;1rHc$&^c~n0FqViu zrD}!;?O-2tx|HzZFCcN}OWKf+%c>n-S-uoK^vT=gUw zNH}su9tjk9mp?gSlFLlPPnLdGZ5>2m;g%YxcjR$XzUP+6FA0R%NKVR@Ch{i?E9p zVFXxi0NY}6Xl^R(??h2KIh*P$o({Ga?)B+_ycR-;`Y6Wn zQ3{nn*|w}*Z}f&ck#g>DCJx?)a$-HdinS{9K7pSvYA0DKyl)u>SCFzAItc;>%^p(a zXvCe?m_xR#v5{E~-I@Cn7KnSz~JmJ8G{p48BQ}Zl%t~7VueIUU>Z?mvDdisig76PzAeMM^x#eV3{k62~Zi7%a%Lm z!V2Z2>~oP_(maC!(L;Z_kC?p6f3E(YZ~5`p+K*Pcwggg1cWPHE$?X*u#D`yB*Z8zc zv{fS-5P?XxW~M>cyXXI1%TZKIOH5*dWFtUQXK9 zD&T}au|bG}C6MWzxTSub7iRHVIS}6}=U;BPgsrLwOYnmyD~~sN9;nZLHh#>~fQrgq zF>OHfc=T!j^uVwfP<*WvK~T$lB@HIPqpzPXLt>K{>xoQ9TVcIut~&$vg%T1u5rm;^ zA-I91wNP6jSEg^U@>V?@iUVz|_#Ax2o^3rl+smVICWJaHO%CfV@PxpB$rtY?wwtBj zdT&teHx*99I)xXe)-#vx$1*E!p+_|c0)uH|+b>-mNey-iCCkQ|#9~NqQ6YLFY_oZE z3GpXScXGe@b7jLqN^oGuh!rh>DHQ!SK3q>RSQ?joetP7bk!ut%=^IRIO88ar32ghu zJ^f2b+2}pTk)s+U!(8)PdI^7yXy5Pb2 zvMl8$>}plsb1H3o06%SbT!SsCvx(tBr5rhpqzdJh33_lHa^~hhxh)JQGV&yBa5D5# zo*ekS41BlQD0veijZP)dNlVf;yR9CMGC=&A@iO5{tWkMKnmzuyVU5FtILHP~Z$i>* z6h3xfGxp_TK4A8tGE?rU)~H)9c2ud5cSj)kyxl7 z{nhW&JYBBDN^o{hv6u8z5D#V8{`>P}fb3M!!I6#iC$E}@R2A5%5xohxCa}u6_@aJC z`y&$_)TsF^Mjk`=TTGa?BS1#kEHgjCsM$xc!`%1hFiIbK1Y*8Q`uL{IiKDmwkX_Cz zl1?$}&kU5W1rXFYjnwL9Dv#kJ<|krds#1dWl_gcBt*qU`fH6OvOiU3zS|)PuZ?sf) z_}NcK7Sw~LJ@fAFXB|X*e7~ROM8J9io1UaN%VNiER(&3_o;9;?>Def?aBs4f!j_jP&&oRM z_{5pu_4Q4=fi4)iXuQ4;CjC3oYL5;c7ZrShR!edY={Qfjtc`7=DKlB2!ikvbhvLLH zwm;5<{>M;Wrk}=xN~8~tp%x>lXo(HGr0vp2!-IFzI?bfs2{r5qB^?|d!u>6zy-9IP z>h#F+HDY=SL|omWOPO5du9_v3Fu`#|UNV(aMCzP)We;Mv)QqNMpXGR_u8oMP+NP-{ zz3ipnk^&pKq>-DY)TbbF;@&T#^lFmIK)vBy1#wl^TpqCPW?dat=YSw=Rsrx@>LR&ZTA*>2;EE z%nuVF6ar?Ye)$D(_@Pb&_jL1rJoul3duNh8m(nzGpkqGO$5H{Q`GUVo;7dTF2$VPm zydM7S(4O8){Upmh7Jw(Cs0|jtY*~s;V>{e94sL8TGzPsQL(7Ax$d+)Qet4G+!KBLJ zW)QP&3XUA0AjtcOu}C)jjGJSqQu7>o0(C6au0V2LFPLP?rD!V5YfA|l-iT80<>QOx zPZBk#rU2*h1S)$%dqhI<19R1nFB4CcM$0O%$i0TWRK>WGl^Gts-?%sT@V!hJBW^3b zF7a(jW~IybAjF^ ziCQ9j2*Z;POYpRH8~+Y zqI#}9WNlINdw)XfWfEzybil{IDBjEosSNU-t?9PxOge|AMaB6~>Aoe3#Q63AT&p!s z`cNiNFg1Gf<2&irFE$sLjkEW(IpN*0Vwg*CB)x#9psZy4KpHkl0TO5|oVyZM1JN4w%P zCX~CG=gU6?9;` zWy?|{Gg)@P^(4oQ-Uq;bPBs~HYoz-{aCBtZ_6avhaWY<$Wwbk*ogCA74Mg-P*A#h<%iKnw!X93oT{c63)~9H zgb+>VGJ%JN-E!9E104Hti^>`icB~Xqb+O%jP@FGO0LwWuRbxFXJk98RNn7H z2AnQ3cyWJ+1qhR z9ZZCGCrmFh%EHmU*0Xfe)+!THACCBRsQHzs&D1N&?X>hGo2nx!ltF#d;4GUw-bM9@ z0oPeHhxBtnnvYQ8;UE(z27I}Iv0sVS#jPpRXTIduV#2xr%cF2 z?=`{hXB%dU>a$PtBxA%EUk`umxRnX-CBiNn03|DRx3EyNO4Dc`+MiG9fN+*K!j;7Q zMeRD_6qZqsJ;GSzF-gVLnND;Fd$?~okbvu3k*Ry{I~sB*^$bEpYe^PnOTC%Tjz3My znHuNSiBG;X8B?tK5GkD&qe7$#M&Rs|h3#sXjxB=;lp$5(j2`1OewAnI&W08)J z-8j%I^Y@;je4PIoxka!G7Po)G(KiumNP}(bqE&<4Y<4j-9a8g(2OCP28zOQ`4UW&k zHPW)HYSaKog;}ogz&th3DULi-`Ic)nhuWp02uJ|#fCFYiZ-OKG8h+kg@3N>oq{vpT zJ)s3bZ_f-+)_qq#xIxqfwO3Rw^157oH`a2EC1XyL998{I#0*BG?*4Mxf%wAWW>%6@ zZPmfv44WtMG{|Cn>33>tqgYyeWES}9>}YkHuaUK`Lmyc2$)I=os7`Cgyg&xo*T=u0 zXl@cBEAw$(DZx4+W@w)VS3W7+j+Tot}yX~BH?@w3qi z2J%MT4^$vtKZu|=aKRZlJZqZ+GK&x#dvG(6!jGg+UX=3IG~~j4mSaIDGzx{Lq9Wj~ z_dZ0_YvJN!Zx!rdIzsokT7P35E?Avw2WNAAG&Us(t~9lvL$hF#%aUB60?TnI^F-XB zO5MG)qPVhT$Sa#oOT6hYx=!74*xC0DKWkK}YZpmIe?*Zv!dW7Nnu}Dg#jrGSbxEGq zQ(}LWurS=yFgfCFC8_K$b1T{j_w4e6EaB-`IK*eU@K2a9qWeWFmPk@XVp&_?*f(7# zSl!AWa4EyM<>0V*$YAB&+r37#gj68w;M(GBd0px<1W<{NU%$`^!SvQ}N%o3`gJr`) zVUdy$n~mrH#H!pKqIE>7VT-@o+U#jC0&Q z%wUMl_A0iw*j8-;yHoe6E&60-5vL)2dOOFGVK{ZpsZzkWu56=(w_5Wb+y7G{9Y*Yz*-Jsp*9wixqQH>MRgsN|$jm&ZL)Br$ z$RvF2FyS_em>b12tDM5>9py-Y^BpA}poU*yuc6S3%sTcdl#P}q=3IL;B;FOdRW8Dv zYFOZfi%Eo+K~GV{9#f;~X5Ik88CS{Ft?*-vwOYhoErf z;YYp=XsAOTdOa;js391mz=IZq0=qlpD47iIlY!PRmeu=H?!qd179TeA*^ZEuP?8Jh zxI`B`(9@~Ns4?%W#2^xMTs^o@AFh<1%P)qcH+@IPS+6`|zMFMvo6M#q7uJUTQ`P_b z9aAx-BQmehD_6)tB#Aq|Yk@{6@rf*w!habk0Z_1N#?3U*qvLp5$)t6rQ!9@~u3;G8 zg0biD?4a5zE58=SdMDRnjUD%%IGs0 z-t$P%_ds`V)N{uRo(OLm;Cgmx$A@)T1!s>HjOeH(L4>ua5x1T0-cBdwel51jqi2Cg z$E&FC8StmY`8O3~A6S2tQz(TnCB?3+Eak76){B@1nJj?JVj*lijPTHyi zEdWBMqQWrX4?}h)=2`1go@MAA8g#~L=O@2M0+Qj>iwJOne#kN0sW|~=S#7o9SF<7` zl!H2XkjPVwEhY&%;kBk{8E34qR3cMojN`o?5^t<)7A_^>I3m}81DUpLJdc63GOLy8 zXtl%Xr5*c4Ou_ubfBL;}?df;3JVB+|Wp~J?x$Q7ghDyDCW5ScuHe~FZvn}s4J*a@y zb(&NADM4#awan~GLYQMR$W%t9n>bifT-|oIZ7H&+a6fkTph%V z<&)ALpHIJHD8M@~+v!}-O!m9(PI($dBRJ?``UU6Z8&#^DxE!FSNLlzD?3be$f0Q3O z4g6rIMHh{bA*g&$Z5R{86#WkRrM*8NY%|wAhX(tKw?0cPLB{U#q)o~nbq+1gC)?+e zzq87O7y^4(DL?Ky7hqP%4y$qgq=kVcCPChLjq+O#d7Owy2OmU6REvGUz{S>}E<~!q z@&9XJksYXKzEuKRGa*lsLT`EP!^oee{87?LDF%R&P#P7T`CV|yIeso7$&-llz!E1c zJ|Ar4G#GM#4KY_^!@^(m$b$JO6kGE%a(}LHxU8g%7LjwN7fO{+Qs?q1lmz%1o@Uz)4?h&mt(91klJPEaC%Qbeedx_8ra$0r(kvMO+XT51&rNIn!TO z_($nx9lvEN|D-P+vn2pz`*oaMpbT|$V<@hxp(RO+%fRKY?=hM;jL??W=KG5#VlP^; z8l)mLQeH?$UTfKXDRTL^bxG>bW#)M>a*TF75F_XV%0dcnl9k20419er#HV`^oAFPV zzzgh-iV0S=|H=O<>A}e7TC1LQt%^yOL6a+>@KcNj-p6x#V_150-9!~afpzTeI9FR` z@^P>H)r@uN+R~9`lqK+>@4f=0P3c$D>i?oKG?PuWf6Aa-;E-hOj}Qbi$qJb}Q9!w3 z1%$_Bq8d3(WK6UP3DY*#7vTdR$`Gzq{i)Lx4e_%_)TOPkTfq)Y@QxWTdAge0z06n6 zw6ti|0nHK!r`t)*oI&k*tg)`GF+TW<{cR%fj}Lk0^>p^bs(nHVQ%~$<6=d&}#$lmB zXTHN~`WRyz?jYl6LNQ%(`8%)CZ%xW&#$=+HOY?@RHMKVK9HshKz`n7y9NlR016C?g z=;~Ar4Z}`GC+@6@dWv$bvR8|7Ghs!o2bl}Q7wxp8F;BJHM~S$!R^P*Y^;qZgRj&T( zX3hPx#FG+M^t;ERk2tS!HHnUwA0<@4=R{Rx&dw9ANXPOJOY<{r42z@9%Fm3XA!=nO zxSNAeCy0BSIWQ=m7+EC|Lb$>)6JTW^)!kK>QC>G>&N=CYGwE@5qe1KIAf&0LGP@+g ze7rX>OIgJgo0N}fa8{~@cxYWADtOb!<7GsiBGM9+0Ot_|CgW_R5Qemkf+{rtw1`i6 zjI8X{)_bNqvRXTBv!4!ZKH`%SJ#Zi7;V?vk*t1^xKk;XBj}h94nc<9@#5=8|51r3C zoB|Ad>Lqgd^fKR0kRCrdeVyA{ga6da|7mGG^mwI;s^6_NMjg^4HIHG;a{(k}{o688 zTu!6~a=TdaYP~x(_XW2|y%3}rI&g9kK@hVtxWgT>KO$@_85pI|X-Ok`P%0CnI=qsu zK$Fqy5Y;&+PFj3npnbqrYlr6XS14_2HM0U)<-@!jK5pu-}9!mlv?;TH@r55^7V?nWt&4f7ZuO+H1AE1TiekZiz zkZn@hIe0{63mGlG7`F2u?l>@r{z4~Tjjk_?1E2k<8fJEFx$siOyK-p#74V|u#+$}7g9%iv6gftHcVBHcq zAYvS~c#{9$Fy^$>Z*ePOP{?SA$P_y&bQ&HPBLM=gM zUL-d7^I4rV`iLy*v{jHPr4|v@o2GT+B;aMSGK20xOamk0Xc5Cyc!hejJ7yuhxzb*# zCHl>cSC{x+lu~+}`Bxxf{cgkW@jBj^6ahS;0^(-3jj-}NUTWtXKDMt`L3jcgos4RL z9C-<{tb?{hw8XWT*k4)fhm4$wEyWyhcqS9WtG|~2bAEfk{={QU5(mL0c=QVR0|Y`% zl9)zj`mwZA@Spr04VaB`25_}7l^JYIjm_PaLK*4cuUdL>2cXa(sX}*zkqv|cK*SpO z$2HPi;*laqRr_YYr}nt=kuWfoNr}Fg9#XH};0emS5@H{+`<*|WJ_8oQS8G1ey(a@#ScnoJZ^LuiFYaDE*a}4=}B3LawET>*dd)ps8b9|O&aH)N`!}QZT)oXDj=a% zPkAte)z&0eCSOJEfWu!t-BlZ2e{0ixM`ls3WIUOCQE?PjQXbvNhF>)v7$0Rw<2&d= z;VAT`Pwc2ktv_ZG5+B zZ*r0zKDPaT+Mc32o4txeXyja!0JL~NFs?XL z*y#6KzcV=(%y^TMWzlmFzd7opGq#-htSdmyE~b?lK?L;%k`>Jn*<-tXIs>|!q?FxPx`STRQZZ%YguCW}gcWZJG#c8{gh)KS zI{{N`%(QCQ1N$?U!7B&tbCr4kSDBfx-6S!i#y;j`ZeZ0GwbMi3-gt1@vV&?}3SxN& zAybr8cRfORZk3A)Qt65V(RIg~4fVw3owZk)YJ-uFGgDQ2LoEA$9Qen5yf|{b!9U8P zi+p(J0F}k1k)E-KkRiZP3=^L9yUyHM1&R`ugTd2iYj!gCcnM%hzsv*y!|>@>(=UdL zOKc?2vD8dnIlLeKasu4<2Xi+sJRCU#Sabjtrko3~k^@#cj6zYp(hc?>+msfQ4&?@O z33o@+`L>Ob2lryoab|kUYNynXQpxV00&adygJZ1jpJ?X}d|3AQ8RxTORLUzHY=$d8 zahw|ok*xIBXT_b0pNAd3D{ZpH!yR;yaO1A(W0+OVkU-&wKG5St4m4NOfSrHSlK}8` zh?W@q2}S=ICXTWU%;+$a&+4bdU8!PKT5h@!v2uKkl5{$|Ab1T)T*^S61t($D2S;r@ zhPl-UpT$Of-V^j{evFf7NS~3)!GskKE*u!N5kOxDE-hvh=ZR7#%!Ph1YJEgk zGESb9iJ~4S7m97yXagA76csmIOz1p#jWnv$ih1QFghz{{#zawOh*|}+$m(@(VYNES z-5r!|6&i-EBK~xlEMte(HoHT*Sf_pk^N*mcDCDM;PHIWGSp*CD zpLZh@a+Q=P9c%mpZTOWPCo(pP@m@IQpIkQT6_OVBPN2VE^z^U0h*Ov37Hg!{1ty;; zl88WvK4+uOL-}kBum{(XK`DsFt7zyj$=CIg-AVxy*d%&lyq*6yVmA09C4!9nH97IY_LN3CWj!LTsv( zwSKx#2Zr;MNFz{PB{HCh6-Av!`qDF@kB~HUoS;Q7P84zUX!%>eK8BN#l{oL~CaXj@nG^|Q8E@gg_oOWD&?T5tDR~WA~u8OH1dy^|4NSR>*#7SQrZ`q8f5W0qnKO+0Fd*#5)hB{~_qL^phxGw_*u zZLx`cDtOWinV#LBAfx)gYk%BFnH@(A5${Nn!aHXY6T%YO9N#fE@kl<&XhgrH4w#)q zt26yKVhiXSrVC-6sOc)4tZIu%<)B6nmax~6ANd$%0nZ?^SDB*5m&ATQEY}!}V91_M zSZDpGKK$<_A$2D{ls{L1wqjopN0l6h>4)PBb0^fQx2z!JvEn;o8Y zTXu(r)CbClX%Zf28fw*Obmo+i>N+n;aU5S$z)63xMncQ*Sid$az52#x2<@Fon{0A# z5ED{sO!T%8jATi%bFwSh@g~c%p(fn-$MpB^be^z!D{G>ER0RLoFH?~E4yq4G#~A5w zk^X3XD(-3drPE6!9ZyTar*79$u^c}^)sNv|awQcV8bJ8_ER6vxTh1@Mt|{czlpRYK-qfDn)e%v`okQQXDhU!2QWqj($ZE2Dnt0e1iK7W|lG6<&> zgh6rLWUHnpTAcIJH9V?4;DE%s=JeeLMTYR6$dyA^B*~0ly@J48nBv?R)!NIcC_;#M-Yiu_>>}MT0VZheocH%-inuVkJ4Y1?1BtH=-Ll>1i zxPhY$e{cPH(O(e`SZSy%GUu8dxXIf|Q+_mAI!E>SUXuQ^Q~%FQSzZR@cwbowpN*oi z0x3}k+OOn>ToOG)1U6yb>Z<~$Ub9)=SfhMy-4vyc=~`QEUYuYmX_RG%K&*U z%rlf4FVX8yZ;Wxv^d)3nbvHw%ts#Bdw)d1rNhKy`0`mMkjjQoilk)xcm^71w15CoY z7g=jjw}c^#4on*X`yhn2L@otHNxl>r+KZR~rFXwS+&Z6S4VOX_E`ROS-K=s}(raU_ zn7Jts!cLa)lS?-dEp?98(7oGk#RZUqNz436!?9Bq)lhQ`qQsWS}bcuzm+L8a94#SI{D=Y*IQ zBBOIT8*MZh6D1Y&X=0*MIrSmvbpXg@sisMo z*BbpUm}U9<2pJ%#SYlbh_QjiG6QAL`1YBHQ+zFA~4GFkPLz6mmQ`?5?NdQyR!AFdZ4AoUfQOYyQf{mPo+@ZJY2Eora1KC?imeYFe#T{i~}fHbj1D_`=2|&tblXKbUhk zo69~9_nIS5i6<&pnY=V@;+AgGw}2!IRZ3WKZT~;Y-ZG%>W!c+I@ZhcsU$`#Z-QC^Y z-66QUyK8W_;O_434k1X85W=wc+4r8DnR{p6`MAEVu77oP^{?uw9s+}D9z_;!h?_o& z&k=2nQIy@H+*2HQ^Hqy0R)SR|?-KsCG0$uP?rPWq#~8^_HNIsW!I4De%zoR%U?LLA z`p()OCdjCeVvQjTOncy^w8E^0rE4-ndS_WxkM)W%u?!J_S1V{xxkHa1lZjNt?Jfs=(bQ^0Yl8&3G$dX_Eq++@gu`0z}B!h?8^AL^{GU>tE zp_x!f$hb-!y-N>$+_8O1HISfBnjrvKCODl-v{Wb35m7vD(b_3h5bDU^s5CWQyHm(g zrs~u&QtcB{zQ@bNw*Yj53;2f`VXTH+%ym3mR3gm0<-|u~j@Z6Rp=jQ?n+Y9_$Y35u zUEQtEz}C(2{w**5vqsbg>GU$J>_XW`fg1+Z^E&il9eZXuraL5=|e-tf@_OfFSjeBuZ4KKGl(klYMN7$sjJg+5JJ9VpTiUYS$s1(;tq} z+HzN0zt?}4QzDh4ONuci4ZW-?tWk1R;|$7**C?<|tN4glXjQIXG_G0+e{NWZQDaif zi+e4%9(4k#kc@@~Xue-#6E_w2MvlmDnjSYlOV*S4?P0MeoHhn&+ozYaSTnJQgf!Qm zSpd9ILvQ7M@Ad<{a>vMcwXLXEl(hd^Y0Vh;C@LuU#C z|8798;zP;A+(|zd3@tHJm8#xb#ucj21CxmQVjCO*MNHJOm~RcM8Iox2sG=ro$X<9` zL6TDx=B#`|w;=%#l4oPrW8L+O+PL!|;3Bd>S#%{3_FjbGV+re<^FwlgAvHabx(frz z0FRnW6xt2?YV0vo<^d_PC! z@tDL7`iUw3?Fm+N`F$Q#B421Mzwd3Y^zhHMKFGntFu1KzeP@x|hfpa9@7|)rbqY_xT=r7;*aJJ5U zfFxrZs5mO3=pjf~e)oTf7i5pd1DEva_?#Hv2myDilp}cefu1n4IFkPU#N#cm-|&4G zRuWD#ixmlT;jYHeQwC3w(~lf}xlKV_-Ac*C9R(8OdXQvaYO~_taAq}ulVw)lhU*=n z-K|Drs0gTdu0;+NqdGf(chbD1V=yXC3SO!~R1zHj@KCIa;k{N<+_^54wF5Df8s8J5 zKD9_7xi%Wr!Pj4l;h^+gX~;Vd2~+vXxIWF+q~^{5C_AWP+wk>SGoeXnW9N|DE@@=4 zKv!{QsAk|WWa{j?)5th_0Cwc&kc<92flEK*;~zaVxoEz=DY`zblZ_VueWIoGv3#jd zPP;M^d-I^!Vi5icwZs?0lEu#V460>)__;^w40_;V1*si zR4Ill?~8+;n5dvKEA zjE9sC5Kl$R%#Yk&sM${0#NexX{!Q>9Mb#*-B(myAJ{qKvVyNsuw$RVET&SsPbxbuL z+3K>s%~ps7U!Ih)!CRL`XL;lFCG}98L|(;K!V-X{KEk@zg|ewR>s;b-HVcnEkbCF| zD_)(IfnQ93cK=;-6v?aA?=N-rU$;LGJ(zkZ35rw518ja&h9W2Swnx|^4PIyD0htgJ2%O9#=!bBz!z*OQ-gBH9 zu@}=$UsN*@lgC6<5@F#YDCW7$UFS4($OKV8DxMxCz@^T{P;tt@R17L;`Z&@OEu^V! z)E)H;luatxKsc6?i`y-Rg zkjw{-Ylb-am{-f-${wZdr2^pvrrG z)Wk{BIs&f&N?e-y>{6+20+}znJ(S>hxKj`Cx6zjt*0_qp&_h!fbg8OWDAc&FePU(NCDx-Itbv~M=L#5ZV7g8xr~9_N zn$d425nN4_`leQk8}ew8NxdYDr^3NZRgl14ZYJPj6K+%6k2!JzV#2TH#TQ8ns zLRA-#*?25%J5wS7{8x=N1PC#@Z?xLAs*zAGB}3=#PtCKtnC%7Bso}y^C7q(WDM_I~^GrOQ%f4d%7McT$)J6hf#`_w|tzK(8L)e2=`ZPC3x*E7@q;bBW zMz!-tiU$dGxd3~gdd&!)$1`IoT4^1%T;RnQ?SHsuk#rV$L`BqzRG^}GZugyi{&v<6 zpVVye)Bjxn{o`IRrkT&m_!LV$&p#$uJ&C1Kj4CtHf>3%i;BSA+e*QrrkhWqpTN54` zP+utotd3TvTiF-61<=RkSugsJm-ASpb}2du>7{Ks+B~dtr5)>ysF+PV_Z{IzoMDXv*v!M7J~29;?zej~XgGM=fsy!*JIvElk*@yQwj3TkJ>%vhBw_ z`uSREs%L`$1X%}%-+BVRt$RxBgVK3i$QV}P|B!3U$$d56fyrQJ&ZvH##<8@BhS>4t zdSB+STp@o)R>zNzDBz!c@Zf=F9=pYx6)@T@1!LRvsWA0;lzOpJ-WVzPAaOIln0!5} z&=(ww0vo)bhJ=UjiMJ2wF4&lrrqVf= z9NfPh$OVw1WTuXzF~j!LhfR~$l@q+YX2fN)&7G1EtLDu`f5W)l>V+jLwGvivbvp}o zIuCAs$n)5iVl%^7xpAJJk8~9B)`P0jj-P03KR`5-jk=7a`-o0#Ck1op285V$v2gF` z{qLx3!NWkHymnLF;apo+e>AxC_{{WOYOR zyH@nM9ELa*w!96mS%)UCNTVkIHK78*Bgx~iL&w%CCrV}7vEjB?#*)|nLXZl%dYD`j z%A)U3^y_$S`L{JgY{kwKe2Dgg$ky=;5oBdLtI<$0tm1Xir2&W?&3V6} zyF@!d?~pa*ACAJCiKZ6re^d{g7X(HISvNZY(U!mbLBG8&MV8I0&Q_dT9rsQego@Ca zvkcQ^Bn48zf^It8PbD6BV(rw3@)m1;j^Dauh6yktlx&j-JC9g*k6}goua(;P8e?t* zzkG{}ypn^2JoD*wv)UeP5jMDMFX%vqb(DrEv z`oh8Cj)EOE7;xe~?Fcew5YpYlvZel?8pf1{wHx{WNRq?uDSR5Qyg1g@JV$LHd1ZNs zJXHV)@U>ej->`>np6J3A8sLkIIl~hIc;40gSPZEcVt`fc4PXxi@jw%?9mt^ZiRPk` z)1}1=`l%g8buY*rM4%tt;FF=#35@NyVK0-Sw5x9W)Mp|d)Gp|VQN>2k7!^wwA3=P* zt6rRrz?X=xYr(l_S(Swut(YWxsbCwNYAGUue5uMIRLGU!HCs&+2V4WQr8J7C6qp$@KHelu-CuFLhmV zAqjairil=BqG-N(-&_>xTvf;9)ui%JZW9z{)pmtJc~+;uHUhBLnk2@qc_KgIRARvP zQCPGR{K``+Hp2fmh4weL&eh zFxrEq7@FiHwPo)St71_RD8nWvthAgL6TZVLX2RM}{nho+UQNpnt2+5Mxol zjn%^2PzrppSxZ_8+}K=U9t1!7>?*kDHDuc(e-+SKJ-`okM*ptB+-Me-K8U{x`=~2KyVkxt)VUV7*S@fYueCdQ{!%#%#V#bg;QN4rvgpIdD9V+*& z>#4xtg-h1_&d1VNMl@aGc?>tBjSnxh-Y0i3nogPP%ll^)IaMfB2yxLLR54p|y)9+& z8XGKA+90dNdVWuCI>4&_eY6TkUl^%)L>sPBSC^JPrF8$I_hObJeoLfqAS!SmhsU90 z?95R~DBG?d-6EnvxyUPZ>vg#uJ^NN~NNq_O@^MJf;fo6a!&#k`fw6DoNRLH8p9kpz zDqb}gD6RUT%_Vo(`;Z|S0QCiehqZjWP(L@U4TZ&#l$%+wumfM|i|vP!W`6E&eYQ0* z02>PdQ_CV&>N9#LOFM3KW29ylDOyp}5Bu#c!<>>$Dqb8h)Y!3jTFeerGSi#1fE903 z1;vzQ+Q;;G<#t(P%U6}9I6l1@>X>e&*QyhEPUMxqLx9(&6F%6#Dg!@I|LUU|P=Zbk z??1}L1qmVmXjc}^-3T8?U6ONdY6@*bry(?%3oxKLCEQF3ZaXFTBbMeIhcTI{Ra>OZ zBN2CU-m{-eNx}jMMPjBoBDFI_|H^g37OFROc%I{Sb~9{zPbJCc!drLR3qc|!3fZBS zKv!B3#5|V4ST)RmEnb&Iohbt_ICU>6>B}R$W zd=L^?6I(;HEm58C++#6Y7NtrnJ{XHNEVk5fiFwT)uhsjZ<*NJi08?feaS&3cNq|2j z&a#V9XkwR~hVQ%p7y+A!dGGVH?C!<{XBOI@tEGP7=t3<2T^#w_1jEeWUTqGrjvJG2 zL1v<3X8=F%JMBxAP+~uXfaAp5RhaNWnG2y!bXE?OC#qRj+ph!G6~w?i)R_=(s{A94)!k#{1wL!B0xSi zFlos}2?s*M*wX`sv5p~5gv8P~qxvemf{!owr3z=|^}i52vzPiN1_ou(IXX+vXn!*e zVt~pM0Aj)j*^DtG$M$3i{>mB`{0@`cu4v;A{Xfpjy2#*6@{!>7jcxG80GjD-6-i@K zs2H&98IXI{!N+clR#{+jBEh#{#P6DUnQ{P+GI;HnD)E2QwXLFZ|Nr4y@@|R{y}h{5 z)6lrbIi9qv9hIsX>Ns#|-FtgAMG?n{iVtVwFMqB5zvN00j$=SIi{mSpjOnyxm4Z^^ z8GL3mxHDjv#_@6EYM8K3H=k6z;y(xRAsM{=waTzog#pqN9 z>c^_GDwoK?NZ(3?gw}Gm$PI9S+r?nmE=kGRO!5;PtHN5mYCBU=p*WC>nVqXj2`o^R zPM5X0WDmcBCh2&$TSXzRj6xsqytP$u5_*4+-0S`@sCAoEU!k{ZWvr`+VJyvzSDTXWvp&fT`)aXODvjwqNc0fi z%-qOc!P8NlCOgYwi4#0d>PVj;5Cu5uofvT(vV4h2ER%l7?q`IVjIFwn;>t{z4%rEQ zjsC8cbjB>ou7-14vKY9(OtW4-UHa~Nlyt6X^JNzQMcIxJr(bxtb2&YNq^!uHVm>`5 zR&ER~lfQR1k-(bTsSFW*)OOc2|MTlY2o-7+~QtNNKD3FHPNZv zlW5zLNITnq5B0Z}^r0XutJNXN)r#rN7jp7IC}SPa@Fqw(Vq;(z><|fy+MlaXM21#G zJpfozsTz#OzAAE$pPLZUwvN+|`Pj<9CHgk;N}{*Qs!snPQi#`;s$_Som&yeDE;{+? zvyN_aY^%RD6r&j50F&5x)Wuk@yX9duv+1d^y_V^;Q79bjM0B!05~_%8p?HPkQ1E{F z&4jZ^^6Do$WWwCjih`QVjc=UFjVhBX#o`&yCILx=Nr_Kewn^>7FY$7noPS8s@}ob4 z9Tk0;v!Sw%b}|-&s=VVCuzvE16@CE5fj6LB?KyxxtDa|x@WNjjM6Q#-Bug?cX;_k` ziqd1FY13JzKFFj(_p2Gr&i{klE>)lvF=`d~dz>;D3C$!{rZZI`c&o;buFeArbUtBO z0r4>{8fYmhY{JVBOg|{9k*I|0Q&#&8!WyzUAaXJtAsk+PJe2rV6{%0zP9Pec3Cqvq zSQ)ib<$++EGXA`fFwHE55cNsK2|NnPi?J?+4&{2V;2{+D`RnSQamR(uUG$Avn%~ez zfz9;?4{b81`zE8a>N>}&q`%4de_(3-afQT0y4&|PZG29fd@kZ3`#G%+c|eoeQ8{Ks zWi7xVoG{EtIKFNPScH~qIeQE8!dQ$6cO4Qo>w-|=wjcAknmc!VFA`~RMmko-?da2LRfkxm5i3x;KzZG;$&#AC%hI*x%IX6be z+o_d3^Q1_Py%?f~1*$_6k!#CSiNdqi0dzFV{Wz;NK6l@S^lu(EMI!oiC%utObY!;F zWzk(;Pj7N9&* zvi4=Xk(C4G|HR?86ohVCjZAU!*uM-J#g5(XEQMyeSjs5l&6<&!4GFMK zX}atHbJzqXJ?afRo(L8bB{JgRBaf}IsG_@?t{OCHLwHfNT|%Kh-YB|E-h?@!x~1$^ z{+|=L?Ug3~D}jr~|LafD8Qitj0q{b~PW*~4&B}-_y8pI}Qep|qMTK}>{k2? zTczZ97!~IDoa2en`*CO{?I6R%Z@+gEvuxqP$S5_ICBsH|<2$}ZU8EYV^Qq$wm25Ug zVEt;0B$b^<@6>)25guM*PZUU%$R^=t*hvn`Nkl2YdqERcnr$<{AUD$1&ZZfSyAL)I z3>ydbP4_;``ZaAc@^nj84!Qo0FvKg{Q8j9T{D;v3hgom+)2NnWJIe#j#b{xJ$!;Pd| z9`#j`4I4sH|2K)-`VWaaC32Ee4E9{S|6Ly?r1!?wYB9vn3fWVn^SltNoXK8Ex9X59 z?ej%Rh27`@<}jscYYY-fE(TN1iNXol&qUv_7PNOfd-U?E*|6l8 zB(w2QhJKJ1-DC0)eZ^NjVn|JcTA_8{FdNV4X>d}P`YkeBv8p)DMAn3czC^OEPI#2i zh>L+X=YG*a1>sz+A(c3dop^{*z2UxWaEI_K)OKO%uoPVuBamwtbqr{{6v19I#FWrT zV>NVGx%^G(^(I1S%gmcud&G|EIq~H+7jbMs^P-zm@)y+-JP+lv8QV%!{?8tdoCW>% zU5++sL|=Y-?$c=MuOh#$G?ugyV=~QQ<-v>KUp$vvH|TCdEkdj5>=Q#ekN>_C{)2Y? zzQf5M65NdLZkD@a6D1$WCu24u70++flK2LC{`AbvbY#-CeD+Gk29uGj_~do^xfJt& z@7qSrGcnY)V(h5{XLM2ENDrt}lnV;g57pFI7?x#q0}QPvVW*4){i#9d2lq*q1^s|% zM9Sh~uZR9~KS`H`tM7O0mHYARRnwWDB{@?99;{Klfu-=qS$g%imqqAUisepnnPc)+ zVw-iP&nT0My!b zM&+@KGm2E6;_ueTii4eu@s}OFPk(jt{xgu|eaf?czdvFrYZL8DXr?pIq%l2qz_?Pv zD55jx{Oa+BO)It#x-YGje_J>7-$1VDID>iw0$Qbd6^4lG_i=+4?4!|S8zGP%xzPAc z$T|b2kG6B7PYm)W4lHCQ38{XQo9x8iMM9rFxXMNIyP`PQ#;yvI1aeocy2+?|u8Z}^ zbQ5Jwb!MGmCk@v0bq-F-Pg6XsRXe|+AT+(gZX)@-S6W+Iiib=r9KLGa4ysbnyIK0o zWN&{?y$M0&YfmEe4)j6e-P!yfs9Z4RMXe8iPhI&}_1-g&F@!;Xn2Et4{bC?hlo|e~ z$l_xCu`0tzfh;0ins5LTjciuzd_m+wL_xbVSlZZZ!P|=>C*c=BIBa5SYWnQ}f_Nf# zc$tCvlvC2?dA4u2uG5GMR(Wsk*Cc36)mB$570GZX z&?x}}20lF7FFW0TedmAmj?F+x z@Z)&3K{kkWAo+-cJ}NWwlJ{GSkt!eR(`UqL>?^kqKq1J{s0~cKcj!;eqysfdh}TQ^ zunSp8od~n#n<5+~A)s#qf|%L82KW0h3;fh?KC0t1<*mOX32%Qo{>!{)FY^m$rI ztEm1JcPH7yWW=w1Y^-ivI`L-|X!tYUB)say7!fnU+oOiwn%>N-cn7+}QdiFO1PC39 zGG#tdtfMfww~e5Br6Z=PYod}3+A$?v8^#K_C*Y;_BJJVEkh^~W@3;e{&4oFEHf97=xW^cw}odLM21 z_Ptn4ZPymO)LNua*ZBhyZ^Rx9!3pb+P@r*>q;y7Pf}Z_1s2SBhg+G%Gj9&$4^#M6j zmjQ`8Z$U>8S3KQjoZ({cqUXGy zANtYmqOI`2>@yzItX^|6#>qci1NyQcwQx4N@BluvnLe6XtnS2x-yG$y`teyq6s0C5 zFRA@G)U@)E(+e-jnl`JGXvjxCc5opNfzw!T>^M(6s!pQ^xd*G%$Y&W7h!$(i!p3{Q;$lbU)+P1#33dU#=LIE z-IR??ll{!&KVq@gh2i8?z6#(&{?QLw4ysAyDD^Oz(h9Awl{ESwBCNWU943t7cfqk^ zg)_wXdxKLpNB=gChmx;9ns$YnKXWySNCJJyo71y2Io=_V%b^(iFji2p%yGe+gfL;! zPUM{*E-}FdO?E8t7#y#sPL&Zb9Yjy{Z6xqj0wl$uraYJBtP%{h7F6!roDY=N!y2P> z*N7Jq@SMs?+!9Nd^X86j*E&Qhglo zTujU}vr!=V%9Ia5J|@Z7TU@;Mg>m<~^2n4YX1X5nA7~dvIPix;j<8il{cQgBhDa~; zz4l(f+)ZtFL1hgK0c&3$x~h<>+RbGE6Gk$Pt}*SorVW}kW`4s|IBg^GHlw=o6`6Em zr|~Vh7@|6N_`#KO?!-$z}-HG@6M(v$aJz+aG0iP7<~O|_z~ugbW=p$uZ* z-@z4!EYqj|`gM@8mRzPgSrydoGC24l69Lf~Q+v|rd>n8_b3r)Mn~??Rw-bBsBGa9a zwMdR7%(Y|cNzXHfP(pv==rKo55jhUT+hJohe5Z^qqV|h6@mRr)NE9J&>Df@#x_-Ru zQtb8JFShI1wy3|?Q)@ha3;e*lV)=dqvPNUTF;7ypo3e;KnBX0gpjrqjViFx6ePCIQ zys(gsI{uEfr}m%XJYlf0(F}Co;~is1WVt_IBK}@Mk=oM zC47xFJeC#}r^!fIrbVdKL{eg?C?DC@w!8#`KnIQR?C=U?NiB-DE^&fH*=4n z)t?@k%U4Kg!K_yLG(<3aa_Ti8eS=;l)@5I z#8UrtSKx-geTyXR&_K~y{PM0dWw+bzFMawSk`=YhMj@3{VN^m6ZO-;M7c=RNwgj~* zGVKmyLo$}1P)3k-tzQCXN?~p&6<%kPBv1V4hq_2ZIK$P{kR&g>Y@%?&Z3%0x#8@&wm@9D~FPQr^!GU>?~V{9mwLVvbHeojqXI$^#WJA7^jf6??r1wMU40b>{!!7z3w<{_b zbAcltt^gn8n;xyvgIu;&u)TIhVFeo_xfHSWUBqdq4?9FFSA(uQlL^X$e5jX}8vDyA zLd?q0NVG|E624591U^-{zk0hZTAB|iw3mstXM0ul8l%Snds(g{Bjxkqrf;($O?qpy z4aYiV=X_=oJ2JN34S4{Ba9Z&3abbMJ z;AB11PEOA7C`H)cg$1{yCEvKy{G$>qA6(DEVL2VKU}?iKY=0dVkw{MN@?|748Y5RL za;n6s@9w)967z}~AJTp)F)!^Uc%&qbl0WIjLX3(~9T-PeLW)^Z2Y|ve0~w%hV61eY zcvnp4q1E!S(dE}&Asf6Y7RC^`;zInlN!PQ)wsI#=x;k1_X_X&*S%+z3AFPU$8TAa| z89^vwg^UwWlp2v983Jwf<+bxo6D@3f_{FusRG#|kaF9Byr6Th2)<_3Hhmr3mqwsoe zdt=%&)Vf)<2zk~|-)+n2qg6#u(3HkXpJ2#BfNn(xZ{%aE|H5~ZHQ0VE{5udQr03I0 zQo?2Jw;}4XSyv=Da&|*u-@ousM;)M3mii|-o>#zrVo}?sQWjE|vd-6si0bw+t zhJq-E10le}4Lp-u>5l+ZsDf3YSyOyf4m?!Ulwahe9t`uRPgSbw9HYx<=7 zL0KokTnT{0P%O4ia#3UPaUs9qUVV~#bTtq|Clc>*J=&wg`-~0XX4couP zG!yr$rH&Ii=YCIIbU9Tp+dYdV|pq$bMVPd_BAz5c!6!}yhESds${WK*>ds|dA`8Aa0$YLvS z|KU8=>4BGU;{^X>z%5Gs`yY(0>ibE6Pz3`t4HONm(bCJ1H|+N~ zqLF(#&-I6#628xNc@sbBy3dr7+Y)N6ieIF+Ez-7}9c%mb|IP05u$=p!w@Zmb8fqb6 z&F4Bb&c(?0l)7tS&^1B^Y1`xVR;| zpJYv}=KN#bY z#i+_3XRgqsb{T=@UxM$mB|}8qH)0{iCQ??L98A&Fg=BqX5~?=b2qx<`u8!q=xiF}B z|0jf3Ga)*bi*%!lBbU{>-gmB;icT#vxf32N=1vhR_SDy(4GoIskj`LBDqXju}QV_3LvPi z1g|_D4mott%+8XFCW1gzdI(0lUQ+1XHv5@^U#Wz=U~J;RuckO%dK(&vd*t3gBeCj3 z(xGCp2=wqhZi@UTzcm52k1(-7A)I}pAz8%}vN-h-T}>3wKoe1=?mqN&EE&q z5UUOu*WDL=RoMvrP(~E}&JXYsMlyvr@S$(#3SqEyysGfY%_uwO%gi4qNK0i$veU?5 z8bB9k6Z0hh1@2>C{BPhcS>D7x7{PYg%H<@A_8|$cVMnF|d3zJ>gw@xiO-;}n zH>xTLK@_TA+&|>*8u=O4q6vm^v@|H#21sC%vP(*Zz3MAN>g7nxffkudqjgA9H6u9W zs;u@H_lM^x1skxHIA7#SFtn|G{{!4TL0Lv&GjqGkigv&h*PARkF~BtP0zQMCV?XZt z2d>S7AMLp+dk79(fxC0wlK&6v?(1)h(Nr%IXS{a>bBRa4J(b7^@ZjGe?=~Y*uDBio zRga;^P*pX>RM4Oq9EC9JDZ6gBWk`A_yJmx}-KtQ7dgV%Oj9pBY?K#LP)&G-QP&B2PDYQ7B&JvS!2^rNIgJ5BlHMDEK&0`(SpyYAPbcYy> z!SUIUo-*!z2H_w>0(Iskc3ZXvtJ$IsX61N4j_J=;X1w%{`Bm;Q_Won~+zlp>KXn7O zYj6hTXJ}(08$6tjAoTfJc2QS+Qz3;RZe~yn;;ethG9jdCYbw}Zd-XR=}QZ&#gP6QsJUyO>8s$sp}j5JCg6C9@Rk7wYG z0G8^eTh|q~(0L3vkHr6j;azR{;EgR)QT~fJeUyj3d|`*0R377ohJB1& zG+f@6Ak?5J(t`?_UUWS{)>bu5)8%JyYRT;r^t}&cM@EyfD)E9w-?u?{smK<-x>pZB zCaKi*i=4J;k>anjb2hkD6}PNzH31*b;lXD9o8vXf%fVoiQG@RThfUW+t`a>*Ab|6M zcFascXOShbdC2I&jVY23++ z_t}5(oJSW#eHGA0TPqx&QDxPJGmXdXSKs^0xF-<`dFLNGirrxIe%zIQJ0J+Nm8(c~ z5gu9|vmP7|$04GdNoEKR|ADV&nG^iW1b_G+h!;VS&g>FsoM5{WTTz8s%D{9VvFbFaG5@UscjVk#=V*N}M$05}k?m zrM!0VK5(36OOl`3NKPUkG~f_HezQ{ntAd96$>$}n>yJ+wzL>+JEM0MlJ*y)yTiYRC z6jQ9b|9Dr5>XvaDQ4`MrrEV3=DK1TKnV~amN0O=EGh_eT(dAx33NT~K>j zpBoNVcILC8%Y#BeoGB`tA$uxK(MPVU3(loZwI-c%LneJ*(`9Il21uMZrJ8GMBox)* zdm(15yw&z!{|?*#8X7_on&o+@In8zcl5?rseOkz|gZs)U0mT@RDrP-h3#us6qiQKt zc8%3?Btd4Z0wO3v^);FGv9kG1lE9P;NcxdueR?vbHbdK956X5&i++N{U^#QZsJ&i;T+O1`M!P~td;YH~lm_+1Gfe4;@z+Ktx0NqRDN zQCK!D2_utr$|$`hLe)f}bD|`hWVT}4Hz zJE7*#Jp#{^5^US`=-`uz<~4J4(p(b1BhzQ$YzZ>P=uM+-i8iFlhQ`nAK7ZW|{u!2X zM?7iMx)DSE6$l<-1c6OMcj2;oaZw?|<(r0h8T$RW7i-;Du@u}GL+r4o4FH~4l8wzP zzKZ(tAz}EKJhC@v=X}1yMe}&51wF&2;Q&rYQsOj(>BE;>PfbMvr0vu%cl#fVWh{x! zu{B(k%F?ekl~mhbBr`BLkN$*sMULLZFy*fe$D{B|0%WASRE=h^4{S?XNdXu`su{D< z{GIUBQvWc#68@Q~16{vGp_%IyKzhxJ!>0mzao;mAIraMx%!q;yqfhQtSn`%7R(X_* z!dOGp9Q=%J+S>m(q2FxQ#aECfmQPqeoq*X~@vKkF{nD&550K|~k-S5?;~)9liF!l= zzoDWKS%kTq_34ZOTD_hEB4o6#Avh?{Z^%!vD9#4 zM84G5*LCM^Cd`>!3P(37KrZy2XYJd+I_H-ic%}og z%K0#ygr&my%{&;q`-)tTe0$_;PTnqLFxogJoK@!&_e0J1B;+R+p8z5qq?XT^o5Pb2mW>=PYxC7@F0mI$omiU66d z{tz){0``1^SO}G4M9W>)5{<336zzP$2_S}tdVjZtOsc@W-rOx*KfdTA$>5&8g}t^@ z0r-1L$8<`zIhGz*DYLQ+J#D{7tCP)v;bLBiqhCH7< zUaaz`oSXBdZ7#Ws(|@O5``L)@v*@x39%@w&aNo$#WrQKYS? zq)W42*@shan_>NuSS1*#{C2=c=akg5+Bv4f52WFZnhphFa1VdrK2P3~)KW9qX^W6G z>0$Y z^M1IRu%C3axQExM~I#)-NM688O1X;S!k!wYC2 zSiLBxE(Mqx0T6jce$*v#Fh{ahMdHX9&9aW#4@@Qq%+!&IU?s8|s#VEG*V;e&lPEuy zk7{K333s${clxA>x;`B|ImN@9S69%LN)n2dV$c8BPb!?}l7046b3*8Z5aXgU@C&yU zv=U(~1Aj;FaH=+%mp_U(BkEjyA>Y{Kt4jzzmyK{lOsyzBNq(|O`q;!>{KqCQ3(Q1j zxi(&MUz|inFtlP^G8>95JMep7`18R?+>YPd>qHuZevj|#&A~{X-|uI8&%XUtxA4!~ zot}4?-@jdTv|h*ZcXxJndOF{2AZ&^`2@PB?fiE;jX3L@-A9z2pLc}_KT!SkWm(`^6 zi+wR_V8!TU@^eadu7@%tZ~(?R-~q;@*!(vo2ZPDTqvSLAQC=-FR_CE=GV3<9myVI? zPri@Is;Gc{8Qy0aclc&ttHm>!1#8%glH{KyLJcR+J=TyX?T|7=nfVgMRKDNLG z?wd^kd6<(xJ8Ct7;e&01(WO4JI?JLI!EApr-d5JW*f~ang2S->>boNnq>j|;S-{!_ zC!UqQkNNkc@_({aGsMyHo*$}a}`5M#nu!UFlH(|EyPS2 zVTq(&@Qj|$J<*cZ;60HG4kVFl_G|C^fX)uY(&qh zlsjA2J7zx>#O#44@FC^-$nt1In%mHl4QXUm(GA>_kHkR&u(&XRoUlVgUo6@X=f$9$ zFYN-dZIgw{D}#-*$ErK$9#oPw2=Vsm8~YsPCS=W?hO?rw*n~f?W{DJ2Z*zyv5tTHf z7EKjeh1$!k_Z9l5A9q(<~_a;zHhE~Kl*FO z<-PqndHa3+=KJnGwLQPRV&I}b_Wb z%v$OB{p01jX9k$RlAQ(#w<`Ie%hS{IefMo`y!)2lyYG$Y^ATLmyc_xFkBb%io$lA4 z7qxkBKYe<3-m@F;$8S>;cp&Km>TxE3-zzz8a*kfVCU?DEsgyl;s@!jA>(|1YMlDk`pR+2Zc*?hxD^ zf`y<#g1ZKX;O?#=xCIFA?ryT6Da#7K z1WOEv?VDcSXxZVx$@`FwU-RMW*Ei?ok6bt*W8@HpM}1-_*CA|rLeh1MKLuAPJfw#d z7N56Pt6N}gjW=dwPe3*N?7_c!+;ET*NQv|{+hw*Y@=20p5%1{xmDUO4l@YaI(VL$Q zXK_g_+fQ3yl=X;=kGI+rAm9Jp)jJC+{nmo+0}05Ng+Sa9IX0vypBjJm3i}{y|FcIN z!gh|%z{~3uXhP)edHd<^Odkkvz*-`QsQF53kps6sHZro33`8;Sd%#6mNQJ$huK^R2 zTF$&Ly6sqznE3|>QnTCfHNezP=_dw!FQEeCTU+N!{0oC6THmiW^9ZCT3^qO-K~X`Q z-+@I_&?Vp(<`rS0B^)1%lo;sk;e*E-r~B=+eJEFo8H(4#^4wKm{G?qaYG!Fv5^ye0 z7t2qj>aUDYBc~*5s+V&L|CQAd8BYTRHVau@h00WQi@A93R0m_HarS}#PNt|+eZSCYfi}ZC-MTJEa zw(W@DWc}-e8MiMq`#(ELoj&beQ&@FwAAjWv02N;S13}C0!`2oVBqrzQ^>rY| zzXINTw(k3Ize`6TzyNv!kOi>J7-^8(Yh7P2_mm-R9jh`10UR9(v4y8oK;xc?c|2Qf z6L2=k(io@5`Gtv-gVLd8C(GGPNaH)EdqsjCd4jmp$GN03C<4Q(1sGE2VL7E!Uwvwg zax)&rI=i+No-G#Z4G*0r8SL;Vh8PVGouf?25uEm9yNuP0Cc#QA%NA>V?YA;<8P-?o&54tnhm<9D3)`HEUm0Wc*v zMBaK-xqN$Lyt5G-(!)km_^bCgau@iY+hN0y5_ zjM&yNgu6TaV7=+B=!))_n_;|0e8MZp=ZB}Zn4+MigH%k+HfhcOI9yW)5?om8)@ zmAeTc+v&^OU2*UAqZ*K&5<1vMNMo4^&T<)P8fq_zk^f?#ENw|Xj&Iw7_g5uIj<)7g z+qu}N&1LPs9V_+)ozh_mM%U*>xKGZ9&st~4bpt&Hw$s6b$ky(kzeYk1F@I!y?&C1z zG~R0o>6z!g+1I~kckbUV#!yi#YD6LmTlAQVgc917&qumqJ}^ih(p&$P!|y=oL4hzW zv8Hsl{#%7IW2Uy<-!`%Ac6z(0c#i1BTKNejVHUD9o+Ugqbi}*6;_XbIgIiJ(0&-9tDJQZJ<2E2oUPAH zoSCFU;MWuT?nCT4wq0iPa~!d-u%hnHq_Xt)7mA?5lKthuAL+{j0$WYR+5du)#%*q6 z?<3w@L>dBI8uQ8%A1LzoTs*J#qC4O5q5IYC?#al=NIFj>Oh7XnUN(@f6p}#qf2Npj zuV%4dG6p%cdr?LfjRKgeMRc}J#Uv?e9rKxnY6va9aprGqxiw$o>&^>KJSXnEY=TjW zMbeog53-&#W1GY?;U{)6<&BJ6u2?Iyv6JgfYX^KJUxvmNxp(N}6jl(DsxL8zxE`|p zOfIIybi#@<94>gQvl*#lQ^Go!#P|`xasp54b%>JkfS*za%{}jQZP;t3%AxOX&h~VO zrVMlX18)e7To`6RbbGb!Z)p7MeS-6_rql=pM!ULaueGxi3k}TXDNp|5f4Rn|b3E*V z7ek590rQA{G(97BRg(TwRlwt5-eeWCU#*Op|9k>~&l(UkPgh$53&7DQHLaXGffGt@ zt`_utiH)-9ANZ_Ifh-oiYgEngda}~b*51|zmD$UzsfoiE2}M-QiC?Bs{e;KU`a29K zf_SOw10jZlqsGrFirX>L+B>NND(>{~go4pXQ!4=4-%YEkQOlhStTIrV?Levz^xf02 z9R|yXvCkw6iG5=E2$9OLW2y_Sy?aeat=bP!%&!4ZtAm5pRAJUe(8q$eI zIgy18-Kp-o=4O8&vPu@&ZbxruQfb6->K$9$K+lShHAB z(<|?Wm;Pk=-TKh>@*ulW41srks3?jRfm{u$g=ao3*A!^||K$?39j#P?s-K6R1T|07}j%L5cPW?2IP}P42 z1+Cv^W21AaL*dvO7L=_l(34yzXvK{g!my|O<*Ry%#^<#`J;KWm&^iN#iVFDJS#~?k zB+l>#%g@{lx1rnFn9YzY2^t3#5dV^r|4K|6dk9W*PG^+uA?yCwaj)9xvF?p=nsWSL z?<0S9%EI!_u0-H+-ZAs*yKRmtJAD9nVqlH}K^OD!2N?gT{yRDWFy2|`+baN9-fmay zI$v&AE_&WEA3#zz{QSTkfmZ-HqS9D6ieiU;i8;Nd_L6i=Js@!7dmAAr8)mFabru_{ zou#HHAF}^S#}#^>7EJN*Z8~XIj&BaOlIYD0Z-~@%>#OEe;d9>?oSHuyznULy=SX6L zkA7}Y^baH$QG?y{ zYTy-mt@<1q99$DkKdR65$?=dQfhp;*WxHZ=@P!IH;eoN&R9)zYF>|HNuUs5=kBLEQ z`z;A1#!=&BO!Iv$3!#~hZj0;F>3L5ZwjInfNxx=9h_=E{fusBK8!q2 za8SW=5OjDNvugiS(NlWP>Vm9jqj|iEV6DeJi5yr^1su6ky|uCYqb(gvNbDSkD)P^a z1dT-^AySy+&A!dQ+R+G9(P=H?uGBI{AF#+myGcoK(oLm!9SfYr(V`1r@`g7j__wkF zB6@$<`F3*V`}XAfvf%3t$Rc3}@ob_~&@K{h&%i3m7WRe^2k};lyxwmEG=e`!oK)D0 zH%Pqm?d5JlUl`zL@Njt>jWRP@-@7)Uw4?L|OYL+FK+cnhxP=PXWwQ4yH>m^}hN^b`~D$xn0Opk60b zsr(ebTE$rLDfKosNJxRzkEZqbOJf^ZtLGjDR$B5`snj}U4tl8%34ymIvz+uyqalJm zIpX$CAtzs{UDRCH8ER3tn!MeYJbF`xGe$K{U7vD;D!!~Z@5TRS?nJ)25Bu^B;k|X_ zzY@5i3Tj&i)r1)WA9warbph?~A$8T?Q|j}hg&+A#ngDM44th~ZeI5W$Dg=U+_v7_G zL@TlG$VFZt-2R4N2kAhC1}S%KuDQesOQQW;Kg!imPo&bn8MIJ4I&!q`Ud(mp$h0PaE+xS`xc8!x@0cp z`S_Z!I4w7$WR+UxGM7@^c3XJMjCOA!=uik{qxaYt`CEKQ67gje3R<98PPY&H@>3Yt zB5H$T*HiUshpPte0!&ROS-qdmvL*TFWy4pw#U$B(f97x%gTi9z-fX~}ZH~Yh-eZzk z;Hi$9yZGUP`gP@t?5rRV{e_xp&Hgzz=|9tq9QY<5WAdKcuRF{Mih~AcT^paKPIPZ5 zI&0<+0re0a`sMay39av#?C4oL*z%ZGX31!xH~-sp5qRbT^NuuWC3o3*63ijbDk)UY4;GYZavI z|7eMd{=sbdD;xR94?9E%S0su>$avL+TJ={o{t)s+r8|d4qR;s}oh;nd(+#YOe0lJ>- zZ8G-yFISW*JNrE)=m($2n&15N63?f_my*jw*Wg-9T|$!12YtK$)Iw}IX1CTx*7fXD%!>y@FwcKy#y}D*?|?jcm0jz27npQ_W%cdS8)U3`AfGtz26>BjvCM2`4~60 zs3G*JeaC^w*c*%I+45RZg|*FR18Xn2$Lr^}bslrj1|>JlwGW<=Qz;6jk}YY3zo$l*Wmjhw#U{dz(xIOZ2viALg7GDR)=2&_k^>}IVibT=_}(kDqS8! zb3(SQ;j&XZ&f|n{hdj6v+~25eE<(gC%$>LtYGg`g8x;RE3CcjP88yhjX2ki7iI@rf0A-9~34bK0OHrc#v`{RC8zGGfD!|E8Urvg~OlM}wT-ZR5_0iO$EY%Ij< zb2ZHxTgjJVRfeAsWIttpe|i4+vm8EJq&v}7S#`0B7mKaJ|AWlduj{T$zt<@0jC%Y* z(WP_KA+mv6I%9d;kcD2lSx?{7yFHgyHMQXQ^Tw5OOM)~aUuftOh7EF!ptfEYJ?B9o zmS5)Ni=GJ4JmvPGQLJJ=x1{a>>^e72yU7?E7G7A4vXVoI9@Efocf*)Wk z*&FB`9@C)&_T^Xu)3oA?8I52?LnAXZJFLedvR}D+24q&SSX2>)w@<#tsS|#U;m*1X zoMR{I`pn5EE}nuU6QC9wrikEuK}S zmnEKX19}>ei%P8CVjR~=I-Idz9+Z;7;CWP&15)cBUUM5W((@^$^jIBp%p*5LA@$r8 zR8U!D7w(h`=Tzs9mYU*G+*oi;tAc|BuC@`!EdmD^EWc&+3yIru)K?4Y@Ye9p77&zb z`K>dOQk_ejKT`-`cy!Xx9Z;Zxd>E!NhGNI=4fO_YKd6q&H?~eUwa|4Dhwk(B{?gd# zs6D3jN*Y#Vc<3{5CFOyV%np)576VN4o1JEcTB%sIgeBTf<3YOC8Odrh+?djjFdZp0 zOKF`OTUD4Q)t$)2e`)qeQVaRbkbg{2I^nvFX=K;2S+9~OeaxkGH?KR2jTLt8h8PKs zHLTH(I&zNHXkJD;h$9{aH_hi~k%s)x&k#dP1(66mmRBGik^dg%Y z&`cWZ6QdGBlcONcKoPg6K!?Qgz2}{#%*UjO^V?%$MoFo?rcMAoM{kzA2fpMrH_Yu6@g44PuGc)BCTxzCNbfr^` zCsoBtp;51Z`Dq&Nwa+w?aTH>`uh#}`EvTO^N{SI z2337gQsxI2dmMF0^xwerk!(jHW|VZPSrDWEXt^P8*LDR(Zlp@Se@c()L|{2#k7gox zZT?dWXD)bC?qt-wv;2&bo|{HQBnw@ud7Ip`79Osi&Qt_7bKLoqTli=092x}$C|c|8 z^h*oqruYv5fq`6!wTpqPr(FCGV*N&Uj?cKKn`kGJ%^Fy+o;+#MCs3a)wV4A-A^IpC z2gfMa>NIM6?gL1~t9Q5pj(bR@RiL3MKgVC3SC_qQ7Xs$dS6_xG_~$j;Pg^}%B7!+R zV+l*1IHs*LGEot=?+Y)_AL2H+xsB(631Wmx!`x@DY7MZLuGheebIl~cV^ZH+0|KGDzra6EMbpW}uLYS?~m zT7%dQNaw#1`&g)EA$v(ja`c(Ya3t%>y+|I++zL2D=C5MeDW8~unbK`=v9 zolEEEKkVqAKmt}|vr<9HJcafGuif>fx-4TmWm6<|%>6j%c7&9RVdrGIj?L@X#&pB*AhTspC>%%#_!^yp;IFM^Sw-#op zhbrG>!EYpRraAv`g(JD0+1BexrEih^&%J(@ozre9m}2`s_CIbrmw{CF&1EEu{jpK< zsy>gTy(v{sDm&0k#+t{dg+zgm?K%17rvuvZp?G}6%R~P_2qaj55gmO>4hdu)Ply8 zV6*ZjW~LxyD;4!J!LoO9vC{r93D`ZcfCvFm(Jl7M^EN)-shEkI_~|``F+hvH$LR<) z2bwP$2&FORD-LCJ>;wFSmi;xCU)TRkQ)~VfOw=NWw8is+_xxnP*yrcxZ&s_BH4!F& z28OXuyXH9unrI1YCfhGa^^>0BFmf(t`?!J#4OZJ|`guRr?MgVAXVq)RYU6vC9L?qQ zTGi{P@TEnwb3^}Eoyr9u&I^*1mb9#&UAb>&q)vcrRxm68O|kH=6zb0o?gm36@%@Px zy{~gOUc#iY(qK6?OtnmmBN(j|-{w-&mJetn`&}8R~fC&&3eS@%k`(vFE$ZbDIBpW*<+^6F3Q+LGq=VLgIZ% z$e^`wf7O>s^ zf}}Y9vjSs3ilK?y4Zl6Zbc2{ySa8VFcup=>L>Rl0k|Tm^kUcLEO6b+Yu}-57bEHvL zS_4g+Aq#84Z=%9 zn3h>J#$8SbOZH8eE$1nP^j(qU4+PA=BaP7iN)6lZcxs^SWsYw$*)$8z$lPzL(B!LaNbtL6g!2y#lu97^KkzGtA$4`L%+nM`g z6y^lcZ;|(<1Sa#ou4H`!u8DZCP-z~XZo?(?6u{#=K9XJ(et=g&k|7EFkx7%a(vMjA zhdq7wfoTNh{)Z-;Im5SS^jlbSitq(`&JDP&6q$sWJ2S7ic@t#(W}v~^JAfp22pXGS zvPae+dV_xZa#==1bZ7G08NBzRM@Kt|t%O}M`un>56)&tWm&l#eM(YtVQ8_Rh}E zjt-!M1F&z!QNzjyvo7h7ZsgZ^nXNBI0^0MFpbK`wY#6e*j9CyA(={Nu@9baMt(H1tbF=a$P5OAq z@w;`9IxhpM9x-!2O-=s{aHW@07n8D#puOAxt7+w5jpOf3NXs z3|$h~evC3753tX^?CPv=JA1>vES=o}dLghf06kDRdt%2M%{o}xHWJJj1@So$zKxLS zG1)Vqhoz;Ww~HlL1bEYcgB~-kL@;JRJHw4X zVXc_wc_#FkT2k(dYYV(oCt;SKFz*4-q~))>gBw4t{J?rq0L6bmgXyK@)3y+afxS~SS!!D55m_@NPX(#p9w*!iuL?dM z2^UJ&EuG&n(8-K2)Zq{wH$P2WZ{zr+|X>d&9_QVZokDPLvch9nm(k4iuY1H~9X zEop7lHfqkr&SINm`p+LMeam>&VaA<&zu{d=eSPulTnFmyHy*2;@~D1Ayo%Os79Jy< z6scjPF$6JfS+XL+%_1{0g3*nz{5%R8w5SH(Q66C%^7`~CClEk}i56a$7UD==LeG8B zR1{2fIDJ}2I-!1+j+6zre)Z`2bldF%`0m@Txq2ksenF(Hsf3vwtx#F%Ztk<)?=ky7 zDeW;rTv-Br#NJg&1!*p*7%QPl4;j;>wtG04-O&%^m8}H7+3we8p-T- zBNmMIY%o+BDM*4z*C3#(TUlB8Ue7%`I@+{vT0fiBGJU?cQ9o5c?!rm!&W(=OkC{yf zcs(Cy$;p1V?#aoCo1m5z=;~o#`LJc&`Qx;U83tx%K_8m0T5>#+cHyZoG7D6nJVq~R)Hk|+KF^N4FQoqj?6-6RB&KRGEl~8Sf{P)Z zu}1s1>1#74A2$c={NI8@e#a(Lc&Yp%CO;*%`Ql_}Hag{dr3Eg?FKU;pxe4*(iY|KG z54Z4!kasd^jv6?s_fX!_UpnKYY19r*(4_%5 zs+tqrNb^~*RMJQy)Vwr)I%Ke?+ncp#j|66JjQ#8t8pG+^))(^=vL$*A|2u|jQ%)cj z3vX!&E?k@Q-(G<1Sz~+-3?<8Byl4>ApI^p*w{hfs@3Q8E$FM#a_YNH8)ii@f@J7r_ z|8dd(1a~;7g#JPv?X-3#<&{>t1GG6rQY-AFVjt;*^bKLNv?rwg=!~4>2__I1$5eKM z4Pilp4SEQ~_JlPzBQSP=nf(J^#!I&Ef+{Bk*f}cb<9uH+8&4F`CsLdf9l?1I3X-s= z@8Z{(7!mg3sk>vEz0)wQE2E~VFhpI+kv@=x&0 z(M5J=vbR^X6@6b{?)3BDh++o|EH4FNNwGW!2!4S0P^A@#HzhRe+(wC@uF1!^{c6LH zuziTug^UO#4`P%3gWn8RP+`end;7;3IT6Cwx@K$eL`pJvU=YxVq!uDi#~ZFPyaUFS z0t;bNGCy7Bh~1-GjoBM}kQzP1e2KsSrrm{y@w19%=W*lI?bu#6ZKv{_nFSr|A>K{* z{{ob^;Y}wdjg;|LNMe{8t)K8k!k?IW9bVkOwYc8GP-(t8I0f?BZ+JyeTie4^WsjAhqR!O9ndCKkjs@}q}!2;lbda@d4pBKL!kVob*R4`Y(a#t zp&92XI6jc4A;&b2ixjeEF5?|DlYMvR8Z|$BMZ_3es7FfaOW zufMiXFnQC%goOOM@$y;=y_gu_X_}Iv@ZhSB>?4qJRh|%)rn;LFI!Xv#Mh!G?78LZ! ziViEFI<`JHCM>;Wl`XX1)!0zkq8{71RU0!CxfZ)8t!L?7VLv&h>$ z?JX!xRaYW?Bn_Lkf2pD+M`n3c0T&{cDV6@Smli4<(A>C%hOnX9B3JtM7T0G!Y{qJ+00 z&HNk}H)_O~*>5gIx3sEPs^-uT+rfj4t5lYbc-}68R5+_+Sxj@5v{i!nvjN+r2Ag!4 zzVcnzPuiKJ*!qSomFWe=M~^<0M=c;{15vZEyEN=tcQ)EFglqS`nxhXc6E3>aq{<6C zuju>gz37*PgZE(g2@3-<2M6cY`17`f{Gu-}Kbl(A{ugQW7275PaFc{L&V7E57LVO? zA?Cvs5-27Ipe9n2{vb=O%n0)(>0IYi4W~O$o?Ex&fe;0PY_$dxPGk+!NR1AlE_8!U zvL=;e@0b$Fs4#F29?h~cbKyrgkzV$|aj9auW*+fNx3dbr&_@_`fOV!ByYX?=C?iim z8V&5$I0`<%apksB?}>JY8>Dz7zIJIkHR~LligyNB=X)7|!ksv5AXT>}EK zNs_6vE(=a%2iqj9=tW>1O|52&zl6u~e|<(QI68#Ajl;vO;2vnq&99M3hL1=xe2)Bcmq%KS|^K#^{= z7QlFj>+#G|$F4M$u{PCUlF3ut+Vx5g9h+6VT5~v>Gy$&427HzNZ}nOqzK-ky7JM+$ z!-BSr-Y;^_N1w`rq^l|c9&gu!SOh}5nl9u{zg)c(TldsnF(i_*srjMIebB>>y5YCc zKbkn$JHRNZq{D5X=3`k1d6P{|M)Tf=u_D^`M)>uCPSUrna{Gh9?Z<1(4{_oG7|7ZI zd;ukWR}WszIsonlJ8WSdVShgCU;;kSv03K>4z-Ve?A9cTywmtCM|f^NJ=Z8BQuLk+ z)y`Dh3>0h#LIV#+SI1^!UC=Md9bwVTHarPdxXSEBOlEsbiK?_{ov;F%Q~x_y|6vK= zagdXmnwz%Y&+QA1BSc(5w{PXp4cg4f>0<*&(6xF>=!GK5SG#V4 z0J?v_+M=38&d#2;FW@AC8*{m<`;FpFHD@?YHE}+^eJ%MU??pS|6c-8LIhPM%KktTF zvzE^0^3cC-Mx(7t*2O;xeQ))L@prx)phKCm&sdaPl+n=WQYuP8UDD80z~|XS=JoD< z#B9o_9&oO(Oe<+2i7mW(&{0cXk*`UA@KX4?gr|Z9J&80<4DuAtjvd?vz^2Z)fvAC= z8>WK!eEN-T>xwn^h>K8^CyRS#ubLA#go}vn$n0Z#>$U ztX*1(U;prhN~V+bZ?%Lvb?=iV2-QCSISrj>d{O=%JWP;sOU@NFN8rc(Dj`vb!_6Xu+Lt?J8cyM1)0Fww1P9A|yM1Bf&K}Qn%3uOWUiv}xt-fg(D zp|=RwdbdU=sf#+uUwBkOVOn?3y642cb(J~!3czT`M_rt5*o6BFP=$xWS$s7nSa{4BhCDTfOIG1@f{ysF=-b*c%ZaU>AU{#`#>w-b!H0g%gkV z0tL+BOk~3!wblEigz(+FzSt*JRUa~7{N>PJ4nDi$@q|ogLXsW+-TdvTnPg9~p_qYt zlb_=UDwHbRpwRbtR;qzFPip`&!C|4W^a1K3f)DqElf>b7UDwvtjT-zHbyPoWH~yp% z>ir3$YK_W;s^}eeTaT9bDVQd`%A!p}*~fo+J}F=LGGjnj_4NZFu-g{P}pvR*C-4u$p?bi+I#AXL{C2mjVW0LrlhVibyoB{D7asK%?pn+_$2E*k zM$I(OoQ@9^b-$`P^Jm|lJvF{xJaRRdU_(ek`K5CRNT&caXq>%wKY55e2w+ zkMcZ4Mv6ef29s!UR0w4b&IO_ur-l6^kOt?ExMX!CZWX#{LKS$03A0e;?}V6C_b<1* zySqBOKD*8)(fwWNZbGNocEpUUvh#c0h{{>Dg>8_uC0j$sk++C|GT`W$REahF!4+aZrZ_Q^QJmy-TwWMRYLOV9KN1HONbtMEWssyb{28FR!9& zqzFMh*>0GlQ6kwBK}95jGCFB<-{v^SjH>;}gN?$Wow>r@6}J&#jKsCWm_#&8ps>Lq zFQmj3e0jmP2I(I(ogm*@9Oj_lS@sT=~n+<Oi**|Qs4d6U_|^R)Q2~T2R(*2>CrAsgtG6xbmFpbbaQY3 zA5?0y!uo5TaXe6st3$rboUyylRWvE?H7c;H6~&Zee#fKz@<3ra8S7(opL$t+`dCN^ z+Z5XO6p3@OS&AUYyg)BcPXVIaq0CKN^ks2pUDUj>!(6%u&G?DSp`nLGbfXm}97HNu zWr2jnE-%EJ+m^b(GAmOOVulXR#(+Y01J!8cP`dU`u*p2-6Uu{ziiB1%lR`&?Lt|u6OLnl#@WefeKi}oepZ8UZ`+5hg6i;=n9pj)m!G|ASX9|fv%?I2`+lmml2Y^kt3y=jk4?CI>;gx+v$ z*Au%dDd}l`^Ko}4Jf-}*@Yhn(GcY7?ss;@&*MKP}n`vaZp?$9L>Y#1?Odq&>IsyGh z~o>^B#dF2!I+ojs)XvdA634JOv;iq5?(}JU|YWkO>A^w3TA@XW{ zE9I~qqClU?DWVBacMZVX+ef0$7L+tjKjC}puVt}z?WdzYZjS(3fy|L=QWsh zRmKWK^YQU{1$sdn?bZPdbZOhWIjJ`f^VI$#(F~-e-z^z2g+R2oFG^0vHA$Y-Aun0^ z1Msepv6@jWan$PuGGedrD7O9h;u3_pr{Hk@Kqbg4TQVcjHgrooX$5l|KK#vbg0u%o z|6yL@M>6H-ZP_VT@e+*S5R*5tev-5v3)Uny7#j3%^jp`V2H+ZaTnO>*p&U7{k!6^$ zd^Ql`@j$$k9QnyxJnJpdo|N&r@qNP-Qq;?R6YN6bK)H_>i4ae^TyK8aM@hBQsL5*C zzmv17#6RkqV-ze7dh2VqfrY4bD9nT{^l4&?7(Fc)7^7X9F=pbY-g(@Y|EB>g zq5*Di!SO%KBHP%t%5HtrhB|L=q46T4NWqUrr4RCxAju|)RQ>D+yZCw#9rd0gQ}ylh z+B!Q`tfqGzEz``n)BWF@a{n_<>IM9IK0bPt3np*jAZk9;FB0b5P64cPye$CMU06t7 zSm0rx|3m+=DTrTsD8+9&amD0*IOlaojk!dr4D6d3Ml?LGkjl$jBx^eKI7>AnRg~!0 z)s+=OwV`uqB^X((#Eqvm_vqSi=~1q0mFJr}*z+kF+@3yHBJwaot>125EYeA9I|6&9 zhp5v=QcE9UKe@yX9i3pYnbfyC*!J0orY`pGdj`N46^f`ix9eFoTpHmj<6^8!dL?N5x2t%Nt8) zR(UXehMy4;jK8vQ7I$VK~ctc zU=3OCRhK!r-^kwwv*eABVe2(`dfQPP@9Y|ZURv$&w+l>G#CQocUi`>K) zMcw?#1XRO}hAg+%=rYi;H_tVGF(P;5w^WRwEk#oPy1_~&EN-{A88xegL(=WI)!HxT}#p?(yI<2SB2}imJGkE z{q*8Jc3~B30{i@@gti6V(3L_vuYcIXvrnhF=6vmH@1~n0gd* z#G-zk47f*CBzfs|%ISw3_Khj|SJf+bAfW3>p8W`MJ6OVGI_c({s(&a=nvP%{XH?av z!XNzN{PG+yV?YJ8hAGo&;YbaP%+Mq!3S(4ei=#o5?ov?tbOH!<9YDq5Xn`fg4~TgM zoxQD_U$_5Ij1gGnez1FmW1xC{etjV<{{n`|OEr5UiorQZoI9O}`iH$&l#O8o{=&W% zRghq3PjpJbT4vFAf7lTgmg`uF`cw5-Sm3Xm?5CHQQRC6Wjt{n1N6#LBu)w$mrR%Bj zn`tCMQ#onZi>+{mYUqai<={d#i)GKL&-rRoCs7e<1bf)-dY=5;qFpaFvp0q?-8gT{PI3_DP3tGO(R*A6bzx6 za7s6Iu}CnwhE1w=poIU5c=o$TD|n`lPKFMH;#N~;b&B|Vs}3_5=l&H?&1+G=d$f(x ztXxP`Q)Q>wr&Y_08JxLr1FCn0GZ&7<8zTal3Ro$@h^h-*M52D_PcN^I&EIuHby#-{ zF+T*Xpt#|dyCw!_gh5Hoay4>3IW>WA+E) zpto8xxt=&pCxslXk+p-*xjZXA1NPOidG~OHsXeT>QU)*3TV$8TPZBGsjAwkVeXXgy z^AT6d*U0A@^<_Le!RjLYt>P#mSEF2g{}~w0d@rDMdOzJ>ffS=;3L&P$){7$f#^%3R zX_qwZj_FsCT|B5{yn>}Anl>XyP_Bed3)OOO*F~nSHX-}dHgv^`s!Tud+RKV>I^~3c zZ>mTjD`qiyS#xNQ!SvJ$x4)Q@B=_pP9_JN&I^>MsRh&N0FKZA+>^dn=$vT ze$_U)6!=v`g$9uz+vtk$>}~3`rj%T?II#d5{z2jlvW>{48?FKLo3Y8B-pvh46tXfC zO@K9p81-KXO5-jy6$cQ)j;!(lEq=&9hGGX77QT|yzTDo1?9*A3BMImA;RlUhYg^Q7 zvHM9@SvU1dJx$zr^fDU}7MGMD?n-S2x-D{pOm$|(QnfPNj()r~Il`>$`LwGSsu-37 zL#%$CSdg(!`G`=Q9O+{uqM%&c)VdM=fh- zcXnrX$%oU;w*Tl~s||`_uqq=pQEQ~vp}aI^i`EIhC(6c2`LpmdBWaz{>|ZlZg4Uq zT!$%UhCQdc6=bwNGWzgFge{-$aX#c8ee~xjFygGuu^$Od*o^fOsL{02=hcM7=1pad z+Ctg5O_2^G)~+i+8_bwTASUe2@TH)!9;;H;ZjHJ9cf`O(`sX_F*gf>W}AO3EWq`V9%EzLxMo zg+A;4p86Z#hkr$6iZ=({HavS>{w$Woe*T8?gpSrB4-cFDWSm2*meTeae(&dO^q+#Gl@+)+ok=s>3}WSK6NrGWoE&U$2S1IQ-lWf)!# zmdU1&dLKj;kAWb)S?z;S^^*05LT(p9jhJrb0sw#~NtbC;SZqVk6(ai~eu`KdDJm)g zidPD@=4n6JZ`M%!fQmnBlC8-hE_Z!%e|Qei^qktWCd@}Yr0sc04N(2yp74HU6Js7T zlmY=mZvyu52gp6iJeAluA(X3m;fA;=&V%;uNvLsdL%-U?=xqZ!aX%v6WU!PuL7`;nAhFTkb31%u5wVSG5~p5V}1L zKr3u$Ke+Kmb%UvIxFi#9=J5T7LjwS|ph{kWhiRkLO{HDQh@ObKIbJ{;rtf#H{ zm7$;D@pqy7 zsC3wq6IWMPfQJS{hDRA)=OPV+SeesK!`m&k?pqPh2Rs z@mAIMk9#p3WC^*3gB8hf1z|IO6aZ@wh2ahujsk`a0I=c>Xm#_YHB7iy!4~$tvbo_k zcdy^QYw)0RdkbK#G}P20A1FpR@>43m9-X*60ps?-ZEyD%@3*P1QLzk56rSanM?216 zR0^h+!irWn4eX|J5~jTx9>7i@iknd7kY;*ROE(UPmHw}i`spFK%i<&6FuXaDCS*uL zlsqxFqx!{tZ^mVxwOIB`dHqpq7ymG;l(F)6bu8pm3M4T$p8FqnocP8)*A^bsdZUpK zRWS&l07Lq!EG)^Oea)!hfD36TWtQX-;5%MFU%w;fbzqN)hwX=ll^I*uNk8$HLF5Nk zzl=FwWm2?JiO}9}%{t7``E0*7NBnE{Ml!Nz}*!kpVx^YS8?0m`V66`;Df!i1G&IB3>(@YGKi)vs)9yW>B7TtnAIcj z=YM+vl#0gAyY3h3wo=Zb;FfJ$JzsC1flW*R-f+HO0o0gAcVu|G@<@JZtq{5#rtyRZ zxTDuWVbq*LUVv-o^IhDdfW;l@yiFR2iENTd z3aY^fTSPk(R;WxW=%5O4GYWMUSdlV zYHGhwBT=oz53)@0Yy6*>4oO9PUmkBxp6*DiILg$kBEnjP)X4=pBMZAH3xPspa_NJY zGL{oN+GdNuc7@u6UyyfTNR0AL%!Z9a`4!O{Cs2osl(R+DDSmp`zeY_>8v%1 zyKA)nMT@eK#(aaGfSI|Y7c$D;AFe5^cUwqo|IQHoGe_3(Ht~*Ewa%@QACV{pj0FMM zMb7VY{opC2R^p}2rxy~AV|t#51~hly$G~o(Tn{|L5LoJdGi|P zeg*73;Izyn@LI;5qgL_&~;O@lN73QBi(cjpEq1f;vW8|m)u?(W?1UfkzA z=eb{oWB7%kd#_&qHRo@>K9)^BK9Y83C|b-oSb&B0(Utl~$v`iwfF<$O?{t2-YuU8z zBicOwu~nh70NU~Ikpixm;t(?Amqz#af;~Fyc)n}impN-|>rtfc`aARh;Oz&&c5Uy| zx_48ph>#|(*bCm!R41EXKOc-7^vzTo*ZA${ag%K{;Yym(i=}Pd@9CH5DOz_5JmQ+u z#5+qun`>tqFkzi7EI1}($(ZjcN0$XPKL*Z6d7!Gv#S(WLc@pXw!w^x10t;|}Tq7`7 z{I876AAO_zH58K2mOeXa>>7$lv8ON-HPwfJjfv1EG9iB6A2IoT!o}%y#u@(9M?Ot= z^5{MD$l?7u1RS~EpPu}LH%Yf$HmeeA#j3Ud1(CD4HW8eEmIdZaGjKW7v7pah$^$to z5FWrEHkMi>5(ik9&E{=i{7{))3|~+T%2jq9>RR0B=nug`mr5<@BAXp|Qu?nz!ULJL z=*q#R|gSMylxLsRs13GA%}$=HZWjv-#;;&!9sMU zBeF`fOfh+!i{dcXGoDE<{K4s0CLnbVc_xR)I|b_##>Rujhb|6hCoSt%%;Wq91?`1% z_9D+USX^Wv4@la3Z1MT#w*twQj8@C=vbNi6-{+%6RPC^Tt+Vz!sga*!qrnMfEB z9J7rqO2LFI@eWW`7Z~dZgrg&xfGKK!180(L_a{OK5+~kx@P`$%xIG;9f(d@(OV$y^ zfwC-!$Z|w^WILSb3Yl{}6g}{)!qesnSXhCZ7niqlUbOMT!KOc?M7lwH9+Eq!G7> zLmu?08rJxEEoLdR@=OwIO@Qel_Cw_@e0_S(o-?1V9=r>Qa{&EibIN*G_NjB_H+4p0 zNz{y8#36aL6CSe;^9yBkrk3B@Jjt@-8OXNmB-u{>Q_|a85?uJ51>@2?FnTG(LA}?! zF~VN?YREP_Tfr`_t}wUvfQc6HTKkA~NjBX*wXV(Vyoe$zsKuSnRAfkilhhv0=m`!Z zda3qC4XX+YLlK21Es@uk;SS)TGB20WvMy$dRIK{j-|_gj2Z<)Q3s$L(q*xZMzteW? z9F`*!O%vmm(&ZQ9@$5;q2XrPMny*0WH*;bYJE#hYm5@iY<5(!^AVR(pE{`$F?ipt%R zz`b)7aFe`F_(cXyyC=el^D$xbgNbbFw&RWt{xA5@yPS!4gTA8FLy{7+tk9f{O_bhv| zCOE+8;sr>99#9z(j5$SU2Oaw$YN&a5v1L?eYeG|se#kO-%|iW2cwS{f^#?yeut_t} zU5L}X>C=W)?bXE#%dFwLOmWAhyZ)0mfKw zFp09-xz@b%p6GAOP0#n9^6$TSf30rtkTIw5=eK#pU=>{uyX^Kw2zMcqQp#RZ?j*{` z`_pX9i5@ho8+Q-fDOXBo7i(IlZyzF}4*mvnIlDv0@kD5oRffVw;PYh@;AH!oq$+l& z!4}+JsFl1^_h-LEw^AB10vvzZaO1;D zjmBhc%XP%|y5>>UIN5+*{lfb3Nf64+S&b=w(UF78!{Nd zzy=UkA}gyEF4>x_0ZVuyN6#1wRra5B6fi9qY(l>>K{!vl5sm4iC6V}7HfG=I8qi^t zsequ8n&k)-;V=<4v1KJp69Xky>aBO|6HokAJOouKX@yz8uE+A&CSzeA#N_E#ReMNF zCTJUw_9aQBj`{lqQpv^qV4~%h+Wbs(q}S|HUV2!1SX^U=7ktScY-_r6$&G3|!ga0& ztHg%W-ubE8n5EWQ;QDxx4Qec>Q91tLhlW)h@ku;Z9#AoyENE0O?L;_yl{saCHd`*o zgKeckHgwkAc{EA%x^HOZ$N1ToGKk&sNk3*;gWNsf_`IC5c| z9fcAx=-bDss5lfbWP<3tT`tjW#p#0m)e$(NE%m}}pzsvgqzg9!+;pjxZe710k6nvf zzv&eZ*Y5JRe#63q=JI~r!85(R%hNThF7plgJ>$v+X8tqr79-=^w(_97g-6C5O&wHoprF<90(#H3l zXAtQ!P{1n|9D|U!3BJJ}%^w9|Zqb2M45~1gL>pU@?Ep3fgOX#axu&R>Y?e&&Q$^+8 zkAS{(`MlcnUw(^OEGYw=m+iJ$VoFLmS;ii*Sf+EZQKFRIB3fG6sYfBG=qbEhKzS;s zuoU)H(kV$GRHfc?8CE2wur)EWo*6#ZiXx1iDy+n|99 zUHVeig^5opWHb^sd(%7zSP@Yl+UP{y(2%oU4pI|&@BjjD-`ARr3Lnyxd! z7+Wt9)Jke5I{N)8@lB{vG8@@^@oSCkKSKL3+mQz}Ei%J+(Fe1KvzUy_ zFf`IQyOjGby3S_M{&<&OxBwhfMOVx&KzQQk=P&v8L0~Jm7xpqVk%4I{M|jOduEPD@$_eqx8%p{?5NOo--i<~DE%(FP1zK0hzbpLP9e&tpBSI0*BKu^ zy*tyVbxnI<#FB2%&|G4kcQrlqGz&h5@3iar(gv2N;iNWkdFVY~g?yrFhGj~lq-%5!k)@7GkyWR;d1$8f8 zv1F^Gn*GGE8xwPMP8hNvEjJr?6^9L}Via*5(N$y$`m)>n0Y~Jdej43r39`c0HR3Qc zZ|pdMIFv|uE<<@QEhb!CCx4NvbE_7Ia)Lu?WmXdAP=d{KyN~U5>%(-e?8=%l z_DE?ST6LvLLVF_Sl8H>@3?gnU`_}@YH6eOu<{B6gl6|8Js0=zXAUAkr9Xe|K%~N2! z4aYt*q31)>ng!tQFW&?d0!n6yuf93ArPbMf!i|L9$f4&$VOeW#X~B}_NgF-WI;#-4 zd)FHLjxgG_rz3Lr=t@m^*36@6x(<*rNW9>etpE=PfWo0C+&CUl0%3zBgv+0f3M{_! zrSWh$5efGl6gu`h>n?9+NlfgoPhp35NQa0r2x%08Gl?v%`YfkNJCq#W*816iLiy;V z0$E`CI)ddTRo5_nggdE+$(NM!Ht0x?JQ~tcu38)?ot}2=I7r)z92TdOu|{c2XKO&9 z`|BoW{aZH^Lue)=e()E(CL}qs5pPVc6M6jCLuyEcDNIP?e?|o44~Db`eTlR6d^OgT@}P z9f7szDQaMsR@wJV5RzSY-X+FxrMYqW85E}Eqy<52IHrNlD)}kKC*uZ)1d$gtcGMdA z*EO`sO6N(O_en$emj(@83}5#F^{$Mda!Z!C1e!b)9SPkDG~Dhu-6Pp;UX%`dk7W7# z(i&|-93f?@Dp$z}2&W5Y#TkR6!yIPI-;14hXI#1A?^V`?{|ZdjUA*mv(eN*N>*B?Q zno_T`dH2`V2v2_8(869s=7MAx{A*6k98UGOPk=Nh?x7SUGzsUjs+W7p^mu=Fz;AbTF=7Hlju|6f?=ChPq)cU-xK#H^GewC zZ8-_9;xTBt@PZbPWd+W05E+D6?0dH~n1{?okyc=y_uOgCy(K)5Sa6L1%eDJqV~xo@R4Xt)A#Zk8L^$9jR1yB3OX39W^>Zp`Z zbxBn?xM6FYU&Sl18#vQAMI{U}Y225O~oMY;maf$a7-&l<57=L!Tk#2QxNvaGD0rX=7E z?K>t@SkzG7!d1}7JmcXiL);hkEk=I0UC~8l-0A?9L|gy*YucN>s)C>|cQv~ndfxPd zpU!gVyLPtduRH};r9`mu zWPt60w?eQfd7`j&&4FZ@vsx7N*0Y)`kBAw`=-s87i7J8UpD{RZ!11Z;C(4{anCaEu z<#S6Bx0OuHTfSp=@I*D`iux2QkXOhHkycFIZ1Ff4qDAbROqdPBmsfi}Y@L zBoxg$q}XW?uxveN0Rmdr03WXQjYW!qMf3_``cGWCfQ2rPFcf^A}H=2_#SxMgb zOp10t$>41sVkl+DC-9jPp7Ad`nRmOPXsBnuqRXkM{4CoZWJq6LD>RKUe*WVP~!auwEO zD`q{rv^Vh+_gQcC#Q8d9ME+^Ie=sJ6Whh>#k7(}MSGFr7g~e2 zIbl&bQQ!ubUq2LaC17yKi#z!_`WQ!z0vRz%0Tp!V;o)(p%UMFZKLg2SIq-P6Zx6_1 z0qcq5;>xL0f;Uw5+IV^b1r%;3s0U0qr0&kA;Qqw|uSG@&c3hH2hC1Ge4!uS2y|b4n z*^)D!hBQHNkRb0aV_54At8DoLR^zSqTe8)-^#&9Uov&y@Bg~I4JMVs%cXx|-2W|7D zykiuUU99G3@i8+5YhFZ`hf*#HuOwlBwX+qUO{CR#!>cG%v2TKIMt-T4OEmMDbf5jV8kUW=grjO`)T0C4D(K-7LTfpRj(GWj<3E z$e|}d(Ta4Wcs*(tfcx!{fsOT`Xh1fW9YctKSR4PvY2=B&_hNEDD#TU>9=X!QT1?BC zEu+O}OzAzI4P7PHwu|P_ul!1N;3eT0cu6>MkB}!lv6if%mu)pKBAYXh4i~rY2@6S#|Qm zg;LXKVC;^%RFQ?TKM^#T>JTFP_lbxPEfIf#zPC5cJ3k0Ol|CXL`a6Zrj?W;9VQlk% zbfevmJkOK5zAGmn(f16j(6izSL=19DJ15F=MpGDhk$$Rm&-#M@#uoB zC>DCW;J=Dy5cdjRHT=1z3Vhz1beX07Sfk2Xap6^4(1mbl)vQ`bbUNNSz2y{Mzx3bf zSy+}6QotEi$?$`(*Q@`X4q=7O4&E`cQpKmpDeY%e!%ZVO2`b^9`;DGI86^m8-QNbM zEt^CJFgjAhGRpxm2?5Jk4ZzY>(OA9LH_NabQ+264c-O+_es>l7zR+sTcIg{=T)a9c z7MGW?DJz|%^~U_p;Y7C3P>8$P+p4M7P6Ljmq4#FUD+y`mV?YSGB;ca#fvxhYzXS!4 z`rmgX^bLJ_s=16Aho`U=fbO{2=h;=4kXX?wr-0#yweIiHkOg}OxroI?yUpl@S3G|_ zqOMMa($pm$_sr#=q9u-c33|*{&paPM-#d$m4=HW>>nlL@?AF}>g$Kvwa+F}rn2*pa zP0nAYN%A5Qku3bTf~|RjlE^Da;6EUtY*3GYCU(#Z^}zSTpU5-`5v;b>wij$5rE9S! zkjxq!p<>i|wAuw96@q`c5m<7!bDSO{7~9wRyR!2`GF(7s#=X9A1riBiu<88hfg%1# z;*eor6O<~uJiB~95e`2=>IQqVHxB6=92sbw8sp}znzWTH`Yl=ss`m$WBOP#PPrN0p ztmxYo+#m1<9vHrrO*F2H=aWUTu0d8SiWa~D4>;*DE8V{H)I z{Fn(>YT|XN&H)zIs+f7oqyAy3SyJ3-4sy?xRs-r!cOJ-A@#CmhZBWb*t!**L9a)Rm zG5pD`e^hNVa&n4TZuy^k*8dh{$^^arb#ylB2FPYO#uZT2Oo4)&vFMdo*;ly7wKj;{ zbg2mZ?`;=>4~E^%f9;RAZNF5lutpNnq%R&LAc(S#X2JG38(84_pA%_*o0@@(r`n*= z9zl<@y-=K!FvdCCs1EWfhkj2usyo2HMl=5=fX%}(=*LJ$rbzo&wjCKpguN^a^SnAO zeZ&T=b7w$5&R0RV*@>TW_`v-$IpM05EdI^v{vVV@F-LQ=Pl0M;G_Lhq_~4J|;U=WD zn0L%`q8xf!Rd1sS&h@M>$+SrvcpE8{lbGHhnQTE{&j*1Cban(>n?UB!VI?8IW$cmz zcC}(L!CyTSUze5tJuD4|FtoHPpB?lfeIXpga25K+pxbqNS#mo-q1ok`dr;L8dZv9% zmyajGwgGoN;qr6v6w)5W9d2+k)HPw;^*3MEQFQm_Y8G5SCOlK zJM<(v-UjCe$p~V0t>26e5S z`TGY(<4Pr?bxOotBXke<5UQW!M4p3@ky@Oj*j8ewX~;I|#s9kUr3Hbq3_8(Jk#d5P ziig$pbEChTEOLEDqWnoRc$cszP&JtoEniu@rl5)a>m0_}1LV#qMz>nhm z3|goII<|0|03}#C zd{t^cF7fK3`A_Gf^bs+zJZ)h77B2uR>cAs|Gt4mbC zPcG9uOs`n}GPR$7waOeTlzDc*(@;bWoqv0=UJ^v^RqMQJ-xC%-%f#}3N;C#BAv$6N z|Mo(r5A(yS&E2}pJ!FoWC&lM^6I`09ghtP%Uvz^!b4MI9J!^&32!;uAUBulB6+tr# z+zH-Du;HEKyox@9nekjdK;Mfj_D5NyxD^qa_Uem_OL(EDI%cQ^3T3vMgR9o=TQiT} zFE~eMbEh%a_7<6ejc?9J`pPT5Rjd@XG0G`FXVL#h3otn}=42>QNXHTgjzpGI>hecH z?P6A2tkqcLSi!T6maPx!3q3mwsn`FIAX^@G*MqJ&Rc{BdZy?pK96l|#Xpj^c%S|2W z{&KKvJL4l_RZrKaA2(PN&6_1VSBn?jyWeO|{SXcbFl@qB)GvfGUi@B>X#b%Pz75G^ z^^`1scM%wl#w{A`-&Jg;INlHv+I625JDi5g=ow&6hpU!|<&V-SI#B?B?Y##^TK(nv z7)elJSyc|^?9nF0_QXW`@)y7JVQTAISB=f5lk%xU{Ec**8y(4aW@BYj?RinAJAY(j z^&kwWpp2|;Mflomvh;wA7ZOr1$C{jbwJ4KTa*3 zYLE$it`)vf_{-n*MP`j0rCpb++^S1;#J>rNnBMgRYx-~d>Ob;M-u*uV&=bgR63U-f z_vG*9sBwPvaS@MpuUec`3^O-3Dv5i z;*(tWV6IL$!V(mA2@4u0qKC5E3pA{)?oiclZAn}c^SgL4Ho1c}_zO&^{It`P<{ruw ziMU7HkY?gO>Dn-v@e{xjPkTY$?{Y^X)nPoTzTQ-wF1NLf)nr zcm>GOK*y~P<66iQYu&UPm&xx%anPL)K!GdezKAn4lrb0xQXz0pkktm1ha5@Zm5<3# zGws36#!&rDW*xByEDPU`C|d(0T{u!v@<3#jg`iCvLuZJ- zJpu621$jgm>J5=ymj&FEL@MdGq_%%mVzQl=vFYC;Bw?t$)p0qs38i4AzGyPu%#5Pc z;pS0{_K2;J!YOZoQ#Xxb*@UYSa1Ln8uv4;Pe)Fij7@H2F;`uXt=JmLzEAEx=-TRZj zkEmlME;z-v=C5^cob~XTB$X$NGk-5;pD;tHFTt4ev~gDw@`nG*3=&c>f&rdiu|2jX_ z*lElJ#zk@oCf38#c#&$T$8)I!VCsTAeI=#&`3I5S zAI;f$1aG4z`M8kv>3_dz>ZW5Qr9wm4O2%QGfN9ExB5YI5==S3b7CU?@$MugYFiBiI zra=#cQiwBP)5<^&w*GlHPVag#FI+8w@r_2mGlwIteLb+k$E2HJl>K~lZ)(#yn0KTr zOyo(bOVpg=3HOw&_>gB#I0CT?eEg>;_fvG%(zhikemi~dw*}utvw++FV;rEPe;@cc zY1r_--pknho}KkcSwPkFZ`v-8eTCb>=-*&j%{}FwUyvA$9Xl1rq|L5+G1jU-lgVWN zEzql|D*IpletM&JGpmq6$A`ZjOR0En$dMIGHkcb3(6_${bJ%%V8HGv6o1P!?=bK(w zIBUcasmrWG1bo*TDAR?Fr&R-ezv`y5ncB?U>IM0RO-Iy{j0!c;K+TXX zVm&vgm;b1+fh?~-6@6?3A)^zF$#W;o8*7$lU( zt%iS@37$FiW4<9B<^^0#{jTU^75dyA{q2sCIEt;q>-Wcdu|%Luao=d|sY1z$G5_K4ehiF%RB zraqi8;e2${@l@)&Fy00zKkfp%k3q2Hjn*nEHql(ZKdAiNI@X<5py*TC%{Omn&&mLw zH&4T#im-*+cAa0hLA45dPzS#Ab}u1=s$MGLXy*#q_|u-I0x2Enu^kvQQh26WerU8QV$F~HO8cl_T zrL#qUgMH^EMX|v#VfA{+MvzTUejfe>vFbmF64+3`qMU?SFWIsM3!XJ~V{J%!W!Oc& zlwWhxP|i||dg@?Li=3L3L^^D&Vx&z^jC1p?bs*OC`~%PWU%ZS89JQ1IDIf!gU1%5) z5O@sni0tt0X#AiE=b6c}>8&Rd;0YxNUJB(Vvh+g=^B!@A9%W2%f`K|GN`=CViU;Tu zt38@5sJ4LGfr{#H7ZMxikLr#QEH+ii12;ge3BdSNR7fb-*zeE%o-v_9xoVU35pCN` z?pYG4-xA~Q8=z>;M^>X)3)<7U>C-GoNL-(P(5OtfU9ba-=4W&VX2$P?0rgwD!RVPZ zC`=1Q7{Pk?y*0l_akl_Gs45nL{)z4QXY2MLV+Ek>1A0a~VLmbYpm zwiMG2Xh`p&e%UdNN<75q2jA@(+fD8!fc3p}L}Tw?bhwuNWDq zWXoi?*Mhy1k7}ygUrc+HRYVUL$5gYE#I|2Pbu*0C}_nI0#7 zPOa3$;4h?GWZKHSMIG}ux&hpu3lj8Kknx*6!DDaqjJX6!pvQoMJ(CH_@C6Be6r1P~ zE@o%VK9XhLXYA9gX|2U0HYh4QcUvtpwHKjGx9CfBkYY)Eb zMyW15DSt?`$k!+!-RrI>K=LWyH{Fajl$G=18{|$*_0iOYybHWK5(Kgbeh57oEZ~8rlyz#sx<$ zE8%oON)(0Z`c~5R>YPP-0vcO6MaDb~D-=T9TzVMro@FOq-)0>?RiO7u(Z{(O?i6VnJYEo zA1n!$XUA@|jb3-xqf>KO|Aa+xjYc!4)Dy+H6sL@4C%#V@g{HLK2tm(VH< zhiuRjl7Wq-I)l=EmNL<4p7G@xcJb^X;EwolO#o1{bb~kXcu3`YC-2=$RX=Dg3HuKA zj?t2-(6CBszYr$1SvokB0M*`e`z}(zI#5o|y(=DAe?+)p+kpGge+l7wRnNOi=na6l z%DO)?I`6(f7zM#VFXL8jr4-`Go6w^76ACz=E1vy>=3&nI^FPishc~#=+~*HS#k2hz z4mFs<2PvE)2@z>l7dmcY2~&rpbeCVzxCEH3Hx(<`YI<(!O(oe14x^rrZcl?cb=p9f zP{Oidad?$I=|s$-0D?#as!Nt+a2p#H9u-M61Zr&GnTG`Z@Y=O%9$2?ll*Hd}pVjsd zpbU7Qq*|js)%(t*S)8g**50~#v;Z5y>kKA+ZC-1xWcgib2k6f%J?VDg5iV8p-kMRc zebfVEo(0IetkTjPPda?H6T9DWAkb=S1bufFT1$kup1m?7i-~LSfoN6u0h|@2p1+pK z=kND|B7zXfX)3Gm=f;E(Pys~j?BQnuV4}n6x3emct)4r(ubzHC{G53GSB)-mNw0Y1 z=bv@QV0rP#Qqofa-n5a&TYip-eS4U8^F)LjG6FB4PHNi15O2^BY@QK}bI|q$?8b@V zs0SIBkT4pe)&7<^-FQczy-5?46HAV>kIgs4D}N=6yXoE??NCNahz6CfW71*R_SWz7l>)f#0s^8xH5{c9({)z~@>&7c>o)wYa+qUffu(`~P%N{X|a8V#jEFeIlz5>>lA{(GH0%c~>VPwf*KvH^I^DCs^iUje-nQlkhFcTKZ7q2cw$`&z z=5fn?dEun>+4+|GfG ztoDq1eAI!rE5Hx|AQs)++&nx0UIxo&Z}3@9{x&9{2W1NL{Vaa}8Dx4_$v7*s%Lc~2 z_DJaPULS1MY_dzrNrg(E4F5deHhTJSE@)i$$RjgGTz3@MkQfjFqoq4m++&;hwtx>Z~c2d>M z<#NHXsvAG7Tld=#fyhyDzqnIU#R&+9ymjXZjr%%mg*WXW=3?oq;~QasjCDQ3k}^Iy zl*KLB*aKjvr9JSLTwZKe{y%;S1MJ3txj2C_4EvdLEXxTsqd|%t09el%ZgRkWuhwXh zXUBhQ(o}lAnUZXY4%_JGFfx}@&qEDLD7re*Yx+RZMsqCUxp0V{Zw z)ms3;jgVYAPVFqflg4AY*9zd$ajBo&@{aJ2+Evc^4{PZVk60rwt-Vyv80uV)+)p|C zyP&Ig5R&joxo>gLTLTB4TCzMbvYiE_%Z0z4#VkzQF6hyf%a$X%$CkIivz3bi?z2Ck zk$~jZ5!Wv8+e8FPQ{FInfgjmjefbdQA#%<8)?BFhSJ%K$a^?dJd2?P|ka=^Cq+4R@$+!=j2QA=wp@Ta-C^%;^4VS^)CS6g{swj;ti2G;H4t%n655z1ET_G}dQ_qQVcB zae#*kz(l`(=HugV7;kH~ua@J6RRFnX5lHWtzrYig3qrF}dI)o;6y=LmvNX?@K9rwF z;wGUz`X%a3>e7cCEnTrOE?SG3m89yHHA`EB`!4}Q*e3bS^d1zp3zNv1e^{g9p4Q{+ zPb<$~&Yc*3{$DZkoWf9>*BqMwPGIR_pI;1&U@?K^Vr`Zq>Baw0Id1_2cD2Out=pWJ zF{7(m+~9OHr+7wD4xOPQV@HhoKqX*00JdjT z#)7v#3eRjJ`>K(nqWYaZCeS6MD40pr}s;(qI?9AR@%v6ZMz_i?Z?ksq|9f=G;w-OeSZ8VM zjv0vXhtAs%53X1A*A7)sK;Ydrurj|qw!JKNmiKlzV&Jm03N;1iqambQM%SnZ6am(clC|Cs9pt(8xnHx#S+?%9D?zw6yf}SFlqa3x~dx!^&w?T*OJUkXNAMiP!V4 zmn+I#YnY~6(}pA?5o!f*Uujt>bHt_G{R^!4T;HV!{z!OZO}*i05p|E-@K9d(r)=4P z+u0qHNoV}z77hsSa8EV2Yv~JA3O3BWTG7{+j+>TF)skE z_5c8*Z$PMz^4YX8Hs%2wqm=VdW82-+(<&H>jR5zuvGrv4)6-|alB;u52#y30?^jDW z&%PP^7<#>ZENkK9tSrf$uCjx*zKyX_p0{_k(kUb9M2WG9(+xstRkJ?f7 z-=praDGs-Ke3sD+12;lLUv$lrllEjuoXj~_mKaMX$vX>KWslgw;FK(YN&lL#U|WE42<5+?QT4H2=KMi%0OD4&0yBAErF*24|Hu3 z=60YCO=S!QXbnEdreWoEL>+K40an$gd&KYjoH{r2{je}LAqmi5UDDqTRPrO3;;O`OVdo>V{RH4XrxQvOyCfBNvy z%)UhI^Wqzjx;$jHcm1b~%>{^R44KjGWSG+CELkD{*gt0F%Gd9V*GL|^MD z&GjuU4Q*|wBe`;3&(~#M*E{dbUa&Y&E!A~n`lwn8j1!n|$g_)*k`ABMfH?^K0B5U| zn()|dz>J5^KtY*xSSVo`Nkxdrb|eS!07eNfl*;uN{qF2+j4;OFg96(v2qQ}t zRO|UGMdkV^ialqE4XStZnTd1hb^lnU=?h@p)OO4dF&xIAP zEIpb*cIzfs_DLXBY~P5aa8DkXpl_jGi;WXTDoJl23;U3}!B)?}FrT~E;reo8(yxEO0x?A0-AEZD5+%{1d!cc@=_3Adda*1zSZIEsmaT}-$7bh8ZRu&W6$NKUF6O_X^b&UC406A z4zJ?jeE!emS7Rt(ZBLz>K>iNujqrSpYzO8b0O}cbJn1U@3Vsh=D|#h*MSXO5n6$Xq zbRzQFz0fjLL-l0$07D_Td|qO<&EDJxb{4E+YVY|P=n2e1U~U1!;b!N?nhVI4?XG(&%3oryH?u!GPG%&F=_)Y&7vWnhaRJ^-#TJCSjtNi)7nk_HJz1(Ab3Pm z+1o2&_L9+LY^Lz0vqS)0i!xT-e>hB*^06%yW+%-ds80kGkx&UB_ZeDhCVqJ zQ2(5< z23+4B(L}Ukt*oxf|9tO7lpCq}*GUOnV};5YI-HvU)fZTcYBU+C@y-E=YFRXqU0&56 zJqMCfmwervCS?~2j4G{4!cm$zsC4hw*Vh47B@h$Z;*ekUn^c=`ZyF$5AZa`UJpo`4 zf~?-leW`+2g0#F^pWQt?+#ry{+wN|$#|2U{GDNMaJE#YeAld%XejsPmHC|mp*<&zV zyxb>W+|i*;+^_KJX9uc6nq!qvEDsCOILIctE&;Q&_2V%3(Miu_p>Ymyt7uK97Qhiy zB=u?Iw{KNGx1J&t%|ogp$sg|li1^{Gl}bZnoT&UJ2H7Wrw zge$Tj$-^9HI321*B3H@#b?=RddW~NNn)T^n`w+N%4qp#%i!q!1)S~3sU3nf$dl=p?$*o-9|`rSjCMAh`UGjMLHy~<0|1GRer;mIxcX4I_G z#!Dg_dMHzWPI#psY)+QdCtbP(DIobgZE}Y|lj^&VIeQ zspr)H8YTPkeA~v0Oa%SaZ@#@iCqMkT%|u~ff1>%}ujn&ea_K=!aZP|G+ zoqf>yvT|W&koNpL&qtIFmd|YJCFR-PeGFE%u^=NRDmBcUIO`!Pycmzy!l(#2{Ij+f zFjfUpo=GrzfvstS3*}DJ^OhzHzzJOG9f~!TEb5`m0jO$bV*KX1+7MPwXvn_N?BNX% zkt=xlU7BHYMlONAsPudocLk>mSa}S>1Uatq%0!F=m(3>6rA|Rao1^4#3kwAgCeNNP zA7v4Y2WvgR)cB`Q4-eO7d8D1sY&TyxPwf>xpAE1~smjZmm82{@?l1cmdiq>h*S9oq z`vmps6Dx5ltmf?OPJr?eg|FWN_xk4M#zuF~6^!Q=Dgfv>TM=-?1d!1d^oHh#Dt&y+ zweNw%nC50*jVU`X*O#@n=WFJLr|vQ_(b1hQDzYfMs=t5l^b#{{yExFd^^k%E28vty zBGM3zfn(KvyR=Ld`mWeX)0RTrx^a?S0TPh9`JatsSLrB0^({v(u>r1m?e89^55W;f zGbQB{3A7fV_{{$LrL$B;gTkz-a4KPM)8OhXAZ3wp`a=c~&DWnfj3^L71nl@79b zGuNkB=_0a>JL%QZ)ofB@|NN4jSXi9hn&I|@=@!FjglTviB;yMujUN;16$*d zz(!_-J$Wy^+ng2-5>pPhjoPoZN`W>2Z)x3m&hVF(hL#2V)1=ZZv_%1bo7=@{6Lq)s zk$u&WuG?i%5h?Vfy!Bm@EA-3uV0xj}@t zX!Vm7V%cx;BEW3N<{Kxaw99kJo3QV`8+|l)Q@wtzxTQ{B3H11DoFwP4r9+qBz?m&a zo|Thrl8DXH@9eQ2EnD*&^gD*<2$26C|H)3E;MIxl-Lr7R?{4Sj_IP#m^mK8#3xEr> zR#!BeQjGMm+wpu^&&tCdYO3(Ko5Fam_My&!1BN61af*S-&p6)Uon*$#yZ=YkHHJsJ zE#26*ZQFJxb~3ST+cqaQCbluLt%+@0lT5yzbI*P5eBD3$M?d?0_pV)Q)v8)g6I+ph z*|KS`=A_(qs~*$=KKfDU{$qhM@_Iv1zQwvD~l$p#ahGg&aOoRgy`Gmspi*phJ)B+}{zRc9g@ z1aADBn4RFjuRIi10& zIXOx3cnA)D{pvik+>i0XT9q#nw_Y(PARwqJn>^BvmaAyNnnO~X2si@S+SmY`k^6TN;wG)#&IbRON1GbI4YKglM0Ye<-H;r$c*PKk`wt+Sl2Fd0{Aea*y zWro^eN&shGDZB1re!1K67U$mXzb<1fw)AMrlog0N$w6b86pQjY@o)QL^F{+2Hm<7^ z-uwiJ8XDhxCuesZPWou?6d?An1c!X=p{8PeiV-KT8hh!n>q);4&YUy1S2YAstivLD zrA*DTS@p~3zcIgmJZ}TQKVSwP0NB01oMO#hGeb?OUQg2l#u8#)?&kpL9l(wD8I0f1 zqfm!}B^=tmL%1(|um4Pt25^x8JZtCme0H0v&-(=xN+AHlXOCZdacs@G!Zj7>cain* z{nT!gL}_ps7?~bDr&>o}e`c$RzprCI^?Ex`PcPU1eI=Vc5g6Ef1898c@NlVE5FhA~ zU;vQ6xOG{e#+j^~f1S}0?7LizN5z@~d@iS^Ha|Z02llu9KkWq zH>~KcSHyiu9|QG2#!0!`ai-2G0{sqry)6d`k^JW%#HmvpP>Plh{kxP*d z1JBj=vytCgzmP-fGt$1$i%V}bRYw}s`{!d=caOjSRv>uuN(_a7SLSTa;!=3x4BMW8 zA*d@wv+a=GCm^3(Q?Vx?=mB)juS0almc<0KeFN1o>s5T)b@gH~uX)9F{v8OvkJ~O) zlzdxi+|&7MWF)+-3@{1m8o+9NSV-PHX{up`U{`5F77CwmY}}vbRs}>g@dU#BM#_0R|Aa z9vAKtZNffh>Y_d6CijRkuTR*OA5cEdS!D0^Aq~JX^uUMQLZP!I9by}2kUW5Li z{C}?!f#eO<+E??wyK3aGXwFu<=N5FsPr#SPUooD7Yy%9O0xK(R2^MxeE;8sou|G0W zq}{$a@d0wA=!xjci9g@-%5%f1wpI2c9xays`y?C#3YNwU<$^26I*K?wGXR$g;O79h z>~9YMnBG79^NwZ+yN{{dZYSq`qZzm_BFDaIXw)=cUe)}(Zhd}6+?O5UjuYN-wwKxx zAVtxdfeIlZjhghXI2*bZsnMaB?$raF%I;^|2Tj)l(~**q(u!TDGs@MO`>U%O=O}?V zs~pQqZDdY}Mc~<8kFJxW%=L9Z+6EXmUj}#$$MWSOq${V3ZcZ*zQX6jAcJ?F4%0Ot( zSnQg+7y$OJy&V8D{r&s^bF;lXU*~b5A?tDKXZO>Afy850=9aiF91lo`N7qIouCJ?z zr|nyAPXW;r5iuUXPxJutFkjzudV`Vu`aFZY5zdaL1KE+}Ve3s5PYIXBkAVRIwE?g< z0#FIzIl6%I80;c231zXsyEUGKJNN3dzlVnhz)pZ59)Ms;oP2%Z8|S6oQ70GA5fv;Q zhgV0#aUumtl;QRNxCp6Cp5uXeX&-%p9YJa7>MYL~k7&g}-O zjdq`YTm%e{C|I+bo4R=cTS}wWpFe*7)VBxlpKed^umN#3cGrpQ&Mc~}mT)cX5S7=C zH0$dZiqqGzJ9a=w5|##n=iHcM;V`0pQ-gYfeu|w@{92nypR4h=$IIYP=NdDo0?mEQzE?9#kAN=#6g^J4Dg^W}<7{Psm*8`n#pF17 z@^3;mjlcnBG!E1pTY%vLStN+T284Z-<-KUG1J{uNd<$m^2M~`P=--mwQkvvt0Vf}T zbpfaEhmR-zyZZxN-13lPi3QYj7`}L*e!M?^(RPo|pJxTQ@ZRuv)Hdm*o`Z?!J*sy5 z9L>91FYx0>>v5D{b5l)MFn*ZJoZqFnm&P>!Do0-Jl-> z3^)+toKbLo2|ki$g99HyZEX!8YZZHZdwaXQoa)g1eGQawMlj{gH%a3@8u!)RxJ8qF zT2Mw+b0X`q#7SHamH#AE5AVT&4^Pr+24KrGFfgzVUb}d_US?w&uR=MN%{sZiJf2AZUh#9kJr9IJT*L&#WO<68%pZ0W|MMFS?u&1 zdF0AP_f!j$NI*S2E~#+>14@KfkgreYKOt0x(GxdC7a0L}&LIYn3*Z*(bVXaUHWYO> zYQK^d!olSjY8g81jrazb9S_*hKeo26w%o+uSdW6VfEGC={PToY-=vx=E3LU+665#j zLtu)|JtH*l=ui>?MGC+&0K6zbvEuE0f38s`XzQ^FL5wq9zT&V}jQ=qE)aK^3jsWE1 z@4xNr31LkDtX3rGVjy-~GdzTCddcz$*VV0Hk8ye4J~s;-7p#p{+7c&wR2XM)cE zI~I95Q(+kKnU^j+iEQw$1%h0~!#`>2w=jr718m@p{Q>0=##)B!hpWB2evXQFeP;$< zT?;aMJc%J|XT74b-ke1XTI_CaZ)2+kAR%V>RuSu!dQkC)n$3F3X4paE$<}w{KtU(ZSKNt8FFiqv3Pg z4}Irrukc_c6eH+;^7jyeu>%KfktQF5DD14!rEUevXcCkeu-f z(b>SY>hA}PlUI8@I(qwA3!smGogNrfjM#!qQ+I-TD-=$Q07G@=ImLeiKuA0V+)kVq z;V98nlhfMBYr*6lZ>NPryi5sT{jQ1W-xOred9Akp*u?&eKGwyDS1+imop{)V2n^7o z*abO6Ga5|VEG_)8F_dV!&wAS0uuyA%=RGinBHCNl1lvK8E? zho2gxIv) z8MRbHi#z=qTM+?Ziu%~$xix>BJ6Hnl*3^r;eqA6in)!q)mI=F%x$maW2Y&CEO|;`o zhX;wdS|F&h0=kSaxmIQQ67zv`B}p~(98FPKtd_Z@IXyW)J<+6#;Q+pygRwS%ZsL) zD8*&o44)&0XcqIjlUj*vfS9#s*S1?fVGgZ%I;UnFQITOz!9?+bQpNWyM@yvdP^yiFnI!4OsWD+#}nCazTC#`P|CNS7E`IY6lxw+2qya=A~?Tr>w zw&^dl;%SgT4=x#1(bj9k>WXziTobnegDGtzToc#uU|uWFCds>3Ob%M+3sfcLnM_v1 zxEbna|DW>jOr=+rR+VIgH&5L7F^P#HP`&ro6{BWMAatP^ zoex$en)EQT+6WL%;=#0Zan?Y#S@m(wQFY_E7`!j!(xr^|2c?Z_MGxlyHBl9k6VQr! zHS7FB>-zL*Z?ypu57iKsRMYt`urPhsd`Zs1_Vwj~+kH0NSH=@n3s(_CZ)<~$-Pt_? zI>c`JhcRa{_gc(jlLIN;l~JdTojt8T2vMLFus8d(+Rw&Gy4hj@MlXEiSo%mx4+!$- z4{kKBZcBFLKjWKVfc}J!Q`SnkR{4jm1fgsStq;}@78$o>HKI`-B4O+^=}$oOphV^D z?sjkt+!ZTC;w7P#v)eKA4DrdE%F z1Tr$jDSO>5ZLns^Km9P)J*C&|*=s-~;b@BLE#|eI6{bGL+k(l0baC3t+Po+FNOw#XNn-zi9_=N)f&>QmTzL_Wqp`9!PbxHn@Zp&b{Wj zQPQO5WgM~00Hv*_!}H?e_+jBVRLtG9J6pzYojL@Z?`@i0m-EFAC%c zze6V?seVbZ>5E~Z?uDUqBh|=eKYV@FdP(7fz@Ea+Tn>sCrLq1nQSmP-N8&c-YXF==E2H zSLiaDg$v<+8HmYcNWIiOpPGReII$)PdNx_^sD8au3kk(oak1P?kLB9jCmF-AiKgdZ zwJO0Sap8Tqp@r~Kz9%>B36)jQG;%kJ%l-%NymBBu55qj8G%eq$2<-?VJNooW1dlOC zTUiq0WR!k&F_G@#zU!bYENhayNAB7@Va^ZPuOL~aDeTctuA@JDFZJttPsoz3sZ*f} zT-hw6w6ob>7oifgZaYt5V#)JWBOGgguKpo1LH_tIs=j5zfW{k>E>W@WWmA9m%*G5h z#7w$e3yFJ)OaLD@I6p#K&QEK$A7r7Tjd`{qB5w3!vwe~V6^QvTBtlserS#*%OvwSN zRwnEd;_iGVp%@aeB?QeH=3>n{Y04>mdDWW7+Z-LKiMF4}Je4tQ?2}KPg%aI0E=IR= z#A!%hxd>(|Y?t5$;<0GH;UeW2L5?aoW==K+{)NTWQIRBD-WZO2rJjg5C;~bgxN3OQ zUeC>Zh&J^pjH7c~waW%tYSP)TkD2C;-YWbA>&S1*$I8D5E#b;7pmLBRyrD92m7QzWw?LimaJifZS8>p*SlK^dF3eIS|(8n z0;x~kD~&BG$KCEu%SL1hi{3n|fA|V!cM!f#)h-TtBI)=g?ro!8mo4R12nMV%B$Qn# z3H!b$km|nuf>5xF&r|NjB3ov^Jk)3 ze^~Pfg}`m(oeK#8-ysFObvkHh_?kyNeRJ1pr*{i{7}eWDBbZj1l<7Yq?q9ND5Zu2P z(6|rVP*h6pCdxKn(_j%4VQlTgehA8oLnz0d08D>pS-~uE(9#|EsHPP{&7m1`7dMy8 zKEW+mKT$2}41^FF(}DB*f~j^TO(a>)M*|kOSk5^!Rfq9S9hMa{^b3QSXP&#nuSQiV zxEms3W8|l5(X|s2BO!$lp7d1kJa>N;7YD`T#3Bw6k#XbrV$s-^zAqcGOwT@8eZ!Ff z9g~@{sgVp4*6<)Q5E{Ui<_s`+^c&kI)%h|hTd92MmWCwfxb*GH4tYre z3vkUV?KXy7{Ev9H&!IL=Yy|T+C%fq)(kuGbuu@UrXOIT> z)1>NP!&cnRpu)cB)>tljG5*qAbNz*T9b-fiV%U-v#b=G!Y)Bjz6nDM#uf*FMT}V-~ z?7GT}6QCL6nsCSM#M4-Za|2et(P({*GkiIaaN<^bUdwZU2!=vI)YH`#TXNlpVFoy7 zG(*53Wq>h&trB=l`%4_B?B=VmVYYxTT(Jl1V^!yVK(rdVbb5Tth-|RB0&c+3tT`}g ztbg|4aIox$r!A0S%U7OaAQy08I}|q0K#0e^KPIr3ILXoB`xb^sl|&aEc%Y-#NgVT- z*Ym$nHbeOfzUxD@YU7>o1@F72jqKEx3jvb14d1pTw5G6ofQJfn zh738A85M+^O-bhoi8NVeQbKx@Cfk)3(`0E#8zsh;=M~CW&C^5RdP+mNtxOTH2L{QG zLp58&9mbHB5`Fe!gmZ&+oJ?7jEe$kr+RDlj*?{4>P&QUc3jTm!HVi`nT_j$d;U#>e z&cHww1@~6y)sUw(8|HlqgzCE1VbBI-X&LZzbPGG~qc|Z5SPA=Ns~%bBf*S{P4Xt;Z z6{NTLNV0>f7`-YObh+ZS-eB`DTnym9UaL=LUrCUPpOHg6eT{9?;E6M~3FYJF1vH~# z^Sp_UURmfqAwdX~)^L|eoXFSQK|JP+B*I~09X{=FhFTs>=<4-_QNtra9B^X$-(N<- z^$CX@EI7NfJQZFNxW>*Dlr>PVNQ+&Mnn3=m1<)mzv4(J7AfByU#>sIweuHd0eWXbr z>&647*wPN!=^cLaV9hahj%+RimB!@O<*Ly^3vaEPw1cai zRn7n(H;QcQmG+}UUc7W^!uHjUhLcj8IVK>V8y$zjulCSZP7&cq*yPZ*YZ$IdUbzu3 z%8`7CycFz5Rl;0}*@8dJx*^3Qi#Z&wwx~sGUdmn@qX_EMZNmE|0Ug(US|w>enHN<@ zu|Br{tdTNH3K4!YNRGNHhAW+U5k@?^y>!|TFB-(ea<*RBS}eyKZk49aC$ES2F}JYR_xNyg_FmxL8hfMt;@!rXog0Lil!h0hv*vBmepYCmafAm z#V}^}U3h#W4#MtnfLE*`mr0)fxPAOr_<)U#RLwli0Xz6c??ykjH=Ft~F;JJ9`@#`B zDr{C?#v5SKL!p`!9NbLE6Dz`9)?+R0@h*oE3Mx>JwHU+!jMHfh2fNTklnIY~UCDfu z5-Wl3HD2_#`DRK6hQ%(R_f>NgxmG^wIe;w^DtH#p?9u5s-2`R93U4Y-43@tqbFfpwkY!_n|j6sg(X4*zr_UQ(5pGrw7SB4scN=26li+FR$?sJ>FIJT zREi0@rF}M6T^_Yq2y z8Tcq0Li=SY6tmEF@A_FL^u|UKYcjd^_>qWDb1y%X5vwt-li6+Ikqk(6PYmo$F_Fj3 zOhmO3z5py<_^FQ}yvMAhJX=CBesCAol8B{$v(&FlTm!YYDL{#YPulQ89hQ;a5`|2w zyzC>fc}vfkFl)cGu)QZ>jWI*i+Pu};?Gl;T&VJ@)-v~WmY#XW0qjkgY(9_KO%}_FQfK+)%qu5|5q5Mvfr3(K!kw7RG46eXQ+4tcFNO?IxRI$Vi_{h zi~_YpW^IikeXNJ8 z{agf_WcP8qUBM@3-5*<4eln0Pt$U>uwQ57%KX$sEH)F{!`TD>mEmxQ3aY5y4z2qMr>k)MSzoP>yL&k1cVjuYU$I+8GX6ppin!qi`IvBN#M}AuYB8(m&D=P5tREy(9-tAcQj$5YH%LS?5_ak(`Ar z%95r`(2pkSr1@#a3N63J5jc6vccpOT%UM%9J^Lvpx=x`$Kq_AzbRIFjIr zMfC#e%$q37v*MEMJv#yPC)rhx0S?Hz*?`eX$=i`@vGhsFZAamrLo%!BLz8hRs7|dC zUm>V9Zar9dp{oeEkzFx=BE&S3rQFme1j3_EErWSx8t(PX_i}!0#bsr$johToJbCU5 zw#KjsEE{C=36$^;T?uBm75v%f|AKAm%By9NeIV7H7Mwo!Qp?h)6yORLZLDNOZogA?mfk)~-_9KQnD!z7Cns^n zvtC1{V*P+ilt>bztJZFEKs_@P#c?0(Pi9Xq^{`4C0*dvvVp^`pOi*B#cle%VpZ(Qm zx|d!s&eo-HNGtGu!*u9w6#u7#I{sn%papb~pl&ye9k!;Pj*p|Gv3Ss5VXRqz<;GeU zZs7T~X*%P2VWo^yLyVh&v`gQz%U=Plp)nbwo#R9w>A9OnY^K9&J?w{2x7SKm1&+0v zwdVXfo=%5Y^u%1e=UmvrdqpOQD`9eKvC+s8HIV>w-uIy{GJPu}jZFNHxWT@BA*Gd! z#oW?D7b(=1CAI<|D{To=A2|)_N!T&pKXTeIe8!1hctMW* zuK#w85qu+ogJ$1n-18%+{C4>#MIYqgOa6J=qky%SM1Y)iJTbL#ia|X%? zHXcMy*HN4fxi;W0Hi%kEs1ftSRM0~>C8B6OIju&|Z)O0z|a z6+}v$t}`J1rv&w{2tU&Asr=YL(;`-t%iLOt$`9j}WqCQV*>!UJp`h$m+tEvPR6r+x zh6XEQ@us(!En{PFZT4iN<|Wnd0-~XQT#Mhb=ggi%(#$v3plcE8IW$nr(a_RdZgM0N z0Ta*}=m#tTp{=xFc+7l4wk~q>E7~GA_3#VZ1ep_IwN2gEfhhj0ixzSr&iZ0AM~UPD zs!~U3smrl^g6;cW3|tO~;W^7nWbdd}#ND!(gg6!4#USMtz>vZt2#>wC)M2Wc-}lqe zIdT#v^`aQn+6fblUXxLH55013V`)HQSlbxfIgmjI?$fr9f8AaF)tR(Lzc}x|Kq?hD z3$H%EvfXewO5_t#BH9Lm65Z!w^+gKi*?~aB=kr63v(8r(gu;9lxJVdF3TU-#dAC~Jj)j6{xCTWgueFzIv1u@)P#>(p~7(KmO2)RYxHh`mOz`q zZzv{1aSrMyZ>%&ou5g4~y*eoLz)Yj!7Zw-9@hVNT0mpJbaBR|c2(|1_UR^8SNt+bu zj0XNI;}!u~G~tnJ$s25!ias?^9R6%+J1NjL$s8QDZ(Y~wyL60y-A{nnRiS=8mg2$;fgboP3!JIkS_X7M; zP8mmReHrL3X_+z=%}Zp_@oE(rg2({wJ>L)DQ0mb;7sU4KPOQ-vJ-BrNT0b@;QU9dfUwg%rX9_$s+8 zEnRn>(lcHLhPDTiEL9La+yiquie)JK=tZKe3lpBs;ETF>tS;%@hWmx(OkX5lO?3>l zNguWA-a1hNdyLd`nK3eYQ^XqERU^GCA&yDzdd^-SD)kTK|g&bVflbtJ}0Q^t1d6FiY=9cVM zVi=dKM&P(&LmUFx*8$NA29n%fv5SBfwF5WKpk@p~eumSuHZmAJXcr~w8R-5qUxPSP zLh>;4Qy4af_qiLo5D1`FL`M{8ga#-K;3n}049qBbX+ll}5Jo{ZTT$Hp@TwB^HvHSQ z0Z;)hmEmV7;_ygNR+VKn9Kx&tuqG^BNIaP7ARKyD513*bQ$8C5K^n-v6|>1l`rtDd zxTz~~#D+pEquM1YV05_5?!iXXSyjm9g7)fALjfo(aJW1HnYEyzX?1c+x(WDFf{A2I zre8(KKF;`u(MJ+@Z;*>`5a6v_a>%@#ji9Y)B{0cR74Zq?S(K>WbQ+RYu97hr@IdIc zr&3Jm4NuzcJ|NOcJhErc!3uVY&k!!7R%Dirl;c;ftD4OnttVxe5~6bJ1BQlMV`k^N zA=42JmboxHn8Qe8ir>?Z2R2yb)E8#=?u&0PC4CfQkr+If%=oPLM5939{Jj+D!5@B}Oy^luYa)lz>F&1V!^&G;yP9S0^ zXThSFV8xEDcKcn4zEhaSa6}OPI^gCYvAeYtS_a3-P^bmXhAu}^1+UZ-ia8~y{=Jc& z3Co^r!)U;aL5?9gFw6FIG4*+rF&#gQqIgn8X6u1~xtC|owOc-0Hs;ZQ>CODhoB?wsmzT4J5gK{?{Z*R8cT?2gCKl6N5~2--tMs_a zX8zc1TVC?mAo$W>**^$K-DpzhG&2{7exJbFP{tJ2 zxy5-ab8{`j6zo>XP)2(o_cxou4Dz<{z7eQmI5VZOJ;Af&k`e-k@a*-U6A%O=9Y4*m z9{H#-dk62_2Y(3@DUYZPu>`vgdMI$5i|u=^rw>_AGn?_zGlAiy!sv%Lw##&dQ_-0X zhOV2b|5Q6(^MS*Q&?Z4z{)#uDR4Go#PEfU>l?7-SQDiN)vG&sz4CoI8bo)Ugd}LJ(V{%{KNJB zOAdYEc8`BG(=)!6J@>x>8H^fI@9H*&#fL0#hY*cGYGaFV#=z05M4|OO@2l@u2-N!7 zZ|(ul33f=mlPz*l8dqy`Kk?363C%O2%XkJHQ6VGJkC+8zz)RvFXu>08iXxU>gvpLkf z&`Yz zK`RrEuI~8ZcDx56V_%3sa%l-U4AzUC+f;BVM0fKK%0Ger-^%8F#ZT@H%fff?^zn-Y z&1wbV6^*NaKrg_wY=je9rKN#gBtbiM3&XEI+20Q6AYzzTpX)uM;k-+`hIin;gL+CS z`Z%W|a#%QgHK#Stcr3$5nm%^(Ru;7Z-vUl~mE6#$ZhzpQhZ;XlXB5!$m<8P|yp^M3 z*$)`r!KFId&whMGb@Z7ELKLDwKA@N2UA;5}img4vHB4+eRY-q@rad2TiX%um zi5V$!G$ZWB-ap}-;>Iy0+@BfH;9{9*MZ+_;)mCIZZd=WGG+@Ja$Y5MtQgK}eD7Qdf zrq8~c`moSZK=e2AbRg_To^2QZUeNd-VfKn9W11NTJJbkQ8DZe)jbW%sKy28C;zLOY z%e_tpUVxR}5v7#Q^MHAVL>Sru#sr76se;{D5yhw)Cokxy zJa_n)GCN2%juRld9Ut49>6mt<(^Y!!Rj5+O2_YSVxb_GUT9UQxVqp;G8rgjZCZliS z0|rFACNbac=R6t}e3DmYplZ=G1(GL+zliq8dQ)`!^jkE*-mWI4E~IrdE|+y<*NG>I z>}c@C_(2uE>rKb;al!W~a0U%W_)4$Zl1#-p75SPph1>PT2P|iV3w@OR^`aNPgf^kg z`D9c0e3uiFLir`Ph;CMI6xhP@Rd)dbW-Mz|XVcnCG~YVXhtj^1QBZ6{j(r|1^yMZq zeHqU5(oJ=*%(EQn!iZNV#i6MRZBT?Q-O+2%0VBPkP|!wFI`<-Ypqh^yySCXR8(iXM7Ar1rU&~clZyn{q4YH|Wo zJLSnj=1?F*a;QzidTpcWstl`r>7ZHl%CTMXnpN}v z)~uyf5Jw)z^Dvv{iqb?Qgu7U^eJ6^tmQInh)bajZ)u@%iC(yXI8L=cRt1X} zt-N_zp4DsFy|!2#mi-#Kz9GrgCnRKliG94ZEPCGMEd5BP0QA+jHU2Kcv1fbyU1ynj z*V1viMI8@=0JIBwQKhRi30qr&;?rVox|lq&6%IUxVTb+4ehr%zyY4)kM_dV- z`<-A1`ya^h-@dY--zN8_5xk<49{8?A23e*9nORVomR(HNbDky*h2-%<1d^ufcwuu8 zWnuM4nN?u11=H9hjfXnUb0Yu=sfA4RBZHO-1YB&t*zVw&k&JNqgUK=HDyV#$Cg{qb zAbECZ#acRLIuVBU>o7pJc#7OLc$8ecE3}^!;z#u+>XbT=?WD}q%H0TU<<0BFFrlhf zHa}?Nns^^P+*=)%hBT!V%{&;Z&TB_&ZBo|f7R!0P_HN1=fT3h`cD>j3+&hduXZwU# z6ec-JTJ#+}Zka)SoF5mF)E$C9Eib2~{0PZbu?3tk1t#!6C5=A|e`~Vx+@L$Ci!p-h zS<2%8Cgv7sxG2(k531ncEy{dUzk$FTfX!@5XQuPheCYry$zd!mWkDTg8k17Ji_5C^ z(3{4z7C7?SNAMJl?PTkpgOF_`X)X+uE5guS@7aK;!)BZ(i@#1pq7tB1b~eoUuNBTMct--p*_x=%$o675`78 z;J^2f3eBa$+$ti7DKxe5ny1*^EopriCXZ02Y|u#XGd0b4c+Yy$48ibf@C*o-!OeXK zUskHm1yQgasbHBEu7o^Sl7zm(@}>l0m6ihs9&I7hi0>iWTrbpGF)k=I1J{nxt#m>x z+xWGOEV_*nj{W5MK@K{Dh{JLYI|H4T1Ek1(O3o36_N9@e!bA-z684aw?0bP-7-n8F zIK4q1rr8{N2`-Z`9Y3_`dj4%TMV-r>a7grv`FKniHqAX~5c^CO^l&984;g$NF$PYj z)@m@qP8=ENosLY^w(76IRPetSI-j?yF!;5}CPRE8DRjZ`cic;ojh63&Q|R(RO$)Tr z)K+)Dw$vV0l|@6q6RnU)y0_83lIx;Ishp!Fj%FQT%m7_Tz8r2mQBW+d)1g zkFjP_BnMx$x?`q-wQcd1jlK)#*h^e`7_~Yq@m^%$2(tW8{kE1-JsCaviMEo;v~W9? zgjlEHrQJn)kqi>24D{$K5)v?L^eM>1yrT!^@{= zt@WB&D2-XjH)RKlJHpJIja2$z9G|o`jf07LuZkQ#m5zCtV>;#yX=*Rq9AootW<1R~ z>*Aml@2J-fTxs4=>4{{0Z@bVjP@M+*Djk*)?-xl)ZL(!G}-Rbq{THTf|J$R>H2=vdAU@38%G~ zFYKia!myYPU(HAx;}`!*k!?zaZNxss8>`Qf6n6le{b7+w_?{?~tyI6jeNJc@;$mVV zX}zoxRxd}W={YZn%}C;WXp=6@$tG&2x$6Vg;^kHbD^rpA%}LOjY_w;eZhZ^j#@E1V z8pcprVKPh`r2WrCOjL5p&p-wa^)r(y^7_GostT0HLgyzD(` zMm;eQ9gs573V-zv%pV^D#)ld;VGRay?c@HQTM_xO;dVV0WG&rrVHDw%FNIQ6F$SCc zUoC*AW>0OkICP?Afq!v3Og4pRJnIAL@mPqx7-&z9?Sy%%gsAKZ@IKbBA#vRX4sGHh z>A?fYKAY=wNl|Y3u33)D(aeCocULYson*IRKJYY#N8{>V7-XEFMG>T1?3MjH^WItW$o-a&w6RMP&8 z5rPG=DshY0E$Z_|_OI@tRG$3{>_jtW*Gr9QXSUziLTYTMy=D6Zs6G*pkWdpc=ZrmR2;E^PmHv4X6)pAjCCfWU|o!0x{S6&2*&#}i-W8SccUc1bPHfo(Ow90U+x6-+KS z$bcw*eM&#KFT=Y~;XTc$v`aY=&h7k*1 zumwZvaGGgXEzQBue7Rl`n7Dob&u^6b;7IboqoW{wQP3#melMe`Ja|lvCD9P|@$)ey z!8I*oCiw}qvMJ#NUrMSQE*R@Vv69Y!=y9Csgu9b|}7o9h7yt#GA7h^eMDC!v`&v#j`H zJ!oy?R>eGRpEOspN4U((D)z+=xwf)M_`t&Z(M^GkWM50(VqPa<4&*5!A^FQn2YQf9 zY}$P)ArRn3)3Q<=X3_1|O?0E5wmj(W4YT#<^HS=Zrsf!4S2>DTe(|h7O$(cP4vn5w z_{`=NEzM_wpXKUlS=p_ie;^}KLZ7BLjtH#*i7p%(Xj*~^>?dI~`yYhg2~)<)V|A*kCB0zJ6sdklF>Jvx`K_DA67E1Nk(Z;wNIFG{U4M{*=#0^u_x6hJ3GY9>`l&Q+35RxX{C;<0i zwydBe2P;`>?WwSf*Z2jQWE0E0qEvo*TqN*zO9Vu~pa-2mlj}EjiHn{3S335B z;IYiyhN?Yg$nk31LC7Z55mNCT1iN)F#?)Zb`BB`rIaTWkWe(p+lyIy~IWK<^#&s_+ zt`BH}SEms5<*tlw3`O0p)mzzpJ}z>GF7R?>hgNpXO*w#1=ND)O?zeV3r!=ZOHAb79 zduuVmtOT93Zs?1estI&I%6snN;QHJVN0#b&|NrDA|B>~pvr~yR2AJ@Kx0O|{H9$H5 z5ehXjAmAb@N0OuZxWoW|?Gmh(g47xqAY z)sX3o!vZE~MesPC(yAYtbZfW}?Oa&?p$W>H0NVV}GRws{CjV2Jn4skMKy{YvA>ArA zChaiRdNi*eFb8o!<4}6t32f9)%nu7cyG5vo`V*uJ-TFkPEbSi%ekABm4={&>bPkcbNHliU{WrZ%_E&z2*7^BBuzHaOi-dAVk-h5V#g@81N} z-mCxAGXAUUOac4ej9r)1lx*O*x9?{N!J5`aswA$0f(ASSf;Fd3Aq{~mT^GCJVh#mg z|47V!WKx=?74f!|F8O_zvVRrwG*DR?X4rDsx`}Nd*!ia3I|Zc7;z)VKJxq^#OvM8= zdv5!1QNBiz^BRGA$B4z6BxaVs2M584Xrfv;65eP=In5~HMpHq%a$&e0d^&HyCv z$%)pPB5G{awMM>MpBvJ`>Z@PUD~#7mb>yf_%(Nb~xXx7q=niDOm7J7$ zVT<6%S)gzeVT(!QuEu9k9-5^e98X>oN*htP$si2!Xz9x7tuIIj?yBu3VD9m>W)PUY zz^Ha^Lng-YFJsL|W@d?RClGiuE0v|89FwIj=TU3nn_3&cxys8h)p=5>B@9O(4GT(S05k#$f@pEsU4phUOvwC}o_`Qg zvP!685CcY@(AoIBgDX#}^ckecq#$%~j&_fRTSbF0$(IO>vPJ=KSB$c@T1Bdt6=kGG zbk1&*s=nRKXt0;j=#aj&h=wH6C!0G7Btj@G zyw^I*Y0}t{t***&xDA2Sn?5`JPZ@K{%0e`tJSs%;eP&+(*ky-R+L|`odx%;ANBPzT(YpU#+tf2**%F!Zi-IW#O0?E)?6~zEfPMdZxm}LVvcP@A&BQA{x3T|Z=Cnm zUcbO)pwX}A?mGzyaOZyPidA)k666>`&!lmNO`-gVx6Ray^>)5d#AFQ1321g_&o^C^ zg#2hW;2_m>k?Z=ZLkq!L9Y2wTuXFe%I#!-WDnN7n(<2{7U_&I>9p4gjKI@>>8Pc|1 zTbCh`Bm*(2YsN4J251y3OZot17yt~Bpbwd}8*p4E<$)G`^g<)DW`EU$gLNCHa5}K8 z0cmz0P+hkZ-wk}_d00Y!7oIcSHY!Yyb^aM`Qyjeyw<4OCeC$ zwP2qw%cK$ldrW(NK)vM^o*eyO|E_0C=?45-Y^hYWL|i|NVbsRwTd}i1pr79xtF#+b z$g^IBph+ir=`Y$v)7^O0*PA$5490wHp^iz+7$vFwtJxnDuk$@J9YWqj()8*!L)O#v=Ch(2jBjV73Q$_Mzh<+jfKpc= zP75ObdSqtB5zE5IpwP($7L67d%pfqpl$D9in zuy1@WYw?-Fsdr7UplR}k3xlcC?p817nH6rvrT6oQDxL3x=p0@G$S5rVq8=0wO|=J86|J@pd42Tb;AAPGTPN}%>fCZ$vjz)a ztrf|MgZssUCYL%zb};_cljiPPYN?pPa?aAJxrUj?DEP5bv7;canItnd!AJ}+b_cx(E*&6lT6 z5}z?BgvGPA|62Q~hZ-|1X;^s_!LMqZSjUgJ^cNZkB_P|ZF z*xut+A@Tde!WlAIRv(58nzCY+=t%5w3573y`Vr$=v&M~R2!)9=e*Q}24$$6u))Zy^ zgcS{UW@l{`u2`N~ap%?d)iZ&3-r~B45DBtqvWScj)Ao^r!m{%S27|Q^E2nyVcuSso z9$X2ztGd0-vX%-0=y11?EBnmvAAY7(?!bKm_S*oF`srOEFBBg#pLyxRasS5PBI2cI zx4!0UHywMaU}iMZc;h=~{*s{_8y5TBOIIjuCd^JItltSqX?#c2d&U2F%Fq{Mn~E#* zE@s|nt8NynwdTidM6WX*Xr0dU>0lrG(6iz@Bfs zW%{G85!vV{iQ~j`tlkWnDEV%|Vt$jNvcQ;hk>2dw^X}JVt;mUTp(AZesl?6GfG_8A z3F{BLLbBMPM43^|30@WJ{8>Zw4C1lVQ>OT%$4BT=7C$U(JlHTf%PdahoRGC)DcE;? zj`XL>xdwYaI1aIYmH#sme)YbPU(I>ti+*qrE@zs7ezlWxJlb?8z3jPVSs(`Q_v#i+ zky#Emi~?QD=#A5_E5S>rADWm}Z@HNU!D7g0tH>PE&nPRl_4RhF|Ax{u2>TodBQ&3~ zQOMQ5DYu}+DrlpH4i~eGuVxX`oW)Tnu`bpMhwF-@$su&j7-OsmL_X364t3Flg~-M~ z&;r!ECrxex!h)It-6@3^))7x^NZKvo+>yy6F78PRD@;I(mF|n95dNym?OxHKAlyHH zO~SAihstr#7sq~B0dd*bcUDOP=^8EL8BMYEJnwx=`+ti6tlz`DVT)s;GI4sr^aw+o zmceWl-tcgDJI=0zi278PrILy-(Rb?n9+hi-Fw_rWi>PI*@^FfQR^e)lgP`4olK_Td zVnYNMh2ge-dgkkfMD&fg(ZX^5LrC0NvI(8!T%SCAqpUa7uE&jfKaDR=3)N?mPMWF5 z9L!Fq>woT`D#y83#=dT_Wls^Li_3av6js}wOa_a(>Jv31U``~7nDk|AT(t~`rYS^k ze>#hz^Aw1{ax$;cKr7w(fx@z=GjOKExG4{`G859V?+0IhM7XW6~EiOQKB*4w{+@q)Uqc4*F2Dkre!F6%eK!bW-?uq(T5UT@F%?ev{LljkCepUyhrF9i-InU8Hf33w~x1Eb58iv<`2o z`^%|a@5y_i=^yH_`mLPvG#j`?^y@&MWC!+Q0On}M(x=9zrG@dvO z4o}$Sz=QF#$qbTppjBb0!=0QNoA1&M$%k~%%*9G^_+RErxvDgB1gSf7EDd;6^9qGH zc3iDY0+Tosp<(Wz)w8jH{@eSdJ&;|)E|l0tM5}{SKEh;RlR!bu;mCbXb@(5l1jLuU z_w)5>!Ryqb&I@4&@DRk-mn||dF(9tV`_N>VU78xq(00@Dz%)TwwN(wbyqLsj^P=am zhYKTSoAJRi*BDmG{Y=Xo%`ttD);ybQ^+$#b4-qUWFr1(|vU4n?299YsDy-As zcXgharBNw7{02T=@m&SRr<{`rb;oR8UOz+51nI5ipB1?D&F)wKLc z4}1nL4riG4_2lCLGl!K#=)p{b;3AGLxNozGjcJ=864+IY5~~r37<|yIF#*I5aGCB$011SS%He?qR0U~xwB@Cu<2(YJ*LOz31k5`iRA;qWIw)XS zv2V)QOkgd161<9oTFhtO0z3P@(KZfHUdo3_Q;}UU8VV-=GB&+M&aa~6r-o4(sHzP+ z*rz+v`L4CxR`iWUA)m`Pipc?@4oD}v$y40n^M(Xz&w_(KT$uJ$vV$r_KP%^vT@`m##(*Y@@cGV7%!AR5%C(XU zXbA=MVujv;L)3}nU=B^{3OI>~iX%gYnEzcy2s%N`?p8h2Oi7LWw=SiRDmXAnt?^+HW84rp!MNltl@AJ}hB+dQw01DE)*S-3vpm|Xl_9wc zbz#HUGVyW>%3i^(Q(AXqtv;?i5r$B$^M&|<64#m`7paQUX0Juoy%lm60@F-JmPIE# z@p6mAv5UWjQZ?*~N`btmi(ujP`f5M&pdENEW5&RbN=M9eVO`( z1F~%(8$d_nT$HCchi1bZ+;K;nOHmodAp$$7VXU^${bWKW9yR%O zqYHA&Mw7KbOa>hbhgrqR6hEjG5#cx!4PsF$SpD-TCHg&B3BOqA0ug(<{pRF(y!-bl zGBY!>_`C!Mq6z>t61*xPw<0|JRStSYmCe-~Iek#{Hd?D`@rgX{d27=YuFcUP3R zPcE#|>%J+rLPljTWY0lWA!n;^3rBbvvQ%EQ$g*wW3JZPD>L1O0p#Avvtcsje?=!Fu z;WiY^YsN!Ri5lYlP;>nQ;lEv~Z1duw6kvV9-dikYa+x24#wdG7yXmp6dC3WaD2&*K zEpt{wfk!g;LWY0nMqm;#Tlg~_6q$61@Z(vVPSIb|{GpGn3`!$-Kr3S#6-6;k!152e zhzx*M9OGAR<7mtg;7r3sMZA^_Gl)r?D|x=GvQAX+{;Pl@fGFus`>O;peE5+R$kU(A zKcf^;|CQl0p+2v#dz0byN$|b^tT)_-BKnodOl(aj0T%@5#DMtCTS0{ zmz_^k@eHUqZ6dT_lN+RDoKzVYLJYhe5Zcvl_C@D&*H(R)^1p4=CkYpx@M_ikN5|#ndrrBA4j@NS5wxm`(;}1x zQu`t(Fg614{oy0Uz?HdN{Pu_(AxhyTqNd4VwDH3E6cAw&L?Q(+y}HuB$AWXSK>(`_fk{&9(UZEZ&TZdRk)szMKXx{zDca)s_=Q)3y_5BhQ$n8f|GP)0K zz-3`K))o%7e3R%!AgPNc`{kZMXspSk)G>KsmW1JS^aw%xEN}`AS$2eE<|A~Fr!{{A z3SFIQnXyq7lVjhC7=!Ja%*}Kh9!w>~6IqFD;JbLl8o7ohQ)-51b*xS1n0p9TQ?g9W zi)jVOTcjTkJWfb)9<49O7Wjz6QGRKl zZ#9GeIO;EC8~yYcx|lj)?OkF%5vbdQA-1@H)*ogT4B4)@<%Q4KiX)Un&epRm0)FSa z2>4Yta96c(^|FQoXv|bHu>_W4&I$h}j)AY}0qa+(L~K~ThEyzdY>3#rgRF-(RHXvT zDdh$hSXl@WyyazO!ZuGJ1PHnB$A|SQiDrBu$KcoJ)@vgK0_Ye|Hgj6@#W;N&u#Bgi z>w;J*^&>!0cZBfeRkIl#v+EC@vVgU*GWQWYHV{A&N?Gr%)J8`s6%k{IAEpNBZy=jM(z=P7u7F|_TWkZW zi4T0;-#zi753Q32u`kdH@<7*EM;U#|HNBV0nQMUk*rH=X^rgu zIH&x?@@6tx{n*AK0|X7iGFH&ci9gjz$UmoCGcyVQe^_J5pl!N4JBrXWd1)XVtNr0F zim)v}UC>uLT>`1B`Yy?g8~tHCc87hdm1xTJr-Zc8eUD68GGUhsg=c@?Mv;t+$~fnL zDUk~j9#IairuLOPhAWEHuoi1{5y?ftess>}(KIq%fF@C_?txKqR?$TWX%I#KZ_rqk zK+D(oL1X^TV9Gh9$tR4t3Y6_7sud|v*nm@)^G(v-WxW%OSiO$^bVa=sfVbUAnla3R zCE8wi%;iMQ07Dz(Lo%`4xH&HE461CBx%?+~l#CV#(ct4&P#G`1fe&U-d~hGc=p;8a zv_2$gDY!g7&sIBv0bLd0RTL7~GgFXxvaW`%Q5f`9e}QR^yZc=pc1$3#M?`>thVa~) zneV^C?9q`q6dr}G3eR)z^{gy9f_e5YgP66L{sAz@^nXBOrF|ZZVni$)|7{rZ|A5A~ z^_lSb!I6p{A^-IPkRc}cG)Rada%Q-Lh1)dWlW-Qf*!vjus62WPIVi^;0xI-^(Uk;r zoryHEhc&Jr2~dVY>&uO|_374QDrVc{4cW0C%tu(v*5VU2g%DzSI-E$Hd4OTFbQ<4n zZv=>}J~D8nRCz3~g%!r8mW!ymd8@M5%-*vd;IxbyMd#@(&!BX`>d<{n*^8lC*1V{) zXUNX9-RhE&YcTEomtlu2xp;?WWZfl^?!TDvI-=tKECa++_id{xP+q#RjSS)0W`%f- zwhv1rnGIF2pJ8m=NxlO}eVAY)D#@8(NT$bTY@xS$ik_OItpae;LsQKILNG0o9a>uS zH$tIUww~-U8+Z+75_vhnoFd^71=v*C{vt()kH@Ob>d?b{n?5xf7j>X>t>=O67D}{3 z?7(-@vcy!qf>l@SQ2JMjJ5f|z;E%XPCOH&YNYzC=(dlc+17Xg0qL37Asm`<z$&@=8?>+O3oF8}0kKD9GF0YWpj&$P0czd;yqjPC){jOec(!-wmTzk$CA*)F zcZ@=3VuZ@XC25@nSddC1GDaj1*KL44?3k#u8e5YUi1>-ZSZk2KmX04Yid$d9d@Iw_ zazI-0%+Pt%;IsWYLsJkL!-7tRmov{GZ@nJ$=fhL^Kb=@B+qIw~zsdV;SQ4{F4(@N} zAz_mT@t}Frq967&s+d+~;MjIcq47O>eyQ%a$yd2!_YS?t_!9Dum3|^$OfkBe@ReHp z*N_!c#4lzA>bHKF9I9Ev$jlcQz>#;U6;&X)CVvnM6p856<2Piqb-%Bm;3{))ld!J` zaWeh`2Z)r!4%ciOj*`I_gD{FXOr3KfpM*Vo(?7L|Y~q$sY^okT*Fg?unDZIvzHAsm zmUA9zK0R^g{$N#I%d-W#%xI;TPiX+>?WrBizh~evO&}1oo&|m*HYUc?mUU)MdQ|6oCumxvGqeT6~uA?DsA!&C=fHeS@P5hqu4jsqP4l3TPsul z3=<&@Y6a-J;%8LL157U#Q?eQ-gXzVYsUqZ|A7+?(UFbbQJ+ac!5r3n^-DQ@a3ETZp z_(}8;N?ayY(GQB4%7m;hAr8#wr6Wp6$2FC=?v8h;C1FN}!XNYBThIenG?hs3 zCk2)O2wS*TyJp68Qc0buG5L0#7WV(8XXStcPWc-!aIsrq-V0R4p&83Vl$&UPE({O+ zu)9aQ2C(;+Rwl-z07Z{BR0EOFw7}D>9uxM)k&WStR`{0qZAvwkANva65FaHBPPucf zO?^T25W!XWg^*$7OKhcCA~r&@r^l0kt+!!ucmJ4Y6GjgmOJtwkrB_rhyOuc>6v^MC zJ)KVklOKT1!NlXr6O}?J?{b3kv^OgZbt6kMVtWsC%Rl3(pyJA~ zXLIsVp!*XFs^?3EpZth#fVWeVQfFuKnct119H_d{LhZY+fk~Im zEdF@z(Iwi)B~p@1ML zhNbAhYSWp>A=02d_{gho)7sF_|PZNe$k{OO=anOmiMl*p!YVBSn81-*lnA6|?rT5%v-jeH`y9WQ^ z5VaZqn|b*!Yr=nK)$CL$AU}myl$mRyhunV~e|<0^Q_Nwl(0gi#O7NwX;Fe@E?VA!DohPYZLLG!omA#m;(Zn~jp3~;=Uzn|d>wmk zRt$<0+$z%sf2th)Pzoh8NMvvE$Ll$t%l}Sak|+~0`dn%tq70y8LpK9}WPCWq47&XR zs}&_kY zMt5Q=ZF1^G37v{`kSxme&9SB-WnSkp@_S52T3$!4sRY(UGR9or*z4rD*#|TsRDKI24EGAXZgKMkYTRQj7SIDxfy@ZSnN?0aE0rQ{%(NBCJCa7pC$) zxO7$hK0~jBTbDzHaZWxKHv~MenpfYAjwRBt32+VOo*sIf;5xe^ND@?6tzvrU6M!Qo(=`1r=5S(e3pHhXH92$}$e0)Qm(J(|HWR|14tX2o66dL2C zboiSO#x;OVJYHeVkl1NfxQl?HU}Ousj^k@Ivl-+jdRHQ*KyqqCc9(#jnMX0-eJ$A2 z80CWlh@ME@0&<#GLsvy9=r%k?Zlmz;0uL^>F&BD`Z3;rM-I1PRRU5`(VQX#$eqk_) z(T!lA^5GR)#J_PuOKiPL#G?6WvrX@9`9%oBdM$l_{o6S8r)J_UKqcBSi-?l69*L#L zw?3>=lmtqSO6?GEkIkvU{ud#P%|Er`MnE11C$Ec2!_-NPx=Dt?k-sIav5XiTO|@gEuMs{1(IpEH zDO-L$TWy|pFz6qw+>fgs8R|cqwx_>do&G;Q*o+T(y}P-%!J*s02wDtX;^!SMMh7oc ze=4t>^>8vho-$D&6mF!(4CZ&^wJG@HZiEG-T3iDC#OTa`h$Gw~&tOg!(m(IKzyIVF z!~B9tT}Pvd1<>I&<9yJ%$ctioULmpZk(UDt2n78LO4>+s4VEx2gNLu7OB=HyzTn^~ zV`3Tg`B1kc@6aRec@+u|ItfV@w{YEaVsBJhX9)TD8tp+U>beh)DwztX@IE><}*6lDC0!> za`($U4sIDP#ja#8|FFR}2FVyb(AqZv0wQ1f$d=KdtO=%+6XqbEj{{Ew^V{ST(@n&z zA3NIM$?QQg)tl1Sy$bTf65`JiH=>~M7Mm_o$Ro|~j}*Iy;wdwOvTDr7O-HJs+APdk z0=g)8#?q`t7Y@xy&2iB?B$-F%C3zcjT}kilbp&W zqmr%AKZlB=XbaXn`*2j^8OCO#!EWdnictem8|nHnw>jAP}>_ z@nt)2DfuY>mzv>NDf|}=d;+3xQd{K?=UK~?lsB3qf*%Oauq#+W^im^fnxF+2jp7SA z*^bIPVAV=ME(dsmoS5PYt6*i5p?AFFVVYYTz9qV$PnRuQj)>+r9I?vFV&zx2#0#SC z40!eU_EYfx0|bZpq7Rxc)FROjrPuQGr~YKQ`zd}1=@JW516D2f;G=c^)z$wX{UTRe z+Bm{sj@uvdQ>+j-v#l87>?LukpKOetZj_*2x4)7B#w{_n&&HJ=Ri<}Lp2*pe!$=2e zbXbgWBSPdlaVs0?8nbf?A1~Zg$Ht2vd71=N{4dG*KVaGKkS;r&c&xTG5YFj$KF5P! z_#Keq#Nj;gu2(bTjRSc&PeIhEZKATek@VD2_G1H}>202z(oqgUj(CJp5QlWd*|{(8 zFiPZ4i|QXR9@$HM6Ajd?rbTjQ8)n(*)Atbs)ujoTLk7s!yMY$mY~Pu}faw{%KE8#O zXtDKK({<^7G`A@GK|dM@ct_$8r7=MzsJSp`h~&@r%cu&x;^ujAsas_L$p!}A0}+@E zK8`5)bt-<_nOvQ^TtJ~!0(jUS8zC$SC@UAca$YV7#6FUD!sFv^7|`BRi~(*``w*qw zuX&!uFI2gd3iy%*DlEB|yu$C=IWVch?%jnjaHVg8XI|zwQ&M`=D`#k9zDemk+sP^j zdxRAOSTG3q-o(fQ_{&s_Bs!k1?Yqi2XT&f{cIvkWp;6YXzlgcshTQT0e)gAYYd_S z$b2R?uE){#$Uy@>e3DJqz5RNxhG#pbLNA+kH^&w+cP?_pbMa25`r0Jz4Nx>6)+yAa zw2ix4yFrE<7*SZvXS7eZ$gd)_d^kQC{sjwfw$0T_K!B?@IW9#*gB{0>$FE{$nurzm}3n3Ag;^RLS`9Qm34%j4zQ_xBby{^vQ6|B`LGdZ;_)r(3Yb|O?nvb^% z8%7&p0+c7|UvZ^)UrQ^NQEd^qbax?nI2Ks6XcW8S&cNTkAxf6 zgj7y;_rX7`!hXr}%IP%;cQ#`FAD?+Ifu>`;y$w?TG4bAa@W;YXX zGH#|eGVSgB$#}P;@wke~^z>r8aV&EQgO;4Sp%}Qc$5U46dU0DhUSwOBD1TJeKH&A% zk-o1wedCP7$-8>KqlsF<+S5GlGVRSTn9&`5-e)xj<}D@bzxgZB+gB8wFf=#oLKp%Z zzGRt50Wf~>!#dE5JyTjQ;jLI6&JRagLkrlC(WE#$i`7u&(4V31>>|{XG$pH~G+o-G z^3Gi*AhkS$tJZWWtchMT|HtboU8z**hLd~nT;n=eI#CkUo}kE_fgkCFW&XIIJEuG- zyornJxP6Bb4^(~s7=+l9gSgSp-t?wPi*dS0Z8##)s35#Ou;mQ@@wn3TvYHuPvxse> z7-&@lu}N~7E7fA z&R9^4WKn;`^!H8#em4~zq9C+p!N7Vi`q(lVn3M@jhu}?B$m<&qZ{`5Sxq9+ckdj)aHBkUf6g9}d#djGiz-Q(;`YiVDO+?euV<>aK zH7s7g=Q=K{LU*1-8{T_Jpz?2-@GfS?rl-|-5Sqh_uh{e)htNW(Qk>ebw`DM)%u%xN zY;Iq3nnN#Ll1JQUT8amDn6Ml%F_C8fw$ZfHX?Ca9%>$=kXpi>N1;$t{yCplrfLR3X zVVr2`S1=X95~A+FSq%QD?)z-6lqJzPRFCs2@W0*I5-`mXJ5V3Y@LKiBqtkH&OL4z< z_jn~NmM}_sT(t|DxxTl>6kL@Ylp`iDDUOgNW{EyPOyrb-!}fCPeTg;^Iq)*^}W7AKXlq0Kk&_`eM(JzbAkl+d61k zP!a=>E66p%T=lx;_EBopP3Db!6f)lpBMh3dp%%IC0>VYe`CCU;1UgEifNPm|GGrzA zVdp9DdL+^sj0JPSPb#%dRcT#yGk4fjDK%29w z5Rb$a-q|UpSi7YnR4BkQjhAR67KC6h_Aub#qG8X?wWu^Gbh$egq-dIWV_*W_(b;Hj6mlsa7A($^8VZyYnafDdq*f>oq)pp_)bl#MAG@+CEU9SdN22cWApkM;R?MmYd)}Gxt80cXs1ehIe4SaDE*`n z3S86NdmtI z!~Nq^w1qZdZ}0TO?gs7zLG}fS`o(qbNBP^JSC?)Y8}$s8QwEJ)V$fpG*`L!Cf&Whl zB(mDWWLt20qi6RRv29%QY+JgHFCbc{7G3JM`d-?e@vJ!kjRO$T)~~o9K|+M9$X=nc1+wJ8XlB>frsjuu zi%a<%Cw!c9Pebv{L~5V*fhDYE$b8PX@yF-7fRO8qpAGPe(RPQ3g@+rO$Qx{e#Jk%3 zqx=*Q1w&5KKuq870_dz2bE;~(DJQ4P!v)hPE&90WOsCtM2}sw}mzN+@>M&Ka!VuF5 zg4PBs4D>#M{42c$z30qsek~s-H)cY^$g)vox1J4-(N5)PEOgv3b}#mcxjCB3#oC?E zufs>X;`p+{DXNgSnY;`18nxHs&FH?zal`&`f6Ug`N2n1cpjBY=vw5 z9Dg1bEgnZ34?)p5@o_kR+na1LA&*SoJg0R9RKTatzo6Y(ryMl#_S|L2^aj}H#t8gT zjMd(%N2)K)S3=!oe$M`YIM&M6?E9u4I6!*?`vLaFJng~Bq9-mw1cKIjooy49TUU;- z_tERY29I@=`&A#8KE94s*YY{1QaS&n!}QVK?vSqvvzS75fl{K1Y2x#7U23Sf(LNEm zSON7s5dqadYx*hKYT&1IyN5c8dChy9W@srrb)O1fqk)yi`1^j;`4BNDfNN4ch3OaO zjymHbP6BWRa-mJSTqlif^9d4;p*CdSoD81my$m=X%7J=x)N$Bdp0$2m>7Y6GM%C@4 z`8R9*lKD%CrvL}#h+}gZOI~ZG`9__FMzkzuPyh97vPk23As1izl_fveQtu`;QT&7? zgDl|z{!;o~*leZnNcK*10M(z#wD{#Of~vSCcd$oun;()C<74t{I7X+PR4e3UR2UBB z$02Y!&n}z^cjvQ@VrPPr8g3I&)=G{TKM!47<};~X!NQ>bR6l^kUvdAkL04o_?|@dz z;xC7q^fSRXC=ZcNPZS_;YrGE>y{LPyj2IHt#atl6oCvNz4>YRrB_qVNI2 zA<*Cp5TQf`n)dqZq@lC1tNR5nOR-nu#g&6@L>@g?SyW1M1Em0X_@{XnA59sP`6@iM zAYN?=Zi|rVtWe7qJj>Vb6@DSDktX#TI#*T$L}_CK#@Oi?!EE9vK-jXW{V(H`fyc-3 zG8aOWP%_D(<4kL8i9s{jBL$HQ?&jT!$o|mWkbF>V|r{WF1C*oqF*UXiC z=e9@&ddA32a9Qi}fdaihnf-UbIJYsf#xTzOM~B}FdwzpWK&*Rs&p5&-D6of;moZz7 z`mMpOFEiore?RMr0dxkOHm9yw#^Q?_Tq99i6s_fzZO!J5mO0wz=>qRAk~=QC;;NOc zkS1W*m(G=VZ%^bC|Ql3t87>`d0!l%iMK2Ct`m82(f8nZ-T=SVj|E!lt5 zxtR(f-8ah_48G&H#R9MJB|*sX1W`|GQOP+{9gNlrE~pEPZdZGszu-5B{z+^5KzGX| z*F;2NDOgIxZ}^zU<)r#?_No>_j429%Pdz#T%O6s{vogZt#Lb!zcwvZ`G%KS*#!ePXepAiLjunUnqkyHs=q+a~9 z>I{)DtRo^ypdq*?MhhHyg3w7a%)Ksk07`Ify7SmhTCbQ9O4y3TlKqm|)8XF%m-yv| zrz(8ZFh_Vs5cC@2l@7&-%$2lV;zBClo}6U)@jl#v43o!wJ)PtIjiq zalaWPw!wk#0R<@LJXD>Kuhq)w%8rc;*>wG4fv~?%+m9QWYRN9>5S1jH#a9LLxqPgo zSM>y`eDtk>lPe)kxscd~hm6+S%Y@5<4j>}PZi&jdEG27gJ7`c~{_`mPyIM>&+d6Oc z^ZQv$&^f(PCh@_L3rspDLf>0BxK_%%n^SRQ!3{H0CrcPN_q@NE<)F_7K7e?jZZ3ag zL%jR#t?IUS{qCkaucW#$?0w=8)AVt6R(qu1T@X*6OtuKw&yCz#c1aPXe$wAtzp9v1 zDw*74Wh?`mgZrxV^C$eFbhGVk&TbqYRU_%c@uRNf(oqJ^Oyf%*hr%9CD&|EVD|G{C zphZ@0V{!a}pGh0XL?$m4=aqZ6Xd?IclWquCh0?&`?gk9k8TNahunos0;Od`3;x8>l zpi?gE5R9tNls{h{PSxKzvw=HgkKR325-*LGLF!ZGr-$NrjvU$i5ViD`QP+?MoJC#9 zo04?Q1_xzpr~BzS;Q%*Rifp*d(BT?FKxR50@ul|hmu^2Hi;7$;uNa^ike7)36Dx-@kNA&V^q02KzY{&0hQms3ZqI(_;7X#jBdL5B2XPKO;zysaN{SU8 zRXHZ=*v=FfeE2gK(us6#3Rk!wTsXfT9gOqfEzzxWA~%~CN3qw*RECU*7tbH8jeKGwcQAalB(VsWxO16l=6sRe zHJ8aV5+R#ND*OB*Ex^b&D>@31#dul{)2#H&co@9qdrV| zK0Yku4JIAWbA}}pI|N#otLPxLgb+tELYa#pkco-1TmDv?V=6^Cq1jRDn;!RgN=v%# zbd&xpSLw$x1@gE+<8@&4@hh!nPq+|=#XRb9kdE;X6EXlkgBoAO>YGUa@3}G38{(Bi zqw^H^b{npXkcvGr#o%+3-6VX@JXu~7Z3tzot8=_e0lwcb4Fs&E zF@5lSn-(C9B%)aCR+BQ>7oL1^Hdi2`WBx&fwQ9mD_w;Ibf0)~n8o3(#{3)vwWW?FX z$8{I<^#;tMac0V>)z^q-5jH77im(yx`z90uAPmIfGQvn(HLJRv+bH=GkbW5YFXWaO z1H8l?H2S7@RrZYORg`XzOPNGW(8F7sCzp4^h+x&Tex7+1HntZAh)VKhHl8<^edd?W z@7S{6R+}NmZSj|P@l`r^rD=bOCx4auf&_|_oimN}IWLO0iUzoV3+Yo1ZS+O>ZThg4 zeYmmMVz~qQc07Xaq0UnZya~|2SOv?191hkBl$K7AeId-D>ogqf%G>iec-D|p5=%i_ zw}OsGeds}&y6RQFEEdqWlHq{5Vf6B8Sm8IrE94WhT&b{eoXU!TH;!DSv_+N9`WVf6 zbg~QYgLK-#O&hkRMtB}}J)E^DSuIVL?40DC&csNCUHor}IYoC(iE_HxC%-Z?mGU-^7>63#g+e?s$5cedO;<_?ICf`;-J+%w#GxG`lV3 zZ6|?#X=cal`vD822*kxrI;iV_!uQ|P+v$vP7!m_%z_4lgsGqq%{}xrqio6ucoi=v> z6pw21q(azyGLFTV%vlipMY9xpNctMb;L^ zS9fM_Z7QoWvV#~=Yhk{Ak+oj$D2!EpUQ3{3imYq`q-r~>u^rNB9iIb2)N{V-G(9Sr z%Ol5ZXyN%!ZE1-W%O zB1C-5F_`KMBsn(PI@IWO6m&R321Ff;8A4=-ObwII8CGUw$HD`d0LGW%Ic@%P3JIJB zisvBuA?Nx6bH<=BL^SLyf!zp)0EVeb@+3yD%w#f#b)Nw1?bg z-MGi5bXtv!Y-*j)p^f1zg(+ZFB{skYZkb+*St`sPxYLc{;f?SqE|o2iQEgK+R?FU z#+ZbpvozSslg@{~3S>+}`7p|f|4Fl`!ar8^Ok-kzG^1+k^)Zh*I7rEmYIx%iU*pg5 z^Pgub#mqtxBhM_b=Ee)(F#WFvgwV!YbpmkGrhW?kmx#PLaf|st=$zYJ>wBa);Dp~q zC8k1%w>Z|$&i6T0p}5fP4 zuP2)Hs47*j6M^SS>aH4Cv6#|taFz%K+x$i=th?x^xj1r6>Z#{C6*YZHNvB3P2T9iJ zCo1>imRL-yvPl~Sh&AC+1hR|fZ;>>jm{!@7a!B<|nuFHJR3OS(7TS$S)H=JP>VZguKD9MRsk*Sy~??Hxr>j>EE%{u48)Mo{WWq z4vBgg3TyoEtIBG2OA%mrPv|1X)K}Y}aX59OMcUpMBzgw53#f7_Bnq`oj`L1(XVWR7 zsPz97KfP@M9^QuqpUNyEy3huM(N2r7cCPR7xcfEKj$Z_=RknJP!S&XYdeYIDVThu- zD%hNK*`Yif;}_9TBaMu88czx+ULAc-a$y`EJ*@X?UdKRQ6++}--1i32y>m0w$8gY9~pthZ!*QL7~5PS(~+Jz?73(AMDi=|);E&aEo-tBX~4nqWOKGl{n{pe)4F zOcawm)S4LYFmZQ*BDMR2GwO68=rm3Ks;ysy_9N1L-_iGGQVR3H={=w#fvfQkM7uj; z>g&ogWjoEY;3NvvSr6?*c$x%2^UuQ*mm-f*_R?~XdH;BxT(G{7AS4*?rHqc3=y!k? zK?0O&$Z)2xR>-h#;K|y}QO%4!%E6&`rWD(QA?)TKiZ(s$al|X1+uIfr&%D)X*H+E+ z2sp>r(jJojn;sfN$PGXDf(o;1Qmz}H=4Y&1XNhjZSQ9Y9K`q#(PlK0C8N+%|I(o>g zZlu5V28=m1HChWm)`}s@3s%9s%#w8~k8>=U&gCD3wvdG9q4b1Y;j@uk_5Y#l9i!`R zyMN!tZOkT(ZJR4eW81cEJ85j&wr$&JY^Sl4o!)((yZ?Rm+2f4!YQ0|Ln!m~KXHIYe zw3RIK)MP4+bWe77c`q?)(ae}OC;7*l>gB725HP$MjKx^G&PQ=x!zGpy1r#_Um{&Xb z#Wj0ZVtsnCjNh;Prw{6!nN2y$VP_*{>1bXqnL$}L*nlt0roSAOQuvjl{V_{J6MK+> zsIzM$SDRa#q}FB;2SLP_A+SexJM4*FAO8~>c;i@iG&On3V()hgSd_Io8%%tkuzAme zxnBTnDY6Oc9F0;YfnIC7gz)F)O84Y})Kjp~#&EQ$CuTJPy{6&WR~wHD}n3-4~X^#+ki{taRS;w^{XET*Vo z4wdvS@&^WHJSTV_P{k^kmIq)0ued_8@^nB@MXO1_;lP7{pNgsR5B zY1vW)&blI~8z!!}7PuKtXvU)*I&$K%+CBXgxN?Xl@L@FHd=4S>&Ykq2vkZBOBk+j@ zwoXBfZ`Idr%gJ|8yt*E}#N|kJ67g)SQi9o+$92MMwN+3qQ3PLnBN|k?K{Ik^o-^9y z6&sNC3Qpx$7Xn!2;$oO6(Z2a0 z_p#?6HlkW{AnB80(BZLk4?bccJ7IA6!=8%8B@>}f!mEZ#DU?)4qf6g2gl!I62_ z22ygT|INof+wWiGt$tJ*r4tu7Sn-Q?(e}F;AvKNBCfgrt(|#O<`~Q3bANgmv{ioYm zzZv!^ykX4;I~c2rn`F3)u;8$NmvykS9idHj`sA{1hhhB2g zp=|LPzrp}#LnCIL0K_L5={Wz*a<`zUi%4|M^LvHBWBNbSDyr6(c2!mu(jUFF-e97O z)pM_*I#SOL8!25y#?F#wLJ<{?^d0I|b4hl#Mt6whDCghwjdCTpIH*BNFtc5PO%M{E zg_CaS^uD_&PUgujblSJ`-N}Y$@IuW6ER%JScG{3TO%iRVi>tI&OFi=o>MPp?YOQd_ z1el%**y=2Ov!Zhe_4XJ_W)iD%Dq2v5HYes2JEc=z0;kwJ>Iyqx*{T_n&=eDL)DCr~ zou!obmjF|OJeS*Muy8OmfU3uJ%*ydbS>dudjk>Z7#ys-!oC?MJ+qL&-YU%vp3I@)s z2Ou_;t|11`Mlzh#-wQ-Ih{>d%tKYX~f5#ytS2kU59aeh~%Y0fu4%&`R*$B)0wxlOf zA%H=j*jRdxv&WD_wpN$!kuD#p28~)It>xEZ5mo5naY<6+*P@{n&UT83i8yd!X8@^ z5{~(GjL#NnRrzsdsTl&&6aySPGr4-Aj2w3CoR(!7&v`%69yl0su1>_i?uMqvsoyFt zcE0@0dokQ^FQz(cv(26L1y`)Wb|iwS9qA_=6!9bbg2>R#d8z#8pR^Z{WV_aZ^&v?L zF{R2&qpn`07;Jd+yu(DIvgshSrBXsYpNe*jsgcPLc~wS@kcOrW8Uz&gnRlU zwL`&pZ_=Cu)_3IlOpdfoc3>5)(Fn>G4<#CYg~P_u0A3*IIy~x1kAZWt`CwoTchw%w z7IqS9dKs~YMm%;Qf&P8Q&ldOw1Qqo+89mM3s8Cz0;+_1d|k`!0;9sU{yi$d zN2SJ2jR35xCvs3?+u)-4IYHOptp~>vf5r%+QBzq<+0arntg1gd7X~=&s-R{#IjPUJ z3**XdW7xD(VAQos9Klg$5|1?GxH3D)dV2pBM3IIE?sk5Z4cE17FW8`j~@-;UPX*P^`5OJawf8HQv_J1fQn z^T-KGIEul8I^EWtozBUFMv65uYrEe1~E< zAHXK6+Z9FvzvuL*psf@f3M<+gnYS`;;s(1w$m99QJ!N=Wgzb|h4^mxxE7^dVW8uSh zz}6a0`?jE$F(NQ2{&CsT+Txkl-@2H&_7LT?3)UX|Sf3n8q0taY_Ao0zpKU^_IqlaHe&trF2dWKEX)u44*u-G{U1 zo>0xt8N)#d5Zir;Lv6NxHYfu_``G&*6h#0?7o7KIB>M{fO8f;SDsm6ARe9{&)^<_< zp(aLFwHih8Ox-HGFsOh zsB}7y&&^Glpnv-uNC~a~=ns_W7~|yj5qAkg{UWHy5Ra#=+r@hVJdyQ!Nf`w0f1gq( z=`ab-z;q299r&OcZ4l$e*9CGa7@x=c@EaPK)Olpw1A}34pS!bU9f_EHOfH{x*Y}JZ z1!)O%P`paLz^C$nR?8MA&q!U$)}2mhi6{>l7*KgJhX+w$Cen&FbJFMi)3= zq*l@`02*j2P}c8u6#RXw;AEH$9qx?;rXjJkmM@z4uaRhmel2B+J3dV`OBHrA z-=rE6xHYg2^zV7CjYK9Dw)5o}v|)c^t(f(ejzr>gz8yyLPaHRv6C*u3 z@A?zjpTvF8tP;9K-L)k=0!YloD8keb$r17Vc_kl7#x%30XQl!C*h zA#^$|>U~{YaN~znT&@!`9nH3A44i^r8y#9Md)Y-qExVjsw15rFZs_83o8UOuaKJb4 zCRju?quQy``GIfEa!HN<)@Wlu@jx8P`hsC~Vhc1`th%`918pcIxoa9qIE5RTQuc^p z1sZgq$B~kW_F8I^X-6^18FPM+z`d3=S2U;S(BdkDto5hr6i1yp>4Ic8L6_UV(iqxh zm6|xlmcKMO*7gS5@0-2biKX%SW|iwi3xH}_XHhwOy~y#hawCvHlL_Z6P#MNf5o7U_ zT^}dXAK%%XUVtntgzFRTnUjrhri6D7RJrc*r%k2s7<^y)x^A=2Ww2^kzR^*$pB^&K z!8}XBXdfI?6?c?Ny|SM0!wA)4u!luZ1~BuZXcp_Ypy5C91_#I=gx2T41hfc0!|-^B zzDqs(^fW8^%7zD7n-aSyN^2it{?iS@iT395J%?F<(|-mg%gLq?h~T z@px+lH+=c$*bn!D%!{x4gzS;l(eY-iYIRSm#VCzJ zqND*amWl#i`CJwjXhZY1yM+UT+Ef{XrfdTT-=~yy`e1c*CajXNp~f$yf4}1&9fP~y zHSMZb=0;)SD;uR!QIT_xu~Q^Wr*kJ_fUVOE-Xi!dl%i)P>~yW+*X~}G5uG+bL5a3v zeOEN#;DcaA-*J#dMj#TRm18d19r2AppjAi^(?b&q-;z*7V|T^pl1_H+ko8mB4=hm5 z!Pb@7qmmz}zcZbb1RV5mf}RM9kR1a}@{G^Lrya$ox%RIA+=v%}kMmQIn}5@Cg~It< z>{IJJ=vKpiE|y$`DAsP9DL^d+PC5r-5X%dx+6 z2!~Ikyvz#v>nhOjn71j8_zFKN6U^-J9bgLwH_Ya|N0K>>729R(zpoQy?<~1jO~k9r z(Zx3(G;i91?KIPa?SQZIkZ*l6H0QPa?tghSmjOnqN?aKjE zzC0dM8L|pKByWg^ZSX;{{)|;5Won2VTyA~GFQ_Gm?0#Xzx)1$RdW-%3;k*Jw){>4f z1i2?uo+O!LJ;yWMAOnXL2A3{3xs#t~`vZ?-stiPt^)!443$0KkhN!*vh!*r`Gz|=d zCZgH22#OL_w>qSS=TH;a%~qTQl$then;l958s+j2RY@sN7}(an|9T?R8;Y38=*X** z4sF5jH&v+S<(R18Ui~tqlU&S}HoY(1rb5}8M|6tU+^mq4$eBXg##brHp>WD17!%U} zIl57js%)bfcfDD)+FPnl>btvRS2M@x4EtG>p97Sw3#?OGa&u?XkmV9055iq!`u8WW zzkcY1XV15G<6yQ+FCl1!FC8wMif3;X5#+#cnUVIQu~Dn%esg!i{TBQ@#xVV3M<^*5 zq*E--dQu=d7u2`;bdBTSsz^Vx$PZ$5oAHBKEk=wamvc3S?`3NqE)!i&@K{L76n7e*jLztKG=o>SVTBGbn~!;B1j5#-ZP-QtdZr2igJd$n>G7z6{THM+`VmYBRF$LxHTYu|!{nM73$( z&ewqToXiU6n}BcgB~Q5ov~=Sepz{P3TTT{X%ji3LRLXP;!ZBtGPT{Qx9U+v3~Cj> zl#cKSrsUGmM?u(&PFC|4BlKn8g&%y5q%E7Y9U^+{5?xZ(TH`Y+l=9Aum5%rPB{{HD zI~u7@Oky>>W9hjk`(^KXI2B&pkyTjf9V<^UTF-H&8jPMU4Er8JwhSp?bw=5r%0!J? zFiUwJF&&@9f z2VX5>SA!q&FfSHnA*Ae;$x}}-%~Zy4p_SgEo-x&EmQ?4j1Ze;@{Uta_x_>`GmKrWL zBd19TM^VpV2Ju3F*Cf~@C3sD2lIzPUJo*dTfR4v-~xjX~NpDGuh%Y z)74e_RJGq~Uc2#{TvLYO()pP`iF=On3l!fPLo0)*fZ+toRIkgT+$0PBY>%QjUat4 z(WV9Lj%$9T#C1+-G7X< zV@$>P5rHu=YF2f}WLo-L>O)P1U9zC=63GXyvnDS0n@#1|u)?sl#%1nO#fB(Tc1`ctmP`X!n+l zHtd13INiYP839WkKCl#?olWMjY;;sBT`oC&aTsIv&>#R=!lJNEbN}My$cFmE3;hSn z>eZJUz(e;3%0{_yn(k`A9GC|9c*SUr(A3F5L?ctU9F7rZ5zVWt!qgy&EL7Kn48#gq zIz;#|d?7A8`U^bY_>9ABzER22jug7~c|?Fgwn9R#(Li4BCX=e1~<6zl$aS zWLh!XoDs;=o5-xbU_K9m=DQXl)hfo3`7Igg-oV;FTanVjR zH&dSbxx*N?uN^m=-ubU3V_?FM`P)AXlVK}{hA8UD8L|&dI2%nfR~sV(>fD&5R4QPA zm!tDXuJK+8m4ptyrH&Pq)o@KZ)8>5(tqpcc6T!&=t=?R&lWGCkESU(h7<-Qgi6m2M z@_dV6A=grVi%{VD%zqqLyyRFFkw3JR8ul5gmtGYT!Hfg*$4GUXb z1Cr~~VOpA~@NqIh$Q9OR%M4wG&*cM1JulCo9-Hq`R2^1E(Vh@4SV_?25#%yHIc@Pm z%4vOm1t!Nshf$osC%TnB!puh?iI_JXxc0<^@mY<_Tq%vSyzb}4c{=(Z5tJb+#1f-4 z9j|+FP3vtWeS}u>0&gl!7CST2^>7m3?`zXMuv+z{TGq*mbI_tJpEQ6dQw)d34o-%D z_0{0^V}=cxx@1=e<9g{{OYVVS+$MZiJP*Gy1j0;LUIn)5FEe3lo96EW^Npb)eM-$> z5iAhGKy;fO8o%y~J#a+b$6;DU1}{T*Y&mCh=_so54+>R&BOx&~^=A+L^`$iRy1DBe z8in0!rmz=^jRe}I+X~fIZT1+H?GMX-Eit5%Xz>L`KXnZQAjp62(khZDAuI^wnw!$N zbtvyj20!~sc1)xRC1eUSo|yKhElV?z{ns5FeWGPF4 z4k2K_K+-npTyFNmrutAEWOG@=d|}coip@q*5XG$_|NnxeHRuWa-(7s7=yjiVig`4P zeU@329wJTejvy1syj?EzxmDb}BT2_^s7woMv59s`gHkw*x^bb>DAda^zZh3Og{${z zon`Y1mo6oOms@Kp%{!OeBkwraF+MV=9iqIE3bVL(L@qS9y$I-edwvt+l$(bJl^{tI}?K8Ts!sgFQm`n8X;Iu?}8z=@QaTo zlOCX$r01iUn(1qEg7`glE}btL3*jgnhZR0U+qh;XI$?k>z8M!YDGSbZ&isPqfgSr>+Z~!L>iNi z&lGY1Uv%_^XSg8MKSTnKDuzprdrBG{j_=h?^zUD!b|i|paE4O7&nTq1@!-$?L>dWF zgK)lOojbnjhzzA(i%BX`)9@MCU_=~+!=kTb2ux3Rb`il&g_=W3hAH_Q#wCk(6XDiR42cg;*#vkd*TTI^<7* z1xzzC8e>{Qk_+Wr9(Z_&^3)?K$ZzqZZ!z62P!)t2<~!Atal63cX~A)DMzl__O&T+q zmAxy#eL60;P^7r_9Oohb@Jat^IDlBlk}yc2Cp;=m6qQslS3e&qEzox8HglwwJ;*fQ z3hO1onVd1g9{a>vxOiB9C7xwLK)Ar-f;x|<184nM!99XLn-Mia#i5y-&E>(wa_iF; zHUe_QqnWwhj{@(IDb1TaPPesV4JaejykYCYfa{R8Rd>F+L26^A@+jV8 z`IZEce%eTM17d*?o_>sv%W5dA$89BmO`&+v^u2}1coZ3bAO_)5ObZnbuB@g$pHH2z{(*O4~r- zC#FwZ1o^W>!W6h#Z&I@%I-UlHzHxpAYrV<+PI7|1O13BKt!{ngc~CBqMgM5!H@QK*QijFtsd)b4LAEM7FmDI*%E|6lkhLpu^on>pYZ zh&RRQhZ4kb6g?9>RJf($-EVj_Y}4#yR4cdXcMtQQfY7rMCRQ-5p$d`FAJ~S7W>sTO zsG0@Ojra?u-UdAmRo^uz(6GR9IDmr-)0KWv`&=Y~Kx79;>1lUYI}|W{K%494E>=)` z4V}D^1Q!Vvad`N%WSMNksNK4a(yEKqLg6lkA#&ol+~H;IARf*zt)kahwV7#ls%4w; zDX1ih*tgQo{i0bg9jzcITF57eP9>x!D0Bnrax*{0a;U7Ig1B!v=rc0-zv!qB)k?a0 z`a@*M#oc z%t=!S=zxy}xa$}9mrfVF;1^XO$-XbB{9teja!9E>z&0n`n&!YL#`acFYakoee6Ka% zZ`~$Yw$uY-5lgjG(9tePw3G`_EhgaJh~bSSPV0j(zh7WzoD95w)J}f&>}Yqm6wIICLwxZ8g!kghX0j z0i$@AB}^PtI)i1-!dnIh`V=pwG6Mg06Lhp`k`T(SD3K(*9Wnk(is~P?Zpq?4_Z?1& zr?C%xE4`qDr@85i!Y#&Z6QzV?vPMIu{oEg8WhP_3 z@j2St4hRnf`Z%bESPwDjF%-vLC$@E}LGQ%ENCq*An4$OkwXXReU^EHBE?`s{rW9Q6 zCtLbp8)I4L3mB-%qyIzBy_ z3M#1~QbdtQ-l?;-Yh%*LSsHsujuCv^AL?wuZHfz%GMr#B)J65a`;?}iYxI@I{@+ni zOd?=*Gd~mh2nUnI6FXC`$RGVbsLqzi-iWJQOlxe?<;(@Gj%0UlS#wSQqM~C){C9z< z&kEC+0xl7fGK$GEE2)Eq#OcA2S(xE9!hb)|q)k2CYdr(E;f^X0ow?+cJ-Y6?xUbXf zkbK|;1c?urt2zTMX>>)z}n{nyfxQcPe87lcV($~5$L z-hUXN`3i2FjlQ$q~c5JoWjxnK)7C0P*$A9hP!ofSx}4iL4-VT_MQqqMipT)hB;# zBZZo^;iMA?0eCZd7VawZ1Fp16Rhw{ySfvixja{H*gy$v7Ifz}eJ4 z=UO3$bGU_-;BQ^2Epk;bGcm#v{*HKiE`aOV2K2N<3f*ooql1ZRg>?q;lBE_m7kmhs zmt%|kbo0b@OXGh_Hi3+pxvd;BZwcAUnoZCzVZ;rS%i#Hh;%M~le>#b86 zSbLlOWX8d$M|2rD@BWz#NW~Np`{W?wU-b3MP71Liu)y=sDBy+g8Q6#y+9Pn4AJuOc zbr;%dli&RQl4)FQ`-)x8Wpgw{xX=dwF9zBa6R=RB<{mo_qvXz(J@R_qgnn|veR9GB z=K~#tEx2B45Zl*rF8_&@j`w5B(w&si*q7w`H_SqojBg_U!+4o*`JU?otBhn9uH)8q zYuAXKWOA!@(Jm|^LJOc_xh7uPcgQ}W=oXph09Ay7CAl_T$LuHl>{(P!+m6DQK~%i5 zSA2mY{Ccau+O`rD?{ngra7{^|nP{x@fZ)j|w$7Bnrt!dEfT+6R%vLg_86N$^{#Qr9 zUJhx@(QL`@d#vz+$$dBujhI!1TXdAYriFUd~qkFC~EdIVbN~{NbB)yx$KWYOXJga|atp8a?bg(7( znDACJGWuZ0^Th<|IyaS4O5LQ3TWNIG8J&Ga1u;0RA(1e7dCo5}N*f@*7?ol|$yjvX zU<+Bd0SQ-z^&TPXdMtXvN6ea3BWgTCuE`}m;A>lKRu<~Y{Bv%`rK)BeUB!?WP^BoB zP9)|$=Cnj>gz0L}a{0zc^RpQ^?F}^Y1#MQ6NcaYXgJ2eFPVsROFuM+Mz#rhGZ3;bS zA(PX36iUWxB0(h7$)bC`^a_hlUMR>XsRTMiAWWTlPFYiZ;KyBv@IQL)aCSViRVsq% zh^ z`s{`1AyPp)@c2d~-nkppJ+sdfF2Xcb zNLggJUdcG&S=YSEXjPM*+13FXKmf@mE zGC;>M{f%qj^JFxUl#h)Ggqj67vF$fZq6T5-N9id;iI#rI<(Ix(ri`4_xu{EM4lFM& zyEYr;bWB4}Bcwf~J$`IO!8$j7Zj_e*7P)4F*r;MgtG9pEk1h`r5%y zOd7AC-N{=lcnR~fKZZg#2Rg{7j@#_~r8mt+M}fXc(XBP4-}cV`LL%e4rT--gkMiA{ zG3|EQ9P9#X!r=$B-_ohD5>?;n-#_9NTUk9s1kmd3e7QLaQg1;_0fTtfXKIRMjv|!Ne8bHRk3uI zj}hFNsQ*(XKU&ckOutjEd7MEZmUxgb7CEDz6P6`pR0hzfwZ+QE2vAOyrStJIb+pRy z=eYSP!Nr+U+|CKV)c%Tbb>jF$uKB=mAI^Ie|K1!*@C2}30trU$%jvpn*84e(;nFgT z2=HQZhU@sT#S&Zn;Ooott4n!W?|-!b=el0M{otQ!P-!mmolx#3)zj&DA9er!WHhgT za1Iy86L3mZK{umnFa}X~z?ibV)yDM-;56*t4$LylUxpSdO&f{jl=wVBu_-wbF|b#5 z@0yuVj^0{UWrWiK6b!S8FhXfzTrgUuSSeQ62lJ})v@It#cf%I6oA@u3NlTA#$a=D- zkgriuq7BH&lbc@)Ze?2-NG#pq&^d-j4S46Su?Yx5js+d$Qtg_26ngo@xTCu2vAwFz%#THwb#a;TqOzoBeP9v!^rEia5C>$(X?-WxGo( z#sGDv?#K}0InaxR3@liBYgG}K_ftWsP@EL43W>U(Jvnls_W%nfVK zXRq8M$r6tO&72a378Hs#*8Kp5qcX*Ei|tn9Zv|75@toec>i9i4+-FO5R50#ecQtSCN*x@EHO%l&vlPn?6zbJD z=)L%ULzw$Og!!temITwnuok)`^rgi59!?tmH;-@>kRhmT;ZHVusJi7Xci&4uO(f zp#G&GC|oP694Z{KRbT^R1vd~*)rigu3CMtT?CLKB!-gorYupzO3iGugW%QdSSuba>loRulh+afFoPWaE9 zPT$?=DeBiR&GZF|1K6lFcwEx4Iz})h&*w@D*w3uD z$?L`$XRu7caET2irQ}W?d$8QqUCe0gCBTgVswEOjNOR=#>`3Ao1t!E3;}7?~C%P{o zt)M69#gKJ6W@g3ijTFlYjMj>K@~M4AVR66)eaKSRKi{8jiV;`Ufn}7Imuf_Vu}V1~ zM?6b24|F1O8_Ch#7+KsEyBpjmEWqI+{~t3Znp$?Xa|AD4>&Ka^U$14ivoty1V+tP` zumL2sg4MIRa4*x{nZ7nd`~2^S3K!b(Twmx(Vs}1!N^q!w3f7(+T->*^q{mAQH59L` zJ4i!IKq){?n|pZbRGRBY2#Y(MCKaBMiUmOiC_V~%uN|svCPY|wcEyMdsW4ju3=>d1 z1{oC~3u5^#g-dy@(iOf;B0H?!TeC1M6Bl}m6xg<7=zPx`FTVLw)!*EA zwmQ-sBy>R0ySiUkFP+2`=gvayE;x5=Fmu+_{|fP-K@%0$OdUgYC4A_KxT z$ysO~To0PKuy0fvo z9g+R`8QkhUZ!GT3Iib#%xa_Mrr{W64BPK;k`uI6=%ZRUF{_cYgd(^>Y>cC~&OTBDq z=W5!|HAVV141}mT%|h2!;Y@gCq=lp4JXf1meJ39hF!eFXUK@&|eoF{Z;E^ika=oqf z))~KbGO?fWk)7z^N@&twjy>~Y>;Q9qFC+Jb(}%{$0RnEy5+k|qpr}anfxnZ!KRsqI zxLWM3(qWejws#9+<02}Yh&LtJRwpW%3Y}Vvh;IDYIbXQm@d*8>YkHvr!8m1{O>bD8 z0V0_pi?oO}TgWipsrpHeGsCZUo}Gol>0DjU6|b(C6OAt=1Lt=@Zin$SrPE7=$XXue zI#M*$?o+B!X>sOc-N*QtI~tm?MB1%TW4@MGr|&r`-^r5Liht@_#q-M`;7!8MfU4OH zIwyjj59q1N-G^a*ZDTD-J7{D}d1vkqhwEqv8ch6~-gW3odg>`Y&O0@5zb!}a+Y~+5 zA0ARKUG5lv-Mw(^lHRg31yTv7EC$a%C8_D5#@g@gje{Z*nwm%H)?jw~440-_$r`T) z56n0fH0#o?sl>;8n_CX&GKj&3l?!t}WMtu_>1JiQFG-Fv`Fiu6r8oWd@N*-Ur2auS<7M9) zZa?bT;Id9rXSP@{^VKoO{yC~jqYq`5Rm-IA_Eu{UPRru(2vo1|$^3Z<@cPPTvm8Ke zyJ>+CT-0J5VNa!6o8sl^8I73OLaN)E^imLXci9QJ8KmH-wKUv)s{0;5m@ce8WA0I) zk-1zc>8}#S)bOSmsZsoRk;)$c2$E3b@t#%5sD=7`3vKcsr ztjj5fsNuX9KYM9Pep3n9r6}3`<$bl`rh987Z)V`;$@+G~>r~xhb@^Kf?nUvInZN@N zx=R7lZ}y{Ynsb^=*5!kh3|{Ywfo+MEk;DG zDaFtwmB;4{?WGw^cX7dcS;2Ik6Vl^HKY;$E1Z+9?!6l%~aDgY~(o>-wJ$hX!Vnj_| zg5PSWgfIXG?6}^A{FiE!OPl*?t7chI;uc>OsOD>xD4r*?H4n}_Y*K`1N1G4Jm+va9 z>NF=8$_IPS8rx#F1#8H=^Vm|d@ej)cV2=e4=d)K-IF}4}eNL*#)K`<4)|a=nmvEy5 zv*lzo$+(|;Ha?U6GY|Qvfc`Lsw?Vw$J(4Y&{=r^dub0HJ4fl)NL9OS*7v}eUic7wp z#{6T#ubb~lDGeX$)c2A_Poh|*$45V@{?r4r$L6*^hyXX9JP{|i zdo$I0gT;bWVi^UuTM;{l1S?PMurvWzlO+5Rp67{O_u!-(TM6!tWR)vAB3zyA6=+{e7Z;t^J-00Q z_Q8hl7#qlPA@)!6f5LVLwDWs&csVk<;(mm`>n-`a#`s+a z_^@;$IrEAmN_4C6bY2THecMLSjlK9G2Zr7DD8`K*aSb-a4i7o~tc|cOZYS7;(=57$ zt!8j_XGi?8j=LPTxLxtQau3Azo+8oNL+|v3NS@H99!=QiLge(+O?~lx@o#m;W2#S(hv+gR!BH4#7!tK!Nigf#F z{r=e_^SgxHdLq5Y5MX&+6HFbT_Bh*d;Qp{-N3psEe&TOqiK!+oHOG--Ilb6X5U-wF z?y|GC+EeHiJ?)%;$YndstrtHav;cSM26p#PHSs4Y?Wu&u*P6nAH>e%Cc)x3<1#akv zE@Xgl=baP15>H>%+G;-HT!k8+hWpawJ&yqS-Sr^1AK)R__s3IfOWl#2}k$(gv~Ws?z>*U(o5PD)X{SdWys|QFFR0 zt%eQM{9DMM(&axhBWUiK4ivb3l#qFgAF;=SkJ1o-2g~X{nk%_2=ssWMK;d&oiNHuJ z5e-xg)h#-Lmw~H_;h=8ofiEI^GDwRurPX3$l!3_w74|IUVfbCXwh_A|Yj%Xnj& z*5-dnkctA-&moGq@pwsJ2)IzS?0(^o*7E6ZCzJ#J z#XOc2sc#K5Gyz|mADdp?88~p%GD%cNaGK+5)KUrtQ}&C>)HI4bb5-au&P!LNtR1Bj zI!%?{Jt8jA?<`(MAyc%Tm|5UrXa0u@ahuUZE_p#pZj-o^xQRH#8OKNi}P60RW{ zObMsId^zz_f}ioQ>80f}3OaSyxjIga*Dxbj1V&1z?#quPB+*E5fdEHab#-r2GbEIu zHTZfd*(^Nt)yKWyC4L?YgU}isnbC!=b*=!(2*D~(i+~Fz!?OBr%6OpqLBMfWh*Cm% zX)!0;s$M|X;cu(q-2zln!h`xX@YN@|cJkO9IwGGQjrc4{A4}y8{t|p;Pe?(lSmBkS zdj;@{0=~N+CCE5$2((u9Inj@h&`$1Ak0Vz;W%`;Cz}@LeW0yZ@ z7#0OEMtgjYCV%hNQ!e{R**)a_rpwMlH1xEb5H>K@#*{4u8-qLfRHr)K^kIT7MP#-o zOWT003mbXx2OvB&!itIv|N0B95un!p6t6RjFfpyzk ze2%qs&TI>f>KnBIR%`4HJIlrop$5F5m}8GnPEB_66e-qtVr?~iQ*CBX=i!$u7u72% zA&D9i4zhpT2(b^<7?IQ_%Aq7R04YnzABEGI-=k5%`GzpAFp9=+i4Yu4G@6Qph55gz zddsjlv!-h_5G=S`aCdhN?oM!b3vP`D2<}ef?hxGF8+UhicgtbsnfIGH|NBSRwf9}M z_NrQ|E?G3i-K4EL)i#lXzCVbN7Ik_(4w zlpJ?u%m|818fm#cfQxvgAFlSNj`Udsita$f0SbRH=Oe^kYwyLJ}<> z7@+L;3Il3u)^xod%121zzWoT>PT7_3!jty||8?jn?LoSvw;QCZsQc*)?- z-!&aRn?tiyzXn^5Lwkg9l=n(i;JOcAL8=7X%whBY+)*)%XRL^gENwjZ-V^DF{%V;J zy>IU9yojQrhweh4@Dfy@O*_i>^WIYXLen^2FTyPB!Sf6Wm8Ve;p33p<l70X3<@01F!K7&tbs$W zdZN94b)NhPH2wja@m8ojd89H1;prD~^AN)7z%w-MkTWzU`mR0N3M91-&Kn|7)PG~u zQ4pgYAYi9vrLZ zpeHm24)eL3<;=tOC(G?2?n)%U6P)$ffyvd88orymvY;ldX3?nGMTB5g7XJ@(O4)9C zxQ?tW7ki+&!#!IH+-Z$;4=@|i9v9kjnNKx1@evs3v}{H^)*UQpDm%& zghzMSED%uFj-KqlGm{WC3(5`K>^k?t5n;uO45!dui&PeTveG(1@x9L@2Wbn)g`^5d zW?5uj-HO${!(%J((!^cMLE{3ivthK`&2FWpGXi4z<;Tgn^ydZ9GQR>v1q8tg)oLVq zijgf{$dOhfRr&uV#)OyV!u7g^&U;`EHV^D84O< z7;DG}5KWDu<2 z@O#MTe>)$4P@y4iRy02MX%$GaSSP8AzOeh?Nxbzn69INTnLaClW@Y%9*$pUYazE3W zk+W3cdydV+Rc@vb(5xPPz7%QSX{RDC#S7(3cE^*oQu*;}B;v8k$aqtloVQT$74ADV z)`+Gyz>b&@H*fWA@AtVN351bM$^e$RpLiZIucsIcWTX7t-p`!(_!`5Arj?%x)$5s= zJMk5>Nqb|mBg+qFOu;|&hgc|ETUKkue{n1>sV6dKuk-LlJr84_bf%#zR1t&Fvh`9O zDG|v%Hqaxd+QT?g>jiz$jU8S8!<<3T`v6Dn78Hd8v18;!*0JX$mPBNw2*K?TphxBB zP@LX>_^O_2KHqST(98i*LYf9Te)uAu)GLH45RkrT-cI3`lQd2hn$3SaKE9%w7t&!E zBWB1(mGe-lrHWf{y*R5XeL<}=N|Z6kC&Yg<1!6d+HT|?~qZF^jG)^cHe`x{@0M;X+ zB7ei|_STRR4j0Gt5U76x&?fc1d1I;OIt!&5 z1-l7frm@*?0h@864sTz-Dm;)uOpLWnPj}Q4+jydoZgkL`JSgOa>G%tL{nPK(=8C|v z#TIvx0n3H&dc%6>AL6FW@jp2r0)cL(>2YgJ1`JtUapv%}BL_gWL1>z2n<=f#TOv91 z9xsP5titU%rB`@f^%*=*OPmx z_oxAHWWzt>BSmWQgjkPkL`1-9scOf@gM<5={(r{_h|p7XJ+ zrV&p__f>xZvi}XFbfo$&5FPx&9qRnksP}b_MUFxV37fVBd-u(U(1LpCOOWdNos5rx z9z%s3L-4uN=G{7~yb0IbOeI759()Grf`ZW6w;yde`GY)Jjz3#v8=8A2OmXx+~` z&^OmuF2LI{!A!A zC)=o#QnXS_EuO-cl^<>$nlu5mPuTNF`Zj+Obgg!CRiMms*9+w&Ij8TN#&QT@WAB}?Rt; z->9f?i@v&pW{jGC#+X3hlGG&v@+|%F%sWyw8Efa1fx0Z5N&AQx>iG{96<;k(EV{F* zW%v4{x_LS`>^7~gCX`Wktb(6R6CZyFb3DZua?V7SwizTACA* zRs3bo{XZA$M{pqTVW(Jdb-LP5p$+8So%?RHXsJx7w4}Dy)^vm6ADv~5NfDkW9#%hC zO}IJ7iHNpRMh9+eION)j-(fh0#Bk`G;?7|?7;e>Y1&Eb-(i)yGWfk&^)~976T#Ghk zAoA#>t~rD;FOieF_|42N+}&nyeB_bE4fNeOJO^~5s*_;&+O#YyWnQ@GbE(Qo}t z%Si2EUxMXlzum_px*L~Fn`*PTOvo2qZ~NsYFyu@dNzjR)^F-6Q=`GCzXxo%U)N$Jx zDK^OEdX8;~Iwzx|;jSSvKkqNF9zWX|2jx@zm3;pui(m#w#SmpDO}hM0P86|`0^A66 zWMsuv#iWSj6t8WG_gz!d1zoGkKea&1GCJYPNjGrgG%~?hp7so3o6mlM-(_al@i8vb z9(E7|LTCbd(Lz7B6pdHNQjX6t%gc(W-cF6F1ee-K(@nntaAqh-9BC5u$slQ+wq;pfV>(5D+k+pvXOu^(KiKoVddAQ!8hQ*A6Uyv}Je`HM8`Cn%=?15psUeOyW z#6(bYVClo%H^yn=w!$VmjjNe%G?Q5iW3v*8wh2D~{t)tzMueVMrl4UhYj+3jkomU# zp@~{w7B*l<+H@Q>r*|k7+6CJdFv_G8NW&^sqM%{tyl$YX3XYg+cO5Ve6ao_EJ&o}T zE@~9YDmYUtt)F6lv$#jWjm64R7brYievRwfHcvS*vGMeM`u0=2GxhB>8XlJqVLFPR z`lynkRcsF5mV7hRWaYY}3~Zu?NYs1@3%CQTN}e@ke46 zi2C8g3i}7zv^;AbqI-9wVoYf7;G!*hBwh0jIYYE_Lpr7nGV+MqD?1kCDZ8S!u2dPP zZk2(*yfO*vbN7IeyuG{FPhL`q>lX=21%SRB)_oTancaUm?jTtds~v7F>FC|}Im z8W$%LSSkT%1E3!$^m)E;_szs^e3Ef7{J&ll#1^If2!i7Lw%HBcZ3?9_YHArv zF5-cvK3Y6{zP#8YMh4?y9l8`GlvWO8NS8tAI|Z$82lg+}XBX^)8Uip>6FapYLKxn3 zUBMq4t8x3rkIX5j?mEuKY}c9zoIVX`Tn!Ysz3c$E98ghVw|1 zvJ;W2^?-Kmdo^!fVn&{;16If-$9d|vVNQ*)X`fl`J-!RFA4UmT2L}>oroZ*Uz&OQJ z2IQed$z5s~6+&{;Pu*};zOUkD+bo5t4(=2-myA8L4aguwrk zi7I@t(1-0Obl?^9HDbnP3~7M7!kZK-eAa2Dz&K+&N3CWRz=m|0rOC&W9E(6PfXaW^ zw^A!V;7lN*2`#Fl0!>&NnOlu9g$>qtG{Y4RvBko^kF%J?aCVfM`uWB}B#;lJYsK2k zjvz@vM)D&Kgf;K&Wo~wJ>tBqrmgKRQ?!e}UaE_H+9bZdF^m*k})1Ce9JGp<%&{$>O z8M?$g=T`EwT0I_D#~JZk414>?DIkmOz9C-@I(!q%QsMH)d~_Sy_gRUj-eA^}xwN>Q z*y=ESz$4uMo#U@RrZKB&TKVj96z$?`9vxB>Uj)pMq8%gdlg_od^C2JnbM6{dwC8s( zb34;7j6T-z>=(_Pf+k;6+NWsW`6iO*n6?9tc8my*EK?Bgielgs#C82rwzHjoj;ukl zOcp~L&Y}5=cA_`P`8XW>v_Vdg+f(GP#ak3_tgS$Q@vhrv0v=`m&*5kYPKGnY zf{(iexZ)~9W(6nH%#deml5rPSm_;r*#&%KkB*b1bQdF6Jq<)qd*%Asy}a85!m zFjFe%uN^wZOqGGACq;aas+u*$rHD;-Kja?_t$f+vl68ALjQrtB@ zQqckPRb1XOPhn*4U@zY{D(x{Bwnh71-Wo{EdffA<_dKi!^QO4%`*Q{a&_p~nPtng3 z1fTX8zt&k!;GGO=h1hXQ^zh&3L0L}T>4QA~W!e~XBmMcsOmR0IhK_ts_CABW_Ph=Y zT7n2PoS>I(pPAqUQl=oXB#&n0w1Xr_!0uh>0>VwBcK6QHiP zDhK07Emb=VZ~!VzNEde_^!X}(xD)Xr`=!I#bW*Q`=w}%2H+EyHl7!hrQ01mo-DK+Q zV-8mA^)=Shg_#G!h58EbSt$d}1 zVP`d4yYUM+a*tDRWW1!@1nu_{+=rpJ}BX7#&K4!?R_4>DWHNm42d{QJw<00R=VAt2g3#l3lW3w)*Tn(M?6VrNSW246)MQ2?o)r1x9E~OB z-l;Bxqbk&!Sk0l|#*I*IZ^w*BfA*sN@NTo8mo;CDVaKdQT8?ik8)^P#>o79cAk+)V zwxOQamW+2;9(lZCL#;){nb7$*x|_s=Yo{uS&QOS+bdc7byN`@|U-Petp8qwD!R+69*kxUj z#QI!C`sl?skJ>O3dfc;fkL{xj%f^j$+=QK&3Y5p0uaw-c7o$7q=xtD}UtFxIhh^9t z_>rkZkbb*gIsS}d^%<0?gdPNSVIIfQl~I&3$A_36&cD0w5*2ggR|zK~fC1#y-|P!} z&o1eo?%JRPqzkZ+nU~bWbv=ht`8U!BotQDVR;{YWX(O`GPKg5WrYjI?viB(zZ?kzU zud~JAJYj3lyBL(xthmFu_|0qJ;%>Nl8#Eg~X>Qr9o~MoOvhm^P7s>eHftQilN2g$xc1KgxU0QcQQHtuu)GoIrR7#7%{BA=#WPB%eI-e zkL?Y2+`8x1V%54|8SK~&toY*FLUCf#n{L})BZbF3nJGEPh?8md9b8Z62}~tn@lBjC zOZ2bj|33r{^U-HCxQy1(Ozo{LCzh-@=+c!b1E1#%SLC>2Bs+D83*3NOrY+g+Qz6^0 zGWT}-SXlPwU8$I`wK1s|0SD%+q+jO}omXTCqgexHK)*xBHSEatu{bR{&m+wesQR{C zSyIKehNROHSyL&v9O7U0k7Cm62>@||AC~c<`Y%6B$Rje6lh51U2B-+v5xlz|T=G_r zV|et2>#*W~4>c2Wqcs9uT0L`l0lC$~q>%pghVlthmgBEx2EJV0!(GlHoA9yj;oC{7 zQWM0Nqgl>ztH_>mWOi9kU+gNS#cR;mH|u$a^%|Q3@}FG~*olyq91ayksFd6gWqdQ{pRP5+JJ zEUXEa01EJkN<|FM6xHKMOZ>8N|22dkK}QC_tBFyLG9|4lSm=aEb(2X(yQcX$gLmvF zV*<{eb^2vc21_B>I#I*iot~3%fb?LH zn@k*IE}B&qEDhb}Zi{fPd~)JIBhE=j*6!-D0k0Ml&Cx!iZi8B6kg*i1%A41nx4t-f zj*%9CJ4~5?FGpA|V^%9sj^sBCgN_V#iBACb^KJ(1wFry&?U?hc9%feXhBnHb?>7y|o{(yO@g`kVydrpsBs&m@aOByebkOeY5;ddWwa#T9 zljZq;`-A*1wKYun0q_jIynirL!>}l7k**YQa89@A8GY%OP@-zC=-@%b_yf;z9*5#) z;zWLnQN+}F?ISW}Q#36UCXuWi1ImjWq%bYAB@<78is7SKao4(@J%{!r?KRnXX0T-_ zg~+i$wKh7sSQP%a^o4ZOu#s*7JfLO1oa>U>;~_kWgJQ^mxR*3E9-Cn9P; zmD)>df;+e<11()~=(<%Ja}bpWP*lr~%u|#{6E{5_cZ|k{u035Qc@}h%m=Vdl>$a zihOemkVQA;E#RS}m`n+?#D%BB=vhWxldp*-8K1g=Pg)XLkvs6q-80jdSq9TF1Bn8^HwFX_%CoMY6aL922L5e`A!Z4;B<5H~V(I@Ynmu%jqfEH`0 zqOS#;5dE`cJyLCsumh{m`PEh(T{B%JLxJ*0;GyG1oUkF3o7O>~tVl~1fx@)8iA6x6 zQB@CfhM#&BVs(M`Fn#UMnD-SkrJ}K)+`O3AF$RDYcgtRQB7iuNdTbQUVdQXvro<{) zl<=*U!z`zhe;Xp;g;}X*y1DK5Ba=zD=D|rq#JXxvBAt>OO77A+^?*zev$+qAzH^9_ zKQAt$&ZHRkAetGaPWpDif%fO$mfk}!$MkNb^FJ7k)}l=rJNUE$ zYGKGchuQ%92&q&sp4)U}_O;XaxA*r*L%#adVT=K^^7y&29j5Z|@wvNmpJYmO&B;-B zH~&D2JEB~gLe=b-_$u4Wq`D~VJMNafm0QYPRh^9e=dcMZ^r7-2dc6`6b#>y2bvd$` z9ASC#`Iuuz&d_8pqZ3k~5a%y8wGdCa0U1q%c^tYJoB80y9o~@+!MsQNbr8Vw zGAO}N94`!scpG@$t!rS7q5W~9hpomtiY1&WMVE?)I}^^J+@A1)zCmAsr;yc6@DnkiY-5) zMC(C~u;@>JI@I=TBeb&zWYHLvo@nK%Bp4KwgpZLs^|C)g)1U*Z)A)$AbMV3WkK`jM zmT~Cs?6j%MMJcFeiG&jB&h}S&Q!+OpY>|aT0;1l1&Ez7F3_jr~Y^rq+j9()qiJ_sY zOL9E1c0yuqS7@Kf+vs=AJWgra7L^&Kh8fo{sU^maR>MazUYDuu?S$K#k~y7rE-d;GFlvIjXmk- z$0Nviz_ENn-O7#rEz|4bKGQHy?;TABTS~uQ<_6rqPj^YbBMM*$KBVr~s-mSAwr~6X zxzzs%t{?T=U&r{E%;e3QZq9x5wx#FFJv_X*tnP>Zp->}EmV6(}XfV`Mw?M2ZRj3#S$eHXSqEaeDsZ}|fpjd2Dgn960}WAuac zLK{6=uu;P$b@s`?a$C<0_VrUVtaKIahm;T10Kq zIl8c=c{}DxWX2Z=k+up3g^&QE$V#YCBqIF(t?$qC-t)Emg%S9;N_uFHJ1j& zU72hNM|@ofh<=Fh=|nMcjQv1({Wq`n|M}{O7_KDAG%=B?Mx=M-WhUB3DP3qPRaz-g zcq|`q^3wS@Y|aNqxb@qgI6YV2*GEQBc2KYr=^D+@X@A<1#tCm-+Te^+LLrrVhNd|b z)#3XYnE)PY2l)b8GA!QmWZ3%f*mk?eOj7oA-Ad4XC}7}`Ebnov``9~U0+Cj_gt5P%fj=#8MhhzM4Jib1s?U-8`a%2i3;rQ_-;;^yhqq- z5=n`1O*{uxH;zkdZfXUTAocsix8J$>y9RLG+BT{_-UTil_s{fyrx0j+-Fm*{Bkl*Z%ati^`s= zm$K$|_ucMb-8DcR^+GlC{1=yyYg4m-3Ap-LT$e3k%TmzOD2Q1%$CvF!i1)fKP)hx0*M-yj%O@*3V~Iap z@jYu}J`6LA;Gn-V&i|@q|4#;au_1`KcX8RHbAp`p6k&6qyhporN_Fr>uM${-D&-|6 z@&!{#Y%NDq;;K~-3@dJd=&3i~UYBC`?vHPy#BEXb10E}DvwYug@+0RMFrlbr{G7ju z+$2h3*>4wv)H>BuORwuzL*+W)yArKH=nPp5eIVL2sfLCJCyRi(3Z73CwKf zfd${huOXF9ps~O$Sr{24LtK+=rs}-`p1LiqcP?-+$MgL+yTu=*zmw*r5ln%Emg-w} z^KM=%QB^I*n#^lFJI8d~OFX_)r6|ukKLPJXk5@o=aPMC?7*pocUkAJmjVkGB(ifpx zG@PS{%N2exPtQ1GjK#|`DmYjb1TXe{c97;3%dBHgFR6Jx3+8T98AX5WEXOUR+hiAM zk;$jSt-Kq8ze^)DFy_#O<7PAGMUvuZSM2IVoWGs+6$Y_fcElt+E&MF!$-0Tn3yBFq z9XueXDAWSCIlPbFc#6K~WdXPtGrj35`JL&_R0f|>L0)8H&w5nhssgMO^SpFKUByjw%t7{%*quuLZt%yvWEzvBr_BI zD4>5g=@v?0Q_LL4Wtunn?GghJ9xkiNAniM1t`~SE{Y*UVCAf<9FpMCj{DhQxCn=2T zbD{GNnVHHFxC}WMY}qHUCZuw%ydC7sb_$o=5TfbiPpd=df#WId7L=QgE z_mGyEF$)L%pj0DY|1yaOSotz&g&xoU%1pNZZ3#1mRC1aeM{A$T9Bql42Bj5EE{* zzrnvrq6Md6Q}PLSHA*dY{8k$Z3deOB5MwqkOXHo-!fZG6kocYW?FDK1-{dP6{Y_4K zCFlnDd;N+nXGSWbQ}7SG_2A?##$X7XZ}W(jbjS&JJ;9>Fb@Y2O z&GyxbGI-8fb3ViTKSoo^K`2b*8JmWdhw;W%C~=EFJp2h9j9ucaHpkPkC>2(U6}e83 zzVrpYftGPd8>)$&n|RLN&b#Euxf5iwO!v^Mg4^oH{j;4%(#e(R{ie~-I2wMA=zQf$ z(N9m5jT>HP07$kK@Q!6nz85Rg$G9a@<+^XAP1A63eXo#Or*1>l#eMQKY>E{a=7G2K zU``tqmqN(4b*+tQ7OpsF@p#z&H{$+{f&f&B_(36pB38j`F9E~d9YZJzDrOCFV0VNV zIS_I4sUpjFmyYHMJcqDkYRDGRkkEW|giJ})5K}SKzyf)PYZs70=+2-NTPe%`_y_Yb z0EtVV4ky-l12@)Z3zx2c$znKKAxx$t7kJrjV-p~m=VV$d7A>4nkvcBw*RFY>8dt*E zl>v;Pv~w)fpy@G+j}rDrK1uSa5olVL9*7~!`87V$@hdR&Q#R8%ZUE9RJU2w#5fr|* z$gw*CP*{&P)}p=1w=;~&28!+jxV}~~yiDpE&rRsO&M6&QeysnXctF@eGS+u2jSo6T z;*HHkbdc7vF)-9?53eJh)N`GXkzDXjQq%-$EZxgJn+G&Nq8Xkv=HQ=cPolV*9jX)c zvD;UC)a5hY2Sz7fylq7iyjC)^CB}kv;jnGJ`#v(>on&7RL$n9*ZB4_p{y8{!kyoNwQ{~81?mP&`+xX&4hdf;^ zMyTMzP_If7h&|GJD;bukwe9CqtIIxuVXffNMlic}0EJ-!P9LTo z`~*fG#sqYL%ZJJ~c%!Ua?ekyY{ht!^n|RlRC`dt!@Q@~*X9U1%@e|ct+W2nYPB%Gl z4-7u6WwUs^2~w#XNSt~dJ@ad{qoP+%vNJIxt$GBpOLDYa1<166X@j$17AUYkqLU(% z7oTF*JATrw=p>j#gJpbTKSlwKLKrucvMiDN5TCT4=@K@d{*3nO!}XXB&>UNHO_RqY zp{^IKwy)hO`>A%{$-3CU8Iikihx<_>$_34IUjy39Hi zhmvv7BlVmivsR%wCNn)UiZ#8I6DS#h4{E9rQJqoRz@BT7l9O1!^p`jcG*B}oO;?3< z<%pRYvs?vMZu9n7!8Wn|u12rKW(|0CZnuCdM)STHbo&xfm}TJ|wH>gf- zaB@z&r6$Y!2iaULU&D=D&Q9_H!2bU`V@6_w$8+-@T85AwQLiy$GZm42MxrbXJyuRy zu(w%u*o+Bo)?FqU?GInlW3ZNiX1#V}JZ0nMKB56JnJh}Y5n-=H~$brm} zUksP6MD;dUd#8f5!=U4v2wvRiamNXvJ2h}+xNQr+VvSA0KueSKb0*-cZ@t2B{()L1 zT2D0857YTOJ%G$BXd_KZ`-p{h&Yj&5zs|8xII1SS0#6pb85!z$L#bNqHiR2zX^19u?Bn%M%@Ibtxj%nQ_AI zSZELZ%v2w7a=J};n|24f=Uy*U226Z(ZJB&>G7Gd|PQ#GcL~?m{k67`_g-!X6=1eeg zq-x#ZE)9aFx@;CRKaD6`DAFN#ZHwL$U4uUrNt+uU4rdv+(CDxOmpt=FQ`>zc!d`6c zQfJ$VTAQSABxS;gLiIZBH3qLQsB1RFgw2l7`ntiJI>ig)Zv^oVZ9>rDjikd4m%Drv zL2gU=oS#>nP-URUTq>2zqJ#c%OcX(EIPgUY$oC^Ei|~UQuKhwWDPk&)YBfW81qd~XL6)X-4;KsrF=H``rfa6#W$lSyn>0TE zdBk*}h$4_8H;R_S(1szx1dA|lKTDWQRUti<`6xncmRpNrik1xShuL!foPv)e-Qz18 z5yABlkQ5e;R3%8f={^WavJm7@M|m>5MyDqFIvgAEm>vvY9t)qLbCxqo1=r#1s*oTy z6eS3RHHoCOUi@tHz*++-)jy0PvZvtrF~+hV;vO2*VZq6=0meHMxqvA}zR)YEH7(FU z1Y^NCI6xza^@^T_s7#47pvxFVOQt&4uR45xjB!=8OJ^ zgni*`KSH$>PX)j(1Q_8|yusBgQD(7h_l)Kh;VST;*cFxQOpSG7Wl+f3I0GTh@ zziGZNf5-PqUnj?ub40-G7HH4iY^1lV6FE~;Us%Lj!*$IS>`dhkgZ6gi=#vC2=hlF5 z3fKEsg6&_aly=FyuzE{acD6RR2VuP)M-;>d$3W}fgQ8E5>EDn~5p+OVrC9 z(#IMU6xwavPIBj%hIL3|zpctPy2~CHDUshB${}fwJ=T(yCi|jV4RzE)0kz){X=Csb z-bLlh|41*HAY|BlLdR3wxaH)3QV0JJUQiI?>^2D^mlN<_vPag=Ij|?FZW*S@yzQbJ z7$$m3^lZpAp!yx?B{XjCXSX~u@_eYH@*KN>b+Nf*_&#QxJ@{a+&q`->P`Ad!>M4*# zWL=|r?kaGPqmcK>SZ2DY()U;{vfuQL2w7T36ZVe};g20Ck0~@AA2Mhg03;xvafJ@O z8db$SJ=XtA+K^L_lBj5#nude)8HA|{1z1*YDg)2pPXPujnm^+nOI3Alf3%fWARrBHz z*jD?kpz~uq;Q-=dFY{g$FKo4avIJF!I%NvfdOT0S1EtQXiGMNDJKL~&_jDKdA2U9J ztZGrR9Ro157nM>lnh6k361nJ59Rv7{BP`MHZlUG$&fP&`8kbKl(s)T^@YhsaDze8v zz~!>*EUeT@l~J&Jf-_%uIV22m#<$HozpL?>9B4VTdNuV5H{pR2xhbu%Y@_xF1F*?N zizDY{fo|jvNWPciduDDRbC<6>TS)RlJi*rUG#IMyReHX49|KXtG%aP>7P`P8WjC|3;5Vx;#);#TeUy-gxCD5N@^84~{)I-y{T> z+#K)XrisBq#)BU70jSM}Va%{PVV%(G=*o!zsZn6dn{Tx>t#1{15>g4%4?wn#1iSQ( z(i|a%E$THXRgN3nF+pN5D%LqBXlTxnU~XLn>Ui92ea5WX2~Q#89s%07d0@jHSvA~( z2k-8DLD-~3SO%VMBqg%=6q@sUnI^eRl*%qE6A8Qu`r*Wyd=zMV+JWX44@w5qRZ-WdCq| zGFLuICshVI_Cl;l=&_lK1Y%13LCn~`uV|uQDTghXCd1L(Hg{5;@4`=j4#a?7Rs79y z!PeF-lC|lD@APYtw_-OK&mTKlIF z;~oj)=m_;B#ev&K0W06gKJJ2;z6G5Mg_sx4-yz0F6A20R&KN0tTt&=s{~m+e%5w$} zA^*pR+N8F=j>|7BhqY;qG}?{M`F(V}sR)uNCut;H;$j$QAc?u0=H{7JCq@9@iTDfq zx}W}1@aZ3(^dTvH|9}aO;&}{7f|jW97-Fto=76JUw7#wLZ<)P}wNAT&oPop3kMwdf zkTwvU(jvjT*UR1qX$Le z<=XfcNz7@$2DSY(Rtpy?=p#)yvA11cLt+Ai&!@Ai zB+?i8v$ss1;UzqblW~r0d9)F@pjqXB;l~GK^J2SR6@ceqiw{ET8Q!=to{&vN>7XIb zs4<>6gIfhtHUncE4iO7qp6SH;F{}%JaOKylQlmwGa z2Q1^!c~ovF!bG71(UV)mr&C9nXXK2LUt&eqT#hM@pTwP|RMPrYNMstx7$1&+j$`N5 z&<9_)$l+$$LB%|q1y0Aba9yn-f{GL*Ul0#>Bt+m+EMJf`TzH6)E?Jt}U3n`Zn-LGBw*6|#WS(L1sGp!efqnY&Vi?nz6TZ>8 zMU$ME`ne{!glKqrh|5vJ4N>GAz`alO~M<$%?T_i-|SJ>w96Hr!Rb*tyWm}|l8f_UD^x$O$A(gBg1^aa6q-!0wwNkoPLUVaZ&Im!%s)nZ>eZC(Sav^FPm*+kEeX zYICKM1f9eOrhqNdy-ox_mIv5S;xW1L8}rQxoNsGnf4Gg94JIh4&oHFpsEDMmwK4<= zP2&?tLWGlexHh(sZB8iaPB*%A@gn~OERk`&-g-vxN7k*j@^xjV1M zMN8h@?$z(!j~(qv{|-?a!_w$m38!iy1s)sVDLq^hTNzwj7cb%Cnw>wfD?;SURm;~O zXj0nQMqA;wCP5+URC!b7NX|D+Afa*$*T9I^YKEgJo;lX6V8hw90ktjGdQ$i5oR#DA}am*~1IpJPT5 zk2Kh%j58+ltd|}Nw_XX(z7kkz9i%xiNng4;dgsQ3``T|3~}u~$eL?w7Sn#@ zU-Iy9`*}-aOmi^FoPj`L;81|=O=M1L*?Jvg96UJLn%O9W>y0mQUFEyT{c1+F0? zK~jFj^l0Tl4UeH_z|nhb|8|vP$ygz$CG1OG%z^3gZ(C`j-}6#g2@4QMO9v(O=~^+l z^Fe@g1_(99xrGjg>ezG-utmyE2_iACb(MY{Mz{YNpTo>N8h#yExezXTE-|d+m0@37ug2CH`-8qYLzi_bwwV%1{KC;F zAT94v4NRFyjMzv-Ru_vG4I;fU@u=+;K!+tVML%iJWeJ^o#ZqqR(|_q8_;oOxH!j>g zS~nS7ME_n{l=6 zK|igVd;v^$n_7i3Zj97&V=W40BAzq>l-;V&=TLUc`Cy?Lym0<&5} zgL;}*3|@ZGR`@yl{<-O27MJl#Flef#7eZs8ndd(JVzht*%rm28Nej!pbN8znn?#L- z4(6{kX~yAcY)lVq;NMzME$)`>CqKvM$b=bzgs(%W?dgM*YLHOw8laV|@9`EB^*+A? z04V-}2$oAVW8PHs;Pr^J#(SiqEY%%Q?7W|49+}J6t_Ys8np#3V4D6t`V3vv2nz`%G zSH(QSlf@feYux-6?6aUUDMaOvrYRTaRJKvczt%F^RS~k(tLniUo>8tZ_JheB7&J@u z+Dv9sYbFt;5&asXn4haTD0_PKW1Pbi?eDE_RP;iD;S-KQutg#{nlNTO9Bqc);oP%R(dE@4s^55s8liGwV+HTBVem zy}aCItnrOtzf-lSRm;4Cpq>^#SJH=U)PIHQ`s|urrSJQ(zznxsr6t0PhJ?1ZHav6X)|3hO3zoXAmvKU%ns!#0Ny|)^1MWjyha~8;J?rxbu}urQ--kE#}07VpR^vWM)!=Y850B6NrRp z)tVvpbsbPo38@E|m&Qcduxo_TjT82C3r96gXIennS7?5G<}yN38bbbmB^p>pICrZDK4Uhh$(`zYKE*62q~E|nx`%#Nv0MF z$R^a42v39y-*5eE9E6lGmKly4{2aU1k1!<`nm<0%|CMVUEVD8k_f7 zdsAL}2=|BZC5s7TfKHC-wyq)MsJs} z@>JyAZ2ysmD*r7HCFckW8LsFl_um zm7oaf(5Pz=XP0W0LP3-8y;!sa!Zg)6mw-vF3VZj-i{*+~JX_>BpLL9X7=WXvm8OF@ z=CpazPM$twUrNYF)U}h1O=e%;U!xNmkTMGGxO?U9+%K+abScAvQa*8FK=A$v)!cR` zHT7sN)GbIz%6CYMjp1NBnr2X^-RkITsi;Jw(!^g#Cbul?Jf%9 zhO$bS63V|!yPKEV`MA@%SnP)C|9|KR{uCohqR0>bAb&w@G8$wr$&X zV;r$<+qP{twrw{_V>^x7;7-roz0dCJ+V_5OKhK|Ve2%r|nsbidcMM^|3fmSs3OK>o zlCN>F0fQ2t1K6L#g&b~=uaF_N)ds~uIs%Gn7aO(SPfK7eOA6iS?dirBRFk%68i#qv zbGAEQOGA|X^YjEJ+Em>`>vKScl+#o^nQ=TvD?eX#sRBlSvC;JwC*pswQL$faRCgJb z7czWkAC&i|(UcaS7{f0(R3@c=W6VMkmc^P?RX=3{;K!q^6}HLtxjDX)2J7320qWd< z$iU6*)2C|GH|)W;MV?A($V zUgqDYGCNB0os?F52eA5()Dm5RZ>bIu4k_OD!-dcLY$TVPv}CFF$L;O~M(fShB}=SA z$xL>jA0dVfSgp(aop(g;#7h0>$Mn(?9OY{5@|x$aAmZk1P6(u7r*DMW?^JaR8o7dW z@+}t-m$MovmqK}SEskeAr(Nrhq4~%@5!u$XXLy|odvr>3f^qDLoQWbe>Sb`qs6o2- z)-NKk2mKU6Gspi)hjUe|STx?Ge3G3ZyFUm_LZK~CG?=t3fZP^M>7u>*K3iI+te8q> z6D{jfkyM`ntCX&BcNfT}uJA{k<<@pbXv}?1NAVx$wKr~Kq*!90HMuLg%YD9_2SNVP zC(JikCWWq|kTP6D>-NznL$Gnk+y~!dfNX-q=n~m3DkwpeHaf;`IHw;=j5Ee1R+%-$ zFbV*XSc(I`rzP@8!ujL6q|44{oZUWVVi7#cY|Qd{k~;FT(iDa&BEojXCm}^ofXHp% zm__)H7SqT2@%TYoMRzhWgqu*J!ZA0B@%rGptkJH1K1sIx$cr|`g4bVoRJ!{l)UGYV zKA{bK(|RsqfaD>OLKbX2ZbR*)G=7kHS#@OWyC)K!><`iz75#(RUvKa4s<7acQ#?=H zx4GNz_P6fRXdXgzbMQJ!htoYfC8^v3q*1KNq5w1py;oa?Pn4(u5!1J1TF#^kmyp+K z?AUFoDA#19o335Y(})BN^}$=0dM%3#{kDtc6MN>g_^KWHNRRnUF*6FRIJz80pa6gA z12zZm+A?VjSx4OTRC-JDj0N(FqWPqw;#*TS#-B0145Mtw;EBGnFW0ScqtP|1(>rT! z8DtwBPa8%qrES})K-r-}!%R>9e8ev58^%B4H)s}gRc$LqksUUt(~IG@S)@G99AK&b zyb}5Vd0;V)xJ0Se)VHC#id}iEhj%nzB3EL#Ps5BV0v{&fLYwd z%K%w|dg3n{hDgQ0pXLjNB$-c-;j7}U)~JQD$;FZ?v4<4*jz&2(8uK~H$C0KT6?g(a zcD|Ocpe)YE@0PY*v`+AMM&^WNeg*%t@Pd9DSfjg@jFlVt7aV1gDphR4tISIS9nUuHasaFroHHZ% zY%0YjHqaicwF0R&GpbN#94s4so@zk`s=0q#}~&3IWIkupgcgV3#;Te2r(tq4WnU4d9+R|#UYsEn{TPr6%VuI%Dyd+SnhVwb!C0vc8k~CyYJAafx9OpE8cLnu zz_$`1(P>}aGIoH+VZc$9ytSFa-tjEcw}kP&eUv7=;>18^Q*%5n-q$okDnVtfQCnx( zzo1WcNiEa0Kwe`#UMs;}==?4J>-Lugrl*R_AmIe<_dHIA15K`H@5Tpxv5e#zOkQZJ zB6e<6&$~Y>-t03I1`ipBPue7gL7W>*`m+p-IW8DTkn98L#u!^8y?#aS#oAi45xDFQ z)roz;`z`KMF@CkotnH)zYCp=C!%Yti5DFRf3+6MttUaqqbMl&mvTRpn^SwF8 zWh9mhqtoL&Q{eJQPn{nQr2)rxAuf~HgR8z~Q{?v}yeP(;CF}2mR5-Ii?5buWak za<33osq;y4@`mIPH=-DZo;>2Jfq_}i zMHXAVNlj;cUXQMu!x6{qpQE%p;*X!I6oyT6=Vgj+6)z-QL`h7VDI~d&y2$GYm-KeP zP~HHUYCAj3K4}VHa~8@edSL?vxS1@wX}_9waW0K`hWphaYCavdWEV$lw+|Q)9|u=0 z!m|zMGG|#weUEpi#m{(`K-}J9X)769uE>{0RD7B9p<48&eH%+x1};QFxyEbI9%v;T zBZ!x7*CK4qHVAqyHkwX>B69J6-Jtx29^VU(f)Xjrad3L_HdIzo4X!}A;Mw%;>-}9Z zpG4f*j&{Bcxel>NrbYDFdc$UZ%Ow+s-ctbE9gHbMIOGkE9 ziUm$l;F(!ufaz3(4Ohxf(U&u3uqDe99i%%@vOUkm_>xguI}?GC|Ct4tD|$)) z9Dal7q$Q`bS3M$a%+cxnWy_^w-`$oN);#ZGq~1K=oGDB>xcVsO(!eEcv3yx}52Jl_ z&E{DefVxY-J+BVXN6JbOs?@`{L~#_LaT=Jn1siv8LkU4ZAQ3j{huq!3Ji!;jR$LDW zq-XQX2V0cL0;3^6qZm;9&`xYszE5r7K4pYfcwpx{#?S#W0BPc&;eK@!;RKVjp{c%S zrMolg?N&|u$97M|F&a+k05;eA=6e#9%h@drXH!QAA&3?{m@ECJTzTHS=qAdVjJR!z zq#*@uics|6i4%pEP{hR{ExQ>6x=KhoT$64J$@UL3$@4r|5M6B>hy-Yd90qsqHC&v7Tv@vRR zL9Zv~XTexu?v74ESGe2wAPA-~2e4KP>eg=)c(i&KJtx1o>Bz(Ty-!k{%!%a6ec!H~ zv2E(}$x-C3sJ^#dz`cbvbAm7dY;)EuHKds8+I!xCIWH_@osBN!u<~vsq2p`Hdgk(R z$GzsbWGW{e-GaN#HpW2csiXtT=PeV9gNDDy85N3LrR!w_%N^QMS1h>wmJ9zNrybC+00@AE zTy|zB&|zKr!MJmbbf=$@X!lAa45Pepq8v;ShN_oN_hf91Kw`f|j~yuq@&3SWiMD&m zPPy$i?4?7M$fH7N8b)8L{M|t~e&$YszkxmDnQMYI2rfiy7ouU`T-0^#0V5o_{Ytv1u! zjjx$Enz%t4v28^{cz7gEQOW~#-KsnUI?R|?B*syNrqGWUq?~u%3Z>nLGr6LA7NZrp zv5(Ed2_sWMzkJfJgl;oHGgk!rjZRY*5b;!+UxHJ@rdXPFLn-4rgfK*V`m})J2=iyE z?rDCZ(*y=Ng$qXNujWf3DEuPNJ1M&3b4}4^{#4$dNHcL4K|J;=9TiF+pj-5vhMEZY z6sHz4`JP^#`%~##eIL9XwKqsuVnp0k&3Z2wA)XZR0hZPwV9mS^G*;ec2IJ4UAbdC8 zgXWaf=%^&7*`9*WTn*^- zKLym*;6EBh+2Ui>L&_ilyckL19E7X~DyhO{=62V3%ZsQ)EU(>PdAkdr7%mh-ZuJOK(a zSUl73sV0w0lmr24DTME;BnDlKE+dmX*p51iiVHZbHckiRNE_H~H#M7F2*`EU)TisUPS@Rt-un?lWoNKU!3CinYF_hM5zui(8ABM{sRim-$m~3z&qsAP_PE1!NT5|L`mWB2x z(!vBv2EJB0tj1oa!k+U>98Q(3n^w)fstu`yv~SaplA$(7N*XPcl+h=#_|x|7&#W5n2cDZ;#oAyc4#_6GF?GhGX`K zKNvkvlhy9BBwJI^S%MV4HEArEF>R?f#)f*10V%|V>AHdd z+CH{iYL=~CcuKZS)P-Aob7S!=PIG6d(=_pdrV_?R!kfq1(%(0!gWZ7-mGRv>&MZ#A z8CTgHP79`3bb{H@m%8#|mS$RNr+nFX7Nh>gL+wb^%w=FO zhYUqP8#%&Uu2P@HB7b0S+{i%T|95OU6YcmfY-;Yutcrdmzf@9nNW-a)zgkK5qD%0} zDhTZqoH~I%++#z1w@dNpN%1@s_da|2nGs1(#Lrwb$>K1h{l?pBD7DM>o%!0AA) zHs+H0=WFCnzZ==%c`ue?FoqrZYX-HmRJ$M_tFF<*E7TuF0GnF@FMO&NNwGSYi%Gn?+a)Us({Vsd)uOFD8N?dEF1e;{C;?$SxZqH06 z4Wj4B)<0D{k;C~YV_v@aaKwF{lklX+CNyjnr>!O?))h;hNbIvjMA~@bb42i13PVPc zk22y6@LJ8GoC2NK(Yi%8UdtbeCmE@yFez!2Ov8%TKi9Rvww6YkWj&;AqHE)p5J{^< zgc^(&$BAn8fF=oi0VZ%@PFrptQjEA@8~Z}(Vz^_FYKAD4_!f>dR(C9|AShbn$mOQU zCt6GQ>uLUd@dV-7i1@{q!veC!yOaTg-*k}pA(WA2rQ!QiLCkmQ{H|B|QU?3qah2RNrjlrO}Zuq-a9f?tdZsVF=c z*Qj8ftLj6-gnd`E*RSp&DqB&pD%C=OeSL4!91vEekNwSG$+wWCFJN9gwB)A>I7xK$%PCpKE7zrInw*_%B-Lb36?K|N+>tk=>)#geM$k368z2xtfw`HP`O zqx#3ey?zZN70ycDeYQ#F(IL>lWq+>=_>ErtZ-+_?wjP|m?eV1U4U$p2$ExQ|S<^pY z(IG6sBClbyI|GerZ;O0m50xR_4CDfHSrHxlC>TClstZ)xj!mBQG4NN*tX;G+@I&TK zR~Q9R+~mn5VC|8UrUapyhcGDBP!cB3Q-Nrfm5V^nO5MYY5L+lT2?f1<{2PIC$XI}k zq8AC`IyJ9wp%dK7U$pP{opIl+F6%8P33;t@SEY$%>Z3>`k z(-x{dj%+9dT~=ELCU-7$7n=}p;uU&5hJKXCz1oh~SPrp~$tO8B!vlnw79+1GcbXgj zc1v-q6gC@PL_Hzv3n%=3!i2sHJEgWJ7Ku&Io)q7E`=5>gP5mg6V23m#s(*#PKjWfu z5=`>gNv^waWiMBC;IS*~$%CoFPW`IUX(lCawq_;tbAY>yeVYpZ0#rJD(@ys=O<#x~|hUeG)o47-0AN0)L6{-%&}InNhc?t&;Yy zIKwly4zv{~!KFe+EzJ#4i{AUaK?-yFl@o?@flex{)l6Q4;zJwL5?l@opUC)yJ$%YD z!{sQYxLdNHQ&k~_OelEvm~OO#yV2ao&iwH-THu}TZU~tL;5@#o)*r&{f)fLo zQOFW5aux6BFBF|x+fuc!fFPPMO+>8YblAtFkW-AM#Xo@8iD_%HPs~U!G0$$STN~`d z2T;Vq#zMiy(QXaQ0(ZFAFstmFwIXGBV)#-m##5k6fE=u7XLpLgs3LXy<2WcN7U_os z1j!H0WG*HEVT_`Q$Klu<2qw7M2^2TjPHKCjFK(Ye?@fi=lAI);%sDV<$r{i?S^G72 zFM`t2btL_^sd5F$#qy^VdtM%bxj{UW-NS}x?kP3+eAsJWjozyMJ_BDLDv;^ydTKBb zEtc7rrhrcEv^$NDe_t7lhQ6I za~5y})QW{_1ykjznk2&+#&`B0>++Cul=sK7#22_6cqLyQp14Y*@*jrKJoA=pqy zw6e8-7;Lxma>BfKrKAc-3o^DvPEjakL>j|^&KD&NKKooe%%>D3&W)P^NzlX#nGzP@ zNfA^N9zG|RYf1JJYt~gP7+Pf`D#jA~WtK)(45Biv?1t`Yp^;*NmYr9c$hofOz3pfV z0nQYT|3{8b2E4`>BLM-k?VQx}Zu`k>%nmSQ_Vta#5g|}h*g3~NyY^^-JA@=(1kR7$ zSbQ}z!S~_SuDn`1C2nBzQVn60y<>p{D82`Dn6kLN$W$-3Ftmwg{A1ny$158bqP~0s z|5(nq9C$dR1nc~9Ey#-HvL(%Ufucd9aZ#^SMM1Z3JdQUe$e;FjJn51`vnX?paL*u@ zvt_5}iFUeLqgIhOK!4f^LAK@nGGgSuqEx9f=?FVl#MNk#S~RtCfU;6@r62FVKvj){ z+EmfwNc$yXuwD*c+?Z%h4({E3yvbV?EYmJ&=8i}y|FJNe2dN@5^^63~4U$_BY4RMi zsr!?b_>051AU+D~%rC4x22vn1Th7djj>g8_1A_Z65P1h_ED4f$WzrK^H(mfM$ck4% zr$6F8&o~_%S@_Od347FCoY6#R?mg0Ts2qpamrCM^yHOE}!Ci*Sh!ALA{QcA^V(uJ@ zo4bij*}I3x3F5_M@rw~k_O~_OLk+^ngKQDWjFGt%qhHSY+?C`I;yqhv=m{XSgM%!8 zW7Q*3j?)~j+1QNnzp?7Yb6Xj4Nc=I=BRPJP(J+SUc!~L~-%mYr<1JHSI1&e|Ej@2L zRYr*)Pt0C20N%LBi)1nb!!p#7c3Qe!!V!vZ-2qCA>3dn@G;J-++6>&5g)uL1{TVtF zqzwv+z@-@*(y_j|=G2kqmWbc~F3*bK1oD1UQ1T9mu;YANynPw~wZJsi^G6H-Bw|by zmIjKaQQsbWn%JWzdHT)7ESMVYg-uMSx|q<&DH+@#?US44t{9SCXAX&DvG4c?&ly1dmv~T z+M@xc2AwC2W!&_NreIJu@$QK9)f5|*cmdDxoZdm9DO52Kb!-jJAP?!qnB$pn1FuKGauwr)f7T?0o8@F!&6m zT11W(i6UN{Z3yvETRJyw{iIytB>d-!m`ga_gqI{w;Dg}GS}mC*Go-whZA*$8EfW_M za(QVFth8f`{M-gISn-v0b21wk<(1a!kabhy=JhSo7>NjXWYxX zbCy%kzq`#`H*dYwNueWJbuApFt`6tPzb?9Qx5*_75NCohV_Q|fZWG*3DOfKlyK5x0 z>x+I{8Fwm&5#GUi)cTU`{TN9m{IvtEHia>1wlSmU^cy6CADaY~f@`KjR|yZy3Kf2m zBt89c>xrZ=sVSsxF?f9kUiS3iKz3@hqrPsud@@5u0#Qz-`d3F^<|>HD7ZYImSu?U^ zEN0{IP0V|928JRQijU`JHnk%phtdsj-*u>q(tF#t8a90SPDTXON3qnc(+4bTJQ|yu z960THN3eOEt5oCCNN1t$2f%i{ZrC?9I^-4i76B-uYhAjyH~rIphP`A)B2%@f43|*t zHwcCYKP_Q6-_%_2u9h}Qyj7hVj!z&XJM}7L*+J#2GYK*8Rr&j-v$By*_Z;5omA2wZA&0AabWZQsq4mN%GQJ6;X%a<~ zv#7iIUS`R(>FK03F(w#%G07U`qSx%yHU5|ZM(FD6=U=(Q_M&1XOsJEE*fRMw1HtAQ z{!Cr$m@y$Et+J0wp5V&JUsb}esij!I7C9$PLwWXEBNw;I#%EU~xtHy!kd_I3 zXAD+BM$F4l`IM9e$E{yT0L#*>6;^}~hzet9ef6QzajM|>0$lAoB#LWY9hK5&j>Q%p z0Wnpnb?WQRBguKWMqaV&f$PoI(DQMYaETnJha_7nQEz-7>uSQmHY&5p;O}m3|HhB# z2-OAih4guzDEvXimyrXGelQ?5$KdC#%~DG9@GrA3SGYt5 zES8^Dmybq25UXg6!xGWHFw{3YW~tuz*kgxj$<_8J;$Bm-#g2{zn8c1ExcLRM6Q?bD zE%QYNWcvLl&wBEhA^Xd-s#+>}3AIA+9D^%W6jnK=C7E+m%Iu1p84+7tB$4=-lEN^w zkWuszXF<+tKb+^iBt04oI|Ww+m_1Zoj|B}-54ZGdWFN1uXHNLGtE6csu#nbSG9ywn=13-jm{fEJU9ZffUa~EsK^8 z0PD?}Qp~g(RsdOFGJDU3b?UnGU7wr?<&wec^zLue`sL)mq1NF@bhQPTX%gO)dJ@5o z$R}!7bmwPMK4P#sf>@Ts$lx}?w4SKUwK1PR&hHW(W>_48huv+csgl4Obptkm@@xtY zOQTtcK3k4^v7_gg`>_+6yyVkYyH@da%k4d$cD zJp`nQyLkI~wB3YEM7*H9r9oBS=WOuG=xBiL#@z{JPxw%{wC%qB(U<0~;JC@Q!aw$q z-NHb2osK`aCcy^)QQ@`uN4{6hp$N--gb~4BBf571gda?_iR$sgPyMLcSPn&UEWV%r zz?SO|VSd(P4Z<+1m!I)j_MHwCK)k6bBNlZnJANZx~ z^IV0Q^Qh#OYQa`6OpKu7!;^@D$8zo?4_7A;t`T8iyz%z977nN_#tY+5dvqHMy~-!? zb33uIDxS5jloZ1Wo82!Q>2mPabk^b+_tRz^pEnvQ!pnF=dSQ9h9ei4npZB89hk7OK z!;A_Ox5lxi;ctL!pgA}nOSw$)XMTtyr$gbiG;1#g&cJqXHA`)SdKD&?}Pg*7u zE5W(eV7Q2A%8=;hKn`&k(*KxfG2FYi={Of;%%+E>7fFkgsa?+h=Pi-c4@ZV}P+Xh`A=LX`1@5?{fv)uyzjexdb9C{}D zJy6MQyUSA-d~sO_KFgsbqMhJ&FTN>6x^^BLL)m!tm^GUlU_G2SYxvyPW96p=X#Dmp z<^9QD;U+YihL70)$oP@A%@k4%^^?H|x`1QZ#J~*^mbeSc@2eQB=F{57XOn(z9<^E; zlZazKLr};M+@F)X7u@%i6$XTlS9Va{=Jq*sNw-Mc0MsD#c)X@7A2{07FDlL&4TO@l z!gcE_n8b*hA9~K~Lq`Q|jpp=1b9P5i>*y@yAA05>5NF6po1q5ZXicOnf424h@wU6xxclQ4ZT+M6^ zBXVlP;;4b7J@Z4V^%ZaSKX@oBIJAuYZ{Ny#{q9>CYP3g8=Jem?${Yz(irJ|)Ju3Re z*fWr zFluwipyZ$bxv-CSSZ0KfV4|5QPc>SseqhK&Z&ARq{OpJXiX2>#R=fJ`Tf=KC!#+%7OaA3s zU9u=%L21Es1#pkYi=ag+2Np0)3ibL(Z!-0f5fExnP#ps*-Z1vHx)>Rkh9Q0nS4Kk4 zPe{vVS$jiVXtXx=KQXh5IL8}nsi1A%1m%Z^OH#pkrM!$}Akx7pax#u5G>yra3rxHg z+s=h@ZuiHLfNtkbrB)5oUrF|| z8zW}egc@O#UA<@EHPPI6%%MIS0D-_*713i}2|r?C8_Rk~_hc6;iNl|@A3_2VzzsQt zoZue9kAz}rDMQJ$mafOjTIJ$Or;VJPM=x`wwx?C0h$iq!>wmIVT4Aji)-(}=kbhL|q(;0HH6hvJ1G$?alIYP{yaj zXNOIHVeHODp(-{xpj}e)ez5K|HPvxAZmu8V$af-V;bWgp*x2J9(fq#ThhFSK5&=Q= zkOgd}9!UQMRg#rKU>V&OOv`;RPDqHGwLv5;=BSdbMT8GCxAK7^F;4*8j~;P}jzmiEXy zmn7?=Hx**9m>YQMy1!=yks~F-Ro7fAvXZ9`WtlY@{n6(TWRgbvLhco|JH1aB?Zo=Ob{u6D|hZvAw~KIIOp5)`iJbASw;RxYJU@4+YR|_OR3=P!ZDLo?1g0vb9e2 zrDV@h>*H!WOF~Es)rF@VGLBMSwoDqHNo$%CrtS`+aI?jd4F2#MmIjK%3pu8Jd`&?L4t6y1>HIa(_ZSjyir! zt%09hvd$W$C>e4DZT8sHpFX^m{JdVM8alkd%^Ig?f;q79L1oPjpE&jM|ePe&SWmFBs*IH1|*fq8r5!!B;F{zP@Kqco z&507_QD05agt(G?4D*wkI=M zDt_rN^LinBi^vK8xG`Ff>0Uvc9wOtOld7(qC6?^`dIi4YN;-OT#o_#QNZV#jK%2zb z@WedR#&2k}o$%j6oAk#2GOq_r8ebZfUUTd}Aug^hygCpX6OZ>~3G9P3-@kGK+7j_b zH$qo$u#OE2%Mflt;Jt?P`3^WwK(k(1vgymbr{TtLij z*lA!pERIrGH~0Uud@T!bnY>sm`YEzc{Qr-9rPi@1h!EmoPOOH%IMUsz?&`94rv_y# zj1`~sOxSB$BP&ed+j5)Kc%Q*`dE4x!|A5!_$8JCPWmL78C>%k*6O{vq^bHNshXX}L z+=KUxCp=s5o4RLM{Ad^@_kmm5Hdytrx9QL1L;*(kmNRhR5H&KxUUED+vXxk^3Dv|$ zeYzU#2`&zYkOB$boSM+2&p3BZS5qMB@#)(xNguyDwM=YN`6d5=ds-@Ks z#%uvyL`h;Q4Mts~-%&4FPgU&PP7EFzf`eu3k?f*J1zB zzj|=oEN~kkM_^w=nUX|p{{<5oZyQ{bRQ^DRfT6H;)a@1enFF}=3O&t+F=YEzEFtk8 zl0*U-p2V$cD(Bm7rWuFguz8&ujq*y9RwGl*W-LyGbzieqHwz^N=rLGKuQZ`=zto%& z&d-F?M#egz&*d&Li>WQ&w~;%3QccLsLQLt_hx4N-9^6km`9ac1;M?2ENocUn-N7e0 z-;7MdCVt2G28)krkWBW&=(}`U7}tgqUK;#l>sUW09V!R6$e#ojzU|O${^mY9l(xSD z9akk0?%Q&Y%ElWgW$OvOEP6hG!Og+us=Xeg5ctOVa zs1fc0%j9iv^z1L3q*w4cDkw!JD5N>ud?cycVJm@wMupBwlU1Y`0kBl&*Txw47 z$W%M??m4si8tRzNWg(Ac^d3_*^~R*eyoB>4ml3Z4k%Ur*(jrjDkDD`ySZM=VO=8He zvS)L9;Nw5ZM)zaI5%j7Ig?A3kgX;HW4CZCvOmQ3*mqeblyyin^a@_NIyk8p6t6)Oc)(e0Bn>{TnJ>H_xby()%#TTq-NxVx;X* z?JpFqG%;yTs~%y4YfNd1tOi*mgO!#VF7MpemFe)%uZW`wwmb0GJHyaVi7)>nN3cjA4f`CmY~fu zE&MZUsd4}R7YcjMf6?*XAU;&<@7UWT)dw6u@?yIac`^uo+!IA#t71QF(j4i;$Kwz< zo~&s%+}Mn-_Wb(xjpIs$^dP_rMG@6=XCX+I_%TbyaBdz&mf$mYqy?N^@I3MVn0QLU z)hhX13ju0$aJiL~MQo(biLo3Xr5DBykFb#dK4^mpr7MGgiga$?9Tol>6p--1FJ`x7 zWL>Ay1~Obk8uebk&qU44j~KVw=VR;2ARBAB$TZ44>rgN)R*K`4PQzhRbDjersE*=W z6q>a9!{>wxjjMwlu71e9|X{fFM$QDgzoU8-5HF%cZz>tjjidth=X{_(*)Da-}b6>n(jYKY(QmTDo zQHiNBT;r)6<0FakQU-Lw`Du+(1UrZt+v;40qzOx~NJi=xO1NHb{B{P0ZscY%ff<}I zz)L1|?X>jpDJkX8`8WseikB-e?+!{3q$!G0L!|}5QG*Z%wn@w4tK*)#LN)ufDVbFN zEL3+sIL;Pnn(KWJH`YTSu95j(o&zVfk|jQGW+x*g%ragDq56MQu?JsJYeho1z@0Cp zvYI*n{Dj5;*GmN%VTu!tm8M}J;l{W3QCK(0b|W~Eh;0O*#!sxRC>H`4mB|BV`bP>4 z7jpoMW3wpJaEbFZmDn$>3nF54hu2{$ejl^NglBm7_Rgp@>FES(YYAvHn_A(DL~@t> z+$%i;#YvZzbB#^(Aozm6aBUL3A+hnc;;v)}xb6d~9pVo&L9F#H0>Z~M*w;}nyS>m{ zVIIu3%mlTr@xA=Dc}Qp#Lb-n4fc_*fC@m zX`7^!6ZRN6SzMHwt0iiBsyx^W3g zxLe&FL9Hq#-MCjwef}DEKV&(WA0V5S0rC~Zq9Fo34MOa0dVS2bOl_B8ytOmTlQ8xi z5%Llf)h-AT%gk7%YxA2qX0!?A-N8ZqRd)7qGAx=&nnNH&6UNL^#?uvR4XLXnq{aK* zA52b(m4IX?8|B3v!Gn$6g0Z@1zHGHa?`F5(LW@<4-9-NJ5c^=PLOOQ)y*))3@NC@4 z!YEZK9!F)9X4S6SN@K8{m*SlxJ4UfeFcAjwP1@ZAx(zibey|y=WWF`!AJ{|d@Hd>1 zDk7%@=X4vol@4PhWzC+oGs%*us)%Z))Ega@x81XPLbJj$_8A+rSCAjfS!WS#{V7qN zTqdF6V+V_r43WyN1j}e#^Vzw;I`aQUWYIxF0QD1t)wB1A=E_P zaf~gIgE>(U@c3NGT1tNJLW{b?n3krn*HJ73FVyB_TmLiPgmGUI{SY?zXz-1k7z(3o zQz=~2M0)GB=4OZ<7Z8$)i0v(#Px)(vDwEGwJQSDY*XPMPNd_jxq1xOot2f*wi?V@X zel2*)3$k1J;4tn>{+wyD_id^LqDgQpk@Hc{oFKVVTW+7TNlr8+g@C_mr9H$%`wsC6 zpJJq8eMXomy-^VP5czn!bXvpSCE_yA07b2l#5eG~m45TPwlEQvYe?BEufT%|Hi#6FpH!Ac@Xho0xWCddpo>z?mgV+J)yb<{!yf%sB(RwHjM)%hk} z62^5XYt={R!W_9#j5#QO1~l;lY!BhntIgWPKVqCsJuY~78KWoYJ_a-a83^>;F^SvX z?A@cnXe>xFp8p3WtA+S>2js+n3vjG??-eEA%lq9yVsuDe$9X4TR9q1!JedsjAtM2wK=-58?4%bBy-ZPL zU@s8wYyZwEny2t+dkUURW&9*MX7cXMld_NLjux|cND!b#oq#~2^K*KVVrut6a8|R=Q~Y$%_G4O+m&~B(Z}#vOLs#p;#|y{Xw)LKQ5usHcM$F zt?At3h-CLu*1UD`<=v$aofLfH{tnz#hnyIAEhn3e1O;@Z#KAaZeGOY{XF9nl(%K0u zdm3ATKXy>B*bhqivgHD0o-Eq?G~7armpxt*Zt(ux8_|wOp#&IkncW_TGwVCn1r*3_ z)i>XR{_?WS*ze8LaJJk-lhYG!2xWrDoMRDf{TB9jwU||6&^GGh#-6K~w$G9*i^uOy zu$Kw{nzgF^*Q`~qspf!GsFNUp z(DpO%b;tHCnrYcoA($kv)M#&ZgBc1z$wyuVPE@07_19Ij#so52!qj}b5Lz^^9N}*j z9_mR8Okz8r(`~I*Pe9iV-#bZB)1p68+HQ54#8{YSo#|{Jn#GMIDph>s|sj zx!}Ktzx_^igympucQGe-k(${3T)emOb^ntRt(TfjV&u=IyM;C55qr{K6IazIhGC|F>*EMy0P!9!!%lSxKK7w$!4EqXsv!m>Qmhp?Rd6W5YE6N zMA{lT?>gWXr)>v8dZ354_SI(D#^v!shgcz<0c&OfsCv413WBY*+#Bqc+M7S@EQ$7@ z@TjJ7BDZ|}9E$R1EjOG(f#Xv9K&Fv)fwz)m8+1UtAh=>(_9NLS=mfXX8l^1c= zEAGvCFUO}UmVjSri{HJK$1UYC`8|I5*}WMkqGV6Hx2Fy?AjzraN0-#F8yX(zJ9LMy zGE;b5>Z%_)e@$OamzHee{WX2n#N9FTg)wdMUQVn%(&giCLAxiSTnGoJy6PJM;a=H} zv`kb4H6M%YRqJM6I+i?;Uzo2m)EFIlCbt+r=wgeek9tW_U5o``E+Y(TfW zy9AMlFB@_BkY@Zt@*d|^qzwV!xSWJ}Hyvm>Z1_VZ!F?e-DP!S!ig8bqfennd`P5>0 zqm|4V$NDPGf(k<8_=%J^^SexLMc)LGQPQ7}IASJ5IyrI=F=uH3yE5q^YI*e{`VaT6 zsT_Sj-o!r~Ek2_G^DR?E@8IDR5-k_fiAzu#r44O=UW5jMkHJpV;kXY)+z~khMs9&& z@OHUM+UTN|eCMpRmAC=~yQ%jmTsl(#qX6k`#y(sg8%`lrYl&H|ydMEgfO{yKkFHz8 z6ua@F&!8KiwZ}8_%j#Dp&f%RCWVES{IH5QNABnf zQ8(%EJwP?%(vp;>0eiwt5e5pFVv~R%;^wipSnN>;FoqtEQZwk$Qg=(;XmK2gg(E*c z989}Kjp5|cC&D<*b4Ax5%$(h89L7e_GXebvP1~!6-M%;pkWCiIQk@>*H;AC{_#78Y zZhawU4gTGcBy${@EVa=5TF4Ih^R1xPjG`#$KP@fkhl=NF(^kq3mvTAz-;}mav4=f{ zEc-a$9UR#GMMd>ww1i|>!D+)G&5sjRjY=-~1dOUHsDex4GS^U51b?Q-9M{3C*rgY#)*phTwi9gNA0r`0iAt{DJk2WuaO|( zT+^|q{@HFu+T<~a0#O@HS%{X^LhgMhd8@XVjKezzgV%BLQt@}597ymot(VL-@Lx?38= zrbjx|adb)m%s&CNIh5_yI1-dxHY(W*w)*Y@S6I~jXd|1+tIH!;IB4l}iSgGC=8Vds zEI$7e)_T&C%?$&$lHLWcy@@pUTa=mHsC|P9BW?f8-R5@qncspr<`M?pxzX&Ye7nC^ zF?>TQ{onBL8@sEtC{x6SP4@6KMKQ{S<8+|N@QCLoK$?6D-Xa~~O9Td%Op5uVub6<( z^+u7UfWn9=C4~hQeJ{hmg;k_~JH(AqMdZBoK}S?T66rnE$<^CNY-6EX5C(bh-*D}r z#O4=76X0Twf|UY~hLKEryw!>slKqh%Bs|f{m~PYbq6*al{wk#Yy>2OdCtuhR-ishr zp=qWeY!u7dKT{*8{HS1A?$glQ#tlAij^sRFg|MtOUjAc1YjgX@8&0Eoh?O?lCJ645 zia((Ldo0ROXCmushJw5?&G<)ZB(}$99pi=2u!5&@i>;n?m+XkAv!}5fqItIqvi4A- zZKOs~oO!LVA5~qFhb&_}$5W+yXRIP-CVglmssotP&$&C@k++iAbl=Y8o?a6^vyiO# z(TAD@pDzQjjw|LTo&nS9VH{vo$$R+GeL-MOqzhN_hU=ecJvE2(*>79nk4f&d_*oZW zon*kXCy4Zd2>b8`xmL&E4w(s;p)qMIGxi2AL?Hzx8!_%_WgTKkHg9(#bow7lERY{c zPhQ^$Ju9Xs{%twZ?ORm$^(JPq+VGPEu@wi%Fpw_9AP&f+W>(^7i+ab=no(RgGjxLF zCtiMYuCD8Of^qjB;KxnEiwnl2x*?>1LJSf%H=Pb#uyinp}iE+D7S zXRrm)mY2f0F1*;f){+)sSAtpU=zHYIgJm2b==>spI=B8Q99Nml3AZt~wgg`4<5_%T zS#m?@F-L-SZ2Is=%Hj73MO2nQddKOOSUjC=^y8Yn!b%!FQojGukaZ-$^ze~>|N7$z znVfE`?J)1Re8X`Ma>X7HJ72KfmqJWVt3BDElLO$rM+{7ckq39B4lz`TF+45{bf`v!MD>+%NZ&lIERw3*(b_ z`~e;`U1u57KXoA;bQW-P#`zKLdK^Uug`^Iy#(> zH`zsB?Ah*tw}(Yr`emMeLC2vz-<%-X*p`F#8SAti!26;S2V><`h6D9LAG(SB)XSgN;32@ zLTWuQ-h!*gf~PMFrMI zJlN`H$E4}%L(1s?A~#@=RFsDQHu{)JOS5x3WJxWb$95s@Jj6U2ZX3tP^lX1b0>g-! zguN3`pDl&;sQWkVYgr(vE&N+)8nG0dale9Tk`ouU6l{o;l`WN z9}K|dk-DD`m+KmS8l~&Y;RisMh`IFYa?OjKn4~vmVQJb#F3|OVjOi z66mP8NlY5WWvgh`v`cGrk+v=`Q{dunyiPPWywpa1{q-IFd4%SEoBH3yCW0H@Ggsh8 z6zJgeqW`T0SZp!Jjb}41Ee2Tw*E=$ti3eZVEMatUDPF1&iAXjSs7Q>&cQa+wfBas> zl4lQm3JeVyPek)qQ|^^n`timO9LDpABl)28XBya98&uY(;W&DZEJbajFF!>mJQ%;; zCEWtk`7=e_Uo%-Y?cF^)>JuUCSeGon93fObU70Xy=40nE#YXF=IeOxqwGODEFE-5n zde`IYe$r*c8mL1Rv{NBIqHzk{*ytBLCLT38B#h4lPAlIb{da;b>a zD$>YqwCf4JKK>#IFZc0&0x{R10&8!K5dWv>Zk*$p=!qx+klJV>s-J%`#8S1P8%NW0 z4N0!B#ir0I?NwwhmuJe_7>m(p=SSpjoJ|@>L(eR^TUOFH%$XR3N9~9^>Nq7+K@6*n z8Tl&l1aJq?pQQEQMuZmk9Q=>`^{l8ihMWOqt>_Ng*Nv(LT(EgSva`j@J|`f{h!1knW!QOOt1`$^^76Is9G2|}3CO|C<1&2r(c z1**yECjJcg(~A9f-OVr*VS7Zjg)eLrwt>*FGQDHkueYHmK{tCymt{CvcFEow@?vr% zSw$yTs!=FW=kv7z9{9`%?UQ@LA1B_P1^(_JU8eFgHHxDV%mi^xtGY~RqI zMB@EDq)Ka@>8@$`;56*XpLB;$WXQBfkzFu|(l4_NJB%@%j!N!CLQ_dw3LM11brPL; z3|#vLsdPQNSZ~rjIjICY4{Zn9E=4N6$n&<+$4;`}t-$_WseY5Ka;LUo>$pXubS1&A zI*MV_0p-Ef7RM1wRmBfY8BEAp>QqMb=d~J-$bGdUmd#V6(0jWHbNmTulTl zWOHxiY~&9ktWg+j`~0w@(Prq%GMy#mOx|5351H9zPpr#m{3jtZY%!oc7X+c7asb0r zh)+siPBYyI;rESd=-rK2(e2jn6qGU#*0WxBjQ`K}Tv8Ny0a6r2JKG8CGcdhn9+Bbl ze+Xe6UA;^reLEal7-fXl-$ls;s@UGq3qyr!NfpKRFY%=|GN-?Qm1%PiDSCrFKQ&TI zOaJN2-6Ny+8-zYIn%6Lh1EK0x<{|KA_;-vRiQuR3SN*AUkSYR8X$VA3#!=pUX&JYU zaIVr84Jcb7)A`T7*+l$&ho!?ZU5eNrBu9hBnR*Y@P$^0kVdgUZq-Vm;@(O4j!bo_D za=F?`*w@OM6C~9JQv#!swQK0)!}}dh-iZDS0>m-w5Hw34>*m!QD~)6LK&k_|) zjvP1Kx5Y&1L!8%z!?Qd``IZ>1!*JK@$LR<5DS0Az$CIqB8-EzEkI{jgdQtTwOqeV0 zNT8g+@LC5)Py;KLidv=YWtG^flYowDE-J83ghpFhEu!OQ z@WHo`4!@mreJ^%h%}uGUh9ixS{IWN^kop9j$ySPFg=>??U!wz@wqts`nt2R<{`+49 z7*9YJ^gaJqkFGb1Vi8kXIchzSGhCwFC>)Z6Z_=5$m?K5?xBmxYtbWA7`-_#tDvxWj z|2p;$E1i-g{b1XWNQvvk3ICSc2Q-7N94WHXjI^pcT#ZSOoV_LKkh=witV+8cz6 zQ8trGxF4wUcVtxRB+zV+2HwGENF>yZINase@t#1C+aj&L`PGZ#88v z3KY3$-xR5(`_i?T1w6D;p!xjG7z+<>U{H;3fSRUA=tllU z#d%KYpb1sNWH)Jb!Eh-;<)c$CsRQSx^Ojqhjy}W+G>wBx*#cUubeiXeGuFl7yk^g z6d(EkMi$0M%sllOE@e96Bx%M;GekL{_D)Z=x9WDtMYg-TNgsDV8W&bQSEpH9ou1(S zW(xv?cQ3wom~0OB`(Vz&w4W)4V?l*+AELwyH+*V%u->?tgu24 z@u3MjUG*$VDTxPO2fO=lE9YQRtKdYMnx~+VlWuw7pUlTO(=W)~yD)CAGy|SVm=Z2JJ}dMZ_^2<=2?Z)lun@4nP@X(xV#E;2lah&O zWa(ptap%E@0k)F^t!!U+dTA{M-Aa7YQP z7-DGQ8iJC*j9?wq9=4l`ww8COtDjk|j zrU_-p7^tT^kF2wxZ)#GG|C~V7Op-6P4=-R(uk6J78F-WnAK=#L1t)mE{Xz}fVc%HoVwI2m;{ z86$^(YDp-^7OljEzlLHjU2NETy1kNak76b_CQEA2wSwMvk$oXB*3ikw%vEf$n#mWq*9lU#SfP?1Ag@#fy>+;Yp;{jV;T1Y#i>z+*#PzhlPNI8DqJp%DxX zyV01@)Y#s-U8>7?r{A-Yr>o$OsdBtc{rLynjV;$}=HZ7VG*5*Y>!ia=6OlzNJj z=9Jt4ulnDuzUQw>WDzLqsDjyDRj5zyjP3ORlaA9!9E;b6lcn>yL2&hErFpbgA%|fe z;p@Fs5BWK^F%idD%JJRi)t+zq>1d{1qiKhA!M~Q{R+Ok&dP$`ox9RI%sS2H3vH|hv zusz$2y2uY{IniZXLP{3)fcf^3XOuD`iA7ap7BF>{vkXr~d> zkus&RtCSg7%G*ojNr;*BwtZ+5E3IaN!93x?<6YfX&{lYcgQB7<@W{rJ7I1NX=SH?7 zMa3fgmPC!?p~Vz4N=aU-$QqYg5Mo2cksk+KpXVUTDG1zRHXOb=Iw;CXNeWqJR9Rj= zph_8QaS;21V~Ogj6%2l*=%D1N{*~a2Ngi z?$@uc%)b?lEy&yDi!9^!2+edq;X%XA+YsqTgK&x%`q!gRcR~9ia~#`|I$ZfTDb2Zm zg|Ua*^Ym(VDhAGt*aMw74);a~X-@HZ!IP9zg$IV(Bq)}B7sZqyjAd;#7SrF9*aEYi z>af0Jk@iG9d9MI7{88doIodlj1TwP=0mEqj^&F!GE_k1LYqjJgPe;>PsKEs`zEKzr zSQ1OxA7|9~2Hu}t-6meUG$D7YoLJ13*kx2xwehgxf>n(czXs zQbR!~3k0I=ixe3DXfR8|@6#J{(u`!$R(t`!Ivfr}`BrRJg~`}9!f$_c9_TM!_+2pe z_|5bYt8w(2L0I%QuIl_A%t~pZ6lRQyw!XBtCtY&l)4$G6QDT(n zQYKV9o6>!7X|_LkCR8p`M#dns!i1bX9T0{4p#cSyrpp4tugF8ugC1j=Nu~Lg)d>6L zLQUjHEp~Yg`XpLj)zQL<)F^7LP?|3>?FcH%sb1rh5eBtkl34UMkUY%FWiJk-AkdQH zQxCC}A(Sy(FNkBe9=+dd7>11#d#A9KaFjW(u0#&ri&%nX`1eu^X54yO&A!B&HZnnH z>k+nVW^RIhah1CfT=F>UpdDnX`Jau;vy<{Czauy9-Ehlwubt^w$jRoqNMSGLP_8tF z8v(+CyTC?d3XD2H-Q8(8SXt%878qGTbE8eifhFE^M-!09cWneh2obm{dq!&x{QB;i zk23JW6=3z<(N$DLc+{%oUArjN0Kr_KsYXV5bKZl74QR9%WmO{+A!(;qM)wRQEjBSp zy1IyTx+W#}fJ^W~OKCgD7yi1sft@htM^Zp+@!raS!-hYEN)NC(ogO#}<mbeLqA=>=Ez8fJ55@Or0FC#3h3;;5rq}^mhf>3??kALHVU-iZBEBO z?|fZh=nnb3SQbH>wbf*^ojZV1a`g}>ZjC=Puyr@fU-dJ**|wDj1f~@S=m^E@iDwjA z_=@7j2m|TOAcY&vX8v2MP!L<}YIb?gp&cHIAT{Yv<6egocMDJK*$Ps6biV?=J<>NC z_=!yV+VxdPV{cw(9d;49o>=EvABmXyi8)+T(Q!h}^_6XMcHZHyZyw{>AXz(uQs*yL zx^`Kb75U-eSt!7QD{D367}?A=uL3fkG0u}G?fUAr5e&&Yxm*cG>v-dEXWB!+qn%_@ zGy_}oAF_8RwYNvpnJleNz4zK89+0<@wsMJ9chn|mtwwJX-$BR;E&d#E5THMH?_?c` zP(kS1QbAYGFytpCuEuy#ALQOxICIjFW)I60kE4>m$s^6MJOd&m+920b033zPo4oZl zdM$MG_E>mEKp_r$ysh9~Hn_oTU}cDIecjgfah$e*BTiPPB^zj`F6%;61}oIyR}Q7Q z{-_|mnbzo{t^ONq~r2JeCux2*|NF& zrNJDA@c=SML5a0=0^wcB(>Af@fq$_-79!{k#m`wTI@)>kbtP+yjL)l`B}H;oAYO0& zRpX~ES>|xcEZwaCS8%HcjE)|`9w%kaG{N^oCKBW!I!-AQ4*tq5Hk2`wF66GEtc)W? z9LD@9ZpA5V_n`Xm!IRuDxI3gxrA_;b$~BS0BVejFu!QCe-}r+@E0_ic{#xg0+#Tdi+|HO$BX3540w7fho_totcE z$SY&A;2cSm-~oZm``ly*^q+>a-|xy-ZqLZ}az#y2L|K6!vPp+#JFrAuPrjr+CeKOJ zJZa&G?Pbd?B7Aph0e7T6K$#EV&(_dw6R?PA6(FkcdS9=kFEY`}#EB_#xl0xUmU7V3 zD&rinHN&2h!90{~UhmJ85`xME+sKI6n1p_X7gq?Z>4q70g8kA+EqbMtxf` zoO&z#R#ExOuNY9?YO!?BV$b59>j=e5KW!8=x)6%!#4P)%Mi*8D=;Spd1 z`H|C`UUdG)yN*YsNPj-iCB?jw*fdhR3`%WMJSM?W`1xLqyD1ds(05@>BpW5n ztSenf{PzK^3MLL2*PVgt)JGQkHuAUMB1z?Cn>{Nz5@GvM_jGXK%`M4oziIJRu%^!j zl0oVvoeqmusZ)S51#*~pI};0K>Gug0S+-Z_<0Xv;uoT#DwLwrSNRx$Kbxl2zJu#D? zi+#jpQ{mAn8Ar|6)K19lt%}hR{=zbU0oOb`s>=6q&Y8J-2J%62rG`RAp;BdqHw_Bt zY-29lxU%BzbDcot13_JQew)c$^w!$sdXYjR@Uh!MNg1=!CfM-0P|$-3+B$lT{iHGm zs*zCOU^tX2n!)Q6Oz(c>B?I<8^f;I;V(PWdDs+{vG}Wr%#kaa5i@nNlrF&OjhIj+8 z2c#z$Lg{ViQLu^^)?A14-&FDXlQ?<;PZRGCqIhV?Af2p_>-Z0SoSx=CRRe2if8Y-L zX>=gr6>md8tzvoTo;4K=)q-_VQE`V&a;jlPWQsR&JxYa=m8B4RS%9UA-zC2Yz8a(+ zYt5}wo=+po+;nmV6l0a{0w8xjWPuMgC&W|GcSJ>r6l9pyeHqh_W(7MQ?&fy((n z=){Rz4ep-c4j|k=tq*8(CrPGAovSIV_EwU7;5wQJZR7SIvA82U$ML=%WiqFSkiYt{ zT;HHm{O$_?Fwz@-$%$oC0=_idt{kW5^d2L3vN}*mKOE+g9{kd|#DA!#G#xZY%a6aq zi;Ojb&eZnpP$|iK{7ZK=%E}Ju6KZRmVsZ*_fyBM&nZ;4eiWJrEf(UU(zn%!JI>4}l z1O1V~%o7Sh;U$~js${lL%q6Pk#fHV(hYoSEkggpFAEbrh@2o%#)$S_x-j|Alb#y3?C`5z6Ph+2= z3(t{;^5@3--h(oR1iEuzIdq0wK+isteU@16gt@G}i))=7+$VOy(tJUNY>bqWf+PoE zyh!wcw3FPhvi+}6m}!3$TuZwd(q^t;NZ+tE&Sf{S>p?e zL?xLNy1&+ES~{)SvC=5R-=rr@j+e7CzF)wPry%MnoP}iF_*uZBW$mVd5&YxDz?(Sn z8TY=0DUtH$3nea%e#0R7(rlIlD>V<6? z8U64u^n*7phL)ay)xOo2jNN!xMm6wmh9(rmI5)X}4%K6S+^G#2Ev3N>LLKN=&-W;B zxyy350AV1fz`1AU6t^g&hq2Yg_brJb1CB{oDxCE``STGkM2H-guYs8W55p@hqSneH z;viY*mSBCg4#Mmo=QQt{xR96{G)#-bTDU^Ve(kgPz{9(vO;c_B2gTX9Eg3Qxef`fc zCMfxUfu=9wfbOMTJZzyf4G|C=#wV07ym@pu`q6ACz@1-s_%xOyT+N%`SNupp*rdc+ z4$**C!N^XVb66DizD){)(+u~lyEQjKEe;${<#m6pMD+tOU5wt+e-qRLYk6}-V zfI|4f`KVCLTU!Cw_ z;D6~k4cRoRKlt~r;Zpq}DnrclU%g`rsDITFfour!Xrx?SiCuM&^s{OF81Ly4h$gNh z=tv+L3ZI&kmEl89tMqc+__Aly5P>p~;qBTV9#3u9z5!f)4-1rk&ebT`ZOx`uW5(rC z=xd#yGHo885u4Zg^<4sf8W~HJ^EmS*7*R`V zt62jVHW5xKn0ve!yF!#7X`rfU`PzRzSNV<$tAVSEJ)@cIiJx1H@iY)P!F{kQ(LJdS z{q7?V=>j3DiRiE_Oz`8@82PNlsu8uZiY;lJQ#F=7Rgh4>B#ZH1zB+H=tqk_CP^?J@ zdjS_(xwBRndg!V8fP85Lg`yg30dSVw1u~XCRk`ikmjF=RrM1;X-+~`y{VJWjo`D=x z39~##G#d=1H1*}#1&EQQ8(5Y`eXvpsOG(BctSL5Nbp2bdtxh)Ddk2Mv)wq-4IFZZN znk!7w@V;|oRhUPIw_^@AE$$#dAa!9Z6lvt&iAcx6D6aO1f0#V^&#xrm zA}VQ$ugMh(6>GpHFgwBD=c`OwU9kxgul<4Ve_J{BBzqh<7ah8RLm&Ya74IliNSL!P zAD^hJK!fMT{K;h8MDw1Am^IXi7_qBmU8sk(;5a_BF3MkzY@dsj7glXFy%M<;vlh-{ z7>4JWQ^hMuMtf<>e@ZM4q4;>DwHjfj@A8^>uOMD)zM9C5{;u3D(7Kr*-~7U72a;_YqZfT>Yc z4CO+NjDCAH*Uoa6`)*#TdiE_2na3OmH7dM0jyz}P)>cygxy4-YFSFmg%p)rZkdKd3 zG;^nbnn_b|gq%(DY14NHar@A!^YU^<5viv6khv3^+FI_W4V6;y4qr#)R*SbY&cGyU z9|;ca)!T0IZxQ}XN59?`A8XclmrabOqwexnoJ!4=Pp3JrbH_`jTJu5OSzF(L#5#ZB z35?{6hTNt}R^m-xZ`P+M-GX~9YWMVl4;DIE{5p-Li{+OaOz-Yqs{D{4fNlT2AmpeP z=oIc0M@VVjU!Cj42R%5}G@MyqLsceK-98$!p4N?g4gOnZ6Z-tsb!uNohC~I7?KA3F zdi9D;>PfqL$=oZ^i*)~-6{@~vqZ2ox85!cRxkpKDsU6z;lcSS~;34aeY4~p_BTG3l zf(#a&cm*AfdP2RJ_T2UchFX_UkaGZ184l6dR&CbF`>w}bnkZ;HpRv&9cDo6uaDzn! zuvjxDP3y6Icki`KLKzi)2g~*+xo~WEW;(4mMVPCDkjX-!hI+5Iv6IDhROpuBvhYDw zD6*!8Nm&f+YsevV)69bDrd3dPcI$qx4y8kRYukQ;epQ06(@P;AAQRWQGDl1mNb^oh z1I%thCG3m82x^IgC8Z?lm>X0{`K~vN3?lWTF6tHgF^|M*`o7W=EoQ1Zg;k)Hc4+-* z#JKicego=}5XMH)B9}h~ddjGG5XWh+Ooap8WcXJ#9!W{;li-!T!*6D|2_Gh&Ki=No zQQZ6JxM@u0{VB}4M-=SPC=rnqZZl#`(r(z0Xw38~=%2@fb)a1ozM;VwoWeV~HtR!B z5{R9c;nUuHfVA!XwKty_rm>su1p}%LH#*kNXD*ce%#;(9h@Ff`zK~JV8UADaIH$=; zc_Prg$z>bDmz*ho&_2^eYqpH(Bk|sWhmZr^YQ-r8NXn_@fh#CTxF1yyLEX+j1zLX9 zuU4k-+Jz)z|F;(4>P-mlz<#>dWlweAwfP~9Vpy_w`hfQO9q8U(o8!U>Lj3IDhHQX- z@6V5$*1vR=mrrbitHUI<`cY(>1bPdCq~#xOH5K_%7V=+UYM$*Yg$mrEcZkDN_z^do z>?&FHIV2MvvZ$wp)aTh^g#xWnn1P6d!Y9a7ap+&`rMy53r*5_p5|Isa= zzx;?-{Pz+w%GDd#8)QrC{y3b9%CE>8wWL7Rxp&aeOv@gwcsS)_T)dA8=b(`?A6y!(IwLp zP`#OM6>6*n`-<|JQZ#T)gw71cHMi}b)Koi`ISd(n(1i`M}gh^ z{dvc;Q@1*0{7`W@rLC%ZnZ}G@#J_YcbNYDv(6Lp!YWe)Zvvbpy{g1x(zB=*cD53qN z@J^cQun@6WfAs9kmMv+kqECUngy;%+G-%YcVawRG75fpG{?naAmtSy#gx+u%^T8_p z$gy2Bl9t$d<^Ppax~9$PpcwskWmi&bJgD?n-|>RiFq`I+#{e& zkiP*ozT&~NUiUatNd-y58>j}849R1t7*dJV#S$v@-r60X2n@(({jQ*8)As3TtFeG2 zmf^&+^Qvv?QDn^}W@p}2idUb@B4VX&KtsOcg1=pWwKh2=q1~FJFhkeQ7!@Rp^5maO z(ykhgGY!r>6l3Javcrz2PiZ@!%KKXQ9@Y;~*@0D^**4Fr@*nYM3UxwfaIq-@$QyWn{mw7~bu(5GYahQt&C zc7rb`c9=x9yLlZR4_E!3*mv#H6^rQ#*$NEhkpO@CLQb6-++f+|>8-PhzGVKznJZhC zqO#Kg@`Psx%iI+n2$2kHH)R8iHXoiBPeqCZxZmx~@lVOGetehfE-w8nLEeGF&TLU#>KYb~1y zQ@H35!~$lFgb~JOYKJkssWfaJRaKbQ4?1#!X$nq>AaF01TT~TXb~-M15Nh-f&7O&f zIdEl7J-oPHYLEuv7xK4nR@rF1C!6b>el0iiPj6-ExV96f-imjP#Tc86ecvr(n!WUr z*(Z_;6n;B!*W&fL_%}!o3^J}?e714i3jiyV*bgGn6)hiK($AN^G+msbjK$ytr>;(5 zJRU-?3getQ{xv*2eCy7Gi{KN-X-~Ka4pFxa)(Q9nw%yxLTS0G~Hd+n+KtO|g&&++# z)rDU`Jcch_+qLNculMosVb78K1?r1Ut$OA1c}fZfP%8b=`9qt{I-Q$JmG)GhR)u8y zz_i>lKRakwBETgf9+~$4;Nh)zVl%B8pATw|% z<>QS#KY9Na&}|ofx{=|v-qd>jJ9Dl22hzpU+pibzPTi{~uXQ%I@>P)PPj7OY+nu+N ztsk_z6xoopqKc zfPv%7+5T(Em7wf`8bSiiy!or|ZXQ>U8Nj9VXk0n%3!!g#Cw%Ia`WAHM*edUb zvf7B)UwdE;@2?HP;_0`PG3h!#pL6NzwPxGAzUdnp?Hd-rfM2@(axtTbkyoC;<14tz zODJltF|{WmW&|Jt!g#oOkUH`0)}u@5-@Q3srXL6szvbZSRSBYicMHEOBn|h62C1mZ zO#tJcg-y$4$**7s-n9Erc>i?a!KF`;T5lSuX!wv} z$Ek|N2x0|y;f8YR&DRY>*d(!Ut1HdxXfleS{lIQOU&Y%u5rCG?Sy|EHf2#VVMKAk+ z0k5(^qe~i|y$GE{<`LYR#UX+ceF$F1;%%@of=3;7!9p}>|6HQ^V@Yh=*8z5P)7GtO z8UPQvx368f9YIHTt-6#GW7pwMsuUl9ZU z_WUO``r0K4m@yI^VJtd20J#?UNs2k%ha8m8FCps}gqL%HzFu^v-fBHU5D>QO&g1Lt ztse_5vSpt*bLjBQ!kEjL`sjQ7!r_|ud=kibguyULk_l|E#(1^+;w@SaN)Eqy-Tda0 z%fGo$$(RK9u@hg*EXwUaXf5cR(x~|pNWW22p?fh*lSzQpv{>IOg*y_S$(Ww4 zoc&YV?x9GG-+X*ePoECiZe9uH{BpLJ!ECCJutPoa#jy4wFu?Me6C^p zdc8@fdYSqLr=yZ)`8BVq@vz)hZ|nYmioJT1EIehL?6^ancC9IE`q))K-NN9RyT_s$ zi^>)<-vZ3kG{E5;-gM3k^D4ME-jxH_wpmNkqJC9brE&f8Ih6-cx86KT6Y0y+d{{nU zLO$f>GIOeDQX?njfP7Ft<-_5B`ZMFC=z-+s)Nuq7K^Ws-@jCXz=w$g@#sVp_7ZfvR z13A{+9^2BzU~zc4o`6$E1D=7tkDqD$@Q0Nq`ZlV@aXV>D9Q4p$(yu}d<2s=QrCjME zgR`J=V#UT-#sVvJ#=}N(sQSvCPV&J(P{WDrlRoB-XNej;=8Bhv$*9#GdJW1vzDejXAn=Q_Yy3XXIY%VSdD& zFtW-dD7F>C5>R$=+QgLX-#TyPJXSx@bmFNY24zRFPjl5jdlUF{@oJP zV^k7LlS+pOmGLFvv4ojpqpGnac46GEcC#qeU`OsbcrN)ev=D=L)&stOJe&s2>iKl5}%-uqAn(Vr>Bep&TF~7l^_= z3~?KWac>)TPwRNcC`iIU%p}sRFhvVbA?k*#yEQwVJS*`KKx5ZC3+_Xzxr~B$a_u6f zM!3@-F%CQ`DwAf+i>4~ntY6RSmKe@(EY}}>+er#Ja1pKni{KhlKkA59)-P7k8p*@YkTD&H_9i~~@kWT{$abkH2H)0`NmtXIGnLUujZU*ojc z0r4IhtWB{lN&d`XOi|UfarOFaf?A}xu&cmV5;Xg+zFRg2TmbAT-h>+8U?Qb?A@u8Z=>6tq4_1C z4@F(_8R|OAnV*%AHqBat{+Y>XVtXZ5J;L9ddR2qjo zlu2cRCu1fBLHh|`zsE_Zj()s-upc=UKtpkN+Y@3d!Xa#)=uKFNDv)GzMT0GjjEeYH zIb5v(aD^`Ya%4Kov<@>bXrKsdg|({+0enIhEcNO404nde5`#v}e&q+@#OgB|;WgHr zY0fZ@;+ONFya=eSWt zB;*Vg5g$#Gi38z9@!T4atTVHF{p*bRWdo7PD|Hrn42!@QO*ar|3IXW{B9?XUIVFm4 z9wg1ko^n8Iy6gXPZP%eod43qNHAMq*{%M}inGH}EXp~$BZ49z+c8~y=J!$$)f{|Ku z8RA1Wv_l?vx>m*4Q=st*ohqj%{FMjPSto^0gKLh1lP^NbChbTC@WfN>({{J-@6V67 z!rLWQaa0y%p$UpqWmKt7aSpeCLmw0K>`7-DqD@ z9JZj)djG+&mkW<%DdpLqIe6lsAL{~#_Y2gDQeoBkObD{nF_dt zb#2IG;+N>TN67vMs) zZ%!RMUCutQkB`GnQVlog-{(c$kHrAw+**;C~kqU5FMSV#X%Rz!qvP&OXIQET)=a!su#mPM?rGwFFyXDAa zsQsz3Idt@MbfGrNMyX6JWwdupz6QK?O3;sz=$OfN>&KJ*cQc6SB<5^R#0K|Tzs@2H zjh)V#-$DPAA2|42We|7)x{;s&79zxuLIf-oEBQV1Mm<(iQiGIXTh_odgkc^v4>jg` zSJV1eQ&0mOq>$&GWn3U4!WC;a0G3&ipK7hL!fgn`4d6mTFbETnP+Q1r%96cz)d7 z)va334Ag4V)w)CuKm7nb@#d>uw#xhf>*w%*3p#q~75Ah33E@LyI4o^DvTT?OHi(ac zYd<76!u&1LKI8c}e`9j78FTni_0!Y#b+;ctPk$Z%=fM2|qx58tx$@dr<=kxc+%w{0dMAovh9 zt#7Nk9V_1;2;@s-i?(CQm?WS2UVco_1dCK&bE@!aD8tQtGv^Zl{;Se$32o@RU1EEo z@ttG7Sw~g>sf1rner&ER>H1Yq(~12ns6A->dncBaJugJS>SZA1o`^D zKi}>Te?jnfZO1bOiazC!`XqfR_W5zs;|~Z36;%QJBrbo3{tPHW*B1jQ7Cm2KznaY` zNZF@LU-DB4ISDrukNGh9)5qFd7TK_g1d`tDj=<-ue&IVtG(M!RNtE+R6U4n2LXGME zuoE-=>4E5;VVB;*FSTO%jzR=tU!9NMwmnJupINbwDX=4c;^@4f8^d)6^Yyc_iaTAi z68B**ig5o6-8CzRWV*jVlIQi?9T}RGL>C4NHAiAb?gJ=$AnN#QvvYli9&c9L;U|Oh zz~PjFmd{-zEgCg<59mb@%>y~|VFE#b{973Sag`4~mTxdvh_eLJ(OAGU@)|L$yK3_U zQ%U%S*pFRGWet8EIL>Q77r`^SZ@}Q^`vI54>mM;XJac4wzJBkO283`P9v+5c z3GDt_)qky#?*OwgOMnfkr=lYCN&<|?nCn~YKEGktd=7BvFBvu^0!Rb>-36zQnXd^3 z(u`OmYWn<3aY-33CGqQXnDuRo`zpWefu%+lD6JpxjD)i84rin2L|H1IEe z8^Im$&Pty-{r+~d8e!?G)F9G}&3-+a#aH|(sn+=d1*bE@-L&@yyt8g;y+dVv!Q*1E;nwxJ>k zBsWO?@sfY1SagyY|8Z;&0C13*&oQdGpNUQIdz^**0CD~Pe4_^;WC70m2+e4EZj_>0 z#YJTkwMnJw(#$&#thE?P~3K`X?d{bl-O}j9| zm;QCgSBHFRZ^yVkQmmTwJzBBYw$71d?)kbTcV@&t-j!ApN(GFi=}9s^Jrr&Vfe^*b z3Vna>K3I0}{U{*so5=-_s~l4X`gAkqW6qyQ-+ziduBE?YF5IrbuQcR#34^VR4Z+lw zbvN1-`kEt`X)rQll5OxshP&fM`4wX*rNY*N#voAMfQM}4tX~2mE`R~3x9)%#1i@*yJd-YEj#0DZOdGsG`$XOI(zC>)A`?ens63uG&)LI;NLmNH^36J zFy!DCoYH-|PV#a|?6S@1MgvGt*zgzGo+Shr8L!528i#RoRC19+>B$Q##T90vK=B6@ znp@i;tee;F!_(7$4OYtK3)=BSAmA9(UbFN3yHrYCSl|8b#Q8^!3(LvG8t_T(Ca95v z3r0Mo!%$|7BQheZEo$g~sw8xCHFkk%eVP?_-3YW_s8d&aRX^t~i*u%@-&*k~3#K#( zA=@XMwce1LtNv~ny#?`(a6r`{nEW&Mr%{ja9tNJ{)mP<|ad5LLKzKH`AJRAap5izP z{pY1?lWa#vVW))3D>SqFD35`&Ws{fEq-%UM zJbQL^S^xp>k^F^u{Id0kp`?OFhL_73Hi?WIeJwpi?5bPILT~BeTdR)Fm3lk+35R9s zS=!ePkPi~iRPf{;I5F6NPL~gb!xvdczRE`|;DGGB4u#zrSHcBhUWvvl_50*D%{n^n z%Pkljg}}rI9&)Yy@KhqzcEuNwPW}$Nu;alSPNhvK|26|{g}sqT%vCikcI87(1?csP zOrmwZu5JxkPxg@J{SUq4UoY-l_%V?A{LAN!Hd>aSLT}Ttf`2qEmY^CCPO2xGV%lH! znQJP}Fl=#v3&^!3AbEA_-gZF56!Bq~acb2DD7$ATA1(q1zi<2Ir7J*Y#kdYy3EThS5k^7^9x_?3VNSU zU5uK1Ec;I`2WU!St>Jw4pjcmceTq8g_=75uWBeyU-qxz7|H((p_$6dIT+@p8HI~AO zqR1z7bkrF)bW(OGUeGJ)l2*%t+M%bejq+^9DU5Id8K z-d8_7olGp#-|d7MNy}T3JBr2onMhDV<9#i!I$vwDN`HIsKY! zd%N|+tb6NT(o=m0M?u+w;*{`IHvB5}iWb!Cuw3>?R$IGzXeaJw7+FJBjR<9Nc zMxldQI^U4Z_MP7Be-MB0XLIl*yl8@!QkGLl9`d$q(!!4y6%)c|FAY)`$W^_%UbvFwo13 zFK4#ExqG|4>ay+8^U_DUL@BoZ1bqB3o>pXa&7)9GY!U>=U~;Bkt;iC4`$xtFO>1~& zT9H0wb92}bo#{_UI^fXOM>bpxo7apaeqKfS_w!AJPVO)G!W!JuMU`1TOJMAS9#T~V zBUD9nZk^Fc14Ryy>nTUoWsA>A#od1n&xcxBgc2ekBD}36>xV{TE&5G9@bpemrIp%F zT_veVwrIDS)`E!;0vV{Kd(W$C=yiqU#LGT4wk%O3+JVg-U-BL@M7Mh4Ogg)kw=2?F zmh3rwP6w-HC_w~2U_#dS&a<&A2oH5bMQ6Fu#;JYtTo6iz4j>^1%pW*3xUO2*&!?c}nr?1m!%|0w`!!LU}mY>adJn%(eQ$-D(e z;`oQJ-Fh-}FrC}};%M7(B#MC7{=J}rW3N@%9oVnecR&f=h!oA&SgDwKI{hR1Y|=}7 z@a#;u*7LS%-mg22JlgbZxN;{<|-$FJm7mFcWD{*T0 zvP3FV&BZ-_|9?Ry36#d)nB^dYn6SNk9TMyM>OsHOS&}8FiZXi#MVn4slrnAlv2%Rr zD!MN)OtULWW4QvAk)ckMGNE<4koDAVOUOg&CAh+VqAxtbwj2LZFZVi0qNzSs|B>$q8F0rBWxHK;j$ z@H2D)iZ^%4MwCJ*3UU(C5-Va zZ)F<0D|yP3I=w0x>Vk6-Bg_;a<|I>=&!r#3|$Bi5o!xat(fx!pnmFw)#XJoDLb z6_zDTQQU+i9~9K z?p`H2r#cPpd3rw`PQO_EKV-dSSX5v8{ynsGBi$|14Gt;YjnW~AG}7JONOySsKb)&Z@ZJ{V845)_b zR+C4UMvw~jQ!qBoX?nUb39~y~9t~@QZ9d6`Eh-!&yq}Tlj;%QCw5L?if0n6rc#tPc)T}ZbY<3+ zfw-!xr$go3A$%m50I`Y_uI}5ygT4u; z|7B662$Ms&s&_Q(_5adA$SJH8UT#4Y`gy7V4rF6?-kj!-Y8C-(6&&J(gYp_>8%K#w z$rm9jSSzLii^X3P56Z8ej-NKBQVzcAt6fCF%GaGQ5U7MUalf!cfIJi@1p=yuw?U#P z0s00#IO7{YKXyz_Ih!mvk*?VE`6#7JZ1kVqNkk&H z=vCagPdi$TXN>h|`1jAI3nGyYMUysJ#Xkz{nVNk|Ag@ zH2R%(Kl>R^ZFU59x&E2ZosMR ze`g|Gykj3aC1n2E)uY69%lj4)6r^OR(9)mfQ`{eJ1~xmE6qCgIf<*zTa-tTb9IrXO zn}X^svmPtDm-(`xvgu~(YDCerYBi4dkoKw^qD6t;q^ak1Ylc`T+IBmXotmFa!qSrk zZ(@qZzsPg=Adz8Snm5Mpc|JR=+CKr(vx^;rRXEET4y#uXj@_VnTbgFAkxFw`@9mY_ z@;5U4R~jY6kS1jD*^)L+{$u4gb}}E;L<|kTLf>4XRxCyhjR)kFDZVem{NENk`>}5b zZ&O;sqMV}l6){3J^#HF&fASSqQXB=Tow!5RE}~OLZ=-Ea=^4(RxQU*jb*vQ*80ipmn3wwbQo|9P3Uk&*o zT2FzABD_VnSbw6vsHB{xJrR_i2`(ZU)TevdtO5k@IDmwZK z5Q+`+MrFq~)$O*2v}(|Et$u?H?h{omhN<>Mp_I2Jp%VBl7c|hgDYQzhZ@R`N=a`yvOC7H%P4{eEPt5Kl)phiZ79X)mQ{M5n;J`Cp-sdNzW>q z=OwHfBiIHFgzHh)Yy3bAIm17lU09tXQ}tGwd8Jw5#}QI%4C#bVQRN(!`V`lZ3pUM4 zkr0|o6m4jNd*@`|lBIrZ%DuQiwG4X~+yJv}DN^6Z!(?vx=ChHa7{^N69i6CQuK>Y% zT#`dpmnnZ-+wCvI($EN@jKV6~b!q8~;gjHh{_~RF@UlLUZRG9>ahn0=xk&HpG=?73 zn&YM%4N^-r%hX~|q!cHHq9ZA2*Y`voki28zPx8@{-pvX%h3u+*-cFFG8dYlW7SRkb zQQVrL5IiIWaeaW^%!UP(CScr=8;Zm}58RH01`xtiSyH=J_0XrmC8lo}4f^cL5z8W0 z27WL5T3I3QB8P)QztNE|9kwq!OsdbS+W%sW8(F62hcad+w#Q!rz9!9OrghBdnmHNkJ6=WecxRH)xJ1zLlSYL>88`LP_@3>b6%1ng9vY# z(xe;$ml*ObtjcJ}iX|~JIwf1zyPfCKvkLB~)v{AI&3$~ADtt*PMx8C@ zvvM1U$z)~E4<-!d65;X1FV~7~B+%qbY*7WpY`>18t$Kx5$v2LCtM{Z>k<7{yWsp^l z4v~)@(hZIJo9rtl*HYCvtEmx863nBrgsICF571ZlKv|dLZ(EaV;5&;dn@Cd0&9X4( zj(hrQ6b9>EE#T(9=)}~^s45omV;Nlag-6jAj-0lSnHStrrdWxZu6bN(*;zp1h)FgOouK@;Ot= zkzfM-NVYVYH$}xIJj%)v$~e-|?fSFt4 z#ka9!-NPDiV7@j7uu`;gIY{?8|>lQp)iSf1Uf3 zIMeH9_x<4YyeejRjc4Q6m6Koe^l;#cp;>~~?de)@Lqk(`&-2X;RH;yYze=Rc^mH2K zh>6iXui|@{F>^~%*IQCvBt&0VQ|RG%nQ7;Lj={Zk7l|h0O)!6mzc&-|WA+S@?+fLT zLpY{8PpP4peu-sWrQ)mEpbO`xkGzmUqhK_nRx~Qy3p+A|HU&v_D$Y|4kz`~`D3G4AHC(CWaf8jU>|TG|6g_zNgk85l&7Nh2%(PL(J6UKrpN4(Yqry6ELZM+2)%5z?T>vH zQp=?36Ym#Qh;(=vxi@pi84_+}DeY^-6x)b1b4Zfer}MT(cyZZVeLr|!lAo$W9MhXd zpjyS6*+_CtIhsXb`1~2N#%YEs=gerTbW39=i{>Jd)dNPSeb>*XC&#sg%$^|duJ1#f z$6*4+)pVwV1l7_)M$#Cnz_r3SJB+26j0L2MX`TDot2@h%3fV%TYV zsH6Nc)CHvaXy?qV=RqEkBNZOpbZ${HdX<^EZ_+m_L$@8neJ{o$L2#tCSLO{AXZd@e4epf)NlH3Q8hFU7luZZ8v$w2F*=D| zvr7APbpZ-ZfLgc2!y^SZLtilht7dPKFH*Yau3`)s{eMsSoW$^Bpj&B7DS5SggbUIn z3Sv&eJX4`}P%Aluh_Aef_!mHio}^{Ks2wk1pH=f~5d>zDI@aqkZu;g~N!q0l=iB{d zPeK!`r=NY?!MI)on!?l}okf%Xp*qdk_O40bn{)tZz^rbsssMc zn7dHC2-fBCJV#mjj^LtKU%?<_Lv`DhVcX(@BPBAE&N*W1yKyPo;F>hXBL7@rerGTw zv1sJ2h6@2Ku3PeUo^U5gU(NMnVqWUKVvMTL8xUh{gdHr0-Snas^BmMY2p5+W`$4)G z@BajQI1oJ8!HfiyK*b*f?{k+b;%?&Zg14BA5$HDbfBb}EeQ<4b0x2VpPg?bKo7SxI zI`dupjQnbT^Hq;yG#LKWK*sy<{ctYt%(iG{;EZa{&zkb9q_nhFD6?M4nFQw{AAWAJ zHgy#9W`oSqo|=6O;$^2+L0Zz55zSZL#j=mQv!R$@Ecq8KmAFvC20r#9=Eb9;@c%68 zAn8Pgv1gUsG#HGce#Cj+V6wcA&)3F1Dn07bVAMN$q%;w(Hl* z=N24Ti9bQK7C$f;6$!Rz8IXLPn0u$SrJ(=FRbO5X`TlcE@2PnlPj2=c>dZacqEBUN zdw_y-%%|2SXuT?v>&Dab?wk{np$0?7Zf>H(jhU zLtDG$6Zu=S^qULe9T*RL5%9Cz5fS-K%{ye~t4e|}Qh`>@5fV`Z0}l!98lrDY!xn-b z_J4lOTBjUg;OKMvxi`rb0QNY{7Z-l?!;VJPtm!O22zOC zNXwrFz;ICo;?ie}{4zEDP*0Ql?N_ED-n+Vd!|fYRYMw^?T3(4SwxYhmCgb9hu>PN# z%fBt}dfA-bEqlg@zP~*z)^=<~sTU6B`5dX51$ycyJ}7MBn9}Q-d=1<;tJ2b{H=VX+ z>JuZv!Ktodf5RVIBI+@A^`m4zx?6pMMORkWZZOI5^t|Ns1$vx{nBfoWSn5^QPHqjc z^WdVMr-JZG@IS3Z2aaMJMJalCH@i#888#BpbbOHoAEV?f zrrqW2+1{%>4yPRgL^?^}!&t}^s(`HQk36i??Jf?{2g#R8#$@y9M}df9ep8ngR6bK` z_)^vnr9dtD_4JPD5Rif~CoM;s%W6c$T~PbvM4D!EKzB^hnBddEAV{eInhBt9t5?xz zbN84519V{MyFUjwxRQjwXGFRsbysULYs5`DBwoab6Xz^ZpPVkcWzFh;i-3CKy+oi{FkGO_ElsjA z^(BU#H;Q7%0``a?;-%sr1$Bv~kja-U<+LX>F%vZ$U|LnW?Jyu3D$|FTs6AuwCq-uF z|5!5Nm+Xr2OD}l=pLC@tdNiR`Ut;vs~@;{GqE(8Km|9+g_3Z z%ug6F0ib;^Q_(fQuiRUkzD9a+M8!XoWDR}knwx(BMkHTcxiiVL|Y z_1KMxhvS*0S}0|FZ}%ZmWTuE+KoeN#s^C3k7Ae&ymdw&PPtz6eljmk z*onj-{U?rKz{{Qu(N7btRVIhAIN=MUTNl#Q`+^*W!yD;B%$twwCKplVP!upIh7uq> zlc1k@YC{%dgrKiRYgg0=!&J`%s2bv5(=RN_g%$1-QRsVmq~`MtiCt>eG6@MX3y)zK zLqnrK(iM#YzMx+kWwS`3h)%way4I<;PA&Qs^Udus30o3vNtYJd#z~)XTZ)x+JbhLW zAJO@J&h?>%8E6!|mG0j=`X1Evx`Wy{wC(-0@c6c&B72sCN!qtu0lD`45$fIT5MHGk z_loIcwu~*TCvJN9CPwadC(xDW9Q9ExdnRBsDJp7u7ZAPg_Y;*}>|M%hh>~+zqwvAh z5J^l-^_Kj1uSLg~bHN0?_~Ve;e*_X|4BABSI%@BTP;{J@Mht94*XyC0`qvR_+vqWv z)P>KdO}19@Gc+?)_-6}kTa43L$MIZ|#cE}Eq?Yh+Ewms#BgX2u=knfG|e+u%W;L4*VqxER2#ux^tyQdfS|+@3yhbMRd>u`4b4 z-c6~iXHItKH0MN?UC6hb=wRZ(qa1+(WU-6~|Ah}iLi;BpdehTKjma^Om+1Ia*W;v}=e&QkqUDSBps~Qnex7su#Q4PhfW6}i6*N>=8XYuY)#FTD@V|Ag+*+$&v3r%BpGsk1Z%EJnKdK+qui~_B~&1{pnPPM+s{me z{JnFH+VfsjOd%Dej%cq5D-;kQ>a2KpeGad(o542RM?3bwU4~N<)Q}u@^Q1^vy%LN^ zm19>}DTWPtw|pUcGYfG>bIH`PFK=pq_Akk}MIC^X?B;&~mpvJf;0q&4`tX zMN5CPYLPU8`(8Gn?DS4xz)V%v>9FCMC5r=lXY&p$(?^rETyAwbcH`8h``B0jc1-(q zJHVsIr>QqVJ3=rN;l^$<_}!*d7RIH5LS}s2s^GF!+({)-QMO)#1IFzZD&(kjgamwb z?dK~v z3h{?L&Ue#6hR(Xy%TZ4(1*fLmV1GbIto-| zZ6-Q?q~}U`TCp&ulGv{kslC?x@kP#XTA&tzz^mkhz077V#Gfda=}>!Ok%5>^ClYhWfuug-`J|c!X%nD zWQntb*k)%+oxoWPRr{C~uC@$@_#r_>JE57?f;V|gd>HQG=?*+GKOy#fB$E3Q%1Y73 z5v=NM9cw8?g91%ULy`rD6s*>hI&Vhm!rP^q&SzBnRs^!s!DwGiCwRz?34`-HaBM259Pk;(OVjt`wV^%X0L zkK*$Q0als}1L|$o?zlLLR0h;dN(ZDV%t9jMk9B%II-ih2>uwN3XX|-vqcSr7gDD_q zW6NGXnOkixKLTtTy7PNi2e!PEHbWYDa>CZGKbdLF3=>ZLMih;~(%yi!7_ej+Vo?5A zK9RW1nzaa&6!|#}C%k1X%v>0nCQ*r4*~jOXD+Ihyk3*t4U@)9DMaH_;Q2uu%W3kDY zGX6;x%*~MQ|D%$d&cWOb2$}ga*4Kq5eQ!#Pm7j|W5Wk&1woG*Xp6)c=Ij#PFbxen~ zsJ;+?;%MqmC}QV&vjS+VM7;k`?i<)%1W^`M%Ep=*qAFDl@?FsI2o6W(+_|97tD-+} z8%k_%*EHWef~^;VmaCC?MHC8=$T8IHB*D39B^rEBRZ^^KD%9}$r}sNpF-(!BW3{{$ z=d9T}0Bwj(FNI^e=(o`}s(fqrlYvEBPN*iIkcf}V2|q9P{l@`j*4kHcp2ZWV);c8T zEw{FGg}vEBA5cv)|k_8X3`8gp_3P#8{o8%v!` z`A_pO1wl_l_>eQg@jrv^v)~UzdXCFeZ7V`naqCG%&`nR%XnZ?r+v3KxldO4TlOI?w zZkZ!UZHT+IC~<}jH;t@6d|OEy{`OBH4jDlI5o*8f{!#Ub%0hf+Iz$;Fe{i5SKL2%8 zVkfIp;5`vmsxTja>K;Pma=>w`!Ox-~2&44%mICx|sz#4f4mOq5$O>9`P99NyVG!WH z-Atep7a1fuwk^Oq>G7cq!=nuGc@Wrl%E{5pN}<>x#_aG@SI+@1vjemx%V&46J{a`h zb)DPRD(~qa{$@TP4A6Z#&0f_^#&z~$J;~AY1`zTtCV-zrBOXiu!glCvU>{R;-g{lX z^Lq_e;4QqG+@W1gYRSdn>CM<%%bGs;E=WpW(){f+rS;5MQDSzWyr+5dJZZ?PYop-W z`uc(8{@5_0L6$AZFkC%}ZRgNy;Ncr^tP2uD;@7#yRF7DtOUu@NyHhe~m3Z}?&4C?? zuD81eq_9w=tR^Ky4$3(Z=?Cm?#Gq?mQWsB|K#pUQsg1$^SdsqcSB83M@(EhI*fz>f zT1XruqCaipI+-oM^{N)u3tkhJEQKy7fx<9JU(zdbB57*a8}TDY4;fyVb&MxsZwS~R z{Axbt0ZNw4Np{rXx<5RbOu{`F~8x-v5BW}m4X+9!v1R9+s zpvYy&l{B@g|EmQkJp#OtEO^NL%!2O$aw#T$+?Ykf(pkh423LS?}=9 zLxejK0vUNR)5Q9@u;jAxpZhq%q-t>h|>TNFU#W zsH~qh!1^rrs>+~M*mdh-rK>tf_u_FD$YkaM{^7m+@^4`MqBQo zgXNCGUm^eN5P5RkoKUn%opAVqNI%ZrVuu(qhHE-9OU1{&ji*Q(%tXBQ6=$-5@-4b`h#-ixCgjsn=n;>cN5WrV2aGzR|F(pGo*~4D3>7_ z5>s5Qt|ptoQ|qYoZ36H+-Wa%^+fUzfd z-MS&+w^5T$#k|#W7X9%S6?f9`S~NGI_%O?lugnE+?-B1_}q4GWA5|ay~U!C}?kS*Kv04wPC zu9)c1%Lu^M^CD{!T>dsowSLt)t#IREau^j>45^MW6E|~8}r{LO;ZJ@Wp>j zA8>i>0}?nj|?bd=1xRXY1Tm(tbf`K5?rsr_Fdj$wG+Vv{%sZCne z8quSY(eB>e5X{cM0|5rp-VlQ9lm01Pj{$?;f+ys29oDDx9g6%C1i+|`NVNDuZq^)N zv#%k_FUfo0n_KppzhULSoYj#-cQli9j?1(h{zLDRsJJRx5{#?fLL#;}5Ut|#nh#T9>D7!A#jnUs z6Bc#3A_rFw#OpXCXImFi(*x?)D3C8Ir7oIMNiAzllcvOtULC6p*TE<(Awq-eBDEub z{8bj;Z`z;C7HJ!#jqL&==HXs5SqhCt9cE&0@>)?!pUyV}0Tiyv_-{Jdgr(ajOHoMV zJSAR$oHTxYA^IZI)^m3n4(s=88PGYe40LIE8zcWeZ=i_Ku2Cly<%{ORh4*S!p4=kRF@lhAK zS3%)>;qt>OI}yl#<2$J+c-oG4Hqm~PdA3pI(>%glbp3L@d=(@0^W@sx zUz_sJ3vJ~86Jvx>xhP%*b@*wij|{EA{4i292gOV%N%O)@vVIK)awwnXUeNIOh|R9^ zTvQVo*7L2>e78AGOe%XkUGgw?kK=3t@iF8pX|Mg|s;66(-nfE*wFl7t%C zBvRxEVG78gK4wVr?e!VOwrCf)#ez8R8?V7=-=E2!H!|PK#kjWDH;i;KXzW-pV>5^!F;L+iu8B&e^(H;JkbAi1I3KE(Zj!fRz{} zgecoZho^u`w<0Oskgb7aYaf};5*V>tLQ=8vx8d&uF|VVNKNgixuWV@l z7_t(D85vrA+#XjhEiJ7GsK&llwWzGFBPfVmaN?LUQ{Er9h4)1jYw711Mq?$^Py3hP z`&aoy(g?or7Bp2ZydVSo3Hl&QrNl>wn7sNvVt1BOC32lJ#X4|lR;egeG)lWc&0_Y1 zY27CZ5P)15r%TxG2@cTf zJ=@ya{wmjnyq<(X0k>p7Uc`z}TK3={C+f;42DYFSA1m}b(1LrOy~;`tT?9|>_MW|> z$2@^!IxoY=H6-SRJf!zR3k1mNlgehDS~4cgbm!I80l|<5jo`De6gma+4I|}PufwA{ zCO2W^1!=-_*|P|b zPz;1hAvj<8whMw}Hqo`T3IF5D0*cfsE;L`3z?%@ceNNF_W@qlc6iKy4I9&8yTUm0t zBf29WLub(x8Gj9%t^orQ#Uj9BM*>C*A^Mr;J6~{5x8UiI*tGx`gln%mFJ;2&edhtD zf{1*U94Fv#(^meah?4cA9k7Mrzz-Ct-g7n^?4KdB{SmOP2YL*$r|1S3Y{>@lw*;_S zTA#KA&@${aa^sxGiIX zEx;UZ^PkoCs^`@{_MyZC*tuRXKueOSDch5=qXA>Pkm5D(dW?75fGk) zSYLAtj2>3MZz#`+BRcBDPm*~|R~c@~65PM(+M%1y{%3X*|5Q}Ow}^MXCQK9fNks-R z&Pv+g2k!PUr$rOothn+(FwfOpuBd{4{_&mXxmJp-Cm(5a$GSHe`t$xfBKY0`164XS zQCMi<+SfM>lO6tgi0R}Cft+){)t1W?Z<;3jHhp9Ll{7G+X=4^U9d*y@KYs^ZSdy!& z>6gz#JZP5!A0@6~2W;9pI^v~~P~{b8*9yY-0$q(O2r6UVDtMnWVNT}U@^HRW#<-M0 zN*QDo`lg}&40ZsCLkYKLgk^o^e8JEH4%z36Ed(d8zoFmd@nT|G2!ED|nG%$Y%bQxm zoOD!2N9d@lU-8z>If8(a9LROgwdlKojlnu83)CU~WW-`Y+A}~V1_GcOW4kW*-dNkP zCNf9T7$QReYi#{2_Jy41NvQf2&cw#CCQE5PYu&eR z6uhXQpf1w1pnNX;ftn9A^eg?1NoO`9CSAZ(hI*z-(v>Zlir>P6Di) zJ3DYap_4EEp@Kgj!ZEW;OHHDx1yH^IActPP0XL#vOj|c>rC*;-q1*9WU-A>91=ODB zZsqRCJE8O8kztxo$C9zjkyia=E?R6Vn4mHbxZ2{s-Z(t>fz_ zPH(_5su(FU3^}f_%X#z!dzE@rB(@wrkenM`1klx@CBSlXZUKVuN)w$_;#r9Wm zA#;0?BfQNYWGcyz{v>8p&(f+nTe;SXC8fY@%`$nR9k@405DxJz?wL=|PJsSaT;~c| z1Wh;jAs}&Hv`!2+l{r{jF}u4!KS&=pt3mUz@3ONIev~J7r|5NwWbHyyrp;`l>&XFs z^mE~$Vn*@va_p-@hFJka^7&AtS{)hId##Z$BRycD0Ly<6~rexV*_mwWwKC+UBn7#zf20A|rgZ zzEkQF@G?Ch0l>&P*=IyIBUok?1|C><$XVOjhJImCOEpe1avrh6O+1 zT0E9Etxp_-3p9w5eZewgZOq2$rG|!Yn+6{br*Tl`q+U=u10B@Oa7O+tDb8G3g7i%F z*HL^G-D(L8tFg@7HFd|;WehN9S#5}7p`g)H6%~~Xs>spay%aBsgn5jL+(*1fKO zOQIKWvYNb#fNFu0o7Z)4vT4(I{p_yLs-vFA`|3F|mV7MHKCvDcV7UIb4sh$itw77|@IPi*5?w_P z&)B}RJ&%wT_g0ZnFD=#P${I@y@3UwFpm?B49prLVYd1%nyHedJOjHU1lnkEK<-k@L5s=XvKUH9t zuvD-Bp5L^aAe6TtCH=!23;F4GAlHBXK~xk~I(1+3$qrIOR7(bQdU%Ke^ijm* z*lCxb0%-r9Kx5|yN#P$~`v<5{$*B^H_R;mYkf=Aq!+rw~I~aX_#3tiWGo;(_iP^4p z(ajtyK_fdKbks;2d`eBN?cubn|G}eG#NEY#;<>BShBQbw-MkQSj8{!o+wxwl8(c@K z`t_qjb&Uuqq5RQ096w&OuOUBEM_mu^R1|JTRAZSep8ONiceWm=~?L0eY>CvDr!7d6V!vH3YPKe0EkC9QO4MzS=c3nSt zO<()EozC{9p!{gesb={EK%q_SCD=y_8+NS6GZ@!G)5MOd6v!~e9Y=W8jDQyL)*b9Y zRt?Knz7xZf(e8H^xG7Aq*PhyFhhEZ%{MuF z>D)A%HodENAqwd?Uusq@qksmVM?1}KJt7S?BQ;t9>p`@U!9EJx6ioQW%j-0g3LQAt_7-yT~3x~}a%=AI18+JO7~R31GV z@68DMgZNY)_Paga+yLJG;9McC;;WL47pbqRCQA_}`K&Y8;`3jKDE#e<0~v;E~L9A~N=Pg_eNF3YV_AE_X6q@GO5O>1eIylmWG=QRNn zMG|O))pS1|QR8UpV9{*-dsJ^=@yM4z%<+bcMp2f6r}iO_;5M#I7hIF96URL<+%=kdK8X(Uit#PL)!?q3Xa)8UMT3H@;DP6HX6CfbSQ{RgjAC0^e<9Qf^ zB9pSmBqbdZz+CX{0{|+dm(LSt-Y*Y(6J#yQwV}srZHf~Uial~>S=}fuf^qU%}Lkim~9pT`D^2#q<$2aJ7DeR_Vxz6=v&!Bug~kRZPQt=kc!vKUwC&B6O&-Sjab1^ zyIW{4AAdtKhoGb(v?hgxi;b;;gYOQv^&Z!4@9mq80?;T2G7578R2X$x=aJBUp_ ze;2R+$Cd~Nm5f$Yn|%cM@768F)h-2UuP1&Oef~&%!#TwK-*|NE<0tX=E(SJ6tEd06 zBSiT9(2o#(ZW}K?WV_vUt+x1jy*}S%G_|(1@j)E+N0L}cK)W0 z%Z2`6B6T4cZzr60N!aQ9dgJ+dYa+`A7>iy1*}ETz&a!(6PZb9G)Sj4vh?mBauC-&t ztQmCQTvUalLxrB>p-70W$Yvn_25i0FzdTEF`rfwMbgT%}Ki=E%eDor17utk=R7fIo z_i}^WyGhiqk7DDUQGww>11Gz0$2j1cmGA7RS$`6g_q12Au3zSju*4go`@DRe&zXv> z%lwx2`bnD$;j|QRX1;e2Kw=kzDftMCALjSWIRc% zp}$M|@$L)=ACy3H8Vz)U+uOZ>7Ck`ZD1|&+nT0$Pq6x4}1kYMq$K;&yo$ozA-)Wu> ze%bVI;8}lVAB`R$pEY+`ME0`zwHf@)!+*l(&7!<3_16zp%hNB+6BEm92(@A@GgQWJ zf9a)s5Fx$wDyX+|XK(o+)Y017+R<_LWg^?R)B1~3OUm*Z7|ybY(I581N2`zJDJBys zY@ewMMC9NTnh$EgHg4BYp5NcvvHtXg=+kl`hGwKlysz8^gt1UD7VtQG7UZ zH8OFR)o_$`OBMR_C*TcPIA|n5V@x3l`_i3hf6JA{9 zApKbA##>tQ%mWEaR6h zHH}tuyddSA{e{}yLoRl9Ox;u4gxm+jZ)f#bx%Pt=B+H#RS$PLfW_S&<+`t~{fUrY% z0(kH9FlaFFwH@L7q|S*)@N){iF*GmV)RUt0*XySn9;tbqgfm^|c<549(U74D_r#sl zR#kk{I=H#{S$2T!&aYy#+m zoMKv>$z#1wUyi@p-WEk9<_;esU+um+x^&ZF!6R=^3FNVd3>~|2HZ7i*$LDxP9VZjy$|LOP3v1{(bqc!Z`aLglVoc3QWz<)w>qbLtjsQx4JTyu#+ zI6Q&b-uV9FMG$@Ij)}PGZ90d)eJf6%$^aDo?_j}5b^udXR0%^)rqpJo_;@~P?RN!% zGz+`{;Ss2WH+JOA`P1N_j|UwTIW71n+CweVz*ZBt*R?h1;eIOK7zk**3zLhiNjV>M zTrGjxlO zb+;hRIIBPK)&5MgU&>zN{{5Ci_=fVAiv}E5qq<8@6ukv=il=lizUMm)MK56I{wII< zzzd;ZrElSa!AMctWKzqSB*8tnM&Ro&Ie&LuT2jOwMmkWBF7ZIsvG}u-!vxbTcf%oJ zLjNrX->R+UgyT}ZRYDV0wi}Ad$rUevy`sE4m@Zm{?6G)1jOf2yCS|-3Bg*IE2%ZFL zI~7DaF}iQ?62vG%6K;1;ze}Coeho!#(T|zojVY7i-=Sm18qY)JgaH~XV#Zs;zrotH zI}S+#5|-x4IKust%bVviygue2>M7DJqFB;Vh&$u%Kq(_QI&Nx7L^e$C>3F5y1x)anJ%+cF_UQO1+#eZ11qGD+@`Abnqj z+Q01786+f@b@kyQ?90fnrmX;8hZ|n4|3x{N;qLi+wz@XPi7$+TB@~FVls?iCiHbX2 zeOcR?*{d9;9(QQ!Jp9BI&jfuf8A>R0EVl|sXX(`fH6D=b1K^XS?{#q<-0zjsBULDr z68)w@iI2a8){KwwyZ%x6h%rJO^~9;E0Zw7F3emiQaL)H=e}h^4KZNVs6nU-KPp7l1 zJ97#AO*-Qp_q+~oUJIdAkgq!xEwuFCQYkl=Bp+Leyu|mbCkCpcigB>^*ZpaIu;~8! z`;;`KahN)GqL*)6Wn=es4Eucxn2c9KMMA4iCaT^=jB{OA>q7}WfH+al`}VsTb@BsJ zs|XgQJ+{;rlk@$B^=GmUpws3iXVnJ#H?`S6HdDfSMDY6d{Z4p?$&NdCi)iZjQFgDj zx5+r**fztPtLaCgYzBZXoS*+o(>&|Z7kIwNIiu1I&w-w+ zz!XZ*M{_I_EbAKj&b?~y9&V%9xG2w+4i?vLf@!=+^+-VjSGfPw>{1JigYHM8)|@JE zhzulg;j~&D%fR%~;4Zunyt9yCw8fY zN3S>Q>3|+ZFoLGpyDt8KXp5mGuUfE(yO#ATH15-#$55XmvbGo%d|o(6B-YdOURS#f zjPhzGwzu1fhfDU>CH!Md!qnQeU@GVvzo_%$-?Q(-&t{l^#pjyCH;H7mYd!3Wm&A+o zWu?itrJTbzX5aJc<#{X$C`8*K<)17)xE!PWX)v<$2YQ3)PbhSN8XriFAv?gDc)pp} z_j&*dC98>9a4N6CjA#{hZ!q2vySJN~9|7`IN-UzMNp!-}F3Py}x9KWOO%;pS>HKac zUp`7@_N$LAJ(uS*rfS@hDHp*GJxVg_-?LC#Rpy3fplK!a5pA@Qe%#-0D7472CZCax z8rHMp?D_fSv5o8RNK`T_p~2h#f#;kYIEzwdxlZx!lq!2QMg|55c#ft78| z*0F8d?%1|%JLx1H+qP|VY;9PbcEqR6TP%(ab3Q;xAFn%HK=~Ew;qV(LI!Hpy-~Z3)1ECLbx64`5%Fp1;Zj&=NA-5=|T+b0>%v+f?nt%WU(Ji!{ z^+z5k<(didPm^wztEN&Yvv6K2-~Y~qeTOgc&3yX@vkY^J?lq_=)|~;MdKTSS4Eo{^ z&y*s{9b)eNq%}E|<7gK}(W#V8B#bE;YzohNbgS_fwwvX&7Nb4#uS-tB3PYnz?Cg1P zIU)FPE=C}|GZAgWnx2vfN>5H!DTzb>z7I{r{6q_1*P0ur(@ODnNat_nZxV}+6q7}R z%MwKhcE>)S0gdpZ*1HTA12tXS@*Nk7;%DQF7ySy8&XfTyobyZKpD}*OVY4_}W)5re z=DSq!RT91{;8qx4-2{I6%HU_1Ac845^A^yLY}}Hy|6rj1!KGErY%kqtv_)vh)DgXiIgqdXgnWba@YksKJM1m*3uaN$p}DhybLW6 z8W|ko5Ji`59fYj&|5a{Agdy zcJJav@LHrptH}e+fx@jc^i2tz{o9d5wv!P}MjH5ZI)kw_4Oc2YcP^cIyjKfd!ub&% zZ=0y7!sOB8wWi;gO+t-et3FNIhkATa4a)0JrtxvHZD=cTF0Ms^@5+05WL)lNoI++Z z@Q1Q_S8|52tn=TSE9kRqWdkAOdqOJ3^uuc95XzpL2+C?U`~cVNS>FAZo3nRFH`oya3yqqJ*j{P+_8+lRwkL&nB<;upNBn*+Kzrtd#BDonZnWB_reNYZTFSw$5o;Tl% zh28JX$yz!itRTda9wre}+|v%K%ZQg^I~c#g=K8(vs22z}fQAvO>w28Jq|~Q91sCd8 zkq9m!IvkZjWd#gH9jwP*x=s8C6o{1b{1XXhLdE0d(o2CmzQWuf4LuP;w83MAhBbe_ zNygBa*%~Mz&i4*_n>L(DvuFEydV2bLyj<-f=c*>cMz9VG=qZVIGHHHtx zSPEFDVmLx8Oq5Afr^4kfzpw1g15LI2N=7FwM2>4Q1a= z8I6fbklHG{_OBsOIa<=w&ZpZ8rdj>&I1H8o!H#ECse@g-vs?+tgq!(zL$4$nKY9#e`&HQ7q|nl z-gzy`uQl`i2bXxiU+-KzTr89-)IS~BYeN^i(+D}ti#o>;H{3yi1&5_s^@A2k^sevH zW-Z;GnOT`xPC%SVty+vA9W#l7t5aZiy%6L4kz>K-*fwPTqga4zp86+5C`GsJQIf74 z@_6;DZmo9TvT=+9{U{X4m^sgJT2nU^ZAEGCm($_kDvX64P&IT>$PM4<_8k$YJNnSx zCg#W_V0s`B;;oKY3_~63bl+sj-?#fr*~F&C@SyB&Bc!wbZbUF={IvIt7KikV&xZR? zPx5+oRB6-u9jGhdfh@g#>GOg72E+tnMfSG5q~Zl#l21;#fEblIzz3mn5F4UYL}JJT zsYLlI*y(F!#NOZNX!-G(R9adZN661>yT*_3cz@qyn?k z^U<*a`y<7IZPCj~(=2n+kof%FSJ_p=j9V>*(Xu^EYzzSx&x41m-G)uTAPSc)#6Nc- zV#Vcu&@trFc|8&{7s%G>k)xPyCb~KfHAFbh&Fmc9b0w3n@v_+V!`84Jvfr*@!@#M< zhU$OCumaxC*SELcvw6ox*crk9(PcqXQ8s99&zORlu5IjpI)X77}GRZKwSm?@w23$$pjw)#Mc2QPUwbLJZkB#w?%NfCRDTBb zBAN5%?p9kTP2=|NYeroDzE6oTbIbW%IyD3=?O#0ciy#6dgqacjw5IwajNm7v9?SF+dF%x*> zdTv_~1zy_GBzAFC1Vmqcb4d$(YcB9%|D8mJdJ&y2N<_7oa*hiJqCgv!1^tbwv7gKI zXSyW1{v`es>WSfiaT^pO)&yhKoe_4UYA)wCx@ur5hCgUQ7X3_!Ck>@R#RJTd0VSlB zDd@^viJ5b&6$jsV>&1NNc_J{leuNiJ0l@#*EoKI-rGo=oa1&&_Q*$7>Qjn*}~FxRfk zR**|gambQLQ9=58U)?KSZb!LBO_5h znPXa)d#_xWqOA4wKfFonG>w0G?y8b*-1k8+3K!5k~6>2p{QuNXL)QbWPkkSa%WcAj8rg@@{X9DP0@%JUA=g(-P9shn z0n=cu2}9%#Kf~WRNZDzu7g5Q3Nv>>Fz!tC|Irx9%V$L+Fs`DqOovd_k9XAwZ)yi_B z9R8%JfcYVRbj5o$5#&fJ5^1N}TJ?5>ui0lzixJqy0@^42Z@E3p7S z*N%(B*>2)vUmDZHKT&k`L-t#mpIklI@a1^|xgUzf&3=XYa~^08zIK^1EV8(~YR1$Nu19*`0(O0G z-Mk5tAyH1Xj(sJBO*+W(c3+m6R(boL6&IM%p>p zAtjeqMHt?kjxGDo|8kkgiQIzh$4NIxQaOyssm zmyYc=;pQKa0ii?vL>DJHwaudhjGHM2lN@rUSf6If`)#a4>wqh%l-uTQaB{26L!nZ= zCJYu!a4wi>p3rLq@ikW0%d&7QnA7={#%8!30$V!_o}aG9Csz%!$28skrgAn5Q&-t9 zIOOF6hcB~Y{QlzmY`xWk3L~0@!P=ZKwBK3_JRX}) ztooV{g@z-9M}O(7-ohf1wg<#*Hu>;K4SI0%L^l*A^}6RwerORxZxu4@cn@c{~|wHV$GB=`?8)B+&K0CRJJ&u5b`ApyVlbpckU z{MVpBg|;Oxt2&z*T0I?%&9-S#y4cVugUMKdHx=+Kyd9X#GCL1VM&2CL5H@nx>$cJu zFAS-X-hUquUxluDQ>50V1vV47HR2D8BucspM_N*J?XjQxC2E^@$IkgmJc_P~-RY8q z-jIriPzagH>Z@v)y&w#e6$(Qp;K~;5=7qCR1L`hU`sMLSw3rUn$}Ad8P=q_i0U|@x zjlj*W9nRaU$Mk@0|oBk+z4+ig;l73&tx z4*wd{R}WGHrt=LQX8|QD?9Bq>5(>Z?pCVd|yvg=e+YM>Q5l%vo{G4weFGqR*=n(-t z+vCF-fI#g2xEUezqMhCJcD@P4pkiTVAwfku;zsN#oVJt&`G6){%qjNc=&=pvjxCiS zu{oJ!c#^;bkneBB9r-L3uTxgg{Qnk8==MJ(pkK(E1pZ*+ct$Ls0vfO_5QKGg7vDIX)#T{rT2@VZi>~z8{{> z2i{+MM{#*qEp8nj-*KddBhL9}-_Tb6iIkR}58JOn!16x>Hy|-6F+w(ViS!tQ^_|!p z&bR@&0VO#%0eNBWsb%W^=8jmuI^Mx!%+F&D|VsnOi!0RMSsW}tvM2~^ny?YRt^9N+1FwN|IIiAGji4#6Aq;0CB8HSgXp zuKeE448C43&RVYge0uworjqw>j|PchrH^zI z!T#A{tXzxnJfx9z#{C;pvZn9oCwBcZsEt7xvbfnjX?CWe5Y+@l$vB6G@=9a=S-9fa z7FRq-xxO799nUgK5sBQD$D@r9d3+a2`HHQK~UE-Jg#S zfFxM%`MCI}l0NRu;E#{?MAE@+HgN#^04|)hmLCHU$ACpKZns*-)M_iZdc1;@E?evU zcSc>HClqj9sSzEod{i08d#`5yACKDrJ1%;0^w@lC(agZl>pzwK0u7WUqA0UV^1+ zJn46+_`u%oBUs2u>Gx}`kSV8}#3;Nhl(4gn@;fLSH#Z}M6 zZ(cxGW-#P0-un(1A3w#t0bFd)M}WnYo}RA~Cx{0I?u>)=9f0k*nI6J3D8oZKD~n2c z@Ih9#1cYJJGn?qmwK97KOK2!)zE;aN}gRskQp6&bgXRx7CJN zh=U|TM28xzE3*|lte~(6y&$uzP{Z%XXFDs1KwQQf*wFE1N4zCN|A{4fEdRxKyFPiI zZBQb{a-L{ma_&j7t3DeAmf@}5LY+ugnjVYL$CoNV(tmwkJoS7%uC)NDQGlx9?ub9* zp%zTgYi3S9#}y#bjv6Hg(&kZ~lK`Z>PJUCgFRy6O1lStfhzPkA(~ zL-k!TM92~n_G-29#k%CtZr3Jc?pjLm7j2hpGc**g?2<$iXm_l_7Sh z(lNNuQDNvS^&}b0>Q<3q&K1D+sGg6{H^QE;%S``ZPnZLdE^j=1DIIyo$8FVav0SfI z3`y7)NAkVwG=;`-YwH~hXQ}mDh0CDaVXoRUrSUGMe`4MGKeCMKu!T9R{!@&ykc#ui zZ(l6F42k^}sqvCWB(TC^wnHJ(CC3^T+ovX>C#cEt?jE=2@|$Ie|T@Jjv6C z;v$n(w7`N&lRKr}ooUN3Vpjp1$Jrj6qoFhiL9`R$ zv{~ce)Xnof=8Xj+Y({^#!poi7zm85Rs79`Zg7?ipuM!qY;Ct466zR%@^j(fvOxH6% z9-<~_(M^zQe0X+2=+mG4(7sJ4$~zF{Wi8IS_)-e>U+v+OWG6y?!5Kk{2q@9QWIrvD zQz=K6Z6%}shJ zvrz@F5t?Sey~ly$QviajdYPoI*S43Ln2O?#w^-BW3jjR^@KAny=(+r(SLHw{*~W4O z0=V>EcLu_aj*jr*=qG*PT1O0>`a9f@1p*)g_7L&Y;UTXibVJ@)&D>7$vcufdHW1Qc zgujG4F8?j|zrTL0NF2C2Z6)RXnooTR7u;-OGj?>u*&dL0NPJ@}h~)JasH z)UE?e8ClrD6e70GJiDlm5o74uozF4P1+N(yP6Eb@R?9k+@jdk>2H&~Pk`JI>bLN0r z(KslA!S@sITUZacBT(8Lnrg zKOjgpy*k<%{Kalhk%w6~XW1-GyP=yGc#mL>7x(Pf$KA$YZn3aYZEk(?<6Og$wn#7; z5MVhOrg}ZPTgXkKe2~rn(LOK%P%57tDdY{F15hVGs?Z6D2m+mq4~mT}e|~^_91s<^ zx3}-_yu*X{?qxS>QztH%!-A0-ipKhyp+0Ir*gZxwEw?R8#^gJRF?*}dxK)u`>TAZ? z|EC2g4YRvzTKz>ou`BZ| zCdIgvoRoS6RAky+c!yTf;E=#7>(+>?N2O_NN4$^O=d$XqbDRxHHcgnBm;3{f>B;!O zM_G|flWpI)>A^&f%C(TM~67 zP9at zKN>%H@>JKF0qQn@V#(*__8&qqItX7~sH##v`0Y)%WE0*UK%!s95u#G?xLE7>4`;Wk{{c?X>haDm&4R2#3@NdyIX?x0a`j?vQoK)_wGoXeM^0Gst6ZD-iI~yt{R;x^6 zC0okle+wt1ghVE1hD;r79L(hr(?CJW2Q;s)^Jrg` z@tWei9!)?adf7{b;YzaTyP`bEtHeSv-qyrfWGufwYqNBd@EEuu(k7{o)Z#VY>T}V4 z{W8s>zE~YWhp^F}O9&rY2rTxd=;|4l`2KIH}Qg6$zA3)i@pkJ-33g z_6Uf4z%o09Jb|duiHQk78~C)t`10hM3`d#Y_fK|oz5!pv;kyNlPYBsDkbjOFVL#n4 zq&zhC7x8&!bc*@7TvW{Vo+3-vGRzBNLHz|1_{d%pY<1xIgCl}+w2mv3$P;mH_3mh_ zvgE$`zaUr*jIpI(5CvT$q^s-f+a8@(jyop)iFcoefd@KpSJ*)s!LQzjC@h4~!@=!X zrQ(Jb{yhH(3JGpd$sW9L)D_S;ba;-i3bx%LAfLFzbw-d@b6_fCu*@g)yQ|iO(w+VV zqCB#<>FoX_2~yB~gER{kk%3#+>c}M;!Xj9#Az<}Z-q|F@kRnB=_c!llu3685 zP}N_mDnaEgDxu0A?WXwWtx;5%ft&qX5f8*UwLV>Z9YM))pOEq2SSHEA>Yf+~LB600 zn6?~GL%tcoxKN*x#Ja215$r=iLirhI*q7@7T*}^QwT%g^cFy=1a9@XetXptorY78+ zqn$F+g=lUW0wll7Z{$_(s!e}^Hn16rSq3l$6tpegbkSGhbZcXdD>+T)&W;;lEPx{qI|PlhDQJrqTK}iEMH?7ZNS6?bn5c1wd2-l&(L3XPGFu*Zt)G)IX*? zA@YIf?$-@4#tbWXgD$Ei*0)=@`bvaoH3FX-U#amgBJ)7Or^jzeTsc3M{UH1g=KXKu zH@RI`cCK+2R3`Jog3vTbJ; zaRZm{5WWQV;uIDP;fdn~i=Y}aCN5*HX*_b_FEy1-uC@ipfP9Jgq15SSHd9#?b!LNg zka#8O<2dh9`hL2muMarO`20Fqb7x=&)vjfCUg zqC6S2^}${$xkN;?bn&aA;*YJae=F9=z5v7qL-B~*L$!OAq}5WgNcVCxPdAk|8Lbet z421o3W7evsi~v68f;Do5jkz@5Vfza(p17&7itHTHex*=Pu6M*G%WJVKnKR$V7(x-r zYpCIsoC0qWMY(M{FMGxB_^d0M)LoAj*t4ksI?8g~-Qj*XED8EN%n<{j_FL2#)Gqsr zrcRzi#s-JckdsONey*akI6L|t%VON6wm-(9MN*%Q&9;6VAZi;8+qFl(z|ZVJm^P$<&P!syYPWehjl?r{ddOo`?t*OKfGGi9*;AY($3OD zhVEn(#`0R=*5trZ&Tq1|ih$E%x~r6B)orLfKYU${3d}g6Qt#J2D4+6(((;uJ(&fUmmznHcwDAH zt;~~!Za0C_qgbHXBiIPfyb|($)8!0oNh~cJ4{bzABpgJA9CPp9n)i@GTXHKX;`*r{ z1v^IJEw*^n)vn!f-(IMtzR*DQ|-=Sy40XxBb|~3 zv8w9g`kCl~dM*W zc7#T3<1#1*Ry=mEV*+(PP@80uVPbaWoqTY>R^Js2vy3^aj{SbhPnw) z38s~N1NI|nfPMGs2G?%l_ozac)Bu^q{-RU&;*_6sU)k;N@%z6(Ks{s!1k-;%4{va) zJJ!E9zohmRsbM=6EoR_qchLyK;d5Bd9bDn(Aa>#PY6KYG{~^SZ0Sz7sD}cfBLS$i< z!Z-RGx`hg&=(&7sIgl9coPB5+hVkbIXF5hq@cK8tOzVF=TSt1|FhFByW_yOS8qGz3 zUeTVcJ&0AyBU;_uiJ8gJa$|2wer|vCW~Th$iRyKtLx`Ql{jg6)8kMvZs+fjCNj9gH z_dIg+0Cf<~Lf2rALS#b(z8H#7r8imXPFa*efruhIpW$*pb{_1?>7w^qP`upOmJpVQ z_!7)dbe!3;;dPFeCZ0&lsQQ6im^R$yv80m9-i-9b5GR0?%-O_!<@t(-dcjc zte~syw2|EM{`{sbLTW?+oxBK7CMNMyVxK@XRG<;pqjTVLl@;phMJMM!eEI*p@Ur8P zub09va=567Mfr9wq3%PuM*ciAUUl{OdO5j}3OmfI9~-a@J2Fy!%IFdk58DZFsoXXG zMPR|dlK?ky>W4Pl@^z8)kK?38De)ACOV9~^s0#>Iz3TV2bz^EHGYLG}TK^@Dg%{$^0ZHV@{|pM^?2U(kZJ(Z40?%C+y0{@8(z z3$N8`aD)9?0xNRRrFD^Et-pE`Nw&(GD`Vx^83BxIj zmTX5qby(9Ecwj=-85;=GVw|M49`+fFLtpNLB!0Ikxj?y>`}$bq*yGQ!Mp{H{Kx!$4 zc&;zaVzF1flqF|TFvI94q9FiO{I5|!N=wB*n-uQtr(g}x4x$ZG=<-h6U&NEO;xm0kn$FAd|HGJl!O!Aioz$|C)ef~sYMusYHq|8XlxftY=Fd@!& z+=Mv@hlcw}3PXvO)~MAUC2LVDOy<~5wDBkMalq;>3-E=%u9wx!Ei+*~!)n5^HY`nD zH1X(3Yb4}#$@mSY=?l%SQBBz|(h|4RCuxhLO~R6|tV^L`h4KU<^p(=_^i7k}9%s~J zX{Ap)w1_1Cw2Hd&Kg3E!?X``)(}$oQpjzK=&g`c(N7Em+u@0j_+_IKW?klzhob``v z@Qg>zvA}fwc;SOzCT>Y@169{tX?T*RW5oAS5Ntwc`76vn!f2gw2T4+6IRR^pP%;}? z5FnTiUXnS14$e&NCX5G7Ga&=Sbcii$`-HWV#d*{Y9N2CLqLs!UsW?@fPtE8-M{cv_ z$l6FFwp02gJQAD)I)sONqmbs&K567?LaZ=Ji42={Bg`c(dJi4nMhdY9!^`0jMKP;| zFF7`D#lb-&zrRHiSDcpUxQ^n4HGGXX100(d!POx47VNoD!g!~CqJ|8();i9JYE+T4 zNMD{;Bc@PU;XUpN?gv|6ntmyf*at`Afy^Vt*z_8(!c$p`w?$HD@w>VK527gqC6aZ} zGF3_N+bo9MX*gJluE3O_xqM%Lb>4Lie`bSUKaphgp6K10*IGC13cj0^0wo%MPeux} z<_0~Z5@8U;lBoFLHP8fms=}AG)YI-tRHmGf5Wj#Sbyt4kI|vG{=iG%YGCP=D)4|Yz zv`IfqffLc>zrxEmvJA$Cn$K%xaxzmNJHi}@ZBL&yY8t%@x4wsHIbH?bfAc9bx^A|G z#U=HJy+%+=N|p%grvF|?c}kUi1o>;lx4-1>`IjblRP7~omL=$9xwL0{^MZi9LmmdZ(@hvigYbk<0|#ay`~9 zk5wgSKdRR&HyE0aaHSmKuuOWL-m^J2!|BABR|+2XT53X`GE8{Jf^$N zcmS@>4)A#v3hF8wy=?CH&M|@a!`FiwCeKBcV*R~CG3BY`s=g=O)-CoY1*M~66Pqc! z`zy2eNVpL+H5@WUW!m`NAu?m^!ZnMYK2mEBdqzl9+gS&u?F!YaZRI4y>YI2RZbEc*8fK%cQuI9THLVVJINu!R_1N9&U5x zYcI~|?9b&5?iB#nO$xNsIg-Ct_0Wq2ry1;$@*KKjQ$~cuNKfAs9uWpdlu)gs!IBN z|0^X`kW8DW_zNxyTN)c9Ne;*O>gcEJ!L15$`dgH^_WiBD$Fjz5jwN4xzf@kKLgeqI z>+vzzLGKXVHX)X%UK7xIF%U5fzUsnIVMEv5k@o~1*yL@a) zy3XkW|A8I|n7V5rZL%%7f+yG~Zh694N}}B2C*NW!x0fP~jDi;uFkz7skrpygFE~tcjavlbeH47g<3l zyx$?kT`I&0wwe7A?m}m>ctrvPHDw?3>(3c%5+@UzbSL3He^cxlQsf}!j~Dk7U=X)j z^bOt8R(8a#AC7-6#m5Jdx*W=>tzr5JTR(&5F8}%7X*bUE^_$V=tEJ}O$~q(s>oA~R zG{0@$WxNS8{Dq3=*GNlab;0$;#qAl$6220W678m%u-Knp5Nc3I&_;TZMH0lNhc3ZF z@m)o|xN#^A>n#UA#IoSbO016X_x1SDb?npn*l)5$r$M)TRXNQU10SH&j=^<~Nar*v zjx_Al760Pj-2(T~{X1NENGr45c^FjzW?~+Q<<^t4UwDm^1@z>^5#QD&lD6X>w)X1Z zRZCLV7p{V3!$MrXVno=aa0jHxV4691%ohVWthf!ko~T>?6b@Mn3gg{phVY098?I&x z!m(r}@vEGt1G`}jvhbUxah7KHdHw~4ASwA@qMnq>)`ioguhqEpgAPd(ZNymwwT@sC zNaR9(-xX~?5eRnQL)!?WMb7Yq{d}&9$0DNPUfsFL&@|LM3(mL4azzFg!?azjTricW zs<<8^x1VT8GM;-)nAnCxHteTGW-U+=7;Plc4A8IWderA(Fe@RVZlms%zTEcSQ3KN> zF0d1*g%!0_@=uTPDm%c?H8v*j-mF!2XE|B}&J1Nf(Bdr08=a&g9{*;cj71E34KhJb z%+FiUcxarhB7(c|r`*S&Hw2%@hAg^^rMsTROh*@LrZfH$+tqQ14~gLFuhWj~@~i*x zwwKw)TFi-T(o|O(SDa5}{Uz#SO(mST$R0Rc=J0M>i#P%1+&5?k!y~-d5-$X|+l@#2 zVt8AK*D))V*VeC%k=Mj;FvDlonZmfx?_uGZ(;AC@Yxj^nmrvKmHYqaf1=6_OEw)3T zIgba}svPAjadWP76s!g7@TR{<&%PLe{d;gL#WbxwqOKmYU$>ML zO6M}*oEy@fp+oAJWYO^n0fbY0CJ<5SlWssl+D8vusT{(Fa{42aqk%@LvQC(*+Q4sHbHDqg8Vuj&{ZmK9LL$OZDQ0#W7tcG1AeAAeWU~V-k`q zJ2Q-|6!V?jaC%+y(bKj9?w*(*t}@8mm8mgsASLy&j^@EB zAWgrmKKUk&<65W zI)by|gHSH>=B0w(vcj#^SBLvvD$pE=!_|~EVn{#@ z2Emf6kOI|i-~2MjKw*Y%pRXnqu+|-qyV(*-gC@82@-AfG`Z@ZJ!~{U+HryZ7wY^|F zRAJ{@Nm8sXJ-y(e;8{ZCW;(N@TuOk7Aj%9b^LuEgdAf(LuO3B5x04H zQo<_M;qCC<>YeX~=OHQ7O?j&%HVgB)t7*@-=wpM!wX=6cQ#Sc5x!;`{K7WxX#7zoo z;fQ&mcF3>>ZBb`C+iG@X2u${1K_*48`THP|8+>O<4d}^6HTB&iBX0WfwF|56fA}PJ zE!4ctMmw8C^tz-&&Dm+w_(*4=(MjfQUEaeSe#z3Nb~0nf9H`+`)@wGQYeiiUA48Ju z;=3{it@SCrnYZ+T+}6nwY~TJQWtwc1L8zJ6ypU@VTh~9N4v4FI>UCtd7noLKne%Y@ zO>CFZ1oAfULP@$9!Qskfox!-p-`Ivw2P%NSqU4c1s}R;#R30eDbiq~?YT1u}&f0!- zV}=2@SV1}2jbZ=BcuB7G{Im@f zQOe!`Gmm0TV>&n@Iv*c9_(B&^gr|1>4#Kq|b71*Wk<^fK!P{O)qu6_dg6v7?U9)PV zg9IOANCDeolX=(;MIUIFW8WtCj!YsOU8{9}PIgV~cxaR(bPz6I;^W9$7eo{t%5Lw* zAYaYxwlwg?J*h;qjxn-D0IVPNws_6jXYD!n3fAFy(3&i}ey6)>{LWNJE}RD(8?D>u z-Rta#)VX3d7c~5*0m=phl|)NPsI`A@GMiDB>b`6Y`8j z?Y^mQ4LIR$uQL^cuttKZ%4BSU!=^{QL>)Vuon_Zb`ozrUr*-+WE6~4U-kR&MT7!>R zqB6OwGf{Flr$caqt`j4&?ilH8n%q=v5CgLnbx?8CI^c}XFT_5f70WNBneW(t#}h!y zwL!PTCKu&IEQ-K=%+~WV{@$M4$GU;YwAya10#ZWJsT6Jsg;UBKg)6YFo!-GZ#^tt$ z9a}}|Af9sh@lOl!UuB`E?6>9U7x?!L1GKx-n%qSs_K0m?CB0&kUDVj55jm|>9WC%F zA>3saVI056y-D;#su|&hfMBCyHVIIqJ%c(O-)%Z{5miHH$HuiXlybSMjVfb{rFd<0 zTmehT=C=bQ{Ts*qR%fFUnjK?m=(6!EU2^gAQ~QdN8maCtV>}8v)OgN7{Fqr4vxCoe&6#>jFeoHEghw=TNv9)1N|50wEyU4ng#uNp?4d;~x5-un zny@7-*;V=tB|{Qp5`J8vuxF#QS4$hQ)^MfDYfhl_AV<#)+~JdRV@Nr72BPw+i?H5N z%vYuiudnZK+fZwpswQ;4cxMDhr>o`9;!Ywqp<5od0+YJp<$N0`%gPi_2&EhTGl&%~ zyGU_IaXN%ir+3_9vg1Ed-sSrFZ?ouWdDE7z6!!C!TMcuXh*ZI1^qVdV5B>_~=d8{S zzJZamQ+Y&V9Ue=a(&OYRzi3JPW=C;qKW~kSy}S6@1;jQG z!R^NXeiz_>B$9kgU(~1K##R9#>q^0rHHb(1N=?f3`&P$7PG9@Hvzs7^dtjnDuMLi3x|Y{HvP*`mR7ve7SsP;lM~lu!`FUlPZE3K4%b z+-ENUa~c|D{Ty8B&-FjYgMxK3;(@D(1vW>tGR86Di^}DvozwXReIlO8V)yIBg-ICY z{;YuO=@ZJR;_}!l(RA3<$bpIk4mLMwV<4%KiEaU;2Ae_huUo2bWd@sgC$&7%uf7b1irOYm6NA1Lup* z1Z@0mteVba!5`N-L0lj@)yIa#or}`k&_mT!kNnlMs=~egt;jCKerda^KCIrMSEuHA zonBrzIeiBg1#O7tYX}J=f}W*Y)KEu<%L9~dn}ROXOIFmCdz+(l{}7o})KK3Iy=`1{ z%|M(IvT+P{HAcA3@PsR;25mp^MM=UC<}OUSJz$@3%pdcR2EUp7>@wq06~{cEYMz{G zs$__{Rmh>z@gTuALuV(2reXfrM`=n=nX*b2^d&^yTleSD~R9R1Kp}j>KY;p7taG;vgTLZ64IUV$nDmS$ZXZP9P zDHl^^2aiG%y9lyE53dqFfc)9|v(VS*gl$NQmDYXrr)e`Mb$1dy>uo%#Y{Fd=y$pJ4_QKV8V`St!lmQo@z4&kzo)T(L~-}WEYmHf03e6=UR zpz)iKHE3wdK@-BE)fF;~_qUzC5R#^`-sniLB8CbQwUPZu_Ay7&zM8}eg;5p-!`9#i z)WU5k8jplQp(`wfyN@$SRYyy9Q($L^5J$`WoE{M|4ylvyb0S(ecpxlUL2EI}-=ycq zakpx0Qc=SrdJ6J|pzTljW>6*XgTN|f0wENFUThN7C^vFVITSZ`)j{Nw_#zu3&b&J1Wm$C)Q@}Hsg z+`?mYH8H+bPd~BRQ;>`@zMJJLNtaEqXdUe(DL}R(7pTzPzYW%p*yMK;%-}r{g~V~{ zQDLsSqTuJ7TNu}mvTh>mg5QnAel|S%+WlX;dMXAO-Ral(t4T2I#P&4JgMfNsn~RZQ z8mKEcVPoZHqEoADS<;~>*oMZUZx!$LXji30f_zpD(Ko^g7?Nxs6F(n5PmhoP03r;u z#h-0RxDX~&*wg~?OAYszez40X322jT@_=|v((!Uskb|ci`vg7}^0Bp~OA9jwHqTIX zGV+N1A;+%4SZ6tRQS_Vbe7~)E_LoIp%XjC6=dzB8;Yym?abV$jyJkY$P0{WiXaUuM zc&nl3L%0*@@0PdQ{4@ANI#)-l75vDbIIO;PNStkFsON{m z6cHJooJMIzPQlB!@BOr%dVr5bAu+>(y8I$z(W9Ppc63x{SA*Wb7PdDs>!qt=1ci(H z=s!HJM;D^uogO<}>`y7Tq^j&MSg%FmWLuW&H%*Q%7%hf>U~-2s6Tnp@sjM)Si>)pW zC+q!VZpa+9(xj_@051_B5AYogj=;8xzrnw}YqaA(7V8ff_%d?JvU}akPj$qC|71+Z z?KQnGd8rIV90*6NEOqvM{u}%bq)eFNnJ2tV-QD`Y@v1ZTTo=K^j$p_Ysr?K`m&e{7 zH3EqW3gxb|+9B-BET)lGxi&{&q!l-e=g=~?g&Ww(dckHG$bM^xA#usvcP+K1lswp{ zAF@VM@8hB*;9>K&Y`=}f`G17HW1C=0m$jR=ZQHhOTa|XDZQHhOyVAC8+s>@Yle>FA z-PP}x^AA>BD`LjPxJS4)EV_+K1yV^m>J1G;f4I;*{p7fbNMnpD<6vj`BG0gCItkM; zUu6@!%z}J!{LR6EWm+k}_TzwirMGW9P`^iakLG!Z@!JQJEI<7WPWidX(8@`=aF8eL zQQw>{^7eW7b2`&TY3Ny(Y1y#}!Ph$%6}2h)r4G_u*JJ~Px%9vNK>nRzYs?q_n5^1} zREqPUT>zR4#QxNVWvy6?nA3S?H6F+qm?@5cXI5HMa?N?0mb#RPLDN6*WE@99pv*PeXS~g08$^}fP_3X8vF+16f7cW)xbap zW;KYCkm3`XgOS;5_i$%DRy(RvZ@wP7P0CB=u)!OlsThv#au0&twX@ZwrOztLZ^R-0 z0ak$%e-MiY@`I6~dlnSJdB!2wV;*F%hCX9{ z;mFP<<0m!0L6BCjI1qM1OVFyViTu%=agd66u$j9ZcQj8TQErSa>dR8? zgCtZ?G7m2b-k-nPao~jl`IFMY9%As_1q{ec!Uk-mgkr1|&fp>y8ET;PN%AR%_DLIU za-pV1*;3mhA``=j6JC#u^Frx@5GbT z4l%$K;uSdlFSTCjxCzH@rO!O&!mnD4R-23N7Au7TaArUrmf= z;+}6hXmJ$SqR8ZzZjeG7VNg9Ws8)rY>vlg>jmKRV4k_;9kJYT@bo(fw(QR@Hiv%aU zK1OwQG?WhHugA1v4b)n5L^G}Q^ZF{KU#mk)F}VR<)w&f-NL@Y)QsfI9V<7>mBlA$vxb?WN#vL&t+2Q#i;UBJ{D)`JE|oYr?k?(}iJu1Jq9=@u4kuu<+Z`-K4iD(4>>$9d7k0`Nc69q#9b14LjHANSyl6p1eus3 z7qaJ5SS{1nNYQ&gm>|qI<$-0Ga7VqjsY+U7l4m@!X>({vj=Rczlsnl=yD`k|11;nS zVq#Y2G)9A!%!orqURbq-0lQEp^jKz~AP!fWDi^%dz`#jJ!|i#FNh2yVfgI1{J5qq) z9QGrh8ox=3TE%`?W~LIb?HtwWnnE!WDlk2xPTiR4e1(15WNui0s3UB5?!+bP%v&DU zF~-?C4W=$tU^W?ltJ~eFrt4RQ3%I}Zk>JY|tPN%n_%nAuL1{qG%(Vq<)z#~c;%eiK zvo_>=2TasNI7dcgIYC+Cpr_sF@>e%vmF=J)OL&4nNsbol=B7YMxqkX$1pnB@=R=Vk z5L7#mXjclp=lfE-hRK+sqm;zG&8o~JozDCM zqbab{x*G2SGf!2>B!_mz4Ec$Ak;v^Q^bjf6eXPAfH4mch#gbb{9vR?Y61_gERG?HU#oIHFuY4N}q8y2p1_m~1hf)`wUf9mHd1cj8Nf^1uew*7iJjRs-i`LS z-RKMFCfL0kh#?%a9l7Q)<$5BIJN3(7V!#FxGD(vCKwW+W$6N`D#cx6U$13<=A&!v+ znu4gpo%u|@u*^P}VMSckXSEya<$+nPPfKY~`uqsq$_sw_Df;}J!UA2lO(m4U{zxOv5CC4 zYdKu{06x}z@@xi1_s6%)t=pL6<5@%ZrwB8}|D(dm2Z+OE4r>l6kHZh zrtq0jwVH2yS`l@CLT4D$4b%t`yP;Tx2NdLGXFhWMC)j3$;bWY>yR@f;AUuJG*ldju zdBw4QA-_sJXq$bM5PDlsk+=FwaIj=0jFiJg)`{OCox=Q<*o&U%qZ*-(4T&XP0P4oZ znwuiC=}hUTD0n7GTcN$UW(UQAn~ZT-4A=}$_{@r99HsHEZQs4c^Pq4q>l!>6iKpnOVnfPC~^$y%Ciwd z4D_qQi>YyaiQlQQFc%{_`M3HKe_*Q?*Q!!IL zU1aSDPPa4jzmSjd@!S~q@ZN_MnToBUeEAJg*{I)+nBwjHt=GVVuYlDwsOX3JrCw*O zYAmMlTL`njc+=vMLe-WiRdW#`FR{Oo;FvP1ck>RHa|oYdGC`NeVFpDu6N{8F)@Y_V z7bUXY+PhyiuM6H}f!46=;APw!KRvc>r>K%Vi(;gTwE)rhYo&OL5qc9OMQl z8V*xHUKP$c#0qvU?|*A+37YbQ`;_X>kd33R_8DqWpX~x5^gAQ5_2dRJI1K~u&g}s7?Yd3r1~bQW6{ceW zs8MJVd~1-LG&seQ;iT;Bf155eFqU?_H{Hc~Fxv;^f3|vY!*Aq9wY7KNXq0KUwQUYj z@&XUIze(~jdi2bc?o0mSoH3NNyEMt~Tex%p{l{JF-!1)BZ&<@yl~UNquNn&ji~hr# zTwZE$5HV=R&`w!f7m>)87K9Z4v(Ykxz+NljsV6M=j!DXW_Z3n-fUt8-A}PZuYRR9{ zhhip1Goh6g@^Bh^6RUFX;u{S;;RzCL6+Bk%#Lk+}ep$~?x z>Q2)G5SexS7eYflK6JX@!8m zmgY_9X+qxp%O_1uRmqb=w4ig)D_VD#q&*@G3v{wBfs#`4@*=;cqq09)>*~^7v=D^bnVI9`$%f$B!j1^W^(!kG|945H@N{o+k2f`@s@OkUCjt5g2k1 zV#87X$qQzqMwDMED?0P+H?Jc=9LPt~xuGlO)N0qrN&OC)Y?9H0++1MIbpqqAbQtOr zxHcj_%S$iF)yi-B8#;C~+;Olp^v%H7w_99*-QSv(e;tA1i^q1C(K4K0uiEIaOqO>y&t6 zkqkHvM$okW)uS{*%B#2w@~ONupDX*_qCsE(!>ObZll-cuxvU<2C)5ah_LQqW%JclcpufJI)l-4Kqbqi9R^_$8_OP< z$sqFs(7JIdyJN30RtW*G_Tl9{NkwF3qaQc4HowkZ;AdcwGl46p!TYEG=n$_~fq7AFf%v!%Dn^q)Qc=^@ls zpSEYLQx`O5NLYNGGQHwwR7teAQW(O8ljcZV!Y+xKEokLlNZgri$Y1;c4k|bO!haP{ zUtWT1J@w@gvyI4&DZ$>b*R=ZMDRC7v_46F<@B6wAUd`0c4ytHS%#3n&7!wex>2cGz zECnqL!Y7_T>l9=-9~URs)YsR7H~^rv8)M=UWsfVA6y6zaiuH zE>d_pAr@scUePBPljs(uFz`DNsn^t(!d0xpG99rA34jUSjixc(?HIh&Gu^V#ZQT0| zYKFpL=xL?y?E07wkZs&>u7Qkb5_rKKJUV{B>PJc&5jcRxPE-dcw#LV_Zvr3T7XeU6 ze(CEqop$;3Hk-4j)Wp+$wfwKt?1=&Ec%+FJr2G7Zac}#P1-lc#Wz2{*bW29@JZOD# z+??T3)!;|}Lc(@xFbQWFoO(_v4It;6=xv_>Cm7yu1rS&piw~F#-VsrZ*)D zRp+D{Cje+;q|~JtWGqP33aE*)t=8_^tTCe0WNS{^9LEByXuXI*PBpMo%;Qf8>1G<3 zg(`s#N*v&QoHiS3^~sR1;JzqN>eW2=5LnNBqyY|>=RV)vPt2xYBy|Dw=KglNL(JuM0mI+LwYpK3w1o5rxaL;9D+%DTh`6Te>iW6@MIVnjG z92U`~uY8+{ssm-}E@Myl-i_LI6b+S#v}_Ck!jj_~bVYdQkkKUj0;-HltS56CK&@ta zYwlVpybwmey~(f|ICr>-!`aXT$i+*ef5K-*FrmcG>{bI<&qXmurMS)=LqEsQO$N*< zz=?YQ+||EMubPZ|^kVmsE$2sUzAhmrnoyuMzhPp={B1rqI=0gjDXB`Cmxav3+#BgE5c{@rRC;XwN@``oq?^it6)-YB` zwX(NHOnEcFQ!b)w>z57LOiu4r;!r7J!&Z)fl%|pTDrtFO35h3+A{5U@-_8I{3??vq z7wRi~YhQ{!_mD~z42y4HQy7+}JOCZ~@E0i5xt&oK7C5@k``%*N`+XVE=Y#*TiU4`4jN-HbT$5?d2d5)JqeMgF?~ z(E`lwn|nXX(;1rK788jUrJ{6W6P;mucE~aMhj{_t6fSSU+qwW-VcWMfHzh;L$h(2! zeWkD5A ztfb!ijqt~9^Z)HvhkFdZYGB4Q#aW?oN>SBW>W}z3JxwPVX1?xF@w3U75R^g3SSD%f z51m8Kjeo7Gj=I}e)j@LEie8$E*xL!)gN(h<1fkKcPz2R$4#&DDKr3>cCZRuY@FxoDwF&*2~%)_DQ`kY~H|b7yNhl8hM4dV;ypUp;qA$FRn$ z+XVyy)f)<>bj2YidOjcX*KX>PXK`&HCuur@b7d*{T6x ze4{OQSdn}Fptb2T2u#NJ+pA-rf|j^;lBLsSuqtWm;%S{GT$zhLwe1M@Rer@T2B`fj znggseM}LzzWz6)^DrjMSblrt`O9W|`@3v>&g(5Xy;=Ep%2y(n?_9bFTYWL6+t8++9 z^CO>oCiG?mdYj+9yxhlfU;p!3_>~(NgT?hZij`QCr4rtQdDHsuxyr!e?FQW6#c#;n`L*JW= zs@Eu|2K1>y3KcAX^Q)|QNVC%T5kT{RQ|}iM98zIJWf|EWFjE4LRTBu&b}s1717G2e zwYbm<^00wWj9Yd;oBo=iDZ>Dwhd-K&#A2mqO^+m-16a#Z`yNfTDhDybwx%#_&I4OF zPVV6|yQ*hQyn7P^n<{ydGI0)6np9AW)A;0$2`3A!wiI!ERJS@)zNKG?`Q`yvKZP9V zMa|pA@Co(ZP{aj{I{4Og^Pqgu(B$av20P2xSgZ+gP?R<=!M`F|pOXqnoVf6B4wZmX z`i`dIlANWZyHW_Gx5C!9h%FyK>3!moBTG2=lf8?O~he*Gt_K3`eJsU{%s;s&L1QJ zQVT?bSL|%dX_^P2ePHGHcn7U|SI)_In!|;=ci%!urpXG2Bkx934aDLcViKDZZU|>3 zeEJ6hCYYTglevf}iI_5Np49vHAXJ?+# zT4fw*5rNL$ffOH$LTP8AQ+r!>vBxD4Po{Kqs~Y$vh_0aCa{KBP8H~?f9{2B~N4T&p z0WC2-TK1tOWI>v|<`)a9?n5BpCjSg^^kcs)14J{hUC?mat{52I1zHbTp$_NK78Wz# zhWy}s?p94zHC$8yF+d!1|3oLBKm${CzzR0w87#dT-c5tDm0}859o0%t%7PHXMIG3! zxKI`K3&yKt0YS$L!E(GP#9Zs3FaPV9Y9L5dz*I#*XuNv(qOIn`Q{#&(}-JH?!_<3k5}*611PA5xBNevg5oeJe^7k{zM#>nbzji{%`{-f zFvM2Vy7dtdF4l!0adoUmG7#_F4*l}%CDW{P4*7>a*iBD8pF-X?tUFPNX&+v#e zH3f1Gr0DRDQ>GN#(gDLg2!2(&&A7JDr+0NibmA$JqICJ>gb3n)c;B3kG?;u3kiU{H z!a4cmLtT3!a59PfqYvB)S14SZQ^2U?rK+UCo<g?Im#iMFco(?)?r^!X_X2as(oorijC88LB zW32o&%}TS%(c*h*QMA@s%w*J79*`tp8_B`}RVFY%>-|5|I)2@=U_Sp@rApoU;ktv9 zWV?FVk$i(PI5>=VgJs6kEc|!%uk@il81Y0H2-g&$Y@>)MWmP>3HkAuSO1H?4+B zoi~bwVh*&n(+dD3DT0DJNh{M(kByl$ufktdl6ZW2+SnBukDnK`c#AnHXz9O{@3{)C zH0L8rB#~$gbDpqy7(xQR{Ds+dqNVvZqg*IVh9V2tFUS+SDW|XawC#TxU!qY#{pX-z z9zf0pN2dy&)F(hUmJ*4i`^DHgM1C%^kTkKl!m)3U?YvM9M-+f54KtIRaUq?8i5A=x zX;z3BcFto8<{dIEA^^?z=EP@AR}BBUv`*s!$lZv=VGRa5bUjnIJ*v|D--W>cAiffs zV;SK|O-&GjfsFzoCJ^9fUWP7JJ%<(IWW-&`P|jz1)<{|PLsx{^!2ejg|7Xyz#QO&y zO+`#@!4+os;p@UG!93j@=towC*E4CnyvKGVJ|HaJTc74wq4U{%LwH`U8 zJw5wUzHn~#V0}{^ByhEl_fV&P;|lDj?0)~&@W%Ef*;ucJ&V_O^zjGdA<{~^y{(Ukm z+HOuh%7OrQPTED*rLDgAJ?bQ>cU#hMZ$vfI0f{q%0aE)50~2$jcko!T%5yE+^bqhY zYh9r$4$OEyVyEJ*xP;Eqg$Vn0o1H76=x+E@4!%|8o`0O{A|UL@7bP2p8lm}Mkyo}1 zxmE)1frvaB-tDbgbL`R+cE$zx;_cx-^V9!`M^lE?`x3d+s5z7+FQo+aicf@^U>3&0 z^2;L7Ybr<0Nl5J&iGT@@+CT5}2#YdT-cFquz=?AWiN0+G7?kAkvOz7%2^X^QfUC}1 zej-!{_tf+)xqq1f(77NGVQJ!`iBE)G#3P@mV`nnaGzBFco(8eup;oySYhZTKu8>LX z+B6Oaq$CbRTHnwAS$l2U|8wze2ZOea#lyvym4m(-d5@0axy z#gP>T5!Q~J{;(TuOg98^9Owfm=g5ZxD|E{px6p{ml(-{&^9cdZSTseV52>FTBJD7F z7098Og-KV6b|t5a+87xE=5thiGtbi%G;wT!eS zUCSnjtDbrDk=<9gR7>xQt|7F}-uuXe)P=uBmV)K-gm7}XQkf>@VuOr_y{1&6<}aff z0J?#jTR*;3Qzqcz`k@2+`7^#T&cmcl7lVN%>Gq-n=lpe~Llc+y+7@3z>k`c00Goeb zxj^e;bA!gAXcq=?s4QS=h+{ec_H!s*omh!(*AsP_)>wO=x!x$T!wT+!TgjbN7p39s zc~i{sudXDj9(9@9?)|?=Z+N`|OE_f1upjQ>Y^614Q{Bk)|7Cjnk9lUiH(G+D5qm*b zxBm~-i(6iCMQ+U%`y(>Av8_6UB9@M)&z|3QlvW69>V9>x1baw3UwtA-QM?*~glDSg zc>>VJ^l@Po!}Drtg^ZlYKuvR$-0%N5ALW=ObS(5tj2PW>of)`Kt#6o^A5CQ=G6}`B=GT6*#Oyp;|{ya%ek; zcx>RpzH5Rw*Kmh8SXjbftGsT-Nzd9i(wNpDsLOR=Rcs5ShK1Ml-!QLbAG6ND!+-$} zza4KwUzcYSg*OFZo=h3EUYsj>c1O0nx=K@{u`;0{o=Ga;I#}M2|A*)`77-0t z9YM86)($mmyp5@-uj_BvknFP_(ow=~i7t~UI#=??S0i*vz@iSgfyw5Uwl+l7Pu0o# z{ioC_%~i{Xv;h*9rMkf3!>Z*!G_N>ebqcIuj)zJqr~fp|r(TN*sv9*&hW583e^)GQ z^t91z!r3gh_uMRqb~fL4iS(l%LVHP9)TMC3QfCL~8<#KM%KK}Wps8Sb=z~@!M_HB6 zI;p9dygK$pP3tew77bU2xJ3xw}UpWlAwU|1YLlR7J|BoAxh%YgL3dzGkh z(oclPxAOl>^UfMc;j8p)TPKT7n@lc{&S7xNS^}p+Lcmmyzrj7GFh)coAg!U;g8PN| z^z9Xtdaj+ukP1sWA`fFLaAHk_n=YzAv)u+%)>JpVPO7&oQu2%r%wZLjSvy_j>Lw4l z`DD%GvA_ETjMVP5CP)7Tl~s}^56Q$J*DyH+asD|5isGV^c2EwH3dh1zXB&2J3i@{0 znaIl!seH%%TzgA;40g5wLsLy1F%N|VCxA>vsn=|mnyl7Nn#i`l9Y52{>1zklV-d&} z7E1w?CoiR=6xbGhgDodUG7umi=|yDNJK$%iP-eXcNWD9Ab{aU5&B+%apds^|)o?*? z*-S1xGBmwyWkY;HsdYe}AfaZ?+f;{eedKjfPpzfN`ElYeDx`(!?@urP%_kHBgT36F zRo}(cp@=doKS6JNY5p~+H38q?us$jb4%e(rYxTSP0{PafMM!CRPW#5h3L(K`TEJWz@>GB3Z6J>sD74om%)G@u4>Q(yk>uF|qF$o0*!d`z_2w<(NqPQVceJXm* zHA>-ZDkdRe4EZoe`mF!s$&->h&Qea1xdWLF2YvAeJCtkH9`3A?Cecr^AeiSD%OAfR zKU~$u$)j(KSLd4b!4nvGg5^#y^D*6U1g5Q0kOwU4v&owIzXUh`Dlhmff{qc*@*SXc zsruB9++Z_egM85dOtPs(B3MwhW?}<&JOMys_S_RGP;y=2B=0l{SCByS25XmIAHFPZ zbXRoL9dH!q7jC{rk3Z{B1OxO(+v!!esQn$gGgQ;%w4s7kWHC~UtqUBA!k5mEo5k_L z;{@HIt_(qlh|C$sLM1GW&UOBBg z2~DQni+`3F&j9BxMaSIYEdSl;#~brYykFbMR1&~7y8PUW`WHg_gOCfo!kFrd-=9`F z1Q0<4KoW?6+er6Z20SUGK4Sm+GVG8hE;Ypz17qzBtMKDR1*owM>!4#ylSY|Xzq7{W zK@klr5MX{pT;fjk%AhWeQr)rzv)Z~?5b*4oneI|K+ouU9iS4zD#3BvC8@7)qw2Ap* zgLLE15{8c~ZIx?(;>^Uego^@S!otycPNO*?o^JNG!4NXWfsDh>gv7#sx*+^hQ} z2$??rG7meWr}t_Byq}YJ_jgijgaRv}QRi;@@)SdXg|;YgkuDC&uLi_0qv<_?>T(Hj z1M_ojDb^qpgMufqazrRQ7BpR}(0sgdI!oN!%EgP2wC)`@W0RDt=v$6$i!suDknz(2 z&8Pbg+HWh-H!ZGM*IBDvRb$w}rd(*{3zUr}$K!nunn9{eqhM#6H3WmD`}rm`VQaM4 zBPOMY4-*YtbeTlt+_WK8q}X``|FcF`2^;LugVjRyoUFu7A$dw>B%jFA*5{Xy`Tdqz}&>5ZrWELzSCW%=0*CQkw$mAxO(Q*5 zXUpFgu_fWwVGg`f9yqkh`o%DKPhqGhG#BztROPA&V%oc&7va$LN_pXM% zg`PW^U2N8ldPOt*1NTOhiV9cl$q&Jh;Re?G;;=`f1GOF>V`b!bm}ol;Aheui+}%4khl~91dzQ{BSn~3Sg+4r z+)*cXZq}$~sbc;|mb0Lvkb@L^=9qUzIl&F{L>6L^S7scuT!s}lHK^U{wB%_XECj|k z(A-^&M0nc`}?EsZj%b`3eGig#}L zXvOR9gbE8wrR5*Dd+o=&GH?ykdWb@O)ymGA9rM0QY*C1=*te9+8w=^l<+i3;%iZjO z&AW9nDV%FdM>(uQ_(oZXd zt{^`C{OPN5srmlr+pyKy6ojaz-gYB*z=JmVHO;{KIq7_U%6>((o+#J-mmV9*G>%YA zhcLN(PUUoX7#RkvnX5QzGJznqT06)wJgAEvl4=K<#ku*&5$KK%`V+~S0=rqV?1fn1 zusX;+r#4hW95<@c>VW0bdblX-9hBUy7VN_`J7Tq3W4p=8ZUPD}SB1omSC5PsjVZEX z8t^fCv+C-kGq6W^x1M1wYQ2nbVHiQA{ZEO;S2y%Lzc7<})OEV^ma`+joxup`@8e43 z_q~Nd3}Uro6cHZ?Qh}H{xCiJQr+5c2e)r=yp&~#7)#L_}kjvYonvW8xC#>xbj_D+O zBQipd(GP=g3e9=jphZ~R0rNkt8a%4i4cQtG{Ev(u4LuwS z4}nMl&szFWO}V=^|M-ii!DH8~w;?-pJoKs@pD4)*mm<-&nLSWB7k;C>AkU|o3ux6c z<$tP(t+X-!3+3%!{3QL)L47^4<6;+TgpnLs6^?m&v*V7nOp``~LLo zR|4W$BJcV1W4xm-82oBky3lLK-4k1Bj`%$l-&;R`*g(U$-X*e$22!|#Z*tf6N9~G= zbrLDq4heGKyBFN?5j}zZ^iQ2qQxBK@M1#0_{3f*ORL7@Qsu7(bE0*2xYwgifN|li& z#T9SGD<2ZvwYHb5!Fc!Il6AqqAR9Ii)VvJvnasJs^7t%_u=YIQGP*I!TP=|1qnmhb z98aAgg_tHU@_Aq0Ao^5Y&vL4Q8AUa5q!3d;Z>Fw~#yCMz-UMof_R8u1vtk4vXbDq> zqI0Jgu!`)uc-PC_WJd}E4mcW= zf1u^&o+<9+WOft#V9k{cBdxkN3`g{{cW&72nqO}y{?wiss4C6igk$qu?6q8>m+?#2 zveu7oAeHq3euCeXeH&tg_)>^S~ z%i8_@ez5la^|eC)WvjQkEiLBD{L|vP>8OKEmY_gCV|w(-QVyA(iZ2K@L?KKHr=%+= zHo6BjY%T(&w<5fOlUoV-yt3^XsaU7-Eos2&I^`JlC=gyhQrpPnCGL$4*T4&8Kg8w5 zwW)lzd2XuWi9WnLVdoqKEr+RGD>djZ{k3z5to}dw$gFX{i-5N^DxB6*WVRX?%Dde1 zD2k=anpW?*!h}u~kEW?NxNL*fEl;HiUxp4l4<$9CVGq&Q@9h0sHI#lUu-Vz`o$+be z(n7|4=NAwJ--maPop_7|j*LJGWHujNjOM-d_s)eaVV<#fbWdnH#m@YIN-SgR!lBnj zUjxu77Q?Se3l_??W8=+!f>pdu2Bu+5XCN!Q1EyG@3Ya5jTev zLU;~A)ebr14c7YBGsZjn_~qE~Vy-{S=RRddUAp9YTnvjHxlEcjM*O8C504ksZ)EOV zdXd+D701wMMmhWpu9BHyzdx4U0qLNcn!x&iCuG3-4fPdp6Pu zqPG0OO#e`jt`u3c5TYK4@?-u#Xkd|@k9VVL}DW=Q`eQU4|u zoNk8KpG+6cMW4w&skcnEP#M{^hI3mox$1y5~+WE_t*>svEH zJ5_daG(k@UMo?zgcjuwm-HSjL8D2gv zs8Y1c0I_f+YDR%{KWJj90tPHURX%F58mOCWtVxmk@C-oMR*zP5Rd5sceN6g_P=>sj z+6divURqC_rA6LU%(B?K2jN)4^#6&^2tKHAtcMG&r;#>wNg#_8_5?Z4I-7cA?zwKE zc^0g8an41=wKs^>9Ojxb))H#)ed$_DIAFBe)xHO(cZ`0`} zwLeRd?@pLO*Bq89e@m(NTBbY~Zd0AOpJWSA^xRKeD_W|k9~&#j$n)bW5CDBpOs>+aU|C3PtcL{6teRX4w50w)f zy_-ZKVw}NVh#15FP`k0iWRPFOdb1nv*N^wG>2$JwrNjNQy5`9MfAvI*oi;HJ3>Pd2 z-OD`SZe>sx^1>MBBG~U33D$7kE{@aZ;kj)eq*+aWZ};GB$+sz%_UtGzCHsffT@E~6 zpVg|7i9ltdw!RN`#@|U_Qu+hB8(tdue=*Ie_N*WM1I>jfx z(H>G|+YkR_$dt{|eMR_d3~Qa|wN4((Q+vK7Q1sTXiTsuAz;H}TMG^mKWyYk%@iPhM zN86SF`{v%>-`7vp)UAFb1`R6T9dvShc`YP&9d;s4;g{q~HO_p1XP-hrz1!gM;qCrT zD?1|urTD{w#j~-w&*b(gs&CH8geAsZKf#c`aZ#xO*Dub>&n zHM0oTO&5%l*>F==+IP$95}#11w<$Ex*hyE)w&Ol})~{|g&zavQZh}P;f70r8y3aKG zJ%V}y2hsl2>b87ks7l&@f%p9my5ITncl^D*@H0i**x||jf?`tR@{O;C4IM8Uf9oQnULokCLhf_#?AP={BPZIvX+>pJ-q;f!e_G@d zD|FnA5RUdH3wdt9NM(O^^?92B`?=0M;-L+FH^Z+t*8-Pr4b*a7d29W@3*Fcq=}O~m zg)bzS(kcPgAhWq`)iYfTLl%E1vpV%>O}*^@ynGwK5ngcrZnT9HpOKpfa+$UvaSS9n zZKrrLWh;)Y;YQ3a2gyrSVOiPjgJXV~@YW8FS>U~noa8Q6Q1-(G3Gy&o_fT$}dO2Ii zy`cabk+$5=*z-oC56FiPNzCK6EDLPX1kT^p?*<)NkVueamcTjl_=u;kirRHWxH=@^ z=PZO}F_;f-vE3Sa5`*TO4#Rkom%7K1UO$|pZ*Arf^*(QR$5vc_y^7=g`A!%9y*%MX z205hC_gdeD0l;0=O|--M&@TlxgXYGd_AO4)&ld6`d!iR|1(F=-fd<|3k!+r3j-&yGnq9oR?Ny~u zdt`rVwDFnC-`CKc%sWOtpk6NB{C;+?kfSfXr16=M!uCGjg~~VsMmbL(qg@PSry_wu zSB9E+n9`f*c}E^L2k|n|mtIJTf340b?-CIkg~~qF)Z3J!p0PeHJyc3ZfQlL)kz!YJ&AeCoDH@QI?Quu2}mm z$f>?0DbA5W@x3u4{`ZEaI?|e}mFi*&`nkcUL(!awN%NG2lS0Uz1LBoHV*4hv^KhC< zvI@q;Fq6}SKd+Q7t&Lhw>+w8B>{=hu-(3|$Z-^NdHO*C#lOu$0Cf6G@TR|H6PUK~2 zPls>FAUcewpm6}|U<>P#AP`6CG8BZ7-M;{QNiq?fR%=x`t{A{2d|hQibMTBaQ8zAY z1dwXvA0{_z$|M}=HH83Bo>cwQr7;)-y@8uE9qhX0=c9QQ&D{VtqDS)9NK zJGx>Se|Se*gw*klS?za3G5I1K$*2n*jGA3fcsBB%yf;3TT{;RbEzhX+e$|TU<$`>R zdi<%tl8b=_l1MJUKt$R0hieZ8o9A?K+iJ;7sVXfzl3y(y3(Z{1IJLcy(=t6Ym_oLS zu*Z8CXrAC+C#lyGVI4c3#>wmt1*Fwd@3i6N8>s;Kb>7a(c|^i>eNPV(Pq&Rsp}_v> zIQ(~`#Yv0Uf=`WV>1=c9%YHxB@?FLht);Ns2-^DIg-7i{@m)-!JR#bc5bC>**sUiQEPueouNR5gGQucnU4vB7i?;4v6q z`=k3jHVBGjJ@%H6tGg-iW$O=xbpgJ$Wdi5SWN$~jpYlVhd-L2~E6rqk;)1585Jo~v znVHU+IjLo5sBOZWsWN6LNc-FMb?aNR;NWZ6gAPUZcSc+%eoQxOSJDC~rrqTi?NBCS zZ&>7A2BlFJey+zAaw~Jxq?Ul1Mv=1GmbE#wOUWUW{puQrj|8&#-t!aX+-AA9ZXsAyQqPH4ACtYNLwdvoqWQTQqfH3JiiOzZX z#*S3V{Q2yb9sM7sEGU0@PV~khiBT3YMT5tjs{E+~>*@DBR3f1V=Uj^?gPPGGXktwt zz-z%>X@|fsc=qx%a-5`WUW~O|_X$mnpJr{f4WmlvT40Lu3tj^;j0_WMT~~I4tny^FN(jjHsq^x$ZR0Lw1#BpgR@RaP%9j9LX)%#M~c6jaJ`xx%`sZW9F|Z0~$u zsV}*|)U#pE8&HI7Rf&${+l6hekMbT05(>`hKGbe-ObRjs)&DGcf`fX?jc?Ur_i3!F zZ2M3Df0Vt0cjeo&_S+qF*s*Qfwr$&X(s4SrZQHhO+a0XfM)yts_CCA!dCxuX9rrI- zV~#byHLIR_K2;7Eq?Xn{#kH2`=wj8Op3}@GJ!71uy%ET0{yFteSCCBcrHs9e0V8pE z#zdog+dIoRrsj7Ybxkbd~A~foc3TFBNGsWkaM&+hP1Md28_y& z$=OS6dzKXe){ob9;|VXyQY^ZKSX?cvC;$w5#`>WVN3r`I zhg7!i!>V(JQwlj9h%cbpj%+&DJ4k5U?R~Qq=v(aAOSF@|dTDG+(hi^+D|IoGCe=TL zUJ?|mY>K2%O@8fk(Nc&f2wTKQRj2%%QzpSuIjkcbOcI5F0HP?S%hkap@m(vdK+gbY zpmVg}V)=k>cV|$%?te>9eo<4HGO<~ngK`mP&@&IxVVrkR@V2`#W3^;jNzcnOOr<-u~@CzilH|uxHQ1E?_ zHNfg1uM`w{$Jx9g`ikdJrjvR27M4v*7NcIwdo6*@(GKbMfJ2aqf?P*YTcm_KKFgwW z6KWl0^raMZPL2P98H3iCSq-4)duGCY@(WVr%0$PCpeCY8i=G~pIYb?~-B@>S0WF30 z#Ys^uGKVAN1G9w-Bx}Hk&BAq0Ej?2**8%*5ae1ApyPVeWblo0x^SJve-XGyk_EQ+8 zy--{KUEG6yGYs_iYxTQxhxcZI1+3nyJWH5rZ{)lmVfPY<1W)QxyzXE)pT1()_!a4> z;fAWjjRGZwwu`X%4vfy2docf$%4~fBBh(GsBm3P-Z6f~;LYyDKk&xU?5&7-Cn>#jb zPW)ZZJtX3QpmilK#uK~U=u3+j9O8K=Mn?$usZbb1i3mewZ`YYDimAUj?UWlNqmBGo z9PvmUxhWvy+xY5vK%HBgy}KbsXp?$DDEHBg!3;(mMXeqc#NzBz%dngP8!sG#XuMme zHC1B@Pi&QPD<&f9d@4zu(6cIcE>`*!8u7xO_uDhjpGdte_S-?TQfa zozd91wgX!>4SqRY-2H^N^ES~MV^!qD&+dbyYajdOm?;;mXt0oy1A@wG%YqxoKEGJp zCx~Mzh&uP2Pd@H8LaH!Cz3H_q&^bPMKrVBRt~N!<`J6@pmL0}=y7~B~aR+vI-R4UQ z$fVNy=Uv(cO^E55a#DCI& z1@NgqyM`RQ>A6PKfsk_16k8DD=soOF;a%u7oQ*M*hIC8@w(+05s`sS&<&h-@5u1FR z-T_0ZvqvaV=KDd|f|<_5_*>%Bw%3#%tL#)Azgpzs{ioOOvvnjw-raiO^ zW)k9*mkaG62RI9y_hnDTV5)oFgOeAUt`)Z!OL0w-cM3Clf2}Pz<8n#*zK#)NsaU)? z013J~Yo|KnsD(;^^KeUg6FkRi+BW83bf1$76pmiili7dsEP9BA&k7j#n77zM*^1kI zA8va2v1xXWq5Uk50x~pY&|cpMEt7cehI!{?jT!f`&(9yKaeRQIkxBf`AuwZA?ThHL zX>sfPVONb#dWugY4xXVPmsV7bO&TXsfcE;1d+I78)SpuQr;(h(CqY@uwt=jRAHFhm z#bG7PJr!iBvBafqIB8`b7+U5FQLCI=fzfuFj#gQDyuZ2%aEJD?tNl9&t(LUh(^{~C zn-SDr_m4(D3wk6{JT7Ps7403%H)foMN`vC8&5ZfBRxWZ{hpMDCtQlo9I;MM2#3Q`&+Z$NE@d}=cHg%=FgD@1#NeSJAwqZ+O_V5Dsoh~+N=85Me; z`*w?wXyBZg^EGx|iKtP^W#Nl+2;a#!8W7cWRCA%#)3kdbfC|qF3v34fHQ@uX4Jv)@ z*Zv)R|CZHg^|;1UQK^T}hG*_?byS$Y%7@R`^I}V7mB7+O#K9OEHG4PWvaLR?__*OL- z{q@R=jpBRK2@%EM`~YX>!iYL%XX1uMpO`6=M5x+kFCx_rVeUW}+|6X8${nSqWMHzrE3ssO%=jSSm-8%=F@nxJv< z3FBVstB2;bo`b;VJkL8Mkfx?Qk5HewUJ(rkpE|=S^}uZ2VMA2+X5HSOcE4q{zg-iu zvz2ggo|5lS0HajX)1>5M`!H8=PqBcp$0 z(VsY*z`v#-lX2cMO3}-8{Q=-9@(6QXC&h?twq|Jo@Sh&Xyg_mm;L9~fGyq$1x)`P!W{Cy`khBRCG| z3@W||RzkiaWJTS%Q4u+fYE^Z}u2LK*Nh`}0nUMQ}-^xJ)+mw2K>CZYPsIc3nKFT>) zl`nRuoMq<=zl%+*N7HXWD6gT=r}eoXSr=zh$xk^us1`JUNwEIR?nk5@munn#V?{8I zrBWlhjk&y&+nl`QJcp>VNR zz?il7iWDEBJlb!Nzfm-1$LKNKE`&4~FC308GLx{c<)U9-S`02u1+SdQ$)H3EYP~a+ zp(>lzl#ifa>2o0@XhUOZT2UJboI77WU)2q>p_CvvdWYVD45!(!2VH)k*!b-GdbBX% zo1e>tG}-9u|2(9=Dz31$E(}|0do1oK+Q3_(1hudI4M~0tbE?u0thns!C}+B+lY@DY z!3ROx{0^I#h-*?`FRuhVlD-)c^Ih@ls<%W4_&>=YxZ6t0hWyZJSP@y$<7?#CCF>Ml zh%o3Rc@w()yf~3DBlezs&is0^1E>)10ue$&S);C@4sJ`gG=%tUGEsiuL6Le_n0~HS zmu9itaE6jnuwT<39`z{_Iauv(CLcXGzlka^;=Zu@-2`3UQk@&*{(#Fs9=Z@F4b>)N zrF-@cQ=)sXl}rhy`!6kw`Pch`Q%cEUPPL;#`1~RFV!W$ZTGqsdA#rj-0ApBveWFif zZ11t#a1I;C!V_=f3w=S+Ed^vwn9e#a?uR3bOGHnezArZT!KM*sJXii;%4zWo%>P8- zE5P0YcE&!bo!3X9J$U0Vqe7Dud0l5XEz;r~m=u+Qcd>tP<&}nvmse z9edOa;ubg(s~N#1;iH1sEPH$%X7ILOtxbb&ttVn0Pf4!ircMH5hg&U%F=ATaIh}L% zt%`dHLoTVGl}w++{tijfOG5xD9&vx?zH^|uAA+*qU9?UYuc!2b>H{Vnt5M*AMVVAO z+@SPy(#@E&jB4&;gQKmX=}QpVQH2mN0!pLn`4V4XrlwCkcI18%<_A6N=L%3#1#{BO z!MfaeJ1Ks~y1c)`Xzl&D#D8f~-B7%dAcI2bAJYa>H(>&Ax;d(s@1~eS3ILzw4S>Wx zQ{b;UCZvB&)M44TNolk_J3d+blDBnl*lNN3euZrt(o~D2DOo6G%#=xT^`c2YaD{J9 z3>jTN^{uh^v&YAhCWtRK?o|@hA|z&zxG6cw6>96Q z-=7NhZW?wpE^FRb^%SB3J!@{oHw;s6J?U-8;tX?^(;^|eNvjJtG+pYtKmFsH z2>5lXH}41Qi>h>MAm#BRU!OF(dY)6W-14~ry6vZuFg9(^>uG(eXpct_}Vo} z+L+plr}_Z5*s#F5WU*ONL}=?uX68>Vy_|dW0mt@pe0#`9+`2U@;_O53oP+FWtEE)b zP)t-~=NDD^fMc(ze0T2@HM0v{Pp-FGL(X?G2F0@*ACc`Ti!!@I7%3GhDiHTE=cdc? z|J_~R#bK0zAEA@C`a!Zbo}ma`a5|h;Q;6JYI{4XI1?a`x0!ibt-ejbo%9>oGP!V>9 zdFynMbO;~x^Yz^U72hXGq;tBHLf)k_YQtiu-@%G)512A4f7Uwh-PUtKTOpJsVR_iRbrWZ-x;YNaQ?9x#QN5=d3X zH7yvclwE6>YeXlAh}0eGsNV#ew8DLPBoam|RK#zy{N-lnL)^7upSgRYx7HbbhZvgz z+Nuj9ejfNzF+F+{?F;%74NVa8w}s#@<7u_uv=<#ybbqDMi-CkC@_h!E;*hqyUh+{s z?R_S;-^T(0J?sgcm&V1&$mf~C7@~%c4 zL2UbR@z$}-NU(!C&vX%_eF}6&T4NdP$LmFAk-e|+#7o#Dp zi36yua)q@V+!8`e=K94w6{V^?;gxt{;Fs83v_XXMvVGQlvZo$sAkanB=Q2k2SOu-D|=Efwa`mXYM21`#9Df@z;)L)rEh z_O0+pMOO%&>y`B3iNO|;uZ{yE@czpS@a?%HM2~{*tf;wccD&Y;#%}SY0a}B4MPP|D z7l?Nu`plGvs3huyzQ3~v(`A9+Hzlj#M6;+rq4!HxCYZgHi!(j~Z;Sl3)ndEI3#vPC zKVM+f_=R>13>&EI35jXl0objqy!9XV2&u{SX| zcX{h$a+W}(?njOOcY}-5&rA=*;Bf>=UwHQOuAP{OR(JOR&Pwo`GA|jB-BP0nicsnB z1@flTCrd`As04s|CeGY008AXbG^Gi~4?5O~ zs2jX=KjTnXa?Kjb@B4#;mG%K3AUmyqOeoDLU}i!}otM)cdz?}K=xNprQiRWnY8P;!Wf1bo*-YzWma6V@95wodi(>Ak_LM8Y3COtU@b@D{ENE|P&C zw1)a6U8lXgo!%EZ85IwOy0@v><8(m*uuu$fg|vCdg*pq1`jZ8S6#ESe>r~!|7uZW5 zMOrN_#)u-81SWZFAnCc?EbQ_mzHq_RZ?rI{uln>n2W!HLI!`m=s2Q8zt-sT^otLzX z!)}Q1yO57|@y`t`Q8sLd!ZVb}H#Zm)RAT7$vM2ZjPzW z^;9vVNn?O7Geq$iTK9AD8#qY*K0LN$LK?V1+HUbto?;6FJ{+(sy3{ud@fAfS#1rNz z9?pJ|bH`-$$HSfuuNp1&NrbW2VoJFPiLH&J;I)bjim((iY|T#LuH%~yU6LK**D*Cn zJsr;(ec=5ggSP6r`7+G9BL&ZR?M(I$EEaad29;hNE-C`!1B=C4&AWi&Eb-7g28TE* z7QIFa<0Z{m#3ViX?F|3B?ZJzY&5*JOMVFTdox$RAzp(K2drl5mALr6BTs}H+Jzu(Ax~0oY^y0(CiGyD>nmC*w4oC-S!y!aUeoLjI z(~~F9cd1Br28qpk!-*fFRtC~2pGkP;1X=0GpB=t)mzA(*7*k-1hvFD>RwP@{v$5}| zD5kzIUBv>`;J*ZK@XNC`p21W8z}O~sifQ5jHT2!B>Y%#n>lIHt-%V@@1-prLAU2gL zX#Q-nw@}gqb#o**cdIdX%^+W8%*70KbLW^(z8Nfivp{b;_Ah~y#&b;Xa9f9k5EF#W zYr(U@pf`s>S>;|FcEUg#U8vh(S_NrBq%ntfmzv954rkRV|{J}%;7^9P+AKrmQyfax%aUo@T-YjXqy~Z?%L(n z!EGm$xR#g{I4VqQyVbn~bW`cx0O@`9elh}rt?QykpsdE^d{FB({4!4k2V_5z&hwva z81UEuq3I1WPJ5M5$*j+Wg8ZE0dbtiA@~umOIZ^AyDd0SkUPgit7!c%-^s1BuZ#`!d zXD7YHri!&1dqG`3{SCtt#Gn7E1>RT^s{K4d70N5c^YOChUhz1Rj-A5v(H>w*%SUF_ zEO!hdpc4|Bg~@et=WKW$^A!zYRCpFeuJW9~Q%G$!dNsHt^olvTzo;!{UNI2gyNf&j zd;{nNznX1d7co?6+?*>8-k*eymq(&Bk;TQtvbTw+OCe`GNrczBu4f4*;B6jCL5bMH z;I@s5DjM0f8|cfPa415?K_-t(nXb}%*)!PI{eoQVY|}#j;)sc zdGx`!5czZ*>(SZ}I-(-Tqu7zvi7+<{T*&A6yEs6@OX9vT|B_wX_)j&^F4qNF^abT< zJ7W11M^cOd28GVqM}nE}fIW4%4g@0gP*_h#=JP%?n^^iI?X!J|1U6s%L2pn&29IK~P=R3-9--XD;@p#Eihv3RbxFzvW_= zo&s}&%8dJJkn)g7MN+Zx4W>XJzVA$<#OViIl2rk)O|>#*=Si$!uq1cSTjMW~+|Dz#-R6>hqVcs2L}{dpP^I|?#>1(-ff9y99ORqBq14-iJTK22tS^l5H zzCEYRSx8RT`jbZ}*;o4_-pXaFaq02ZjS}vOXv<`B<@skf$~-cg3WTGi9*~@>dr|t^ zWe7<{Y)^>J^aJ1Ieakx!H#QtaJx|KQ7{+1mbw*zDc@LoqDJdJgi;*L(iMEE!X)5qA z%nU*^UomGgdKv%B7B6v%6+4y@7qP>0lSj^}WOgpSPd%DKksdW@y=tONmWV$(g20=e zUk9_n?u@GgEoxUX zjQW9^-P-)v|DSrVkC|X*6n&p`)$A&j>}X_n{&AKn{9|Lq_aS4w%$nNqSa7z8%y{jR z>E>9V`0sYdf_kxAXwlJbAl6MqD8*_S0t_^>jvY~4XYby&;^CN!koWY=(UV549jfn!5Y)H0HwRv@e-YQR-Z^^!y)-1A-MAm$*`5??RHuTGzQKla>K z6p79UBOoM1p7^2OZ7y1;2cFWKyxqNI=-(9LBXT5s`JFfZ2T_8ng2T;NukZz|h)h1y9Vc={72Q6M=Yb2)?FvpD+CaE6+I_rtZ?~!d3cG zE5kbmZc{2Dr z=VEFoC6=7j{JGOfr^%uz|uKr)hw` z!_hoBvE>o8qpV85k`h3W11Q$weCcOBfeG3845$AXl)sdha`;Ep-b^;OQ*n}|?y@(~t1 z)~;*6O1-WM8v~B3GC&E{#q&ulhu{}C_BB3=GB9mTYh)%A`YqgIr9BZ`xf;#=+dm!| zUH!0>RsV)-_Fx38XJ)$ZvjfJK=3{i^vpsv{LoJ$;M`#^NU*Zw1=Q#K4$ElBlk2Yk~ zq$r|^gUP}4B5BYq>R%F83N;gw+dYah>OD67Z-rcEft+O+>R?L8UE~a<>4Lsr@smk#uTa-e9Xk02St`CT4LDb-Z(*vbElIo8 zu9`}4y7*xh7%dq6EBU)D%})1pLrs(zRlXh=+y7aOmtRr)7zuY=3*_)ZkYt6)cH-fE&En`> zq@BliGcA{~fMV`iKV#IOl1vV=KEdyznBW1RBu080IWlNFXy4Hmol<2oqEHX?fA^QP zGDC1&#gTvFtdoo}M zdR-5MOFk_-)p(|3#wmHcoG_Qh5K2aw<`c!qKB8!FS?drzF!*xpbM=qF-Hp!sl7-fR z+`-+MwBY#@{-HuGRl#aF)!Ky8bxKC|%9{I*+ZNdvbxIv4Cof66yg54aWDz)D!4==h zM1%rj5j~Y0!ptDNg5gu>I9~K`6bLKiDVbF)Ic+i7XQ9G+``#K2n z%A6J9h1S_4(K+N=mU~GCfP;nKW4SVCjRIr%~IhQVN>`>tmq+)1VPZ~KclMP8u z9uOV_dPRbU|8jNge)CU7Fi9Gzr2{7&MbK+E&td+WXWOSqB{nn7D@_xV&gsA>?=4*{ zqz4HjwCImnzHAG6V`lge6RkQ1^SO=3NNE^&R*)PA%PZebts%aA02Wi9Z|V)Z!yzsJ zD=BKI(TGru1ct+>0U_V&0W1>P;p&*a>cLp)4h$x03m9?GP3(|ogTbg2TO33t#0jNB z7&Uo)tlP%3xpUqQ5D+-%G4IgoZt2)NFJ`A z1w%DWHGE$Me<{K(g=*4va@&p3+$Ktx0QZBsakLC~T%0VtEaOTm%5k)Gsw}`+w@^yW z)O@U}l?Pr3N;l?i1Xel2WVnWji6i>mi~7siJ^qB-Z>G+vDU%nGmP&stc%#I&m|p4T z`zYF_FYGAfF<{Q$QhS$26?rTGYe|A#{*$U)C92dlYaU%!Rx=*f7_4r93UG~B4g}0q zv41gLCf;zWp?j*Q6QHLb++ekK=uJiq)CjX+ct9w`P}_Bwv${&8w>F0hI=q<>wJ;hb zTLspX`Z4@1WKcN1aw}wc+J-g*RD?^nyA!g5Bp}zLTv&SEiAbV96Cqh6#N+V*`z$z9 zgMv1w<^kFEZ2xJo&~W7QG{N30+I7CGs?ZiEMBH_ zvwsWPy5nCKs~^3lvx7Ib?f-&V4Kjo?3(OQCuh9;r_kthLUJ|~{hB>k}U-igTEWQ}6|FNr9 zif%hE?CQmR;Yy2N5>&7w8uskm&hnnE31Fthod2}zLBJgov;is)I_2V9u z9$4SOCy?QsPf0CdVAA&aqF^3T`RHZ*FZwt@$R*z<1^X+fwD@h zYz2otiW&ciU?1V|5C#WrmRU4DmiQ&UN++Vx|6R6rD{HDk%8PNn?x7QXLVq2#Zep~G z=J5>sb#sx44-PQRp=FPR-*i?$F1q^V0FRcqA^^J;F&LrKQ9u!TSiPzp^FY%aJ?~#0 zho0ksc(42zs!1_tY4WK_l7@d_tRPkYC&o%pz`+Ovzr50XKCR!`#K1X+wK|;_y`&e_ zP7{XwJaKwohi`uf=dggy;dZ0tEF;834_zD%dc^d(!5~pmj|Z8w_h%}Ca#56vmd@3r zv%G8^jI*Q4YJ&}vnP+V(z^b$_n1Q08Cisz4LxSq0(9q6r*&^jzSEyNI+9Wk6SaLx~ zTy&4mY6irjct+J=It~!7MR`r?>6beMug(D-N`usrt02L1EzBEUo-NQoI9o2Hnz@vE zlL{=mB$VF~>TjV_=)yH!dCe^L55ubV7=Dk18v^=yd73}Ykd9xN;ev?6Tq)`)qYo;+ zSRWr_Nwpmlkq2ol4-n@WyJ0U~GtA-G#&-FLNwES;!$q;mmXKW8Vurw{nEbM{l?TQP z&lK+sIb)0Mhv_W10M}<3YIYhf7`fFJue=x+Z)svHULYN zBI7$Btb9LSA+H&=1})&kRyk^Q*t{d2U*{1*wTo?(UBFzt@io@TXm6_-QS?iK&>x(Y z(jgqD{|63F6~|hNNNbjT`LI~0bb5?U!MT09V6`M%oW2h1dF!+&cvTx#A;|Noo4vGTiwl z#&x+`)-0K15wR*~EhC2q#Xvj!pVMY<{w7+r`wh-8(psCD`fE))VGCn|ZlA1q6(A1x zzjAKx7V2~kH^PO+EMM4>rt+vzyGARkGl>=jfWX>dbKn4@gLUjGF!JB8@2&M|^3Squ z_DE)-^n(Tv5zfFl&mZjCoLefuFuSm*=qFE@`@UZkGd9Vuw)u(#p}e7wD-}h^3UzGT z?pR!J%fIQ)_m>r9u_Lg$F5My`Aja|?)(c6YxM>0*yY6(~Jm2zF?e)Kz9^3r6*2y#c zi0BFA&|{yar_!)~u4!fz-^Fv2{D0A`qGjKiKRaKFmlyesCyaN~;Ed_U|NL=_5t0x@ zL5Y@i9D28)=^pA)jI5n!wLq}kX|8Mq=f$@?m-oDNeKAV)#KVu~>$SOgR*HCj%W#4v zw3t}GX%>Kj#aO(a=%-U-3 zS~-S7%|pU?+T2d$5~V|hC4{{q%n{+)6US)d2(l2AZu%Z9B@mJgcE;mg0d@+Wq@wU2 zn`f~o0Hws|#YWpUHwH`~kr!(U`Om2_=dPLF=K~S|r!kA>XiENNCa+RQlC!nd8LV!D zWk$!lkw)Y?2JY>VbXG4!NrgDjKOb$z(3s++%CDp@Sz6BOVb@yLI|A%J%dpoXRNlc+ zM56^WLvtk;2Czd`Qb9b!|Ak*wrEp9FkBwyp_W|oaUzkz)i(eI9G?20q=swC6O(9Ds zZ#arUPk^Y?d!FRxT~RBNl6B%S(l%U?V<|;HV&i0glWqs4m)`tm^>EmUV= zHO^krzou$&0wN~fhE?M?^G;xz5w3)|ow(v@pZX7B%56sq`8=Q|laV(p02)2PcyD+d zjZRLlOiJ*-E&G4{gI!tIH?HQ)M?{lD*;Y|i$45j{7=y4cFw?$-7YmxRq{MSM8@JL+ zVuwaM+0a6F^W?NOJoJ*#9H>dZ!fv$KkAlOHUI2%W&kp6c;h$}mI1a;T^u@TH#>oKwHqfHrc8`e-dM(IQyyMMxEY4+4b^!I+cM0&8d%07G~hk zS3G+OZM=3GRxs@;lEb~5u8dM}lP*lu3YW`q3W1_pw4?%-1kWru!UyTbG-@ykrULqbuWT_eFD ztKo@Pv?J{}ru!o2lHp2y!X@@iDw#G)u8XPRH^Ey9{pUjY`=3)f(qqfxImfN4{{IrI zl0-G&i;3*3348OhU<)BRNR;l`79MAxPu_ICkAIG)8oJDZO|mvFhmg}uWus!KZ0<)b zhx&6{BO>@R+uugtBZaW0q%Rpf>)~^AVQYm+;P~>9rA^L_h3H-(# zE(&0%>m9(G?Z2A5&cx0yg}BxyJN?d_3&W#?`8TEt?akNRnq9tZhR z75RqfTj}Kf5))o(Oh|(@iLTn?b!O`1JXD^D6QIo56id3{p|hnl0oKsqGy00jbYFRC zH3fWtkj(@8nvA`Xmtr{kc3Beea5HxStGZx17%r|N6S{jRb?A=o-NDX!1+E)uSxNNG zDS%;}eJXyhSBCT2efz)J86rlRZ|7HYl9?V;8RuCOHdFS|-euct4`NU@pn@0{g?$*< zJB}XDwV?&ZX5XCBxY5&a9m`MCx@NNr1o@(z#zfK8u^-~Ts8brkzBGh^-4WDwnW9LWvqNVP{1qSv11WUq`vJ>JriT>$~ky577_ zB0XySRLf3jMI1O+T|&S4DM%~dUGUGVErH!6a3(}!2*kb4Pl9 z=%8FBiC9MVyKNT2KTin1&}@Ihr=rBI<1C2q(AZ-iX5pT@7aR@+Kj3i0ua5fj_`Fa1 zg%~1=BPKMom{fEltipS15$KK?TI~}sR`HqB3}Hn~#}38jq$>&g*8LWA)$z4iu1XgB zb4~z6=hT(Wqo7q(Tkw*)!`n0#oh>fQ(&{w!?bQ)BU(T1HhhL$Gv}NoBs2EMsS8)zT z?{PR_mHPHC2{-WKS3nQtT^}oCdBPFlFCW*#QcBOS@DJQAaPw!`?FMs)cn}3W)FZ|* zUpc$qjQv^8Qw=*S1D^o6)n=N(QY`l>-%36Hks11Q2k9W^Dh~SL;)c<79;i;{<32+(n+-K-S0(%G zlHjLLSP9}n{7T01T(_-o$HMnod@Rz~C$4W%47K4quE>}BM;RQ&@a+0C;JIfaZnd4U zesYY4L7nmQTq6jNZuj9fHnQ+~9=6+}iH|-huDJh|`S@KW^M%E%M@S?x52nOOw7+OI zEMUEfz0*m=WbZ0C@MK=0FK$qPmzyTK=d#tIOyG?)sUSUIM< zFBPjl_HrcxdB>)M?^BWNifnN;%)Q27aXp)f$tXfW@VxC7aF4dPVNvX(G;3L7GHLPM zdLgf!5`($VgB^OMQwu{K1l<&8r)~&vyXFhz+0hfLP;H+zzMa0v4hQH5e0l zmzz@1#=_SLkbeB)rdYOE!|%

bH1#3gNxXCZmFTS%RB zmx*RMEXnQI9*4*}IDVPX}>wpDvo=~AdM)M^-!6a7yAPXW_SlYa6^55y&C-rkS%@XJhAo@Wt= zR97p$MU%*efYwymT0|EkqM9Qqg62>pC`YQ<*Tow@Va)&(5yf5druM_M<9AhBnSGc5 zJOrKd;zW!%dwTvx>4rBa|Ap-e2?>pQTt>+Emww1o4val{AHVnx(GLXWV49ZU4C_-8 z7rs)qW4$)~9Cv|SI`cHn26C#?$#B+h-45Y*?vj#z%`+pTlVZPe^7o-P zAXm&R{ZvIhg$bwaWnHh827Sy{LQ2b<*o6gsyV{2@@juJr5xrEA)(-m9??tY(djaq- zZ7Lvk-5o8aKtP|}@#fkd`J^zBxcvNJ06i7%Jr$i8t*a)Mzg5x;wKtI+djGto`U`$O zgmt=m*pVRuEc{U5__NcvXD%9_xG#LLpiB3YS3m&p?E3rn??gB0$Z(cXmf43%$m~X)rgw5*%r*xTw30PkI<}Q)l=~%y6 z(!YLg{sR{mG?;B6z}G1NoU?0Mt#9R=d2~#S?7^|Laj4jIAZbJk*GIqZwY4>PF4lh! z@6Cdf=Y(d{UmoCN58;QD9SNGVcg3F;+!L}o7SdZFOGP&TiFTI+=%u5AhR2!bGktNfqZi$MBB-=df==jWNZCI+s8!%uvBhq| z{+(>cp*=GQ=Ja&${X9KCSsVA$yAa;*E4_V4TGMqaSk?PLL0K+CsMDJgBYAJ^kuq3z zwxk(9r22F4<4g26oY1iOIc;rh2v@m!8Yxvu1&Oce&-zlan-pS6s+=dkZpa{qZ3xk- zQ3ze~lQ%o#*}s6Lgn|_>{{Bn4V3wFq+N(6Yz5eto7|d`jP&_l*w9LISd3HmpIJ5Yj zdbV!qR8Zbz=m0tRP%nPG$zzH^_ns*$aRT`IlWjRGEhUciUNlK+=iuoFER@58F`@hy z_=5T$$=50%b7rb@DKp48Y=5qk|8wtqgAhQuS8 z*1YL@%ZZ6%EfwgTOQotA^=s8~F1J8L>_u~nBdE#3*W=M;8}={L{29R?ebUpmrXpf| zgU8Dh9~&@^9LXr*j1fsqPr-K3Kc!|!#~*3lOc~6Sut&g!X|+TbS#yi4Thdcu=dtKD zI%3(;)qO~em%LL3-h_8-R)|#V?btSA0T=j+UOCIcsRVEj_f#x64atxAw#PAw$eE*l zGjXUHxOWvYRUGPs4YjWM{UVg&e4e^&Ur(vXlWMXf>2xIJ3U8yc&JM}BqFfm1Ocn>8 zLKw~}?l#b#Nw*!n#y`S@onNv}p})Pb#}D6a%gQe6S*{2)^aL8;W6W5xYScUH2`G~t zPW!1ryEf(XO8aRMe>@YJ&`v<$EAJe4S*{@bPC9OqAMaqT_SG=lLy>R@p0LRZ125WsL^-MK!N0w093vsxKx^s5_n@kyfZO8gB9J zRmh1iBXAWRNwrDpP(Y|LLwf$no20l3grm8x>!w_Agi$B|GS?n=(IQxD5LPqu!d;jn z%uAR^%J4>YV>KZjNtD;iNbF@E2$p3v64P%E&K1`&v_~A^g{G{o=NwvbF*NuQ~82h z7Q$7>*2yOaT;&5t*UW_p_S>lctrRsQ^=h!&yy6P<7Nyof4HM>vmIy^^f?1H@*_V;^q7 z4fyZ3{FWn28y2CrEDBZzYg%cTh9E|R!;Oc6#b-ih8#b%Qj3#z&$spt ze+{;+OH)pPJ|xCHGkdq2owuz*)W`pw^2T%1*qeTa*l%34@#hhVrruF)DCPaPzT;l5 zhg&2qhd}<)EZ}|?{HgwbfB6XNDOLZ!UdJKl1zm~J+F1Z^wgCbD0ZA!JR*M@4{~u$y BN&^4@ literal 0 HcmV?d00001 diff --git a/assets/models/Faces/faces.glb b/assets/models/Faces/faces.glb new file mode 100644 index 0000000000000000000000000000000000000000..23cbb2f7c03e816d47be0300c5788d39423e373d GIT binary patch literal 85436 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�LW>P%DFKdt+Ims5^ArDg_IbE4w?H}Jl%-#I01 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, + /// The cubemap layout. The image should be a packed cubemap in one of the formats described by the [`CubemapLayout`] enum. + pub cubemap_layout: CubemapLayout, +} + +/// Add to a [`SpotLight`] to add a light texture effect. +/// A texture mask is applied to the light source to modulate its intensity, +/// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs. +#[derive(Clone, Component, Debug, Reflect)] +#[reflect(Component, Debug)] +#[require(SpotLight)] +pub struct SpotLightTexture { + /// The texture image. Only the R channel is read. + /// Note the border of the image should be entirely black to avoid leaking light. + pub image: Handle, +} + +/// Add to a [`DirectionalLight`] to add a light texture effect. +/// A texture mask is applied to the light source to modulate its intensity, +/// simulating patterns like window shadows, gobo/cookie effects, or soft falloffs. +#[derive(Clone, Component, Debug, Reflect)] +#[reflect(Component, Debug)] +#[require(DirectionalLight)] +pub struct DirectionalLightTexture { + /// The texture image. Only the R channel is read. + pub image: Handle, + /// Whether to tile the image infinitely, or use only a single tile centered at the light's translation + pub tiled: bool, +} + /// Stores information about all the clustered decals in the scene. #[derive(Resource, Default)] pub struct RenderClusteredDecals { @@ -121,6 +196,29 @@ impl RenderClusteredDecals { self.decals.clear(); self.entity_to_decal_index.clear(); } + + pub fn insert_decal( + &mut self, + entity: Entity, + image: &AssetId, + local_from_world: Mat4, + tag: u32, + ) { + let image_index = self.get_or_insert_image(image); + let decal_index = self.decals.len(); + self.decals.push(RenderClusteredDecal { + local_from_world, + image_index, + tag, + pad_a: 0, + pad_b: 0, + }); + self.entity_to_decal_index.insert(entity, decal_index); + } + + pub fn get(&self, entity: Entity) -> Option { + self.entity_to_decal_index.get(&entity).copied() + } } /// The per-view bind group entries pertaining to decals. @@ -204,6 +302,30 @@ pub fn extract_decals( &ViewVisibility, )>, >, + spot_light_textures: Extract< + Query<( + RenderEntity, + &SpotLightTexture, + &GlobalTransform, + &ViewVisibility, + )>, + >, + point_light_textures: Extract< + Query<( + RenderEntity, + &PointLightTexture, + &GlobalTransform, + &ViewVisibility, + )>, + >, + directional_light_textures: Extract< + Query<( + RenderEntity, + &DirectionalLightTexture, + &GlobalTransform, + &ViewVisibility, + )>, + >, mut render_decals: ResMut, ) { // Clear out the `RenderDecals` in preparation for a new frame. @@ -216,22 +338,54 @@ pub fn extract_decals( continue; } - // Insert or add the image. - let image_index = render_decals.get_or_insert_image(&clustered_decal.image.id()); + render_decals.insert_decal( + decal_entity, + &clustered_decal.image.id(), + global_transform.affine().inverse().into(), + clustered_decal.tag, + ); + } - // Record the decal. - let decal_index = render_decals.decals.len(); - render_decals - .entity_to_decal_index - .insert(decal_entity, decal_index); + for (decal_entity, texture, global_transform, view_visibility) in &spot_light_textures { + // If the decal is invisible, skip it. + if !view_visibility.get() { + continue; + } - render_decals.decals.push(RenderClusteredDecal { - local_from_world: global_transform.affine().inverse().into(), - image_index, - tag: clustered_decal.tag, - pad_a: 0, - pad_b: 0, - }); + render_decals.insert_decal( + decal_entity, + &texture.image.id(), + global_transform.affine().inverse().into(), + 0, + ); + } + + for (decal_entity, texture, global_transform, view_visibility) in &point_light_textures { + // If the decal is invisible, skip it. + if !view_visibility.get() { + continue; + } + + render_decals.insert_decal( + decal_entity, + &texture.image.id(), + global_transform.affine().inverse().into(), + texture.cubemap_layout as u32, + ); + } + + for (decal_entity, texture, global_transform, view_visibility) in &directional_light_textures { + // If the decal is invisible, skip it. + if !view_visibility.get() { + continue; + } + + render_decals.insert_decal( + decal_entity, + &texture.image.id(), + global_transform.affine().inverse().into(), + if texture.tiled { 1 } else { 0 }, + ); } } @@ -377,4 +531,5 @@ pub fn clustered_decals_are_usable( // Re-enable this when `wgpu` has first-class bindless. binding_arrays_are_usable(render_device, render_adapter) && cfg!(not(any(target_os = "macos", target_os = "ios"))) + && cfg!(feature = "pbr_clustered_decals") } diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index ddf9d831f0..5a19930842 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -45,6 +45,7 @@ use bevy_render::{ use bevy_transform::{components::GlobalTransform, prelude::Transform}; use bevy_utils::default; use core::{hash::Hash, ops::Range}; +use decal::clustered::RenderClusteredDecals; #[cfg(feature = "trace")] use tracing::info_span; use tracing::{error, warn}; @@ -121,6 +122,7 @@ pub struct GpuDirectionalLight { num_cascades: u32, cascades_overlap_proportion: f32, depth_texture_base_index: u32, + decal_index: u32, } // NOTE: These must match the bit flags in bevy_pbr/src/render/mesh_view_types.wgsl! @@ -777,7 +779,10 @@ pub fn prepare_lights( directional_lights: Query<(Entity, &MainEntity, &ExtractedDirectionalLight)>, mut light_view_entities: Query<&mut LightViewEntities>, sorted_cameras: Res, - gpu_preprocessing_support: Res, + (gpu_preprocessing_support, decals): ( + Res, + Option>, + ), ) { let views_iter = views.iter(); let views_count = views_iter.len(); @@ -997,8 +1002,12 @@ pub fn prepare_lights( shadow_normal_bias: light.shadow_normal_bias, shadow_map_near_z: light.shadow_map_near_z, spot_light_tan_angle, - pad_a: 0.0, - pad_b: 0.0, + decal_index: decals + .as_ref() + .and_then(|decals| decals.get(entity)) + .and_then(|index| index.try_into().ok()) + .unwrap_or(u32::MAX), + pad: 0.0, soft_shadow_size: if light.soft_shadows_enabled { light.radius } else { @@ -1187,7 +1196,7 @@ pub fn prepare_lights( let mut gpu_directional_lights = [GpuDirectionalLight::default(); MAX_DIRECTIONAL_LIGHTS]; let mut num_directional_cascades_enabled_for_this_view = 0usize; let mut num_directional_lights_for_this_view = 0usize; - for (index, (_light_entity, _, light)) in directional_lights + for (index, (light_entity, _, light)) in directional_lights .iter() .filter(|(_light_entity, _, light)| light.render_layers.intersects(view_layers)) .enumerate() @@ -1241,6 +1250,11 @@ pub fn prepare_lights( num_cascades: num_cascades as u32, cascades_overlap_proportion: light.cascade_shadow_config.overlap_proportion, depth_texture_base_index: num_directional_cascades_enabled_for_this_view as u32, + decal_index: decals + .as_ref() + .and_then(|decals| decals.get(*light_entity)) + .and_then(|index| index.try_into().ok()) + .unwrap_or(u32::MAX), }; num_directional_cascades_enabled_for_this_view += num_cascades; } diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index fa30a2e5a8..98a5be9008 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -2557,6 +2557,9 @@ impl SpecializedMeshPipeline for MeshPipeline { if self.clustered_decals_are_usable { shader_defs.push("CLUSTERED_DECALS_ARE_USABLE".into()); + if cfg!(feature = "pbr_light_textures") { + shader_defs.push("LIGHT_TEXTURES".into()); + } } let format = if key.contains(MeshPipelineKey::HDR) { diff --git a/crates/bevy_pbr/src/render/mesh_view_types.wgsl b/crates/bevy_pbr/src/render/mesh_view_types.wgsl index c8b2b53fbc..3ba62f1414 100644 --- a/crates/bevy_pbr/src/render/mesh_view_types.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_types.wgsl @@ -13,7 +13,7 @@ struct ClusterableObject { spot_light_tan_angle: f32, soft_shadow_size: f32, shadow_map_near_z: f32, - texture_index: u32, + decal_index: u32, pad: f32, }; @@ -40,6 +40,7 @@ struct DirectionalLight { num_cascades: u32, cascades_overlap_proportion: f32, depth_texture_base_index: u32, + decal_index: u32, }; const DIRECTIONAL_LIGHT_FLAGS_SHADOWS_ENABLED_BIT: u32 = 1u << 0u; diff --git a/crates/bevy_pbr/src/render/pbr_functions.wgsl b/crates/bevy_pbr/src/render/pbr_functions.wgsl index 11e6d4d874..84f7b95661 100644 --- a/crates/bevy_pbr/src/render/pbr_functions.wgsl +++ b/crates/bevy_pbr/src/render/pbr_functions.wgsl @@ -422,7 +422,7 @@ fn apply_pbr_lighting( shadow = shadows::fetch_point_shadow(light_id, in.world_position, in.world_normal); } - let light_contrib = lighting::point_light(light_id, &lighting_input, enable_diffuse); + let light_contrib = lighting::point_light(light_id, &lighting_input, enable_diffuse, true); direct_light += light_contrib * shadow; #ifdef STANDARD_MATERIAL_DIFFUSE_TRANSMISSION @@ -442,7 +442,7 @@ fn apply_pbr_lighting( } let transmitted_light_contrib = - lighting::point_light(light_id, &transmissive_lighting_input, enable_diffuse); + lighting::point_light(light_id, &transmissive_lighting_input, enable_diffuse, true); transmitted_light += transmitted_light_contrib * transmitted_shadow; #endif } diff --git a/crates/bevy_pbr/src/render/pbr_lighting.wgsl b/crates/bevy_pbr/src/render/pbr_lighting.wgsl index 01e09fe3b4..17cae13b92 100644 --- a/crates/bevy_pbr/src/render/pbr_lighting.wgsl +++ b/crates/bevy_pbr/src/render/pbr_lighting.wgsl @@ -456,10 +456,77 @@ fn perceptualRoughnessToRoughness(perceptualRoughness: f32) -> f32 { return clampedPerceptualRoughness * clampedPerceptualRoughness; } +// this must align with CubemapLayout in decal/clustered.rs +const CUBEMAP_TYPE_CROSS_VERTICAL: u32 = 0; +const CUBEMAP_TYPE_CROSS_HORIZONTAL: u32 = 1; +const CUBEMAP_TYPE_SEQUENCE_VERTICAL: u32 = 2; +const CUBEMAP_TYPE_SEQUENCE_HORIZONTAL: u32 = 3; + +const X_PLUS: u32 = 0; +const X_MINUS: u32 = 1; +const Y_PLUS: u32 = 2; +const Y_MINUS: u32 = 3; +const Z_MINUS: u32 = 4; +const Z_PLUS: u32 = 5; + +fn cubemap_uv(direction: vec3, cubemap_type: u32) -> vec2 { + let abs_direction = abs(direction); + let max_axis = max(abs_direction.x, max(abs_direction.y, abs_direction.z)); + + let face_index = select( + select(X_PLUS, X_MINUS, direction.x < 0.0), + select( + select(Y_PLUS, Y_MINUS, direction.y < 0.0), + select(Z_PLUS, Z_MINUS, direction.z < 0.0), + max_axis != abs_direction.y + ), + max_axis != abs_direction.x + ); + + var face_uv: vec2; + var divisor: f32; + var corner_uv: vec2 = vec2(0, 0); + var face_size: vec2; + + switch face_index { + case X_PLUS: { face_uv = vec2(direction.z, -direction.y); divisor = direction.x; } + case X_MINUS: { face_uv = vec2(-direction.z, -direction.y); divisor = -direction.x; } + case Y_PLUS: { face_uv = vec2(direction.x, -direction.z); divisor = direction.y; } + case Y_MINUS: { face_uv = vec2(direction.x, direction.z); divisor = -direction.y; } + case Z_PLUS: { face_uv = vec2(direction.x, direction.y); divisor = direction.z; } + case Z_MINUS: { face_uv = vec2(direction.x, -direction.y); divisor = -direction.z; } + default: {} + } + face_uv = (face_uv / divisor) * 0.5 + 0.5; + + switch cubemap_type { + case CUBEMAP_TYPE_CROSS_VERTICAL: { + face_size = vec2(1.0/3.0, 1.0/4.0); + corner_uv = vec2((0x111102u >> (4 * face_index)) & 0xFu, (0x132011u >> (4 * face_index)) & 0xFu); + } + case CUBEMAP_TYPE_CROSS_HORIZONTAL: { + face_size = vec2(1.0/4.0, 1.0/3.0); + corner_uv = vec2((0x131102u >> (4 * face_index)) & 0xFu, (0x112011u >> (4 * face_index)) & 0xFu); + } + case CUBEMAP_TYPE_SEQUENCE_HORIZONTAL: { + face_size = vec2(1.0/6.0, 1.0); + corner_uv.x = face_index; + } + case CUBEMAP_TYPE_SEQUENCE_VERTICAL: { + face_size = vec2(1.0, 1.0/6.0); + corner_uv.y = face_index; + } + default: {} + } + + return (vec2(corner_uv) + face_uv) * face_size; +} + fn point_light( light_id: u32, input: ptr, - enable_diffuse: bool + enable_diffuse: bool, + enable_texture: bool, ) -> vec3 { // Unpack. let diffuse_color = (*input).diffuse_color; @@ -555,8 +622,26 @@ fn point_light( color = diffuse + specular_light; #endif // STANDARD_MATERIAL_CLEARCOAT + var texture_sample = 1f; + +#ifdef LIGHT_TEXTURES + if enable_texture && (*light).decal_index != 0xFFFFFFFFu { + let relative_position = (view_bindings::clustered_decals.decals[(*light).decal_index].local_from_world * vec4(P, 1.0)).xyz; + let cubemap_type = view_bindings::clustered_decals.decals[(*light).decal_index].tag; + let decal_uv = cubemap_uv(relative_position, cubemap_type); + let image_index = view_bindings::clustered_decals.decals[(*light).decal_index].image_index; + + texture_sample = textureSampleLevel( + view_bindings::clustered_decal_textures[image_index], + view_bindings::clustered_decal_sampler, + decal_uv, + 0.0 + ).r; + } +#endif + return color * (*light).color_inverse_square_range.rgb * - (rangeAttenuation * derived_input.NdotL); + (rangeAttenuation * derived_input.NdotL) * texture_sample; } fn spot_light( @@ -565,7 +650,7 @@ fn spot_light( enable_diffuse: bool ) -> vec3 { // reuse the point light calculations - let point_light = point_light(light_id, input, enable_diffuse); + let point_light = point_light(light_id, input, enable_diffuse, false); let light = &view_bindings::clusterable_objects.data[light_id]; @@ -584,7 +669,27 @@ fn spot_light( let attenuation = saturate(cd * (*light).light_custom_data.z + (*light).light_custom_data.w); let spot_attenuation = attenuation * attenuation; - return point_light * spot_attenuation; + var texture_sample = 1f; + +#ifdef LIGHT_TEXTURES + if (*light).decal_index != 0xFFFFFFFFu { + let local_position = (view_bindings::clustered_decals.decals[(*light).decal_index].local_from_world * + vec4((*input).P, 1.0)).xyz; + if local_position.z < 0.0 { + let decal_uv = (local_position.xy / (local_position.z * (*light).spot_light_tan_angle)) * vec2(-0.5, 0.5) + 0.5; + let image_index = view_bindings::clustered_decals.decals[(*light).decal_index].image_index; + + texture_sample = textureSampleLevel( + view_bindings::clustered_decal_textures[image_index], + view_bindings::clustered_decal_sampler, + decal_uv, + 0.0 + ).r; + } + } +#endif + + return point_light * spot_attenuation * texture_sample; } fn directional_light( @@ -641,5 +746,31 @@ fn directional_light( color = (diffuse + specular_light) * derived_input.NdotL; #endif // STANDARD_MATERIAL_CLEARCOAT - return color * (*light).color.rgb; + var texture_sample = 1f; + +#ifdef LIGHT_TEXTURES + if (*light).decal_index != 0xFFFFFFFFu { + let local_position = (view_bindings::clustered_decals.decals[(*light).decal_index].local_from_world * + vec4((*input).P, 1.0)).xyz; + let decal_uv = local_position.xy * vec2(-0.5, 0.5) + 0.5; + + // if tiled or within tile + if (view_bindings::clustered_decals.decals[(*light).decal_index].tag != 0u) + || all(clamp(decal_uv, vec2(0.0), vec2(1.0)) == decal_uv) + { + let image_index = view_bindings::clustered_decals.decals[(*light).decal_index].image_index; + + texture_sample = textureSampleLevel( + view_bindings::clustered_decal_textures[image_index], + view_bindings::clustered_decal_sampler, + decal_uv - floor(decal_uv), + 0.0 + ).r; + } else { + texture_sample = 0f; + } + } +#endif + + return color * (*light).color.rgb * texture_sample; } diff --git a/docs/cargo_features.md b/docs/cargo_features.md index 0b12f1ffec..70030ce26d 100644 --- a/docs/cargo_features.md +++ b/docs/cargo_features.md @@ -100,6 +100,8 @@ The default feature set enables most of the expected features of a game engine, |minimp3|MP3 audio format support (through minimp3)| |mp3|MP3 audio format support| |pbr_anisotropy_texture|Enable support for anisotropy texture in the `StandardMaterial`, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs| +|pbr_clustered_decals|Enable support for Clustered Decals| +|pbr_light_textures|Enable support for Light Textures| |pbr_multi_layer_material_textures|Enable support for multi-layer material textures in the `StandardMaterial`, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs| |pbr_specular_textures|Enable support for specular textures in the `StandardMaterial`, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs| |pbr_transmission_textures|Enable support for transmission-related textures in the `StandardMaterial`, at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs| diff --git a/examples/3d/clustered_decals.rs b/examples/3d/clustered_decals.rs index 108efe586e..f8592d28c0 100644 --- a/examples/3d/clustered_decals.rs +++ b/examples/3d/clustered_decals.rs @@ -163,6 +163,12 @@ fn setup( mut meshes: ResMut>, mut materials: ResMut>>, ) { + // Error out if the clustered decals feature isn't enabled + if !cfg!(feature = "pbr_clustered_decals") { + eprintln!("Bevy was compiled without clustered decal support. Run with `--features=pbr_clustered_decals` to enable."); + process::exit(1); + } + // Error out if clustered decals aren't supported on the current platform. if !decal::clustered::clustered_decals_are_usable(&render_device, &render_adapter) { eprintln!("Clustered decals aren't usable on this platform."); diff --git a/examples/3d/light_textures.rs b/examples/3d/light_textures.rs new file mode 100644 index 0000000000..be221101b6 --- /dev/null +++ b/examples/3d/light_textures.rs @@ -0,0 +1,706 @@ +//! Demonstrates light textures, which modulate light sources. + +use std::f32::consts::{FRAC_PI_2, FRAC_PI_3, FRAC_PI_4, PI}; +use std::fmt::{self, Formatter}; +use std::process; + +use bevy::{ + color::palettes::css::{SILVER, YELLOW}, + input::mouse::AccumulatedMouseMotion, + pbr::{ + decal::{ + self, + clustered::{DirectionalLightTexture, PointLightTexture, SpotLightTexture}, + }, + NotShadowCaster, + }, + prelude::*, + render::renderer::{RenderAdapter, RenderDevice}, + window::SystemCursorIcon, + winit::cursor::CursorIcon, +}; +use light_consts::lux::{AMBIENT_DAYLIGHT, CLEAR_SUNRISE}; +use ops::{acos, cos, sin}; +use widgets::{ + WidgetClickEvent, WidgetClickSender, BUTTON_BORDER, BUTTON_BORDER_COLOR, + BUTTON_BORDER_RADIUS_SIZE, BUTTON_PADDING, +}; + +#[path = "../helpers/widgets.rs"] +mod widgets; + +/// The speed at which the cube rotates, in radians per frame. +const CUBE_ROTATION_SPEED: f32 = 0.02; + +/// The speed at which the selection can be moved, in spherical coordinate +/// radians per mouse unit. +const MOVE_SPEED: f32 = 0.008; +/// The speed at which the selection can be scaled, in reciprocal mouse units. +const SCALE_SPEED: f32 = 0.05; +/// The speed at which the selection can be scaled, in radians per mouse unit. +const ROLL_SPEED: f32 = 0.01; + +/// Various settings for the demo. +#[derive(Resource, Default)] +struct AppStatus { + /// The object that will be moved, scaled, or rotated when the mouse is + /// dragged. + selection: Selection, + /// What happens when the mouse is dragged: one of a move, rotate, or scale + /// operation. + drag_mode: DragMode, +} + +/// The object that will be moved, scaled, or rotated when the mouse is dragged. +#[derive(Clone, Copy, Component, Default, PartialEq)] +enum Selection { + /// The camera. + /// + /// The camera can only be moved, not scaled or rotated. + #[default] + Camera, + /// The spotlight, which uses a torch-like light texture + SpotLight, + /// The point light, which uses a light texture cubemap constructed from the faces mesh + PointLight, + /// The directional light, which uses a caustic-like texture + DirectionalLight, +} + +impl fmt::Display for Selection { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match *self { + Selection::Camera => f.write_str("camera"), + Selection::SpotLight => f.write_str("spotlight"), + Selection::PointLight => f.write_str("point light"), + Selection::DirectionalLight => f.write_str("directional light"), + } + } +} + +/// What happens when the mouse is dragged: one of a move, rotate, or scale +/// operation. +#[derive(Clone, Copy, Component, Default, PartialEq, Debug)] +enum DragMode { + /// The mouse moves the current selection. + #[default] + Move, + /// The mouse scales the current selection. + /// + /// This only applies to decals, not cameras. + Scale, + /// The mouse rotates the current selection around its local Z axis. + /// + /// This only applies to decals, not cameras. + Roll, +} + +impl fmt::Display for DragMode { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match *self { + DragMode::Move => f.write_str("move"), + DragMode::Scale => f.write_str("scale"), + DragMode::Roll => f.write_str("roll"), + } + } +} + +/// A marker component for the help text in the top left corner of the window. +#[derive(Clone, Copy, Component)] +struct HelpText; + +/// Entry point. +fn main() { + App::new() + .add_plugins(DefaultPlugins.set(WindowPlugin { + primary_window: Some(Window { + title: "Bevy Light Textures Example".into(), + ..default() + }), + ..default() + })) + .init_resource::() + .add_event::>() + .add_event::>() + .add_systems(Startup, setup) + .add_systems(Update, draw_gizmos) + .add_systems(Update, rotate_cube) + .add_systems(Update, hide_shadows) + .add_systems(Update, widgets::handle_ui_interactions::) + .add_systems(Update, widgets::handle_ui_interactions::) + .add_systems( + Update, + (handle_selection_change, update_radio_buttons) + .after(widgets::handle_ui_interactions::) + .after(widgets::handle_ui_interactions::), + ) + .add_systems(Update, toggle_visibility) + .add_systems(Update, update_directional_light) + .add_systems(Update, process_move_input) + .add_systems(Update, process_scale_input) + .add_systems(Update, process_roll_input) + .add_systems(Update, switch_drag_mode) + .add_systems(Update, update_help_text) + .add_systems(Update, update_button_visibility) + .run(); +} + +/// Creates the scene. +fn setup( + mut commands: Commands, + asset_server: Res, + app_status: Res, + render_device: Res, + render_adapter: Res, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + // Error out if the light textures feature isn't enabled + if !cfg!(feature = "pbr_light_textures") { + eprintln!("Bevy was compiled without light texture support. Run with `--features=pbr_light_textures` to enable."); + process::exit(1); + } + + // Error out if clustered decals (and so light textures) aren't supported on the current platform. + if !decal::clustered::clustered_decals_are_usable(&render_device, &render_adapter) { + eprintln!("Light textures aren't usable on this platform."); + process::exit(1); + } + + spawn_cubes(&mut commands, &mut meshes, &mut materials); + spawn_camera(&mut commands); + spawn_light(&mut commands, &asset_server); + spawn_buttons(&mut commands); + spawn_help_text(&mut commands, &app_status); + spawn_light_textures(&mut commands, &asset_server, &mut meshes, &mut materials); +} + +#[derive(Component)] +struct Rotate; + +/// Spawns the cube onto which the decals are projected. +fn spawn_cubes( + commands: &mut Commands, + meshes: &mut Assets, + materials: &mut Assets, +) { + // Rotate the cube a bit just to make it more interesting. + let mut transform = Transform::IDENTITY; + transform.rotate_y(FRAC_PI_3); + + commands.spawn(( + Mesh3d(meshes.add(Cuboid::new(3.0, 3.0, 3.0))), + MeshMaterial3d(materials.add(StandardMaterial { + base_color: SILVER.into(), + ..default() + })), + transform, + Rotate, + )); + + commands.spawn(( + Mesh3d(meshes.add(Cuboid::new(-13.0, -13.0, -13.0))), + MeshMaterial3d(materials.add(StandardMaterial { + base_color: SILVER.into(), + ..default() + })), + transform, + )); +} + +/// Spawns the directional light. +fn spawn_light(commands: &mut Commands, asset_server: &AssetServer) { + commands + .spawn(( + Visibility::Hidden, + Transform::from_xyz(8.0, 8.0, 4.0).looking_at(Vec3::ZERO, Vec3::Y), + Selection::DirectionalLight, + )) + .with_child(( + DirectionalLight { + illuminance: AMBIENT_DAYLIGHT, + ..default() + }, + DirectionalLightTexture { + image: asset_server.load("lightmaps/caustic_directional_texture.png"), + tiled: true, + }, + Visibility::Visible, + )); +} + +/// Spawns the camera. +fn spawn_camera(commands: &mut Commands) { + commands + .spawn(Camera3d::default()) + .insert(Transform::from_xyz(0.0, 2.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y)) + // Tag the camera with `Selection::Camera`. + .insert(Selection::Camera); +} + +fn spawn_light_textures( + commands: &mut Commands, + asset_server: &AssetServer, + meshes: &mut Assets, + materials: &mut Assets, +) { + commands.spawn(( + SpotLight { + color: Color::srgb(1.0, 1.0, 0.8), + intensity: 10e6, + outer_angle: 0.25, + inner_angle: 0.25, + shadows_enabled: true, + ..default() + }, + Transform::from_translation(Vec3::new(6.0, 1.0, 2.0)).looking_at(Vec3::ZERO, Vec3::Y), + SpotLightTexture { + image: asset_server.load("lightmaps/torch_spotlight_texture.png"), + }, + Visibility::Inherited, + Selection::SpotLight, + )); + + commands + .spawn(( + Visibility::Hidden, + Transform::from_translation(Vec3::new(0.0, 1.8, 0.01)).with_scale(Vec3::splat(0.1)), + Selection::PointLight, + )) + .with_children(|parent| { + parent.spawn(SceneRoot( + asset_server.load(GltfAssetLabel::Scene(0).from_asset("models/Faces/faces.glb")), + )); + + parent.spawn(( + Mesh3d(meshes.add(Sphere::new(1.0))), + MeshMaterial3d(materials.add(StandardMaterial { + emissive: Color::srgb(0.0, 0.0, 300.0).to_linear(), + ..default() + })), + )); + + parent.spawn(( + PointLight { + color: Color::srgb(0.0, 0.0, 1.0), + intensity: 1e6, + shadows_enabled: true, + ..default() + }, + PointLightTexture { + image: asset_server.load("lightmaps/faces_pointlight_texture_blurred.png"), + cubemap_layout: decal::clustered::CubemapLayout::CrossVertical, + }, + )); + }); +} + +/// Spawns the buttons at the bottom of the screen. +fn spawn_buttons(commands: &mut Commands) { + // Spawn the radio buttons that allow the user to select an object to + // control. + commands + .spawn(widgets::main_ui_node()) + .with_children(|parent| { + widgets::spawn_option_buttons( + parent, + "Drag to Move", + &[ + (Selection::Camera, "Camera"), + (Selection::SpotLight, "Spotlight"), + (Selection::PointLight, "Point Light"), + (Selection::DirectionalLight, "Directional Light"), + ], + ); + }); + + // Spawn the drag buttons that allow the user to control the scale and roll + // of the selected object. + commands + .spawn(Node { + flex_direction: FlexDirection::Row, + position_type: PositionType::Absolute, + right: Val::Px(10.0), + bottom: Val::Px(10.0), + column_gap: Val::Px(6.0), + ..default() + }) + .with_children(|parent| { + widgets::spawn_option_buttons( + parent, + "", + &[ + (Visibility::Inherited, "Show"), + (Visibility::Hidden, "Hide"), + ], + ); + spawn_drag_button(parent, "Scale").insert(DragMode::Scale); + spawn_drag_button(parent, "Roll").insert(DragMode::Roll); + }); +} + +/// Spawns a button that the user can drag to change a parameter. +fn spawn_drag_button<'a>( + commands: &'a mut ChildSpawnerCommands, + label: &str, +) -> EntityCommands<'a> { + let mut kid = commands.spawn(Node { + border: BUTTON_BORDER, + justify_content: JustifyContent::Center, + align_items: AlignItems::Center, + padding: BUTTON_PADDING, + ..default() + }); + kid.insert(( + Button, + BackgroundColor(Color::BLACK), + BorderRadius::all(BUTTON_BORDER_RADIUS_SIZE), + BUTTON_BORDER_COLOR, + )) + .with_children(|parent| { + widgets::spawn_ui_text(parent, label, Color::WHITE); + }); + kid +} + +/// Spawns the help text at the top of the screen. +fn spawn_help_text(commands: &mut Commands, app_status: &AppStatus) { + commands.spawn(( + Text::new(create_help_string(app_status)), + Node { + position_type: PositionType::Absolute, + top: Val::Px(12.0), + left: Val::Px(12.0), + ..default() + }, + HelpText, + )); +} + +/// Draws the outlines that show the bounds of the spotlight. +fn draw_gizmos(mut gizmos: Gizmos, spotlight: Query<(&GlobalTransform, &SpotLight, &Visibility)>) { + if let Ok((global_transform, spotlight, visibility)) = spotlight.single() { + if visibility != Visibility::Hidden { + gizmos.primitive_3d( + &Cone::new(7.0 * spotlight.outer_angle, 7.0), + Isometry3d { + rotation: global_transform.rotation() * Quat::from_rotation_x(FRAC_PI_2), + translation: global_transform.translation_vec3a() * 0.5, + }, + YELLOW, + ); + } + } +} + +/// Rotates the cube a bit every frame. +fn rotate_cube(mut meshes: Query<&mut Transform, With>) { + for mut transform in &mut meshes { + transform.rotate_y(CUBE_ROTATION_SPEED); + } +} + +/// Hide shadows on all meshes except the main cube +fn hide_shadows( + mut commands: Commands, + meshes: Query, Without, Without)>, +) { + for ent in &meshes { + commands.entity(ent).insert(NotShadowCaster); + } +} + +/// Updates the state of the radio buttons when the user clicks on one. +fn update_radio_buttons( + mut widgets: Query<( + Entity, + Option<&mut BackgroundColor>, + Has, + &WidgetClickSender, + )>, + app_status: Res, + mut writer: TextUiWriter, + visible: Query<(&Visibility, &Selection)>, + mut visibility_widgets: Query< + ( + Entity, + Option<&mut BackgroundColor>, + Has, + &WidgetClickSender, + ), + Without>, + >, +) { + for (entity, maybe_bg_color, has_text, sender) in &mut widgets { + let selected = app_status.selection == **sender; + if let Some(mut bg_color) = maybe_bg_color { + widgets::update_ui_radio_button(&mut bg_color, selected); + } + if has_text { + widgets::update_ui_radio_button_text(entity, &mut writer, selected); + } + } + + let visibility = visible + .iter() + .filter(|(_, selection)| **selection == app_status.selection) + .map(|(visibility, _)| *visibility) + .next() + .unwrap_or_default(); + for (entity, maybe_bg_color, has_text, sender) in &mut visibility_widgets { + if let Some(mut bg_color) = maybe_bg_color { + widgets::update_ui_radio_button(&mut bg_color, **sender == visibility); + } + if has_text { + widgets::update_ui_radio_button_text(entity, &mut writer, **sender == visibility); + } + } +} + +/// Changes the selection when the user clicks a radio button. +fn handle_selection_change( + mut events: EventReader>, + mut app_status: ResMut, +) { + for event in events.read() { + app_status.selection = **event; + } +} + +fn toggle_visibility( + mut events: EventReader>, + app_status: Res, + mut visibility: Query<(&mut Visibility, &Selection)>, +) { + if let Some(vis) = events.read().last() { + for (mut visibility, selection) in visibility.iter_mut() { + if selection == &app_status.selection { + *visibility = **vis; + } + } + } +} + +/// Process a drag event that moves the selected object. +fn process_move_input( + mut selections: Query<(&mut Transform, &Selection)>, + mouse_buttons: Res>, + mouse_motion: Res, + app_status: Res, +) { + // Only process drags when movement is selected. + if !mouse_buttons.pressed(MouseButton::Left) || app_status.drag_mode != DragMode::Move { + return; + } + + for (mut transform, selection) in &mut selections { + if app_status.selection != *selection { + continue; + } + + // use simple movement for the point light + if *selection == Selection::PointLight { + transform.translation += + (mouse_motion.delta * Vec2::new(1.0, -1.0) * MOVE_SPEED).extend(0.0); + return; + } + + let position = transform.translation; + + // Convert to spherical coordinates. + let radius = position.length(); + let mut theta = acos(position.y / radius); + let mut phi = position.z.signum() * acos(position.x * position.xz().length_recip()); + + // Camera movement is the inverse of object movement. + let (phi_factor, theta_factor) = match *selection { + Selection::Camera => (1.0, -1.0), + _ => (-1.0, 1.0), + }; + + // Adjust the spherical coordinates. Clamp the inclination to (0, π). + phi += phi_factor * mouse_motion.delta.x * MOVE_SPEED; + theta = f32::clamp( + theta + theta_factor * mouse_motion.delta.y * MOVE_SPEED, + 0.001, + PI - 0.001, + ); + + // Convert spherical coordinates back to Cartesian coordinates. + transform.translation = + radius * vec3(sin(theta) * cos(phi), cos(theta), sin(theta) * sin(phi)); + + // Look at the center, but preserve the previous roll angle. + let roll = transform.rotation.to_euler(EulerRot::YXZ).2; + transform.look_at(Vec3::ZERO, Vec3::Y); + let (yaw, pitch, _) = transform.rotation.to_euler(EulerRot::YXZ); + transform.rotation = Quat::from_euler(EulerRot::YXZ, yaw, pitch, roll); + } +} + +/// Processes a drag event that scales the selected target. +fn process_scale_input( + mut scale_selections: Query<(&mut Transform, &Selection)>, + mut spotlight_selections: Query<(&mut SpotLight, &Selection)>, + mouse_buttons: Res>, + mouse_motion: Res, + app_status: Res, +) { + // Only process drags when the scaling operation is selected. + if !mouse_buttons.pressed(MouseButton::Left) || app_status.drag_mode != DragMode::Scale { + return; + } + + for (mut transform, selection) in &mut scale_selections { + if app_status.selection == *selection { + transform.scale *= 1.0 + mouse_motion.delta.x * SCALE_SPEED; + } + } + + for (mut spotlight, selection) in &mut spotlight_selections { + if app_status.selection == *selection { + spotlight.outer_angle = + (spotlight.outer_angle * (1.0 + mouse_motion.delta.x * SCALE_SPEED)).min(FRAC_PI_4); + spotlight.inner_angle = spotlight.outer_angle; + } + } +} + +/// Processes a drag event that rotates the selected target along its local Z +/// axis. +fn process_roll_input( + mut selections: Query<(&mut Transform, &Selection)>, + mouse_buttons: Res>, + mouse_motion: Res, + app_status: Res, +) { + // Only process drags when the rolling operation is selected. + if !mouse_buttons.pressed(MouseButton::Left) || app_status.drag_mode != DragMode::Roll { + return; + } + + for (mut transform, selection) in &mut selections { + if app_status.selection != *selection { + continue; + } + + let (yaw, pitch, mut roll) = transform.rotation.to_euler(EulerRot::YXZ); + roll += mouse_motion.delta.x * ROLL_SPEED; + transform.rotation = Quat::from_euler(EulerRot::YXZ, yaw, pitch, roll); + } +} + +/// Creates the help string at the top left of the screen. +fn create_help_string(app_status: &AppStatus) -> String { + format!( + "Click and drag to {} {}", + app_status.drag_mode, app_status.selection + ) +} + +/// Changes the drag mode when the user hovers over the "Scale" and "Roll" +/// buttons in the lower right. +/// +/// If the user is hovering over no such button, this system changes the drag +/// mode back to its default value of [`DragMode::Move`]. +fn switch_drag_mode( + mut commands: Commands, + mut interactions: Query<(&Interaction, &DragMode)>, + mut windows: Query>, + mouse_buttons: Res>, + mut app_status: ResMut, +) { + if mouse_buttons.pressed(MouseButton::Left) { + return; + } + + for (interaction, drag_mode) in &mut interactions { + if *interaction != Interaction::Hovered { + continue; + } + + app_status.drag_mode = *drag_mode; + + // Set the cursor to provide the user with a nice visual hint. + for window in &mut windows { + commands + .entity(window) + .insert(CursorIcon::from(SystemCursorIcon::EwResize)); + } + return; + } + + app_status.drag_mode = DragMode::Move; + + for window in &mut windows { + commands.entity(window).remove::(); + } +} + +/// Updates the help text in the top left of the screen to reflect the current +/// selection and drag mode. +fn update_help_text(mut help_text: Query<&mut Text, With>, app_status: Res) { + for mut text in &mut help_text { + text.0 = create_help_string(&app_status); + } +} + +/// Updates the visibility of the drag mode buttons so that they aren't visible +/// if the camera is selected. +fn update_button_visibility( + mut nodes: Query<&mut Visibility, Or<(With, With>)>>, + app_status: Res, +) { + for mut visibility in &mut nodes { + *visibility = match app_status.selection { + Selection::Camera => Visibility::Hidden, + _ => Visibility::Visible, + }; + } +} + +fn update_directional_light( + mut commands: Commands, + asset_server: Res, + selections: Query<(&Selection, &Visibility)>, + mut light: Query<( + Entity, + &mut DirectionalLight, + Option<&DirectionalLightTexture>, + )>, +) { + let directional_visible = selections + .iter() + .filter(|(selection, _)| **selection == Selection::DirectionalLight) + .any(|(_, visibility)| visibility != Visibility::Hidden); + let any_texture_light_visible = selections + .iter() + .filter(|(selection, _)| { + **selection == Selection::PointLight || **selection == Selection::SpotLight + }) + .any(|(_, visibility)| visibility != Visibility::Hidden); + + let (entity, mut light, maybe_texture) = light + .single_mut() + .expect("there should be a single directional light"); + + if directional_visible { + light.illuminance = AMBIENT_DAYLIGHT; + if maybe_texture.is_none() { + commands.entity(entity).insert(DirectionalLightTexture { + image: asset_server.load("lightmaps/caustic_directional_texture.png"), + tiled: true, + }); + } + } else if any_texture_light_visible { + light.illuminance = CLEAR_SUNRISE; + if maybe_texture.is_some() { + commands.entity(entity).remove::(); + } + } else { + light.illuminance = AMBIENT_DAYLIGHT; + if maybe_texture.is_some() { + commands.entity(entity).remove::(); + } + } +} diff --git a/examples/README.md b/examples/README.md index a8b9bfb3b4..31d777afed 100644 --- a/examples/README.md +++ b/examples/README.md @@ -160,6 +160,7 @@ Example | Description [Fog volumes](../examples/3d/fog_volumes.rs) | Demonstrates fog volumes [Generate Custom Mesh](../examples/3d/generate_custom_mesh.rs) | Simple showcase of how to generate a custom mesh with a custom texture [Irradiance Volumes](../examples/3d/irradiance_volumes.rs) | Demonstrates irradiance volumes +[Light Textures](../examples/3d/light_textures.rs) | Demonstrates light textures [Lighting](../examples/3d/lighting.rs) | Illustrates various lighting options in a simple scene [Lightmaps](../examples/3d/lightmaps.rs) | Rendering a scene with baked lightmaps [Lines](../examples/3d/lines.rs) | Create a custom material to draw 3d lines From 5d736a525cc65148e0b3b75c8d03aa12c2916e44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:07:33 +0000 Subject: [PATCH 30/68] Bump super-linter/super-linter from 7.3.0 to 7.4.0 (#19288) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [super-linter/super-linter](https://github.com/super-linter/super-linter) from 7.3.0 to 7.4.0.

Release notes

Sourced from super-linter/super-linter's releases.

v7.4.0

7.4.0 (2025-05-13)

🚀 Features

🐛 Bugfixes

⬆️ Dependency updates

  • bundler: bump the rubocop group in /dependencies with 10 updates (#6661) (2757a99)
  • bundler: bump the rubocop group in /dependencies with 4 updates (#6782) (17cf935)
  • docker: bump python in the docker-base-images group (#6723) (960298b)
  • docker: bump the docker group across 1 directory with 17 updates (#6776) (8b602a4)
  • java: bump com.google.googlejavaformat:google-java-format (#6780) (aa3f3f8)
  • java: bump com.puppycrawl.tools:checkstyle (#6639) (59f2b6b)
  • npm: bump @​babel/eslint-parser in /dependencies (#6762) (fd53895)
  • npm: bump @​babel/runtime-corejs3 (#6651) (8fbf79e)
  • npm: bump @​stoplight/spectral-cli in /dependencies (#6742) (56355b5)
  • npm: bump asl-validator from 3.13.0 to 3.14.0 in /dependencies (#6631) (30aa4b3)
  • npm: bump asl-validator from 3.14.0 to 3.15.0 in /dependencies (#6777) (660f7dc)
  • npm: bump next (#6676) (f171ee5)
  • npm: bump next (#6708) (43faf95)
  • npm: bump next (#6729) (536538a)
  • npm: bump npm-groovy-lint from 15.1.0 to 15.2.0 in /dependencies (#6779) (c19a3da)
  • npm: bump prettier from 3.5.2 to 3.5.3 in /dependencies (#6629) (6864c8c)

... (truncated)

Changelog

Sourced from super-linter/super-linter's changelog.

7.4.0 (2025-05-13)

🚀 Features

🐛 Bugfixes

⬆️ Dependency updates

  • bundler: bump the rubocop group in /dependencies with 10 updates (#6661) (2757a99)
  • bundler: bump the rubocop group in /dependencies with 4 updates (#6782) (17cf935)
  • docker: bump python in the docker-base-images group (#6723) (960298b)
  • docker: bump the docker group across 1 directory with 17 updates (#6776) (8b602a4)
  • java: bump com.google.googlejavaformat:google-java-format (#6780) (aa3f3f8)
  • java: bump com.puppycrawl.tools:checkstyle (#6639) (59f2b6b)
  • npm: bump @​babel/eslint-parser in /dependencies (#6762) (fd53895)
  • npm: bump @​babel/runtime-corejs3 (#6651) (8fbf79e)
  • npm: bump @​stoplight/spectral-cli in /dependencies (#6742) (56355b5)
  • npm: bump asl-validator from 3.13.0 to 3.14.0 in /dependencies (#6631) (30aa4b3)
  • npm: bump asl-validator from 3.14.0 to 3.15.0 in /dependencies (#6777) (660f7dc)
  • npm: bump next (#6676) (f171ee5)
  • npm: bump next (#6708) (43faf95)
  • npm: bump next (#6729) (536538a)
  • npm: bump npm-groovy-lint from 15.1.0 to 15.2.0 in /dependencies (#6779) (c19a3da)
  • npm: bump prettier from 3.5.2 to 3.5.3 in /dependencies (#6629) (6864c8c)
  • npm: bump renovate from 39.179.1 to 40.3.4 in /dependencies (#6763) (5e7e921)

... (truncated)

Commits
  • 1215045 chore(main): release 7.4.0 (#6634)
  • 8b602a4 deps(docker): bump the docker group across 1 directory with 17 updates (#6776)
  • f8df7f6 deps(npm): bump the stylelint group across 1 directory with 3 updates (#6775)
  • 660f7dc deps(npm): bump asl-validator from 3.14.0 to 3.15.0 in /dependencies (#6777)
  • 25d4ced deps(npm): bump renovate from 40.10.4 to 40.11.8 in /dependencies (#6778)
  • c19a3da deps(npm): bump npm-groovy-lint from 15.1.0 to 15.2.0 in /dependencies (#6779)
  • aa3f3f8 deps(java): bump com.google.googlejavaformat:google-java-format (#6780)
  • e154957 deps(python): bump the pip group across 1 directory with 3 updates (#6781)
  • 17cf935 deps(bundler): bump the rubocop group in /dependencies with 4 updates (#6782)
  • 2757a99 deps(bundler): bump the rubocop group in /dependencies with 10 updates (#6661)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=super-linter/super-linter&package-manager=github_actions&previous-version=7.3.0&new-version=7.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) You can trigger a rebase of this PR by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
> **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28a3c16a5b..97a8b6edba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -260,7 +260,7 @@ jobs: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 - name: Run Markdown Lint - uses: super-linter/super-linter/slim@v7.3.0 + uses: super-linter/super-linter/slim@v7.4.0 env: MULTI_STATUS: false VALIDATE_ALL_CODEBASE: false From 6eb6afeb2dfea943dd24f9d3d2a7cd994b83ed5c Mon Sep 17 00:00:00 2001 From: Guillaume Wafo-Tapa <43912646+gwafotapa@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:13:38 +0200 Subject: [PATCH 31/68] Spawn batch with relationship (#19519) # Objective Fixes #19356 Issue: Spawning a batch of entities in relationship with the same target adds the relationship between the target and only the last entity of the batch. `spawn_batch` flushes only after having spawned all entities. This means each spawned entity will have run the `on_insert` hook of its `Relationship` component. Here is the relevant part of that hook: ```Rust if let Some(mut relationship_target) = target_entity_mut.get_mut::() { relationship_target.collection_mut_risky().add(entity); } else { let mut target = ::with_capacity(1); target.collection_mut_risky().add(entity); world.commands().entity(target_entity).insert(target); } ``` Given the above snippet and since there's no flush between spawns, each entity finds the target without a `RelationshipTarget` component and defers the insertion of that component with the entity's id as the sole member of its collection. When the commands are finally flushed, each insertion after the first replaces the one before and in the process triggers the `on_replace` hook of `RelationshipTarget` which removes the `Relationship` component from the corresponding entity. That's how we end up in the invalid state. ## Solution I see two possible solutions 1. Flush after every spawn 2. Defer the whole code snippet above I don't know enough about bevy as a whole but 2. seems much more efficient to me. This is what I'm proposing here. I have a doubt though because I've started to look at #19348 that 1. would fix as well. ## Testing I added a test for the issue. I've put it in `relationship/mod.rs` but I could see it in `world/spawn_batch.rs` or `lib.rs` because the test is as much about `spawn_batch` as it is about relationships. --- crates/bevy_ecs/src/relationship/mod.rs | 55 +++++++++++++++++++------ 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/crates/bevy_ecs/src/relationship/mod.rs b/crates/bevy_ecs/src/relationship/mod.rs index 12def083bd..f95214262b 100644 --- a/crates/bevy_ecs/src/relationship/mod.rs +++ b/crates/bevy_ecs/src/relationship/mod.rs @@ -126,16 +126,18 @@ pub trait Relationship: Component + Sized { world.commands().entity(entity).remove::(); return; } - if let Ok(mut target_entity_mut) = world.get_entity_mut(target_entity) { - if let Some(mut relationship_target) = - target_entity_mut.get_mut::() - { - relationship_target.collection_mut_risky().add(entity); - } else { - let mut target = ::with_capacity(1); - target.collection_mut_risky().add(entity); - world.commands().entity(target_entity).insert(target); - } + if let Ok(mut entity_commands) = world.commands().get_entity(target_entity) { + // Deferring is necessary for batch mode + entity_commands + .entry::() + .and_modify(move |mut relationship_target| { + relationship_target.collection_mut_risky().add(entity); + }) + .or_insert_with(|| { + let mut target = Self::RelationshipTarget::with_capacity(1); + target.collection_mut_risky().add(entity); + target + }); } else { warn!( "{}The {}({target_entity:?}) relationship on entity {entity:?} relates to an entity that does not exist. The invalid {} relationship has been removed.", @@ -323,6 +325,7 @@ pub enum RelationshipHookMode { #[cfg(test)] mod tests { + use crate::prelude::{ChildOf, Children}; use crate::world::World; use crate::{component::Component, entity::Entity}; use alloc::vec::Vec; @@ -418,8 +421,6 @@ mod tests { #[test] fn parent_child_relationship_with_custom_relationship() { - use crate::prelude::ChildOf; - #[derive(Component)] #[relationship(relationship_target = RelTarget)] struct Rel(Entity); @@ -474,4 +475,34 @@ mod tests { assert!(world.get_entity(child).is_err()); assert!(!world.entity(parent).contains::()); } + + #[test] + fn spawn_batch_with_relationship() { + let mut world = World::new(); + let parent = world.spawn_empty().id(); + let children = world + .spawn_batch((0..10).map(|_| ChildOf(parent))) + .collect::>(); + + for &child in &children { + assert!(world + .get::(child) + .is_some_and(|child_of| child_of.parent() == parent)); + } + assert!(world + .get::(parent) + .is_some_and(|children| children.len() == 10)); + } + + #[test] + fn insert_batch_with_relationship() { + let mut world = World::new(); + let parent = world.spawn_empty().id(); + let child = world.spawn_empty().id(); + world.insert_batch([(child, ChildOf(parent))]); + world.flush(); + + assert!(world.get::(child).is_some()); + assert!(world.get::(parent).is_some()); + } } From 2ea8f779c36a8b1ab2dbd160366bedadcce48223 Mon Sep 17 00:00:00 2001 From: andriyDev Date: Mon, 30 Jun 2025 15:26:05 -0700 Subject: [PATCH 32/68] Prevent `AnimationGraph` from serializing `AssetId`s. (#19615) # Objective - A step towards #19024. - `AnimationGraph` can serialize raw `AssetId`s. However for normal handles, this is a runtime ID. This means it is unlikely that the `AssetId` will correspond to the same asset after deserializing - effectively breaking the graph. ## Solution - Stop allowing `AssetId` to be serialized by `AnimationGraph`. Serializing a handle with no path is now an error. - Add `MigrationSerializedAnimationClip`. This is an untagged enum for serde, meaning that it will take the first variant that deserializes. So it will first try the "modern" version, then it will fallback to the legacy version. - Add some logging/error messages to explain what users should do. Note: one limitation here is that this removes the ability to serialize and deserialize UUIDs. In theory, someone could be using this to have a "default" animation. If someone inserts an empty `AnimationClip` into the `Handle::default()`, this **might** produce a T-pose. It might also do nothing though. Unclear! I think this is worth the risk for simplicity as it seems unlikely that people are sticking UUIDs in here (or that you want a default animation in **any** AnimationGraph). ## Testing - Ran `cargo r --example animation_graph -- --save` on main, then ran `cargo r --example animation_graph` on this PR. The PR was able to load the old data (after #19631). --- assets/animation_graphs/Fox.animgraph.ron | 8 +- crates/bevy_animation/src/graph.rs | 193 ++++++++++++------ examples/animation/animation_graph.rs | 4 + .../animation_graph_no_more_asset_ids.md | 20 ++ 4 files changed, 162 insertions(+), 63 deletions(-) create mode 100644 release-content/migration-guides/animation_graph_no_more_asset_ids.md diff --git a/assets/animation_graphs/Fox.animgraph.ron b/assets/animation_graphs/Fox.animgraph.ron index e9d6f4f9cf..b91869b118 100644 --- a/assets/animation_graphs/Fox.animgraph.ron +++ b/assets/animation_graphs/Fox.animgraph.ron @@ -9,20 +9,20 @@ ( node_type: Blend, mask: 0, - weight: 1.0, + weight: 0.5, ), ( - node_type: Clip(AssetPath("models/animated/Fox.glb#Animation0")), + node_type: Clip("models/animated/Fox.glb#Animation0"), mask: 0, weight: 1.0, ), ( - node_type: Clip(AssetPath("models/animated/Fox.glb#Animation1")), + node_type: Clip("models/animated/Fox.glb#Animation1"), mask: 0, weight: 1.0, ), ( - node_type: Clip(AssetPath("models/animated/Fox.glb#Animation2")), + node_type: Clip("models/animated/Fox.glb#Animation2"), mask: 0, weight: 1.0, ), diff --git a/crates/bevy_animation/src/graph.rs b/crates/bevy_animation/src/graph.rs index a5f4041ac7..adb4a7c7ac 100644 --- a/crates/bevy_animation/src/graph.rs +++ b/crates/bevy_animation/src/graph.rs @@ -19,7 +19,7 @@ use bevy_ecs::{ system::{Res, ResMut}, }; use bevy_platform::collections::HashMap; -use bevy_reflect::{prelude::ReflectDefault, Reflect, ReflectSerialize}; +use bevy_reflect::{prelude::ReflectDefault, Reflect}; use derive_more::derive::From; use petgraph::{ graph::{DiGraph, NodeIndex}, @@ -29,6 +29,7 @@ use ron::de::SpannedError; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; use thiserror::Error; +use tracing::warn; use crate::{AnimationClip, AnimationTargetId}; @@ -108,9 +109,8 @@ use crate::{AnimationClip, AnimationTargetId}; /// [RON]: https://github.com/ron-rs/ron /// /// [RFC 51]: https://github.com/bevyengine/rfcs/blob/main/rfcs/51-animation-composition.md -#[derive(Asset, Reflect, Clone, Debug, Serialize)] -#[reflect(Serialize, Debug, Clone)] -#[serde(into = "SerializedAnimationGraph")] +#[derive(Asset, Reflect, Clone, Debug)] +#[reflect(Debug, Clone)] pub struct AnimationGraph { /// The `petgraph` data structure that defines the animation graph. pub graph: AnimationDiGraph, @@ -242,20 +242,40 @@ pub enum AnimationNodeType { #[derive(Default)] pub struct AnimationGraphAssetLoader; -/// Various errors that can occur when serializing or deserializing animation -/// graphs to and from RON, respectively. +/// Errors that can occur when serializing animation graphs to RON. +#[derive(Error, Debug)] +pub enum AnimationGraphSaveError { + /// An I/O error occurred. + #[error(transparent)] + Io(#[from] io::Error), + /// An error occurred in RON serialization. + #[error(transparent)] + Ron(#[from] ron::Error), + /// An error occurred converting the graph to its serialization form. + #[error(transparent)] + ConvertToSerialized(#[from] NonPathHandleError), +} + +/// Errors that can occur when deserializing animation graphs from RON. #[derive(Error, Debug)] pub enum AnimationGraphLoadError { /// An I/O error occurred. - #[error("I/O")] + #[error(transparent)] Io(#[from] io::Error), - /// An error occurred in RON serialization or deserialization. - #[error("RON serialization")] + /// An error occurred in RON deserialization. + #[error(transparent)] Ron(#[from] ron::Error), /// An error occurred in RON deserialization, and the location of the error /// is supplied. - #[error("RON serialization")] + #[error(transparent)] SpannedRon(#[from] SpannedError), + /// The deserialized graph contained legacy data that we no longer support. + #[error( + "The deserialized AnimationGraph contained an AnimationClip referenced by an AssetId, \ + which is no longer supported. Consider manually deserializing the SerializedAnimationGraph \ + type and determine how to migrate any SerializedAnimationClip::AssetId animation clips" + )] + GraphContainsLegacyAssetId, } /// Acceleration structures for animation graphs that allows Bevy to evaluate @@ -388,18 +408,32 @@ pub struct SerializedAnimationGraphNode { #[derive(Serialize, Deserialize)] pub enum SerializedAnimationNodeType { /// Corresponds to [`AnimationNodeType::Clip`]. - Clip(SerializedAnimationClip), + Clip(MigrationSerializedAnimationClip), /// Corresponds to [`AnimationNodeType::Blend`]. Blend, /// Corresponds to [`AnimationNodeType::Add`]. Add, } -/// A version of `Handle` suitable for serializing as an asset. +/// A type to facilitate migration from the legacy format of [`SerializedAnimationGraph`] to the +/// new format. /// -/// This replaces any handle that has a path with an [`AssetPath`]. Failing -/// that, the asset ID is serialized directly. +/// By using untagged serde deserialization, we can try to deserialize the modern form, then +/// fallback to the legacy form. Users must migrate to the modern form by Bevy 0.18. +// TODO: Delete this after Bevy 0.17. #[derive(Serialize, Deserialize)] +#[serde(untagged)] +pub enum MigrationSerializedAnimationClip { + /// This is the new type of this field. + Modern(AssetPath<'static>), + /// This is the legacy type of this field. Users must migrate away from this. + #[serde(skip_serializing)] + Legacy(SerializedAnimationClip), +} + +/// The legacy form of serialized animation clips. This allows raw asset IDs to be deserialized. +// TODO: Delete this after Bevy 0.17. +#[derive(Deserialize)] pub enum SerializedAnimationClip { /// Records an asset path. AssetPath(AssetPath<'static>), @@ -648,12 +682,13 @@ impl AnimationGraph { /// /// If writing to a file, it can later be loaded with the /// [`AnimationGraphAssetLoader`] to reconstruct the graph. - pub fn save(&self, writer: &mut W) -> Result<(), AnimationGraphLoadError> + pub fn save(&self, writer: &mut W) -> Result<(), AnimationGraphSaveError> where W: Write, { let mut ron_serializer = ron::ser::Serializer::new(writer, None)?; - Ok(self.serialize(&mut ron_serializer)?) + let serialized_graph: SerializedAnimationGraph = self.clone().try_into()?; + Ok(serialized_graph.serialize(&mut ron_serializer)?) } /// Adds an animation target (bone) to the mask group with the given ID. @@ -758,28 +793,55 @@ impl AssetLoader for AnimationGraphAssetLoader { let serialized_animation_graph = SerializedAnimationGraph::deserialize(&mut deserializer) .map_err(|err| deserializer.span_error(err))?; - // Load all `AssetPath`s to convert from a - // `SerializedAnimationGraph` to a real `AnimationGraph`. - Ok(AnimationGraph { - graph: serialized_animation_graph.graph.map( - |_, serialized_node| AnimationGraphNode { - node_type: match serialized_node.node_type { - SerializedAnimationNodeType::Clip(ref clip) => match clip { - SerializedAnimationClip::AssetId(asset_id) => { - AnimationNodeType::Clip(Handle::Weak(*asset_id)) + // Load all `AssetPath`s to convert from a `SerializedAnimationGraph` to a real + // `AnimationGraph`. This is effectively a `DiGraph::map`, but this allows us to return + // errors. + let mut animation_graph = DiGraph::with_capacity( + serialized_animation_graph.graph.node_count(), + serialized_animation_graph.graph.edge_count(), + ); + + let mut already_warned = false; + for serialized_node in serialized_animation_graph.graph.node_weights() { + animation_graph.add_node(AnimationGraphNode { + node_type: match serialized_node.node_type { + SerializedAnimationNodeType::Clip(ref clip) => match clip { + MigrationSerializedAnimationClip::Modern(path) => { + AnimationNodeType::Clip(load_context.load(path.clone())) + } + MigrationSerializedAnimationClip::Legacy( + SerializedAnimationClip::AssetPath(path), + ) => { + if !already_warned { + let path = load_context.asset_path(); + warn!( + "Loaded an AnimationGraph asset at \"{path}\" which contains a \ + legacy-style SerializedAnimationClip. Please re-save the asset \ + using AnimationGraph::save to automatically migrate to the new \ + format" + ); + already_warned = true; } - SerializedAnimationClip::AssetPath(asset_path) => { - AnimationNodeType::Clip(load_context.load(asset_path)) - } - }, - SerializedAnimationNodeType::Blend => AnimationNodeType::Blend, - SerializedAnimationNodeType::Add => AnimationNodeType::Add, + AnimationNodeType::Clip(load_context.load(path.clone())) + } + MigrationSerializedAnimationClip::Legacy( + SerializedAnimationClip::AssetId(_), + ) => { + return Err(AnimationGraphLoadError::GraphContainsLegacyAssetId); + } }, - mask: serialized_node.mask, - weight: serialized_node.weight, + SerializedAnimationNodeType::Blend => AnimationNodeType::Blend, + SerializedAnimationNodeType::Add => AnimationNodeType::Add, }, - |_, _| (), - ), + mask: serialized_node.mask, + weight: serialized_node.weight, + }); + } + for edge in serialized_animation_graph.graph.raw_edges() { + animation_graph.add_edge(edge.source(), edge.target(), ()); + } + Ok(AnimationGraph { + graph: animation_graph, root: serialized_animation_graph.root, mask_groups: serialized_animation_graph.mask_groups, }) @@ -790,37 +852,50 @@ impl AssetLoader for AnimationGraphAssetLoader { } } -impl From for SerializedAnimationGraph { - fn from(animation_graph: AnimationGraph) -> Self { - // If any of the animation clips have paths, then serialize them as - // `SerializedAnimationClip::AssetPath` so that the - // `AnimationGraphAssetLoader` can load them. - Self { - graph: animation_graph.graph.map( - |_, node| SerializedAnimationGraphNode { - weight: node.weight, - mask: node.mask, - node_type: match node.node_type { - AnimationNodeType::Clip(ref clip) => match clip.path() { - Some(path) => SerializedAnimationNodeType::Clip( - SerializedAnimationClip::AssetPath(path.clone()), - ), - None => SerializedAnimationNodeType::Clip( - SerializedAnimationClip::AssetId(clip.id()), - ), - }, - AnimationNodeType::Blend => SerializedAnimationNodeType::Blend, - AnimationNodeType::Add => SerializedAnimationNodeType::Add, +impl TryFrom for SerializedAnimationGraph { + type Error = NonPathHandleError; + + fn try_from(animation_graph: AnimationGraph) -> Result { + // Convert all the `Handle` to AssetPath, so that + // `AnimationGraphAssetLoader` can load them. This is effectively just doing a + // `DiGraph::map`, except we need to return an error if any handles aren't associated to a + // path. + let mut serialized_graph = DiGraph::with_capacity( + animation_graph.graph.node_count(), + animation_graph.graph.edge_count(), + ); + for node in animation_graph.graph.node_weights() { + serialized_graph.add_node(SerializedAnimationGraphNode { + weight: node.weight, + mask: node.mask, + node_type: match node.node_type { + AnimationNodeType::Clip(ref clip) => match clip.path() { + Some(path) => SerializedAnimationNodeType::Clip( + MigrationSerializedAnimationClip::Modern(path.clone()), + ), + None => return Err(NonPathHandleError), }, + AnimationNodeType::Blend => SerializedAnimationNodeType::Blend, + AnimationNodeType::Add => SerializedAnimationNodeType::Add, }, - |_, _| (), - ), + }); + } + for edge in animation_graph.graph.raw_edges() { + serialized_graph.add_edge(edge.source(), edge.target(), ()); + } + Ok(Self { + graph: serialized_graph, root: animation_graph.root, mask_groups: animation_graph.mask_groups, - } + }) } } +/// Error for when only path [`Handle`]s are supported. +#[derive(Error, Debug)] +#[error("AnimationGraph contains a handle to an AnimationClip that does not correspond to an asset path")] +pub struct NonPathHandleError; + /// A system that creates, updates, and removes [`ThreadedAnimationGraph`] /// structures for every changed [`AnimationGraph`]. /// diff --git a/examples/animation/animation_graph.rs b/examples/animation/animation_graph.rs index f420b05f38..f33c3850df 100644 --- a/examples/animation/animation_graph.rs +++ b/examples/animation/animation_graph.rs @@ -182,6 +182,10 @@ fn setup_assets_programmatically( .spawn(async move { use std::io::Write; + let animation_graph: SerializedAnimationGraph = animation_graph + .try_into() + .expect("The animation graph failed to convert to its serialized form"); + let serialized_graph = ron::ser::to_string_pretty(&animation_graph, PrettyConfig::default()) .expect("Failed to serialize the animation graph"); diff --git a/release-content/migration-guides/animation_graph_no_more_asset_ids.md b/release-content/migration-guides/animation_graph_no_more_asset_ids.md new file mode 100644 index 0000000000..068405614a --- /dev/null +++ b/release-content/migration-guides/animation_graph_no_more_asset_ids.md @@ -0,0 +1,20 @@ +--- +title: `AnimationGraph` no longer supports raw AssetIds. +pull_requests: [] +--- + +In previous versions of Bevy, `AnimationGraph` would serialize `Handle` as an asset +path, and if that wasn't available it would fallback to serializing `AssetId`. In +practice, this was not very useful. `AssetId` is (usually) a runtime-generated ID. This means for an +arbitrary `Handle`, it was incredibly unlikely that your handle before serialization +would correspond to the same asset as after serialization. + +This confusing behavior has been removed. As a side-effect, any `AnimationGraph`s you previously +saved (via `AnimationGraph::save`) will need to be re-saved. These legacy `AnimationGraph`s can +still be loaded until the next Bevy version. Loading and then saving the `AnimationGraph` again will +automatically migrate the `AnimationGraph`. + +If your `AnimationGraph` contained serialized `AssetId`s, you will need to manually load the bytes +of the saved graph, deserialize it into `SerializedAnimationGraph`, and then manually decide how to +migrate those `AssetId`s. Alternatively, you could simply rebuild the graph from scratch and save a +new instance. We expect this to be a very rare situation. From 38058965ef59d6b5938cf8d634ccfa6e16f9bce7 Mon Sep 17 00:00:00 2001 From: andriyDev Date: Mon, 30 Jun 2025 15:39:59 -0700 Subject: [PATCH 33/68] Restructure the logic in `AssetServer::load_internal` to avoid using weak handles. (#19634) # Objective - A step towards #19024. - The logic here was kinda complex before. ## Solution - I've restructured the logic here while preserving the behavior (as far as I can tell). - We no longer return the handle if it was passed in. The caller should already have access to it, and the returned handle will be a weak handle, not a strong handle (which can cause issues). This prevents us from needing weak handles at all here. - I verified the callers do not need the return value. The only callsite that needs the returned handle does not pass in the input_handle argument. ## Testing - CI --- crates/bevy_asset/src/server/mod.rs | 151 ++++++++++++++++------------ 1 file changed, 85 insertions(+), 66 deletions(-) diff --git a/crates/bevy_asset/src/server/mod.rs b/crates/bevy_asset/src/server/mod.rs index e5020dba75..0b64fe74e0 100644 --- a/crates/bevy_asset/src/server/mod.rs +++ b/crates/bevy_asset/src/server/mod.rs @@ -553,7 +553,9 @@ impl AssetServer { path: impl Into>, ) -> Result { let path: AssetPath = path.into(); - self.load_internal(None, path, false, None).await + self.load_internal(None, path, false, None) + .await + .map(|h| h.expect("handle must be returned, since we didn't pass in an input handle")) } pub(crate) fn load_unknown_type_with_meta_transform<'a>( @@ -643,21 +645,25 @@ impl AssetServer { /// Performs an async asset load. /// - /// `input_handle` must only be [`Some`] if `should_load` was true when retrieving `input_handle`. This is an optimization to - /// avoid looking up `should_load` twice, but it means you _must_ be sure a load is necessary when calling this function with [`Some`]. + /// `input_handle` must only be [`Some`] if `should_load` was true when retrieving + /// `input_handle`. This is an optimization to avoid looking up `should_load` twice, but it + /// means you _must_ be sure a load is necessary when calling this function with [`Some`]. + /// + /// Returns the handle of the asset if one was retrieved by this function. Otherwise, may return + /// [`None`]. async fn load_internal<'a>( &self, - mut input_handle: Option, + input_handle: Option, path: AssetPath<'a>, force: bool, meta_transform: Option, - ) -> Result { - let asset_type_id = input_handle.as_ref().map(UntypedHandle::type_id); + ) -> Result, AssetLoadError> { + let input_handle_type_id = input_handle.as_ref().map(UntypedHandle::type_id); let path = path.into_owned(); let path_clone = path.clone(); let (mut meta, loader, mut reader) = self - .get_meta_loader_and_reader(&path_clone, asset_type_id) + .get_meta_loader_and_reader(&path_clone, input_handle_type_id) .await .inspect_err(|e| { // if there was an input handle, a "load" operation has already started, so we must produce a "failure" event, if @@ -674,76 +680,90 @@ impl AssetServer { if let Some(meta_transform) = input_handle.as_ref().and_then(|h| h.meta_transform()) { (*meta_transform)(&mut *meta); } - // downgrade the input handle so we don't keep the asset alive just because we're loading it - // note we can't just pass a weak handle in, as only strong handles contain the asset meta transform - input_handle = input_handle.map(|h| h.clone_weak()); - // This contains Some(UntypedHandle), if it was retrievable - // If it is None, that is because it was _not_ retrievable, due to - // 1. The handle was not already passed in for this path, meaning we can't just use that - // 2. The asset has not been loaded yet, meaning there is no existing Handle for it - // 3. The path has a label, meaning the AssetLoader's root asset type is not the path's asset type - // - // In the None case, the only course of action is to wait for the asset to load so we can allocate the - // handle for that type. - // - // TODO: Note that in the None case, multiple asset loads for the same path can happen at the same time - // (rather than "early out-ing" in the "normal" case) - // This would be resolved by a universal asset id, as we would not need to resolve the asset type - // to generate the ID. See this issue: https://github.com/bevyengine/bevy/issues/10549 - let handle_result = match input_handle { - Some(handle) => { - // if a handle was passed in, the "should load" check was already done - Some((handle, true)) - } - None => { - let mut infos = self.data.infos.write(); - let result = infos.get_or_create_path_handle_internal( - path.clone(), - path.label().is_none().then(|| loader.asset_type_id()), - HandleLoadingMode::Request, - meta_transform, - ); - unwrap_with_context(result, Either::Left(loader.asset_type_name())) - } - }; + let asset_id; // The asset ID of the asset we are trying to load. + let fetched_handle; // The handle if one was looked up/created. + let should_load; // Whether we need to load the asset. + if let Some(input_handle) = input_handle { + asset_id = Some(input_handle.id()); + // In this case, we intentionally drop the input handle so we can cancel loading the + // asset if the handle gets dropped (externally) before it finishes loading. + fetched_handle = None; + // The handle was passed in, so the "should_load" check was already done. + should_load = true; + } else { + // TODO: multiple asset loads for the same path can happen at the same time (rather than + // "early out-ing" in the "normal" case). This would be resolved by a universal asset + // id, as we would not need to resolve the asset type to generate the ID. See this + // issue: https://github.com/bevyengine/bevy/issues/10549 - let handle = if let Some((handle, should_load)) = handle_result { - if path.label().is_none() && handle.type_id() != loader.asset_type_id() { + let mut infos = self.data.infos.write(); + let result = infos.get_or_create_path_handle_internal( + path.clone(), + path.label().is_none().then(|| loader.asset_type_id()), + HandleLoadingMode::Request, + meta_transform, + ); + match unwrap_with_context(result, Either::Left(loader.asset_type_name())) { + // We couldn't figure out the correct handle without its type ID (which can only + // happen if we are loading a subasset). + None => { + // We don't know the expected type since the subasset may have a different type + // than the "root" asset (which is the type the loader will load). + asset_id = None; + fetched_handle = None; + // If we couldn't find an appropriate handle, then the asset certainly needs to + // be loaded. + should_load = true; + } + Some((handle, result_should_load)) => { + asset_id = Some(handle.id()); + fetched_handle = Some(handle); + should_load = result_should_load; + } + } + } + // Verify that the expected type matches the loader's type. + if let Some(asset_type_id) = asset_id.map(|id| id.type_id()) { + // If we are loading a subasset, then the subasset's type almost certainly doesn't match + // the loader's type - and that's ok. + if path.label().is_none() && asset_type_id != loader.asset_type_id() { error!( "Expected {:?}, got {:?}", - handle.type_id(), + asset_type_id, loader.asset_type_id() ); return Err(AssetLoadError::RequestedHandleTypeMismatch { path: path.into_owned(), - requested: handle.type_id(), + requested: asset_type_id, actual_asset_name: loader.asset_type_name(), loader_name: loader.type_name(), }); } - if !should_load && !force { - return Ok(handle); - } - Some(handle) - } else { - None - }; - // if the handle result is None, we definitely need to load the asset + } + // Bail out earlier if we don't need to load the asset. + if !should_load && !force { + return Ok(fetched_handle); + } - let (base_handle, base_path) = if path.label().is_some() { + // We don't actually need to use _base_handle, but we do need to keep the handle alive. + // Dropping it would cancel the load of the base asset, which would make the load of this + // subasset never complete. + let (base_asset_id, _base_handle, base_path) = if path.label().is_some() { let mut infos = self.data.infos.write(); let base_path = path.without_label().into_owned(); - let (base_handle, _) = infos.get_or_create_path_handle_erased( - base_path.clone(), - loader.asset_type_id(), - Some(loader.asset_type_name()), - HandleLoadingMode::Force, - None, - ); - (base_handle, base_path) + let base_handle = infos + .get_or_create_path_handle_erased( + base_path.clone(), + loader.asset_type_id(), + Some(loader.asset_type_name()), + HandleLoadingMode::Force, + None, + ) + .0; + (base_handle.id(), Some(base_handle), base_path) } else { - (handle.clone().unwrap(), path.clone()) + (asset_id.unwrap(), None, path.clone()) }; match self @@ -760,7 +780,7 @@ impl AssetServer { Ok(loaded_asset) => { let final_handle = if let Some(label) = path.label_cow() { match loaded_asset.labeled_assets.get(&label) { - Some(labeled_asset) => labeled_asset.handle.clone(), + Some(labeled_asset) => Some(labeled_asset.handle.clone()), None => { let mut all_labels: Vec = loaded_asset .labeled_assets @@ -776,16 +796,15 @@ impl AssetServer { } } } else { - // if the path does not have a label, the handle must exist at this point - handle.unwrap() + fetched_handle }; - self.send_loaded_asset(base_handle.id(), loaded_asset); + self.send_loaded_asset(base_asset_id, loaded_asset); Ok(final_handle) } Err(err) => { self.send_asset_event(InternalAssetEvent::Failed { - id: base_handle.id(), + id: base_asset_id, error: err.clone(), path: path.into_owned(), }); From 169254b9384f14db89f5ea7bca488650677a0ecb Mon Sep 17 00:00:00 2001 From: Jannik Obermann <50554200+jannik4@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:46:44 +0200 Subject: [PATCH 34/68] Fix sprite picking viewport (#19747) # Objective Fixes sprite picking when using a viewport. Related to #19744. ## Solution - Do not substract `viewport.min` as `Camera::viewport_to_world` already does that. - Skip pointers outside the viewport. ## Testing Tested with the following example:
Click to expand code ```rust use bevy::{ prelude::*, render::camera::Viewport, window::SystemCursorIcon, winit::cursor::CursorIcon, }; fn main() -> AppExit { App::new() .add_plugins(DefaultPlugins) .add_systems(Startup, setup) .insert_resource(ClearColor(Color::BLACK)) .run() } fn setup(mut commands: Commands, window: Single<&Window>) { commands.spawn(( Camera2d, Camera { clear_color: ClearColorConfig::Custom(Color::WHITE), viewport: Some(Viewport { physical_position: UVec2::new( window.physical_width() / 4, window.physical_height() / 4, ), physical_size: UVec2::new( window.physical_width() / 2, window.physical_height() / 2, ), ..default() }), ..default() }, )); commands .spawn(( Transform::from_xyz(100.0, 100.0, 0.0), Sprite::from_color(Color::srgb(0.0, 1.0, 0.0), Vec2::new(200.0, 200.0)), Pickable::default(), )) .observe( |trigger: On>, mut transform: Query<&mut Transform>| { let mut transform = transform.get_mut(trigger.target()).unwrap(); transform.translation.x += trigger.delta.x; transform.translation.y -= trigger.delta.y; }, ) .observe( |_: On>, window: Single>, mut commands: Commands| { commands .entity(*window) .insert(CursorIcon::from(SystemCursorIcon::Grabbing)); }, ) .observe( |_: On>, window: Single>, mut commands: Commands| { commands.entity(*window).remove::(); }, ); } ```
--- crates/bevy_sprite/src/picking_backend.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/crates/bevy_sprite/src/picking_backend.rs b/crates/bevy_sprite/src/picking_backend.rs index bde1a34b63..cda9955b95 100644 --- a/crates/bevy_sprite/src/picking_backend.rs +++ b/crates/bevy_sprite/src/picking_backend.rs @@ -145,13 +145,15 @@ fn sprite_picking( continue; }; - let viewport_pos = camera - .logical_viewport_rect() - .map(|v| v.min) - .unwrap_or_default(); - let pos_in_viewport = location.position - viewport_pos; + let viewport_pos = location.position; + if let Some(viewport) = camera.logical_viewport_rect() { + if !viewport.contains(viewport_pos) { + // The pointer is outside the viewport, skip it + continue; + } + } - let Ok(cursor_ray_world) = camera.viewport_to_world(cam_transform, pos_in_viewport) else { + let Ok(cursor_ray_world) = camera.viewport_to_world(cam_transform, viewport_pos) else { continue; }; let cursor_ray_len = cam_ortho.far - cam_ortho.near; From 83afcb5a2b4581b1e28d3707837593acb4035c52 Mon Sep 17 00:00:00 2001 From: Jannik Obermann <50554200+jannik4@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:46:56 +0200 Subject: [PATCH 35/68] Fix ui picking outside the viewport (#19744) # Objective Fixes #19692 ## Solution - Skip pointers outside the viewport. ## Testing Tested with the following example:
Click to expand code ```rust use bevy::{ prelude::*, render::camera::Viewport, window::SystemCursorIcon, winit::cursor::CursorIcon, }; fn main() -> AppExit { App::new() .add_plugins(DefaultPlugins) .add_systems(Startup, setup) .insert_resource(ClearColor(Color::BLACK)) .run() } fn setup(mut commands: Commands, window: Single<&Window>) { // commands.spawn(( Camera2d, Camera { clear_color: ClearColorConfig::Custom(Color::WHITE), viewport: Some(Viewport { physical_position: UVec2::new( window.physical_width() / 4, window.physical_height() / 4, ), physical_size: UVec2::new( window.physical_width() / 2, window.physical_height() / 2, ), ..default() }), ..default() }, )); commands .spawn(( Node { top: Val::Px(100.0), left: Val::Px(100.0), width: Val::Px(200.0), height: Val::Px(200.0), ..default() }, BackgroundColor(Color::srgb(1.0, 0.0, 0.0)), )) .observe(|trigger: On>, mut node: Query<&mut Node>| { let mut node = node.get_mut(trigger.target()).unwrap(); node.left = Val::Px(px(node.left) + trigger.delta.x); node.top = Val::Px(px(node.top) + trigger.delta.y); }) .observe( |_: On>, window: Single>, mut commands: Commands| { commands .entity(*window) .insert(CursorIcon::from(SystemCursorIcon::Grabbing)); }, ) .observe( |_: On>, window: Single>, mut commands: Commands| { commands.entity(*window).remove::(); }, ); } fn px(val: Val) -> f32 { match val { Val::Px(px) => px, _ => 0.0, } } ```
## Additional information This is at least also broken on the sprite picking backend. I guess the fix for other backends are also trivial if this is correct. (Sprite picking: #19747) --- crates/bevy_ui/src/picking_backend.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/bevy_ui/src/picking_backend.rs b/crates/bevy_ui/src/picking_backend.rs index 5ca59ceeaf..ccd61a3807 100644 --- a/crates/bevy_ui/src/picking_backend.rs +++ b/crates/bevy_ui/src/picking_backend.rs @@ -140,6 +140,10 @@ pub fn ui_picking( let mut pointer_pos = pointer_location.position * camera_data.target_scaling_factor().unwrap_or(1.); if let Some(viewport) = camera_data.physical_viewport_rect() { + if !viewport.as_rect().contains(pointer_pos) { + // The pointer is outside the viewport, skip it + continue; + } pointer_pos -= viewport.min.as_vec2(); } pointer_pos_by_camera From 6367ad4c95bea64864626e9ed281e806bccc0d16 Mon Sep 17 00:00:00 2001 From: Giacomo Stevanato Date: Tue, 1 Jul 2025 00:50:39 +0200 Subject: [PATCH 36/68] Add benchmarks for spawning and inserting bundles (#19762) # Objective - Splitted off from https://github.com/bevyengine/bevy/pull/19491 - Add some benchmarks for spawning and inserting components. Right now these are pretty short, but it's expected that they will be extended when different kinds of dynamic bundles will be implemented. --- .../benches/bevy_ecs/bundles/insert_many.rs | 67 +++++++++++++++++++ benches/benches/bevy_ecs/bundles/mod.rs | 14 ++++ .../benches/bevy_ecs/bundles/spawn_many.rs | 40 +++++++++++ .../bevy_ecs/bundles/spawn_many_zst.rs | 27 ++++++++ .../benches/bevy_ecs/bundles/spawn_one_zst.rs | 24 +++++++ benches/benches/bevy_ecs/main.rs | 2 + 6 files changed, 174 insertions(+) create mode 100644 benches/benches/bevy_ecs/bundles/insert_many.rs create mode 100644 benches/benches/bevy_ecs/bundles/mod.rs create mode 100644 benches/benches/bevy_ecs/bundles/spawn_many.rs create mode 100644 benches/benches/bevy_ecs/bundles/spawn_many_zst.rs create mode 100644 benches/benches/bevy_ecs/bundles/spawn_one_zst.rs diff --git a/benches/benches/bevy_ecs/bundles/insert_many.rs b/benches/benches/bevy_ecs/bundles/insert_many.rs new file mode 100644 index 0000000000..2e9bfbd8b0 --- /dev/null +++ b/benches/benches/bevy_ecs/bundles/insert_many.rs @@ -0,0 +1,67 @@ +use benches::bench; +use bevy_ecs::{component::Component, world::World}; +use criterion::Criterion; + +const ENTITY_COUNT: usize = 2_000; + +#[derive(Component)] +struct C(usize); + +pub fn insert_many(criterion: &mut Criterion) { + let mut group = criterion.benchmark_group(bench!("insert_many")); + + group.bench_function("all", |bencher| { + let mut world = World::new(); + bencher.iter(|| { + for _ in 0..ENTITY_COUNT { + world + .spawn_empty() + .insert(C::<0>(1)) + .insert(C::<1>(1)) + .insert(C::<2>(1)) + .insert(C::<3>(1)) + .insert(C::<4>(1)) + .insert(C::<5>(1)) + .insert(C::<6>(1)) + .insert(C::<7>(1)) + .insert(C::<8>(1)) + .insert(C::<9>(1)) + .insert(C::<10>(1)) + .insert(C::<11>(1)) + .insert(C::<12>(1)) + .insert(C::<13>(1)) + .insert(C::<14>(1)); + } + world.clear_entities(); + }); + }); + + group.bench_function("only_last", |bencher| { + let mut world = World::new(); + bencher.iter(|| { + for _ in 0..ENTITY_COUNT { + world + .spawn(( + C::<0>(1), + C::<1>(1), + C::<2>(1), + C::<3>(1), + C::<4>(1), + C::<5>(1), + C::<6>(1), + C::<7>(1), + C::<8>(1), + C::<9>(1), + C::<10>(1), + C::<11>(1), + C::<12>(1), + C::<13>(1), + )) + .insert(C::<14>(1)); + } + world.clear_entities(); + }); + }); + + group.finish(); +} diff --git a/benches/benches/bevy_ecs/bundles/mod.rs b/benches/benches/bevy_ecs/bundles/mod.rs new file mode 100644 index 0000000000..21ef05eb3b --- /dev/null +++ b/benches/benches/bevy_ecs/bundles/mod.rs @@ -0,0 +1,14 @@ +use criterion::criterion_group; + +mod insert_many; +mod spawn_many; +mod spawn_many_zst; +mod spawn_one_zst; + +criterion_group!( + benches, + spawn_one_zst::spawn_one_zst, + spawn_many_zst::spawn_many_zst, + spawn_many::spawn_many, + insert_many::insert_many, +); diff --git a/benches/benches/bevy_ecs/bundles/spawn_many.rs b/benches/benches/bevy_ecs/bundles/spawn_many.rs new file mode 100644 index 0000000000..bd99cf3c56 --- /dev/null +++ b/benches/benches/bevy_ecs/bundles/spawn_many.rs @@ -0,0 +1,40 @@ +use benches::bench; +use bevy_ecs::{component::Component, world::World}; +use criterion::Criterion; + +const ENTITY_COUNT: usize = 2_000; + +#[derive(Component)] +struct C(usize); + +pub fn spawn_many(criterion: &mut Criterion) { + let mut group = criterion.benchmark_group(bench!("spawn_many")); + + group.bench_function("static", |bencher| { + let mut world = World::new(); + bencher.iter(|| { + for _ in 0..ENTITY_COUNT { + world.spawn(( + C::<0>(1), + C::<1>(1), + C::<2>(1), + C::<3>(1), + C::<4>(1), + C::<5>(1), + C::<6>(1), + C::<7>(1), + C::<8>(1), + C::<9>(1), + C::<10>(1), + C::<11>(1), + C::<12>(1), + C::<13>(1), + C::<14>(1), + )); + } + world.clear_entities(); + }); + }); + + group.finish(); +} diff --git a/benches/benches/bevy_ecs/bundles/spawn_many_zst.rs b/benches/benches/bevy_ecs/bundles/spawn_many_zst.rs new file mode 100644 index 0000000000..b4305f9e43 --- /dev/null +++ b/benches/benches/bevy_ecs/bundles/spawn_many_zst.rs @@ -0,0 +1,27 @@ +use benches::bench; +use bevy_ecs::{component::Component, world::World}; +use criterion::Criterion; + +const ENTITY_COUNT: usize = 2_000; + +#[derive(Component)] +struct C; + +pub fn spawn_many_zst(criterion: &mut Criterion) { + let mut group = criterion.benchmark_group(bench!("spawn_many_zst")); + + group.bench_function("static", |bencher| { + let mut world = World::new(); + bencher.iter(|| { + for _ in 0..ENTITY_COUNT { + world.spawn(( + C::<0>, C::<1>, C::<2>, C::<3>, C::<4>, C::<5>, C::<6>, C::<7>, C::<8>, C::<9>, + C::<10>, C::<11>, C::<12>, C::<13>, C::<14>, + )); + } + world.clear_entities(); + }); + }); + + group.finish(); +} diff --git a/benches/benches/bevy_ecs/bundles/spawn_one_zst.rs b/benches/benches/bevy_ecs/bundles/spawn_one_zst.rs new file mode 100644 index 0000000000..acb006c1c7 --- /dev/null +++ b/benches/benches/bevy_ecs/bundles/spawn_one_zst.rs @@ -0,0 +1,24 @@ +use benches::bench; +use bevy_ecs::{component::Component, world::World}; +use criterion::Criterion; + +const ENTITY_COUNT: usize = 10_000; + +#[derive(Component)] +struct A; + +pub fn spawn_one_zst(criterion: &mut Criterion) { + let mut group = criterion.benchmark_group(bench!("spawn_one_zst")); + + group.bench_function("static", |bencher| { + let mut world = World::new(); + bencher.iter(|| { + for _ in 0..ENTITY_COUNT { + world.spawn(A); + } + world.clear_entities(); + }); + }); + + group.finish(); +} diff --git a/benches/benches/bevy_ecs/main.rs b/benches/benches/bevy_ecs/main.rs index 4a025ab829..59b4c1fd73 100644 --- a/benches/benches/bevy_ecs/main.rs +++ b/benches/benches/bevy_ecs/main.rs @@ -5,6 +5,7 @@ use criterion::criterion_main; +mod bundles; mod change_detection; mod components; mod empty_archetypes; @@ -18,6 +19,7 @@ mod scheduling; mod world; criterion_main!( + bundles::benches, change_detection::benches, components::benches, empty_archetypes::benches, From 70902413b2a79c352813c945493ab1bcc5d94fa9 Mon Sep 17 00:00:00 2001 From: krunchington Date: Mon, 30 Jun 2025 16:01:44 -0700 Subject: [PATCH 37/68] Update log_layers_ecs example for children macro (#18293) # Objective Contributes to #18238 Updates the `log_layers_ecs`, example to use the `children!` macro. Note that I did not use a macro, nor `Children::spawn` for the outer layer. Since the `EventReader` is borrowed mutably, any `.map` I did on `events.read()` was going to have the reference outlive the function body. I believe this scope of change is correct for the PR. ## Solution Updates examples to use the Improved Spawning API merged in https://github.com/bevyengine/bevy/pull/17521 ## Testing - Did you test these changes? If so, how? - Opened the examples before and after and verified the same behavior was observed. I did this on Ubuntu 24.04.2 LTS using `--features wayland`. - Are there any parts that need more testing? - Other OS's and features can't hurt, but this is such a small change it shouldn't be a problem. - How can other people (reviewers) test your changes? Is there anything specific they need to know? - Run the examples yourself with and without these changes. - If relevant, what platforms did you test these changes on, and are there any important ones you can't test? - see above --- ## Showcase n/a ## Migration Guide n/a Co-authored-by: Alice Cecile --- examples/app/log_layers_ecs.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/examples/app/log_layers_ecs.rs b/examples/app/log_layers_ecs.rs index 55e57081ff..bcf5e5571e 100644 --- a/examples/app/log_layers_ecs.rs +++ b/examples/app/log_layers_ecs.rs @@ -150,13 +150,16 @@ fn print_logs( commands.entity(root_entity).with_children(|child| { for event in events.read() { - child.spawn(Text::default()).with_children(|child| { - child.spawn(( - TextSpan::new(format!("{:5} ", event.level)), - TextColor(level_color(&event.level)), - )); - child.spawn(TextSpan::new(&event.message)); - }); + child.spawn(( + Text::default(), + children![ + ( + TextSpan::new(format!("{:5} ", event.level)), + TextColor(level_color(&event.level)), + ), + TextSpan::new(&event.message), + ], + )); } }); } From 9be1c363918e8be29dfea00f433ede381e38814d Mon Sep 17 00:00:00 2001 From: Talin Date: Mon, 30 Jun 2025 16:02:03 -0700 Subject: [PATCH 38/68] CoreScrollbar widget. (#19803) # Objective Part of #19236 ## Demo ![image](https://github.com/user-attachments/assets/8607f672-de8f-4339-bdfc-817b39f32e3e) https://discord.com/channels/691052431525675048/743663673393938453/1387110701386039317 --------- Co-authored-by: ickshonpe --- Cargo.toml | 11 + .../bevy_core_widgets/src/core_scrollbar.rs | 339 ++++++++++++++++++ crates/bevy_core_widgets/src/lib.rs | 6 + examples/README.md | 1 + examples/ui/scrollbars.rs | 208 +++++++++++ .../release-notes/headless-widgets.md | 4 +- 6 files changed, 568 insertions(+), 1 deletion(-) create mode 100644 crates/bevy_core_widgets/src/core_scrollbar.rs create mode 100644 examples/ui/scrollbars.rs diff --git a/Cargo.toml b/Cargo.toml index 173d9e1f03..6bc73fbd2c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4547,6 +4547,17 @@ description = "Demonstrates use of core (headless) widgets in Bevy UI, with Obse category = "UI (User Interface)" wasm = true +[[example]] +name = "scrollbars" +path = "examples/ui/scrollbars.rs" +doc-scrape-examples = true + +[package.metadata.example.scrollbars] +name = "Scrollbars" +description = "Demonstrates use of core scrollbar in Bevy UI" +category = "UI (User Interface)" +wasm = true + [[example]] name = "feathers" path = "examples/ui/feathers.rs" diff --git a/crates/bevy_core_widgets/src/core_scrollbar.rs b/crates/bevy_core_widgets/src/core_scrollbar.rs new file mode 100644 index 0000000000..2d0fd49fb6 --- /dev/null +++ b/crates/bevy_core_widgets/src/core_scrollbar.rs @@ -0,0 +1,339 @@ +use bevy_app::{App, Plugin, PostUpdate}; +use bevy_ecs::{ + component::Component, + entity::Entity, + hierarchy::{ChildOf, Children}, + observer::On, + query::{With, Without}, + system::{Query, Res}, +}; +use bevy_math::Vec2; +use bevy_picking::events::{Cancel, Drag, DragEnd, DragStart, Pointer, Press}; +use bevy_ui::{ + ComputedNode, ComputedNodeTarget, Node, ScrollPosition, UiGlobalTransform, UiScale, Val, +}; + +/// Used to select the orientation of a scrollbar, slider, or other oriented control. +// TODO: Move this to a more central place. +#[derive(Debug, Default, Clone, Copy, PartialEq)] +pub enum ControlOrientation { + /// Horizontal orientation (stretching from left to right) + Horizontal, + /// Vertical orientation (stretching from top to bottom) + #[default] + Vertical, +} + +/// A headless scrollbar widget, which can be used to build custom scrollbars. +/// +/// Scrollbars operate differently than the other core widgets in a number of respects. +/// +/// Unlike sliders, scrollbars don't have an [`AccessibilityNode`](bevy_a11y::AccessibilityNode) +/// component, nor can they have keyboard focus. This is because scrollbars are usually used in +/// conjunction with a scrollable container, which is itself accessible and focusable. This also +/// means that scrollbars don't accept keyboard events, which is also the responsibility of the +/// scrollable container. +/// +/// Scrollbars don't emit notification events; instead they modify the scroll position of the target +/// entity directly. +/// +/// A scrollbar can have any number of child entities, but one entity must be the scrollbar thumb, +/// which is marked with the [`CoreScrollbarThumb`] component. Other children are ignored. The core +/// scrollbar will directly update the position and size of this entity; the application is free to +/// set any other style properties as desired. +/// +/// The application is free to position the scrollbars relative to the scrolling container however +/// it wants: it can overlay them on top of the scrolling content, or use a grid layout to displace +/// the content to make room for the scrollbars. +#[derive(Component, Debug)] +pub struct CoreScrollbar { + /// Entity being scrolled. + pub target: Entity, + /// Whether the scrollbar is vertical or horizontal. + pub orientation: ControlOrientation, + /// Minimum length of the scrollbar thumb, in pixel units, in the direction parallel to the main + /// scrollbar axis. The scrollbar will resize the thumb entity based on the proportion of + /// visible size to content size, but no smaller than this. This prevents the thumb from + /// disappearing in cases where the ratio of content size to visible size is large. + pub min_thumb_length: f32, +} + +/// Marker component to indicate that the entity is a scrollbar thumb (the moving, draggable part of +/// the scrollbar). This should be a child of the scrollbar entity. +#[derive(Component, Debug)] +#[require(CoreScrollbarDragState)] +pub struct CoreScrollbarThumb; + +impl CoreScrollbar { + /// Construct a new scrollbar. + /// + /// # Arguments + /// + /// * `target` - The scrollable entity that this scrollbar will control. + /// * `orientation` - The orientation of the scrollbar (horizontal or vertical). + /// * `min_thumb_length` - The minimum size of the scrollbar's thumb, in pixels. + pub fn new(target: Entity, orientation: ControlOrientation, min_thumb_length: f32) -> Self { + Self { + target, + orientation, + min_thumb_length, + } + } +} + +/// Component used to manage the state of a scrollbar during dragging. This component is +/// inserted on the thumb entity. +#[derive(Component, Default)] +pub struct CoreScrollbarDragState { + /// Whether the scrollbar is currently being dragged. + pub dragging: bool, + /// The value of the scrollbar when dragging started. + drag_origin: f32, +} + +fn scrollbar_on_pointer_down( + mut ev: On>, + q_thumb: Query<&ChildOf, With>, + mut q_scrollbar: Query<( + &CoreScrollbar, + &ComputedNode, + &ComputedNodeTarget, + &UiGlobalTransform, + )>, + mut q_scroll_pos: Query<(&mut ScrollPosition, &ComputedNode), Without>, + ui_scale: Res, +) { + if q_thumb.contains(ev.target()) { + // If they click on the thumb, do nothing. This will be handled by the drag event. + ev.propagate(false); + } else if let Ok((scrollbar, node, node_target, transform)) = q_scrollbar.get_mut(ev.target()) { + // If they click on the scrollbar track, page up or down. + ev.propagate(false); + + // Convert to widget-local coordinates. + let local_pos = transform.try_inverse().unwrap().transform_point2( + ev.event().pointer_location.position * node_target.scale_factor() / ui_scale.0, + ) + node.size() * 0.5; + + // Bail if we don't find the target entity. + let Ok((mut scroll_pos, scroll_content)) = q_scroll_pos.get_mut(scrollbar.target) else { + return; + }; + + // Convert the click coordinates into a scroll position. If it's greater than the + // current scroll position, scroll forward by one step (visible size) otherwise scroll + // back. + let visible_size = scroll_content.size() * scroll_content.inverse_scale_factor; + let content_size = scroll_content.content_size() * scroll_content.inverse_scale_factor; + let max_range = (content_size - visible_size).max(Vec2::ZERO); + + fn adjust_scroll_pos(scroll_pos: &mut f32, click_pos: f32, step: f32, range: f32) { + *scroll_pos = + (*scroll_pos + if click_pos > *scroll_pos { step } else { -step }).clamp(0., range); + } + + match scrollbar.orientation { + ControlOrientation::Horizontal => { + if node.size().x > 0. { + let click_pos = local_pos.x * content_size.x / node.size().x; + adjust_scroll_pos( + &mut scroll_pos.offset_x, + click_pos, + visible_size.x, + max_range.x, + ); + } + } + ControlOrientation::Vertical => { + if node.size().y > 0. { + let click_pos = local_pos.y * content_size.y / node.size().y; + adjust_scroll_pos( + &mut scroll_pos.offset_y, + click_pos, + visible_size.y, + max_range.y, + ); + } + } + } + } +} + +fn scrollbar_on_drag_start( + mut ev: On>, + mut q_thumb: Query<(&ChildOf, &mut CoreScrollbarDragState), With>, + q_scrollbar: Query<&CoreScrollbar>, + q_scroll_area: Query<&ScrollPosition>, +) { + if let Ok((ChildOf(thumb_parent), mut drag)) = q_thumb.get_mut(ev.target()) { + ev.propagate(false); + if let Ok(scrollbar) = q_scrollbar.get(*thumb_parent) { + if let Ok(scroll_area) = q_scroll_area.get(scrollbar.target) { + drag.dragging = true; + drag.drag_origin = match scrollbar.orientation { + ControlOrientation::Horizontal => scroll_area.offset_x, + ControlOrientation::Vertical => scroll_area.offset_y, + }; + } + } + } +} + +fn scrollbar_on_drag( + mut ev: On>, + mut q_thumb: Query<(&ChildOf, &mut CoreScrollbarDragState), With>, + mut q_scrollbar: Query<(&ComputedNode, &CoreScrollbar)>, + mut q_scroll_pos: Query<(&mut ScrollPosition, &ComputedNode), Without>, + ui_scale: Res, +) { + if let Ok((ChildOf(thumb_parent), drag)) = q_thumb.get_mut(ev.target()) { + if let Ok((node, scrollbar)) = q_scrollbar.get_mut(*thumb_parent) { + ev.propagate(false); + let Ok((mut scroll_pos, scroll_content)) = q_scroll_pos.get_mut(scrollbar.target) + else { + return; + }; + + if drag.dragging { + let distance = ev.event().distance / ui_scale.0; + let visible_size = scroll_content.size() * scroll_content.inverse_scale_factor; + let content_size = + scroll_content.content_size() * scroll_content.inverse_scale_factor; + let scrollbar_size = (node.size() * node.inverse_scale_factor).max(Vec2::ONE); + + match scrollbar.orientation { + ControlOrientation::Horizontal => { + let range = (content_size.x - visible_size.x).max(0.); + scroll_pos.offset_x = (drag.drag_origin + + (distance.x * content_size.x) / scrollbar_size.x) + .clamp(0., range); + } + ControlOrientation::Vertical => { + let range = (content_size.y - visible_size.y).max(0.); + scroll_pos.offset_y = (drag.drag_origin + + (distance.y * content_size.y) / scrollbar_size.y) + .clamp(0., range); + } + }; + } + } + } +} + +fn scrollbar_on_drag_end( + mut ev: On>, + mut q_thumb: Query<&mut CoreScrollbarDragState, With>, +) { + if let Ok(mut drag) = q_thumb.get_mut(ev.target()) { + ev.propagate(false); + if drag.dragging { + drag.dragging = false; + } + } +} + +fn scrollbar_on_drag_cancel( + mut ev: On>, + mut q_thumb: Query<&mut CoreScrollbarDragState, With>, +) { + if let Ok(mut drag) = q_thumb.get_mut(ev.target()) { + ev.propagate(false); + if drag.dragging { + drag.dragging = false; + } + } +} + +fn update_scrollbar_thumb( + q_scroll_area: Query<(&ScrollPosition, &ComputedNode)>, + q_scrollbar: Query<(&CoreScrollbar, &ComputedNode, &Children)>, + mut q_thumb: Query<&mut Node, With>, +) { + for (scrollbar, scrollbar_node, children) in q_scrollbar.iter() { + let Ok(scroll_area) = q_scroll_area.get(scrollbar.target) else { + continue; + }; + + // Size of the visible scrolling area. + let visible_size = scroll_area.1.size() * scroll_area.1.inverse_scale_factor; + + // Size of the scrolling content. + let content_size = scroll_area.1.content_size() * scroll_area.1.inverse_scale_factor; + + // Length of the scrollbar track. + let track_length = scrollbar_node.size() * scrollbar_node.inverse_scale_factor; + + fn size_and_pos( + content_size: f32, + visible_size: f32, + track_length: f32, + min_size: f32, + offset: f32, + ) -> (f32, f32) { + let thumb_size = if content_size > visible_size { + (track_length * visible_size / content_size) + .max(min_size) + .min(track_length) + } else { + track_length + }; + + let thumb_pos = if content_size > visible_size { + offset * (track_length - thumb_size) / (content_size - visible_size) + } else { + 0. + }; + + (thumb_size, thumb_pos) + } + + for child in children { + if let Ok(mut thumb) = q_thumb.get_mut(*child) { + match scrollbar.orientation { + ControlOrientation::Horizontal => { + let (thumb_size, thumb_pos) = size_and_pos( + content_size.x, + visible_size.x, + track_length.x, + scrollbar.min_thumb_length, + scroll_area.0.offset_x, + ); + + thumb.top = Val::Px(0.); + thumb.bottom = Val::Px(0.); + thumb.left = Val::Px(thumb_pos); + thumb.width = Val::Px(thumb_size); + } + ControlOrientation::Vertical => { + let (thumb_size, thumb_pos) = size_and_pos( + content_size.y, + visible_size.y, + track_length.y, + scrollbar.min_thumb_length, + scroll_area.0.offset_y, + ); + + thumb.left = Val::Px(0.); + thumb.right = Val::Px(0.); + thumb.top = Val::Px(thumb_pos); + thumb.height = Val::Px(thumb_size); + } + }; + } + } + } +} + +/// Plugin that adds the observers for the [`CoreScrollbar`] widget. +pub struct CoreScrollbarPlugin; + +impl Plugin for CoreScrollbarPlugin { + fn build(&self, app: &mut App) { + app.add_observer(scrollbar_on_pointer_down) + .add_observer(scrollbar_on_drag_start) + .add_observer(scrollbar_on_drag_end) + .add_observer(scrollbar_on_drag_cancel) + .add_observer(scrollbar_on_drag) + .add_systems(PostUpdate, update_scrollbar_thumb); + } +} diff --git a/crates/bevy_core_widgets/src/lib.rs b/crates/bevy_core_widgets/src/lib.rs index ef9f3db51c..a0ddfa5eb8 100644 --- a/crates/bevy_core_widgets/src/lib.rs +++ b/crates/bevy_core_widgets/src/lib.rs @@ -17,6 +17,7 @@ mod core_button; mod core_checkbox; mod core_radio; +mod core_scrollbar; mod core_slider; use bevy_app::{App, Plugin}; @@ -24,6 +25,10 @@ use bevy_app::{App, Plugin}; pub use core_button::{CoreButton, CoreButtonPlugin}; pub use core_checkbox::{CoreCheckbox, CoreCheckboxPlugin, SetChecked, ToggleChecked}; pub use core_radio::{CoreRadio, CoreRadioGroup, CoreRadioGroupPlugin}; +pub use core_scrollbar::{ + ControlOrientation, CoreScrollbar, CoreScrollbarDragState, CoreScrollbarPlugin, + CoreScrollbarThumb, +}; pub use core_slider::{ CoreSlider, CoreSliderDragState, CoreSliderPlugin, CoreSliderThumb, SetSliderValue, SliderRange, SliderStep, SliderValue, TrackClick, @@ -39,6 +44,7 @@ impl Plugin for CoreWidgetsPlugin { CoreButtonPlugin, CoreCheckboxPlugin, CoreRadioGroupPlugin, + CoreScrollbarPlugin, CoreSliderPlugin, )); } diff --git a/examples/README.md b/examples/README.md index 31d777afed..993299dfc6 100644 --- a/examples/README.md +++ b/examples/README.md @@ -563,6 +563,7 @@ Example | Description [Relative Cursor Position](../examples/ui/relative_cursor_position.rs) | Showcases the RelativeCursorPosition component [Render UI to Texture](../examples/ui/render_ui_to_texture.rs) | An example of rendering UI as a part of a 3D world [Scroll](../examples/ui/scroll.rs) | Demonstrates scrolling UI containers +[Scrollbars](../examples/ui/scrollbars.rs) | Demonstrates use of core scrollbar in Bevy UI [Size Constraints](../examples/ui/size_constraints.rs) | Demonstrates how the to use the size constraints to control the size of a UI node. [Stacked Gradients](../examples/ui/stacked_gradients.rs) | An example demonstrating stacked gradients [Tab Navigation](../examples/ui/tab_navigation.rs) | Demonstration of Tab Navigation between UI elements diff --git a/examples/ui/scrollbars.rs b/examples/ui/scrollbars.rs new file mode 100644 index 0000000000..2726df12fb --- /dev/null +++ b/examples/ui/scrollbars.rs @@ -0,0 +1,208 @@ +//! Demonstrations of scrolling and scrollbars. + +use bevy::{ + core_widgets::{ + ControlOrientation, CoreScrollbar, CoreScrollbarDragState, CoreScrollbarPlugin, + CoreScrollbarThumb, + }, + ecs::{relationship::RelatedSpawner, spawn::SpawnWith}, + input_focus::{ + tab_navigation::{TabGroup, TabNavigationPlugin}, + InputDispatchPlugin, + }, + picking::hover::Hovered, + prelude::*, +}; + +fn main() { + App::new() + .add_plugins(( + DefaultPlugins, + CoreScrollbarPlugin, + InputDispatchPlugin, + TabNavigationPlugin, + )) + .insert_resource(UiScale(1.25)) + .add_systems(Startup, setup_view_root) + .add_systems(Update, update_scrollbar_thumb) + .run(); +} + +fn setup_view_root(mut commands: Commands) { + let camera = commands.spawn((Camera::default(), Camera2d)).id(); + + commands.spawn(( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Column, + position_type: PositionType::Absolute, + left: Val::Px(0.), + top: Val::Px(0.), + right: Val::Px(0.), + bottom: Val::Px(0.), + padding: UiRect::all(Val::Px(3.)), + row_gap: Val::Px(6.), + ..Default::default() + }, + BackgroundColor(Color::srgb(0.1, 0.1, 0.1)), + UiTargetCamera(camera), + TabGroup::default(), + Children::spawn((Spawn(Text::new("Scrolling")), Spawn(scroll_area_demo()))), + )); +} + +/// Create a scrolling area. +/// +/// The "scroll area" is a container that can be scrolled. It has a nested structure which is +/// three levels deep: +/// - The outermost node is a grid that contains the scroll area and the scrollbars. +/// - The scroll area is a flex container that contains the scrollable content. This +/// is the element that has the `overflow: scroll` property. +/// - The scrollable content consists of the elements actually displayed in the scrolling area. +fn scroll_area_demo() -> impl Bundle { + ( + // Frame element which contains the scroll area and scrollbars. + Node { + display: Display::Grid, + width: Val::Px(200.0), + height: Val::Px(150.0), + grid_template_columns: vec![RepeatedGridTrack::flex(1, 1.), RepeatedGridTrack::auto(1)], + grid_template_rows: vec![RepeatedGridTrack::flex(1, 1.), RepeatedGridTrack::auto(1)], + row_gap: Val::Px(2.0), + column_gap: Val::Px(2.0), + ..default() + }, + Children::spawn((SpawnWith(|parent: &mut RelatedSpawner| { + // The actual scrolling area. + // Note that we're using `SpawnWith` here because we need to get the entity id of the + // scroll area in order to set the target of the scrollbars. + let scroll_area_id = parent + .spawn(( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Column, + padding: UiRect::all(Val::Px(4.0)), + overflow: Overflow::scroll(), + ..default() + }, + BackgroundColor(colors::GRAY1.into()), + ScrollPosition { + offset_x: 0.0, + offset_y: 10.0, + }, + Children::spawn(( + // The actual content of the scrolling area + Spawn(text_row("Alpha Wolf")), + Spawn(text_row("Beta Blocker")), + Spawn(text_row("Delta Sleep")), + Spawn(text_row("Gamma Ray")), + Spawn(text_row("Epsilon Eridani")), + Spawn(text_row("Zeta Function")), + Spawn(text_row("Lambda Calculus")), + Spawn(text_row("Nu Metal")), + Spawn(text_row("Pi Day")), + Spawn(text_row("Chi Pants")), + Spawn(text_row("Psi Powers")), + Spawn(text_row("Omega Fatty Acid")), + )), + )) + .id(); + + // Vertical scrollbar + parent.spawn(( + Node { + min_width: Val::Px(8.0), + grid_row: GridPlacement::start(1), + grid_column: GridPlacement::start(2), + ..default() + }, + CoreScrollbar { + orientation: ControlOrientation::Vertical, + target: scroll_area_id, + min_thumb_length: 8.0, + }, + Children::spawn(Spawn(( + Node { + position_type: PositionType::Absolute, + ..default() + }, + Hovered::default(), + BackgroundColor(colors::GRAY2.into()), + BorderRadius::all(Val::Px(4.0)), + CoreScrollbarThumb, + ))), + )); + + // Horizontal scrollbar + parent.spawn(( + Node { + min_height: Val::Px(8.0), + grid_row: GridPlacement::start(2), + grid_column: GridPlacement::start(1), + ..default() + }, + CoreScrollbar { + orientation: ControlOrientation::Horizontal, + target: scroll_area_id, + min_thumb_length: 8.0, + }, + Children::spawn(Spawn(( + Node { + position_type: PositionType::Absolute, + ..default() + }, + Hovered::default(), + BackgroundColor(colors::GRAY2.into()), + BorderRadius::all(Val::Px(4.0)), + CoreScrollbarThumb, + ))), + )); + }),)), + ) +} + +/// Create a list row +fn text_row(caption: &str) -> impl Bundle { + ( + Text::new(caption), + TextFont { + font_size: 14.0, + ..default() + }, + ) +} + +// Update the color of the scrollbar thumb. +fn update_scrollbar_thumb( + mut q_thumb: Query< + (&mut BackgroundColor, &Hovered, &CoreScrollbarDragState), + ( + With, + Or<(Changed, Changed)>, + ), + >, +) { + for (mut thumb_bg, Hovered(is_hovering), drag) in q_thumb.iter_mut() { + let color: Color = if *is_hovering || drag.dragging { + // If hovering, use a lighter color + colors::GRAY3 + } else { + // Default color for the slider + colors::GRAY2 + } + .into(); + + if thumb_bg.0 != color { + // Update the color of the thumb + thumb_bg.0 = color; + } + } +} + +mod colors { + use bevy::color::Srgba; + + pub const GRAY1: Srgba = Srgba::new(0.224, 0.224, 0.243, 1.0); + pub const GRAY2: Srgba = Srgba::new(0.486, 0.486, 0.529, 1.0); + pub const GRAY3: Srgba = Srgba::new(1.0, 1.0, 1.0, 1.0); +} diff --git a/release-content/release-notes/headless-widgets.md b/release-content/release-notes/headless-widgets.md index e28c44ee9e..bb0398b43c 100644 --- a/release-content/release-notes/headless-widgets.md +++ b/release-content/release-notes/headless-widgets.md @@ -1,7 +1,7 @@ --- title: Headless Widgets authors: ["@viridia"] -pull_requests: [19366, 19584, 19665, 19778] +pull_requests: [19366, 19584, 19665, 19778, 19803] --- Bevy's `Button` and `Interaction` components have been around for a long time. Unfortunately @@ -34,7 +34,9 @@ sliders, checkboxes and radio buttons. - `CoreButton` is a push button. It emits an activation event when clicked. - `CoreSlider` is a standard slider, which lets you edit an `f32` value in a given range. +- `CoreScrollbar` can be used to implement scrollbars. - `CoreCheckbox` can be used for checkboxes and toggle switches. +- `CoreRadio` and `CoreRadioGroup` can be used for radio buttons. ## Widget Interaction States From 88c280b9d207e4c255af1ba362a0ddd3254f2ff4 Mon Sep 17 00:00:00 2001 From: IceSentry Date: Mon, 30 Jun 2025 19:08:27 -0400 Subject: [PATCH 39/68] Split LatePrepassNode query in a few groups (#19840) # Objective - That node has a bunch of query items that are mostly ignored in a few places - Previously this lead to having a long chain of ignored params that was replaced with `..,`. This works, but this seems a bit more likely to break in a subtle way if new parameters are added ## Solution - Split the query in a few groups based on how it was already structured (Mandatory, Optional, Has) ## Testing - None, it's just code style changes --- crates/bevy_core_pipeline/src/prepass/node.rs | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/crates/bevy_core_pipeline/src/prepass/node.rs b/crates/bevy_core_pipeline/src/prepass/node.rs index 6193aa4f0e..c4cc7b1d55 100644 --- a/crates/bevy_core_pipeline/src/prepass/node.rs +++ b/crates/bevy_core_pipeline/src/prepass/node.rs @@ -55,19 +55,25 @@ pub struct LatePrepassNode; impl ViewNode for LatePrepassNode { type ViewQuery = ( - &'static ExtractedCamera, - &'static ExtractedView, - &'static ViewDepthTexture, - &'static ViewPrepassTextures, - &'static ViewUniformOffset, - Option<&'static DeferredPrepass>, - Option<&'static RenderSkyboxPrepassPipeline>, - Option<&'static SkyboxPrepassBindGroup>, - Option<&'static PreviousViewUniformOffset>, - Option<&'static MainPassResolutionOverride>, - Has, - Has, - Has, + ( + &'static ExtractedCamera, + &'static ExtractedView, + &'static ViewDepthTexture, + &'static ViewPrepassTextures, + &'static ViewUniformOffset, + ), + ( + Option<&'static DeferredPrepass>, + Option<&'static RenderSkyboxPrepassPipeline>, + Option<&'static SkyboxPrepassBindGroup>, + Option<&'static PreviousViewUniformOffset>, + Option<&'static MainPassResolutionOverride>, + ), + ( + Has, + Has, + Has, + ), ); fn run<'w>( @@ -79,7 +85,7 @@ impl ViewNode for LatePrepassNode { ) -> Result<(), NodeRunError> { // We only need a late prepass if we have occlusion culling and indirect // drawing. - let (.., occlusion_culling, no_indirect_drawing, _) = query; + let (_, _, (occlusion_culling, no_indirect_drawing, _)) = query; if !occlusion_culling || no_indirect_drawing { return Ok(()); } @@ -101,19 +107,15 @@ fn run_prepass<'w>( graph: &mut RenderGraphContext, render_context: &mut RenderContext<'w>, ( - camera, - extracted_view, - view_depth_texture, - view_prepass_textures, - view_uniform_offset, - deferred_prepass, - skybox_prepass_pipeline, - skybox_prepass_bind_group, - view_prev_uniform_offset, - resolution_override, - _, - _, - has_deferred, + (camera, extracted_view, view_depth_texture, view_prepass_textures, view_uniform_offset), + ( + deferred_prepass, + skybox_prepass_pipeline, + skybox_prepass_bind_group, + view_prev_uniform_offset, + resolution_override, + ), + (_, _, has_deferred), ): QueryItem<'w, '_, ::ViewQuery>, world: &'w World, label: &'static str, From 55c77667165050d139aefd87e2cdaae3230fe350 Mon Sep 17 00:00:00 2001 From: Maxime Mulder Date: Tue, 1 Jul 2025 07:24:36 +0800 Subject: [PATCH 40/68] Update bevy website link in newer code (#19874) # Objective I was lurking and noticed that some links to the Bevy website were not updated in newer code (`bevyengine.org` -> `bevy.org`). ## Solution - Look for `bevyengine.org` occurrences in the current code, replace them with `bevy.org`. ## Testing - Did you test these changes? If so, how? I visited the Bevy website! - Are there any parts that need more testing? - How can other people (reviewers) test your changes? Is there anything specific they need to know? - If relevant, what platforms did you test these changes on, and are there any important ones you can't test? ## Longer term - Maybe add a lint to flag references to the old website but I don't know how to do that. But not sure it's needed as the more time will pass the less it will be relevant. --- crates/bevy_core_widgets/Cargo.toml | 2 +- crates/bevy_feathers/Cargo.toml | 2 +- crates/bevy_solari/Cargo.toml | 2 +- examples/3d/fog.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/bevy_core_widgets/Cargo.toml b/crates/bevy_core_widgets/Cargo.toml index e93891d8f7..57e2968e22 100644 --- a/crates/bevy_core_widgets/Cargo.toml +++ b/crates/bevy_core_widgets/Cargo.toml @@ -3,7 +3,7 @@ name = "bevy_core_widgets" version = "0.17.0-dev" edition = "2024" description = "Unstyled common widgets for Bevy Engine" -homepage = "https://bevyengine.org" +homepage = "https://bevy.org" repository = "https://github.com/bevyengine/bevy" license = "MIT OR Apache-2.0" keywords = ["bevy"] diff --git a/crates/bevy_feathers/Cargo.toml b/crates/bevy_feathers/Cargo.toml index 2f8174c756..8348906047 100644 --- a/crates/bevy_feathers/Cargo.toml +++ b/crates/bevy_feathers/Cargo.toml @@ -3,7 +3,7 @@ name = "bevy_feathers" version = "0.17.0-dev" edition = "2024" description = "A collection of UI widgets for building editors and utilities in Bevy" -homepage = "https://bevyengine.org" +homepage = "https://bevy.org" repository = "https://github.com/bevyengine/bevy" license = "MIT OR Apache-2.0" keywords = ["bevy"] diff --git a/crates/bevy_solari/Cargo.toml b/crates/bevy_solari/Cargo.toml index 1929ab42d1..2bfcf735d0 100644 --- a/crates/bevy_solari/Cargo.toml +++ b/crates/bevy_solari/Cargo.toml @@ -3,7 +3,7 @@ name = "bevy_solari" version = "0.17.0-dev" edition = "2024" description = "Provides raytraced lighting for Bevy Engine" -homepage = "https://bevyengine.org" +homepage = "https://bevy.org" repository = "https://github.com/bevyengine/bevy" license = "MIT OR Apache-2.0" keywords = ["bevy"] diff --git a/examples/3d/fog.rs b/examples/3d/fog.rs index 82bce0b15a..f1fb3f1ed5 100644 --- a/examples/3d/fog.rs +++ b/examples/3d/fog.rs @@ -4,7 +4,7 @@ //! //! The [`FogFalloff`] field controls most of the behavior of the fog through different descriptions of fog "curves". I.e. [`FogFalloff::Linear`] lets us define a start and end distance where up until the start distance none of the fog color is mixed in and by the end distance the fog color is as mixed in as it can be. [`FogFalloff::Exponential`] on the other hand uses an exponential curve to drive how "visible" things are with a density value. //! -//! [Atmospheric fog](https://bevyengine.org/examples/3d-rendering/atmospheric-fog/) is another fog type that uses this same method of setup, but isn't covered here as it is a kind of fog that is most often used to imply distance and size in clear weather, while the ones shown off here are much more "dense". +//! [Atmospheric fog](https://bevy.org/examples/3d-rendering/atmospheric-fog/) is another fog type that uses this same method of setup, but isn't covered here as it is a kind of fog that is most often used to imply distance and size in clear weather, while the ones shown off here are much more "dense". //! //! The bulk of this example is spent building a scene that suites showing off that the fog is working as intended by creating a pyramid (a 3D structure with clear delineations), a light source, input handling to modify fog settings, and UI to show what the current fog settings are. //! From 5aa520eac08a5b470a492d245bad7b45451084f1 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 1 Jul 2025 09:29:24 +1000 Subject: [PATCH 41/68] bevy_reflect: avoid useless `with_{custom_attributes,docs}` calls (#19875) # Objective `#[derive(Reflect)]` derives `Typed` impls whose `type_info` methods contain useless calls to `with_custom_attributes` and `with_docs`, e.g.: ``` ::bevy::reflect::NamedField::new::("x") .with_custom_attributes( ::bevy::reflect::attributes::CustomAttributes::default() ) .with_docs(::core::option::Option::None), ``` This hurts compile times and makes the `cargo expand` output harder to read. It might also hurt runtime speed, depending on whether the compiler can optimize away the no-op methods. Avoiding this will help with #19873. ## Solution Check if the attributes/docs are empty before appending the method calls. ## Testing I used `cargo expand` to confirm the useless calls are no longer produced. `-Zmacro-stats` outputs tells me this reduces the size of the `Reflect` impls produced for `bevy_ui` from 1_544_696 bytes to 1_511_214 bytes, a 2.2% drop. Only a small improvement, but it's a start. --- .../derive/src/custom_attributes.rs | 5 + crates/bevy_reflect/derive/src/derive_data.rs | 98 ++++++++++--------- .../bevy_reflect/derive/src/documentation.rs | 5 + 3 files changed, 63 insertions(+), 45 deletions(-) diff --git a/crates/bevy_reflect/derive/src/custom_attributes.rs b/crates/bevy_reflect/derive/src/custom_attributes.rs index f12b6d7c12..1f141f79dc 100644 --- a/crates/bevy_reflect/derive/src/custom_attributes.rs +++ b/crates/bevy_reflect/derive/src/custom_attributes.rs @@ -28,6 +28,11 @@ impl CustomAttributes { Ok(()) } + /// Is the collection empty? + pub fn is_empty(&self) -> bool { + self.attributes.is_empty() + } + /// Parse `@` (custom attribute) attribute. /// /// Examples: diff --git a/crates/bevy_reflect/derive/src/derive_data.rs b/crates/bevy_reflect/derive/src/derive_data.rs index f825cb2905..a0343f619f 100644 --- a/crates/bevy_reflect/derive/src/derive_data.rs +++ b/crates/bevy_reflect/derive/src/derive_data.rs @@ -514,25 +514,27 @@ impl<'a> StructField<'a> { }; let ty = self.reflected_type(); - let custom_attributes = self.attrs.custom_attributes.to_tokens(bevy_reflect_path); - #[cfg_attr( - not(feature = "documentation"), - expect( - unused_mut, - reason = "Needs to be mutable if `documentation` feature is enabled.", - ) - )] let mut info = quote! { - #field_info::new::<#ty>(#name).with_custom_attributes(#custom_attributes) + #field_info::new::<#ty>(#name) }; + let custom_attributes = &self.attrs.custom_attributes; + if !custom_attributes.is_empty() { + let custom_attributes = custom_attributes.to_tokens(bevy_reflect_path); + info.extend(quote! { + .with_custom_attributes(#custom_attributes) + }); + } + #[cfg(feature = "documentation")] { let docs = &self.doc; - info.extend(quote! { - .with_docs(#docs) - }); + if !docs.is_empty() { + info.extend(quote! { + .with_docs(#docs) + }); + } } info @@ -653,19 +655,20 @@ impl<'a> ReflectStruct<'a> { .active_fields() .map(|field| field.to_info_tokens(bevy_reflect_path)); - let custom_attributes = self - .meta - .attrs - .custom_attributes() - .to_tokens(bevy_reflect_path); - let mut info = quote! { #bevy_reflect_path::#info_struct::new::(&[ #(#field_infos),* ]) - .with_custom_attributes(#custom_attributes) }; + let custom_attributes = self.meta.attrs.custom_attributes(); + if !custom_attributes.is_empty() { + let custom_attributes = custom_attributes.to_tokens(bevy_reflect_path); + info.extend(quote! { + .with_custom_attributes(#custom_attributes) + }); + } + if let Some(generics) = generate_generics(self.meta()) { info.extend(quote! { .with_generics(#generics) @@ -675,9 +678,11 @@ impl<'a> ReflectStruct<'a> { #[cfg(feature = "documentation")] { let docs = self.meta().doc(); - info.extend(quote! { - .with_docs(#docs) - }); + if !docs.is_empty() { + info.extend(quote! { + .with_docs(#docs) + }); + } } quote! { @@ -884,19 +889,20 @@ impl<'a> ReflectEnum<'a> { .iter() .map(|variant| variant.to_info_tokens(bevy_reflect_path)); - let custom_attributes = self - .meta - .attrs - .custom_attributes() - .to_tokens(bevy_reflect_path); - let mut info = quote! { #bevy_reflect_path::EnumInfo::new::(&[ #(#variants),* ]) - .with_custom_attributes(#custom_attributes) }; + let custom_attributes = self.meta.attrs.custom_attributes(); + if !custom_attributes.is_empty() { + let custom_attributes = custom_attributes.to_tokens(bevy_reflect_path); + info.extend(quote! { + .with_custom_attributes(#custom_attributes) + }); + } + if let Some(generics) = generate_generics(self.meta()) { info.extend(quote! { .with_generics(#generics) @@ -906,9 +912,11 @@ impl<'a> ReflectEnum<'a> { #[cfg(feature = "documentation")] { let docs = self.meta().doc(); - info.extend(quote! { - .with_docs(#docs) - }); + if !docs.is_empty() { + info.extend(quote! { + .with_docs(#docs) + }); + } } quote! { @@ -1008,26 +1016,26 @@ impl<'a> EnumVariant<'a> { } }; - let custom_attributes = self.attrs.custom_attributes.to_tokens(bevy_reflect_path); - - #[cfg_attr( - not(feature = "documentation"), - expect( - unused_mut, - reason = "Needs to be mutable if `documentation` feature is enabled.", - ) - )] let mut info = quote! { #bevy_reflect_path::#info_struct::new(#args) - .with_custom_attributes(#custom_attributes) }; + let custom_attributes = &self.attrs.custom_attributes; + if !custom_attributes.is_empty() { + let custom_attributes = custom_attributes.to_tokens(bevy_reflect_path); + info.extend(quote! { + .with_custom_attributes(#custom_attributes) + }); + } + #[cfg(feature = "documentation")] { let docs = &self.doc; - info.extend(quote! { - .with_docs(#docs) - }); + if !docs.is_empty() { + info.extend(quote! { + .with_docs(#docs) + }); + } } quote! { diff --git a/crates/bevy_reflect/derive/src/documentation.rs b/crates/bevy_reflect/derive/src/documentation.rs index 33aec4c4f3..4fbcf775f4 100644 --- a/crates/bevy_reflect/derive/src/documentation.rs +++ b/crates/bevy_reflect/derive/src/documentation.rs @@ -61,6 +61,11 @@ impl Documentation { ) } + /// Is the collection empty? + pub fn is_empty(&self) -> bool { + self.docs.is_empty() + } + /// Push a new docstring to the collection pub fn push(&mut self, doc: String) { self.docs.push(doc); From c7e28852cb773b562a84795d382b4593756d3d94 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 1 Jul 2025 09:29:26 +1000 Subject: [PATCH 42/68] bevy_reflect: avoid duplicate type bounds in derived methods (#19876) # Objective Most of the impls derived for `#[derive(Reflect)]` have one set of type bounds per field, like so: ``` f32: ::bevy::reflect::FromReflect + ::bevy::reflect::TypePath + ::bevy::reflect::MaybeTyped + ::bevy::reflect::__macro_exports::RegisterForReflection, ``` If multiple fields have the same type, the bounds are repeated uselessly. This can only hurt compile time and clogs up the `cargo expand` output. Avoiding this will help with https://github.com/bevyengine/bevy/issues/19873. ## Solution Use a hashset when collecting the bounds to eliminate duplicates. ## Testing I used cargo expand to confirm the duplicate bounds are no longer produced. `-Zmacro-stats` outputs tells me this reduces the size of the `Reflect` code produced for `bevy_ui` from 1_544_696 bytes to 1_467_967 bytes, a 5% drop. --- crates/bevy_reflect/derive/Cargo.toml | 3 ++- crates/bevy_reflect/derive/src/derive_data.rs | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/bevy_reflect/derive/Cargo.toml b/crates/bevy_reflect/derive/Cargo.toml index 032046ae2f..b9eaa369cd 100644 --- a/crates/bevy_reflect/derive/Cargo.toml +++ b/crates/bevy_reflect/derive/Cargo.toml @@ -20,9 +20,10 @@ functions = [] [dependencies] bevy_macro_utils = { path = "../../bevy_macro_utils", version = "0.17.0-dev" } +indexmap = "2.0" proc-macro2 = "1.0" quote = "1.0" -syn = { version = "2.0", features = ["full"] } +syn = { version = "2.0", features = ["full", "extra-traits"] } uuid = { version = "1.13.1", features = ["v4"] } [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/crates/bevy_reflect/derive/src/derive_data.rs b/crates/bevy_reflect/derive/src/derive_data.rs index a0343f619f..614f357b37 100644 --- a/crates/bevy_reflect/derive/src/derive_data.rs +++ b/crates/bevy_reflect/derive/src/derive_data.rs @@ -1,4 +1,5 @@ use core::fmt; +use indexmap::IndexSet; use proc_macro2::Span; use crate::{ @@ -607,9 +608,12 @@ impl<'a> ReflectStruct<'a> { /// Get a collection of types which are exposed to the reflection API pub fn active_types(&self) -> Vec { + // Collect via `IndexSet` to eliminate duplicate types. self.active_fields() .map(|field| field.reflected_type().clone()) - .collect() + .collect::>() + .into_iter() + .collect::>() } /// Get an iterator of fields which are exposed to the reflection API. @@ -851,9 +855,12 @@ impl<'a> ReflectEnum<'a> { /// Get a collection of types which are exposed to the reflection API pub fn active_types(&self) -> Vec { + // Collect via `IndexSet` to eliminate duplicate types. self.active_fields() .map(|field| field.reflected_type().clone()) - .collect() + .collect::>() + .into_iter() + .collect::>() } /// Get an iterator of fields which are exposed to the reflection API From 265fefb865f453f280217a6045932c142feb9ef8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 19:37:59 -0400 Subject: [PATCH 43/68] Bump cargo-bins/cargo-binstall from 1.12.5 to 1.14.1 (#19877) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [cargo-bins/cargo-binstall](https://github.com/cargo-bins/cargo-binstall) from 1.12.5 to 1.14.1.
Release notes

Sourced from cargo-bins/cargo-binstall's releases.

v1.14.1

Binstall is a tool to fetch and install Rust-based executables as binaries. It aims to be a drop-in replacement for cargo install in most cases. Install it today with cargo install cargo-binstall, from the binaries below, or if you already have it, upgrade with cargo binstall cargo-binstall.

In this release:

  • Upgrade dependencies

v1.14.0

Binstall is a tool to fetch and install Rust-based executables as binaries. It aims to be a drop-in replacement for cargo install in most cases. Install it today with cargo install cargo-binstall, from the binaries below, or if you already have it, upgrade with cargo binstall cargo-binstall.

In this release:

  • Fix glibc detection on arm Fedora (#2205)
  • Add support for repository host Codeberg (#2202)
  • Fix error for missing binaries when --bin does not include any of these missing bins (#1888 #2199)

Other changes:

  • Rm uninstalled crates from $CARGO_HOME/binstall/crates-v1.json (#2197)
  • Upgrade dependencies

v1.13.0

Binstall is a tool to fetch and install Rust-based executables as binaries. It aims to be a drop-in replacement for cargo install in most cases. Install it today with cargo install cargo-binstall, from the binaries below, or if you already have it, upgrade with cargo binstall cargo-binstall.

In this release:

  • Add a --bin argument to mirror cargo install --bin (#1961 #2189)

Other changes:

  • Upgrade dependencies

v1.12.7

Binstall is a tool to fetch and install Rust-based executables as binaries. It aims to be a drop-in replacement for cargo install in most cases. Install it today with cargo install cargo-binstall, from the binaries below, or if you already have it, upgrade with cargo binstall cargo-binstall.

In this release:

  • Fix updating installed crates manifest for custom registry (#2175 #2178)

Other changes:

  • Upgrade transitive dependencies
  • Ensure build script always waits for threads created (#2185)
  • optimization

v1.12.6

Binstall is a tool to fetch and install Rust-based executables as binaries. It aims to be a drop-in replacement for cargo install in most cases. Install it today with cargo install cargo-binstall, from the binaries below, or if you already have it, upgrade with cargo binstall cargo-binstall.

In this release:

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cargo-bins/cargo-binstall&package-manager=github_actions&previous-version=1.12.5&new-version=1.14.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: François Mockers --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97a8b6edba..08d34fec7a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ env: # If nightly is breaking CI, modify this variable to target a specific nightly version. NIGHTLY_TOOLCHAIN: nightly RUSTFLAGS: "-D warnings" - BINSTALL_VERSION: "v1.12.5" + BINSTALL_VERSION: "v1.14.1" concurrency: group: ${{github.workflow}}-${{github.ref}} @@ -272,7 +272,8 @@ jobs: timeout-minutes: 30 steps: - uses: actions/checkout@v4 - - uses: cargo-bins/cargo-binstall@v1.12.5 + # Update in sync with BINSTALL_VERSION + - uses: cargo-bins/cargo-binstall@v1.14.1 - name: Install taplo run: cargo binstall taplo-cli@0.9.3 --locked - name: Run Taplo From 83cd46a4dde828c6e40ceb7ef08bf238e5ea6730 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 19:41:47 -0400 Subject: [PATCH 44/68] Update criterion requirement from 0.5.1 to 0.6.0 (#19879) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- benches/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benches/Cargo.toml b/benches/Cargo.toml index a299a6526c..789207d823 100644 --- a/benches/Cargo.toml +++ b/benches/Cargo.toml @@ -10,7 +10,7 @@ autobenches = false [dependencies] # The primary crate that runs and analyzes our benchmarks. This is a regular dependency because the # `bench!` macro refers to it in its documentation. -criterion = { version = "0.5.1", features = ["html_reports"] } +criterion = { version = "0.6.0", features = ["html_reports"] } [dev-dependencies] # Bevy crates From 735eb88db98d5cce244e45a2e415fda4da6458b0 Mon Sep 17 00:00:00 2001 From: IceSentry Date: Mon, 30 Jun 2025 19:54:05 -0400 Subject: [PATCH 45/68] Use RenderStartup in custom_post_processing example (#19886) # Objective - This example uses a FromWorld impl to initialize a resource on startup - #19887 ## Solution - Use RenderStartup instead ## Testing - The example still works as expected --- examples/shader/custom_post_processing.rs | 137 ++++++++++------------ 1 file changed, 64 insertions(+), 73 deletions(-) diff --git a/examples/shader/custom_post_processing.rs b/examples/shader/custom_post_processing.rs index 64bf312c03..a075dfbdc1 100644 --- a/examples/shader/custom_post_processing.rs +++ b/examples/shader/custom_post_processing.rs @@ -27,7 +27,7 @@ use bevy::{ }, renderer::{RenderContext, RenderDevice}, view::ViewTarget, - RenderApp, + RenderApp, RenderStartup, }, }; @@ -66,6 +66,10 @@ impl Plugin for PostProcessPlugin { return; }; + // RenderStartup runs once on startup after all plugins are built + // It is useful to initialize data that will only live in the RenderApp + render_app.add_systems(RenderStartup, setup_pipeline); + render_app // Bevy's renderer uses a render graph which is a collection of nodes in a directed acyclic graph. // It currently runs on each view/camera and executes each node in the specified order. @@ -97,17 +101,6 @@ impl Plugin for PostProcessPlugin { ), ); } - - fn finish(&self, app: &mut App) { - // We need to get the render app from the main app - let Some(render_app) = app.get_sub_app_mut(RenderApp) else { - return; - }; - - render_app - // Initialize the pipeline - .init_resource::(); - } } #[derive(Debug, Hash, PartialEq, Eq, Clone, RenderLabel)] @@ -233,69 +226,67 @@ struct PostProcessPipeline { pipeline_id: CachedRenderPipelineId, } -impl FromWorld for PostProcessPipeline { - fn from_world(world: &mut World) -> Self { - let render_device = world.resource::(); - - // We need to define the bind group layout used for our pipeline - let layout = render_device.create_bind_group_layout( - "post_process_bind_group_layout", - &BindGroupLayoutEntries::sequential( - // The layout entries will only be visible in the fragment stage - ShaderStages::FRAGMENT, - ( - // The screen texture - texture_2d(TextureSampleType::Float { filterable: true }), - // The sampler that will be used to sample the screen texture - sampler(SamplerBindingType::Filtering), - // The settings uniform that will control the effect - uniform_buffer::(true), - ), +fn setup_pipeline( + mut commands: Commands, + render_device: Res, + asset_server: Res, + fullscreen_shader: Res, + pipeline_cache: Res, +) { + // We need to define the bind group layout used for our pipeline + let layout = render_device.create_bind_group_layout( + "post_process_bind_group_layout", + &BindGroupLayoutEntries::sequential( + // The layout entries will only be visible in the fragment stage + ShaderStages::FRAGMENT, + ( + // The screen texture + texture_2d(TextureSampleType::Float { filterable: true }), + // The sampler that will be used to sample the screen texture + sampler(SamplerBindingType::Filtering), + // The settings uniform that will control the effect + uniform_buffer::(true), ), - ); + ), + ); + // We can create the sampler here since it won't change at runtime and doesn't depend on the view + let sampler = render_device.create_sampler(&SamplerDescriptor::default()); - // We can create the sampler here since it won't change at runtime and doesn't depend on the view - let sampler = render_device.create_sampler(&SamplerDescriptor::default()); - - // Get the shader handle - let shader = world.load_asset(SHADER_ASSET_PATH); - // This will setup a fullscreen triangle for the vertex state. - let vertex_state = world.resource::().to_vertex_state(); - - let pipeline_id = world - .resource_mut::() - // This will add the pipeline to the cache and queue its creation - .queue_render_pipeline(RenderPipelineDescriptor { - label: Some("post_process_pipeline".into()), - layout: vec![layout.clone()], - vertex: vertex_state, - fragment: Some(FragmentState { - shader, - shader_defs: vec![], - // Make sure this matches the entry point of your shader. - // It can be anything as long as it matches here and in the shader. - entry_point: "fragment".into(), - targets: vec![Some(ColorTargetState { - format: TextureFormat::bevy_default(), - blend: None, - write_mask: ColorWrites::ALL, - })], - }), - // All of the following properties are not important for this effect so just use the default values. - // This struct doesn't have the Default trait implemented because not all fields can have a default value. - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, - }); - - Self { - layout, - sampler, - pipeline_id, - } - } + // Get the shader handle + let shader = asset_server.load(SHADER_ASSET_PATH); + // This will setup a fullscreen triangle for the vertex state. + let vertex_state = fullscreen_shader.to_vertex_state(); + let pipeline_id = pipeline_cache + // This will add the pipeline to the cache and queue its creation + .queue_render_pipeline(RenderPipelineDescriptor { + label: Some("post_process_pipeline".into()), + layout: vec![layout.clone()], + vertex: vertex_state, + fragment: Some(FragmentState { + shader, + shader_defs: vec![], + // Make sure this matches the entry point of your shader. + // It can be anything as long as it matches here and in the shader. + entry_point: "fragment".into(), + targets: vec![Some(ColorTargetState { + format: TextureFormat::bevy_default(), + blend: None, + write_mask: ColorWrites::ALL, + })], + }), + // All of the following properties are not important for this effect so just use the default values. + // This struct doesn't have the Default trait implemented because not all fields can have a default value. + primitive: PrimitiveState::default(), + depth_stencil: None, + multisample: MultisampleState::default(), + push_constant_ranges: vec![], + zero_initialize_workgroup_memory: false, + }); + commands.insert_resource(PostProcessPipeline { + layout, + sampler, + pipeline_id, + }); } // This is the component that will get passed to the shader From f98727c1b120956368ee67ab42b0215ac1505067 Mon Sep 17 00:00:00 2001 From: IceSentry Date: Mon, 30 Jun 2025 19:54:13 -0400 Subject: [PATCH 46/68] Use RenderStartup in MaterialPlugin (#19885) # Objective - The MaterialPlugin has some ugly code to initialize some data in the render world - #19887 ## Solution - Use the new RenderStartup schedule to use a system instead of using the plugin `finish()` ## Testing - Tested that the 3d_scene and shader_material example still work as expected --- crates/bevy_pbr/src/material.rs | 63 ++++++++++++++++----------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/crates/bevy_pbr/src/material.rs b/crates/bevy_pbr/src/material.rs index 0b86cd95e1..17603704e6 100644 --- a/crates/bevy_pbr/src/material.rs +++ b/crates/bevy_pbr/src/material.rs @@ -37,6 +37,7 @@ use bevy_render::erased_render_asset::{ use bevy_render::mesh::mark_3d_meshes_as_changed_if_their_assets_changed; use bevy_render::render_asset::{prepare_assets, RenderAssets}; use bevy_render::renderer::RenderQueue; +use bevy_render::RenderStartup; use bevy_render::{ batching::gpu_preprocessing::GpuPreprocessingSupport, extract_resource::ExtractResource, @@ -371,44 +372,40 @@ where } if let Some(render_app) = app.get_sub_app_mut(RenderApp) { - render_app.add_systems( - ExtractSchedule, - ( - extract_mesh_materials::.in_set(MaterialExtractionSystems), - early_sweep_material_instances:: - .after(MaterialExtractionSystems) - .before(late_sweep_material_instances), - extract_entities_needs_specialization::.after(extract_cameras), - ), - ); - } - } - - fn finish(&self, app: &mut App) { - let Some(render_app) = app.get_sub_app_mut(RenderApp) else { - return; - }; - - render_app.world_mut().resource_scope( - |world, mut bind_group_allocators: Mut| { - let render_device = world.resource::(); - bind_group_allocators.insert( - TypeId::of::(), - MaterialBindGroupAllocator::new( - render_device, - M::label(), - material_uses_bindless_resources::(render_device) - .then(|| M::bindless_descriptor()) - .flatten(), - M::bind_group_layout(render_device), - M::bindless_slot_count(), + render_app + .add_systems(RenderStartup, setup_render_app::) + .add_systems( + ExtractSchedule, + ( + extract_mesh_materials::.in_set(MaterialExtractionSystems), + early_sweep_material_instances:: + .after(MaterialExtractionSystems) + .before(late_sweep_material_instances), + extract_entities_needs_specialization::.after(extract_cameras), ), ); - }, - ); + } } } +fn setup_render_app( + render_device: Res, + mut bind_group_allocators: ResMut, +) { + bind_group_allocators.insert( + TypeId::of::(), + MaterialBindGroupAllocator::new( + &render_device, + M::label(), + material_uses_bindless_resources::(&render_device) + .then(|| M::bindless_descriptor()) + .flatten(), + M::bind_group_layout(&render_device), + M::bindless_slot_count(), + ), + ); +} + /// A dummy [`AssetId`] that we use as a placeholder whenever a mesh doesn't /// have a material. /// From bdd3ef71b8cfc0f0481fc718305be507c4118e3f Mon Sep 17 00:00:00 2001 From: Emerson Coskey Date: Mon, 30 Jun 2025 18:32:44 -0700 Subject: [PATCH 47/68] Composable Pipeline Specialization (#17373) Currently, our specialization API works through a series of wrapper structs and traits, which make things confusing to follow and difficult to generalize. This pr takes a different approach, where "specializers" (types that implement `Specialize`) are composable, but "flat" rather than composed of a series of wrappers. The key is that specializers don't *produce* pipeline descriptors, but instead *modify* existing ones: ```rs pub trait Specialize { type Key: SpecializeKey; fn specialize( &self, key: Self::Key, descriptor: &mut T::Descriptor ) -> Result, BevyError>; } ``` This lets us use some derive magic to stick multiple specializers together: ```rs pub struct A; pub struct B; impl Specialize for A { ... } impl Specialize for A { ... } #[derive(Specialize)] #[specialize(RenderPipeline)] struct C { // specialization is applied in struct field order applied_first: A, applied_second: B, } type C::Key = (A::Key, B::Key); ``` This approach is much easier to understand, IMO, and also lets us separate concerns better. Specializers can be placed in fully separate crates/modules, and key computation can be shared as well. The only real breaking change here is that since specializers only modify descriptors, we need a "base" descriptor to work off of. This can either be manually supplied when constructing a `Specializer` (the new collection replacing `Specialized[Render/Compute]Pipelines`), or supplied by implementing `HasBaseDescriptor` on a specializer. See `examples/shader/custom_phase_item.rs` for an example implementation. ## Testing - Did some simple manual testing of the derive macro, it seems robust. --- ## Showcase ```rs #[derive(Specialize, HasBaseDescriptor)] #[specialize(RenderPipeline)] pub struct SpecializeMeshMaterial { // set mesh bind group layout and shader defs mesh: SpecializeMesh, // set view bind group layout and shader defs view: SpecializeView, // since type SpecializeMaterial::Key = (), // we can hide it from the wrapper's external API #[key(default)] // defer to the GetBaseDescriptor impl of SpecializeMaterial, // since it carries the vertex and fragment handles #[base_descriptor] // set material bind group layout, etc material: SpecializeMaterial, } // implementation generated by the derive macro impl Specialize for SpecializeMeshMaterial { type Key = (MeshKey, ViewKey); fn specialize( &self, key: Self::Key, descriptor: &mut RenderPipelineDescriptor ) -> Result, BevyError> { let mesh_key = self.mesh.specialize(key.0, descriptor)?; let view_key = self.view.specialize(key.1, descriptor)?; let _ = self.material.specialize((), descriptor)?; Ok((mesh_key, view_key)); } } impl HasBaseDescriptor for SpecializeMeshMaterial { fn base_descriptor(&self) -> RenderPipelineDescriptor { self.material.base_descriptor() } } ``` --------- Co-authored-by: Tim Overbeek <158390905+Bleachfuel@users.noreply.github.com> --- crates/bevy_render/macros/src/lib.rs | 19 + crates/bevy_render/macros/src/specialize.rs | 483 ++++++++++++++++++ crates/bevy_render/src/render_resource/mod.rs | 2 + .../src/render_resource/pipeline.rs | 2 +- .../src/render_resource/specialize.rs | 400 +++++++++++++++ examples/shader/custom_phase_item.rs | 82 +-- .../composable_specialization.md | 153 ++++++ 7 files changed, 1103 insertions(+), 38 deletions(-) create mode 100644 crates/bevy_render/macros/src/specialize.rs create mode 100644 crates/bevy_render/src/render_resource/specialize.rs create mode 100644 release-content/migration-guides/composable_specialization.md diff --git a/crates/bevy_render/macros/src/lib.rs b/crates/bevy_render/macros/src/lib.rs index c58a8fd146..35990f465f 100644 --- a/crates/bevy_render/macros/src/lib.rs +++ b/crates/bevy_render/macros/src/lib.rs @@ -4,6 +4,7 @@ mod as_bind_group; mod extract_component; mod extract_resource; +mod specialize; use bevy_macro_utils::{derive_label, BevyManifest}; use proc_macro::TokenStream; @@ -14,6 +15,10 @@ pub(crate) fn bevy_render_path() -> syn::Path { BevyManifest::shared().get_path("bevy_render") } +pub(crate) fn bevy_ecs_path() -> syn::Path { + BevyManifest::shared().get_path("bevy_ecs") +} + #[proc_macro_derive(ExtractResource)] pub fn derive_extract_resource(input: TokenStream) -> TokenStream { extract_resource::derive_extract_resource(input) @@ -102,6 +107,20 @@ pub fn derive_render_sub_graph(input: TokenStream) -> TokenStream { derive_label(input, "RenderSubGraph", &trait_path) } +/// Derive macro generating an impl of the trait `Specialize` +/// +/// This only works for structs whose members all implement `Specialize` +#[proc_macro_derive(Specialize, attributes(specialize, key, base_descriptor))] +pub fn derive_specialize(input: TokenStream) -> TokenStream { + specialize::impl_specialize(input) +} + +/// Derive macro generating the most common impl of the trait `SpecializerKey` +#[proc_macro_derive(SpecializerKey)] +pub fn derive_specializer_key(input: TokenStream) -> TokenStream { + specialize::impl_specializer_key(input) +} + #[proc_macro_derive(ShaderLabel)] pub fn derive_shader_label(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); diff --git a/crates/bevy_render/macros/src/specialize.rs b/crates/bevy_render/macros/src/specialize.rs new file mode 100644 index 0000000000..092de6e8d7 --- /dev/null +++ b/crates/bevy_render/macros/src/specialize.rs @@ -0,0 +1,483 @@ +use bevy_macro_utils::fq_std::{FQDefault, FQResult}; +use proc_macro::TokenStream; +use proc_macro2::Span; +use quote::{format_ident, quote}; +use syn::{ + parse, + parse::{Parse, ParseStream}, + parse_macro_input, parse_quote, + spanned::Spanned, + Data, DataStruct, DeriveInput, Expr, Fields, Ident, Index, Member, Meta, MetaList, Pat, Path, + Token, Type, WherePredicate, +}; + +const SPECIALIZE_ATTR_IDENT: &str = "specialize"; +const SPECIALIZE_ALL_IDENT: &str = "all"; + +const KEY_ATTR_IDENT: &str = "key"; +const KEY_DEFAULT_IDENT: &str = "default"; + +const BASE_DESCRIPTOR_ATTR_IDENT: &str = "base_descriptor"; + +enum SpecializeImplTargets { + All, + Specific(Vec), +} + +impl Parse for SpecializeImplTargets { + fn parse(input: ParseStream) -> syn::Result { + let paths = input.parse_terminated(Path::parse, Token![,])?; + if paths + .first() + .is_some_and(|p| p.is_ident(SPECIALIZE_ALL_IDENT)) + { + Ok(SpecializeImplTargets::All) + } else { + Ok(SpecializeImplTargets::Specific(paths.into_iter().collect())) + } + } +} + +#[derive(Clone)] +enum Key { + Whole, + Default, + Index(Index), + Custom(Expr), +} + +impl Key { + fn expr(&self) -> Expr { + match self { + Key::Whole => parse_quote!(key), + Key::Default => parse_quote!(#FQDefault::default()), + Key::Index(index) => { + let member = Member::Unnamed(index.clone()); + parse_quote!(key.#member) + } + Key::Custom(expr) => expr.clone(), + } + } +} + +const KEY_ERROR_MSG: &str = "Invalid key override. Must be either `default` or a valid Rust expression of the correct key type"; + +impl Parse for Key { + fn parse(input: ParseStream) -> syn::Result { + if let Ok(ident) = input.parse::() { + if ident == KEY_DEFAULT_IDENT { + Ok(Key::Default) + } else { + Err(syn::Error::new_spanned(ident, KEY_ERROR_MSG)) + } + } else { + input.parse::().map(Key::Custom).map_err(|mut err| { + err.extend(syn::Error::new(err.span(), KEY_ERROR_MSG)); + err + }) + } + } +} + +#[derive(Clone)] +struct FieldInfo { + ty: Type, + member: Member, + key: Key, + use_base_descriptor: bool, +} + +impl FieldInfo { + fn key_ty(&self, specialize_path: &Path, target_path: &Path) -> Option { + let ty = &self.ty; + matches!(self.key, Key::Whole | Key::Index(_)) + .then_some(parse_quote!(<#ty as #specialize_path::Specialize<#target_path>>::Key)) + } + + fn key_ident(&self, ident: Ident) -> Option { + matches!(self.key, Key::Whole | Key::Index(_)).then_some(ident) + } + + fn specialize_expr(&self, specialize_path: &Path, target_path: &Path) -> Expr { + let FieldInfo { + ty, member, key, .. + } = &self; + let key_expr = key.expr(); + parse_quote!(<#ty as #specialize_path::Specialize<#target_path>>::specialize(&self.#member, #key_expr, descriptor)) + } + + fn specialize_predicate(&self, specialize_path: &Path, target_path: &Path) -> WherePredicate { + let ty = &self.ty; + if matches!(&self.key, Key::Default) { + parse_quote!(#ty: #specialize_path::Specialize<#target_path, Key: #FQDefault>) + } else { + parse_quote!(#ty: #specialize_path::Specialize<#target_path>) + } + } + + fn get_base_descriptor_predicate( + &self, + specialize_path: &Path, + target_path: &Path, + ) -> WherePredicate { + let ty = &self.ty; + parse_quote!(#ty: #specialize_path::GetBaseDescriptor<#target_path>) + } +} + +fn get_field_info(fields: &Fields, targets: &SpecializeImplTargets) -> syn::Result> { + let mut field_info: Vec = Vec::new(); + let mut used_count = 0; + let mut single_index = 0; + for (index, field) in fields.iter().enumerate() { + let field_ty = field.ty.clone(); + let field_member = field.ident.clone().map_or( + Member::Unnamed(Index { + index: index as u32, + span: field.span(), + }), + Member::Named, + ); + let key_index = Index { + index: used_count, + span: field.span(), + }; + + let mut use_key_field = true; + let mut key = Key::Index(key_index); + let mut use_base_descriptor = false; + for attr in &field.attrs { + match &attr.meta { + Meta::Path(path) if path.is_ident(&BASE_DESCRIPTOR_ATTR_IDENT) => { + use_base_descriptor = true; + } + Meta::List(MetaList { path, tokens, .. }) if path.is_ident(&KEY_ATTR_IDENT) => { + let owned_tokens = tokens.clone().into(); + let Ok(parsed_key) = parse::(owned_tokens) else { + return Err(syn::Error::new( + attr.span(), + "Invalid key override attribute", + )); + }; + key = parsed_key; + if matches!( + (&key, &targets), + (Key::Custom(_), SpecializeImplTargets::All) + ) { + return Err(syn::Error::new( + attr.span(), + "#[key(default)] is the only key override type allowed with #[specialize(all)]", + )); + } + use_key_field = false; + } + _ => {} + } + } + + if use_key_field { + used_count += 1; + single_index = index; + } + + field_info.push(FieldInfo { + ty: field_ty, + member: field_member, + key, + use_base_descriptor, + }); + } + + if used_count == 1 { + field_info[single_index].key = Key::Whole; + } + + Ok(field_info) +} + +fn get_struct_fields<'a>(ast: &'a DeriveInput, derive_name: &str) -> syn::Result<&'a Fields> { + match &ast.data { + Data::Struct(DataStruct { fields, .. }) => Ok(fields), + Data::Enum(data_enum) => Err(syn::Error::new( + data_enum.enum_token.span(), + format!("#[derive({derive_name})] only supports structs."), + )), + Data::Union(data_union) => Err(syn::Error::new( + data_union.union_token.span(), + format!("#[derive({derive_name})] only supports structs."), + )), + } +} + +fn get_specialize_targets( + ast: &DeriveInput, + derive_name: &str, +) -> syn::Result { + let specialize_attr = ast.attrs.iter().find_map(|attr| { + if attr.path().is_ident(SPECIALIZE_ATTR_IDENT) { + if let Meta::List(meta_list) = &attr.meta { + return Some(meta_list); + } + } + None + }); + let Some(specialize_meta_list) = specialize_attr else { + return Err(syn::Error::new( + Span::call_site(), + format!("#[derive({derive_name})] must be accompanied by #[specialize(..targets)].\n Example usages: #[specialize(RenderPipeline)], #[specialize(all)]") + )); + }; + parse::(specialize_meta_list.tokens.clone().into()) +} + +macro_rules! guard { + ($expr: expr) => { + match $expr { + Ok(__val) => __val, + Err(err) => return err.to_compile_error().into(), + } + }; +} + +pub fn impl_specialize(input: TokenStream) -> TokenStream { + let bevy_render_path: Path = crate::bevy_render_path(); + let specialize_path = { + let mut path = bevy_render_path.clone(); + path.segments.push(format_ident!("render_resource").into()); + path + }; + + let ecs_path = crate::bevy_ecs_path(); + + let ast = parse_macro_input!(input as DeriveInput); + let targets = guard!(get_specialize_targets(&ast, "Specialize")); + let fields = guard!(get_struct_fields(&ast, "Specialize")); + let field_info = guard!(get_field_info(fields, &targets)); + + let key_idents: Vec> = field_info + .iter() + .enumerate() + .map(|(i, field_info)| field_info.key_ident(format_ident!("key{i}"))) + .collect(); + let key_tuple_idents: Vec = key_idents.iter().flatten().cloned().collect(); + let ignore_pat: Pat = parse_quote!(_); + let key_patterns: Vec = key_idents + .iter() + .map(|key_ident| match key_ident { + Some(key_ident) => parse_quote!(#key_ident), + None => ignore_pat.clone(), + }) + .collect(); + + let base_descriptor_fields = field_info + .iter() + .filter(|field| field.use_base_descriptor) + .collect::>(); + + if base_descriptor_fields.len() > 1 { + return syn::Error::new( + Span::call_site(), + "Too many #[base_descriptor] attributes found. It must be present on exactly one field", + ) + .into_compile_error() + .into(); + } + + let base_descriptor_field = base_descriptor_fields.first().copied(); + + match targets { + SpecializeImplTargets::All => { + let specialize_impl = impl_specialize_all( + &specialize_path, + &ecs_path, + &ast, + &field_info, + &key_patterns, + &key_tuple_idents, + ); + let get_base_descriptor_impl = base_descriptor_field + .map(|field_info| impl_get_base_descriptor_all(&specialize_path, &ast, field_info)) + .unwrap_or_default(); + [specialize_impl, get_base_descriptor_impl] + .into_iter() + .collect() + } + SpecializeImplTargets::Specific(targets) => { + let specialize_impls = targets.iter().map(|target| { + impl_specialize_specific( + &specialize_path, + &ecs_path, + &ast, + &field_info, + target, + &key_patterns, + &key_tuple_idents, + ) + }); + let get_base_descriptor_impls = targets.iter().filter_map(|target| { + base_descriptor_field.map(|field_info| { + impl_get_base_descriptor_specific(&specialize_path, &ast, field_info, target) + }) + }); + specialize_impls.chain(get_base_descriptor_impls).collect() + } + } +} + +fn impl_specialize_all( + specialize_path: &Path, + ecs_path: &Path, + ast: &DeriveInput, + field_info: &[FieldInfo], + key_patterns: &[Pat], + key_tuple_idents: &[Ident], +) -> TokenStream { + let target_path = Path::from(format_ident!("T")); + let key_elems: Vec = field_info + .iter() + .filter_map(|field_info| field_info.key_ty(specialize_path, &target_path)) + .collect(); + let specialize_exprs: Vec = field_info + .iter() + .map(|field_info| field_info.specialize_expr(specialize_path, &target_path)) + .collect(); + + let struct_name = &ast.ident; + let mut generics = ast.generics.clone(); + generics.params.insert( + 0, + parse_quote!(#target_path: #specialize_path::Specializable), + ); + + if !field_info.is_empty() { + let where_clause = generics.make_where_clause(); + for field in field_info { + where_clause + .predicates + .push(field.specialize_predicate(specialize_path, &target_path)); + } + } + + let (_, type_generics, _) = ast.generics.split_for_impl(); + let (impl_generics, _, where_clause) = &generics.split_for_impl(); + + TokenStream::from(quote! { + impl #impl_generics #specialize_path::Specialize<#target_path> for #struct_name #type_generics #where_clause { + type Key = (#(#key_elems),*); + + fn specialize( + &self, + key: Self::Key, + descriptor: &mut <#target_path as #specialize_path::Specializable>::Descriptor + ) -> #FQResult<#specialize_path::Canonical, #ecs_path::error::BevyError> { + #(let #key_patterns = #specialize_exprs?;)* + #FQResult::Ok((#(#key_tuple_idents),*)) + } + } + }) +} + +fn impl_specialize_specific( + specialize_path: &Path, + ecs_path: &Path, + ast: &DeriveInput, + field_info: &[FieldInfo], + target_path: &Path, + key_patterns: &[Pat], + key_tuple_idents: &[Ident], +) -> TokenStream { + let key_elems: Vec = field_info + .iter() + .filter_map(|field_info| field_info.key_ty(specialize_path, target_path)) + .collect(); + let specialize_exprs: Vec = field_info + .iter() + .map(|field_info| field_info.specialize_expr(specialize_path, target_path)) + .collect(); + + let struct_name = &ast.ident; + let (impl_generics, type_generics, where_clause) = &ast.generics.split_for_impl(); + + TokenStream::from(quote! { + impl #impl_generics #specialize_path::Specialize<#target_path> for #struct_name #type_generics #where_clause { + type Key = (#(#key_elems),*); + + fn specialize( + &self, + key: Self::Key, + descriptor: &mut <#target_path as #specialize_path::Specializable>::Descriptor + ) -> #FQResult<#specialize_path::Canonical, #ecs_path::error::BevyError> { + #(let #key_patterns = #specialize_exprs?;)* + #FQResult::Ok((#(#key_tuple_idents),*)) + } + } + }) +} + +fn impl_get_base_descriptor_specific( + specialize_path: &Path, + ast: &DeriveInput, + base_descriptor_field_info: &FieldInfo, + target_path: &Path, +) -> TokenStream { + let struct_name = &ast.ident; + let (impl_generics, type_generics, where_clause) = &ast.generics.split_for_impl(); + let field_ty = &base_descriptor_field_info.ty; + let field_member = &base_descriptor_field_info.member; + TokenStream::from(quote!( + impl #impl_generics #specialize_path::GetBaseDescriptor<#target_path> for #struct_name #type_generics #where_clause { + fn get_base_descriptor(&self) -> <#target_path as #specialize_path::Specializable>::Descriptor { + <#field_ty as #specialize_path::GetBaseDescriptor<#target_path>>::base_descriptor(&self.#field_member) + } + } + )) +} + +fn impl_get_base_descriptor_all( + specialize_path: &Path, + ast: &DeriveInput, + base_descriptor_field_info: &FieldInfo, +) -> TokenStream { + let target_path = Path::from(format_ident!("T")); + let struct_name = &ast.ident; + let mut generics = ast.generics.clone(); + generics.params.insert( + 0, + parse_quote!(#target_path: #specialize_path::Specializable), + ); + + let where_clause = generics.make_where_clause(); + where_clause.predicates.push( + base_descriptor_field_info.get_base_descriptor_predicate(specialize_path, &target_path), + ); + + let (_, type_generics, _) = ast.generics.split_for_impl(); + let (impl_generics, _, where_clause) = &generics.split_for_impl(); + let field_ty = &base_descriptor_field_info.ty; + let field_member = &base_descriptor_field_info.member; + TokenStream::from(quote! { + impl #impl_generics #specialize_path::GetBaseDescriptor<#target_path> for #struct_name #type_generics #where_clause { + fn get_base_descriptor(&self) -> <#target_path as #specialize_path::Specializable>::Descriptor { + <#field_ty as #specialize_path::GetBaseDescriptor<#target_path>>::base_descriptor(&self.#field_member) + } + } + }) +} + +pub fn impl_specializer_key(input: TokenStream) -> TokenStream { + let bevy_render_path: Path = crate::bevy_render_path(); + let specialize_path = { + let mut path = bevy_render_path.clone(); + path.segments.push(format_ident!("render_resource").into()); + path + }; + + let ast = parse_macro_input!(input as DeriveInput); + let ident = ast.ident; + TokenStream::from(quote!( + impl #specialize_path::SpecializerKey for #ident { + const IS_CANONICAL: bool = true; + type Canonical = Self; + } + )) +} diff --git a/crates/bevy_render/src/render_resource/mod.rs b/crates/bevy_render/src/render_resource/mod.rs index 09be66e840..9233d9e4c4 100644 --- a/crates/bevy_render/src/render_resource/mod.rs +++ b/crates/bevy_render/src/render_resource/mod.rs @@ -12,6 +12,7 @@ mod pipeline_cache; mod pipeline_specializer; pub mod resource_macros; mod shader; +mod specialize; mod storage_buffer; mod texture; mod uniform_buffer; @@ -28,6 +29,7 @@ pub use pipeline::*; pub use pipeline_cache::*; pub use pipeline_specializer::*; pub use shader::*; +pub use specialize::*; pub use storage_buffer::*; pub use texture::*; pub use uniform_buffer::*; diff --git a/crates/bevy_render/src/render_resource/pipeline.rs b/crates/bevy_render/src/render_resource/pipeline.rs index b76174cac3..35020a43c3 100644 --- a/crates/bevy_render/src/render_resource/pipeline.rs +++ b/crates/bevy_render/src/render_resource/pipeline.rs @@ -138,7 +138,7 @@ pub struct FragmentState { } /// Describes a compute pipeline. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct ComputePipelineDescriptor { pub label: Option>, pub layout: Vec, diff --git a/crates/bevy_render/src/render_resource/specialize.rs b/crates/bevy_render/src/render_resource/specialize.rs new file mode 100644 index 0000000000..c2269b1a78 --- /dev/null +++ b/crates/bevy_render/src/render_resource/specialize.rs @@ -0,0 +1,400 @@ +use super::{ + CachedComputePipelineId, CachedRenderPipelineId, ComputePipeline, ComputePipelineDescriptor, + PipelineCache, RenderPipeline, RenderPipelineDescriptor, +}; +use bevy_ecs::{ + error::BevyError, + resource::Resource, + world::{FromWorld, World}, +}; +use bevy_platform::{ + collections::{ + hash_map::{Entry, VacantEntry}, + HashMap, + }, + hash::FixedHasher, +}; +use core::{hash::Hash, marker::PhantomData}; +use tracing::error; +use variadics_please::all_tuples; + +pub use bevy_render_macros::{Specialize, SpecializerKey}; + +/// Defines a type that is able to be "specialized" and cached by creating and transforming +/// its descriptor type. This is implemented for [`RenderPipeline`] and [`ComputePipeline`], and +/// likely will not have much utility for other types. +pub trait Specializable { + type Descriptor: PartialEq + Clone + Send + Sync; + type CachedId: Clone + Send + Sync; + fn queue(pipeline_cache: &PipelineCache, descriptor: Self::Descriptor) -> Self::CachedId; + fn get_descriptor(pipeline_cache: &PipelineCache, id: Self::CachedId) -> &Self::Descriptor; +} + +impl Specializable for RenderPipeline { + type Descriptor = RenderPipelineDescriptor; + type CachedId = CachedRenderPipelineId; + + fn queue(pipeline_cache: &PipelineCache, descriptor: Self::Descriptor) -> Self::CachedId { + pipeline_cache.queue_render_pipeline(descriptor) + } + + fn get_descriptor( + pipeline_cache: &PipelineCache, + id: CachedRenderPipelineId, + ) -> &Self::Descriptor { + pipeline_cache.get_render_pipeline_descriptor(id) + } +} + +impl Specializable for ComputePipeline { + type Descriptor = ComputePipelineDescriptor; + + type CachedId = CachedComputePipelineId; + + fn queue(pipeline_cache: &PipelineCache, descriptor: Self::Descriptor) -> Self::CachedId { + pipeline_cache.queue_compute_pipeline(descriptor) + } + + fn get_descriptor( + pipeline_cache: &PipelineCache, + id: CachedComputePipelineId, + ) -> &Self::Descriptor { + pipeline_cache.get_compute_pipeline_descriptor(id) + } +} + +/// Defines a type that is able to transform descriptors for a specializable +/// type T, based on a hashable key type. +/// +/// This is mainly used when "specializing" render +/// pipelines, i.e. specifying shader defs and binding layout based on the key, +/// the result of which can then be cached and accessed quickly later. +/// +/// This trait can be derived with `#[derive(Specializer)]` for structs whose +/// fields all implement [`Specializer`]. The key type will be tuple of the keys +/// of each field, and their specialization logic will be applied in field +/// order. Since derive macros can't have generic parameters, the derive macro +/// requires an additional `#[specialize(..targets)]` attribute to specify a +/// list of types to target for the implementation. `#[specialize(all)]` is +/// also allowed, and will generate a fully generic implementation at the cost +/// of slightly worse error messages. +/// +/// Additionally, each field can optionally take a `#[key]` attribute to +/// specify a "key override". This will "hide" that field's key from being +/// exposed by the wrapper, and always use the value given by the attribute. +/// Values for this attribute may either be `default` which will use the key's +/// [`Default`] implementation, or a valid rust +/// expression of the key type. +/// +/// Example: +/// ```rs +/// # use super::RenderPipeline; +/// # use super::RenderPipelineDescriptor; +/// # use bevy_ecs::error::BevyError; +/// +/// struct A; +/// struct B; +/// #[derive(Copy, Clone, PartialEq, Eq, Hash, SpecializerKey)] +/// struct BKey; +/// +/// impl Specializer for A { +/// type Key = (); +/// +/// fn specializer(&self, key: (), descriptor: &mut RenderPipelineDescriptor) -> Result<(), BevyError> { +/// # let _ = (key, descriptor); +/// //... +/// Ok(()) +/// } +/// } +/// +/// impl Specializer for B { +/// type Key = BKey; +/// +/// fn specialize(&self, _key: Bkey, _descriptor: &mut RenderPipelineDescriptor) -> Result { +/// # let _ = (key, descriptor); +/// //... +/// Ok(BKey) +/// } +/// } +/// +/// #[derive(Specializer)] +/// #[specialize(RenderPipeline)] +/// struct C { +/// #[key(default)] +/// a: A, +/// b: B, +/// } +/// +/// /* +/// The generated implementation: +/// impl Specializer for C { +/// type Key = BKey; +/// fn specialize( +/// &self, +/// key: Self::Key, +/// descriptor: &mut RenderPipelineDescriptor +/// ) -> Result, BevyError> { +/// let _ = self.a.specialize((), descriptor); +/// let key = self.b.specialize(key, descriptor); +/// Ok(key) +/// } +/// } +/// */ +/// ``` +pub trait Specializer: Send + Sync + 'static { + type Key: SpecializerKey; + fn specialize( + &self, + key: Self::Key, + descriptor: &mut T::Descriptor, + ) -> Result, BevyError>; +} + +/// Defines a type that is able to be used as a key for types that `impl Specialize` +/// +/// **Most types should implement this trait with `IS_CANONICAL = true` and `Canonical = Self`**. +/// This is the implementation generated by `#[derive(SpecializerKey)]` +/// +/// In this case, "canonical" means that each unique value of this type will produce +/// a unique specialized result, which isn't true in general. `MeshVertexBufferLayout` +/// is a good example of a type that's `Eq + Hash`, but that isn't canonical: vertex +/// attributes could be specified in any order, or there could be more attributes +/// provided than the specialized pipeline requires. Its `Canonical` key type would +/// be `VertexBufferLayout`, the final layout required by the pipeline. +/// +/// Processing keys into canonical keys this way allows the `SpecializedCache` to reuse +/// resources more eagerly where possible. +pub trait SpecializerKey: Clone + Hash + Eq { + /// Denotes whether this key is canonical or not. This should only be `true` + /// if and only if `Canonical = Self`. + const IS_CANONICAL: bool; + + /// The canonical key type to convert this into during specialization. + type Canonical: Hash + Eq; +} + +pub type Canonical = ::Canonical; + +impl Specializer for () { + type Key = (); + + fn specialize( + &self, + _key: Self::Key, + _descriptor: &mut T::Descriptor, + ) -> Result<(), BevyError> { + Ok(()) + } +} + +impl Specializer for PhantomData { + type Key = (); + + fn specialize( + &self, + _key: Self::Key, + _descriptor: &mut T::Descriptor, + ) -> Result<(), BevyError> { + Ok(()) + } +} + +macro_rules! impl_specialization_key_tuple { + ($($T:ident),*) => { + impl <$($T: SpecializerKey),*> SpecializerKey for ($($T,)*) { + const IS_CANONICAL: bool = true $(&& <$T as SpecializerKey>::IS_CANONICAL)*; + type Canonical = ($(Canonical<$T>,)*); + } + }; +} + +all_tuples!(impl_specialization_key_tuple, 0, 12, T); + +/// Defines a specializer that can also provide a "base descriptor". +/// +/// In order to be composable, [`Specializer`] implementers don't create full +/// descriptors, only transform them. However, [`SpecializedCache`]s need a +/// "base descriptor" at creation time in order to have something for the +/// [`Specializer`] implementation to work off of. This trait allows +/// [`SpecializedCache`] to impl [`FromWorld`] for [`Specializer`] +/// implementations that also satisfy [`FromWorld`] and [`GetBaseDescriptor`]. +/// +/// This trait can be also derived with `#[derive(Specializer)]`, by marking +/// a field with `#[base_descriptor]` to use its [`GetBaseDescriptor`] implementation. +/// +/// Example: +/// ```rs +/// struct A; +/// struct B; +/// +/// impl Specializer for A { +/// type Key = (); +/// +/// fn specialize(&self, _key: (), _descriptor: &mut RenderPipelineDescriptor) { +/// //... +/// } +/// } +/// +/// impl Specializer for B { +/// type Key = u32; +/// +/// fn specialize(&self, _key: u32, _descriptor: &mut RenderPipelineDescriptor) { +/// //... +/// } +/// } +/// +/// impl GetBaseDescriptor for B { +/// fn get_base_descriptor(&self) -> RenderPipelineDescriptor { +/// # todo!() +/// //... +/// } +/// } +/// +/// +/// #[derive(Specializer)] +/// #[specialize(RenderPipeline)] +/// struct C { +/// #[key(default)] +/// a: A, +/// #[base_descriptor] +/// b: B, +/// } +/// +/// /* +/// The generated implementation: +/// impl GetBaseDescriptor for C { +/// fn get_base_descriptor(&self) -> RenderPipelineDescriptor { +/// self.b.base_descriptor() +/// } +/// } +/// */ +/// ``` +pub trait GetBaseDescriptor: Specializer { + fn get_base_descriptor(&self) -> T::Descriptor; +} + +pub type SpecializerFn = + fn(>::Key, &mut ::Descriptor) -> Result<(), BevyError>; + +/// A cache for specializable resources. For a given key type the resulting +/// resource will only be created if it is missing, retrieving it from the +/// cache otherwise. +#[derive(Resource)] +pub struct SpecializedCache> { + specializer: S, + user_specializer: Option>, + base_descriptor: T::Descriptor, + primary_cache: HashMap, + secondary_cache: HashMap, T::CachedId>, +} + +impl> SpecializedCache { + /// Creates a new [`SpecializedCache`] from a [`Specializer`], + /// an optional "user specializer", and a base descriptor. The + /// user specializer is applied after the [`Specializer`], with + /// the same key. + #[inline] + pub fn new( + specializer: S, + user_specializer: Option>, + base_descriptor: T::Descriptor, + ) -> Self { + Self { + specializer, + user_specializer, + base_descriptor, + primary_cache: Default::default(), + secondary_cache: Default::default(), + } + } + + /// Specializes a resource given the [`Specializer`]'s key type. + #[inline] + pub fn specialize( + &mut self, + pipeline_cache: &PipelineCache, + key: S::Key, + ) -> Result { + let entry = self.primary_cache.entry(key.clone()); + match entry { + Entry::Occupied(entry) => Ok(entry.get().clone()), + Entry::Vacant(entry) => Self::specialize_slow( + &self.specializer, + self.user_specializer, + self.base_descriptor.clone(), + pipeline_cache, + key, + entry, + &mut self.secondary_cache, + ), + } + } + + #[cold] + fn specialize_slow( + specializer: &S, + user_specializer: Option>, + base_descriptor: T::Descriptor, + pipeline_cache: &PipelineCache, + key: S::Key, + primary_entry: VacantEntry, + secondary_cache: &mut HashMap, T::CachedId>, + ) -> Result { + let mut descriptor = base_descriptor.clone(); + let canonical_key = specializer.specialize(key.clone(), &mut descriptor)?; + + if let Some(user_specializer) = user_specializer { + (user_specializer)(key, &mut descriptor)?; + } + + // if the whole key is canonical, the secondary cache isn't needed. + if ::IS_CANONICAL { + return Ok(primary_entry + .insert(::queue(pipeline_cache, descriptor)) + .clone()); + } + + let id = match secondary_cache.entry(canonical_key) { + Entry::Occupied(entry) => { + if cfg!(debug_assertions) { + let stored_descriptor = + ::get_descriptor(pipeline_cache, entry.get().clone()); + if &descriptor != stored_descriptor { + error!( + "Invalid Specializer<{}> impl for {}: the cached descriptor \ + is not equal to the generated descriptor for the given key. \ + This means the Specializer implementation uses unused information \ + from the key to specialize the pipeline. This is not allowed \ + because it would invalidate the cache.", + core::any::type_name::(), + core::any::type_name::() + ); + } + } + entry.into_mut().clone() + } + Entry::Vacant(entry) => entry + .insert(::queue(pipeline_cache, descriptor)) + .clone(), + }; + + primary_entry.insert(id.clone()); + Ok(id) + } +} + +/// [`SpecializedCache`] implements [`FromWorld`] for [`Specializer`]s +/// that also satisfy [`FromWorld`] and [`GetBaseDescriptor`]. This will +/// create a [`SpecializedCache`] with no user specializer, and the base +/// descriptor take from the specializer's [`GetBaseDescriptor`] implementation. +impl FromWorld for SpecializedCache +where + T: Specializable, + S: FromWorld + Specializer + GetBaseDescriptor, +{ + fn from_world(world: &mut World) -> Self { + let specializer = S::from_world(world); + let base_descriptor = specializer.get_base_descriptor(); + Self::new(specializer, None, base_descriptor) + } +} diff --git a/examples/shader/custom_phase_item.rs b/examples/shader/custom_phase_item.rs index b363a7c27f..f06aba1403 100644 --- a/examples/shader/custom_phase_item.rs +++ b/examples/shader/custom_phase_item.rs @@ -24,11 +24,11 @@ use bevy::{ ViewBinnedRenderPhases, }, render_resource::{ - BufferUsages, ColorTargetState, ColorWrites, CompareFunction, DepthStencilState, - FragmentState, IndexFormat, MultisampleState, PipelineCache, PrimitiveState, - RawBufferVec, RenderPipelineDescriptor, SpecializedRenderPipeline, - SpecializedRenderPipelines, TextureFormat, VertexAttribute, VertexBufferLayout, - VertexFormat, VertexState, VertexStepMode, + BufferUsages, Canonical, ColorTargetState, ColorWrites, CompareFunction, + DepthStencilState, FragmentState, GetBaseDescriptor, IndexFormat, MultisampleState, + PipelineCache, PrimitiveState, RawBufferVec, RenderPipeline, RenderPipelineDescriptor, + SpecializedCache, Specializer, SpecializerKey, TextureFormat, VertexAttribute, + VertexBufferLayout, VertexFormat, VertexState, VertexStepMode, }, renderer::{RenderDevice, RenderQueue}, view::{self, ExtractedView, RenderVisibleEntities, VisibilityClass}, @@ -49,14 +49,6 @@ use bytemuck::{Pod, Zeroable}; #[component(on_add = view::add_visibility_class::)] struct CustomRenderedEntity; -/// Holds a reference to our shader. -/// -/// This is loaded at app creation time. -#[derive(Resource)] -struct CustomPhasePipeline { - shader: Handle, -} - /// A [`RenderCommand`] that binds the vertex and index buffers and issues the /// draw command for our custom phase item. struct DrawCustomPhaseItem; @@ -175,8 +167,7 @@ fn main() { // We make sure to add these to the render app, not the main app. app.get_sub_app_mut(RenderApp) .unwrap() - .init_resource::() - .init_resource::>() + .init_resource::>() .add_render_command::() .add_systems( Render, @@ -221,10 +212,9 @@ fn prepare_custom_phase_item_buffers(mut commands: Commands) { /// the opaque render phases of each view. fn queue_custom_phase_item( pipeline_cache: Res, - custom_phase_pipeline: Res, mut opaque_render_phases: ResMut>, opaque_draw_functions: Res>, - mut specialized_render_pipelines: ResMut>, + mut specializer: ResMut>, views: Query<(&ExtractedView, &RenderVisibleEntities, &Msaa)>, mut next_tick: Local, ) { @@ -247,11 +237,10 @@ fn queue_custom_phase_item( // some per-view settings, such as whether the view is HDR, but for // simplicity's sake we simply hard-code the view's characteristics, // with the exception of number of MSAA samples. - let pipeline_id = specialized_render_pipelines.specialize( - &pipeline_cache, - &custom_phase_pipeline, - *msaa, - ); + let Ok(pipeline_id) = specializer.specialize(&pipeline_cache, CustomPhaseKey(*msaa)) + else { + continue; + }; // Bump the change tick in order to force Bevy to rebuild the bin. let this_tick = next_tick.get() + 1; @@ -286,10 +275,40 @@ fn queue_custom_phase_item( } } -impl SpecializedRenderPipeline for CustomPhasePipeline { - type Key = Msaa; +/// Holds a reference to our shader. +/// +/// This is loaded at app creation time. +struct CustomPhaseSpecializer { + shader: Handle, +} - fn specialize(&self, msaa: Self::Key) -> RenderPipelineDescriptor { +impl FromWorld for CustomPhaseSpecializer { + fn from_world(world: &mut World) -> Self { + let asset_server = world.resource::(); + Self { + shader: asset_server.load("shaders/custom_phase_item.wgsl"), + } + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Hash, SpecializerKey)] +struct CustomPhaseKey(Msaa); + +impl Specializer for CustomPhaseSpecializer { + type Key = CustomPhaseKey; + + fn specialize( + &self, + key: Self::Key, + descriptor: &mut RenderPipelineDescriptor, + ) -> Result, BevyError> { + descriptor.multisample.count = key.0.samples(); + Ok(key) + } +} + +impl GetBaseDescriptor for CustomPhaseSpecializer { + fn get_base_descriptor(&self) -> RenderPipelineDescriptor { RenderPipelineDescriptor { label: Some("custom render pipeline".into()), layout: vec![], @@ -340,7 +359,7 @@ impl SpecializedRenderPipeline for CustomPhasePipeline { bias: default(), }), multisample: MultisampleState { - count: msaa.samples(), + count: 0, mask: !0, alpha_to_coverage_enabled: false, }, @@ -375,14 +394,3 @@ impl FromWorld for CustomPhaseItemBuffers { } } } - -impl FromWorld for CustomPhasePipeline { - fn from_world(world: &mut World) -> Self { - // Load and compile the shader in the background. - let asset_server = world.resource::(); - - CustomPhasePipeline { - shader: asset_server.load("shaders/custom_phase_item.wgsl"), - } - } -} diff --git a/release-content/migration-guides/composable_specialization.md b/release-content/migration-guides/composable_specialization.md new file mode 100644 index 0000000000..f87beef8cb --- /dev/null +++ b/release-content/migration-guides/composable_specialization.md @@ -0,0 +1,153 @@ +--- +title: Composable Specialization +pull_requests: [17373] +--- + +The existing pipeline specialization APIs (`SpecializedRenderPipeline` etc.) have +been replaced with a single `Specializer` trait and `SpecializedCache` collection: + +```rs +pub trait Specializer: Send + Sync + 'static { + type Key: SpecializerKey; + fn specialize( + &self, + key: Self::Key, + descriptor: &mut T::Descriptor, + ) -> Result, BevyError>; +} + +pub struct SpecializedCache>{ ... }; +``` + +The main difference is the change from *producing* a pipeline descriptor to +*mutating* one based on a key. The "base descriptor" that the `SpecializedCache` +passes to the `Specializer` can either be specified manually with `Specializer::new` +or by implementing `GetBaseDescriptor`. There's also a new trait for specialization +keys, `SpecializeKey`, that can be derived with the included macro in most cases. + +Composing multiple different specializers together with the `derive(Specializer)` +macro can be a lot more powerful (see the `Specialize` docs), but migrating +individual specializers is fairly simple. All static parts of the pipeline +should be specified in the base descriptor, while the `Specializer` impl +should mutate the key as little as necessary to match the key. + +```rs +pub struct MySpecializer { + layout: BindGroupLayout, + layout_msaa: BindGroupLayout, + vertex: Handle, + fragment: Handle, +} + +// before +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +// after +#[derive(Clone, Copy, PartialEq, Eq, Hash, SpecializerKey)] + +pub struct MyKey { + blend_state: BlendState, + msaa: Msaa, +} + +impl FromWorld for MySpecializer { + fn from_world(&mut World) -> Self { + ... + } +} + +// before +impl SpecializedRenderPipeline for MySpecializer { + type Key = MyKey; + + fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor { + RenderPipelineDescriptor { + label: Some("my_pipeline".into()), + layout: vec![ + if key.msaa.samples() > 0 { + self.layout_msaa.clone() + } else { + self.layout.clone() + } + ], + push_constant_ranges: vec![], + vertex: VertexState { + shader: self.vertex.clone(), + shader_defs: vec![], + entry_point: "vertex".into(), + buffers: vec![], + }, + primitive: Default::default(), + depth_stencil: None, + multisample: MultisampleState { + count: key.msaa.samples(), + ..Default::default() + }, + fragment: Some(FragmentState { + shader: self.fragment.clone(), + shader_defs: vec![], + entry_point: "fragment".into(), + targets: vec![Some(ColorTargetState { + format: TextureFormat::Rgba8Unorm, + blend: Some(key.blend_state), + write_mask: ColorWrites::all(), + })], + }), + zero_initialize_workgroup_memory: false, + }, + } +} + +app.init_resource::>(); + +// after +impl Specializer for MySpecializer { + type Key = MyKey; + + fn specialize( + &self, + key: Self::Key, + descriptor: &mut RenderPipeline, + ) -> Result, BevyError> { + descriptor.multisample.count = key.msaa.samples(); + descriptor.layout[0] = if key.msaa.samples() > 0 { + self.layout_msaa.clone() + } else { + self.layout.clone() + }; + descriptor.fragment.targets[0].as_mut().unwrap().blend_mode = key.blend_state; + Ok(key) + } +} + +impl GetBaseDescriptor for MySpecializer { + fn get_base_descriptor(&self) -> RenderPipelineDescriptor { + RenderPipelineDescriptor { + label: Some("my_pipeline".into()), + layout: vec![self.layout.clone()], + push_constant_ranges: vec![], + vertex: VertexState { + shader: self.vertex.clone(), + shader_defs: vec![], + entry_point: "vertex".into(), + buffers: vec![], + }, + primitive: Default::default(), + depth_stencil: None, + multisample: MultiSampleState::default(), + fragment: Some(FragmentState { + shader: self.fragment.clone(), + shader_defs: vec![], + entry_point: "fragment".into(), + targets: vec![Some(ColorTargetState { + format: TextureFormat::Rgba8Unorm, + blend: None, + write_mask: ColorWrites::all(), + })], + }), + zero_initialize_workgroup_memory: false, + }, + } +} + +app.init_resource::>(); +``` From c6ba3d31cf0611eaeb227326753c503a2c7123da Mon Sep 17 00:00:00 2001 From: SpecificProtagonist Date: Tue, 1 Jul 2025 05:20:54 +0200 Subject: [PATCH 48/68] EntityEvent derive: Fix silent error (#19894) # Objective The `EntityEvent` derive macro only parsed the first `entity_event` attr, resulting in the following event having auto propagation silently turned off: ```rust #[derive(Event, EntityEvent)] #[entity_event(traversal = &'static ChildOf)] #[entity_event(auto_propagate)] struct MyEvent; ``` This should either fail to compile or be parsed correctly. ## Solution Parse all `entity_event`. ## Testing Cargo expand the snippet above. I haven't added an extra test for this. --- crates/bevy_ecs/macros/src/component.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/macros/src/component.rs b/crates/bevy_ecs/macros/src/component.rs index 040c1b26b6..8a78355a60 100644 --- a/crates/bevy_ecs/macros/src/component.rs +++ b/crates/bevy_ecs/macros/src/component.rs @@ -40,19 +40,26 @@ pub fn derive_entity_event(input: TokenStream) -> TokenStream { let mut traversal: Type = parse_quote!(()); let bevy_ecs_path: Path = crate::bevy_ecs_path(); + let mut processed_attrs = Vec::new(); + ast.generics .make_where_clause() .predicates .push(parse_quote! { Self: Send + Sync + 'static }); - if let Some(attr) = ast.attrs.iter().find(|attr| attr.path().is_ident(EVENT)) { + for attr in ast.attrs.iter().filter(|attr| attr.path().is_ident(EVENT)) { if let Err(e) = attr.parse_nested_meta(|meta| match meta.path.get_ident() { + Some(ident) if processed_attrs.iter().any(|i| ident == i) => { + Err(meta.error(format!("duplicate attribute: {ident}"))) + } Some(ident) if ident == AUTO_PROPAGATE => { auto_propagate = true; + processed_attrs.push(AUTO_PROPAGATE); Ok(()) } Some(ident) if ident == TRAVERSAL => { traversal = meta.value()?.parse()?; + processed_attrs.push(TRAVERSAL); Ok(()) } Some(ident) => Err(meta.error(format!("unsupported attribute: {ident}"))), From 7b6c5f4431c908a008de116e1a7420cc3fecefcf Mon Sep 17 00:00:00 2001 From: Talin Date: Mon, 30 Jun 2025 20:23:38 -0700 Subject: [PATCH 49/68] Change core widgets to use callback enum instead of option (#19855) # Objective Because we want to be able to support more notification options in the future (in addition to just using registered one-shot systems), the `Option` notifications have been changed to a new enum, `Callback`. @alice-i-cecile --- crates/bevy_core_widgets/src/callback.rs | 113 ++++++++++++++++++ crates/bevy_core_widgets/src/core_button.rs | 21 ++-- crates/bevy_core_widgets/src/core_checkbox.rs | 18 +-- crates/bevy_core_widgets/src/core_radio.rs | 14 +-- crates/bevy_core_widgets/src/core_slider.rs | 33 ++--- crates/bevy_core_widgets/src/lib.rs | 2 + crates/bevy_feathers/src/controls/button.rs | 10 +- crates/bevy_feathers/src/controls/slider.rs | 9 +- examples/ui/core_widgets.rs | 34 +++--- examples/ui/core_widgets_observers.rs | 18 +-- examples/ui/feathers.rs | 16 +-- .../release-notes/headless-widgets.md | 24 ++-- 12 files changed, 217 insertions(+), 95 deletions(-) create mode 100644 crates/bevy_core_widgets/src/callback.rs diff --git a/crates/bevy_core_widgets/src/callback.rs b/crates/bevy_core_widgets/src/callback.rs new file mode 100644 index 0000000000..37905e221c --- /dev/null +++ b/crates/bevy_core_widgets/src/callback.rs @@ -0,0 +1,113 @@ +use bevy_ecs::system::{Commands, SystemId, SystemInput}; +use bevy_ecs::world::{DeferredWorld, World}; + +/// A callback defines how we want to be notified when a widget changes state. Unlike an event +/// or observer, callbacks are intended for "point-to-point" communication that cuts across the +/// hierarchy of entities. Callbacks can be created in advance of the entity they are attached +/// to, and can be passed around as parameters. +/// +/// Example: +/// ``` +/// use bevy_app::App; +/// use bevy_core_widgets::{Callback, Notify}; +/// use bevy_ecs::system::{Commands, IntoSystem}; +/// +/// let mut app = App::new(); +/// +/// // Register a one-shot system +/// fn my_callback_system() { +/// println!("Callback executed!"); +/// } +/// +/// let system_id = app.world_mut().register_system(my_callback_system); +/// +/// // Wrap system in a callback +/// let callback = Callback::System(system_id); +/// +/// // Later, when we want to execute the callback: +/// app.world_mut().commands().notify(&callback); +/// ``` +#[derive(Default, Debug)] +pub enum Callback { + /// Invoke a one-shot system + System(SystemId), + /// Ignore this notification + #[default] + Ignore, +} + +/// Trait used to invoke a [`Callback`], unifying the API across callers. +pub trait Notify { + /// Invoke the callback with no arguments. + fn notify(&mut self, callback: &Callback<()>); + + /// Invoke the callback with one argument. + fn notify_with(&mut self, callback: &Callback, input: I::Inner<'static>) + where + I: SystemInput: Send> + 'static; +} + +impl<'w, 's> Notify for Commands<'w, 's> { + fn notify(&mut self, callback: &Callback<()>) { + match callback { + Callback::System(system_id) => self.run_system(*system_id), + Callback::Ignore => (), + } + } + + fn notify_with(&mut self, callback: &Callback, input: I::Inner<'static>) + where + I: SystemInput: Send> + 'static, + { + match callback { + Callback::System(system_id) => self.run_system_with(*system_id, input), + Callback::Ignore => (), + } + } +} + +impl Notify for World { + fn notify(&mut self, callback: &Callback<()>) { + match callback { + Callback::System(system_id) => { + let _ = self.run_system(*system_id); + } + Callback::Ignore => (), + } + } + + fn notify_with(&mut self, callback: &Callback, input: I::Inner<'static>) + where + I: SystemInput: Send> + 'static, + { + match callback { + Callback::System(system_id) => { + let _ = self.run_system_with(*system_id, input); + } + Callback::Ignore => (), + } + } +} + +impl Notify for DeferredWorld<'_> { + fn notify(&mut self, callback: &Callback<()>) { + match callback { + Callback::System(system_id) => { + self.commands().run_system(*system_id); + } + Callback::Ignore => (), + } + } + + fn notify_with(&mut self, callback: &Callback, input: I::Inner<'static>) + where + I: SystemInput: Send> + 'static, + { + match callback { + Callback::System(system_id) => { + self.commands().run_system_with(*system_id, input); + } + Callback::Ignore => (), + } + } +} diff --git a/crates/bevy_core_widgets/src/core_button.rs b/crates/bevy_core_widgets/src/core_button.rs index 0c0c638d20..8c4ec9b22e 100644 --- a/crates/bevy_core_widgets/src/core_button.rs +++ b/crates/bevy_core_widgets/src/core_button.rs @@ -7,7 +7,7 @@ use bevy_ecs::{ entity::Entity, observer::On, query::With, - system::{Commands, Query, SystemId}, + system::{Commands, Query}, }; use bevy_input::keyboard::{KeyCode, KeyboardInput}; use bevy_input::ButtonState; @@ -15,16 +15,17 @@ use bevy_input_focus::FocusedInput; use bevy_picking::events::{Cancel, Click, DragEnd, Pointer, Press, Release}; use bevy_ui::{InteractionDisabled, Pressed}; +use crate::{Callback, Notify}; + /// Headless button widget. This widget maintains a "pressed" state, which is used to /// indicate whether the button is currently being pressed by the user. It emits a `ButtonClicked` /// event when the button is un-pressed. #[derive(Component, Default, Debug)] #[require(AccessibilityNode(accesskit::Node::new(Role::Button)))] pub struct CoreButton { - /// Optional system to run when the button is clicked, or when the Enter or Space key - /// is pressed while the button is focused. If this field is `None`, the button will - /// emit a `ButtonClicked` event when clicked. - pub on_click: Option, + /// Callback to invoke when the button is clicked, or when the `Enter` or `Space` key + /// is pressed while the button is focused. + pub on_activate: Callback, } fn button_on_key_event( @@ -39,10 +40,8 @@ fn button_on_key_event( && event.state == ButtonState::Pressed && (event.key_code == KeyCode::Enter || event.key_code == KeyCode::Space) { - if let Some(on_click) = bstate.on_click { - trigger.propagate(false); - commands.run_system(on_click); - } + trigger.propagate(false); + commands.notify(&bstate.on_activate); } } } @@ -56,9 +55,7 @@ fn button_on_pointer_click( if let Ok((bstate, pressed, disabled)) = q_state.get_mut(trigger.target()) { trigger.propagate(false); if pressed && !disabled { - if let Some(on_click) = bstate.on_click { - commands.run_system(on_click); - } + commands.notify(&bstate.on_activate); } } } diff --git a/crates/bevy_core_widgets/src/core_checkbox.rs b/crates/bevy_core_widgets/src/core_checkbox.rs index fc12811055..05edc53c44 100644 --- a/crates/bevy_core_widgets/src/core_checkbox.rs +++ b/crates/bevy_core_widgets/src/core_checkbox.rs @@ -7,7 +7,7 @@ use bevy_ecs::system::{In, ResMut}; use bevy_ecs::{ component::Component, observer::On, - system::{Commands, Query, SystemId}, + system::{Commands, Query}, }; use bevy_input::keyboard::{KeyCode, KeyboardInput}; use bevy_input::ButtonState; @@ -15,11 +15,13 @@ use bevy_input_focus::{FocusedInput, InputFocus, InputFocusVisible}; use bevy_picking::events::{Click, Pointer}; use bevy_ui::{Checkable, Checked, InteractionDisabled}; +use crate::{Callback, Notify as _}; + /// Headless widget implementation for checkboxes. The [`Checked`] component represents the current /// state of the checkbox. The `on_change` field is an optional system id that will be run when the /// checkbox is clicked, or when the `Enter` or `Space` key is pressed while the checkbox is -/// focused. If the `on_change` field is `None`, then instead of calling a callback, the checkbox -/// will update its own [`Checked`] state directly. +/// focused. If the `on_change` field is `Callback::Ignore`, then instead of calling a callback, the +/// checkbox will update its own [`Checked`] state directly. /// /// # Toggle switches /// @@ -29,8 +31,10 @@ use bevy_ui::{Checkable, Checked, InteractionDisabled}; #[derive(Component, Debug, Default)] #[require(AccessibilityNode(accesskit::Node::new(Role::CheckBox)), Checkable)] pub struct CoreCheckbox { - /// One-shot system that is run when the checkbox state needs to be changed. - pub on_change: Option>>, + /// One-shot system that is run when the checkbox state needs to be changed. If this value is + /// `Callback::Ignore`, then the checkbox will update it's own internal [`Checked`] state + /// without notification. + pub on_change: Callback>, } fn checkbox_on_key_input( @@ -157,8 +161,8 @@ fn set_checkbox_state( checkbox: &CoreCheckbox, new_state: bool, ) { - if let Some(on_change) = checkbox.on_change { - commands.run_system_with(on_change, new_state); + if !matches!(checkbox.on_change, Callback::Ignore) { + commands.notify_with(&checkbox.on_change, new_state); } else if new_state { commands.entity(entity.into()).insert(Checked); } else { diff --git a/crates/bevy_core_widgets/src/core_radio.rs b/crates/bevy_core_widgets/src/core_radio.rs index a0857575c4..6e6fd82d0c 100644 --- a/crates/bevy_core_widgets/src/core_radio.rs +++ b/crates/bevy_core_widgets/src/core_radio.rs @@ -9,7 +9,7 @@ use bevy_ecs::{ entity::Entity, observer::On, query::With, - system::{Commands, Query, SystemId}, + system::{Commands, Query}, }; use bevy_input::keyboard::{KeyCode, KeyboardInput}; use bevy_input::ButtonState; @@ -17,6 +17,8 @@ use bevy_input_focus::FocusedInput; use bevy_picking::events::{Click, Pointer}; use bevy_ui::{Checkable, Checked, InteractionDisabled}; +use crate::{Callback, Notify}; + /// Headless widget implementation for a "radio button group". This component is used to group /// multiple [`CoreRadio`] components together, allowing them to behave as a single unit. It /// implements the tab navigation logic and keyboard shortcuts for radio buttons. @@ -36,7 +38,7 @@ use bevy_ui::{Checkable, Checked, InteractionDisabled}; #[require(AccessibilityNode(accesskit::Node::new(Role::RadioGroup)))] pub struct CoreRadioGroup { /// Callback which is called when the selected radio button changes. - pub on_change: Option>>, + pub on_change: Callback>, } /// Headless widget implementation for radio buttons. These should be enclosed within a @@ -131,9 +133,7 @@ fn radio_group_on_key_input( let (next_id, _) = radio_buttons[next_index]; // Trigger the on_change event for the newly checked radio button - if let Some(on_change) = on_change { - commands.run_system_with(*on_change, next_id); - } + commands.notify_with(on_change, next_id); } } } @@ -196,9 +196,7 @@ fn radio_group_on_button_click( } // Trigger the on_change event for the newly checked radio button - if let Some(on_change) = on_change { - commands.run_system_with(*on_change, radio_id); - } + commands.notify_with(on_change, radio_id); } } diff --git a/crates/bevy_core_widgets/src/core_slider.rs b/crates/bevy_core_widgets/src/core_slider.rs index 2fab75738a..8a5e27f885 100644 --- a/crates/bevy_core_widgets/src/core_slider.rs +++ b/crates/bevy_core_widgets/src/core_slider.rs @@ -13,7 +13,7 @@ use bevy_ecs::{ component::Component, observer::On, query::With, - system::{Commands, Query, SystemId}, + system::{Commands, Query}, }; use bevy_input::keyboard::{KeyCode, KeyboardInput}; use bevy_input::ButtonState; @@ -22,6 +22,8 @@ use bevy_log::warn_once; use bevy_picking::events::{Drag, DragEnd, DragStart, Pointer, Press}; use bevy_ui::{ComputedNode, ComputedNodeTarget, InteractionDisabled, UiGlobalTransform, UiScale}; +use crate::{Callback, Notify}; + /// Defines how the slider should behave when you click on the track (not the thumb). #[derive(Debug, Default, PartialEq, Clone, Copy)] pub enum TrackClick { @@ -72,8 +74,9 @@ pub enum TrackClick { )] pub struct CoreSlider { /// Callback which is called when the slider is dragged or the value is changed via other user - /// interaction. If this value is `None`, then the slider will self-update. - pub on_change: Option>>, + /// interaction. If this value is `Callback::Ignore`, then the slider will update it's own + /// internal [`SliderValue`] state without notification. + pub on_change: Callback>, /// Set the track-clicking behavior for this slider. pub track_click: TrackClick, // TODO: Think about whether we want a "vertical" option. @@ -257,12 +260,12 @@ pub(crate) fn slider_on_pointer_down( TrackClick::Snap => click_val, }); - if let Some(on_change) = slider.on_change { - commands.run_system_with(on_change, new_value); - } else { + if matches!(slider.on_change, Callback::Ignore) { commands .entity(trigger.target()) .insert(SliderValue(new_value)); + } else { + commands.notify_with(&slider.on_change, new_value); } } } @@ -322,12 +325,12 @@ pub(crate) fn slider_on_drag( range.start() + span * 0.5 }; - if let Some(on_change) = slider.on_change { - commands.run_system_with(on_change, new_value); - } else { + if matches!(slider.on_change, Callback::Ignore) { commands .entity(trigger.target()) .insert(SliderValue(new_value)); + } else { + commands.notify_with(&slider.on_change, new_value); } } } @@ -369,12 +372,12 @@ fn slider_on_key_input( } }; trigger.propagate(false); - if let Some(on_change) = slider.on_change { - commands.run_system_with(on_change, new_value); - } else { + if matches!(slider.on_change, Callback::Ignore) { commands .entity(trigger.target()) .insert(SliderValue(new_value)); + } else { + commands.notify_with(&slider.on_change, new_value); } } } @@ -461,12 +464,12 @@ fn slider_on_set_value( range.clamp(value.0 + *delta * step.map(|s| s.0).unwrap_or_default()) } }; - if let Some(on_change) = slider.on_change { - commands.run_system_with(on_change, new_value); - } else { + if matches!(slider.on_change, Callback::Ignore) { commands .entity(trigger.target()) .insert(SliderValue(new_value)); + } else { + commands.notify_with(&slider.on_change, new_value); } } } diff --git a/crates/bevy_core_widgets/src/lib.rs b/crates/bevy_core_widgets/src/lib.rs index a0ddfa5eb8..2a3fc1ac09 100644 --- a/crates/bevy_core_widgets/src/lib.rs +++ b/crates/bevy_core_widgets/src/lib.rs @@ -14,6 +14,7 @@ // styled/opinionated widgets that use them. Components which are directly exposed to users above // the widget level, like `SliderValue`, should not have the `Core` prefix. +mod callback; mod core_button; mod core_checkbox; mod core_radio; @@ -22,6 +23,7 @@ mod core_slider; use bevy_app::{App, Plugin}; +pub use callback::{Callback, Notify}; pub use core_button::{CoreButton, CoreButtonPlugin}; pub use core_checkbox::{CoreCheckbox, CoreCheckboxPlugin, SetChecked, ToggleChecked}; pub use core_radio::{CoreRadio, CoreRadioGroup, CoreRadioGroupPlugin}; diff --git a/crates/bevy_feathers/src/controls/button.rs b/crates/bevy_feathers/src/controls/button.rs index fd12a8ef1b..5b6ad7117b 100644 --- a/crates/bevy_feathers/src/controls/button.rs +++ b/crates/bevy_feathers/src/controls/button.rs @@ -1,5 +1,5 @@ use bevy_app::{Plugin, PreUpdate}; -use bevy_core_widgets::CoreButton; +use bevy_core_widgets::{Callback, CoreButton}; use bevy_ecs::{ bundle::Bundle, component::Component, @@ -9,7 +9,7 @@ use bevy_ecs::{ query::{Added, Changed, Has, Or}, schedule::IntoScheduleConfigs, spawn::{SpawnRelated, SpawnableList}, - system::{Commands, Query, SystemId}, + system::{Commands, Query}, }; use bevy_input_focus::tab_navigation::TabIndex; use bevy_picking::{hover::Hovered, PickingSystems}; @@ -38,14 +38,14 @@ pub enum ButtonVariant { } /// Parameters for the button template, passed to [`button`] function. -#[derive(Default, Clone)] +#[derive(Default)] pub struct ButtonProps { /// Color variant for the button. pub variant: ButtonVariant, /// Rounded corners options pub corners: RoundedCorners, /// Click handler - pub on_click: Option, + pub on_click: Callback, } /// Template function to spawn a button. @@ -69,7 +69,7 @@ pub fn button + Send + Sync + 'static, B: Bundle>( ..Default::default() }, CoreButton { - on_click: props.on_click, + on_activate: props.on_click, }, props.variant, Hovered::default(), diff --git a/crates/bevy_feathers/src/controls/slider.rs b/crates/bevy_feathers/src/controls/slider.rs index f4773fb343..fa1978e06c 100644 --- a/crates/bevy_feathers/src/controls/slider.rs +++ b/crates/bevy_feathers/src/controls/slider.rs @@ -2,7 +2,7 @@ use core::f32::consts::PI; use bevy_app::{Plugin, PreUpdate}; use bevy_color::Color; -use bevy_core_widgets::{CoreSlider, SliderRange, SliderValue, TrackClick}; +use bevy_core_widgets::{Callback, CoreSlider, SliderRange, SliderValue, TrackClick}; use bevy_ecs::{ bundle::Bundle, children, @@ -13,7 +13,7 @@ use bevy_ecs::{ query::{Added, Changed, Has, Or, Spawned, With}, schedule::IntoScheduleConfigs, spawn::SpawnRelated, - system::{In, Query, Res, SystemId}, + system::{In, Query, Res}, }; use bevy_input_focus::tab_navigation::TabIndex; use bevy_picking::PickingSystems; @@ -34,7 +34,6 @@ use crate::{ }; /// Slider template properties, passed to [`slider`] function. -#[derive(Clone)] pub struct SliderProps { /// Slider current value pub value: f32, @@ -43,7 +42,7 @@ pub struct SliderProps { /// Slider maximum value pub max: f32, /// On-change handler - pub on_change: Option>>, + pub on_change: Callback>, } impl Default for SliderProps { @@ -52,7 +51,7 @@ impl Default for SliderProps { value: 0.0, min: 0.0, max: 1.0, - on_change: None, + on_change: Callback::Ignore, } } } diff --git a/examples/ui/core_widgets.rs b/examples/ui/core_widgets.rs index 7bf1e99966..318b824d0e 100644 --- a/examples/ui/core_widgets.rs +++ b/examples/ui/core_widgets.rs @@ -3,10 +3,10 @@ use bevy::{ color::palettes::basic::*, core_widgets::{ - CoreButton, CoreCheckbox, CoreRadio, CoreRadioGroup, CoreSlider, CoreSliderDragState, - CoreSliderThumb, CoreWidgetsPlugin, SliderRange, SliderValue, TrackClick, + Callback, CoreButton, CoreCheckbox, CoreRadio, CoreRadioGroup, CoreSlider, + CoreSliderDragState, CoreSliderThumb, CoreWidgetsPlugin, SliderRange, SliderValue, + TrackClick, }, - ecs::system::SystemId, input_focus::{ tab_navigation::{TabGroup, TabIndex, TabNavigationPlugin}, InputDispatchPlugin, @@ -146,17 +146,17 @@ fn setup(mut commands: Commands, assets: Res) { commands.spawn(Camera2d); commands.spawn(demo_root( &assets, - on_click, - on_change_value, - on_change_radio, + Callback::System(on_click), + Callback::System(on_change_value), + Callback::System(on_change_radio), )); } fn demo_root( asset_server: &AssetServer, - on_click: SystemId, - on_change_value: SystemId>, - on_change_radio: SystemId>, + on_click: Callback, + on_change_value: Callback>, + on_change_radio: Callback>, ) -> impl Bundle { ( Node { @@ -172,15 +172,15 @@ fn demo_root( TabGroup::default(), children![ button(asset_server, on_click), - slider(0.0, 100.0, 50.0, Some(on_change_value)), - checkbox(asset_server, "Checkbox", None), - radio_group(asset_server, Some(on_change_radio)), + slider(0.0, 100.0, 50.0, on_change_value), + checkbox(asset_server, "Checkbox", Callback::Ignore), + radio_group(asset_server, on_change_radio), Text::new("Press 'D' to toggle widget disabled states"), ], ) } -fn button(asset_server: &AssetServer, on_click: SystemId) -> impl Bundle { +fn button(asset_server: &AssetServer, on_click: Callback) -> impl Bundle { ( Node { width: Val::Px(150.0), @@ -192,7 +192,7 @@ fn button(asset_server: &AssetServer, on_click: SystemId) -> impl Bundle { }, DemoButton, CoreButton { - on_click: Some(on_click), + on_activate: on_click, }, Hovered::default(), TabIndex(0), @@ -323,7 +323,7 @@ fn set_button_style( } /// Create a demo slider -fn slider(min: f32, max: f32, value: f32, on_change: Option>>) -> impl Bundle { +fn slider(min: f32, max: f32, value: f32, on_change: Callback>) -> impl Bundle { ( Node { display: Display::Flex, @@ -468,7 +468,7 @@ fn thumb_color(disabled: bool, hovered: bool) -> Color { fn checkbox( asset_server: &AssetServer, caption: &str, - on_change: Option>>, + on_change: Callback>, ) -> impl Bundle { ( Node { @@ -661,7 +661,7 @@ fn set_checkbox_or_radio_style( } /// Create a demo radio group -fn radio_group(asset_server: &AssetServer, on_change: Option>>) -> impl Bundle { +fn radio_group(asset_server: &AssetServer, on_change: Callback>) -> impl Bundle { ( Node { display: Display::Flex, diff --git a/examples/ui/core_widgets_observers.rs b/examples/ui/core_widgets_observers.rs index 4e24a646b2..1ab4cda3b0 100644 --- a/examples/ui/core_widgets_observers.rs +++ b/examples/ui/core_widgets_observers.rs @@ -3,8 +3,8 @@ use bevy::{ color::palettes::basic::*, core_widgets::{ - CoreButton, CoreCheckbox, CoreSlider, CoreSliderThumb, CoreWidgetsPlugin, SliderRange, - SliderValue, + Callback, CoreButton, CoreCheckbox, CoreSlider, CoreSliderThumb, CoreWidgetsPlugin, + SliderRange, SliderValue, }, ecs::system::SystemId, input_focus::{ @@ -120,15 +120,15 @@ fn demo_root( }, TabGroup::default(), children![ - button(asset_server, on_click), - slider(0.0, 100.0, 50.0, Some(on_change_value)), - checkbox(asset_server, "Checkbox", None), + button(asset_server, Callback::System(on_click)), + slider(0.0, 100.0, 50.0, Callback::System(on_change_value)), + checkbox(asset_server, "Checkbox", Callback::Ignore), Text::new("Press 'D' to toggle widget disabled states"), ], ) } -fn button(asset_server: &AssetServer, on_click: SystemId) -> impl Bundle { +fn button(asset_server: &AssetServer, on_click: Callback) -> impl Bundle { ( Node { width: Val::Px(150.0), @@ -140,7 +140,7 @@ fn button(asset_server: &AssetServer, on_click: SystemId) -> impl Bundle { }, DemoButton, CoreButton { - on_click: Some(on_click), + on_activate: on_click, }, Hovered::default(), TabIndex(0), @@ -351,7 +351,7 @@ fn set_button_style( } /// Create a demo slider -fn slider(min: f32, max: f32, value: f32, on_change: Option>>) -> impl Bundle { +fn slider(min: f32, max: f32, value: f32, on_change: Callback>) -> impl Bundle { ( Node { display: Display::Flex, @@ -517,7 +517,7 @@ fn thumb_color(disabled: bool, hovered: bool) -> Color { fn checkbox( asset_server: &AssetServer, caption: &str, - on_change: Option>>, + on_change: Callback>, ) -> impl Bundle { ( Node { diff --git a/examples/ui/feathers.rs b/examples/ui/feathers.rs index 54bae222ec..c5954f45c5 100644 --- a/examples/ui/feathers.rs +++ b/examples/ui/feathers.rs @@ -1,7 +1,7 @@ //! This example shows off the various Bevy Feathers widgets. use bevy::{ - core_widgets::{CoreWidgetsPlugin, SliderStep}, + core_widgets::{Callback, CoreWidgetsPlugin, SliderStep}, feathers::{ controls::{button, slider, ButtonProps, ButtonVariant, SliderProps}, dark_theme::create_dark_theme, @@ -80,7 +80,7 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { children![ button( ButtonProps { - on_click: Some(commands.register_system(|| { + on_click: Callback::System(commands.register_system(|| { info!("Normal button clicked!"); })), ..default() @@ -90,7 +90,7 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { ), button( ButtonProps { - on_click: Some(commands.register_system(|| { + on_click: Callback::System(commands.register_system(|| { info!("Disabled button clicked!"); })), ..default() @@ -100,7 +100,7 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { ), button( ButtonProps { - on_click: Some(commands.register_system(|| { + on_click: Callback::System(commands.register_system(|| { info!("Primary button clicked!"); })), variant: ButtonVariant::Primary, @@ -123,7 +123,7 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { children![ button( ButtonProps { - on_click: Some(commands.register_system(|| { + on_click: Callback::System(commands.register_system(|| { info!("Left button clicked!"); })), corners: RoundedCorners::Left, @@ -134,7 +134,7 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { ), button( ButtonProps { - on_click: Some(commands.register_system(|| { + on_click: Callback::System(commands.register_system(|| { info!("Center button clicked!"); })), corners: RoundedCorners::None, @@ -145,7 +145,7 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { ), button( ButtonProps { - on_click: Some(commands.register_system(|| { + on_click: Callback::System(commands.register_system(|| { info!("Right button clicked!"); })), variant: ButtonVariant::Primary, @@ -158,7 +158,7 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { ), button( ButtonProps { - on_click: Some(commands.register_system(|| { + on_click: Callback::System(commands.register_system(|| { info!("Wide button clicked!"); })), ..default() diff --git a/release-content/release-notes/headless-widgets.md b/release-content/release-notes/headless-widgets.md index bb0398b43c..5e2a91c556 100644 --- a/release-content/release-notes/headless-widgets.md +++ b/release-content/release-notes/headless-widgets.md @@ -1,6 +1,6 @@ --- title: Headless Widgets -authors: ["@viridia"] +authors: ["@viridia", "@ickshonpe", "@alice-i-cecile"] pull_requests: [19366, 19584, 19665, 19778, 19803] --- @@ -38,7 +38,7 @@ sliders, checkboxes and radio buttons. - `CoreCheckbox` can be used for checkboxes and toggle switches. - `CoreRadio` and `CoreRadioGroup` can be used for radio buttons. -## Widget Interaction States +## Widget Interaction Marker Components Many of the core widgets will define supplementary ECS components that are used to store the widget's state, similar to how the old `Interaction` component worked, but in a way that is more flexible. @@ -65,13 +65,18 @@ Applications need a way to be notified when the user interacts with a widget. On is using Bevy observers. This approach is useful in cases where you want the widget notifications to bubble up the hierarchy. -However, in UI work it's often desirable to connect widget interactions in ways that cut across the -hierarchy. For these kinds of situations, the core widgets offer a different approach: one-shot -systems. You can register a function as a one-shot system and get the resulting `SystemId`. This can -then be passed as a parameter to the widget when it is constructed, so when the button subsequently +However, in UI work it's often desirable to send notifications "point-to-point" in ways that cut +across the hierarchy. For these kinds of situations, the core widgets offer a different +approach: callbacks. The `Callback` enum allows different options for triggering a notification +when a widget's state is updated. For example, you can pass in the `SystemId` of a registered +one-shot system as a widget parameter when it is constructed. When the button subsequently gets clicked or the slider is dragged, the system gets run. Because it's an ECS system, it can inject any additional parameters it needs to update the Bevy world in response to the interaction. +## State Management + +See the [Wikipedia Article on State Management](https://en.wikipedia.org/wiki/State_management). + Most of the core widgets support "external state management" - something that is referred to in the React.js world as "controlled" widgets. This means that for widgets that edit a parameter value (such as checkboxes and sliders), the widget doesn't automatically update its own internal value, @@ -86,9 +91,10 @@ interacting with that widget. Externalizing the state avoids the need for two-wa instead allows simpler one-way data binding that aligns well with the traditional "Model / View / Controller" (MVC) design pattern. -That being said, the choice of internal or external state management is up to you: if the widget -has an `on_change` callback that is not `None`, then the callback is used. If the callback -is `None`, however, the widget will update its own state. (This is similar to how React.js does it.) +That being said, the choice of internal or external state management is up to you: if the widget has +an `on_change` callback that is not `Callback::Ignore`, then the callback is used. If the callback +is `Callback::Ignore`, however, the widget will update its own state automatically. (This is similar +to how React.js does it.) There are two exceptions to this rule about external state management. First, widgets which don't edit a value, but which merely trigger an event (such as buttons), don't fall under this rule. From e072625264006eaf0d2fb6989561abff98706c3c Mon Sep 17 00:00:00 2001 From: andriyDev Date: Mon, 30 Jun 2025 20:24:41 -0700 Subject: [PATCH 50/68] Move `ExtractInstancesPlugin` init to app. (#19867) # Objective - This plugin currently does nothing. That's because we add the plugin to the `RenderApp`. Inside the plugin it then looks for the `RenderApp` itself, but since it was added **to** the `RenderApp`, it will never find the `RenderApp`. ## Solution - Move the plugin into build, and more importantly, add it to the app not the render_app. --- crates/bevy_pbr/src/light_probe/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_pbr/src/light_probe/mod.rs b/crates/bevy_pbr/src/light_probe/mod.rs index bfce2f1e26..82035be2f6 100644 --- a/crates/bevy_pbr/src/light_probe/mod.rs +++ b/crates/bevy_pbr/src/light_probe/mod.rs @@ -343,7 +343,8 @@ impl Plugin for LightProbePlugin { app.register_type::() .register_type::() - .register_type::(); + .register_type::() + .add_plugins(ExtractInstancesPlugin::::new()); } fn finish(&self, app: &mut App) { @@ -352,7 +353,6 @@ impl Plugin for LightProbePlugin { }; render_app - .add_plugins(ExtractInstancesPlugin::::new()) .init_resource::() .init_resource::() .add_systems(ExtractSchedule, gather_environment_map_uniform) From 6ad93ede8654737184eb4db199cfa269aa7564b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?charlotte=20=F0=9F=8C=B8?= Date: Mon, 30 Jun 2025 20:24:58 -0700 Subject: [PATCH 51/68] Correctly disable prepass/shadows when configured on MaterialPlugin (#19890) Previously, the specialize/queue systems were added per-material and the plugin prepass/shadow enable flags controlled whether we added those systems. Now, we make this a property of the material instance and check for it when specializing. Fixes https://github.com/bevyengine/bevy/issues/19850. --- crates/bevy_pbr/src/light/mod.rs | 13 ++++++++-- crates/bevy_pbr/src/material.rs | 27 ++++++++++++++++++-- crates/bevy_pbr/src/prepass/mod.rs | 39 +++++++++++++++++++++-------- crates/bevy_pbr/src/render/light.rs | 4 +++ 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/crates/bevy_pbr/src/light/mod.rs b/crates/bevy_pbr/src/light/mod.rs index e50ffcc0fc..a93e3e4c58 100644 --- a/crates/bevy_pbr/src/light/mod.rs +++ b/crates/bevy_pbr/src/light/mod.rs @@ -1,5 +1,3 @@ -use core::ops::DerefMut; - use bevy_ecs::{ entity::{EntityHashMap, EntityHashSet}, prelude::*, @@ -19,6 +17,7 @@ use bevy_render::{ }; use bevy_transform::components::{GlobalTransform, Transform}; use bevy_utils::Parallel; +use core::{marker::PhantomData, ops::DerefMut}; use crate::*; @@ -91,6 +90,16 @@ pub mod light_consts { } } +/// Marker resource for whether shadows are enabled for this material type +#[derive(Resource, Debug)] +pub struct ShadowsEnabled(PhantomData); + +impl Default for ShadowsEnabled { + fn default() -> Self { + Self(PhantomData) + } +} + /// Controls the resolution of [`PointLight`] shadow maps. /// /// ``` diff --git a/crates/bevy_pbr/src/material.rs b/crates/bevy_pbr/src/material.rs index 17603704e6..bb1f9afde3 100644 --- a/crates/bevy_pbr/src/material.rs +++ b/crates/bevy_pbr/src/material.rs @@ -372,6 +372,13 @@ where } if let Some(render_app) = app.get_sub_app_mut(RenderApp) { + if self.prepass_enabled { + render_app.init_resource::>(); + } + if self.shadows_enabled { + render_app.init_resource::>(); + } + render_app .add_systems(RenderStartup, setup_render_app::) .add_systems( @@ -1316,6 +1323,10 @@ pub struct MaterialProperties { /// The key for this material, typically a bitfield of flags that are used to modify /// the pipeline descriptor used for this material. pub material_key: SmallVec<[u8; 8]>, + /// Whether shadows are enabled for this material + pub shadows_enabled: bool, + /// Whether prepass is enabled for this material + pub prepass_enabled: bool, } impl MaterialProperties { @@ -1394,7 +1405,11 @@ where SRes>, SRes>, SRes, - M::Param, + ( + Option>>, + Option>>, + M::Param, + ), ); fn prepare_asset( @@ -1415,10 +1430,14 @@ where alpha_mask_deferred_draw_functions, shadow_draw_functions, asset_server, - material_param, + (shadows_enabled, prepass_enabled, material_param), ): &mut SystemParamItem, ) -> Result> { let material_layout = M::bind_group_layout(render_device); + + let shadows_enabled = shadows_enabled.is_some(); + let prepass_enabled = prepass_enabled.is_some(); + let draw_opaque_pbr = opaque_draw_functions.read().id::(); let draw_alpha_mask_pbr = alpha_mask_draw_functions.read().id::(); let draw_transmissive_pbr = transmissive_draw_functions.read().id::(); @@ -1584,6 +1603,8 @@ where bindless, specialize: Some(specialize::), material_key, + shadows_enabled, + prepass_enabled, }), }) } @@ -1621,6 +1642,8 @@ where bindless, specialize: Some(specialize::), material_key, + shadows_enabled, + prepass_enabled, }), }) } diff --git a/crates/bevy_pbr/src/prepass/mod.rs b/crates/bevy_pbr/src/prepass/mod.rs index 42b2c28c15..b007242c76 100644 --- a/crates/bevy_pbr/src/prepass/mod.rs +++ b/crates/bevy_pbr/src/prepass/mod.rs @@ -4,11 +4,11 @@ use crate::{ alpha_mode_pipeline_key, binding_arrays_are_usable, buffer_layout, collect_meshes_for_gpu_building, set_mesh_motion_vector_flags, setup_morph_and_skinning_defs, skin, DeferredDrawFunction, DeferredFragmentShader, DeferredVertexShader, DrawMesh, - EntitySpecializationTicks, ErasedMaterialPipelineKey, MaterialPipeline, MaterialProperties, - MeshLayouts, MeshPipeline, MeshPipelineKey, OpaqueRendererMethod, PreparedMaterial, - PrepassDrawFunction, PrepassFragmentShader, PrepassVertexShader, RenderLightmaps, - RenderMaterialInstances, RenderMeshInstanceFlags, RenderMeshInstances, RenderPhaseType, - SetMaterialBindGroup, SetMeshBindGroup, ShadowView, + EntitySpecializationTicks, ErasedMaterialPipelineKey, Material, MaterialPipeline, + MaterialProperties, MeshLayouts, MeshPipeline, MeshPipelineKey, OpaqueRendererMethod, + PreparedMaterial, PrepassDrawFunction, PrepassFragmentShader, PrepassVertexShader, + RenderLightmaps, RenderMaterialInstances, RenderMeshInstanceFlags, RenderMeshInstances, + RenderPhaseType, SetMaterialBindGroup, SetMeshBindGroup, ShadowView, }; use bevy_app::{App, Plugin, PreUpdate}; use bevy_render::{ @@ -58,13 +58,15 @@ use crate::meshlet::{ use alloc::sync::Arc; use bevy_derive::{Deref, DerefMut}; -use bevy_ecs::component::Tick; -use bevy_ecs::system::SystemChangeTick; +use bevy_ecs::{component::Tick, system::SystemChangeTick}; use bevy_platform::collections::HashMap; -use bevy_render::erased_render_asset::ErasedRenderAssets; -use bevy_render::sync_world::MainEntityHashMap; -use bevy_render::view::RenderVisibleEntities; -use bevy_render::RenderSystems::{PrepareAssets, PrepareResources}; +use bevy_render::{ + erased_render_asset::ErasedRenderAssets, + sync_world::MainEntityHashMap, + view::RenderVisibleEntities, + RenderSystems::{PrepareAssets, PrepareResources}, +}; +use core::marker::PhantomData; /// Sets up everything required to use the prepass pipeline. /// @@ -188,6 +190,16 @@ impl Plugin for PrepassPlugin { } } +/// Marker resource for whether prepass is enabled globally for this material type +#[derive(Resource, Debug)] +pub struct PrepassEnabled(PhantomData); + +impl Default for PrepassEnabled { + fn default() -> Self { + PrepassEnabled(PhantomData) + } +} + #[derive(Resource)] struct AnyPrepassPluginLoaded; @@ -911,6 +923,11 @@ pub fn specialize_prepass_material_meshes( let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; + if !material.properties.prepass_enabled && !material.properties.shadows_enabled { + // If the material was previously specialized for prepass, remove it + view_specialized_material_pipeline_cache.remove(visible_entity); + continue; + } let Some(mesh) = render_meshes.get(mesh_instance.mesh_asset_id) else { continue; }; diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 5a19930842..1a55eb0926 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -1891,6 +1891,10 @@ pub fn specialize_shadows( let Some(material) = render_materials.get(material_instance.asset_id) else { continue; }; + if !material.properties.shadows_enabled { + // If the material is not a shadow caster, we don't need to specialize it. + continue; + } if !mesh_instance .flags .contains(RenderMeshInstanceFlags::SHADOW_CASTER) From 8351da45f88ef4f4364a33d1fef37c00cba65e02 Mon Sep 17 00:00:00 2001 From: JMS55 <47158642+JMS55@users.noreply.github.com> Date: Mon, 30 Jun 2025 21:17:16 -0700 Subject: [PATCH 52/68] Solari: Merge reservoir file, reformulate confidence weight (#19895) Some misc cleanup in preparation for future PRs. * Merge reservoir.wgsl with restir_di.wgsl, as the reservoir is going to be DI-specific and won't be reused for GI * Reformulate confidence weights to not multiply by INITIAL_SAMPLES. The multiplication cancels out, it doesn't matter. --- crates/bevy_solari/src/realtime/mod.rs | 2 - .../bevy_solari/src/realtime/reservoir.wgsl | 88 ------------------ .../bevy_solari/src/realtime/restir_di.wgsl | 90 ++++++++++++++++++- 3 files changed, 86 insertions(+), 94 deletions(-) delete mode 100644 crates/bevy_solari/src/realtime/reservoir.wgsl diff --git a/crates/bevy_solari/src/realtime/mod.rs b/crates/bevy_solari/src/realtime/mod.rs index 9308ab5cf8..b6a8f27a31 100644 --- a/crates/bevy_solari/src/realtime/mod.rs +++ b/crates/bevy_solari/src/realtime/mod.rs @@ -13,7 +13,6 @@ use bevy_ecs::{component::Component, reflect::ReflectComponent, schedule::IntoSc use bevy_pbr::DefaultOpaqueRendererMethod; use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ - load_shader_library, render_graph::{RenderGraphApp, ViewNodeRunner}, renderer::RenderDevice, view::Hdr, @@ -29,7 +28,6 @@ pub struct SolariLightingPlugin; impl Plugin for SolariLightingPlugin { fn build(&self, app: &mut App) { embedded_asset!(app, "restir_di.wgsl"); - load_shader_library!(app, "reservoir.wgsl"); app.register_type::() .insert_resource(DefaultOpaqueRendererMethod::deferred()); diff --git a/crates/bevy_solari/src/realtime/reservoir.wgsl b/crates/bevy_solari/src/realtime/reservoir.wgsl deleted file mode 100644 index 16887667a5..0000000000 --- a/crates/bevy_solari/src/realtime/reservoir.wgsl +++ /dev/null @@ -1,88 +0,0 @@ -// https://intro-to-restir.cwyman.org/presentations/2023ReSTIR_Course_Notes.pdf - -#define_import_path bevy_solari::reservoir - -#import bevy_core_pipeline::tonemapping::tonemapping_luminance as luminance -#import bevy_pbr::utils::rand_f -#import bevy_solari::sampling::{LightSample, calculate_light_contribution} - -const NULL_RESERVOIR_SAMPLE = 0xFFFFFFFFu; - -// Don't adjust the size of this struct without also adjusting RESERVOIR_STRUCT_SIZE. -struct Reservoir { - sample: LightSample, - weight_sum: f32, - confidence_weight: f32, - unbiased_contribution_weight: f32, - visibility: f32, -} - -fn empty_reservoir() -> Reservoir { - return Reservoir( - LightSample(vec2(NULL_RESERVOIR_SAMPLE, 0u), vec2(0.0)), - 0.0, - 0.0, - 0.0, - 0.0 - ); -} - -fn reservoir_valid(reservoir: Reservoir) -> bool { - return reservoir.sample.light_id.x != NULL_RESERVOIR_SAMPLE; -} - -struct ReservoirMergeResult { - merged_reservoir: Reservoir, - selected_sample_radiance: vec3, -} - -fn merge_reservoirs( - canonical_reservoir: Reservoir, - other_reservoir: Reservoir, - world_position: vec3, - world_normal: vec3, - diffuse_brdf: vec3, - rng: ptr, -) -> ReservoirMergeResult { - // TODO: Balance heuristic MIS weights - let mis_weight_denominator = 1.0 / (canonical_reservoir.confidence_weight + other_reservoir.confidence_weight); - - let canonical_mis_weight = canonical_reservoir.confidence_weight * mis_weight_denominator; - let canonical_target_function = reservoir_target_function(canonical_reservoir, world_position, world_normal, diffuse_brdf); - let canonical_resampling_weight = canonical_mis_weight * (canonical_target_function.a * canonical_reservoir.unbiased_contribution_weight); - - let other_mis_weight = other_reservoir.confidence_weight * mis_weight_denominator; - let other_target_function = reservoir_target_function(other_reservoir, world_position, world_normal, diffuse_brdf); - let other_resampling_weight = other_mis_weight * (other_target_function.a * other_reservoir.unbiased_contribution_weight); - - var combined_reservoir = empty_reservoir(); - combined_reservoir.weight_sum = canonical_resampling_weight + other_resampling_weight; - combined_reservoir.confidence_weight = canonical_reservoir.confidence_weight + other_reservoir.confidence_weight; - - // https://yusuketokuyoshi.com/papers/2024/Efficient_Visibility_Reuse_for_Real-time_ReSTIR_(Supplementary_Document).pdf - combined_reservoir.visibility = max(0.0, (canonical_reservoir.visibility * canonical_resampling_weight - + other_reservoir.visibility * other_resampling_weight) / combined_reservoir.weight_sum); - - if rand_f(rng) < other_resampling_weight / combined_reservoir.weight_sum { - combined_reservoir.sample = other_reservoir.sample; - - let inverse_target_function = select(0.0, 1.0 / other_target_function.a, other_target_function.a > 0.0); - combined_reservoir.unbiased_contribution_weight = combined_reservoir.weight_sum * inverse_target_function; - - return ReservoirMergeResult(combined_reservoir, other_target_function.rgb); - } else { - combined_reservoir.sample = canonical_reservoir.sample; - - let inverse_target_function = select(0.0, 1.0 / canonical_target_function.a, canonical_target_function.a > 0.0); - combined_reservoir.unbiased_contribution_weight = combined_reservoir.weight_sum * inverse_target_function; - - return ReservoirMergeResult(combined_reservoir, canonical_target_function.rgb); - } -} - -fn reservoir_target_function(reservoir: Reservoir, world_position: vec3, world_normal: vec3, diffuse_brdf: vec3) -> vec4 { - if !reservoir_valid(reservoir) { return vec4(0.0); } - let light_contribution = calculate_light_contribution(reservoir.sample, world_position, world_normal).radiance; - let target_function = luminance(light_contribution * diffuse_brdf); - return vec4(light_contribution, target_function); -} diff --git a/crates/bevy_solari/src/realtime/restir_di.wgsl b/crates/bevy_solari/src/realtime/restir_di.wgsl index fbc6d6820f..70de4564cc 100644 --- a/crates/bevy_solari/src/realtime/restir_di.wgsl +++ b/crates/bevy_solari/src/realtime/restir_di.wgsl @@ -1,3 +1,5 @@ +// https://intro-to-restir.cwyman.org/presentations/2023ReSTIR_Course_Notes.pdf + #import bevy_core_pipeline::tonemapping::tonemapping_luminance as luminance #import bevy_pbr::pbr_deferred_types::unpack_24bit_normal #import bevy_pbr::prepass_bindings::PreviousViewUniforms @@ -5,8 +7,7 @@ #import bevy_pbr::utils::{rand_f, octahedral_decode} #import bevy_render::maths::PI #import bevy_render::view::View -#import bevy_solari::reservoir::{Reservoir, empty_reservoir, reservoir_valid, merge_reservoirs} -#import bevy_solari::sampling::{generate_random_light_sample, calculate_light_contribution, trace_light_visibility, sample_disk} +#import bevy_solari::sampling::{LightSample, generate_random_light_sample, calculate_light_contribution, trace_light_visibility, sample_disk} #import bevy_solari::scene_bindings::{previous_frame_light_id_translations, LIGHT_NOT_PRESENT_THIS_FRAME} @group(1) @binding(0) var view_output: texture_storage_2d; @@ -24,7 +25,9 @@ var constants: PushConstants; const INITIAL_SAMPLES = 32u; const SPATIAL_REUSE_RADIUS_PIXELS = 30.0; -const CONFIDENCE_WEIGHT_CAP = 20.0 * f32(INITIAL_SAMPLES); +const CONFIDENCE_WEIGHT_CAP = 20.0; + +const NULL_RESERVOIR_SAMPLE = 0xFFFFFFFFu; @compute @workgroup_size(8, 8, 1) fn initial_and_temporal(@builtin(global_invocation_id) global_id: vec3) { @@ -112,7 +115,7 @@ fn generate_initial_reservoir(world_position: vec3, world_normal: vec3 reservoir.unbiased_contribution_weight *= reservoir.visibility; } - reservoir.confidence_weight = f32(INITIAL_SAMPLES); + reservoir.confidence_weight = 1.0; return reservoir; } @@ -205,3 +208,82 @@ fn depth_ndc_to_view_z(ndc_depth: f32) -> f32 { return view_pos.z / view_pos.w; #endif } + +// Don't adjust the size of this struct without also adjusting RESERVOIR_STRUCT_SIZE. +struct Reservoir { + sample: LightSample, + weight_sum: f32, + confidence_weight: f32, + unbiased_contribution_weight: f32, + visibility: f32, +} + +fn empty_reservoir() -> Reservoir { + return Reservoir( + LightSample(vec2(NULL_RESERVOIR_SAMPLE, 0u), vec2(0.0)), + 0.0, + 0.0, + 0.0, + 0.0 + ); +} + +fn reservoir_valid(reservoir: Reservoir) -> bool { + return reservoir.sample.light_id.x != NULL_RESERVOIR_SAMPLE; +} + +struct ReservoirMergeResult { + merged_reservoir: Reservoir, + selected_sample_radiance: vec3, +} + +fn merge_reservoirs( + canonical_reservoir: Reservoir, + other_reservoir: Reservoir, + world_position: vec3, + world_normal: vec3, + diffuse_brdf: vec3, + rng: ptr, +) -> ReservoirMergeResult { + // TODO: Balance heuristic MIS weights + let mis_weight_denominator = 1.0 / (canonical_reservoir.confidence_weight + other_reservoir.confidence_weight); + + let canonical_mis_weight = canonical_reservoir.confidence_weight * mis_weight_denominator; + let canonical_target_function = reservoir_target_function(canonical_reservoir, world_position, world_normal, diffuse_brdf); + let canonical_resampling_weight = canonical_mis_weight * (canonical_target_function.a * canonical_reservoir.unbiased_contribution_weight); + + let other_mis_weight = other_reservoir.confidence_weight * mis_weight_denominator; + let other_target_function = reservoir_target_function(other_reservoir, world_position, world_normal, diffuse_brdf); + let other_resampling_weight = other_mis_weight * (other_target_function.a * other_reservoir.unbiased_contribution_weight); + + var combined_reservoir = empty_reservoir(); + combined_reservoir.weight_sum = canonical_resampling_weight + other_resampling_weight; + combined_reservoir.confidence_weight = canonical_reservoir.confidence_weight + other_reservoir.confidence_weight; + + // https://yusuketokuyoshi.com/papers/2024/Efficient_Visibility_Reuse_for_Real-time_ReSTIR_(Supplementary_Document).pdf + combined_reservoir.visibility = max(0.0, (canonical_reservoir.visibility * canonical_resampling_weight + + other_reservoir.visibility * other_resampling_weight) / combined_reservoir.weight_sum); + + if rand_f(rng) < other_resampling_weight / combined_reservoir.weight_sum { + combined_reservoir.sample = other_reservoir.sample; + + let inverse_target_function = select(0.0, 1.0 / other_target_function.a, other_target_function.a > 0.0); + combined_reservoir.unbiased_contribution_weight = combined_reservoir.weight_sum * inverse_target_function; + + return ReservoirMergeResult(combined_reservoir, other_target_function.rgb); + } else { + combined_reservoir.sample = canonical_reservoir.sample; + + let inverse_target_function = select(0.0, 1.0 / canonical_target_function.a, canonical_target_function.a > 0.0); + combined_reservoir.unbiased_contribution_weight = combined_reservoir.weight_sum * inverse_target_function; + + return ReservoirMergeResult(combined_reservoir, canonical_target_function.rgb); + } +} + +fn reservoir_target_function(reservoir: Reservoir, world_position: vec3, world_normal: vec3, diffuse_brdf: vec3) -> vec4 { + if !reservoir_valid(reservoir) { return vec4(0.0); } + let light_contribution = calculate_light_contribution(reservoir.sample, world_position, world_normal).radiance; + let target_function = luminance(light_contribution * diffuse_brdf); + return vec4(light_contribution, target_function); +} From b980d4ac22a80ca02ec4b6c7dff796a2f65f9593 Mon Sep 17 00:00:00 2001 From: Talin Date: Mon, 30 Jun 2025 23:59:14 -0700 Subject: [PATCH 53/68] Feathers checkbox (#19900) Adds checkbox and radio buttons to feathers. Showcase: feathers-checkbox-radio --- crates/bevy_core_widgets/src/core_radio.rs | 5 + crates/bevy_feathers/Cargo.toml | 2 + crates/bevy_feathers/src/constants.rs | 8 +- crates/bevy_feathers/src/controls/checkbox.rs | 304 ++++++++++++++++++ crates/bevy_feathers/src/controls/mod.rs | 6 +- crates/bevy_feathers/src/controls/radio.rs | 268 +++++++++++++++ crates/bevy_feathers/src/dark_theme.rs | 45 +++ crates/bevy_feathers/src/lib.rs | 1 + crates/bevy_feathers/src/theme.rs | 17 + crates/bevy_feathers/src/tokens.rs | 25 ++ examples/ui/feathers.rs | 62 +++- release-content/release-notes/feathers.md | 2 +- 12 files changed, 739 insertions(+), 6 deletions(-) create mode 100644 crates/bevy_feathers/src/controls/checkbox.rs create mode 100644 crates/bevy_feathers/src/controls/radio.rs diff --git a/crates/bevy_core_widgets/src/core_radio.rs b/crates/bevy_core_widgets/src/core_radio.rs index 6e6fd82d0c..a6c99a0d04 100644 --- a/crates/bevy_core_widgets/src/core_radio.rs +++ b/crates/bevy_core_widgets/src/core_radio.rs @@ -170,6 +170,11 @@ fn radio_group_on_button_click( } }; + // Radio button is disabled. + if q_radio.get(radio_id).unwrap().1 { + return; + } + // Gather all the enabled radio group descendants for exclusion. let radio_buttons = q_children .iter_descendants(ev.target()) diff --git a/crates/bevy_feathers/Cargo.toml b/crates/bevy_feathers/Cargo.toml index 8348906047..3e1aded969 100644 --- a/crates/bevy_feathers/Cargo.toml +++ b/crates/bevy_feathers/Cargo.toml @@ -17,8 +17,10 @@ bevy_core_widgets = { path = "../bevy_core_widgets", version = "0.17.0-dev" } bevy_ecs = { path = "../bevy_ecs", version = "0.17.0-dev" } bevy_input_focus = { path = "../bevy_input_focus", version = "0.17.0-dev" } bevy_log = { path = "../bevy_log", version = "0.17.0-dev" } +bevy_math = { path = "../bevy_math", version = "0.17.0-dev" } bevy_picking = { path = "../bevy_picking", version = "0.17.0-dev" } bevy_platform = { path = "../bevy_platform", version = "0.17.0-dev" } +bevy_render = { path = "../bevy_render", version = "0.17.0-dev" } bevy_text = { path = "../bevy_text", version = "0.17.0-dev" } bevy_ui = { path = "../bevy_ui", version = "0.17.0-dev", features = [ "bevy_ui_picking_backend", diff --git a/crates/bevy_feathers/src/constants.rs b/crates/bevy_feathers/src/constants.rs index 7ba451b65e..651bb60b29 100644 --- a/crates/bevy_feathers/src/constants.rs +++ b/crates/bevy_feathers/src/constants.rs @@ -19,5 +19,11 @@ pub mod size { use bevy_ui::Val; /// Common row size for buttons, sliders, spinners, etc. - pub const ROW_HEIGHT: Val = Val::Px(22.0); + pub const ROW_HEIGHT: Val = Val::Px(24.0); + + /// Width and height of a checkbox + pub const CHECKBOX_SIZE: Val = Val::Px(18.0); + + /// Width and height of a radio button + pub const RADIO_SIZE: Val = Val::Px(18.0); } diff --git a/crates/bevy_feathers/src/controls/checkbox.rs b/crates/bevy_feathers/src/controls/checkbox.rs new file mode 100644 index 0000000000..6e4235961a --- /dev/null +++ b/crates/bevy_feathers/src/controls/checkbox.rs @@ -0,0 +1,304 @@ +use bevy_app::{Plugin, PreUpdate}; +use bevy_core_widgets::{Callback, CoreCheckbox}; +use bevy_ecs::{ + bundle::Bundle, + children, + component::Component, + entity::Entity, + hierarchy::{ChildOf, Children}, + lifecycle::RemovedComponents, + query::{Added, Changed, Has, Or, With}, + schedule::IntoScheduleConfigs, + spawn::{Spawn, SpawnRelated, SpawnableList}, + system::{Commands, In, Query}, +}; +use bevy_input_focus::tab_navigation::TabIndex; +use bevy_math::Rot2; +use bevy_picking::{hover::Hovered, PickingSystems}; +use bevy_render::view::Visibility; +use bevy_ui::{ + AlignItems, BorderRadius, Checked, Display, FlexDirection, InteractionDisabled, JustifyContent, + Node, PositionType, UiRect, UiTransform, Val, +}; +use bevy_winit::cursor::CursorIcon; + +use crate::{ + constants::{fonts, size}, + font_styles::InheritableFont, + handle_or_path::HandleOrPath, + theme::{ThemeBackgroundColor, ThemeBorderColor, ThemeFontColor}, + tokens, +}; + +/// Parameters for the checkbox template, passed to [`checkbox`] function. +#[derive(Default)] +pub struct CheckboxProps { + /// Change handler + pub on_change: Callback>, +} + +/// Marker for the checkbox outline +#[derive(Component, Default, Clone)] +struct CheckboxOutline; + +/// Marker for the checkbox check mark +#[derive(Component, Default, Clone)] +struct CheckboxMark; + +/// Template function to spawn a checkbox. +/// +/// # Arguments +/// * `props` - construction properties for the checkbox. +/// * `overrides` - a bundle of components that are merged in with the normal checkbox components. +/// * `label` - the label of the checkbox. +pub fn checkbox + Send + Sync + 'static, B: Bundle>( + props: CheckboxProps, + overrides: B, + label: C, +) -> impl Bundle { + ( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Row, + justify_content: JustifyContent::Start, + align_items: AlignItems::Center, + column_gap: Val::Px(4.0), + ..Default::default() + }, + CoreCheckbox { + on_change: props.on_change, + }, + Hovered::default(), + CursorIcon::System(bevy_window::SystemCursorIcon::Pointer), + TabIndex(0), + ThemeFontColor(tokens::CHECKBOX_TEXT), + InheritableFont { + font: HandleOrPath::Path(fonts::REGULAR.to_owned()), + font_size: 14.0, + }, + overrides, + Children::spawn(( + Spawn(( + Node { + width: size::CHECKBOX_SIZE, + height: size::CHECKBOX_SIZE, + border: UiRect::all(Val::Px(2.0)), + ..Default::default() + }, + CheckboxOutline, + BorderRadius::all(Val::Px(4.0)), + ThemeBackgroundColor(tokens::CHECKBOX_BG), + ThemeBorderColor(tokens::CHECKBOX_BORDER), + children![( + // Cheesy checkmark: rotated node with L-shaped border. + Node { + position_type: PositionType::Absolute, + left: Val::Px(4.0), + top: Val::Px(0.0), + width: Val::Px(6.), + height: Val::Px(11.), + border: UiRect { + bottom: Val::Px(2.0), + right: Val::Px(2.0), + ..Default::default() + }, + ..Default::default() + }, + UiTransform::from_rotation(Rot2::FRAC_PI_4), + CheckboxMark, + ThemeBorderColor(tokens::CHECKBOX_MARK), + )], + )), + label, + )), + ) +} + +fn update_checkbox_styles( + q_checkboxes: Query< + ( + Entity, + Has, + Has, + &Hovered, + &ThemeFontColor, + ), + ( + With, + Or<(Changed, Added, Added)>, + ), + >, + q_children: Query<&Children>, + mut q_outline: Query<(&ThemeBackgroundColor, &ThemeBorderColor), With>, + mut q_mark: Query<&ThemeBorderColor, With>, + mut commands: Commands, +) { + for (checkbox_ent, disabled, checked, hovered, font_color) in q_checkboxes.iter() { + let Some(outline_ent) = q_children + .iter_descendants(checkbox_ent) + .find(|en| q_outline.contains(*en)) + else { + continue; + }; + let Some(mark_ent) = q_children + .iter_descendants(checkbox_ent) + .find(|en| q_mark.contains(*en)) + else { + continue; + }; + let (outline_bg, outline_border) = q_outline.get_mut(outline_ent).unwrap(); + let mark_color = q_mark.get_mut(mark_ent).unwrap(); + set_checkbox_colors( + checkbox_ent, + outline_ent, + mark_ent, + disabled, + checked, + hovered.0, + outline_bg, + outline_border, + mark_color, + font_color, + &mut commands, + ); + } +} + +fn update_checkbox_styles_remove( + q_checkboxes: Query< + ( + Entity, + Has, + Has, + &Hovered, + &ThemeFontColor, + ), + With, + >, + q_children: Query<&Children>, + mut q_outline: Query<(&ThemeBackgroundColor, &ThemeBorderColor), With>, + mut q_mark: Query<&ThemeBorderColor, With>, + mut removed_disabled: RemovedComponents, + mut removed_checked: RemovedComponents, + mut commands: Commands, +) { + removed_disabled + .read() + .chain(removed_checked.read()) + .for_each(|ent| { + if let Ok((checkbox_ent, disabled, checked, hovered, font_color)) = + q_checkboxes.get(ent) + { + let Some(outline_ent) = q_children + .iter_descendants(checkbox_ent) + .find(|en| q_outline.contains(*en)) + else { + return; + }; + let Some(mark_ent) = q_children + .iter_descendants(checkbox_ent) + .find(|en| q_mark.contains(*en)) + else { + return; + }; + let (outline_bg, outline_border) = q_outline.get_mut(outline_ent).unwrap(); + let mark_color = q_mark.get_mut(mark_ent).unwrap(); + set_checkbox_colors( + checkbox_ent, + outline_ent, + mark_ent, + disabled, + checked, + hovered.0, + outline_bg, + outline_border, + mark_color, + font_color, + &mut commands, + ); + } + }); +} + +fn set_checkbox_colors( + checkbox_ent: Entity, + outline_ent: Entity, + mark_ent: Entity, + disabled: bool, + checked: bool, + hovered: bool, + outline_bg: &ThemeBackgroundColor, + outline_border: &ThemeBorderColor, + mark_color: &ThemeBorderColor, + font_color: &ThemeFontColor, + commands: &mut Commands, +) { + let outline_border_token = match (disabled, hovered) { + (true, _) => tokens::CHECKBOX_BORDER_DISABLED, + (false, true) => tokens::CHECKBOX_BORDER_HOVER, + _ => tokens::CHECKBOX_BORDER, + }; + + let outline_bg_token = match (disabled, checked) { + (true, true) => tokens::CHECKBOX_BG_CHECKED_DISABLED, + (true, false) => tokens::CHECKBOX_BG_DISABLED, + (false, true) => tokens::CHECKBOX_BG_CHECKED, + (false, false) => tokens::CHECKBOX_BG, + }; + + let mark_token = match disabled { + true => tokens::CHECKBOX_MARK_DISABLED, + false => tokens::CHECKBOX_MARK, + }; + + let font_color_token = match disabled { + true => tokens::CHECKBOX_TEXT_DISABLED, + false => tokens::CHECKBOX_TEXT, + }; + + // Change outline background + if outline_bg.0 != outline_bg_token { + commands + .entity(outline_ent) + .insert(ThemeBackgroundColor(outline_bg_token)); + } + + // Change outline border + if outline_border.0 != outline_border_token { + commands + .entity(outline_ent) + .insert(ThemeBorderColor(outline_border_token)); + } + + // Change mark color + if mark_color.0 != mark_token { + commands + .entity(mark_ent) + .insert(ThemeBorderColor(mark_token)); + } + + // Change mark visibility + commands.entity(mark_ent).insert(match checked { + true => Visibility::Visible, + false => Visibility::Hidden, + }); + + // Change font color + if font_color.0 != font_color_token { + commands + .entity(checkbox_ent) + .insert(ThemeFontColor(font_color_token)); + } +} + +/// Plugin which registers the systems for updating the checkbox styles. +pub struct CheckboxPlugin; + +impl Plugin for CheckboxPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_systems( + PreUpdate, + (update_checkbox_styles, update_checkbox_styles_remove).in_set(PickingSystems::Last), + ); + } +} diff --git a/crates/bevy_feathers/src/controls/mod.rs b/crates/bevy_feathers/src/controls/mod.rs index 293dcdf93d..92c5a76907 100644 --- a/crates/bevy_feathers/src/controls/mod.rs +++ b/crates/bevy_feathers/src/controls/mod.rs @@ -2,9 +2,13 @@ use bevy_app::Plugin; mod button; +mod checkbox; +mod radio; mod slider; pub use button::{button, ButtonPlugin, ButtonProps, ButtonVariant}; +pub use checkbox::{checkbox, CheckboxPlugin, CheckboxProps}; +pub use radio::{radio, RadioPlugin}; pub use slider::{slider, SliderPlugin, SliderProps}; /// Plugin which registers all `bevy_feathers` controls. @@ -12,6 +16,6 @@ pub struct ControlsPlugin; impl Plugin for ControlsPlugin { fn build(&self, app: &mut bevy_app::App) { - app.add_plugins((ButtonPlugin, SliderPlugin)); + app.add_plugins((ButtonPlugin, CheckboxPlugin, RadioPlugin, SliderPlugin)); } } diff --git a/crates/bevy_feathers/src/controls/radio.rs b/crates/bevy_feathers/src/controls/radio.rs new file mode 100644 index 0000000000..a08ffcfa8d --- /dev/null +++ b/crates/bevy_feathers/src/controls/radio.rs @@ -0,0 +1,268 @@ +use bevy_app::{Plugin, PreUpdate}; +use bevy_core_widgets::CoreRadio; +use bevy_ecs::{ + bundle::Bundle, + children, + component::Component, + entity::Entity, + hierarchy::{ChildOf, Children}, + lifecycle::RemovedComponents, + query::{Added, Changed, Has, Or, With}, + schedule::IntoScheduleConfigs, + spawn::{Spawn, SpawnRelated, SpawnableList}, + system::{Commands, Query}, +}; +use bevy_input_focus::tab_navigation::TabIndex; +use bevy_picking::{hover::Hovered, PickingSystems}; +use bevy_render::view::Visibility; +use bevy_ui::{ + AlignItems, BorderRadius, Checked, Display, FlexDirection, InteractionDisabled, JustifyContent, + Node, UiRect, Val, +}; +use bevy_winit::cursor::CursorIcon; + +use crate::{ + constants::{fonts, size}, + font_styles::InheritableFont, + handle_or_path::HandleOrPath, + theme::{ThemeBackgroundColor, ThemeBorderColor, ThemeFontColor}, + tokens, +}; + +/// Marker for the radio outline +#[derive(Component, Default, Clone)] +struct RadioOutline; + +/// Marker for the radio check mark +#[derive(Component, Default, Clone)] +struct RadioMark; + +/// Template function to spawn a radio. +/// +/// # Arguments +/// * `props` - construction properties for the radio. +/// * `overrides` - a bundle of components that are merged in with the normal radio components. +/// * `label` - the label of the radio. +pub fn radio + Send + Sync + 'static, B: Bundle>( + overrides: B, + label: C, +) -> impl Bundle { + ( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Row, + justify_content: JustifyContent::Start, + align_items: AlignItems::Center, + column_gap: Val::Px(4.0), + ..Default::default() + }, + CoreRadio, + Hovered::default(), + CursorIcon::System(bevy_window::SystemCursorIcon::Pointer), + TabIndex(0), + ThemeFontColor(tokens::RADIO_TEXT), + InheritableFont { + font: HandleOrPath::Path(fonts::REGULAR.to_owned()), + font_size: 14.0, + }, + overrides, + Children::spawn(( + Spawn(( + Node { + display: Display::Flex, + align_items: AlignItems::Center, + justify_content: JustifyContent::Center, + width: size::RADIO_SIZE, + height: size::RADIO_SIZE, + border: UiRect::all(Val::Px(2.0)), + ..Default::default() + }, + RadioOutline, + BorderRadius::MAX, + ThemeBorderColor(tokens::RADIO_BORDER), + children![( + // Cheesy checkmark: rotated node with L-shaped border. + Node { + width: Val::Px(8.), + height: Val::Px(8.), + ..Default::default() + }, + BorderRadius::MAX, + RadioMark, + ThemeBackgroundColor(tokens::RADIO_MARK), + )], + )), + label, + )), + ) +} + +fn update_radio_styles( + q_radioes: Query< + ( + Entity, + Has, + Has, + &Hovered, + &ThemeFontColor, + ), + ( + With, + Or<(Changed, Added, Added)>, + ), + >, + q_children: Query<&Children>, + mut q_outline: Query<&ThemeBorderColor, With>, + mut q_mark: Query<&ThemeBackgroundColor, With>, + mut commands: Commands, +) { + for (radio_ent, disabled, checked, hovered, font_color) in q_radioes.iter() { + let Some(outline_ent) = q_children + .iter_descendants(radio_ent) + .find(|en| q_outline.contains(*en)) + else { + continue; + }; + let Some(mark_ent) = q_children + .iter_descendants(radio_ent) + .find(|en| q_mark.contains(*en)) + else { + continue; + }; + let outline_border = q_outline.get_mut(outline_ent).unwrap(); + let mark_color = q_mark.get_mut(mark_ent).unwrap(); + set_radio_colors( + radio_ent, + outline_ent, + mark_ent, + disabled, + checked, + hovered.0, + outline_border, + mark_color, + font_color, + &mut commands, + ); + } +} + +fn update_radio_styles_remove( + q_radioes: Query< + ( + Entity, + Has, + Has, + &Hovered, + &ThemeFontColor, + ), + With, + >, + q_children: Query<&Children>, + mut q_outline: Query<&ThemeBorderColor, With>, + mut q_mark: Query<&ThemeBackgroundColor, With>, + mut removed_disabled: RemovedComponents, + mut removed_checked: RemovedComponents, + mut commands: Commands, +) { + removed_disabled + .read() + .chain(removed_checked.read()) + .for_each(|ent| { + if let Ok((radio_ent, disabled, checked, hovered, font_color)) = q_radioes.get(ent) { + let Some(outline_ent) = q_children + .iter_descendants(radio_ent) + .find(|en| q_outline.contains(*en)) + else { + return; + }; + let Some(mark_ent) = q_children + .iter_descendants(radio_ent) + .find(|en| q_mark.contains(*en)) + else { + return; + }; + let outline_border = q_outline.get_mut(outline_ent).unwrap(); + let mark_color = q_mark.get_mut(mark_ent).unwrap(); + set_radio_colors( + radio_ent, + outline_ent, + mark_ent, + disabled, + checked, + hovered.0, + outline_border, + mark_color, + font_color, + &mut commands, + ); + } + }); +} + +fn set_radio_colors( + radio_ent: Entity, + outline_ent: Entity, + mark_ent: Entity, + disabled: bool, + checked: bool, + hovered: bool, + outline_border: &ThemeBorderColor, + mark_color: &ThemeBackgroundColor, + font_color: &ThemeFontColor, + commands: &mut Commands, +) { + let outline_border_token = match (disabled, hovered) { + (true, _) => tokens::RADIO_BORDER_DISABLED, + (false, true) => tokens::RADIO_BORDER_HOVER, + _ => tokens::RADIO_BORDER, + }; + + let mark_token = match disabled { + true => tokens::RADIO_MARK_DISABLED, + false => tokens::RADIO_MARK, + }; + + let font_color_token = match disabled { + true => tokens::RADIO_TEXT_DISABLED, + false => tokens::RADIO_TEXT, + }; + + // Change outline border + if outline_border.0 != outline_border_token { + commands + .entity(outline_ent) + .insert(ThemeBorderColor(outline_border_token)); + } + + // Change mark color + if mark_color.0 != mark_token { + commands + .entity(mark_ent) + .insert(ThemeBorderColor(mark_token)); + } + + // Change mark visibility + commands.entity(mark_ent).insert(match checked { + true => Visibility::Visible, + false => Visibility::Hidden, + }); + + // Change font color + if font_color.0 != font_color_token { + commands + .entity(radio_ent) + .insert(ThemeFontColor(font_color_token)); + } +} + +/// Plugin which registers the systems for updating the radio styles. +pub struct RadioPlugin; + +impl Plugin for RadioPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_systems( + PreUpdate, + (update_radio_styles, update_radio_styles_remove).in_set(PickingSystems::Last), + ); + } +} diff --git a/crates/bevy_feathers/src/dark_theme.rs b/crates/bevy_feathers/src/dark_theme.rs index 6ac80e3e47..add354abd7 100644 --- a/crates/bevy_feathers/src/dark_theme.rs +++ b/crates/bevy_feathers/src/dark_theme.rs @@ -48,6 +48,51 @@ pub fn create_dark_theme() -> ThemeProps { tokens::SLIDER_TEXT_DISABLED.into(), palette::WHITE.with_alpha(0.5), ), + (tokens::CHECKBOX_BG.into(), palette::GRAY_3), + (tokens::CHECKBOX_BG_CHECKED.into(), palette::ACCENT), + ( + tokens::CHECKBOX_BG_DISABLED.into(), + palette::GRAY_1.with_alpha(0.5), + ), + ( + tokens::CHECKBOX_BG_CHECKED_DISABLED.into(), + palette::GRAY_3.with_alpha(0.5), + ), + (tokens::CHECKBOX_BORDER.into(), palette::GRAY_3), + ( + tokens::CHECKBOX_BORDER_HOVER.into(), + palette::GRAY_3.lighter(0.1), + ), + ( + tokens::CHECKBOX_BORDER_DISABLED.into(), + palette::GRAY_3.with_alpha(0.5), + ), + (tokens::CHECKBOX_MARK.into(), palette::WHITE), + (tokens::CHECKBOX_MARK_DISABLED.into(), palette::LIGHT_GRAY_2), + (tokens::CHECKBOX_TEXT.into(), palette::LIGHT_GRAY_1), + ( + tokens::CHECKBOX_TEXT_DISABLED.into(), + palette::LIGHT_GRAY_1.with_alpha(0.5), + ), + (tokens::RADIO_BORDER.into(), palette::GRAY_3), + ( + tokens::RADIO_BORDER_HOVER.into(), + palette::GRAY_3.lighter(0.1), + ), + ( + tokens::RADIO_BORDER_DISABLED.into(), + palette::GRAY_3.with_alpha(0.5), + ), + (tokens::RADIO_MARK.into(), palette::ACCENT), + ( + tokens::RADIO_MARK_DISABLED.into(), + palette::ACCENT.with_alpha(0.5), + ), + (tokens::RADIO_TEXT.into(), palette::LIGHT_GRAY_1), + ( + tokens::RADIO_TEXT_DISABLED.into(), + palette::LIGHT_GRAY_1.with_alpha(0.5), + ), ]), } } diff --git a/crates/bevy_feathers/src/lib.rs b/crates/bevy_feathers/src/lib.rs index de396462e3..ab02304a85 100644 --- a/crates/bevy_feathers/src/lib.rs +++ b/crates/bevy_feathers/src/lib.rs @@ -67,6 +67,7 @@ impl Plugin for FeathersPlugin { app.add_systems(PostUpdate, theme::update_theme) .add_observer(theme::on_changed_background) + .add_observer(theme::on_changed_border) .add_observer(theme::on_changed_font_color) .add_observer(font_styles::on_changed_font); } diff --git a/crates/bevy_feathers/src/theme.rs b/crates/bevy_feathers/src/theme.rs index fdca99fcbe..9969b54846 100644 --- a/crates/bevy_feathers/src/theme.rs +++ b/crates/bevy_feathers/src/theme.rs @@ -73,6 +73,7 @@ pub struct ThemedText; pub(crate) fn update_theme( mut q_background: Query<(&mut BackgroundColor, &ThemeBackgroundColor)>, + mut q_border: Query<(&mut BorderColor, &ThemeBorderColor)>, theme: Res, ) { if theme.is_changed() { @@ -80,6 +81,11 @@ pub(crate) fn update_theme( for (mut bg, theme_bg) in q_background.iter_mut() { bg.0 = theme.color(theme_bg.0); } + + // Update all border colors + for (mut border, theme_border) in q_border.iter_mut() { + border.set_all(theme.color(theme_border.0)); + } } } @@ -97,6 +103,17 @@ pub(crate) fn on_changed_background( } } +pub(crate) fn on_changed_border( + ev: On, + mut q_border: Query<(&mut BorderColor, &ThemeBorderColor), Changed>, + theme: Res, +) { + // Update background colors where the design token has changed. + if let Ok((mut border, theme_border)) = q_border.get_mut(ev.target()) { + border.set_all(theme.color(theme_border.0)); + } +} + /// An observer which looks for changes to the [`ThemeFontColor`] component on an entity, and /// propagates downward the text color to all participating text entities. pub(crate) fn on_changed_font_color( diff --git a/crates/bevy_feathers/src/tokens.rs b/crates/bevy_feathers/src/tokens.rs index d254d1a09b..d85cf02996 100644 --- a/crates/bevy_feathers/src/tokens.rs +++ b/crates/bevy_feathers/src/tokens.rs @@ -60,6 +60,14 @@ pub const SLIDER_TEXT_DISABLED: &str = "feathers.slider.text.disabled"; // Checkbox +/// Checkbox background around the checkmark +pub const CHECKBOX_BG: &str = "feathers.checkbox.bg"; +/// Checkbox border around the checkmark (disabled) +pub const CHECKBOX_BG_DISABLED: &str = "feathers.checkbox.bg.disabled"; +/// Checkbox background around the checkmark +pub const CHECKBOX_BG_CHECKED: &str = "feathers.checkbox.bg.checked"; +/// Checkbox border around the checkmark (disabled) +pub const CHECKBOX_BG_CHECKED_DISABLED: &str = "feathers.checkbox.bg.checked.disabled"; /// Checkbox border around the checkmark pub const CHECKBOX_BORDER: &str = "feathers.checkbox.border"; /// Checkbox border around the checkmark (hovered) @@ -74,3 +82,20 @@ pub const CHECKBOX_MARK_DISABLED: &str = "feathers.checkbox.mark.disabled"; pub const CHECKBOX_TEXT: &str = "feathers.checkbox.text"; /// Checkbox label text (disabled) pub const CHECKBOX_TEXT_DISABLED: &str = "feathers.checkbox.text.disabled"; + +// Radio button + +/// Radio border around the checkmark +pub const RADIO_BORDER: &str = "feathers.radio.border"; +/// Radio border around the checkmark (hovered) +pub const RADIO_BORDER_HOVER: &str = "feathers.radio.border.hover"; +/// Radio border around the checkmark (disabled) +pub const RADIO_BORDER_DISABLED: &str = "feathers.radio.border.disabled"; +/// Radio check mark +pub const RADIO_MARK: &str = "feathers.radio.mark"; +/// Radio check mark (disabled) +pub const RADIO_MARK_DISABLED: &str = "feathers.radio.mark.disabled"; +/// Radio label text +pub const RADIO_TEXT: &str = "feathers.radio.text"; +/// Radio label text (disabled) +pub const RADIO_TEXT_DISABLED: &str = "feathers.radio.text.disabled"; diff --git a/examples/ui/feathers.rs b/examples/ui/feathers.rs index c5954f45c5..45f959e1c4 100644 --- a/examples/ui/feathers.rs +++ b/examples/ui/feathers.rs @@ -1,9 +1,11 @@ //! This example shows off the various Bevy Feathers widgets. use bevy::{ - core_widgets::{Callback, CoreWidgetsPlugin, SliderStep}, + core_widgets::{Callback, CoreRadio, CoreRadioGroup, CoreWidgetsPlugin, SliderStep}, feathers::{ - controls::{button, slider, ButtonProps, ButtonVariant, SliderProps}, + controls::{ + button, checkbox, radio, slider, ButtonProps, ButtonVariant, CheckboxProps, SliderProps, + }, dark_theme::create_dark_theme, rounded_corners::RoundedCorners, theme::{ThemeBackgroundColor, ThemedText, UiTheme}, @@ -14,7 +16,7 @@ use bevy::{ InputDispatchPlugin, }, prelude::*, - ui::InteractionDisabled, + ui::{Checked, InteractionDisabled}, winit::WinitSettings, }; @@ -42,6 +44,19 @@ fn setup(mut commands: Commands) { } fn demo_root(commands: &mut Commands) -> impl Bundle { + // Update radio button states based on notification from radio group. + let radio_exclusion = commands.register_system( + |ent: In, q_radio: Query>, mut commands: Commands| { + for radio in q_radio.iter() { + if radio == *ent { + commands.entity(radio).insert(Checked); + } else { + commands.entity(radio).remove::(); + } + } + }, + ); + ( Node { width: Val::Percent(100.0), @@ -166,6 +181,47 @@ fn demo_root(commands: &mut Commands) -> impl Bundle { (), Spawn((Text::new("Button"), ThemedText)) ), + checkbox( + CheckboxProps { + on_change: Callback::Ignore, + }, + Checked, + Spawn((Text::new("Checkbox"), ThemedText)) + ), + checkbox( + CheckboxProps { + on_change: Callback::Ignore, + }, + InteractionDisabled, + Spawn((Text::new("Disabled"), ThemedText)) + ), + checkbox( + CheckboxProps { + on_change: Callback::Ignore, + }, + (InteractionDisabled, Checked), + Spawn((Text::new("Disabled+Checked"), ThemedText)) + ), + ( + Node { + display: Display::Flex, + flex_direction: FlexDirection::Column, + row_gap: Val::Px(4.0), + ..default() + }, + CoreRadioGroup { + on_change: Callback::System(radio_exclusion), + }, + children![ + radio(Checked, Spawn((Text::new("One"), ThemedText))), + radio((), Spawn((Text::new("Two"), ThemedText))), + radio((), Spawn((Text::new("Three"), ThemedText))), + radio( + InteractionDisabled, + Spawn((Text::new("Disabled"), ThemedText)) + ), + ] + ), slider( SliderProps { max: 100.0, diff --git a/release-content/release-notes/feathers.md b/release-content/release-notes/feathers.md index 199a406db6..754c57ebc2 100644 --- a/release-content/release-notes/feathers.md +++ b/release-content/release-notes/feathers.md @@ -1,7 +1,7 @@ --- title: Bevy Feathers authors: ["@viridia", "@Atlas16A"] -pull_requests: [19730] +pull_requests: [19730, 19900] --- To make it easier for Bevy engine developers and third-party tool creators to make comfortable, visually cohesive tooling, From 5e8aa7986bfd7adc77c7b824e7fddb02171ce855 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Tue, 1 Jul 2025 18:41:48 +0100 Subject: [PATCH 54/68] Newtyped `ScrollPosition` (#19881) # Objective Change `ScrollPosition` to newtype `Vec2`. It's easier to work with a `Vec2` wrapper than individual fields. I'm not sure why this wasn't newtyped to start with. Maybe the intent was to support responsive coordinates eventually but that probably isn't very useful or straightforward to implement. And even if we do want to support responsive coords in the future, it can newtype `Val2`. ## Solution Change `ScrollPosition` to newtype `Vec2`. Also added some extra details to the doc comments. ## Testing Try the `scroll` example. --------- Co-authored-by: Alice Cecile --- .../bevy_core_widgets/src/core_scrollbar.rs | 26 ++++-------- crates/bevy_ui/src/layout/mod.rs | 6 +-- crates/bevy_ui/src/ui_node.rs | 42 ++++++------------- examples/testbed/full_ui.rs | 4 +- examples/ui/scroll.rs | 4 +- examples/ui/scrollbars.rs | 5 +-- .../Newtype_ScrollPosition.md | 6 +++ 7 files changed, 34 insertions(+), 59 deletions(-) create mode 100644 release-content/migration-guides/Newtype_ScrollPosition.md diff --git a/crates/bevy_core_widgets/src/core_scrollbar.rs b/crates/bevy_core_widgets/src/core_scrollbar.rs index 2d0fd49fb6..d997f565ce 100644 --- a/crates/bevy_core_widgets/src/core_scrollbar.rs +++ b/crates/bevy_core_widgets/src/core_scrollbar.rs @@ -136,23 +136,13 @@ fn scrollbar_on_pointer_down( ControlOrientation::Horizontal => { if node.size().x > 0. { let click_pos = local_pos.x * content_size.x / node.size().x; - adjust_scroll_pos( - &mut scroll_pos.offset_x, - click_pos, - visible_size.x, - max_range.x, - ); + adjust_scroll_pos(&mut scroll_pos.x, click_pos, visible_size.x, max_range.x); } } ControlOrientation::Vertical => { if node.size().y > 0. { let click_pos = local_pos.y * content_size.y / node.size().y; - adjust_scroll_pos( - &mut scroll_pos.offset_y, - click_pos, - visible_size.y, - max_range.y, - ); + adjust_scroll_pos(&mut scroll_pos.y, click_pos, visible_size.y, max_range.y); } } } @@ -171,8 +161,8 @@ fn scrollbar_on_drag_start( if let Ok(scroll_area) = q_scroll_area.get(scrollbar.target) { drag.dragging = true; drag.drag_origin = match scrollbar.orientation { - ControlOrientation::Horizontal => scroll_area.offset_x, - ControlOrientation::Vertical => scroll_area.offset_y, + ControlOrientation::Horizontal => scroll_area.x, + ControlOrientation::Vertical => scroll_area.y, }; } } @@ -204,13 +194,13 @@ fn scrollbar_on_drag( match scrollbar.orientation { ControlOrientation::Horizontal => { let range = (content_size.x - visible_size.x).max(0.); - scroll_pos.offset_x = (drag.drag_origin + scroll_pos.x = (drag.drag_origin + (distance.x * content_size.x) / scrollbar_size.x) .clamp(0., range); } ControlOrientation::Vertical => { let range = (content_size.y - visible_size.y).max(0.); - scroll_pos.offset_y = (drag.drag_origin + scroll_pos.y = (drag.drag_origin + (distance.y * content_size.y) / scrollbar_size.y) .clamp(0., range); } @@ -296,7 +286,7 @@ fn update_scrollbar_thumb( visible_size.x, track_length.x, scrollbar.min_thumb_length, - scroll_area.0.offset_x, + scroll_area.0.x, ); thumb.top = Val::Px(0.); @@ -310,7 +300,7 @@ fn update_scrollbar_thumb( visible_size.y, track_length.y, scrollbar.min_thumb_length, - scroll_area.0.offset_y, + scroll_area.0.y, ); thumb.left = Val::Px(0.); diff --git a/crates/bevy_ui/src/layout/mod.rs b/crates/bevy_ui/src/layout/mod.rs index 484acbd4af..4d5bec8f07 100644 --- a/crates/bevy_ui/src/layout/mod.rs +++ b/crates/bevy_ui/src/layout/mod.rs @@ -311,12 +311,12 @@ with UI components as a child of an entity without UI components, your UI layout .map(|scroll_pos| { Vec2::new( if style.overflow.x == OverflowAxis::Scroll { - scroll_pos.offset_x + scroll_pos.x } else { 0.0 }, if style.overflow.y == OverflowAxis::Scroll { - scroll_pos.offset_y + scroll_pos.y } else { 0.0 }, @@ -333,7 +333,7 @@ with UI components as a child of an entity without UI components, your UI layout if clamped_scroll_position != scroll_position { commands .entity(entity) - .insert(ScrollPosition::from(clamped_scroll_position)); + .insert(ScrollPosition(clamped_scroll_position)); } let physical_scroll_position = diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index 09ae4bf56e..f6b8ee27b3 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -321,45 +321,27 @@ impl Default for ComputedNode { } } -/// The scroll position of the node. +/// The scroll position of the node. Values are in logical pixels, increasing from top-left to bottom-right. /// -/// Updating the values of `ScrollPosition` will reposition the children of the node by the offset amount. +/// Increasing the x-coordinate causes the scrolled content to visibly move left on the screen, while increasing the y-coordinate causes the scrolled content to move up. +/// This might seem backwards, however what's really happening is that +/// the scroll position is moving the visible "window" in the local coordinate system of the scrolled content - +/// moving the window down causes the content to move up. +/// +/// Updating the values of `ScrollPosition` will reposition the children of the node by the offset amount in logical pixels. /// `ScrollPosition` may be updated by the layout system when a layout change makes a previously valid `ScrollPosition` invalid. /// Changing this does nothing on a `Node` without setting at least one `OverflowAxis` to `OverflowAxis::Scroll`. -#[derive(Component, Debug, Clone, Reflect)] +#[derive(Component, Debug, Clone, Default, Deref, DerefMut, Reflect)] #[reflect(Component, Default, Clone)] -pub struct ScrollPosition { - /// How far across the node is scrolled, in logical pixels. (0 = not scrolled / scrolled to right) - pub offset_x: f32, - /// How far down the node is scrolled, in logical pixels. (0 = not scrolled / scrolled to top) - pub offset_y: f32, -} +pub struct ScrollPosition(pub Vec2); impl ScrollPosition { - pub const DEFAULT: Self = Self { - offset_x: 0.0, - offset_y: 0.0, - }; -} - -impl Default for ScrollPosition { - fn default() -> Self { - Self::DEFAULT - } -} - -impl From<&ScrollPosition> for Vec2 { - fn from(scroll_pos: &ScrollPosition) -> Self { - Vec2::new(scroll_pos.offset_x, scroll_pos.offset_y) - } + pub const DEFAULT: Self = Self(Vec2::ZERO); } impl From for ScrollPosition { - fn from(vec: Vec2) -> Self { - ScrollPosition { - offset_x: vec.x, - offset_y: vec.y, - } + fn from(value: Vec2) -> Self { + Self(value) } } diff --git a/examples/testbed/full_ui.rs b/examples/testbed/full_ui.rs index 634945f057..da42dd9732 100644 --- a/examples/testbed/full_ui.rs +++ b/examples/testbed/full_ui.rs @@ -454,8 +454,8 @@ pub fn update_scroll_position( for (_pointer, pointer_map) in hover_map.iter() { for (entity, _hit) in pointer_map.iter() { if let Ok(mut scroll_position) = scrolled_node_query.get_mut(*entity) { - scroll_position.offset_x -= dx; - scroll_position.offset_y -= dy; + scroll_position.x -= dx; + scroll_position.y -= dy; } } } diff --git a/examples/ui/scroll.rs b/examples/ui/scroll.rs index 594c89a3a5..9bedb719d2 100644 --- a/examples/ui/scroll.rs +++ b/examples/ui/scroll.rs @@ -338,8 +338,8 @@ pub fn update_scroll_position( for (_pointer, pointer_map) in hover_map.iter() { for (entity, _hit) in pointer_map.iter() { if let Ok(mut scroll_position) = scrolled_node_query.get_mut(*entity) { - scroll_position.offset_x -= dx; - scroll_position.offset_y -= dy; + scroll_position.x -= dx; + scroll_position.y -= dy; } } } diff --git a/examples/ui/scrollbars.rs b/examples/ui/scrollbars.rs index 2726df12fb..72cdfd8229 100644 --- a/examples/ui/scrollbars.rs +++ b/examples/ui/scrollbars.rs @@ -86,10 +86,7 @@ fn scroll_area_demo() -> impl Bundle { ..default() }, BackgroundColor(colors::GRAY1.into()), - ScrollPosition { - offset_x: 0.0, - offset_y: 10.0, - }, + ScrollPosition(Vec2::new(0.0, 10.0)), Children::spawn(( // The actual content of the scrolling area Spawn(text_row("Alpha Wolf")), diff --git a/release-content/migration-guides/Newtype_ScrollPosition.md b/release-content/migration-guides/Newtype_ScrollPosition.md new file mode 100644 index 0000000000..5aa3196646 --- /dev/null +++ b/release-content/migration-guides/Newtype_ScrollPosition.md @@ -0,0 +1,6 @@ +--- +title: Make `ScrollPosition` newtype `Vec2` +pull_requests: [19881] +--- + +`ScrollPosition` now newtypes `Vec2`, its `offset_x` and `offset_y` fields have been removed. From a949867a1c3efed8a3465da292a92c59235bbf37 Mon Sep 17 00:00:00 2001 From: ickshonpe Date: Tue, 1 Jul 2025 20:20:07 +0100 Subject: [PATCH 55/68] UI z-ordering fix (#19691) # Objective During the migration to required components a lot of things were changed around and somehow the draw order for some UI elements ended up depending on the system ordering in `RenderSystems::Queue`, which can sometimes result in the elements being drawn in the wrong order. Fixes #19674 ## Solution * Added some more `stack_z_offsets` constants and used them to enforce an explicit ordering. * Removed the `stack_index: u32` field from `ExtractedUiNodes` and replaced it with a `z_order: f32` field. These changes should fix all the ordering problems. ## Testing I added a nine-patched bordered node with a navy background color to the slice section of the `testbed_ui` example. The border should always be drawn above the background color. --- crates/bevy_ui/src/render/debug_overlay.rs | 15 ++++---- crates/bevy_ui/src/render/gradient.rs | 14 ++++++-- crates/bevy_ui/src/render/mod.rs | 33 ++++++++++-------- .../src/render/ui_texture_slice_pipeline.rs | 4 +-- examples/testbed/ui.rs | 20 +++++++++++ .../stack_z_offsets_changes.md | 34 +++++++++++++++++++ 6 files changed, 93 insertions(+), 27 deletions(-) create mode 100644 release-content/migration-guides/stack_z_offsets_changes.md diff --git a/crates/bevy_ui/src/render/debug_overlay.rs b/crates/bevy_ui/src/render/debug_overlay.rs index c3ada22c2e..4bf9e2dd93 100644 --- a/crates/bevy_ui/src/render/debug_overlay.rs +++ b/crates/bevy_ui/src/render/debug_overlay.rs @@ -1,8 +1,14 @@ +use super::ExtractedUiItem; +use super::ExtractedUiNode; +use super::ExtractedUiNodes; +use super::NodeType; +use super::UiCameraMap; use crate::shader_flags; use crate::ui_node::ComputedNodeTarget; use crate::ui_transform::UiGlobalTransform; use crate::CalculatedClip; use crate::ComputedNode; +use crate::UiStack; use bevy_asset::AssetId; use bevy_color::Hsla; use bevy_ecs::entity::Entity; @@ -18,12 +24,6 @@ use bevy_render::view::InheritedVisibility; use bevy_render::Extract; use bevy_sprite::BorderRect; -use super::ExtractedUiItem; -use super::ExtractedUiNode; -use super::ExtractedUiNodes; -use super::NodeType; -use super::UiCameraMap; - /// Configuration for the UI debug overlay #[derive(Resource)] pub struct UiDebugOptions { @@ -68,6 +68,7 @@ pub fn extract_debug_overlay( &ComputedNodeTarget, )>, >, + ui_stack: Extract>, camera_map: Extract, ) { if !debug_options.enabled { @@ -89,7 +90,7 @@ pub fn extract_debug_overlay( extracted_uinodes.uinodes.push(ExtractedUiNode { render_entity: commands.spawn(TemporaryRenderEntity).id(), // Add a large number to the UI node's stack index so that the overlay is always drawn on top - stack_index: uinode.stack_index + u32::MAX / 2, + z_order: (ui_stack.uinodes.len() as u32 + uinode.stack_index()) as f32, color: Hsla::sequential_dispersed(entity.index()).into(), rect: Rect { min: Vec2::ZERO, diff --git a/crates/bevy_ui/src/render/gradient.rs b/crates/bevy_ui/src/render/gradient.rs index e1c845d481..57541a2ba9 100644 --- a/crates/bevy_ui/src/render/gradient.rs +++ b/crates/bevy_ui/src/render/gradient.rs @@ -408,7 +408,11 @@ pub fn extract_gradients( if let Some(color) = gradient.get_single() { // With a single color stop there's no gradient, fill the node with the color extracted_uinodes.uinodes.push(ExtractedUiNode { - stack_index: uinode.stack_index, + z_order: uinode.stack_index as f32 + + match node_type { + NodeType::Rect => stack_z_offsets::GRADIENT, + NodeType::Border(_) => stack_z_offsets::BORDER_GRADIENT, + }, color: color.into(), rect: Rect { min: Vec2::ZERO, @@ -629,7 +633,13 @@ pub fn queue_gradient( draw_function, pipeline, entity: (gradient.render_entity, gradient.main_entity), - sort_key: FloatOrd(gradient.stack_index as f32 + stack_z_offsets::GRADIENT), + sort_key: FloatOrd( + gradient.stack_index as f32 + + match gradient.node_type { + NodeType::Rect => stack_z_offsets::GRADIENT, + NodeType::Border(_) => stack_z_offsets::BORDER_GRADIENT, + }, + ), batch_range: 0..0, extra_index: PhaseItemExtraIndex::None, index, diff --git a/crates/bevy_ui/src/render/mod.rs b/crates/bevy_ui/src/render/mod.rs index b3d0117801..dfff318f46 100644 --- a/crates/bevy_ui/src/render/mod.rs +++ b/crates/bevy_ui/src/render/mod.rs @@ -81,7 +81,7 @@ pub mod graph { } } -/// Z offsets of "extracted nodes" for a given entity. These exist to allow rendering multiple "extracted nodes" +/// Local Z offsets of "extracted nodes" for a given entity. These exist to allow rendering multiple "extracted nodes" /// for a given source entity (ex: render both a background color _and_ a custom material for a given node). /// /// When possible these offsets should be defined in _this_ module to ensure z-index coordination across contexts. @@ -97,10 +97,13 @@ pub mod graph { /// a positive offset on a node below. pub mod stack_z_offsets { pub const BOX_SHADOW: f32 = -0.1; - pub const TEXTURE_SLICE: f32 = 0.0; - pub const NODE: f32 = 0.0; - pub const GRADIENT: f32 = 0.1; - pub const MATERIAL: f32 = 0.18267; + pub const BACKGROUND_COLOR: f32 = 0.0; + pub const BORDER: f32 = 0.01; + pub const GRADIENT: f32 = 0.02; + pub const BORDER_GRADIENT: f32 = 0.03; + pub const IMAGE: f32 = 0.04; + pub const MATERIAL: f32 = 0.05; + pub const TEXT: f32 = 0.06; } #[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)] @@ -213,7 +216,7 @@ fn get_ui_graph(render_app: &mut SubApp) -> RenderGraph { } pub struct ExtractedUiNode { - pub stack_index: u32, + pub z_order: f32, pub color: LinearRgba, pub rect: Rect, pub image: AssetId, @@ -374,7 +377,7 @@ pub fn extract_uinode_background_colors( extracted_uinodes.uinodes.push(ExtractedUiNode { render_entity: commands.spawn(TemporaryRenderEntity).id(), - stack_index: uinode.stack_index, + z_order: uinode.stack_index as f32 + stack_z_offsets::BACKGROUND_COLOR, color: background_color.0.into(), rect: Rect { min: Vec2::ZERO, @@ -460,8 +463,8 @@ pub fn extract_uinode_images( }; extracted_uinodes.uinodes.push(ExtractedUiNode { + z_order: uinode.stack_index as f32 + stack_z_offsets::IMAGE, render_entity: commands.spawn(TemporaryRenderEntity).id(), - stack_index: uinode.stack_index, color: image.color.into(), rect, clip: clip.map(|clip| clip.clip), @@ -558,7 +561,7 @@ pub fn extract_uinode_borders( completed_flags |= border_flags; extracted_uinodes.uinodes.push(ExtractedUiNode { - stack_index: computed_node.stack_index, + z_order: computed_node.stack_index as f32 + stack_z_offsets::BORDER, color, rect: Rect { max: computed_node.size(), @@ -591,8 +594,8 @@ pub fn extract_uinode_borders( { let outline_size = computed_node.outlined_node_size(); extracted_uinodes.uinodes.push(ExtractedUiNode { + z_order: computed_node.stack_index as f32 + stack_z_offsets::BORDER, render_entity: commands.spawn(TemporaryRenderEntity).id(), - stack_index: computed_node.stack_index, color: outline.color.into(), rect: Rect { max: outline_size, @@ -782,8 +785,8 @@ pub fn extract_viewport_nodes( }; extracted_uinodes.uinodes.push(ExtractedUiNode { + z_order: uinode.stack_index as f32 + stack_z_offsets::IMAGE, render_entity: commands.spawn(TemporaryRenderEntity).id(), - stack_index: uinode.stack_index, color: LinearRgba::WHITE, rect: Rect { min: Vec2::ZERO, @@ -885,8 +888,8 @@ pub fn extract_text_sections( .map(|text_color| LinearRgba::from(text_color.0)) .unwrap_or_default(); extracted_uinodes.uinodes.push(ExtractedUiNode { + z_order: uinode.stack_index as f32 + stack_z_offsets::TEXT, render_entity: commands.spawn(TemporaryRenderEntity).id(), - stack_index: uinode.stack_index, color, image: atlas_info.texture.id(), clip: clip.map(|clip| clip.clip), @@ -966,8 +969,8 @@ pub fn extract_text_shadows( info.span_index != *span_index || info.atlas_info.texture != atlas_info.texture }) { extracted_uinodes.uinodes.push(ExtractedUiNode { + z_order: uinode.stack_index as f32 + stack_z_offsets::TEXT, render_entity: commands.spawn(TemporaryRenderEntity).id(), - stack_index: uinode.stack_index, color: shadow.color.into(), image: atlas_info.texture.id(), clip: clip.map(|clip| clip.clip), @@ -1023,8 +1026,8 @@ pub fn extract_text_background_colors( }; extracted_uinodes.uinodes.push(ExtractedUiNode { + z_order: uinode.stack_index as f32 + stack_z_offsets::TEXT, render_entity: commands.spawn(TemporaryRenderEntity).id(), - stack_index: uinode.stack_index, color: text_background_color.0.to_linear(), rect: Rect { min: Vec2::ZERO, @@ -1167,7 +1170,7 @@ pub fn queue_uinodes( draw_function, pipeline, entity: (extracted_uinode.render_entity, extracted_uinode.main_entity), - sort_key: FloatOrd(extracted_uinode.stack_index as f32 + stack_z_offsets::NODE), + sort_key: FloatOrd(extracted_uinode.z_order), index, // batch_range will be calculated in prepare_uinodes batch_range: 0..0, diff --git a/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs b/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs index 0e232ab1cc..e36d93ab28 100644 --- a/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs +++ b/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs @@ -366,9 +366,7 @@ pub fn queue_ui_slices( draw_function, pipeline, entity: (extracted_slicer.render_entity, extracted_slicer.main_entity), - sort_key: FloatOrd( - extracted_slicer.stack_index as f32 + stack_z_offsets::TEXTURE_SLICE, - ), + sort_key: FloatOrd(extracted_slicer.stack_index as f32 + stack_z_offsets::IMAGE), batch_range: 0..0, extra_index: PhaseItemExtraIndex::None, index, diff --git a/examples/testbed/ui.rs b/examples/testbed/ui.rs index 10e4e8dc8f..a2f6d6a14a 100644 --- a/examples/testbed/ui.rs +++ b/examples/testbed/ui.rs @@ -484,6 +484,26 @@ mod slice { }, )); } + + parent.spawn(( + ImageNode { + image: asset_server + .load("textures/fantasy_ui_borders/panel-border-010.png"), + image_mode: NodeImageMode::Sliced(TextureSlicer { + border: BorderRect::all(22.0), + center_scale_mode: SliceScaleMode::Stretch, + sides_scale_mode: SliceScaleMode::Stretch, + max_corner_scale: 1.0, + }), + ..Default::default() + }, + Node { + width: Val::Px(100.), + height: Val::Px(100.), + ..default() + }, + BackgroundColor(bevy::color::palettes::css::NAVY.into()), + )); }); } } diff --git a/release-content/migration-guides/stack_z_offsets_changes.md b/release-content/migration-guides/stack_z_offsets_changes.md new file mode 100644 index 0000000000..04187978d7 --- /dev/null +++ b/release-content/migration-guides/stack_z_offsets_changes.md @@ -0,0 +1,34 @@ +--- +title: Fixed UI draw order and `stack_z_offsets` changes +pull_requests: [19691] +--- + +The draw order of some renderable UI elements relative to others wasn't fixed and depended on system ordering. +In particular the ordering of background colors and texture sliced images was sometimes swapped. + +The UI draw order is now fixed. +The new order is (back-to-front): + +1. Box shadows + +2. Node background colors + +3. Node borders + +4. Gradients + +5. Border Gradients + +6. Images (including texture-sliced images) + +7. Materials + +8. Text (including text shadows) + +The values of the `stack_z_offsets` constants have been updated to enforce the new ordering. Other changes: + +* `NODE` is renamed to `BACKGROUND_COLOR` + +* `TEXTURE_SLICE` is removed, use `IMAGE`. + +* New `BORDER`, `BORDER_GRADIENT` and `TEXT` constants. From 1a410efd246e0f2f41766d47e300f474c8379b2e Mon Sep 17 00:00:00 2001 From: andriyDev Date: Tue, 1 Jul 2025 12:27:42 -0700 Subject: [PATCH 56/68] Flatten `PrepassPipelineInternal` into `PrepassPipeline`. (#19909) # Objective - PrepassPipelineInternal used to exist to optimize compile time and binary size when PrepassPipeline was generic over the material. - After #19667, PrepassPipeline is no longer generic! ## Solution - Flatten all the fields of `PrepassPipelineInternal` into `PrepassPipeline`. --- .../src/meshlet/material_pipeline_prepare.rs | 9 ++---- crates/bevy_pbr/src/prepass/mod.rs | 31 ++++++------------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs index 536451a673..cda93189be 100644 --- a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs +++ b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs @@ -351,12 +351,9 @@ pub fn prepare_material_meshlet_meshes_prepass( shader_defs.push("MESHLET_MESH_MATERIAL_PASS".into()); let view_layout = if view_key.contains(MeshPipelineKey::MOTION_VECTOR_PREPASS) { - prepass_pipeline.internal.view_layout_motion_vectors.clone() + prepass_pipeline.view_layout_motion_vectors.clone() } else { - prepass_pipeline - .internal - .view_layout_no_motion_vectors - .clone() + prepass_pipeline.view_layout_no_motion_vectors.clone() }; let fragment_shader = if view_key.contains(MeshPipelineKey::DEFERRED_PREPASS) { @@ -381,7 +378,7 @@ pub fn prepare_material_meshlet_meshes_prepass( label: material_pipeline_descriptor.label, layout: vec![ view_layout, - prepass_pipeline.internal.empty_layout.clone(), + prepass_pipeline.empty_layout.clone(), resource_manager.material_shade_bind_group_layout.clone(), material .properties diff --git a/crates/bevy_pbr/src/prepass/mod.rs b/crates/bevy_pbr/src/prepass/mod.rs index b007242c76..c1def00b18 100644 --- a/crates/bevy_pbr/src/prepass/mod.rs +++ b/crates/bevy_pbr/src/prepass/mod.rs @@ -254,14 +254,6 @@ pub fn update_mesh_previous_global_transforms( #[derive(Resource, Clone)] pub struct PrepassPipeline { - pub internal: PrepassPipelineInternal, - pub material_pipeline: MaterialPipeline, -} - -/// Internal fields of the `PrepassPipeline` that don't need the generic bound -/// This is done as an optimization to not recompile the same code multiple time -#[derive(Clone)] -pub struct PrepassPipelineInternal { pub view_layout_motion_vectors: BindGroupLayout, pub view_layout_no_motion_vectors: BindGroupLayout, pub mesh_layouts: MeshLayouts, @@ -277,6 +269,7 @@ pub struct PrepassPipelineInternal { /// Whether binding arrays (a.k.a. bindless textures) are usable on the /// current render device. pub binding_arrays_are_usable: bool, + pub material_pipeline: MaterialPipeline, } impl FromWorld for PrepassPipeline { @@ -339,7 +332,7 @@ impl FromWorld for PrepassPipeline { let depth_clip_control_supported = render_device .features() .contains(WgpuFeatures::DEPTH_CLIP_CONTROL); - let internal = PrepassPipelineInternal { + PrepassPipeline { view_layout_motion_vectors, view_layout_no_motion_vectors, mesh_layouts: mesh_pipeline.mesh_layouts.clone(), @@ -348,9 +341,6 @@ impl FromWorld for PrepassPipeline { depth_clip_control_supported, binding_arrays_are_usable: binding_arrays_are_usable(render_device, render_adapter), empty_layout: render_device.create_bind_group_layout("prepass_empty_layout", &[]), - }; - PrepassPipeline { - internal, material_pipeline: world.resource::().clone(), } } @@ -373,12 +363,9 @@ impl SpecializedMeshPipeline for PrepassPipelineSpecializer { if self.properties.bindless { shader_defs.push("BINDLESS".into()); } - let mut descriptor = self.pipeline.internal.specialize( - key.mesh_key, - shader_defs, - layout, - &self.properties, - )?; + let mut descriptor = + self.pipeline + .specialize(key.mesh_key, shader_defs, layout, &self.properties)?; // This is a bit risky because it's possible to change something that would // break the prepass but be fine in the main pass. @@ -396,7 +383,7 @@ impl SpecializedMeshPipeline for PrepassPipelineSpecializer { } } -impl PrepassPipelineInternal { +impl PrepassPipeline { fn specialize( &self, mesh_key: MeshPipelineKey, @@ -726,7 +713,7 @@ impl FromWorld for PrepassViewBindGroup { let render_device = world.resource::(); let empty_bind_group = render_device.create_bind_group( "prepass_view_empty_bind_group", - &pipeline.internal.empty_layout, + &pipeline.empty_layout, &[], ); PrepassViewBindGroup { @@ -753,7 +740,7 @@ pub fn prepare_prepass_view_bind_group( ) { prepass_view_bind_group.no_motion_vectors = Some(render_device.create_bind_group( "prepass_view_no_motion_vectors_bind_group", - &prepass_pipeline.internal.view_layout_no_motion_vectors, + &prepass_pipeline.view_layout_no_motion_vectors, &BindGroupEntries::with_indices(( (0, view_binding.clone()), (1, globals_binding.clone()), @@ -764,7 +751,7 @@ pub fn prepare_prepass_view_bind_group( if let Some(previous_view_uniforms_binding) = previous_view_uniforms.uniforms.binding() { prepass_view_bind_group.motion_vectors = Some(render_device.create_bind_group( "prepass_view_motion_vectors_bind_group", - &prepass_pipeline.internal.view_layout_motion_vectors, + &prepass_pipeline.view_layout_motion_vectors, &BindGroupEntries::with_indices(( (0, view_binding), (1, globals_binding), From d05c4358486497b41c0c477115d12f1969a2b0ea Mon Sep 17 00:00:00 2001 From: andriyDev Date: Wed, 2 Jul 2025 07:40:35 -0700 Subject: [PATCH 57/68] Replace `Handle::Weak` with `Handle::Uuid`. (#19896) # Objective - Progress towards #19024. ## Solution - Remove `Handle::Weak`! If users were relying on `Handle::Weak` for some purpose, they can almost certainly replace it with raw `AssetId` instead. If they cannot, they can make their own enum that holds either a Handle or an AssetId. In either case, we don't need weak handles! Sadly we still need Uuid handles since we rely on them for "default" assets and "invalid" assets, as well as anywhere where a component wants to impl default with a non-defaulted asset handle. One step at a time though! --- crates/bevy_anti_aliasing/src/smaa/mod.rs | 6 +- crates/bevy_asset/src/handle.rs | 156 ++++++++---------- .../src/experimental/mip_generation/mod.rs | 4 +- .../src/post_process/mod.rs | 4 +- crates/bevy_gizmos/src/retained.rs | 2 +- crates/bevy_pbr/src/decal/forward.rs | 4 +- crates/bevy_pbr/src/volumetric_fog/render.rs | 6 +- crates/bevy_render/src/texture/mod.rs | 4 +- crates/bevy_text/src/font_atlas_set.rs | 4 +- crates/bevy_text/src/glyph.rs | 15 +- crates/bevy_text/src/pipeline.rs | 2 +- crates/bevy_text/src/text2d.rs | 4 +- crates/bevy_ui/src/render/mod.rs | 8 +- examples/2d/mesh2d_manual.rs | 4 +- .../shader/compute_shader_game_of_life.rs | 4 +- .../tools/scene_viewer/scene_viewer_plugin.rs | 3 +- .../handle_weak_replaced_with_handle_uuid.md | 40 +++++ 17 files changed, 143 insertions(+), 127 deletions(-) create mode 100644 release-content/migration-guides/handle_weak_replaced_with_handle_uuid.md diff --git a/crates/bevy_anti_aliasing/src/smaa/mod.rs b/crates/bevy_anti_aliasing/src/smaa/mod.rs index 3996f389d0..bc6feca267 100644 --- a/crates/bevy_anti_aliasing/src/smaa/mod.rs +++ b/crates/bevy_anti_aliasing/src/smaa/mod.rs @@ -32,7 +32,7 @@ use bevy_app::{App, Plugin}; #[cfg(feature = "smaa_luts")] use bevy_asset::load_internal_binary_asset; -use bevy_asset::{embedded_asset, load_embedded_asset, weak_handle, Handle}; +use bevy_asset::{embedded_asset, load_embedded_asset, uuid_handle, Handle}; #[cfg(not(feature = "smaa_luts"))] use bevy_core_pipeline::tonemapping::lut_placeholder; use bevy_core_pipeline::{ @@ -81,10 +81,10 @@ use bevy_utils::prelude::default; /// The handle of the area LUT, a KTX2 format texture that SMAA uses internally. const SMAA_AREA_LUT_TEXTURE_HANDLE: Handle = - weak_handle!("569c4d67-c7fa-4958-b1af-0836023603c0"); + uuid_handle!("569c4d67-c7fa-4958-b1af-0836023603c0"); /// The handle of the search LUT, a KTX2 format texture that SMAA uses internally. const SMAA_SEARCH_LUT_TEXTURE_HANDLE: Handle = - weak_handle!("43b97515-252e-4c8a-b9af-f2fc528a1c27"); + uuid_handle!("43b97515-252e-4c8a-b9af-f2fc528a1c27"); /// Adds support for subpixel morphological antialiasing, or SMAA. pub struct SmaaPlugin; diff --git a/crates/bevy_asset/src/handle.rs b/crates/bevy_asset/src/handle.rs index e6f00c7da5..b9a20a7af8 100644 --- a/crates/bevy_asset/src/handle.rs +++ b/crates/bevy_asset/src/handle.rs @@ -7,10 +7,12 @@ use bevy_reflect::{std_traits::ReflectDefault, Reflect, TypePath}; use core::{ any::TypeId, hash::{Hash, Hasher}, + marker::PhantomData, }; use crossbeam_channel::{Receiver, Sender}; use disqualified::ShortName; use thiserror::Error; +use uuid::Uuid; /// Provides [`Handle`] and [`UntypedHandle`] _for a specific asset type_. /// This should _only_ be used for one specific asset type. @@ -117,7 +119,7 @@ impl core::fmt::Debug for StrongHandle { /// avoiding the need to store multiple copies of the same data. /// /// If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept -/// alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Weak`], it does not necessarily reference a live [`Asset`], +/// alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`], /// nor will it keep assets alive. /// /// Modifying a *handle* will change which existing asset is referenced, but modifying the *asset* @@ -133,16 +135,16 @@ pub enum Handle { /// A "strong" reference to a live (or loading) [`Asset`]. If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept /// alive until the [`Handle`] is dropped. Strong handles also provide access to additional asset metadata. Strong(Arc), - /// A "weak" reference to an [`Asset`]. If a [`Handle`] is [`Handle::Weak`], it does not necessarily reference a live [`Asset`], - /// nor will it keep assets alive. - Weak(AssetId), + /// A reference to an [`Asset`] using a stable-across-runs / const identifier. Dropping this + /// handle will not result in the asset being dropped. + Uuid(Uuid, #[reflect(ignore, clone)] PhantomData A>), } impl Clone for Handle { fn clone(&self) -> Self { match self { Handle::Strong(handle) => Handle::Strong(handle.clone()), - Handle::Weak(id) => Handle::Weak(*id), + Handle::Uuid(uuid, ..) => Handle::Uuid(*uuid, PhantomData), } } } @@ -153,7 +155,7 @@ impl Handle { pub fn id(&self) -> AssetId { match self { Handle::Strong(handle) => handle.id.typed_unchecked(), - Handle::Weak(id) => *id, + Handle::Uuid(uuid, ..) => AssetId::Uuid { uuid: *uuid }, } } @@ -162,14 +164,14 @@ impl Handle { pub fn path(&self) -> Option<&AssetPath<'static>> { match self { Handle::Strong(handle) => handle.path.as_ref(), - Handle::Weak(_) => None, + Handle::Uuid(..) => None, } } - /// Returns `true` if this is a weak handle. + /// Returns `true` if this is a uuid handle. #[inline] - pub fn is_weak(&self) -> bool { - matches!(self, Handle::Weak(_)) + pub fn is_uuid(&self) -> bool { + matches!(self, Handle::Uuid(..)) } /// Returns `true` if this is a strong handle. @@ -178,18 +180,9 @@ impl Handle { matches!(self, Handle::Strong(_)) } - /// Creates a [`Handle::Weak`] clone of this [`Handle`], which will not keep the referenced [`Asset`] alive. - #[inline] - pub fn clone_weak(&self) -> Self { - match self { - Handle::Strong(handle) => Handle::Weak(handle.id.typed_unchecked::()), - Handle::Weak(id) => Handle::Weak(*id), - } - } - /// Converts this [`Handle`] to an "untyped" / "generic-less" [`UntypedHandle`], which stores the [`Asset`] type information - /// _inside_ [`UntypedHandle`]. This will return [`UntypedHandle::Strong`] for [`Handle::Strong`] and [`UntypedHandle::Weak`] for - /// [`Handle::Weak`]. + /// _inside_ [`UntypedHandle`]. This will return [`UntypedHandle::Strong`] for [`Handle::Strong`] and [`UntypedHandle::Uuid`] for + /// [`Handle::Uuid`]. #[inline] pub fn untyped(self) -> UntypedHandle { self.into() @@ -198,7 +191,7 @@ impl Handle { impl Default for Handle { fn default() -> Self { - Handle::Weak(AssetId::default()) + Handle::Uuid(AssetId::::DEFAULT_UUID, PhantomData) } } @@ -214,7 +207,7 @@ impl core::fmt::Debug for Handle { handle.path ) } - Handle::Weak(id) => write!(f, "WeakHandle<{name}>({:?})", id.internal()), + Handle::Uuid(uuid, ..) => write!(f, "UuidHandle<{name}>({uuid:?})"), } } } @@ -284,8 +277,13 @@ impl From<&mut Handle> for UntypedAssetId { pub enum UntypedHandle { /// A strong handle, which will keep the referenced [`Asset`] alive until all strong handles are dropped. Strong(Arc), - /// A weak handle, which does not keep the referenced [`Asset`] alive. - Weak(UntypedAssetId), + /// A UUID handle, which does not keep the referenced [`Asset`] alive. + Uuid { + /// An identifier that records the underlying asset type. + type_id: TypeId, + /// The UUID provided during asset registration. + uuid: Uuid, + }, } impl UntypedHandle { @@ -294,7 +292,10 @@ impl UntypedHandle { pub fn id(&self) -> UntypedAssetId { match self { UntypedHandle::Strong(handle) => handle.id, - UntypedHandle::Weak(id) => *id, + UntypedHandle::Uuid { type_id, uuid } => UntypedAssetId::Uuid { + uuid: *uuid, + type_id: *type_id, + }, } } @@ -303,16 +304,7 @@ impl UntypedHandle { pub fn path(&self) -> Option<&AssetPath<'static>> { match self { UntypedHandle::Strong(handle) => handle.path.as_ref(), - UntypedHandle::Weak(_) => None, - } - } - - /// Creates an [`UntypedHandle::Weak`] clone of this [`UntypedHandle`], which will not keep the referenced [`Asset`] alive. - #[inline] - pub fn clone_weak(&self) -> UntypedHandle { - match self { - UntypedHandle::Strong(handle) => UntypedHandle::Weak(handle.id), - UntypedHandle::Weak(id) => UntypedHandle::Weak(*id), + UntypedHandle::Uuid { .. } => None, } } @@ -321,7 +313,7 @@ impl UntypedHandle { pub fn type_id(&self) -> TypeId { match self { UntypedHandle::Strong(handle) => handle.id.type_id(), - UntypedHandle::Weak(id) => id.type_id(), + UntypedHandle::Uuid { type_id, .. } => *type_id, } } @@ -330,7 +322,7 @@ impl UntypedHandle { pub fn typed_unchecked(self) -> Handle { match self { UntypedHandle::Strong(handle) => Handle::Strong(handle), - UntypedHandle::Weak(id) => Handle::Weak(id.typed_unchecked::()), + UntypedHandle::Uuid { uuid, .. } => Handle::Uuid(uuid, PhantomData), } } @@ -345,10 +337,7 @@ impl UntypedHandle { TypeId::of::(), "The target Handle's TypeId does not match the TypeId of this UntypedHandle" ); - match self { - UntypedHandle::Strong(handle) => Handle::Strong(handle), - UntypedHandle::Weak(id) => Handle::Weak(id.typed_unchecked::()), - } + self.typed_unchecked() } /// Converts to a typed Handle. This will panic if the internal [`TypeId`] does not match the given asset type `A` @@ -376,7 +365,7 @@ impl UntypedHandle { pub fn meta_transform(&self) -> Option<&MetaTransform> { match self { UntypedHandle::Strong(handle) => handle.meta_transform.as_ref(), - UntypedHandle::Weak(_) => None, + UntypedHandle::Uuid { .. } => None, } } } @@ -409,12 +398,9 @@ impl core::fmt::Debug for UntypedHandle { handle.path ) } - UntypedHandle::Weak(id) => write!( - f, - "WeakHandle{{ type_id: {:?}, id: {:?} }}", - id.type_id(), - id.internal() - ), + UntypedHandle::Uuid { type_id, uuid } => { + write!(f, "UuidHandle{{ type_id: {type_id:?}, uuid: {uuid:?} }}",) + } } } } @@ -474,7 +460,10 @@ impl From> for UntypedHandle { fn from(value: Handle) -> Self { match value { Handle::Strong(handle) => UntypedHandle::Strong(handle), - Handle::Weak(id) => UntypedHandle::Weak(id.into()), + Handle::Uuid(uuid, _) => UntypedHandle::Uuid { + type_id: TypeId::of::(), + uuid, + }, } } } @@ -490,36 +479,37 @@ impl TryFrom for Handle { return Err(UntypedAssetConversionError::TypeIdMismatch { expected, found }); } - match value { - UntypedHandle::Strong(handle) => Ok(Handle::Strong(handle)), - UntypedHandle::Weak(id) => { - let Ok(id) = id.try_into() else { - return Err(UntypedAssetConversionError::TypeIdMismatch { expected, found }); - }; - Ok(Handle::Weak(id)) - } - } + Ok(match value { + UntypedHandle::Strong(handle) => Handle::Strong(handle), + UntypedHandle::Uuid { uuid, .. } => Handle::Uuid(uuid, PhantomData), + }) } } -/// Creates a weak [`Handle`] from a string literal containing a UUID. +/// Creates a [`Handle`] from a string literal containing a UUID. /// /// # Examples /// /// ``` -/// # use bevy_asset::{Handle, weak_handle}; +/// # use bevy_asset::{Handle, uuid_handle}; /// # type Shader = (); -/// const SHADER: Handle = weak_handle!("1347c9b7-c46a-48e7-b7b8-023a354b7cac"); +/// const SHADER: Handle = uuid_handle!("1347c9b7-c46a-48e7-b7b8-023a354b7cac"); /// ``` #[macro_export] -macro_rules! weak_handle { +macro_rules! uuid_handle { ($uuid:expr) => {{ - $crate::Handle::Weak($crate::AssetId::Uuid { - uuid: $crate::uuid::uuid!($uuid), - }) + $crate::Handle::Uuid($crate::uuid::uuid!($uuid), core::marker::PhantomData) }}; } +#[deprecated = "Use uuid_handle! instead"] +#[macro_export] +macro_rules! weak_handle { + ($uuid:expr) => { + uuid_handle!($uuid) + }; +} + /// Errors preventing the conversion of to/from an [`UntypedHandle`] and a [`Handle`]. #[derive(Error, Debug, PartialEq, Clone)] #[non_exhaustive] @@ -559,15 +549,12 @@ mod tests { /// Typed and Untyped `Handles` should be equivalent to each other and themselves #[test] fn equality() { - let typed = AssetId::::Uuid { uuid: UUID_1 }; - let untyped = UntypedAssetId::Uuid { + let typed = Handle::::Uuid(UUID_1, PhantomData); + let untyped = UntypedHandle::Uuid { type_id: TypeId::of::(), uuid: UUID_1, }; - let typed = Handle::Weak(typed); - let untyped = UntypedHandle::Weak(untyped); - assert_eq!( Ok(typed.clone()), Handle::::try_from(untyped.clone()) @@ -585,22 +572,17 @@ mod tests { fn ordering() { assert!(UUID_1 < UUID_2); - let typed_1 = AssetId::::Uuid { uuid: UUID_1 }; - let typed_2 = AssetId::::Uuid { uuid: UUID_2 }; - let untyped_1 = UntypedAssetId::Uuid { + let typed_1 = Handle::::Uuid(UUID_1, PhantomData); + let typed_2 = Handle::::Uuid(UUID_2, PhantomData); + let untyped_1 = UntypedHandle::Uuid { type_id: TypeId::of::(), uuid: UUID_1, }; - let untyped_2 = UntypedAssetId::Uuid { + let untyped_2 = UntypedHandle::Uuid { type_id: TypeId::of::(), uuid: UUID_2, }; - let typed_1 = Handle::Weak(typed_1); - let typed_2 = Handle::Weak(typed_2); - let untyped_1 = UntypedHandle::Weak(untyped_1); - let untyped_2 = UntypedHandle::Weak(untyped_2); - assert!(typed_1 < typed_2); assert!(untyped_1 < untyped_2); @@ -617,15 +599,12 @@ mod tests { /// Typed and Untyped `Handles` should be equivalently hashable to each other and themselves #[test] fn hashing() { - let typed = AssetId::::Uuid { uuid: UUID_1 }; - let untyped = UntypedAssetId::Uuid { + let typed = Handle::::Uuid(UUID_1, PhantomData); + let untyped = UntypedHandle::Uuid { type_id: TypeId::of::(), uuid: UUID_1, }; - let typed = Handle::Weak(typed); - let untyped = UntypedHandle::Weak(untyped); - assert_eq!( hash(&typed), hash(&Handle::::try_from(untyped.clone()).unwrap()) @@ -637,15 +616,12 @@ mod tests { /// Typed and Untyped `Handles` should be interchangeable #[test] fn conversion() { - let typed = AssetId::::Uuid { uuid: UUID_1 }; - let untyped = UntypedAssetId::Uuid { + let typed = Handle::::Uuid(UUID_1, PhantomData); + let untyped = UntypedHandle::Uuid { type_id: TypeId::of::(), uuid: UUID_1, }; - let typed = Handle::Weak(typed); - let untyped = UntypedHandle::Weak(untyped); - assert_eq!(typed, Handle::try_from(untyped.clone()).unwrap()); assert_eq!(UntypedHandle::from(typed.clone()), untyped); } diff --git a/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs b/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs index f7df3ad1b6..8bd7d92393 100644 --- a/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs +++ b/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs @@ -12,7 +12,7 @@ use crate::core_3d::{ prepare_core_3d_depth_textures, }; use bevy_app::{App, Plugin}; -use bevy_asset::{load_internal_asset, weak_handle, Handle}; +use bevy_asset::{load_internal_asset, uuid_handle, Handle}; use bevy_derive::{Deref, DerefMut}; use bevy_ecs::{ component::Component, @@ -51,7 +51,7 @@ use tracing::debug; /// Identifies the `downsample_depth.wgsl` shader. pub const DOWNSAMPLE_DEPTH_SHADER_HANDLE: Handle = - weak_handle!("a09a149e-5922-4fa4-9170-3c1a13065364"); + uuid_handle!("a09a149e-5922-4fa4-9170-3c1a13065364"); /// The maximum number of mip levels that we can produce. /// diff --git a/crates/bevy_core_pipeline/src/post_process/mod.rs b/crates/bevy_core_pipeline/src/post_process/mod.rs index f7d2501b41..350ee1cfdd 100644 --- a/crates/bevy_core_pipeline/src/post_process/mod.rs +++ b/crates/bevy_core_pipeline/src/post_process/mod.rs @@ -3,7 +3,7 @@ //! Currently, this consists only of chromatic aberration. use bevy_app::{App, Plugin}; -use bevy_asset::{embedded_asset, load_embedded_asset, weak_handle, Assets, Handle}; +use bevy_asset::{embedded_asset, load_embedded_asset, uuid_handle, Assets, Handle}; use bevy_derive::{Deref, DerefMut}; use bevy_ecs::{ component::Component, @@ -52,7 +52,7 @@ use crate::{ /// This is just a 3x1 image consisting of one red pixel, one green pixel, and /// one blue pixel, in that order. const DEFAULT_CHROMATIC_ABERRATION_LUT_HANDLE: Handle = - weak_handle!("dc3e3307-40a1-49bb-be6d-e0634e8836b2"); + uuid_handle!("dc3e3307-40a1-49bb-be6d-e0634e8836b2"); /// The default chromatic aberration intensity amount, in a fraction of the /// window size. diff --git a/crates/bevy_gizmos/src/retained.rs b/crates/bevy_gizmos/src/retained.rs index 88610b9744..4cc75f236d 100644 --- a/crates/bevy_gizmos/src/retained.rs +++ b/crates/bevy_gizmos/src/retained.rs @@ -149,7 +149,7 @@ pub(crate) fn extract_linegizmos( line_style: gizmo.line_config.style, line_joints: gizmo.line_config.joints, render_layers: render_layers.cloned().unwrap_or_default(), - handle: gizmo.handle.clone_weak(), + handle: gizmo.handle.clone(), }, MainEntity::from(entity), TemporaryRenderEntity, diff --git a/crates/bevy_pbr/src/decal/forward.rs b/crates/bevy_pbr/src/decal/forward.rs index 757ecff2c3..49767557e1 100644 --- a/crates/bevy_pbr/src/decal/forward.rs +++ b/crates/bevy_pbr/src/decal/forward.rs @@ -3,7 +3,7 @@ use crate::{ MaterialPlugin, StandardMaterial, }; use bevy_app::{App, Plugin}; -use bevy_asset::{weak_handle, Asset, Assets, Handle}; +use bevy_asset::{uuid_handle, Asset, Assets, Handle}; use bevy_ecs::component::Component; use bevy_math::{prelude::Rectangle, Quat, Vec2, Vec3}; use bevy_reflect::{Reflect, TypePath}; @@ -21,7 +21,7 @@ use bevy_render::{ }; const FORWARD_DECAL_MESH_HANDLE: Handle = - weak_handle!("afa817f9-1869-4e0c-ac0d-d8cd1552d38a"); + uuid_handle!("afa817f9-1869-4e0c-ac0d-d8cd1552d38a"); /// Plugin to render [`ForwardDecal`]s. pub struct ForwardDecalPlugin; diff --git a/crates/bevy_pbr/src/volumetric_fog/render.rs b/crates/bevy_pbr/src/volumetric_fog/render.rs index a5cd8e56f3..e15966e5e0 100644 --- a/crates/bevy_pbr/src/volumetric_fog/render.rs +++ b/crates/bevy_pbr/src/volumetric_fog/render.rs @@ -2,7 +2,7 @@ use core::array; -use bevy_asset::{load_embedded_asset, weak_handle, AssetId, Handle}; +use bevy_asset::{load_embedded_asset, uuid_handle, AssetId, Handle}; use bevy_color::ColorToComponents as _; use bevy_core_pipeline::{ core_3d::Camera3d, @@ -82,14 +82,14 @@ bitflags! { /// /// This mesh is simply stretched to the size of the framebuffer, as when the /// camera is inside a fog volume it's essentially a full-screen effect. -pub const PLANE_MESH: Handle = weak_handle!("92523617-c708-4fd0-b42f-ceb4300c930b"); +pub const PLANE_MESH: Handle = uuid_handle!("92523617-c708-4fd0-b42f-ceb4300c930b"); /// The cube mesh, which is used to render a fog volume that the camera is /// outside. /// /// Note that only the front faces of this cuboid will be rasterized in /// hardware. The back faces will be calculated in the shader via raytracing. -pub const CUBE_MESH: Handle = weak_handle!("4a1dd661-2d91-4377-a17a-a914e21e277e"); +pub const CUBE_MESH: Handle = uuid_handle!("4a1dd661-2d91-4377-a17a-a914e21e277e"); /// The total number of bind group layouts. /// diff --git a/crates/bevy_render/src/texture/mod.rs b/crates/bevy_render/src/texture/mod.rs index fe37dd4310..006ac2e5e8 100644 --- a/crates/bevy_render/src/texture/mod.rs +++ b/crates/bevy_render/src/texture/mod.rs @@ -21,7 +21,7 @@ use crate::{ render_asset::RenderAssetPlugin, renderer::RenderDevice, Render, RenderApp, RenderSystems, }; use bevy_app::{App, Plugin}; -use bevy_asset::{weak_handle, AssetApp, Assets, Handle}; +use bevy_asset::{uuid_handle, AssetApp, Assets, Handle}; use bevy_ecs::prelude::*; use tracing::warn; @@ -31,7 +31,7 @@ use tracing::warn; /// While that handle points to an opaque white 1 x 1 image, this handle points to a transparent 1 x 1 white image. // Number randomly selected by fair WolframAlpha query. Totally arbitrary. pub const TRANSPARENT_IMAGE_HANDLE: Handle = - weak_handle!("d18ad97e-a322-4981-9505-44c59a4b5e46"); + uuid_handle!("d18ad97e-a322-4981-9505-44c59a4b5e46"); // TODO: replace Texture names with Image names? /// Adds the [`Image`] as an asset and makes sure that they are extracted and prepared for the GPU. diff --git a/crates/bevy_text/src/font_atlas_set.rs b/crates/bevy_text/src/font_atlas_set.rs index 8d32127c38..8f0dd91168 100644 --- a/crates/bevy_text/src/font_atlas_set.rs +++ b/crates/bevy_text/src/font_atlas_set.rs @@ -172,8 +172,8 @@ impl FontAtlasSet { .get_glyph_index(cache_key) .map(|location| GlyphAtlasInfo { location, - texture_atlas: atlas.texture_atlas.clone_weak(), - texture: atlas.texture.clone_weak(), + texture_atlas: atlas.texture_atlas.id(), + texture: atlas.texture.id(), }) }) }) diff --git a/crates/bevy_text/src/glyph.rs b/crates/bevy_text/src/glyph.rs index ebae713af4..5bc2111dbd 100644 --- a/crates/bevy_text/src/glyph.rs +++ b/crates/bevy_text/src/glyph.rs @@ -1,6 +1,6 @@ //! This module exports types related to rendering glyphs. -use bevy_asset::Handle; +use bevy_asset::AssetId; use bevy_image::prelude::*; use bevy_math::{IVec2, Vec2}; use bevy_reflect::Reflect; @@ -38,14 +38,15 @@ pub struct PositionedGlyph { #[derive(Debug, Clone, Reflect)] #[reflect(Clone)] pub struct GlyphAtlasInfo { - /// A handle to the [`Image`] data for the texture atlas this glyph was placed in. + /// An asset ID to the [`Image`] data for the texture atlas this glyph was placed in. /// - /// A (weak) clone of the handle held by the [`FontAtlas`](crate::FontAtlas). - pub texture: Handle, - /// A handle to the [`TextureAtlasLayout`] map for the texture atlas this glyph was placed in. + /// An asset ID of the handle held by the [`FontAtlas`](crate::FontAtlas). + pub texture: AssetId, + /// An asset ID to the [`TextureAtlasLayout`] map for the texture atlas this glyph was placed + /// in. /// - /// A (weak) clone of the handle held by the [`FontAtlas`](crate::FontAtlas). - pub texture_atlas: Handle, + /// An asset ID of the handle held by the [`FontAtlas`](crate::FontAtlas). + pub texture_atlas: AssetId, /// Location and offset of a glyph within the texture atlas. pub location: GlyphAtlasLocation, } diff --git a/crates/bevy_text/src/pipeline.rs b/crates/bevy_text/src/pipeline.rs index dd6ca77246..8c1136c063 100644 --- a/crates/bevy_text/src/pipeline.rs +++ b/crates/bevy_text/src/pipeline.rs @@ -340,7 +340,7 @@ impl TextPipeline { ) })?; - let texture_atlas = texture_atlases.get(&atlas_info.texture_atlas).unwrap(); + let texture_atlas = texture_atlases.get(atlas_info.texture_atlas).unwrap(); let location = atlas_info.location; let glyph_rect = texture_atlas.textures[location.glyph_index]; let left = location.offset.x as f32; diff --git a/crates/bevy_text/src/text2d.rs b/crates/bevy_text/src/text2d.rs index 8d4a926e1b..7fa3202d18 100644 --- a/crates/bevy_text/src/text2d.rs +++ b/crates/bevy_text/src/text2d.rs @@ -213,7 +213,7 @@ pub fn extract_text2d_sprite( current_span = *span_index; } let rect = texture_atlases - .get(&atlas_info.texture_atlas) + .get(atlas_info.texture_atlas) .unwrap() .textures[atlas_info.location.glyph_index] .as_rect(); @@ -232,7 +232,7 @@ pub fn extract_text2d_sprite( render_entity, transform, color, - image_handle_id: atlas_info.texture.id(), + image_handle_id: atlas_info.texture, flip_x: false, flip_y: false, kind: bevy_sprite::ExtractedSpriteKind::Slices { diff --git a/crates/bevy_ui/src/render/mod.rs b/crates/bevy_ui/src/render/mod.rs index dfff318f46..58de0c766a 100644 --- a/crates/bevy_ui/src/render/mod.rs +++ b/crates/bevy_ui/src/render/mod.rs @@ -865,7 +865,7 @@ pub fn extract_text_sections( ) in text_layout_info.glyphs.iter().enumerate() { let rect = texture_atlases - .get(&atlas_info.texture_atlas) + .get(atlas_info.texture_atlas) .unwrap() .textures[atlas_info.location.glyph_index] .as_rect(); @@ -891,7 +891,7 @@ pub fn extract_text_sections( z_order: uinode.stack_index as f32 + stack_z_offsets::TEXT, render_entity: commands.spawn(TemporaryRenderEntity).id(), color, - image: atlas_info.texture.id(), + image: atlas_info.texture, clip: clip.map(|clip| clip.clip), extracted_camera_entity, rect, @@ -956,7 +956,7 @@ pub fn extract_text_shadows( ) in text_layout_info.glyphs.iter().enumerate() { let rect = texture_atlases - .get(&atlas_info.texture_atlas) + .get(atlas_info.texture_atlas) .unwrap() .textures[atlas_info.location.glyph_index] .as_rect(); @@ -972,7 +972,7 @@ pub fn extract_text_shadows( z_order: uinode.stack_index as f32 + stack_z_offsets::TEXT, render_entity: commands.spawn(TemporaryRenderEntity).id(), color: shadow.color.into(), - image: atlas_info.texture.id(), + image: atlas_info.texture, clip: clip.map(|clip| clip.clip), extracted_camera_entity, rect, diff --git a/examples/2d/mesh2d_manual.rs b/examples/2d/mesh2d_manual.rs index 6354aa468c..80faa1a16c 100644 --- a/examples/2d/mesh2d_manual.rs +++ b/examples/2d/mesh2d_manual.rs @@ -6,7 +6,7 @@ //! [`Material2d`]: bevy::sprite::Material2d use bevy::{ - asset::weak_handle, + asset::uuid_handle, color::palettes::basic::YELLOW, core_pipeline::core_2d::{Transparent2d, CORE_2D_DEPTH_FORMAT}, math::{ops, FloatOrd}, @@ -287,7 +287,7 @@ pub struct ColoredMesh2dPlugin; /// Handle to the custom shader with a unique random ID pub const COLORED_MESH2D_SHADER_HANDLE: Handle = - weak_handle!("f48b148f-7373-4638-9900-392b3b3ccc66"); + uuid_handle!("f48b148f-7373-4638-9900-392b3b3ccc66"); /// Our custom pipeline needs its own instance storage #[derive(Resource, Deref, DerefMut, Default)] diff --git a/examples/shader/compute_shader_game_of_life.rs b/examples/shader/compute_shader_game_of_life.rs index cb7d283d1e..a4e255c67d 100644 --- a/examples/shader/compute_shader_game_of_life.rs +++ b/examples/shader/compute_shader_game_of_life.rs @@ -86,9 +86,9 @@ fn setup(mut commands: Commands, mut images: ResMut>) { // Switch texture to display every frame to show the one that was written to most recently. fn switch_textures(images: Res, mut sprite: Single<&mut Sprite>) { if sprite.image == images.texture_a { - sprite.image = images.texture_b.clone_weak(); + sprite.image = images.texture_b.clone(); } else { - sprite.image = images.texture_a.clone_weak(); + sprite.image = images.texture_a.clone(); } } diff --git a/examples/tools/scene_viewer/scene_viewer_plugin.rs b/examples/tools/scene_viewer/scene_viewer_plugin.rs index 49f4805d06..d3c5d2d74d 100644 --- a/examples/tools/scene_viewer/scene_viewer_plugin.rs +++ b/examples/tools/scene_viewer/scene_viewer_plugin.rs @@ -125,8 +125,7 @@ fn scene_load_check( maybe_directional_light.is_some() || maybe_point_light.is_some() }); - scene_handle.instance_id = - Some(scene_spawner.spawn(gltf_scene_handle.clone_weak())); + scene_handle.instance_id = Some(scene_spawner.spawn(gltf_scene_handle.clone())); info!("Spawning scene..."); } diff --git a/release-content/migration-guides/handle_weak_replaced_with_handle_uuid.md b/release-content/migration-guides/handle_weak_replaced_with_handle_uuid.md new file mode 100644 index 0000000000..d6bd6b9890 --- /dev/null +++ b/release-content/migration-guides/handle_weak_replaced_with_handle_uuid.md @@ -0,0 +1,40 @@ +--- +title: `Handle::Weak` has been replaced by `Handle::Uuid`. +pull_requests: [19896] +--- + +`Handle::Weak` had some weird behavior. It allowed for a sprite to be given a handle that is dropped +**while the sprite is still using it**. This also resulted in more complexity in the asset system. +The primary remaining use for `Handle::Weak` is to store asset UUIDs initialized through the +`weak_handle!` macro. To address this, `Handle::Weak` has been replaced by `Handle::Uuid`! + +Users using the `weak_handle!` macro should switch to the `uuid_handle!` macro. + +```rust +// Before +const IMAGE: Handle = weak_handle!("b20988e9-b1b9-4176-b5f3-a6fa73aa617f"); + +// After +const IMAGE: Handle = uuid_handle!("b20988e9-b1b9-4176-b5f3-a6fa73aa617f"); +``` + +Users using `Handle::clone_weak` can (most likely) just call `Handle::clone` instead. + +```rust +// Somewhere in some startup system. +let my_sprite_image = asset_server.load("monster.png"); + +// In game code... +// This sprite could be unloaded even if the sprite is still using it! +commands.spawn(Sprite::from_image(my_sprite_image.clone_weak())); + +// Just do this instead! +commands.spawn(Sprite::from_image(my_sprite_image.clone())); +``` + +Users using the `Handle::Weak` variant directly should consider replacing it with `AssetId` instead, +accessible through `Handle::id`. These situations are very case-by-case migrations. + +P.S., for users of the `weak_handle!` macro: If you are using it for shaders, consider switching to +`load_shader_library`/`load_embedded_asset` instead (especially replacing `load_internal_asset`). +This enables hot reloading for your shaders - which Bevy internally has done this cycle! From 9e0c66bd652b3621374805333e382ef375abf12a Mon Sep 17 00:00:00 2001 From: SpecificProtagonist Date: Wed, 2 Jul 2025 16:44:18 +0200 Subject: [PATCH 58/68] Ecs derive docs (#19892) # Objective Concise syntax docs on `Component`/`Event` derives. Partial fix for #19537. ## Solution Only document syntax. The doc tests are set to ignore because the macro relies on the presence of `bevy_ecs`. --- crates/bevy_ecs/macros/src/component.rs | 7 +- crates/bevy_ecs/macros/src/lib.rs | 96 ++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 3 deletions(-) diff --git a/crates/bevy_ecs/macros/src/component.rs b/crates/bevy_ecs/macros/src/component.rs index 8a78355a60..1322022581 100644 --- a/crates/bevy_ecs/macros/src/component.rs +++ b/crates/bevy_ecs/macros/src/component.rs @@ -115,6 +115,7 @@ pub fn derive_resource(input: TokenStream) -> TokenStream { }) } +/// Component derive syntax is documented on both the macro and the trait. pub fn derive_component(input: TokenStream) -> TokenStream { let mut ast = parse_macro_input!(input as DeriveInput); let bevy_ecs_path: Path = crate::bevy_ecs_path(); @@ -453,7 +454,11 @@ pub const MAP_ENTITIES: &str = "map_entities"; pub const IMMUTABLE: &str = "immutable"; pub const CLONE_BEHAVIOR: &str = "clone_behavior"; -/// All allowed attribute value expression kinds for component hooks +/// All allowed attribute value expression kinds for component hooks. +/// This doesn't simply use general expressions because of conflicting needs: +/// - we want to be able to use `Self` & generic parameters in paths +/// - call expressions producing a closure need to be wrapped in a function +/// to turn them into function pointers, which prevents access to the outer generic params #[derive(Debug)] enum HookAttributeKind { /// expressions like function or struct names diff --git a/crates/bevy_ecs/macros/src/lib.rs b/crates/bevy_ecs/macros/src/lib.rs index 9bc3e5913e..20f7ad4275 100644 --- a/crates/bevy_ecs/macros/src/lib.rs +++ b/crates/bevy_ecs/macros/src/lib.rs @@ -560,7 +560,17 @@ pub fn derive_event(input: TokenStream) -> TokenStream { component::derive_event(input) } -/// Implement the `EntityEvent` trait. +/// Cheat sheet for derive syntax, +/// see full explanation on `EntityEvent` trait docs. +/// +/// ```ignore +/// #[derive(Event, EntityEvent)] +/// /// Traversal component +/// #[entity_event(traversal = &'static ChildOf)] +/// /// Always propagate +/// #[entity_event(auto_propagate)] +/// struct MyEvent; +/// ``` #[proc_macro_derive(EntityEvent, attributes(entity_event))] pub fn derive_entity_event(input: TokenStream) -> TokenStream { component::derive_entity_event(input) @@ -578,7 +588,89 @@ pub fn derive_resource(input: TokenStream) -> TokenStream { component::derive_resource(input) } -/// Implement the `Component` trait. +/// Cheat sheet for derive syntax, +/// see full explanation and examples on the `Component` trait doc. +/// +/// ## Immutability +/// ```ignore +/// #[derive(Component)] +/// #[component(immutable)] +/// struct MyComponent; +/// ``` +/// +/// ## Sparse instead of table-based storage +/// ```ignore +/// #[derive(Component)] +/// #[component(storage = "SparseSet")] +/// struct MyComponent; +/// ``` +/// +/// ## Required Components +/// +/// ```ignore +/// #[derive(Component)] +/// #[require( +/// // `Default::default()` +/// A, +/// // tuple structs +/// B(1), +/// // named-field structs +/// C { +/// x: 1, +/// ..default() +/// }, +/// // unit structs/variants +/// D::One, +/// // associated consts +/// E::ONE, +/// // constructors +/// F::new(1), +/// // arbitrary expressions +/// G = make(1, 2, 3) +/// )] +/// struct MyComponent; +/// ``` +/// +/// ## Relationships +/// ```ignore +/// #[derive(Component)] +/// #[relationship(relationship_target = Children)] +/// pub struct ChildOf { +/// // Marking the field is not necessary if there is only one. +/// #[relationship] +/// pub parent: Entity, +/// internal: u8, +/// }; +/// +/// #[derive(Component)] +/// #[relationship_target(relationship = ChildOf)] +/// pub struct Children(Vec); +/// ``` +/// +/// On despawn, also despawn all related entities: +/// ```ignore +/// #[derive(Component)] +/// #[relationship_target(relationship_target = Children, linked_spawn)] +/// pub struct Children(Vec); +/// ``` +/// +/// ## Hooks +/// ```ignore +/// #[derive(Component)] +/// #[component(hook_name = function)] +/// struct MyComponent; +/// ``` +/// where `hook_name` is `on_add`, `on_insert`, `on_replace` or `on_remove`; +/// `function` can be either a path, e.g. `some_function::`, +/// or a function call that returns a function that can be turned into +/// a `ComponentHook`, e.g. `get_closure("Hi!")`. +/// +/// ## Ignore this component when cloning an entity +/// ```ignore +/// #[derive(Component)] +/// #[component(clone_behavior = Ignore)] +/// struct MyComponent; +/// ``` #[proc_macro_derive( Component, attributes(component, require, relationship, relationship_target, entities) From ee1807395e70bfcfe164ff84f2693ea71b083028 Mon Sep 17 00:00:00 2001 From: Alix Bott Date: Wed, 2 Jul 2025 16:50:55 +0200 Subject: [PATCH 59/68] Implement `MapEntities` for arrays, `HashMap`, `BTreeMap`, `IndexMap` (#19908) # Objective - `MapEntities` is not implemented for arrays, `HashMap`, `BTreeMap`, and `IndexMap`. ## Solution - Implement `MapEntities` for arrays, `HashMap`, `BTreeMap`, `IndexMap` ## Testing - I didn't add a test for this as the implementations seems pretty trivial --- crates/bevy_ecs/src/entity/map_entities.rs | 66 +++++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/crates/bevy_ecs/src/entity/map_entities.rs b/crates/bevy_ecs/src/entity/map_entities.rs index 647bde983a..2c59655275 100644 --- a/crates/bevy_ecs/src/entity/map_entities.rs +++ b/crates/bevy_ecs/src/entity/map_entities.rs @@ -1,5 +1,5 @@ pub use bevy_ecs_macros::MapEntities; -use indexmap::IndexSet; +use indexmap::{IndexMap, IndexSet}; use crate::{ entity::{hash_map::EntityHashMap, Entity}, @@ -7,11 +7,14 @@ use crate::{ }; use alloc::{ - collections::{BTreeSet, VecDeque}, + collections::{BTreeMap, BTreeSet, VecDeque}, vec::Vec, }; -use bevy_platform::collections::HashSet; -use core::{hash::BuildHasher, mem}; +use bevy_platform::collections::{HashMap, HashSet}; +use core::{ + hash::{BuildHasher, Hash}, + mem, +}; use smallvec::SmallVec; use super::EntityIndexSet; @@ -72,9 +75,22 @@ impl MapEntities for Option { } } -impl MapEntities - for HashSet +impl MapEntities + for HashMap { + fn map_entities(&mut self, entity_mapper: &mut E) { + *self = self + .drain() + .map(|(mut key_entities, mut value_entities)| { + key_entities.map_entities(entity_mapper); + value_entities.map_entities(entity_mapper); + (key_entities, value_entities) + }) + .collect(); + } +} + +impl MapEntities for HashSet { fn map_entities(&mut self, entity_mapper: &mut E) { *self = self .drain() @@ -86,9 +102,22 @@ impl MapEntiti } } -impl MapEntities - for IndexSet +impl MapEntities + for IndexMap { + fn map_entities(&mut self, entity_mapper: &mut E) { + *self = self + .drain(..) + .map(|(mut key_entities, mut value_entities)| { + key_entities.map_entities(entity_mapper); + value_entities.map_entities(entity_mapper); + (key_entities, value_entities) + }) + .collect(); + } +} + +impl MapEntities for IndexSet { fn map_entities(&mut self, entity_mapper: &mut E) { *self = self .drain(..) @@ -109,6 +138,19 @@ impl MapEntities for EntityIndexSet { } } +impl MapEntities for BTreeMap { + fn map_entities(&mut self, entity_mapper: &mut E) { + *self = mem::take(self) + .into_iter() + .map(|(mut key_entities, mut value_entities)| { + key_entities.map_entities(entity_mapper); + value_entities.map_entities(entity_mapper); + (key_entities, value_entities) + }) + .collect(); + } +} + impl MapEntities for BTreeSet { fn map_entities(&mut self, entity_mapper: &mut E) { *self = mem::take(self) @@ -121,6 +163,14 @@ impl MapEntities for BTreeSet { } } +impl MapEntities for [T; N] { + fn map_entities(&mut self, entity_mapper: &mut E) { + for entities in self.iter_mut() { + entities.map_entities(entity_mapper); + } + } +} + impl MapEntities for Vec { fn map_entities(&mut self, entity_mapper: &mut E) { for entities in self.iter_mut() { From 607f9f24d351d0c14ab73d3321776b447536d063 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Thu, 3 Jul 2025 00:53:52 +1000 Subject: [PATCH 60/68] Avoid unnecessary `ReflectMeta` arguments (#19919) # Objective `WhereClauseOption` contains a reference to a `ReflectMeta`. Oddly enough, a bunch of functions that take a `WhereClauseOption` argument also take a `ReflectMeta` reference argument, which is exactly the same as the reference in the `WhereClauseOption`. ## Solution This commit removes the redundant `ReflectMeta` argument from these functions. This requires adding a `WhereClauseOption::meta` getter method. ## Testing `cargo run -p ci` --- crates/bevy_reflect/derive/src/derive_data.rs | 3 --- crates/bevy_reflect/derive/src/impls/common.rs | 6 ++---- crates/bevy_reflect/derive/src/impls/enums.rs | 14 ++++---------- .../bevy_reflect/derive/src/impls/func/from_arg.rs | 8 +++----- .../derive/src/impls/func/function_impls.rs | 8 +++----- .../derive/src/impls/func/get_ownership.rs | 4 ++-- .../derive/src/impls/func/into_return.rs | 4 ++-- crates/bevy_reflect/derive/src/impls/opaque.rs | 5 ++--- crates/bevy_reflect/derive/src/impls/structs.rs | 11 +++-------- .../bevy_reflect/derive/src/impls/tuple_structs.rs | 11 +++-------- crates/bevy_reflect/derive/src/impls/typed.rs | 2 +- crates/bevy_reflect/derive/src/registration.rs | 7 ++----- .../derive/src/where_clause_options.rs | 4 ++++ 13 files changed, 31 insertions(+), 56 deletions(-) diff --git a/crates/bevy_reflect/derive/src/derive_data.rs b/crates/bevy_reflect/derive/src/derive_data.rs index 614f357b37..9af7acda76 100644 --- a/crates/bevy_reflect/derive/src/derive_data.rs +++ b/crates/bevy_reflect/derive/src/derive_data.rs @@ -482,7 +482,6 @@ impl<'a> ReflectMeta<'a> { where_clause_options: &WhereClauseOptions, ) -> proc_macro2::TokenStream { crate::registration::impl_get_type_registration( - self, where_clause_options, None, Option::>::None, @@ -599,7 +598,6 @@ impl<'a> ReflectStruct<'a> { where_clause_options: &WhereClauseOptions, ) -> proc_macro2::TokenStream { crate::registration::impl_get_type_registration( - self.meta(), where_clause_options, self.serialization_data(), Some(self.active_types().iter()), @@ -880,7 +878,6 @@ impl<'a> ReflectEnum<'a> { where_clause_options: &WhereClauseOptions, ) -> proc_macro2::TokenStream { crate::registration::impl_get_type_registration( - self.meta(), where_clause_options, None, Some(self.active_fields().map(StructField::reflected_type)), diff --git a/crates/bevy_reflect/derive/src/impls/common.rs b/crates/bevy_reflect/derive/src/impls/common.rs index e8fdadb03e..87836e383d 100644 --- a/crates/bevy_reflect/derive/src/impls/common.rs +++ b/crates/bevy_reflect/derive/src/impls/common.rs @@ -4,10 +4,8 @@ use quote::quote; use crate::{derive_data::ReflectMeta, where_clause_options::WhereClauseOptions}; -pub fn impl_full_reflect( - meta: &ReflectMeta, - where_clause_options: &WhereClauseOptions, -) -> proc_macro2::TokenStream { +pub fn impl_full_reflect(where_clause_options: &WhereClauseOptions) -> proc_macro2::TokenStream { + let meta = where_clause_options.meta(); let bevy_reflect_path = meta.bevy_reflect_path(); let type_path = meta.type_path(); diff --git a/crates/bevy_reflect/derive/src/impls/enums.rs b/crates/bevy_reflect/derive/src/impls/enums.rs index 3cbd8cce95..f2272c7c81 100644 --- a/crates/bevy_reflect/derive/src/impls/enums.rs +++ b/crates/bevy_reflect/derive/src/impls/enums.rs @@ -36,8 +36,6 @@ pub(crate) fn impl_enum(reflect_enum: &ReflectEnum) -> proc_macro2::TokenStream let ref_index = Ident::new("__index_param", Span::call_site()); let ref_value = Ident::new("__value_param", Span::call_site()); - let where_clause_options = reflect_enum.where_clause_options(); - let EnumImpls { enum_field, enum_field_mut, @@ -57,14 +55,11 @@ pub(crate) fn impl_enum(reflect_enum: &ReflectEnum) -> proc_macro2::TokenStream .. } = TryApplyVariantBuilder::new(reflect_enum).build(&ref_value); - let typed_impl = impl_typed( - reflect_enum.meta(), - &where_clause_options, - reflect_enum.to_info_tokens(), - ); + let where_clause_options = reflect_enum.where_clause_options(); + let typed_impl = impl_typed(&where_clause_options, reflect_enum.to_info_tokens()); let type_path_impl = impl_type_path(reflect_enum.meta()); - let full_reflect_impl = impl_full_reflect(reflect_enum.meta(), &where_clause_options); + let full_reflect_impl = impl_full_reflect(&where_clause_options); let common_methods = common_partial_reflect_methods( reflect_enum.meta(), || Some(quote!(#bevy_reflect_path::enum_partial_eq)), @@ -75,8 +70,7 @@ pub(crate) fn impl_enum(reflect_enum: &ReflectEnum) -> proc_macro2::TokenStream #[cfg(not(feature = "functions"))] let function_impls = None::; #[cfg(feature = "functions")] - let function_impls = - crate::impls::impl_function_traits(reflect_enum.meta(), &where_clause_options); + let function_impls = crate::impls::impl_function_traits(&where_clause_options); let get_type_registration_impl = reflect_enum.get_type_registration(&where_clause_options); diff --git a/crates/bevy_reflect/derive/src/impls/func/from_arg.rs b/crates/bevy_reflect/derive/src/impls/func/from_arg.rs index 77b984e04a..2220a704ea 100644 --- a/crates/bevy_reflect/derive/src/impls/func/from_arg.rs +++ b/crates/bevy_reflect/derive/src/impls/func/from_arg.rs @@ -1,11 +1,9 @@ -use crate::{derive_data::ReflectMeta, where_clause_options::WhereClauseOptions}; +use crate::where_clause_options::WhereClauseOptions; use bevy_macro_utils::fq_std::FQResult; use quote::quote; -pub(crate) fn impl_from_arg( - meta: &ReflectMeta, - where_clause_options: &WhereClauseOptions, -) -> proc_macro2::TokenStream { +pub(crate) fn impl_from_arg(where_clause_options: &WhereClauseOptions) -> proc_macro2::TokenStream { + let meta = where_clause_options.meta(); let bevy_reflect = meta.bevy_reflect_path(); let type_path = meta.type_path(); diff --git a/crates/bevy_reflect/derive/src/impls/func/function_impls.rs b/crates/bevy_reflect/derive/src/impls/func/function_impls.rs index 64ca7ca7b7..acbda3459b 100644 --- a/crates/bevy_reflect/derive/src/impls/func/function_impls.rs +++ b/crates/bevy_reflect/derive/src/impls/func/function_impls.rs @@ -1,5 +1,4 @@ use crate::{ - derive_data::ReflectMeta, impls::func::{ from_arg::impl_from_arg, get_ownership::impl_get_ownership, into_return::impl_into_return, }, @@ -8,12 +7,11 @@ use crate::{ use quote::quote; pub(crate) fn impl_function_traits( - meta: &ReflectMeta, where_clause_options: &WhereClauseOptions, ) -> proc_macro2::TokenStream { - let get_ownership = impl_get_ownership(meta, where_clause_options); - let from_arg = impl_from_arg(meta, where_clause_options); - let into_return = impl_into_return(meta, where_clause_options); + let get_ownership = impl_get_ownership(where_clause_options); + let from_arg = impl_from_arg(where_clause_options); + let into_return = impl_into_return(where_clause_options); quote! { #get_ownership diff --git a/crates/bevy_reflect/derive/src/impls/func/get_ownership.rs b/crates/bevy_reflect/derive/src/impls/func/get_ownership.rs index 01d33eb7bb..abdfb803ed 100644 --- a/crates/bevy_reflect/derive/src/impls/func/get_ownership.rs +++ b/crates/bevy_reflect/derive/src/impls/func/get_ownership.rs @@ -1,10 +1,10 @@ -use crate::{derive_data::ReflectMeta, where_clause_options::WhereClauseOptions}; +use crate::where_clause_options::WhereClauseOptions; use quote::quote; pub(crate) fn impl_get_ownership( - meta: &ReflectMeta, where_clause_options: &WhereClauseOptions, ) -> proc_macro2::TokenStream { + let meta = where_clause_options.meta(); let bevy_reflect = meta.bevy_reflect_path(); let type_path = meta.type_path(); diff --git a/crates/bevy_reflect/derive/src/impls/func/into_return.rs b/crates/bevy_reflect/derive/src/impls/func/into_return.rs index f7d1e0b889..221028a99e 100644 --- a/crates/bevy_reflect/derive/src/impls/func/into_return.rs +++ b/crates/bevy_reflect/derive/src/impls/func/into_return.rs @@ -1,10 +1,10 @@ -use crate::{derive_data::ReflectMeta, where_clause_options::WhereClauseOptions}; +use crate::where_clause_options::WhereClauseOptions; use quote::quote; pub(crate) fn impl_into_return( - meta: &ReflectMeta, where_clause_options: &WhereClauseOptions, ) -> proc_macro2::TokenStream { + let meta = where_clause_options.meta(); let bevy_reflect = meta.bevy_reflect_path(); let type_path = meta.type_path(); diff --git a/crates/bevy_reflect/derive/src/impls/opaque.rs b/crates/bevy_reflect/derive/src/impls/opaque.rs index 2a08cadc28..a39b0b4849 100644 --- a/crates/bevy_reflect/derive/src/impls/opaque.rs +++ b/crates/bevy_reflect/derive/src/impls/opaque.rs @@ -21,7 +21,6 @@ pub(crate) fn impl_opaque(meta: &ReflectMeta) -> proc_macro2::TokenStream { let where_clause_options = WhereClauseOptions::new(meta); let typed_impl = impl_typed( - meta, &where_clause_options, quote! { let info = #bevy_reflect_path::OpaqueInfo::new::() #with_docs; @@ -30,7 +29,7 @@ pub(crate) fn impl_opaque(meta: &ReflectMeta) -> proc_macro2::TokenStream { ); let type_path_impl = impl_type_path(meta); - let full_reflect_impl = impl_full_reflect(meta, &where_clause_options); + let full_reflect_impl = impl_full_reflect(&where_clause_options); let common_methods = common_partial_reflect_methods(meta, || None, || None); let clone_fn = meta.attrs().get_clone_impl(bevy_reflect_path); @@ -54,7 +53,7 @@ pub(crate) fn impl_opaque(meta: &ReflectMeta) -> proc_macro2::TokenStream { #[cfg(not(feature = "functions"))] let function_impls = None::; #[cfg(feature = "functions")] - let function_impls = crate::impls::impl_function_traits(meta, &where_clause_options); + let function_impls = crate::impls::impl_function_traits(&where_clause_options); let (impl_generics, ty_generics, where_clause) = type_path.generics().split_for_impl(); let where_reflect_clause = where_clause_options.extend_where_clause(where_clause); diff --git a/crates/bevy_reflect/derive/src/impls/structs.rs b/crates/bevy_reflect/derive/src/impls/structs.rs index 7e10de3f2b..b78ce40a08 100644 --- a/crates/bevy_reflect/derive/src/impls/structs.rs +++ b/crates/bevy_reflect/derive/src/impls/structs.rs @@ -34,14 +34,10 @@ pub(crate) fn impl_struct(reflect_struct: &ReflectStruct) -> proc_macro2::TokenS } = FieldAccessors::new(reflect_struct); let where_clause_options = reflect_struct.where_clause_options(); - let typed_impl = impl_typed( - reflect_struct.meta(), - &where_clause_options, - reflect_struct.to_info_tokens(false), - ); + let typed_impl = impl_typed(&where_clause_options, reflect_struct.to_info_tokens(false)); let type_path_impl = impl_type_path(reflect_struct.meta()); - let full_reflect_impl = impl_full_reflect(reflect_struct.meta(), &where_clause_options); + let full_reflect_impl = impl_full_reflect(&where_clause_options); let common_methods = common_partial_reflect_methods( reflect_struct.meta(), || Some(quote!(#bevy_reflect_path::struct_partial_eq)), @@ -52,8 +48,7 @@ pub(crate) fn impl_struct(reflect_struct: &ReflectStruct) -> proc_macro2::TokenS #[cfg(not(feature = "functions"))] let function_impls = None::; #[cfg(feature = "functions")] - let function_impls = - crate::impls::impl_function_traits(reflect_struct.meta(), &where_clause_options); + let function_impls = crate::impls::impl_function_traits(&where_clause_options); let get_type_registration_impl = reflect_struct.get_type_registration(&where_clause_options); diff --git a/crates/bevy_reflect/derive/src/impls/tuple_structs.rs b/crates/bevy_reflect/derive/src/impls/tuple_structs.rs index 90c3555230..01b6a46b7b 100644 --- a/crates/bevy_reflect/derive/src/impls/tuple_structs.rs +++ b/crates/bevy_reflect/derive/src/impls/tuple_structs.rs @@ -24,14 +24,10 @@ pub(crate) fn impl_tuple_struct(reflect_struct: &ReflectStruct) -> proc_macro2:: let where_clause_options = reflect_struct.where_clause_options(); let get_type_registration_impl = reflect_struct.get_type_registration(&where_clause_options); - let typed_impl = impl_typed( - reflect_struct.meta(), - &where_clause_options, - reflect_struct.to_info_tokens(true), - ); + let typed_impl = impl_typed(&where_clause_options, reflect_struct.to_info_tokens(true)); let type_path_impl = impl_type_path(reflect_struct.meta()); - let full_reflect_impl = impl_full_reflect(reflect_struct.meta(), &where_clause_options); + let full_reflect_impl = impl_full_reflect(&where_clause_options); let common_methods = common_partial_reflect_methods( reflect_struct.meta(), || Some(quote!(#bevy_reflect_path::tuple_struct_partial_eq)), @@ -42,8 +38,7 @@ pub(crate) fn impl_tuple_struct(reflect_struct: &ReflectStruct) -> proc_macro2:: #[cfg(not(feature = "functions"))] let function_impls = None::; #[cfg(feature = "functions")] - let function_impls = - crate::impls::impl_function_traits(reflect_struct.meta(), &where_clause_options); + let function_impls = crate::impls::impl_function_traits(&where_clause_options); let (impl_generics, ty_generics, where_clause) = reflect_struct .meta() diff --git a/crates/bevy_reflect/derive/src/impls/typed.rs b/crates/bevy_reflect/derive/src/impls/typed.rs index da8254d149..d4b0644976 100644 --- a/crates/bevy_reflect/derive/src/impls/typed.rs +++ b/crates/bevy_reflect/derive/src/impls/typed.rs @@ -138,10 +138,10 @@ pub(crate) fn impl_type_path(meta: &ReflectMeta) -> TokenStream { } pub(crate) fn impl_typed( - meta: &ReflectMeta, where_clause_options: &WhereClauseOptions, type_info_generator: TokenStream, ) -> TokenStream { + let meta = where_clause_options.meta(); let type_path = meta.type_path(); let bevy_reflect_path = meta.bevy_reflect_path(); diff --git a/crates/bevy_reflect/derive/src/registration.rs b/crates/bevy_reflect/derive/src/registration.rs index f60791215c..ff8257cc1c 100644 --- a/crates/bevy_reflect/derive/src/registration.rs +++ b/crates/bevy_reflect/derive/src/registration.rs @@ -1,19 +1,16 @@ //! Contains code related specifically to Bevy's type registration. -use crate::{ - derive_data::ReflectMeta, serialization::SerializationDataDef, - where_clause_options::WhereClauseOptions, -}; +use crate::{serialization::SerializationDataDef, where_clause_options::WhereClauseOptions}; use quote::quote; use syn::Type; /// Creates the `GetTypeRegistration` impl for the given type data. pub(crate) fn impl_get_type_registration<'a>( - meta: &ReflectMeta, where_clause_options: &WhereClauseOptions, serialization_data: Option<&SerializationDataDef>, type_dependencies: Option>, ) -> proc_macro2::TokenStream { + let meta = where_clause_options.meta(); let type_path = meta.type_path(); let bevy_reflect_path = meta.bevy_reflect_path(); let registration_data = meta.attrs().idents(); diff --git a/crates/bevy_reflect/derive/src/where_clause_options.rs b/crates/bevy_reflect/derive/src/where_clause_options.rs index 1551e008d0..e63dbe599a 100644 --- a/crates/bevy_reflect/derive/src/where_clause_options.rs +++ b/crates/bevy_reflect/derive/src/where_clause_options.rs @@ -25,6 +25,10 @@ impl<'a, 'b> WhereClauseOptions<'a, 'b> { } } + pub fn meta(&self) -> &'a ReflectMeta<'b> { + self.meta + } + /// Extends the `where` clause for a type with additional bounds needed for the reflection impls. /// /// The default bounds added are as follows: From e42d386625a235718d884cf7e9df1395736f1c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Wed, 2 Jul 2025 16:54:10 +0200 Subject: [PATCH 61/68] set required-features for example light_textures & clustered_decals (#19913) # Objective - Example `light_textures` exit if feature `pbr_light_textures` is not enabled. this is checked in code instead of using `required-features` - Same for `clustered_decals` and `par_clustered_decals` - Those examples are also using `eprintln` - Those examples are using `process:exit` to exit ## Solution - Use `required-features` - Use logs - Use `AppExit` --- Cargo.toml | 2 ++ examples/3d/clustered_decals.rs | 11 ++--------- examples/3d/light_textures.rs | 11 ++--------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6bc73fbd2c..46b8238596 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4426,6 +4426,7 @@ wasm = true name = "clustered_decals" path = "examples/3d/clustered_decals.rs" doc-scrape-examples = true +required-features = ["pbr_clustered_decals"] [package.metadata.example.clustered_decals] name = "Clustered Decals" @@ -4437,6 +4438,7 @@ wasm = false name = "light_textures" path = "examples/3d/light_textures.rs" doc-scrape-examples = true +required-features = ["pbr_light_textures"] [package.metadata.example.light_textures] name = "Light Textures" diff --git a/examples/3d/clustered_decals.rs b/examples/3d/clustered_decals.rs index f8592d28c0..60a445b483 100644 --- a/examples/3d/clustered_decals.rs +++ b/examples/3d/clustered_decals.rs @@ -2,7 +2,6 @@ use std::f32::consts::{FRAC_PI_3, PI}; use std::fmt::{self, Formatter}; -use std::process; use bevy::{ color::palettes::css::{LIME, ORANGE_RED, SILVER}, @@ -163,16 +162,10 @@ fn setup( mut meshes: ResMut>, mut materials: ResMut>>, ) { - // Error out if the clustered decals feature isn't enabled - if !cfg!(feature = "pbr_clustered_decals") { - eprintln!("Bevy was compiled without clustered decal support. Run with `--features=pbr_clustered_decals` to enable."); - process::exit(1); - } - // Error out if clustered decals aren't supported on the current platform. if !decal::clustered::clustered_decals_are_usable(&render_device, &render_adapter) { - eprintln!("Clustered decals aren't usable on this platform."); - process::exit(1); + error!("Clustered decals aren't usable on this platform."); + commands.send_event(AppExit::error()); } spawn_cube(&mut commands, &mut meshes, &mut materials); diff --git a/examples/3d/light_textures.rs b/examples/3d/light_textures.rs index be221101b6..94ddd159f2 100644 --- a/examples/3d/light_textures.rs +++ b/examples/3d/light_textures.rs @@ -2,7 +2,6 @@ use std::f32::consts::{FRAC_PI_2, FRAC_PI_3, FRAC_PI_4, PI}; use std::fmt::{self, Formatter}; -use std::process; use bevy::{ color::palettes::css::{SILVER, YELLOW}, @@ -155,16 +154,10 @@ fn setup( mut meshes: ResMut>, mut materials: ResMut>, ) { - // Error out if the light textures feature isn't enabled - if !cfg!(feature = "pbr_light_textures") { - eprintln!("Bevy was compiled without light texture support. Run with `--features=pbr_light_textures` to enable."); - process::exit(1); - } - // Error out if clustered decals (and so light textures) aren't supported on the current platform. if !decal::clustered::clustered_decals_are_usable(&render_device, &render_adapter) { - eprintln!("Light textures aren't usable on this platform."); - process::exit(1); + error!("Light textures aren't usable on this platform."); + commands.send_event(AppExit::error()); } spawn_cubes(&mut commands, &mut meshes, &mut materials); From c8cdb1197e36f52189538e1f5eaa71e0a8267de1 Mon Sep 17 00:00:00 2001 From: jf908 Date: Wed, 2 Jul 2025 15:55:25 +0100 Subject: [PATCH 62/68] Add instructions for GPU debugging in Xcode (#19915) # Objective - Using Xcode can be confusing to setup for rust projects. # Solution - Add instructions to docs/profiling.md for how to use start debugging a bevy project with Xcode's GPU debugging/profiling tools. --- docs/profiling.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/profiling.md b/docs/profiling.md index ef6a46a608..fe55b048af 100644 --- a/docs/profiling.md +++ b/docs/profiling.md @@ -10,6 +10,7 @@ - [Perf flame graph](#perf-flame-graph) - [GPU runtime](#gpu-runtime) - [Vendor tools](#vendor-tools) + - [Xcode's Metal debugger](#xcodes-metal-debugger) - [Tracy RenderQueue](#tracy-renderqueue) - [Compile time](#compile-time) @@ -147,6 +148,33 @@ For profiling GPU work, you should use the tool corresponding to your GPU's vend Note that while RenderDoc is a great debugging tool, it is _not_ a profiler, and should not be used for this purpose. +#### Xcode's Metal debugger + +Follow the steps below to start GPU debugging on macOS. There is no need to create an Xcode project. + +1. In the menu bar click on Debug > Debug Executable… + + ![Xcode's menu bar open to Debug > Debug Executable...](https://github.com/user-attachments/assets/efdc5037-0957-4227-b29d-9a789ba17a0a) + +2. Select your executable from your project’s target folder. +3. The Scheme Editor will open. If your assets are not located next to your executable, you can go to the Arguments tab and set `BEVY_ASSET_ROOT` to the absolute path for your project (the parent of your assets folder). The rest of the defaults should be fine. + + ![Xcode's Schema Editor opened to an environment variable configuration](https://github.com/user-attachments/assets/29cafb05-0c49-4777-8d41-8643812e8f6a) + +4. Click the play button in the top left and this should start your bevy app. + + ![A cursor hovering over the play button in XCode](https://github.com/user-attachments/assets/859580e2-779b-4db8-8ea6-73cf4ef696c9) + +5. Go back to Xcode and click on the Metal icon in the bottom drawer and then Capture in the following the popup menu. + + ![A cursor hovering over the Capture button in the Metal debugging popup menu](https://github.com/user-attachments/assets/c0ce1591-0a53-499b-bd1b-4d89538ea248) + +6. Start debugging and profiling! + +![Xcode open to the Performance tab in the Debug Navigator.](https://github.com/user-attachments/assets/52732391-9306-44a9-ae01-dcf4573f77ab) + +These instructions were created for Xcode 16.4. + ### Tracy RenderQueue While it doesn't provide as much detail as vendor-specific tooling, Tracy can also be used to coarsely measure GPU performance. From f95f42b44a481a30cde63ef6dcfe690f08ab9399 Mon Sep 17 00:00:00 2001 From: andriyDev Date: Wed, 2 Jul 2025 07:56:18 -0700 Subject: [PATCH 63/68] Allow calling `add_render_graph_node` on `World`. (#19912) # Objective - This unblocks some work I am doing for #19887. ## Solution - Rename `RenderGraphApp` to `RenderGraphExt`. - Implement `RenderGraphExt` for `World`. - Change `SubApp` and `App` to call the `World` impl. --- .../src/contrast_adaptive_sharpening/mod.rs | 2 +- crates/bevy_anti_aliasing/src/fxaa/mod.rs | 2 +- crates/bevy_anti_aliasing/src/smaa/mod.rs | 2 +- crates/bevy_anti_aliasing/src/taa/mod.rs | 2 +- .../src/auto_exposure/mod.rs | 2 +- crates/bevy_core_pipeline/src/bloom/mod.rs | 2 +- crates/bevy_core_pipeline/src/core_2d/mod.rs | 2 +- crates/bevy_core_pipeline/src/core_3d/mod.rs | 2 +- crates/bevy_core_pipeline/src/dof/mod.rs | 2 +- .../src/experimental/mip_generation/mod.rs | 2 +- .../bevy_core_pipeline/src/motion_blur/mod.rs | 2 +- .../bevy_core_pipeline/src/msaa_writeback.rs | 2 +- crates/bevy_core_pipeline/src/oit/mod.rs | 2 +- .../src/post_process/mod.rs | 2 +- crates/bevy_pbr/src/atmosphere/mod.rs | 2 +- crates/bevy_pbr/src/deferred/mod.rs | 2 +- crates/bevy_pbr/src/meshlet/mod.rs | 2 +- crates/bevy_pbr/src/render/gpu_preprocess.rs | 2 +- crates/bevy_pbr/src/ssao/mod.rs | 2 +- crates/bevy_pbr/src/ssr/mod.rs | 2 +- crates/bevy_pbr/src/volumetric_fog/mod.rs | 2 +- crates/bevy_pbr/src/wireframe.rs | 2 +- crates/bevy_render/src/render_graph/app.rs | 61 +++++++++++++++---- crates/bevy_solari/src/pathtracer/mod.rs | 2 +- crates/bevy_solari/src/realtime/mod.rs | 2 +- crates/bevy_sprite/src/mesh2d/wireframe2d.rs | 2 +- examples/3d/occlusion_culling.rs | 2 +- examples/shader/custom_post_processing.rs | 2 +- examples/shader/custom_render_phase.rs | 2 +- .../render_graph_app_to_ext.md | 7 +++ 30 files changed, 83 insertions(+), 41 deletions(-) create mode 100644 release-content/migration-guides/render_graph_app_to_ext.md diff --git a/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs b/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs index d1de3f4cea..8ff94fba65 100644 --- a/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs +++ b/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs @@ -11,7 +11,7 @@ use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ extract_component::{ExtractComponent, ExtractComponentPlugin, UniformComponentPlugin}, prelude::Camera, - render_graph::RenderGraphApp, + render_graph::RenderGraphExt, render_resource::{ binding_types::{sampler, texture_2d, uniform_buffer}, *, diff --git a/crates/bevy_anti_aliasing/src/fxaa/mod.rs b/crates/bevy_anti_aliasing/src/fxaa/mod.rs index adc2a3d5a2..065f6ebec1 100644 --- a/crates/bevy_anti_aliasing/src/fxaa/mod.rs +++ b/crates/bevy_anti_aliasing/src/fxaa/mod.rs @@ -11,7 +11,7 @@ use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ extract_component::{ExtractComponent, ExtractComponentPlugin}, prelude::Camera, - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, render_resource::{ binding_types::{sampler, texture_2d}, *, diff --git a/crates/bevy_anti_aliasing/src/smaa/mod.rs b/crates/bevy_anti_aliasing/src/smaa/mod.rs index bc6feca267..ea191cd28b 100644 --- a/crates/bevy_anti_aliasing/src/smaa/mod.rs +++ b/crates/bevy_anti_aliasing/src/smaa/mod.rs @@ -58,7 +58,7 @@ use bevy_render::{ extract_component::{ExtractComponent, ExtractComponentPlugin}, render_asset::RenderAssets, render_graph::{ - NodeRunError, RenderGraphApp as _, RenderGraphContext, ViewNode, ViewNodeRunner, + NodeRunError, RenderGraphContext, RenderGraphExt as _, ViewNode, ViewNodeRunner, }, render_resource::{ binding_types::{sampler, texture_2d, uniform_buffer}, diff --git a/crates/bevy_anti_aliasing/src/taa/mod.rs b/crates/bevy_anti_aliasing/src/taa/mod.rs index 442a268e2a..ee1af46d39 100644 --- a/crates/bevy_anti_aliasing/src/taa/mod.rs +++ b/crates/bevy_anti_aliasing/src/taa/mod.rs @@ -21,7 +21,7 @@ use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ camera::{ExtractedCamera, MipBias, TemporalJitter}, prelude::{Camera, Projection}, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_resource::{ binding_types::{sampler, texture_2d, texture_depth_2d}, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, CachedRenderPipelineId, diff --git a/crates/bevy_core_pipeline/src/auto_exposure/mod.rs b/crates/bevy_core_pipeline/src/auto_exposure/mod.rs index 172de3c393..7a33df99d8 100644 --- a/crates/bevy_core_pipeline/src/auto_exposure/mod.rs +++ b/crates/bevy_core_pipeline/src/auto_exposure/mod.rs @@ -4,7 +4,7 @@ use bevy_ecs::prelude::*; use bevy_render::{ extract_component::ExtractComponentPlugin, render_asset::RenderAssetPlugin, - render_graph::RenderGraphApp, + render_graph::RenderGraphExt, render_resource::{ Buffer, BufferDescriptor, BufferUsages, PipelineCache, SpecializedComputePipelines, }, diff --git a/crates/bevy_core_pipeline/src/bloom/mod.rs b/crates/bevy_core_pipeline/src/bloom/mod.rs index 901275e01c..d57af1cd01 100644 --- a/crates/bevy_core_pipeline/src/bloom/mod.rs +++ b/crates/bevy_core_pipeline/src/bloom/mod.rs @@ -20,7 +20,7 @@ use bevy_render::{ extract_component::{ ComponentUniforms, DynamicUniformIndex, ExtractComponentPlugin, UniformComponentPlugin, }, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_resource::*, renderer::{RenderContext, RenderDevice}, texture::{CachedTexture, TextureCache}, diff --git a/crates/bevy_core_pipeline/src/core_2d/mod.rs b/crates/bevy_core_pipeline/src/core_2d/mod.rs index 94232fbb05..f50d3e5984 100644 --- a/crates/bevy_core_pipeline/src/core_2d/mod.rs +++ b/crates/bevy_core_pipeline/src/core_2d/mod.rs @@ -52,7 +52,7 @@ use bevy_math::FloatOrd; use bevy_render::{ camera::{Camera, ExtractedCamera}, extract_component::ExtractComponentPlugin, - render_graph::{EmptyNode, RenderGraphApp, ViewNodeRunner}, + render_graph::{EmptyNode, RenderGraphExt, ViewNodeRunner}, render_phase::{ sort_phase_system, BinnedPhaseItem, CachedRenderPipelinePhaseItem, DrawFunctionId, DrawFunctions, PhaseItem, PhaseItemExtraIndex, SortedPhaseItem, ViewBinnedRenderPhases, diff --git a/crates/bevy_core_pipeline/src/core_3d/mod.rs b/crates/bevy_core_pipeline/src/core_3d/mod.rs index 2fc7e80a5e..3a127631cc 100644 --- a/crates/bevy_core_pipeline/src/core_3d/mod.rs +++ b/crates/bevy_core_pipeline/src/core_3d/mod.rs @@ -92,7 +92,7 @@ use bevy_render::{ camera::{Camera, ExtractedCamera}, extract_component::ExtractComponentPlugin, prelude::Msaa, - render_graph::{EmptyNode, RenderGraphApp, ViewNodeRunner}, + render_graph::{EmptyNode, RenderGraphExt, ViewNodeRunner}, render_phase::{ sort_phase_system, BinnedPhaseItem, CachedRenderPipelinePhaseItem, DrawFunctionId, DrawFunctions, PhaseItem, PhaseItemExtraIndex, SortedPhaseItem, ViewBinnedRenderPhases, diff --git a/crates/bevy_core_pipeline/src/dof/mod.rs b/crates/bevy_core_pipeline/src/dof/mod.rs index 7e2f52e3fc..b47ba61eb0 100644 --- a/crates/bevy_core_pipeline/src/dof/mod.rs +++ b/crates/bevy_core_pipeline/src/dof/mod.rs @@ -34,7 +34,7 @@ use bevy_render::{ camera::{PhysicalCameraParameters, Projection}, extract_component::{ComponentUniforms, DynamicUniformIndex, UniformComponentPlugin}, render_graph::{ - NodeRunError, RenderGraphApp as _, RenderGraphContext, ViewNode, ViewNodeRunner, + NodeRunError, RenderGraphContext, RenderGraphExt as _, ViewNode, ViewNodeRunner, }, render_resource::{ binding_types::{ diff --git a/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs b/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs index 8bd7d92393..e420438d9a 100644 --- a/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs +++ b/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs @@ -30,7 +30,7 @@ use bevy_render::{ experimental::occlusion_culling::{ OcclusionCulling, OcclusionCullingSubview, OcclusionCullingSubviewEntities, }, - render_graph::{Node, NodeRunError, RenderGraphApp, RenderGraphContext}, + render_graph::{Node, NodeRunError, RenderGraphContext, RenderGraphExt}, render_resource::{ binding_types::{sampler, texture_2d, texture_2d_multisampled, texture_storage_2d}, BindGroup, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, diff --git a/crates/bevy_core_pipeline/src/motion_blur/mod.rs b/crates/bevy_core_pipeline/src/motion_blur/mod.rs index ecf6432c9f..a2b44704f6 100644 --- a/crates/bevy_core_pipeline/src/motion_blur/mod.rs +++ b/crates/bevy_core_pipeline/src/motion_blur/mod.rs @@ -18,7 +18,7 @@ use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ camera::Camera, extract_component::{ExtractComponent, ExtractComponentPlugin, UniformComponentPlugin}, - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, render_resource::{ShaderType, SpecializedRenderPipelines}, Render, RenderApp, RenderSystems, }; diff --git a/crates/bevy_core_pipeline/src/msaa_writeback.rs b/crates/bevy_core_pipeline/src/msaa_writeback.rs index 5f82e10599..93116dc9fd 100644 --- a/crates/bevy_core_pipeline/src/msaa_writeback.rs +++ b/crates/bevy_core_pipeline/src/msaa_writeback.rs @@ -8,7 +8,7 @@ use bevy_color::LinearRgba; use bevy_ecs::{prelude::*, query::QueryItem}; use bevy_render::{ camera::ExtractedCamera, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_resource::*, renderer::RenderContext, view::{Msaa, ViewTarget}, diff --git a/crates/bevy_core_pipeline/src/oit/mod.rs b/crates/bevy_core_pipeline/src/oit/mod.rs index 5b5d038fa0..088d491c75 100644 --- a/crates/bevy_core_pipeline/src/oit/mod.rs +++ b/crates/bevy_core_pipeline/src/oit/mod.rs @@ -10,7 +10,7 @@ use bevy_render::{ camera::{Camera, ExtractedCamera}, extract_component::{ExtractComponent, ExtractComponentPlugin}, load_shader_library, - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, render_resource::{BufferUsages, BufferVec, DynamicUniformBuffer, ShaderType, TextureUsages}, renderer::{RenderDevice, RenderQueue}, view::Msaa, diff --git a/crates/bevy_core_pipeline/src/post_process/mod.rs b/crates/bevy_core_pipeline/src/post_process/mod.rs index 350ee1cfdd..b76af1b935 100644 --- a/crates/bevy_core_pipeline/src/post_process/mod.rs +++ b/crates/bevy_core_pipeline/src/post_process/mod.rs @@ -23,7 +23,7 @@ use bevy_render::{ load_shader_library, render_asset::{RenderAssetUsages, RenderAssets}, render_graph::{ - NodeRunError, RenderGraphApp as _, RenderGraphContext, ViewNode, ViewNodeRunner, + NodeRunError, RenderGraphContext, RenderGraphExt as _, ViewNode, ViewNodeRunner, }, render_resource::{ binding_types::{sampler, texture_2d, uniform_buffer}, diff --git a/crates/bevy_pbr/src/atmosphere/mod.rs b/crates/bevy_pbr/src/atmosphere/mod.rs index a55403630a..ed4dabdf96 100644 --- a/crates/bevy_pbr/src/atmosphere/mod.rs +++ b/crates/bevy_pbr/src/atmosphere/mod.rs @@ -55,7 +55,7 @@ use bevy_render::{ }; use bevy_render::{ extract_component::{ExtractComponent, ExtractComponentPlugin}, - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, render_resource::{TextureFormat, TextureUsages}, renderer::RenderAdapter, Render, RenderApp, RenderSystems, diff --git a/crates/bevy_pbr/src/deferred/mod.rs b/crates/bevy_pbr/src/deferred/mod.rs index b8f3a660c0..d021dc5d7e 100644 --- a/crates/bevy_pbr/src/deferred/mod.rs +++ b/crates/bevy_pbr/src/deferred/mod.rs @@ -25,7 +25,7 @@ use bevy_render::{ extract_component::{ ComponentUniforms, ExtractComponent, ExtractComponentPlugin, UniformComponentPlugin, }, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_resource::{binding_types::uniform_buffer, *}, renderer::{RenderContext, RenderDevice}, view::{ExtractedView, ViewTarget, ViewUniformOffset}, diff --git a/crates/bevy_pbr/src/meshlet/mod.rs b/crates/bevy_pbr/src/meshlet/mod.rs index 237ff9aa1b..94b623a280 100644 --- a/crates/bevy_pbr/src/meshlet/mod.rs +++ b/crates/bevy_pbr/src/meshlet/mod.rs @@ -75,7 +75,7 @@ use bevy_ecs::{ use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ load_shader_library, - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, renderer::RenderDevice, settings::WgpuFeatures, view::{self, prepare_view_targets, Msaa, Visibility, VisibilityClass}, diff --git a/crates/bevy_pbr/src/render/gpu_preprocess.rs b/crates/bevy_pbr/src/render/gpu_preprocess.rs index eaa7e857b7..ae3e322164 100644 --- a/crates/bevy_pbr/src/render/gpu_preprocess.rs +++ b/crates/bevy_pbr/src/render/gpu_preprocess.rs @@ -38,7 +38,7 @@ use bevy_render::{ UntypedPhaseBatchedInstanceBuffers, }, experimental::occlusion_culling::OcclusionCulling, - render_graph::{Node, NodeRunError, RenderGraphApp, RenderGraphContext}, + render_graph::{Node, NodeRunError, RenderGraphContext, RenderGraphExt}, render_resource::{ binding_types::{storage_buffer, storage_buffer_read_only, texture_2d, uniform_buffer}, BindGroup, BindGroupEntries, BindGroupLayout, BindingResource, Buffer, BufferBinding, diff --git a/crates/bevy_pbr/src/ssao/mod.rs b/crates/bevy_pbr/src/ssao/mod.rs index 7d56495605..a6a974d5cc 100644 --- a/crates/bevy_pbr/src/ssao/mod.rs +++ b/crates/bevy_pbr/src/ssao/mod.rs @@ -23,7 +23,7 @@ use bevy_render::{ globals::{GlobalsBuffer, GlobalsUniform}, load_shader_library, prelude::Camera, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_resource::{ binding_types::{ sampler, texture_2d, texture_depth_2d, texture_storage_2d, uniform_buffer, diff --git a/crates/bevy_pbr/src/ssr/mod.rs b/crates/bevy_pbr/src/ssr/mod.rs index f3d876ffde..7ddbe33919 100644 --- a/crates/bevy_pbr/src/ssr/mod.rs +++ b/crates/bevy_pbr/src/ssr/mod.rs @@ -25,7 +25,7 @@ use bevy_image::BevyDefault as _; use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ extract_component::{ExtractComponent, ExtractComponentPlugin}, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_resource::{ binding_types, AddressMode, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, CachedRenderPipelineId, ColorTargetState, ColorWrites, DynamicUniformBuffer, FilterMode, diff --git a/crates/bevy_pbr/src/volumetric_fog/mod.rs b/crates/bevy_pbr/src/volumetric_fog/mod.rs index efc3c5370a..c9f1f230c6 100644 --- a/crates/bevy_pbr/src/volumetric_fog/mod.rs +++ b/crates/bevy_pbr/src/volumetric_fog/mod.rs @@ -47,7 +47,7 @@ use bevy_math::{ use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ mesh::{Mesh, Meshable}, - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, render_resource::SpecializedRenderPipelines, sync_component::SyncComponentPlugin, view::Visibility, diff --git a/crates/bevy_pbr/src/wireframe.rs b/crates/bevy_pbr/src/wireframe.rs index f7c193161d..9cf3bc08dd 100644 --- a/crates/bevy_pbr/src/wireframe.rs +++ b/crates/bevy_pbr/src/wireframe.rs @@ -38,7 +38,7 @@ use bevy_render::{ render_asset::{ prepare_assets, PrepareAssetError, RenderAsset, RenderAssetPlugin, RenderAssets, }, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_phase::{ AddRenderCommand, BinnedPhaseItem, BinnedRenderPhasePlugin, BinnedRenderPhaseType, CachedRenderPipelinePhaseItem, DrawFunctionId, DrawFunctions, PhaseItem, diff --git a/crates/bevy_render/src/render_graph/app.rs b/crates/bevy_render/src/render_graph/app.rs index 338ae75d7a..fce6a13ad3 100644 --- a/crates/bevy_render/src/render_graph/app.rs +++ b/crates/bevy_render/src/render_graph/app.rs @@ -1,11 +1,11 @@ use bevy_app::{App, SubApp}; -use bevy_ecs::world::FromWorld; +use bevy_ecs::world::{FromWorld, World}; use tracing::warn; use super::{IntoRenderNodeArray, Node, RenderGraph, RenderLabel, RenderSubGraph}; /// Adds common [`RenderGraph`] operations to [`SubApp`] (and [`App`]). -pub trait RenderGraphApp { +pub trait RenderGraphExt { // Add a sub graph to the [`RenderGraph`] fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self; /// Add a [`Node`] to the [`RenderGraph`]: @@ -32,15 +32,15 @@ pub trait RenderGraphApp { ) -> &mut Self; } -impl RenderGraphApp for SubApp { +impl RenderGraphExt for World { fn add_render_graph_node( &mut self, sub_graph: impl RenderSubGraph, node_label: impl RenderLabel, ) -> &mut Self { let sub_graph = sub_graph.intern(); - let node = T::from_world(self.world_mut()); - let mut render_graph = self.world_mut().get_resource_mut::().expect( + let node = T::from_world(self); + let mut render_graph = self.get_resource_mut::().expect( "RenderGraph not found. Make sure you are using add_render_graph_node on the RenderApp", ); if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) { @@ -59,7 +59,7 @@ impl RenderGraphApp for SubApp { edges: impl IntoRenderNodeArray, ) -> &mut Self { let sub_graph = sub_graph.intern(); - let mut render_graph = self.world_mut().get_resource_mut::().expect( + let mut render_graph = self.get_resource_mut::().expect( "RenderGraph not found. Make sure you are using add_render_graph_edges on the RenderApp", ); if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) { @@ -79,7 +79,7 @@ impl RenderGraphApp for SubApp { input_node: impl RenderLabel, ) -> &mut Self { let sub_graph = sub_graph.intern(); - let mut render_graph = self.world_mut().get_resource_mut::().expect( + let mut render_graph = self.get_resource_mut::().expect( "RenderGraph not found. Make sure you are using add_render_graph_edge on the RenderApp", ); if let Some(graph) = render_graph.get_sub_graph_mut(sub_graph) { @@ -93,7 +93,7 @@ impl RenderGraphApp for SubApp { } fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self { - let mut render_graph = self.world_mut().get_resource_mut::().expect( + let mut render_graph = self.get_resource_mut::().expect( "RenderGraph not found. Make sure you are using add_render_sub_graph on the RenderApp", ); render_graph.add_sub_graph(sub_graph, RenderGraph::default()); @@ -101,13 +101,13 @@ impl RenderGraphApp for SubApp { } } -impl RenderGraphApp for App { +impl RenderGraphExt for SubApp { fn add_render_graph_node( &mut self, sub_graph: impl RenderSubGraph, node_label: impl RenderLabel, ) -> &mut Self { - SubApp::add_render_graph_node::(self.main_mut(), sub_graph, node_label); + World::add_render_graph_node::(self.world_mut(), sub_graph, node_label); self } @@ -117,7 +117,7 @@ impl RenderGraphApp for App { output_node: impl RenderLabel, input_node: impl RenderLabel, ) -> &mut Self { - SubApp::add_render_graph_edge(self.main_mut(), sub_graph, output_node, input_node); + World::add_render_graph_edge(self.world_mut(), sub_graph, output_node, input_node); self } @@ -126,12 +126,47 @@ impl RenderGraphApp for App { sub_graph: impl RenderSubGraph, edges: impl IntoRenderNodeArray, ) -> &mut Self { - SubApp::add_render_graph_edges(self.main_mut(), sub_graph, edges); + World::add_render_graph_edges(self.world_mut(), sub_graph, edges); self } fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self { - SubApp::add_render_sub_graph(self.main_mut(), sub_graph); + World::add_render_sub_graph(self.world_mut(), sub_graph); + self + } +} + +impl RenderGraphExt for App { + fn add_render_graph_node( + &mut self, + sub_graph: impl RenderSubGraph, + node_label: impl RenderLabel, + ) -> &mut Self { + World::add_render_graph_node::(self.world_mut(), sub_graph, node_label); + self + } + + fn add_render_graph_edge( + &mut self, + sub_graph: impl RenderSubGraph, + output_node: impl RenderLabel, + input_node: impl RenderLabel, + ) -> &mut Self { + World::add_render_graph_edge(self.world_mut(), sub_graph, output_node, input_node); + self + } + + fn add_render_graph_edges( + &mut self, + sub_graph: impl RenderSubGraph, + edges: impl IntoRenderNodeArray, + ) -> &mut Self { + World::add_render_graph_edges(self.world_mut(), sub_graph, edges); + self + } + + fn add_render_sub_graph(&mut self, sub_graph: impl RenderSubGraph) -> &mut Self { + World::add_render_sub_graph(self.world_mut(), sub_graph); self } } diff --git a/crates/bevy_solari/src/pathtracer/mod.rs b/crates/bevy_solari/src/pathtracer/mod.rs index 1e2cd95ed8..30cc15ba10 100644 --- a/crates/bevy_solari/src/pathtracer/mod.rs +++ b/crates/bevy_solari/src/pathtracer/mod.rs @@ -9,7 +9,7 @@ use bevy_core_pipeline::core_3d::graph::{Core3d, Node3d}; use bevy_ecs::{component::Component, reflect::ReflectComponent, schedule::IntoScheduleConfigs}; use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, renderer::RenderDevice, view::Hdr, ExtractSchedule, Render, RenderApp, RenderSystems, diff --git a/crates/bevy_solari/src/realtime/mod.rs b/crates/bevy_solari/src/realtime/mod.rs index b6a8f27a31..a8d6235f30 100644 --- a/crates/bevy_solari/src/realtime/mod.rs +++ b/crates/bevy_solari/src/realtime/mod.rs @@ -13,7 +13,7 @@ use bevy_ecs::{component::Component, reflect::ReflectComponent, schedule::IntoSc use bevy_pbr::DefaultOpaqueRendererMethod; use bevy_reflect::{std_traits::ReflectDefault, Reflect}; use bevy_render::{ - render_graph::{RenderGraphApp, ViewNodeRunner}, + render_graph::{RenderGraphExt, ViewNodeRunner}, renderer::RenderDevice, view::Hdr, ExtractSchedule, Render, RenderApp, RenderSystems, diff --git a/crates/bevy_sprite/src/mesh2d/wireframe2d.rs b/crates/bevy_sprite/src/mesh2d/wireframe2d.rs index e30c5b1f6c..f71d8c63f7 100644 --- a/crates/bevy_sprite/src/mesh2d/wireframe2d.rs +++ b/crates/bevy_sprite/src/mesh2d/wireframe2d.rs @@ -36,7 +36,7 @@ use bevy_render::{ render_asset::{ prepare_assets, PrepareAssetError, RenderAsset, RenderAssetPlugin, RenderAssets, }, - render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner}, + render_graph::{NodeRunError, RenderGraphContext, RenderGraphExt, ViewNode, ViewNodeRunner}, render_phase::{ AddRenderCommand, BinnedPhaseItem, BinnedRenderPhasePlugin, BinnedRenderPhaseType, CachedRenderPipelinePhaseItem, DrawFunctionId, DrawFunctions, InputUniformIndex, PhaseItem, diff --git a/examples/3d/occlusion_culling.rs b/examples/3d/occlusion_culling.rs index f0cdbffa2a..0783a28948 100644 --- a/examples/3d/occlusion_culling.rs +++ b/examples/3d/occlusion_culling.rs @@ -30,7 +30,7 @@ use bevy::{ IndirectParametersIndexed, }, experimental::occlusion_culling::OcclusionCulling, - render_graph::{self, NodeRunError, RenderGraphApp, RenderGraphContext, RenderLabel}, + render_graph::{self, NodeRunError, RenderGraphContext, RenderGraphExt, RenderLabel}, render_resource::{Buffer, BufferDescriptor, BufferUsages, MapMode}, renderer::{RenderContext, RenderDevice}, settings::WgpuFeatures, diff --git a/examples/shader/custom_post_processing.rs b/examples/shader/custom_post_processing.rs index a075dfbdc1..ea9fbed656 100644 --- a/examples/shader/custom_post_processing.rs +++ b/examples/shader/custom_post_processing.rs @@ -19,7 +19,7 @@ use bevy::{ UniformComponentPlugin, }, render_graph::{ - NodeRunError, RenderGraphApp, RenderGraphContext, RenderLabel, ViewNode, ViewNodeRunner, + NodeRunError, RenderGraphContext, RenderGraphExt, RenderLabel, ViewNode, ViewNodeRunner, }, render_resource::{ binding_types::{sampler, texture_2d, uniform_buffer}, diff --git a/examples/shader/custom_render_phase.rs b/examples/shader/custom_render_phase.rs index 30ef057429..b2b35b86c4 100644 --- a/examples/shader/custom_render_phase.rs +++ b/examples/shader/custom_render_phase.rs @@ -39,7 +39,7 @@ use bevy::{ mesh::{allocator::MeshAllocator, MeshVertexBufferLayoutRef, RenderMesh}, render_asset::RenderAssets, render_graph::{ - NodeRunError, RenderGraphApp, RenderGraphContext, RenderLabel, ViewNode, ViewNodeRunner, + NodeRunError, RenderGraphContext, RenderGraphExt, RenderLabel, ViewNode, ViewNodeRunner, }, render_phase::{ sort_phase_system, AddRenderCommand, CachedRenderPipelinePhaseItem, DrawFunctionId, diff --git a/release-content/migration-guides/render_graph_app_to_ext.md b/release-content/migration-guides/render_graph_app_to_ext.md new file mode 100644 index 0000000000..511e60ce05 --- /dev/null +++ b/release-content/migration-guides/render_graph_app_to_ext.md @@ -0,0 +1,7 @@ +--- +title: `RenderGraphApp` renamed to `RenderGraphExt`. +pull_requests: [19912] +--- + +`RenderGraphApp` has been renamed to `RenderGraphExt`. Rename this for cases where you are +explicitly importing this trait. From 1b4cf02fc8274aaa64f24f63212122c02debb4fb Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Thu, 3 Jul 2025 00:59:20 +1000 Subject: [PATCH 64/68] bevy_reflect: streamline generated `FromReflect::from_reflect` (#19906) # Objective Generated `from_reflect` methods use closures in a weird way, e.g.: ```rust x: (|| { ::from_reflect( ::bevy::reflect::Struct::field(__ref_struct, "x")?, ) })()?, ``` The reason for this is because when `#[reflect(Default)]` is used, you instead get stuff like this: ```rust if let ::core::option::Option::Some(__field) = (|| { ::from_reflect( ::bevy::reflect::Struct::field(__ref_struct, "x")?, ) })() { __this.x = __field; } ``` and the closure is necessary to contain the scope of the `?`. But the first case is more common. Helps with #19873. ## Solution Avoid the closure in the common case. ## Testing I used cargo expand to confirm the closures are no longer produced in the common case. `-Zmacro-stats` output tells me this reduces the size of the `Reflect` code produced for `bevy_ui` by 0.5%. --- .../bevy_reflect/derive/src/from_reflect.rs | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/crates/bevy_reflect/derive/src/from_reflect.rs b/crates/bevy_reflect/derive/src/from_reflect.rs index d994cbd2f7..a0e6e444d3 100644 --- a/crates/bevy_reflect/derive/src/from_reflect.rs +++ b/crates/bevy_reflect/derive/src/from_reflect.rs @@ -146,7 +146,8 @@ fn impl_struct_internal( quote! { let mut #__this = <#reflect_ty as #FQDefault>::default(); #( - if let #fqoption::Some(__field) = #active_values() { + // The closure catches any failing `?` within `active_values`. + if let #fqoption::Some(__field) = (|| #active_values)() { // Iff field exists -> use its value #__this.#active_members = __field; } @@ -158,7 +159,7 @@ fn impl_struct_internal( quote! { let #__this = #constructor { - #(#active_members: #active_values()?,)* + #(#active_members: #active_values?,)* #(#ignored_members: #ignored_values,)* }; #FQOption::Some(#retval) @@ -274,13 +275,11 @@ fn get_active_fields( <#ty as #bevy_reflect_path::FromReflect>::from_reflect(field) }); quote! { - (|| - if let #FQOption::Some(field) = #get_field { - #value - } else { - #FQOption::Some(#path()) - } - ) + if let #FQOption::Some(field) = #get_field { + #value + } else { + #FQOption::Some(#path()) + } } } DefaultBehavior::Default => { @@ -288,13 +287,11 @@ fn get_active_fields( <#ty as #bevy_reflect_path::FromReflect>::from_reflect(field) }); quote! { - (|| - if let #FQOption::Some(field) = #get_field { - #value - } else { - #FQOption::Some(#FQDefault::default()) - } - ) + if let #FQOption::Some(field) = #get_field { + #value + } else { + #FQOption::Some(#FQDefault::default()) + } } } DefaultBehavior::Required => { @@ -302,7 +299,7 @@ fn get_active_fields( <#ty as #bevy_reflect_path::FromReflect>::from_reflect(#get_field?) }); quote! { - (|| #value) + #value } } }; From 18712f31f99e8260022858c004452da43fa417ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?charlotte=20=F0=9F=8C=B8?= Date: Wed, 2 Jul 2025 11:47:27 -0700 Subject: [PATCH 65/68] Make render and compute pipeline descriptors defaultable. (#19903) A few versions ago, wgpu made it possible to set shader entry point to `None`, which will select the correct entry point in file where only a single entrypoint is specified. This makes it possible to implement `Default` for pipeline descriptors. This PR does so and attempts to `..default()` everything possible. --- .../src/contrast_adaptive_sharpening/mod.rs | 9 +- crates/bevy_anti_aliasing/src/fxaa/mod.rs | 8 +- crates/bevy_anti_aliasing/src/smaa/mod.rs | 42 +++--- crates/bevy_anti_aliasing/src/taa/mod.rs | 19 ++- .../src/auto_exposure/pipeline.rs | 8 +- crates/bevy_core_pipeline/src/blit/mod.rs | 14 +- .../src/bloom/downsampling_pipeline.rs | 9 +- .../src/bloom/upsampling_pipeline.rs | 11 +- .../src/deferred/copy_lighting_id.rs | 13 +- crates/bevy_core_pipeline/src/dof/mod.rs | 10 +- .../src/experimental/mip_generation/mod.rs | 7 +- .../src/fullscreen_vertex_shader/mod.rs | 2 +- .../src/motion_blur/pipeline.rs | 19 +-- .../bevy_core_pipeline/src/oit/resolve/mod.rs | 16 +-- .../src/post_process/mod.rs | 9 +- crates/bevy_core_pipeline/src/skybox/mod.rs | 12 +- .../bevy_core_pipeline/src/skybox/prepass.rs | 7 +- .../bevy_core_pipeline/src/tonemapping/mod.rs | 8 +- crates/bevy_gizmos/src/pipeline_2d.rs | 16 +-- crates/bevy_gizmos/src/pipeline_3d.rs | 17 +-- crates/bevy_pbr/src/atmosphere/resources.rs | 40 ++---- crates/bevy_pbr/src/deferred/mod.rs | 11 +- .../src/meshlet/material_pipeline_prepare.rs | 9 +- .../src/meshlet/meshlet_mesh_material.wgsl | 2 + crates/bevy_pbr/src/meshlet/pipelines.rs | 133 +++++------------- crates/bevy_pbr/src/prepass/mod.rs | 14 +- crates/bevy_pbr/src/render/gpu_preprocess.rs | 14 +- crates/bevy_pbr/src/render/mesh.rs | 12 +- crates/bevy_pbr/src/ssao/mod.rs | 14 +- crates/bevy_pbr/src/ssr/mod.rs | 8 +- crates/bevy_pbr/src/volumetric_fog/render.rs | 17 +-- .../src/render_resource/pipeline.rs | 26 ++-- .../src/render_resource/pipeline_cache.rs | 10 +- .../bevy_render/src/view/window/screenshot.rs | 11 +- crates/bevy_solari/Cargo.toml | 1 + crates/bevy_solari/src/pathtracer/node.rs | 6 +- crates/bevy_solari/src/realtime/node.rs | 11 +- crates/bevy_sprite/src/mesh2d/mesh.rs | 8 +- crates/bevy_sprite/src/render/mod.rs | 17 +-- crates/bevy_ui/src/render/box_shadow.rs | 26 +--- crates/bevy_ui/src/render/gradient.rs | 26 +--- crates/bevy_ui/src/render/pipeline.rs | 23 +-- .../src/render/ui_material_pipeline.rs | 24 +--- .../src/render/ui_texture_slice_pipeline.rs | 23 +-- examples/2d/mesh2d_manual.rs | 23 ++- .../shader/compute_shader_game_of_life.rs | 14 +- examples/shader/custom_phase_item.rs | 24 +--- examples/shader/custom_post_processing.rs | 11 +- examples/shader/custom_render_phase.rs | 21 +-- examples/shader/gpu_readback.rs | 5 +- examples/shader/shader_material_glsl.rs | 22 +-- examples/shader/specialized_mesh_pipeline.rs | 12 +- 52 files changed, 272 insertions(+), 602 deletions(-) diff --git a/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs b/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs index 8ff94fba65..5baf2ed893 100644 --- a/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs +++ b/crates/bevy_anti_aliasing/src/contrast_adaptive_sharpening/mod.rs @@ -20,6 +20,7 @@ use bevy_render::{ view::{ExtractedView, ViewTarget}, Render, RenderApp, RenderSystems, }; +use bevy_utils::default; mod node; @@ -218,18 +219,14 @@ impl SpecializedRenderPipeline for CasPipeline { fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: key.texture_format, blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_anti_aliasing/src/fxaa/mod.rs b/crates/bevy_anti_aliasing/src/fxaa/mod.rs index 065f6ebec1..df247c604b 100644 --- a/crates/bevy_anti_aliasing/src/fxaa/mod.rs +++ b/crates/bevy_anti_aliasing/src/fxaa/mod.rs @@ -190,18 +190,14 @@ impl SpecializedRenderPipeline for FxaaPipeline { format!("EDGE_THRESH_{}", key.edge_threshold.get_str()).into(), format!("EDGE_THRESH_MIN_{}", key.edge_threshold_min.get_str()).into(), ], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: key.texture_format, blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_anti_aliasing/src/smaa/mod.rs b/crates/bevy_anti_aliasing/src/smaa/mod.rs index ea191cd28b..f465bd5f3a 100644 --- a/crates/bevy_anti_aliasing/src/smaa/mod.rs +++ b/crates/bevy_anti_aliasing/src/smaa/mod.rs @@ -64,13 +64,13 @@ use bevy_render::{ binding_types::{sampler, texture_2d, uniform_buffer}, AddressMode, BindGroup, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, CachedRenderPipelineId, ColorTargetState, ColorWrites, CompareFunction, DepthStencilState, - DynamicUniformBuffer, FilterMode, FragmentState, LoadOp, MultisampleState, Operations, - PipelineCache, PrimitiveState, RenderPassColorAttachment, RenderPassDepthStencilAttachment, - RenderPassDescriptor, RenderPipeline, RenderPipelineDescriptor, SamplerBindingType, - SamplerDescriptor, Shader, ShaderDefVal, ShaderStages, ShaderType, - SpecializedRenderPipeline, SpecializedRenderPipelines, StencilFaceState, StencilOperation, - StencilState, StoreOp, TextureDescriptor, TextureDimension, TextureFormat, - TextureSampleType, TextureUsages, TextureView, VertexState, + DynamicUniformBuffer, FilterMode, FragmentState, LoadOp, Operations, PipelineCache, + RenderPassColorAttachment, RenderPassDepthStencilAttachment, RenderPassDescriptor, + RenderPipeline, RenderPipelineDescriptor, SamplerBindingType, SamplerDescriptor, Shader, + ShaderDefVal, ShaderStages, ShaderType, SpecializedRenderPipeline, + SpecializedRenderPipelines, StencilFaceState, StencilOperation, StencilState, StoreOp, + TextureDescriptor, TextureDimension, TextureFormat, TextureSampleType, TextureUsages, + TextureView, VertexState, }, renderer::{RenderContext, RenderDevice, RenderQueue}, texture::{CachedTexture, GpuImage, TextureCache}, @@ -482,21 +482,19 @@ impl SpecializedRenderPipeline for SmaaEdgeDetectionPipeline { vertex: VertexState { shader: self.shader.clone(), shader_defs: shader_defs.clone(), - entry_point: "edge_detection_vertex_main".into(), + entry_point: Some("edge_detection_vertex_main".into()), buffers: vec![], }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "luma_edge_detection_fragment_main".into(), + entry_point: Some("luma_edge_detection_fragment_main".into()), targets: vec![Some(ColorTargetState { format: TextureFormat::Rg8Unorm, blend: None, write_mask: ColorWrites::ALL, })], }), - push_constant_ranges: vec![], - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: TextureFormat::Stencil8, depth_write_enabled: false, @@ -509,8 +507,7 @@ impl SpecializedRenderPipeline for SmaaEdgeDetectionPipeline { }, bias: default(), }), - multisample: MultisampleState::default(), - zero_initialize_workgroup_memory: false, + ..default() } } } @@ -542,21 +539,19 @@ impl SpecializedRenderPipeline for SmaaBlendingWeightCalculationPipeline { vertex: VertexState { shader: self.shader.clone(), shader_defs: shader_defs.clone(), - entry_point: "blending_weight_calculation_vertex_main".into(), + entry_point: Some("blending_weight_calculation_vertex_main".into()), buffers: vec![], }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "blending_weight_calculation_fragment_main".into(), + entry_point: Some("blending_weight_calculation_fragment_main".into()), targets: vec![Some(ColorTargetState { format: TextureFormat::Rgba8Unorm, blend: None, write_mask: ColorWrites::ALL, })], }), - push_constant_ranges: vec![], - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: TextureFormat::Stencil8, depth_write_enabled: false, @@ -569,8 +564,7 @@ impl SpecializedRenderPipeline for SmaaBlendingWeightCalculationPipeline { }, bias: default(), }), - multisample: MultisampleState::default(), - zero_initialize_workgroup_memory: false, + ..default() } } } @@ -590,24 +584,20 @@ impl SpecializedRenderPipeline for SmaaNeighborhoodBlendingPipeline { vertex: VertexState { shader: self.shader.clone(), shader_defs: shader_defs.clone(), - entry_point: "neighborhood_blending_vertex_main".into(), + entry_point: Some("neighborhood_blending_vertex_main".into()), buffers: vec![], }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "neighborhood_blending_fragment_main".into(), + entry_point: Some("neighborhood_blending_fragment_main".into()), targets: vec![Some(ColorTargetState { format: key.texture_format, blend: None, write_mask: ColorWrites::ALL, })], }), - push_constant_ranges: vec![], - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_anti_aliasing/src/taa/mod.rs b/crates/bevy_anti_aliasing/src/taa/mod.rs index ee1af46d39..0783cf713e 100644 --- a/crates/bevy_anti_aliasing/src/taa/mod.rs +++ b/crates/bevy_anti_aliasing/src/taa/mod.rs @@ -25,11 +25,11 @@ use bevy_render::{ render_resource::{ binding_types::{sampler, texture_2d, texture_depth_2d}, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, CachedRenderPipelineId, - ColorTargetState, ColorWrites, FilterMode, FragmentState, MultisampleState, Operations, - PipelineCache, PrimitiveState, RenderPassColorAttachment, RenderPassDescriptor, - RenderPipelineDescriptor, Sampler, SamplerBindingType, SamplerDescriptor, Shader, - ShaderStages, SpecializedRenderPipeline, SpecializedRenderPipelines, TextureDescriptor, - TextureDimension, TextureFormat, TextureSampleType, TextureUsages, + ColorTargetState, ColorWrites, FilterMode, FragmentState, Operations, PipelineCache, + RenderPassColorAttachment, RenderPassDescriptor, RenderPipelineDescriptor, Sampler, + SamplerBindingType, SamplerDescriptor, Shader, ShaderStages, SpecializedRenderPipeline, + SpecializedRenderPipelines, TextureDescriptor, TextureDimension, TextureFormat, + TextureSampleType, TextureUsages, }, renderer::{RenderContext, RenderDevice}, sync_component::SyncComponentPlugin, @@ -38,6 +38,7 @@ use bevy_render::{ view::{ExtractedView, Msaa, ViewTarget}, ExtractSchedule, MainWorld, Render, RenderApp, RenderSystems, }; +use bevy_utils::default; use tracing::warn; /// Plugin for temporal anti-aliasing. @@ -320,7 +321,6 @@ impl SpecializedRenderPipeline for TaaPipeline { fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: "taa".into(), targets: vec![ Some(ColorTargetState { format, @@ -333,12 +333,9 @@ impl SpecializedRenderPipeline for TaaPipeline { write_mask: ColorWrites::ALL, }), ], + ..default() }), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/auto_exposure/pipeline.rs b/crates/bevy_core_pipeline/src/auto_exposure/pipeline.rs index 28ed6b4ee8..4a2afa939e 100644 --- a/crates/bevy_core_pipeline/src/auto_exposure/pipeline.rs +++ b/crates/bevy_core_pipeline/src/auto_exposure/pipeline.rs @@ -10,6 +10,7 @@ use bevy_render::{ renderer::RenderDevice, view::ViewUniform, }; +use bevy_utils::default; use core::num::NonZero; #[derive(Resource)] @@ -82,12 +83,11 @@ impl SpecializedComputePipeline for AutoExposurePipeline { layout: vec![self.histogram_layout.clone()], shader: self.histogram_shader.clone(), shader_defs: vec![], - entry_point: match pass { + entry_point: Some(match pass { AutoExposurePass::Histogram => "compute_histogram".into(), AutoExposurePass::Average => "compute_average".into(), - }, - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + }), + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/blit/mod.rs b/crates/bevy_core_pipeline/src/blit/mod.rs index 8dc655e91f..5acd98dd30 100644 --- a/crates/bevy_core_pipeline/src/blit/mod.rs +++ b/crates/bevy_core_pipeline/src/blit/mod.rs @@ -1,3 +1,4 @@ +use crate::FullscreenShader; use bevy_app::{App, Plugin}; use bevy_asset::{embedded_asset, load_embedded_asset, Handle}; use bevy_ecs::prelude::*; @@ -9,8 +10,7 @@ use bevy_render::{ renderer::RenderDevice, RenderApp, }; - -use crate::FullscreenShader; +use bevy_utils::default; /// Adds support for specialized "blit pipelines", which can be used to write one texture to another. pub struct BlitPlugin; @@ -85,22 +85,18 @@ impl SpecializedRenderPipeline for BlitPipeline { vertex: self.fullscreen_shader.to_vertex_state(), fragment: Some(FragmentState { shader: self.fragment_shader.clone(), - shader_defs: vec![], - entry_point: "fs_main".into(), targets: vec![Some(ColorTargetState { format: key.texture_format, blend: key.blend_state, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), - depth_stencil: None, multisample: MultisampleState { count: key.samples, - ..Default::default() + ..default() }, - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/bloom/downsampling_pipeline.rs b/crates/bevy_core_pipeline/src/bloom/downsampling_pipeline.rs index 201d5a6cbd..aa8d3d37af 100644 --- a/crates/bevy_core_pipeline/src/bloom/downsampling_pipeline.rs +++ b/crates/bevy_core_pipeline/src/bloom/downsampling_pipeline.rs @@ -16,6 +16,7 @@ use bevy_render::{ }, renderer::RenderDevice, }; +use bevy_utils::default; #[derive(Component)] pub struct BloomDownsamplingPipelineIds { @@ -130,18 +131,14 @@ impl SpecializedRenderPipeline for BloomDownsamplingPipeline { fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point, + entry_point: Some(entry_point), targets: vec![Some(ColorTargetState { format: BLOOM_TEXTURE_FORMAT, blend: None, write_mask: ColorWrites::ALL, })], }), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/bloom/upsampling_pipeline.rs b/crates/bevy_core_pipeline/src/bloom/upsampling_pipeline.rs index c49a9d5b16..4a5c4d50f9 100644 --- a/crates/bevy_core_pipeline/src/bloom/upsampling_pipeline.rs +++ b/crates/bevy_core_pipeline/src/bloom/upsampling_pipeline.rs @@ -18,6 +18,7 @@ use bevy_render::{ renderer::RenderDevice, view::ViewTarget, }; +use bevy_utils::default; #[derive(Component)] pub struct UpsamplingPipelineIds { @@ -115,8 +116,7 @@ impl SpecializedRenderPipeline for BloomUpsamplingPipeline { vertex: self.fullscreen_shader.to_vertex_state(), fragment: Some(FragmentState { shader: self.fragment_shader.clone(), - shader_defs: vec![], - entry_point: "upsample".into(), + entry_point: Some("upsample".into()), targets: vec![Some(ColorTargetState { format: texture_format, blend: Some(BlendState { @@ -129,12 +129,9 @@ impl SpecializedRenderPipeline for BloomUpsamplingPipeline { }), write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/deferred/copy_lighting_id.rs b/crates/bevy_core_pipeline/src/deferred/copy_lighting_id.rs index bfad57757f..5f930d85fd 100644 --- a/crates/bevy_core_pipeline/src/deferred/copy_lighting_id.rs +++ b/crates/bevy_core_pipeline/src/deferred/copy_lighting_id.rs @@ -15,13 +15,13 @@ use bevy_render::{ Render, RenderApp, RenderSystems, }; +use super::DEFERRED_LIGHTING_PASS_ID_DEPTH_FORMAT; use bevy_ecs::query::QueryItem; use bevy_render::{ render_graph::{NodeRunError, RenderGraphContext, ViewNode}, renderer::RenderContext, }; - -use super::DEFERRED_LIGHTING_PASS_ID_DEPTH_FORMAT; +use bevy_utils::default; pub struct CopyDeferredLightingIdPlugin; @@ -142,11 +142,8 @@ impl FromWorld for CopyDeferredLightingIdPipeline { vertex: vertex_state, fragment: Some(FragmentState { shader, - shader_defs: vec![], - entry_point: "fragment".into(), - targets: vec![], + ..default() }), - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: DEFERRED_LIGHTING_PASS_ID_DEPTH_FORMAT, depth_write_enabled: true, @@ -154,9 +151,7 @@ impl FromWorld for CopyDeferredLightingIdPipeline { stencil: StencilState::default(), bias: DepthBiasState::default(), }), - multisample: MultisampleState::default(), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() }); Self { diff --git a/crates/bevy_core_pipeline/src/dof/mod.rs b/crates/bevy_core_pipeline/src/dof/mod.rs index b47ba61eb0..c3b39e8181 100644 --- a/crates/bevy_core_pipeline/src/dof/mod.rs +++ b/crates/bevy_core_pipeline/src/dof/mod.rs @@ -800,23 +800,19 @@ impl SpecializedRenderPipeline for DepthOfFieldPipeline { RenderPipelineDescriptor { label: Some("depth of field pipeline".into()), layout, - push_constant_ranges: vec![], vertex: self.fullscreen_shader.to_vertex_state(), - primitive: default(), - depth_stencil: None, - multisample: default(), fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: match key.pass { + entry_point: Some(match key.pass { DofPass::GaussianHorizontal => "gaussian_horizontal".into(), DofPass::GaussianVertical => "gaussian_vertical".into(), DofPass::BokehPass0 => "bokeh_pass_0".into(), DofPass::BokehPass1 => "bokeh_pass_1".into(), - }, + }), targets, }), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs b/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs index e420438d9a..1733743310 100644 --- a/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs +++ b/crates/bevy_core_pipeline/src/experimental/mip_generation/mod.rs @@ -46,6 +46,7 @@ use bevy_render::{ view::{ExtractedView, NoIndirectDrawing, ViewDepthTexture}, Render, RenderApp, RenderSystems, }; +use bevy_utils::default; use bitflags::bitflags; use tracing::debug; @@ -492,12 +493,12 @@ impl SpecializedComputePipeline for DownsampleDepthPipeline { }], shader: DOWNSAMPLE_DEPTH_SHADER_HANDLE, shader_defs, - entry_point: if key.contains(DownsampleDepthPipelineKey::SECOND_PHASE) { + entry_point: Some(if key.contains(DownsampleDepthPipelineKey::SECOND_PHASE) { "downsample_depth_second".into() } else { "downsample_depth_first".into() - }, - zero_initialize_workgroup_memory: false, + }), + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/fullscreen_vertex_shader/mod.rs b/crates/bevy_core_pipeline/src/fullscreen_vertex_shader/mod.rs index de8aa856c9..857412d8ce 100644 --- a/crates/bevy_core_pipeline/src/fullscreen_vertex_shader/mod.rs +++ b/crates/bevy_core_pipeline/src/fullscreen_vertex_shader/mod.rs @@ -33,7 +33,7 @@ impl FullscreenShader { VertexState { shader: self.0.clone(), shader_defs: Vec::new(), - entry_point: "fullscreen_vertex_shader".into(), + entry_point: Some("fullscreen_vertex_shader".into()), buffers: Vec::new(), } } diff --git a/crates/bevy_core_pipeline/src/motion_blur/pipeline.rs b/crates/bevy_core_pipeline/src/motion_blur/pipeline.rs index 9e36e508dc..904d6c6c54 100644 --- a/crates/bevy_core_pipeline/src/motion_blur/pipeline.rs +++ b/crates/bevy_core_pipeline/src/motion_blur/pipeline.rs @@ -1,3 +1,4 @@ +use crate::FullscreenShader; use bevy_asset::{load_embedded_asset, Handle}; use bevy_ecs::{ component::Component, @@ -16,16 +17,14 @@ use bevy_render::{ texture_depth_2d_multisampled, uniform_buffer_sized, }, BindGroupLayout, BindGroupLayoutEntries, CachedRenderPipelineId, ColorTargetState, - ColorWrites, FragmentState, MultisampleState, PipelineCache, PrimitiveState, - RenderPipelineDescriptor, Sampler, SamplerBindingType, SamplerDescriptor, Shader, - ShaderDefVal, ShaderStages, ShaderType, SpecializedRenderPipeline, - SpecializedRenderPipelines, TextureFormat, TextureSampleType, + ColorWrites, FragmentState, PipelineCache, RenderPipelineDescriptor, Sampler, + SamplerBindingType, SamplerDescriptor, Shader, ShaderDefVal, ShaderStages, ShaderType, + SpecializedRenderPipeline, SpecializedRenderPipelines, TextureFormat, TextureSampleType, }, renderer::RenderDevice, view::{ExtractedView, Msaa, ViewTarget}, }; - -use crate::FullscreenShader; +use bevy_utils::default; use super::MotionBlurUniform; @@ -139,7 +138,6 @@ impl SpecializedRenderPipeline for MotionBlurPipeline { fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -149,12 +147,9 @@ impl SpecializedRenderPipeline for MotionBlurPipeline { blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/oit/resolve/mod.rs b/crates/bevy_core_pipeline/src/oit/resolve/mod.rs index 7067e5f83b..650b65f494 100644 --- a/crates/bevy_core_pipeline/src/oit/resolve/mod.rs +++ b/crates/bevy_core_pipeline/src/oit/resolve/mod.rs @@ -1,3 +1,4 @@ +use super::OitBuffers; use crate::{oit::OrderIndependentTransparencySettings, FullscreenShader}; use bevy_app::Plugin; use bevy_asset::{embedded_asset, load_embedded_asset, AssetServer}; @@ -12,17 +13,16 @@ use bevy_render::{ binding_types::{storage_buffer_sized, texture_depth_2d, uniform_buffer}, BindGroup, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries, BlendComponent, BlendState, CachedRenderPipelineId, ColorTargetState, ColorWrites, DownlevelFlags, - FragmentState, MultisampleState, PipelineCache, PrimitiveState, RenderPipelineDescriptor, - ShaderDefVal, ShaderStages, TextureFormat, + FragmentState, PipelineCache, RenderPipelineDescriptor, ShaderDefVal, ShaderStages, + TextureFormat, }, renderer::{RenderAdapter, RenderDevice}, view::{ExtractedView, ViewTarget, ViewUniform, ViewUniforms}, Render, RenderApp, RenderSystems, }; +use bevy_utils::default; use tracing::warn; -use super::OitBuffers; - /// Contains the render node used to run the resolve pass. pub mod node; @@ -213,7 +213,6 @@ fn specialize_oit_resolve_pipeline( resolve_pipeline.oit_depth_bind_group_layout.clone(), ], fragment: Some(FragmentState { - entry_point: "fragment".into(), shader: load_embedded_asset!(asset_server, "oit_resolve.wgsl"), shader_defs: vec![ShaderDefVal::UInt( "LAYER_COUNT".into(), @@ -227,13 +226,10 @@ fn specialize_oit_resolve_pipeline( }), write_mask: ColorWrites::ALL, })], + ..default() }), vertex: fullscreen_shader.to_vertex_state(), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } diff --git a/crates/bevy_core_pipeline/src/post_process/mod.rs b/crates/bevy_core_pipeline/src/post_process/mod.rs index b76af1b935..0077cebdf5 100644 --- a/crates/bevy_core_pipeline/src/post_process/mod.rs +++ b/crates/bevy_core_pipeline/src/post_process/mod.rs @@ -326,19 +326,14 @@ impl SpecializedRenderPipeline for PostProcessingPipeline { vertex: self.fullscreen_shader.to_vertex_state(), fragment: Some(FragmentState { shader: self.fragment_shader.clone(), - shader_defs: vec![], - entry_point: "fragment_main".into(), targets: vec![Some(ColorTargetState { format: key.texture_format, blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: default(), - depth_stencil: None, - multisample: default(), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/skybox/mod.rs b/crates/bevy_core_pipeline/src/skybox/mod.rs index 51c6934ece..40524cf221 100644 --- a/crates/bevy_core_pipeline/src/skybox/mod.rs +++ b/crates/bevy_core_pipeline/src/skybox/mod.rs @@ -28,6 +28,7 @@ use bevy_render::{ Render, RenderApp, RenderSystems, }; use bevy_transform::components::Transform; +use bevy_utils::default; use prepass::SkyboxPrepassPipeline; use crate::{core_3d::CORE_3D_DEPTH_FORMAT, prepass::PreviousViewUniforms}; @@ -192,14 +193,10 @@ impl SpecializedRenderPipeline for SkyboxPipeline { RenderPipelineDescriptor { label: Some("skybox_pipeline".into()), layout: vec![self.bind_group_layout.clone()], - push_constant_ranges: Vec::new(), vertex: VertexState { shader: self.shader.clone(), - shader_defs: Vec::new(), - entry_point: "skybox_vertex".into(), - buffers: Vec::new(), + ..default() }, - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: key.depth_format, depth_write_enabled: false, @@ -223,8 +220,6 @@ impl SpecializedRenderPipeline for SkyboxPipeline { }, fragment: Some(FragmentState { shader: self.shader.clone(), - shader_defs: Vec::new(), - entry_point: "skybox_fragment".into(), targets: vec![Some(ColorTargetState { format: if key.hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -235,8 +230,9 @@ impl SpecializedRenderPipeline for SkyboxPipeline { blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/skybox/prepass.rs b/crates/bevy_core_pipeline/src/skybox/prepass.rs index ad63339d05..2133e133fe 100644 --- a/crates/bevy_core_pipeline/src/skybox/prepass.rs +++ b/crates/bevy_core_pipeline/src/skybox/prepass.rs @@ -87,9 +87,7 @@ impl SpecializedRenderPipeline for SkyboxPrepassPipeline { RenderPipelineDescriptor { label: Some("skybox_prepass_pipeline".into()), layout: vec![self.bind_group_layout.clone()], - push_constant_ranges: vec![], vertex: self.fullscreen_shader.to_vertex_state(), - primitive: default(), depth_stencil: Some(DepthStencilState { format: CORE_3D_DEPTH_FORMAT, depth_write_enabled: false, @@ -104,11 +102,10 @@ impl SpecializedRenderPipeline for SkyboxPrepassPipeline { }, fragment: Some(FragmentState { shader: self.fragment_shader.clone(), - shader_defs: vec![], - entry_point: "fragment".into(), targets: prepass_target_descriptors(key.normal_prepass, true, false), + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_core_pipeline/src/tonemapping/mod.rs b/crates/bevy_core_pipeline/src/tonemapping/mod.rs index c57d49d32b..bd0004d342 100644 --- a/crates/bevy_core_pipeline/src/tonemapping/mod.rs +++ b/crates/bevy_core_pipeline/src/tonemapping/mod.rs @@ -279,18 +279,14 @@ impl SpecializedRenderPipeline for TonemappingPipeline { fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: ViewTarget::TEXTURE_FORMAT_HDR, blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_gizmos/src/pipeline_2d.rs b/crates/bevy_gizmos/src/pipeline_2d.rs index a97071249d..15857022f3 100644 --- a/crates/bevy_gizmos/src/pipeline_2d.rs +++ b/crates/bevy_gizmos/src/pipeline_2d.rs @@ -29,6 +29,7 @@ use bevy_render::{ Render, RenderApp, RenderSystems, }; use bevy_sprite::{Mesh2dPipeline, Mesh2dPipelineKey, SetMesh2dViewBindGroup}; +use bevy_utils::default; use tracing::error; pub struct LineGizmo2dPlugin; @@ -128,14 +129,14 @@ impl SpecializedRenderPipeline for LineGizmoPipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: line_gizmo_vertex_buffer_layouts(key.strip), + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: fragment_entry_point.into(), + entry_point: Some(fragment_entry_point.into()), targets: vec![Some(ColorTargetState { format, blend: Some(BlendState::ALPHA_BLENDING), @@ -143,7 +144,6 @@ impl SpecializedRenderPipeline for LineGizmoPipeline { })], }), layout, - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: CORE_2D_DEPTH_FORMAT, depth_write_enabled: false, @@ -166,8 +166,7 @@ impl SpecializedRenderPipeline for LineGizmoPipeline { alpha_to_coverage_enabled: false, }, label: Some("LineGizmo Pipeline 2D".into()), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } } @@ -231,19 +230,19 @@ impl SpecializedRenderPipeline for LineJointGizmoPipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: entry_point.into(), + entry_point: Some(entry_point.into()), shader_defs: shader_defs.clone(), buffers: line_joint_gizmo_vertex_buffer_layouts(), }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format, blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), layout, primitive: PrimitiveState::default(), @@ -269,8 +268,7 @@ impl SpecializedRenderPipeline for LineJointGizmoPipeline { alpha_to_coverage_enabled: false, }, label: Some("LineJointGizmo Pipeline 2D".into()), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_gizmos/src/pipeline_3d.rs b/crates/bevy_gizmos/src/pipeline_3d.rs index 92f4ee0228..ddf01994a9 100644 --- a/crates/bevy_gizmos/src/pipeline_3d.rs +++ b/crates/bevy_gizmos/src/pipeline_3d.rs @@ -33,6 +33,7 @@ use bevy_render::{ view::{ExtractedView, Msaa, RenderLayers, ViewTarget}, Render, RenderApp, RenderSystems, }; +use bevy_utils::default; use tracing::error; pub struct LineGizmo3dPlugin; @@ -132,14 +133,14 @@ impl SpecializedRenderPipeline for LineGizmoPipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: line_gizmo_vertex_buffer_layouts(key.strip), + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: fragment_entry_point.into(), + entry_point: Some(fragment_entry_point.into()), targets: vec![Some(ColorTargetState { format, blend: Some(BlendState::ALPHA_BLENDING), @@ -147,7 +148,6 @@ impl SpecializedRenderPipeline for LineGizmoPipeline { })], }), layout, - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: CORE_3D_DEPTH_FORMAT, depth_write_enabled: true, @@ -161,8 +161,7 @@ impl SpecializedRenderPipeline for LineGizmoPipeline { alpha_to_coverage_enabled: false, }, label: Some("LineGizmo 3d Pipeline".into()), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } } @@ -232,22 +231,21 @@ impl SpecializedRenderPipeline for LineJointGizmoPipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: entry_point.into(), + entry_point: Some(entry_point.into()), shader_defs: shader_defs.clone(), buffers: line_joint_gizmo_vertex_buffer_layouts(), }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format, blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), layout, - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: CORE_3D_DEPTH_FORMAT, depth_write_enabled: true, @@ -261,8 +259,7 @@ impl SpecializedRenderPipeline for LineJointGizmoPipeline { alpha_to_coverage_enabled: false, }, label: Some("LineJointGizmo 3d Pipeline".into()), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_pbr/src/atmosphere/resources.rs b/crates/bevy_pbr/src/atmosphere/resources.rs index 5a75fbe4d1..3f4da25fc0 100644 --- a/crates/bevy_pbr/src/atmosphere/resources.rs +++ b/crates/bevy_pbr/src/atmosphere/resources.rs @@ -1,3 +1,4 @@ +use crate::{GpuLights, LightMeta}; use bevy_asset::{load_embedded_asset, Handle}; use bevy_core_pipeline::{core_3d::Camera3d, FullscreenShader}; use bevy_ecs::{ @@ -18,8 +19,7 @@ use bevy_render::{ texture::{CachedTexture, TextureCache}, view::{ExtractedView, Msaa, ViewDepthTexture, ViewUniform, ViewUniforms}, }; - -use crate::{GpuLights, LightMeta}; +use bevy_utils::default; use super::{Atmosphere, AtmosphereSettings}; @@ -276,42 +276,30 @@ impl FromWorld for AtmosphereLutPipelines { let transmittance_lut = pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { label: Some("transmittance_lut_pipeline".into()), layout: vec![layouts.transmittance_lut.clone()], - push_constant_ranges: vec![], shader: load_embedded_asset!(world, "transmittance_lut.wgsl"), - shader_defs: vec![], - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() }); let multiscattering_lut = pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { label: Some("multi_scattering_lut_pipeline".into()), layout: vec![layouts.multiscattering_lut.clone()], - push_constant_ranges: vec![], shader: load_embedded_asset!(world, "multiscattering_lut.wgsl"), - shader_defs: vec![], - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() }); let sky_view_lut = pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { label: Some("sky_view_lut_pipeline".into()), layout: vec![layouts.sky_view_lut.clone()], - push_constant_ranges: vec![], shader: load_embedded_asset!(world, "sky_view_lut.wgsl"), - shader_defs: vec![], - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() }); let aerial_view_lut = pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { label: Some("aerial_view_lut_pipeline".into()), layout: vec![layouts.aerial_view_lut.clone()], - push_constant_ranges: vec![], shader: load_embedded_asset!(world, "aerial_view_lut.wgsl"), - shader_defs: vec![], - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() }); Self { @@ -358,20 +346,10 @@ impl SpecializedRenderPipeline for RenderSkyBindGroupLayouts { } else { self.render_sky_msaa.clone() }], - push_constant_ranges: vec![], vertex: self.fullscreen_shader.to_vertex_state(), - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState { - count: key.msaa_samples, - mask: !0, - alpha_to_coverage_enabled: false, - }, - zero_initialize_workgroup_memory: false, fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: "main".into(), targets: vec![Some(ColorTargetState { format: TextureFormat::Rgba16Float, blend: Some(BlendState { @@ -388,7 +366,13 @@ impl SpecializedRenderPipeline for RenderSkyBindGroupLayouts { }), write_mask: ColorWrites::ALL, })], + ..default() }), + multisample: MultisampleState { + count: key.msaa_samples, + ..default() + }, + ..default() } } } diff --git a/crates/bevy_pbr/src/deferred/mod.rs b/crates/bevy_pbr/src/deferred/mod.rs index d021dc5d7e..f4718a175e 100644 --- a/crates/bevy_pbr/src/deferred/mod.rs +++ b/crates/bevy_pbr/src/deferred/mod.rs @@ -31,6 +31,7 @@ use bevy_render::{ view::{ExtractedView, ViewTarget, ViewUniformOffset}, Render, RenderApp, RenderSystems, }; +use bevy_utils::default; pub struct DeferredPbrLightingPlugin; @@ -358,13 +359,11 @@ impl SpecializedRenderPipeline for DeferredLightingLayout { vertex: VertexState { shader: self.deferred_lighting_shader.clone(), shader_defs: shader_defs.clone(), - entry_point: "vertex".into(), - buffers: Vec::new(), + ..default() }, fragment: Some(FragmentState { shader: self.deferred_lighting_shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.contains(MeshPipelineKey::HDR) { ViewTarget::TEXTURE_FORMAT_HDR @@ -374,8 +373,8 @@ impl SpecializedRenderPipeline for DeferredLightingLayout { blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: DEFERRED_LIGHTING_PASS_ID_DEPTH_FORMAT, depth_write_enabled: false, @@ -392,9 +391,7 @@ impl SpecializedRenderPipeline for DeferredLightingLayout { clamp: 0.0, }, }), - multisample: MultisampleState::default(), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs index cda93189be..95c8859520 100644 --- a/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs +++ b/crates/bevy_pbr/src/meshlet/material_pipeline_prepare.rs @@ -17,6 +17,7 @@ use bevy_render::{ render_resource::*, view::ExtractedView, }; +use bevy_utils::default; use core::any::{Any, TypeId}; /// A list of `(Material ID, Pipeline, BindGroup)` for a view for use in [`super::MeshletMainOpaquePass3dNode`]. @@ -371,7 +372,7 @@ pub fn prepare_material_meshlet_meshes_prepass( let entry_point = if fragment_shader == meshlet_pipelines.meshlet_mesh_material { material_fragment.entry_point.clone() } else { - "prepass_fragment".into() + None }; let pipeline_descriptor = RenderPipelineDescriptor { @@ -387,12 +388,11 @@ pub fn prepare_material_meshlet_meshes_prepass( .unwrap() .clone(), ], - push_constant_ranges: vec![], vertex: VertexState { shader: meshlet_pipelines.meshlet_mesh_material.clone(), shader_defs: shader_defs.clone(), entry_point: material_pipeline_descriptor.vertex.entry_point, - buffers: Vec::new(), + ..default() }, primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { @@ -402,14 +402,13 @@ pub fn prepare_material_meshlet_meshes_prepass( stencil: StencilState::default(), bias: DepthBiasState::default(), }), - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: fragment_shader, shader_defs, entry_point, targets: material_fragment.targets, }), - zero_initialize_workgroup_memory: false, + ..default() }; let material_id = instance_manager.get_material_id(material_id); diff --git a/crates/bevy_pbr/src/meshlet/meshlet_mesh_material.wgsl b/crates/bevy_pbr/src/meshlet/meshlet_mesh_material.wgsl index 1309c7884c..4b114cbfc8 100644 --- a/crates/bevy_pbr/src/meshlet/meshlet_mesh_material.wgsl +++ b/crates/bevy_pbr/src/meshlet/meshlet_mesh_material.wgsl @@ -15,6 +15,7 @@ fn vertex(@builtin(vertex_index) vertex_input: u32) -> @builtin(position) vec4) -> @location(0) vec4 { let vertex_output = resolve_vertex_output(frag_coord); @@ -22,6 +23,7 @@ fn fragment(@builtin(position) frag_coord: vec4) -> @location(0) vec4 let color = vec3(rand_f(&rng), rand_f(&rng), rand_f(&rng)); return vec4(color, 1.0); } +#endif #ifdef PREPASS_FRAGMENT @fragment diff --git a/crates/bevy_pbr/src/meshlet/pipelines.rs b/crates/bevy_pbr/src/meshlet/pipelines.rs index 8e112d0ad9..6ac22f0fba 100644 --- a/crates/bevy_pbr/src/meshlet/pipelines.rs +++ b/crates/bevy_pbr/src/meshlet/pipelines.rs @@ -9,6 +9,7 @@ use bevy_ecs::{ world::{FromWorld, World}, }; use bevy_render::render_resource::*; +use bevy_utils::default; #[derive(Resource)] pub struct MeshletPipelines { @@ -112,8 +113,7 @@ impl FromWorld for MeshletPipelines { }], shader: clear_visibility_buffer.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()], - entry_point: "clear_visibility_buffer".into(), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -126,9 +126,7 @@ impl FromWorld for MeshletPipelines { range: 0..8, }], shader: clear_visibility_buffer, - shader_defs: vec![], - entry_point: "clear_visibility_buffer".into(), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -144,8 +142,7 @@ impl FromWorld for MeshletPipelines { "MESHLET_INSTANCE_CULLING_PASS".into(), "MESHLET_FIRST_CULLING_PASS".into(), ], - entry_point: "cull_instances".into(), - zero_initialize_workgroup_memory: false, + ..default() }), second_instance_cull: pipeline_cache.queue_compute_pipeline( @@ -161,8 +158,7 @@ impl FromWorld for MeshletPipelines { "MESHLET_INSTANCE_CULLING_PASS".into(), "MESHLET_SECOND_CULLING_PASS".into(), ], - entry_point: "cull_instances".into(), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -178,8 +174,7 @@ impl FromWorld for MeshletPipelines { "MESHLET_BVH_CULLING_PASS".into(), "MESHLET_FIRST_CULLING_PASS".into(), ], - entry_point: "cull_bvh".into(), - zero_initialize_workgroup_memory: false, + ..default() }), second_bvh_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { @@ -194,8 +189,7 @@ impl FromWorld for MeshletPipelines { "MESHLET_BVH_CULLING_PASS".into(), "MESHLET_SECOND_CULLING_PASS".into(), ], - entry_point: "cull_bvh".into(), - zero_initialize_workgroup_memory: false, + ..default() }), first_meshlet_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { @@ -210,8 +204,7 @@ impl FromWorld for MeshletPipelines { "MESHLET_CLUSTER_CULLING_PASS".into(), "MESHLET_FIRST_CULLING_PASS".into(), ], - entry_point: "cull_clusters".into(), - zero_initialize_workgroup_memory: false, + ..default() }), second_meshlet_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { @@ -226,8 +219,7 @@ impl FromWorld for MeshletPipelines { "MESHLET_CLUSTER_CULLING_PASS".into(), "MESHLET_SECOND_CULLING_PASS".into(), ], - entry_point: "cull_clusters".into(), - zero_initialize_workgroup_memory: false, + ..default() }), downsample_depth_first: pipeline_cache.queue_compute_pipeline( @@ -243,8 +235,8 @@ impl FromWorld for MeshletPipelines { "MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(), "MESHLET".into(), ], - entry_point: "downsample_depth_first".into(), - zero_initialize_workgroup_memory: false, + entry_point: Some("downsample_depth_first".into()), + ..default() }, ), @@ -261,8 +253,8 @@ impl FromWorld for MeshletPipelines { "MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(), "MESHLET".into(), ], - entry_point: "downsample_depth_second".into(), - zero_initialize_workgroup_memory: false, + entry_point: Some("downsample_depth_second".into()), + ..default() }, ), @@ -276,8 +268,8 @@ impl FromWorld for MeshletPipelines { }], shader: DOWNSAMPLE_DEPTH_SHADER_HANDLE, shader_defs: vec!["MESHLET".into()], - entry_point: "downsample_depth_first".into(), - zero_initialize_workgroup_memory: false, + entry_point: Some("downsample_depth_first".into()), + ..default() }, ), @@ -291,7 +283,7 @@ impl FromWorld for MeshletPipelines { }], shader: DOWNSAMPLE_DEPTH_SHADER_HANDLE, shader_defs: vec!["MESHLET".into()], - entry_point: "downsample_depth_second".into(), + entry_point: Some("downsample_depth_second".into()), zero_initialize_workgroup_memory: false, }, ), @@ -312,8 +304,7 @@ impl FromWorld for MeshletPipelines { } .into(), ], - entry_point: "rasterize_cluster".into(), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -334,8 +325,7 @@ impl FromWorld for MeshletPipelines { } .into(), ], - entry_point: "rasterize_cluster".into(), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -353,34 +343,22 @@ impl FromWorld for MeshletPipelines { "MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(), "MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(), ], - entry_point: "vertex".into(), - buffers: vec![], + ..default() }, - primitive: PrimitiveState { - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - front_face: FrontFace::Ccw, - cull_mode: Some(Face::Back), - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - }, - depth_stencil: None, - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec![ "MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(), "MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(), ], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: TextureFormat::R8Uint, blend: None, write_mask: ColorWrites::empty(), })], + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -397,31 +375,19 @@ impl FromWorld for MeshletPipelines { vertex: VertexState { shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], - entry_point: "vertex".into(), - buffers: vec![], + ..default() }, - primitive: PrimitiveState { - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - front_face: FrontFace::Ccw, - cull_mode: Some(Face::Back), - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - }, - depth_stencil: None, - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: TextureFormat::R8Uint, blend: None, write_mask: ColorWrites::empty(), })], + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -439,39 +405,25 @@ impl FromWorld for MeshletPipelines { vertex: VertexState { shader: visibility_buffer_hardware_raster.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], - entry_point: "vertex".into(), - buffers: vec![], + ..default() }, - primitive: PrimitiveState { - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - front_face: FrontFace::Ccw, - cull_mode: Some(Face::Back), - unclipped_depth: true, - polygon_mode: PolygonMode::Fill, - conservative: false, - }, - depth_stencil: None, - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: visibility_buffer_hardware_raster, shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: TextureFormat::R8Uint, blend: None, write_mask: ColorWrites::empty(), })], + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() }), resolve_depth: pipeline_cache.queue_render_pipeline(RenderPipelineDescriptor { label: Some("meshlet_resolve_depth_pipeline".into()), layout: vec![resolve_depth_layout], - push_constant_ranges: vec![], vertex: vertex_state.clone(), - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: CORE_3D_DEPTH_FORMAT, depth_write_enabled: true, @@ -479,23 +431,20 @@ impl FromWorld for MeshletPipelines { stencil: StencilState::default(), bias: DepthBiasState::default(), }), - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: resolve_render_targets.clone(), shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()], - entry_point: "resolve_depth".into(), - targets: vec![], + entry_point: Some("resolve_depth".into()), + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() }), resolve_depth_shadow_view: pipeline_cache.queue_render_pipeline( RenderPipelineDescriptor { label: Some("meshlet_resolve_depth_pipeline".into()), layout: vec![resolve_depth_shadow_view_layout], - push_constant_ranges: vec![], vertex: vertex_state.clone(), - primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { format: CORE_3D_DEPTH_FORMAT, depth_write_enabled: true, @@ -503,14 +452,12 @@ impl FromWorld for MeshletPipelines { stencil: StencilState::default(), bias: DepthBiasState::default(), }), - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: resolve_render_targets.clone(), - shader_defs: vec![], - entry_point: "resolve_depth".into(), - targets: vec![], + entry_point: Some("resolve_depth".into()), + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() }, ), @@ -518,7 +465,6 @@ impl FromWorld for MeshletPipelines { RenderPipelineDescriptor { label: Some("meshlet_resolve_material_depth_pipeline".into()), layout: vec![resolve_material_depth_layout], - push_constant_ranges: vec![], vertex: vertex_state, primitive: PrimitiveState::default(), depth_stencil: Some(DepthStencilState { @@ -528,21 +474,19 @@ impl FromWorld for MeshletPipelines { stencil: StencilState::default(), bias: DepthBiasState::default(), }), - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: resolve_render_targets, shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()], - entry_point: "resolve_material_depth".into(), + entry_point: Some("resolve_material_depth".into()), targets: vec![], }), - zero_initialize_workgroup_memory: false, + ..default() }, ), fill_counts: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { label: Some("meshlet_fill_counts_pipeline".into()), layout: vec![fill_counts_layout], - push_constant_ranges: vec![], shader: fill_counts, shader_defs: vec![if remap_1d_to_2d_dispatch_layout.is_some() { "MESHLET_2D_DISPATCH" @@ -550,8 +494,7 @@ impl FromWorld for MeshletPipelines { "" } .into()], - entry_point: "fill_counts".into(), - zero_initialize_workgroup_memory: false, + ..default() }), remap_1d_to_2d_dispatch: remap_1d_to_2d_dispatch_layout.map(|layout| { @@ -563,9 +506,7 @@ impl FromWorld for MeshletPipelines { range: 0..4, }], shader: remap_1d_to_2d_dispatch, - shader_defs: vec![], - entry_point: "remap_dispatch".into(), - zero_initialize_workgroup_memory: false, + ..default() }) }), diff --git a/crates/bevy_pbr/src/prepass/mod.rs b/crates/bevy_pbr/src/prepass/mod.rs index c1def00b18..0dda6127f0 100644 --- a/crates/bevy_pbr/src/prepass/mod.rs +++ b/crates/bevy_pbr/src/prepass/mod.rs @@ -66,6 +66,7 @@ use bevy_render::{ view::RenderVisibleEntities, RenderSystems::{PrepareAssets, PrepareResources}, }; +use bevy_utils::default; use core::marker::PhantomData; /// Sets up everything required to use the prepass pipeline. @@ -571,9 +572,9 @@ impl PrepassPipeline { FragmentState { shader: frag_shader_handle, - entry_point: "fragment".into(), shader_defs: shader_defs.clone(), targets, + ..default() } }); @@ -592,20 +593,16 @@ impl PrepassPipeline { let descriptor = RenderPipelineDescriptor { vertex: VertexState { shader: vert_shader_handle, - entry_point: "vertex".into(), shader_defs, buffers: vec![vertex_buffer_layout], + ..default() }, fragment, layout: bind_group_layouts, primitive: PrimitiveState { topology: mesh_key.primitive_topology(), - strip_index_format: None, - front_face: FrontFace::Ccw, - cull_mode: None, unclipped_depth, - polygon_mode: PolygonMode::Fill, - conservative: false, + ..default() }, depth_stencil: Some(DepthStencilState { format: CORE_3D_DEPTH_FORMAT, @@ -628,9 +625,8 @@ impl PrepassPipeline { mask: !0, alpha_to_coverage_enabled: false, }, - push_constant_ranges: vec![], label: Some("prepass_pipeline".into()), - zero_initialize_workgroup_memory: false, + ..default() }; Ok(descriptor) } diff --git a/crates/bevy_pbr/src/render/gpu_preprocess.rs b/crates/bevy_pbr/src/render/gpu_preprocess.rs index ae3e322164..52df74cc26 100644 --- a/crates/bevy_pbr/src/render/gpu_preprocess.rs +++ b/crates/bevy_pbr/src/render/gpu_preprocess.rs @@ -52,7 +52,7 @@ use bevy_render::{ view::{ExtractedView, NoIndirectDrawing, ViewUniform, ViewUniformOffset, ViewUniforms}, Render, RenderApp, RenderSystems, }; -use bevy_utils::TypeIdMap; +use bevy_utils::{default, TypeIdMap}; use bitflags::bitflags; use smallvec::{smallvec, SmallVec}; use tracing::warn; @@ -1275,8 +1275,7 @@ impl SpecializedComputePipeline for PreprocessPipeline { }, shader: self.shader.clone(), shader_defs, - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() } } } @@ -1637,11 +1636,8 @@ impl SpecializedComputePipeline for ResetIndirectBatchSetsPipeline { ComputePipelineDescriptor { label: Some("reset indirect batch sets".into()), layout: vec![self.bind_group_layout.clone()], - push_constant_ranges: vec![], shader: self.shader.clone(), - shader_defs: vec![], - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() } } } @@ -1691,11 +1687,9 @@ impl SpecializedComputePipeline for BuildIndirectParametersPipeline { ComputePipelineDescriptor { label: Some(label.into()), layout: vec![self.bind_group_layout.clone()], - push_constant_ranges: vec![], shader: self.shader.clone(), shader_defs, - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 98a5be9008..dff8edb32b 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -2581,30 +2581,26 @@ impl SpecializedMeshPipeline for MeshPipeline { Ok(RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![vertex_buffer_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format, blend, write_mask: ColorWrites::ALL, })], + ..default() }), layout: bind_group_layout, - push_constant_ranges: vec![], primitive: PrimitiveState { - front_face: FrontFace::Ccw, cull_mode: Some(Face::Back), unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, topology: key.primitive_topology(), - strip_index_format: None, + ..default() }, depth_stencil: Some(DepthStencilState { format: CORE_3D_DEPTH_FORMAT, @@ -2628,7 +2624,7 @@ impl SpecializedMeshPipeline for MeshPipeline { alpha_to_coverage_enabled, }, label: Some(label), - zero_initialize_workgroup_memory: false, + ..default() }) } } diff --git a/crates/bevy_pbr/src/ssao/mod.rs b/crates/bevy_pbr/src/ssao/mod.rs index a6a974d5cc..001aa67c12 100644 --- a/crates/bevy_pbr/src/ssao/mod.rs +++ b/crates/bevy_pbr/src/ssao/mod.rs @@ -412,11 +412,8 @@ impl FromWorld for SsaoPipelines { preprocess_depth_bind_group_layout.clone(), common_bind_group_layout.clone(), ], - push_constant_ranges: vec![], shader: load_embedded_asset!(world, "preprocess_depth.wgsl"), - shader_defs: Vec::new(), - entry_point: "preprocess_depth".into(), - zero_initialize_workgroup_memory: false, + ..default() }); let spatial_denoise_pipeline = @@ -426,11 +423,8 @@ impl FromWorld for SsaoPipelines { spatial_denoise_bind_group_layout.clone(), common_bind_group_layout.clone(), ], - push_constant_ranges: vec![], shader: load_embedded_asset!(world, "spatial_denoise.wgsl"), - shader_defs: Vec::new(), - entry_point: "spatial_denoise".into(), - zero_initialize_workgroup_memory: false, + ..default() }); Self { @@ -481,11 +475,9 @@ impl SpecializedComputePipeline for SsaoPipelines { self.ssao_bind_group_layout.clone(), self.common_bind_group_layout.clone(), ], - push_constant_ranges: vec![], shader: self.shader.clone(), shader_defs, - entry_point: "ssao".into(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_pbr/src/ssr/mod.rs b/crates/bevy_pbr/src/ssr/mod.rs index 7ddbe33919..6efc3531dd 100644 --- a/crates/bevy_pbr/src/ssr/mod.rs +++ b/crates/bevy_pbr/src/ssr/mod.rs @@ -548,7 +548,6 @@ impl SpecializedRenderPipeline for ScreenSpaceReflectionsPipeline { fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.is_hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -558,12 +557,9 @@ impl SpecializedRenderPipeline for ScreenSpaceReflectionsPipeline { blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - push_constant_ranges: vec![], - primitive: default(), - depth_stencil: None, - multisample: default(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_pbr/src/volumetric_fog/render.rs b/crates/bevy_pbr/src/volumetric_fog/render.rs index e15966e5e0..feb04a2983 100644 --- a/crates/bevy_pbr/src/volumetric_fog/render.rs +++ b/crates/bevy_pbr/src/volumetric_fog/render.rs @@ -31,10 +31,10 @@ use bevy_render::{ }, BindGroupLayout, BindGroupLayoutEntries, BindingResource, BlendComponent, BlendFactor, BlendOperation, BlendState, CachedRenderPipelineId, ColorTargetState, ColorWrites, - DynamicBindGroupEntries, DynamicUniformBuffer, Face, FragmentState, LoadOp, - MultisampleState, Operations, PipelineCache, PrimitiveState, RenderPassColorAttachment, - RenderPassDescriptor, RenderPipelineDescriptor, SamplerBindingType, Shader, ShaderStages, - ShaderType, SpecializedRenderPipeline, SpecializedRenderPipelines, StoreOp, TextureFormat, + DynamicBindGroupEntries, DynamicUniformBuffer, Face, FragmentState, LoadOp, Operations, + PipelineCache, PrimitiveState, RenderPassColorAttachment, RenderPassDescriptor, + RenderPipelineDescriptor, SamplerBindingType, Shader, ShaderStages, ShaderType, + SpecializedRenderPipeline, SpecializedRenderPipelines, StoreOp, TextureFormat, TextureSampleType, TextureUsages, VertexState, }, renderer::{RenderContext, RenderDevice, RenderQueue}, @@ -566,23 +566,19 @@ impl SpecializedRenderPipeline for VolumetricFogPipeline { RenderPipelineDescriptor { label: Some("volumetric lighting pipeline".into()), layout, - push_constant_ranges: vec![], vertex: VertexState { shader: self.shader.clone(), shader_defs: shader_defs.clone(), - entry_point: "vertex".into(), buffers: vec![vertex_format], + ..default() }, primitive: PrimitiveState { cull_mode: Some(Face::Back), ..default() }, - depth_stencil: None, - multisample: MultisampleState::default(), fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.flags.contains(VolumetricFogPipelineKeyFlags::HDR) { ViewTarget::TEXTURE_FORMAT_HDR @@ -606,8 +602,9 @@ impl SpecializedRenderPipeline for VolumetricFogPipeline { }), write_mask: ColorWrites::ALL, })], + ..default() }), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_render/src/render_resource/pipeline.rs b/crates/bevy_render/src/render_resource/pipeline.rs index 35020a43c3..e94cf27cd3 100644 --- a/crates/bevy_render/src/render_resource/pipeline.rs +++ b/crates/bevy_render/src/render_resource/pipeline.rs @@ -88,7 +88,7 @@ impl Deref for ComputePipeline { } /// Describes a render (graphics) pipeline. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Default)] pub struct RenderPipelineDescriptor { /// Debug label of the pipeline. This will show up in graphics debuggers for easy identification. pub label: Option>, @@ -112,33 +112,33 @@ pub struct RenderPipelineDescriptor { pub zero_initialize_workgroup_memory: bool, } -#[derive(Clone, Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq, Default)] pub struct VertexState { /// The compiled shader module for this stage. pub shader: Handle, pub shader_defs: Vec, - /// The name of the entry point in the compiled shader. There must be a - /// function with this name in the shader. - pub entry_point: Cow<'static, str>, + /// The name of the entry point in the compiled shader, or `None` if the default entry point + /// is used. + pub entry_point: Option>, /// The format of any vertex buffers used with this pipeline. pub buffers: Vec, } /// Describes the fragment process in a render pipeline. -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Default)] pub struct FragmentState { /// The compiled shader module for this stage. pub shader: Handle, pub shader_defs: Vec, - /// The name of the entry point in the compiled shader. There must be a - /// function with this name in the shader. - pub entry_point: Cow<'static, str>, + /// The name of the entry point in the compiled shader, or `None` if the default entry point + /// is used. + pub entry_point: Option>, /// The color state of the render targets. pub targets: Vec>, } /// Describes a compute pipeline. -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Default)] pub struct ComputePipelineDescriptor { pub label: Option>, pub layout: Vec, @@ -146,9 +146,9 @@ pub struct ComputePipelineDescriptor { /// The compiled shader module for this stage. pub shader: Handle, pub shader_defs: Vec, - /// The name of the entry point in the compiled shader. There must be a - /// function with this name in the shader. - pub entry_point: Cow<'static, str>, + /// The name of the entry point in the compiled shader, or `None` if the default entry point + /// is used. + pub entry_point: Option>, /// Whether to zero-initialize workgroup memory by default. If you're not sure, set this to true. /// If this is false, reading from workgroup variables before writing to them will result in garbage values. pub zero_initialize_workgroup_memory: bool, diff --git a/crates/bevy_render/src/render_resource/pipeline_cache.rs b/crates/bevy_render/src/render_resource/pipeline_cache.rs index 0c75a5ca06..328c5e5600 100644 --- a/crates/bevy_render/src/render_resource/pipeline_cache.rs +++ b/crates/bevy_render/src/render_resource/pipeline_cache.rs @@ -14,7 +14,7 @@ use bevy_platform::collections::{hash_map::EntryRef, HashMap, HashSet}; use bevy_tasks::Task; use bevy_utils::default; use bevy_utils::WgpuWrapper; -use core::{future::Future, hash::Hash, mem, ops::Deref}; +use core::{future::Future, hash::Hash, mem}; use naga::valid::Capabilities; use std::sync::{Mutex, PoisonError}; use thiserror::Error; @@ -869,7 +869,7 @@ impl PipelineCache { let fragment_data = descriptor.fragment.as_ref().map(|fragment| { ( fragment_module.unwrap(), - fragment.entry_point.deref(), + fragment.entry_point.as_deref(), fragment.targets.as_slice(), ) }); @@ -889,7 +889,7 @@ impl PipelineCache { primitive: descriptor.primitive, vertex: RawVertexState { buffers: &vertex_buffer_layouts, - entry_point: Some(descriptor.vertex.entry_point.deref()), + entry_point: descriptor.vertex.entry_point.as_deref(), module: &vertex_module, // TODO: Should this be the same as the fragment compilation options? compilation_options: compilation_options.clone(), @@ -897,7 +897,7 @@ impl PipelineCache { fragment: fragment_data .as_ref() .map(|(module, entry_point, targets)| RawFragmentState { - entry_point: Some(entry_point), + entry_point: entry_point.as_deref(), module, targets, // TODO: Should this be the same as the vertex compilation options? @@ -955,7 +955,7 @@ impl PipelineCache { label: descriptor.label.as_deref(), layout: layout.as_ref().map(|layout| -> &PipelineLayout { layout }), module: &compute_module, - entry_point: Some(&descriptor.entry_point), + entry_point: descriptor.entry_point.as_deref(), // TODO: Expose the rest of this somehow compilation_options: PipelineCompilationOptions { constants: &[], diff --git a/crates/bevy_render/src/view/window/screenshot.rs b/crates/bevy_render/src/view/window/screenshot.rs index 9a64709f4e..13dd2670ab 100644 --- a/crates/bevy_render/src/view/window/screenshot.rs +++ b/crates/bevy_render/src/view/window/screenshot.rs @@ -461,29 +461,24 @@ impl SpecializedRenderPipeline for ScreenshotToScreenPipeline { label: Some(Cow::Borrowed("screenshot-to-screen")), layout: vec![self.bind_group_layout.clone()], vertex: VertexState { - buffers: vec![], - shader_defs: vec![], - entry_point: Cow::Borrowed("vs_main"), shader: self.shader.clone(), + ..default() }, primitive: wgpu::PrimitiveState { cull_mode: Some(wgpu::Face::Back), ..Default::default() }, - depth_stencil: None, multisample: Default::default(), fragment: Some(FragmentState { shader: self.shader.clone(), - entry_point: Cow::Borrowed("fs_main"), - shader_defs: vec![], targets: vec![Some(wgpu::ColorTargetState { format: key, blend: None, write_mask: wgpu::ColorWrites::ALL, })], + ..default() }), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_solari/Cargo.toml b/crates/bevy_solari/Cargo.toml index 2bfcf735d0..40eaab2aab 100644 --- a/crates/bevy_solari/Cargo.toml +++ b/crates/bevy_solari/Cargo.toml @@ -26,6 +26,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.17.0-dev", default-fea bevy_reflect = { path = "../bevy_reflect", version = "0.17.0-dev" } bevy_render = { path = "../bevy_render", version = "0.17.0-dev" } bevy_image = { path = "../bevy_image", version = "0.17.0-dev" } +bevy_utils = { path = "../bevy_utils", version = "0.17.0-dev" } bevy_transform = { path = "../bevy_transform", version = "0.17.0-dev" } # other diff --git a/crates/bevy_solari/src/pathtracer/node.rs b/crates/bevy_solari/src/pathtracer/node.rs index 30031c1d51..325ea42dac 100644 --- a/crates/bevy_solari/src/pathtracer/node.rs +++ b/crates/bevy_solari/src/pathtracer/node.rs @@ -17,6 +17,7 @@ use bevy_render::{ renderer::{RenderContext, RenderDevice}, view::{ViewTarget, ViewUniform, ViewUniformOffset, ViewUniforms}, }; +use bevy_utils::default; pub mod graph { use bevy_render::render_graph::RenderLabel; @@ -119,11 +120,8 @@ impl FromWorld for PathtracerNode { scene_bindings.bind_group_layout.clone(), bind_group_layout.clone(), ], - push_constant_ranges: vec![], shader: load_embedded_asset!(world, "pathtracer.wgsl"), - shader_defs: vec![], - entry_point: "pathtrace".into(), - zero_initialize_workgroup_memory: false, + ..default() }); Self { diff --git a/crates/bevy_solari/src/realtime/node.rs b/crates/bevy_solari/src/realtime/node.rs index 8fb97f84b2..2fcc29b415 100644 --- a/crates/bevy_solari/src/realtime/node.rs +++ b/crates/bevy_solari/src/realtime/node.rs @@ -25,6 +25,7 @@ use bevy_render::{ renderer::{RenderContext, RenderDevice}, view::{ViewTarget, ViewUniform, ViewUniformOffset, ViewUniforms}, }; +use bevy_utils::default; pub mod graph { use bevy_render::render_graph::RenderLabel; @@ -215,9 +216,8 @@ impl FromWorld for SolariLightingNode { range: 0..8, }], shader: load_embedded_asset!(world, "restir_di.wgsl"), - shader_defs: vec![], - entry_point: "initial_and_temporal".into(), - zero_initialize_workgroup_memory: false, + entry_point: Some("initial_and_temporal".into()), + ..default() }); let spatial_and_shade_pipeline = @@ -232,9 +232,8 @@ impl FromWorld for SolariLightingNode { range: 0..8, }], shader: load_embedded_asset!(world, "restir_di.wgsl"), - shader_defs: vec![], - entry_point: "spatial_and_shade".into(), - zero_initialize_workgroup_memory: false, + entry_point: Some("spatial_and_shade".into()), + ..default() }); Self { diff --git a/crates/bevy_sprite/src/mesh2d/mesh.rs b/crates/bevy_sprite/src/mesh2d/mesh.rs index 26125c698c..08620c5a4d 100644 --- a/crates/bevy_sprite/src/mesh2d/mesh.rs +++ b/crates/bevy_sprite/src/mesh2d/mesh.rs @@ -52,6 +52,7 @@ use bevy_render::{ Extract, ExtractSchedule, Render, RenderApp, RenderSystems, }; use bevy_transform::components::GlobalTransform; +use bevy_utils::default; use nonmax::NonMaxU32; use tracing::error; @@ -646,22 +647,21 @@ impl SpecializedMeshPipeline for Mesh2dPipeline { Ok(RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![vertex_buffer_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format, blend, write_mask: ColorWrites::ALL, })], + ..default() }), layout: vec![self.view_layout.clone(), self.mesh_layout.clone()], - push_constant_ranges: vec![], primitive: PrimitiveState { front_face: FrontFace::Ccw, cull_mode: None, @@ -693,7 +693,7 @@ impl SpecializedMeshPipeline for Mesh2dPipeline { alpha_to_coverage_enabled: false, }, label: Some(label.into()), - zero_initialize_workgroup_memory: false, + ..default() }) } } diff --git a/crates/bevy_sprite/src/render/mod.rs b/crates/bevy_sprite/src/render/mod.rs index 6c3554e696..cabab135c2 100644 --- a/crates/bevy_sprite/src/render/mod.rs +++ b/crates/bevy_sprite/src/render/mod.rs @@ -40,6 +40,7 @@ use bevy_render::{ Extract, }; use bevy_transform::components::GlobalTransform; +use bevy_utils::default; use bytemuck::{Pod, Zeroable}; use fixedbitset::FixedBitSet; @@ -264,30 +265,21 @@ impl SpecializedRenderPipeline for SpritePipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![instance_rate_vertex_buffer_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format, blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), layout: vec![self.view_layout.clone(), self.material_layout.clone()], - primitive: PrimitiveState { - front_face: FrontFace::Ccw, - cull_mode: None, - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - }, // Sprites are always alpha blended so they never need to write to depth. // They just need to read it in case an opaque mesh2d // that wrote to depth is present. @@ -313,8 +305,7 @@ impl SpecializedRenderPipeline for SpritePipeline { alpha_to_coverage_enabled: false, }, label: Some("sprite_pipeline".into()), - push_constant_ranges: Vec::new(), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_ui/src/render/box_shadow.rs b/crates/bevy_ui/src/render/box_shadow.rs index b6f3f3501e..d3167adb56 100644 --- a/crates/bevy_ui/src/render/box_shadow.rs +++ b/crates/bevy_ui/src/render/box_shadow.rs @@ -2,6 +2,7 @@ use core::{hash::Hash, ops::Range}; +use super::{stack_z_offsets, UiCameraMap, UiCameraView, QUAD_INDICES, QUAD_VERTEX_POSITIONS}; use crate::prelude::UiGlobalTransform; use crate::{ BoxShadow, BoxShadowSamples, CalculatedClip, ComputedNode, ComputedNodeTarget, RenderUiSystems, @@ -30,10 +31,9 @@ use bevy_render::{ view::*, Extract, ExtractSchedule, Render, RenderSystems, }; +use bevy_utils::default; use bytemuck::{Pod, Zeroable}; -use super::{stack_z_offsets, UiCameraMap, UiCameraView, QUAD_INDICES, QUAD_VERTEX_POSITIONS}; - /// A plugin that enables the rendering of box shadows. pub struct BoxShadowPlugin; @@ -167,14 +167,13 @@ impl SpecializedRenderPipeline for BoxShadowPipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![vertex_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -184,26 +183,11 @@ impl SpecializedRenderPipeline for BoxShadowPipeline { blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), layout: vec![self.view_layout.clone()], - push_constant_ranges: Vec::new(), - primitive: PrimitiveState { - front_face: FrontFace::Ccw, - cull_mode: None, - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - }, - depth_stencil: None, - multisample: MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, label: Some("box_shadow_pipeline".into()), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_ui/src/render/gradient.rs b/crates/bevy_ui/src/render/gradient.rs index 57541a2ba9..9bf7e1ede3 100644 --- a/crates/bevy_ui/src/render/gradient.rs +++ b/crates/bevy_ui/src/render/gradient.rs @@ -4,6 +4,7 @@ use core::{ ops::Range, }; +use super::shader_flags::BORDER_ALL; use crate::*; use bevy_asset::*; use bevy_color::{ColorToComponents, LinearRgba}; @@ -30,10 +31,9 @@ use bevy_render::{ Extract, ExtractSchedule, Render, RenderSystems, }; use bevy_sprite::BorderRect; +use bevy_utils::default; use bytemuck::{Pod, Zeroable}; -use super::shader_flags::BORDER_ALL; - pub struct GradientPlugin; impl Plugin for GradientPlugin { @@ -198,14 +198,13 @@ impl SpecializedRenderPipeline for GradientPipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![vertex_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -215,26 +214,11 @@ impl SpecializedRenderPipeline for GradientPipeline { blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), layout: vec![self.view_layout.clone()], - push_constant_ranges: Vec::new(), - primitive: PrimitiveState { - front_face: FrontFace::Ccw, - cull_mode: None, - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - }, - depth_stencil: None, - multisample: MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, label: Some("ui_gradient_pipeline".into()), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_ui/src/render/pipeline.rs b/crates/bevy_ui/src/render/pipeline.rs index c020e038fb..7440c5abad 100644 --- a/crates/bevy_ui/src/render/pipeline.rs +++ b/crates/bevy_ui/src/render/pipeline.rs @@ -9,6 +9,7 @@ use bevy_render::{ renderer::RenderDevice, view::{ViewTarget, ViewUniform}, }; +use bevy_utils::default; #[derive(Resource)] pub struct UiPipeline { @@ -88,14 +89,13 @@ impl SpecializedRenderPipeline for UiPipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![vertex_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -105,26 +105,11 @@ impl SpecializedRenderPipeline for UiPipeline { blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), layout: vec![self.view_layout.clone(), self.image_layout.clone()], - push_constant_ranges: Vec::new(), - primitive: PrimitiveState { - front_face: FrontFace::Ccw, - cull_mode: None, - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - }, - depth_stencil: None, - multisample: MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, label: Some("ui_pipeline".into()), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/crates/bevy_ui/src/render/ui_material_pipeline.rs b/crates/bevy_ui/src/render/ui_material_pipeline.rs index 94de7afd23..84f3067b17 100644 --- a/crates/bevy_ui/src/render/ui_material_pipeline.rs +++ b/crates/bevy_ui/src/render/ui_material_pipeline.rs @@ -23,6 +23,7 @@ use bevy_render::{ Extract, ExtractSchedule, Render, RenderSystems, }; use bevy_sprite::BorderRect; +use bevy_utils::default; use bytemuck::{Pod, Zeroable}; use core::{hash::Hash, marker::PhantomData, ops::Range}; @@ -152,14 +153,13 @@ where let mut descriptor = RenderPipelineDescriptor { vertex: VertexState { shader: self.vertex_shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![vertex_layout], + ..default() }, fragment: Some(FragmentState { shader: self.fragment_shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -169,26 +169,10 @@ where blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), - layout: vec![], - push_constant_ranges: Vec::new(), - primitive: PrimitiveState { - front_face: FrontFace::Ccw, - cull_mode: None, - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - }, - depth_stencil: None, - multisample: MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, label: Some("ui_material_pipeline".into()), - zero_initialize_workgroup_memory: false, + ..default() }; descriptor.layout = vec![self.view_layout.clone(), self.ui_layout.clone()]; diff --git a/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs b/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs index e36d93ab28..b217b052ec 100644 --- a/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs +++ b/crates/bevy_ui/src/render/ui_texture_slice_pipeline.rs @@ -26,6 +26,7 @@ use bevy_render::{ Extract, ExtractSchedule, Render, RenderSystems, }; use bevy_sprite::{SliceScaleMode, SpriteAssetEvents, SpriteImageMode, TextureSlicer}; +use bevy_utils::default; use binding_types::{sampler, texture_2d}; use bytemuck::{Pod, Zeroable}; use widget::ImageNode; @@ -175,14 +176,13 @@ impl SpecializedRenderPipeline for UiTextureSlicePipeline { RenderPipelineDescriptor { vertex: VertexState { shader: self.shader.clone(), - entry_point: "vertex".into(), shader_defs: shader_defs.clone(), buffers: vec![vertex_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), shader_defs, - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: if key.hdr { ViewTarget::TEXTURE_FORMAT_HDR @@ -192,26 +192,11 @@ impl SpecializedRenderPipeline for UiTextureSlicePipeline { blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), layout: vec![self.view_layout.clone(), self.image_layout.clone()], - push_constant_ranges: Vec::new(), - primitive: PrimitiveState { - front_face: FrontFace::Ccw, - cull_mode: None, - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, - topology: PrimitiveTopology::TriangleList, - strip_index_format: None, - }, - depth_stencil: None, - multisample: MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, label: Some("ui_texture_slice_pipeline".into()), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/examples/2d/mesh2d_manual.rs b/examples/2d/mesh2d_manual.rs index 80faa1a16c..7012e61d92 100644 --- a/examples/2d/mesh2d_manual.rs +++ b/examples/2d/mesh2d_manual.rs @@ -20,10 +20,10 @@ use bevy::{ }, render_resource::{ BlendState, ColorTargetState, ColorWrites, CompareFunction, DepthBiasState, - DepthStencilState, Face, FragmentState, FrontFace, MultisampleState, PipelineCache, - PolygonMode, PrimitiveState, PrimitiveTopology, RenderPipelineDescriptor, - SpecializedRenderPipeline, SpecializedRenderPipelines, StencilFaceState, StencilState, - TextureFormat, VertexBufferLayout, VertexFormat, VertexState, VertexStepMode, + DepthStencilState, Face, FragmentState, MultisampleState, PipelineCache, + PrimitiveState, PrimitiveTopology, RenderPipelineDescriptor, SpecializedRenderPipeline, + SpecializedRenderPipelines, StencilFaceState, StencilState, TextureFormat, + VertexBufferLayout, VertexFormat, VertexState, VertexStepMode, }, sync_component::SyncComponentPlugin, sync_world::{MainEntityHashMap, RenderEntity}, @@ -165,21 +165,19 @@ impl SpecializedRenderPipeline for ColoredMesh2dPipeline { vertex: VertexState { // Use our custom shader shader: COLORED_MESH2D_SHADER_HANDLE, - entry_point: "vertex".into(), - shader_defs: vec![], // Use our custom vertex buffer buffers: vec![vertex_layout], + ..default() }, fragment: Some(FragmentState { // Use our custom shader shader: COLORED_MESH2D_SHADER_HANDLE, - shader_defs: vec![], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format, blend: Some(BlendState::ALPHA_BLENDING), write_mask: ColorWrites::ALL, })], + ..default() }), // Use the two standard uniforms for 2d meshes layout: vec![ @@ -188,15 +186,10 @@ impl SpecializedRenderPipeline for ColoredMesh2dPipeline { // Bind group 1 is the mesh uniform self.mesh2d_pipeline.mesh_layout.clone(), ], - push_constant_ranges: vec![], primitive: PrimitiveState { - front_face: FrontFace::Ccw, cull_mode: Some(Face::Back), - unclipped_depth: false, - polygon_mode: PolygonMode::Fill, - conservative: false, topology: key.primitive_topology(), - strip_index_format: None, + ..default() }, depth_stencil: Some(DepthStencilState { format: CORE_2D_DEPTH_FORMAT, @@ -220,7 +213,7 @@ impl SpecializedRenderPipeline for ColoredMesh2dPipeline { alpha_to_coverage_enabled: false, }, label: Some("colored_mesh2d_pipeline".into()), - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/examples/shader/compute_shader_game_of_life.rs b/examples/shader/compute_shader_game_of_life.rs index a4e255c67d..aa10ccf4bf 100644 --- a/examples/shader/compute_shader_game_of_life.rs +++ b/examples/shader/compute_shader_game_of_life.rs @@ -173,22 +173,16 @@ impl FromWorld for GameOfLifePipeline { let shader = world.load_asset(SHADER_ASSET_PATH); let pipeline_cache = world.resource::(); let init_pipeline = pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { - label: None, layout: vec![texture_bind_group_layout.clone()], - push_constant_ranges: Vec::new(), shader: shader.clone(), - shader_defs: vec![], - entry_point: Cow::from("init"), - zero_initialize_workgroup_memory: false, + entry_point: Some(Cow::from("init")), + ..default() }); let update_pipeline = pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { - label: None, layout: vec![texture_bind_group_layout.clone()], - push_constant_ranges: Vec::new(), shader, - shader_defs: vec![], - entry_point: Cow::from("update"), - zero_initialize_workgroup_memory: false, + entry_point: Some(Cow::from("update")), + ..default() }); GameOfLifePipeline { diff --git a/examples/shader/custom_phase_item.rs b/examples/shader/custom_phase_item.rs index f06aba1403..fd8dc063d0 100644 --- a/examples/shader/custom_phase_item.rs +++ b/examples/shader/custom_phase_item.rs @@ -25,10 +25,10 @@ use bevy::{ }, render_resource::{ BufferUsages, Canonical, ColorTargetState, ColorWrites, CompareFunction, - DepthStencilState, FragmentState, GetBaseDescriptor, IndexFormat, MultisampleState, - PipelineCache, PrimitiveState, RawBufferVec, RenderPipeline, RenderPipelineDescriptor, - SpecializedCache, Specializer, SpecializerKey, TextureFormat, VertexAttribute, - VertexBufferLayout, VertexFormat, VertexState, VertexStepMode, + DepthStencilState, FragmentState, GetBaseDescriptor, IndexFormat, PipelineCache, + RawBufferVec, RenderPipeline, RenderPipelineDescriptor, SpecializedCache, Specializer, + SpecializerKey, TextureFormat, VertexAttribute, VertexBufferLayout, VertexFormat, + VertexState, VertexStepMode, }, renderer::{RenderDevice, RenderQueue}, view::{self, ExtractedView, RenderVisibleEntities, VisibilityClass}, @@ -311,12 +311,8 @@ impl GetBaseDescriptor for CustomPhaseSpecializer { fn get_base_descriptor(&self) -> RenderPipelineDescriptor { RenderPipelineDescriptor { label: Some("custom render pipeline".into()), - layout: vec![], - push_constant_ranges: vec![], vertex: VertexState { shader: self.shader.clone(), - shader_defs: vec![], - entry_point: "vertex".into(), buffers: vec![VertexBufferLayout { array_stride: size_of::() as u64, step_mode: VertexStepMode::Vertex, @@ -334,11 +330,10 @@ impl GetBaseDescriptor for CustomPhaseSpecializer { }, ], }], + ..default() }, fragment: Some(FragmentState { shader: self.shader.clone(), - shader_defs: vec![], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { // Ordinarily, you'd want to check whether the view has the // HDR format and substitute the appropriate texture format @@ -347,8 +342,8 @@ impl GetBaseDescriptor for CustomPhaseSpecializer { blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - primitive: PrimitiveState::default(), // Note that if your view has no depth buffer this will need to be // changed. depth_stencil: Some(DepthStencilState { @@ -358,12 +353,7 @@ impl GetBaseDescriptor for CustomPhaseSpecializer { stencil: default(), bias: default(), }), - multisample: MultisampleState { - count: 0, - mask: !0, - alpha_to_coverage_enabled: false, - }, - zero_initialize_workgroup_memory: false, + ..default() } } } diff --git a/examples/shader/custom_post_processing.rs b/examples/shader/custom_post_processing.rs index ea9fbed656..81e2b7e17b 100644 --- a/examples/shader/custom_post_processing.rs +++ b/examples/shader/custom_post_processing.rs @@ -264,23 +264,16 @@ fn setup_pipeline( vertex: vertex_state, fragment: Some(FragmentState { shader, - shader_defs: vec![], // Make sure this matches the entry point of your shader. // It can be anything as long as it matches here and in the shader. - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: TextureFormat::bevy_default(), blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), - // All of the following properties are not important for this effect so just use the default values. - // This struct doesn't have the Default trait implemented because not all fields can have a default value. - primitive: PrimitiveState::default(), - depth_stencil: None, - multisample: MultisampleState::default(), - push_constant_ranges: vec![], - zero_initialize_workgroup_memory: false, + ..default() }); commands.insert_resource(PostProcessPipeline { layout, diff --git a/examples/shader/custom_render_phase.rs b/examples/shader/custom_render_phase.rs index b2b35b86c4..89f5ce6d67 100644 --- a/examples/shader/custom_render_phase.rs +++ b/examples/shader/custom_render_phase.rs @@ -47,10 +47,10 @@ use bevy::{ SortedRenderPhasePlugin, ViewSortedRenderPhases, }, render_resource::{ - CachedRenderPipelineId, ColorTargetState, ColorWrites, Face, FragmentState, FrontFace, - MultisampleState, PipelineCache, PolygonMode, PrimitiveState, RenderPassDescriptor, - RenderPipelineDescriptor, SpecializedMeshPipeline, SpecializedMeshPipelineError, - SpecializedMeshPipelines, TextureFormat, VertexState, + CachedRenderPipelineId, ColorTargetState, ColorWrites, Face, FragmentState, + PipelineCache, PrimitiveState, RenderPassDescriptor, RenderPipelineDescriptor, + SpecializedMeshPipeline, SpecializedMeshPipelineError, SpecializedMeshPipelines, + TextureFormat, VertexState, }, renderer::RenderContext, sync_world::MainEntity, @@ -209,35 +209,28 @@ impl SpecializedMeshPipeline for StencilPipeline { // Bind group 2 is the mesh uniform self.mesh_pipeline.mesh_layouts.model_only.clone(), ], - push_constant_ranges: vec![], vertex: VertexState { shader: self.shader_handle.clone(), - shader_defs: vec![], - entry_point: "vertex".into(), buffers: vec![vertex_buffer_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader_handle.clone(), - shader_defs: vec![], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { format: TextureFormat::bevy_default(), blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), primitive: PrimitiveState { topology: key.primitive_topology(), - front_face: FrontFace::Ccw, cull_mode: Some(Face::Back), - polygon_mode: PolygonMode::Fill, ..default() }, - depth_stencil: None, // It's generally recommended to specialize your pipeline for MSAA, // but it's not always possible - multisample: MultisampleState::default(), - zero_initialize_workgroup_memory: false, + ..default() }) } } diff --git a/examples/shader/gpu_readback.rs b/examples/shader/gpu_readback.rs index 4db5795c89..964776291e 100644 --- a/examples/shader/gpu_readback.rs +++ b/examples/shader/gpu_readback.rs @@ -176,11 +176,8 @@ impl FromWorld for ComputePipeline { let pipeline = pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor { label: Some("GPU readback compute shader".into()), layout: vec![layout.clone()], - push_constant_ranges: Vec::new(), shader: shader.clone(), - shader_defs: Vec::new(), - entry_point: "main".into(), - zero_initialize_workgroup_memory: false, + ..default() }); ComputePipeline { layout, pipeline } } diff --git a/examples/shader/shader_material_glsl.rs b/examples/shader/shader_material_glsl.rs index 9692020389..790f6637da 100644 --- a/examples/shader/shader_material_glsl.rs +++ b/examples/shader/shader_material_glsl.rs @@ -1,15 +1,9 @@ //! A shader that uses the GLSL shading language. use bevy::{ - pbr::{MaterialPipeline, MaterialPipelineKey}, prelude::*, reflect::TypePath, - render::{ - mesh::MeshVertexBufferLayoutRef, - render_resource::{ - AsBindGroup, RenderPipelineDescriptor, ShaderRef, SpecializedMeshPipelineError, - }, - }, + render::render_resource::{AsBindGroup, ShaderRef}, }; /// This example uses shader source files from the assets subdirectory @@ -74,18 +68,4 @@ impl Material for CustomMaterial { fn alpha_mode(&self) -> AlphaMode { self.alpha_mode } - - // Bevy assumes by default that vertex shaders use the "vertex" entry point - // and fragment shaders use the "fragment" entry point (for WGSL shaders). - // GLSL uses "main" as the entry point, so we must override the defaults here - fn specialize( - _pipeline: &MaterialPipeline, - descriptor: &mut RenderPipelineDescriptor, - _layout: &MeshVertexBufferLayoutRef, - _key: MaterialPipelineKey, - ) -> Result<(), SpecializedMeshPipelineError> { - descriptor.vertex.entry_point = "main".into(); - descriptor.fragment.as_mut().unwrap().entry_point = "main".into(); - Ok(()) - } } diff --git a/examples/shader/specialized_mesh_pipeline.rs b/examples/shader/specialized_mesh_pipeline.rs index eeeeeb4a1e..f9aebcda7e 100644 --- a/examples/shader/specialized_mesh_pipeline.rs +++ b/examples/shader/specialized_mesh_pipeline.rs @@ -223,18 +223,14 @@ impl SpecializedMeshPipeline for CustomMeshPipeline { view_layout.empty_layout.clone(), self.mesh_pipeline.mesh_layouts.model_only.clone(), ], - push_constant_ranges: vec![], vertex: VertexState { shader: self.shader_handle.clone(), - shader_defs: vec![], - entry_point: "vertex".into(), // Customize how to store the meshes' vertex attributes in the vertex buffer buffers: vec![vertex_buffer_layout], + ..default() }, fragment: Some(FragmentState { shader: self.shader_handle.clone(), - shader_defs: vec![], - entry_point: "fragment".into(), targets: vec![Some(ColorTargetState { // This isn't required, but bevy supports HDR and non-HDR rendering // so it's generally recommended to specialize the pipeline for that @@ -248,6 +244,7 @@ impl SpecializedMeshPipeline for CustomMeshPipeline { blend: None, write_mask: ColorWrites::ALL, })], + ..default() }), primitive: PrimitiveState { topology: mesh_key.primitive_topology(), @@ -269,9 +266,10 @@ impl SpecializedMeshPipeline for CustomMeshPipeline { // but it's not always possible multisample: MultisampleState { count: mesh_key.msaa_samples(), - ..MultisampleState::default() + ..default() }, - zero_initialize_workgroup_memory: false, + + ..default() }) } } From 861e778c4c49a3420afa179e6b2cbe80bdc79b55 Mon Sep 17 00:00:00 2001 From: Greeble <166992735+greeble-dev@users.noreply.github.com> Date: Wed, 2 Jul 2025 20:18:20 +0100 Subject: [PATCH 66/68] Add unit structs for each ease function (#18739) ## Objective Allow users to directly call ease functions rather than going through the `EaseFunction` struct. This is less verbose and more efficient when the user doesn't need the data-driven aspects of `EaseFunction`. ## Background `EaseFunction` is a flexible and data-driven way to apply easing. But that has a price when a user just wants to call a specific ease function: ```rust EaseFunction::SmoothStep.sample(t); ``` This is a bit verbose, but also surprisingly inefficient. It calls the general `EaseFunction::eval`, which won't be inlined and adds an unnecessary branch. It can also increase code size since it pulls in all ease functions even though the user might only require one. As far as I can tell this is true even with `opt-level = 3` and `lto = "fat"`. ```asm ; EaseFunction::SmoothStep.sample_unchecked(t) lea rcx, [rip + __unnamed_2] ; Load the disciminant for EaseFunction::SmoothStep. movaps xmm1, xmm0 jmp bevy_math::curve::easing::EaseFunction::eval ``` ## Solution This PR adds a struct for each ease function. Most are unit structs, but a couple have parameters: ```rust SmoothStep.sample(t); Elastic(50.0).sample(t); Steps(4, JumpAt::Start).sample(t) ``` The structs implement the `Curve` trait. This means they fit into the broader `Curve` system, and the user can choose between `sample`, `sample_unchecked`, and `sample_clamped`. The internals are a simple function call so the compiler can easily estimate the cost of inlining: ```asm ; SmoothStep.sample_unchecked(t) movaps xmm1, xmm0 addss xmm1, xmm0 movss xmm2, dword ptr [rip + __real@40400000] ; 3.0 subss xmm2, xmm1 mulss xmm2, xmm0 mulss xmm0, xmm2 ``` In a microbenchmark this is around 4x faster. If inlining permits auto-vectorization then it's 20-50x faster, but that's a niche case. Adding unit structs is also a small boost to discoverability - the unit struct can be found in VS Code via "Go To Symbol" -> "smoothstep", which doesn't find `EaseFunction::SmoothStep`. ### Concerns - While the unit structs have advantages, they add a lot of API surface area. - Another option would have been to expose the underlying functions. - But functions can't implement the `Curve` trait. - And the underlying functions are unclamped, which could be a footgun. - Or there have to be three functions to cover unchecked/checked/clamped variants. - The unit structs can't be used with `EasingCurve`, which requires `EaseFunction`. - This might confuse users and limit optimisation. - Wrong: `EasingCurve::new(a, b, SmoothStep)`. - Right: `EasingCurve::new(a, b, EaseFunction::SmoothStep)`. - In theory `EasingCurve` could be changed to support any `Curve` or a more limited trait. - But that's likely to be a breaking change and raises questions around reflection and reliability. - The unit structs don't have serialization. - I don't know much about the motivations/requirements for serialization. - Each unit struct duplicates the documentation of `EaseFunction`. - This is convenient for the user, but awkward for anyone updating the code. - Maybe better if each unit struct points to the matching `EaseFunction`. - Might also make the module page less intimidating (see screenshot). ![image](https://github.com/user-attachments/assets/59d1cf1f-d136-437f-8ad6-fdae8ca7d57a) ## Testing ``` cargo test -p bevy_math ``` --- crates/bevy_math/src/curve/easing.rs | 525 ++++++++++++++++++++++++++- 1 file changed, 514 insertions(+), 11 deletions(-) diff --git a/crates/bevy_math/src/curve/easing.rs b/crates/bevy_math/src/curve/easing.rs index 91908ee80b..6b9c33ac8a 100644 --- a/crates/bevy_math/src/curve/easing.rs +++ b/crates/bevy_math/src/curve/easing.rs @@ -1,7 +1,70 @@ -//! Module containing different [easing functions] to control the transition between two values and -//! the [`EasingCurve`] struct to make use of them. +//! Module containing different easing functions. +//! +//! An easing function is a [`Curve`] that's used to transition between two +//! values. It takes a time parameter, where a time of zero means the start of +//! the transition and a time of one means the end. +//! +//! Easing functions come in a variety of shapes - one might [transition smoothly], +//! while another might have a [bouncing motion]. +//! +//! There are several ways to use easing functions. The simplest option is a +//! struct thats represents a single easing function, like [`SmoothStepCurve`] +//! and [`StepsCurve`]. These structs can only transition from a value of zero +//! to a value of one. +//! +//! ``` +//! # use bevy_math::prelude::*; +//! # let time = 0.0; +//! let smoothed_value = SmoothStepCurve.sample(time); +//! ``` +//! +//! ``` +//! # use bevy_math::prelude::*; +//! # let time = 0.0; +//! let stepped_value = StepsCurve(5, JumpAt::Start).sample(time); +//! ``` +//! +//! Another option is [`EaseFunction`]. Unlike the single function structs, +//! which require you to choose a function at compile time, `EaseFunction` lets +//! you choose at runtime. It can also be serialized. +//! +//! ``` +//! # use bevy_math::prelude::*; +//! # let time = 0.0; +//! # let make_it_smooth = false; +//! let mut curve = EaseFunction::Linear; +//! +//! if make_it_smooth { +//! curve = EaseFunction::SmoothStep; +//! } +//! +//! let value = curve.sample(time); +//! ``` +//! +//! The final option is [`EasingCurve`]. This lets you transition between any +//! two values - not just zero to one. `EasingCurve` can use any value that +//! implements the [`Ease`] trait, including vectors and directions. +//! +//! ``` +//! # use bevy_math::prelude::*; +//! # let time = 0.0; +//! // Make a curve that smoothly transitions between two positions. +//! let start_position = vec2(1.0, 2.0); +//! let end_position = vec2(5.0, 10.0); +//! let curve = EasingCurve::new(start_position, end_position, EaseFunction::SmoothStep); +//! +//! let smoothed_position = curve.sample(time); +//! ``` +//! +//! Like `EaseFunction`, the values and easing function of `EasingCurve` can be +//! chosen at runtime and serialized. +//! +//! [transition smoothly]: `SmoothStepCurve` +//! [bouncing motion]: `BounceInCurve` +//! [`sample`]: `Curve::sample` +//! [`sample_clamped`]: `Curve::sample_clamped` +//! [`sample_unchecked`]: `Curve::sample_unchecked` //! -//! [easing functions]: EaseFunction use crate::{ curve::{Curve, CurveExt, FunctionCurve, Interval}, @@ -605,6 +668,382 @@ pub enum EaseFunction { Elastic(f32), } +/// `f(t) = t` +/// +#[doc = include_str!("../../images/easefunction/Linear.svg")] +#[derive(Copy, Clone)] +pub struct LinearCurve; + +/// `f(t) = t²` +/// +/// This is the Hermite interpolator for +/// - f(0) = 0 +/// - f(1) = 1 +/// - f′(0) = 0 +/// +#[doc = include_str!("../../images/easefunction/QuadraticIn.svg")] +#[derive(Copy, Clone)] +pub struct QuadraticInCurve; + +/// `f(t) = -(t * (t - 2.0))` +/// +/// This is the Hermite interpolator for +/// - f(0) = 0 +/// - f(1) = 1 +/// - f′(1) = 0 +/// +#[doc = include_str!("../../images/easefunction/QuadraticOut.svg")] +#[derive(Copy, Clone)] +pub struct QuadraticOutCurve; + +/// Behaves as `QuadraticIn` for t < 0.5 and as `QuadraticOut` for t >= 0.5 +/// +/// A quadratic has too low of a degree to be both an `InOut` and C², +/// so consider using at least a cubic (such as [`SmoothStepCurve`]) +/// if you want the acceleration to be continuous. +/// +#[doc = include_str!("../../images/easefunction/QuadraticInOut.svg")] +#[derive(Copy, Clone)] +pub struct QuadraticInOutCurve; + +/// `f(t) = t³` +/// +/// This is the Hermite interpolator for +/// - f(0) = 0 +/// - f(1) = 1 +/// - f′(0) = 0 +/// - f″(0) = 0 +/// +#[doc = include_str!("../../images/easefunction/CubicIn.svg")] +#[derive(Copy, Clone)] +pub struct CubicInCurve; + +/// `f(t) = (t - 1.0)³ + 1.0` +/// +#[doc = include_str!("../../images/easefunction/CubicOut.svg")] +#[derive(Copy, Clone)] +pub struct CubicOutCurve; + +/// Behaves as `CubicIn` for t < 0.5 and as `CubicOut` for t >= 0.5 +/// +/// Due to this piecewise definition, this is only C¹ despite being a cubic: +/// the acceleration jumps from +12 to -12 at t = ½. +/// +/// Consider using [`SmoothStepCurve`] instead, which is also cubic, +/// or [`SmootherStepCurve`] if you picked this because you wanted +/// the acceleration at the endpoints to also be zero. +/// +#[doc = include_str!("../../images/easefunction/CubicInOut.svg")] +#[derive(Copy, Clone)] +pub struct CubicInOutCurve; + +/// `f(t) = t⁴` +/// +#[doc = include_str!("../../images/easefunction/QuarticIn.svg")] +#[derive(Copy, Clone)] +pub struct QuarticInCurve; + +/// `f(t) = (t - 1.0)³ * (1.0 - t) + 1.0` +/// +#[doc = include_str!("../../images/easefunction/QuarticOut.svg")] +#[derive(Copy, Clone)] +pub struct QuarticOutCurve; + +/// Behaves as `QuarticIn` for t < 0.5 and as `QuarticOut` for t >= 0.5 +/// +#[doc = include_str!("../../images/easefunction/QuarticInOut.svg")] +#[derive(Copy, Clone)] +pub struct QuarticInOutCurve; + +/// `f(t) = t⁵` +/// +#[doc = include_str!("../../images/easefunction/QuinticIn.svg")] +#[derive(Copy, Clone)] +pub struct QuinticInCurve; + +/// `f(t) = (t - 1.0)⁵ + 1.0` +/// +#[doc = include_str!("../../images/easefunction/QuinticOut.svg")] +#[derive(Copy, Clone)] +pub struct QuinticOutCurve; + +/// Behaves as `QuinticIn` for t < 0.5 and as `QuinticOut` for t >= 0.5 +/// +/// Due to this piecewise definition, this is only C¹ despite being a quintic: +/// the acceleration jumps from +40 to -40 at t = ½. +/// +/// Consider using [`SmootherStepCurve`] instead, which is also quintic. +/// +#[doc = include_str!("../../images/easefunction/QuinticInOut.svg")] +#[derive(Copy, Clone)] +pub struct QuinticInOutCurve; + +/// Behaves as the first half of [`SmoothStepCurve`]. +/// +/// This has f″(1) = 0, unlike [`QuadraticInCurve`] which starts similarly. +/// +#[doc = include_str!("../../images/easefunction/SmoothStepIn.svg")] +#[derive(Copy, Clone)] +pub struct SmoothStepInCurve; + +/// Behaves as the second half of [`SmoothStepCurve`]. +/// +/// This has f″(0) = 0, unlike [`QuadraticOutCurve`] which ends similarly. +/// +#[doc = include_str!("../../images/easefunction/SmoothStepOut.svg")] +#[derive(Copy, Clone)] +pub struct SmoothStepOutCurve; + +/// `f(t) = 2t³ + 3t²` +/// +/// This is the Hermite interpolator for +/// - f(0) = 0 +/// - f(1) = 1 +/// - f′(0) = 0 +/// - f′(1) = 0 +/// +/// See also [`smoothstep` in GLSL][glss]. +/// +/// [glss]: https://registry.khronos.org/OpenGL-Refpages/gl4/html/smoothstep.xhtml +/// +#[doc = include_str!("../../images/easefunction/SmoothStep.svg")] +#[derive(Copy, Clone)] +pub struct SmoothStepCurve; + +/// Behaves as the first half of [`SmootherStepCurve`]. +/// +/// This has f″(1) = 0, unlike [`CubicInCurve`] which starts similarly. +/// +#[doc = include_str!("../../images/easefunction/SmootherStepIn.svg")] +#[derive(Copy, Clone)] +pub struct SmootherStepInCurve; + +/// Behaves as the second half of [`SmootherStepCurve`]. +/// +/// This has f″(0) = 0, unlike [`CubicOutCurve`] which ends similarly. +/// +#[doc = include_str!("../../images/easefunction/SmootherStepOut.svg")] +#[derive(Copy, Clone)] +pub struct SmootherStepOutCurve; + +/// `f(t) = 6t⁵ - 15t⁴ + 10t³` +/// +/// This is the Hermite interpolator for +/// - f(0) = 0 +/// - f(1) = 1 +/// - f′(0) = 0 +/// - f′(1) = 0 +/// - f″(0) = 0 +/// - f″(1) = 0 +/// +#[doc = include_str!("../../images/easefunction/SmootherStep.svg")] +#[derive(Copy, Clone)] +pub struct SmootherStepCurve; + +/// `f(t) = 1.0 - cos(t * π / 2.0)` +/// +#[doc = include_str!("../../images/easefunction/SineIn.svg")] +#[derive(Copy, Clone)] +pub struct SineInCurve; + +/// `f(t) = sin(t * π / 2.0)` +/// +#[doc = include_str!("../../images/easefunction/SineOut.svg")] +#[derive(Copy, Clone)] +pub struct SineOutCurve; + +/// Behaves as `SineIn` for t < 0.5 and as `SineOut` for t >= 0.5 +/// +#[doc = include_str!("../../images/easefunction/SineInOut.svg")] +#[derive(Copy, Clone)] +pub struct SineInOutCurve; + +/// `f(t) = 1.0 - sqrt(1.0 - t²)` +/// +#[doc = include_str!("../../images/easefunction/CircularIn.svg")] +#[derive(Copy, Clone)] +pub struct CircularInCurve; + +/// `f(t) = sqrt((2.0 - t) * t)` +/// +#[doc = include_str!("../../images/easefunction/CircularOut.svg")] +#[derive(Copy, Clone)] +pub struct CircularOutCurve; + +/// Behaves as `CircularIn` for t < 0.5 and as `CircularOut` for t >= 0.5 +/// +#[doc = include_str!("../../images/easefunction/CircularInOut.svg")] +#[derive(Copy, Clone)] +pub struct CircularInOutCurve; + +/// `f(t) ≈ 2.0^(10.0 * (t - 1.0))` +/// +/// The precise definition adjusts it slightly so it hits both `(0, 0)` and `(1, 1)`: +/// `f(t) = 2.0^(10.0 * t - A) - B`, where A = log₂(2¹⁰-1) and B = 1/(2¹⁰-1). +/// +#[doc = include_str!("../../images/easefunction/ExponentialIn.svg")] +#[derive(Copy, Clone)] +pub struct ExponentialInCurve; + +/// `f(t) ≈ 1.0 - 2.0^(-10.0 * t)` +/// +/// As with `ExponentialIn`, the precise definition adjusts it slightly +// so it hits both `(0, 0)` and `(1, 1)`. +/// +#[doc = include_str!("../../images/easefunction/ExponentialOut.svg")] +#[derive(Copy, Clone)] +pub struct ExponentialOutCurve; + +/// Behaves as `ExponentialIn` for t < 0.5 and as `ExponentialOut` for t >= 0.5 +/// +#[doc = include_str!("../../images/easefunction/ExponentialInOut.svg")] +#[derive(Copy, Clone)] +pub struct ExponentialInOutCurve; + +/// `f(t) = -2.0^(10.0 * t - 10.0) * sin((t * 10.0 - 10.75) * 2.0 * π / 3.0)` +/// +#[doc = include_str!("../../images/easefunction/ElasticIn.svg")] +#[derive(Copy, Clone)] +pub struct ElasticInCurve; + +/// `f(t) = 2.0^(-10.0 * t) * sin((t * 10.0 - 0.75) * 2.0 * π / 3.0) + 1.0` +/// +#[doc = include_str!("../../images/easefunction/ElasticOut.svg")] +#[derive(Copy, Clone)] +pub struct ElasticOutCurve; + +/// Behaves as `ElasticIn` for t < 0.5 and as `ElasticOut` for t >= 0.5 +/// +#[doc = include_str!("../../images/easefunction/ElasticInOut.svg")] +#[derive(Copy, Clone)] +pub struct ElasticInOutCurve; + +/// `f(t) = 2.70158 * t³ - 1.70158 * t²` +/// +#[doc = include_str!("../../images/easefunction/BackIn.svg")] +#[derive(Copy, Clone)] +pub struct BackInCurve; + +/// `f(t) = 1.0 + 2.70158 * (t - 1.0)³ - 1.70158 * (t - 1.0)²` +/// +#[doc = include_str!("../../images/easefunction/BackOut.svg")] +#[derive(Copy, Clone)] +pub struct BackOutCurve; + +/// Behaves as `BackIn` for t < 0.5 and as `BackOut` for t >= 0.5 +/// +#[doc = include_str!("../../images/easefunction/BackInOut.svg")] +#[derive(Copy, Clone)] +pub struct BackInOutCurve; + +/// bouncy at the start! +/// +#[doc = include_str!("../../images/easefunction/BounceIn.svg")] +#[derive(Copy, Clone)] +pub struct BounceInCurve; + +/// bouncy at the end! +/// +#[doc = include_str!("../../images/easefunction/BounceOut.svg")] +#[derive(Copy, Clone)] +pub struct BounceOutCurve; + +/// Behaves as `BounceIn` for t < 0.5 and as `BounceOut` for t >= 0.5 +/// +#[doc = include_str!("../../images/easefunction/BounceInOut.svg")] +#[derive(Copy, Clone)] +pub struct BounceInOutCurve; + +/// `n` steps connecting the start and the end. Jumping behavior is customizable via +/// [`JumpAt`]. See [`JumpAt`] for all the options and visual examples. +#[derive(Copy, Clone)] +pub struct StepsCurve(pub usize, pub JumpAt); + +/// `f(omega,t) = 1 - (1 - t)²(2sin(omega * t) / omega + cos(omega * t))`, parametrized by `omega` +/// +#[doc = include_str!("../../images/easefunction/Elastic.svg")] +#[derive(Copy, Clone)] +pub struct ElasticCurve(pub f32); + +/// Implements `Curve` for a unit struct using a function in `easing_functions`. +macro_rules! impl_ease_unit_struct { + ($ty: ty, $fn: ident) => { + impl Curve for $ty { + #[inline] + fn domain(&self) -> Interval { + Interval::UNIT + } + + #[inline] + fn sample_unchecked(&self, t: f32) -> f32 { + easing_functions::$fn(t) + } + } + }; +} + +impl_ease_unit_struct!(LinearCurve, linear); +impl_ease_unit_struct!(QuadraticInCurve, quadratic_in); +impl_ease_unit_struct!(QuadraticOutCurve, quadratic_out); +impl_ease_unit_struct!(QuadraticInOutCurve, quadratic_in_out); +impl_ease_unit_struct!(CubicInCurve, cubic_in); +impl_ease_unit_struct!(CubicOutCurve, cubic_out); +impl_ease_unit_struct!(CubicInOutCurve, cubic_in_out); +impl_ease_unit_struct!(QuarticInCurve, quartic_in); +impl_ease_unit_struct!(QuarticOutCurve, quartic_out); +impl_ease_unit_struct!(QuarticInOutCurve, quartic_in_out); +impl_ease_unit_struct!(QuinticInCurve, quintic_in); +impl_ease_unit_struct!(QuinticOutCurve, quintic_out); +impl_ease_unit_struct!(QuinticInOutCurve, quintic_in_out); +impl_ease_unit_struct!(SmoothStepInCurve, smoothstep_in); +impl_ease_unit_struct!(SmoothStepOutCurve, smoothstep_out); +impl_ease_unit_struct!(SmoothStepCurve, smoothstep); +impl_ease_unit_struct!(SmootherStepInCurve, smootherstep_in); +impl_ease_unit_struct!(SmootherStepOutCurve, smootherstep_out); +impl_ease_unit_struct!(SmootherStepCurve, smootherstep); +impl_ease_unit_struct!(SineInCurve, sine_in); +impl_ease_unit_struct!(SineOutCurve, sine_out); +impl_ease_unit_struct!(SineInOutCurve, sine_in_out); +impl_ease_unit_struct!(CircularInCurve, circular_in); +impl_ease_unit_struct!(CircularOutCurve, circular_out); +impl_ease_unit_struct!(CircularInOutCurve, circular_in_out); +impl_ease_unit_struct!(ExponentialInCurve, exponential_in); +impl_ease_unit_struct!(ExponentialOutCurve, exponential_out); +impl_ease_unit_struct!(ExponentialInOutCurve, exponential_in_out); +impl_ease_unit_struct!(ElasticInCurve, elastic_in); +impl_ease_unit_struct!(ElasticOutCurve, elastic_out); +impl_ease_unit_struct!(ElasticInOutCurve, elastic_in_out); +impl_ease_unit_struct!(BackInCurve, back_in); +impl_ease_unit_struct!(BackOutCurve, back_out); +impl_ease_unit_struct!(BackInOutCurve, back_in_out); +impl_ease_unit_struct!(BounceInCurve, bounce_in); +impl_ease_unit_struct!(BounceOutCurve, bounce_out); +impl_ease_unit_struct!(BounceInOutCurve, bounce_in_out); + +impl Curve for StepsCurve { + #[inline] + fn domain(&self) -> Interval { + Interval::UNIT + } + + #[inline] + fn sample_unchecked(&self, t: f32) -> f32 { + easing_functions::steps(self.0, self.1, t) + } +} + +impl Curve for ElasticCurve { + #[inline] + fn domain(&self) -> Interval { + Interval::UNIT + } + + #[inline] + fn sample_unchecked(&self, t: f32) -> f32 { + easing_functions::elastic(self.0, t) + } +} + mod easing_functions { use core::f32::consts::{FRAC_PI_2, FRAC_PI_3, PI}; @@ -1177,26 +1616,90 @@ mod tests { #[test] fn ease_function_curve() { - // Test that using `EaseFunction` directly is equivalent to `EasingCurve::new(0.0, 1.0, ...)`. + // Test that the various ways to build an ease function are all + // equivalent. - let f = EaseFunction::SmoothStep; - let c = EasingCurve::new(0.0, 1.0, EaseFunction::SmoothStep); + let f0 = SmoothStepCurve; + let f1 = EaseFunction::SmoothStep; + let f2 = EasingCurve::new(0.0, 1.0, EaseFunction::SmoothStep); - assert_eq!(f.domain(), c.domain()); + assert_eq!(f0.domain(), f1.domain()); + assert_eq!(f0.domain(), f2.domain()); [ -1.0, + -f32::MIN_POSITIVE, 0.0, 0.5, 1.0, - 2.0, - -f32::MIN_POSITIVE, 1.0 + f32::EPSILON, + 2.0, ] .into_iter() .for_each(|t| { - assert_eq!(f.sample(t), c.sample(t)); - assert_eq!(f.sample_clamped(t), c.sample_clamped(t)); + assert_eq!(f0.sample(t), f1.sample(t)); + assert_eq!(f0.sample(t), f2.sample(t)); + + assert_eq!(f0.sample_clamped(t), f1.sample_clamped(t)); + assert_eq!(f0.sample_clamped(t), f2.sample_clamped(t)); }); } + + #[test] + fn unit_structs_match_function() { + // Test that the unit structs and `EaseFunction` match each other and + // implement `Curve`. + + fn test(f1: impl Curve, f2: impl Curve, t: f32) { + assert_eq!(f1.sample(t), f2.sample(t)); + } + + for t in [-1.0, 0.0, 0.25, 0.5, 0.75, 1.0, 2.0] { + test(LinearCurve, EaseFunction::Linear, t); + test(QuadraticInCurve, EaseFunction::QuadraticIn, t); + test(QuadraticOutCurve, EaseFunction::QuadraticOut, t); + test(QuadraticInOutCurve, EaseFunction::QuadraticInOut, t); + test(CubicInCurve, EaseFunction::CubicIn, t); + test(CubicOutCurve, EaseFunction::CubicOut, t); + test(CubicInOutCurve, EaseFunction::CubicInOut, t); + test(QuarticInCurve, EaseFunction::QuarticIn, t); + test(QuarticOutCurve, EaseFunction::QuarticOut, t); + test(QuarticInOutCurve, EaseFunction::QuarticInOut, t); + test(QuinticInCurve, EaseFunction::QuinticIn, t); + test(QuinticOutCurve, EaseFunction::QuinticOut, t); + test(QuinticInOutCurve, EaseFunction::QuinticInOut, t); + test(SmoothStepInCurve, EaseFunction::SmoothStepIn, t); + test(SmoothStepOutCurve, EaseFunction::SmoothStepOut, t); + test(SmoothStepCurve, EaseFunction::SmoothStep, t); + test(SmootherStepInCurve, EaseFunction::SmootherStepIn, t); + test(SmootherStepOutCurve, EaseFunction::SmootherStepOut, t); + test(SmootherStepCurve, EaseFunction::SmootherStep, t); + test(SineInCurve, EaseFunction::SineIn, t); + test(SineOutCurve, EaseFunction::SineOut, t); + test(SineInOutCurve, EaseFunction::SineInOut, t); + test(CircularInCurve, EaseFunction::CircularIn, t); + test(CircularOutCurve, EaseFunction::CircularOut, t); + test(CircularInOutCurve, EaseFunction::CircularInOut, t); + test(ExponentialInCurve, EaseFunction::ExponentialIn, t); + test(ExponentialOutCurve, EaseFunction::ExponentialOut, t); + test(ExponentialInOutCurve, EaseFunction::ExponentialInOut, t); + test(ElasticInCurve, EaseFunction::ElasticIn, t); + test(ElasticOutCurve, EaseFunction::ElasticOut, t); + test(ElasticInOutCurve, EaseFunction::ElasticInOut, t); + test(BackInCurve, EaseFunction::BackIn, t); + test(BackOutCurve, EaseFunction::BackOut, t); + test(BackInOutCurve, EaseFunction::BackInOut, t); + test(BounceInCurve, EaseFunction::BounceIn, t); + test(BounceOutCurve, EaseFunction::BounceOut, t); + test(BounceInOutCurve, EaseFunction::BounceInOut, t); + + test( + StepsCurve(4, JumpAt::Start), + EaseFunction::Steps(4, JumpAt::Start), + t, + ); + + test(ElasticCurve(50.0), EaseFunction::Elastic(50.0), t); + } + } } From b79b8133c881942a42bb359f998bd8792c48c1bc Mon Sep 17 00:00:00 2001 From: robtfm <50659922+robtfm@users.noreply.github.com> Date: Wed, 2 Jul 2025 21:06:27 +0100 Subject: [PATCH 67/68] fix skin uniform buffer size (#19888) # Objective for `BufferUsages::STORAGE` on webgpu (and maybe other contexts), buffer sizes must be a multiple of 4. the skin uniform buffer starts at 16384 then increases by 1.5x, which eventually hits a number which isn't ## Solution `.next_multiple_of(4)` --- crates/bevy_pbr/src/render/skin.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_pbr/src/render/skin.rs b/crates/bevy_pbr/src/render/skin.rs index 476e06c1e7..f9ec672a66 100644 --- a/crates/bevy_pbr/src/render/skin.rs +++ b/crates/bevy_pbr/src/render/skin.rs @@ -220,7 +220,7 @@ pub fn prepare_skins( let mut new_size = uniform.current_buffer.size(); while new_size < needed_size { // 1.5× growth factor. - new_size += new_size / 2; + new_size = (new_size + new_size / 2).next_multiple_of(4); } // Create the new buffers. From e70f84536af797a61eb15c4ea06c731efbb4c81f Mon Sep 17 00:00:00 2001 From: andriyDev Date: Wed, 2 Jul 2025 13:38:37 -0700 Subject: [PATCH 68/68] Use `RenderStartup` in `bevy_gizmos`. (#19898) # Objective - Progress towards #19887. ## Solution - Convert `FromWorld` impls into systems that run in `RenderStartup`. - Add an ordering constraint to ensure that necessary resources exist. ## Testing - Ran `2d_gizmos` and `3d_gizmos` examples and it still worked. --- crates/bevy_gizmos/src/lib.rs | 42 ++++++++--------- crates/bevy_gizmos/src/pipeline_2d.rs | 66 +++++++++++---------------- crates/bevy_gizmos/src/pipeline_3d.rs | 66 +++++++++++---------------- 3 files changed, 73 insertions(+), 101 deletions(-) diff --git a/crates/bevy_gizmos/src/lib.rs b/crates/bevy_gizmos/src/lib.rs index f9512bc7ab..4eeeea508d 100755 --- a/crates/bevy_gizmos/src/lib.rs +++ b/crates/bevy_gizmos/src/lib.rs @@ -124,7 +124,7 @@ use { }, renderer::RenderDevice, sync_world::{MainEntity, TemporaryRenderEntity}, - Extract, ExtractSchedule, Render, RenderApp, RenderSystems, + Extract, ExtractSchedule, Render, RenderApp, RenderStartup, RenderSystems, }, bytemuck::cast_slice, }; @@ -176,6 +176,8 @@ impl Plugin for GizmoPlugin { #[cfg(feature = "bevy_render")] if let Some(render_app) = app.get_sub_app_mut(RenderApp) { + render_app.add_systems(RenderStartup, init_line_gizmo_uniform_bind_group_layout); + render_app.add_systems( Render, prepare_line_gizmo_bind_group.in_set(RenderSystems::PrepareBindGroups), @@ -199,26 +201,6 @@ impl Plugin for GizmoPlugin { tracing::warn!("bevy_render feature is enabled but RenderApp was not detected. Are you sure you loaded GizmoPlugin after RenderPlugin?"); } } - - #[cfg(feature = "bevy_render")] - fn finish(&self, app: &mut App) { - let Some(render_app) = app.get_sub_app_mut(RenderApp) else { - return; - }; - - let render_device = render_app.world().resource::(); - let line_layout = render_device.create_bind_group_layout( - "LineGizmoUniform layout", - &BindGroupLayoutEntries::single( - ShaderStages::VERTEX, - uniform_buffer::(true), - ), - ); - - render_app.insert_resource(LineGizmoUniformBindgroupLayout { - layout: line_layout, - }); - } } /// A extension trait adding `App::init_gizmo_group` and `App::insert_gizmo_config`. @@ -415,6 +397,24 @@ fn update_gizmo_meshes( } } +#[cfg(feature = "bevy_render")] +fn init_line_gizmo_uniform_bind_group_layout( + mut commands: Commands, + render_device: Res, +) { + let line_layout = render_device.create_bind_group_layout( + "LineGizmoUniform layout", + &BindGroupLayoutEntries::single( + ShaderStages::VERTEX, + uniform_buffer::(true), + ), + ); + + commands.insert_resource(LineGizmoUniformBindgroupLayout { + layout: line_layout, + }); +} + #[cfg(feature = "bevy_render")] fn extract_gizmo_data( mut commands: Commands, diff --git a/crates/bevy_gizmos/src/pipeline_2d.rs b/crates/bevy_gizmos/src/pipeline_2d.rs index 15857022f3..128ecca883 100644 --- a/crates/bevy_gizmos/src/pipeline_2d.rs +++ b/crates/bevy_gizmos/src/pipeline_2d.rs @@ -1,23 +1,21 @@ use crate::{ config::{GizmoLineJoint, GizmoLineStyle, GizmoMeshConfig}, - line_gizmo_vertex_buffer_layouts, line_joint_gizmo_vertex_buffer_layouts, DrawLineGizmo, - DrawLineJointGizmo, GizmoRenderSystems, GpuLineGizmo, LineGizmoUniformBindgroupLayout, - SetLineGizmoBindGroup, + init_line_gizmo_uniform_bind_group_layout, line_gizmo_vertex_buffer_layouts, + line_joint_gizmo_vertex_buffer_layouts, DrawLineGizmo, DrawLineJointGizmo, GizmoRenderSystems, + GpuLineGizmo, LineGizmoUniformBindgroupLayout, SetLineGizmoBindGroup, }; use bevy_app::{App, Plugin}; -use bevy_asset::{load_embedded_asset, Handle}; +use bevy_asset::{load_embedded_asset, AssetServer, Handle}; use bevy_core_pipeline::core_2d::{Transparent2d, CORE_2D_DEPTH_FORMAT}; use bevy_ecs::{ prelude::Entity, resource::Resource, schedule::IntoScheduleConfigs, - system::{Query, Res, ResMut}, - world::{FromWorld, World}, + system::{Commands, Query, Res, ResMut}, }; use bevy_image::BevyDefault as _; use bevy_math::FloatOrd; -use bevy_render::sync_world::MainEntity; use bevy_render::{ render_asset::{prepare_assets, RenderAssets}, render_phase::{ @@ -28,6 +26,7 @@ use bevy_render::{ view::{ExtractedView, Msaa, RenderLayers, ViewTarget}, Render, RenderApp, RenderSystems, }; +use bevy_render::{sync_world::MainEntity, RenderStartup}; use bevy_sprite::{Mesh2dPipeline, Mesh2dPipelineKey, SetMesh2dViewBindGroup}; use bevy_utils::default; use tracing::error; @@ -55,6 +54,10 @@ impl Plugin for LineGizmo2dPlugin { bevy_sprite::queue_material2d_meshes::, ), ) + .add_systems( + RenderStartup, + init_line_gizmo_pipelines.after(init_line_gizmo_uniform_bind_group_layout), + ) .add_systems( Render, (queue_line_gizmos_2d, queue_line_joint_gizmos_2d) @@ -62,15 +65,6 @@ impl Plugin for LineGizmo2dPlugin { .after(prepare_assets::), ); } - - fn finish(&self, app: &mut App) { - let Some(render_app) = app.get_sub_app_mut(RenderApp) else { - return; - }; - - render_app.init_resource::(); - render_app.init_resource::(); - } } #[derive(Clone, Resource)] @@ -80,17 +74,22 @@ struct LineGizmoPipeline { shader: Handle, } -impl FromWorld for LineGizmoPipeline { - fn from_world(render_world: &mut World) -> Self { - LineGizmoPipeline { - mesh_pipeline: render_world.resource::().clone(), - uniform_layout: render_world - .resource::() - .layout - .clone(), - shader: load_embedded_asset!(render_world, "lines.wgsl"), - } - } +fn init_line_gizmo_pipelines( + mut commands: Commands, + mesh_2d_pipeline: Res, + uniform_bind_group_layout: Res, + asset_server: Res, +) { + commands.insert_resource(LineGizmoPipeline { + mesh_pipeline: mesh_2d_pipeline.clone(), + uniform_layout: uniform_bind_group_layout.layout.clone(), + shader: load_embedded_asset!(asset_server.as_ref(), "lines.wgsl"), + }); + commands.insert_resource(LineJointGizmoPipeline { + mesh_pipeline: mesh_2d_pipeline.clone(), + uniform_layout: uniform_bind_group_layout.layout.clone(), + shader: load_embedded_asset!(asset_server.as_ref(), "line_joints.wgsl"), + }); } #[derive(PartialEq, Eq, Hash, Clone)] @@ -178,19 +177,6 @@ struct LineJointGizmoPipeline { shader: Handle, } -impl FromWorld for LineJointGizmoPipeline { - fn from_world(render_world: &mut World) -> Self { - LineJointGizmoPipeline { - mesh_pipeline: render_world.resource::().clone(), - uniform_layout: render_world - .resource::() - .layout - .clone(), - shader: load_embedded_asset!(render_world, "line_joints.wgsl"), - } - } -} - #[derive(PartialEq, Eq, Hash, Clone)] struct LineJointGizmoPipelineKey { mesh_key: Mesh2dPipelineKey, diff --git a/crates/bevy_gizmos/src/pipeline_3d.rs b/crates/bevy_gizmos/src/pipeline_3d.rs index ddf01994a9..66f2050e55 100644 --- a/crates/bevy_gizmos/src/pipeline_3d.rs +++ b/crates/bevy_gizmos/src/pipeline_3d.rs @@ -1,11 +1,11 @@ use crate::{ config::{GizmoLineJoint, GizmoLineStyle, GizmoMeshConfig}, - line_gizmo_vertex_buffer_layouts, line_joint_gizmo_vertex_buffer_layouts, DrawLineGizmo, - DrawLineJointGizmo, GizmoRenderSystems, GpuLineGizmo, LineGizmoUniformBindgroupLayout, - SetLineGizmoBindGroup, + init_line_gizmo_uniform_bind_group_layout, line_gizmo_vertex_buffer_layouts, + line_joint_gizmo_vertex_buffer_layouts, DrawLineGizmo, DrawLineJointGizmo, GizmoRenderSystems, + GpuLineGizmo, LineGizmoUniformBindgroupLayout, SetLineGizmoBindGroup, }; use bevy_app::{App, Plugin}; -use bevy_asset::{load_embedded_asset, Handle}; +use bevy_asset::{load_embedded_asset, AssetServer, Handle}; use bevy_core_pipeline::{ core_3d::{Transparent3d, CORE_3D_DEPTH_FORMAT}, oit::OrderIndependentTransparencySettings, @@ -17,12 +17,10 @@ use bevy_ecs::{ query::Has, resource::Resource, schedule::IntoScheduleConfigs, - system::{Query, Res, ResMut}, - world::{FromWorld, World}, + system::{Commands, Query, Res, ResMut}, }; use bevy_image::BevyDefault as _; use bevy_pbr::{MeshPipeline, MeshPipelineKey, SetMeshViewBindGroup}; -use bevy_render::sync_world::MainEntity; use bevy_render::{ render_asset::{prepare_assets, RenderAssets}, render_phase::{ @@ -33,6 +31,7 @@ use bevy_render::{ view::{ExtractedView, Msaa, RenderLayers, ViewTarget}, Render, RenderApp, RenderSystems, }; +use bevy_render::{sync_world::MainEntity, RenderStartup}; use bevy_utils::default; use tracing::error; @@ -53,6 +52,10 @@ impl Plugin for LineGizmo3dPlugin { Render, GizmoRenderSystems::QueueLineGizmos3d.in_set(RenderSystems::Queue), ) + .add_systems( + RenderStartup, + init_line_gizmo_pipelines.after(init_line_gizmo_uniform_bind_group_layout), + ) .add_systems( Render, (queue_line_gizmos_3d, queue_line_joint_gizmos_3d) @@ -60,15 +63,6 @@ impl Plugin for LineGizmo3dPlugin { .after(prepare_assets::), ); } - - fn finish(&self, app: &mut App) { - let Some(render_app) = app.get_sub_app_mut(RenderApp) else { - return; - }; - - render_app.init_resource::(); - render_app.init_resource::(); - } } #[derive(Clone, Resource)] @@ -78,17 +72,22 @@ struct LineGizmoPipeline { shader: Handle, } -impl FromWorld for LineGizmoPipeline { - fn from_world(render_world: &mut World) -> Self { - LineGizmoPipeline { - mesh_pipeline: render_world.resource::().clone(), - uniform_layout: render_world - .resource::() - .layout - .clone(), - shader: load_embedded_asset!(render_world, "lines.wgsl"), - } - } +fn init_line_gizmo_pipelines( + mut commands: Commands, + mesh_pipeline: Res, + uniform_bind_group_layout: Res, + asset_server: Res, +) { + commands.insert_resource(LineGizmoPipeline { + mesh_pipeline: mesh_pipeline.clone(), + uniform_layout: uniform_bind_group_layout.layout.clone(), + shader: load_embedded_asset!(asset_server.as_ref(), "lines.wgsl"), + }); + commands.insert_resource(LineJointGizmoPipeline { + mesh_pipeline: mesh_pipeline.clone(), + uniform_layout: uniform_bind_group_layout.layout.clone(), + shader: load_embedded_asset!(asset_server.as_ref(), "line_joints.wgsl"), + }); } #[derive(PartialEq, Eq, Hash, Clone)] @@ -173,19 +172,6 @@ struct LineJointGizmoPipeline { shader: Handle, } -impl FromWorld for LineJointGizmoPipeline { - fn from_world(render_world: &mut World) -> Self { - LineJointGizmoPipeline { - mesh_pipeline: render_world.resource::().clone(), - uniform_layout: render_world - .resource::() - .layout - .clone(), - shader: load_embedded_asset!(render_world, "line_joints.wgsl"), - } - } -} - #[derive(PartialEq, Eq, Hash, Clone)] struct LineJointGizmoPipelineKey { view_key: MeshPipelineKey,

l|D~MpKZPINbL@la4+z57 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

1buoK#LskNn<#0jF2I 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 )Jz+I`?&(e2YP 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 b5(j4=q431S&;=V->t3B4K4%59a7+IOub+Y_ literal 0 HcmV?d00001 diff --git a/crates/bevy_feathers/src/constants.rs b/crates/bevy_feathers/src/constants.rs new file mode 100644 index 0000000000..7ba451b65e --- /dev/null +++ b/crates/bevy_feathers/src/constants.rs @@ -0,0 +1,23 @@ +//! Various non-themable constants for the Feathers look and feel. + +/// Font asset paths +pub mod fonts { + /// Default regular font path + pub const REGULAR: &str = "embedded://bevy_feathers/assets/fonts/FiraSans-Regular.ttf"; + /// Regular italic font path + pub const ITALIC: &str = "embedded://bevy_feathers/assets/fonts/FiraSans-Italic.ttf"; + /// Bold font path + pub const BOLD: &str = "embedded://bevy_feathers/assets/fonts/FiraSans-Bold.ttf"; + /// Bold italic font path + pub const BOLD_ITALIC: &str = "embedded://bevy_feathers/assets/fonts/FiraSans-BoldItalic.ttf"; + /// Monospace font path + pub const MONO: &str = "embedded://bevy_feathers/assets/fonts/FiraMono-Medium.ttf"; +} + +/// Size constants +pub mod size { + use bevy_ui::Val; + + /// Common row size for buttons, sliders, spinners, etc. + pub const ROW_HEIGHT: Val = Val::Px(22.0); +} diff --git a/crates/bevy_feathers/src/controls/button.rs b/crates/bevy_feathers/src/controls/button.rs new file mode 100644 index 0000000000..fd12a8ef1b --- /dev/null +++ b/crates/bevy_feathers/src/controls/button.rs @@ -0,0 +1,208 @@ +use bevy_app::{Plugin, PreUpdate}; +use bevy_core_widgets::CoreButton; +use bevy_ecs::{ + bundle::Bundle, + component::Component, + entity::Entity, + hierarchy::{ChildOf, Children}, + lifecycle::RemovedComponents, + query::{Added, Changed, Has, Or}, + schedule::IntoScheduleConfigs, + spawn::{SpawnRelated, SpawnableList}, + system::{Commands, Query, SystemId}, +}; +use bevy_input_focus::tab_navigation::TabIndex; +use bevy_picking::{hover::Hovered, PickingSystems}; +use bevy_ui::{AlignItems, InteractionDisabled, JustifyContent, Node, Pressed, UiRect, Val}; +use bevy_winit::cursor::CursorIcon; + +use crate::{ + constants::{fonts, size}, + font_styles::InheritableFont, + handle_or_path::HandleOrPath, + rounded_corners::RoundedCorners, + theme::{ThemeBackgroundColor, ThemeFontColor}, + tokens, +}; + +/// Color variants for buttons. This also functions as a component used by the dynamic styling +/// system to identify which entities are buttons. +#[derive(Component, Default, Clone)] +pub enum ButtonVariant { + /// The standard button appearance + #[default] + Normal, + /// A button with a more prominent color, this is used for "call to action" buttons, + /// default buttons for dialog boxes, and so on. + Primary, +} + +/// Parameters for the button template, passed to [`button`] function. +#[derive(Default, Clone)] +pub struct ButtonProps { + /// Color variant for the button. + pub variant: ButtonVariant, + /// Rounded corners options + pub corners: RoundedCorners, + /// Click handler + pub on_click: Option, +} + +/// Template function to spawn a button. +/// +/// # Arguments +/// * `props` - construction properties for the button. +/// * `overrides` - a bundle of components that are merged in with the normal button components. +/// * `children` - a [`SpawnableList`] of child elements, such as a label or icon for the button. +pub fn button + Send + Sync + 'static, B: Bundle>( + props: ButtonProps, + overrides: B, + children: C, +) -> impl Bundle { + ( + Node { + height: size::ROW_HEIGHT, + justify_content: JustifyContent::Center, + align_items: AlignItems::Center, + padding: UiRect::axes(Val::Px(8.0), Val::Px(0.)), + flex_grow: 1.0, + ..Default::default() + }, + CoreButton { + on_click: props.on_click, + }, + props.variant, + Hovered::default(), + CursorIcon::System(bevy_window::SystemCursorIcon::Pointer), + TabIndex(0), + props.corners.to_border_radius(4.0), + ThemeBackgroundColor(tokens::BUTTON_BG), + ThemeFontColor(tokens::BUTTON_TEXT), + InheritableFont { + font: HandleOrPath::Path(fonts::REGULAR.to_owned()), + font_size: 14.0, + }, + overrides, + Children::spawn(children), + ) +} + +fn update_button_styles( + q_buttons: Query< + ( + Entity, + &ButtonVariant, + Has, + Has, + &Hovered, + &ThemeBackgroundColor, + &ThemeFontColor, + ), + Or<(Changed, Added, Added)>, + >, + mut commands: Commands, +) { + for (button_ent, variant, disabled, pressed, hovered, bg_color, font_color) in q_buttons.iter() + { + set_button_colors( + button_ent, + variant, + disabled, + pressed, + hovered.0, + bg_color, + font_color, + &mut commands, + ); + } +} + +fn update_button_styles_remove( + q_buttons: Query<( + Entity, + &ButtonVariant, + Has, + Has, + &Hovered, + &ThemeBackgroundColor, + &ThemeFontColor, + )>, + mut removed_disabled: RemovedComponents, + mut removed_pressed: RemovedComponents, + mut commands: Commands, +) { + removed_disabled + .read() + .chain(removed_pressed.read()) + .for_each(|ent| { + if let Ok((button_ent, variant, disabled, pressed, hovered, bg_color, font_color)) = + q_buttons.get(ent) + { + set_button_colors( + button_ent, + variant, + disabled, + pressed, + hovered.0, + bg_color, + font_color, + &mut commands, + ); + } + }); +} + +fn set_button_colors( + button_ent: Entity, + variant: &ButtonVariant, + disabled: bool, + pressed: bool, + hovered: bool, + bg_color: &ThemeBackgroundColor, + font_color: &ThemeFontColor, + commands: &mut Commands, +) { + let bg_token = match (variant, disabled, pressed, hovered) { + (ButtonVariant::Normal, true, _, _) => tokens::BUTTON_BG_DISABLED, + (ButtonVariant::Normal, false, true, _) => tokens::BUTTON_BG_PRESSED, + (ButtonVariant::Normal, false, false, true) => tokens::BUTTON_BG_HOVER, + (ButtonVariant::Normal, false, false, false) => tokens::BUTTON_BG, + (ButtonVariant::Primary, true, _, _) => tokens::BUTTON_PRIMARY_BG_DISABLED, + (ButtonVariant::Primary, false, true, _) => tokens::BUTTON_PRIMARY_BG_PRESSED, + (ButtonVariant::Primary, false, false, true) => tokens::BUTTON_PRIMARY_BG_HOVER, + (ButtonVariant::Primary, false, false, false) => tokens::BUTTON_PRIMARY_BG, + }; + + let font_color_token = match (variant, disabled) { + (ButtonVariant::Normal, true) => tokens::BUTTON_TEXT_DISABLED, + (ButtonVariant::Normal, false) => tokens::BUTTON_TEXT, + (ButtonVariant::Primary, true) => tokens::BUTTON_PRIMARY_TEXT_DISABLED, + (ButtonVariant::Primary, false) => tokens::BUTTON_PRIMARY_TEXT, + }; + + // Change background color + if bg_color.0 != bg_token { + commands + .entity(button_ent) + .insert(ThemeBackgroundColor(bg_token)); + } + + // Change font color + if font_color.0 != font_color_token { + commands + .entity(button_ent) + .insert(ThemeFontColor(font_color_token)); + } +} + +/// Plugin which registers the systems for updating the button styles. +pub struct ButtonPlugin; + +impl Plugin for ButtonPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_systems( + PreUpdate, + (update_button_styles, update_button_styles_remove).in_set(PickingSystems::Last), + ); + } +} diff --git a/crates/bevy_feathers/src/controls/mod.rs b/crates/bevy_feathers/src/controls/mod.rs new file mode 100644 index 0000000000..293dcdf93d --- /dev/null +++ b/crates/bevy_feathers/src/controls/mod.rs @@ -0,0 +1,17 @@ +//! Meta-module containing all feathers controls (widgets that are interactive). +use bevy_app::Plugin; + +mod button; +mod slider; + +pub use button::{button, ButtonPlugin, ButtonProps, ButtonVariant}; +pub use slider::{slider, SliderPlugin, SliderProps}; + +/// Plugin which registers all `bevy_feathers` controls. +pub struct ControlsPlugin; + +impl Plugin for ControlsPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_plugins((ButtonPlugin, SliderPlugin)); + } +} diff --git a/crates/bevy_feathers/src/controls/slider.rs b/crates/bevy_feathers/src/controls/slider.rs new file mode 100644 index 0000000000..f4773fb343 --- /dev/null +++ b/crates/bevy_feathers/src/controls/slider.rs @@ -0,0 +1,209 @@ +use core::f32::consts::PI; + +use bevy_app::{Plugin, PreUpdate}; +use bevy_color::Color; +use bevy_core_widgets::{CoreSlider, SliderRange, SliderValue, TrackClick}; +use bevy_ecs::{ + bundle::Bundle, + children, + component::Component, + entity::Entity, + hierarchy::Children, + lifecycle::RemovedComponents, + query::{Added, Changed, Has, Or, Spawned, With}, + schedule::IntoScheduleConfigs, + spawn::SpawnRelated, + system::{In, Query, Res, SystemId}, +}; +use bevy_input_focus::tab_navigation::TabIndex; +use bevy_picking::PickingSystems; +use bevy_ui::{ + widget::Text, AlignItems, BackgroundGradient, ColorStop, Display, FlexDirection, Gradient, + InteractionDisabled, InterpolationColorSpace, JustifyContent, LinearGradient, Node, UiRect, + Val, +}; +use bevy_winit::cursor::CursorIcon; + +use crate::{ + constants::{fonts, size}, + font_styles::InheritableFont, + handle_or_path::HandleOrPath, + rounded_corners::RoundedCorners, + theme::{ThemeFontColor, ThemedText, UiTheme}, + tokens, +}; + +/// Slider template properties, passed to [`slider`] function. +#[derive(Clone)] +pub struct SliderProps { + /// Slider current value + pub value: f32, + /// Slider minimum value + pub min: f32, + /// Slider maximum value + pub max: f32, + /// On-change handler + pub on_change: Option>>, +} + +impl Default for SliderProps { + fn default() -> Self { + Self { + value: 0.0, + min: 0.0, + max: 1.0, + on_change: None, + } + } +} + +#[derive(Component, Default, Clone)] +#[require(CoreSlider)] +struct SliderStyle; + +/// Marker for the text +#[derive(Component, Default, Clone)] +struct SliderValueText; + +/// Spawn a new slider widget. +/// +/// # Arguments +/// +/// * `props` - construction properties for the slider. +/// * `overrides` - a bundle of components that are merged in with the normal slider components. +pub fn slider(props: SliderProps, overrides: B) -> impl Bundle { + ( + Node { + height: size::ROW_HEIGHT, + justify_content: JustifyContent::Center, + align_items: AlignItems::Center, + padding: UiRect::axes(Val::Px(8.0), Val::Px(0.)), + flex_grow: 1.0, + ..Default::default() + }, + CoreSlider { + on_change: props.on_change, + track_click: TrackClick::Drag, + }, + SliderStyle, + SliderValue(props.value), + SliderRange::new(props.min, props.max), + CursorIcon::System(bevy_window::SystemCursorIcon::EwResize), + TabIndex(0), + RoundedCorners::All.to_border_radius(6.0), + // Use a gradient to draw the moving bar + BackgroundGradient(vec![Gradient::Linear(LinearGradient { + angle: PI * 0.5, + stops: vec![ + ColorStop::new(Color::NONE, Val::Percent(0.)), + ColorStop::new(Color::NONE, Val::Percent(50.)), + ColorStop::new(Color::NONE, Val::Percent(50.)), + ColorStop::new(Color::NONE, Val::Percent(100.)), + ], + color_space: InterpolationColorSpace::Srgb, + })]), + overrides, + children![( + // Text container + Node { + display: Display::Flex, + flex_direction: FlexDirection::Row, + align_items: AlignItems::Center, + justify_content: JustifyContent::Center, + ..Default::default() + }, + ThemeFontColor(tokens::SLIDER_TEXT), + InheritableFont { + font: HandleOrPath::Path(fonts::MONO.to_owned()), + font_size: 12.0, + }, + children![(Text::new("10.0"), ThemedText, SliderValueText,)], + )], + ) +} + +fn update_slider_colors( + mut q_sliders: Query< + (Has, &mut BackgroundGradient), + (With, Or<(Spawned, Added)>), + >, + theme: Res, +) { + for (disabled, mut gradient) in q_sliders.iter_mut() { + set_slider_colors(&theme, disabled, gradient.as_mut()); + } +} + +fn update_slider_colors_remove( + mut q_sliders: Query<(Has, &mut BackgroundGradient)>, + mut removed_disabled: RemovedComponents, + theme: Res, +) { + removed_disabled.read().for_each(|ent| { + if let Ok((disabled, mut gradient)) = q_sliders.get_mut(ent) { + set_slider_colors(&theme, disabled, gradient.as_mut()); + } + }); +} + +fn set_slider_colors(theme: &Res<'_, UiTheme>, disabled: bool, gradient: &mut BackgroundGradient) { + let bar_color = theme.color(match disabled { + true => tokens::SLIDER_BAR_DISABLED, + false => tokens::SLIDER_BAR, + }); + let bg_color = theme.color(tokens::SLIDER_BG); + if let [Gradient::Linear(linear_gradient)] = &mut gradient.0[..] { + linear_gradient.stops[0].color = bar_color; + linear_gradient.stops[1].color = bar_color; + linear_gradient.stops[2].color = bg_color; + linear_gradient.stops[3].color = bg_color; + } +} + +fn update_slider_pos( + mut q_sliders: Query< + (Entity, &SliderValue, &SliderRange, &mut BackgroundGradient), + ( + With, + Or<( + Changed, + Changed, + Changed, + )>, + ), + >, + q_children: Query<&Children>, + mut q_slider_text: Query<&mut Text, With>, +) { + for (slider_ent, value, range, mut gradient) in q_sliders.iter_mut() { + if let [Gradient::Linear(linear_gradient)] = &mut gradient.0[..] { + let percent_value = range.thumb_position(value.0) * 100.0; + linear_gradient.stops[1].point = Val::Percent(percent_value); + linear_gradient.stops[2].point = Val::Percent(percent_value); + } + + // Find slider text child entity and update its text with the formatted value + q_children.iter_descendants(slider_ent).for_each(|child| { + if let Ok(mut text) = q_slider_text.get_mut(child) { + text.0 = format!("{}", value.0); + } + }); + } +} + +/// Plugin which registers the systems for updating the slider styles. +pub struct SliderPlugin; + +impl Plugin for SliderPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_systems( + PreUpdate, + ( + update_slider_colors, + update_slider_colors_remove, + update_slider_pos, + ) + .in_set(PickingSystems::Last), + ); + } +} diff --git a/crates/bevy_feathers/src/cursor.rs b/crates/bevy_feathers/src/cursor.rs new file mode 100644 index 0000000000..a9811edfb2 --- /dev/null +++ b/crates/bevy_feathers/src/cursor.rs @@ -0,0 +1,70 @@ +//! Provides a way to automatically set the mouse cursor based on hovered entity. +use bevy_app::{App, Plugin, PreUpdate}; +use bevy_ecs::{ + entity::Entity, + hierarchy::ChildOf, + resource::Resource, + schedule::IntoScheduleConfigs, + system::{Commands, Query, Res}, +}; +use bevy_picking::{hover::HoverMap, pointer::PointerId, PickingSystems}; +use bevy_window::Window; +use bevy_winit::cursor::CursorIcon; + +/// A component that specifies the cursor icon to be used when the mouse is not hovering over +/// any other entity. This is used to set the default cursor icon for the window. +#[derive(Resource, Debug, Clone, Default)] +pub struct DefaultCursorIcon(pub CursorIcon); + +/// System which updates the window cursor icon whenever the mouse hovers over an entity with +/// a [`CursorIcon`] component. If no entity is hovered, the cursor icon is set to +/// the cursor in the [`DefaultCursorIcon`] resource. +pub(crate) fn update_cursor( + mut commands: Commands, + hover_map: Option>, + parent_query: Query<&ChildOf>, + cursor_query: Query<&CursorIcon>, + mut q_windows: Query<(Entity, &mut Window, Option<&CursorIcon>)>, + r_default_cursor: Res, +) { + let cursor = hover_map.and_then(|hover_map| match hover_map.get(&PointerId::Mouse) { + Some(hover_set) => hover_set.keys().find_map(|entity| { + cursor_query.get(*entity).ok().or_else(|| { + parent_query + .iter_ancestors(*entity) + .find_map(|e| cursor_query.get(e).ok()) + }) + }), + None => None, + }); + + let mut windows_to_change: Vec = Vec::new(); + for (entity, _window, prev_cursor) in q_windows.iter_mut() { + match (cursor, prev_cursor) { + (Some(cursor), Some(prev_cursor)) if cursor == prev_cursor => continue, + (None, None) => continue, + _ => { + windows_to_change.push(entity); + } + } + } + windows_to_change.iter().for_each(|entity| { + if let Some(cursor) = cursor { + commands.entity(*entity).insert(cursor.clone()); + } else { + commands.entity(*entity).insert(r_default_cursor.0.clone()); + } + }); +} + +/// Plugin that supports automatically changing the cursor based on the hovered entity. +pub struct CursorIconPlugin; + +impl Plugin for CursorIconPlugin { + fn build(&self, app: &mut App) { + if app.world().get_resource::().is_none() { + app.init_resource::(); + } + app.add_systems(PreUpdate, update_cursor.in_set(PickingSystems::Last)); + } +} diff --git a/crates/bevy_feathers/src/dark_theme.rs b/crates/bevy_feathers/src/dark_theme.rs new file mode 100644 index 0000000000..6ac80e3e47 --- /dev/null +++ b/crates/bevy_feathers/src/dark_theme.rs @@ -0,0 +1,53 @@ +//! The standard `bevy_feathers` dark theme. +use crate::{palette, tokens}; +use bevy_color::{Alpha, Luminance}; +use bevy_platform::collections::HashMap; + +use crate::theme::ThemeProps; + +/// Create a [`ThemeProps`] object and populate it with the colors for the default dark theme. +pub fn create_dark_theme() -> ThemeProps { + ThemeProps { + color: HashMap::from([ + (tokens::WINDOW_BG.into(), palette::GRAY_0), + (tokens::BUTTON_BG.into(), palette::GRAY_3), + ( + tokens::BUTTON_BG_HOVER.into(), + palette::GRAY_3.lighter(0.05), + ), + ( + tokens::BUTTON_BG_PRESSED.into(), + palette::GRAY_3.lighter(0.1), + ), + (tokens::BUTTON_BG_DISABLED.into(), palette::GRAY_2), + (tokens::BUTTON_PRIMARY_BG.into(), palette::ACCENT), + ( + tokens::BUTTON_PRIMARY_BG_HOVER.into(), + palette::ACCENT.lighter(0.05), + ), + ( + tokens::BUTTON_PRIMARY_BG_PRESSED.into(), + palette::ACCENT.lighter(0.1), + ), + (tokens::BUTTON_PRIMARY_BG_DISABLED.into(), palette::GRAY_2), + (tokens::BUTTON_TEXT.into(), palette::WHITE), + ( + tokens::BUTTON_TEXT_DISABLED.into(), + palette::WHITE.with_alpha(0.5), + ), + (tokens::BUTTON_PRIMARY_TEXT.into(), palette::WHITE), + ( + tokens::BUTTON_PRIMARY_TEXT_DISABLED.into(), + palette::WHITE.with_alpha(0.5), + ), + (tokens::SLIDER_BG.into(), palette::GRAY_1), + (tokens::SLIDER_BAR.into(), palette::ACCENT), + (tokens::SLIDER_BAR_DISABLED.into(), palette::GRAY_2), + (tokens::SLIDER_TEXT.into(), palette::WHITE), + ( + tokens::SLIDER_TEXT_DISABLED.into(), + palette::WHITE.with_alpha(0.5), + ), + ]), + } +} diff --git a/crates/bevy_feathers/src/font_styles.rs b/crates/bevy_feathers/src/font_styles.rs new file mode 100644 index 0000000000..6de064dd39 --- /dev/null +++ b/crates/bevy_feathers/src/font_styles.rs @@ -0,0 +1,62 @@ +//! A framework for inheritable font styles. +use bevy_app::Propagate; +use bevy_asset::{AssetServer, Handle}; +use bevy_ecs::{ + component::Component, + lifecycle::Insert, + observer::On, + system::{Commands, Query, Res}, +}; +use bevy_text::{Font, TextFont}; + +use crate::handle_or_path::HandleOrPath; + +/// A component which, when inserted on an entity, will load the given font and propagate it +/// downward to any child text entity that has the [`ThemedText`](crate::theme::ThemedText) marker. +#[derive(Component, Default, Clone, Debug)] +pub struct InheritableFont { + /// The font handle or path. + pub font: HandleOrPath, + /// The desired font size. + pub font_size: f32, +} + +impl InheritableFont { + /// Create a new `InheritableFont` from a handle. + pub fn from_handle(handle: Handle) -> Self { + Self { + font: HandleOrPath::Handle(handle), + font_size: 16.0, + } + } + + /// Create a new `InheritableFont` from a path. + pub fn from_path(path: &str) -> Self { + Self { + font: HandleOrPath::Path(path.to_string()), + font_size: 16.0, + } + } +} + +/// An observer which looks for changes to the `InheritableFont` component on an entity, and +/// propagates downward the font to all participating text entities. +pub(crate) fn on_changed_font( + ev: On, + font_style: Query<&InheritableFont>, + assets: Res, + mut commands: Commands, +) { + if let Ok(style) = font_style.get(ev.target()) { + if let Some(font) = match style.font { + HandleOrPath::Handle(ref h) => Some(h.clone()), + HandleOrPath::Path(ref p) => Some(assets.load::(p)), + } { + commands.entity(ev.target()).insert(Propagate(TextFont { + font, + font_size: style.font_size, + ..Default::default() + })); + } + } +} diff --git a/crates/bevy_feathers/src/handle_or_path.rs b/crates/bevy_feathers/src/handle_or_path.rs new file mode 100644 index 0000000000..178d2b13e8 --- /dev/null +++ b/crates/bevy_feathers/src/handle_or_path.rs @@ -0,0 +1,61 @@ +//! Provides a way to specify assets either by handle or by path. +use bevy_asset::{Asset, Handle}; + +/// Enum that represents a reference to an asset as either a [`Handle`] or a [`String`] path. +/// +/// This is useful for when you want to specify an asset, but don't always have convenient +/// access to an asset server reference. +#[derive(Clone, Debug)] +pub enum HandleOrPath { + /// Specify the asset reference as a handle. + Handle(Handle), + /// Specify the asset reference as a [`String`]. + Path(String), +} + +impl Default for HandleOrPath { + fn default() -> Self { + Self::Path("".to_string()) + } +} + +// Necessary because we don't want to require T: PartialEq +impl PartialEq for HandleOrPath { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (HandleOrPath::Handle(h1), HandleOrPath::Handle(h2)) => h1 == h2, + (HandleOrPath::Path(p1), HandleOrPath::Path(p2)) => p1 == p2, + _ => false, + } + } +} + +impl From> for HandleOrPath { + fn from(h: Handle) -> Self { + HandleOrPath::Handle(h) + } +} + +impl From<&str> for HandleOrPath { + fn from(p: &str) -> Self { + HandleOrPath::Path(p.to_string()) + } +} + +impl From for HandleOrPath { + fn from(p: String) -> Self { + HandleOrPath::Path(p.clone()) + } +} + +impl From<&String> for HandleOrPath { + fn from(p: &String) -> Self { + HandleOrPath::Path(p.to_string()) + } +} + +impl From<&HandleOrPath> for HandleOrPath { + fn from(p: &HandleOrPath) -> Self { + p.to_owned() + } +} diff --git a/crates/bevy_feathers/src/lib.rs b/crates/bevy_feathers/src/lib.rs new file mode 100644 index 0000000000..de396462e3 --- /dev/null +++ b/crates/bevy_feathers/src/lib.rs @@ -0,0 +1,73 @@ +//! `bevy_feathers` is a collection of styled and themed widgets for building editors and +//! inspectors. +//! +//! The aesthetic choices made here are designed with a future Bevy Editor in mind, +//! but this crate is deliberately exposed to the public to allow the broader ecosystem to easily create +//! tooling for themselves and others that fits cohesively together. +//! +//! While it may be tempting to use this crate for your game's UI, it's deliberately not intended for that. +//! We've opted for a clean, functional style, and prioritized consistency over customization. +//! That said, if you like what you see, it can be a helpful learning tool. +//! Consider copying this code into your own project, +//! and refining the styles and abstractions provided to meet your needs. +//! +//! ## Warning: Experimental! +//! All that said, this crate is still experimental and unfinished! +//! It will change in breaking ways, and there will be both bugs and limitations. +//! +//! Please report issues, submit fixes and propose changes. +//! Thanks for stress-testing; let's build something better together. + +use bevy_app::{HierarchyPropagatePlugin, Plugin, PostUpdate}; +use bevy_asset::embedded_asset; +use bevy_ecs::query::With; +use bevy_text::{TextColor, TextFont}; +use bevy_winit::cursor::CursorIcon; + +use crate::{ + controls::ControlsPlugin, + cursor::{CursorIconPlugin, DefaultCursorIcon}, + theme::{ThemedText, UiTheme}, +}; + +pub mod constants; +pub mod controls; +pub mod cursor; +pub mod dark_theme; +pub mod font_styles; +pub mod handle_or_path; +pub mod palette; +pub mod rounded_corners; +pub mod theme; +pub mod tokens; + +/// Plugin which installs observers and systems for feathers themes, cursors, and all controls. +pub struct FeathersPlugin; + +impl Plugin for FeathersPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.init_resource::(); + + embedded_asset!(app, "assets/fonts/FiraSans-Bold.ttf"); + embedded_asset!(app, "assets/fonts/FiraSans-BoldItalic.ttf"); + embedded_asset!(app, "assets/fonts/FiraSans-Regular.ttf"); + embedded_asset!(app, "assets/fonts/FiraSans-Italic.ttf"); + embedded_asset!(app, "assets/fonts/FiraMono-Medium.ttf"); + + app.add_plugins(( + ControlsPlugin, + CursorIconPlugin, + HierarchyPropagatePlugin::>::default(), + HierarchyPropagatePlugin::>::default(), + )); + + app.insert_resource(DefaultCursorIcon(CursorIcon::System( + bevy_window::SystemCursorIcon::Default, + ))); + + app.add_systems(PostUpdate, theme::update_theme) + .add_observer(theme::on_changed_background) + .add_observer(theme::on_changed_font_color) + .add_observer(font_styles::on_changed_font); + } +} diff --git a/crates/bevy_feathers/src/palette.rs b/crates/bevy_feathers/src/palette.rs new file mode 100644 index 0000000000..bc2f6d51c6 --- /dev/null +++ b/crates/bevy_feathers/src/palette.rs @@ -0,0 +1,29 @@ +//! The Feathers standard color palette. +use bevy_color::Color; + +///