From ca68084264502b12a5629757a845df8b1f8aa4d9 Mon Sep 17 00:00:00 2001 From: BobSong <605277374@qq.com> Date: Thu, 8 Jan 2026 22:30:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=B0=B4=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AnimEditor/player_umotion_project.asset | 848 +++++------ Assets/ResRaw/Maps/Map1/Map1.unity | 135 +- .../{Water Chunk1.prefab => Chunk 1.prefab} | 5 +- ...Chunk1.prefab.meta => Chunk 1.prefab.meta} | 2 +- Assets/ResRaw/Water/Water 1.mat | 107 ++ .../{Water1.mat.meta => Water 1.mat.meta} | 2 +- Assets/ResRaw/Water/Water1.mat | 250 ---- .../Boats/Prefabs/Boats_BoatScene.prefab | 75 +- .../Boats/Prefabs/Boats_BoatsScene.prefab | 75 +- .../Examples/Materials/Examples_Water.mat | 2 +- .../Examples/Prefabs/Examples_Scenes.prefab | 74 +- .../Examples_OverrideGlobalWaves.prefab | 5 +- .../Scenes/Examples_ShaderGraphInput.prefab | 51 - .../Scenes/Examples_TrochoidalWaves.prefab | 5 +- .../Scenes/Examples_WaveComparison.prefab | 9 +- .../Prefabs/Scenes/Examples_WavePatch.prefab | 4 +- .../5.4.2/Examples/Scenes/Examples.unity | 161 +-- .../Scenes/Examples/LightingData.asset | Bin 17729 -> 17729 bytes .../Examples/Shaders/Sine Wave.shadergraph | 279 +--- .../Sprites/MaterialIcons/ArrowLeft.png.meta | 26 + .../Sprites/MaterialIcons/ArrowRight.png.meta | 26 + .../Sprites/MaterialIcons/Flask.png.meta | 26 + .../Crest/5.4.2/Main/Materials/Main_Water.mat | 2 +- .../5.4.2/Main/Prefabs/Main_Scene.prefab | 78 +- .../5.4.2/Main/Scenes/Main/LightingData.asset | Bin 17729 -> 17729 bytes .../5.4.2/Ripples/Materials/Ripples_Water.mat | 2 +- .../Crest/5.4.2/Ripples/Scenes/Ripples.unity | 306 ++-- .../5.4.2/Ripples/Scripts/RippleGenerator.cs | 2 +- .../5.4.2/Wakes/Materials/Wakes_Water.mat | 2 +- .../5.4.2/Wakes/Prefabs/Wakes_Scene.prefab | 77 +- .../Data/EditorUndoStackPointer.asset | 4 +- .../Documentation~/API.pdf | Bin 734588 -> 737497 bytes .../Documentation~/Manual.pdf | Bin 990845 -> 1058503 bytes .../Editor/Icons/Logomark.png.meta | 26 + .../Editor/Scripts/BuildProcessor.cs | 58 +- .../Editor/Scripts/Editors.cs | 27 +- .../Editor/Scripts/Gizmos.cs | 31 +- .../Editor/Scripts/Integrations.meta | 8 + .../Editor/Scripts/Integrations/Gaia.meta | 8 + .../Scripts/Integrations/Gaia/Assembly.cs | 6 + .../Integrations/Gaia/Assembly.cs.meta | 11 + .../Scripts/Integrations/Gaia/GRC_Crest.cs | 259 ++++ .../Integrations/Gaia/GRC_Crest.cs.meta | 11 + ...WaveHarmonic.Crest.Integration.Gaia.asmdef | 32 + ...armonic.Crest.Integration.Gaia.asmdef.meta | 7 + .../Editor/Scripts/MaterialDrawers.cs | 2 +- .../Editor/Scripts/MaterialTooltips.cs | 29 +- .../Editor/Scripts/Previews.cs | 39 +- .../Editor/Scripts/ProjectSettings.cs | 88 +- ...eHarmonic.Crest.Editor.Requirements.asmdef | 14 +- .../Editor/Scripts/ShaderSettings.cs | 47 +- .../Utility/Shared/Attributes/Attributes.cs | 53 +- .../Utility/Shared/Attributes/Embedded.cs | 12 +- .../Utility/Shared/Attributes/HelpBox.cs | 2 +- .../Utility/Shared/Attributes/Layer.cs | 2 +- .../Utility/Shared/Attributes/Predicated.cs | 12 +- .../Scripts/Utility/Shared/DecoratedDrawer.cs | 18 +- .../Utility/Shared/EmbeddedAssetHelpers.cs | 47 +- .../Editor/Scripts/Utility/Shared/Helpers.cs | 262 +++- .../Utility/Shared/Inspector.Validation.cs | 207 +-- .../Scripts/Utility/Shared/Inspector.cs | 38 +- .../Utility/Shared/ScriptingSymbols.cs | 75 + .../Utility/Shared/ScriptingSymbols.cs.meta | 11 + .../Shared/ShaderGraphLegacySubTarget.cs | 739 ++++++++++ .../Shared/ShaderGraphLegacySubTarget.cs.meta | 11 + .../Scripts/Utility/Shared/TexturePreview.cs | 29 +- .../Scripts/Utility/Shared/Validation.cs | 4 +- .../Editor/Scripts/Validators.cs | 279 +++- .../Scripts/WaveHarmonic.Crest.Editor.asmdef | 5 + .../Editor/Shaders/Templates.meta | 8 + .../Templates/SharedCode.template.hlsl | 6 + .../Templates/SharedCode.template.hlsl.meta | 7 + .../Shaders/VisualizeNegativeValues.compute | 2 +- .../Editor/Shaders/WaterLevel.shader | 3 - .../Editor/Shaders/WaterProxy.shader | 3 +- .../Runtime/Data/WaveSpectra/WavesSwell.asset | 67 + .../Data/WaveSpectra/WavesSwell.asset.meta | 8 + .../Runtime/Materials/Meniscus.mat | 35 + .../Runtime/Materials/Meniscus.mat.meta | 8 + .../Runtime/Materials/Water (Flow).mat | 92 ++ .../Runtime/Materials/Water (Flow).mat.meta | 8 + .../Runtime/Materials/Water Volume.mat | 9 +- .../Runtime/Materials/Water.mat | 13 +- .../Runtime/Scripts/Constants.cs | 4 +- .../Runtime/Scripts/Data/AbsorptionLod.cs | 7 +- .../Runtime/Scripts/Data/AlbedoLod.cs | 2 +- .../Runtime/Scripts/Data/AnimatedWavesLod.cs | 105 +- .../Runtime/Scripts/Data/ClipLod.cs | 13 +- .../Runtime/Scripts/Data/ColorLod.cs | 19 +- .../Runtime/Scripts/Data/DepthLod.cs | 82 +- .../Runtime/Scripts/Data/DynamicWavesLod.cs | 5 +- .../Runtime/Scripts/Data/FlowLod.cs | 3 +- .../Runtime/Scripts/Data/FoamLod.cs | 4 +- .../Scripts/Data/Generated/Lod.Generated.cs | 47 + .../Scripts/Data/Input/AbsorptionLodInput.cs | 2 +- .../Scripts/Data/Input/AlbedoLodInput.cs | 2 +- .../Data/Input/AnimatedWavesLodInput.cs | 2 +- .../Scripts/Data/Input/DepthLodInput.cs | 4 +- .../Runtime/Scripts/Data/Input/DepthProbe.cs | 128 +- .../Data/Input/DynamicWavesLodInput.cs | 2 +- .../Scripts/Data/Input/FlowLodInput.cs | 2 +- .../Scripts/Data/Input/FoamLodInput.cs | 2 +- .../Data/Input/GeometryLodInputData.cs | 2 + .../Scripts/Data/Input/LevelLodInput.cs | 2 +- .../Runtime/Scripts/Data/Input/LodInput.cs | 4 +- .../Scripts/Data/Input/LodInputData.cs | 103 +- .../Runtime/Scripts/Data/Input/Probe.meta | 8 + .../Input/Probe/DepthProbe.HighDefinition.cs | 54 + .../Probe/DepthProbe.HighDefinition.cs.meta | 11 + .../Data/Input/Probe/DepthProbe.Universal.cs | 24 + .../Input/Probe/DepthProbe.Universal.cs.meta | 11 + .../Data/Input/RendererLodInputData.cs | 31 +- .../Scripts/Data/Input/ScatteringLodInput.cs | 2 +- .../Scripts/Data/Input/ShadowLodInput.cs | 2 +- .../Scripts/Data/Input/Shape/ShapeFFT.cs | 124 +- .../Scripts/Data/Input/Shape/ShapeGerstner.cs | 183 ++- .../Scripts/Data/Input/Shape/ShapeWaves.cs | 116 +- .../Data/Input/SphereWaterInteraction.cs | 2 +- .../Scripts/Data/Input/TextureLodInputData.cs | 6 + .../Scripts/Data/Input/WatertightHull.cs | 9 +- .../Runtime/Scripts/Data/LevelLod.cs | 3 +- .../Runtime/Scripts/Data/Lod.cs | 122 +- .../Runtime/Scripts/Data/PersistentLod.cs | 23 +- .../Collision/CollisionAreaVisualizer.cs | 85 +- .../Data/Query/Collision/CollisionProvider.cs | 15 +- .../Data/Query/Collision/CollisionQuery.cs | 37 +- .../Data/Query/Collision/RayTraceHelper.cs | 2 +- .../Query/Collision/RayTraceVisualizer.cs | 5 +- .../Scripts/Data/Query/Depth/DepthProvider.cs | 2 +- .../Scripts/Data/Query/Depth/DepthQuery.cs | 2 +- .../Scripts/Data/Query/Flow/FlowProvider.cs | 2 +- .../Scripts/Data/Query/Flow/FlowQuery.cs | 2 +- .../Runtime/Scripts/Data/Query/Query.cs | 16 +- .../Runtime/Scripts/Data/Query/QueryEvents.cs | 16 +- .../Scripts/Data/Query/SamplingHelpers.cs | 6 +- .../Runtime/Scripts/Data/SampleShadowsHDRP.cs | 62 +- .../Data/SampleShadowsURP.RenderGraph.cs | 6 +- .../Runtime/Scripts/Data/SampleShadowsURP.cs | 64 +- .../Runtime/Scripts/Data/ScatteringLod.cs | 7 +- .../Data/Settings/DynamicWavesLodSettings.cs | 2 +- .../Scripts/Data/Settings/FoamLodSettings.cs | 2 +- .../Scripts/Data/Settings/LodSettings.cs | 2 +- .../Runtime/Scripts/Data/ShadowLod.Legacy.cs | 119 ++ .../Scripts/Data/ShadowLod.Legacy.cs.meta | 11 + .../Runtime/Scripts/Data/ShadowLod.cs | 280 ++-- .../Runtime/Scripts/Debug/DebugGUI.cs | 8 +- .../Runtime/Scripts/Deprecated.cs | 154 ++ .../Runtime/Scripts/Deprecated.cs.meta | 11 + .../Scripts/Generated/API.Generated.cs | 220 ++- .../Generated/Documentation.Generated.cs | 453 ++++++ .../Generated/Documentation.Generated.cs.meta | 11 + .../Scripts/Interaction/FloatingObject.cs | 28 +- .../Runtime/Scripts/Mask.meta | 8 + .../Mask/MaskRenderer.HighDefinition.cs | 97 ++ .../Mask/MaskRenderer.HighDefinition.cs.meta | 11 + .../Scripts/Mask/MaskRenderer.Legacy.cs | 63 + .../Scripts/Mask/MaskRenderer.Legacy.cs.meta | 11 + .../Scripts/Mask/MaskRenderer.Universal.cs | 103 ++ .../Mask/MaskRenderer.Universal.cs.meta | 11 + .../Runtime/Scripts/Mask/MaskRenderer.cs | 314 ++++ .../Runtime/Scripts/Mask/MaskRenderer.cs.meta | 11 + .../Runtime/Scripts/Meniscus.meta | 8 + .../Scripts/Meniscus/Meniscus.Editor.cs | 32 + .../Scripts/Meniscus/Meniscus.Editor.cs.meta | 11 + .../Meniscus/Meniscus.HighDefinition.cs | 88 ++ .../Meniscus/Meniscus.HighDefinition.cs.meta | 11 + .../Scripts/Meniscus/Meniscus.Legacy.cs | 57 + .../Scripts/Meniscus/Meniscus.Legacy.cs.meta | 11 + .../Scripts/Meniscus/Meniscus.Universal.cs | 118 ++ .../Meniscus/Meniscus.Universal.cs.meta | 11 + .../Runtime/Scripts/Meniscus/Meniscus.cs | 250 ++++ .../Runtime/Scripts/Meniscus/Meniscus.cs.meta | 11 + .../Runtime/Scripts/Scripting/Extensions.cs | 2 +- .../Surface/SurfaceRenderer.Displaced.cs | 215 +++ .../Surface/SurfaceRenderer.Displaced.cs.meta | 11 + .../Scripts/Surface/SurfaceRenderer.Editor.cs | 50 + .../Surface/SurfaceRenderer.Editor.cs.meta | 11 + .../Surface/SurfaceRenderer.HighDefinition.cs | 133 ++ .../SurfaceRenderer.HighDefinition.cs.meta | 11 + .../Scripts/Surface/SurfaceRenderer.Legacy.cs | 243 ++++ .../Surface/SurfaceRenderer.Legacy.cs.meta | 11 + ...nderer.LevelDepthTexture.HighDefinition.cs | 70 + ...r.LevelDepthTexture.HighDefinition.cs.meta | 11 + ...urfaceRenderer.LevelDepthTexture.Legacy.cs | 40 + ...eRenderer.LevelDepthTexture.Legacy.cs.meta | 11 + ...aceRenderer.LevelDepthTexture.Universal.cs | 86 ++ ...nderer.LevelDepthTexture.Universal.cs.meta | 11 + .../SurfaceRenderer.LevelDepthTexture.cs | 84 ++ .../SurfaceRenderer.LevelDepthTexture.cs.meta | 11 + .../Surface/SurfaceRenderer.Universal.cs | 163 +++ .../Surface/SurfaceRenderer.Universal.cs.meta | 11 + .../Scripts/Surface/SurfaceRenderer.cs | 858 +++++++++++ .../Scripts/Surface/SurfaceRenderer.cs.meta | 11 + .../Runtime/Scripts/Surface/WaterBody.cs | 7 +- .../Runtime/Scripts/Surface/WaterBuilder.cs | 884 ++++++------ .../Scripts/Surface/WaterChunkRenderer.cs | 272 ++-- .../Scripts/Surface/WaterReflections.cs | 104 +- .../Scripts/Time/CustomTimeProvider.cs | 66 +- .../Scripts/Time/CutsceneTimeProvider.cs | 2 +- .../Scripts/Time/DefaultTimeProvider.cs | 6 +- .../Scripts/Time/NetworkedTimeProvider.cs | 2 +- .../Runtime/Scripts/Time/TimeProvider.cs | 2 +- .../Runtime/Scripts/Uniforms.cs | 29 + .../Bridges/Unity.RenderPipelines.Core.meta | 8 + .../Unity.RenderPipelines.Core/Runtime.meta | 8 + .../Runtime/Assembly.cs | 7 + .../Runtime/Assembly.cs.meta | 11 + .../Runtime/WaveHarmonic.Crest.Bridge.asmref | 3 + .../WaveHarmonic.Crest.Bridge.asmref.meta | 7 + .../Runtime/Assembly.cs | 1 + .../Utility/Shared/Collections/SortedList.cs | 12 +- .../Utility/Shared/Component/Attributes.cs | 23 +- .../Shared/Component/EditorBehaviour.cs | 12 +- .../Runtime/Scripts/Utility/Shared/Debug.meta | 8 + .../Scripts/Utility/Shared/Debug/Debug.cs | 29 + .../Utility/Shared/Debug/Debug.cs.meta | 11 + .../Runtime/Scripts/Utility/Shared/Helpers.cs | 134 +- .../Shared/Rendering/CommandWrapper.cs | 111 ++ .../Shared/Rendering/CommandWrapper.cs.meta | 11 + .../Shared/Rendering/CustomPassHelpers.cs | 37 +- .../Shared/Rendering/LightProbeUtility.cs | 52 + .../Rendering/LightProbeUtility.cs.meta | 11 + .../Shared/Rendering/PropertyWrapper.cs | 2 +- .../Utility/Shared/Rendering/RTHandles.cs | 37 + .../Shared/Rendering/RTHandles.cs.meta | 11 + .../Shared/Rendering/RenderGraphUtility.cs | 38 +- .../Utility/Shared/Rendering/Rendering.XR.cs | 260 ++++ .../Shared/Rendering/Rendering.XR.cs.meta | 11 + .../Utility/Shared/Rendering/Rendering.cs | 124 ++ .../Shared/Rendering/Rendering.cs.meta | 11 + .../Shared/Rendering/TextureArrayHelpers.cs | 4 +- .../Shared/WaveHarmonic.Crest.Shared.asmdef | 5 + .../Scripts/Utility/Shared/XR/XRHelpers.cs | 183 +-- .../Scripts/Volume/UnderwaterEffectPass.cs | 42 +- .../Volume/UnderwaterEffectPassHDRP.cs | 73 +- .../UnderwaterEffectPassURP.RenderGraph.cs | 94 +- .../Scripts/Volume/UnderwaterEffectPassURP.cs | 174 +-- .../Scripts/Volume/UnderwaterMaskPass.cs | 138 -- .../Scripts/Volume/UnderwaterMaskPassHDRP.cs | 76 - .../Scripts/Volume/UnderwaterMaskPassURP.cs | 104 -- .../Volume/UnderwaterRenderer.Editor.cs | 2 +- .../Volume/UnderwaterRenderer.Effect.cs | 243 ++-- ...nderwaterRenderer.EnvironmentalLighting.cs | 26 +- .../Volume/UnderwaterRenderer.Legacy.cs | 63 +- .../Scripts/Volume/UnderwaterRenderer.Mask.cs | 250 ++-- .../Scripts/Volume/UnderwaterRenderer.cs | 187 ++- .../Runtime/Scripts/WaterRenderer.Editor.cs | 38 +- .../Scripts/WaterRenderer.HighDefinition.cs | 306 ++++ .../WaterRenderer.HighDefinition.cs.meta | 11 + .../Runtime/Scripts/WaterRenderer.Legacy.cs | 307 ++-- .../Scripts/WaterRenderer.Migration.cs | 44 + .../Scripts/WaterRenderer.Migration.cs.meta | 11 + .../Scripts/WaterRenderer.SerializedFields.cs | 203 +-- .../Scripts/WaterRenderer.Universal.cs | 194 ++- .../Scripts/WaterRenderer.WaterLevelDepth.cs | 273 +--- .../Runtime/Scripts/WaterRenderer.cs | 956 ++++++------- .../Runtime/Scripts/WaterResources.cs | 7 + .../Runtime/Scripts/Watercraft/Controller.cs | 2 +- .../Runtime/Scripts/WaveHarmonic.Crest.asmdef | 10 + .../Runtime/Scripts/Waves/FFTCompute.cs | 14 +- .../Runtime/Scripts/Waves/WaveSpectrum.cs | 21 +- .../Runtime/Settings/Resources.asset | 7 + .../Shaders/Data/Input/AbsorptionColor.shader | 4 +- .../Shaders/Data/Input/AlbedoColor.shader | 5 +- .../Input/AnimatedWavesAddFromTexture.shader | 4 +- .../Input/AnimatedWavesRemoveGeometry.shader | 5 +- .../AnimatedWavesSetHeightToGeometry.shader | 5 +- .../Input/AnimatedWavesWaveParticle.shader | 3 + .../Data/Input/DynamicWavesAddBump.shader | 3 + .../Input/DynamicWavesDampenCircle.shader | 3 + .../Data/Input/FlowAddFromTexture.shader | 10 +- .../Data/Input/FlowFixedDirection.shader | 5 +- .../Data/Input/FoamAddFromTexture.shader | 2 + .../Data/Input/FoamAddFromVertexColor.shader | 4 +- .../Input/Hidden/AbsorptionTexture.compute | 3 +- .../Data/Input/Hidden/ClipConvexHull.shader | 5 +- .../Data/Input/Hidden/ClipTexture.compute | 3 +- .../Data/Input/Hidden/DepthTexture.compute | 3 +- .../Data/Input/Hidden/FlowTexture.compute | 3 + .../Data/Input/Hidden/FoamTexture.compute | 3 +- .../Data/Input/Hidden/JumpFloodSDF.compute | 2 +- .../Data/Input/Hidden/LevelTexture.compute | 6 +- .../Input/Hidden/ScatteringTexture.compute | 3 +- .../Shaders/Data/Input/Override.shader | 6 +- .../Runtime/Shaders/Data/Input/Scale.shader | 7 +- .../Shaders/Data/Input/ScatteringColor.shader | 4 +- .../Data/Input/ShapeWavesFromGeometry.shader | 4 +- .../Runtime/Shaders/Data/Input/Utility.shader | 6 +- .../Data/Input/WaterDepthFromGeometry.shader | 3 + .../Data/Input/WaterLevelFromGeometry.shader | 5 +- .../Runtime/Shaders/Data/PackLevel.compute | 2 +- .../Runtime/Shaders/Data/Query/Query.compute | 2 +- .../Data/Query/QueryDisplacements.compute | 2 +- .../Shaders/Data/Query/QueryFlow.compute | 2 +- .../Runtime/Shaders/Data/ShapeCombine.compute | 12 +- .../Shaders/Data/ShorelineColor.compute | 2 +- .../Shaders/Data/UpdateDynamicWaves.compute | 26 +- .../Runtime/Shaders/Data/UpdateFoam.compute | 2 +- .../Runtime/Shaders/Data/UpdateShadow.compute | 154 ++ .../Shaders/Data/UpdateShadow.compute.meta | 7 + .../Runtime/Shaders/Data/UpdateShadow.hlsl | 3 +- .../Runtime/Shaders/Data/UpdateShadow.shader | 169 +-- .../Runtime/Shaders/Library/Cascade.hlsl | 4 +- .../Runtime/Shaders/Library/Constants.hlsl | 4 +- .../Runtime/Shaders/Library/Globals.hlsl | 5 +- .../Runtime/Shaders/Library/Helpers.hlsl | 18 +- .../Runtime/Shaders/Library/InputsDriven.hlsl | 13 +- .../Runtime/Shaders/Library/Macros.hlsl | 12 + .../Shaders/Library/Settings.Crest.hlsl | 5 +- .../Shaders/Library/Utility/Helpers.hlsl | 48 + .../Shaders/Library/Utility/Helpers.hlsl.meta | 7 + .../Library/Utility/Legacy/Common.hlsl | 257 +--- .../Shaders/Library/Utility/Legacy/Core.hlsl | 88 +- .../Library/Utility/Legacy/Defines.hlsl | 111 ++ .../Library/Utility/Legacy/Defines.hlsl.meta | 7 + .../Library/Utility/Legacy/InputsDriven.hlsl | 16 +- .../Utility/Legacy/LegacyBuilding.hlsl | 109 ++ .../Utility/Legacy/LegacyBuilding.hlsl.meta | 7 + .../Utility/Legacy/MotionVectorCommon.hlsl | 51 + .../Legacy/MotionVectorCommon.hlsl.meta | 7 + .../Utility/Legacy/MotionVectorPass.hlsl | 159 +++ .../Utility/Legacy/MotionVectorPass.hlsl.meta | 7 + .../Library/Utility/Legacy/Shadows.hlsl | 38 +- .../Shaders/Library/Utility/Lighting.hlsl | 185 ++- .../Runtime/Shaders/Library/Utility/RP.meta | 8 + .../Shaders/Library/Utility/RP/Compute.hlsl | 71 + .../Library/Utility/RP/Compute.hlsl.meta | 7 + .../Shaders/Library/Utility/RP/HDRP.meta | 8 + .../Library/Utility/RP/HDRP/Common.hlsl | 12 + .../Library/Utility/RP/HDRP/Common.hlsl.meta | 7 + .../Shaders/Library/Utility/RP/Shadows.hlsl | 107 ++ .../Library/Utility/RP/Shadows.hlsl.meta | 7 + .../Shaders/Library/Utility/Shadows.hlsl | 85 ++ .../Shaders/Library/Utility/Shadows.hlsl.meta | 7 + .../Runtime/Shaders/Meniscus.meta | 8 + .../Shaders/Meniscus/Meniscus.Obsolete.hlsl | 69 + .../Meniscus/Meniscus.Obsolete.hlsl.meta | 7 + .../Runtime/Shaders/Meniscus/Meniscus.hlsl | 245 ++++ .../Shaders/Meniscus/Meniscus.hlsl.meta | 7 + .../Runtime/Shaders/Meniscus/Meniscus.shader | 594 ++++++++ .../Shaders/Meniscus/Meniscus.shader.meta | 9 + .../Runtime/Shaders/Surface/Data.hlsl | 41 + .../Runtime/Shaders/Surface/Data.hlsl.meta | 7 + .../Runtime/Shaders/Surface/Facing.hlsl | 35 + .../Runtime/Shaders/Surface/Facing.hlsl.meta | 7 + .../Runtime/Shaders/Surface/Fog.hlsl | 67 + .../Runtime/Shaders/Surface/Fog.hlsl.meta | 7 + .../Runtime/Shaders/Surface/Fragment.hlsl | 119 +- .../Runtime/Shaders/Surface/Geometry.hlsl | 25 +- .../Runtime/Shaders/Surface/Normal.hlsl | 4 + .../Runtime/Shaders/Surface/Refraction.hlsl | 2 +- .../Runtime/Shaders/Surface/Shim.hlsl | 29 +- .../Runtime/Shaders/Surface/Vertex.hlsl | 6 +- .../Shaders/Surface/VolumeLighting.hlsl | 36 +- .../Runtime/Shaders/Surface/Water.shadergraph | 40 +- .../Runtime/Shaders/Utility/Blit.shader | 97 +- .../Runtime/Shaders/Utility/Clear.compute | 2 +- .../Runtime/Shaders/Utility/Legacy.meta | 8 + .../Legacy/CaptureShadowMatrices.shader | 42 + .../Legacy/CaptureShadowMatrices.shader.meta | 9 + .../Utility/Legacy/ForceShadows.shader | 51 + .../Utility/Legacy/ForceShadows.shader.meta | 9 + .../Shaders/Utility/TextureArray.shader | 2 +- .../Runtime/Shaders/Volume/Debug.hlsl | 44 + .../Runtime/Shaders/Volume/Debug.hlsl.meta | 7 + .../Runtime/Shaders/Volume/Graph.meta | 8 + .../Integrate Water Volume.shadersubgraph | 1262 +++++++++++++++++ ...Integrate Water Volume.shadersubgraph.meta | 10 + .../Volume/Graph/IntegrateWaterVolume.hlsl | 224 +++ .../Graph/IntegrateWaterVolume.hlsl.meta | 7 + .../Runtime/Shaders/Volume/Horizon.shader | 104 ++ .../Shaders/Volume/Horizon.shader.meta | 9 + .../Runtime/Shaders/Volume/Mask.compute | 51 + .../Runtime/Shaders/Volume/Mask.compute.meta | 7 + .../Runtime/Shaders/Volume/Mask.hlsl | 109 +- .../Runtime/Shaders/Volume/Mask.shader | 107 +- .../Shaders/Volume/MaskArtifacts.compute | 7 +- .../Runtime/Shaders/Volume/MaskHorizon.hlsl | 1 - .../Runtime/Shaders/Volume/Underwater.hlsl | 101 +- .../Runtime/Shaders/Volume/Underwater.shader | 647 +++++---- .../Shaders/Volume/UnderwaterBIRP.hlsl | 25 +- .../Shaders/Volume/UnderwaterHDRP.hlsl | 1 + .../Shaders/Volume/UnderwaterShared.hlsl | 331 ++--- .../Runtime/Shaders/Volume/UnderwaterURP.hlsl | 14 +- .../Shaders/Waves/Gerstner/Gerstner.compute | 2 +- .../Textures/Caustics/Caustics.png.meta | 26 + .../Textures/WaveNormals/WaveNormals.png.meta | 26 + .../Runtime/Textures/foam.png.meta | 26 + .../LensFlares/Textures/Flare50mm.psd.meta | 26 + .../LensFlares/Textures/PartialRing.png.meta | 26 + .../Effects/LensFlares/Textures/Ring.png.meta | 26 + .../LensFlares/Textures/Shimmer.png.meta | 26 + .../Shared/Prefabs/Camera.prefab | 2 +- .../Shared/Scripts/AlignSceneViewToCamera.cs | 3 +- .../Shared/Scripts/CameraController.cs | 3 +- .../Shared/Scripts/LerpCamera.cs | 2 +- .../Scripts/Queries/SampleDisplacementDemo.cs | 2 +- .../Scripts/Queries/SampleHeightDemo.cs | 2 +- .../Shared/Scripts/RandomMotion.cs | 2 +- .../Scripts/Rendering/AmbientLightPatcher.cs | 4 + .../Rendering/RenderPipelineTerrainPatcher.cs | 2 + .../Shared/Scripts/SimpleMotion.cs | 2 +- .../Shared/Scripts/TimedDestroy.cs | 2 +- .../Scripts/WaveHarmonic.Crest.Samples.asmdef | 5 + .../Shared/Shaders/Lit.shadergraph | 284 +++- .../Shared/Textures/Red.png.meta | 26 + .../Shared/Textures/Skybox.hdr.meta | 26 + Packages/com.waveharmonic.crest/package.json | 2 +- ProjectSettings/ProjectSettings.asset | 2 +- ...20260108_205507_player_umotion_project.bak | Bin 0 -> 306914 bytes ...20260108_214600_player_umotion_project.bak | Bin 0 -> 306914 bytes ...20260108_215304_player_umotion_project.bak | Bin 0 -> 306914 bytes UMotionData/Temp/EditorUndoStack.dat | Bin 896618 -> 0 bytes UMotionData/Temp/EditorUndoTable.dat | Bin 2136 -> 0 bytes UserSettings/EditorUserSettings.asset | 30 +- 415 files changed, 18138 insertions(+), 7134 deletions(-) rename Assets/ResRaw/Water/{Water Chunk1.prefab => Chunk 1.prefab} (93%) rename Assets/ResRaw/Water/{Water Chunk1.prefab.meta => Chunk 1.prefab.meta} (74%) create mode 100644 Assets/ResRaw/Water/Water 1.mat rename Assets/ResRaw/Water/{Water1.mat.meta => Water 1.mat.meta} (79%) delete mode 100644 Assets/ResRaw/Water/Water1.mat create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs create mode 100644 Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Shaders/Templates.meta create mode 100644 Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl create mode 100644 Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset create mode 100644 Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat create mode 100644 Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat create mode 100644 Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs create mode 100644 Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader.meta create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute create mode 100644 Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute.meta create mode 100644 UMotionData/AutoBackups/20260108_205507_player_umotion_project.bak create mode 100644 UMotionData/AutoBackups/20260108_214600_player_umotion_project.bak create mode 100644 UMotionData/AutoBackups/20260108_215304_player_umotion_project.bak diff --git a/Assets/ResRaw/AnimEditor/player_umotion_project.asset b/Assets/ResRaw/AnimEditor/player_umotion_project.asset index 31cc4048b..f58abc9fb 100644 --- a/Assets/ResRaw/AnimEditor/player_umotion_project.asset +++ b/Assets/ResRaw/AnimEditor/player_umotion_project.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: UMotionEditor.dll::UMotionEditor.Model.FileFormats.Project.V01_02.UMotionProjectFileV01_02 EditorState: EditMode: - valueInternal: 1 + valueInternal: 0 MainTabIndex: valueInternal: 0 PoseToolPivotMode: @@ -28,7 +28,7 @@ MonoBehaviour: ConfigToolPivotMode: valueInternal: 0 ConfigToolMode: - valueInternal: 2 + valueInternal: 1 OpenedClipIndex: valueInternal: 1 SelectedFrame: @@ -38,9 +38,9 @@ MonoBehaviour: FramesScrollPosition: valueInternal: -40 FramesZoom: - valueInternal: 0.57544 + valueInternal: 0.57543993 PropertiesScrollPosition: - valueInternal: 707 + valueInternal: 0 PropertiesZoom: valueInternal: 1 CurveYScrollPosition: @@ -5102,7 +5102,7 @@ MonoBehaviour: valueInternal: 0 LocalPositionChannelList: - CurrentValue: - valueInternal: -1.5405825e-20 + valueInternal: 0.0123695675 ReferencePoseValue: valueInternal: -1.5405825e-20 PoseValueList: [] @@ -5113,10 +5113,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -1.5405825e-20 + valueInternal: 0.0123695675 newKeyListSerialized: 02000000000000000000baa94a3c0000000000000000abaaaa3eabaaaa3e00000000000100000000baa94a3c0000000000000000abaaaa3eabaaaa3e00000000 - CurrentValue: - valueInternal: -0.022808662 + valueInternal: -0.012674093 ReferencePoseValue: valueInternal: -0.022808662 PoseValueList: [] @@ -5127,10 +5127,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.022808662 + valueInternal: -0.012674093 newKeyListSerialized: 0200000000000000000000a74fbc0000000000000000abaaaa3eabaaaa3e0000000000010000000000a74fbc0000000000000000abaaaa3eabaaaa3e00000000 - CurrentValue: - valueInternal: 0.9589678 + valueInternal: 0.9561756 ReferencePoseValue: valueInternal: 0.9589678 PoseValueList: [] @@ -5141,7 +5141,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9589678 + valueInternal: 0.9561756 newKeyListSerialized: 02000000000000000000edc7743f0000000000000000abaaaa3eabaaaa3e00000000000100000000edc7743f0000000000000000abaaaa3eabaaaa3e00000000 LocalRotationSelected: valueInternal: 0 @@ -5150,7 +5150,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.02241497 + valueInternal: -0.002251485 ReferencePoseValue: valueInternal: -0.02241497 PoseValueList: [] @@ -5161,10 +5161,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.02241497 + valueInternal: -0.002251485 newKeyListSerialized: 02000000000000000000a68d13bb0000000000000000abaaaa3eabaaaa3e44010000000100000000a68d13bb0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7067514 + valueInternal: 0.7035268 ReferencePoseValue: valueInternal: 0.7067514 PoseValueList: [] @@ -5175,10 +5175,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7067514 + valueInternal: 0.7035268 newKeyListSerialized: 02000000000000000000551a343f0000000000000000abaaaa3eabaaaa3e44010000000100000000551a343f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.02241497 + valueInternal: -0.010654556 ReferencePoseValue: valueInternal: -0.02241497 PoseValueList: [] @@ -5189,10 +5189,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.02241497 + valueInternal: -0.010654556 newKeyListSerialized: 0200000000000000000072902ebc0000000000000000abaaaa3eabaaaa3e4401000000010000000072902ebc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7067514 + valueInternal: 0.71058553 ReferencePoseValue: valueInternal: 0.7067514 PoseValueList: [] @@ -5203,7 +5203,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7067514 + valueInternal: 0.71058553 newKeyListSerialized: 02000000000000000000efe8353f0000000000000000abaaaa3eabaaaa3e44010000000100000000efe8353f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -6226,7 +6226,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -2.6025898e-30 + valueInternal: -0.010361094 ReferencePoseValue: valueInternal: -2.6025898e-30 PoseValueList: [] @@ -6237,10 +6237,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -2.6025898e-30 + valueInternal: -0.010361094 newKeyListSerialized: 0200000000000000000094c129bc0000000000000000abaaaa3eabaaaa3e4401000000010000000094c129bc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 1.1158186e-30 + valueInternal: 0.010265518 ReferencePoseValue: valueInternal: 1.1158186e-30 PoseValueList: [] @@ -6251,10 +6251,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.1158186e-30 + valueInternal: 0.010265518 newKeyListSerialized: 02000000000000000000b430283c0000000000000000abaaaa3eabaaaa3e44010000000100000000b430283c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.1258295 + valueInternal: 0.11083683 ReferencePoseValue: valueInternal: 0.1258295 PoseValueList: [] @@ -6265,10 +6265,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.1258295 + valueInternal: 0.11083683 newKeyListSerialized: 020000000000000000006cfee23d0000000000000000abaaaa3eabaaaa3e440100000001000000006cfee23d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9920519 + valueInternal: 0.9937317 ReferencePoseValue: valueInternal: 0.9920519 PoseValueList: [] @@ -6279,7 +6279,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9920519 + valueInternal: 0.9937317 newKeyListSerialized: 0200000000000000000033657e3f0000000000000000abaaaa3eabaaaa3e4401000000010000000033657e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -7302,7 +7302,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -2.0213553e-30 + valueInternal: -0.0036019208 ReferencePoseValue: valueInternal: -2.0213553e-30 PoseValueList: [] @@ -7313,10 +7313,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -2.0213553e-30 + valueInternal: -0.0036019208 newKeyListSerialized: 02000000000000000000340e6cbb0000000000000000abaaaa3eabaaaa3e44010000000100000000340e6cbb0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -7.24171e-31 + valueInternal: 0.008874873 ReferencePoseValue: valueInternal: -7.24171e-31 PoseValueList: [] @@ -7327,10 +7327,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -7.24171e-31 + valueInternal: 0.008874873 newKeyListSerialized: 02000000000000000000ea67113c0000000000000000abaaaa3eabaaaa3e44010000000100000000ea67113c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.09537736 + valueInternal: -0.122498155 ReferencePoseValue: valueInternal: -0.09537736 PoseValueList: [] @@ -7341,10 +7341,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.09537736 + valueInternal: -0.122498155 newKeyListSerialized: 0200000000000000000050e0fabd0000000000000000abaaaa3eabaaaa3e4401000000010000000050e0fabd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9954412 + valueInternal: 0.9924225 ReferencePoseValue: valueInternal: 0.9954412 PoseValueList: [] @@ -7355,7 +7355,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9954412 + valueInternal: 0.9924225 newKeyListSerialized: 02000000000000000000670f7e3f0000000000000000abaaaa3eabaaaa3e44010000000100000000670f7e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -8378,7 +8378,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.000003922817 + valueInternal: -0.0000039049896 ReferencePoseValue: valueInternal: -0.000003922817 PoseValueList: [] @@ -8389,10 +8389,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.000003922817 + valueInternal: -0.0000039049896 newKeyListSerialized: 020000000000000000009b0783b60000000000000000abaaaa3eabaaaa3e440100000001000000009b0783b60000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.000000023326137 + valueInternal: 0.000000014903577 ReferencePoseValue: valueInternal: -0.000000023326137 PoseValueList: [] @@ -8403,10 +8403,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.000000023326137 + valueInternal: 0.000000014903577 newKeyListSerialized: 02000000000000000000500580320000000000000000abaaaa3eabaaaa3e44010000000100000000500580320000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.005946209 + valueInternal: -0.005946233 ReferencePoseValue: valueInternal: -0.005946209 PoseValueList: [] @@ -8417,7 +8417,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.005946209 + valueInternal: -0.005946233 newKeyListSerialized: 020000000000000000009ed8c2bb0000000000000000abaaaa3eabaaaa3e440100000001000000009ed8c2bb0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0.99998236 @@ -8647,7 +8647,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.08327826 + valueInternal: 0.116074376 ReferencePoseValue: valueInternal: 0.08327826 PoseValueList: [] @@ -8658,10 +8658,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.08327826 + valueInternal: 0.116074376 newKeyListSerialized: 0200000000000000000067b8ed3d0000000000000000abaaaa3eabaaaa3e4401000000010000000067b8ed3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.7545604 + valueInternal: -0.7172705 ReferencePoseValue: valueInternal: -0.7545604 PoseValueList: [] @@ -8672,10 +8672,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.7545604 + valueInternal: -0.7172705 newKeyListSerialized: 020000000000000000000a9f37bf0000000000000000abaaaa3eabaaaa3e440100000001000000000a9f37bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.041289933 + valueInternal: 0.007625906 ReferencePoseValue: valueInternal: 0.041289933 PoseValueList: [] @@ -8686,10 +8686,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.041289933 + valueInternal: 0.007625906 newKeyListSerialized: 02000000000000000000bce2f93b0000000000000000abaaaa3eabaaaa3e44010000000100000000bce2f93b0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.6496141 + valueInternal: 0.6870165 ReferencePoseValue: valueInternal: 0.6496141 PoseValueList: [] @@ -8700,7 +8700,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.6496141 + valueInternal: 0.6870165 newKeyListSerialized: 0200000000000000000050e02f3f0000000000000000abaaaa3eabaaaa3e4401000000010000000050e02f3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -8916,7 +8916,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.01994785 + valueInternal: -0.15612495 ReferencePoseValue: valueInternal: -0.01994785 PoseValueList: [] @@ -8927,10 +8927,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.01994785 + valueInternal: -0.15612495 newKeyListSerialized: 0200000000000000000038df1fbe0000000000000000abaaaa3eabaaaa3e4401000000010000000038df1fbe0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.39173076 + valueInternal: -0.47788846 ReferencePoseValue: valueInternal: -0.39173076 PoseValueList: [] @@ -8941,10 +8941,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.39173076 + valueInternal: -0.47788846 newKeyListSerialized: 02000000000000000000ccadf4be0000000000000000abaaaa3eabaaaa3e44010000000100000000ccadf4be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.020190157 + valueInternal: 0.48425734 ReferencePoseValue: valueInternal: 0.020190157 PoseValueList: [] @@ -8955,10 +8955,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.020190157 + valueInternal: 0.48425734 newKeyListSerialized: 0200000000000000000094f0f73e0000000000000000abaaaa3eabaaaa3e4401000000010000000094f0f73e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.91964203 + valueInternal: 0.7160604 ReferencePoseValue: valueInternal: 0.91964203 PoseValueList: [] @@ -8969,7 +8969,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.91964203 + valueInternal: 0.7160604 newKeyListSerialized: 02000000000000000000bc4f373f0000000000000000abaaaa3eabaaaa3e44010000000100000000bc4f373f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -9185,7 +9185,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 1.3674641e-17 + valueInternal: -0.07595502 ReferencePoseValue: valueInternal: 1.3674641e-17 PoseValueList: [] @@ -9196,10 +9196,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.3674641e-17 + valueInternal: -0.07595502 newKeyListSerialized: 020000000000000000004e8e9bbd0000000000000000abaaaa3eabaaaa3e440100000001000000004e8e9bbd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 2.1093738e-16 + valueInternal: 0.012259677 ReferencePoseValue: valueInternal: 2.1093738e-16 PoseValueList: [] @@ -9210,10 +9210,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 2.1093738e-16 + valueInternal: 0.012259677 newKeyListSerialized: 02000000000000000000d0dc483c0000000000000000abaaaa3eabaaaa3e44010000000100000000d0dc483c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.33363262 + valueInternal: 0.43630737 ReferencePoseValue: valueInternal: 0.33363262 PoseValueList: [] @@ -9224,10 +9224,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.33363262 + valueInternal: 0.43630737 newKeyListSerialized: 02000000000000000000ae63df3e0000000000000000abaaaa3eabaaaa3e44010000000100000000ae63df3e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9427032 + valueInternal: 0.8965024 ReferencePoseValue: valueInternal: 0.9427032 PoseValueList: [] @@ -9238,7 +9238,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9427032 + valueInternal: 0.8965024 newKeyListSerialized: 020000000000000000002e81653f0000000000000000abaaaa3eabaaaa3e440100000001000000002e81653f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -9454,7 +9454,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.55758685 + valueInternal: -0.63309926 ReferencePoseValue: valueInternal: -0.55758685 PoseValueList: [] @@ -9465,10 +9465,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.55758685 + valueInternal: -0.63309926 newKeyListSerialized: 02000000000000000000cb1222bf0000000000000000abaaaa3eabaaaa3e44010000000100000000cb1222bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.0016783397 + valueInternal: 0.17619902 ReferencePoseValue: valueInternal: -0.0016783397 PoseValueList: [] @@ -9479,10 +9479,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.0016783397 + valueInternal: 0.17619902 newKeyListSerialized: 02000000000000000000846d343e0000000000000000abaaaa3eabaaaa3e44010000000100000000846d343e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.020560935 + valueInternal: -0.12625034 ReferencePoseValue: valueInternal: -0.020560935 PoseValueList: [] @@ -9493,10 +9493,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.020560935 + valueInternal: -0.12625034 newKeyListSerialized: 02000000000000000000c54701be0000000000000000abaaaa3eabaaaa3e44010000000100000000c54701be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.82986224 + valueInternal: 0.7431017 ReferencePoseValue: valueInternal: 0.82986224 PoseValueList: [] @@ -9507,7 +9507,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.82986224 + valueInternal: 0.7431017 newKeyListSerialized: 02000000000000000000ea3b3e3f0000000000000000abaaaa3eabaaaa3e44010000000100000000ea3b3e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -9992,7 +9992,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -2.4834257e-17 + valueInternal: -0.12077076 ReferencePoseValue: valueInternal: -2.4834257e-17 PoseValueList: [] @@ -10003,10 +10003,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -2.4834257e-17 + valueInternal: -0.12077076 newKeyListSerialized: 02000000000000000000a956f7bd0000000000000000abaaaa3eabaaaa3e44010000000100000000a956f7bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -5.15494e-17 + valueInternal: -0.09062012 ReferencePoseValue: valueInternal: -5.15494e-17 PoseValueList: [] @@ -10017,10 +10017,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -5.15494e-17 + valueInternal: -0.09062012 newKeyListSerialized: 020000000000000000000b97b9bd0000000000000000abaaaa3eabaaaa3e440100000001000000000b97b9bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.20255657 + valueInternal: -0.45609194 ReferencePoseValue: valueInternal: -0.20255657 PoseValueList: [] @@ -10031,10 +10031,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.20255657 + valueInternal: -0.45609194 newKeyListSerialized: 02000000000000000000e284e9be0000000000000000abaaaa3eabaaaa3e44010000000100000000e284e9be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9792706 + valueInternal: 0.87703097 ReferencePoseValue: valueInternal: 0.9792706 PoseValueList: [] @@ -10045,7 +10045,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9792706 + valueInternal: 0.87703097 newKeyListSerialized: 020000000000000000001a85603f0000000000000000abaaaa3eabaaaa3e440100000001000000001a85603f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -10261,7 +10261,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 9.335562e-17 + valueInternal: -0.029060753 ReferencePoseValue: valueInternal: 9.335562e-17 PoseValueList: [] @@ -10272,10 +10272,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 9.335562e-17 + valueInternal: -0.029060753 newKeyListSerialized: 02000000000000000000d110eebc0000000000000000abaaaa3eabaaaa3e44010000000100000000d110eebc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 7.177344e-17 + valueInternal: -0.04188049 ReferencePoseValue: valueInternal: 7.177344e-17 PoseValueList: [] @@ -10286,10 +10286,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 7.177344e-17 + valueInternal: -0.04188049 newKeyListSerialized: 02000000000000000000e08a2bbd0000000000000000abaaaa3eabaaaa3e44010000000100000000e08a2bbd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.12959665 + valueInternal: -0.30216303 ReferencePoseValue: valueInternal: -0.12959665 PoseValueList: [] @@ -10300,10 +10300,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.12959665 + valueInternal: -0.30216303 newKeyListSerialized: 020000000000000000001db59abe0000000000000000abaaaa3eabaaaa3e440100000001000000001db59abe0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.99156684 + valueInternal: 0.9518924 ReferencePoseValue: valueInternal: 0.99156684 PoseValueList: [] @@ -10314,7 +10314,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.99156684 + valueInternal: 0.9518924 newKeyListSerialized: 0200000000000000000038af733f0000000000000000abaaaa3eabaaaa3e4401000000010000000038af733f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -10530,7 +10530,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -5.157263e-16 + valueInternal: -0.02733975 ReferencePoseValue: valueInternal: -5.157263e-16 PoseValueList: [] @@ -10541,10 +10541,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -5.157263e-16 + valueInternal: -0.02733975 newKeyListSerialized: 020000000000000000009df7dfbc0000000000000000abaaaa3eabaaaa3e440100000001000000009df7dfbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -4.1811757e-16 + valueInternal: -0.043023072 ReferencePoseValue: valueInternal: -4.1811757e-16 PoseValueList: [] @@ -10555,10 +10555,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -4.1811757e-16 + valueInternal: -0.043023072 newKeyListSerialized: 02000000000000000000f63830bd0000000000000000abaaaa3eabaaaa3e44010000000100000000f63830bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.109009154 + valueInternal: -0.31209376 ReferencePoseValue: valueInternal: -0.109009154 PoseValueList: [] @@ -10569,10 +10569,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.109009154 + valueInternal: -0.31209376 newKeyListSerialized: 02000000000000000000c1ca9fbe0000000000000000abaaaa3eabaaaa3e44010000000100000000c1ca9fbe0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9940407 + valueInternal: 0.94868314 ReferencePoseValue: valueInternal: 0.9940407 PoseValueList: [] @@ -10583,7 +10583,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9940407 + valueInternal: 0.94868314 newKeyListSerialized: 02000000000000000000e6dc723f0000000000000000abaaaa3eabaaaa3e44010000000100000000e6dc723f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -11068,7 +11068,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 1.9713317e-16 + valueInternal: 0.032478023 ReferencePoseValue: valueInternal: 1.9713317e-16 PoseValueList: [] @@ -11079,10 +11079,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.9713317e-16 + valueInternal: 0.032478023 newKeyListSerialized: 02000000000000000000ad07053d0000000000000000abaaaa3eabaaaa3e44010000000100000000ad07053d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 5.964157e-17 + valueInternal: 0.038706884 ReferencePoseValue: valueInternal: 5.964157e-17 PoseValueList: [] @@ -11093,10 +11093,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 5.964157e-17 + valueInternal: 0.038706884 newKeyListSerialized: 020000000000000000001c8b1e3d0000000000000000abaaaa3eabaaaa3e440100000001000000001c8b1e3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.27205086 + valueInternal: -0.665601 ReferencePoseValue: valueInternal: -0.27205086 PoseValueList: [] @@ -11107,10 +11107,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.27205086 + valueInternal: -0.665601 newKeyListSerialized: 02000000000000000000d4642abf0000000000000000abaaaa3eabaaaa3e44010000000100000000d4642abf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9622829 + valueInternal: 0.7445958 ReferencePoseValue: valueInternal: 0.9622829 PoseValueList: [] @@ -11121,7 +11121,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9622829 + valueInternal: 0.7445958 newKeyListSerialized: 02000000000000000000d59d3e3f0000000000000000abaaaa3eabaaaa3e44010000000100000000d59d3e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -11337,7 +11337,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -7.404477e-18 + valueInternal: -0.009772375 ReferencePoseValue: valueInternal: -7.404477e-18 PoseValueList: [] @@ -11348,10 +11348,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -7.404477e-18 + valueInternal: -0.009772375 newKeyListSerialized: 02000000000000000000501c20bc0000000000000000abaaaa3eabaaaa3e44010000000100000000501c20bc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 1.4244586e-16 + valueInternal: -0.010720067 ReferencePoseValue: valueInternal: 1.4244586e-16 PoseValueList: [] @@ -11362,10 +11362,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.4244586e-16 + valueInternal: -0.010720067 newKeyListSerialized: 0200000000000000000038a32fbc0000000000000000abaaaa3eabaaaa3e4401000000010000000038a32fbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.18025488 + valueInternal: -0.6784182 ReferencePoseValue: valueInternal: -0.18025488 PoseValueList: [] @@ -11376,10 +11376,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.18025488 + valueInternal: -0.6784182 newKeyListSerialized: 02000000000000000000d1ac2dbf0000000000000000abaaaa3eabaaaa3e44010000000100000000d1ac2dbf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.98362 + valueInternal: 0.7345338 ReferencePoseValue: valueInternal: 0.98362 PoseValueList: [] @@ -11390,7 +11390,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.98362 + valueInternal: 0.7345338 newKeyListSerialized: 02000000000000000000680a3c3f0000000000000000abaaaa3eabaaaa3e44010000000100000000680a3c3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -11606,7 +11606,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -3.940056e-17 + valueInternal: -0.009234358 ReferencePoseValue: valueInternal: -3.940056e-17 PoseValueList: [] @@ -11617,10 +11617,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -3.940056e-17 + valueInternal: -0.009234358 newKeyListSerialized: 02000000000000000000b44b17bc0000000000000000abaaaa3eabaaaa3e44010000000100000000b44b17bc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -5.227609e-17 + valueInternal: -0.011186738 ReferencePoseValue: valueInternal: -5.227609e-17 PoseValueList: [] @@ -11631,10 +11631,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -5.227609e-17 + valueInternal: -0.011186738 newKeyListSerialized: 02000000000000000000944837bc0000000000000000abaaaa3eabaaaa3e44010000000100000000944837bc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.087155744 + valueInternal: -0.66367507 ReferencePoseValue: valueInternal: -0.087155744 PoseValueList: [] @@ -11645,10 +11645,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.087155744 + valueInternal: -0.66367507 newKeyListSerialized: 020000000000000000009ce629bf0000000000000000abaaaa3eabaaaa3e440100000001000000009ce629bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9961947 + valueInternal: 0.74788064 ReferencePoseValue: valueInternal: 0.9961947 PoseValueList: [] @@ -11659,7 +11659,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9961947 + valueInternal: 0.74788064 newKeyListSerialized: 020000000000000000001b753f3f0000000000000000abaaaa3eabaaaa3e440100000001000000001b753f3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -12144,7 +12144,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.08998402 + valueInternal: 0.07243729 ReferencePoseValue: valueInternal: 0.08998402 PoseValueList: [] @@ -12155,10 +12155,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.08998402 + valueInternal: 0.07243729 newKeyListSerialized: 02000000000000000000005a943d0000000000000000abaaaa3eabaaaa3e44010000000100000000005a943d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.017015995 + valueInternal: 0.045979954 ReferencePoseValue: valueInternal: -0.017015995 PoseValueList: [] @@ -12169,10 +12169,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.017015995 + valueInternal: 0.045979954 newKeyListSerialized: 020000000000000000007a553c3d0000000000000000abaaaa3eabaaaa3e440100000001000000007a553c3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.1280659 + valueInternal: -0.6749333 ReferencePoseValue: valueInternal: -0.1280659 PoseValueList: [] @@ -12183,10 +12183,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.1280659 + valueInternal: -0.6749333 newKeyListSerialized: 020000000000000000006ec82cbf0000000000000000abaaaa3eabaaaa3e440100000001000000006ec82cbf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.98752844 + valueInternal: 0.7328741 ReferencePoseValue: valueInternal: 0.98752844 PoseValueList: [] @@ -12197,7 +12197,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.98752844 + valueInternal: 0.7328741 newKeyListSerialized: 02000000000000000000a39d3b3f0000000000000000abaaaa3eabaaaa3e44010000000100000000a39d3b3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -12413,7 +12413,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 2.1858013e-16 + valueInternal: 0.028632885 ReferencePoseValue: valueInternal: 2.1858013e-16 PoseValueList: [] @@ -12424,10 +12424,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 2.1858013e-16 + valueInternal: 0.028632885 newKeyListSerialized: 02000000000000000000838fea3c0000000000000000abaaaa3eabaaaa3e44010000000100000000838fea3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -2.1052669e-16 + valueInternal: 0.09171413 ReferencePoseValue: valueInternal: -2.1052669e-16 PoseValueList: [] @@ -12438,10 +12438,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -2.1052669e-16 + valueInternal: 0.09171413 newKeyListSerialized: 020000000000000000009ed4bb3d0000000000000000abaaaa3eabaaaa3e440100000001000000009ed4bb3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.18469755 + valueInternal: -0.67084634 ReferencePoseValue: valueInternal: -0.18469755 PoseValueList: [] @@ -12452,10 +12452,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.18469755 + valueInternal: -0.67084634 newKeyListSerialized: 0200000000000000000096bc2bbf0000000000000000abaaaa3eabaaaa3e4401000000010000000096bc2bbf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9827954 + valueInternal: 0.7353461 ReferencePoseValue: valueInternal: 0.9827954 PoseValueList: [] @@ -12466,7 +12466,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9827954 + valueInternal: 0.7353461 newKeyListSerialized: 02000000000000000000a43f3c3f0000000000000000abaaaa3eabaaaa3e44010000000100000000a43f3c3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -12682,7 +12682,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -4.2619093e-16 + valueInternal: 0.028107585 ReferencePoseValue: valueInternal: -4.2619093e-16 PoseValueList: [] @@ -12693,10 +12693,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -4.2619093e-16 + valueInternal: 0.028107585 newKeyListSerialized: 02000000000000000000e141e63c0000000000000000abaaaa3eabaaaa3e44010000000100000000e141e63c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 1.433138e-16 + valueInternal: 0.091876276 ReferencePoseValue: valueInternal: 1.433138e-16 PoseValueList: [] @@ -12707,10 +12707,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.433138e-16 + valueInternal: 0.091876276 newKeyListSerialized: 02000000000000000000a129bc3d0000000000000000abaaaa3eabaaaa3e44010000000100000000a129bc3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.042895757 + valueInternal: -0.62340605 ReferencePoseValue: valueInternal: -0.042895757 PoseValueList: [] @@ -12721,10 +12721,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.042895757 + valueInternal: -0.62340605 newKeyListSerialized: 020000000000000000008a971fbf0000000000000000abaaaa3eabaaaa3e440100000001000000008a971fbf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9990796 + valueInternal: 0.7759725 ReferencePoseValue: valueInternal: 0.9990796 PoseValueList: [] @@ -12735,7 +12735,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9990796 + valueInternal: 0.7759725 newKeyListSerialized: 0200000000000000000022a6463f0000000000000000abaaaa3eabaaaa3e4401000000010000000022a6463f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -13220,7 +13220,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.054216176 + valueInternal: 0.04786189 ReferencePoseValue: valueInternal: 0.054216176 PoseValueList: [] @@ -13231,10 +13231,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.054216176 + valueInternal: 0.04786189 newKeyListSerialized: 02000000000000000000d40a443d0000000000000000abaaaa3eabaaaa3e44010000000100000000d40a443d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.01317727 + valueInternal: 0.07530979 ReferencePoseValue: valueInternal: -0.01317727 PoseValueList: [] @@ -13245,10 +13245,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.01317727 + valueInternal: 0.07530979 newKeyListSerialized: 02000000000000000000053c9a3d0000000000000000abaaaa3eabaaaa3e44010000000100000000053c9a3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.25353977 + valueInternal: -0.70363027 ReferencePoseValue: valueInternal: -0.25353977 PoseValueList: [] @@ -13259,10 +13259,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.25353977 + valueInternal: -0.70363027 newKeyListSerialized: 020000000000000000001d2134bf0000000000000000abaaaa3eabaaaa3e440100000001000000001d2134bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9657145 + valueInternal: 0.70494175 ReferencePoseValue: valueInternal: 0.9657145 PoseValueList: [] @@ -13273,7 +13273,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9657145 + valueInternal: 0.70494175 newKeyListSerialized: 020000000000000000001077343f0000000000000000abaaaa3eabaaaa3e440100000001000000001077343f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -13489,7 +13489,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 1.6304381e-16 + valueInternal: 0.014484646 ReferencePoseValue: valueInternal: 1.6304381e-16 PoseValueList: [] @@ -13500,10 +13500,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.6304381e-16 + valueInternal: 0.014484646 newKeyListSerialized: 0200000000000000000002516d3c0000000000000000abaaaa3eabaaaa3e4401000000010000000002516d3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -4.4933213e-16 + valueInternal: 0.026761495 ReferencePoseValue: valueInternal: -4.4933213e-16 PoseValueList: [] @@ -13514,10 +13514,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -4.4933213e-16 + valueInternal: 0.026761495 newKeyListSerialized: 02000000000000000000ec3adb3c0000000000000000abaaaa3eabaaaa3e44010000000100000000ec3adb3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.16473773 + valueInternal: -0.6596887 ReferencePoseValue: valueInternal: -0.16473773 PoseValueList: [] @@ -13528,10 +13528,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.16473773 + valueInternal: -0.6596887 newKeyListSerialized: 020000000000000000005ce128bf0000000000000000abaaaa3eabaaaa3e440100000001000000005ce128bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9863374 + valueInternal: 0.7509233 ReferencePoseValue: valueInternal: 0.9863374 PoseValueList: [] @@ -13542,7 +13542,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9863374 + valueInternal: 0.7509233 newKeyListSerialized: 02000000000000000000823c403f0000000000000000abaaaa3eabaaaa3e44010000000100000000823c403f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -13758,7 +13758,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -3.7109125e-16 + valueInternal: 0.013737011 ReferencePoseValue: valueInternal: -3.7109125e-16 PoseValueList: [] @@ -13769,10 +13769,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -3.7109125e-16 + valueInternal: 0.013737011 newKeyListSerialized: 020000000000000000003311613c0000000000000000abaaaa3eabaaaa3e440100000001000000003311613c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 3.6388872e-16 + valueInternal: 0.027153153 ReferencePoseValue: valueInternal: 3.6388872e-16 PoseValueList: [] @@ -13783,10 +13783,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 3.6388872e-16 + valueInternal: 0.027153153 newKeyListSerialized: 020000000000000000004a70de3c0000000000000000abaaaa3eabaaaa3e440100000001000000004a70de3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.07992057 + valueInternal: -0.6652811 ReferencePoseValue: valueInternal: -0.07992057 PoseValueList: [] @@ -13797,10 +13797,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.07992057 + valueInternal: -0.6652811 newKeyListSerialized: 02000000000000000000dd4f2abf0000000000000000abaaaa3eabaaaa3e44010000000100000000dd4f2abf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.99680126 + valueInternal: 0.74597275 ReferencePoseValue: valueInternal: 0.99680126 PoseValueList: [] @@ -13811,7 +13811,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.99680126 + valueInternal: 0.74597275 newKeyListSerialized: 0200000000000000000012f83e3f0000000000000000abaaaa3eabaaaa3e4401000000010000000012f83e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -14027,7 +14027,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.50519353 + valueInternal: 0.46131757 ReferencePoseValue: valueInternal: 0.50519353 PoseValueList: [] @@ -14038,10 +14038,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.50519353 + valueInternal: 0.46131757 newKeyListSerialized: 02000000000000000000d131ec3e0000000000000000abaaaa3eabaaaa3e44010000000100000000d131ec3e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.3691297 + valueInternal: -0.44174165 ReferencePoseValue: valueInternal: -0.3691297 PoseValueList: [] @@ -14052,10 +14052,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.3691297 + valueInternal: -0.44174165 newKeyListSerialized: 02000000000000000000f62be2be0000000000000000abaaaa3eabaaaa3e44010000000100000000f62be2be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.06703917 + valueInternal: -0.053030174 ReferencePoseValue: valueInternal: 0.06703917 PoseValueList: [] @@ -14066,10 +14066,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.06703917 + valueInternal: -0.053030174 newKeyListSerialized: 020000000000000000002b3659bd0000000000000000abaaaa3eabaaaa3e440100000001000000002b3659bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7771927 + valueInternal: 0.76761913 ReferencePoseValue: valueInternal: 0.7771927 PoseValueList: [] @@ -14080,7 +14080,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7771927 + valueInternal: 0.76761913 newKeyListSerialized: 02000000000000000000b082443f0000000000000000abaaaa3eabaaaa3e44010000000100000000b082443f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -14296,7 +14296,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.03356521 + valueInternal: 0.014754489 ReferencePoseValue: valueInternal: 0.03356521 PoseValueList: [] @@ -14307,10 +14307,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.03356521 + valueInternal: 0.014754489 newKeyListSerialized: 02000000000000000000d0bc713c0000000000000000abaaaa3eabaaaa3e44010000000100000000d0bc713c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.01030245 + valueInternal: 0.076458216 ReferencePoseValue: valueInternal: 0.01030245 PoseValueList: [] @@ -14321,10 +14321,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.01030245 + valueInternal: 0.076458216 newKeyListSerialized: 0200000000000000000020969c3d0000000000000000abaaaa3eabaaaa3e4401000000010000000020969c3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.20185572 + valueInternal: -0.18701956 ReferencePoseValue: valueInternal: -0.20185572 PoseValueList: [] @@ -14335,10 +14335,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.20185572 + valueInternal: -0.18701956 newKeyListSerialized: 020000000000000000000e823fbe0000000000000000abaaaa3eabaaaa3e440100000001000000000e823fbe0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.97878575 + valueInternal: 0.97926515 ReferencePoseValue: valueInternal: 0.97878575 PoseValueList: [] @@ -14349,7 +14349,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.97878575 + valueInternal: 0.97926515 newKeyListSerialized: 020000000000000000001fb17a3f0000000000000000abaaaa3eabaaaa3e440100000001000000001fb17a3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -14565,7 +14565,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -9.193674e-17 + valueInternal: -0.024934556 ReferencePoseValue: valueInternal: -9.193674e-17 PoseValueList: [] @@ -14576,10 +14576,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -9.193674e-17 + valueInternal: -0.024934556 newKeyListSerialized: 020000000000000000008e43ccbc0000000000000000abaaaa3eabaaaa3e440100000001000000008e43ccbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 6.376662e-17 + valueInternal: 0.044454366 ReferencePoseValue: valueInternal: 6.376662e-17 PoseValueList: [] @@ -14590,10 +14590,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 6.376662e-17 + valueInternal: 0.044454366 newKeyListSerialized: 02000000000000000000c815363d0000000000000000abaaaa3eabaaaa3e44010000000100000000c815363d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.087155744 + valueInternal: -0.1885523 ReferencePoseValue: valueInternal: -0.087155744 PoseValueList: [] @@ -14604,10 +14604,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.087155744 + valueInternal: -0.1885523 newKeyListSerialized: 02000000000000000000db1341be0000000000000000abaaaa3eabaaaa3e44010000000100000000db1341be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9961947 + valueInternal: 0.9807396 ReferencePoseValue: valueInternal: 0.9961947 PoseValueList: [] @@ -14618,7 +14618,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9961947 + valueInternal: 0.9807396 newKeyListSerialized: 02000000000000000000c0117b3f0000000000000000abaaaa3eabaaaa3e44010000000100000000c0117b3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -16179,7 +16179,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.7545604 + valueInternal: 0.71628493 ReferencePoseValue: valueInternal: 0.7545604 PoseValueList: [] @@ -16190,10 +16190,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7545604 + valueInternal: 0.71628493 newKeyListSerialized: 02000000000000000000735e373f0000000000000000abaaaa3eabaaaa3e44010000000100000000735e373f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.0832783 + valueInternal: 0.08777306 ReferencePoseValue: valueInternal: 0.0832783 PoseValueList: [] @@ -16204,10 +16204,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.0832783 + valueInternal: 0.08777306 newKeyListSerialized: 020000000000000000005dc2b33d0000000000000000abaaaa3eabaaaa3e440100000001000000005dc2b33d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.6496141 + valueInternal: 0.69136405 ReferencePoseValue: valueInternal: 0.6496141 PoseValueList: [] @@ -16218,10 +16218,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.6496141 + valueInternal: 0.69136405 newKeyListSerialized: 020000000000000000003cfd303f0000000000000000abaaaa3eabaaaa3e440100000001000000003cfd303f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.041289967 + valueInternal: -0.0353217 ReferencePoseValue: valueInternal: -0.041289967 PoseValueList: [] @@ -16232,7 +16232,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.041289967 + valueInternal: -0.0353217 newKeyListSerialized: 020000000000000000007dad10bd0000000000000000abaaaa3eabaaaa3e440100000001000000007dad10bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -16448,7 +16448,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.01994785 + valueInternal: -0.16102028 ReferencePoseValue: valueInternal: -0.01994785 PoseValueList: [] @@ -16459,10 +16459,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.01994785 + valueInternal: -0.16102028 newKeyListSerialized: 0200000000000000000080e224be0000000000000000abaaaa3eabaaaa3e4401000000010000000080e224be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.39173076 + valueInternal: -0.43316105 ReferencePoseValue: valueInternal: -0.39173076 PoseValueList: [] @@ -16473,10 +16473,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.39173076 + valueInternal: -0.43316105 newKeyListSerialized: 0200000000000000000049c7ddbe0000000000000000abaaaa3eabaaaa3e4401000000010000000049c7ddbe0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.020190157 + valueInternal: 0.54169196 ReferencePoseValue: valueInternal: 0.020190157 PoseValueList: [] @@ -16487,10 +16487,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.020190157 + valueInternal: 0.54169196 newKeyListSerialized: 0200000000000000000053ac0a3f0000000000000000abaaaa3eabaaaa3e4401000000010000000053ac0a3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.91964203 + valueInternal: 0.70214945 ReferencePoseValue: valueInternal: 0.91964203 PoseValueList: [] @@ -16501,7 +16501,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.91964203 + valueInternal: 0.70214945 newKeyListSerialized: 0200000000000000000011c0333f0000000000000000abaaaa3eabaaaa3e4401000000010000000011c0333f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -16717,7 +16717,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -9.217045e-17 + valueInternal: -0.18839227 ReferencePoseValue: valueInternal: -9.217045e-17 PoseValueList: [] @@ -16728,10 +16728,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -9.217045e-17 + valueInternal: -0.18839227 newKeyListSerialized: 02000000000000000000e7e940be0000000000000000abaaaa3eabaaaa3e44010000000100000000e7e940be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -2.3871787e-16 + valueInternal: -0.045563564 ReferencePoseValue: valueInternal: -2.3871787e-16 PoseValueList: [] @@ -16742,10 +16742,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -2.3871787e-16 + valueInternal: -0.045563564 newKeyListSerialized: 02000000000000000000dca03abd0000000000000000abaaaa3eabaaaa3e44010000000100000000dca03abd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.33363262 + valueInternal: 0.3312921 ReferencePoseValue: valueInternal: 0.33363262 PoseValueList: [] @@ -16756,10 +16756,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.33363262 + valueInternal: 0.3312921 newKeyListSerialized: 020000000000000000001e9fa93e0000000000000000abaaaa3eabaaaa3e440100000001000000001e9fa93e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9427032 + valueInternal: 0.92340565 ReferencePoseValue: valueInternal: 0.9427032 PoseValueList: [] @@ -16770,7 +16770,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9427032 + valueInternal: 0.92340565 newKeyListSerialized: 0200000000000000000050646c3f0000000000000000abaaaa3eabaaaa3e4401000000010000000050646c3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -16986,7 +16986,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.55758685 + valueInternal: -0.75300705 ReferencePoseValue: valueInternal: -0.55758685 PoseValueList: [] @@ -16997,10 +16997,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.55758685 + valueInternal: -0.75300705 newKeyListSerialized: 0200000000000000000012c540bf0000000000000000abaaaa3eabaaaa3e4401000000010000000012c540bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.001678249 + valueInternal: 0.09807466 ReferencePoseValue: valueInternal: -0.001678249 PoseValueList: [] @@ -17011,10 +17011,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.001678249 + valueInternal: 0.09807466 newKeyListSerialized: 020000000000000000005edbc83d0000000000000000abaaaa3eabaaaa3e440100000001000000005edbc83d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.02056061 + valueInternal: -0.006336633 ReferencePoseValue: valueInternal: -0.02056061 PoseValueList: [] @@ -17025,10 +17025,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.02056061 + valueInternal: -0.006336633 newKeyListSerialized: 0200000000000000000088a3cfbb0000000000000000abaaaa3eabaaaa3e4401000000010000000088a3cfbb0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.82986224 + valueInternal: 0.65063167 ReferencePoseValue: valueInternal: 0.82986224 PoseValueList: [] @@ -17039,7 +17039,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.82986224 + valueInternal: 0.65063167 newKeyListSerialized: 02000000000000000000cc8f263f0000000000000000abaaaa3eabaaaa3e44010000000100000000cc8f263f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -17524,7 +17524,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -4.451975e-16 + valueInternal: -0.042171586 ReferencePoseValue: valueInternal: -4.451975e-16 PoseValueList: [] @@ -17535,10 +17535,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -4.451975e-16 + valueInternal: -0.042171586 newKeyListSerialized: 020000000000000000001dbc2cbd0000000000000000abaaaa3eabaaaa3e440100000001000000001dbc2cbd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 1.7711591e-16 + valueInternal: -0.02520001 ReferencePoseValue: valueInternal: 1.7711591e-16 PoseValueList: [] @@ -17549,10 +17549,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.7711591e-16 + valueInternal: -0.02520001 newKeyListSerialized: 020000000000000000004070cebc0000000000000000abaaaa3eabaaaa3e440100000001000000004070cebc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.20255657 + valueInternal: 0.5554784 ReferencePoseValue: valueInternal: -0.20255657 PoseValueList: [] @@ -17563,10 +17563,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.20255657 + valueInternal: 0.5554784 newKeyListSerialized: 02000000000000000000d5330e3f0000000000000000abaaaa3eabaaaa3e44010000000100000000d5330e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9792706 + valueInternal: -0.8300789 ReferencePoseValue: valueInternal: 0.9792706 PoseValueList: [] @@ -17577,7 +17577,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9792706 + valueInternal: -0.8300789 newKeyListSerialized: 020000000000000000000d8054bf0000000000000000abaaaa3eabaaaa3e440100000001000000000d8054bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -17793,7 +17793,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 3.178986e-16 + valueInternal: 0.037751526 ReferencePoseValue: valueInternal: 3.178986e-16 PoseValueList: [] @@ -17804,10 +17804,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 3.178986e-16 + valueInternal: 0.037751526 newKeyListSerialized: 0200000000000000000058a11a3d0000000000000000abaaaa3eabaaaa3e4401000000010000000058a11a3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -4.0544026e-16 + valueInternal: 0.08755188 ReferencePoseValue: valueInternal: -4.0544026e-16 PoseValueList: [] @@ -17818,10 +17818,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -4.0544026e-16 + valueInternal: 0.08755188 newKeyListSerialized: 02000000000000000000664eb33d0000000000000000abaaaa3eabaaaa3e44010000000100000000664eb33d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.12959665 + valueInternal: 0.6126037 ReferencePoseValue: valueInternal: -0.12959665 PoseValueList: [] @@ -17832,10 +17832,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.12959665 + valueInternal: 0.6126037 newKeyListSerialized: 0200000000000000000099d31c3f0000000000000000abaaaa3eabaaaa3e4401000000010000000099d31c3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.99156684 + valueInternal: -0.7846186 ReferencePoseValue: valueInternal: 0.99156684 PoseValueList: [] @@ -17846,7 +17846,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.99156684 + valueInternal: -0.7846186 newKeyListSerialized: 02000000000000000000c4dc48bf0000000000000000abaaaa3eabaaaa3e44010000000100000000c4dc48bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -18062,7 +18062,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -3.590716e-16 + valueInternal: 0.05484819 ReferencePoseValue: valueInternal: -3.590716e-16 PoseValueList: [] @@ -18073,10 +18073,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -3.590716e-16 + valueInternal: 0.05484819 newKeyListSerialized: 020000000000000000007fa8603d0000000000000000abaaaa3eabaaaa3e440100000001000000007fa8603d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 1.5106462e-16 + valueInternal: 0.07798502 ReferencePoseValue: valueInternal: 1.5106462e-16 PoseValueList: [] @@ -18087,10 +18087,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.5106462e-16 + valueInternal: 0.07798502 newKeyListSerialized: 020000000000000000009cb69f3d0000000000000000abaaaa3eabaaaa3e440100000001000000009cb69f3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.109009154 + valueInternal: 0.40683824 ReferencePoseValue: valueInternal: -0.109009154 PoseValueList: [] @@ -18101,10 +18101,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.109009154 + valueInternal: 0.40683824 newKeyListSerialized: 020000000000000000001a4dd03e0000000000000000abaaaa3eabaaaa3e440100000001000000001a4dd03e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9940407 + valueInternal: -0.9085112 ReferencePoseValue: valueInternal: 0.9940407 PoseValueList: [] @@ -18115,7 +18115,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9940407 + valueInternal: -0.9085112 newKeyListSerialized: 02000000000000000000319468bf0000000000000000abaaaa3eabaaaa3e44010000000100000000319468bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -18600,7 +18600,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 7.238114e-18 + valueInternal: -0.014290191 ReferencePoseValue: valueInternal: 7.238114e-18 PoseValueList: [] @@ -18611,10 +18611,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 7.238114e-18 + valueInternal: -0.014290191 newKeyListSerialized: 0200000000000000000068216abc0000000000000000abaaaa3eabaaaa3e4401000000010000000068216abc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -2.0395058e-16 + valueInternal: -0.024388462 ReferencePoseValue: valueInternal: -2.0395058e-16 PoseValueList: [] @@ -18625,10 +18625,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -2.0395058e-16 + valueInternal: -0.024388462 newKeyListSerialized: 0200000000000000000050cac7bc0000000000000000abaaaa3eabaaaa3e4401000000010000000050cac7bc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.27205086 + valueInternal: 0.63642806 ReferencePoseValue: valueInternal: -0.27205086 PoseValueList: [] @@ -18639,10 +18639,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.27205086 + valueInternal: 0.63642806 newKeyListSerialized: 02000000000000000000f3ec223f0000000000000000abaaaa3eabaaaa3e44010000000100000000f3ec223f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9622829 + valueInternal: -0.7708189 ReferencePoseValue: valueInternal: 0.9622829 PoseValueList: [] @@ -18653,7 +18653,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9622829 + valueInternal: -0.7708189 newKeyListSerialized: 02000000000000000000635445bf0000000000000000abaaaa3eabaaaa3e44010000000100000000635445bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -18869,7 +18869,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 1.3949614e-16 + valueInternal: 0.022887217 ReferencePoseValue: valueInternal: 1.3949614e-16 PoseValueList: [] @@ -18880,10 +18880,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.3949614e-16 + valueInternal: 0.022887217 newKeyListSerialized: 02000000000000000000f97dbb3c0000000000000000abaaaa3eabaaaa3e44010000000100000000f97dbb3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 2.8483206e-16 + valueInternal: 0.0030220088 ReferencePoseValue: valueInternal: 2.8483206e-16 PoseValueList: [] @@ -18894,10 +18894,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 2.8483206e-16 + valueInternal: 0.0030220088 newKeyListSerialized: 02000000000000000000e50c463b0000000000000000abaaaa3eabaaaa3e44010000000100000000e50c463b0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.18025488 + valueInternal: 0.6331344 ReferencePoseValue: valueInternal: -0.18025488 PoseValueList: [] @@ -18908,10 +18908,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.18025488 + valueInternal: 0.6331344 newKeyListSerialized: 020000000000000000001915223f0000000000000000abaaaa3eabaaaa3e440100000001000000001915223f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.98362 + valueInternal: -0.77369773 ReferencePoseValue: valueInternal: 0.98362 PoseValueList: [] @@ -18922,7 +18922,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.98362 + valueInternal: -0.77369773 newKeyListSerialized: 020000000000000000000e1146bf0000000000000000abaaaa3eabaaaa3e440100000001000000000e1146bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -19138,7 +19138,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 1.2200574e-16 + valueInternal: 0.023069648 ReferencePoseValue: valueInternal: 1.2200574e-16 PoseValueList: [] @@ -19149,10 +19149,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.2200574e-16 + valueInternal: 0.023069648 newKeyListSerialized: 020000000000000000008ffcbc3c0000000000000000abaaaa3eabaaaa3e440100000001000000008ffcbc3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -3.8535718e-17 + valueInternal: 0.0007349544 ReferencePoseValue: valueInternal: -3.8535718e-17 PoseValueList: [] @@ -19163,10 +19163,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -3.8535718e-17 + valueInternal: 0.0007349544 newKeyListSerialized: 02000000000000000000f4a9403a0000000000000000abaaaa3eabaaaa3e44010000000100000000f4a9403a0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.087155744 + valueInternal: 0.4942548 ReferencePoseValue: valueInternal: -0.087155744 PoseValueList: [] @@ -19177,10 +19177,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.087155744 + valueInternal: 0.4942548 newKeyListSerialized: 02000000000000000000f70efd3e0000000000000000abaaaa3eabaaaa3e44010000000100000000f70efd3e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9961947 + valueInternal: -0.8690106 ReferencePoseValue: valueInternal: 0.9961947 PoseValueList: [] @@ -19191,7 +19191,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9961947 + valueInternal: -0.8690106 newKeyListSerialized: 020000000000000000007b775ebf0000000000000000abaaaa3eabaaaa3e440100000001000000007b775ebf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -19676,7 +19676,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.08998402 + valueInternal: -0.11173194 ReferencePoseValue: valueInternal: 0.08998402 PoseValueList: [] @@ -19687,10 +19687,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.08998402 + valueInternal: -0.11173194 newKeyListSerialized: 02000000000000000000b7d3e4bd0000000000000000abaaaa3eabaaaa3e44010000000100000000b7d3e4bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.017015995 + valueInternal: -0.05399457 ReferencePoseValue: valueInternal: -0.017015995 PoseValueList: [] @@ -19701,10 +19701,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.017015995 + valueInternal: -0.05399457 newKeyListSerialized: 0200000000000000000069295dbd0000000000000000abaaaa3eabaaaa3e4401000000010000000069295dbd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.1280659 + valueInternal: 0.34303504 ReferencePoseValue: valueInternal: -0.1280659 PoseValueList: [] @@ -19715,10 +19715,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.1280659 + valueInternal: 0.34303504 newKeyListSerialized: 020000000000000000004aa2af3e0000000000000000abaaaa3eabaaaa3e440100000001000000004aa2af3e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.98752844 + valueInternal: -0.9310898 ReferencePoseValue: valueInternal: 0.98752844 PoseValueList: [] @@ -19729,7 +19729,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.98752844 + valueInternal: -0.9310898 newKeyListSerialized: 02000000000000000000e75b6ebf0000000000000000abaaaa3eabaaaa3e44010000000100000000e75b6ebf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -19945,7 +19945,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -2.4258357e-16 + valueInternal: 0.016319372 ReferencePoseValue: valueInternal: -2.4258357e-16 PoseValueList: [] @@ -19956,10 +19956,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -2.4258357e-16 + valueInternal: 0.016319372 newKeyListSerialized: 0200000000000000000034b0853c0000000000000000abaaaa3eabaaaa3e4401000000010000000034b0853c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -1.0973908e-16 + valueInternal: -0.14385234 ReferencePoseValue: valueInternal: -1.0973908e-16 PoseValueList: [] @@ -19970,10 +19970,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -1.0973908e-16 + valueInternal: -0.14385234 newKeyListSerialized: 02000000000000000000074e13be0000000000000000abaaaa3eabaaaa3e44010000000100000000074e13be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.18469755 + valueInternal: 0.66374105 ReferencePoseValue: valueInternal: -0.18469755 PoseValueList: [] @@ -19984,10 +19984,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.18469755 + valueInternal: 0.66374105 newKeyListSerialized: 02000000000000000000efea293f0000000000000000abaaaa3eabaaaa3e44010000000100000000efea293f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9827954 + valueInternal: -0.73381835 ReferencePoseValue: valueInternal: 0.9827954 PoseValueList: [] @@ -19998,7 +19998,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9827954 + valueInternal: -0.73381835 newKeyListSerialized: 0200000000000000000085db3bbf0000000000000000abaaaa3eabaaaa3e4401000000010000000085db3bbf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -20214,7 +20214,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.000000014887448 + valueInternal: -0.13972063 ReferencePoseValue: valueInternal: 0.000000014887448 PoseValueList: [] @@ -20225,10 +20225,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.000000014887448 + valueInternal: -0.13972063 newKeyListSerialized: 02000000000000000000ed120fbe0000000000000000abaaaa3eabaaaa3e44010000000100000000ed120fbe0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -6.391964e-10 + valueInternal: -0.0859377 ReferencePoseValue: valueInternal: -6.391964e-10 PoseValueList: [] @@ -20239,10 +20239,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -6.391964e-10 + valueInternal: -0.0859377 newKeyListSerialized: 020000000000000000001b00b0bd0000000000000000abaaaa3eabaaaa3e440100000001000000001b00b0bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.042895757 + valueInternal: 0.4454335 ReferencePoseValue: valueInternal: -0.042895757 PoseValueList: [] @@ -20253,10 +20253,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.042895757 + valueInternal: 0.4454335 newKeyListSerialized: 02000000000000000000dc0fe43e0000000000000000abaaaa3eabaaaa3e44010000000100000000dc0fe43e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9990796 + valueInternal: -0.8801609 ReferencePoseValue: valueInternal: 0.9990796 PoseValueList: [] @@ -20267,7 +20267,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9990796 + valueInternal: -0.8801609 newKeyListSerialized: 020000000000000000003a5261bf0000000000000000abaaaa3eabaaaa3e440100000001000000003a5261bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -20752,7 +20752,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.054216176 + valueInternal: -0.034832343 ReferencePoseValue: valueInternal: 0.054216176 PoseValueList: [] @@ -20763,10 +20763,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.054216176 + valueInternal: -0.034832343 newKeyListSerialized: 020000000000000000005cac0ebd0000000000000000abaaaa3eabaaaa3e440100000001000000005cac0ebd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.01317727 + valueInternal: -0.08704354 ReferencePoseValue: valueInternal: -0.01317727 PoseValueList: [] @@ -20777,10 +20777,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.01317727 + valueInternal: -0.08704354 newKeyListSerialized: 02000000000000000000e243b2bd0000000000000000abaaaa3eabaaaa3e44010000000100000000e243b2bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.25353977 + valueInternal: 0.6287977 ReferencePoseValue: valueInternal: -0.25353977 PoseValueList: [] @@ -20791,10 +20791,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.25353977 + valueInternal: 0.6287977 newKeyListSerialized: 02000000000000000000e3f8203f0000000000000000abaaaa3eabaaaa3e44010000000100000000e3f8203f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9657145 + valueInternal: -0.7718961 ReferencePoseValue: valueInternal: 0.9657145 PoseValueList: [] @@ -20805,7 +20805,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9657145 + valueInternal: -0.7718961 newKeyListSerialized: 02000000000000000000fc9a45bf0000000000000000abaaaa3eabaaaa3e44010000000100000000fc9a45bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -21021,7 +21021,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -1.5397508e-16 + valueInternal: -0.006810576 ReferencePoseValue: valueInternal: -1.5397508e-16 PoseValueList: [] @@ -21032,10 +21032,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -1.5397508e-16 + valueInternal: -0.006810576 newKeyListSerialized: 02000000000000000000412bdfbb0000000000000000abaaaa3eabaaaa3e44010000000100000000412bdfbb0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -3.4010369e-16 + valueInternal: -0.037440967 ReferencePoseValue: valueInternal: -3.4010369e-16 PoseValueList: [] @@ -21046,10 +21046,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -3.4010369e-16 + valueInternal: -0.037440967 newKeyListSerialized: 02000000000000000000b35b19bd0000000000000000abaaaa3eabaaaa3e44010000000100000000b35b19bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.16473773 + valueInternal: 0.6595794 ReferencePoseValue: valueInternal: -0.16473773 PoseValueList: [] @@ -21060,10 +21060,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.16473773 + valueInternal: 0.6595794 newKeyListSerialized: 0200000000000000000032da283f0000000000000000abaaaa3eabaaaa3e4401000000010000000032da283f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9863374 + valueInternal: -0.75067097 ReferencePoseValue: valueInternal: 0.9863374 PoseValueList: [] @@ -21074,7 +21074,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9863374 + valueInternal: -0.75067097 newKeyListSerialized: 02000000000000000000f92b40bf0000000000000000abaaaa3eabaaaa3e44010000000100000000f92b40bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -21290,7 +21290,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -1.8648887e-16 + valueInternal: -0.0153708225 ReferencePoseValue: valueInternal: -1.8648887e-16 PoseValueList: [] @@ -21301,10 +21301,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -1.8648887e-16 + valueInternal: -0.0153708225 newKeyListSerialized: 02000000000000000000e7d57bbc0000000000000000abaaaa3eabaaaa3e44010000000100000000e7d57bbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -6.858181e-17 + valueInternal: -0.034813665 ReferencePoseValue: valueInternal: -6.858181e-17 PoseValueList: [] @@ -21315,10 +21315,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -6.858181e-17 + valueInternal: -0.034813665 newKeyListSerialized: 02000000000000000000c6980ebd0000000000000000abaaaa3eabaaaa3e44010000000100000000c6980ebd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.07992057 + valueInternal: 0.46977198 ReferencePoseValue: valueInternal: -0.07992057 PoseValueList: [] @@ -21329,10 +21329,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.07992057 + valueInternal: 0.46977198 newKeyListSerialized: 02000000000000000000f485f03e0000000000000000abaaaa3eabaaaa3e44010000000100000000f485f03e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.99680126 + valueInternal: -0.8819676 ReferencePoseValue: valueInternal: 0.99680126 PoseValueList: [] @@ -21343,7 +21343,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.99680126 + valueInternal: -0.8819676 newKeyListSerialized: 02000000000000000000a1c861bf0000000000000000abaaaa3eabaaaa3e44010000000100000000a1c861bf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -21559,7 +21559,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.5051934 + valueInternal: 0.58969223 ReferencePoseValue: valueInternal: 0.5051934 PoseValueList: [] @@ -21570,10 +21570,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.5051934 + valueInternal: 0.58969223 newKeyListSerialized: 0200000000000000000012f6163f0000000000000000abaaaa3eabaaaa3e4401000000010000000012f6163f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.36912975 + valueInternal: -0.43866277 ReferencePoseValue: valueInternal: -0.36912975 PoseValueList: [] @@ -21584,10 +21584,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.36912975 + valueInternal: -0.43866277 newKeyListSerialized: 020000000000000000006898e0be0000000000000000abaaaa3eabaaaa3e440100000001000000006898e0be0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.06703907 + valueInternal: 0.3540516 ReferencePoseValue: valueInternal: 0.06703907 PoseValueList: [] @@ -21598,10 +21598,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.06703907 + valueInternal: 0.3540516 newKeyListSerialized: 020000000000000000004046b53e0000000000000000abaaaa3eabaaaa3e440100000001000000004046b53e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7771928 + valueInternal: 0.5783472 ReferencePoseValue: valueInternal: 0.7771928 PoseValueList: [] @@ -21612,7 +21612,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7771928 + valueInternal: 0.5783472 newKeyListSerialized: 02000000000000000000900e143f0000000000000000abaaaa3eabaaaa3e44010000000100000000900e143f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -21828,7 +21828,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.03356521 + valueInternal: -0.017112667 ReferencePoseValue: valueInternal: 0.03356521 PoseValueList: [] @@ -21839,10 +21839,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.03356521 + valueInternal: -0.017112667 newKeyListSerialized: 02000000000000000000dd2f8cbc0000000000000000abaaaa3eabaaaa3e44010000000100000000dd2f8cbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.01030245 + valueInternal: -0.024984494 ReferencePoseValue: valueInternal: 0.01030245 PoseValueList: [] @@ -21853,10 +21853,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.01030245 + valueInternal: -0.024984494 newKeyListSerialized: 0200000000000000000048acccbc0000000000000000abaaaa3eabaaaa3e4401000000010000000048acccbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.20185572 + valueInternal: 0.06675618 ReferencePoseValue: valueInternal: -0.20185572 PoseValueList: [] @@ -21867,10 +21867,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.20185572 + valueInternal: 0.06675618 newKeyListSerialized: 0200000000000000000077b7883d0000000000000000abaaaa3eabaaaa3e4401000000010000000077b7883d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.97878575 + valueInternal: -0.99731016 ReferencePoseValue: valueInternal: 0.97878575 PoseValueList: [] @@ -21881,7 +21881,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.97878575 + valueInternal: -0.99731016 newKeyListSerialized: 02000000000000000000b84f7fbf0000000000000000abaaaa3eabaaaa3e44010000000100000000b84f7fbf0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -22097,7 +22097,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -1.2891824e-16 + valueInternal: -0.01246169 ReferencePoseValue: valueInternal: -1.2891824e-16 PoseValueList: [] @@ -22108,10 +22108,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -1.2891824e-16 + valueInternal: -0.01246169 newKeyListSerialized: 020000000000000000001e2c4cbc0000000000000000abaaaa3eabaaaa3e440100000001000000001e2c4cbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 3.9140483e-17 + valueInternal: 0.021071797 ReferencePoseValue: valueInternal: 3.9140483e-17 PoseValueList: [] @@ -22122,10 +22122,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 3.9140483e-17 + valueInternal: 0.021071797 newKeyListSerialized: 02000000000000000000c39eac3c0000000000000000abaaaa3eabaaaa3e44010000000100000000c39eac3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.087155744 + valueInternal: -0.045577236 ReferencePoseValue: valueInternal: -0.087155744 PoseValueList: [] @@ -22136,10 +22136,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.087155744 + valueInternal: -0.045577236 newKeyListSerialized: 0200000000000000000032af3abd0000000000000000abaaaa3eabaaaa3e4401000000010000000032af3abd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9961947 + valueInternal: 0.9986612 ReferencePoseValue: valueInternal: 0.9961947 PoseValueList: [] @@ -22150,7 +22150,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9961947 + valueInternal: 0.9986612 newKeyListSerialized: 0200000000000000000043a87f3f0000000000000000abaaaa3eabaaaa3e4401000000010000000043a87f3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -23711,7 +23711,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 2.331743e-26 + valueInternal: 0.020986166 ReferencePoseValue: valueInternal: 2.331743e-26 PoseValueList: [] @@ -23722,10 +23722,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 2.331743e-26 + valueInternal: 0.020986166 newKeyListSerialized: 020000000000000000002eebab3c0000000000000000abaaaa3eabaaaa3e440100000001000000002eebab3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 1.0188271e-27 + valueInternal: -0.00033505866 ReferencePoseValue: valueInternal: 1.0188271e-27 PoseValueList: [] @@ -23736,10 +23736,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.0188271e-27 + valueInternal: -0.00033505866 newKeyListSerialized: 02000000000000000000d0aaafb90000000000000000abaaaa3eabaaaa3e44010000000100000000d0aaafb90000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.20730051 + valueInternal: 0.20824216 ReferencePoseValue: valueInternal: 0.20730051 PoseValueList: [] @@ -23750,10 +23750,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.20730051 + valueInternal: 0.20824216 newKeyListSerialized: 020000000000000000006f3d553e0000000000000000abaaaa3eabaaaa3e440100000001000000006f3d553e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9782773 + valueInternal: 0.9778521 ReferencePoseValue: valueInternal: 0.9782773 PoseValueList: [] @@ -23764,7 +23764,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9782773 + valueInternal: 0.9778521 newKeyListSerialized: 0200000000000000000084547a3f0000000000000000abaaaa3eabaaaa3e4401000000010000000084547a3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -24518,7 +24518,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.0000029681603 + valueInternal: 0.004810615 ReferencePoseValue: valueInternal: 0.0000029681603 PoseValueList: [] @@ -24529,10 +24529,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.0000029681603 + valueInternal: 0.004810615 newKeyListSerialized: 020000000000000000005da29d3b0000000000000000abaaaa3eabaaaa3e440100000001000000005da29d3b0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.00000030712667 + valueInternal: -0.0015895684 ReferencePoseValue: valueInternal: 0.00000030712667 PoseValueList: [] @@ -24543,10 +24543,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.00000030712667 + valueInternal: -0.0015895684 newKeyListSerialized: 020000000000000000001159d0ba0000000000000000abaaaa3eabaaaa3e440100000001000000001159d0ba0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.10705551 + valueInternal: -0.06290296 ReferencePoseValue: valueInternal: -0.10705551 PoseValueList: [] @@ -24557,10 +24557,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.10705551 + valueInternal: -0.06290296 newKeyListSerialized: 0200000000000000000044d380bd0000000000000000abaaaa3eabaaaa3e4401000000010000000044d380bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.99425304 + valueInternal: 0.9980068 ReferencePoseValue: valueInternal: 0.99425304 PoseValueList: [] @@ -24571,7 +24571,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.99425304 + valueInternal: 0.9980068 newKeyListSerialized: 02000000000000000000607d7f3f0000000000000000abaaaa3eabaaaa3e44010000000100000000607d7f3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -36086,7 +36086,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 0.07240499 + valueInternal: 0.11358028 ReferencePoseValue: valueInternal: 0.07240499 PoseValueList: [] @@ -36097,10 +36097,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.07240499 + valueInternal: 0.11358028 newKeyListSerialized: 02000000000000000000c79ce83d0000000000000000abaaaa3eabaaaa3e44010000000100000000c79ce83d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.029462025 + valueInternal: 0.06169392 ReferencePoseValue: valueInternal: 0.029462025 PoseValueList: [] @@ -36111,10 +36111,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.029462025 + valueInternal: 0.06169392 newKeyListSerialized: 02000000000000000000c4b27c3d0000000000000000abaaaa3eabaaaa3e44010000000100000000c4b27c3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.02896951 + valueInternal: -0.035066895 ReferencePoseValue: valueInternal: 0.02896951 PoseValueList: [] @@ -36125,10 +36125,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.02896951 + valueInternal: -0.035066895 newKeyListSerialized: 020000000000000000004ea20fbd0000000000000000abaaaa3eabaaaa3e440100000001000000004ea20fbd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9965191 + valueInternal: 0.9909913 ReferencePoseValue: valueInternal: 0.9965191 PoseValueList: [] @@ -36139,7 +36139,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9965191 + valueInternal: 0.9909913 newKeyListSerialized: 020000000000000000009bb17d3f0000000000000000abaaaa3eabaaaa3e440100000001000000009bb17d3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -36355,7 +36355,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -1.7330692e-18 + valueInternal: -0.017116316 ReferencePoseValue: valueInternal: -1.7330692e-18 PoseValueList: [] @@ -36366,10 +36366,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -1.7330692e-18 + valueInternal: -0.017116316 newKeyListSerialized: 0200000000000000000084378cbc0000000000000000abaaaa3eabaaaa3e4401000000010000000084378cbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -7.5740844e-20 + valueInternal: -0.014065158 ReferencePoseValue: valueInternal: -7.5740844e-20 PoseValueList: [] @@ -36380,10 +36380,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -7.5740844e-20 + valueInternal: -0.014065158 newKeyListSerialized: 020000000000000000008c7166bc0000000000000000abaaaa3eabaaaa3e440100000001000000008c7166bc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.043661624 + valueInternal: 0.085640594 ReferencePoseValue: valueInternal: 0.043661624 PoseValueList: [] @@ -36394,10 +36394,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.043661624 + valueInternal: 0.085640594 newKeyListSerialized: 020000000000000000005664af3d0000000000000000abaaaa3eabaaaa3e440100000001000000005664af3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9990464 + valueInternal: 0.9960798 ReferencePoseValue: valueInternal: 0.9990464 PoseValueList: [] @@ -36408,7 +36408,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9990464 + valueInternal: 0.9960798 newKeyListSerialized: 0200000000000000000016ff7e3f0000000000000000abaaaa3eabaaaa3e4401000000010000000016ff7e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -37162,7 +37162,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.00066565565 + valueInternal: -0.018234238 ReferencePoseValue: valueInternal: -0.00066565565 PoseValueList: [] @@ -37173,10 +37173,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.00066565565 + valueInternal: -0.018234238 newKeyListSerialized: 02000000000000000000f85f95bc0000000000000000abaaaa3eabaaaa3e44010000000100000000f85f95bc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.026877109 + valueInternal: -0.050366934 ReferencePoseValue: valueInternal: -0.026877109 PoseValueList: [] @@ -37187,10 +37187,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.026877109 + valueInternal: -0.050366934 newKeyListSerialized: 020000000000000000008f4d4ebd0000000000000000abaaaa3eabaaaa3e440100000001000000008f4d4ebd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.023239296 + valueInternal: -0.021035478 ReferencePoseValue: valueInternal: -0.023239296 PoseValueList: [] @@ -37201,10 +37201,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.023239296 + valueInternal: -0.021035478 newKeyListSerialized: 020000000000000000009852acbc0000000000000000abaaaa3eabaaaa3e440100000001000000009852acbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.99936837 + valueInternal: 0.99834275 ReferencePoseValue: valueInternal: 0.99936837 PoseValueList: [] @@ -37215,7 +37215,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.99936837 + valueInternal: 0.99834275 newKeyListSerialized: 0200000000000000000064937f3f0000000000000000abaaaa3eabaaaa3e4401000000010000000064937f3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -37431,7 +37431,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 1.7128753e-17 + valueInternal: -0.000000011001248 ReferencePoseValue: valueInternal: 1.7128753e-17 PoseValueList: [] @@ -37442,10 +37442,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 1.7128753e-17 + valueInternal: -0.000000011001248 newKeyListSerialized: 0200000000000000000000003db20000000000000000abaaaa3eabaaaa3e4401000000010000000000003db20000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -1.7811548e-17 + valueInternal: -0.000000024097972 ReferencePoseValue: valueInternal: -1.7811548e-17 PoseValueList: [] @@ -37456,10 +37456,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -1.7811548e-17 + valueInternal: -0.000000024097972 newKeyListSerialized: 020000000000000000000000cfb20000000000000000abaaaa3eabaaaa3e440100000001000000000000cfb20000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7071068 + valueInternal: 0.7071067 ReferencePoseValue: valueInternal: 0.7071068 PoseValueList: [] @@ -37470,10 +37470,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7071068 + valueInternal: 0.7071067 newKeyListSerialized: 02000000000000000000f204353f0000000000000000abaaaa3eabaaaa3e44010000000100000000f204353f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7071068 + valueInternal: 0.70710695 ReferencePoseValue: valueInternal: 0.7071068 PoseValueList: [] @@ -37484,7 +37484,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7071068 + valueInternal: 0.70710695 newKeyListSerialized: 02000000000000000000f604353f0000000000000000abaaaa3eabaaaa3e44010000000100000000f604353f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -38238,7 +38238,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.029462025 + valueInternal: -0.054058768 ReferencePoseValue: valueInternal: -0.029462025 PoseValueList: [] @@ -38249,10 +38249,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.029462025 + valueInternal: -0.054058768 newKeyListSerialized: 02000000000000000000ba6c5dbd0000000000000000abaaaa3eabaaaa3e44010000000100000000ba6c5dbd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.07240499 + valueInternal: 0.15511884 ReferencePoseValue: valueInternal: 0.07240499 PoseValueList: [] @@ -38263,10 +38263,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.07240499 + valueInternal: 0.15511884 newKeyListSerialized: 0200000000000000000079d71e3e0000000000000000abaaaa3eabaaaa3e4401000000010000000079d71e3e0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9965191 + valueInternal: 0.9859836 ReferencePoseValue: valueInternal: 0.9965191 PoseValueList: [] @@ -38277,10 +38277,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9965191 + valueInternal: 0.9859836 newKeyListSerialized: 020000000000000000006c697c3f0000000000000000abaaaa3eabaaaa3e440100000001000000006c697c3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.02896951 + valueInternal: 0.029193554 ReferencePoseValue: valueInternal: -0.02896951 PoseValueList: [] @@ -38291,7 +38291,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.02896951 + valueInternal: 0.029193554 newKeyListSerialized: 020000000000000000005227ef3c0000000000000000abaaaa3eabaaaa3e440100000001000000005227ef3c0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -38507,7 +38507,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: 4.6144585e-18 + valueInternal: 0.04654016 ReferencePoseValue: valueInternal: 4.6144585e-18 PoseValueList: [] @@ -38518,10 +38518,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 4.6144585e-18 + valueInternal: 0.04654016 newKeyListSerialized: 02000000000000000000e5a03e3d0000000000000000abaaaa3eabaaaa3e44010000000100000000e5a03e3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 3.6744256e-18 + valueInternal: -0.015302908 ReferencePoseValue: valueInternal: 3.6744256e-18 PoseValueList: [] @@ -38532,10 +38532,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 3.6744256e-18 + valueInternal: -0.015302908 newKeyListSerialized: 020000000000000000000cb97abc0000000000000000abaaaa3eabaaaa3e440100000001000000000cb97abc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.043661624 + valueInternal: 0.091519535 ReferencePoseValue: valueInternal: 0.043661624 PoseValueList: [] @@ -38546,10 +38546,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.043661624 + valueInternal: 0.091519535 newKeyListSerialized: 02000000000000000000986ebb3d0000000000000000abaaaa3eabaaaa3e44010000000100000000986ebb3d0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.9990464 + valueInternal: 0.9945975 ReferencePoseValue: valueInternal: 0.9990464 PoseValueList: [] @@ -38560,7 +38560,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.9990464 + valueInternal: 0.9945975 newKeyListSerialized: 02000000000000000000f19d7e3f0000000000000000abaaaa3eabaaaa3e44010000000100000000f19d7e3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -39314,7 +39314,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -0.00066565565 + valueInternal: 0.0014848111 ReferencePoseValue: valueInternal: -0.00066565565 PoseValueList: [] @@ -39325,10 +39325,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.00066565565 + valueInternal: 0.0014848111 newKeyListSerialized: 02000000000000000000fe9dc23a0000000000000000abaaaa3eabaaaa3e44010000000100000000fe9dc23a0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.026877109 + valueInternal: -0.060889628 ReferencePoseValue: valueInternal: -0.026877109 PoseValueList: [] @@ -39339,10 +39339,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.026877109 + valueInternal: -0.060889628 newKeyListSerialized: 02000000000000000000676779bd0000000000000000abaaaa3eabaaaa3e44010000000100000000676779bd0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: -0.023239296 + valueInternal: -0.009740293 ReferencePoseValue: valueInternal: -0.023239296 PoseValueList: [] @@ -39353,10 +39353,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -0.023239296 + valueInternal: -0.009740293 newKeyListSerialized: 02000000000000000000c0951fbc0000000000000000abaaaa3eabaaaa3e44010000000100000000c0951fbc0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.99936837 + valueInternal: 0.9980959 ReferencePoseValue: valueInternal: 0.99936837 PoseValueList: [] @@ -39367,7 +39367,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.99936837 + valueInternal: 0.9980959 newKeyListSerialized: 0200000000000000000037837f3f0000000000000000abaaaa3eabaaaa3e4401000000010000000037837f3f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 @@ -39583,7 +39583,7 @@ MonoBehaviour: - valueInternal: 0 LocalRotationChannelList: - CurrentValue: - valueInternal: -5.6719134e-18 + valueInternal: -0.000000081956394 ReferencePoseValue: valueInternal: -5.6719134e-18 PoseValueList: [] @@ -39594,10 +39594,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: -5.6719134e-18 + valueInternal: -0.000000081956394 newKeyListSerialized: 020000000000000000000100b0b30000000000000000abaaaa3eabaaaa3e440100000001000000000100b0b30000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 4.4740276e-18 + valueInternal: -0.000000037252907 ReferencePoseValue: valueInternal: 4.4740276e-18 PoseValueList: [] @@ -39608,10 +39608,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 4.4740276e-18 + valueInternal: -0.000000037252907 newKeyListSerialized: 02000000000000000000010020b30000000000000000abaaaa3eabaaaa3e44010000000100000000010020b30000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7071068 + valueInternal: 0.7071065 ReferencePoseValue: valueInternal: 0.7071068 PoseValueList: [] @@ -39622,10 +39622,10 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7071068 + valueInternal: 0.7071065 newKeyListSerialized: 02000000000000000000ee04353f0000000000000000abaaaa3eabaaaa3e44010000000100000000ee04353f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: - valueInternal: 0.7071068 + valueInternal: 0.7071072 ReferencePoseValue: valueInternal: 0.7071068 PoseValueList: [] @@ -39636,7 +39636,7 @@ MonoBehaviour: newKeyListSerialized: 00000000 - LayerList: - CurrentOriginalValue: - valueInternal: 0.7071068 + valueInternal: 0.7071072 newKeyListSerialized: 02000000000000000000fa04353f0000000000000000abaaaa3eabaaaa3e44010000000100000000fa04353f0000000000000000abaaaa3eabaaaa3e44010000 - CurrentValue: valueInternal: 0 diff --git a/Assets/ResRaw/Maps/Map1/Map1.unity b/Assets/ResRaw/Maps/Map1/Map1.unity index 68fe3d034..1172a4563 100644 --- a/Assets/ResRaw/Maps/Map1/Map1.unity +++ b/Assets/ResRaw/Maps/Map1/Map1.unity @@ -26,7 +26,7 @@ RenderSettings: m_AmbientIntensity: 0.8050667 m_AmbientMode: 0 m_SubtractiveShadowColor: {r: 0.8679245, g: 0.8679245, b: 0.8679245, a: 1} - m_SkyboxMaterial: {fileID: 1558624448} + m_SkyboxMaterial: {fileID: 1670076013} m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 @@ -556,65 +556,78 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e64c239f69eea46778ded6dcc3427a34, type: 3} m_Name: m_EditorClassIdentifier: WaveHarmonic.Crest::WaveHarmonic.Crest.WaterRenderer - _Version: 0 - _Camera: {fileID: 0} - _TimeProvider: {fileID: 0} - _OverrideRenderHDR: 0 - _RenderHDR: 1 - _WindSpeed: 10 - _OverrideGravity: 0 - _GravityOverride: -9.8 - _GravityMultiplier: 1 - _PrimaryLight: {fileID: 0} _Layer: 4 _Material: {fileID: 2100000, guid: 8ab064b6606504a55b489af2787350c2, type: 2} _VolumeMaterial: {fileID: 0} _ChunkTemplate: {fileID: 1516456258233481520, guid: 17840562212c147d6bdb5144d35bc442, type: 3} _CastShadows: 0 - _WriteMotionVectors: 1 - _WriteToDepthTexture: 1 _WaterBodyCulling: 1 _TimeSliceBoundsUpdateFrameCount: 1 _SurfaceSelfIntersectionFixMode: 4 _AllowRenderQueueSorting: 0 + _Version: 1 + _Camera: {fileID: 0} + _TimeProvider: {fileID: 0} + _WindZone: {fileID: 0} + _OverrideWindZoneWindSpeed: 0 + _WindSpeed: 10 + _OverrideWindZoneWindDirection: 0 + _WindDirection: 0 + _OverrideWindZoneWindTurbulence: 0 + _WindTurbulence: 0.145 + _OverrideGravity: 0 + _GravityOverride: -9.8 + _GravityMultiplier: 1 + _PrimaryLight: {fileID: 0} + _InjectionPoint: 0 + _WriteToColorTexture: 1 + _WriteToDepthTexture: 1 + _WriteMotionVectors: 1 + _OverrideRenderHDR: 0 + _RenderHDR: 1 + _Surface: + rid: 4604655935489310866 _ScaleRange: {x: 4, y: 256} _DropDetailHeightBasedOnWaves: 0.2 - _Slices: 7 + _Slices: 9 _Resolution: 384 _GeometryDownSampleFactor: 2 _ExtentsSizeMultiplier: 100 _Viewpoint: {fileID: 0} + _CenterOfDetailDisplacementCorrection: 1 _SampleTerrainHeightForScale: 1 _ForceScaleChangeSmoothing: 0 _TeleportThreshold: 100 _AnimatedWavesLod: - rid: 4604655776581025792 + rid: 4604655935489310867 _DepthLod: - rid: 4604655776581025793 + rid: 4604655935489310868 _LevelLod: - rid: 4604655776581025794 + rid: 4604655935489310869 _FoamLod: - rid: 4604655776581025795 + rid: 4604655935489310870 _DynamicWavesLod: - rid: 4604655776581025796 + rid: 4604655935489310871 _FlowLod: - rid: 4604655776581025797 + rid: 4604655935489310872 _ShadowLod: - rid: 4604655776581025798 + rid: 4604655935489310873 _AbsorptionLod: - rid: 4604655776581025799 + rid: 4604655935489310874 _ScatteringLod: - rid: 4604655776581025800 + rid: 4604655935489310875 _ClipLod: - rid: 4604655776581025801 + rid: 4604655935489310876 _AlbedoLod: - rid: 4604655776581025802 + rid: 4604655935489310877 _Reflections: - rid: 4604655776581025803 + rid: 4604655935489310878 _Underwater: - rid: 4604655776581025804 + rid: 4604655935489310879 + _Meniscus: + rid: 4604655935489310880 _Portals: - rid: 4604655776581025805 + rid: 4604655935489310881 _ShowWaterProxyPlane: 0 _EditModeFrameRate: 30 _FollowSceneCamera: 1 @@ -627,13 +640,29 @@ MonoBehaviour: _LogScaleChange: 0 _PauseOnScaleChange: 0 _IgnoreWavesForScaleChange: 0 - _ForceBatchMode: 0 _ForceNoGraphics: 0 _Resources: {fileID: 11400000, guid: 0817af17dea584e5382e6216db162d4a, type: 2} references: version: 2 RefIds: - - rid: 4604655776581025792 + - rid: 4604655935489310866 + type: {class: SurfaceRenderer, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Version: 0 + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 07f640ada75ec1a47aefdbab1c7cd068, type: 2} + _VolumeMaterial: {fileID: 0} + _ChunkTemplate: {fileID: 1516456258233481520, guid: 1fa5bda715b77f44ab384955ea0b6e4f, type: 3} + _CastShadows: 0 + _WaterBodyCulling: 1 + _TimeSliceBoundsUpdateFrameCount: 1 + _SurfaceSelfIntersectionFixMode: 4 + _AllowRenderQueueSorting: 0 + _Debug: + _UniformTiles: 0 + _DisableSkirt: 0 + - rid: 4604655935489310867 type: {class: AnimatedWavesLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 1 @@ -648,7 +677,7 @@ MonoBehaviour: _CollisionLayers: -1 _MaximumQueryCount: 4096 _BakedWaveData: {fileID: 0} - - rid: 4604655776581025793 + - rid: 4604655935489310868 type: {class: DepthLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 1 @@ -656,8 +685,9 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 46 + _IncludeTerrainHeight: 1 _EnableSignedDistanceFields: 1 - - rid: 4604655776581025794 + - rid: 4604655935489310869 type: {class: LevelLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 0 @@ -665,10 +695,10 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 300 _TextureFormat: 45 - - rid: 4604655776581025795 + - rid: 4604655935489310870 type: {class: FoamLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: - _Enabled: 1 + _Enabled: 0 _OverrideResolution: 1 _Resolution: 256 _TextureFormatMode: 100 @@ -676,7 +706,7 @@ MonoBehaviour: _SimulationFrequency: 30 _Prewarm: 1 _Settings: {fileID: 0} - - rid: 4604655776581025796 + - rid: 4604655935489310871 type: {class: DynamicWavesLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 0 @@ -687,7 +717,7 @@ MonoBehaviour: _SimulationFrequency: 60 _AttenuationInShallows: 1 _Settings: {fileID: 0} - - rid: 4604655776581025797 + - rid: 4604655935489310872 type: {class: FlowLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 0 @@ -695,7 +725,7 @@ MonoBehaviour: _Resolution: 128 _TextureFormatMode: 100 _TextureFormat: 46 - - rid: 4604655776581025798 + - rid: 4604655935489310873 type: {class: ShadowLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 1 @@ -703,6 +733,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 6 + _SimulationFrequency: 60 _DynamicSoftShadows: 1 _SoftJitterExtinctionFactor: 0.75 _JitterDiameterSoft: 15 @@ -711,7 +742,7 @@ MonoBehaviour: _CurrentFrameWeightHard: 0.15 _AllowNullLight: 0 _AllowNoShadows: 0 - - rid: 4604655776581025799 + - rid: 4604655935489310874 type: {class: AbsorptionLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 0 @@ -723,7 +754,7 @@ MonoBehaviour: _ShorelineColor: {r: 0.513, g: 1, b: 1, a: 0.153} _ShorelineColorMaximumDistance: 10 _ShorelineColorFalloff: 2 - - rid: 4604655776581025800 + - rid: 4604655935489310875 type: {class: ScatteringLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 0 @@ -735,7 +766,7 @@ MonoBehaviour: _ShorelineColor: {r: 0, g: 0.588, b: 1, a: 1} _ShorelineColorMaximumDistance: 10 _ShorelineColorFalloff: 2 - - rid: 4604655776581025801 + - rid: 4604655935489310876 type: {class: ClipLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 0 @@ -744,7 +775,7 @@ MonoBehaviour: _TextureFormatMode: 100 _TextureFormat: 5 _DefaultClippingState: 0 - - rid: 4604655776581025802 + - rid: 4604655935489310877 type: {class: AlbedoLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Enabled: 0 @@ -752,15 +783,15 @@ MonoBehaviour: _Resolution: 768 _TextureFormatMode: 100 _TextureFormat: 8 - - rid: 4604655776581025803 + - rid: 4604655935489310878 type: {class: WaterReflections, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Version: 0 - _Enabled: 1 + _Enabled: 0 _Mode: 1 _Layers: serializedVersion: 2 - m_Bits: 4294967295 + m_Bits: 1 _Resolution: 256 _RenderOnlySingleCamera: 0 _Sky: 1 @@ -787,7 +818,7 @@ MonoBehaviour: _Debug: _ShowHiddenObjects: 0 _DisableRecursiveRendering: 0 - - rid: 4604655776581025804 + - rid: 4604655935489310879 type: {class: UnderwaterRenderer, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: _Version: 0 @@ -797,10 +828,6 @@ MonoBehaviour: _EnvironmentalLightingEnable: 0 _EnvironmentalLightingWeight: 1 _EnvironmentalLightingVolumeProfile: {fileID: 0} - _EnableShaderAPI: 0 - _TransparentObjectLayers: - serializedVersion: 2 - m_Bits: 0 _AllCameras: 0 _CopyWaterMaterialParametersEachFrame: 1 _FarPlaneMultiplier: 0.68 @@ -812,7 +839,13 @@ MonoBehaviour: _DisableHeightAboveWaterOptimization: 0 _DisableArtifactCorrection: 0 _OnlyReflectionCameras: 0 - - rid: 4604655776581025805 + - rid: 4604655935489310880 + type: {class: Meniscus, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 238e45299a5ec46308e9bf99ddf67963, type: 2} + - rid: 4604655935489310881 type: {class: PortalRenderer, ns: WaveHarmonic.Crest.Portals, asm: WaveHarmonic.Crest} data: --- !u!1 &862991151 @@ -1354,7 +1387,7 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!21 &1558624448 +--- !u!21 &1670076013 Material: serializedVersion: 8 m_ObjectHideFlags: 0 diff --git a/Assets/ResRaw/Water/Water Chunk1.prefab b/Assets/ResRaw/Water/Chunk 1.prefab similarity index 93% rename from Assets/ResRaw/Water/Water Chunk1.prefab rename to Assets/ResRaw/Water/Chunk 1.prefab index 1107697e9..a7964c7a6 100644 --- a/Assets/ResRaw/Water/Water Chunk1.prefab +++ b/Assets/ResRaw/Water/Chunk 1.prefab @@ -11,7 +11,7 @@ GameObject: - component: {fileID: 5573293823876610619} - component: {fileID: 6121422689720352427} m_Layer: 4 - m_Name: Water Chunk1 + m_Name: Chunk 1 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -49,9 +49,6 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: [] diff --git a/Assets/ResRaw/Water/Water Chunk1.prefab.meta b/Assets/ResRaw/Water/Chunk 1.prefab.meta similarity index 74% rename from Assets/ResRaw/Water/Water Chunk1.prefab.meta rename to Assets/ResRaw/Water/Chunk 1.prefab.meta index d1e84331a..297bdbdec 100644 --- a/Assets/ResRaw/Water/Water Chunk1.prefab.meta +++ b/Assets/ResRaw/Water/Chunk 1.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e4b1708c3e7d90f4ab48ff0a501d57f4 +guid: 1fa5bda715b77f44ab384955ea0b6e4f PrefabImporter: externalObjects: {} userData: diff --git a/Assets/ResRaw/Water/Water 1.mat b/Assets/ResRaw/Water/Water 1.mat new file mode 100644 index 000000000..670aa7119 --- /dev/null +++ b/Assets/ResRaw/Water/Water 1.mat @@ -0,0 +1,107 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-5994654682710206810 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: da692e001514ec24dbc4cca1949ff7e8, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 13 + hdPluginSubTargetMaterialVersions: + m_Keys: [] + m_Values: +--- !u!114 &-4042563326011365698 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Water 1 + m_Shader: {fileID: -6465566751694194690, guid: 00ffe7d0b7161420897069dc6e12822c, type: 3} + m_Parent: {fileID: -876546973899608171, guid: 00ffe7d0b7161420897069dc6e12822c, type: 3} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _ALPHATEST_ON + - _BUILTIN_ALPHATEST_ON + - _BUILTIN_AlphaClip + - _BUILTIN_SURFACE_TYPE_TRANSPARENT + - _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS + - _DOUBLESIDED_ON + - _ENABLE_FOG_ON_TRANSPARENT + - _SURFACE_TYPE_TRANSPARENT + - _TRANSPARENT_WRITES_MOTION_VEC + m_InvalidKeywords: [] + m_LightmapFlags: 2 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 1 + m_CustomRenderQueue: 3000 + stringTagMap: + MotionVector: User + RenderType: Transparent + disabledShaderPasses: + - TransparentDepthPostpass + - TransparentBackface + - RayTracingPrepass + - MOTIONVECTORS + - SHADOWCASTER + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: [] + m_Floats: + - _AlphaDstBlend: 10 + - _BUILTIN_DstBlend: 10 + - _BUILTIN_QueueControl: 0 + - _BUILTIN_SrcBlend: 5 + - _BUILTIN_ZWrite: 1 + - _Crest_FoamEnabled: 1 + - _Crest_PlanarReflectionsEnabled: 1 + - _Crest_SSSEnabled: 0 + - _CullMode: 0 + - _CullModeForward: 0 + - _DstBlend: 10 + - _QueueControl: 0 + - _RefractionModel: 0 + - _SrcBlend: 5 + - _ZTestGBuffer: 3 + m_Colors: + - _Crest_Absorption: {r: 0.49963623, g: 0.49033588, b: 0.497967, a: 1} + - _Crest_AbsorptionColor: {r: 0.46502313, g: 0.4716981, b: 0.4662141, a: 0.1019608} + - _Crest_Scattering: {r: 0.11320752, g: 0.11320752, b: 0.11320752, a: 1} + - _DoubleSidedConstants: {r: 1, g: 1, b: 1, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &4748330692745026848 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 639247ca83abc874e893eb93af2b5e44, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 0 diff --git a/Assets/ResRaw/Water/Water1.mat.meta b/Assets/ResRaw/Water/Water 1.mat.meta similarity index 79% rename from Assets/ResRaw/Water/Water1.mat.meta rename to Assets/ResRaw/Water/Water 1.mat.meta index 491f6aaaf..8329b2b5d 100644 --- a/Assets/ResRaw/Water/Water1.mat.meta +++ b/Assets/ResRaw/Water/Water 1.mat.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1911984e2b778d241869f62e89b400fe +guid: 07f640ada75ec1a47aefdbab1c7cd068 NativeFormatImporter: externalObjects: {} mainObjectFileID: 2100000 diff --git a/Assets/ResRaw/Water/Water1.mat b/Assets/ResRaw/Water/Water1.mat deleted file mode 100644 index 901e4f98a..000000000 --- a/Assets/ResRaw/Water/Water1.mat +++ /dev/null @@ -1,250 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Water1 - m_Shader: {fileID: -6465566751694194690, guid: 00ffe7d0b7161420897069dc6e12822c, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: - - _ALPHATEST_ON - - _DOUBLESIDED_ON - - _ENABLE_FOG_ON_TRANSPARENT - - _MATERIAL_FEATURE_SPECULAR_COLOR - - _REFRACTION_PLANE - - _SPECULAR_SETUP - - _SURFACE_TYPE_TRANSPARENT - - _TRANSPARENT_WRITES_MOTION_VEC - m_InvalidKeywords: [] - m_LightmapFlags: 2 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 1 - m_CustomRenderQueue: 3000 - stringTagMap: - MotionVector: User - RenderType: Transparent - disabledShaderPasses: - - SHADOWCASTER - - MOTIONVECTORS - - TransparentDepthPostpass - - TransparentBackface - - RayTracingPrepass - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _Crest_CausticsDistortionTexture: - m_Texture: {fileID: 2800000, guid: 7aa3f69cfb40b429a865c45a7271c5f5, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Crest_CausticsTexture: - m_Texture: {fileID: 2800000, guid: 1407209016967410da2ae6fdd4d97fc6, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Crest_FoamTexture: - m_Texture: {fileID: 2800000, guid: 959dd0505e2c54585865f51257daa0e3, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Crest_NormalMapTexture: - m_Texture: {fileID: 2800000, guid: 7aa3f69cfb40b429a865c45a7271c5f5, type: 3} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_Lightmaps: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_LightmapsInd: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - unity_ShadowMasks: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - CREST_FLOW: 0 - - _AddPrecomputedVelocity: 0 - - _AlphaClip: 1 - - _AlphaCutoffEnable: 1 - - _AlphaDstBlend: 10 - - _AlphaSrcBlend: 1 - - _AlphaToMask: 0 - - _BUILTIN_AlphaClip: 1 - - _BUILTIN_Blend: 0 - - _BUILTIN_CullMode: 0 - - _BUILTIN_DstBlend: 10 - - _BUILTIN_QueueControl: 0 - - _BUILTIN_QueueOffset: 0 - - _BUILTIN_SrcBlend: 5 - - _BUILTIN_Surface: 1 - - _BUILTIN_ZTest: 4 - - _BUILTIN_ZWrite: 1 - - _BUILTIN_ZWriteControl: 1 - - _Blend: 0 - - _BlendMode: 0 - - _BlendModePreserveSpecular: 0 - - _CastShadows: 0 - - _ConservativeDepthOffsetEnable: 0 - - _Crest_AlbedoEnabled: 0 - - _Crest_AlbedoIgnoreFoam: 1 - - _Crest_AmbientTerm: 1 - - _Crest_Anisotropy: 0.5 - - _Crest_CausticsDepthOfField: 6 - - _Crest_CausticsDistortionScale: 250 - - _Crest_CausticsDistortionStrength: 0.173 - - _Crest_CausticsEnabled: 1 - - _Crest_CausticsFocalDepth: 2 - - _Crest_CausticsMotionBlur: 1 - - _Crest_CausticsScrollSpeed: 1 - - _Crest_CausticsStrength: 1.61 - - _Crest_CausticsTextureAverage: 0.07 - - _Crest_CausticsTextureScale: 50.6 - - _Crest_DirectTerm: 1 - - _Crest_FoamEnabled: 1 - - _Crest_FoamFeather: 0.75 - - _Crest_FoamIntensityAlbedo: 1 - - _Crest_FoamNormalStrength: 1 - - _Crest_FoamScale: 5 - - _Crest_FoamScrollSpeed: 1 - - _Crest_FoamSmoothness: 0.7 - - _Crest_MinimumReflectionDirectionY: 0 - - _Crest_NormalMapEnabled: 1 - - _Crest_NormalMapScale: 10.8 - - _Crest_NormalMapScrollSpeed: 1 - - _Crest_NormalMapStrength: 0.33 - - _Crest_NormalsStrengthOverall: 0.197 - - _Crest_Occlusion: 1 - - _Crest_OcclusionUnderwater: 0 - - _Crest_PlanarReflectionsDistortion: 1 - - _Crest_PlanarReflectionsEnabled: 1 - - _Crest_PlanarReflectionsIntensity: 1 - - _Crest_PlanarReflectionsRoughness: 1 - - _Crest_RefractionStrength: 1 - - _Crest_RefractiveIndexOfWater: 1.646 - - _Crest_SSSDirectionalFalloff: 2 - - _Crest_SSSEnabled: 1 - - _Crest_SSSIntensity: 10 - - _Crest_SSSPinchFalloff: 1.5 - - _Crest_SSSPinchMaximum: 1.67 - - _Crest_SSSPinchMinimum: 0.57 - - _Crest_ShadowCasterThreshold: 0.5 - - _Crest_ShadowsAffectsAmbientFactor: 0.5 - - _Crest_ShadowsEnabled: 1 - - _Crest_Smoothness: 0.9 - - _Crest_SmoothnessFalloff: 0.5 - - _Crest_SmoothnessFar: 0.4 - - _Crest_SmoothnessFarDistance: 4000 - - _Crest_Specular: 0.25 - - _Crest_TotalInternalReflectionIntensity: 1 - - _Crest_Version: 0 - - _Cull: 0 - - _CullMode: 0 - - _CullModeForward: 0 - - _DepthOffsetEnable: 0 - - _DoubleSidedEnable: 1 - - _DoubleSidedGIMode: 0 - - _DoubleSidedNormalMode: 2 - - _DstBlend: 10 - - _DstBlend2: 10 - - _EnableBlendModePreserveSpecularLighting: 0 - - _EnableFogOnTransparent: 1 - - _ExcludeFromTUAndAA: 0 - - _MaterialID: 4 - - _MaterialTypeMask: 16 - - _OpaqueCullMode: 2 - - _PerPixelSorting: 0 - - _QueueControl: 0 - - _QueueOffset: 0 - - _RayTracing: 0 - - _ReceiveShadows: 1 - - _ReceivesSSR: 1 - - _ReceivesSSRTransparent: 1 - - _RefractionModel: 1 - - _RenderQueueType: 3 - - _RequireSplitLighting: 0 - - _SrcBlend: 5 - - _StencilRef: 0 - - _StencilRefDepth: 24 - - _StencilRefDistortionVec: 4 - - _StencilRefGBuffer: 10 - - _StencilRefMV: 40 - - _StencilWriteMask: 6 - - _StencilWriteMaskDepth: 25 - - _StencilWriteMaskDistortionVec: 4 - - _StencilWriteMaskGBuffer: 15 - - _StencilWriteMaskMV: 41 - - _SupportDecals: 1 - - _Surface: 1 - - _SurfaceType: 1 - - _TransmissionEnable: 1 - - _TransparentBackfaceEnable: 0 - - _TransparentCullMode: 2 - - _TransparentDepthPostpassEnable: 0 - - _TransparentDepthPrepassEnable: 0 - - _TransparentSortPriority: 0 - - _TransparentWritingMotionVec: 1 - - _TransparentZWrite: 1 - - _UseShadowThreshold: 0 - - _WorkflowMode: 0 - - _ZTest: 4 - - _ZTestDepthEqualForOpaque: 4 - - _ZTestGBuffer: 3 - - _ZTestTransparent: 4 - - _ZWrite: 1 - - _ZWriteControl: 1 - m_Colors: - - _Crest_Absorption: {r: 7.7473936, g: 6.665305, b: 9.93459, a: 1} - - _Crest_AbsorptionColor: {r: 0.29803923, g: 0.3529412, b: 0.21176471, a: 1} - - _Crest_Scattering: {r: 0.19378929, g: 0.3207547, b: 0, a: 1} - - _DoubleSidedConstants: {r: 1, g: 1, b: 1, a: 0} - - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} - m_BuildTextureStacks: [] - m_AllowLocking: 1 ---- !u!114 &5834112337178765781 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} - m_Name: - m_EditorClassIdentifier: - version: 9 ---- !u!114 &6553897719873794358 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 639247ca83abc874e893eb93af2b5e44, type: 3} - m_Name: - m_EditorClassIdentifier: - version: 0 ---- !u!114 &8806993520622682055 -MonoBehaviour: - m_ObjectHideFlags: 11 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: da692e001514ec24dbc4cca1949ff7e8, type: 3} - m_Name: - m_EditorClassIdentifier: - version: 13 - hdPluginSubTargetMaterialVersions: - m_Keys: [] - m_Values: diff --git a/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatScene.prefab b/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatScene.prefab index 10faead71..e2c22122a 100644 --- a/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatScene.prefab +++ b/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatScene.prefab @@ -1643,28 +1643,38 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e64c239f69eea46778ded6dcc3427a34, type: 3} m_Name: m_EditorClassIdentifier: - _Version: 0 - _Camera: {fileID: 0} - _TimeProvider: {fileID: 0} - _OverrideRenderHDR: 0 - _RenderHDR: 1 - _WindSpeed: 150 - _OverrideGravity: 0 - _GravityOverride: -9.8 - _GravityMultiplier: 1 - _PrimaryLight: {fileID: 0} _Layer: 4 _Material: {fileID: 2100000, guid: 8ab064b6606504a55b489af2787350c2, type: 2} _VolumeMaterial: {fileID: 0} _ChunkTemplate: {fileID: 1516456258233481520, guid: 17840562212c147d6bdb5144d35bc442, type: 3} _CastShadows: 0 - _WriteMotionVectors: 1 - _WriteToDepthTexture: 1 _WaterBodyCulling: 1 _TimeSliceBoundsUpdateFrameCount: 1 _SurfaceSelfIntersectionFixMode: 4 _AllowRenderQueueSorting: 0 + _Version: 1 + _Camera: {fileID: 0} + _TimeProvider: {fileID: 0} + _WindZone: {fileID: 0} + _OverrideWindZoneWindSpeed: 0 + _WindSpeed: 150 + _OverrideWindZoneWindDirection: 0 + _WindDirection: 0 + _OverrideWindZoneWindTurbulence: 0 + _WindTurbulence: 0.145 + _OverrideGravity: 0 + _GravityOverride: -9.8 + _GravityMultiplier: 1 + _PrimaryLight: {fileID: 0} + _InjectionPoint: 0 + _WriteToColorTexture: 1 + _WriteToDepthTexture: 1 + _WriteMotionVectors: 1 + _OverrideRenderHDR: 0 + _RenderHDR: 1 + _Surface: + rid: 1002 _ScaleRange: {x: 4, y: 256} _DropDetailHeightBasedOnWaves: 0.2 _Slices: 7 @@ -1672,6 +1682,7 @@ MonoBehaviour: _GeometryDownSampleFactor: 2 _ExtentsSizeMultiplier: 100 _Viewpoint: {fileID: 0} + _CenterOfDetailDisplacementCorrection: 1 _SampleTerrainHeightForScale: 1 _ForceScaleChangeSmoothing: 0 _TeleportThreshold: 10 @@ -1701,6 +1712,8 @@ MonoBehaviour: rid: 162836781179600905 _Underwater: rid: 162836781179600906 + _Meniscus: + rid: 1003 _Portals: rid: 162836781179600907 _ShowWaterProxyPlane: 0 @@ -1712,15 +1725,11 @@ MonoBehaviour: _ShowHiddenObjects: 0 _DisableFollowViewpoint: 0 _DestroyResourcesInOnDisable: 0 - _DisableChunks: 0 - _UniformTiles: 0 - _DisableSkirt: 0 _DrawLodOutline: 0 _ShowDebugInformation: 0 _LogScaleChange: 0 _PauseOnScaleChange: 0 _IgnoreWavesForScaleChange: 0 - _ForceBatchMode: 0 _ForceNoGraphics: 0 _Resources: {fileID: 11400000, guid: 0817af17dea584e5382e6216db162d4a, type: 2} references: @@ -1750,6 +1759,30 @@ MonoBehaviour: _ShorelineColor: {r: 0, g: 0.588, b: 1.2, a: 6} _ShorelineColorMaximumDistance: 10 _ShorelineColorFalloff: 2 + - rid: 1002 + type: {class: SurfaceRenderer, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Version: 0 + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 8ab064b6606504a55b489af2787350c2, type: 2} + _VolumeMaterial: {fileID: 0} + _ChunkTemplate: {fileID: 1516456258233481520, guid: 17840562212c147d6bdb5144d35bc442, + type: 3} + _CastShadows: 0 + _WaterBodyCulling: 1 + _TimeSliceBoundsUpdateFrameCount: 1 + _SurfaceSelfIntersectionFixMode: 4 + _AllowRenderQueueSorting: 0 + _Debug: + _UniformTiles: 0 + _DisableSkirt: 0 + - rid: 1003 + type: {class: Meniscus, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 238e45299a5ec46308e9bf99ddf67963, type: 2} - rid: 162836781179600896 type: {class: AnimatedWavesLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: @@ -1773,6 +1806,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 46 + _IncludeTerrainHeight: 0 _EnableSignedDistanceFields: 1 - rid: 162836781179600898 type: {class: LevelLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} @@ -1820,6 +1854,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 6 + _SimulationFrequency: 60 _DynamicSoftShadows: 1 _SoftJitterExtinctionFactor: 0.75 _JitterDiameterSoft: 15 @@ -1890,10 +1925,6 @@ MonoBehaviour: _EnvironmentalLightingEnable: 0 _EnvironmentalLightingWeight: 1 _EnvironmentalLightingVolumeProfile: {fileID: 0} - _EnableShaderAPI: 0 - _TransparentObjectLayers: - serializedVersion: 2 - m_Bits: 0 _AllCameras: 0 _CopyWaterMaterialParametersEachFrame: 1 _FarPlaneMultiplier: 0.68 @@ -2197,12 +2228,14 @@ MonoBehaviour: _Spectrum: {fileID: 11400000, guid: 4fde516347f8f410cb7bf7ec2b66c163, type: 2} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 0 _OverrideGlobalWindSpeed: 0 _WindSpeed: 20 _Resolution: 128 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _OverrideGlobalWindTurbulence: 1 _WindTurbulence: 0.145 _WindAlignment: 0 _TimeLoopLength: Infinity @@ -2212,7 +2245,7 @@ MonoBehaviour: _TimeResolution: 4 _SmallestWavelengthRequired: 2 _BakedTimeLoopLength: 32 - _Version: 1 + _Version: 2 references: version: 2 RefIds: diff --git a/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatsScene.prefab b/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatsScene.prefab index 2db0ec690..884ef5fd6 100644 --- a/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatsScene.prefab +++ b/Assets/Samples/Crest/5.4.2/Boats/Prefabs/Boats_BoatsScene.prefab @@ -45,28 +45,38 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e64c239f69eea46778ded6dcc3427a34, type: 3} m_Name: m_EditorClassIdentifier: - _Version: 0 - _Camera: {fileID: 0} - _TimeProvider: {fileID: 0} - _OverrideRenderHDR: 0 - _RenderHDR: 1 - _WindSpeed: 150 - _OverrideGravity: 0 - _GravityOverride: -9.8 - _GravityMultiplier: 1 - _PrimaryLight: {fileID: 0} _Layer: 4 _Material: {fileID: 2100000, guid: 8ab064b6606504a55b489af2787350c2, type: 2} _VolumeMaterial: {fileID: 0} _ChunkTemplate: {fileID: 1516456258233481520, guid: 17840562212c147d6bdb5144d35bc442, type: 3} _CastShadows: 0 - _WriteMotionVectors: 1 - _WriteToDepthTexture: 1 _WaterBodyCulling: 1 _TimeSliceBoundsUpdateFrameCount: 1 _SurfaceSelfIntersectionFixMode: 4 _AllowRenderQueueSorting: 0 + _Version: 1 + _Camera: {fileID: 0} + _TimeProvider: {fileID: 0} + _WindZone: {fileID: 0} + _OverrideWindZoneWindSpeed: 0 + _WindSpeed: 150 + _OverrideWindZoneWindDirection: 0 + _WindDirection: 0 + _OverrideWindZoneWindTurbulence: 0 + _WindTurbulence: 0.145 + _OverrideGravity: 0 + _GravityOverride: -9.8 + _GravityMultiplier: 1 + _PrimaryLight: {fileID: 0} + _InjectionPoint: 0 + _WriteToColorTexture: 1 + _WriteToDepthTexture: 1 + _WriteMotionVectors: 1 + _OverrideRenderHDR: 0 + _RenderHDR: 1 + _Surface: + rid: 1002 _ScaleRange: {x: 4, y: 256} _DropDetailHeightBasedOnWaves: 0.2 _Slices: 7 @@ -74,6 +84,7 @@ MonoBehaviour: _GeometryDownSampleFactor: 2 _ExtentsSizeMultiplier: 100 _Viewpoint: {fileID: 0} + _CenterOfDetailDisplacementCorrection: 1 _SampleTerrainHeightForScale: 1 _ForceScaleChangeSmoothing: 0 _TeleportThreshold: 10 @@ -103,6 +114,8 @@ MonoBehaviour: rid: 162836781179600921 _Underwater: rid: 162836781179600922 + _Meniscus: + rid: 1003 _Portals: rid: 162836781179600923 _ShowWaterProxyPlane: 0 @@ -114,15 +127,11 @@ MonoBehaviour: _ShowHiddenObjects: 0 _DisableFollowViewpoint: 0 _DestroyResourcesInOnDisable: 0 - _DisableChunks: 0 - _UniformTiles: 0 - _DisableSkirt: 0 _DrawLodOutline: 0 _ShowDebugInformation: 0 _LogScaleChange: 0 _PauseOnScaleChange: 0 _IgnoreWavesForScaleChange: 0 - _ForceBatchMode: 0 _ForceNoGraphics: 0 _Resources: {fileID: 11400000, guid: 0817af17dea584e5382e6216db162d4a, type: 2} references: @@ -152,6 +161,30 @@ MonoBehaviour: _ShorelineColor: {r: 0, g: 0.588, b: 1.2, a: 6} _ShorelineColorMaximumDistance: 10 _ShorelineColorFalloff: 2 + - rid: 1002 + type: {class: SurfaceRenderer, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Version: 0 + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 8ab064b6606504a55b489af2787350c2, type: 2} + _VolumeMaterial: {fileID: 0} + _ChunkTemplate: {fileID: 1516456258233481520, guid: 17840562212c147d6bdb5144d35bc442, + type: 3} + _CastShadows: 0 + _WaterBodyCulling: 1 + _TimeSliceBoundsUpdateFrameCount: 1 + _SurfaceSelfIntersectionFixMode: 4 + _AllowRenderQueueSorting: 0 + _Debug: + _UniformTiles: 0 + _DisableSkirt: 0 + - rid: 1003 + type: {class: Meniscus, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 238e45299a5ec46308e9bf99ddf67963, type: 2} - rid: 162836781179600912 type: {class: AnimatedWavesLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: @@ -175,6 +208,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 46 + _IncludeTerrainHeight: 0 _EnableSignedDistanceFields: 1 - rid: 162836781179600914 type: {class: LevelLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} @@ -222,6 +256,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 6 + _SimulationFrequency: 60 _DynamicSoftShadows: 1 _SoftJitterExtinctionFactor: 0.75 _JitterDiameterSoft: 15 @@ -292,10 +327,6 @@ MonoBehaviour: _EnvironmentalLightingEnable: 0 _EnvironmentalLightingWeight: 1 _EnvironmentalLightingVolumeProfile: {fileID: 0} - _EnableShaderAPI: 0 - _TransparentObjectLayers: - serializedVersion: 2 - m_Bits: 0 _AllCameras: 0 _CopyWaterMaterialParametersEachFrame: 1 _FarPlaneMultiplier: 0.68 @@ -370,12 +401,14 @@ MonoBehaviour: _Spectrum: {fileID: 11400000, guid: 28a29b5ef0c644735b5d7ba47d2863d4, type: 2} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 180 _OverrideGlobalWindSpeed: 0 _WindSpeed: 20 _Resolution: 32 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _OverrideGlobalWindTurbulence: 1 _WindTurbulence: 0.145 _WindAlignment: 0 _TimeLoopLength: 32 @@ -385,7 +418,7 @@ MonoBehaviour: _TimeResolution: 4 _SmallestWavelengthRequired: 2 _BakedTimeLoopLength: 32 - _Version: 1 + _Version: 2 references: version: 2 RefIds: diff --git a/Assets/Samples/Crest/5.4.2/Examples/Materials/Examples_Water.mat b/Assets/Samples/Crest/5.4.2/Examples/Materials/Examples_Water.mat index 7d66bfdcd..3b706e5d1 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Materials/Examples_Water.mat +++ b/Assets/Samples/Crest/5.4.2/Examples/Materials/Examples_Water.mat @@ -59,9 +59,9 @@ Material: - _BUILTIN_ALPHATEST_ON - _BUILTIN_AlphaClip - _BUILTIN_SURFACE_TYPE_TRANSPARENT + - _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS - _DOUBLESIDED_ON - _ENABLE_FOG_ON_TRANSPARENT - - _SPECULAR_SETUP - _SURFACE_TYPE_TRANSPARENT - _TRANSPARENT_WRITES_MOTION_VEC m_InvalidKeywords: diff --git a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Examples_Scenes.prefab b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Examples_Scenes.prefab index 4e778741b..03c3ebd93 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Examples_Scenes.prefab +++ b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Examples_Scenes.prefab @@ -314,12 +314,14 @@ MonoBehaviour: _Spectrum: {fileID: 11400000, guid: e13a1902b10e34e9fb08e1d09e39b5d4, type: 2} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 0 _OverrideGlobalWindSpeed: 0 _WindSpeed: 20 _Resolution: 32 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _OverrideGlobalWindTurbulence: 1 _WindTurbulence: 0.35 _WindAlignment: 0 _TimeLoopLength: Infinity @@ -329,7 +331,7 @@ MonoBehaviour: _TimeResolution: 4 _SmallestWavelengthRequired: 2 _BakedTimeLoopLength: 32 - _Version: 1 + _Version: 2 references: version: 2 RefIds: @@ -1365,27 +1367,37 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e64c239f69eea46778ded6dcc3427a34, type: 3} m_Name: m_EditorClassIdentifier: - _Version: 0 - _Camera: {fileID: 0} - _TimeProvider: {fileID: 0} - _OverrideRenderHDR: 0 - _RenderHDR: 1 - _WindSpeed: 10 - _OverrideGravity: 0 - _GravityOverride: -9.8 - _GravityMultiplier: 1 - _PrimaryLight: {fileID: 0} _Layer: 4 _Material: {fileID: 2100000, guid: d82d92d8d8f214cd0b8bf7c185b2c341, type: 2} _VolumeMaterial: {fileID: 0} _ChunkTemplate: {fileID: 0} _CastShadows: 0 - _WriteMotionVectors: 1 - _WriteToDepthTexture: 1 _WaterBodyCulling: 1 _TimeSliceBoundsUpdateFrameCount: 1 _SurfaceSelfIntersectionFixMode: 4 _AllowRenderQueueSorting: 0 + _Version: 1 + _Camera: {fileID: 0} + _TimeProvider: {fileID: 0} + _WindZone: {fileID: 0} + _OverrideWindZoneWindSpeed: 0 + _WindSpeed: 10 + _OverrideWindZoneWindDirection: 0 + _WindDirection: 0 + _OverrideWindZoneWindTurbulence: 0 + _WindTurbulence: 0.145 + _OverrideGravity: 0 + _GravityOverride: -9.8 + _GravityMultiplier: 1 + _PrimaryLight: {fileID: 0} + _InjectionPoint: 0 + _WriteToColorTexture: 1 + _WriteToDepthTexture: 1 + _WriteMotionVectors: 1 + _OverrideRenderHDR: 0 + _RenderHDR: 1 + _Surface: + rid: 1013 _ScaleRange: {x: 8, y: 8} _DropDetailHeightBasedOnWaves: 0.081 _Slices: 7 @@ -1393,6 +1405,7 @@ MonoBehaviour: _GeometryDownSampleFactor: 2 _ExtentsSizeMultiplier: 100 _Viewpoint: {fileID: 2613380069347621712} + _CenterOfDetailDisplacementCorrection: 1 _SampleTerrainHeightForScale: 1 _ForceScaleChangeSmoothing: 0 _TeleportThreshold: 10 @@ -1422,6 +1435,8 @@ MonoBehaviour: rid: 1009 _Underwater: rid: 1010 + _Meniscus: + rid: 1014 _Portals: rid: 1011 _ShowWaterProxyPlane: 0 @@ -1433,15 +1448,11 @@ MonoBehaviour: _ShowHiddenObjects: 0 _DisableFollowViewpoint: 0 _DestroyResourcesInOnDisable: 0 - _DisableChunks: 0 - _UniformTiles: 0 - _DisableSkirt: 0 _DrawLodOutline: 0 _ShowDebugInformation: 0 _LogScaleChange: 0 _PauseOnScaleChange: 0 _IgnoreWavesForScaleChange: 0 - _ForceBatchMode: 0 _ForceNoGraphics: 0 _Resources: {fileID: 11400000, guid: 0817af17dea584e5382e6216db162d4a, type: 2} references: @@ -1467,6 +1478,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 46 + _IncludeTerrainHeight: 0 _EnableSignedDistanceFields: 1 - rid: 1002 type: {class: LevelLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} @@ -1514,6 +1526,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 6 + _SimulationFrequency: 60 _DynamicSoftShadows: 1 _SoftJitterExtinctionFactor: 0.75 _JitterDiameterSoft: 15 @@ -1584,10 +1597,6 @@ MonoBehaviour: _EnvironmentalLightingEnable: 0 _EnvironmentalLightingWeight: 1 _EnvironmentalLightingVolumeProfile: {fileID: 0} - _EnableShaderAPI: 0 - _TransparentObjectLayers: - serializedVersion: 2 - m_Bits: 0 _AllCameras: 0 _CopyWaterMaterialParametersEachFrame: 1 _FarPlaneMultiplier: 0.68 @@ -1618,6 +1627,29 @@ MonoBehaviour: _ShorelineColor: {r: 0, g: 0.588, b: 1.2, a: 6} _ShorelineColorMaximumDistance: 10 _ShorelineColorFalloff: 2 + - rid: 1013 + type: {class: SurfaceRenderer, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Version: 0 + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: d82d92d8d8f214cd0b8bf7c185b2c341, type: 2} + _VolumeMaterial: {fileID: 0} + _ChunkTemplate: {fileID: 0} + _CastShadows: 0 + _WaterBodyCulling: 1 + _TimeSliceBoundsUpdateFrameCount: 1 + _SurfaceSelfIntersectionFixMode: 4 + _AllowRenderQueueSorting: 0 + _Debug: + _UniformTiles: 0 + _DisableSkirt: 0 + - rid: 1014 + type: {class: Meniscus, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 238e45299a5ec46308e9bf99ddf67963, type: 2} - rid: 5163698739167625228 type: {class: AnimatedWavesLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: diff --git a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_OverrideGlobalWaves.prefab b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_OverrideGlobalWaves.prefab index ac7a3238b..e78afeda2 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_OverrideGlobalWaves.prefab +++ b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_OverrideGlobalWaves.prefab @@ -56,12 +56,14 @@ MonoBehaviour: _Spectrum: {fileID: 0} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 0 _OverrideGlobalWindSpeed: 1 _WindSpeed: 3 _Resolution: 128 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _OverrideGlobalWindTurbulence: 1 _WindTurbulence: 0.145 _WindAlignment: 0 _TimeLoopLength: Infinity @@ -71,7 +73,7 @@ MonoBehaviour: _TimeResolution: 4 _SmallestWavelengthRequired: 2 _BakedTimeLoopLength: 32 - _Version: 1 + _Version: 2 references: version: 2 RefIds: @@ -80,6 +82,7 @@ MonoBehaviour: data: _Input: {fileID: 5261791568129114886} _Texture: {fileID: 2800000, guid: b922f588948724e039eadd46288af89d, type: 3} + _Multiplier: {x: 1, y: 1, z: 1, w: 1} _NegativeValues: 1 --- !u!1001 &5419066683695935889 PrefabInstance: diff --git a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_ShaderGraphInput.prefab b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_ShaderGraphInput.prefab index cfb078dac..f25c83fca 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_ShaderGraphInput.prefab +++ b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_ShaderGraphInput.prefab @@ -179,51 +179,6 @@ PrefabInstance: propertyPath: m_AnchorMin.x value: 1 objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: m_Enabled - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.size - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.data[0].m_Mode - value: 6 - objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.data[0].m_Target - value: - objectReference: {fileID: 8893367339784545046} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.data[0].m_CallState - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: SetActive - objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName - value: UnityEngine.GameObject, UnityEngine - objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_BoolArgument - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 5628891711212661418, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - propertyPath: _OnHighDefinitionPipeline.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName - value: UnityEngine.Object, UnityEngine - objectReference: {fileID: 0} - target: {fileID: 5655619906866042202, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, type: 3} propertyPath: m_LocalPosition.x @@ -299,9 +254,3 @@ Transform: type: 3} m_PrefabInstance: {fileID: 7420766973803980796} m_PrefabAsset: {fileID: 0} ---- !u!1 &8893367339784545046 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 2130284292857808106, guid: 8b98a14ae91dd498d8f577f0f8f4aff1, - type: 3} - m_PrefabInstance: {fileID: 7420766973803980796} - m_PrefabAsset: {fileID: 0} diff --git a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_TrochoidalWaves.prefab b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_TrochoidalWaves.prefab index 3a1d9aca6..cd14769e6 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_TrochoidalWaves.prefab +++ b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_TrochoidalWaves.prefab @@ -56,16 +56,19 @@ MonoBehaviour: _Spectrum: {fileID: 11400000, guid: 6b50b5218dbe2488fb5d00db49d15dae, type: 2} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 0 _OverrideGlobalWindSpeed: 1 _WindSpeed: 150 _Resolution: 128 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _Swell: 0 _ReverseWaveWeight: 0 _ComponentsPerOctave: 8 _RandomSeed: 0 - _Version: 1 + _ManualGeneration: 0 + _Version: 2 references: version: 2 RefIds: diff --git a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WaveComparison.prefab b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WaveComparison.prefab index 6406cfb41..163512eed 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WaveComparison.prefab +++ b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WaveComparison.prefab @@ -212,16 +212,19 @@ MonoBehaviour: _Spectrum: {fileID: 11400000, guid: e13a1902b10e34e9fb08e1d09e39b5d4, type: 2} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: -58.00273 _OverrideGlobalWindSpeed: 0 _WindSpeed: 20 _Resolution: 128 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _Swell: 0 _ReverseWaveWeight: 0.5 _ComponentsPerOctave: 8 _RandomSeed: 0 - _Version: 1 + _ManualGeneration: 0 + _Version: 2 references: version: 2 RefIds: @@ -422,12 +425,14 @@ MonoBehaviour: _Spectrum: {fileID: 11400000, guid: e13a1902b10e34e9fb08e1d09e39b5d4, type: 2} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 0 _OverrideGlobalWindSpeed: 0 _WindSpeed: 20 _Resolution: 128 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _OverrideGlobalWindTurbulence: 1 _WindTurbulence: 0.145 _WindAlignment: 0 _TimeLoopLength: Infinity @@ -437,7 +442,7 @@ MonoBehaviour: _TimeResolution: 4 _SmallestWavelengthRequired: 2 _BakedTimeLoopLength: 32 - _Version: 1 + _Version: 2 references: version: 2 RefIds: diff --git a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WavePatch.prefab b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WavePatch.prefab index 924409b03..76134212f 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WavePatch.prefab +++ b/Assets/Samples/Crest/5.4.2/Examples/Prefabs/Scenes/Examples_WavePatch.prefab @@ -58,12 +58,14 @@ MonoBehaviour: _Spectrum: {fileID: 0} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 0 _OverrideGlobalWindSpeed: 0 _WindSpeed: 20 _Resolution: 32 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _OverrideGlobalWindTurbulence: 1 _WindTurbulence: 0.145 _WindAlignment: 0 _TimeLoopLength: Infinity @@ -73,7 +75,7 @@ MonoBehaviour: _TimeResolution: 4 _SmallestWavelengthRequired: 2 _BakedTimeLoopLength: 32 - _Version: 1 + _Version: 2 references: version: 2 RefIds: diff --git a/Assets/Samples/Crest/5.4.2/Examples/Scenes/Examples.unity b/Assets/Samples/Crest/5.4.2/Examples/Scenes/Examples.unity index 8d30d77e2..28105ef42 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Scenes/Examples.unity +++ b/Assets/Samples/Crest/5.4.2/Examples/Scenes/Examples.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -42,8 +42,8 @@ RenderSettings: --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 + serializedVersion: 13 + m_BakeOnSceneLoad: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -66,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 @@ -96,9 +93,8 @@ LightmapSettings: m_ExportTrainingData: 0 m_TrainingDataDestination: TrainingData m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 4890085278179872738, guid: 6e72aca972f324f7886200f86939d735, - type: 2} + m_LightingDataAsset: {fileID: 112000000, guid: be61fd374ee0fad46a337d78e0ed01ae, type: 2} + m_LightingSettings: {fileID: 4890085278179872738, guid: 6e72aca972f324f7886200f86939d735, type: 2} --- !u!196 &4 NavMeshSettings: serializedVersion: 2 @@ -771,28 +767,17 @@ MonoBehaviour: m_MoveRepeatDelay: 0.5 m_MoveRepeatRate: 0.1 m_XRTrackingOrigin: {fileID: 0} - m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_PointAction: {fileID: 1054132383583890850, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_MoveAction: {fileID: 3710738434707379630, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_SubmitAction: {fileID: 2064916234097673511, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_CancelAction: {fileID: -1967631576421560919, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_LeftClickAction: {fileID: 8056856818456041789, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_MiddleClickAction: {fileID: 3279352641294131588, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_RightClickAction: {fileID: 3837173908680883260, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_ScrollWheelAction: {fileID: 4502412055082496612, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_TrackedDevicePositionAction: {fileID: 4754684134866288074, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} - m_TrackedDeviceOrientationAction: {fileID: 1025543830046995696, guid: ca9f5fa95ffab41fb9a615ab714db018, - type: 3} + m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_PointAction: {fileID: 1054132383583890850, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MoveAction: {fileID: 3710738434707379630, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_SubmitAction: {fileID: 2064916234097673511, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_CancelAction: {fileID: -1967631576421560919, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_LeftClickAction: {fileID: 8056856818456041789, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MiddleClickAction: {fileID: 3279352641294131588, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_RightClickAction: {fileID: 3837173908680883260, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_ScrollWheelAction: {fileID: 4502412055082496612, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDevicePositionAction: {fileID: 4754684134866288074, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDeviceOrientationAction: {fileID: 1025543830046995696, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} m_DeselectOnBackgroundClick: 1 m_PointerBehavior: 0 m_CursorLockBehavior: 0 @@ -882,6 +867,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -903,6 +893,7 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 @@ -938,58 +929,47 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 1845454492} m_Modifications: - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalRotation.w value: 0 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalRotation.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalRotation.y value: 0.9063079 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalRotation.z value: -0.42261827 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 105 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 15 objectReference: {fileID: 0} - - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 5304508333967466499, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + - target: {fileID: 5304508333967466499, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} propertyPath: m_Name value: Sun objectReference: {fileID: 0} @@ -1000,8 +980,7 @@ PrefabInstance: m_SourcePrefab: {fileID: 100100000, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} --- !u!4 &1364867124 stripped Transform: - m_CorrespondingSourceObject: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, - type: 3} + m_CorrespondingSourceObject: {fileID: 1399345652565587599, guid: 774ab582b39374a7e9d5dac8e31b9a5a, type: 3} m_PrefabInstance: {fileID: 1364867123} m_PrefabAsset: {fileID: 0} --- !u!1 &1682107712 @@ -1093,58 +1072,47 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 1845454492} m_Modifications: - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalRotation.x value: -0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalRotation.y value: -0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalRotation.z value: -0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 2942909709672342223, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + - target: {fileID: 2942909709672342223, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} propertyPath: m_Name value: Atmosphere objectReference: {fileID: 0} @@ -1155,8 +1123,7 @@ PrefabInstance: m_SourcePrefab: {fileID: 100100000, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} --- !u!4 &1734491900 stripped Transform: - m_CorrespondingSourceObject: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, - type: 3} + m_CorrespondingSourceObject: {fileID: 2272289698115174340, guid: 63a4b7e65d06948649ac3e10077d8c2e, type: 3} m_PrefabInstance: {fileID: 1734491899} m_PrefabAsset: {fileID: 0} --- !u!1 &1835631273 @@ -1304,58 +1271,47 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 1845454492} m_Modifications: - - target: {fileID: 963553959586484309, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 963553959586484309, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_Name value: Lighting objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalRotation.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalRotation.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalRotation.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + - target: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} @@ -1366,8 +1322,7 @@ PrefabInstance: m_SourcePrefab: {fileID: 100100000, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} --- !u!4 &1886939755 stripped Transform: - m_CorrespondingSourceObject: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, - type: 3} + m_CorrespondingSourceObject: {fileID: 6033288213199496986, guid: bece9afbf3ddd49059dd73ba2cc986f6, type: 3} m_PrefabInstance: {fileID: 1886939754} m_PrefabAsset: {fileID: 0} --- !u!1 &2128464135 diff --git a/Assets/Samples/Crest/5.4.2/Examples/Scenes/Examples/LightingData.asset b/Assets/Samples/Crest/5.4.2/Examples/Scenes/Examples/LightingData.asset index f567fd78e9720a057bcfac28e27447dab5635616..46eda0b3dee8f5d3fe9fc58a35d4d784e1032f6f 100644 GIT binary patch delta 29 lcmX@u#dxrbal=U$ep#M}dJogxmfcD|Kk=XZ|H(I8G6Bq;4x#`6 delta 29 kcmX@u#dxrbal=U${uIxW)ZAjd#Ny)A5{43n$v0dw0kvrhr2qf` diff --git a/Assets/Samples/Crest/5.4.2/Examples/Shaders/Sine Wave.shadergraph b/Assets/Samples/Crest/5.4.2/Examples/Shaders/Sine Wave.shadergraph index d0846debc..c477183ea 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Shaders/Sine Wave.shadergraph +++ b/Assets/Samples/Crest/5.4.2/Examples/Shaders/Sine Wave.shadergraph @@ -36,12 +36,6 @@ { "m_Id": "cd0f156c542b4619b7281770039836b5" }, - { - "m_Id": "f4c1405668a94fcea48969bdf227848c" - }, - { - "m_Id": "0c7cf37480bc4ef0b974856817777a03" - }, { "m_Id": "98621ce2e8384650a727003ac9fe6ae3" }, @@ -273,12 +267,6 @@ "m_Blocks": [ { "m_Id": "7adbe727b57a468eaafd52267fc097d2" - }, - { - "m_Id": "f4c1405668a94fcea48969bdf227848c" - }, - { - "m_Id": "0c7cf37480bc4ef0b974856817777a03" } ] }, @@ -301,10 +289,7 @@ "m_Id": "1b9d4d1e66054d0f8c6930b3fa52d986" }, { - "m_Id": "666e5ce71520453f886b902afbe47d67" - }, - { - "m_Id": "a7a5bf24ad3d443f911d872cdffa4e6c" + "m_Id": "d844ace01485410e80662a30ebca0fe0" } ] } @@ -324,21 +309,6 @@ "m_Labels": [] } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", - "m_ObjectId": "0399ec53adad4e459c8dcbc7631a3d5b", - "m_Id": 0, - "m_DisplayName": "Alpha", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Alpha", - "m_StageCapability": 2, - "m_Value": 1.0, - "m_DefaultValue": 1.0, - "m_Labels": [] -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.BlockNode", @@ -397,40 +367,6 @@ } } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "0c7cf37480bc4ef0b974856817777a03", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Alpha", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "0399ec53adad4e459c8dcbc7631a3d5b" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Alpha" -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", @@ -479,39 +415,6 @@ } } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.SystemData", - "m_ObjectId": "0f03685dd1484a778c8ad3dbf87e9719", - "m_MaterialNeedsUpdateHash": 0, - "m_SurfaceType": 0, - "m_RenderingPass": 1, - "m_BlendMode": 0, - "m_ZTest": 4, - "m_ZWrite": false, - "m_TransparentCullMode": 2, - "m_OpaqueCullMode": 2, - "m_SortPriority": 0, - "m_AlphaTest": false, - "m_ExcludeFromTUAndAA": false, - "m_TransparentDepthPrepass": false, - "m_TransparentDepthPostpass": false, - "m_SupportLodCrossFade": false, - "m_DoubleSidedMode": 0, - "m_DOTSInstancing": false, - "m_CustomVelocity": false, - "m_Tessellation": false, - "m_TessellationMode": 0, - "m_TessellationFactorMinDistance": 20.0, - "m_TessellationFactorMaxDistance": 50.0, - "m_TessellationFactorTriangleSize": 100.0, - "m_TessellationShapeFactor": 0.75, - "m_TessellationBackFaceCullEpsilon": -0.25, - "m_TessellationMaxDisplacement": 0.009999999776482582, - "m_Version": 1, - "inspectorFoldoutMask": 0 -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", @@ -527,6 +430,12 @@ "m_Labels": [] } +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", + "m_ObjectId": "186d62d80d5342778df6756e00152eb0" +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", @@ -569,8 +478,8 @@ }, "m_AllowMaterialOverride": false, "m_SurfaceType": 0, - "m_ZWriteControl": 0, - "m_ZTestMode": 4, + "m_ZWriteControl": 2, + "m_ZTestMode": 8, "m_AlphaMode": 0, "m_RenderFace": 2, "m_AlphaClip": false, @@ -772,12 +681,6 @@ } } -{ - "m_SGVersion": 2, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", - "m_ObjectId": "4beb3457ecff455e81b2a38737480fde" -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", @@ -899,14 +802,6 @@ } } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDUnlitData", - "m_ObjectId": "56cb2ffc93b44d849bf40c5e58b2f9c3", - "m_EnableShadowMatte": false, - "m_DistortionOnly": false -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", @@ -1091,29 +986,6 @@ "m_Labels": [] } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDTarget", - "m_ObjectId": "666e5ce71520453f886b902afbe47d67", - "m_ActiveSubTarget": { - "m_Id": "ad6b12314a1a4bfdab2f7dc03c885480" - }, - "m_Datas": [ - { - "m_Id": "86dc2941a072419a906d1d9d771faa2e" - }, - { - "m_Id": "0f03685dd1484a778c8ad3dbf87e9719" - }, - { - "m_Id": "56cb2ffc93b44d849bf40c5e58b2f9c3" - } - ], - "m_CustomEditorGUI": "", - "m_SupportVFX": false, - "m_SupportComputeForVertexSetup": false -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInUnlitSubTarget", @@ -1454,25 +1326,6 @@ } } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.BuiltinData", - "m_ObjectId": "86dc2941a072419a906d1d9d771faa2e", - "m_Distortion": false, - "m_DistortionMode": 0, - "m_DistortionDepthTest": true, - "m_AddPrecomputedVelocity": false, - "m_TransparentWritesMotionVec": false, - "m_DepthOffset": false, - "m_ConservativeDepthOffset": false, - "m_TransparencyFog": true, - "m_AlphaTestShadow": false, - "m_BackThenFrontRendering": false, - "m_TransparentDepthPrepass": false, - "m_TransparentDepthPostpass": false, - "m_SupportLodCrossFade": false -} - { "m_SGVersion": 1, "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", @@ -1501,36 +1354,6 @@ } } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", - "m_ObjectId": "8ed07cb6ee9245b195f845215e00d7ed", - "m_Id": 0, - "m_DisplayName": "Emission", - "m_SlotType": 0, - "m_Hidden": false, - "m_ShaderOutputName": "Emission", - "m_StageCapability": 2, - "m_Value": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_DefaultValue": { - "x": 0.0, - "y": 0.0, - "z": 0.0 - }, - "m_Labels": [], - "m_ColorMode": 1, - "m_DefaultColor": { - "r": 0.0, - "g": 0.0, - "b": 0.0, - "a": 1.0 - } -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", @@ -1678,34 +1501,6 @@ } } -{ - "m_SGVersion": 1, - "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", - "m_ObjectId": "a7a5bf24ad3d443f911d872cdffa4e6c", - "m_Datas": [], - "m_ActiveSubTarget": { - "m_Id": "4beb3457ecff455e81b2a38737480fde" - }, - "m_AllowMaterialOverride": false, - "m_SurfaceType": 0, - "m_ZTestMode": 4, - "m_ZWriteControl": 0, - "m_AlphaMode": 0, - "m_RenderFace": 2, - "m_AlphaClip": false, - "m_CastShadows": true, - "m_ReceiveShadows": true, - "m_SupportsLODCrossFade": false, - "m_CustomEditorGUI": "", - "m_SupportVFX": false -} - -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDUnlitSubTarget", - "m_ObjectId": "ad6b12314a1a4bfdab2f7dc03c885480" -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", @@ -2037,6 +1832,28 @@ } } +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "d844ace01485410e80662a30ebca0fe0", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "186d62d80d5342778df6756e00152eb0" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 0, + "m_ZTestMode": 8, + "m_ZWriteControl": 2, + "m_AlphaMode": 0, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": false, + "m_ReceiveShadows": true, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", @@ -2181,40 +1998,6 @@ } } -{ - "m_SGVersion": 0, - "m_Type": "UnityEditor.ShaderGraph.BlockNode", - "m_ObjectId": "f4c1405668a94fcea48969bdf227848c", - "m_Group": { - "m_Id": "" - }, - "m_Name": "SurfaceDescription.Emission", - "m_DrawState": { - "m_Expanded": true, - "m_Position": { - "serializedVersion": "2", - "x": 0.0, - "y": 0.0, - "width": 0.0, - "height": 0.0 - } - }, - "m_Slots": [ - { - "m_Id": "8ed07cb6ee9245b195f845215e00d7ed" - } - ], - "synonyms": [], - "m_Precision": 0, - "m_PreviewExpanded": true, - "m_DismissedVersion": 0, - "m_PreviewMode": 0, - "m_CustomColors": { - "m_SerializableColors": [] - }, - "m_SerializedDescriptor": "SurfaceDescription.Emission" -} - { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.UVNode", diff --git a/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowLeft.png.meta b/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowLeft.png.meta index 8d2bc67fa..f1ad98103 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowLeft.png.meta +++ b/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowLeft.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowRight.png.meta b/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowRight.png.meta index 64b38620d..9cb24c9c2 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowRight.png.meta +++ b/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/ArrowRight.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/Flask.png.meta b/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/Flask.png.meta index 48736e608..c224b9c7f 100644 --- a/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/Flask.png.meta +++ b/Assets/Samples/Crest/5.4.2/Examples/Sprites/MaterialIcons/Flask.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Samples/Crest/5.4.2/Main/Materials/Main_Water.mat b/Assets/Samples/Crest/5.4.2/Main/Materials/Main_Water.mat index cf1f7b701..7ef763cb9 100644 --- a/Assets/Samples/Crest/5.4.2/Main/Materials/Main_Water.mat +++ b/Assets/Samples/Crest/5.4.2/Main/Materials/Main_Water.mat @@ -29,9 +29,9 @@ Material: - _BUILTIN_ALPHATEST_ON - _BUILTIN_AlphaClip - _BUILTIN_SURFACE_TYPE_TRANSPARENT + - _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS - _DOUBLESIDED_ON - _ENABLE_FOG_ON_TRANSPARENT - - _SPECULAR_SETUP - _SURFACE_TYPE_TRANSPARENT - _TRANSPARENT_WRITES_MOTION_VEC m_InvalidKeywords: [] diff --git a/Assets/Samples/Crest/5.4.2/Main/Prefabs/Main_Scene.prefab b/Assets/Samples/Crest/5.4.2/Main/Prefabs/Main_Scene.prefab index 2a5ca3572..ab059e4ab 100644 --- a/Assets/Samples/Crest/5.4.2/Main/Prefabs/Main_Scene.prefab +++ b/Assets/Samples/Crest/5.4.2/Main/Prefabs/Main_Scene.prefab @@ -56,12 +56,14 @@ MonoBehaviour: _Spectrum: {fileID: 11400000, guid: ce5a3f1aff978418c90b45d58f574528, type: 2} _EvaluateSpectrumAtRunTimeEveryFrame: 0 _RespectShallowWaterAttenuation: 1 + _OverrideGlobalWindDirection: 1 _WaveDirectionHeadingAngle: 180 _OverrideGlobalWindSpeed: 0 _WindSpeed: 20 _Resolution: 128 _DrawSlicesInEditor: 0 _AlphaSource: 0 + _OverrideGlobalWindTurbulence: 1 _WindTurbulence: 0.145 _WindAlignment: 0 _TimeLoopLength: Infinity @@ -71,7 +73,7 @@ MonoBehaviour: _TimeResolution: 4 _SmallestWavelengthRequired: 2 _BakedTimeLoopLength: 32 - _Version: 1 + _Version: 2 references: version: 2 RefIds: @@ -296,34 +298,45 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e64c239f69eea46778ded6dcc3427a34, type: 3} m_Name: m_EditorClassIdentifier: - _Version: 0 - _Camera: {fileID: 0} - _TimeProvider: {fileID: 0} - _OverrideRenderHDR: 0 - _RenderHDR: 1 - _WindSpeed: 150 - _OverrideGravity: 0 - _GravityOverride: -9.8 - _GravityMultiplier: 1 - _PrimaryLight: {fileID: 0} _Layer: 4 _Material: {fileID: 2100000, guid: d340825b528984c3ea62563460223aa4, type: 2} _VolumeMaterial: {fileID: 0} _ChunkTemplate: {fileID: 0} _CastShadows: 0 - _WriteMotionVectors: 1 - _WriteToDepthTexture: 1 _WaterBodyCulling: 1 _TimeSliceBoundsUpdateFrameCount: 1 _SurfaceSelfIntersectionFixMode: 4 _AllowRenderQueueSorting: 0 + _Version: 1 + _Camera: {fileID: 0} + _TimeProvider: {fileID: 0} + _WindZone: {fileID: 0} + _OverrideWindZoneWindSpeed: 0 + _WindSpeed: 150 + _OverrideWindZoneWindDirection: 0 + _WindDirection: 0 + _OverrideWindZoneWindTurbulence: 0 + _WindTurbulence: 0.145 + _OverrideGravity: 0 + _GravityOverride: -9.8 + _GravityMultiplier: 1 + _PrimaryLight: {fileID: 0} + _InjectionPoint: 0 + _WriteToColorTexture: 1 + _WriteToDepthTexture: 1 + _WriteMotionVectors: 1 + _OverrideRenderHDR: 0 + _RenderHDR: 1 + _Surface: + rid: 1010 _ScaleRange: {x: 4, y: 256} _DropDetailHeightBasedOnWaves: 0.2 - _Slices: 7 + _Slices: 9 _Resolution: 384 _GeometryDownSampleFactor: 4 _ExtentsSizeMultiplier: 100 _Viewpoint: {fileID: 0} + _CenterOfDetailDisplacementCorrection: 1 _SampleTerrainHeightForScale: 1 _ForceScaleChangeSmoothing: 0 _TeleportThreshold: 10 @@ -353,6 +366,8 @@ MonoBehaviour: rid: 1720327093404827649 _Underwater: rid: 1720327093404827648 + _Meniscus: + rid: 1011 _Portals: rid: 7000983677634084867 _ShowWaterProxyPlane: 0 @@ -364,15 +379,11 @@ MonoBehaviour: _ShowHiddenObjects: 0 _DisableFollowViewpoint: 0 _DestroyResourcesInOnDisable: 0 - _DisableChunks: 0 - _UniformTiles: 0 - _DisableSkirt: 0 _DrawLodOutline: 0 _ShowDebugInformation: 0 _LogScaleChange: 0 _PauseOnScaleChange: 0 _IgnoreWavesForScaleChange: 0 - _ForceBatchMode: 0 _ForceNoGraphics: 0 _Resources: {fileID: 11400000, guid: 0817af17dea584e5382e6216db162d4a, type: 2} references: @@ -401,6 +412,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 46 + _IncludeTerrainHeight: 0 _EnableSignedDistanceFields: 1 - rid: 1002 type: {class: FoamLod, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} @@ -440,6 +452,7 @@ MonoBehaviour: _Resolution: 256 _TextureFormatMode: 100 _TextureFormat: 6 + _SimulationFrequency: 60 _DynamicSoftShadows: 1 _SoftJitterExtinctionFactor: 0.75 _JitterDiameterSoft: 15 @@ -489,6 +502,29 @@ MonoBehaviour: _ShorelineColor: {r: 0, g: 0.588, b: 1.2, a: 6} _ShorelineColorMaximumDistance: 10 _ShorelineColorFalloff: 2 + - rid: 1010 + type: {class: SurfaceRenderer, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Version: 0 + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: d340825b528984c3ea62563460223aa4, type: 2} + _VolumeMaterial: {fileID: 0} + _ChunkTemplate: {fileID: 0} + _CastShadows: 0 + _WaterBodyCulling: 1 + _TimeSliceBoundsUpdateFrameCount: 1 + _SurfaceSelfIntersectionFixMode: 4 + _AllowRenderQueueSorting: 0 + _Debug: + _UniformTiles: 0 + _DisableSkirt: 0 + - rid: 1011 + type: {class: Meniscus, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} + data: + _Enabled: 1 + _Layer: 4 + _Material: {fileID: 2100000, guid: 238e45299a5ec46308e9bf99ddf67963, type: 2} - rid: 1720327093404827648 type: {class: UnderwaterRenderer, ns: WaveHarmonic.Crest, asm: WaveHarmonic.Crest} data: @@ -499,10 +535,6 @@ MonoBehaviour: _EnvironmentalLightingEnable: 0 _EnvironmentalLightingWeight: 1 _EnvironmentalLightingVolumeProfile: {fileID: 0} - _EnableShaderAPI: 0 - _TransparentObjectLayers: - serializedVersion: 2 - m_Bits: 0 _AllCameras: 0 _CopyWaterMaterialParametersEachFrame: 1 _FarPlaneMultiplier: 0.68 @@ -519,7 +551,7 @@ MonoBehaviour: data: _Version: 0 _Enabled: 0 - _Mode: 0 + _Mode: 1 _Layers: serializedVersion: 2 m_Bits: 2147483649 diff --git a/Assets/Samples/Crest/5.4.2/Main/Scenes/Main/LightingData.asset b/Assets/Samples/Crest/5.4.2/Main/Scenes/Main/LightingData.asset index f8e84d15dcd16ef6b3bbc48c878f4a3a90b7b2a5..ecd3a7f706e29b6a5339c47f11e51b76acc6d962 100644 GIT binary patch delta 28 kcmX@u#dxrbal=U$zSNSE%)In?KL!Sd|Ns9_zV4C*0I;eIu>b%7 delta 28 kcmX@u#dxrbal=U$K3SfJdJogxmfcD|Kk=XZJy zPp^+NhSdPZ+C>DS1&Il_+4_CJHJR09uIg%22lMMdjFH z1b#?ii4a8SLgc_7VFF4sN_zncHw-%5@G}s%fuS^p&(Jm)fvRT=Sd~#z1$rtbOp>hq z`gI9)^eUdf*i1=K>zNEr0|EVA4m0Sn0YFG_uL=en`(5R&8(a=NG|kx$#ykd1MP;%| zKFGP7EZtsRYpfZpI37^6_z{dS@&Z2c3n7<=UTk!T`XUSx5hBW7Qgc~eGhVK2iJ(AX zG)>~#h!a&WCfivh+EH8tRY*w)sIou@Fhm&4MZqLs1SXF2#&AHwE)l{Vmuql=XdelC z^Y2~~_S>jll#+kvz|#W(#S04-NIJcO4;GY_37I4L424inVICT7OzU&A+g1vR;9B+% z+0{X9FCkVmUql5SN1n9U<4a8>0|Z)9#lH_D^N$#)ONQedG%f-am9X#EMs_EFx<>0- z>k4@A$JgWYweTw&*sfDq-OYRCc3{|qvog7yI!bbFc~ej9XOqKSyjiMUs$JH~#}}slG^nH9JasD_ zxq|jG)mQ;Kspmjoln!IG8GRoa(ep;@GzoMGJv14N=~wuL*GhXa?9HJ?tC%EkIqdy% z_+|rgD!l*lQg-7IPZ+u%0JFW;)Xqgb_3AU)7V%6-5k2ohwg< zww=xi6Y*$e-%kk9!{7Tlrf2y)4X+H>>pyFGls+eqc1T<1Dfh6JPIUimTE%)6d~bgvBi9P%czWNVXFp|~{2@G#`B=;@^xkRwQ}fh_$dO3QP?Im@%_XOnQ%Zku^POqD zEZEN0bb*~XtL`|ET^ehSXBQY7+K1jJgUkd+XZYALmTLgEUrI&iuG7szNB?TDj?Wz9 zU7+<>|M??K8#nOL|Ct~2;1mb@`v9mwCR`wU@e{~9BY3yGCTLDlbNyy+M0kbErh=Lr zK=wAi=O%Q0aUA*!epQGK$-2Om&IUQJ8k@o4r6q#+{ka_Sz2#f(m)R==;%Dc!PRH6q z9uqnGqFKD4)66qt37ZOUa)9ewg+}nbBK}mf{KL2g6w^C&?A6W_b%oD>rKrR@PL}8wk2Ye{2ZgIuA#c-bV@{Rze8d4-pqIOKUnFLf|h3B1=tz`GS=ARXShZYA2p#^ON5uzYTMacS% zp{*ZmACFH#V=gAmb8MVNz74SfT?|Q%n@v+}s(%wkunGX~QDYRP;QC9t>J361gu$$U z@nT6qkHX#{#OoKY)Iz#WBa!PQp{TKLiD8FWZUqViB~p){NVsXs!@82nVQqFko}lpM z^(jw_e}<4|TQQTT!9_XafckfEMisq>wc_5rs_$UPKCec?j_Tm-2^sCg<>xW?vyA$= zF0f!AaP0waJ*0G4G1FCd1}^mjWmPY#qDUHq{7Jo_(_;}JgTnr*xH(AsBfNx|RnS|5 zz_&+~g?Y&spkdz9P^-YS11fYd)Dnt<04YV}pBu$IfjAiE^*acVt0s=lDV0sdWZ}J- z7!n^MA%P6{fskVL(~@MOX9bvwIN{21iOKOK>T*DUpMA{qm)&T2KN2f=fU}> z`LEAAmSb>$>s)8+4eeekQ)QFWpSA=`(y1~I^e%hfk-4lN0J5oIi}!6|!pb&Z?O(qx z>MDH&G-6ZdHp+9~yRY$WEa&7yH!wP`j?{!}|M-;V8yGM-TF#5}$)AhVBpq4>e-v!+ zajOA2^~-9ipAB=ZoxDqwCX)>`{B2KSUx?=T_K`l?mG-1uI%t^etq(s+J*Sd1pUq2T z_@9(Z{!Eg{1}~or{n7mD`NOL=P?RvZz39A*hxCul_MW)+eQsZ~hn`gsk=N|U@AhQ| zWa96jgt^B(3M%$BVFfHq>|>c@FpMmwzDa>oEkcKmknVK?N-LMUNAdlP>$ZnVw!saH zJQsDI)%-qRcRpI-kMAPCed!r=C+|b1tjcjbe{NJqeE$h?ToS6h;0M=}t#+W~-@+Vy zLu6%o6IF26sbj74pZzP^c+0@S0lGCV~{B?%C;h4e9tx=6^+jY6kc3l%wV&B>Lcl^=X$+_pq4hj|7 zQFogTx+T9dMuV|Tl@U1Kxir0K1eFGi)qpJf_^5mJ{$c6c>sYCJV!hty4IL1rv7-N{ zHrsP#XPi25=|<}3Mh$@^^d8>1{h`;0i%r#4_c}tB=!UlYfPt_JyPu($yP)v8Hcg|kS!Pe)Be zL*q_0X$7YRPH8DPtxKVF-D_R2UWsniq_09EfXhY|gPw6Y1itJ=npV^)^P*8uD!iY+ zhcKn&Nk*U66(Zld+~yO!gODkfl^+DYqU6VFv@*2jin63=7}} zO3smzpeJPeOJ=Z6vU9NHOJfu1!-b~Xk{0nr&6nKKF|KHD)p zN6%`zElf1u99a_p&IMBvC6`Kp*%R-#l^kotG0)}x$Dm(`@e zPj#EheksD>%NEsWO9easYi(*E$C>uiKZwqYq(`(!NY2Wrh6<``vJl=83sYjGM!52R~{H!oxiU{D)SAdOi+I8#BaFq2|A%oE$TAz zYnr$qHOieODdx@fgN)L59rgS<04BGpo5N!BQ9VTxR7Y@4BZLcXxk-gU@BSN7ZQ1=e zb=Cq3BasxF7Lo1$C@QX0(hUgO|B+OQ;fV0Sf!z_15aj60Mv?gJD~gmNMNYug(pIHJDbqM8da1urUT+8rH2jm1ba zVgpLo$=_CP`t&)glo5$?LzJIPKB=&utgT{i)79p~?40d*`4el*iVuX%6yhVZkg=k` zWOlqEB|2&#T4y*S-M!cw${;szG#GRWwu~_{v=P#U zBEj((oW1?l7#f`Mi$uS<0^~5Yrw_7$UfR=nWMLf1fioo1zc=Iu2kJv4;+R!o0;A&n zQ%Ni+G&IH}YX;&QPbdpWnV^14poHP;C4cyh6m?~k@O<7#IYYxC_y+ELg^(;v&NyDv&caq%vfFnHIfO) zZ>`li3d&jLQLN?RCWd8I!n6l^0e|+EtmW~#i1X*2BocBvz>-zFU5O7(P_GN9$4+K^80fAAVsGM*0Td*g&A-eczZ{92CU3HVkJ%MG_ZN?^ z)7`qdIBW5Y)y3CO#ypf3geyu=m89>h1vfBOBn6MSt) zsn}fiA$1?Q&X44%)h3&>hT${X5_|21u}3G&>^@F0ctiB}vkwN%Fi>8%+MRPb-eq29 zYxjg_I#XsYmu2|OQ@wwHi^Z7t^i2o64PW-|rHto|q)_y}i#3}V&FFoaK) zUq79oG@36}kp+)DS5eI?!D#iw8*5J+PBMTiCI(~LO)5UN`z6Wb(XTJ7hS(l38S9=U z#jTe_QPl|dlg0MF2kqLtI*1S<(!3(Gp1%GGIR)QlE#n54^)kaix{W!tR-^R7r4u z*<;u{4y=Wo_U8`FVx4uo-U+i^1^hENCtf0u>=7`7X2zto6d1W*%*Bns7I3QTL#>z32$^L$+dpvk`|l z-W>ck=|P*0ewV`mvJV|1tt;SExQ5nqhg{3M*zNU*e1ltpCunRZx-g?BA`#FhMsdI= zK9Mj0|A{MnZj`Qfts9(YvtkVJ=9Ml>yyOAjf{@=gvK5qg*W}5jenn$?J(u{TmdDksC{MJ2cy>5?eR?Fk&Go%#Y!h0b zoPSC=CWN&q10({(#6wkZN)jH6ZGZ}nH3LH+t57(908|u236k)z)$pE3-Ctz8UK;bc z_yg5k$;DuO6MXCDaO;CrUR}{fp5n8cG_Si|k)~eKr5(dTb~+vu+7w-uf^J=M-N_|R zV~C{)LaO*rs9$;ELdx`G0Aik0j4)8(G-U%R0Z;0rkn4`V>k#CzDjgF~s;Wz0+gb$t zbW?LM__1vTW)?lS_>UPm5GWq4Yg~99Eu$(D$)N_k9sNH(pvUFSx&iqY6429}+PZyh zA)%Z^a7N4isD+SFJj;Xg2fb~@GW4Z0S>gZST5TbvOq2=|y$XyUX$+h%U><-;usPI= zLH9dj@zBSh3t63hHq*>gujhvye|URXm^Bk059WR9+rLf`+_E#YY7`CiWg}jGXf3V5 zN8k=6nJTj8YjZn@yNK5nX=h#eZ*2A)U)#60=`g{lKY?g4drsZIL+Oxvtv5mrg+94- zEh-{go?Ob{`n145U=JNT&YS~}yfddLhup!xsit}|^OsH?Nlb(_`|IH!5d2QHcS8;G zuJ;4>o^$kj5X^C6lXt}(t*#~?F>X_jTKRNTI@gCcNUl2EK4(#c-R=#VrZQ9dxMpO9 zL1W1T&Uu;ju9r9GwmC)`u*NZ&prcdV;Q@<3UGM^Hh2OIS z05@4|ZF8YkaP4k>{N4FZ-!pqos?Ic-WpV6iU7!DOV)qkLUr_8f>!PFZlkUfk9*_*` zbcmZLo^t=4DkbnQXmtki5Rt~Ze$B=I-PQ&e_#D0EPW2&6RGV$aFJ6NBJlz+VA&MvW zF>_Tgtu+R_tamXwL8;E|$NE1AOZQs5w|1$^KW{L!laoZVf^iV=@kUbX2XMqJY6+@$ zI&!{Rk&M?##is}&-Y3xvz$}jmtjtUtea>oS=Q~cBx!E~~cIW?K>e!w?+6)(7&pZX8 zHk+Cv8Ig(EYr$IVw5w`qiUog-buU5K)qd@?BT9B?TO4r`*yLhKCail)G$zSH55qdvREJZ}-&0MNOBq1h@ln1j}i`1)x| z?RXth^{|{p|07Z=pLi)5&13&~FD!__5PO~Iel=7umOSs7Dn(K8@JZZ^&~_om-cpsW z-kEIlJnzPwb*v2O2|_Foh_OX{pb4c?MQ{1*!Ql_US6|k5d#iTZJ@?Vjr#R}DyGwkeTwZ;b)zEiS+2rFr$a2QA<`Z2`GF`fJ9ouiaIu2k&2r28MjkELmDVq9IGyf#IKXXlnJu zdYDV6Syxro_0p9mKz1cZ{1ap(rOymE%FhJ?pa-RGT*l)5z3VCJlNxG@LtYRXtQuaW67 z0+mO%Y+cJ;^G;x9bi4T` zGGKK4$gU&MI`h3EcWuQcqa1MD9;Cl)UW0elVY$f>vW%$J_RD4fD6S{)?_bJ$uObtFe|D@5~a79}De^&k!t@A#2Y8_W^~E)y!)$Ei|Vu zHPkJI0}j@+o8e5l4;?Av!|O*jJI~`Mc9ROXc=X;zl1_Rvt0?oRb;W1D{(QaE41>E= zsk!&O3I8GmQvWIAelt!cT=!cN_W1j%B$-{lxoB|dScobhorx-^wi#zjRKk&PrcT|x zWaUxS^%^0#Q1*!(F^#SKpHT6pq)T%ffz%|0B&=uv)KJJREg@51o8mct4{9wkcJ}t+9B=zKyq=4Z*aU< zz*y_WpTuZnw!`dO_d#FuC31VQ@wxDjbG>eyX}1F~9rVPgURy9IzP_TtIaw+#oc@ZX zab=+M3FIy+$c}vy5tV*vgV)13E6!bCpO6`=jxz!R6~zy*0h&L2RMF_w3=ec8FbG&R zVuKJ9cBK6R$9(YMDhR(}qSDY=&{$Nls>Mk~|f+ zrlJfflL~LU_l^P$r+aCZyvkdHXC~^aA@+f*6MP`vSbLxxen~fVkWvXR|3*0zNtlox zy`ZtVO9-l4?hoF;`Cb|{mXPu8upR_(bIL30MB#H{01aTZ#evT4`Zq|R}j)kLS4-(N;E!>?8m|;xm zghLU82#VuOO2WIeN2+Fll`oFBRQKC3#k$uTgz*8TT}0Bd@ZiD+L6%-M4;lfh3C9tV zX_P+XXcV%vcZL9$q+v#&h(^M0iKZFv>w1j?VTI3%vIbe>Go&X&bgy^#Vj4pYtQ1#xN? zHj~%hi-e45UWDi5Fy39?*8Y?pyl--Y(4sw+Go{r! zNvn<+r(;3tT_%1mByxkP?55NZZpL{%&f2w_65{jq)90&1q?3HXOoPTiH-z?rrwXRi z0jui>9(KB@XHv*O&?Rc;f9eOdJs zy%q`r5I6R$E89go_p#fex0AUhofZCUQa1B?=cI0!aY8;z+PKP#Ntp zdK}hv_%}n?ysBu0)f6Y>4sYl8A#|QIwnz0OkL^EHCFXvOnJLKSPwtg?<~hu1qwvu7L6=GPx=Mhk%`A)l2y= zVQLh*cVPQQ5 zpyJTd;t{!|5U|9hG~m(gpoU5;+~2q+VMGJGQ_vxt@g(DbDdegoKW=_6zz?$`2n3Xj z!Em^5y^(wM-ei=E7-LszA>;H%`}CrW750Wz#%mnnxMQ$&9NY^UQz(d%aOhM)1h(Xu z01(Y&sZN6f=M}^Mp%wkpEDaVGa8s-0AYfCgoEgwywR*7y#&+B(^)RC>HW$86ZXsE{ux4i7` zyI^9I*g2k~HC=x9sp~w#7&6h0US{8)!3t=whyejg3II1BTgB?Bv5M2Fg{-Vh?1o*x z7e}G2u5S|&``D?~)!9h?N#?JEXq&y=dKFO{6}(T2CF6s_)-lOv7NQwWaCLBo{B z5n%A%iPyV8`!!E2rqLQiJB^6L47Hk%p1;&3Ilt;&x9Z*BA`V8J*uy(w&eX&Ds?=}Y zQ86>^tuDq?VmY{)3H%OTEp+s^44hR6TUjg85&qKQ?$Tm~JmJMkxHVhk?yaZ6Wlx6p zb+9DyF8T@UwjehnyY2brU^ZrJ+~+gdZ{V4AU1Gw~we6N=1Nm}yM&R>bkfz%Z{?d?~ zX0A6Wz4dd~j>~_!$hH~tJ>ln`2H`_5Z4@-LI-vYWYHF2F*y;P*fiJO?Wd2$05|A}B zYg2u;pb1$(udfGMAAMW7bU$``_?4ccotlQg*S^>y1QU!DMf~G2`fTrKDfhZZF7UHS zeq%d$QL-zjh4QBcla_m~u08X_jMe}m;g9zcG^ZsMT8DGOB|?vpVeGfFiu}TwFMW7# zBVwRYN`U-+4cTe!mh)Q9^4t`91J8*Y<{O^@q_-va&(hfJ)JGLJebu!>G^U;#8Pqqv zmf*&!0j0BIwo2}rbG{ncu8Qo`S)gPWzx-K!TPgqIJ`u6r+%l~SpU<8X<<^LghX)7a zX@w1}1AjzIRr}=;ab(8jQOgAnCDXXdt$6lZ=U4l`Y)l1r;Zam2gYYc7+8=9%7{4<|d z-S}$Y;LpcU=_0G?lFL~)4XfG>E4i160>@tfKQJ|CPUwH^C6s6+1P{*2!kKFF`(K9L zt%3%GkU1-WnJE&rKRAdi;AvJK!J^7iDOWaEO=#*!LU@JPqrv7Gf=%W&kaNEF_2s~7_KN! z|K9%~$?hLzjoTs-NJ22qWNF2V0h)mYDgj4%m>3Ku)ND!T$rdmck!-S%0@97!L4FpnGPzxe z|9I8;)~~$hYLbJl)JW9dN&#-rPn~y1eh43GASG)pgLvZ)>F-usc-07Cz9d%rRsbqC zLfV;#JKWc#PwtyT3{+G3JxuG)39`}9tG3$6fSV{E&lwopsx_EBiVwQCU#jDO!Efhw zeM42Ymk2^y>DHi&NuU0HSgTzSlza^hUg#B!?!G#IRJM7!U#=LC6*+y;yye@B&6 zr4AKP`XX%HC!c-WI12Y?<{JF1x>p3P_8H$ckS1PN6})(}c9tmo5QllZ7e3!bLH6T` za))mJSO^_}@x({$rZ{H&s}BCMcAq=AyR5OE!ZAFu_N*@)J6$II?7dxh{^1go8fO*b^}oyB_l2eqUS9N$+2u@$dik8L?HdNnmEGesCKPG111QcD5R5 z;#==e*0s3z{31RTttMFI1>Fk*3-2dCyCHv7NmA@|-_qW%ilnOj__w2n?$g_s;UH2n zv>Nq_A*+Smii}eTE2j%7n1paDEh2~Mb4Fl8N5uA~r$BG03|KrEVgvFf)^{qJ-}!_n zz}BbL)5>ZSj@uSEYg)<+GGHe-$- zMxZUn!kL}Ghs9xK`{(Ks(2>zt(8{oIR$=j?+9wNwzpHDfK?}`q=_0*Tb{crp)#05> z0Cy*@P*Qz`Rtdam&p^p07L)>pX6I;za0n7PO^W>9e~2njRspE8P0AGTYKmF%zj?BP zW*O2Ya-x{+7+K`dxZ@s-7vXS_+6M!Ub_VH71jrTQMBHj+i@?H-7Xr>u(Ds~n_)y01 zcbJql9mE97Fk7*-2cWk}>+?)l1JxN>TxWQV&7;w>pc%ngfRMDZ1Tus=k3?CCNk~QJ zqh(ro@mbCXy}Z1%?9kI={EKW9k8pi)Db?Z;v@!vF6oF##JiWXs7&X1TbsCH;tzpkQ zS*9qAJkW%Dv^*sk>hMuTTS0*F3^fRa^9}4(tY#2!iU!Pa0v@X$d&E4)?yS8uKk7+& z2MjBX;YG+6f%Us26opwNV;wX&GOCt&!z^GzeEjSssYefwAD0_h-E7QPRFPw$LkEs; zQ?LsoM;{+2L+&!DJ*R8B?{XpdxLXr9Dk0$rk#vj}X=5y@yH78mqn~Hl9~+%U(?=~} z2gG2X>WCjq1F^Q{Lgmn&8f&U2`*&VIXOqgE6O=v;ApP0mXPp15GH8vspbK??hlpQw zOvRMaVsXEr#*oos?t2x-;bSVtHGzyv3P*ZIprC@OyqdCcF zoTVyKcu5rdyKA5+WR*jc_Bd1|71MeZZ*fNm!KH^_=98JeXx@U0Lw+r7I7~FWe)zd`iXxOETc>f1BZ3M1${yB#;t`1N8grl|v^CZ{SZSm?)WJFyl zzbo6$D56DC>!=VwpRLn|nU?$A>`&brl>6H-&~vf3WG%jB(&;e)yk2ql2Aff6MY2K= z^O}qQt?oYAm%FxR&+m_7&sQ^J=sM^zeDtDY*}Nk&-OTWbrd-Y1zGc@zeB7{YXOib{ zj&1kj&-~4w5l>FO`#R03M~3cBJ}dKz6nGT?KnXy&>h?}MI+Z{AdHE@&4R7ySdzs@3 zX#ZXT$5D|>Jr63FJ+k&r@a&KzDY@P*@Aw&OJo^eakAFtYCxCXYtq^dJlo#DKMqV9r ze>(d2>GY-eQ#YrX|7Wib7XRm-yWN8gZPe8mlm$;kYU#bZpZ)judAle_+?R7DCy&Xt z)x=V=)Avt$qK9tI3n0xm=#i+=UpNcLM0H-i#A;?lQ0~+KX>i(qHVqj_@C!`Te^^S$ zp8^r@e`2Ll+ak>-by>yzueZ+p2ovo~pJa}$pc7Q-tmhCXo{grakR;8ej8dB0?IPD< zBfBJ8^d&kw0(?UqEq&4WTYGcK9D}0dd4gaW-aBfRth==vdG#$!E!92vbE^Uy_oBC5>r_EtHsl0IB$#ECuyCI~1!Hr56~=1|5~>oem`h;-c*= zK{UE!H<`ouTkf|&nEMaj8v>Sk#-1M$9FdZ7X&en?)=@GS!K3C+fJ)asi*$#+;AwMs zrr*OY2naOMO6lUTsMi#vAiO70Y#<>&E`rw%+CX4j6Q76Rqk0!$0@aKyV8A6!nJG$e zaKJOr+4gvu=KFzg8EQ=btXO%hOMcsY{IVFpO8yo~yOPo*y`hrCB;Cx$#HB9-1i|`> zKqn`%R%~NpUqCh3qxYtgQWSvgnhq{?@CHtnAyPJ0*9XJI_z?lnb0%p6!qRS0K~1cQvf5R_MLA7cJFSPG80E)7hn0^ zzx>>rRF6~7W}luuJ-9X*HMy;hqWaT$HI#C)1los(_t0xpV4b{IZff^TrUvAXJOmib z9evkeNoj<$+IEmwnJ7N0Byw(?$#I+p->H$W>7&I*AI;fcYtt)_5sr~}nJjLTLjUw? z>||)=y8{6dhWXIeWJSwpjR%h={@w(U-e;h6D$V_!1q#8#lIJTWym4AYv^Ay30XZ$A z!g4ccUooM}sx}i?Esp(rD`%0GmHL;YGw`sr@m}8xd0-ro$(^W+(NVQ*UcC7>!x$J5NU=d)Yh`EYf$Ug2LotR`(M zu|r+{Pn0UYr=~OSiW6diPV|u?GyLtwdIXJGZ3X_2>y%wR7ki77^%JV)x-~xn$9wcP z-PHb_w0+jNU2Q~RcaD$THS``EWYwvo^T96RT@KA+q*SDvSnzfJb1dDAubSc{+!}A>KR~_G~rF}g$ zAl;H;NOEUI($Qlk!eigpSI$KfF1`CYxZ8!wW5#g7nGaKZHTjEJW$?m=zH^Tb7MieT zHKD_4@?gjNoy`Y3QKx=EBB_vEVi^nr&_GF_8|CM*)(h(csD11Ru_^{Fhk`~Ku}TIV zbEka*rZQ+`N*vX9_i@^2OKR5yB&VGu82fpfr{#23dL1^gKFiX}PCe@3_P>1^N+&my z^8S!l760rD0WF2VIcXTDYAKpkD?Di$$|n&7=NY?a{j9deki@Ry4HZ>B36%*pP>h3C zLxYVM0>)NBQN0fUiy$9F%iCK|NA}=OFCG!4g4$%}=Zr+Fia*42jcX7U*JzvQvWM$a zA4k?S25N2mn^t5zN~kXsO6qrQ)=_zIEKL;ufOOP?<%>+ee>_eqoua^n>yXw?AAW4IGWn%GMc5M-4V-S!rhj56&`_Zg%Qd(I>u#UF~*pLs~l)kuMs z=8?_?8O_f+AM@tCP(sd&(ULAL?0}IHN8vz|eyrQ}R(E<4gNW8op|64Y(ZC<;oXyYQ zrmjvX6wehwzpva&+LuJH^A53=(e&K#HwFQvx+)0{_@VFl7fE3M6$j z9wuD1=_Y=vsrzzL`0R(;#CgHv<7?bh`lxTTNw}WlSnhCAHFf>B zk8x|8fRoV{(W-LSRZ;z=;#-yf1D>;*Rv!1%?6KuTF|V$opB)hs6nhZ=Lwk(kRM&T~ z-I*qLP}A~;Bn&!Wf5dX9AbN@a=z222puW08`1oMo+x{p0!abC(NiX0(=WTO1Z7S_aAQ*=X&9E+m$t*Ku%wQb-J^?KMM4pLVi##}prp1x^eQKa1V!`T#7!5*Fu7J|mkdAbZkN%O@FL{FrtL(^`hhSAd5mUPw4*=wiOZr|Ma+X;^$31k(DW-)kgoIjpQw5( zBk_3oc=_lc-P@I2Z;DB)A+w?;rZB1G=;GpJ3~~+j`>|j5J<3$^Heio@D9UuPkv{@* zh;!)f6g+PI(f2D8*s7<`42p3np68Sq6sxe13sm-7{#A{)woPabZ?<&xbNScTmg-AB zaFdnj{x~??vAq8!RK#FLSZg$1c|bjXTs)7Mb_vm;>qnrigk=}pTnUX9EOS1{A{5oCo*|aAQKU4PcUZ&O@NBE!+w{2 z2efUuBcH4L@~k5o#h!=E@^;x+0V54YxRsh5?|a(`ZI0td|FxCb9NyK>4V8s5+v-^5 z#LXJ7!$<28&9;_gwK9~*n{sT&jun1%`{wuHzuXa~FI6V`NfdYel(_05y$h*l(nYR$ z*LY!jUV1Zt|6JNmo6wx-ky=T!^-Kxad{uyVKY7I5e@BK_mzn+N!ps3~iCVmfiNn(W zZOp(pSQ1ro>45*riM$A1&srxdSETV0KT%;^Pp~eTY9)nLNmBKTt1|Iq_IhPKus=;Adbjrd1mpS&?3y!g0Go)X}_rr{W7-k~nlFB1NdUnA#DTeZ5o;%mYWnP|x)5#Du{M zDRungWeb$gA}ncpX()cfv#h}Bfj9xakGBc_RM75@-|hX{Zn zn^WDw$Wf>)2$-X3R(1sX2ZRPO5ZC9Su8d(69*HLO!&B+j%vu-N3wuEtF41Jt@S{rJ z-T)&cRMup4M$otj+_JLL_Spd+mbW%0F-GafEmQSv`dlsB-#if)hH3NjR)3jks6US3 zYrQBfsg5Gk=vkxFEFQ0hCWjaXH#)V!+k9UbfDO#g_e0SjukLxCre9Uo6Sf@p%Xlx^ zT^(>`l|&xLa(|ay$ z5L)@{t?tCv^R+n9ZMw!!c*cL2vSYo1X2Pcrz1)0CJ}NoO7rM}_T7JA7e+FJ5c^)v_ zt2N2xa_OUIye*m=x}O$w6PXAtLXIHYXE*%1KJS(@c=Q~#S38s{dLG)i^1**n+bkL- zGFIGrM$S7=wrnuqQ*fsx2ZEehB~R1?$=f%Y9ym0d3Tk&%+vk3SntSvZR(|-es8^AH zMm#On`~owFR|@!FMsiIom*+-g{XZ8vIRC350XP3oYZ^Ovs%94&m)&WLyv=n@;!pDY5>4u>L$b?Z01f(Y zDdiV=qdfxiC3Z9{+gtFf64`6_xqJs)+c+u2S;|dSGcKdUR!d z$&W@h-3BC=T7m4nWY!pO%6>T9SxQ{5ZbIWN(WRje` z@AsWLb^h$`r|PNx(bap`TK8J_wYcQVES+(~htdmje}W8e`tlaYXs4=FahI%t_0VhZ z3}BLM@R}n1yfoVtn7u^vv+HY>zo-P=W5P}~*|dDz4s@$uLj<1| zYhWfQ4@HuMQZaWop~Ja%H>Ib#z7{Izgr9PyyPMP#G`pMD;yN}dGmy+Y*wOG<67YW$ z!E<6bYmjq_AMVLg+t46$V(9Jr+n>>pb7HWIAT0OUyLSyj^@ju9VHf!}Xhk{POrk?$ z39uZKe;0g(RmFv21hUx9Dx&Iu$1DcJl_dOhh^YnqG&tz*zjUi&7(B>aB_Ss>OSjM- z|Lk5}tKyXx8;2gKKjNnAsTL-#qz&S*YfjRl^x1uOPKU6oH#vbiIznas4C5| ztABZ~o6cJ9NT<)}rk}xzct?{x59@ZYr&D;>V%35S~m7aIc*s)c{WQXy_mTB#P&vV*L*b~w8xPIT7^mR9NP)AgVU zy?;+$3EjeW>g9~iQ#HnV4fSXLk|$lC;|8ubMs`>}Z!?K{|B9mdshfUx)Q@+{RwCs1 zSGuQkNu|8)vRnfJ81W*c+hBFm2KQVKIUdQibr~=Be>ZRVXwkY--R-}U-t9+ZcKPH8 zsyCwdly2}ky$*~=R+<7XTZwB<#tKl&%Z z$Q*XTHR`>Vsari|*p=EYYBXN7JtnXF&v?g3-!ZMN+*}w50k{}}CVKk>(as>rOp#TU z17l%H>35_7mURA~n*%#c!7bcaBvF0=3R0~}G1%ygAa&6ZfhV10%=Yce&4ImZRl6i@ zCoB6^w3ok{%zm;8Paf)Ys6oB%PMZ9ZhbZvo+AwS>4$wWjcXN)?d5ViT7HwKF6)Nh@ zVQKUFX{fY>&lDAc!hal|suauW*-)ei0ZwTLER^h8qr0`_+Fk@3nb4m$IBV@ETFsT!wt&w3CIWaTQXmk5zF(?z61oz&b zHj&qf%PMCA^|iFZyE#0lG1Q1L4B=i^2@~AbC5EBJKBbWofR-Y$%CV9l=?wY;IxZmc z2$9iEWDIE1)BYeXs1Z1GZY!ixXoX=ol^c?=3e%8TV7fdZVK}9);`2QuwmRNZe7@ns zX0q&PTwrRZs+QPMat7MSKby$$v5x2-bo~(xU`vLPcfyv7FfnacMiDC*`y5~9 znMS2UFY&{3QThqbyF{a&TYu`~!t>UF))iMzzm7Gvn4N&lO#ndB&56%{b<_!~_UwT| zXX1%be4Rfyg;cNzfGx2yh`~5_Y{-){Bo!K?;oeazwbp+`3b_ecY9O;t183z z&|9R#0X*ZY%#V%SVy?!b+@T1fjQH;69lRtaEdBiU zXd9LE*pojS9~}>j(5I6w)*if+@#bFjWhaESW;j9oxl0PKbIofOwkB`hPFOk_a9sgX zf3%VrH5-&|tm35W;?XyLK8POeHuJhgT@Ea3y{9yftOx_aAH;t;bMIMHK^Rur<2*?8LKmLVk5U zl}uiBg~S>00iGKlP@O`eCG_7GMsE~Iy8o|K-x(o6CTSQ*f^7J!uCL(%jfC09Rlk*W zc}SFLRK1#aMAwS`O5t z$hX_7Fp)+A;^iZ z3oaf@@;tSR$Xb^P+mVHq3C3L!Lq@6wxYR=jSd(g8beZg%gBApa7(_VU=yI@qSqZ%e zSEFS~qQPX91T8UHi=rJSWb0;Xs)cHhn^HPH&xryi&TbAopcWQxDY*zY-3}EeNm~7* zx$Sf*DDdu76plm8HChUCTJ_pWvR{uCo@eBdmiSBF;f0Tku1TZaC3vVx+BesrD*zR5 zT86k%jpIYkG0)QL_nB-F2Zb4_22@$KZ><-4xCYdQs4?p`4JzBTTJt-xuK8GVxlLGKXRjW24(Ewd{B#hTq8FByEQR|eLw>X}Fn_=I zqb=;hTa8J7>T`1D%!D6Zw8y+o-M{iG_j9C%(A`dF&+ zU#rgm0KQSI;hI`OXX4I*Z|hpIBbysIS$5`7>l?Pc+zIzgSyf(hBGFXridyh&Rl48ir<=V z(G4BT9ox=#w`6zrnGS+vj2?2Y+QM9|Bk1A*&74Y}m-PJS&yR?H3g5&A;bmVQ@Z4iV z;pR6e*26kYk-z)`wcPpRN*l+pJ%st)c8UR~x*vuDgWd(?pQ{ODtDlBLZ&p7L9S-WJ zZbq=Ykd&8t+J$t(owN2@qCD{5Syp&7-{Q~LpNfX;^Mvp7*Ea|fk`T&$b0h=)wKi{A zjS|XwS5X_KDiYq!eJM}-G2ri(PvVchBrCnrY@7PPpLO5WuTSJ0jJWOW_^r$Tx0m1B zV8?Owvj0Zw^dAp=eFyzxHqC>yAVMP3?-Xw9z{`BrU&FeWqf%qddkkUD5BO|UG5M59 zz5g^HB7kyasCNG^00cu8p?jvjf_zO}jkvBsKH3cgOUHIDfb=MN0tA$-Ux5R~v$;1Q zf2-Qgs;m&5R-J^BNZDt6=CQh=Q$1?iCqs@Rqbk6PT32`|%qILS7=wnk17|5US$`bFs&gF&45U2^axFJOet3kRXaMf$~?F}87MZ_Qdd&?2`cAGW@VDI{29VYEqez#YLm%EGFqH-g_UpvK#CGSPXMrQ2kP1fC03inp@t@-~VadeA0Soxr z;;S`%6`?Y^x^+cbrM%u+h{CWTn8v6=94xtHkR}z?I!jfSaD$ozT+2>01J;Y+9X_TmLp=3)|aGAo!^YNoAX_h zo~PUdQ>+SO5wwv=Ck8G@odFX^1~14itdEzH&E8W23p0|e;WY@3tQ$49gjO06ahFE{ z50j@HZ3+${UPiNzm$Vj=!z7Z8aX07U5Qapy>gxs3oq$bOYRPkUT%>#;5ow2Az> znZe$E%h#;YV9@N+xHTFojb4%VQ>xF%KH8Z2`Lq`CY_W4Q+3vL~CTPwGIvF9LmE$l2x~ zVHdE)X?Zk_-QDoP+@Y;UyW(ZWoXPg!>0xglHfmS8kCUDXI&u-*3nUCQ1SZ@%>uKR;M9ZwxUbIsV{LH}oUeb^)d%LRV@FT?OjR6u)XHch}^aDpd)sNE_DI&LMvl`s}j8C$C#hviv zTIlOaPI!kbB&mxeENSZ*9WVId+m+_N5bQgto@bMf+`6W_RkS5ve?^VX=`$ZFRnFgd z|Go1KSvXU+QkyvSJ}q^a>!Szof7c&syqqwx`HW9wjJ4eG+wO@scXgok!bh2}P8ydW z@757cGeX)#e1ma4DZs zH{GFFC&`SGb$Tjes3wk52W5Bk<;kaB`^>VTk$;(LGN|Y@tMaMCNc#b$D*BE|Ly_fQ zZtkS92zDl07BYO;X4l%_DbP}8r`=^N^=^Y z403HX7oeTZG`db=zAvP-Ma2UGi8H3Uoy=X!ItantO-nB_XXrGjNf`m_Cl)2Q09i5) zBWj*&aVgK-aF>R6oFXPQDFsPjbWN)|ddzH5U!>y#CQfDAMBuOOC{S{GRs@_O_D0a+ zrYt;`Xi_^P9r=sj0xU8xL@bl7G%Pg~zQ>F3#lZevp~{U)fHAJ52qkPc*oINPQ86+!)SPGQySA|T~E+?!(%wnoiGDua&I%HB0?Fls3 zqnjJ1RsioN(6lB<)ULUYrlnwcl|8MTO{!1;4j!39LLVbhtqrO_BpM_nv?-C60$KE# z3E)7UYduL6lG+!$OB86l(J6VrQ?P4ONW^F2KyKd?yHml)!cQ=kbwotQu5#wAS0?MC zVl1v*9p^Nc)vGP=xgXaPbx+*yoE3=vt87C=`9|)23X73wALVFv&nAEp5g}}@KLBN} zU=VW58mw|?8cBO=XhW3JOvA#)15Oa+0JwcQ!1#IHshypLHrrCvpDsQ&UM}~YZjYQ? z{azMafBoI;{!f>(ISsDxQSsA9s+H_r)N!bV~U_3m@X8($$q zy5>{eTV;Em3DJpJo+pd*OAm3Mz|2tB1rM8cw=@6Rp*gk(&Q`>6x2+lcx4fYQ_s+rYnCw%}Xqo&NXZvaCe!I#nuDX+^97AFd&< zI#4Qd@QWIHFHQ=#;c&2TNL>EYfHT|*V7QFcFXj`P$9YhOG~-4 z?zG=)HSD}QXL&rwNd(fp|6z<*)uwxMWf|d-(IdmkK>cI*;}gXDzk6)JSn!|NE3zPK zSLGQ2cUroC%KcyCI~%bd?NUkcu|?d5VRys@c*j{hrV<0fd`m;|04}t~!=HpsMWUxh z(|jR>`c>vmCH)AR05mhRvbleoJ8kFP%{=$&Kc9K=7()F&?Q6rOP4~xP-4U-6Ju$4* zqh>lwbUc{U1)qVbTL1)N94RS2g~~!GrOp^W#V75502g01q_?jc(gkS}jViH-s>$3H z6Wm3MB>H`7Om>OmEQOL|Iq_#t0!P8Gi(l06gWwcwq;lUWh$U@syC?RK2YYqR1e`jWiu9cu*T|OR9pWAV^I}@d~XW3rNpbqLs)5Wsyo@vg{Y8by|hKuzkP}RU#(Tr#A~evFI7B#ebGYl>4^|BVAO;AQYb92>^mX zF(RE#5a{Oc)hw)rrQF{>L!sw#<^FZYd#2jlMaLoIBS}NSO48L{1Aev?bSEOZJcc$; zDOQ1OhMNOj@1Bh2fCU>5{U9fok*kxQY^KGCC7p=f$5w(uop`7qgP26Y|I02Y$&$o{ zs3DJdO)FGB*<5Xq9*jc2dL2O)=pu8Oo{q-KIY?X^yF2;vE#&-T=g-be(LP?=-z)xS zXvk1+?FA56=f_XRV5eB02uc1ccelUf$312<7;_;VX#VOfp0a4;UuOe^bCrc>%Abq} zzio59S2g>R4>bL*Y$AYIi!O8kf2SP~Z!Rx$@?&9o96`A#G}H0?ho%DGTp6DHUMF{!`nrl}uijezG5ZCp4_V`GkKf2f1nJ!E z&A2H)^i-nQ{gKAMU%4^?MqRY}ovO_aCIjl_nVv9hHxO)6t!5V@-oW(CYq(mNM6H(! z7nTdJ69iKnr0MKD2SAbA__R9Bdy!Ae@N$u!@sWV=fAMmcbf$Ag(Gx9(4EFT-mu)WV zje8?J_?rto${T7vHjS;Bjq9wP8EdT_wJ}D#&zybxq@5qWW`0$`o5#bwyt2M=%jFHh z%zDVrq`c>~FCvCVd-+Ju)@i(>9J62Dl4Mwy?ao+2z~;y=Uxy3c9A&&w9YUU0!i+Gm z_nI%OCVS7VjNV%~ZlrxpgzX`9e07h5wc!iWAm1`Q*W-O$#^uwIf5JJIa90R{gc+ zQ=#RRG^N*az%kuFE1|(4Rlx`cLlzQg> zLN5NpC`=L2hX63XqK-H1d(;yXuLmz#7+P2eNiw)WBxP&&8x^Y*@ogEy0~zdzr(xO zh1wfkOehdl0b?fD!K|jvtjLWzS~f6fPhnn!JPQGg1xTiC=~zq^sj-OD>qzFtLnA9U zXJ;F2 z!8FzR0g0GZ`g)7T)!2|OQAv_<=FhviVVXF|m>&JGECzv+wE`4Dn@jMqgL*z1IA-%P zXyUxe@Ho6$%rQCej3zb@MUzUTgbdDIXZg>5eY*T#7zY;;ky*_?MOrrjm zZ_<5883mIVa}2fS+i$Eym{>J+k_@`l5Nr`r6~tr&0mw*au?7!h(Ug;^3ZKz*xWZ%7 zyQsb*j7Q@FamK$e4iuK3K}k_sRoEk9KcL(C&4>i#=2#N~v!scjbjAj&jQgg3ongDk z12wOEH2bMOemD1(yh5xa%o*kK?*BFg+KmumVoY7%Z_A657YcnIFLuZHDIz{!a+@D{ zGms6Y+rEDZu529V=@XP0lo{0nn2FiU*Du!tYnMlVqeXl$PaWY^SbJPv4Em9|Q<%DC z&Jz-k|LVJMy7M0W{WYi4Ld{fV?w&Q|3CJ~$(#_fy`!1zNzuCguwldEne@i&Dsk1h2 zm5#u2n(OMCz9yC&NwmpTEcJm*-WpCKqi$5nB&9_VILR@b&4oJB@3scE;tH@irla0gP5r}X0;U(OZMf?fO!yMq5`0S7 z?@pJRbb6Z#VmL*qo6k8@IqGa1@viM-o_t=>KAGCJ}?&h@vZd>Y}5S#3sH&z#1!gzkuM0D79D za}n#(Tl(*%-?tG-=e7-p2UT3Ez8ky@`e9GlCd1EgSpPlGSoN|`44P6_D_Uc!R z1?M?~ToFLdQ zeCS0lG>t+rVUSV&i)*?;p&DpL^K~#I9F59s%6Q5k;IQ?9LGkP22lXcfp$6@_cfla! zm)yX__Nn=RNsYFBIiqIe`yz3!oDBil|*CaDL)ltQ30b=B@A&dkCOmBQHtTh&EZd}k7}r) z`7sn^6%}SlL1s~y?Y6RyO*t^$@Ut(nol?y?);RrWurXOz?M{{;+50BBv5DgBV(1XU zj?~bEVy;;lPX#0<%)gMZ>HHRx;KW`vNS9G7n6glS$C^I+VVB?n=a&G$Fuh%{sw)eg zQ+&>btUfEA2|YbG@a^j);p5Yk?%nL^(3GY=8#C+3=`mKqZoH-%I}?AnSnE$=ha>vj zQ?U0Z8z@CMVKbOuNi)^0;m57BXiGBhO)3hdDV~dzQ;J|N zzJQ3%2_+QF;3`j249bqQd{kb(eL2-1o&x!lnuO(2i7mYK=c@r6=XJPnnIFS^iIFX7 z_vY0z1osE#^6MM4YPi?4r}>h38I(8WhC>@?bc%f6ZW;u0u^G*3_uVR%`KEtsJK7%~ zSpeEDjZb9}QNO08&v=N9TXUazbc9^5|3(px%o|@`p0s_heL6GVP;6M$QY9~`=nVa4 zkmBf?E?IqYq;~{-k1UzrK7Y$%eX8A{9l$jzh~7Uh)M)?sxMOJb$NK$aI-C>o$NOap z)QA(05)niX?W&ify4Jf`BYvKSU7POMvspnN!KH#rg4t#<#$7L!QR}9_DoImWyy3}8 z_Rtnd5@*bLOAnK{|7ousxBrRwwaeCDnT`j)IY)3*E}9}ByxQyfGNN-0%hu?dabxvz zjHkT-Gd)%TLmeuW&(=HFtRu5xWl12xr_f zGGV7*+*_A6rPI8=O^i}@Bv{g;fu!oI9LAv)<}`pm=AV7vAkkw3eBvrNDfbI#^?$fh zt1G{n*4#55gcCz~u3OCT+r77z|8Dx^2J0+r@r7Ypk84?Q{J3>SYB`^tdlPvghO7VH zpTgoMl%Zk@_Z9xIW`I(H(*e4Q$_COXU3c`yHbpSU)#ZK^6B#I!5fag6^gS;9KLRNy zi!6B$cgpQtpp3ArNiY12F477rbBR2jzG>D=i8HC@c(o6nsSWKM=H9x?F+q@yD!GxU zP_MWApwDDtz?O%Yvz><6U))C$amC86=0gWZxfauKLJL(QMYAMvGy*(GBg8C3szfN; zNNU5;f24~9AbkVRO(RFBS~}h?lcobgo`NZ=m9PM; zWC|V*?yaaFd=Ewh7^6fCq5+q^qf4YkMU$Lqj$}-tUWrVA6%Cs0NM(1E_&zBE8yf6p zWkE#RS|#F<-Y3`Z(K6o!V=Q(%nDX$rR)mp_Cxga7 zJcd$h8G2fBEE^7TNeO9sNbh0SAhwH^Cqr%SWdhlFv|Z|YZlR`^@X3o^5P!?{w~Kj7tQ8J8 zDh4?%PZnl7km*H;)1g|22y!+d5e9i8-WMQ$y#+BQM9T^{3xu3%Im&SyshuvkP%QAw zMv*ie9&Q8xMs=`hs|GePG&h5J>%+eFbKzoY@{+g>TYKgD+1;({nWgjDsUEBM+^Boq z$Mr|kt~PS_Q@w4xjnKToe9l771=CQcKo)WCbOO^14!r;s)>I+(OfPVsW}XE(6>FuG zV$;*Rmhb;$_*DDJAbiaNJZ?|=E?~)b2AtwgcfJ53?n|n7MzjCs!QYo+G6B2qtKG^3 z;6ev%`OpL6xla&xrc+*Uy1CShCoh+IeZ+oOLpL1S)#`^w7`?~?hEFco^cGCUI>*T9 z<64`awUKN|Z64oUH}HlGdnsL=bLf_oi{%iDtJMx(H7ft;R=C|Arcx)T#4?xv<=}mP z+ph**bz}(Jq`OA|0$-k@+=1EoNE`XDWdE5^~f%UOB4&gla8S8d)gc=utno$91H4Q(@El=&R91)s`_6(-d+0bSan7Bmb&Eprj&y zfRI#y7&7_Picy4c(@pR2V4gU4$(41<((wYxuQd%vC_fshwNWg;l@OBBn8$`)p#-tj zhT)krDn>Q&FQmf^NW%Rc=TQ#+5vWEnKJGo!JO+lz2um=hDi0>D&_tY~NN3N^qsBB! zf|k`{0Zq|_oVskYo`*`L-ZdJT(9f2^x~2z3We+-@PD4WvCfpDYLsOg=2L+c2Ly!k7 zTZ1DJ!-Gkq*s<=y#7c4PMmCY?yA0}}@ZcC0^dZ=~=(t$SG>`tAY9}d{z}8Q+U`@9d zrKNIbOpQ(pX0s!kMW)gl*R#+gI42`t+GjIMOR~SU#28CgStk32rpt&6C941#M83ub z7q7uVevm95T7ZE8NlKwdhDzjt;X(qOOv8{5&a?g^p^(&J!sYc+>$2#}DfLGf+f-BX zocty=oon4~ak%NTEH5=}i1OMG2CI>k*;Qc+icUF304k9rKA8Yq4wT$DzoAs)Un6%&g8OX%69Net zKCtbOSRMHOH7}h{8Rzns*5CY8RNC zYU#T2C#j6BQr@bI7_RY(*)IXk&rj8z9Bt=la(1}F=K!IdKYWimiz8%Bdz`{6Mv-(cPH0*U_-;_~jLTdjijLe)DasDMr?JS=Ef+@$*m6+)13O z)q2ljS@N4!{IupTX^n1K3g9)7@LwUjsYF(;v z_E>Y=3U6I1WxG+C%GY=}*|>K|k&4mS)-F+cBR6enzSBxL>LNT<5!QT)URHje^ZqsF z$)9xzE_gvWl<)87umwC6AvK{N7S3!Rcn;q)B`mMh0B0=Uk+h}kRXhts{VNo9ppc$C z{T%f#S~7o*HO}EhPt9EDUUpm}bytRr+7L=W@yVP=Ub=Oc0F~7j>~{^V@r!l7dztm= z?~1oQjwgy<(>I^p?&Bi8ABD^zosLR4xV2m3BAxz*nN;t{n*dgJ!g~;Ve#2Ph9A5n( zr;;MHQ}g9{UlVgyFTOP})LDu8%Wg-KEfkg}@ zF5J!;#7^(UHA-u~vyZnYIqq5B?Rz~hgrXIG`x2hI*23-IAO@5biL7^!T9|=PkKm3fi@woNr$XWYI|l2>@RK>Yz$zy zdBRW9(_CN|bVAOuec5$W@UpbBkkZuhXcEG=FG8FS9sk_s!G|q!C4(4iD^jkytpkbV zBz13qAZJ21Ark=E)%Ju287djop3Bq#58~#Xr;|#l4z`dh1*`???DA?V)3j&TClr-Yf9Dx^@bwPN0 zPJ>!XZa<#_bgB?yzsPc54{c+xWw4h#iC7zotyS)DAE3ly&1~T{{ZSXkeFiJW1JU&5 z15kK>nuyFnghR+tc^`r0hA7{Q6^fI9(-4YjQBcX0VcQVy60@QRNG$h>UMA*{4UT3( zs|C_Jl6uo*K|{cV(ecO-RaqfT4e?0^dz7}!8tj4qtR%(W&0)v;DP+zNQ7Domg^U$Z zHi!l7ktm|>QAwPE$7t|t;_k9Znc^0*X+9$EV@XB@?G|*1X>k~q$WxLl)gi}f?6{|V zRN&6-F+U<&>59qrRCryYNswnGBa;uPp)nF+I4IoVI1*GH+Y`yWGObC`%DrufJlK7h zMkbel!$Kbhw5Z*JRPUR^C|*7;>0YL7rpY<@yVKXlcQ;SYx9^<#dGFsMw=RjY%axId zazk@&GL&nYnR#;Dp8NK424V*^#kmQN39ty5h!ddyo(Fx{1ugD4#;_h<-w#ZEcl9|% zk~ez#wz=wg@09gaJ^YwFa1!9)|M*L|T^wivC_Kg|tbRG9I_u4K>^AmCfB%B1h#c`> zTZ12VhNh0g`Z9m^+BRavXjR#t=v0u#u zeSxIW53K{acvoxQ9$V(Rjh~gv?+yzVYsZL5$8oSEPl%w|Nee1916E$|JMKS z=>r=?mvSSGnBh|fLHDKq{J*NTTVP$?2Ocb`?gvSF&T2o6K^ucNIL*%(ESa2tuU&RE zcFkVtx}$7pi#=vj>Ocf_lwHIK zu;ANVhNm?MPyIrJ)xADQYclLUDk)u}B3Ui1Fbg$+EYL==3~baQAHqAOF>%J!yHwpVr7Aaj22`@EoqAp3Mi#+w%~kmFjyk?V@{A7m^761 z&F`Hcatq##AaX0+AO%rX6rN;>J}d%VxDhM@UXS3uxg-sUKWfl&1r9kLU66~Qk}vTD zCq(7etHi~&^8h_roZ2WV*oTmmElS{Uf)1GQVQ zu%yPCu))zL5|?kfT_P41Bt{aJ`es;}W0)8S{3xK71v0yVd^b#U*ju_zBI8NeaQFuBuRM_(5 z7*NL5EkrH4+>4--Z|8+XPPLgCCucX`NC;*LM3%+eiN!=6zBi!3j~}LF2#}=C%<~du zy%E5HNkD%D6{s;xYIS=w=8=a*XTAn^$NSv z$?RE{Z-Gw!TTF?mMZu|^OfUFPe{u%!ZByw0=*x#$=bA@+pEHhcV(Px=LX3(8wH&sY zmEneiIY^M%((o<%RE}va9!0M51H<+MXiXDa7=5=q%t`jtg%st8?6#M{=xi6h7B|WwTkW)#I;K3EY?Z3ZUP`454D#tt zzHJGzrJ55kj^wSqRr)^~G`&?G-*E&*s7)7_ZVGY<=htT9U#ia5^0pA~I1u|bymO@< z#3*L*?Qfa5d1&=&yK{Uyaq;(xkK2JDsP~4Y3j)+5R($ch0=DJ%k==pQGDd&@k{%~~ zztf?`b*W6HTTo(EhpQ>+*-c=FWj{eijK18m? zac(Q@;|c4_nJo#$9{GR+JHPSM3f2A`lwiH@$){-d%D657{X?+0)29hq_V|Hq!^XIQ z_-JX}@nXsMpq2Uxw}bKeTg4)(>kgH1{-e{n+mda@X3P{~ljt;dEd;tSKspoL|K+MBrz-gc@<6X+fB3IZbef$JcP1wZRRKKnpL{ zPN$%cSE2E+vIc9m^X~|Wvoq{e#ADR16sGxcoWCW)gFh?|YP3<}4#1LcX+eLoAL<5i zr!GYev0#E|t9ngKH3*|(*#}o-B*M0XaH%!~+n8ZNj+N|!m^3iLJ`<5djEP@B8WCN8ayIHgD6z9tc)4L%Idml?8XA8vX_5!UU6@~A`+uGWmVi~l zr9dnr+8IhZ`YWSqJPy8LqOK*BC8Ko&k-Oo-JdE?oiqQcT11T`+T7in365-8{N+q!{d6EaB(QK4x?VxCa8Wvh-0RoG&Ag*6u z10YSc*#eI*dw1V<|3=Po?BgM)HO7@KH?OCG-@I^N6D3~8 zV(_CuKM&%XAH}BRru;aGml&45VG=HWS83F2^mz%j1U{8MYqyDo9Js@1g)Cncr;O9; zs>?!qYMGhriNdZ7r-}vq^aZ(=E{lZD*X_#Ko!?Td&Xw~Tg;(r60ZtLtR`hNYer@Je zLCe=-woCgOF|SX^hKBrFj4TFA?w?{YLSD7;-F<+z?pxC<=3jIF<=)jrCC1(oLjnEH zL)wK0osl}xzY#yB{A&+08MvIj9faq7EsFjG|BEdNke5!&JCQTAlAR?z09xUWo&tlPNRLB z&+S`}5wD7;*6$mS95*-A>XK6}my`(@&4h0i-BrDhCpo~nsW%SKmH=K|ef0>t@Hf*I zT{I{w+5E>#)&u@YF7n@fvCrKB-?as^#=ToWQ7kN~YVB$~fGwqn$|mb2w8P0<)uACB5aB>-0Xo6pv{R3%x(|JeqJ4U#o^UTVf42@|Wh$ZA~<`dGNa1 z1^C2jH=4Wh_3Rs`=5a>O=~_#bn*rhtL%*H)g|TES{2#0d8Q+$ONOZ|PQbOP_zas5;J4@U$KtDS$#(2%`Z zd>EtV7gd=^_#tPO+DkLe33-T}fd|N895PriEGfGT)nOkAKAZr(o_ISE$nNmuEm@`o zdWenMBSQ3;k_e}689?nEee{R+M>4OiTp1te8qYZoeG#ub?ypAnY2LgaurzSdB5K~p zzf1qdj(4XTb-DK6EuqDd@8eQ}Vv3F?p&8eXCOJwVDY*0AZAKGF(p8MAlB3s;s?yKY zE_uU~k;FW%($U~BV_Kj*3CYs4Wu35c^TVh1k&{Tf{y3 zH+Ysh8qq94t@Rh~H2E7^mijSfW+AUD8Ob5dZx}N5JxC*zKsYf_Qt2Z&xM&Jpe8?>6 zn3fT+sp6?!Qur}f$gkfSkfaqSwW~womunCD6m!ju=VdYgZv`d#m1^&FKJJ7<^ALC#=A}W#g%`-8E-Er zLXubokoR8vMo+nJ%X-~3-n{&nu*o*W&v}sB%ARX4QrJ4zntb<7rpM0-R=lVbcdjG% z&wJwOgUU60t$6r3EZtH|k=hm#ondbuhivZ}Q+|!;d(8rx)3@Tf^3_)>2kBVJl9!r4 z6btVfL&6L4J*j?&@pe3Te5KFAqmqqWg4;Ik z4x(4W9^B;Xrh^#M&SkwxDefuz?i(X!m|JAM>kug)_6DQRqrFR&kO+T)My|U_zWvN= zsfv3z*0?!XM>-+F;Mfr@<>%F~8%T`+Y_7fihx|wg@&8@Xv>l^jH4|3)Y z0RFX4!~Wn_tlWIL66F<)+7WM#r^X8{*)`KfhGFM(DngKyCy zc2XvT$HUVoe)t&3*1i)8UM{_b&Kmb0m+wT!*N(Q!X&uG%!hPum?D}q3{5m%`5qT=p zWip)XG}t{Ui|xrBKggCQr8Xnu{;glf0C{T~LsQ=e;+}^$_F9Y+2*Q{n%7d6&6_V^) zE)BOt?Rw4&J<%J&qL@NA*_2uG~VcTJ_Zv490wRU4Y>uRgphiX7^J76|7z|#qr`^);W^#=wM- zob-m|EE|rEC zKkr9X7u}U9LG^Z_pn!phSEvXQQO|D-Bo7q-%E(q@DwxCJwCqV}d|fDoDhRsNjbQKu zupx50Q#(=kydN}6Ln@d{!k@FCn~-Y6zFM$q3)Ae>v z^a~A^y?`paHv2|!7JL*c(Cd_}LTvT$ONvZ^2oxlHq(d19%vAjVqq@x1|S+1g(}XD~$9XQ$NQ> zH(n3t&dAM|Pv#~Wj@=5dEJmsz+siv<4GF9Dy=PL>{@GN1arR&F28)$^HsJnwZLn)! zBK+x)^)g>xD9Tf1!mBmtGF`zrEfR-~T|TZTpL)1-(&wh(q<%<}HSFIC?x`yBGInmY z1wJ_R+{xEe(zI>l1@!dIo`M+`|EVd{P>ajPEf?@~u~aT(Ev~7kIj>3e2x32CT%Tl3 zd2BE`uS@y7xX@6)QANmJ**Xh*o;O!Nt58axTW>DR2sK^WEU7QuJ*NJ>8C6j$ZYEDh zl%3*sY@vRz=eGTD%)YNWS$wGYldqLv4LJ3=HW6X_{U5IW0w}Vk2^R)&cZb1ka39<(I;~`@pNnD) zUW@EJ7u`3I`XP6m;T?0D*urTBfKcRYzABrN;|#!=$c7 zeA~zrw^~S7u6$glAzby3hO{M7S{UGpjShyTQ6F?xGXIzss2p&4L6m^o%>&A0V>JIe zLx8Yw(;G>Mt80SFr6ZPc#R}GBf-Z@8gCHqYCuPXLp!Ze%N5hap?~B!_yPMC(fGMRS z9~qw&+eunb9Hpk{8f^%Lom)^s9u)!?fk$&dL3+KCR8a_pm6&_MjWr{-X5<*oh=_vTK-JTP2>KL{qROngzXyDvHF>BnKv2J?NvUEAWSuo zO?Tv`7|DXOHhwospe|vzQ{H#+_de{_a@6FWb-kuR`SHWdea6yhjMfI;+E`8UU!alO zJ6!CGAt9jtw+`T&>yvw=U0RIY=B||$dim+}k&4*A%^B;EXQK2S&9+u<9Pg7;4g62* z{;ky0!0CCY?7WG3r6*JYBGG!5Z-EI4_YcNzW+9i`Dug+e^Bc8%f0NRwM=K}yzrWe9 zRLNZR3y(tlTRMAL+IyKRGO{H^zjv z+H0UlZ!U6@*k>j@eQYu4#+>{pc+8*N()1@@tRA=hXp4S0_rST3w{f%EW+c(ub8BkS zm3*2R$j*+;%IS8!@0z<@zx$@#ZT+mdeN|h{`PP<2bdj|>Oh$yu=RCJ$O=EY`Be(wTHjUP7yM;Y?=66RYYUvKwez@6Z~F08?w65IrI_7qI2IeE6_<(ijM8Dp z$4AKWOpSwcxv%`D=Xj4bEH(c*d+}Tu;;(X0)*mvDdRJr!i(2a-U)$|5nnn(%stU)@-SR>&?VxC>6ZL;EQ z@)|C*HR4JuRO@xz%V`vM^5DrPS2L$j^XL#oVK$K6XI~7rY!dwG)jSeB#TmRL;Aklmi zu35S5o-UUt8)aahFz%I_;rA{+S6e)_}z`JsS#gA_iB4 zohd7FdCS_QI!vSyMx09dz%D4Grg|i1)Rc9{+UTHxVvw_chSC57e=5dRoUwhu78mnK zeQ^14#i3O3nvAHRWI0AwmX9E#rWXAyeVD)B+I}Dtd(Db8YCk ze`0XcaVIYSqvyu3fx;$S)c}qJQ@Dujl!#yj=F2E1>prCO_4Uu%z|eT&2EU3*Net`} zkxGdE01pW_VL%38!_qFuAfb?)t>Fct38GQP&j>Rjo+cI&-|+zs9|Bv@cK5im0C+dq|VFW*23Aq zStd)wPqnH&oPPL7=>kMXZJ0pH{h**#6vQSGjo8Iko8?ThxL>j#sr**{FZ9MpyI^-P2S z*>{~2M{hm7d@RA+O;zX|I#z7HGK5PdRmzXq*FLO!nB?i=AWk|$7d%O`AA%`bK26fn^S;O|J} z&+hWQO0nCW_J6J?iE8R#e24szgDghkRU@mFvzzbLak)*)j zU@b>LJ{dS%UY)ZsA1oENQ`(PMQw`1Q(XBsg0Aa_*vq>H+!K6ZdKS^A1N*j1S~rfxpM&; zKyD#~87>dG1+`-hl=x133E>P!q%aI4eHD9XkK(Usa#e;ri@y#GcBl|Z&vw5864eXX z!kdbD!xt36tQ$qBBgujw$CPZ-L~ZhB6rq)=@U8PnFA?Vg>>d~%id4Trz$OtuL}Er| zhaONCSj=i-(C!2rB`=B~k&iWQYApJ-0bmoX^k6xP%hZi66&kG#a=q@#NGW0()WLC; zY1VKpQO?yJh3~Nzr=o9uYkQz`l(viKdMUqwq4Q4_NP*1c4%&|j;rnDV1T^kC_0p#B zZ@YSdM>iP~A{jeu0*I5VCg_1j7p-K@8{W(_gxRx5q>Pf)7Ur}O2#pECZR7|1k%Fj8YdIlf1ofbwxUpo`v7o1B{# zLEGY?3^0^wIs6+#d3)Teg}c8`V~f3kB0mGonyhl zN~P(Vska4q_eGA=SqiHITNV-kaw_^@jA>#RA>M+)FzbU-?uIkfcJ^sOQ~++xbK3Xr zsI$;%6G^s{NZYpY7yZ3CUA0^5%G}sK*)6d6%*U&$3$XaWNd0A^apu5qQmlSllE<;i z#+j{O-X?uFL_QI7N^(D+HLIstdED>y_*F2z3FERgx4XZq+lk-wGOr1^+N8EEB0^o2 zM7(cC_rL%_6sB~-9=!>D3l62j6B4_O3f_%#5CACio>EpxCPuhxTbCzjGJ0W( zQ*mxjTa^ZWurXF@ZCbap;NC{HDNWBtBdf`pS`@|o8P(6FP5)4)4jdeh9Qt7d!|kHTz#mL{S4qu@I5m2L!aMY@y1(*EmJJ~z|`|&fr7Ey zkGF!`cOss~arW(pkEwE-Mb4#feyf-7pp#znSA9qKwmDk5?S7q0HNmH2Y}sq`LL}<$ zf^tVw3jB_Tw>OP^B>qCWv5$G{C*==%ot_TO?|hlO*B5NcOYpOKL#Qs&mm z!B7w>_lq039gdJ++(Ara97_d12ccfHg5N3kD{#@GWwpS*Ina*`g+ria-SQyZgx!FX z63|_Nk*4+3@#A2gmzl~RkOs&(V?*^*x&nS9Ybf8CCaPV?RgI%(Qej{PDvQ`F4Dn#- zGYK=$=-x!*#5Y-=W#rq0~a)t}`|A zT|HEV3d~=L>`^MfY1*MF`3Co@SsFkDRi~T4wdFOsN3QsjHc)H~3<7pM9*^Q_RaPy2z#egYjD(<#J6l17fw@+NNHA36U%b4NxlC6e%O3z*{aO=z>Io4&iTJfSz)_ zux6Q00IO5tE>)N-*pL$Vhu|LB=0RYk60&|Hm(PJ^ZAOJKdlPul0fojo#D~!Zy0>`xE0%=6~Iqh6cPNA z+_-2m$wU>hVk%J-k=X&^!yQm%cvs_CeWqW)qmvc>)eYYiz_GF5AbPP=|{Dz+4t6;g;f6H{pluPptrE-@8PEB$+RoiC)%gmr#;&kA`34IuMzIE zAl)uk{bN^XOiP+m#Vp+33^1$*LK!?{uptkuQ(`DQtN~vSOP`dRpFDx5b~hhXBB6E`OC!fn^u9(3^~`OLf2|sfn8w+Q5!m6#r;cXtWDXJebM2VfSZ2v`n8-2Gqv^e zCgDIF_egb{%G5K*2A3Utu;jbIq9vEl4aL)q1pCFI*{2WjUb~EieHd=-Y6P87lfG|Z z8rK_#kTF8=+vc@31|Yj!FxXFF6a2&DKH_VHV-JO7T~+Km>Necf%z>^ar?aO25<}yW zT87ujiSM;m%){ef`Fjo7I~gJUGl6r_)tvKNy(S$?)r!(ycXl;{rzE37E#`HXStaZ< z^W}psHy6Tl2d*(52M6i?{%d6iy?%;oM^T*0F%@^|&5o>-Y{0jh8yIIY&FtL>lIr@>qBbwg7|;1}&hyJ9o8_OEe=~xiJf^jH zYz**=6+BMd+xkaN{b##|8MKquUwx)2E-Ggx5&9yq-wR%VXE$-Ps$95m?`ZQf_4*gv ztKFg&+5pf#T+%}t8gMEcf-cFx0~!3s|0&$lsj26n!h_~FU428b8D80anSh2d1Fa5$ zO%sHxFPdRjFOx(g?Lpg}&0fW!p?*Cnk5;$P_PsNW$3l?b9iu)E2?6> zupxN>21jUU0Tp`y0y72qkUE-TfedOI2b%TOC1COOPLoFXr!^{DS5*GOJbmGBf zE}*M|e%MCkK}FpJ)*(y*uzu2cK6uWR@DK!H=N^$+Hi?&zc?x;Gs%Ghz%rBS!qIdHy z%C0ERIDIs4>w4M$weKgWG@UJUJ}F%t{qVW!tl`5vd) zR%lIh}ufZH%b}wtA?F-GY-j-4vcBL>}|gE0=q|o zzYcnzM)HQu1B-^`at0^m&OQ{^Syv~`rBBkRm z>ey;H)Vk<@mSSK21oY`PWQ~qjPAn=s6s~MN)pS;PoEM?^@lWukO~PooLXPT2R6jbs zv2uRnXT2~vQy9#kfVAXPG$t@yi^zENT<%IJJ_IadID6ekc^7-+KkL3Wd%(p}m9GAa zpxMbGvTAr`?#-)?C5_%fm0XWRkCC6z@b?Yog+O!4FvAA+!Kx*SD@Vkz&Q zTtT?qB-1dnZYnOd_(j5&jFReL!pgb6lI$-q^kFd2iHJT+@{3vsoVvi*5?K2O0t=iS z=(Gq;^FP?7$PEZP9OI;#>mH$d^G!bI`VhW*>`@j|5<<>T>#GiMHbP$rn9EfrOaRi8QtqTY< z)VKQRx;WKYl#OW%auBWYZQ?B2EB&aV-r(?p!PqM(1rdSP48&45*vP_d2^@hxH>E?U zWfm$!ri{N9LHirh6u^napfLNe0S@ z?@0YXv|HG);EBlJjcO zB21_Ou*?Q+`|KX?^Jl(?vA;H=-Uhv$I`ucU-yNYG?*IBcp6v{V7JvihL!Uo?0t=ad zZ5yX`GiG*{`Qw#L^m>9Mf<|7R?hVt}E~UHV(=1kiA6rp^XNDwJEssFs3jLddnYYbg zM}`Wkt4cyPTb6cMx%xt|K*>ein^V)6GnW}3OivnB#qn|1rt5K~9>rTF&+C%E>09RM zoe7`8l-wM*X$t$tUwg4I%RHfV>~&&I&2LrDiF0-h@e?wuD|NQ8rzOWE>;4K_&17N# zC(+dyv(CB@gDw?u(Dl98(L%%*OT%)d+$IcyJaV$6?8oSx!Ig_>%ev7qQTRuP-NPL9 z-qN?Z*2`u$AIy!0<=zedef#?WGttX`XAKn-`E?;{8%0C*k`hb>c;;RJQ`W=cYc6!6mnVwz!85*K6jCeZQ2c=!uvLK`(+CvgwvJ(xZCNE4gS$}G0|xiW=}ye;vps2yx_35ZlucDb^2jdyRVSl z*tRYVe`|0mXk}o)^<@7_;`Wt8aguRD!AqVK>$w*-2%7Ae&u*{-fVRcj;-U>%`?ItA z3*uEw5Apv2E+GIn>LB64If3XTkeKyPC1DT{TDS-}S^sU=yB^aRm<4+31l zhp@vyVAqb!*cmG2T8KG4l%*zGt@x4^ z=e0T^zjz;OPP(YZXC?;#pm7Zs#6aLpUcdNa=h;n4#bh63R|*s^D41zLUIg+~MZ_ zEs|q7iav@VD)Ihr0}at32~y4kN@6pP(N#f4CE_wO&<>@DMA5B!YoL_ zj0~Uv!8i9edZ?0EHX#&6Ej|a@d3}Etz3=Bk>9vea$tg-J5U= zOT)c-i!#)v@_G^^sa`rMW5z=z_Yl{u1dKxhxQ?u3HQTd)DlLw13hhWDw$CrKoCc=? z%*mXp%@@5H3zmo-QH5b(Mw%e~5jNQ~V(g5f%qHerBA0Cje?M#8p&JVNw*R6T@MWnb z!|Z*wR$tMRlS9}}*Ve|6ljYDpZ6rF*2xF)4Ki|FRDaqhi>`JejO+HW88D<}h!G*#E zEErxYRl>Ow%wXLLX9QRh2^q7HZNiz2QdV93%Te4XMZrhuTFg&p5vuesF2cp@(yo^DE11hi&$ zk+jzLxNC?+5)W|c*~qWoH=PGAOUbBKDV6`iWTxS#Xm^eA8i#mBECxrKhPcT(NHTMR zY+_%xn3*{b3*c|>qj1Bm2^K2o?ixC$dOA-<*2@ERREFsrtoXq4);yPjYuH-k09$&FWKX%(vQ+^O+MJHhUHJ3H}|yfB+x8bls^6I!Vs@xZVA9pJoH+e8XFM zJxV);OZlw2-xgMC-(iZR-T6x3%Ui6W>oXCzFP?UTb*ghab~Drsm}~`W)jHvaCck?e zI)~h9H3!4}rur)nVp0ER_`p))2#_YE(@<(=*2CK;>m}QLDo|>KIyL@tzGOIzb1rrQo?X7NByP|hsdC1gi(w`u`z%R(D za)$#TxF#eP1UnCKHXMQmoE3=7jqn4osJ(7a$c5pTQ@vx-foh8rrP0G;C>w8Q7~{s^ zU|&aapwzEUK8}xD5|iAB6_Kn1=Vfy(fK#{4rNBfqc9OxtO8%jW_HMG1F=86<69JP}b_>B- z7zC%RXe1BCh@ZyHtzbZeY{CK1U=57%iUsBN*Rs^i><&I7)$cq7|VYYobSaG0eI41N!FNpV z3L>BW#g-z~s;No#$`nX|MgfUf4m#kkGt_a%nOqytFae@f*%d&X4^c%XgBPu`_k#u( z5&93!>@Q0+O6f|NZDiQETBfq_L>BA% z!*8k)g$5o|&4)w{g&;zJcm_KQ*^4uFF}`acgnBfiMy-1VgQ`WMjCcY&{&>X4!Kun( zR@v3z`-iUE@LBufQPTT)@%i}6g+Y2p6o^{HBI#Pt5$PX^5T41_s1Zf@s$&b`j0Mj- zcXZ|94XAX*ZWG&+GKwru=C~2-1bwsoVU4$Q)Xtu-*Qb|P*FR;zNa6ZH?BNV5c@+#a zpW3;I>|YKaXH>2Oz(JS>WLn-o5EsLc`g84U#&F&2yq)~_H|1`W$hap8Z8`mBxmr}q zu_YAwbh!mzo!L{;v#^=G=U^v^&o2Cvjgj>zK4Z7_C|Fk#Wb0~}m<&Ic<>0+z=YJdr z!@iC~d-3cCH~n3Jf0LxvxScO(oq9V}?t40cE??oCcKv7aHV{NeXI&qkyBHn@N-dQq zm*ArY&+`o=RaIAi_p2hilA7@ki1ywmW%v{U0DiR3!!9mCR9PDVtWmu)-5<*ybFSeT z?q0PmvR;7eP~V=GWikIxe_?-~PRq)|cg;tB!WEva3kN}f0f8x`0D+bd?5f`5rH<*# z>j;-k@-KzWB@Tq@Ead6&Y zyoG@SEiXMFZcL(6WpniKHJ`@&)pf4(%VoCw>hk5-e~xI<;@rPUe>AD~PifMXUU#}f z%DjK0Uka0n!)w&|J?_2GLRzmdDZjY+n-c_?>;@xdzx&?!p>O?)VCuNntR|Me!Kp&~ z^Z5O$H5r$}m+I!MmB+@HKhNcMr|;jkW$Vt3hh=`iGt$4)V*}OXXCaA6P7Mu`@5@OF zh5;Duzch)fOd2)x1)UxakyP4qKJQO8S~}(YJ{mjtR`h(^Gk^VhYvc{qiT$Pe-1TL` zIKPue@uP(Ig3IDGWt;G@`?UGEewA=;s_B|8M8iw17J5`w7<&bw1wtdRnp72yz9doQ zPiFZ6K$q&6jz?p(Rc1=fxhm1+Kbi z9wmYbeTstqI?+9W^|H0C^|jbw3V?g=@1?gUX_U}0#YF4SDREvx!%LL#mL2TQL}Yp^ zk4%sQTZ?joU{)QBx^vhtzOiF8d~75I3p`XSPRWg5%+|TunYC&OIq0FQi*@@M=3~T2_QdKw@i5* z4vB+22ouLGhb+{=R)T>_+l~4jof*J)a!6QABMJCr`zmCuE4ZcqLGzhYsN;8j?9&Xkm}lpGSQ8 zFLINwDym&gf1bt+Pbf~pEdY^@;)j%=AQ?H$32B%fFoPJsJFo6n36WCQ>nX!_mgvya z_QS|O@jrUPN|KSesnjnwM-*(irwO;^bh6`t@ws^^nP%Z<1nHoD6?G4Ub(6W7uapCt z%|vYeT4q+fHIry#9pc-QI9ajJjO6>vYAIC|kzzH|I}GRMVx0c+fW|pj!=%5Nv*=^T z`y~nF|Fu!2*9*U3lekL~p0Jr>BnBzI6@34*NpcSTXFy`;)r!~jJ)KUV4rm{tG`a%} zK;hs74JO?fjf5UfDt{>Ej(e!6?#8 zA#94`Jek_QhN{g>s&Ta}%17HxpIElTf6Zj@V~k$#qnGba9Bz|w<>$#jtycFFfd(77 zM5B9Y6(;vi8N=0OD~4`E_e~t;vltQLL>bfT{Hlwfa@0f`&;O;FFd;a&fwRP*s6r|P z1{783xU5NF!QOZXh7#}go^3I+X9*q{1Lfun`!l|yBG_U!Lg&BONe{D1g~Y_T4ZVDPcawk{^V?m zEVX>FFjch;jo_eS-Q^{a&l_iofj-T`lLoXEukzE*tpek6zMS{>`a#tOw~A-mC;#M+ zW18D?U1dp$W`9K0Fn-bceDRK@UdeRcKlL+?$K@yz=+JUma};on9OrC)78cHxxKmo& z<}dBn`F!{bu67rw9~D{>wU-CF9R67TtdKN&w${2ZSZ51M*-62fQohjEe@MM(TLlap zGHtv2C1H(zUgw1fm-&=neQ41&{!MIG&CjMSEpzx{OlfWZB`e5W`CWY9@v)F!J1*gh zKMiI`c$79aaC%B@Sr;`nu&hF*A*3nUF{Q|y$5s5tv?k~^h#4H_7#84y+-|c{5QqMg zV$o04k+GPvT^0EaPl01;xqpU3_Z~p&2jOybq@r=qnKXCx=BK(w(?KCvw_=y}@=*BY zoo#kXo;3~gGC8oTqrHV~qY5F}KyiOhEBh7GPS>?%_C2}h6GIonzKYauXwG1IIyA~yzu z(`e?Lm>H7GO_gJ3k;5DlhW;|p8A)L(oU_+V^zG{#LL6LLaARqtLp*@!Lw&kg>B-4# zw-20(vo2gCm{D?NI50E{J{eHa-!(RNRqPH-NgeDH>zkBME)xsWz^7U=)5&zS8I@V) zDW80A%wQ59rf}`B`z^QWR5NxlXQf?G&LhXjwSz$f*qX&?@oxAw9IR7P(l=CWrr1Iw zl7xJsA5gQ_RbMu1h0$>?Q>k<{df*H9&^tLd=-KMo3tJdVgv~@UCkP;U%_pGHbJA1W z=l^P_6X)_8!6-7-OhkU%;S91Qc}KF(yZ23Cq8sX)j1=Db4yA5tQv^}rvM6|mZ#udn zFFUpd&rNXyv(ENicP9T({r8qDmsudSR!KYh1gY(KjUyjQ145sDwegZDq(lN%CKl89 zyx=>J0kxL4ufZ>Fp(;RM5O(b}n&@vd$yRe`$8QJ?TH}?^id}ktCnLrEI)CnbG%_l; zP^z!{&F%W8#htrJ#@9nD=vgcG^{i>{yW~U_49ku$k6M@AwU1XpB+2matU*w3bj<&w zDVa@Sq?^4A-`Huw#LIa?N;*|L;yiBY6Cc46uOWd5&JZBzLUsqZIMPQy2B}wN4@CDJ z9!S_`RK{6`t`0=;eSUFxI|hQ@7?X~fSfSVaW9LO#m^}~>ZVQ#Mx8oH+}-Q1Cu^h> z_IA`v`bkECM?nEFWQ;6)iI)K**DVxys}F?@&hnp8#DwBx zXa6r67H{dH2_CmjqfTwT0P-SHNOzg#8vC%H8bxkdvyzYI9X1 z{ITxaJ3_iT#{2~f){7jlvk-jF+NTJChb}UiAcI2ZV#MO*be1)+6~z?-flV9B6Hy&_ zkdTK32Sp(T6`{g%n~;VeI+`n#O@;VD8$a_40s`={9>8J%K&;xUpWHLVkZ}<}5QX`= z45V{g!S)s^@9C2a+06KKv3Bu^h^938rrLz~NZw;kqpWv&rk55Q3C0STU8qjvJ-v=r zIdaq{G(!!)?)wdC754P*v#I*ZO5*M-I6eCFuK;zeIURkLMX0@zAPmB*+1AA4I2&`h z(<(q!MPLOUv>YGmaI2V!^nV8@3hI~=t@UCMT%?NJ)NwwDXc+XAya{l(fKd)D3z6le zL1BO0=0qm}-GC1X?(ypRD)!CL)anF; zPTBB4slPVwsOEGG>3dTTb#}DtnQd~79)NLGo3Xtr-SH5_$$TS9qWz*$9@=@5U<>wl zgMowkbh@ab1`A%gt`oBi?=1!aN6tq?i{m{~+O-M6#5-2KX5iiHZ#ecj{ zUEU*^q5%Ot0kd!};6*MD&d?&(Mbp~mRK1&bMLfA1J;8+0ov7u^{m$p(EEF_*2;h;( zf>)ogS}B`4>lH7U>R49||4Y9D)gz%$|NB$QL1CppLNWlghar#veWw?Q-ZFMPh-=gd z&<8t5xr)j10ovqaRsnfmoent4SQOYPmjw2tB>V>%Y1fSRM}EIBM3y6RH6SsDnIRD< zM6j&FIH)w8L+@U8&M-w(;=9G6bjoLP{1*w~%?vAM4tM%@fVVrvi1zV=>a3wd?34_H zVTuI|{mD`s*?HxF1BOY{yVt|FTgPO7g6>D1k{(@}qbJ1}+Cmx=LLI!16pwDy&ADF3 z4x8LW0vo2-A2s=tS~QfBk7B=3Aj#c*wt3FEi{$Sv$T!2O?s}Kd!F1Y(gc1R*)~QPvPtSNVAc@7@le5e z6yskRb!`bIF0ecH}k6#cL zbCiSY_2U*r?)~qx7$sT8o5@0h1Hyv{mEBnh8(ta7UZTlRL3!Z`B7#~ntw>+pmW`k! zf3n78ZSq_cy=PLY(pgpI44r}^O;e^D6yf2f)$hhoq3%v>>yliVbw+YRDb1$El}P6R zTZ1wQfDt{J4tJdzupcpeu|SUmW=~)o;Q3{K0vU8r+lLYMn*S^NLnWSH{z&*q8}o}K zgA>WdF>$a4fq@imVpwe`jk79-bf7USSStnuX6H@`|Qp(2`=WtTrwL zfIF6~c{&s{e~PP5c0=ntu|eC!`4ZYP$0$oa`o1N2`*ho3_p9S0q~o%x48~t@U|ml1 z1LIZ6GsCbnh-!ft{`4OfeL3x!7vS@U12U#Y6o zEg`f-rTRp9uiMnyV=tHQ9Ti;J?6_V|0I1!#jOl}WFiia-vwsRB!JGT+9m^0rlU_4- z)K^`VMonh@| zODDmdFo!U&;Gg|Z1Vl`$cOx#BJU!@DtEI;)^DaM)zJNls0pHxd!i6+Uub##WFb?|K zDe;Op{I!eyV!pthet$RmUq}JT!N!?{PDqW)%EH3-|KTHMj&j(GvTRS#4mUUMjp+(mfP5Nd3FLy-|z#d7@TTXvcrbi2aL;0XqczTb8y!6cW5 z>(PY3S&R%_DOcXl#=cC~CcXAj;=_uJm*8wW|;CBav23eGKNmTxpM6XcNF}4wG zmMJS7)|LN5d-SAQKCqEsjrdhoSXP18m}tFxMj^8p`IS3V`X@r{K4<&ek|kp=qCviN zUvW!W>1af&KqGOlB}F4ymwo-hgs&d0bcCPYyKmr|;2!1TUOOQDXPGfFlv2Ymk~Eu) z?jq%qvBWQJ;~!9xX?tZHVJj#=X|(ST+RTcfc@pSS^UsNJ%5&6ht2%Ui)_D2CWR_qo z`UQSs&mGlxT0HIEnR{%p0`CM*#Urb7biVg+q*zHaWU=|!#`vJ0E$iKCNIVzX&x9mb zWkx>|J;`xiVlAMXYYE(@4QN>;{viuelDr-z23hH9BLQlmRF3J9YN05iZW)au2KQjL z(=WQ)UYPn6?puS7e|1$ZEZ=!WGMMKa)|z)W*I#3jShjoL9h}|Wbqnbgk1um^H9u0PLOFObs6D)3${y+0fJk-eUOer`=DE<%L~{rm=sqKCVa#uXT!f`;?wSB z#7i(OXvChlOUkiqSZ$?Ypxz-KN*f;G&>cQMs5HUg7&+$=U3t33UB zh*}tnL^GBP6Rzwcjgq;pIgiu3XTUqV*N^z@PL2)Vf49TS-F_4|1UW*jr>mEfeheQ- zy{Fhcc+Em8u(sJb){aoWf2DeQ`Fp%Q4gT;~YvTvJGU(~+fBEL<0|-iv9X{Rs++J{= z0M!mx+dfn!g4_GIpHKap>*vp?YSdkC>yN0{TfQ!DE|F+-ij5iJhc6j?6Yj$gyF+ka zJ`9BXLm%)2_uT&uzxfa@u)%V`^255JtPze7o)F57yJ=U=J7=V!L^e$^U{4?V+DieJg23!Mdr72K=WAf?%43GJ`bzyMBAE5qn{Qv8LD)#ST9X zA&8)kSk?&YM*X+(SPET2WFX0kX2(s9cOBGASHzvfy13Zd&d|GjZS@Hgo@&7{mYUb+ z`foJ()Of(fF$M&lNdZkJ_#ZpR3R4bNdP&=E3P}9DYP3`^i>sB9j)U|%5`acw@B#R* zRJp=n5gLS&hZLLHKNN3HY6H*Y1nfVDZ0cy-YiGt1K3eEb zM&2jUp&{Le5h50-FnuQCw zV$sBHn7y@ONSYF+LUo)L0Fqm8NOY%eyz-H;xQ`x$r?hrp$CSu)`kxL7&?pE)S$tA# z6lTbq@F%QKGjybFBpS2k2fbKe*VTHnKcCh7PyAKw6a?N2f9Mb!LRbdZ1gG4t#Fb69 z!pSwlW2rSJ}tN@H-=<{tRqn>4@&ob zg#Dngv@UD*8K2U57PEF+V+AWEz3n6=w|ur-^?Lq@*Uob1Z&D*hyM9WE@z{}m=8 zp<=PU{J(YllTkbpT=7?YC$+hLJOZ@T008V??fipUcOjkt`G&}mmAG=bDf!)iZe`@* znLuW~>sk^`@S+vSPbPAAL_*AqJZu}{@0JZ=Ohx~cP)9j7SQ|jI_Q}khMFC3-_yM`B z8}!{}MOWegDnVV6w5;1UHXm;58gzF~K~nSziag{>ojJn&Tq#-4GnlTv7A1xN@RJ(d zg1a@Yl*;Fm?!+K5QufR>qe(4^q8R<3O!KdWiyClYYvGE50h;XMYhEmo63G&{qb zg(ewuwesVfjOz`y^K}B+Pnd?^twui04fJRig9+*yT{ukbbA1D>8{mgIO!-7e2>lmE zQS<)__2vr|k*&i+ka1Fbp_e1+&!Sq7EKSeH2PR$^Kan8=R)^pT>H=eAS(t?YE^=a= zd?I2n&qz$xBCfH&M^qKKy?ga}DYrWsk{&4K<~6&I5secu?p@RTbjl3&To? zEpRi4k`qfoWat_qE@-elB)^o1=M#IirZJO9P@Rb|lSIybDJCU+M^A#C+)YiFQ~k^V zzIuIarvcZhZ{|J+I~IOD3t@N*%@*$-v_}wUQRz>nH(yp zuOtGfyy}Bv@zYL7W@)T-jF11l-^Q6pMhSJ^YQ*9&0B+@j>=?mP4`ZstzLB)nHlAcJ zbKy+o6SvfI!kagC)nc)<$JxJ=+}3mI0hJ=5uz*vdP}soC7APj5;S)40;KmZ1b(~B5 zA-PC8K36VCj*MEe`FfYs24eMXW$imFh@T8OigYe$>G?TqUppfSWfH?K5zk_)D9;rU z{y0x4OY7$X^W!&up}lmdx*P1EuH%x`4$Y;zYz6ZB`=wp}kSLuU3Wkw*Urq2(6D@Rt z9hD7M6XOACEa5^SKyjBPy(0#vKMG z)_&S6D@>nk!G_lLC1xy;lq;#zDM(nC$a;Z)pIMggvwvTGLJ6J%D6;sZ_=0KyKT#bF zHOx+&s%WwUX}yvR_UxhQ_3!&`G@>~}g1;kz0>eexXr^y%4X@t-1Mr^~xuW8*okm<5 zG+K{-Idm*Ny|4h6@q>6zT38`{IAY(vO-o=&e}Db(C5X2K#4d8LC}w_=m&l!QQcpgT z7k-is-s!;J;{dycY%t5lp`95usVw#*EMiVsX9*6h53MZnN+9A&!idVA z-Y%RBVk)3f$;4@9JaG(Q3KsZyYX zM11ODsWgfcO$7a}Z1N1Ld^rcm#%Iq~gd?T_SLs}gybAvPrbt9sXR9#$_u8>^t`YAM z63{EW^hSofPO&6&wfbZA(OmDbI{Qp4-Bm_2$Ed4DLy0?-ahuxa=Pm>M+cABYA?_efOYhz}pFHh*W5*c(bWY%M~#! zj2=n3JPvodH-=HcbZfgXc2-+}%OSDk|DB@1EE&%3plG0+oJ<)>>0oq#Z3(3Qcg;H~ z;6;nyN5vInai);)*<3V!Qm%!QX=A}8=tWQC&Htqqv)^}+IPf$P5E--m6sMQWy*L0zP|rP zSLfV{QgnL4g-|9Z$2TtlB^fOxijrVl`+;D{;3jzDTrf+=ixEG*qQYCCv!`B zPzF<~nElVi9@49_k;p(LEak}=JLzC{IKOr8c3H%cG^0@MBehrc3UQNFsq9{wx=eq8 z;2I-6ABUdsKuW63YARDQXjn5eQi@b%)>pJaJ@e9o4S8JlW%EHm?g_G}2-LQ|kSvi* zBr`-pDIrm$vxF}`oz(jXh&asG)k8h2h~9*hJ$3Si;BWg+j9CT8S$;j0lv^cB!SK=tu;Xn0mnDM$M7~pzw%0sig;3RjmZ>MblKBE zk52YrNAQHF^4TWYa8bSz9*$#E(5IJ(m{p%eEy?ZAIx{o|IgIi63%jIsq*ri+?PhH& zO>J~()&eI099t1+gzS2rhAd-9K?9|n7Pa5Fk^EAt+V+;Z0a|@~m3#P&1xh} zr&poO{bQpAU_!jRAz(s213#nq>ft{+enckWUUC6^0$yzj8Zmrz3BK!(U&hDco{tDj z!@z`ksDPJ%z^#1{5LSjN*in^YD7>E}eu+Pz%))K}DS)GZgk0>1C8m3ufxMWN3A)h4 z@)E?Wd`r$p+kGyGPGqPgw75zK@b0*vSW}-LNsBaJxCk| zsmKZDRAiNzip+d$p)EFP8z@GddtS41^lApc*OIkrLePO`3@#@DInFfs@dTRp8>NLw z$+TL+piLeHJl00Hf`LK1QX7zbQSgl$F;Z!0;k9v$5?;&=h0syJP4Kcy(YiNiM$nud z$<1}Qj(1qL-n!?aQRG(Js)I{aZN?JvpXej%}wQ>~hp9bdDKr)zF* zz%2Tx*=<#M*O|U(Jha&QT19ekIIgUec|N^Cbr?Yu`S4r0T%4M85~rcQraF(w7oM(o zo$MQB75eLW;OhJfO|i@nzOxq^K7lwOLUQpi04*y8XYqAQ5_trLd4`b8+D2HN5$YQ8 z?``X=uz?U50{Y(Yo@n@!086RZ5Wi&CeB!@`kZ}lpawLoOQ|~o8hY;Ih4%q7Lqf+fN zr3*hW=2HwTt$(7KnC+kM-EtCF@8}aNUNO7;pwbncMy~J^h40;M>^ZIIsdoubADi~XD6U=F&JnD zM5vQMBLt`uXHqOzHFUX7grP*NkJw6IVJ0l-bF!x3&90FA7KZZK7@Mc_YXl`}5ilkF zt*6(X#%HM^1+)?A9olVKLV`=chnW&(JaU*6*DKal|6dGo^W=I>%2l3kjVv>4v57xB zqmQFU`~o@J|KjqV^!IxcmSGqT2JvHY0{(FifO4}i{cp&MyXmmab+>C+B#B+wg{Fx7o@&pzi=q1z zi8)k!9YV6)1f=ak&u#75^xZ!q+FZ&dj8Y-2!-a^LQ95*s}Lvq!5iokQuW{G{my@9kX9QfudJsjSn9&3qrzPpU;U5p<8{5Ob?7CNEG1y z^!#%1c6l*F8H{zG2!Mmc4yhsArys$sbVh~Ym(5O*92b1WTrcr1FZ|ShY-=RT&7eM7^my^GL+u(RB`G^ z(2F?eg{GPbHqyYJzbkLV7kAt#zW?=m)eb6oknG;XJTeF=GL80yzD^G}Fa=<{J<})R zhn~(DVcv;P8_l~cG$!3dD>xE*YXRn|o3v}$*H+{HD!w5V#T+8HOT;fFxr17S6hDKR zUVXGis{Na|r2iI)SrYB6z2CHrd%DGKpQY4Ua8{7l8gYpn%lUw+DO7uh0L&>Q0ad}v zOC$ZQ?-Uquf>#epDHjNtivSQm&Bw_2O|`x$Xs%58X6;h+J5^WHE5e(v?t8E6(4LK5 zNqm%)>`&#vAH8+{dpND|G+MQokINDysJP<1=70T9-jm;_yn7rx2qK4}PC-(5kf<_B zbfG0D^4!a!TiO+v2o(Da)NUHXQKv0H+vknKv+a-la0M$t<+f}WX{-Lm*v#A$(t?&qzA^)7iuMq zPbYDOI3eS^l#0f?CE!W_+(^zOaiu6lHq0h*L898UNBW*fg$PN9xnl?@>AYO&Kl+=V z2>26HE)T&$Z;%Qqls^h(iGgK>va~PFlI=M@ofuS!b>*L5E(0Jn`(_??($>0}&Xl&Y zw0d_D*5HnzTE^7-?*~)h;5xVf;309;hywz0Vr2=K%Ck}OaKD@*D(|<8xotz+j;q(3Ud}h1?~i%!z7yiIn%U&;4>N=@oPauO?G^1N>tFimY3EnC@8h>$ zGkkR|F|~6u{DTSYO_ZU*dEyan2Z;=LOJNmx44Gw94Zqh>VfdN9vkXw5f=B$mK=JCv zBSsH|36YJ!1Cn17z6^ytY)t;(bG+TI9Z%t}L{P}REA=l~Lr_D?e%|~(1>24BF{^j; zAo%>|4+o54q~|aTRShsRm5JokxT&%nW;tfFL5pE#cP98c8p-Ip(EaI1BY<1!X?$r6 zuLEr2v;G*fM7f^W!zS^6xNk^7c#qkyrin>Md7B}Idc)VPBFChDQjv& zhoO)oTDVGaPlo8=y1lSO{XO+=6Ol{x*}vBntDBseoS$luJMNPZ_SbOOK3 zTmOZ!G$BDM)*Mb`{p7HhYPapBm5M-FRn0ORs37<{}hdza^WA zicJhB&{k1&=nO|nIW5u7IjJrrxb&;(IvT*W{EjSv7JcZk6JC6-6@(GXRmqZ_IbvBn9zM=K2bfI zkAKM^G)gOaY*YQG2I^It`cBEotCtTdFkE}!_6#_85mo~b&fAGiRGWq~xxxO)*52~Bzly^!3-)bJ4db1nY4^kJq`@eoojG__N^>wS_y zRVq|1AucLG3$7bvv(J6g^nOn^sJQN}Rklc+@Jk_>b)w7RlQk+&(8q}AZsNDKSY#j& zxaz^8wtBs$X^KZ`*rPw{sZbmcRwk@B<+qtA&Nrmpg?ys#3AYl(y2-z{{*ibm{S0GG=EGoYs+@ zV}bW?+^9lUv4xnS`II5V`7U7$-5=@CPbiq$E>1`Xi;hk*g_;LjfLhX&d!~BTYNi#N zfS`{L%5hvfpIjXS=STXJxTS1>n5PI)1ckwaDh5cg5>Yf#;FLWMP5K6xFMPuw&(sMU ze$;ZKObxP1Izlu+lF3LiffqqpME7h)7o$KhxDz-ojX0Nqq1K1MD7LUE_To(1Xwda$ z+6$;?tpFq(a{lX9wQDNjG*U^+;7^u#*cU0mToaLYP`_@(E@(XHVE!#y_}y3!>N`J`+v``M;*nIN;}3EOaaMC}w(TMueB zt{IBik2@lRmZzTeTTq`kBCp!U(4wzp$oUgusC*umVG5{%?Qr-JoK&;LS`b(!kVlU+ z=h7zIUF54RxaqURjnHdaW88Xcz9jSJ0nO^; znf#zbU#jVADS$2YmI21R`}JvZfh48qy40B{)^Ze;Vptr8#w3bJapsZQX=7Uj1tpPi zM$A)fZrwPd5d~3-Px_Ew7rmJpoQuZx${;dA)1zJi2a}>JuWp^JG4V0@uoD5lR_Of1 z1he@9B*}sRTQ8kw3>HRCT!J5e0Eft(jJm?@7G_-2dY6xpyg(rQ$${q0uMhU;@(>NG z9grWo&5`;AyTfD!LkneT)1}oHW$`c`f4s@r+WCg_1trqOKoD47CtIYdaFiR3(VRCU z?~CY84z8a}(iLg(N<2NsnWN<6Ms7eyrC@x~f%XYTuY_mTh<@D&&+rFh0iYEq!VRHK z$ndJG6|_8|O(=R!&N3~`Ma_LJ~}Ul;h8+fQ#s2;g0g_@ne9@eBL_*-V_cfRqcc~!1ms1U9Yn$X zNS&zm`IP7$z_{!7*=deC03pzbiZ#W0JY~f5gqAVZ81+Unj#e)?v3qZx0KCaW*n=D_GXc(-;CxJs7%gam z)c%yOV1?@gZ>Ta%mkDNycSKTe9%eu(+%Ui>K3jo9He1?vewtwHTVEX1>Nz5VcjPo)x#l^v|u zv^WQ?Ddjad>dOU!MO+Q!Sp8&IlVcd;;*w^=2cPPvN=urxEQUU7v^_Z6mQo(++;grD za~{FyUVDB*4Dvt60m3WwVSLbu_omkwW~+}%$JXNy=3O(E^42OVte4#-T%WA6wgcof zE8GtsD&EVkcgHZ4HZMDq>X33L94nd~^eJyF^9UC%G<=AdtoxdE{G^ZoXF5A`p4V8pf zsmO?PwG_1bXjCj;JjB@HjyiLL*r+t&lU>7avL{<+*mkM1wpxEoO zG9``p@6xd)f=&~_|NDC^6D<+G;WMNuPVgHAPIYQ+U8$rA#bY{Vm3cY6s_1I^A0jBV zF3kU#`Y=!bP_P^sLAKzu8Hl1_uz)!+s6DXq3N{5D%O&YQRumCzkUGWo3e+md)Z^9_ z-+eKV)X7Qw>DNBVv3`w0NLp767(Il7$%U?B3yvv881{;O0abK}nGa0ja^cV^lh5=JfWkRBG z5$^VKpNVydK!z+qHr7|-bB%uj}?fOlZ*&!1*#a5VCJ`);vn+%*0um~m6 zoO|C$mYW|H9k+0OqDXuaSi=ji>)`V@x=4KXN3W@--#L9F;Rj%`WA+ZnW$bV*CVTu%qPpuLV2K3M(3z(x+_y zpt+ht@-t!h=gLe3Rj8})c;ib2Hd}@T$EofIj;3!lD=~04byM(u?802tfFt>G@ z<}o(EU{Z_y+Qx!0)Bg<-X~lRrA`Y<{0LEFXC?PZ$^>Ur2Kh&0P-E}?%ASoeiIFY@h zG@UFuAq3cbeX$!7+I*3&`T44$r>w8}O~PC3KNOUo40Pd@J~K1`D$EN|LfF?My1x_M z3zWGwM8dlXCqn$WBa|*IIbGp$cy*GT~YkQ-j2O#Y3y~B30$-|h@}K|HDzgE&H=KG%^mPgm0cHuM^T`Bb3RBnb%faP zsA#6wp(Niwh|MO$BD6*0vGG2kw!bs%d2}}(Dh2;0v4&Ae4{(dtw3Yq6ayDiM5~I7I zSc^q~q8PZbsNN1APa{gI@P0FBBM(pwXx4*2D6OwrTj4qgtuXwn5IXlpj0b&$HHfv;XqzQ8ft z4k|%p(!U_iphxaJP6Q;JCi=Qq`%~x%#+MIm5RR{9a)dSw6ozYo_BS_-5rj&m+IlgN z#r{yV;6K{5UONI9y9qGay(U^+jj{Cb8o&r{8X+pn)u(v`ZM51Tu^L^kPSDQ8RSo(= zQ&<;TOwmW*dXo(b3O{dM&0iR%$eN~Xu@O}t#zyA+|78}3Fd7cnv5RigR4h;gMC~Q4$M8}@6_<+jT zboH$Hdsjv46=rZTSJdGplx&~r0xo(%tsi^QaGAKULHlPb*+jd`v6KTQyz0~-ihbdb zGYN>Buk-5Qh>*YIW!a_*Hw2xVuZ6t3@5u{o-{gK3Cd;u4tlTahB3+*GDi41L-Xg=7 zz1XiX;&{!6L}aun2{3&xZcTa?KR|=1NK;aB8*;i)ow+9ulYi!;vt89-ZxCoQ{fDNZ zPwSR3F9#f%^JtcFSK7uE_R{~YHzN)|l!3+1dkBbTMULhSI-itZ z=E(9$=E^?VKOs_WoW+)LBb$<@SpMD{3qhNdiZiDrpcEyP`_s0eZ_-34jO-Q#_0Rul z+U;rCQI9kv&ICrDG0_MHmtKj64I{kd94{}fpguVYZ`(ahPOEyHvLRm(+Owj)v84?j z{HM@N_MFEoww#}RMgoT6ehLlCPoa@fNu`&tyoJgZ{e%@`;>7X4>%)+uf?o&e!|o$U zs>B~cOC`yqzVV@r)>ya`KR##R-KkAA8eTRUZs4G`*o)Op%aCob@Fk#zyD&Vo>&Z4! zU~1-2wyvd;q*=|BJ)9A{MSfyez!ethFksdtBA`>`PFMMN0RWLfVU@{a{ozDG|2yQX z_o-|-Wpi;}A4hVg&|s@nTGFK4uYRPzswp8eRjLc<9Gqr!$@XP)rTv8*w$G6;ujyvO zy?)pyoS{F=!${%(GzYvqIEVgJX(~Vk-+eEbk2t|dG@oe%fpZ0U4@_+=y|&f=Z~@uo zend@B2eiZhxQ^yZ2YJx2{jv7%Tx91=*ByI(j|?x{;x@q8e_X(N79??Ac6txx4;QeD zF2bG`Ao<`cDbwQ{v4rBfuzicap7TgD@1rYm(O&ScprBQCSq003Vl#Oz?KhoN;%CQf zwF`Oh9cXBAOO%<*$9j3?!zD>aO^?j0-`(IgS1;gHSq5&c5nZx`(SG&bVqO#}aB89Z zaUQXR2%|d7<L|4t$xCq15idl>-1%EYz>Q^rU!R~`^oL2xxTLcn8T%C6Sbeq*b6J1n+b~T2mynu zYz9CBq!2F4cVb8MB%n8IJFJ@6#qlIP+qCGsV}3^!_xWc%)Yl8%7m@Wglw252^K*Qy z{~c|$qKlf45;evW=V(RnS+3JU(yu4^rmHDIFM5({B#WzSe=vb}HD0 z?=hP``ls(_j1nK^8Qqp7tuQuEw0&JP_7MOCtT~+10eLdB$DB~m>W>2#-n2vUt{K)3 zw`1CMXz=D&K__4V&Vb7YkODCJ-xS%gmI}jhrkO;zN|ou?M^pJbC-(|ept7w&xbdpU zQD>XuFpZY~9X?g=*Mcee#wiQl!@xmmen^xLDAo(VrI6P5@Vj z%b=J`mpn}mf~n(-r)Oegghm_VOZmH*I}nvj?6c9i2$9;ClQE1=4P4#gft7l5N1QX2+f&@3((WmG!#g;Cm*cMlr{+yx%S=|5UW z_4`BA%9i_c<)2cEx-2tMSPSo!kQOKg_@B{^_?dmZ&T>|oHGU3?*WGj+hDW2KC_YEk zOG%rv81uh^M2+GN{ur{W{=>TstJqkPoS$bD=`h!J58Rg~wRl5Meoe#_?*weuz9T+2uZ01{^GdHsYabVTE;KG{e$)2B)6)ry3ggg%O^#*sO`CWETA1h$Pc| zGanJei~`E~OT4s7H#qOU3kPU%jHb!AUl~`QUD3v#Kjq188)LjGh9mo1Ws$vER*`sn zn?p)|w*{{IJV*fQ3r9(okj<}G36XIth6uCWntD;RNouGuE`kWHi|n{?$SaHhjyN_E z#PtlwyZT1ZgpmsF_`<%KBV2_Er#9bi;G7hLUjE#I64BazXl+;q)PsI$NByq_0AXhT zAH~nb&H4X__?g+cQkuxA0lV5i+s7r*c3(7CST@zx{Z~bs6TK#+OT|P6gGWscGL?ga z`6f6}-rjS!SwTDbQ|bo;l{D(l1@zr7b|iOoF%YPw5M+w9Xo^_ARG?Q@AnBbB3j-s; zR*A^L>x3$dyd2Qresd785CA2!Yb_?)PM8%rO?Vl)Ou(yFD3$)J1$e39K-3nc{|P~( zN@|!ui)@9*awe)@-o}%{uX)X(U%{C`fn*|8g@(VKHKdSB*<>0_$i3$R)@h_CF^X9W zYUDyM7+SC8TSSU&Y%=+STR^stlNtRAg(KyXTRK?1DT%gGJ%Em&w=p(y)1?FKs$98N z-hmNX&aNi{;mKz!3|PrBkt|-o?-?x&M4>=k&ox3~mXi6>Rv7Gj*7hc);D3L=|{LK&$c4cQc%}p4@A=-(Nd%Y z9SYz{3SRm7#lom8!0kt&$rUL?Hwn9|!{?WZJqZv3e=UH3=AJ!Uijc z+nQTO5N6X%P~Zj$F@}I-n9({Wd5!HstAdJ}xv9hPXQY{9trep0%j8SZ_M=iku4I~k zd&!RzI7;{HaaFu>gkdPyU)d}(Ne60ubTws7{XDaL+ib4Y&ZNv~wF^MKD;&u#Y5EBb6b7U~XsKy(liu=kjfVq5cjQEk($5wxTT=UnQ?DYXTi!BBo+kiD0 z#DxsuY$Cub4M(;bR?b11#hcdFvc3zPFV)tfP!EZ$&K*eGq@@{-%}zIl9@N=__=<<4 z7|Kl06f>w8J=$|-BCgo&DlExZ_j&^sJzB%n5QaOK?dw|a<0zEGcTQlkAW7+hA)ys; zE#yHh@pE}`ChiJ(f^H+Q;j_XQwTu1@B54)lBILk_cSoO+60Ars79?c+N1NO2eH%!& z|F<8d7#MIMP4(1Ig6w7X@C*v+B=RgQPl&!Iq>5Uz2!c#6ITMj(`q#o_8q9u5qnLmq zJ$^!rP66I1eiEAf6{dS6oT#F#cL#9f#fLRV43$KWD8YPOettMKen@Pg{MJX1Ed=x_ zN|->JpD7_V{*VvJ0*XiG`M?!0fwqgrLN!90EO;@Sek{0{84q=Sja*tGnHhvou+2(j zQ=C}~8JU{p8wlgyX$6UdZoI1tJrk(H(PfP-1uoqWI*~X|^p6Fp=u8vt_aDGeoi7jY zXRLydXGKdu5`+-yoZkBaQ0JTL`vrX9;KAo}q^d|)-?>l@!mtMMM`H_XqzyX8fdbr<)BR zpTf^6O0L*)#0UxkLvJmp#N<|x=QfO4ZHu(x6OIa+hI>o zzAq^M3z*Lh-|Ok%NKig66s{Bhddr z;yC{AaDgR5SQwHvLudp74nTK{(p14=yM>0k5ECTe=AURzu|_0YMb1ed{`rD$KsGJ2 zwCQTY7V>Cx@8jjbcS?#KT#qEoC^=tIQgO;BjAQ#VTQDFQLR*UxYLaSPz>_~cJAAc6 zmp|HAk!Le@W(jyc`4h$1#~LPWdr12qR;;+ZUV^#2c#0f`4pmGAun>~l&m5)FjsH(z zLbz@~9@3*c`}Lo|g!1|$Fr8gTg55xs5B~oIrr>zpxZ9iL|06IxlgO21#>$UQyxO)r z|H+k9i?3N_vBz7!t`?Gdf8B^zd<;^ zz44ehFJG8t*j^Kmu$o@dJ5znk-pEEP*JIX#rPK+L-%)AQFrQb)$%GFzO{So8`o3x= zenEGlzTA;UP8lXK;;40A&!C04)8ej>W+V>aR#7viNp)9x!XDDH&q5wW#8qn{|FdUl z8ef)L-xZksqd#5#BGD)cF=61kWOqva+e04D{?T==ZyFn>*0iSt2Kh9?LF*xpop?nf z-ea^b!f`ZV(FI3?Cz0aN`;A1Y{XCFyi_#~)&!=NGyl{7!dwRp*l)vWc_xdpK-VF~J zVTPIv)&a*T1Uq@65ml^MZy&mByG$PA35FAHdwCgEEY8l0Ts#tGJ6=#$5Cat0#*E#N(+fSiY@n$Q)0-D&V2lU@4vtFCt+l zs`!40v1@bA3>PH*{4)Uw2ET7LtX~3Lis!GM_MtUH+CMpy5DO^A$>K&JzuDeK^;8BF z>Q-ZoN^M00%pJ;R`|FKpX?Eeij;Y{8DlXD%0dxT2M*v~^1%(_EoqH@r?txepe&f{b z>dsZLW-`z&hPrxA;@q9;QX@2QO(D?g(P!O#WeB|%VBC}PF)Z{g(u z3oX&gyK_N3=3I5zoY&!|_X7roZc+bFM@X;Ve0=|IA#k(BeJ(wQ_x$+!Wr2mUJ8^jr zLQn-Z2no+n1-M8A8gzNp-wnMg4}h|#S# z^`{|!u$+}C+t-kz9zNi3^LBt(eEMN=jPlS0#88&bGa^Cvyv$Q*3u6I45FfUHZr3lK z;>6zr5!@)yW2NM;qpoknGCzBXC=ZN>7uyqw7uwy9Umenb!i|ZfLDGwMv?r7U?%SA; zdj+(7s(c5(it%tPh;~QkGo64)Wd3>IUVTP%P4&T9wD~V5*ZKRlUBOB8ee!Emb4Xng zDN~^)#`4H|d_D79hYkYhZjN4VA(m>B29}tI+w^FmPftG!)`Hz=oZF^d(ffk^_{T6O2v}7l@;4u!#l6Kq2 zpNu)a#JiYkdZPx#Prj0#W~;k745}$O{}Q9viTYQPA3R)n1Lput6L^O;Z&vRttTuyM z=3qLGMKo>s02EL+1sR$zeR>dUd#BSopq?aopc@S(b}=?~X@^Mu*F6va{d0LDX2Xc7 zkn6@z*T`$sIe$H3pX>;MAk^E`#2B32#|Y8DQ%o!uhf|TKwOghRt`5U(Bp*(@XKB|j zkvR6hl~+HF4g>bwgLN`sx<-DwP1~w*PjMOI6=o>+3etshC^sIE&lO3c9`&^DZ~au5 zaO`!-E)sXC>Wr{w$Y)4-fjL(yJDTR9?uz$??bD`%fgow2T$|Hxke)|C_h1yYIc_e7 zeConWZbKl>WepKF%L`&%pIPMp7Yj>=h6Kw1c!6Ppu(M>`mq5^DTx3AP0&p|A17t_@ zn;rC3YR|SxCq%a)#f$BMn~%0!THH6j`wt_`w4E2o;A2ab2uL2hdU^Ayz5;k+3b{$n z5*8aUO9~7hu&is*RnJVq!Bn-zLBvUZiMYBY6(JsCUQVjT&z9%QX`>}5e(}6dcI;&h zli?on{?rDF0tSP)fB`Ij0D3+!eprw)|5YOgb^n z{GL3-MBKnsp`wk-J6AQ(>Wufp?{u=Eb|v(ur2qXs^XS3 z!m2o?1QA)7uss6Ozt$a!Z8cZ{bvaF&p`6dcLchGZ5pmK69ICYe_EURwDYKL_6dr~z z)lB9mIo{kwF1=f8xOSo*P2yUQPNs8P2ftiY-Ze1n($tac+H2I!LsAa^;W8VZiXZ64 zm<><9#;Dry9SyBZ4u?^T_{U2`qTzx$;R0hf7bNb$L zq+>>}=S$~mTyB2>bX--eRt6vxBful6i%tFdUOl8Rwei>|)J3y{xjaAS!K>el5m zBH!upo$1Ql{($)WXjs<_m`O08Xs$!rl7q@y_~~3rcceC@?( za_xD=&Koilb9kFwvPC1pIj#S`M0Tcr%q{+`PZ&cdiz29i9}%m=8v$|X#M&cXaQEZ; z-2pe8RErGO8eK~WC3Ct4j?~@&H)!6Lmu>_eTAwR}Jhy>Ym+huAD1P3A6X1btoGrhj zulk<Ia9xt|@1i9@;pygS(mHw#2WFgKE=&)CLAV(FGb7c@q+Bf~Q*jx!JU3fbPA; z%R=%Ki2V)7UFMhOG@?sO7zICZdm$@~5s)Lt>uM+0Gp7;)qBkBT-G%ej8P3n?P8ix_8)~U;y+-xz68jp+Fo;da=Wv5W;P2%{eEaQB zhz6n<#SBW8>k@8ShEoliTSyaaBLY0FSmXZHMq>+zNE|C0do&xSs|-o^zD{)jI;D@L zdPY#7m4&K*4=p^V>F?plQCGL%cW9{u*=%Gc7oR535Kqo7qrM#BgM7un#G!(1soB8V zFW^Htq^m*|{KFk%&;833R~FMk)S$NXw6}5X%lbsu!BRIqk2}e=om5C@s2s+pV)7R) z*m@4YeCgEyoQ6Foaxi$pD=XEyaRb__k4YNig8t_v3jmvo#$GEPB`X6F+M0608u zU2v!=Txn_Uk%qx*!#j6de68}Kz?+Vj7?VJJkbuJDT5Sl8X!ICrAwM_fsz>GsSe!uYt@_7y{{fQXT+M%goeNYE66y6(kboC(j;9%;jii0%^Tf zFsh{*YG(LK&stj_9ZWue*W44i@^E=`nw4COcb1as4)uw4vO?#Ybs%?VR-_H=dIMb4 zxg{VU7=~O?S;nKdN)BIgm|jL7%IJKR>4QFi^WLS%-dd)%MABwKC#)i?9~7?QuEPP7 z+3up3viV?TY>gf2c^R&Lk?8nRy4k7r@K@DIn?@MY=QWN+R%tUfsLeU`ai+}k4Ju>g zBQo%4)`e1tg;G9+Qj(=odM|Qz^kIt+FwfVv0lY=UwRm z)caVd<=+!o?y*orF8=+eyFc%(&RYUi!RNX`*$-H;kw0G&ano}LA8JiJ!(=#(|By5w zjlWAYsDVIM^#`o^U&E@6GMDaHWSg1=-(mR$sO#l4-iqH=26DGKor<(L!Mh1}z9|nB z0snOe=)i0l%6lNFz}y)_3qK=h!4U{(z(NW93f@>vCpvg{`=m~-Rt^qrcspYA3>%2q zblOqrSmO^DoI^+LU@>mr2tO$*rgGGka(bBL{KP!Gcz$-ec@}}1Ee1m^EXKy0fQ2kY zPM1t4EVpRY9=R7+pq4^Sc-fsL7bW*A!H^%YuVdN0U|pvlK^ioAG;%d|wrTeSuto!g z#2ZT@6N)8{GEb$KycO8D0zPCUiLI0=rscK8W=2}Z>XuOW*H_2JgnTB+B@>)da8WB&SF%jOsL4N#<&s-v_4<_S(FYQM z1VIcX7Az)5DvUkM!W@L;A8l06GR$;U4&S}WQp~_XCZ6lct0$B|iZV_C(91;o5|5=S zDPp*P#i;<7>aTi>FYJ zx$uEH-(yLwIcUVBF;KRWdl;n2GVV^%7Kt9xI5PBdLbsm|uoeA6Iq2oaYu!U@jxlTE zo)m+kv9(}g?tGNcbTM{rFg*5SHV-C^NADz)h;{`eL{F>d@s16~<#dZ%@h9Zlj4$%H|wlc)UEt5coR`SoVrZ)mDzPnm#xoK~1aMMqD+eFITNDCcq)oSkH$_^$C z{eYoFiEIG{N~9WI9QhGrImLksMigueA6jL)mD}2^ zM)&}?n+<+_d`zrxjKF`Qhakn$?Tbequm{zrDoyTHF4ZHh`qnM80=Q+hvoj>9yX~u5 zwvj_+!tPkFLXE1L4mT)%XTSDLq!}KpgQPt|hw#d}=Q3BI z7y;#0@gwHRp%msagxEVa*95wk&YEuHGq3+xk0sD#lG7a$tvHnT!A%h^oc~j(AOV+4fnN29Z~_R z(yCk{^H&@x@!}h0aWVhKQ34A$k?Di#6mhg8n0#z=Z7y%o9ugejF=4CxX>?6!;V%aY zRa1Z*h&khH-?yit*3$B}Dd{Bd3#0QjaGH zHq(D~O6yhjVq}vPR8~&qJHiGMIAokaJ$Lh;&|y$E2Ys~m5yD_V=oNA8Tbp?No(8B7kUiScNvaQRfky*eAqu>GG+{L7XyQg zbiJSFi{y%E@`LaV;EW;>AIM1b!I_3k=*c%)nD;1JRO`j#=*^FEWJF0$ygER?jb@Oam~6Wo7@7kC)?O z+m25B_Mg^Ob-G4-ptld!-70z>m?lF~17nk(dBKP#dnEe1c?toiM_9-22y0;}0ddM! zV$tH z@B2MxbJ|djCG0G>^@$Ngp*pnE4=g|)ZNeUZuQW9PY;NV&`@eGiUostf2JnB;bV#CL zF#n^)h<<1>2cEgoxWoU^V%fp;9B5UME(FWxfZJfOf^^n^Rd>CAM1Q(^w60798HEBnjz={R9MH$UX^p^~0aCG#)eLvf_i!$0HQ1{G>!| zcDA~Un}n&q8sED-Pn$ejO9X)m1JJA?M#0v^O3e6uzk>?NTL;9zTv3Y{S1Z|3Xo4NX z_vZFyA~WhgO<;!qO9*H|6W2ZKT=3edi%_vEHFFS-=l{tG&~FGciL)j@p4}{bag~;G z%51pe*bOVpHm?gVv2SWBq>~8Nx0xo+p-myQhZc5)X^Z?ftF<|5KR(_8sPVGy7>IDC z3GuRroCyrYN{VDkC?@!!7D=UOgjdviZDraSQqixw@f1&(Ls5J4o^5!%~~lv zL*+h4+xme2UsKl*R8snzzKP>bQ{EAm9Ye)>Ss5&*F2WseyBrK4)t**sywRQ*k9WR7 z{(mA1E)lCV()s@V%`4`FiXDd%#liv59&Y{y|Fx{8;BU1)u+EMf&Q6!?-3CJ^1YNsS z^Tc0gkQ1)cVBhhC`=f}D8A z$N&|)^=XA)699nKqm> z*G8IVsJbZxgAh0iPT~Jy>KvmR0oS!%+qP}Ho!Yi-+ihx2ZEI?~onmUcotjgdQ{&6* zea^Sek0dLiDPbbg)ODs}=rGVjs6#~}l1D9`|U0{*l4+UhIOl|Yl(g0AH+DZrUyBw<`Ne@BD zKxG@pePRt1#pa7DJm#tA|76_7gTQxv>m%!1=VWtsO9utl3ixEe+?39}thytnreW(67ypb^Or%VxTbcnT4N%5Tzh!cCqbCwM7z5Vgxyfu#(xj>|t!H zOo}WX76Ipn6clZe7z<(~MDI2P%jIk!N1x4us@e7VO1r1~Ia~P-oU zpoPZNFA(I6nGlhZiaA%NiLeK$pb(}W2Py(Oo=k}SDS^vfAV#te@(QWuh##w<2@1X*9h}U2 zal}$2heVwmFqn#yWHr)Q;F=~&QcFB|x^(M|_!o5r;-+xu2?X9=z_0k0(%14`@(}=F zDbfMC@6HdG<3K0@0zCz4yeilfj%*6Y#Cb_OfIaqG{A>PtUJ zyO3lNi6qis8;S)46{fiC`7Rji(j-6xWxW0J^m!EDv|0?$v1dmJ5fJWThL8^T1x7wW zgNryvL;UNAChf+m966NMRR4$TD5_PyefuAlRPf0nwQ$JDB=b?GHO36FNH7n!xh^SF z&dIN**E|Vka%ZA(bJ60LMZVcjtzChBH+__jFK!R~5LM-5?`F24KA55Pv^M~EsKH=R z^Z8Bo8{(}2j1iJa$9{P8JlmX$Cc(xm&0aa~puviHdvrUg?y*uT4n3=7RHYdkE^Zb- z78>QM0I9l~BYW~RA#MHx0V8M1rO;%NO-VI~$8qM?^Zkn{Yi^WVM!7}094(0^~EGldeNi9)3wL31TH zQIQvsWXRRVu~7TuHXM!0qKF+;(5ViD)h_aG{xL4fDAVNqYY0j}zzGoh5qp6!Dj6YH zoQXoAc0?)-*$dATN{vFX9YfJr$6A{u((gxJ`?*a5 zfzsxf!zLBvJ7wHHH2!CTC_y4zpVR@Y1>u*oYOju^B*6BeeDfa44q`ikx!{(NOK=2& zW1ND628`y22k=(3q5zoR((z*ot!bb(%JcuA-7=LTR*Prb+d9;)eXCXJqw{Tq_#&WP z7d+Fnt=*aoEcN|mm*2gry&gN_@x_3T$fR~uRfSL@$4wA<>RVENpR+7D%T=}PvNO`Q zHMEm3dvcnB_ty*bqmqe`pJqBc~`j@h7tmA=C#!e<7lXS>7kGNvc&F!i$6r8G-bPVZIPy4KDhrW%fa_Yt(F1KHx7EV?u*d}ydDn(i=*YkU-) z4LbLWHZble;UqA5h>H-`1b;!xzmPl0bw(`sosVejSVt-q*K zXY`NAg=(`0q*fnW7O&+cH_t|-xRle56$BsZpZC1^i}(R+iU+CW2r@h*ilz&ls7l!N z>ED_21I_qM_sC>84{B4tE6?BWnv4-tu;w zn9Y=C#!BM~$T*|><;bu1&55ybug5W`*nXz`4@O;=V;38Nq(TqAll{ijcOEY%cWQBC zEwZASGMY)iGYBL~FEPuF>0;f7J`4V_y!0#!&QOS_D=aKmkiKI7w0} zIF8@u(>*3U+=hNbEuqs$i^q%<2V@XK^z*}bVuF#8^+Ol%yHe( zxOo9k1;g%(tQv3hZeR9HA5}h=Gw`IlQY&VjF`4=WeG9#Zb9-{^$C90CWNTbD!2jA z@4S}$@M8L^rQ3YI7P2{>(E77@(=Q+C#8E_&L+-^>+NG2}x9<5FJ9iQ#WMud1WAzy- zJJa`lRm<6EX)7XY9I$;negAtf`~s}rgaDvIXciE{U~8f!?@jN3%P)9qKpe~w zmB>nu=)*C(H5d@+yHe4ZD4UZfo;_s3A7`*gAnuvgt+Cpgn8(wk#vKV4 zIsXHnm}$t53%I}5EB1mRA|gjHvG)IqJp0My?Y&M--3_sKZ9ohhJ9x%TwIQ)kAddFw z%#^TK+DM0hp@Z9qA-e8fG{Zqa9z*uSk}#!sBk{Lm@!TUYuZ={)yIv2c^XHi8SYYvz z1z8k|vB$Z9CKT2~%Uh%Mfj-%YpM$WDkS-}RbSv;u+ll$kUPza%MK5suo8f6;sS`^& zo%SEZdoyT8VCjV?NnWwJiB}tuA*ks%Y)RWSO4xZ%;Z;i0KGsXG>*Wqmv)*P4{2J>% zALmhTAANpz1fc|@AH$x1mgE0EF{b8ilxA|dON{*YqMqlrjn^vGS+Qc7XOAGyIRd>j zgwv{;W40QXa?$RoJpO5~(_r?XMJH|xO)wZjTvSLVndH=lci;RKQnl87AXCoV6TJ%F zZpEQfr_@4k;*3XN@?IIRzS=omXGzfHW3BDDQAe^!d-}A(4j18Q@3U6Zz`n9k+PIg5 zIHSdqjLr_pZL;2qzH9HIpl~85T%3~U#OMreReTvF(^e-o9!Qb9;j^f7eB`l@<%u|d zH|)db#nmd<&#m<{DrJFcX|b&F5Njd82Ny5I9GjY0x}G=_B+LN7_of?M!n1@^0lGeG zpSqzAem&I!!`&K-G%PuRk~edUGMxa?w16%OgJIn*r_mj$lV^B<1=v!9Im;S~HbIsW zR22p*lse;8odsPoi(k4AS|SgR5OpR0D-D~V{8nS5VC1*E(cEfW%zXG znBz`N|H`7hyEO@L@p~wWESVLtj|e|g2lk5sp294@^II*UOmBB#6wG8!-Uop^E-h>H zdf41eb2&A6}=FiS(t~FIYm8f6cRuWOYlR>UWeic2g?d@?*H&c;qyHbs{#3;8< zFljOFI`HwI_Xr>HhP!Ot5o?K1wltV<(l6s9I}qN8>=OYH!e|5TTXIb!T`XU#5PCc` zhSu&|+B|5E)~=a4R6yqP5Q0uzrVwFBuzZ}=P`Kt43XnLi+k~vn7nEyVKHQ4BK z>10PH#ZIYF?4Ak4I|lSj*s=hKizR5Wb!K_TaRi9h&kxjj?CW9%(&4oZ7bOmtB@@z= z;R#^E)sz59ms_w7mz+pwBwVCKTZ1RApv#T}ICG74vU*%DvY2&t9s5bT{9K-r+TOl* z%8D5ZC}jE#xfXr|TOUL)AbIJae%G+PFN37zBnbFa@nb&XGvuy9jt3ZFW;4%mW3*Ah zt>iE9iT44%f0-F>wHwuxr&g2ro|KRCkW2gn5uyPZkngD&=vg3vaJkaxQ^h>}_7!_G z*||kwAQ7MhmeUBXFJuJ6JzMJMQ3wi9!jG8o2*KF4GMjo}gh<47O~aQwI@e{lEQ||d zWDW~s-8og(PfYvqYm@E25F1}`Ih>(wcJNwQ5as@WjtWRw^NLQQ>Jnk-ZdTJxO_zr< zsAK|8-gpTK4w>rSO;O!eUWz*5HP^NW-ldBM-BP>@)q2H>_BYl~i$(ioIX6#yRepw+ z4ii2$ZP(j3uM^U=Nd@aPPKyOT`~|i!pk8(iB|WLz-He0o_cc7)DO>cKfNCI{no*=!U-uqx1tws`e?y!sx5FdHK##f^4(1*zDT0Co@6#& zEe|i-6^UW7OLtD46~9|}9n%-_@mK`&5s5pz7d3@xh;O~}ANCj#!UOZ+U4r>*(P$)= zuPswC92axnX9>@Z=)SVa_Z&YQ(c|wLD*@oTc;j>b9Tquxfq8N2jM^12#D7aWx{T;B z2qb_+QZY>*Od@gz;~bbsvY0M8^omZ42)L6mzwqnzTg6|B?Z12_RQTl38wArS;)1I0 zI97I~;hQ`#drFAuVvMB_69^)d=1fdK`hFYHh9_6S^Hw});n7*TkjWoGmZMGWRfb2f zQXwhaW~;`{D2gN7tb7-LJ3X|_bbn|1(^qHqm9_YQP>9;vCBB1 zG^mrxV=!pQBI>i$a~R(UPxJ}9sfL=aCeyVTLw492Izz6axmSbaL|vaJcS7VJJ~CfCY0@QU@O&ZgRZF zk}emz6y&u`u}_(2?4qZV-I@P zz{L}ycPHvB4$On877gT#Jp@ZtEII^!B8N?i!_N{ zjjXk|AISU}&^{2m_)9bP(Ch-x!}sgw1OBR(9z#Jb)5ZyF?^c(2EPpl8v1Y&lHV0?U?i=21 zK1>OX6NzU&g#x@OgvFi|SrKJ2B%cbP z1V)(MgRt0`YujQ)f#BBy5OcNrI_3nJv|=M}z9BQK3mrKgm^1;C z-9T49GZwBCw6-VSlKhyLe4lrGD@g<0-TLf6WRRbq072p9^94Ev%P?pWL2y|s%J`6{ z(ow{qd8Tws@j=n_^)DJepNEO8T{plPzrG=NXD!(F&X}iBi%=B-mla~p4(lR;5J&LWxQ<9M?U^A`=7dW^$pq7j=nDbIb zf3uay><`)`_d~h?J}Y3?f5v%?aEwPThN%?DeGb9KyskPsKy&gMvuZ^Zw;!fZSq~I@ z*@R{je4a(6!DNUG_s{!^McSrZsU%cxQ+r1iIpm%NR2fTNb!}3MEJ(WKC8gNi&D2Sr z!5+Bz<7`zm#X(nRGwvE_Oe0AnvWD7&M8PPK3qQOjodpE~lG%U82V-{X$d7>cot@So zg3RCCjKy@~)U_jkz{0kUd+Atib+^KONy?k@b4$$zQ z7x()k_x1a&(=_kVc)}?bpeK}$IS>X zOkio=^W9J6zT>-Qxc4qaCm^9?FXs#NDtg26|4&Z;^hn^G>?|2Yi%=W@aMno!GGEzp z89tF%E_84pr`pi8^0?##fwgtqRKuq<`Sl3On%>59M)~nO#YU%k`x=7^{fgf>%}Ld*{-!!UK_ro>+(*E(KX`X33_pS0^w(NJ25Z6{}+AUij>oZqrU`_Ddn9a+}(61^NGL`+p zOYvmd$vb<PJKv0u8#7eP(?;UU3lC}7uv*It&*<3~pmsSV0CU7RD5f02qh(}Y91rrn4laagBIWKOWl8`GY(#eFlU&b_l zS9U~xZ#Y1F@}|fY1I4r9RgPCvMS>GKWGMxB(Tv)oB{gP&Tm;s%3ANsAl6f@hPyzd0 ziNCu?9wy{F+(Q%!#6WgeC`|OSUx;E<7@O{-w_R~50>|z)cMPD1!#NLTK7BSuwxLM& zL@bx7<@^+C87DMt8udeERyr#+G-LC_I9I#L4{uR%`x#k~1T1%1#n2Alj#xwN=GCJ3-3t3>_>?kr$M&{6b zA2L)R3k77aQ=oB1Rn%e6dk}0yv@Zj1aIEEifWTVt{X(e0v*7DN{vZ}hCOlwR0Es@F zJTpTLiEDvHg=V?yE@9bhn!^0uJ#B3d{2>2Vmh&6l^hGRtYdLw6+iZTN)D{-Pw$F6ujNY(X=?&$hJ=NG&7b<|CvSO zgsOj|OWI)=*a;vyY6#6SM-9NK)Sc!;)rbf|y=NAl;@~5m=rF(<6F>@TI@p(jGZO2H z)86NtA5b%8YbdnpSIKYx<@%c#XfjjVF@xh*_Uj%dJnoq8Mz(Cu36yE??bYT2m;8A4 z1Jh`ExDcsRrUEI-PC{r-e6?APugVKCa%EY_jJAA!Kc>N<4X(rwngM84mU|j%X(a1X z#(s|0uGjy0WlqtwC}0e9HFw3YD4C?I^+i1mbeYuL;(4jJ(1DfbGRQ77lGFC%q5z=H z^vC2w)VHx+t`&IXt-v*&60@a)X}&>PiO5AHD&#RFdUwN|e z!i;%Vcl^JJ@{Gxc7@N@M*K~6WNu3muhc~!iZ(98Ags!d5RRI`zzId21KoKaJ8}++tapnb*@2C zIEs{GD!ra)=$Y>*TH(8D45eIiQvn;Eh3zMQ<5?5TcHTZVnfkxMB4K_0Y?`#WY)+Z3 z{WYGBnzkS7@f#y&*&)_uG>$~33c^pT*R%qtJjk+;;+jtJEu+-XWN->ogA09KF}Bgd zTn+VEof7@efuwG1nwk@RLLSmK!b=|Iv`k+HKlE|11T-Glxgb&gGadkX;c7)8|A7rq zol`xlDVL!>&#r2f%}CR@@Z)YS{F~#3HB&<-+7h{;^kCO2$no81F?d?29Q**Jf5#T2 zzV+hzh8o}Dn81jA*a`Z0YV{x3SjHQbZvxzoZ3Y`6M4C{5WCMuc-!5rIWpQ@oH!cp< z7TzR9F!VKHX|5%)BLG5n2I?=h>d=NZP+KOESYGK1>7Bt!$iz=Nu1hK7VtyQxF1743Y^C^?%zz zt~G+SPhJzYblLYG^gp}@9LKlA0+@R_;#t`p5M~^H&+=^r^#jf;5FGHnyqS?iOKla> zcb0#lya0NcwiGf|wFh(9_7Fy8eVp>Gd?0hcYKCGg-F{CGTW^a_Uw0e`+l3>M1LSfaJCj>hY zx?IgL>lGyB%m}cdGwS7|Lxw=V_%s&93Ffr`mq%b>?Hd}5fPJd6?O20GXYpZ){Vif0 zVqDox-D>8s!8pFbRg#M-5lCaJaOaw?c%@%fh;;8UVRM=PKVk6Pi z`I|H<8XUfV8#5n7nPw87O&m?ba+zp-veJyrS-#)35LAUGQuZOV;oXkrq{g=z@Gw|E z*`2S{W-ed5>!$4_4Yc(y(7Z1+L9d?Wxh8Ki{L~2qiTRk=g9o~ul_J4AP`s+gpi zXIB1URM)|*?s>H#;MKbXBZ5g&ArcxA8yma%vxIg8JYCpBm=4-FJflGwHKtag19@j? zY0KWaCo?Mi*VZGx6bcvIcXPQ7>+IH`->h?0bSdFmrIil@KQ3CYiRU00vAJpmwrWGo zJhK5BC`d4CPhQ=Uyzi1}mW8Fk=@FMdA{FFP<)%uv<>b`ortv;#tYKYETy1`(EOMH$ ztoV}rAPmC@`(RGri{w*l2kN+vtd$Oq{M`u@Qd#!PC+(A#h~MSkZq$1j%0}ff z)Xt{~6){WA=-vW9;YFwiivIUU*(Bp<8WOGYCq6l2D&2oxmXpAKOf zNExFjFE6Xa_gat6;Y$%)0B2M|wW3kQto-?pGS=mNYhq!`SvM+k7%IYm)fGEz_Ki`v zX^K^*5rx9`?MpMmdm_nGq2LZ^Z8^f z_2apQ3Z{?VY7ANS$r`iP4xk{w&*SkN7aWnpRAoRUlLA(uc=+hzl9@vn?Bgv8Eva-q zZf{*&wOm6E5Sh2^gv(G*%9D7*?BtF*-Moi>;}#XKl7K35_#sYEciH2#*QZw@(d!FP5sTx zj9?%jaAF&25zR$X)#r&97JA)U(LauMpsBJzN0g28k-a>={>hD`s6ea~_%d%ua*6pE z7`XY^xu%%4fZM^XP%*$JSJ}eu*#K#I5u2Ikr+qG*#Kj{U1(4kZOSiV*Cw9cEdGr~W z2IW|RWuHga?1`?6#*tk4ZVbqy5NCHJzu+%=p(zv+TydX^lu4EmNI`g-Ja4Ov!7XvI z8ej=?;x*3azvA_d11De&U=mza=GcBqIJW4jy_0C9Jp+CwHo5J!4z%Z3g8^Cxav^la z_9JJV#^N+qfWJ8&DteD~jfXQNkWzZshFCG{SNukQH-pW18wOSGnA&4#zeAVl^YC~y zfC7!S3rnxZ?UByughq9? z@R3I(3)OE0o`d@rw3d8t{LEGe}iG4TpR#lF0gpb^fQZkZ3pi zEnv2Uf7>F2ioLIb0t#Jce+PRDBL2H196lDHn*XStXhfLILwW79{gHR}>#q$cDw!V? zbSc=}kW7^ro5jXz1<*ig4I6TOrPExWap|t?N?^42jA3JY*!@VtR9In$0jfN(!cz6+ zNDp;MLg4Jpc>U8q_}RjMA#!Zmj2nb+15k!!Jq6xov4=W2GEi9bs_@A#ToG5RExqR~ z-#J#jA$*;`3kBfmAcf5B*3H`;fpsK6=59jY^cL_6HdhCKNTkqk%oF3sEzgQy35!t00~jrx zn`(Ko!`#XFg?e<_wILC>Tg(Se2#;h!+g8Hg&C+S_NE!dYh63O6E>vxUMps>-Y0aZ5 zhXXH=%{hdvIP)}|$a-|^q-6vtn%Jdeh%m;kB$8v!Ag}A3n|u zxAP1hT|a%@tdWCXxAzc~-qxnf0SK6<-c<#FiRZ1^7c|-$$WN)>+8Qy>Rdv&KA*U}b zY2q{?qbsdDK$zVuCRNQMPu!-O;k`f{Dk@(=91?M-?pKoh*^egA7fq}76LC!`jQ{q8 zGN`lmjbkzv4{2Wng-@stpn4qHZ_!X*A!HG9#fd(|#&gu+o<)K!Gm9#i1+XjOK5Wt> z4z{cFpE(?HCn)t66|%Gl3jUSOmLb1yueee3(>eIq4|DR#n_0cZ%n%w^@}yGGUxXWk zQPcIxsUWxJr%RaUuhveMKB_NcH$Xe5q@bB`WQMIoD?%rgo5acHKAYaTYv)5KlfldD zpL=i?dH8{c)3b93V?`~a1OP$buBOK8K1>AVoQBZz@0BXsyQ}SF6%P2|`^5Vs>?Bq{ z&$Dd7kBP|EHoCeE zd7{BXJt8#NL|343Q7b6Mjy>(mWXdUb7LJ{07ICeS0eB zO=)tt^+F09>n@*ZvzLE$4%*Woz>Pe67&yA-Oy)9;EWe)(hTCE#8D}?Uo>t}oz&-Oc z!vAyM2b}Es=^-(J@(9lVl}GGz-3b0i9-*_1F<*Y!Cev=+D5VcEd?iG~mIsqaxssgX z5c}yD8EG!#5<;OEYQHBSe&8%UGn}<&LSP`y!^is?==pHTDn}OA@`Ej#kxY?t0X6|c z31x*Ld%7gy_WZ9oov9jk3ay6B``K2GlmBTbt-LP25vnv9FW^Ps?d4>2ZJt;P!m-;p77qX~{%9h~|5RIhJ0sH6kK+ z5V7a2i4`S|Ntporx6B%8LVTMPty1#lZwb46c!0tG5af)TEL5nZ(XeFFNT^yY*k8%P z^c^bqR!ialRcmaf`EJ9BCM%N(`n5A)zuyn;b#=c2Fs~wgIX%XC{Rv+7DyhQRghw`oJ z#pEm->Q9~iEiLl|9j7f@LI7%;>Yq(A_HSb#3+PYkwqem91F9MWJ`~6N7`U%USujIE zj>r6({{V85Okz4ui=S>ONF)IvNs0MrQkjE1`ZSTAb241d%*#JfQ5N)a%Y zl+P-KrY}O;$ti^fCSS2dc9lgQ2S%APqZ1~4y6NUToe-Dx_7IRS5A8-_lJG8&HG^(} z2EhjF;80p1)4h{9U7{LoE6CkmjtuDa&BG37u2ry^FKS_L^zI_8A)G)zim5h54=U%y zarC)`g34h*1^8q~P2@8ducPNceBVb=K}P-Se0EbzPFD`6;;h^*p+18n+YorA7TIl| zPv;CD4snh|=$o_~E@_~sJg^3IN67qhN0gFM!;D^AIg;lX>2o1VBPcev09ZV7P%;fh zVU2!oXQ;%x4t*+GwLviO4VK-rU~bE>{n*2I8}hnA!^>*_P-69h z+4Jg}6uZ{nCZFq+dr!OD0We+FG(M@of7Mjwa6HE&5QuDbq?2NFsNi@F+S?Wqpa2O{MR+QHo)GcH47v)93Nbd zF0MzmosvKQ!_p>4_@Sus>-h<)ZHao6^s|$#Bp3?&5p=mJO*DR=q?)w;(FRQO7GZ3d z6+y?ZhDqaR6E>Pj!|+dCsI!T_FdO(4A2-|#^t_giBqkRSCCythGr-n3|c>X}>Nc{LVco0Z=qjeo$LEBsd{r zjDn7DbCRQvr3sxkhxoer3TX7Ae&DP2%SBQr^zBYLk7!5gsA2u(NF440GR6n)YZH%5 zow6rVT|8|DsDNY3Zvz#QG7E7VsvN)ta|mXn+Gs$U5=r*>jQNFH)h-TAnd4`FvH#(c zc<9OHuc?~N^oihm-)}P%;-9sVd_D47M-bg8G(^kjLum^&*BCq!$sQq%%dI=MAw6x1 zP)h{FvsYw6gILZvog~Z{=a|CefLGnK8jbBJe7BtoFuB2}U=tQChRz%cTF)b3m1}10* zAzxaS7R~}kTKALv9T^xT-jyBzRpY%BG696*KpvDcI9RIwAl+m}Vzy2-Pcy*}blVcB z#&2ggb*RpG@3iE}iJ29wd0$`|E=#2UIi)k;dm*sEIaxU~T#&#y0FXlj*Trqc!Wk_F zu@2H|WL*T1{Rx4V&A z`Xvz5F|-^)z^m6>>tNHOMrj^ArMYqEU*9ENt*b0JOdE-MdHkD?cjDz87bcz~hTy7! z{HM#^L+=|O;b3rp2*xl%6f8jsjzx3-xKs$$+!q$=6nb25hYmYMYJ^q%Hu5&2bRtk3 zD+;WIwKro*P$KA`3+R?d9{wYUKhhCoGAQNYox18y<^8iqP*i*&Y%U{$Dk(Q<{uk`J zoH;pE6)i-bnWJq3al7a{Z6DFGB5j9E_+KbSb!bVAAcIS8UxD7X z`-rwQCN&Uj9BD%zub>4*kt1oyZtpu5L!i?*S=evFWpnff?UHS=(-UZQLKw0uBQA<_ z_RZj?hB#!ml6=$&?8|4R!Gs5jQila7eEr^+YhZz6bD`_y-NiM?#zVnj@+P|)L9Yu? zZwG=G^co$$Rf}s|B6{hiI5h2KZ>ln6qP17$G zqO^)X%r$dS(-P4f=A46Dmkb$jM!P5XW^!u^!w`0+nB{p5Boj@jg;G8(3mdy>sD5+t z)iB5k!&;xB%+?e7MB!y1aa+#2G+KbJDV=AB$DUa29}`DW+$g;fVQ&p1Aix2RBlY|- zg5RdlnmEY^D;sO8qxAl(kC69%X>+CuU5VZTzhcabtfTK@nJ#B>cQ_=gt@5ob4XO23 zjK-lB=*$0B90mb~#nv&tC|nssv&s_HVLik{ADac>@5wz%fr~uZ+H{dOHP~+$1z}Ad zFoXo@0B7Y#akD~6xe%TLkcZ#^^%2=SF#n^EK!!CP$vHYnq#AJD!$2Z-1nMI!ruLfu z=_A^8Kf3?vBZ&TwK4NDx=NpOmR`1#j@i)hx&WPW)SPtVVl#Qu`^$_ez!N{DW4x4g! zKqbDP>lc&?>9iMtZNm}3@gQTs3y92!-{1i-Rb9Uo-VFQm$q7;k#PjqeM(K!)F~ae& z-ACVQv6ZrS2mBo|3O(_i<&*@6G(~mvbp??GJq1==BscenHaf6$ea7GNX1M4aBPq0_ zIaxk=l1bLmG=|?zSrM$+=#Lf=t~2V;{UMYucHZGBb^gR#OF7TV`4HIH5h#L*ySD)P z)j1vZ1AZ-2px7aB%)@p&6T||m7wA=S)Y)*Xt_<4I$I;?zsbP!s^3qd5?Wp}V-=`nZo%{{e|4?*R zHrS+%bNzL=Bp`p=0x)6gniT5!B@O5g`_(0_Xmtd%V0pS6NC$l{upRv|nIB6h#lOTJ zD&OCT#eK*Xj#5S1y7+EYSY^s8@&*rFeYobAHwy!DhF@QS48mpIQ`X zo$gs53@+YOA!OZU-yjF=H5YE%6ZpQhhW?>b@zOSR0+2spwd|(H{imL{NeEc^r8-S=^ zqph_r7PC=a*a$~;bIIJ4=Hi@onn!_0!CH_;+J=U`rOJZD7K>{N5V3=4uqH&QA3v$U zI^2)f-uB$LY0OO3=tyuhbR=;!o%=i1^>=fN8FjeGpq;+W3Zpi%ew7PNX=5<~Efb4O zs~g<|Drl|C01Vm~)Rup=_f2!E8GyEwn5mE&7zydjm)7VOVa3k%fa00xYNu2LO2;2O zS%yWcmh5>$-XNMTV=k4E7&a8=8CK&H8Tp$Gm?Dv&Z5I|I;cv4KzjX()KR^ZF|J%R~ zR(s`dwfFhp&BBt7e&qCQMeJexAA`}YqTPxm$!cp4<9@^tfC)klR>WyC_H2f24p#GG zeU=uroOf_*+1!iQ>C%SKkkv&KZ2ytRHd_~uQ3T9=(myl|C3vuQDD8~^afiU`VC!v5dPc(Jh^PzxPNWnwmm-j*NHz}mp zJQ@=LAm9D2qubZ=gFoW>)PKYs5Zen*#Tsz#wa|&-|0y666B_#?+A62{RqsE4^R>y0 zuUHYR4U|VX1LYAS*;-n#9vx;qnd{9yQ2Dof!4Ntc?Vx0QH{Sg1iI>pMgKOp>5CU&= zz3%kS%WQfM>kkDJw@(@Ol&dL?4~h54yukKNZap&Z7phzDKP5T7TkioBJIf1l%Ds`n zUr|5&m0$BMO40q<=VIG{vF=$K0((-k?S$db06Qes-vxl4k%r1YmpWwn4#grMu~m#n zAnP5QOG1-=N3>i5As71$%ScSwzWsE2=I^*i^+FsqO+QUANg}JM#IKq?I^F#X1i%4| z{2L&V+0|I``M!PotKDci`ZF{6T=$mH z+CIs4h~wz={nkOLwc-v)zsfEq+w=GQD7eiC?_WOd#*{SRqZZJ{9w3^LrW5UmHJd8G zL$+aRAUKV||C03CCR%jf^@q6MuWtdW@pmLV!q9>-c~hl`+60Pusf6d~6CPyAX8Sn_ z&^mg7`Ury$>!1`5pgtl%ahALFa#q_GXt*<8Q`Set2EZ| zltCy&s|p&a-1uw@X-e)^uPHnNb)+h90|@THc6CK#6Jo;3V4gg6wB#N@8EKHQV5r4l zJkTEEh{L^QW%JMjg4#t9pnKYS{y;$Y=-9orM~58%4n;<Heh4b!V7;uFN8i)Cp@ zQtL^n7>g>~|DrG-Zis_>0$d2{2&!Pax5~+q+V|<9{WrGql%cYL%^o17y=Zmu9Ir3H z!|Afr#+>kKT)0t&B;UCcGL^c~60@Z$8`)6bqug=Vq!m`2{adaSNk%BTep`6Mw`dBV zmT?V!K4y5me#W28y^?r+-iNr@_?w@Z zC)veYdCNtc`^}~K0f033Mu7FY+lu4!O^O(8U#;WE@ZQWdG-T*tKi@G$7LCbITrki- zBbIu-WtKER2&VLI%zus^a4r`1e_?bmR-TL-esJ!L*f0o0Kr$KS|4E|j{Wpmoy4B|y z^sw`!(v`Dr*F{c^PhNibJ^u%FvTw1aoD3->eJ$j8KgaLH&Q8)``7IjjQw6*jZ#6{` zdZHKz@;OK)|)@aSA z;GAoKXEqvg23a)ghg%@Pr=*Myrh)*PkMyI!IPaW|QFE7ED1vEA!(aYnu4RD@m|k(P z7$;!V;H?h5vAr&zHJixFXcyxB$wv_m*Q4ZQfIv-|(uR4K;nJhohFgx{1_{+|fMB6U zK%$28`_tzzAjGlBB$`J&S3DCQOedJ79in}99aO#9N2Hi$8Br%49p;0uB^Lr9_VX-_ zh=)-h#~GQcHHR+Ia#4*?PE~{}qRGP$RS~u|!6|lEwPwOs1##l_0V8jpHq#MUZAhjD z0`N$yd=LcMD%%J2u4vhn+BLBvb}RiRK$aBY6#x5}2;G$FwCgJ0757lZR8*(dXgqco zlTGZS9RG7-%_;~_y@~|rn;-@P4}b`)9rcNx-n4X>eX8GhPr9 z?Vxf`we1r&t@fp2S;?RfMx38-9O;b)#v{a^;cnSc5T}=j0AVr;_mM5?(XjH z+Taew-3t_VDDG0+9f}ty?hapi-Ou~~E6J9XWF_02=RD@VkAbH&aQC+6nrXx+Y!so) z-t}_yj*j#L$b_??KG|wuX!K;{_#4RDtz%RzoLj)i%=P-S_toPQmc)|S+8ms=aZ?tL&|9hST#ptug*c$$NydYWkgqh#-?zf4Lx7&@S?bwsCm$#{# zF69g(Wnm>@MP+3-pi6|c4nZ>&+q2S&4ZNleqVrz6odYf8W83SsW#(6%UOkwwozA9S zrEO!T8S{_d?;b4phU2MZIrLdTiIoutLib<Z6)*jeEL3l#OG{ew6xxuMAp*@GFh?RHzl;v;|NVrN34MKsz)m>4J6e>Zhu7PzWH{ z2nCE+(x#6gp~@q22C`zr3R0vJ6QS9LC`zZZl}JOZ%)Fd@{dfXk$qrob6dm(bP(-N%zj%?6uWiphzL6YfV|_Kfn&#L{zairtaUR#fnTeu1Ckv{~2CXtI+rR6e zj#Oh=s^!p^+_{8frjB7ST05}!M$09Hyaugka-KkNR(6aw(US zt)rs8)Hh4G>c9W#wiIi1pMwQu*?)z}FIpA(X&y@oyFtPIR=GXm8~lE~>w}sMIp4A` zn(b#Z;xoJJ!@{9(oFWX6lpcigiW>!ICZ@E0+Q;}t1_xIhDuCQ;>7sS8{Zg{>=|{}j8IU#@FSl+r9MwBf=@p&r3Us_ zQBu(>rxaP&ESx@<1Kd9o(su>aA})hJtUoWnONYkUzPrNU zZ9n(9m(2--K7Fe%{B#Ch+I;+pHw8)B&IVzj;m3=lpjbZq#svD!oy<6xpla3gdgH{4 zrm0UT`o*aXaCJyb2riEQROJxtycwo#kaWPDE$0m`)V}R^?W;KmyM%4bh98XfF_;AF zRM0Pp_oA&QIzbNY>A6n0551Q(a*d^{^0{ph>NF_nPeq;k(FgBtWpEwhfbP?GzO#3a zF>#A}RfVEmOt`XoIH-BDp#c|;+`^5IVLIGjJySO(eIBcyhxOUuH{89G?GeEKMLy#;p2Q`r1Zz@TJ)BwX{;dPO`)Dxi2 z@{dh>T0^5JIv6^BYPj#BN82A}FC4ag#uFW5D&d>U1ke8SUdB}ARnKl?3BYHXxP+=1 z1;PTIpt{>`vdn1%0zv&;)a@FeCgBX)Bl!v_*cba3@IPTun3m-~VNt7Q|C~>!u9@Rb zoljToqK-`IloT1#gcCu$=Mt{Oa(IcF&PrlDPopY#1VrTTl8Z~`65O??NaAhGKrt5I zIF_)Yhn7r%&K#2)4fauH&|vGh*;HqcME3-g>*EQ=`kH1bf4%~&9C&SUNF^@>zg%BwrDX#- zmVac~RJV9Ix_f=+Du4Q^D*88l{RpoO<$F~c$3+J`ME;b`WV!R&1p5U7wyE7vq8MhRW17hi{_j5v#Z?GR{8In#FhZ6H&zDg?Z~vsiO}kP2bC`G-K$ zb2W>6h#`m&+UV1xB!Gx{$aAZGdboe{F1T$&<*I|WNP8tN7fgBd<*Ucj-0rCFex!b7 z#6tHIDb{du`S%@|el=ft_`#T-`0P`@ySRA{UhF?KKCW^abM+0j1+?)p5xi($;?9DS zj->j*(}3^<-21$PMRe46k*`4z?A2P=Lq;16ipwZwd!*ok_bVJbjlfHx0Qqfq*kc>0 z56zm!sOxYSq=|-u*s6-lR+(F9)UJwQ1|rgEXV>JXPR~~3c4px*s&dk_kwEpB6Pm-YRI;`qjWgwBSkVTnv(chd zl*i7{`78(oO6W*|v#7(&p@Dxv{+yv3206To*yocww4h80-$jcQHj(YsWLc|gLnM&} zk)X-O#3?dm;fYGT=DL(F1t$q#`Foxz!ni}liPqtnbAfxBdv7StIm2L5=@1kzzNeil zpc_*4BeD?R)3F+bH4-tQ5u3IHbAXGKsWGB567e;eFt)!;JZ0V5ei}<;h>e9sB%!oo za*%qv6{TA$40c2?RUm=L>N~yh>n%E1MjN@7fGcc{I_tJ}ma1L2KW-^AIpiEl*$P@H82bN2 zq^@L07D0b-E^Mi$AX{`WjAw<$=~t>n`in-OMN}MYf0mDRYBuK%@1MERhY=E;MYO^a zFk`r7-$g-;!ml@st1gg3%&s0=`5gdt55IYsq3oo^>SkND%4rjZ(0`|~2ga)j0ecPB zs>gFTI~OHWtBp+`23#g}AE#t-ZaWW#vql4SD)3vQ14#?eeJBqAKjeYR)bT#uYq7?- zPsU`&9MbX=9A9zX9*GzoKjp;XVSSW8l18Qr3}8u^##@!Lp&=<1w)12nDs(KM!}!q# zbU3l4*16tcbTZ3s|6h#ozic-o7w7-siMZMS!xLo)v4JSD$28!a6F(`=D(aeP9}>%; z-F`h3{_>~}XDChIY}Nq{ns(*WF@Hp*I3!|ElcE#jPlx6{^OzGFK=b$r`wHfC37E+y z7Hg>CO=5%pKre+uG0P{(Z#3aTnI7amwV@MRYMx6Sk$w7m@Dv`%uUR^dZ%F_lOYxn# z>063-)7T0eFc`~4BqS4pHNlJ!=Go5e0}96d_!HM;Xr7{tt4Rwy15RLK=k{O$z<SD=`@-&9vLd zvIedH7R$k2lIb|>hW;M1u{gi%MM%Em(i;gy=pp9F|kN&3< zt#wYoX}{FfhRDCXfy_t}s)lp;jy;&W`V``**LrzY9fXy)^yCh`X@|TGC~q)F5HUKB zggOM|`QD9;eeiA?yodQQd1PoE*OutoQ3^ZKvd~KJWyqU&hF@x2f7-9_=F@3_j0D}} z%DpXApTzKaey9&9fLIlvRc1vRQEu|}0`b1D`A7NSUxC|>;;M*ZYCp6RcxZz0yWzR# zPnNuOy1fPm@P;`1hv8f__4O!D7$K3WhI@b?&8QdbHEo@hXF^9c{5AX31A6kgr(=`o zcy}N)TpI0wgz#>8nON0k+e#+lR@DIjZfm}F-_BhX`}vpo(E9BY&}vFl`J3^Te6e(% z>^^;c>HF6_L&n%H-oL&_f;KQm>Z0MuV85T~_nnBPE(*GZyJC@~^vVEUcsNFA8GnIN z4u9>Drb`r}3*JTpDPJEWwztV!!3N{xE7!8rXjKtk-Nw~SCM6Xh3XpMD{Yj^&M|N`> z+g_UTiM6R}o!7TCoRRiZi#f272~&0V_uCNsqs;c*%^V5yWhSQD7NQvUKbE1OW~X7T zlY&fM7|nvXgpOz7am_WgB@@8ZPNsoWWT;!f2p)9sx@hXB0XJW4N}frMaA$lWoppQ` zp7rcnSnnzTDk79DIt!wyN#T&%*T-(nr7qw4JF@#O{QWp2_GBl!-b}V&^pk)wTR^9Z zA+{EDi&y#>VbJ>Ohu;!joX)F$iH5W5YN!M$W*6}#!-?0%jD;!UT+Im*2P6QyH!zvC8h#S=A>Y{Q=S0y#zjL&)YEBF;n z$dSuyf&npn^L{yYj-wMyhcpD*FVUU^RS|GM$}BZcVDJi%AR495tv;oRBFDx(c}@X!XRpp&_|y@gMV^lblH!W_$HK5WrnO$gRyyt3$0@F$9*A~qL~ZF9vBp|$_^M*J~!s9bQ;E2ddx!F zPy&sY&mRbZ>;3-Lp4-68YZC}%^t0$h8p?w#Y5yDhaQ|@t;_#pguR#pT3{2d>nCltO# zIl_=x^Uw{#5`}LSYwDn$@ur%AlUTS|r>z>x>x2&H$YRwuBi?Oxj;j1O3->^?}%%zh3K&PrdqX^D47%;Qw~Ko9x|DCQLunFnbgGs zukKUn-q5?pHXU=7oS}JYJpd~fFjI>2b4AS zY8=agOCYRhw)$%n-%rrAr?f|<1nJ7^o~n$^PE132|3 z@&JQZ6a8v~^LtM)VIiUMmv68AdA-mFm}p}D8$8)^`4?|kqJ8&yF={|uT0Hhg;$-jr z&;Q+?L#+U?!8!l4a09dDzk!Y%L6;v`0_!4^H;ib4l(q{Fvt){1p@hkV&FGE@iIk)1 zO^z`ikI2NymNh?hscRc(n&7Jid>HX5|9lue*vD>nb`l}~@63?~@?jM1Ywe$kpVt37b4Y)M z6V7Uu*~(*A~te_tTFQ3OH)#X6*yn^l7xsWGe>>r5Dd5+qeMoFP69KqF2= zvI}jZe}0K6s6`5^R6Xk`nQ-Ko_MPelkYD2bKfgr8&v-O!HAz2i^7znICG(BcfmFv* z8_ZTl3+^v#74k&`qS?(iAEF??#OM2q)iGAc)c0^I#QOrLTf&Qwsf9B_AgJ7G{u5~s zjUgH8Cp<$R+~l)nME-J}A~5vPeuHrk2EEcHfRb=<%YfseJUHgjY~`O{BGYp-(C~rt zs7A2notkP{UQEaIf_lyVq|LvQgKAM|w_Iv|OXlJt>iA=;$Sj(7_531X>7nD-!tXS+ zwbLKZN2wPr9*7Y+vR+n4R8LCz`*MM;Tu*k7S&G;11-uUWm+jJ-Jy8-i%Vnu|10vyNT zzhaSnz9NYl_5DEg_8;BuV`gy=DiRhbiE5q)@;Yp;M0vIzS4hK#>}Tt(yD6%!EMoj$ zJj_R;#WypGoK=dzH3G}V=P=!n)r@Yh*JZ3*H!;fGX1~yyvFTP=dm`9_;&Ue}B|GEs z0Ru}ce6Ee9%Epl~*LSEK=bPfIQb{(@-NYCi7yeD*so?GaX8$z9Hid~-xvwCLz)Yjn zoUcz$d*AlMa|lA_P=nPGIWDa^134?|qzKC>MjR3BpEv+WjZ+y>?}pPaL)n0NEejg~ zswYuSvru=g+;qg-HWkbLRWC{ofi1MeurAnww@1PB3StaT9j!;^7d{QJF2@+nwEZm& z(&|;xRKkVpe01p@6;w5Pp*8y0@B6Zua+QasK2O1cg0i1V5;OD&0Pa8%8{J{;6|1Jo z@#;~oSUO-|L<=pgo}UhutX+CpHHtg(709cR7`~?IFiBo6ZI(;vx#us?w3tiGw5k5UG}>_mWmx0TJZm@8kr5| zvwo(@49B`UQjMh%#UaHRmi6`5u*3MsiQ5Ihjjq;4r19u4o`-@o4knzdCo#{~?qrDj zM}sUmVX?co$hcf4tBEpxv$#|`VR*d+gMcF*s+Ub%FGJ1YF&ac69!fp3XyYaJ;_cAB|UKhd=4qjZ-}J)?I&wzJZ^uQ~yXLYUl6* za#)g{NVFd&)j%@aY%0Q~S+*cIW>utgt@=D4bhydDoEr|fL$bk0=FVN`DB`}ZLa3(; z)})I7``j<1DVTByBJ_ks2#~ZijiTR8I;|S5wp3nHsYPj!o?0t!-4Y(_WwuUQIcPU1 zRy`N2;&mxXm3zahHQA~Zubeu#kj;C5y&6~x=oo@5^L;Ynm4AcTlLafqV)^l+F(RVp zkNnqK5mZMG?-1;a-N>{J16*5+H!dUKn40QWPcMqeSouQOGHai z$Nc1U)kHm+WA4^pZf-2!mF?C`saEC*p(2er-N5q>%gh7k!f-lQqxDhOui zJfUKT>AVUhHuSiDf@Q?ZFZ^#qa5@5DL9+64|C>V519hD@q)@-E)a`r+NNgPbb_fNt z#qWf}=Wq>!mQ04pE@ps8El*C(D+JM4&m@zY&*aj{0pWKf7rgu{7Xkbf$h8oJxhP-r z5x??$r;Addh=QeR3PKAe8-^IeG($t8TG-jYlH|p|HPu`C&YEQR^mblF-RhC_$JU^< zbs$N^40z{z<9Fr8_GFJb0M7#pDI0_N2TK0rejJ?o4S#$RcC=6ORb*$ z*(4=6sx%a0_^=hIhe_D%PxL_zNq-_t`Ky82irC;S$?_l+YZ-4OzBC153tJ{;ExAOh z>bzZ{=={YW8L2Dwg&e79TpYG_6~r`xR^0|$xgZPmvG))~gx`sSIfv-wD!B1E*AKz* z7Gs}AJ-Sy+U`Nq9VY0J8{G+wsP}BQ@qfQX7y>%O?6rwVFi{q$}l&IgeFZ}SkU!Z|i zD`h$Sp>1>y#>g8k;`ACdmW5_5tIGx01BweV8=96VYtB&!luh3V9gC?bAaV0{Yp8IWkQxOaSZkNF%`+~h=m7}()CK%HqBRS!u;P0wjk{S_&h zRf2QkmYu$K^Y>9XbH0bCS`rqLHp)q^-6dP|+A?1Y^_iC_JpwWH8r5d4)eLA=u%^b` zs<+akhttXtfBF>7X!P>CL}z);?fir(Mot+N*56ClS(>7ARkL2v%`3&?Q&1%#-j$I& z@No$~)v;2YgJa6w8GvI7=yefwUV^>l--Xb|WW^#PU^2j#{IIbBN2JdDrft1-%#sth z(nmUk2v@E2YnL?%vLB5wbrVPm1B{3EsSMp?Qt4Op)yJlXL?%hJ7HZV4;ur&SuOC_# zq523Q&!2NyzCu_ zV~Z6WE2a|go;=eYU~SoMaa~}3?Y^KhYax=1Hdl8v7SCmx@#cbc`T$`m==m%A(+EsvVLbWwEr^d z3k}Qa$)apO048BQQv-CGGa7%I_BApX$u2)g0HtT+{Z6YJzz9zm#VBqOWgQ>UmK>gi zgbc8~6bv*alferTo)+a+jAl|y2jzu*^Nx1#6*@;YTheSHJ@wuFmigrb&WYjWoye|tDgrCG)=|6V#TWJZcth|y zn$2-c#5W$`+;ffAZW!s6rR1tm@19DHGMplE5HzgFp}o^@SS%APqgZk)z98hqW2z+J z82x-a(d-kLA8MFNXj4EjkCTw8h^RfXVTMJmwXP~ z;0kdXkvUCGV}Xb)F#||$qFS^s8ep*jEiJ1)AfXU-+?IL!rB!INFEpjaLt$)AyKVsxG-3-Gpu|;om6OU%Mth|uFIH#UiyDLN*2L@P#}mau z_02VqxU`ZB=cT^@#J(DzH`{K~HFa&o86 znRa2gdUAq-WWxX++j8HDQxL$)t@z1SYC32|0z7-o1d+Fv3DQ8h#=OSjkX(^TxFOKX zBa+#jR+@{`CX^YhjAX^r1C7Po`}NBZbH0h8zKczBKE z7(%cvblqkuZ4SG+?nZMAHanuZT+){kpj1GKXug0 zAOVLMFZBn+6+)I4CSC!8cc{$`tfZKoLGpVaP9uqTewT|eYuid8hn(8>Axmy5~)2aKU` z7Cs9hE=@_nCLo|Qrav6`?CxUNwG3(cos)w>Y;v%06vE?el}W+iTY9;j&&H!q)7boo zn7C?ls;%XA%mUD3p2@&~8fZnS-GR?aSmW~UXs+F+%GihIZTdNIyd)L((0HDje!)hFX*yryZem0#qJ+0`D@Jxs?QJ?QmHd`uCW zLk<$ull5ZCs!7!>DB2n*@HuLep zN7cs5_(Rh{)?N3+D3NyXe}~mG!pW{hiEW-Do66SYY# z5S>JgmeQ?z=r%5eRA0IS6Gs{k<~F<|ev`oF%SeP3T{pqyZ;7J{I3BD5%swv(xDa7X zDBPW}bb>H+_O(xdQhdFwUzY2(>OBzlvJ+oO!u-2zRxu!vPKSFwAC`w67nIz;t z7?XR^yc; z8(I5GeS8Cyk=bwxuiW!sJx+yfRg$fve|izWfcs%oV(7jbyyxzJb{ld5h9Ir;Fm0ys zkki)T0u#V}hc!6|bhSkauBgQekU`oFtE+SF(SBCN+uKRF)u3s{)HU88>W9t)lD4W3 zUX`JwOJHO`aJjiL$w))!Hh;rAU5}^I4)VT%3zT};(t4AAfDTn38+dvolFptWdEyRZY&Ba0qL3R(zSaE&NLPv4`?mv~P6 zS{__>U0ykl?Pna8Y<;^Qr!s&;?EOiF$ySv3t}4S(l;|%(YE>l_+=d>06=X*KI9He` z+G@)_rNQ+K%uq}a$|-p3U|1+6(olLR&*{>){q;cJW*Xq;d2OLz4U%n0W_&H}hBBtiC zswbw~*`XU4vBWF5OmyA1ZpwT;B&=QAbH9yjne}u3Ufe)Y|K`ptDEQVpR`NW)RVHgc z`d-bj9C5jTV`Axy=L4uc={t~x^ua%!$^a(KPvheLb8Vc1TpKoYjD9$$VC*_>(oa8X zwN`fixi%1Dsrgq2P*Up2b)Jgut?)~{4jD>|5V%`zT z23}Q>dD92_Na#*v1Xo=iM0My5Q7xsLUiAlL+UWAS{X4>}`lZ3xrtId|R=Tv4SOOd> z;y8I|@-Nb`2vG=QXNXKMZDG9~j*iNP+m};)!Iv|(AHo)UEE?&K;eYLXJpBS#4dAcl zS}wzldup77ezPgio*I@v9LY)izGc|DV?8=G^UciB1`CCOUXXSF5`jV0K02f`_6fG8 zhmi2Ua~;kT02_jXJEeh=He+l7gejr{M;kOGiy@k~SXY{b(2e_(_@{6@w*gGoje%D_ z_Ty2ADcLd}BhFe}%?CNXtvf#8GB5x?gb7Wwck*lY4AJK#dr5P{=@lYAPGa zzpS)IwUzTWT656HQItt7``z4>9%&JqkJj=1*u1h$OiKNq^bYIATfeO?{%iD|o9 z2%K^^{EUL?p;CMoea?C`?;rATsRipDFB@2&kmT+dy1^K?l6ge;ikj?W!I1WKIr69i zE?aE+q3%DlqiS+1hNANSkl&mUGMc#m*mY802(k7}qt%gsPS3MhW~7>x-k7%7W#>G| zhER!w_?j~=$E5sj7NfO6(2;8vnU};vwpwqO_njilXoN(J9Hure9+5{^sD$|+2R_tS zy`w|~5$Y<*P)(rm9_-|rW<*kdZD8cjQx=B7h%lF3fV- zWrcH1@y+pS`2+*Qo|5#;;v)L&K5jCPCLXRu*=0$iBkI6RTJF(2a-0Ixl!^UvdTy+# zs~{$2H>mu%pLuZ~2Q{MR3%b~Kx-deSlyt@zv(Q-HieD1}OC_hYh@pf*@WC=-z71dN z`nB=UWt6F$4;(`q3Jv%q?7rgbWM}Qg&Wvf!c$+`Vu_&hEshV#tcpDV|1!F5&9&G8~ zdjmE2=}&2D$jsVNEd#|8z!M#V70Vulfn(7%)(6AQ#8=1++;}IaYMqiO3 zhX;Vzmv(yy4?I2?Vm3XP3%C4-if zzLM{>0#Gy7)8@<>^=&cw6A8zOlX8#o?t4d_RMLgJ=nXSg<-8K~8SvnBb1HWUT^|(z z3G|OOwA!(GpE@J0<%CGUD&6y_;We~R=v_WuX!!$P$GNOY85ek>XI{lmF>!IA#}3|M z&~AcOKSW#>RKn~8@BL%!l%TsprPy^uSvyT!J1vKbr;i-ZDsdZq+AHX$FK>^pp6XPa z7%YW|JkbV{W!=FqXzdaC*AGVRjd9AAOCYnmJM5=ciTWQQ%L{eUo1E#*WlgN1cxFqd zX@J%HXx!`Mru)A60n+zR#tdPDVAZ_Fhj&ceeqk)1AIvOe;=Gc-Rf8KUDjUPYp7ovT z77IWw=^L5gy?RBqZ->yVgW zT(sccmL1>Btk{u_q)mx;6P2D^-6bFWyo`H*UBgG7k6#S+lDkm8?&p8OaAWaS_|%t$ znAckQur3Y#^rOHnON|$z9F9hRDX;tPLS7grS~|-}7Gh-`Wm}DX{#@BBQXg z!80pZI$3+zkg#%baAxe*LvsRYkdI;kabV9u8xV{t6uixxZZa4}NccLz=U^wjmpN&N zBaMre7{kAY`Ktoug@llg%+IOv<=j&8{p92A$S&IS$bK%`$)*u%%W7VCwQBI^yDKt4 zY0GcYaIUJI7DrRCjs(i!0Ia$0Y7?b$41;N(kz94=Q0Dwu+uD-L}|CHMtHM3M}#yP zS?9y7I)jHaDVl{&(VhdU^octmL6KN_z6FPGzeJ=_F`XgkBo+h=_?rD@aa_gEa}jI^ zAswNQ4ouz(MnE%FO;!{0p`jUCP#@&lYc>A__%ZYSl0V++mlwN4R;0MQz?BrcOu(bO zyI@T;Gxv}Cp4etizk`BIPB>VE{S>7R3|9G1*0G$RtM8 zoEQS!;)kmsX&8u?M{w&Q6x9>br!~M=kII-Mlj;cm2^!Tu+zBza#L89=Rwq#3*;yRH z=V|MfoDK-XYCA+jhQ{aU3ynFzdaukR}J4>zr5Lbe)YurQL%d^ zWXMoZ`;T93RKvtg?eKE`W9gKenYc!{q$z}$A>jK84g#WE@K5lt8K|rNP}>OVlS%IW z9b3JRn^R}FkKMoRq8Yc3&f7gah(o_z-gQyCSlI8fU}AuOBF^(*u*WDMMb4bGj(HKn zZrTS!kAjyP%`dHk9XRFjGP7fkuFiB#(z0uik7cIZzpM%-Cx21$L-2uTmZzq+^&O8Q zi6dd}cH?V@Lf-h3zqRPGYm*@J9yJE0E&&d-5W3RrjF||WKcil(8^M##f z(#gi`i48|HIm^Iy%y1dJ0nzRxJ#xxrscSTld%Jpu-7GDfqoZ`}ptdqp^#uD$MPnVD^w0u_7))zwI*=%;E1c)Yt;lr(hHyQq#ZH_DTdcUz zL?gG$1%xi!c$TjT)bL+O`-+mR@gP16O7(qk5^TrCk>dH$q@!MQOnA!8rI}b&DStDd z#wU>V?|!L1-rbdcpEywuBwwz#cQ6!8x&=`bI_(Cm3gOpfsh~x-jZA}}oq zVSI??Y-ua0&P3f4`my9%Z^7B;g{G2gPdAP={0>eB`=@0a{qM#EMy(^*`y0)t_nB*2 zsC%evX^FJ6vxTWMdM?9M#lH$B+`PJg3^?Ir>!hpznJ{+r@sME{VY_>xXdXq&?<7_- zcd~JQ7&Y-a;@8|6kHg6|nQH{7`QlBk#zFSb-~7AO6QF7j)N)q#!o z>4PIzZjGH2IEp4Gf8n6!6jMFh=E_lU3{NS!NCge>L2HIzgi8{JgN1A#Rzj5zr8?4>|RIVs20cT?F0D$Jocf9C%&F3yOCAHqt|J>h^mtzyO4boyuU^5 z3Blv66Z0YB-_DF&>-Qja186W(E3gCs^FwV!Dcf8GajHLqA{$SUVe`I7-1wRVIK`>? z6GdT;`U^W>f(5!vgl2sgQIZdRfAO;iB}Zb; zjc&~;#jhk(Mj*)f==Dk@gb7u&S1~_d;j3>yQsXLJ+3XlE=%ir}m>)1P<>kvNYC2mZ zD;TfVdw5Q@P5IL8`%JOfU6oy_qh(6cFhKX|b7SWg!1l~mL=sE_1mRGv{^3x03vvS~ zY@qM7L9I-rmp|H|^fGiUlAo|IKdCBz2rZ2yXiQY2g~@2L2YtQ8#h-Tpe!}qkny4~0a17+&R)X~wYr_Z$P0c$ez=QE)iB^Q4xvg}7CoV3o>+~9g7*&Fg9a*8V z-N5`63RZSS8w$!qy9P&dF@+r?gtRQvlFR6D;itO~iEI3G7AZTK{9|uJ>DhoBgMUJr zz=OZL@h~>DUfq7Hi^4~!Xf|{Ys}HlZkEU0HW6%x-Qo$Lh{>uKM8%uB6XUeHtgMzci zNKf1ycy!Dda?mh<9xT47|!PVM)yL5DUwv<@qdYE-`;VarW<=QKyPiC zC87+Wm~FC(*>YDoUR1E?)!r;{I_fFYeY2LSbKK(= zQS%K46|l&(_M~@GuATPahlm8FtwDpgr>&VQhj~H$fUnGtK_Mbc>paAz!uXqsJJut2 z;M~Y<4Z=>DkWK=qPHihHtiJS4GES_J-oRQ{^0aL4Fn ztUG*+?n5~gTz4AI&C;49|7`ib1bP^irAuU4kqzIKWy*+zIkXI3&-#}y2OQ{5AidO+ z1^bX_A%7@%a*W61QEgf* z!_f_3?MAF1mxQ$9?U(J3Z>{W`nm{i*l#Q%GuRry9&#oJI$PE;C4_uk-GT$_C66z|4 z>&@N+UNiH;6-Ff;BavpsA17UBZt-XHE%IQV1m|{IPAfZWWV)hJf**oq)TDQeLP`L8 z1oozAfh0VppI>rWR@Lo1j}uT_+=5bwVW|-zWR}jiSj{o*(K`26wv^*3`GJo^2gbqS zueteB*q2okW~z4^l>sDqM-W%!$X0`p3(gn*oAHq9%p&F!&k+e%QFGkHt`;d+v2>F^ z4bKE)t?pY;epzyVYW)1rz|nf#3eTx}nK6>iG(Lr0Sb`bQ)YW$M&9l$i4WJ8~%$L&Y zVfDm2luk5I4Og59&O1%0!B^8kjBTx~OL?)XvAzktlnEu)iku#HNT2?3x(bjMFmf8& zYt%`2*}cv%q9xJw`k3v!Z>llLRO32MzO6uiC{U6@T{LsRlc$DLh`)a$;0*}%&X^N~ z!pvYpfWii6%MdMrVb4GvhXep=et#23smLyw@?cB&9*5$D%pkdvt5z&Fuk?1=Ng@(m zT$*6Xueel%Le>C=-HEXCip>J|f`N8tb+Z7{sM$Lu4r{T7|IwCV39mtuK?n^$wCNGa zn5&NY!8ZPvDxb} z>@W&K*I~gyg%_$i*e($MMj*lzB)GP!^|+H zs#~%aUBGS3y6x_rxQbrvg|MN^n?W*d)+Afz8&Uk!Jr@PHhhf-KwqHmnafZis3h5|l zJx>6v7f)1Ju)Vkj@r)vh<*D$cb%plzSn$Jk!q}sP&VYNNa~!gqYJ{O4-gn5%I{>q4 zvh%Vdy~l$tp`MBnfE4yot|3ci3$!Y%Tm$|YmGa#upq@|IBO%6%`_QJSGwgr zi*Wj8bPI}Kh!+8PR@PsU|KLKjk0;0k{2n$@<%JCddbtQ3=1SMamf$HtU@9>W@5Y$g zO=j-J(N6nZynm%l*oc@v4h7O8M@DFP_OriJ2m0+ zX1-)wkL`V<@Km_UsB?rM*U;VPMZm>f_Z>ii*(!m9`BPPi2p7k0_2Ux}Fk5OFy^J02 zI9hvqDzG{)n8U=ZlTI3WmDS%dma+BBr(0Kr?hyX>bb*|h3YW`Dz!>=LfIWG}n}V2% z$0~vt^v1w7kBI8kW&g!x=8WbdD{bOlap8I5vKR!>$h|5TBQ}>qm&0 z>~qv3`R{L!727D6TU^aoZm^dXuV4F)!7KAve&0HOjkn7`$8V|rN{^%5CY*;QYbd+` zMdvel3_OOoH=@~$rxW)vW9V|(X*};`Zdxk-+W0u{)k>6|vb(~j*4HKUWS-Ss(9@R{ zrMBGZ7XL$THIVxZ77R~+gpYjf!cu7Uf&213h~~eQ4V)#z^#c+MoG0V@J2c(D+5;kx zGvgBGVbL+0Y?!H4G47o7yuaa4Cy1f6am%S;^|MD@Et!({_ecu?PjEn@L`*JTLd0z# zmFz4d*|Fl~Pu0r|_y4VKQtT9&1Iw@_;r#<{9NEREA5{S?sqZ%J_=s6t?-`d&MqxiD zXrf0ZXfQz&Va`1;**TrWRmSqu2@K~4@cPjKUjy^I z4U#CUgU?!Et`Z7|wCQ(E+6y~2qng|=szg72ZnH{=X%COrw#}uQz{mH24d;Q!K>M$! z{U(AXmTO2$=B+@5y9%uKLRrPdD^XWKDpSPruM%4kmzDW6%-@pSahK}bn!7>mLM={5Fm{<;Ki`N!>#$fO#R@ z7eLiOdvvPHAv^LF%p504pDB5u_@R5&W1D^!hP@+q=HDWoEM+QHk+X2j9@4suM=oQt zOs9k$6=_>*`XX~ug+U`rJvbFmq7*l>B3Rbo35k(^n9TSEd95NbEEHuhFKBB zYc2sKw8Bd?be8^CwF`!bTrROAb{hKTaC0`wEq;jx_=c6vve@&w)BcGCP{!jW-S4d0 z;&;GZW|7fq1FhmpCco<%ebk>@s$sv@7)|VjVoLVW!DTijNh&HLVTRzGez=FybnuP} zE?Nq+ZMQZ8Ejaz7Z*Jb2eq)Yd!)_PJdG7v22gpfLfCKAzbvWLCKEhnG)r(bC0gxRN%wK6Y9600dja2 z_Bbb|t3T%|CVIsTpb#%F%)|y63Naxt_E#N^3Zpi9+Q17rV=E>t*8S(h`o`>Mb1n zrusT8glg-oCOIY*A(X#awp&%*bq}v~ljF5V_h972kAMBWw1?cAF`UkuQX)LD4CE{n ze=#Qk3htvDoj{!2GnIUrzj=4*Fi)HPWPnP{QYsd_`l|6kZVX^8Vu{cAiZ_bz8VtNL zLKxy;UPfbz`F(1c`#WN^>DY-As0ybzsNO|)G4WdMW|&X3v?FIyVL8glS36gOn#;A~ zqP}F;kYewm*s$|%ehI|_ zrJEFue8OLHsfDFPa6;-HWYLOog2$n;{Ps2#1RwM{o_ue{-%HdX?vhz8E$UVlq&eqQ zup>kv{6+$CwCui4inA)C&mYy7;EuXWmM6{o<_Z(Rf<$dXv~M$T>JgA4u^=e(E7BK~ zS|E3BLLuprEd<1;Mbi8N`cZ_rLBcCai}9h)CnYXWkz%T`H`!6c6+yT~T7B!@bV;!s zo6{oL8KhM$HYK+$pdm;?bSL9ub6XTgP&1Xcb*JB-Vcw0hB2xZ7VFP#Pjezk8epjty zgzK{QxyQ7tD13!FI|uR6rS{ybk8Rs(Vuu=1!x)>VuxFo3ao9TQba=QtB0V6fm%l!> z-YATS2tKWX{4oEeD{9_0RrFmFF4fKuWCODl;AX?U{p2bS0|rD5c;ig*g8j z6VCxt-R5gJKz+3Y!ZyjwlqZ{cw(~?XZSnwQcVaW=%lo)HilyE?X<>BG+E7W-F-_|# z=*<<#Qx;MH{)=glO$BB3W!t3IQG=*P&0sI`5-i-bFUS5hNh-9dP=4&bod5sx^Su_P z=Ij;J^}VAPPerQ9fG5i?P7Y2MH@Usm;YgJ)jWm2{gk`FiKE^Kqxju$w%)jz4rn_x! z)-hyA&xkF#%rRH_AN!%u!)%aciW&!~l9H+VHe+_ifeXIZ1{XL5GmWU76 zSU=;P=kVH)Ka=6DKckbRum7GX$lr*QAs#O7Jb#Y@b)A0r>Hk_gOAm-0g%!uePyc$o z`5O@X!;se$Bka>W18ERH&SI_x0>K61_G?;0>8-sy?AP;b%iKhr@P7}L7eL>+I}t>U z5FC{EqqwNS-2IEw#=14YA8Q#8ZI)ZZfJ7iQ7c)?LjRB4Vs)e8f;d!cKZM2RA)Enq^Z zm1kKkI$c1JDa!`Zvy(kdy7Weg4xNi|o6T==T=;JBf}f+1WAJvPY{g^tjsY*rvP+*| za9j8c|JZMoXKh!JX56LJL*y5bBo9n8RrqY5(uivfR~yWgin1ZUeKlW%m#u#IRtdA3 z()at@0VJtfk(L!(U<|qs5vuSQobUvk@Y)wHhn`Jn;evRr@Y}U5lLkwrV4;G6c=x5< zI3pD3>7gNXrwj}y6$knd>UH1;(T!xnZ$+|GKPxx#hRZRj<60f_@x|QO@w}*`D8=U6 z$TKtv(Jp(jp324uT{7u9y?L3PB;2^&K~2>UDbef_zSjIFXO;61j7;!a54n4$qO_5q zg4?rYBTzm$*j9>r6g-3pG@X6@;2*ig%o@#W*2iW7f=mst1rjRE0=G&;Ajp(32r@;) z0cWrGSV!@*=|Hnlzw-KNSqzF#cwxLEh5*&XDeE-UI0b=U{8xgR3>2A3KBdO=y+8e* zWJGT$y%wz`Q`=RWem09e_LD972$`J+ThkM6N2gtOTol7mw?Ec*R3*#>4Wc{&}Odx|a2RrR}Ta(v9WaUUty%6OQpri!ub?E<}T zvvIfG!sDAQ1^LenDk9N=D&{S<#J2}vDZz1Y5MJ&Hm(~gi$`ub{Z9Xc z2ezIYH(v50nTqD5ONQJ&LZFi(G|*ukT_mS+`+DAQAefjE@zIUHIJvA)}*;sHCH zxX<{el}*9=tBQ%K&{iZ^QM(&UbdKnrm4PA@WozSQ;!)BK9;L5a5;bv-OfZLgMHJ5B z)@$jp+w)&P8R2g{@1IoMYi)NGoFV>Ng)@rA*mt0&gsWa+T~HF_kjQ)kZAzwt6ca;sFZX@NEki6tua99c^5-ngi0 zi8k(xy3~O^GTyUfBp|BN(uyuVh^Yvs{Q~)O%?x@ z%8WKO{;J4t#{W5bqtgq=ucN7O{44i|qAoO4GKldL#`h&wJp}$QD2k2L_ep#T>TeZ# z_uBWv^eQeHanno2>8gBpN{ot=tdu}UD2{%81}Rl!mP+`|szHfQ+-mGRWQ#)7DGtN~ z;%r0Ix}`oE=mJ3rA3hbP9;F(km51?``aik!t6A}Sc zaQZg!Ww#}{Asu3E_phP>61Fq*sHi(Kps2_okJJSkR1Er0*811mZs!{YxGZibaUjik z)9j%7zx4?h(5z}kSG%F9&+KCZHq;-ts*h(-5EK*nbfxQb`QnEpeg;Y6&~eZs=(zT| zyvh2pS+}FlQx5KHDl9c&d{*1wh>`d@W>P8Z%;Q>qU{S{$cuo#pKb3LM^-g^Twl2Oz z+t{q%qc9KEg?rs3ISi;D^5QZ-=Q+LB#xfL8%M%-E@=GiaY4-t4yRp<$q0Id&L6mpH zp^@4B0C2H($!xcp)-=AIwQQZUbdOx_WNM-NIQWcmnjO-`4@HhUf{89_5e+|w=Ug3E zniS1iOUizo_v0%4-}(p#k!^1MfRrI zfwHHb-6V$xIA_}ZtgfGS-6IY7Ma6ck7)5f7xwkzBtzTSqr zyJPs>iKutOr&{ytjS#qi08upuq;=8>_!6wqCh<}o_!27I>6nGW!`YyGhJ)73?K9-F z^v*gl63NmFKt^W=RV0o~)~SqET+N8hI0CkF^>Wi(4z`A4Zm;xSFI9)j_{S4*1M**S z$PCtws=1Ts5hy5scE2laX+>3(+KgR@pUY}<^Q!t(G}h`pvl)}rd)oeMKyOxGG@Y2F zK6`0E7i@;Dqvh%@2zyrtTNw`*JntyWDQ_x{ z*1f~-FFb*^`8`@7mwVN&MV{A)&_I)*DkOD_`?|NTs+W41l{Myq^L zzrkwLjJMR&h4WMBb=M5>rwNMLx-niWT{aI&*=AI$D=wdRwotnsxf_QHQFB@0ap4Q5IE7Dfct6ZiH+-|%EQUV;lIxA4 zpb2XHfO=M~??mJKhg6=^1?s6wjh~AZ(*GVbRb>Yk-#6BJTK_jf`eb=$cJ0Isx^{I1 z03Yx_sV3LIs-59?7Qq?d=)leIU~|oW{__(Frmsh-bm}kR{CvJ4=W5D=fs*qm%E?AK#m} zyJdmcOgS4b)HkaL`g?=1wpxP=%d;W5xLij==~c`?33R0u#{_QwBx&RuRR^ct5sA&yXB6PL)2Fa{v!FRj5BeM=+PhLbyt# z(MF<>TnJf|%u;jS$XF)6TGOwhA-z`Y<*3M4Y1qmJf1tfWjBdVDP$EU?{_(8L26c2V zGGZau?ABCJA)0>53$52#%PP}p!%N6#AM~RBucC0xag-8 z_K?Q0W~=Cy40sUcxvm-Slv4%ijzPwC#1T6yYyO0HWeO^t5+;A1`+ekhtPyBTp*=)= zkUoomvFy`dZHg29Y4zt|1^RRkf@IdfPT=VQALbbA`l}3!(s%oQcm>wSY$79gS?$r~pr8>0yR+?= zWL44tj1wqrRFzktfI(d7zgCu&c1ZRA(Oda~@767b#}w1>s-DQ`}*>DrjNIc+SW@_}Nr+BMYc5NMRB zYI=}oYnCleFmPUwQ>s1Sn5BsM#e2Spwk{|T{ARS-kuqH|J^PE}Fa;v{zwl)VTL9v45aVh}^TZDvKcJFIixo9q37O)o0V z&C1TrpobNwhTr10BxpZEz_J)@OeY3p>mol--gNzD0PPsac<~u2+C?x|W&*kg3~!}Ds6z)P`4Ed%1T5QPcGOe_o$u0kqnO4G%B$`z((_OB8STz zqwQ9wOd&6t(-8N+s!)~J$KnMJb14!$p}R&QFcjodjjFZ#Aw%|#6Hv6cN@J@d6?!qq zIL|_>Wv(B7(BHPeGQZeh9ruP6!MtNL=#+#oqmd^-$=>6rDeKWS!Y1gI2f$fm*T_t^8+><&YAApOVYrtek7|u^;~!N6)IBfVba4i@Tf@Y=-t=uKw_WgdptkYD4bwLtZgit?85R$P7<^ z!L>`F=fuQ^*d8I&K5KFU^&SCp5)m?@@=N`>a|CSttlC_G^xW!PD2eEPn%-IwXxyn( z<*bWvROSA|&{XA@ydD88^WXtN*ot1Dzp0bKDPHInonY4Yij^5{q#|kF&LCHO=pu@R z^0Pp$o7Bc1uE9vc0RiES>>DEg6|I9J?HknTabLE-zAY;hJOcq>913-6#j-85)W1MM z-c=d+r+<3d_>n4;ECD&})mrE6?wNF$GM&%8q2BNL>0d}^2J;>mJFpm@lTjC! z#H7K?F~^}*>Orz~?0{O|@I+0ocT%@qY~4-aTw#w41wpZ+>!Zj0)8%9K%!0jH+Cj@l zpMU4-A_i{sOxRgDkQYT3U%se`6N~E?M zg$aSUFzOqR&`6nCCS3kT77)UERXkH}wM=%~lhMoY)mp;d&j)+AFE?fXL?ZU`#~(-M z9}C*swceUvEFT|&ib5_AkOXpfv{mU#Kc5d#9;Y!lH8!RJpQ*P7(lR&RP6D^_48~#13roBdk(fluV;)fQJykXBAfVrA6`Dl8G(F6jc*Onn=4O&f$jDDv)qiG^N{$v@;Kk+)r2ny{|nXj?<_gsDs z+CHCYci5drOk2gMbvf;X^4nVH!w}288??TCR+75bHi+R5H58e3+d-*D zJqX9WFFX56VU#bmWmXIqIDG(0c&Yx8gYk#^HvlQhIhg9&C6l3bu5{CNoOA*f$%{MV znNwn#4}d#C5lF#s8YlKVqCA9pG7W<9BSr@1nnJ-v`8JhAHLxsx?knC87Dz^IElkaA z&5 zH=>kZ5kw1E`c6X2#JtT7_Pst)80_x=-8(l}AJC_v@g8%-VHc|Fw0His!tl{+vL&zd z&_sAYJZ)boJCh;5iC|f_^3=a)eq%qt%!SUz&3{Tu;UEAmkZ2RiJfPtl-63Q%f|sWe zOJFoM%WU}-Z#nhKXUmZnXv@}) z8K5X8;VXo1R3EmCa{;N0i6wgJrWYrUt@h4Mx?{9`Q($h*Ld$l_h;OU$^k5@uWnU&) zCXBx7DuWs0kN#7bOBJ?NaN-xdW>~>nHV0gfOOq`Uv;>j#Nk|51P}zF31M&MvO6Y!o zxJ9ug*bp)D6WAir`UIEnJ2>H_WDjWWEqP7|8XcVDKieIYm9tFyPt1qsRV>u%Yfh-ZGLt=UZ*^Qi%AvbN z!9AH?-dJ4r68`Ve^Z$)>a7y70%cY{2#%qqc4Asl|@q0hh6Zwu^+vu5YOM;LBPk`mE z-K7`jgJ4e1e-6zzkeZ+VF5LVeIfb>dNgmk3br^90a%k|E4i1~TL%_op&=tDrK1kk8 zc_l%J?gSzm2O+Z{po|_Yu2P+x@SR;`a-H$^xXnpiPu{t(Roex|Ar!4O?tc=yzB>u- zfaWPOr^LC_L;B@_Wm=oia>+wLzAd_`G3%d3NO&o`8_ zo>{v8{x(;V4Xj>wUtulpmc!|#ul6TnCH;zD#pzf1 zB^PQe;5QNGk&d_~A#s=DV_ntc?lgV!@*;A-v$rsYzf61OK#U~eBETq# z!3CmTECSlv6Gh9GNi2i;%YukjcW9)FFOBz6sQ5V(a4Hnl6h+)`{JM5hg}a}q%4_S- zUv|GC^@(%Qm%T4^;ywP^i9&_$N1;H$uTi0+CUAoJC%t$>Q3!VCXJ=E?KY%(NFFJ)r zPs2mA=H-{bWY6BEK_geo*wZQ7qOf3xSxII083TwVd0y}P!ScyjOK;O~e7{Uk)cFv$ zajTdQX`ej|dN;%b3xBg|+nS zKa^Y2J2IoQ#rMZ!=*sJs1%Ifb!5fmvXHDSEahK11ZuL0RV9g)0;TYo|#1n7P$6@*&*G8?*zcN=yqB@r(`QDM| zi)({X)6D9~90F`<;L?cKdJ*RU4=c{DvF{}NA@wCVf}BL6C1zkg4TRofpl=HFn=?Sp z6w8d_%t2Q1`x}#?m&z)n-RnIb3%>cM?=0XZUO8t0jfP01TvM$Y!PMi-8HN6JP~o;Q zbum55D#I~Pa{T?$FCwCC_qgjMOC|o2YK&yee+wv39GRN&78|iR8Y_(Kr6!cbjh5TW zX_k8cV#hBy=i9dgG^U<^Zb9oUc#QzR+I)hKp62-KDVm71&$jagM>Q+G*1YZQIm3F9 zEE?Pb(tsyD`1Im=hsRx6uRDE$XHAOYrQ8u=St3N{11$~+{==<)uUUO9$VGKkwc6|K z&5|A`-I%~2;FP{iq6U+NhX_k#jV_Ym`8vq1t58Pk&0;HIo{8)iyM~8--UbA;LC#-& zfzXogytwi5LR0${qfDRNe-he7Do>LMS?vE}@C7L0kL#XA;m6RzsyK;HjZ1aev`OVv4GjC#E z@D^VY*X>Y=0h8YdP+TeCpjo&{KWnaGE=gB(g77M&=<8a%otR(Tx9LPzc;vnNmK9O zALK7PqIm-N!fl-#5n57OD%nK?Ht20Qv+z~z@H{4@QpGg+Z0>r6qFIRm|)tu_I2((CR3oGnXl>B_N;d=n43)d z_HOwN`I*kNmQ`Tm(?jLZit(%LY}>+1G8W8;Wtqn&2((-7)SmZyL_^?BEWaEqy6OMu zU{ml@Uf|-aLvkC@N8LLX8MEyaJK*a)yV^O5|GVfP|5ivkx~kpCag9qx|2Ld zv79x~qgISVm-0MQzi{0{GfSSZ7umjxOD7Lrj-qr-I;^$uTys@>=VVK=sSE zkNTzMf&(hovdP4%QkR`FOAQDUgW)_`usF+huRxum;vJk%k6~$hJ|nFlkPBJ+(-`Q~5&IQ{3c*RSR&mZ2BjxQMBS5HumBjT2)4yOVuNmus|%rIkZ? zday@JSP_%nnB7eMZ@psg*WXg-U*@W(c{o~z_Mi>QdjGXzlI&L zUJc5=lK?A}*&do=fgxp=idm@0msKZUGNi67R7lwoR!pZpFiMyuQpiJeNI^=NY8g#< zKNgtSOR512Cp0wHAqY^5VY?#3*=@Z4-TCHL25+nrZuz0JL!ZVDCn?M!>aP zXQI(S&b@*N@DJ{2L*4@qF&VE#B}Y*Y(ei32TZH9@YFPdelVbu!Y_h#=`UAyV!z2{> zJ^%&$t!rLc!?SuBR;}k~!KH5eo_!nk42DX2AgH@=Jwsv zL97%(HH=ra=z&6|Va>Q?4wvBY$ATQ9TG*yKq)6m_TYR?CuHS$LE6hd2esJGh89WC# zJkeb|>j`(@TNg>o`{9VtopRIJ51;fr;!ie&sHu0a2yltjN9)+1wif0gunG(|i8`AP z+iU%&nG+AkI*<~s$6H=Gr7dF%JFl~U+CW(92N#MpifZVv5lt%^Ks#2Z5k`o%+u}Q_ z@-`B()L%CeyYa8~m`D`&4dF$W-NkCR5Z^U6#LavK02}Om*q=$&e64%ctT~1Zdo!C% zWAqq}_21h+={ff6_zg6ydy9I!ITKBqs5lPucxDzuTm13a^;S^jssi*Bi|KGI&4OQ7 zU@a`^mhqI`H0PA-a1{N+`;}{P{(3Dha9pV~c!~#>Od87P`5SZM2kgLM$>cor1mr1Z z-Q&gsCHuV5^8pS!Km;zDn5S){F5IswlmsLTrAV}_ME2~;uEG$~q`?+gvU>btAoJ7Z9V7~AxT+O)qc!H&Mj`d;A5VY-CD zdGUD&le}CaD#vw8vjq>RgB}Ys*s>8=h`rOiGPu17rtI+&ZKd((vqzT)Jm!-4UlSNhgY?|G2DzSOm0E`~5?u+AWthZbzWu{CE7{w&@UQWZ#+c zIGgqDELvY-eICEvX*@S1cdB{js#`0`Ay*}cA!AJ`3v9ZJFA=4{Fh#0QkZSBW$)=Kj< zBWB4_Z}74!0sZWqf4o-J`ZyyEEg5edorxZtqk$Gri6W?my_A=7Ewd}v5;=Y zBju_#R#{~pG3pMA%)r-!t-{yqU=mlLa~dNNGC=^v5$SxK2=PefH7~}}fY15tggk|2 zK$Y+mgXj^8F$$MIPosCX?AAH=_IC@wl{#x=yIpUL25$uiR*yOniRW~64=ZrJe&U(Y z;Zay_nAI5%tSPb?-_k*#oqY>B!oQ$$E3&!ocRcv?!w8HeTx;3KngH zw%f(C^AB@)~QjwQc#vs(jJLX)i&FG4;>t{Jcb! zj&V|l_l&!W_@_Yx{*b|zA6{Sp77gLumwTfa;)n3^cM*(FIhE_r_Efs>SQMacxof3( zd>qF9W@S4Xm8gvtB`L12@H_Z#e5arfwT=B@i-5E?*Z<_eMS4NQAxLu|#BTMsu7%rh zp@QEb!Y;llR5UnbpDU?Yn0~(A6B|&C%B%ftBxA}5krkwx%oHTGM0bgX^Wu8;<$FG& zUZm>|Ge%(gU@X$=d!2?<3-;Hm0*^mFI6pZwlVn(-v`BTKh;C2hYFE zUZ0)zJKcFoi$RD1Ai{16{0Cw8WO+~-YESf|)bgo>Ip%S6(>++ z<&05E6_PkPlvcpIq)U&^47qkkE;2Z@g9(e{D6zc_>(-GRJ}i37j5*)#pG>CVIIEx- zCEGQt7~+5fM#R=CyREK64wb5^r*I0oZDBWBVDJ~fAnwyupVODCP!8C#RM$3>mv79b ziEly&RP0sip=7_NTPwqnBtUJvOmz%b?^0!rc?<*B$;;Hm>t4MCx&|WuCZu+Jd=K4D zr=BJt58BiyOld3FWQc9@u|Ii2!_(XT#B}Baf$h=s@ubN{_u&eWx#r8rB)@#y9N}`s z%)}oc6L(__Eq~3X^%qbv`BXFTM{f+@qn#tl{!NNXJ9Wor{w&5`5lxLipu3Jm=#x-| z?d)vj_K2xIPgll{FX<*P@QRVk8yEi%AK#>6&o0>LiPidV^KYJk1DUTWcftr46=VoZ z&SfjIn=XQAeF!yH#`${07Uvi=(fGqoQKHmx1^qbLw!BJ! zIaoU!N-AzWBTACrwgOyW`VfK0@1P3eoIO_q9gu$Q*_<|kin-*ahc6X z1Vqva-`W8*bM3p{k9{k0*-S}*Dk%48ws2xzKbGHj!^8jEJ8hE^;ZGCR|98&0yGp40 z+4V4qoGcf9N>=>S`c9-4~C1v9UY}R zi$)-PaIt<#&-2=LO-eL3iob~pF6+_uq?xx4&hq!((6a$x_T5?hp3Wq=M#BKJIEAoH z2EGu^ZF;tq`GOI)QG~BnTx=`xuzR2$Ofh1T=`WQ2d&|GRbV(}=1OzzoBXE|i^v_x< z=TQUn_%QD;bO_?b1d@&KRes$!?;BOj;+h)%_FP-?jlI9@OUu{x&G=%#-FP~caOSOJ zknN+Dh0BqEt`L97wpI~N-VIC_^ey8#e_ zJ;o>%`4M@HuezGL-25bAFvpS3D}Su9(!uurKpF6HZ~f6KD7l5Ee0i%mNDtwy&1nBtt?&3=FFjDIM&-X}K|%kFLl z{vIe4Vwvl?XYqi$7Hh@z2}CXT8AAD1hJ+u|w)Kxbr098DUPs#}3GR0LRm+kX##q5d zwCm?ymz+@beg9*WlJkWUB~q1j$~^uy4HHkH(%tF;zGM-U(vt{otW&ufzfzA0g9_?l z@JW3j;NaX>rqM`YD~QhBzT_M6Y30aLuimeY-(aI)RPk|bT;c!n^|AtxPy?M}U7YEx ziXBBNGL5qsnA;49-&;@%vLFLs#~$^`aRy8n$yHH9_x!a`Ligk-aoRM_#P0a}dV;#* zsZay8X!;`ux8|AqnH@}&Z^H;^jN1F+bEw%4B7YH zJDHC^JL;A<6;{Q(y;02B?>>sCNSVcajr$amW9e5i6cX<9V0viz^*e%VoPY45=68BL zE$nxTKS+DZt$v?D^qmmhA1C(6McH+7;9QpjhIRUH11MUedFmt5$#6Hp7{j*->`>{H z$VyB8$;}zZ|46A({ptVbAu+80g$>U6QTV1$20bH?01$=!KVVfW7GYx%%=Oeiv6|GS z|A1AEcz2ubbZWH)D`o4=(i}smNgmTJSD~8+CK$K=Al3cgDfqA*J~(8QpCZ2N{h_*X zWFzoEs@o%c1BGRAS{B9DK$5a(cUu`SFnnkuOkbgD`p=B<;_>71U?XWKRhbe6K&m@{ z^+R>n;KIUtAvVQ1c$q74U?@LlWsTbh&}3h8<> zDSoRxI~4J^4aPN~-1^tj5o55mjR)N2zmDw2F$BOQd05}77`GwCRK`fy&}OFKHrED7 zDgOOu_3!hq=exN#sb&yx$03j5nLB)#^%K3hJ%z&UZPNdaVDhiIq>Ukd);Ru`R1PPxBvYjr)Rd zLQ;z@(|AlXwZ)n~ck>#Yn5Fo3|F)jL2p9j6r$06r{ktp#HLPwLy_xxPUt@EU%!pl{#0qX~V0WC>$m812TQv93Vbaj@`5<8;DR+HA-S?Ng zu8`u78jX$knQAAyGT8mRCQA6#O?@D#(69oQTXgwSyu0TUoEWr1o7fTDWB0(H7{AL{ z>|;i7YM4R6%5tDu3Rfb%vWKt?sefvw9xeE%se{8{i>TeCOEHvzzDv8R%f z`A0QMjL)!=#MRGoN^zrctS)609}@pFBh;t*CJyzRhNXhCu-COC=Oe4oBQNEnLsjV) z@0JiMBIm9c4(FK1T3+mbu>_wD)ML!W`LO)s;)Hg2sdsbGG*CXR8x!ryCgetexr*Qr z8eX?JiDp*d%3Zlq^=TqQJm~^oX&eJ>lf}U{z7l;)_^KI((@SS|^CG+Ar0;@A>3;WF zDxJ)EV^3Z{v4Sy;g?8B(nr6MQQB8Y{ALEOW^XHM9UADD=@&%!oBTofG$;VF5NN>%k zB=0b!7=4841hiC?PDf2UQ1Zl}GGX3Ec({rH%}H=6$`+nb8Ph52IMf(OL0EDAmGDId zO2s4}^6NCL!>`S{-$H>^dK0ybO_~imc&$#!f7b!ko}03U@v@%b{4zbNqkViF7QEA> zv|*B4@2QIj+)bWCj?1*#*Y}L-lpZ&`PNBp1Bt_lOj`gT)xL0L#7o3Nx;|HOaY>fX> z@NU0%*mZfg5JlRQzXHuAz}$i16S(2)uj#iV0MC}rOs-~kY2fxTvplCdd7%1KNaXNQ zY!bE8+E0{R3h&b2_r>4phe>YsXVtCR4bN<4&#m^CoTxuC*}oaPp^^5**--mHA^0%9 z9V1F)QHAZ?#=v}RJ^^^}W*sSv9Q4E8f3;BeiZ!~|28`xiSU^1-61n1at2n9gplr*P zMUyDSmyJ9-^P|?8@!MdsYAc{M{xH}IW$$(f##;5+XTZhaVb zCmfu(X&-)v^JT?GIW@dz=8M=E>Ro`p;>z z$0g=f9vsp4lIr(nrnv_+$VIU&-L@zQT25zx14AYppm+8Z;OXuHz!zZ?nf`OrKe&Uc z8xWWfJiH$@c20n9ToMipf{agSPnC9}U{)|=n0!0{hdhorTtkw+@*}^<45mg^Sf6y( ztVB+7T?%VV*x|o*zQ%cPK@rrsrwytn46_r{WO+7Z&Ps!FVMcnO#n+ z&bOc`lzL4@B;w`z)aBPP-4e}U%MeeOM?*Sk5a}mO2>24P<%kOHLlfa(Qso5j=tc|s z6c|99u?Wh)(A_eRl@!uyz?q(R5OLgbxG;F6~C`o*0K)W;y8qtL$6^OFW0{=>X=+NIx7ANY7 ztgifT1QbkUx3h&FF_TXD$J z^wl1@+5A^-M=-k-=Ea9T)l~BfQA0-$slJ+Rb;&X`p+JD7-nuNzVE*@BB0tXSxgC~V z8>(5!>)g`4=T0w}9;`O|*^O(vOVDl)dijh~0?>9*JLFhI=v%34rvJVsyHM?>-8X8p zpbnj?;JZnho%59DxWKsM#d_NHu9L5^*K&?8ql*Fa84P)k61kso z_**_Xd~q@xhTL%6emyw?ZG2E}eF44##p%z2c2sq_qlbCWq#IK?hyFiYp~#Dh(y7=S z9DrXJP^)xkW8O525T{kH$&K{}JaP)8p0UT-?ZXS`^_2_4+j z3C`VT9B#oXu+;U-?*v=vTkiV@y%!&ZZf|3pG&s-_$d=R}&0ZMV{_TkF>;%GV%ZqTZ zOgt~;LJocmE_h<``EU0UTq^n;3ZaJiXJE4FjrTGv==Ye1DY|SAz6354#2!B$BjSeT z>Xvt%T@#fU6kz7Hiibw7iDvsXXuY<#5o@&wpK%zw%85jt3drUGtazLHpUm?A@)}TzuChSjZIPj5Wx_ zDy0y|PxR0LXULsEzJu2yeU`Kufdy5W3B8aMcyY)J9TwC~b%;7%uF zFoe$4AnCE;$p1Zom>lag9YawT3J}@6x`KT714AD?%!XBNA7Msr40w!Bsk5ZgI`qPe zYTfC{)l@}90$MTOa?~5B%Irt8)n5#GK;9M#tClo)4z7~;ypeaNgvv|gH!VZz9oT0I zKg`vHW;YQ8g1&aQQA&#SSE1^Qd-2jbDV+&A;AgM^^e1F16Z&K&A7qL5_|& zDc{e$J%0p<$bD|nPD3f9d3PL$(1{)Uh_iB-%AgJ4GF#2eyr4jDK@x$Y>eIM;?9;lo0)pqF;p; zOsSPO8AFX9PMoG&DcW1Z8!b+Ejx$qi#4NLn)J}(~A&)B@l@BCxj6M?hO_AQop;zeD zl|(ej(~r~=epB9AuW0%W*V)pDvV@Jv9RsNs)w`fm7N4+#?m+Hot%|I3`1Wd=nt`(wC7^nEi3a2kyC+NqNJvG+5pnQ0B~5=r zf8b-*la|r8Q$iE&Ps#MmrgrrLtLC#-W5+ei>!?pho#Ar+fn=QgDrQr6Nb6SWWN>24 z`k5Bd*_N+a)-@#;7RWB`kUgybq4U&K8KzrCr!UciSB1nF{scLn~7m1t+rw#TDWa0lEk2$_XMiBe?YDh9tO&vJy;c3Rdw0s4};1&7SnHrHGePIvIbKgs*`p9q=*Rw+;FQ2S?gDfa4*jqrPsR{L3&!*6@dxe zvJ|^HplmT2N`h%$@@W|y!K$DJwdwSdL}*`*l99Y<5pWY;1~NhJjGr(Ikk%0U;k%fn zA=NN}_4LIBt^ha9wU9(dR`@*i>E&y8B+=2ycf_b}?sz)I{7OWbSZo-6Ty!JoPYs?x zBMVpkuoY3;!3GPVe-BJKzwnuJK1k2*&Y_ZEZFGCgDf$w?#7cjtWQW28xFhci}=)B z$`>>pE0UCf-^pE^%KF$4^>=3ETfeJAfH^Wx#e&>qc|>?pSpg~tS^_;N=jtg0jIKN} zjU1_yEtJCOnpoEI(m}2EGA2&U4K5VcA4<-k-}X`{s5!3;KxFD@z%IyYc3|z2)T@@2 zWkrN0=L-Bz1PY2`U`SUZ5%Lufn5p|f`B&XYc9*Rk^4% zapI;;qMvYX#D6D}G_NGYLRG>Sut8wLtC!cBK&5{pCZ=p2q!*BuO_`{s#z+tHi%OPQ&B*d~5}hTN)r z-~$!hoVVQWe)Qs>hVXgG_WCWMvQTX|Lcos(YLNePFx~kJR~t*D2JL+i4`lofE{LsW zltorUg&%O6u5EQTZ}3Y|Laz%veB-JBK;<;7yNh_lfs78%f5%71=j-5t%USwG0`4iudxy;C>F z@BeNt68d=DEt)m>`M2B<+~=hXSC{CC;Z|IWGsl-WZPhJ|7|+} zM7(`l_$F_CmyQ-JmWB$F=6eHpn}z_ai&wfR#7LhOq0z+OYc$wRYZMSwC9K{_N(mZc z_U!l@3@*Liz3*1h5_>`yLQp+?Xw(s8Rf%y~H2!*Z$zhgp(oSOh`Y^S7fn(Khb2_zO zv%z}i91EBrKmbxeEL$E@ub9;y9uhhyFZ)r^!CD0$2(7JKwd8;jm0BJk6AXv=V2nbgmy-gst4G`1 z-E~Uj8ee*rQJDYK0zs2CgX$ZpPQ? zhpqN=kEHl%DWCBXY6QA~XYG7<=tQ&w`RfKmIy(nD4F)}`kk1bGEp1GiOdXGH8BYs&oeoI9GHhdM-p@_A#%$p zv4vigGA37AW>`nNy7jPe7uv>67qZakfk$DqW%WKFDWHfqf!1M#F+phyt-}_dhDIAv z5e)w+I!VJ@)D9cU-2bp|SKJ(3R*T*JIdNylj0|7|_wkCorxY^~5gIyc-DZ7eZz4xv zxgl&K53g@Ff(pH%iK%rr>W-?k4j^KM1D08 zAh7{#S%y|a@|;jZUn2ybq;hgZ-Age=i8@>a=~p-U0}qZlMCWRHYLTdt?Hj`!gd&{} zCPSV7ggY1OMmgUi5Ob+9Id0GGRz(ptz5b%-E@P6!TRjVI&BKrKE^Z!VkebGIcUcKy z|KY?^+gCu+*E;&Wyp1TxaT-2DI{f#j=t(ul-n7FeY+g_teoo%NCrM0EsDrDv389=E z0ebeDlxCSk_+TPrKWogcz(fN($!8!6EBh{a+XHkyK_`X80_RKi2TdUYgv)lTyq7|T zxia`AEm+Fv&vUjs%Q(8Xp}5_7XFn)rKepGI_$=LP-aC6GY72P9Fp8yhcu~>$s6w0_ z%{=g6aluiPqW#i|UY!(nMailEm!_pL1~F{hhxI|zGI=oOBDhic`p-h)JCQJOf1JwT zJJq5@e@0IPPX$P4(^kd!WfS@Gg&V;TNd{2)N0Nt`#xh6$N7LG>f{ZK)|G}_ojn0bR z%Y&*EvqAbznOGVfEf^hr?iNS2I`F4;7wYN*Yn?RSH+o`37S}Y|q^N?4k)HVF%n%N2 zq(6R*wu-E@tjpDO##9spaQKuXzrJxiV2B!;mV8@s1qd}}r9_Dj;wdItpbu1bLnY(T zVG??HBtzNd`N0SZ*3F^|0!0Mcq2>FUW37I$h5I&*M>5etC)!fm)7X%E{6MiU`kX7C z%VYQ4hT51>C?W*ZZTW%?jJ?Q}bmt0?*tGqXFG!evDd=nZQg^Zc7AhCEalcVg4=9)) z$KH|=JH`Zy^RgRimB#DFeD@8BeCm|wBT~&-eTv?D5}cd~7>ylx<$OOa5Ry$c>I=^A z!!UckBb(xR;N1@jIWSEX@gTYMZ|@BT>xV}R0Cu;V$8N5VW1N1ys^hrEXHzFXDYiHU z-=_@DK3#OcZb+#^YDx-^!R3yAIz5mS=4G9JDI+3bV|A z0Su=7bUW2Qt-ep`3jQCa-l?(DuIsvuZB}gCso1t{+fG(&+qP3NE4EV=I~Chb_PU?< zJJ=`d2dsm6%{fNzt)bDJsm7?rVJRw|JGJ8Ei0LqmXNO5u z)3V$HFLR&U<`87JxMKAX%tEq|>L>IT%$g-LM?*D3n_QLQO7Z%=d=6cPc4$-W2v8u> zd!(Im)zmp1bcK2IiwtAM@ouUyee~dtllkJ3`XsxUg(UoJln5TP_|Kxd=Tf?9U;$9{&pgEoidNm z-DBaGw;Mo_T6gHxQ5Szr@;#^5dtDbl9uwn-1)$9xfZS=aZg(a_AmJON#PSdqJnDdQh9%$d{dZJP*QH2rhGf7Gj0j{TMf1#AIj!gB)T;I zx&HE3nD4EWJd&|IU-;f318CV9cM^i8zTttZ(zbNUa8ZQJ`7M=76L-xI`)~S!tDYsB z@&@RhffjFv^+s^mQ6wH{jsKdf@y-r3=LU6ghM}fgsgX}(oCyn+bl~J(8aS1Z9U*W{SsQz}U-MW`nYQ3V0x_LHe9^vaB=asw$;i1g~ zWHzt7V(ZH~I3x%HtrbNF$_SY$;$#~e|7eZytq)c$!~wbITQFpBBhE4HMOLgT zg^*-OHSyiFg27glIw>rQRXwJ}nX9k9F?XHn=(ojO-zvQ=y0q}K)mz-?D6d?EXKwlQ zkFZ`ON_@3ck#u1OTeMEW5cZI!wYKelA$;vIpDTX~yr$LoSTz(FJ19^y*`K^{3(xAKS5D>0daMxCn?Z_W zCpZ@nmG6uM&JIBQLoc0_+JXt$W!7s9zCNu*)Fm*EW@e7y} z+-7O!h(5M_Zo9|FY-d)jC^_yIVh}}oGjhyIiXnDN0y+Q=AEubvOeppsF_fBt>RJ#b zRruRh%n3#EWN?}mH3JnG7aRL`8Or_tq$p56ZKaiAKq-o4#KXKE%>X$}9b5%116qm1 z;-S0wF#a7XpTt4M!T(8748(DarNPOEV4z8tZHg0Mjz)EG6)swo*%*|KIFP~VLz%Y# zkS!1vsWzrJN?oAQ;Dn9Bl7WkRjs3<501NLO91}*fAJ^22Ob&*2nVZfx{_668sus-a5yD zK}eEDsDxgGfH$%J*05}-w%Ev{)HnIL8OZ7*h%G1Q*!)z0$J7(wD+yH=3NVGe-8t=1 z*~({;gbKc=GCiaE_N%q{Hi)`inWCUfQi?Vu$;7f$fGiceWCtBfimcVbz}hn^7>U!i zmWIvht6r|2>BcEtoi1P8!DR1p&$D+Z8J;bLXbIH#hyNBvg6v>=x3@t5^rY1s_<${* zALe{Y6;lB~72Yj~Z_mAE0$3P1!w_5Ct|2@rx+m7-WF5)03(SDU2^C7BG{(9xWyG=I z^jN&1WVV;O=odT;mW~^rOiog+*?p+UL)zZPqLIXdNBDl_jtryDXAa2C5|quv1|#N0 z$}^36>t;OJch1Dvh2*^x{&tqz9S3iE7h(w>G=_wD2{a*8nvPSJ1AGLUT%nG@teT-g z8j7=k1y?`dock7Mjx}EZ_4o+#`y1jz6sExM z#d&~g8*Z%y1jb~$x^{oQoUVpJJ6$BvI4X2Puz_xxa3=%BxglC@_U_;qO*fqa@^-%n zMIim?+{Q@=rH;IU0l6&5K3YGv5vlpq;|2m9*L|vxQa-vcg^ClqyK}%2<3ku{eKJwe z>qIXr`I0qKohy_z!bOR|TeXp=cV-~^QTolzsts(Ez$h8dX%%m!ZFvSx0_*x(jg`zs zD35T16KYehEl>j)0gLt@(u;vLUgPc3>WBEo zb$5Teny(Ws4+f2f69_4AnCbKr?71luyt{^Fwv9cS0ZAyy%4R4{J_)(iI zJGJNbNo&t#fM0WU!o%5fudylCTU}M7+r&mT8+0MF=ZoMEQ&|`m_mR048R{x;QIB_y zX&&zgz4~(g=9j-7j0Ci`7iTZ9z1z37Uo`UJPe6>4JlXwQV&Q{;;KJRv^a2?n6Xoj{ zYkf}lvTCFq?J%6-%sUt)hsYAC3lZ3IPjorrNcLGeK$o6>LGfKyn|1o(dQ!^%W7{8d znfso~^9ux0?cO?xzZZWyIOvHDm)FynYQa;b%aDi4cr*F2H=qpS{Mj})i&_!tzB^Lj zkOFSZp0WlzebOlE$W-m8%8-#BU)2};@afMmmz2N;74+>|-Eh@TOtB%1a8Uxt9}=aq z)dUvJ02^wrAgUDBUG^y$9vAVGQXT+vaxzfjqLZRnKWZ`}#v#B3s|wNI$f<_(q}V|p z53Y zS>`f3kONECiGvyn{{1%~ak*fLm{9hKXrD~S`+uJ~Aj1_H&%glV`rjy%E(1jr0t)c1 zc|$#;Mtw^T-18msQRb1iZOCSWQwXDtVN@lm;kPe+Z|l=bDMxQMsg9|$-VH!t#W)gy zH4+gSGb0b~zD^v(q!cKc_QgcUw+L2pkqpKFoPfvQAUGUbh%!r&mLP|Npyp&CB3qFCzC3XkLp#@LpL z$-&OG_7Zip3xnQPe^Dd!U^`KE7B)R7%IK^=u;Dm<2tr)Kj%rdiyjv5ji2w|5@~q|c zDAyBfO71bU%JCP_+0x`Fd(!CLK9U@&YOmaM!bDjAV9p?7`Mgen`vY-K_>B#(Tv zKMcIBp(eoMB+!u)!-{oYHywLY`mmNe5vDDsD zb!IR*OoryAWLHlc*rY92E#MP*zq`?&!)^!>E5X;IP*nTk7&+u-iP^bber@HV-J$); zKs!=f1ul&u$WGellrSqa48NgKo$OM9+!H8(eZOFCvOxRrupG1DpKYF)O+wwfUHWpB zXeZ~7*fU$?ceCC!Mn!wN_E=0!BfjAcgu0g0IT=WC`&&!rn~vrB4ru)W*z(@DSLsVp zW!xPfEmJU_vu{qD%flbQVuy8119+oA8_&B@o;#iw%zf+x?AuRmD#YR4LTEO@NvJfg z{gFSGq4q|9|CRag+^78xwD1fx90ZnvJ{}hKNUg8u+=-bcLIqi1 zPf)k)p5*0Pa#R!t2~c0PwTjEYsm($)u(%B00L2*PUn21i)Yyq=;xI;sdh+|RI?OD^#Zcbv-0djW0vKIqcS^UCw=P7GuwX8_ z2jyM2v@iAI_EMYg7%8~FM(@b@G`9;{M6UR7sS0tGdC)-q;RX+^bhyaLP53nTi=e^D*6-f*@AhqNz@)W_+5OA38p$AEdln0zYFO#~(DTOViqd5_Pz<{r;(QyM#&lLZ+GeZx@n|Er*TOoz+oq%4&}aVC zXG3yCQ2{{bp8vE|J+m+tPG&0S+uaJmSQ;Fli}5+&zk)-`aCB%}N)0QUeZ!Q6zMGzr zoIggVX?7I*f?LJ)l9$C$WpLLJs|7;`B@A#Zjh-9YGe4WvIr@_ZNV{VY9k z9cN_vBD^%&yHVQ=2dVotzQ8_MRoT9)G|>$$&k6vK^Dq}>D;tR9W`QAgtPTrt5BlZ`D^uRs1uN z?WEk&iS?^~>jKzM2yQWel^8THX%EMQfB%M@!BNFym;Aqy@bEhawmO7e{y`y+BRbXC zaC15ALy>AQ|NY=j__sdf<9cz8{~9rg3}`Wi#fF|mz7jzm{#Haru*{~~U`jEp(5h*; zC0Yo5L%L32T0hIHcqkm^|Ey|ve4#tv!4=`9)3Mfk(NzEWg%l$Yaj)tUK>s#Y4Dcg% zS`{a1x51#~!t#&IkJ19XD-IY`thBvx)G_^T1LF>SD}?t1<)Tp z`G0o1XIsuZc8+9Nzd%(4+(%V=gt%q9&;W z<`kF)ZQ9K3pEsQ9h`V$FxP8x}jubzRzpMo9z85BPM#tM! zIjuAUK;W;KrT>4Gp^P3gNJ21n_6%WRXu1praBz4)_2~t?k4<)))qJ5rsKFw>nYA5y z5ruehGOqZy?~WbD$as)BUAX>y;E49lXx4MDH-2zE&`^V95C^^UJ@|iynin+K@#t(yvUmSoZP`WVzDi!{X-N>&96q2wWHg zU=1}4u`E_{I$%F zN9?Rs!P6_uXH)+(T_yYo&IXN52GGkAs!dgID>gcwTzHhq4N%RXh~ z?+8Y`a1QE;WNk<+BM7VuT2)2Ul}(h(b+@Sp5f#j~hEV&CGI9AB0HRtk=El>#OsVy@ z(=*4K=#y@|rh&TDKrA5|fDQ&q*z@WxoRnMN`S-i{+r z8KZoj8$iFl=j1s8SVWuPq^mTJr`34MZLtttD41Il0v(tf?_BadOoMK_=EF2&;Vjh5 zcB#>ext&v?sVk1yYiGI~Vlg1XWH$nvnW2p_-n}|%wn8e>;VUu0Q+vl+RSo*|^qMg- zYV=F}n7~G+Lwfdc9u3vs(p@vJ^NCJ%P=-}_%nn;S@6l&~w0apVL45Ccp?ztiEZmT+Lq&)wWK%D~k00Y!TC;DR;NDZ|!#vdxJYHDc|`q(Y&pSFB}pA89^ zdQx!|9Ui}S-UXMOgg_m%)+E8lVxg#iq@CxANoAb@?xjJ;&J`iU$lmSrtorqLZajOV zI>W$CLN!y618fwKFJK|G6hQv%8XLSK^xMOME`DrX1m~o=BOzK`Nfm(rx|9M{Z`j42 znuLhpA8-PX3E*GqXd^q=uy%KO>1)G*Nv|Kg*8l?FPo+xk0zWWE!YaONQ$c9b#U~-a zA5%d<)9%N=t0sWn57r)iLa>u#SuTb>493ka*KufGyYwb6Z5WU{b;88on05=_;sl#G z9e%X$e*Ou|pA(;1C9ONvD!+IavROcL3)l_6GwI(uZfE8&tBqAr&3!7j!T&-VlE6zz z(zFFYMhtaAMvOriwe?Gs|41<@XW1}!W~O5T(2xwZ*Cz(f#jL%tkY10%DY3!kD*8c@ z1WYn@S%-*vUGyv{@VPAZ(%w8Og$H>L6j0o@aUtpq$oZYeLVVYKPNGSOpLWFw^OS8w zacGGoxAg>a3F|AdLO7zl==*W3CqtwgQqw z@RoY9Y1yZ4u~QwQQ3-gy`%L-uDg%!#2u?+t9`hDtyFZm8zaP9aU0nKHUk4TUhnz4~ z#{!Y7vo1C}wMDtZqm;%yrHqVvBjvHHY@2fjYNQ6m<#Ya_B0L`jE>rqqc*y+WTsO*6g*^$P+*(YGEqe7P=kHZtSa(RLK-5lnC7R2@1I_5*;(r z_uzqh1!z@^GhNhl`jQ6jc|C&oa-4Ko<5dxzvs)SCP^=CJUBP?Y? zO1#TrU--W@zEEJQTVWI8)^(+2&j>gG4_6N!CcZ(@RFD7TT*qUgcW$iCCzN~S= zt2blWPzs6rF=Fx2gMMf#;It8LSMaHEz5Ik(nUI_s@GDYe*#~!z&?0^ zkpWZ-*Y5QET$|MDn*_C5@H^9KeNIwK81vGwMDO(Qs7Ze_-4-+#Div^J3%Ph^<=xGu zRWHw$;!eHaQXS+ez#P{8`DBu0G&s|6&xBJ?ZKcVdU$*3zBr%0Ga7>YUbcwSHIwWqX zfszW_W`b8i{Z~d>NyM$Ji|(&}Rls)Hx}!SPYD$@oHB|JOYQ~v)&`Hbhat)GE`~J@A z#3y=PP@?g|-yblnD?Wf=@z3jZ4!ov5q1c97e_j^Bi%UhEG$p*I01n&zE0wS9*8zL1 z`ZS(to!xp$L87~2eb^lMP^l7v8cKjK8o0BPCT@mq=GZe=1Hy+O^s=ikB$9K_o>6Q4 z%ig4VQy76i5mtTA+HY481^UHgR5GoIWr!_D z@8AY7nb&FtrIm#ZYt1Sm2^z?QEUGy9_YbBo>y9n*!d84s+)CAfI|Y~ia`{o#Yi*f`Mmbml1ggXUr$fA z=2;dd7uvn_y7na(&WJ25pcKrP@AI8RPu*8z37cgE);}wvgqoxprGE107OpIm`0%78 zt+6lR#H5_;P259&IXJ+TaE&4Zk>&C`xxJZuKXZC=lmNTHLOlx*Z#zaVv1W7khA0f5 z2?&BYvJMvLP^TkT16u*hQ!r4FO04fTfg41f#%S-x5a;0QVEwssDhdfq@z*4pE1J-Y zUAPxzmMM&Py9zg0CMTXWX)Bulp;tUR+nk;eXI{L^urYpeh0#P&evng`k7dan9fW@= z-K_5~1SE@jpH3J_piL2IpwOcoLgFdTG8kh%!?=b~KzH(QX{yqYeFjWQo8?=hq)%F@ zr+J4D^m@3km66*(B`1)}lW$To3_u%9YA%I}t*d~nv(8(Tme`-lC}Pi0ThYRbvoSgs zr&2xC{=yUVa+z7gujOb>;I}^~A0u=FSCr3+1@!B#(9pnYSaM&AAx7>tI1%GH;V;LKtRaGrifh?<18Hv zvsE^7ZhOij;Sv!)5qHqUq8%N6*74b2u)wmo*te|J!5&F-cTmlGp4%7YEE8~QNHCr# z0OGszb%@yGafXF%hC!>DBiA`;1UR*ewz5{_4bn8HDa4~kSNg4Y$abNvo8_}!rQ;TPtRfPU;` z)tUvyp;I1mPW%nG#jl^%P;CArjg9rz-<#_La#DX1#{+&GW^XVTd8h!b-tvB*SwO3I z%g5YW{h#mr^QGEZ0;gY)4^XFqx4iz^{+8!2oDCarjf;mG*hS0V)hAv8J;Eh6oTKcd3!aT^om8jvb_p;2W{dmJYJu ztI^eMX?y=V;$AmX;Saj+-i~c-QR{zU8!z*W4aXYPw)1&6(3&=e)Xs%w) zKoWVGh^Zo0R=>t^lP{CR*T7ZvtS@H_2776|{7UNbWxYE8`BTI2yGJjZ$8lFGGYp{m z%)#?1DVwsU`t;;hH4yr{OKO?UH70&12?S@SEq-BUTpUkwW9R&_YdkO9L;P?3^bkwk z>^HmiIro;?a>^7P6Pg5}13;jzHzLo9rN1HYIbWx9J(A@~%)jMWrC~V?mP#SQ69st+ z|D`oJZf?(lX{WDIw)bbQ5i`c7zi&qdSh&*u7sWXLO)qqxA@U2F9R4&0Aqo#^NY*Q% zlN?Drj3TcS{t^i{)a9NOv{TP^KDM_9h)Y^EWDR-$!N4?9XTGMoGr&@SEV7~Bx%$1w zNLCFP%G>vV-xu!xeKn8&(d{eoqzG9~>Ok?ET~o-+P@cPv_EPEe*-%sf4q1K7<=*@d zKK%Q=(FP_G+9eNTC_|6z#1(8DzAFrMw(HA&1v^B5AiHvMaDPKFNQ4;9-v;$Zt?&`n zwpxKb?*(iBR!y~H@eorE$si#>Cmjsm?SN@Y^S5Vr zJb~(@&(2ag8^z+e;PouGv?>~`0M->zZ0{)E|EvA{FX2p$`1Ai~jOYHZz)6!46$*g_ z7(rIXFoGC|-o&yBDx4^)OA39yr&u z(Xrub^w5Sf6J<>5mw099`P0w()uX%*&PN4ShBfeAJ4CZDhE%*w4cmtq*m1GO_n@Wb zZ?u%@=AF2ca0%DC!y)1r8(Ub|ec&Crsc8P}(oK^L6I?U*Ft_*9lxi7;n2O5)PT<(Z zhA6bEBcYMN&-whrsA1CiZG>>RF+YzEmBIL6^%}*McW7Ey5rWVRiApR54*; zadCwYZVEK2jX~LI5ytvcF*XnZhGF%pp@xpqzIk>}YB7pHWDctyG@`V6o3JV-xR6aE zd2l$a3Pic9e5=c@5jSN>13r{GopFKC5c`Fw&mS0gsd+1<5QsPntUVY+CI)gVZqCAy z_38+9gG3%ktQM`Z0b6(}4jeKFVr|wk*p=kJQVdiw7AX-3Dmi>+^O64mA)&WmBJne9 z32x4zJ>JOpq#Io)`zKaSen|?Ag2DLT91Q;pJx3Muqi?!Coeo8C#ZW0y?%uv#uo4iI z9kP5ZLEy1e;ltM|(|g=QXjow?_j*TrRgvqO#Z|-+Lh1MM85Z>E=$EIo_`U9PGZ;1q z7?z*E8hpPyhao$D>i`(i=UAT4F78NO+QPm}UeC`=K2JZ~+?ys2{sZEAUhfF#0u-nq znS%LIh#i?1He9X1E6u_Ed_3Alt*G#D;e9D_yV2g#<|j1@>-u$t+kzd!;+ErIm&9TY zYkzgZO7Qj#KAu>MlWTsUyG zkRU=as~m?xNv-KN{s!zSPY`B{o(}HF*VYk_{WblS1hwSGhy?5$mRIj z8ZsfJ@;HzMWizOlIq-?*kXXy0Mb1rj&-cr*|M0=!$=$eZ ze7Mhg5T!aigE*JI;;l(PvGzV6+;QX#GlCwrK)3Sxx`pc2#GwPNm|JEKXscP`5F(#w zBxMBv@PBTm$NvQ1>8`^ha_1nwWZQy@zw;&X&~7o_=t|!Q$Y!^{m%YZ7y<6?RN$tK_ z?QTP8un(TR0BO6MoM3+~(HZs5A80IjtGPJn4|xr? zYsRAuYET0&CeVZG^F3HA%{+sh?Y|F~`tpJ&b@0|x(b5PT>gBp77*`#Cu3#G9%Z^rX z0V+!3#kST)XI3Jp`;i6F=%Sw9a1iFvs$kw| zcN2+=R+ER@xi}dkqPgDaUeK0T!B_vL`FHiVZU`H9F+eKjz|P%l5;!W*{e21vcHTLW53DdFmS#lI?(Ls zT80QSxe$WLkY+{wW>A)KHp>z`jKXpL_{q?YME$Iv9jdm`K0=;`HlLn>3>I@0^79W0 z90&8{FBY_^*RSX?qiiA0Nhamgmz?Duwk}|Mr?z}To$Y~T6>eU!1Ccsm(?1Go#U%L% zg$n$!;B7>L+v8xUvAjoM3%DM=jG&*5#Ix+Y4Lm48EEI6Rxvn`X~ ze}aQ`mAZU>9|1VOUjU;JF*WAapT^rR_SQN6`fq;! z;C<`!WWw^!QvzTH4)7@uLSb_gA%IYtia7{|qAw28OuV=+m)>P5YQ#A(|IFTkq(XuL zj8xK08V6sxXwLbYg2@zrk5z4&fl#XL&|`0n(%IM+ZS^wMX2ApusJH^-Hh*B4`o~&! z<$pZIG^^>dCX3<*m^a*-IO4vI6AmCxkwK9=U8U;`0JaSToak6aiiJT%ckb3|4k#}> zrgO909EW?R!D6XUSWqRM&D(RCYNiE^UzJ%=UD%8(;IGMN48TWhm!4k}4Qr==K0M_W zJ;QMRrzm0%=$dK%4a=$6?fOA-^PRB8i9lsU4)1`e6^NdBUxUDqXSe}(y;83o4hh@f zj$TPj<;jWZEzPhkj8ks}`_SnA%8( zG{L!?AWez%!65bUwmg9M56C8^tyG{n!0_fn(0I2<+Bp@~R007)Cdy>CQG@p1hT=;F^(DApA>)2|SpHjI z(H*&(8zxb|=T3K-D4RGh_LL%9Xcj~2V8i67%|u8Nu)|hMY$AJ5!=z@K<{yrQNkZ(F zEV3n|g=72G$k8D>6=8t-sV!2W#2diU$ECU$!_{hSy0=gzD*1Sq07N7N4iS^f_!C)& zu|F#qm_iSe;X00rLA}}b0Tt<=haWV@LweuQGfJof=0XeLBdF8$0q$SC@-k>Cph`Iaa9s z)mP)7LU&ZGrc{?2Jk7{ad3rM$8V_+ezYzQ_!fBZ}u#%xU%gm`9zRK_m39j0{6=juql)lYqW z@vzO?p$c_;_?@a3wGO}>E>8*uuIe^!hWYEK#cTe;@zfw$8-Z!*N`H9Qhpk^(7D1eAL+RiHdhFiCr4#KB zCzCcEu!mEFDAt974#Xg$&qv(Be}kS~w;5y;gqZe=v|B8zwOi;0^e%27#P_1S*#CVu z8IQm9TEx+?Uv!m4ye!$0z}Ev_9LWi#2usNa+oUv2Q@%Yjwjpe(DlO&K($jL@ z6Hmf*pBVCd?qW`&8!P7SP;+i^RTsca1tCwMK&9_#yOKS?-8S&KHCom7++;wUh zm$srO?}I*w0|11d3gi=W-8Y{yaC^Ks3dId1io!@}!scorC?m!^`OH&tCR@v!MKjTV zR`hj_5AQ~0k_QX-TANzVQCCB%?QB)7flFx>c%XdSJxYM=hixufaHw&JMVk;`s?8wK zy61^KpA6K#R%?=1dxMBma-X|9r9KkL=Kgr`x~*p$0Eko%+i?uOAr7@+b=M=PdBhcS ztUe~z@%-Y*5Dpo#T8u-+-Y1*-dcMsoL59Kl-$$+IZKU}fl|J9&FjSw{Pta|RIaesL zRvJjEN$&SEFuyOIvfV(vTjx)o31ye>$Aj%?`YY}}hrlj^_5SKA%x=Qy{4Bp_dUgrb z_8h8EC1jeZ;plk~f z02e}qZC zVpkb)oAqiWwYo{VRv|wtb_hEyIWLkDHa`ofzvvt7fr_}e%3knRB2OSm2P4e{v=2}u zfT?zz8j_&qK1O3F7(o-^E%ZGdWTA7h3;8?szND;M*Zyp%;svEC7mfY$pg zZF#@wRq;=q!8!-bJ~)H?(QKjN!acwwOMc--UK4wlJ$KA%7FwnNRFV}q7d}<-o}y#l zAED%GDoG~!_Nieg(g)Wgkw;goBf4I?U27%QLl;@ZUb#XWfku}+gW>60{+%^mM_hKE z==K!CK{M6g;UccevkU<$adyafTX3?C%PzY3?>x4C@hKyo2EDyj9p`CNDRF?XScOeZ z9XlwG>!YKJ3@l2M&xYf;oWHbkdTLyU9T3?4sMlcENAHs}y`KBOJr_sGq3sIE42fRf z##anE4L!>y<2utC*kI*_hWu~bgUjIZy~aLPZTZIt;@;KLNBRP=sWZ7LbcO>gnKl({ z6@BnN;18d5!0+)D51+=b+c!-iGeIumYu*UKV)gG-5@)w^uKjKfA2Yb$9X6*mpWqW`Q5)0U0{GSy=2guZwKml4YE|kHFFZ+n7eWXm=<&B8r zYX+gYput@KNtu&k4y!|zf)5Ehv|<(49O9Z<&_YTn#*fS599lVcG<;nbPo_{#dI=wfs{t&G zO>_^On%$TS8AAtCFCs+3)<#L(+BrQY71BKX7KL!No!95E4G(2ivN(ALYB69pQRRYY zg0uD=+KR1U!SV92H~u+ws|3TY7=%tpr5LlCn7y>>c{|f;oc9`aS}{;r$srzJ`25V4VFcKdD6HwRQ_51EEhAUsZ;-PjQY52+U51M0Tgx87HoYlWq-{s4#H z6pb(h zC8|LsL4(O6wIoT49!?>G$}NGu8A_{*0o$^Qzy~^1S>E z;R7uHWp8LLg@YU9dJ-P`u5QH^{%Wy$pWOX^GI;r6|NO@qvRvdZm?4$9U}{S%c!r|3 zj^fv??hSO1Vx`5@{>~v2_1ASANQ-1*2^eD<5Xs9D_FlE?5fAuzBb8z-RtU1=Yl$H67ElP!Sa#4})W|PWJ%TQnU|;8DR98iM~PIl4?ngx4o2G1%2o=q z{8^E9cEr7lCpaoJ(u#aSiqDLGp*rWy+u@$MFwEvYnSsFmA=R$A>+qD~&=j85s=nxy zdPo?r7j$DIF|KT8#}Ljn>L|>nX;rH;Nf0U@cZ+FuUU!3 zq@v&$V!I9br4jq$(k{_T{e*adNGG}YB_jf3TyJg=yy$mum zbN`TEt&(#!xa22PqbUe4<pBbc;k!ySbafvIZl_+{VbQ! zXK!}d1KAAHm`%s=c18tq$kl&=o3}Z&6NQAid{7j?#fS`{W96WEiZGgK(O?tSUXa&Y zYbXF*AD_Org`?p(UK-}5Upfg&IIn4U_M!GKy7$F|Tk=)|IL6HrGRz^Rj@?Jgj^fzt zk%A~m9&Z1TOW!0occ<)B4${S%7+GLi*V^4z0c~ku^V`X{n%!qa=zpj1WKqJX%&NX% z5^*HYDyxRAPNe|g8{`l~vG)H37c(kDAQ3YLwEy#sa%O;109UettiZc4C`X2)^s1`o z##K4>JSXhDXgjocxhaDgP3u1h@uqM82;_-h_$AK!KO9JiFC*5IGr>Rt2H z*3E%CSx7_1op=Mo_`Y}mwH0w>aUu}6D2i6>#`5+NR!EcjTO8t^Tg0>NFA%pVoLv&L zFot?tVyh}=>;%j&$}@>CpwYI$&8^%QVT`G;vXPYJqse)l0N1nFnd`;^2FP!GNujZV z^iz0!2jcb_rAUA z$8c1B2h2US%l;Q5IAhU9s5GlV?PB2M?dIVX80DCB|HR93OVI1;zFF1Q5WDu~iHM>; zBb}a3XH#t$4-3aCBoA z87`VwZ87};;`5xGA*jO~=jKb0`wp++__8$i&PYF_aLO#iW0YRuns2zzF`QC8YABFQ zU)HYdjU&UZCWeDTZh1KM#+&M2Ubm zR;}UCq5vE0xli>*uk5q~zO2`TX9G@z2xj0Yg0>L=+-urup4#ekb3)G6+qXV24OE}XYN?5 zi0S|^_=OkKB4Ld#@jV`kM!Q zP+=~W-(E}N5UW*dm_PO$+^2tETNiR0>xrmGQs(YS(QswMBVrWQH}Crp@i-OvW5aJX z3ne;tx@7@iu)`w0eAI>LzWL_-?rC*vUAh6d$Po7zUd&81LvrJwN6?u&L`Nl{M+q?Z z7B#d3o`XH1a}*K>A-jHad#>hrVV*AyeV7xZvVs)tT|Sx$x;w8@KfG+d4?w(zS(HD9 zLH&q6EFuQ4$NWz`MbOd9sl)%m3o$y8A1DL{6Hp2{YfL|~HV=eU!7uXJjt?F@i%$XI zw==Z@;R*dYzUlN!cb*EV9Mk6$(01k)5*EuGkZOuaD7xmP4eUl~G`N;Z9ZYa%A<8=y zrc7*3WBww#<-8jW@e=*nHQQ{-cMngoACbfYK1G6fX{?n0Falcdkm2zRZrLW>S+{bR z>^00aJF)K^HCE#G!&B4+7FABF-(CUS*vQ5W5~5b-yLzHlhr>TJ)~c0Tcv}XC=KHUb zMCr7h8~dXXnjrp>=te>^_JycaOimghqji^uH%{&i(o*J9|Fh6KbWZ{yReav1FF3+o z9e1H(x@{S5hQ9pw?RQK*U1}5oIt|TC)c;XBkedbF#~V1ZCUIZ$YZ@8gp#a9D z(CXB;*P@6qNHLTf2|9orwW~&pulu$xeDmCX6dz*1*jy#BqMp^z#_UWa^jvWE#Jjnb z(#Rn|2+HHr|JzP|8_%3Or_(}Q+Yu!gyDoDdT5g|l%9Uup(u3|lY@2zvhFQ#`@ z6jV>oA&WWr7YS_DUcM9ic(QN+er2Q+d+r?qxj8Wnm4ZrTBn$ejLb3=&2NGofLGs<# zQ-B=L-$d{z=i!LNA+~V*5B0K7spxCBPWZd2HRP8e_No-$s)?|tRI_~j_7BU0Xekaw z{8#HaRiSstx$0k(+RqH?CNYG7wS0m*Cr{ zR!bC;|A6YVyTMUt&b}wMNDgSO*eeUtt{`@ClnBRWmqo=e?*|`5&A26i|GQnkBmsvT zDdy1h03BV|C2ov>xrUn(Hqp?lWXpm=CF*8ga0)iQM!x@#sdsG8vumTZV>GsHn@t+q zwrv|%Y^Sl^*tTt_v7Iz#v##FHyWVYmIOk6|<~+wS#y;BOHath`MK0&e+@E@H=7;0# zv@Ipi`sCjfbsBu_d3krJc(^;F9Dylh*B@TK6Rtn=MU`=;naJcRq}k)qS0ku^kk7*B zKjY@SX!Ye;XEC${0$zSkV>>xn1I5jM5CX}Q0Ej7KfCCvtkJ@v^;pLnsvf;jrvHLjiWq>0p(JC)G*P#->YFWzCPmj8LxN#(mZ) z0oZiJrhIC!QH9&C!L-4Ygl(DIlJ-D_V%Rn=43$;@^a;|tv)$Wnv_qk)`^XUI`?Leej5T)QfOwl{%@9~vIn5rh)IE93d47($Tcyj1%ZKY81L+&dnl;Mpp^i#8B>?8}-}z z=w6((I1{OPPkAc5r)PLEArGnCgPUtYNHMY7vk(|g`kXt}P~Y-Tc}UPv;YoM(0Nh+| zYPKFJ4oL0&O@Jr=Ka6N>QC+GDSA`sJ6YxbWcgQQ{vXb9lTEpv*kV7Zs%|1=8-~zw6 zx;!=L@j>@u1Ql_LA7Ye>OCDCH%D#=7OFMmdG(MjC^HPx3a8^FRm3b=QLj?vnYeVzM z!2Jaq#ZzIN8rk78p9n$2C)Ahc0YJ^q_0^}`@U}K<#Sr~YOY^$AIrnX5;M4AWBDGUC zwQ~^{EUgn%mwRG68W(X*lt<-oxlWysu{Fs_nKSVDCwIoTO&~Fp_i(y z(@UVP7y`>Sd2PY^wP+LMPX|$ONZ3)Mh$5#F$1W92lgJXi1W8TOtijrx0C|e09Onw=@#CL@TN8_|qddgt z1NgdM+JW(k<6K2&x>J{NKz{Zl5z3kfuYLbLfdcA4 zWfmZ)(b_DK$+q+6X1DP7((2Ae-~08Sl`s3I0nPqt||9!1G_<>pnO4L6#@h_3v&h!Z5-8R^A^5m1*`wSHVOtW)Rx&y*(5S<{${ z8t_p&kIb;E-U+mAVt<28>++(SC9z(Fk1scyEBQN{7|LR7V3oV8vRmg7Gh_ zmP)+UzQrhMYam<4L9sJ>OxFh*TRn%Fx%iUX^Ekb!diNDxB9z@8-I}*vlY~*}_?*yi zaK0$a2BUar6J}>c;MnIH1HstiBAEID zp-yz#btT~7(G$4o^;2ql#35`}xp+o5sy;kg=IZh7nbv5h`m5RYP^Uq)zCE!9HCiHa zMRZisyE5qtN{1o@IVgpiw-Hj!xrOau;dz1!!grWp$LQlWK?h2WsFF}7h7d_*YW&RI zUr~aSL9st+m!Va;KJz z5f4)0h&D?oqd8ENaidlw7N%#Hz=C~a_V37*J>srDAO8ut_wpytB3}2*F0)K2r6UTc z%8Zvq1OFiy#q%W4*^vRFN_~c`f#9h5o;+{2k@*lC20&dLaXuwQo3udK^Z3;F!CbV< z4MK(aU)xclI(l`%f%d^~zYAt<;2IR#9(HztJN}Zjke3e51{kkL$9>Gx|J}nl2ODjh z`b!un8PmeBq;1fn`H2%(#&QI4*XwiWlU}P6I?|UkP4g^~1I&NoT0{uGBK}*0F7_#H zUZrx+-CBgV#)4uhLwbKFL+D;pH~Eb|_>U=t-ojw|onXBpx?n&kv+3?y=yGEJ>+{Y0 z6d`E3D3lWZG0*+}@+N3{@e1G0E>T&U-QQAYB7iw^t{ClH|857+8@!ulZ znW*Jb|D-apeN}vBjyL8M*|-~ym)cX1EZ=ed{mObnJ{X*B-itJ^pdAts57#Sx=STg_d+k5Z2I*K za6!Dq#KKJo%}`T4Bl`tyoGt2h=#Af)oYqN&Y>=gGprf7G6FrNg#emqVk)+bE~L zju`;bU;53Osc-_;b9tH7+O?KXdYW=T1sR8_i1dlg9bTJhf%=a(W>}(Zc>#6psoNfd zEuV0G82I7S31wxhZLqVkjGh+KH$2Tpfcu8=6F)y{*q=qCbg6+*M|fy>JZ4)-a(+vA zH2S`nofxAa7kpGdYxqw3$q!3(D57jshR}?F-%vU*P4ieVHNPuw3n=r+hiQvNz|PZE zM~VmF4ab!-0E>4OvJ0K2IjQEGkHo#uo$lk~WfC(gY?-Wiu7#VoV-yYP|}&x7d;?8jI-}2xxysH9MSEj1Zm{-@ms+N(wulV z(Dh*aW348mN{j1fk7*)S6n{_kc~$xW0lhL;2SZ#GC#?H=6OIX{(%yo@4;zf>^CcfH z{W44w{~lG0MN~9?=7l~W<;P9$1b!w<0#;0=B*` zeO*bC<>`^5gcX+}#(%OESMoH?8OI_6lHo?0f@o4?n@~ujf_^iA=Sdx2~k;r zF1s-}3AE&UkQAN~E*LRFOlZDxur16f`>5uQ=juinm}$PUOVtBj^%V{&^|>t_>+D!h zY7h?57^jL=;lMb&aSah4`BdF;D(2L${ZwI!)$=5yFlZ3+Da&EI7F=?Q?KU)tGtO18 za$4U|KtzJ^&H269+is2|7E8DG5o7pH2d8@d{E#kU2NBa-iuohppoHK`-eFy1d(XP!y5fNRhPF z9Oz92Wgc9X8fXE0UWNK-f0_2!AoP!AWBWXBfcw!Us(E^cpCdNw%vG>Lv;7mCE{7IA z0YfR)9y-qNgpJyPhYN>Z=u2tV(I~sxA3Z+L=6?>yy9FUci&;U6Y3nl)K_X3XHIdhG z;aJZRZ#}y^zDY@i_qo3Ku6QA73wy z0BYO_i<4NRM!Z`79p75t)qoiLSZOd?&xr=3jxD9x%j zNOfSE$*mR$T?`2XW2>6Sqvq`#x-<;qzV0ilT*j@;v0q!fI=eg@Nc|h9D_bk@*J(Kq z(4+a;ot|6Gw8O~MnfhS<=JaOe?VtG`48U`bV>l{K96zfOy;vGf6qIXEg<*xhw(>Z> zVE(N8p#_~i=y3wb>F(9mANlC+Jn5gBJN}SKtafJ;v|Hy6%6``V1B%A9QkhN`)pwHm zAUS^2DEa5UNiz|$lf(@=A{azsCMdx&QAqt>5W-nxW(KTz>6eIL;b|2s+)rg=AwYX3 zG-Vs#i5D@PurY*WO5t6Abs=i%=T%60`ySCaf8DCk8bcTCP1subyIhV9h@fj^VJj>#)H%X zRDfoEN+8B?8_^|wf=^*Qh#09iu=&AopnRMU(a!3j#)t6K$k2>1B8(C@MdaIC+UcGU zOyE7Cuw^(JSPGtS9bUl?dNyp$wJu0evuC^@@uo`4H*`M&0ZO(9C~%hiHqA{=?Cip$ zyHf=5ibPI7s8=&aEQL{=AlB_YD*50KS7=Wn0lPqHv*HJkI6lxxKE(`01b{0D%wJBt zweSeB-jx|JCx>WjHxO#>49+@I`}R)qdaQ`2py#_qOy;z(=<(KZ-i}G$sjqmq>q}kn z19kCzb*PJT%(|a3?yc}3Dv=p>gukLjiY7pqrB3p+^0AeT`q+{ZVcF}jpiWManZHXQ zfRq<&+8Q#o(4!nf-16c`h<<_V?jd2uW>*c==9Xf)T zU)1a%#n#lXWP*jtp}GynY)fO4j>YyjOdJpV#l|G8zL0JF7o zMF>my!@fElm)zA7B|_XLGMpt4XJP(_oQ=VBY6^+7i5<;4WUd?mB4=}8nB3Hh)q${|%7un? zJs@%xABpIA_B)R(y)qklld|Xp<tgVi3LQ? z4%I6Gk+U8{|B$l?>=PYZ_)?Gp-@EO8MmUiyXBua}7+qleE`^tDNg<_QYuV-C>C$Hm z{uVmlMsP#8CJhY99(|AAme}QsqLD4!TjZTRW^~Nm<*`R=`?A{#BZd`5tyK@hrViBX zcHUV$=V0gVZrR$z0}N>xy*sak*=Rd0XhG4+N9%p!kbJNgwRKip{&=t6sve{o5SNL` z=wCuPYj$1YNBOq5#%EM1ZLdJ?<382~aE}Nf`{w(*(WIW2;m+34RMO=mM4;2Mwq%ld zf56EYr_scRftmA-doLt@CW_YXx*Hiku!}4#VV4)*y9$|#7a-7k+tiwWhV$-o5$VA) zDR?7GYD>)%HtS}927YFk_6;Mvzn2dRfUJ;inO4=y1knHU^%Ch38xqXS9mzA~a_|Qz zD8h_R?{Oa&S!bM?=*>K^GR=OygwPN~4f2LCCj_0QlK;p)cJtOg#U&LOEh?b^H{%1- zuBqmAneAea1~910{o+ian_i&w+m9+M;HsRUWYP${?y8tJ-O;k}j}%+1Nivu7&){mW znYWJudxepRB#np0YKt^O#JJiUAY{DU8;FO)no?Iw-+{sM6h@KR9}R;mQ&Z!^)&?1b z#oS*u65!3w`JC$`8G(n*zDyhxA%zaY!2h{P7Va1e1@N>E+Skhu%Dc1IVxZ>^5X=o9 z(`Rx`1wS^-sDxI$_2KX#00H;bnQlV3NF~qLI=@E&#G1f^m~(`w^L9)`52Q#}Thy4I zW>};`LCo99ZJFpZG}F1Q*Ms*mJOm_=xFmvIgYftoU=B%x9AI15(QEFG2XvAReg4WESkt4-WDbhk$T4d{Yn!+v0flq* z>3n16lj>54TgxOt|J26e5Lm=Eu|O%~V(w>}!ip*vD(rM8wN{vFi+QrE)FyrntoFr< zT5Yz>g_3zE?ZW`%=5Q}@G)!V|AA8s6YvmOWKwQ*0JBKL6GkLzF-O_i5Sf1T6Lljai zLrL7u_;MqUms(KVO}oTeS&pKwQL`{!|hdADA#kAI~NYR)GwK5`EdwquPa-g@iOEp06CGkdAzVEBvj9@EKOKEom7M*DZV#M%P@myPfU>9as>OuV^ zd=CyZG+w>2n>bmK9je^^F!MILQElO=1$ZRO3LYBdDH1U*g#HLpfq_SQhuxPhPiv*k zCKl2e#=hCG;{ugcm5R?A96YmwXO7zEa2ArMIaURU_H}7q@~&*d>w!(C-qW~6UEYFa3`f4&a;(7ZUdi7S>*0;_>8+@^}nEZI)=LkEZdYO#!ZaVZd4%4h4&S%Uz zV5=tXATK@#5y28!6molV{JQe zuk9PmfNOIND-V&OaOm=)~r4TZ+ z?~(aw%iT$o+rxyI1Zz9{WRgS|@%Gk#3Cft6kaP9t-jB+@ul~8Gn+??Z9AN8Yi!y1g zWgkddO0p8}>w!g^p97d93BDIZ?xnmf$F?#m@WfVpxzov*xxXALR$gFXv83dLfkFT5 zryca|RdUe3Fn@qU(F^qP>Uj)_l`Vm!jP^ z9}f|!mxFyp(v_DTX-*z*ZGyG83P1d!ObO6HNg!uo(xpzC0`LdkpW75oYIQe0=(=6I z80NmHzr*)l9>MeN&JaD>f5@hxppOy|i5^56p4Z5;lSs4h?6-|F*1a;_2DkJ6-&_43 zNj@!i5sCq@1*|p)D#!mg^66UsG6T6S<}%t%A_8FWnk&H7znxJ-v9xor?b=t*_oO7V zQG)%Ji-kV_x)-Oe@40bZMDd0Ftoi+~hoh6@$$4V<hbP>C^-vZ9VW zNHqgx)2^k$i|&g!@%y*o8nZnvC0wP&NnSwjcZN{#n-zDO#+%dc5w<)*e})TG}40_a%y<&OqwiQS0|_498i$M1(+^3 z*2^QjI@<2NvKBF6S&tlJA6Pb|;GSeoHvm)>Ri^Hl=&nw;TE5DOn(}WpmNJBiqMob% zN^+s!94>vp`@zWl)14CxYz@O&dN{4tu_{LlBSWu#(x9tguPz>6$R)aasSPY3_w9Nw zzOvA;_CA`1rdimyXwdi>G(Sxp&y-~s<5eQwy#y?kQWz3Z4os?TU(;N^R#nKccmR$r zdZu0DbT$yx>uL_F6pImNEFxn*GNnEXD=J&2uh{EbXga$bhp%Gv_?djN^3VDOa{EwK znc+N%0K0h}IYt!vS!UOx?kQN>t5B+esItm1D7hJ-Ih&=YUFfx#6p04hd3&C^iETRv zGqPdof~$=#8y@x)$%bEN6a?pBUVu8dC!hSdNOMv}X|#UG>)`%(5KA;wab<}Xjp>y@ zM;#OL2;~Xjb4w+JEv&O7rs*a?jS-TFBOu19l~f5#;JdG7OoS@0bPK)_4o^e%Pyr2i zsz}KxBqD?BWSsr5nIejy9JKdyzPtH)QQi)zCqckHIcovm8bJGmXA^Q}5#SRSo%E82 zf5n+C$}Dv~O&bY8=4hjFxo;xh-OgxO z^m~hybkqAyfX=ndtcqD_17Ky0(b)8z;RnQ^cpG&^)4Qoq9eBk&JNr<-X&(u;7t47Z z*fmO3w?BY@|MrK2#q38tF>Zdws*hENpC@xJIlX#LUGB?!Z2=LnYB_Y`6`(SY>tiPm z3m!DMKXuFuWG!?^`#n9qhJ|O$>I_gR4l#>%`p(*|8LS!2FtEUoLOJRYYtvNI$ z)t~`7Ab?!}X19-O8Gtn)@^P_8GESl7xW>0vfJVrRi!@Bd_ki&SnNf|e7yyqX)!!Go zFA)+>{9*^b11=^Ug(h?aE+IS$Lh|2~(6g>hkukAaVrmy{&b<-smnv5 zQ8VCzg~Z}_OLAjxFaRr18~x#*rblQQ54F_|s<-jpI06bP8zf507XhKap;H|!^7NA3T7$D@j7~>tSFNS}JGWk+*LTXU+<`q-Bdx@a0{p2D3w{Q$R&wA0cr(7Gq zBYb1#Eo&lXSC4U+;1j}J-tZX0oRBrWzl1j9gF4*^mP{&}kCfSEyEvS51sswcekL?i zoJ#bb0tLaMuC8Q5j2%lY`Af@a1}xYE$tym9ZFb_dR1fK-a>AgSc(kc4OVG-LjrwXr ze;vqjIGTZ`{mfa|s~XE+|I1|~9Rzv(Ili%lbjD0I0c+y>K(OLkYS!>+EUSq0gDO9M<`+l-c5>H$*9{og|Ip}Z;RF!$X-FbK@CUFLl6srCw2WOo z)08*%z;h&=9Xhj+ffKzv!jNwMA za-RMz42~_j%IV9$j9nze0_nhjqidJoP1!7GV|#X~8h;iWfm|M8kN5sf+yY;0<&uD8 zRb8eZw?Ds^Ki?}mpr9|1IEo!e{;(-jYRK&R5}X4YF(3n$`p#jsT8D;2?PeBvB)6iW z{$EJmm9^MB6eS}9;nl*Ra|r}mP4_owtE5r+*fwBcN#yzwS*XyU&2Ed$H_xD?*eKe8 zDCc6=kal);xd+&OZIcp|AtpRNO1h!$<4hBp61*9}o)i#N!4Wn`E2}sKX^{gOmvr4U zw9%L6(@pTtsym%Z8avRyFzQYXnsgtSjV*vX@l0p}n00#7g0_%lP2~J=4M4 zNX#zGPXdmgVbx?tBQ$>+HcbI3Vgx790IlYk1M)}Tr+lK251=`-_Mk8jiJFCbUy1C~ zYlCZ2Pz^@Q%(C(2)Q-LwDpOLszhbux~TLm4#jS2~8p%&&fFI`$J{ zGBthr2-Pi%IxaFgDw4%u2eGb+q+}ebMbDA3hx-`q7ssEN(Muwc(+)@bYDNyL0IWyQ zORubS50{-xRaaSQLAbD3OwfWuCpA#`MAOXB!#Er#s>&8d^u#-5BU11KvS#!%t&#}L)oq)XGfb}%sFP>VKlK89qxSfi_)+Bgu?0y)zw z3hd4%K)2k#PtkzOkpfc%;L7(u0eOJx{=Vhv=Csnp$FbLGp6QD7oMQq^fWkq08S4qE z1g$O8bDYYSjk^8*J&x`95>oCoL`G^B0n#HYJ&*HbHTzkq8;9HXF@c&1u_y-&GITr| zt;SyVIMQ|mMA;ikK7EWy*W_h3Mf1JH`@K@#vh6RoRP|P+0xS~bW6Ez*fXj7OIoqFp zzO6Apc1C9oe(l1|>wFT3B;FY!Y{DOtgY-7SwqMRopMG8XCmD-#HPl%tS}==u53}r6 z_*kovkB6+)P!Q0BHNF1b_hol7jok8V+(- zx!+xV>x`-VjRqeU)L92Ga@aG2Qd&{9epWh$k!Mjd$zV(6;i7h#(mdWY$uJRFc2}>V zb%BUyM)~NO%wBAmx~ZA~9i^Ek#>^_rgkPm>h1TB34lJKT>KZ6`|H=JOBb}XPE+WX+ zQiBD;zmDmRm_JKG%=8Nriu>Z*Dca}gT$vb}S)z{bJA)#OXyZPB4+(yS*ah6oy=O5B zNW(BjI}d+a1`(+s6m9tRqusJz2Fas#f-w@aSJeYTbL|rpa|XV6#u9>_%n;|j0ST{e zO;Jr%4_1>~BOUjN8g$Z#iiUr!rm8PWl+3(cW@;cpPJz`h_4s+BDoWwL={M_EkqX)d z$#{wXMCq!4O}-R>NWvCOA@8a6mLlQhYC5o2YshW$NgXVRdZI(2L%}v8BdJO9J%O?k zPq=^x_e5{KM{`qI|1g@U)@~pj%4jJ5l9SE8jr#|1R>{>|=h*s~VpO)ZSvK~j3hXjbFo#m4 zm`o6<{9W_(T%*|us|akbRQ?fKq{KeDVKVmW@Z&k|=}DKU7y5ng&L11!-;DwCaL@+e z+I^2^-OpT7bq_mbTNBd$3a#%#Nh(*CgaG-4Wj?dR@!#xEOSlCCI*eKWa~K2u|Hwxo zMB!skT6C^9mpuV-fC-$W4i|K2p=|;BS;EhYd|>3`G8lb$A`rbZEN22bxpULY+5Pyy z61GDa;*5~66D@Y(==2U;h%Fru40B8=1n5wc`Nw_2 z*NfSXm7I$+{3iVm`&5Y`hQar;dicuuy-HP@d2b`jF&Cq8DocrnK!-$-%G(tp)+)#g zb&PU#gGKPMHo7RB0*3iY23yDw-Bv?XD%J{P%AzyUoxtu8K{W!m zmEyJD9Y9X71u~Dx42-;>z%7gX2E(mM>ahxzz@oVlCLW1tyR^~VEiQz;4}`H%a+8iI zg{Bf>oO1d%vsT!*5X0(vUfBIKgs?MIr(PHKf4HTb!GE}=Em`5p+W;Wy^+L|^=M#}k z6~YJ4oxQRNNeZV;TpiO#L-UY5EoABzu>&N)oy~MQu4=f1dABap_2M&>dvd{HyNAa+ zoY*slIiz538FKbX0-4Y5@P+*R>jsY#-iA2|@_!bISG6!IU{W0RX7#!ro{1cu5y|~g+LyL`m&kwr)uSzK$%npBS&?m0ySL++(?AK=>s{~pcEPa4C^pU)m z9b-)yGNJ{`&-RWVp>u#b$z6M_zMsH#!xi`IJDy<+Y<5Gs%&v`%cZYRD_3bIC4QJ%Y zL$oYd*u;JFT$MjDHZdqUU+Vi6ah1lf1{nHoAjk4f|6sXB_cG(fc{ zBpVgBb-aUVAJF7WL=|8}AFdN^&*#u*$lx%kA&&5Lky#~OdDgXlPU5Km4=)41=~yN9 zg6rkC3UXXabO~>zy}V`9fRNQ+iM#gwNz?=}KzclG36Gs2bF<;)a;uKM`f(fbQK|7x zo?4sxIfX>FJ~64;sL&~C%z6Q9xW7I->n9Vq7KFR1qcdYlQ&U+p8p#HnRLMT-lF$IedHN zo^jc|60i|p@-EE**+{dvqgbBndiJVV@s(D>%ibUlrvu@jK26w+`{Qkk>cKb_A^xu| z5An~p9`#%`j=0h6`_nW70Gw&yrp90TN_xFhpmxzl|NCBW(fHWGd`~su%hy4HZkbDK zBcvUKuqlS~H`SntwsJtD`;U_5$ElQnVnMCiaxB#N6lR_8-Y^xgoEIh%Nk}R0(DMqU zUjLiad*x6-``3S25ZbhxXc=H+Y!q4dUdLH}xWF1>|$?J(2hc3SyJRF^tot**}BL?9A4QlFt zgF5NxbWkD)SOpmgbF36$Z(B=&N*iJkw;j736VVDB)Z)NF&D9MY)Lk#KFYb9n=IZ|j zb-QCOrI+ni#6=Z-RmPTAam3v9;%v(e#uThPCu0RN-9+L7$uTRdeW3!(oA?N>kZx;^ zd4uSt*FTswK-&qC0T{fX#1^Le3i>zUV7R3_YAIGwJ{kvg3V<+c0y~a{Igj5nYf-3* z>zsGy1M0#p=VR_25V-i>$t}G;$QN37ho7Co4#@PmlA<96TV;BD?*{$*R_bxTA+Apf zCV>xic~&CeLmeV;y-oV7G}ea9(aFw0CJ%WhzZz4r(}%8ms@d*W~K|kxJ>NE^y3f@*1xvRr%(59fWlu_!t8rkMKQ)EjdI()mi+j_x<;?2nqv`wm zh{W3nRZx9X7i-GvY{-1jwL)jJQ*K5{V2z7FU1e&s64hJh>2mbPz`zFwVH${?eif@c zcpHiD#F1=W&|Bpw+)cxio@b_IIn&Eho#J4PS0|4QPkpjh?(_VuC=qrdr?5dS1UO+& zT;cXVa919>snsZBfaXC80Sfk-C#{{t*Ka=|x`@5M^%xLi`I?~`t7xauy%;&{ zXf$8>;bDLR1_f6EdOn)3#I2D(1egyLhsGtad}y*#rH(6)xGq)#CE!4lC{!xXrdVPA z-Ac8-aGD|%W>WBLq0ZG*C3AN36-naBYn}f=0iB*E(s681f^-rZCqfLa=fWp_G!C){ zsX77;N;baJ^IipuIBoUPQ7lc5@+>=`gy<(x_Qw!zKX960p`_uhxHe z$dE6%l{ekM>oU9(TPgFUTa57gD#yv(#^=1fmfl^Q=V9zPC^I5dj3r2n1OzR16M9kmO zO^BL&J3md#Yb<^>t+HVqrvVzI7d)EZ57b#|v7mQHz86*3Y}Rc*4*ZSIrz2y#e~cVV zyMQaIX17GHFjPxPJKNCJ7o+_(G3}d(XWH)OU~)g#zo0h|*yju@xq*}2#u~cQU7s2l zfw~W24+HZy-5Y~p)p55Fy85$NEXVtIcE$CBm^I3;@A>Tp?G43dy14+D{&)G@qxCMw z1An_Ch==3Z4Uly_CM@7i@2B0}#_;_H=Y4Ehh3ytxBXkqgnEObLMs(91xI+Uaz~gZn z?00LlH3+=p%qi$Hlq%kJkUZWpaOZewuWC}qjvexGR)_oZSVt$xkLUX5zDhS@(7jHB zWnW9tHnbCLZPO@cHxb}>Y3bk8Whxa$u2GBDjbEkYmUX21)pu3x6IP4?sZKfAKA6*x z@|RNmY_d>YhtggSYfszboY4$_@FS_#4*rC+BOPfY^0C|wIX=2<@ENsKtnAC@=I>&J zd*u--$nG)k_>u|s3q|4w?86zTU-_%hL!uA+0F=9)!Hxbs?D6hVracQqn@(hCAfPGZ zG~c<{Xx!!Ak!(g%0{*v0`2Wg)IJo}v4A0$yAplgV1^Fc96(V)Grpc!#<&dNh(WRs= zZwn%R>dBRTbw^`~&ELgba^rk2K?JMUq{oyod_Dk!U_cS-mCx0e_2;u7iEksJbRK_aYzqzdG%7X7LD_qb}=>M+x>hOI`WQJNq)~|f@_!c0$ zoh&sM6P6yTe%MHFQ1ep?VvHHp)~>!><{q$Qzh9vx%i|b;;J2^k4R&sdH>r~4tlwIF zp}~aD(84N!D&#B^TS-H8AYc()&eY|pBWOX{=22cb%*nRg#bQ>L zUNKZE8Sa<$Nc-E=lQ&t{bJm#S&P<;{&ZN`10ZL@b4z?nbRjMVct$7JmecC-al-wATs;^_T!s@qG*>P1W??fJw0W8qcS{xc#`~Fx{?^QxoThcEK_S(~Dw3NX~ zW86)!&skd;d{j6DOIToJCBeG_anNt>q$3ulsT@YWmo9GInm-GpNmc?!6=tI-Cp|O; z^$i2?3pL<^w<&SWvt}?}*&5;BgZHdMpezuTN?VI@m%~Pewu9 zP>F8e7bpC*Kjz;CK?~m|HR|xK&?43M`CccV3uZ-rh-|;esC;$i52faJ`#o%fioXuM zw!Zj%vXSA^3{k$GPJ$Xcf|H<)llTt0dI<;UtnlHib!etM%J6(R?_b zF@j!%&t=g3`41Q)!nkrx#+lCnU|pw!vH^Jd=(M(*Zp4lOgD>1jnK7bl#|Mhic(`(!y18Hl!mE&L9L4S0W+`41c3vf*p#xxwJl|Y$ zsp*qSy|N7CaSS^}xR-0_Nv@!z+-_%-qw6a`i$D=xSrrIgq;JrKUUmS8Lbu4iOo?P6 z*d#+&B%<8H5e_gUOX>))y(q%BFz84(kV5dru*n-5YnpdIWH!79uW^-{r~qT!#4tuW zktk4`RPg!2`;rXC2;jEbhrZIG8V*TQhZ5JRI$i<@Y7OGUMzzz)ZQPmWXLqzvg0?k~ zzLSY-VdiQMa9EoR4EliDXg(PtgVcb~A48ZwMqXG(;;n+h2@aOkV<9?$Qakg&08(!e zd%qVG2wxB|YowWE2m$?^NtRz%-_AXS(iMThyH+j`aa~6B?XPZsYJhyDk$qow>5^C? zSNnTD(*wz{{0Rh<1wDhP8FHiQXXDc!NI!v)RQdKD)NN~=9o7Kjp5~V^y9~D-tWI#7$Jj;U|AktMdO&i_a%=FF*K|S z9N14w?Ubl_+~)x1->|ZtFlHQu478>>-fR zf3$b14BwF2)Wy?%Cs25*Hx0r6x}St(x?rcX52RznPo;Jn1s|%jYanCZ#XWVT`dY0a zK!05@$Mx5E8Qr>E3PhJmsSn(C)bG~y z$@kd#K3r2XKeLpqGzVeDJv^?Ceb?wg%HO9$_n=LNs_Yqbf%u6QEiJ1hU+KL;2m zdol_>6(SGI{{xO?`^Vy=N#nf-M*yIo43mJ82@*Q$Z0N4JDwm6J6Ifz$m1$G+#b zMoAm)J8Yn)5sE7mVuYm>%MIkK@-UB#SBH|6Kf)G8 zMp8Or_;=u;$jA@}lX!@3egm$_>z`HOqTLSB8`)dbSTd@PLVHHlt@FG7Gv-M4jM)Q5LW5tWo0P!q z3+Vu(Ae-X|Lh*qhY`lli0;n6ni}900NP-uTX*Sd*P)E{@af1bZNTn|c;soyjF61+K znBotp+26$<#sLImZ?3!C;tcq*Eb3ANHu}lVIX(Bq3uLOe6wPZt4wR-Zf*`Y2q}OWE zcWJ>OYQSoYy){#p%y>a!9A$^WZmgptkUcfZf>Av+zWai}k##5oG_mLL!fUk~2Kv#j z*^_Q@_lMVli1vqzhv^+V%ZKQ>As2Bg_t2-LtDy2St#<2*wUF?At<}Cgf!3+TyZtee z$Hx?J8{Xc)iPX;{pP}Ko1wbCKKNSP~zORJDg)g;kV2L_7kv@0kJ8Z@VMF(o9Tk0yI}su%7~ zGyqkYlVun8mCLWoW)LJo&$C#QCzX?r@6nCRN8;p*9sr#K;o;rw|k0wQ%a1gk!XhJw-nnk zxRIDzgu2nQQ)&i-;vv$%D=J;u!o1@{+0ohFg)R zP6<-^c4ELclHDq964V)5l7rMle)EW5L~$@`GqG<}l$SbKvCQ?(f|SNQthA_lh#AVy zmx*0frp5O-lzNDx5Rf!*?A>Mq&9?FuF|b5&u&Czhe=pG(IG(AIO=KS&WraIQ^D@#g zholJ1?l6i6a}kD7x@GJUYJ`-9x;rFDRgo#jCQbn(tP^Npm;jvz)1-O4&9TGFS&f?- zb*v0TnL$M?ok;{a@(gnktqXpQ()OP#y@!9`XSN_<$et) zC@dV!VqG+1(Ls=9=30zey*fYcS@(LiZ6mxs+W*=xM!d$dZvAKZ z8?Tx;PKy(eSmSnPLmW)WlYSZ_QN5D%y3+3Ca+?tIs?&PkarIQ{Ci8_!R-e zIpj6Dje;VhgnoB?$d6J{GvLbyKUSaveoctpb36Uo+yFsNNt6hPfmpPc4SE+m{}lr+ z7!@6N7F-omy-9rkBw*Upz0wIl$dI_uQxzE3RpK1G@SDUBPnZu4md%m0(#&x4j0Dch6?u#7B*cSIl1`ZWW- z&P!_5$1i(o(>VnWJ1X(s2dzAvrI+TF+&S6xCzyVJv7Vhkbs6!NQ|&6yzBb24P{e2f z@4$vALdUfp)L;BoJa3eS@wKRbSzsqzh4|}8^cvxe<9H+hFby7BY7l51$V+1cG1lhqo&&u|L~@juxMB@qGxSV|FS14#$? zf0>#23UUkRu-fEK7>B!uf=V_SkYco?DNFzQf8L43SXiwoYKWm9gx+&A2yUi) zv-N^fBk~O-6fBCUm^@?HSAa~wPVpd`Dw9A`6q5p;OoqATmvwX26cd%@WSZ#xKeG<{ z`Y#(L<8sP4J3uHP2jG?4hvUtR^Nqdm-+r1DY6v1uGGt--^qfox?i3ITe2R!0Y*t~Q z(uT200AjY|Bolzbm+-$0MI(k79`;Mc{oULTdJUlPmAEtDl6)NbTU^<~Y;WlDE>XD1 zAE%7~7c94K+&r3g1h}9s#C9pa;+&^~aA{5vM;54Fl?7--yyr*&i6eR*{|R5}IHbx( z|4I9C!-64>i7k)XGNYIIni*KIn-oq5} zTkCD`<_5Q0%+a%H4hS4MLj-nrbMsA){}JB>#Pf5)OVmmIk0ixhrhy}_-OWj$UkkXZ zga1mHgSbyI3ij(UHeZEQMWCB5*^BpP+CEhA(0q+BnU0dlK{7X1^` zb`zqGE?)B}s{u?{l+Q77h52L?P4 zDFu&c6mOduJFD(WXp+3_F<;)Bz#3R0O{V3sK1yQhV}_7F!gm3_x2qzz0!Fv3r4{`+ zI~X4&Nt#hFLO}xk|J%f0>(83~AHv=-x(=ufxQuPvwi??;W7}rq8{4+g*lujwMuP^8 zlQx>0zVC;bZ`RDe{JSe_-F42n=j>;1eArq>3{RSr!oDx(oJ;POKO8&vV+__u(qjNtalj8o%9IJ%$1gi#WIeOrCfBJWrm= zorg?ZECIfS7Ote<6sbcE<5l<3lG86Jj5P$@<{TmMb^GrG&`h#iR}w*S-YoW0WjjXo z+d-{y^p%lXx~$a8)Wfj*bJ?Ng9A=ynBXPPH9d#5@#o^-L(jg;cb5m6YD(qwJPnYFn z|AHC1_po&aC08&o)3=ZS=o1FW-q~Acw_$NpNOCbnnRP?4Hv#9~kYx>_ zMD+d4?}DD^Nx>D#bP?AkBZs(hH$pFx zGK<*^Q=XN69X68T7Cpoh2vrYcVA0hI5m{rEQFyk={q(>+fAGN)cJpI)?X3 zE*W;7*`{ruWIF8{*Wjm=Re%OvzsPr=UOItiNi~pwGSK`0{QMm7*{H0-VE$U)AD*3dVe?Bu;SXc* zc8dbVttNrZ5e+N^xdugdH;d{ViHFUV#juMv&qvc$)bE>J97^Ttzwm+2$VKtxbyBlR zQu&g=5p{7uq6LY(kphP-R`Fdtgudv9tvCx8Yo~KDmh^X=JRWZ$Z$7eq-XK~W2^Q6@ zIN*r--mv6Jmp#yJl43N_@@-!`>qzxvq!~yNWv(xOQbd+>t(TZUw+TMBdJNF_cZTC? zU7dZ39@H?RLmolQX+;G;)P3?v5uMKzQnD5UmY~F}Fb)1uL`Xo2$TqSiP>8Gh@*hQ{ zLl!$&-!jrl51MFC4xCUIFk_6XUZ$MeW65ehd<*8DO>*4nrN74#xy3Pt5gRO*%e$;2 z@yeRI$?gMOWdmPdosvT9;TT9@riRtSxa{?^k%(6xTM*#Uvg-XP?FL&I@V)_-ga@S> z@P*FBGc3TrZ6<7+_qKGoKMxH_0@vsaAJXnT#dhimBhgFr*2=V6vW|^H>t2uVTEMpn zpxNX{&sdY0GFvmF&~&)!#`zguOzG`Evxxz6jKm50_|bC_!yVswARG;!0gVl!H)rrA4fM_5%5b#^zhI5iVq8Bv-Zd*%G?%Y5c%3;7kJ&ZHB7Xb4D zq8VbNu3@;+gYpa*7}_K|070T&S_{Fp8u(nYSANjVkST(ok_$gA&%w`UDhY!H=n{lS zVhZn46Ut zq*z}-$ra4ZM#mwV7X=0(lehRoQrgaMcnCj0EBKP~g3Z`WRK!ZZ%2j(1lc z_G&bix8D(tGr(PXa~ZYa_7Qwst-4eJ-&RIf&GZUDgp`*5yynRv~K}oer4hX&2^+-O*WTWbchSuyWUAcyWt8ajzT zD*U(eTF_h^Ne-^q1|Wq%mWM&|J%q!rL`IABLW=~uUoWEk5=+uQpedJ^z!bmy7`%1? z2FMw@t>1mL&08BapF;3o_nm@e#`K(joO2(H5CWVA37ik}oCY1lNS741jAV@mPA$}Z zhZ017|J-U8>`abj=X*o5^uT`W%2^L>JNGk-*MI-+yxqa`(Hj4|GQG1q*ekjUT0+={ z+vir7U=BKtF7BIxYa4sJZQ~)*b3s+v6;Hkj!Qe4Y-rbog@5zU=Mda74>Ej0?{!4Rf z^izE*@rTaIft3#(7YzD2=5Oc8OZd=l=e)Gog*SoHUsH^w6x#HW74Q#EJOW#AkLTWl zkN_uSkRgXFLayt7i!nd%`Ca4D6;fEbuE0LzH?2HjL7 zSmo}o%MXjeKh7zp7jMWO5F;@)=F8_d`}eJY!d4Lg@Q$AnA>%WVpkNW)qy(W5_>P4- z6)XA8VF>}YbU(8=J{TDstr?g&{t8qCURp`0z!E-1P@iAafBjD(!EixF(8D68syc)3 z%ce^S3$Qc1u;Lyl&(g@L@@bQ%o6nFlofbDliTR>|FY;Qi=*lLxrJDy-gSZ_L=m3C? z;~IAHB2nmJJ*O2iCl2dxpEl|CGep*YpiG*9=PO|tBPC}EY`q40wrG~23H`| zXX5xXkihxp__9lw7{!i=908a(cFVT(!?w%wK6w_~>;3ls3?vA|8rlXu*)B2;28B=& z7{ZP^jRT^8rQuk4GPk~2#=HrhR)#)Mi!5x;3qShUJ8c^sq`A%x+ zXJkpygs}RtgtBr|B97R6wT?4)b_=k$k%&SM>FAxJ*7U%IH;a3CYYh`FM#8ee%*8Vi z`|wwP5DCOY8ZKR64SC@x?#&;LX{I``yBcs?YCz>kpyd?qiY(;JC~E4UN#ZtqHH&Vu z1v-7J38FgDy*J0{e1TN( zn*_Lz8e$^;ys%ANXqi$FR4&PMDm)gc^hcgzWziAoiv27H@P_8lUBz>>Kn9W_$%JVO z8gOZX1h2CFX^Ah6`ld$TH%!#+FVJG03HTC6~6xag19AqM@%(6BXLe%VGqYlk?8 z_p|a}>*PshA&jPhU#A6fks|_;6^~~CCp@7lRGJmI5O^jD^D`a=vD<>nBGuiv-j zfXK@73q`-qI?7x%0owb4d<_4V{c08-`7vrEbByD)WSUs?+ zQAT3@!au2a=&z%de%6lnVu)?ddS0UI7zcn)84xlA1w9s0ff~tY20tY0S6dJSKWDEO z1mFCPFh!(3`ArpSq!eWQ;A6H=5_!6tWTF-9?&|Ji$LoMI?#gpPe^*jfObV$>AM;?p45ixh5@$(|X`R zs8V^B8!h~EuJ=209n}DYQScf4kpS6K#E+8*yZB1BZ2BX4wkfptEzH}yqOtsHVI=r+ zJPtkB4WFppJy%7K0mr|u&kBY(0dk?SlOl{k;j6>H9qkdR80DnT6c;1_iMw_$F67$K zr~6cwzxQiT552<*`Pmfs`V2YA2uJvi6FP64w&FzB%?#A&Vf#e}E#8SUhxF6JU8bf@ zny!@@r9VjYru0h(@#cSCo@=YyUqsfZl(mD@Wq-!9WeUx4-g{s{1m_^->hv zxMCYmqcPyN+eT{4PQ0S#S#tI3f!QVBc;nxy3dYKrz7Ge5`9F`chyaG)Xbt6@wi_7u zb7fF}=N?27Gqr*lO4GKg|GT8pD&lil&jBZ@DR*XK!%uumq~{>XPJbT#@x8szpq4hR z$q>DBrN|iIMWw-l#mXxF11!Z5)f8vuWOYVbFesMI?&R>_IFXbvCOaf1Ri%aAtcupyzb=Mg@fq?q+qcKS@j!;i7V0=p3)3qW^kAclJe0*X64f zhd-2JS5^Qq_t$gD&vazT_W?DUb6Mb7x@QB9JmNPeoduA{|2F)2-{B5Q8418GUD+3} z76t!Y)2sGq&bj0WY@a*!_03~K)f#rbLj1njZYAidM3D9fEizwQ{@1Nf7YP(|TzGgw zKHvZb0{-R}x54B{!7Je43FY2hIDnm43yebJee~9CvJeC(F=VJ4fl3<9)Uq`LyOH$3 zZlnb+6$J*VxGapjt`6Wc92xYVa3sqV-c>8rOWwmu&B_frx-BKCo#j;|f(`H$lQtH% zMJYi?6uQ16dX|-N#B!LsOzj02z2Tw1wZmXD!S~(}8g)}%#Kw{PN$DKa(G!e!8Z9_Q z0nz=#t|uFDNN8PEbVN(^ouo^3ipVY4>f=J-niHM9@dqHtuEd=FKGb>ywxN!+TD8=A z^G|ws0&-)kGU4Rk(FtsXkKfz3doe*OJni=}>^U@;b7C0D6_F&D@5^@lLA2=K{`?G6kNg*r5PE_!xTnG0T?| z^K5V2+fV>3#~rKI2CWVKr}ys{nm8}L{A8nc9F1Pk6gb@zgxT64C~jdY`Z0(ZlCXs% zNinkUF=$|neq}=^>gXp3S?xy5ZIQCm?$SV3(w2UH?~-Zx;LIF+k$-+XVjkOt>V;Aw ziW%HZBp{sn5<({r!nSflr2O*r*4zP}k{P9OQz&aMwGXAIX-uLJq@t?N8n|_v$D?hP* zN^F!2_+ei%4Y<+0i~x>?GE!9VvLi7lANEEUG&TXIN+2o@@$C7v^Qgz#L$!xBon08t znR|toZlRN}0J+t42r_R?F+n;d-AWH|rl#q<>(>ucogMK6G$#M$IRN1?Sbv2RHvN?R z#jn&hw%Yh&dQhMlB&Y46Gyi;{X()%z2~k3iYn4C@Y=upy^2mfRLI77l%OIFAP6EsG zy3sV9knpp-EWI**Np|69CBL-rABve|G~jbj=VEfH3)V(P)@_WftJByHQ2_{j5HYFi zvUpId(*!dvJbKP}<+u?&eeomlzA0%6_*mg6h8y5VHp~&7^R+;=S}e&d?IZxS+q8V2 zdFKEM{u1}Fp)t5Xu{zO>pip*&HOYo9lkRIy?8_5>6JH ziBEGj)rT#X^HlvT#|pIM#sM3YxQ7&pn_7WqZ{pF(F4ikv=z*GyujaK}=M%d^V2G}& zyAq-MP@u9h8T%)Y)#U=57l{sE8>*+~X=z<4s+_1Aul|DY=QaA`wsvDK zNNW`5=$GzzGR^;arau{(mxuK;oe>48Zm_6E#QPc#`HCDfvE22aBR$)HTFhVmU3-7R zo+tpI>rdu&J# z#2f+Y{pRU9kkw=-B8zP?fzzJ>c9_qV3xq?otm2r^?~Px51u`d`b%3|s@B=rCLNod8 z3!5BD#dPkN!1H{vQaZC#uR)w({HOC9P!!N_1_n(beB*Mzk1hh++$#>@N?2q|-y$v= zdObBid^#QBc@9%%gwZeWOkP8yBQ_d4()O}q+zd=GAa9}h%N+7IPDcFtrjKz$vhW zi7w~{`sk0R^Xx({VDbzri)9J00Zg93b1F5tZjm~DAOlbI(Dl;C+rV%FHOsl?nU78{ zC*n+qR2+#EyT`ligPapmxbzRGwIOAI{`O z3u{?#z$-l`_|Vb*;M8T#yE&PJRPp+{CUD-k(^V-~=B3Q0XdG3f>;8M$8uH+aQcYY(x zu504|Rw}`6!Y`L(F`o(O;TuJM@$H9{KTvL3 zM2$%yO$)?WDQe0p6Nl(?Ey;>eXh@Y%@}~t-Ur!nzaoi z9~zWpL?GrGBbzL_1~$n5Z>~R_|2NlP+yCkM$hWGRG{ldu^`N?cf8;4~YQs2n^nAdqK% z6;m;oKOfLt^9(UTgdV$`RnWj+hx$2`*4ape!CC+763{$+q3cb7a9BRbk{klRkAsB6 zX|$Fg?Y)FUr4@kNOE?H|!cFma3CBY{?aw?7f*`Oc1IG^9hS-W?Rm_Z{*QU8|svs;A zr7j%~vBX*tBNK|-msHI5QT9_kv*c-RCZoMoHyuR1%mNrnXFO37~LQ3&m<UB=6L*9>-LHv#5aHL*ad@F<8{H}aX5!SNhAS> za~Z%=z9*&R{u|DcNNm24O(Ta0y(hWi;ak1(<)c8V1tZ8o_RmA`=Pss;P^O50p=t_1 z4I~=|8^PWwdCR{DhoCRA`4f?(vsKg zi`kNqIM{3($_T0Wt=bLNvH@nQ<8MI<@H+{E*+0>~E91mw-#iA!nvDZPI@;GvASaPp zAu@9Syp#1E$eBZdQ3tRW;Ew?m3K8jpr3n;pN|a*FD{s8+zfgdx)v|29;C4DYL!?b7 zF?zKc^8%BWwUvCV0foh=O?7kRb;oIkOCi)19TR!vvNY-P($cGj2o$6T;LZBcu{fJ$ zI6{|YxH5st-ewMA)q{B+WjDFluftK`e!|CSABKvZhCY~qyJ;QR&_Bvb?aMtG-R^%a z>I89{h9equ?gThx74?;Fs_H22hE^C|+x1b}8fFmaW{<2dGsEqX?aDfpf$mZhFC>0l zWPJ|y91w3Zd$9lG8uc-%u=NG)abS=82xYcqR5d6CB`v#2Wh`7GvjqFhB`ajy#jynkVD0sq-zQa#9dVnp5w(5P`XSiJF&>quIa2~EoRcUB^>pFf?;)MQL-HX5x1PJ z0XWPXOgztc8R(5>VC@18Vd$NZo-!-z;l4=d^uIuV8=aZ@H9iJY~6IKSv=Wf^w;+Pc6wZ1Lt z3EUgjGB_H6awqjN?`*$$QQX`!nT;+5Kn3RpO1GTYl1?8_5N>C)DYlW=<|C|Yj=}mZ zBfXNOY!%A=bE!ePLs&Mvnguyf?sUsy9%mlGl2btlpBsyz9EWYt_H?G+$GO4t-utGZ^l z`}ruk!}@PJEh0WAIKX&!)a=iF!_IdC)S=T9Ow1z)6Gf6^2$LR1l;XC^5Z6N{6ft2s z+2J-R*5q&~>-@>)#Z1(-x6HF#EOgdzB|frdtX=EJruPd6&%dqQ(sXNi)1wqzC=ZKL zP0;P%$)Gn6N5d7jf=r2heJsJ2mfqG521wG}JGQ_jGCkUl<_fl&tR>Oq1ic<957f8R5VzC|&FDT|h*pp{byM#)9Cf zE*L#}Xq;-sY6`zZn`Ba+N}M$s^VWFgGh&9DBxAVbxBJfVtZFdr&QY}&UM_xYs)6}S z2&0u6b|_P1z5qY?XF48+9wCE(ql*Q07PKt~qm7p(-jvV_@n07xq=vh1J-WRc<`ALA zla%vT3|h@yO0hB}6!=k0R?w0kK<#x8#eaaNzzlF&B<}y6s0H3Ml0(p^^WTBP1BqH0 zG#0QU&^Ab&0_jF8TeC!7QGAYiuuaf~-rt$@lac21=`xt)_&&96(nK?dPM+$zCu(2q z^;I1s)wvVzS@>1ladgmB5yjATjW7V-Mls1lt2TKhs0hq5nOH0w6-xQdW}&8#vSmp& z%qe=bg3hlM#!E|H1I^;Y)Pe%2fIy5rFv)^ponT$eDI}8;4Ei>(Nt42|dhb0v3szJu zPl_r$EJh+A|G2dI5jf}+)(GXaQjM?i0&fPa4%8JNe zL7JHmumDxXY=HFHqhMPAuvXZVl(1XOkI6{2tCQ2}vzQzzQsDNK)U%LL^>u0u3izUs z+Z^eX5Zx9JYBG#l9fY@&dh7%Ly)_H1yeZBc+r}|cE$QF9KWW>w(yc9&3~XW&l5$Xq zw4}XNM(|9eKk#x|sJY-~sOrg@Q9av$AEUfQPQA@KKz@9Mqe2dFh$HcdZTA|E2!k^n z)gV;S0@`}hWK&N1Z(&=LqhCX%P;m!WnqCQ@3wZQK2j#(Zzd!vEp(cr~4k z{Suggo1Fpa#i$KHS@bfx(M!;65^hTJgNT?Ks}uw&NyDe}#G)zFhJFMypEie}&a%Zd zl5VkFha@7WT$oqUAtE2NiCEz{@{A%KUq=6mskHeULObqnP9Dqj?dsjbS<|vPuSlK% zk0OxyeM&#`4(&p($L>iDD6A8MU5j=IK%Sjh$+$Fg4TAvWpCNRxZLDN0xTnu^cr^Gv zUd>LP{W)2+{9s6nUpcAMI9crcIea_%Q)zOPnnM6$S=BB{b{fh)5X8)eJGYZG&+|Af z6t+D)SuDTwC-V8pd5D(px4%!5ZRu5a^1I=KNMglaRB9QV6IePGgd8MQx$JTKeAaqK zN9PaPRBDR=&`dp^5V>*X;u;|*x-f{XY@xmPodYM$6a`4c88C&?%8sYmJ1I3KH)^pc z5A=4ac@GgE%uB2U%5ODy!gpB@OmFLubOb?n)*x0nxcSrI@N9-qoWUC8PoyMn{4Q2l z5pjq?LiM(8fJ|}d0Mc^VaP{$@4Xe*_ALSO0d>l;x{{{=m-@LSD&9%_#(!ppOQgF1H z+1p*BL17}Oh#%P_5`nH2q+2urbnH=kF1n~2-+^Bv39I6$IS2ZnWv@MIjD0F)ePwZQ z_R400ZyDMoov(UQdf@A0OV&gYa>7IdGTY@6_T~6V1Wy@`4Kw48t2}4vt331SxrV6O z4grRM!o6b5P`=iOxJfFsgx_5|nY?lGV{wwXhdUIfa#|<9^pVFP7?nrWlXX&TcAp{B zB}LJ=Y}w^g9BGl)3vRbSu2k~~QJB)#vk*b#PCI776)3riyb3sBWN|_16!LN);WkY0 z*P^Y)t@KU;V{mwp?XnP_zNCW|cs}w{@pBCWeyXy$q3rLwgkLw$qUYiB{Vw*}l)7z2 z&dccP^K*ps2=v*7y8tT=KjsA6deSh$rm<3#hYHv#N+bkjJ4sB1wGYDaBd>!LceE_H zPAB&JA#kJB8s-pd|1{b2<=2XpZm}V5dfD6cS?^g&i*(NSvO>5y)_BKDCG z)4LJO`do; z902D4@wLtoN<3-!#cvm3&VD31;7o#YsP&th2ghNYWLu|mVt?&1l#`)m6ZppN@&(va z5AGHyp4)_Ez=Rdx>SE+uzyW8sOeS;@L=kN+v`dbUJ<-@P%(xW$JGA>0brGC-I=DI% zTDqVj6k{Tk1${45pi!7hN&^g1M%o*p(?j?N}z_Ttj z*bnKHBVWGTO;5qycM>z}!5}05#&7uRYgZu$S2ZVgi+yc$>Bw}YP76#~ z0V41!vk3;sCV&Gpd6f)wHor!Z(`KsVldxbQiCMRl<6MY_|9DCZ6r7?Y-BIaTFxPph z&nVrFJ8WFzunk%+>+GCFYsCklFPMYNbd5<>jIs6gZj0&<0sM7k(f_dmZd@$D!5}&{ zSTG9a_PXRCuNU9?-NtkC$+KyE!6G!Q$clDxq6f1aa9#q~Zf{qdQml3RV#2+#|95lb z%BffCe%U&SBH78+H3(hi2} z>U!I`h3ptVc*45}nb;!-AD@X&DWbFKNop6#dJkm2id((9C3zqQ^0$+0oQs5Nsl-w6 zYolb+gZW7Ugz<6BAsWnzEgB`acJM%fJ=?PX^lV)dBZNCZKMO3Y{VEH@Y1|Qeb(uTv zz*||!4L5>*Q^s`-lhss^$=bvgur8uTbE(z?G%Ke9D#C8R1Pk-=WW!xt@8~`+GE~&C zk=YS159GkR<~&pIh_`=la(!f(?7(Js44@CMOO|V4z2&mr<1(yt6J<4I4w`A}P+~9- z$4ZO-@zN4&zYKS9d&#Vg$5C@Y?wfaHLlR0@hAvfbUS7uu-9X5|B7r(4$NZ1TIZ#4L zE9)HDP8i@s+w_8&n>obsFYAvlqR;|v@T9&v$sWwn>A302rFpK7PYH!mqF4#2d z_#_j(9yC{%rpZ;Ye8Mm!dZFmzQVjqtRtYK&mQs`)jnswU^wfFUbb2l4t`ra|KwyL_ zYuq0MTQ47A4#p6VU!PHo$L7Uo#L8qQ|BeAV>C8+c@O4ZyvM(wG-J(NjYCswSyVNbC zR3W`o-8btjnQC{rTyh0dvksF)++U@}M=)pra_zR#h=DdBf zh8rRg`yt^WVI7B^l6O^1I(dbWJR4beRNJskE?74z+V0O?sX{v%j=!S*5V_T6Uvm2-WlfYLulPXeJ`w9M*KAVoNXPfBeh-+Qe41b`O|bS>=koQJMOqLORN) zDR4#{W{0A@yjfA_+rp9z$2jS9U?E8~yDtqHCiQp8R1?o%l-FjYa<(}Id_`>x=-C;?{B}o2 zx57oqu0UXf>iY0vb^LDq=q@A(0uV$Kg~Ni*O@=xF943#4m=1iWC(EE_?X0horBFkd z1?$fJk%v-8*pHDymO<;FK_9ik;vD&GkxwW|N11Uwmg!W~MAl+aVsD_SFc+Qk7NZlsOmXcH((CZV#Bl}+ne|gv}CQvA!GjAppyOr3tR#1 zg!gFh73ByhuPxi2hG5_;ip(YxNBn^cpwdKuxeyI+pg^eIdSXpG0u+HpvVXS^immoz zZ<}MF0Xa8+q%@4!VYvYROZncl8}%q<;0yo#8Vf;S;#3z9N>DUfsau%6_rHXhse5a_ z2fY!KHiWfq|0w}D48+0VW=49mjJe*7IjlWz%s$f1uQ{Zq8j%yt7~W!CFGK(qs9>p< z_(|2tt?83$2vN6d2P$aqQXc_8jtzQyk#;`h>9et+C#h35>%I<(okH77d^a$2?fvUD`r%h$tY62vQ7a8eQD`EWORG@8$re~f z;8rqGAyN2v3CFFKFc0*RNT`ITKwvkqkOd;)!uGV{hZ7mB+$~P{>e_E4H@DPy_RiH% z5BDWQDBuDHWhnTmX!lsauM;2|N4io`b>+y>c~R-hFEXsUi;6%kk=~8{Vs^sOI9||P zSoW~Nala!>bWX4%u#BPLo9>quAghNSB(6nS;R-tI^dOspVSz*MF$y?3DUWVmr;_)) z(Pn&wN*jXp-N&iVJbZn%t*Y{JwLLdqIP*^8!)FJ8CoPy@QL)sMa;V{pV)xwpJSq{+ z(x!83yvM8ytf0=!c<1JYJ2keDGl_}>d3RgRF})>e<7EHb<10?MGF7@vbQx^Sv-Pdg zE96d0a))LbaAs(e2|C*@8Mkg(I{$&#pVt9CYkBTnx*cfcy1g|LlABV<66HtiW4?aw z8XpAc#hE=*9^1?P1B4)?uYN*6^bMKDf8S;P5@JD6;z3Yg(WKL%3{^9`3a17lQ4RM) z2-I-Ox?c7fWM{wz3cBv)<`!kl5T*|^ATe(2BjOcV@_iijj}XZ%SA~t9H|8xiTGqD` zBD_C<%JYNTg5IFM3ZlQg3nyg@zrF>7eMlz)00iJv0%RY4V;^PHP9V?gSTS#{v>U$a zM{_-O^Vf&-Wygj-{yMdA;e!mxFw|S$4%gY*HnryjxMB_L;GXP<-Cod#0wAhdq%UrlesHg@VQr`GB)m&uzW2*Tn}Z_|ai0F9>~ zcKjeK7k)KIEMTxJomt<0bKh1LKaQ1;111%Wv(E|L9Uh%>vqhu}j|lmm8eEBYwfV1R z?7x2L>2zivDaaXraol3Rls!U>{$Okq+WJ|{%X#_I;Tv+VmXLEeDdjGe9)JAJEjNw% z{LhWajRkh}xSu{l9xf%QOdyrQ72=mwC3U{Im8UB-zgQorM_RP%`_3C?rGWTC6~G4* zHRE;^qo8ZkC7b=Wyf(fePxzO(l-hHJFW=yqZ#~W`u2^TY)e|i`FDScT-yphpp1|Ow z2PdTqPV#O{R56ZS&a-t>mw%T3Xk>0Sx*ag^X~8lZFl%z|*VS?1H!q!8WRY!oy^_TgsrupfJAgCZ3I2;&spnoK5 zTI$3QCaUmFfGp!2WqY~!So%B41V(P0U~EKNEh8)BA&f=Trgl^j81L1Wyy_J(+LfO9RapOWuvxZ{6zQFvivf_O8CZlt~eqG*wX^T|xHDrf1S<_7p@I-q` z`_Hr@WnA^rbisfzhxKSz&=P%i_n!xSptI{gxCQh1G~mt&NKjjxw9lRRxBc(DMg2zI z!c()qJzkFCro)+IM4jkd8j7!Gqt%)UIOfT4?Z*Y#E5~{JXy*m(>}EI4wqWLlT@sERZXmu{F`}To;=w=)|tN-u~$bt_wQ8 z=9Pkd?&;7<6${O{uXl25&_^QQHO&8*Uf#uhoOsc2m!fIqY~SSUD|;Qg+Q^8jQ?9Fb zK!$UF@t2KVO-Bb+HfW#74~Yg$4f?c98L162CN(NCd4!x_{B+W{3gj^duSIU}5vV-} zT{T2my)4G-8>Z3=pAOdk?h$m}9Wbj-$l%*2G*$d3oZrFp7=7@=^`sZZK^0Wd+$U~x zvyXEV(@uyHd~RG@9(P#_67E`ePx+VPanL1|t8jn-S`He? zo~h5A)8XRxf>~3YZhg`q*s;pN3C~Jm*FuePru~#FL3`LxycW~JcecEGZtS&vi!{p{ z@3_Ib1F_ut_NL5Ki+l6YoS}PF;=3OmY{HosF=KR^y;^^xz08LHq?VM)baU8tDoh-a zJ&3-`R#vKPDL1gWOPZGf7z_>JLI?Q*QhW<^z?bp9ulTDnzI?ao;0YZl9Z7;@&J~qu zw9$-Fgwnd@B%Tjsh`1rl*wEB~LME-?T24@0*X9jX@vINMKg0MSx?ze2NjhYdo;sBGasr5{71nvr?U;$GF#M7su~Z=eNGKGz z6fXBfg7cbVoG1^DlH{^vny42@LvRma+U?DwvGT@h4EQ|vk=V$-kYdo^-9cGU&*#%w zHe`{>|8!HqhI43as zmzV~@0NCV4>3Pw-wgUY!*(QEbG0kZorC*=`em{5lNh-r@%Q9AMn>2j*g(HtA9k?A* zA!dd8)r&{v;39?J`IU&zQ36@zi$CiZXRJyIpJ~_`rcYcOjnoesWQp)($B zEh#h`IkN#CkB=gI`M!k8*dD_F8@mHo)>$&oSmaxL&fTd@31{@NMyj;t`8`X|q5b-l zcPq|euiC_h$nNPBd~0fBN2>;of2aV*KkRLR@@^u%D*o*+NLBw}8YN6>3$}5s2PJb>-iTQq0$_e9()u_R5Wp3*2u`)o zj;2rvX2ZrdhNNe`Bm+=``ZSN}3Y zM_5ZYPU5N_e~dNBOhnlKI(yGqP??@HVn}Tp!ad%IvngQwTc40{f7|%S;Y-5Dkr4{p z2-YDlErdkECBkdG+CW)5Tl+r3#U?B7kJmzFJZIopg$$G>2GW#W@}lpiWZw<{w6 z1L-A)wYN{>qmgWyI2Z7mlu3A|WQGHLBLZM(t|ZJp&Teu(aURK`n;ok*HZLyC6#ba0 ze89|bGssXhZ_1Kx2g{cFdKEcVA5P9DN^dz8I7SdLwIeP`95DrshTElP>P{Y?7-EX_ z-Hn*v0?bjbLl1TD@+Vcd&QEPWe&K|-hN~&=rS|LuXk$7x*0u9_aP^}N@;`8?5?{r~`3WqT`)f2{KVLY1HU1BnR?fT;58|A8vc{s&e5 z(~koTlZ*BT!sASZnh-^#4zNN{u_#nqgP824+-UXhL{;a8ObM8j+ZM!Amx4dFt~36T zWU%bRIB=?VS1WM`2ow8`M#%948gfYzX&mR97ZCM_2d^Qi>;1`gq|i_vT!#W(el$MA zS=3dr&0f!ssIQgl6<@QnUOgyQWC?Rvh)=}lyP2vUFp$lfM{X{EZMUYJD zJ5okU#(18J?!{AOI_HZw_yyV~L|cx|j=MeZq~+A{)3*HTFm`e)zTa*H5YDK5eqQA+ zWV|%nTQ0Yp7PDGrTg5TaE5189dOkMbjq}G=I9uu`&zML!J zI5o(ss+`IG@neg!gl}%cAHcfwH{gd;tNFI|$~P*ksFsv!-F8+*w2o;S;IO4453Qy} zG8gL5&H~`}!9w*8>kl zZe$bpuP>+*^1MZKm5Ab32qs7( zXiu_(PoNx4YqF1ee?lToGOuaVrmk(EZ4SpI7MpRBcM*)2|3sK4Psf)}!!7wG@oa}N zItk$vO*+m z!!sn-310?!2l;R1o@wRa4%3W(0k@_9BFs?sz*F@3!u(2l{Sgm5QcKlKV{QFIm`^lu zy@3cb0C5M%Fe4C4fB(lYe{-F02O`WnK!kZ6D0o_NesW)5&1rjVe$4;3C4_e5o7I&b zUR5k)D8Gahv@@8}{gdifR}MR{!0*2Sl>c}}L}ttn|%mw%kE+PS*GisL}Fo|#Mk zO&dk%sZQNnrMC4UnT%ew?jWLKzN-RY=JKi#{K4zJ=f}U}N*gLBu|?%vm1p^o$LGTY zW?X7b{(7j55TdwTx%Jxi2y}B3LhW!(Jcw?k*tDNy2&>LGRj0H8Xa2}qDzMl8+UKoA zzq5&3f`O?D4@H>@-P#y~cTgPSbIoB^Wdc?dcI^hT{}cws+_?}@(0y#FHSq%IeTp01 z1dY>39?k2vd)$YA-4q9~SsIPGI)b<+P zDHve%G_#;9j^yVU6_X-&?w~U@lC5PPD72B@ZPAb^3ZKGn_wr#6oI~9Jrp10rb z9_M`LoE~G3{S($2>%QkTrxRcAv7f<|B!KC$#1e+q4K-2)O&T>P&;TZROnVQ(sm_zW zdOekcmPR=TE(t>vgg%4o^;}KEGq(oZn!125*k$F9<`J(*7T1u>oxmvwx{8>hEY-m6 z(IU^MPEun;?4UOO^km>_E|Su!o!qh7&YK(QPd!cImJ@KHahk5SDUR|o8Bgo_5&)RB zMuyDnTz?spRMW)R3)2yZokJd|W~%NWg(t*=WTdh({`P*_U^2nYO5a@CYEOjC2{q%n zHGpHEetk7QpLO|n;spo{igj7;L)%I+MapK2sGPnrf2fe3S(Mg0(+%*nhRiIs_| z3sy%)1#1ZNHbB2D+#)QD5XZuxfJF772X~ZEHE%F0asakp^yIG7dOfIQ-}taOk{|hR zt~_i?l&AQgTzUK7T)FzX^{XnCV&%N`dr-yXB@khzt>j8X0wT9-M*vNd;2k03}=G7j(gX*2&gWhB_d0^03it#PZhFXSCJ((Kc9^#rn6i|#uGYU z;!u-2WOgH{P#4jNjmM7s6dKYnsRjA&$>nq@5HO}{ef|q!_WX2y z*!c%x4hAC35hGm>C_EiqEYdk_sXsYtK}hKkY9F(5mAt_}LEF(~lKyoL#F;WH1Azg? z&5=T~0r8I%1o}S{we3y61ee)0BQUL$jR$8QfuAX&zH}bRnGHC9H|hyr2XFSc5W{?g2~)> zmq1im6=xfXNiqryzKG-Z*>@3Vu zOfs9>vIc9{F(wY?|6!tb6vD^#=QFrw$Y*T)qSE7Jp3=-Rt(a8(}B#{uC|Q01Yu` z$%Dhq?+#+xA*1L0>XZXQ3MJmXk!3&-cHlJWHCwGZulJq+1_r{S--k^V+|LRO;=nsV-4l|jEzG&=OIo=OM7vNzmYiND?i!n$4 zgE1f13VY1}{tOltcY@1KuWa+mcSLAH{WL=}6d7gq%6m=6kpyDQ0BD{O|; z%5(!CTAiJ6(xShKTC@L_sC57)YI6WUj2W1ytw0*tB>`g0u>X6a*7g54QLD}Fi3v>9 zD*yLHZS;R8YN!5hiCTt#618dn&qS>yFj0H-Uy0hg!?}MaYGq)}CJpl&DN-xID{Hw& zMeS+IO%<3^oyw^}`O?W_a}KPT4gJAwrFzJjzyEKETJ*n(+U1mgCu)=a4~bg2@Kd_~ zNYolHX#WorwNrinPSmFSuZh~De-gF2|COkfnl3Q1nHva0njTcjuz4JWF>x`az`bfJ z9I_NaU;rRWnSoxxxSF2~P4xy>U7#Oo=(pS=(#j8ymHefcHR<0GzG0VS#^7#fCcjcU zks1f?%3Nq3yI1%+@*uZu{#T+_=4u#6DprYpvuD;h)AxUzsC`P1`6p3(#W)`%;P+pN zT5U|Z*xX8^NVkjT3=j&6vf;^_8)tm*$Y1VJI(M=h@97n zP7ehH26Y1|W&zfk0f_&gn9ubqGuPe(_x;j2*h7}Q_WE@lWI!+3>K`&=wh5G-+A=?UKsZn5=`Cnh7N_}O0>-x@sv6zo(8Q3q20Qp_Mm zNW_OAe<^0;roR+3$A41H^RG}RvE$D3X_zaYt0$dU_{H1)UlS=Dl_dnDT9F?@m79J(#XFmxF60Omyo|f!sFaB%CLG1tXS`ikNBV z&eccc0UbJ0O*1@M6MUk~`d*qi8Ao691l|0;VS_h-RW! z1B919_YMzI#8c{j+MRgJwRZb4dF)j_;`)q^<7&K35#8Fp(f!k;%@F}MX-Bb&!%|xZ zV;=)i>V|1*o*9)=>Q?{tCTC3`!KO^Ol0XFGVE>l`SlbdD88E$=jDm(;Sh?^W#@!tM zM$mBa*DpFapd_3D!=#JSLrlzhi|KJwb9R(wFYrQ?jg|!Fj#dQEBw$aRr!EGG zT>qxW8k`XyKLup-Xu~90S~U0%l%f>{k(bsnFv+Usf{|Zyz%dZ(P4ba@J)lMITk*xy zn%-b>J*ePAB2`${L%jr}c0$;|^O|3~MjrEr^7aJvfA@!l6L43jQZkg5)CkoonFlcq zce(L%SHvTif-^*1N%*0N5B1e=Yr#NK2?qx4qeN2@#}EJ+tJeQACv177Egppho*XNT z8^gbV7h97AHfI&)mfj+%frvlYNY7Qfpq}SE})|qBmZHyTyQ0gTKW9J6C)s zmph|R4ROfutQRu9pV>dcD6lyefea6lgsT5Wa+3L1%AjS>V6ZKQy3N2u;p`E zXTMsl_%p{AD7Jy*^_JsQ^;ZN$={~YV?9Tu~8hEo*-9~7ng$3>k_~sc?LtUKp?>8DE z@v5*fE}3BGUS9O0$;Jz`T?|Jh0R>WAlEWYAMzjE8TykWBM;J;f`)32JS1ih*isr>m z&+>v{0&)2upla}u=R(5hzTf+{t%s!1iZ64k4_Ai!qAABlwS3av9K6kgfkH$Pmv5Q>U z_h9gye1qnEi9su>i?3#7AvD?jB6c;3-9}_Bo=DKR;G0e>W(XDOU)lvA%904oToEb| zOuP^k^Cx>`@aqMXgM~*-o*mGyCyKBDDu|Jrxw@!-a71fE2I2OnI;+< zUw2`YXvw;B?BpUvmXm8ry?Ewxfy(*nqz6-nK9#g)+z_c-ndAMuZ|(8%XL5AA{GtEi z#lL7NpeZz<0t5*h~ zhIza5oTlZfnj~IZ!qq9APWJeT#iC8 zstRdKq~BM#lrUT=s&*MF<<6t;jw=K{R>e*DmdZBG(`#ke+*&r2&&!fafx@AHZwC|& z1tW0I%dKHFZ}e?<_LR;>f$_akP@|*2eP!AX4+!&alo)dLr@@GX!P94_ky1l-r4xA8 zb2HC+ z11o>jv9%U_^t%pzCp^Koz?P{3KojP#n72bqx=U8^Lv2A~AICFc?eXnA>Z*`bgQVh}1aW|uXj*+G77oR@|*teD|MrT+E zU14xeWBPI0@&)MIIERQ5M4{4X3r(Ozl}L@`AsCgoTP#?H6ES7v^IA9Rvyg13nFog@ zgR>awzNi>Bxbyp{U!Sx4Fj1TLOJK?!^)u&%hsT`6!)kJGXK_tLKH|M`!2S+m!Q0Qie5saY5NYUoGM#>V@t1W8$U(7(i^2z#J z(W*km$?RxBVN){79VffZ4)EsF76jhnd}*KY)?ZNn!bN<1?npSRId8P?*I}mgX%rN#8n?UH1qV1-lC8A zNcz4BH$hOt3PI3G+tQ7rd|9n*i0&ze6N!iGjhvciiYEtECw?QBg0MvHwL`Pb;960+ zK2=fR;kC4uqXHq>jX+S=7W@9{_Zk$A~V^$wC-UZy#8%)p33hj zw#BaoFtS-*72a0Dfr*vW$}4)U2@1D(W<%sEc_+G!d#@-ONHCeI+1iq*{c9gypv% zO1%Bhq!va8tRM&blqklaYq%z+y-v1~Tp&tQTVOmf9l~Td=HMKAV4y^%EKLtkL=ejb z2>SN=tbm&!Il}dYy)Re1c6Lu8$!{!A;b(vd;+MtQSsf@yq&er4ab05DcnA>tJz=g=J|&$>%v3u_$~?(>QKrwEMp;;- zCA}1n)zrvVkr=62QBYD&U6#GhgSq`mfg0HDA}uwN6sT;^%Z* zsDu!|aYfgd-*o+SmFak00$a-WzOGlJ-$9m9gN~BE z@S`uPmmd&4|45}WLPfpKzZwyhpx{Xjizh?hBtuUtwe;cH9uh@GHiY^51eg>}G07Le z#gtmHne$_unt%$;$njaxNbHf}gNayqH=Z>U7n1@Doc@BzJ@+ZqSx=n}9D+|F+#q-b zlwv!nbMkM=I5MsE`O9Kp*}4%CLq~}5o1!t7LtG|i6Gi$l;~Ix^;07f6F3WPR*n5<^ zlt&@ToG-i!(6D+?cPMK%0fYiX0Bm?{EO@Ucibs!W z3KaY_N9aoHr&f;I0aumw>@X=ym+p{Dgp@^CM)pCakNrPa{GOl@NRL--^U02ZL?WQj;R9;IAX(>bk;$Z}w*Up6ePJJR$E zQ4C+WoH5G+2=$F_lYelagelcus<2wf9n4 z-=ecgeUoC~5!M|>q(P@vWv*wITfV)Ui6Ulah}!x$R`U(Ae!(?Y4|#XK-j^G#(x1ji zV#B{lSDwh+erOOZ$rirW<{R;K9r^N<> z4u0?w>!V)!I8u|k zd%Jz?-5$E-9#Vn&ya!s}D(=3ih@aR~y?1Epn%_A=dzz6#dJ;*kUiZsVv@?7l)@+I< zpdzBDsCh#nr|_>q!KRpOfzhV)P(Z^2fSAc}I}kIG&S)HDDv20}cF`o!wrnKRvjC0)D{X`#dA4 zzJH8(gU6em{zVF(P=Aehwz}1jKqH=&AA`7^1i6L;6J-8hjBhLa7aZP)qDR*_^1mPx zU3bGeQWx6-Sv`iVG;g4ih^+(4rafJdl54fC1nn>SEyt9y))po}a$H`??*D8XVALeI z;Ys)}!UOOR;?avz3x|l|)T>$TpI@;}=TNab&A+Ak58@FenjUD2AEm1bMcOVrOLJ~H zB2KVcGM?L$$9eMd3h$6@BEQvbb&u7%_m}VpR&RE9X<6P z;Bg=hhg5@;ZFSb+zE$bgBcP*&qjaJ50qn^lDEQeGuJc!jfOcp138W3(kaO+5%7~?1 zOmyDw!Yfl7@T+Afh)<$_5f9;#p}7l5+pEx%$E`fHFz%I$$LPh$5YlNVZE@@7oJZh& zp6Wa&P)SGc5Zv0O%|3(OnITCryeyW+v0VYvB)IA%GFanG-oQo4aA;x@?qvax8+Ue4 zJBaY&zDq}%L78~F+kw7fkqXevMd0wjC)oN(TO~~Ot4C@0KHqdVjci2BRwifizP*Mm z{!x9sql-M$Tgqj)!IM7|2sG6-YT{k`x{Z_lazv2+{p-eMT$7cEhvFwGY%a+&8;O!bfznV;_0!lw!Y{HURbuHE6HM4u^u7PSSbo{2Wx~0)O zPajhVRJ%O$r^XRq?AQSx@|d9jUi&~m!EF)D+_zMF*$C&fMjksS`}s}wyO~`!BYs}_ z$}cBu4Os!0+CQ(~DWEohndWqUf=bCW1KbF*N&<@md#zasEe}C0VAUJ2%eNvyt0YAy zcB^6m8U1UE`QF?C^3eB$tjbGY2NXg5hNDVHEHhHsldGD(+NeXJ}17G z8$@64!NJ%eLDTTg#_Qy{XFinO)P~5iv>2Ify{A4wL+_xzm3`S&hc|3cmiCkb$hRyT zp-@@zy1BC5je+bmc zWEzVfIZ+f5B7h zp9fDQBK>rPNbK}=ygtIX)F}YlQ>Xo@F~sO*)<`a~8c+ zW_IbVtuM;nfvL6d2fJCVj|)W#2?lcpCy-Y1BEapBhOSE(^O}(=ZjBih;v@OiNBuwo z?{6Dz4JX%Va!muIsbgXHB#E_7uzD%Aj`95JVbvFDg5W?}e4oLcV^LQWeknQl0S?~? z^k#F%uFHN7yt}8Hx9oD+vi3861OJpg^YmnFr#osDQQ@>;U_GFil-GD+kD=5X3mli# zn&#iPnDS8TLI=NMz7v(aP_DubgDM_n; zh9Z)bUBIb^AZ9Q+Pr_ zT2`?AHe=w!a-BqH7!z_16H-Dph$AYE;3lVmJfSvOEEW{}_^g+ofN1s7d|ITAqMVsb z#_{m}GUMq|*tm{POB-2jAHed(;luRy&g<4fSO{p7wg4_Zmqhb_aR0fE%Y}^W7J_iH znn?+_3=3qjpPYFeZHI;ZS1~eeFI!8oAsGJ?k8jl^Bn3!r=qytZw2(*8vhK0y9wepf zaw};7pY#^(wtsEX%!;_cC;fN)iNXg{Ag^p*xhx)=ZapIlNDf_2wu&xHT(pPc2R4Sc zaD~h51O7IK5$qG4?W8N{y~<85a)FIun`VMi*dN+q7Ybl>>vBsl))FJhUsl7VbNl_$ z8}1*1RFc0=Z*{TWBlYgp_Mrs_FI(Q6cR@xJYjQtOlyuv*TjMMlki*+zYWSjS9H`@7 z0$FG%%WgnZvxz$~@YSu}$FXtytB4GWrxCmT<4!!#V$0#R?VRDYam(77OicHDjjF8 zUM_&7LR(ZSHAEAwh04W~90u4s#ywM}>7pIqYCjPJ;7U>x#U7HU8^+CT%0l%|fPF1P zk&5_%tL3JpioG&J{uyU0rUDim3AIYR{7Q&zdG=FXL;=#BaXkQnZaAypUXldCpAyu> zT*pYUm{)o$dWw39u=sT+v<_@NGQXN;CAvC7Zg1P(@=hXD`n|&d&q&4m2UZsZmR$_e z=@2QyK2+>)P@&)Db<=Ir)}d)=DeVFUQscpKIS^FjQ*CYDH!UWOqgYRY!q5GAC`5p+ zq(m|}T*Z+K#n3N`BjCSK?AZO9M=}&(h*2t1y#=TWQf$&?Sd(QxwoMZ9r$3UmE0<6D z9%v|=OETVkc8S-KcY>crCkGR3YK?G@GC1C?aQQnkr%43xNQW}N9lq7xUbi?2gnaGm zDamjYSjMul$(En`_ObzgVWR_RD1-(?AQDLthz zgGfza+Vf}=#p2>tF)@2=>j9l?n_o}Ie)FPY(%~yrW8SSlJKwEsmgCF+;!(<(i9CpVrH{cG;Sijmjk*6$T5V|I zPHyjw-P6$iG7D1NE6@INO$D&dc(S!WXUX6GfyShgY!lQ*`P`2*<^fqJj=}WHx3=T9 zMA3J<46bicmdY0{l;L-8jLKX`2V)HhdvZr*m329d0J}~MC5=2fOJMKrH~s=&m6j(W ze%B8h5hfXnkt7WGh+@{S*3QSlvxuf44~&<(F+I^Q!HPLTf-#oCgixL>o;m}|Jza&`= zC~7G1Od>{CDg8~E{yP3Eg#a(A@Z^bpO`_d$0y2{2y4yx@W55KKn@adEb{QR9zRfie z$U|XfvsiR_HY{OiZK~t}S`Sa^W4gFN(Q0Fwd>UODW7%JPrsOY6*8aslrKXh9PYr8q zjPpbMh3!F2^yc(X?Scw@I86Yph7ZR1HYiGIG|cfHXjY?4@tQybLlp&AKKD~DTK=7h zUe*blD6==_SIc30Rr<5T=ZUepzxqik_&!1vrGzsF%R$PihxaV z3>2QOG3afVUBxJ`1K|d2ukuO!VB$0tRf%cJ$F&p7Vo)==?lSvTdr3z3rDQeKK`glgkNiY%>JTou@Mk)@`t zgu2??Ugw(fWbcpOcxa}2NG(IU*oo70u^Se zt=~OS&+=eqy@s)P`<-0MaJI$f>qR=4heCPV_d*1mh4QF`W~`yP#)9Y3tl$CJ9Yle1Uz3`&qfxpIfm7OV ziJ;?M%C2CqsC9t9G69xjdkxu_hdh$4x^sZtHi5Sw3ZI%r-%QIxZ@nj+e{n>nugM0W z-ED=bqE~XM?H^=*tGX@=h|D8GbU)75ZN@giQ^^R6ZQcGdC5GbZ1rqbzWLhjoEg5a+ z9DiKDfRUzhF~X{MkihaMNRxrPQH~i2=ed;97=i+xH$=Y4LQ6mse=|fVS_rN;Zv2x^ zS2r7%w>dliekaTrm8s`%?g;ZW@f)2M-Hmp(&@A?arkhhy)ekT^9PH|M?zc|PU0DKw zTdJ>E_*K05-;UH{cV|Rmea9XZ?m|KoQQ#LNDz4Ol-!-2bl|7(@%&EN@YJIC%3YYH1 zE8t6jbBF{`vRHFOCLVn^kb3-!IC)( z!E+#(LTz_z88>{*a6#+p?9ie4hP**1aH$ITg`7swaQR-M86T#n-(m2In=j7WijjY)#X9q@x>ATdD%0dHimC?&jg`qn*2yU571?XNVu2 zC2X6>4*PphwDqPd{J0BXyX`_PygearJaXu z966vmsCR$>Pwx!8=j>*gQ0bZT3E$`3;Q<}P%??>xZgr>lgiEpS@_kUO59q(1bFR4R z&SVdA{PzPDh^C=~voHa9WeISa6xl8a7(lIe{)~G)W$Wuq2#30Ef$u&SBpfAjgQzAQ z)huc$&gHV(Be9rL2%^LIWXycZ$zO6RhVs!?O2k5aM`%PY859b{i$dG4|oJ{iufCbS2r1U zW=N6=pA~liT_l{1OvvBs0P1Fr|E?SmFLkmt?s2}YCe`XnoE((V+L%jVfP-}=fH2?C zGHTEunQRhdda8FQ^^>2m_COTig5gh{>1%-H=yVjPlmP0ihEA1f�Je*r;yYdTsKzr{F*&1jyllm;w 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%0AJ&67LDc!~{c*O5u+Adi0?fJ}S_%!^0*|^n$(QH- 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 z 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

l8x}`7v6jyUFV{3lc>tWrrmY-l&&-@Eo-B@ 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

  • p>f4OB)T;Z}d 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%0DB_I7x7_ILOO+?S8v0kYRs+pbE0@q5Z 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®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%0DmvPeD5;k~wC<9qO?9~G+;(8qJULvjQ;gtgI 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ΪENNHg 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%0DjLj07Lx^bLs!_s0(qR(X`NF z=MVqxu?o9d0m7k=C?pI&O36`a!dN5;B?%=8o2%)WA@_j{k`8SkgT!saCg*Zll$t|@ zrG=>E*S}e2o3GWdHaT)8jD;pW`fS%!n_U^z%XzmGd?#PmyhATBtZp&!gIzNE>VpD8 z9*_|NnOPguQgOiYEmVJ%N%YUs=5g#;G=r4DP{x z-VTg}Ym}*cFig)no8mi=jrA6n*q`UGZOgL=`D&ERt}8bLB&rq$UTU@3hjkNS+vYF_ zg&23)w2Seb^G(&I%yS+qC1)s~aum##11|r$6L}EuiZ&f0n*s#|yX^k~Po@+|V$Y0u zW9?O8N!DeysO)tA0|v_G_ZzcWkAw$3rxppmzgEwFgUB9{YKhl#Ub~Dy*4rrYzV>1VHWywitf4<`I?ONrwwKo?A#ZuqTWu(Vr|$f$HryaN1z1lLkF@VG zAOF=rw^Jl{1`f8jL>agR!7|4XE(j-jFMWnPG8Sm&W z#KA5|WbSs|FPq#hhEyO$JN5m~4P^04GVu&C#Xqh1kyp$tQDFT!AqlvUqX~%`InHyx zDe@g@p0w$+OiJ6{G*!K30t!0#xctUvEv{!6jS0;x^L0`W0k(!0&yI?+4rnx>$s1wE z%yGunTUk$>D3IuX?CRTouGNpWw5V)~-nyZTlkB5_73xCdBJMv_VFJvHXC@*{_k^ny&r~)3%xfl;upOO$uzG zGTULcd#d70a*C%(V@SNgo+Ua!DC_8n2EEQm#!!dC$H7_KH47_Jt2zAE0094_yw&+R9 z1PF&|MloCHDYy561|~a;1An4R(+`a<6bd!|p9^=-KN0L}4G2_xAXJ@nbUA^a|- zm{a>v1F)$CP@i=Up~$B&?cYV9=C+XM37r@Y zYpDa!KQr-AQ5C9@D2>09{-FJWto^bx`afIr-U%=aV8UEz8j|+^&xF3{P8XXKJ(Exf z#+1?nY8yE0^x)c-Ov*z7mYRkbD~6C{ z2?`)6fw{1DiT}6M)TmQ1v2%_r!7_SA5t9)YoV)%0*pIJ&VE${lE&E@MAFy3xz-Um7 zNr?5&%av%6CubzjHV({%J^jmt0lB2f*qeXUb;;D=O(Q?`I`xtNua`@MHVV;c4{moz z-x<3C=r(MEGsdt%Js>9Svv+mdr4ywIKCP9{7A$vnz;~n%W?@#6P#T2zlO%wj4dmi{ z|D8rAwK;o03`p1Tyo6ZEC(6U8AOk^D@PZuE=@_u#Z1)F@o^8~;qO;%>9x{(imr0fw zCxJUI0;u{xTM_Mx0L*$ddQ(cw|vd#+{kP*EK5b9Ot;G+lHU@aN1LcYV5xy{=a z))_AAo{Qm>o>Q3H)+Q$y;GayHGws%9xt(na*_o|=33S`uV+sQaPK${+(;ZPxEiG@k zx`^<$PQPB3{tGP%|da@4Iie;$s3wOaEzXAcy?PlAJJ7 zyhr^6Q1--9kd%{43t@_GQ)NlgyFZCj3xZ)M^`bWhJ=pLNmmkqrW{#tl*HipMSTjzN z-3VsSBlBh%8%G8np1(aB=uvHlMx^j`wd9k!9@d(}wu*x}YfhGrBajVzU@`hlQpnX$ zQl(@j*pmnd8RiB|Fxfgal!Y`$1Kv6DAdJuf<*eEO-7mkRuTLJjXsv!Huqu*0<~U-u z@WG{JkTnA2i}Fdr!DpQ3?lp9RjrF=!FSYG-YgQ2t%IWf|Cu2lhD~^jfdF8arzt9l7 z9l<{m0~qVL`aWSE6>Gn?d%N2p*~PpF&!fdm86H}~Kkh`^x6!q`@Z2_EteltG7g6p3 zxkg_ET0cJq?U=#wjzpNlYh;WOLUCXs_aFOmgXZc2SHog*Lm(W-*(O?Es@rroKU(ob z0mjqW=^X_l>;3!K7K0qP_8j7a6HiiW8HA%dHW>^;J#kwwWwSJ&1)Dq z0=!zr_$oqY;n-qyyG#xk-A)GGaHe+vznLjC{#nqHb!3p5^}neKj8RmkS~~vVFPh`j zKI)lpjuMWr@GGSr6v?Df^_(yUo+mg9X}ASYf4^Zf>iXOaCgs->CN=Q|2iH{AV94c` z=^!o%c#he?N-bz|@l{ha$WL#YJKNSHQD=+7-+g<^!|qvliFR_fg&Vz^=q`r?i1v5$ z290nfI8G}-T!~%#1f}OdZ!JJ?VI9N@6CUPx9N3GY2Xrzcs?Kv(H(O8bvG&(veOa!= zkzwH%J)evX&Y}XH3l^sZ_Lid3jv;)yiiF)rwT>Wqj2lZUP)&gx0;0j5@mJ<2yV&o! z-Pl%$%X>T20QiOlMG_Suz4%XJ5|`sA1R%>^^csPbJc)ThL_~ytJ$tgs)a`Ux@aIry z(Ek})|4{Z|%*^Rd(7;}d_JqSa7y9NKZEH$E#z0Hy5FHPzeF-F#6t6`4s9XNH3!PfL znhNUul`nNtQstkYh0L&pwOGYo(py+#uGMxy)xh^jEI=h@PuJe}AubKM{3R%uVy8;T zsE}cjBdaEf^uApA))e7okKH739xvz5qe+3TnJ7AI*7bivR)2tAmwu-neK#GI)<5=0 zAj?1YNTZ&fKbaN6Z3|E)XzR8zLjzQUtbu)Wc(o8s^9E6Ki8HBgOlqLBGdU?f`y1j7 z(~xIekA_`qreR7GO3WX+FLiJ?k&4G0RW&p_LfeTX2#EbhQ;q=Alwr_*2s3eVY(blp zOto7_wgO`L_OxVHqv8Gnilf0aB zg0rkrJX9IVP+It&-XvYpb?NfdK5%5rP}Fr-6|i%7~#|Plh6R+mh-Qn{*MnNO_FEQl7j3#RsXJ04kD|kIZU}eOctsyWW8|RWJ}| z%u~~j4_+&G&R`0r_S)!xuq=yO=E=GWqxUC-@+-0xiq=Ck#Q)8fX- z1m3~nnEMqPR13z&dV#6XAB!|uR7W7V8+c0wSK&%Qo-JXv^*so*0sH3qhty%|*rax% zHYU%A$JQ|MYqWd~2L90OFsKE)%T75<2&>oau?9G9&l?GbxzvBj#ckp9$<5&bxU)Jg ze+U$d8_JdylGV>9%cm=7X=#a<=>28zg{aL8URnFOx%x&}gH93^q*V=hw>$W3<272D z{vhML6>joIB9$4Y=zsK6-241`sD8A(5$qRF^{lozkVBb|C$=#u)N*!Iqy!;sl)wIL!B(!pzT^TcZ(@b_==gWP@D zW%JjFhV)_oOG+Ve?c(t&9i9ki-?zi9fqI7=O&q6E;GugY&>_23$r2-;n)pT>yF=f{ ze4%NL<6&y)arK5IbRL)KWiXo3fbT=h$Ul?S1$9!3p{`*;=zsAN3n$59sRZmF53VtYl|4 znq+(#HR@Q&r1@o?{?dfgu8A5-lVL9;N+qXyafC^|p+$$jBGSsMWN7RiBPxYh#*>lv zQiX%KT{#kg(J=>?gBh+iN2lvBZb(ShZN{u`Kcpkp908d9G2&FFO4)#fV>idranh}= z%wMjjPF1yvyX&QHf{4Va^8i;TGS?K-BOBXfs}x)OV51w_4_O4G244Xo76(blGcI!| zL}8P|-7+>d+x#X>8vPdf9m9b^xFt(6yhz3NWBYqXySWvU`$R7@rF)r>N-$D}Np;)+ zR735)UpRnVQ|d=_vSh%JXnqYU*M)%IK)EClwG+y=cZ+89K16m-Euxf`z=IsjWJ66S zF(C=R0GSvBcL0Rs+WwuS`iS?=+WvqAP}7uvQAa>HPr}Xq1lqK*@A{fDd0F*}`J|;Y zJ4ler)6>p*AjRkj&aL9XzRhEPtS=g;mg9xMtpXTpp9{e&3-U?G%hyVzIFM>eR#a6Q zXch${vyF#r4Ppuy=uqK6QUVYH5^db-(ajBYv5fzT-m90&ha{i+=F;ze_OC^Ov zW(7#uQ&zX)f*}?jh=$(M0paf8WMtTz>g%)cL5UMu2`T?%m+SfX{ANRI)*NvGTSBCD)%}C9zMcvuQ4>_Jjx6ylfO;q-N)Iy2Y0{lYfc|?Md@Dd= zY>>l92_C)@9I8!)tO8u91{L>UiT(1t;e1QZM8`;_12?(2q@)CB^=#*p=Kqzsj`&Be zM&Q$XE*IeM`8s3a)6DDJ!GAWqko_Nt`32?STl_HuZGK3(=o3qm*4#yD{!?#-b{sX1 zlj55|7wiI3$4W;4{^#Yv)jkpyV7)k4U+gl-+?wGCj7KiE>)4q;#DiCHep%Za2 z&C%M#)rf)U3Oa$yq+R>l-VPM?1W$r(EQd*AnS@}%)tumyHlQneEBE1$;%s$T%dlhH|zTVHdKR8NTJ$0D6A&cS!fUB4{+1+=FUyK!#*AQ#`uy zFMM`LVni+0g3^hlcBH{VG+P>Qp-GByaG^2oG#+Hq7SvTc5UL1g|K*Jjc<;Qmq|jBd z`_Crw6IXi}eHcITQByTshn!M|Hx>IjB@X0mj3Di&jji6G+%FaUwnA(AsuVg4LCCj25jwOdPGqQDuAz z5XSxv(vqUpOi~&MFJRYNC^VUX3*8&_Y}SCOGlkJ1BCry1Mp+M%1OvF^K~PMKzX|M> zh|Vb3yt~UwzgVcw-($#^88qcRV$+Wzq1`G<=ISQMh{z^6ZU&*_0O&`d>IN$h4E1NB z?TR*7wo5sR`fS$0w>0col^D<`NRp3*Vw7`Ed1h;Ht44X0;BK3|dU8M^vC`((KoXp_ zivzJ&(al#cRqa=3PnCyl^|3+k<4AkA<|VV6;@Hk`s9M7M>_NV%qzoDGgX@e@Epvd# zaY@P=d@FZiTX4@?0K`~>{C(p1x^6)nR3CT_wDxc`S?ynewSRKlf2A^{{k+;r$139W zy!r)=`=Mh@YDjChYdd5To(=AJk;$4zZ9(wcedmJT73#k3ZkTdKJa5k@=UadtbMF!8 z#)qH=pO0fx=$4J4b635sXXzJ+kG&}+ths}ktDB3tu|4opIzuiP6c`srdN1WS%w$xR z{}QPP0A^VgKPf7oKgIG{AdpE_iFiqPW|;boX|iI6XO5F)H_CH{(oWH*{;d9 zZQC_rvTd7J_Qc7yjmfrcyU9~cuIHNh-Oqjh-_&aLey{KT?DIShgT$(bl2_3H%=2KH z*s!~Ogr0nbSxC~;=lzwX{Zb2=DAp_)$~o(3?j&wG9u@u}ez{re;BASo8=f?zTMxI1 zR}AP2 zRd(07+qtx^YUu>CYR*ud!)mi4?T704Loo&gOmL$rMrCs8aQR23NBq|RX}|u$Znn(@9bY8Q0%5z|d&8d%bSKhC+ z&vg^J##2)uR{EWlvCz#V8Pslr)9pG!=Uj5n^V^RVyvMrf=(L2>gBbXc338)g$7^iI zrWY4^8CU8J;&B|fT3+->{S^rd(ZKxS23cbOR3MFg8 zaTiNzv1gYBMn+GwGY-S{OhO!%O;wx4U`X?f^onKiqW^I-dy*=Oy+jBE-*99P;57+DJj z)tg|}DP`!#=*qM+QRLT-FB?T{BD7lZbBf8IeD$U4|#vDK@ho9kXT|T3Wh~O({X$Urkp>xF%E-FL>8nl ze8u}vAsd0ei80uZl9k;U;G6+6dmmV_-D7hfM8kqkRfqQ2(x82#|t7)DX1eaPw3jdQU3kXT2#3R{ySnf0XXYk6GPU*|e3V&31Ar za5JcgJcI!2lh@bkb1(rl*I$qRMFfS{8|A7ns+8F>s$V+zDrsj4mH{TRFJVOsCrcKv!ORzj(z+_hr3<&)dWPwjW;K z;2+sdHxBht)T1|X2MgJF@b%Dbq#8S^E&?)q^s8&V~$ohtBtexc_A7;)8>KQky?Og=%C&00AA zcPyte1P@4${zbcZ|X;IO(bP{j2N!#FwuL!`dvNB`)M?{k&hO zQE4zU3eOO>Bmj%Inv&*QgC;3Oa}GbbgkF0nOPJTzpCSjr8lNujpHJ6Z@BIPdeL&nY z1wssLRy@Q}<=mD|kU23R7Uq~&f+%|#4mP=8Gf$&1l?<(bEKT$;->JH#pezg;x__+R zPqP;I6pG#xYGLMXkOq7`vLQ-|m_`d4mJg6P)9BPsGdD6kkxx9;JNk&osJaPS|H1Yc zFFx_RZz9D;2p3pVx1e$;0Q>}p30KVud-`PeN@z0~%`j8Dx*X6>5-t3|#wYNBxY~_x zkt$LFQlg@0SLSZpgD7-BaN<{2V>c1QrHe_Sygja`LOeSP^;8WrQnq(@kq4(W^LB`k2!c-W2 zLWWBp)9~{@-)~YEJ_R4$47me$wWNWM6PzQu-9WwNu?^kLGf;0Cf6A-|)LSC+>9Ak6 z21d>(axuB18>K6ZmX~`@3RpWB0R{)nWnd~NyAlM(OjEDw=hKwJL8h)-%tC|r9= zXogve*H-``9+|Jk>5sA^#&qL4}F&>9EqRShExmay$gp{{K(*A(3q<$wHYmZy|=%j_=*P(+qvL6}9`-TCJ1GzlA zsMVG;5+t5{@}=@RR(Q35o}2(?P?#7B?A8q?WJ?{+T}X;pyrACjw+xIpvR13JM8E~y z?_?%`Yg`C+IF!QsS>`bm1|z%^)0i+)PAtAb@Qmio#p|u)4-g2>P01fuk>-Q?I8p+8uWaz3&8`9##VdwAzhkd2rKsy5Bpe zj{^m5S2!{o*d^vTzhp@0*%4xPg|f)!L=esbCT_u}K^zWe4Y8j@!ii1;iFD(M97|Y| ze>c7bxLDb|ATJoS(g>xsKbO#iNHfcX{pm;liAAk$Roit_kde-&4TlcjBDMZTXLHQ0 z!2Oig%SqPYye#FwrRUJO$M9H(7*$9RrcpAZr>@mD7F!>yrUspyZq;B`|8eCF!`>VM z@IEC$z&F~3F^D8vr8^aZ;+I7&Gf%sLZ$h!J#DzPnvCc&%Gidljx>_6hI_TE>A$Eb> z|KR~!1k%gFs}KlD%mvQ!W@JIQRd>!Ly}0!9e`Ace?z|MxSf!N&|(+`q3lzi|lsu zF?_KEQ%}3c!V^tXII=Mk>wXHKK3EXqDh*k(EhCD&^CHA4y;tGL(OVQ_qZCGmm!}V= z_ggdbXj0jj8S;z~Xc@ef5y~mFRAYx(S(HMI^DN|ETSX>Dw!a6$4fI1R4>~6sd65b7 zq5x6%3y1HgrDLbwgL7bHS=fQ&7#x%FXSS{{kqIt8dZ=P#Eyk`d%W#y}jdc>^3JX!A zPuo+RAx6q(=V#`#=x>Gz_MCbMYs$W9KS6rkO)3@3Yr>aG{v;-{56y}VtUo-Zq>DbD ziSvS!Spf1UUT!##Mi-2gvraPY1~Ek{KmlhlF`>ms;zb>kzi@dVQ!wuG!r{yXKniaR zvur9IV`KTsXGj3490Q20}U~+j$Br@1kGdDm= z^4`lj8Nwj6NH+A<8SS2qgZT|s>_u>d4+#ZWQdfu42RqW8k+R?PzafVz0!oV(#Ul!R4#0W34WIeNOHD5L=j%aQI28gy(q(EMf3t$kVUB9)D zC5t4x3&ak=0h|K~aCxs7A%fiG)Fo+uP`7PNl~FKWqsoZrj<#HB($z-eP7a7Q-+G#@ zb2nS~e1BmaMHM-5+I=78a^Q=DS)2Oo$lelB3f`3{l2Z0Ad*xR#Cu9A-RX&+fv9$`Y?SMg%95{p6XYZ!X z65Ig2ia@QpMs?gDmgvT?nl&k4&MPXrwZ6&%%AhyC&jxV8#noFUpMD=ZC!eWfpC2&R zHdj-hXt@!gm^0a*(a%X{0A>u+RJm}}Pj{TNo_X3{nn}%Lx>~R&Ml%q=Gi$F=8M<{d z0(N)!`d+9oJ*Z-hGeG|SwynEdROh*>yPorDK03&OF&KV0L9uIQ_Z6XgW|t|c?;X_@ z>}qN^NDFQzyJx1N!na|>W0P}>;$~n2(aAfvx2G9`F!bD@yH_Jq2k_MX$}`Fm^7{C@-$YsRiG33)uTJ3u0)@hsIyv#=-*HvGMjD?4f5f19l8 zrZZg>t!Aqj|Mp?{(mx<37LvUQ9OE}N!5M!!p_Ay$A%C8o8DmM(o^RX>I$Okw_k*bH z=3q@SOqYkOHjHc$a7pCWvO<6qmQ>tt<#I;rheys+U+ENpO`(xI%LTNuV2Gb*YEVFidjXtkzHQVT z2iW%DI%$Ljp1cM8px-jbh>ENfqah_r;i5f6zMAIW9E>+atT~Y34sZhlTs_2=)yKo0_IvUbt&c#Tg$vdSL`R0|_HbP((z zw|x4Y{>#D8hX5Jw(=1p_IO^@5%@9PuUPzd5csWo>VWl-zP*Ms-DaiZYs!7#v!%6&z zIJA;gc!hx^B@eLu5mGm~39nU%U)wLB4okThYuF3{71351o>8+RHpE@Re#^1<>$qyv zB3LEQPQnV1HP0ctV+a&A4&oepu2A1k$y__!Y7 z;5(hHdqzVPm@x#e*|K_C&_sVd)i&(rpA>qH6)LZ2@NQ|@X*xFyD%A}n$8U3y05-;#r0a0+74D6LyPbwRBQd3>TIkhOtWuik!V=>hAD%^uKXbp~Aqiv0X+bqWdVLJ7F0gYh+UxE|E#cuGK%# zK<0{cAXpy|EUdDp2DmbhK-!kh_A4wkgm|)+n~1!Rt&;YoE?MEclB$N(@OAeqFGJ53 zZ0iOpI>&wGGx;ltOm1Fkf^EldmOPn$dIT7wWF67_p!3;wq)jpzCaq>|f-BN7ortw$ zA@|+!Kl1gCBZ1%)A*ZRAgK_~PLSxnmK-GIyT5`(vB#JP0FT1WuxVCBGfcs+C{g4So zV)Y1K-=|j^AI!dik+tQXP?5NF|G#4n825jCcHr2XJpkuRE2!w+ru2G>=4NiY(~%CQN4;pB1*@Ze-?$&;b;DqJXTmPd01DI6@X7j9*NWhMusgHvi!vYFhdFY)` z`b)F);lb&P;QGIiF6rBu)ng8UXnD+!8#0j4aW}AHiG>GqmOto;jgRhs`uS>{BJ}OU z7VAm1@KkGr=xqMs+w|gL#t*ogECo)azIs-J`MAaB3J6Anhr0X7KYx$UBQ~KDZUYDa zS6%lEuX>RuD^8LPpjh*y%pb0Ufs#{BRMYHASUd4ft$l=cFl2o>tk`aRf`KIOk^$5n zs3L1;*mL(vr*yKQg1M+s@k{2^Net_$+Z%=A)i@#)#{c8gxo%cR-Sx+S!dwn4jrpJ> zmQ1CMdLnN^hGFd4imP)TRGr5$`FIXc0RC(x#LFVWkk=6Q=70SyKf2!3`H7YWQyDXJ z<<8fgwTn|wfbZa~`EJl|S%oV5M+i`k4hgVZU%N1c`-AXhUiNuofIA|zLIE>(MJV^V z=Y7!b+_{uGF1;vC`uni131WWRe3qs$Xy_W_cT`QM2^01bQ%ilud`mXgPCR9RA@LT9 z1b7xmC&<9ZnP7L90>dh}e5xsS8)eO2Ybc#r^yW`4eP#tXn`+(4)r_W9C1TO5=h@mq z6qJQx8f%Dvj-ST`&x`N?s+hy{z%bsvN%3@|=!H(^JE=*&EXbJP!kw59{1+{#L@=@G z()VjHhyj{qXmZI!kxI3%G2X_2Mf5@@u^94Tcm^Uf$waYGC1_$vEmk@%+|||VKjt8M zl()IPNTO8Odq+NQU#W5u6)nxl)^ij(zkkS^Ppl!a8>^@trRTO2h;b|GeIarJLkL-- z@YPDgBudYu)(dw{BtQQ}-)O4b2rq+Hn|2iatG_-|>jx##6o%_*;{lv50G=A8>I6Uz%Ow=t8M21r@J+d*R}5~elt+B+IBNhaT7e4JCkYMGhog$4p#n#Nca9d_;QSc^ zr9~;c0|n0AQ}lN7DI{LA(GXhnma%Pm(iK|pcH?^>*86njC($2;owSW<5n<5XE83o4 z2wTY)qd0DLA^7rXjGStZpVj{XKgufpPC63NTSaMU7WEBr^#vVg?N z#>Bz%)Npbn?`?rI6jRSbGcK9+W9cpIWqcVyE9&nJXN@MJ@=BBac^0Aq=)cluQ;kIb zpnlssD5aFQoD}vnq;*X{IZI+8X?2q29}dZQxU8fQ1u1w5PNt#|1qd^?t%t(At6bcw zet(G(T4D}=Pbx;LHbMQ07J#}qLZ8Kc*6*nN7MW?*QNX{ao9UMOJ=Jamy9mA3A=ZDGEaL*V_7|p|40XNKzWtBKLzs`#-e^x7AhKROp z5G1p7&AA8ccu-CFCj^KeYgcODF%YuB1ssq6Xd5i7oPV9bKx(A+mczaz3gD!6RVqHV z>%B#znzq>LYB7nH1J;gc-p6q=QIo?xh{VHc>9ebmh;ucbkC-8~ayRf{I`(9ugG~q- z#Wfhld*juA(dRvEMB1b}O|%de=q@9G$B4v+pPI9bsd*`F>{I%qz(Itdh4J{+|Km2f zr=7V?hW3C84FEq01uSxSTNG~l#r+kYNBtF^lcLI&c2zz?d=LB!oO6p227uxfC5`_TW&C{h_}leOczc1dl!Fq~k~zvUCfxy-D3AvQWt_pzyru zukd_b;){s{j|%Dlf620fYg~Yajt#`EZMGGFS7OtL5a`}H3$P=PTKWD`k=REaW!5AWljFKwviZ#oReueV<;@N{XDQt&pk5_EYqXA z#v0yPT0JHZY;*GUJJ`Qgdu$^iNE!0O?*UsJE|WuYVgG-dK80k~r~*)z=-8RkVA)yl z_rtBysa`Q;!&bNjaY*o_j3;yp6&;U)gr4nDRQpG?S!=kgiRh)}R+QbSo@|6AA4M$zRu#se%ab%+agsB}@mhyGQEd9C~8ZA@zRx~ge zjud5HTYV~tl*7UN2yk!fYvNx%3G7lDcD4{SLCAfsKM&gxs-B1_iLjV7!*iK$M=6XL zaDSKOn%u!31b)Ib4_m|EoqimLwtf=WZ?^2ZRcyt>Mw(#elf*e8vdV*j%zDLfK<#UE1aVd7yVrkn+6^n z{2`=VCaNyw*i3C8m*XKkP%2zZDu}r%ox7lrjF-2d5Wo~13$d5R_Cd~zCVqgOGYN=` zjk5j4I@QRFhPOL7aqY-lQ6F`Ps`>_W0*>q=Y$2+?{qUVEi9SOzH2$`7Y}M+^1JVgtekNhny1|b>-)?8ERUy-gdud^Pih2H@!W#09DeUndaw0 zRkm-hk%nn1$A$7v7<+w6uvC)W8f#wiG8w2*5UZY3Z^8>r_$ps``0wCb&W$ng#VdC5=zk ze=9OMoki7Pb9Rg?aRg)?6IcgPDyd~8j5pu2m*DdrVw_Tp2~b^YK-z~9OBN`KYJ}>- zZjg6(ru=2{@Y{+4vxyP=``JKk?dBHnLte#Z)SJGv{j!)!*(LKzTGEy_W=5 zxjiQfKyC?o?*R-eN}VoGYm?=ZTDrLM^5me@67*sGAWfsOHwP}s*iXo}rl|yyf5VEi z={M1ecY_%T>{?oy9Iwtr5kL*uygOo`JaYqwvIMZo@okhju8aj;k1P!j&kn+AL2}FW zdut>AAu#wn#&Zu0J_B$qB9xy0StF!&sV|Y`@P}_2C-{sbLcbYx9!Zl4+0oUL756rr zA6ECqind&gs_ViLAT`Qx?Qjfgr}#hq(JL^4$fQa!CrUrI`$@KW%(>!uec9^>GtPDm zv_@c$RP_`QoxLrgW%aZhoe^Aiz|p~u*i1xA3b4#NZJ)gYhOqZial-i*zZf{jwySd6 zv#?Uf-O!o=2#ZQJ~bQ8a@CIcR8OU zOum-WcodyDNf_uj`8aWo5G8J}1C#=dQeg4>e_+XNSvfL~;vYT8>V8-*32pxPr4ymPP<<-(m1rv`5P^59JWo2_kWn z1^~{IgqwZ&HTV(sS7F>gZ}F1K^j7>K?APc?J=gTw<$r?c9N7)$#?6j(f>jbrhM26< zPqgfQmt6t{%OD;)#B&35@vebW^HnQTT&eRwf35j`{5&$vd;EMZRWW=&i^bda4@T)2 zGEdgHgaxU_HxyX*w+b!cLkJU;k*0w_Kjk9 zW7h1LrrCrYK_SJqrq*-GW6m`PEge9kHi_Q>E7tAKEntIwCj2PWRtp5$K&th!0s!sS z&^_L0%#+9&MB}E@QGa;9QAy2=V}kX9bb1gVND2_hiz^i)I)tTsa#w8o)-Q98pm`R1((P`6Cf z;MIDHW7B8{axnO`^%!+QO)bZ?P!b4ndFnahjq@v&Da_xXQD}B=`JXYbvErJ+m`wojsb=1)#xF7KL^mc;(o)S|jbHR|nxOx81 z=OPPRs>n3t|DHC~ohZfsJ|ps!XL6UjAxwfH;qiC2fM?q>Ga2-$0Y>S zaPtmH&Ea9al-zCZbKKUgV#G3SJXPfkyG)(ia13hes|5?AdKt@Fwh|O&wtNfCed_(ZZdGg=qEh{~ z%hPd)@Hxq!UZ0F(uz^#mmYY(mopv7Lo10HM7hMDp%^>03kE0`}dSOyANuRiy2&Z&fCHS zNYQu`<#}y1lf=ihPqW!iTueCZlX$5nVQwCeSUBpwHe-@;P|VWh5?Y_n-V1BE1XfP| z?g{Q64_>MO*h9vEm_t$U4^q*0KY!QyQDV}$Ni9koj2#5R$`97E985^ec^U$<48(j# zc+MDMH2vcIO89UzpI>H-^(lwAs%2ffK+)@Uj32%EJ?p53!b5a-6k9d+Hsf+2q?YQz;*_!K5jlN+;H5r!LqGK6 zgul8sIlJdr;K@!AcKrEx-Ly@4C|D|i8c~h&#|O7wgJ3%Vq%<2v^8cJSQmJ#n5Wu-P zxRY1{sSy7cOU#}s;sHFpPHAme<4d9V?bM!*92S>$R8%q%BXsAH#|PBC$BRFSB%}@w zUf{|=om{&p)|xaO=zW!Q?j=si*iu~)R8wW6U0Q_HsQ7}lqzl*FuE`ogsaT*gsz~34 zA?7$ABkEkCSEdLXt9+wOy*vJkRsxo>S#n}5U1fB?0n zLvbvrH>|?mFJ(?6JA?4&7o(KrVvTaXGTymL{#+APh=EQ%1R|^iO}=$KOHg7~S)D9( zgQa=8<`IUbTnY~bz?7!Sr9v+#EK)fr%*;QWnLJz+78gfmz&Yfb)}cz)V(%ns7&|PT z^pq8|wusY@6WFmVNj2Fg4$>y_)^Cx6duiV^on%l|3V%W%nhjBih-o>Akg#9+no4)= zf5Ba5t9{}iW8XEbt@8(qND=^ZrQuLh*4BZDMbwc)tA5|4hgCz# zk_bWZ)7|w+5CClEMaz z(>dAgXGegSf$y(}MpE64(LyVgXEdGFTwE(zaa)``?p=NWx3=zWh0~8Mrt=jC#vEIr zRz>=#&kQv$rZJVMW14x?*=z?gxcTf3yI21xLf{j>w)>h!%OamKjYkY?#ff zASh%JKbItkhueP6rUX`uov_B&LCJTaqy`%Ix$wp{ujq?ia&27x$x!s-*6k%+wtWz8 zJnG=s(EnxjL%=LV;59GHDNGAGK!pEizC@nPP?N#1k=_F)G{4Okq6rvgN&^!eDC4`k zwJR||&IZI<>3r9j3ex29?|?PkkJN;$`nZr3!S9DL>C}nWt#Lo*L^LI#_7Hy5e@PoO z%iCMVw*#RXD>c&;#SCA`#8I-jp@;z~^k$rj7N&m^9QI*(e%gK2?i6H(lJf_tz5Lv5 z4p{Nre;c#`t!3D9n_(;@YmbRJ#es=)?#Ax~5T(wc0%Ohn#^?vE@n1>Kn42wxtDaa8 zK$7YFttNyKunZQ25!)O%($@S-G<>y z2DFmg6%UXy)8sBd1w`q?aPDf~j4JKJD8ZRu?gp=?!nkB=KT^pH3a8zJ^v86Al#ww3 zKz^OV2k_jS8dlt4f$X~wL|i}p<_5Q}?p|UAiE+$^3h-opm_NiLk%xzdQH6$Wgtrx1 z_;#Z5>iFR+&$fmOi@LLt0^%cjHbP$ zJRN+s+35}`g?N|A%DbOn>qHw zitXcJz<}!Gik|6r)AV~VFuMmBD_!fDBl<^YfQ3*l!eRbPXJ~MCeU8kt$?Fk=xEsvl z^jTia9ub>Ncic&YFtFcYJxeYSWp zo@_uM0OLWWop_%+%7=HX+;8BfBsW59)jfnw`^?- znCgCzAzjC162~8I;S|fTZ*4~m%0Ot0A}4-1>;fm6jtUh0MmQ;)Esg0wtnHxLO|KEB z)yXToQ;ONA&+G9iS*+QY~Qg6S#;+vC;4{)(&EKMA{WeTSKjZdoj)0F(_-_op~c&ni~ z1IrvhwA(xSR2mt7upY-b{faI!{N;x(HhujU<2I2TiY!2GW+4M}R=4G@auayD|_;N&aEV?*A?z(Z^UdGa5hwMdoQ+RPxy z6V`2`%=k(4sLU{qXFg@tiC`XUphHrT}{ zo-betRlW4cu3mE+Vou>}H81ka(x!n!~3=JXCa2#@hm>kyp=LsK9z~LBT`2{=UL#{1o@~{b5-UNuZ?YlS`BKsL6wjxCvDes z9Qi(5h~IZ;&Io|0f_;CeFE~5V{4&a`aeDwpLmU zd9u|n0VnF$V`FYDxPi*ihQCoqhzN{8RDkkB}hr<8uaZ zb8yAkilFV@vH1(yFhq6$NG1N1kAVT9A?QT@YM|XmbZjA>Ti>$b*V3lg>=yXEiE_&p&Z%eE zKRNyNyTU@S+~UHHZtt%4$oB8|K1#{E)!mFfK9!Y|UK@lC&$OHdt@#Aqb#c+BYxcq0 zHJUXOm8-ub-4o=t0CZVuN0;qmwM09RFrK~WeQI30`Fq7WlnxA}Z)eXf(cu_M#5r$E zE+<^_z!vyc@S$mic*Co2Sjfea#rRoW(HpcljA`_LS9l)ge?je3>PKJ&d`n9Pn1{pw z<{|UAtSCk6(022IhL8;T4JV9d9&#YL!mK`DJhUkBY3I>skCurw`Ooa6Cb{tL-oT?e zF@zpjkiLSymSRr#A#Nx)f@VO94Y_837(+Z7ZghO%5u9I|K1O3(7Nr?SCR=go45NXN zlS4GQTmh>SB2Z`4_;munm4r1hmI@pCS)Vzp>J(IHNU+ZK5xt<$L`|;l37{1(rI{xfZW%pT?`xInSH;U zL7)zlxWW)HAvGRPDn3wZaMtp*j?h#3k|=N(^hjD31e~~6Y8DH^L=0RKh0As}=4S-o zPi1_$G}-Dq7z$vB$um(Y@KcxtE6a_SJBp8CHX3d(H+$PPOmkE?v|3#8t!|uC85L??m^n+@htB;pr@K_y_D%*_v_QKVRh5gAYEMB!7`#?&Hr1MtR zSQD)u;aE|+)?#j609jO?n*TdIEg|-_9qHMS;wTv!R73Ac!uuYr+<^$S5@pe%ko%ne zS1bT?N}!l=;97kbVXhhRqW+PW`!Me?HZwU~#I5LQ<2XISi zE;af6Iv#z`yCs0b_ddC#VFe0CoFPQmOEb(-M+oJ`MJ}RHAyfVtc(fWK;GG|+B^}0N zHEEojq6R_pdV9h1GnnMcY;Q^?eoi=!LJ;6LMh-U2;RrT+l0`RJEbO9z-OiwS%BUBg;1;up{Hx6d}fXGMsojvjRUJB;NL@;*T@Y62+$= zld6tZM`7=}K(ytsg1|LzoJal^<2@ijogo2qL_BxG1Z6jG`blBf)6#Fo7`fLHtpnzY zs$OaZb+zN$)o9}4;fuD?UjiI_xu|<4pz-LlP{bm$D5X4OC^n8`BdVf3HCsh+Vum_&qB`bYB`%vOgG~qEh{ib=mZcg*HABl@n6_39xMLXJQ%C4Jt z;dtZR!Q>8q_HOx<<(&m!4$wOE0i0+TkM+1f`q#@CABg4d*pU)nAlsCd^a6;P-R;|| zBRJF4GRttOi<%nzs5h<~*|mV&h2xZ$Uk(ul`U=WNj1@^n{CKC0?Q48~xRw~sERXA+ zR*p-560iZ!_MMFDSB*um)mP89sr}v@b@{2uKWjE1J0i#LAiWt1b`f`cN`l}fH(GBHR^CG(UYJ>u|T^yn- z>#Z)WlY1YPb(Okgb{`D3q%IO-p0vN;u}QO_@hoo0ma(*@%G{--@a&Nah`2sqH0NZj zzWxit>@w)gd234Z%~Ary3!_M6fU*U0%u#E7o!&-o3b|d0FtjJVZ!7tG4{S9*-8#Gs zfw+Vz$;0TAcao~6rZwCr3NG!qa8#k`3$bzN&sS(@AiTtF8fcM+{cDkD>s6l5PSM1B zTAJ7p0b1nOZF%OY$U_U6vq`Aj5&FXy#!4uHDz{<_*`b8Zrb|nStJFjux z0ibK)A)1Yp-UVrG<%-7p5tnnj+oLXyd|3x?Bk9R+UUJKIWLU>w z;5{%rr1JcZUI8jWxT9?TZHd)~OwSK!kx$UB&1m5QYdW=MOwY=3;9Sc-5;jaCpu@l} z>jfuat+oBVw?(VJzMtx8*A=hBj12by@H!8D-OLXB{NDTRRPs(v=Rud1867E~wTa~8 zisU}nmE;>;!<)kceC#J3{U+BOV#8(@E{u^%9?#!PU~^`_S$iFeqIvxN_Y~oj^aWI>|Xqc)GbFh#TD zn9{qv^-SQ8Rzm3Vl6xQZWqM6?!pY3P7}Q^sYVzT_5zb>$&|E@3{a0~g}-1ax6w zj{=xnB-6&7n~z8#gl1?1FYB7|D4>AL53_M%vb2ilZL1IiIisxXNF~h?ry1y>#IeEY zsQZeI@BfP$(zK?l$9400tKe@?qB-PV^2W9%H!@`vs-wlD0x{?b?57=@5cANk+2KilU!jrc;k)H%*0ti6FLhDfzZiIhgTsLs&n+$ zl@!@;2@1tDjG=K$b&_yD3#^AX@OW&Iai5b^dImJUQJL)2##o&g&OW!r9&fQs{Xia= zKok%a5*bbMCQ*zU6o|PKn04#mP?MFa$23K<<9$+dX&9p+NPgH^5&5zk%@-^P0L!$c z90=!nEo2nOTVpO)KeiKzN!Pse4~Le9RUk!bjUS`WkgSi+&C`rA6dJ19X<=Kh?o#We z=X!_Sn@Hrw(rABFSDyoQucZ6+b_LY7ePx=U|)FWL9GAq3_XE!XgZMYX%MV z9+a;=o4I^Dj;e8>^eF7zky}D(*Ef{R7_<+~LIN2)W?*NzzSnjm7GhnJNGd2wM6mLa z6WmIniI>EfoH+VGasCl!$KsWW`tj+*|95ytjN;6D23h|>z#C=dtBq<0Ad?xkm@@ws zc_t7UQ(aGrjwr>ey=I)=}gNd1#a5S@@SDSOkG?~a!tLTPLAJH11_0eS-z%*DS#IA z6MNqjUBR)XAFowO{eN7&Wl&wwwylf1ySqCCcL?rof#B}$EL?-TJ0!RTm*DR1Zo%E* zEwcBy_n!A>)m%TQqNrkw*;;S?Ywu+yyvR~S;D>rX9jD9pXL^G-9Ep}Z*`e>He`cpe zZX$#o;P8gXgB*>^BZ6btll?~h3l^L9n|UFu-8DoS;LbFI%}UNII}<4!LNf*<|2>8Mk7EUdmJ_mU39R6aT7-j$e&C#m`bFt7>ELBndX(j`irqG zcI+ma=6-3W?G~;SknKp(9~A>=MR{UTr!l0GO=t2wz=Eb!e(RvYghS1_55hr57`YZ1 zG>=BIjh}@1_859ktT(XE1P4)e4?4kK%9dy;35=URx$yXAj@$iR74RCc)p`+Xw3V#W zk@w>_psn>olc0o`Yh~2N?S8x4aoL59)NXIB&0W{=d^rVBDWTRs)(m&} z?sT?~VjbM>FXrkB^3G-8B(r2C#@?Y)r;O4%sUCcLBS zSL}{U`qZ%VEXa#!YbMS}^#nu9OPF;QNQn?O4;4rsx?G}SvVfpQ7}pTGpltPk!GQ^J z3W%Ry*61CS5*|EP-3GCfl={5xaXA#*R!hYKwu$_ad$kZ`ng+kz zzlhzKHI)Z68QRkV_a{cR#;j~#D@Kci;lM70b3qdi=PqzuII$ZIF8xjdmsTBZF;W#* zICVEsU?&>*94%HK`Se9`3+M8yFj&VFg`WR(t=UY}$TV{Aw_SV8hb z7jL&f_P}6iC>f2K(9ecOVnCN5YnwJ#Xz;pRx0*ZZhXuc_Za;t;#bJ%IGC(Q#grw6% z-}(jdND=W3Fr~mm{a&-=`n!ML`)7qP0srD3W2tnhCN(lJT_3m+&|6q=LiMJN)n2L?P-WbBRkP zN4jx3N8h@Ao~oDmNTYPnmN2XPyW!$MuBBrnOnzlz(YBP+TgaDr)S%z;h%mdp63@(K zJOHErn-2m7mIm-aVS)imVL+F_=~D&ypkV+tT(IG|os@)L7PA!cD0#zX(?C{E16zj% z>9-h4^ZJj@-Y^sClaSwTbt3T4;gm5$o<0Of=0lXgWt&^4>zDn#WBC8@XiAe*Y&H@HNaH#vlB)f zAq|!w9>#QZcyJP8-2Z<7wclldfZ9p0j@i7uVl9azl!Iy9n7Kp*?-n)L(rAA&y`Ruj&}`(1GOHWNWomhFNuv zO)S6?EWYi)EH>&{c`t2D2js=04W>r*g?%oQLA3U<=>1 zwl;=ma%wr(api_T_cKUeRt!?8_V>yt_F37EG6Bj;Rrm;83Gyt5gV49%bO`=LV+@RN z4;oc$lQ!#ey*`OdcfF2hPZB}&t}`D~+VKD#WJT+mHuEY&YVp8OMP|!Q>Nx24O^>cf zV2gqDfN;AW=n;HiXN0l@%A)PmSW0-CI4Usz-mnLz1MJ}*=S7XbCZ;(6Ggw3A9^qw7 z%c2PYxOvFR)x^=sxDoJNt-JkaBqcEo0~|>W#+>$)z@jq3+yeotQ`VB%iPLFBfE&frY2;~ z@^EQw#=&`I0Uy$$iP4rkqazSxWu<{Nx8Ba_*M^ab!@jF_puqCyq zDr8@XSDPf4`z!PnVSWIxs4cawsbn;|_2AybQ@Lp+tp8rM{`Y7XS zx+BxqyBMi9w$8RBW5GmK<7b8N+I~G_oa^b_(OzlAdADAz@+v_%@cO~8f7%AZ-cV86%)S?dJ_Lq#L&fl~qCP6op{NJx$Q#^E_Q zQA4cHa0G&3fJMb&d^wiwrn0_Da}Rl_F~AT7z9OBM1x>@T;28@7Ga)!4>7B5+u#xFP zidv<%xNAp;F%&YJ-Bgb9$_S<*>b#v_0!ZF2Sp_6#FFLZ|% z@-ZiyG}!hvKTu?xWYV4HkS}SSP{yhAt7jh{Mm+>N)p^I){2JH@&Pkrl{HzP533r;0 zH@+lj;;e@YC56mA-$iuaIE<1y$m1~m5aDeZU%eu~1Not+i7g*t7ZM?dfL@%oAR`8gT$O~b@GFromce>xoHs>e>PXa4eUZxo1H-%9JF`8Fx& zOJxCi%@uBtW8q>gSqY>TS5ZE*cngse0T%&;QO7X23NgjMc{nP1I1V8j16y!BPIW!F zQkAXNr51VCxGqyy4_8EyIK!rrOSrMDU<4F)dZ!$Feo#4ka!g@>7iz?#rpMwe0C*)< z2^hTz*=G89_znN!eVqsSzP-N|R{pEvfK=Vpu`OD%Gl#(-O# z37>eQTSzB@l_&Bf;(e(i*irwk3#iT*{NX*|wLp!&zyWBvUR#^M?Q=HXSxTt;!bPE@ z<47_U&>uTqT`0p+k&xJe2KPmta7lh&xN_FXB>aw5&a47{hkJlGPErC#S*zYe3O`kg zo+F2oiN)M6X0g9S>tezFX56(N57*KcBcQpKMrWs$g}_l*0nsGMQ=qiO1rR7EUL16= zVP=`mceSn?_j85Ev-NJq2t4a$@+QPv+vf81NALK_es8W!>fio@m1ylE`M-Ozd|oGg zn(9_Js6Ko*@jGR!Ruix^oL-R?oTFH?)ABlt2QlDK?zUOEYjkxNS}xxhGLl1R3Yu!% zK<=#zhoF!VDy!bd>Idjs837|RriRYo;Snr3N>A9`SS6kxNz}7;%o=kQ4>h7bM1^|8u|4rqgoMv)Q zKCk*lc%p<~&rp4`U&R<`yv_~4ofRZN%6gVK4bp4*AW3*dT2{5?*(-vmpRaP{8bwpN zTz-2wB!$~3aeu=X z`if9VBVdWF)pQ#-O00=<`A`-&?4W&yYBKz>Ypsg5}vH!b1rwm=(rfv?Rm{qO{Qq#OybVJf#q(vT*JiZ#Eb zJ;}!)LDPhR>BgKbw8J2tp4q6x_u>Ho@2N~)l0FpH#^7`0$8AF{2 zX}G)qtPo(qL~$l0s@RE}fq@VBm#IBUWNg$_SI;pR3C^(!xWtXcb8fE;PB8uMj8860kChr9`05foMb7WB#hIY` z)0^PUpBJ<|&jL~CmtxHyr}Z+yhH>73FNR=`ulsT^bC;XCa@up<&3||9j@o;DYmukDQh&GW6HW z_AfHgZ7t~HH!5eVbXscPSG|H^`lFW!{nupsiww-ux(DC8IjZ{~Xl-G9yLbs&S#GZ* zw9v)?MTh4RSduk+rBcE!wxt}EjI8FxgW#RCA=<%ea1hm|WdVrI=f`AANcfLm&=_*m zQ?G=8SKb=I@0FW0r`C0 z-uI(9_K*oi!(q({RAT8x!N}p`m5?i!!*C$U0)|hcs>bNK*;(uc)tUN!bDJa{6)E;M zS4hgopfVLK3+GL7Cx{6SYP3*@j^p<00&RTSTahJ)!LZd!j{eOI(YhmDOAL+XR|^1m z)ZI?Zzgq^_h0T(hp9zi*#>J7^4GhAiqBMX*13nWGfmcw#D`vcW*rX(4*Aht@iCuj8 zRH=YW#qsT;%_EMC*0Lh(gd+M2dc1C68?hh*7JLP4t0+VV!K)uDw|6&Uq(f1fD7Gr_ ziit;+f)5h!o9>73B@on$8E{HVnYS2gzUT{U_ZwQQd%4 zP)PXC6dcWG3NB%JYu7xGiUbf1a}Y1WRW*+QYr2(D_z>g{jy8oV2l_c$TGdf*2*$?m zxv_n#(fAxKZH7Etjoll@mrm9>#ScpJ${r?v^=@vd$IfW9`6RJy3=gPHj!}~h>szW| z$|ChiQ-$@HU2~O&mwKXV0=C~R;}5mdF>ko8Y+E6M8fLi+ByUlyZT?=}g&Sf};wr4% zdPwW`FIm;+Do2wO3BEYz#QwRhv`^{tJimzaL`!0vDeg*V+SQH}C<3=QN1)X@#K>gH zo1CGD&DI~lbn!N(C=OTpz(cV0hCKLVZJqlM-+}=LkEY!vu8#s}h-SbN@u}Z1X8XF< zRtN0;IPT-&2Tr?wZ!k8%{X0Wa{0ocTFboO1g&sT^F))C=9}NpMS{99sOW|lhmvt|? zTSs)^@6d{_5pf>JuhlSkM*-RQhqufEcbF{dgoW7CebZf3L7nBz-gQu6P!FslG%ex7 zv|ZUyE=2v`fIm0${Ne!?A2cu;Xgm8lsRo}e>$2sI(Rj!t1L=#3;~2k{nc+udgsC*l zYMM7C;qX(&d2J-{5c#b-g<{O(F4BqaK{_N`$r=?L3mY|WnnT&4lxHjU3y?J(Q-p{k zyC2VO0K_?h*-lGh+c8Ix33bP~LdjMB%@~jA8x#aA|NRx%tu8!Ug;^2=snej5h2ruM zhTYmsGXiXUqlTtmGSBlSmnKi!t~k!qyNoey8YBqv9M-CQ6jNA<+U>m*rKGZ(c&Bck zQuVyL!OVEfyxH;zBtUdl-Cc&KiubR;zyaGb2KCGi{v%j|VdNs!x@I9PJ8LB!&{`7K zwT2CFggY_g?=10*H<>>RdJF`rtM?AYc+c9b{wLPpH9{ZnV4Rp_We&Sk#7%6TEN^|uV;BU^T!o%|+d=Jf7@Nq8lk(9lVzQ4oa7ayn*uZ*-13l8n{w@5>9 z?+Me$lI+3=LOO#n63o)H=UpV~kiKs{jid~k0`l)i1syzLKR9Ou+cf3P@Dpl>=8IQ5GQ`*?}e+_F_OGzPA>d=3Ts0OC6U9x9g6{ z;gziX0dN}_vvU-bKULHiFZ2~kZ!xUcFVpC|*eER1qOkq}d zQN*QGV^ZjzdRP-Z+~)ghgoC!$@i>+<3-Y~-B@-#bv}#zlgcMd5Y#sd~yj1P|?GaOG zp=3Vd4oj?^$i}3%Cq{t$d?_NYQPN5-XGzVpk2{!q*vq}rT;Ew#0cjOtFFF8vFG*M; zCxzTFJTP1u@!o@> zT+2nRZYceihz!^MZzFV06W{>(sL?LNT~v&9lXHgUvUac!=?=I_9Sb4pa_-S4oQ=RX zp6*WP5vRghgHi=;A`v@@9uZd}@0sS4lkbU*VLMCGs{zw;D@6)_UyZT9oA>`(=~Y{o zCjs9=vnE?TM(+=`GuU_xx7P@BGq@o3p-Y8D-NPeFE)IKwbpUHZRvTt@z+7 zv*{KK&aF508f!xjQb>V&2i=y-SF#PgVP|$~t4F+1s8g0vXmKHbSHD&+(sVUc z?)uv^EHPhR!Z*%xeCEYpzHADzY+3%Wc zWWmplk?NFtBNdG8vE#$b;iO8DMb2``V2O~HC^|V@2Y|Vh_d-6t{vN10JRaw?9(K0)@7_ygvH&K(Q(3`3li&ZvBL0g3UViGT|KFu2TtNOmm!1Vr%1`!V7q1#Arqn2V zp;IO-7LnBOJnTgMN$S{K=V+BIx{|3UG+-A@8Kexb3ugbwCqPgx*T&45hw-l&r+Gxq z`}M&-Ilx^bjjSC0gQWHkz~&yfZ@jnsw09HS0|TL)#KJ=5Ac~e$O+_q-+5qxIFUF$C z(dwu}59INbi(F9IQ&Z%Tr-6NvCN#b&Hw0k22b;gV))cA)!Ya1I+nYIM@Nm_sgFYa> zVxG6S#jUdb(^aTIT_v6PHsv@{LFw(uT9X7)I1z`r{7+YjWP&l0mtNEgJ4Pm{XrV6S zed?-`f4VA#pSD0zCU92lQ&)}g8C8|H+KgD8X@^6_HX9@v3PSwR22&$I`j4)9(IzXM zHyaq5V<1VQNMBgg{{Fa%l}^+&=g`&y3921gr*hV`jGi0G4rfISKsSO zvd7f4n9Dmfh=H3WFQO--xYrW+4*@7f%7p@|Fw!)Q{Z?ID&FZK-Q)gELsX>|*Pi_ox zE@WREKO+AjuVh@+xi41q98z<09v1JmIq5x7_U2%~YUBN7Dk;)}DEY^Bt;f`TyvYLs zyYEaFA8OAdJJbj+SlWr6PcxSG?T-Z`x;sJkHz*#RY2U}WL3nLD6qvBmn%OFALjD54tL% zewUZa7uLqGa3&(dUkt@{+&h$IZ=AsO&aT?Uor!Pm8;0bMQr*`LtC>^D#CxrAEH=x( zq{7+C(MMzMhf@>4OV}C|P7am)=qC%;#OFVt@AIwb)l`w8=Def;#zsTCq|`h_fU(g# z2!j0%YJJAM?`fSZ{Q%K2igoQhil1i^r(!&5r$lmm2Gpc{&L&*CcCwfji5fz>;WrE) zlP^tT_VJamGmDb2`EwG%n+PkLw?_{CJ1|??dH>jVgQ*Diyq!7$hvmLT(j>h6qAoHt zKl#38-G+Xia)G<6o7(fby`4^mI|Ya6S7+*Z;cU3 znKY!|zjvf}b;HctaKuLm2JM^T3Ne=n#c^-HiYEb5%4{@6UX)<7k+-t?L9n9@je(VX zldc4s{*%e1vT3R&$#Ewpc@G#~2PQ?*TJJU__Nv}lVId*`+jvk!(UgnS0*^&%TkR=Q znsMW}A)s;_o#&W2+StRByEC+1DI#K23wpEip)mdG7bM;Lfn5?SWVZg`yd>EW7h#k% zg+VpcMvs;=XjS(Cr`0uKY2HuoNDP=f#**AlbuF4Kmx}XMZK5ybJ^gNvj;-+~njC(D z`6kUc@e368FU6fETrju`fs)3B0_QY?I;@3)?*OKX^E-5*7Zn@3O!_5*i;SaM!jmkt zCf`iwXpW?=L?kbseU>FI?!$cul=J(NT_i8uQ#o3B#Wgc$QAg3ew4e=8|60CNm~J88 zsZsVME!V%x5VN!{UdG5?&^QCv3(!~KNM0g@Um>zQdWO(W+FwUtcfnb43UR!9aJnBq zf&o|h4n2=|453y?-o>i*TK`Dzj(_^pchp6W1w3%$+mZQiIX!EMmQB;JE)7 z{I%yL(?TTrg6|%TR`}nw(SOYj|3QfJeECeKV|_No{-1djK5$+o{W-7VNBy61RbBi4 z8du%-RQGera|tszN{u53A%*p(|7Tov`Le%t3~#3tOx};tn)M0$__v2d7Q;k+G<&&h z#h%jJP$6MlGJe_QUY+~c6veK%%Xaq}OfO_kwTGHyhSmo_|36jNG6zA5`Y;(FZ@^%> zB-DDdvNJ_efO(7{!UnR`REzDTVLY$s@Z=-S$2p2!M>jib}Z$1q)SfoiogGRG5OXR1DO<1h}8rGilmA7WPi}7-7f%t z`TX}UFe~$rJAV|c>HkNF0noH%#r08tL{~5cJ{oqIu}QAsSAPnzA)bcM4JmIdoe-qY z*rE6qjb#&A1^MHlV0A>G5ovM^CjlgUFDDwl3K&DC#0E^oe^#U@8$k=D1qAuSGqta0 zC+#CQ$XRlvbolCGQ=`Q_K1=|yT+m8zN#>wH3W;0{PdmWm$nvrbmZ-V}6Ee?N6{Uj0 zV+fJCTgNDGd)ji>s2`}qNWw%NM+B|h3_l_w#HC^Q(!8k%NBW`u>9EU&Z$KT!>TcJu z>(E{KPlr9gj^3%~Pzq?~RZ0SN*c4K6B}>YP^$v!!F&_p_lpv40w>riXu2Ti8ftB_m zz`~7Y<6(F~4wIn@EUi&7B?fD1k=HV?O+dGnrNva)Y@t+;C!?EGcJ13&IMu=l!S%UQ z4 zS?y|~HRcYq4&7Y++tASg*cALosj@5AZfxGrMON&Hir(gA%rhTDBoHBe_2LQ~P3uY+ zSM~T*W-F$Wi+-ZQI3ejQZ^8aCx97niS@MFy=6@;%BeXFYsb%Z+S#7pPnq{UN5@nl% zAQ?c!W-wH9a~;&eGbzR1x~~BD+)uh+U+fS;EsJ~|sxtnti>ZO$HeMp({1By?*7WaH z*CWmcDTKP|gd&#IL5i9Wk2e&&a=&)M<$Ac)5n3#ZWcd@4epg9YC8S_k|2q(g9oLX< zxg~Fz8yle#Q|c^{h~y+v2)C~BbyQpUaKMabr)}i9-ZCQn6 zGX^5Q1i^R>>hkb*fD}5{_HW_=xdY9#&fv+qV+k_ z=m<#hj%XMYwg9_Yr`A%j2V+4axr6(JA$UE2SRRN(nUDtt*5 z#RN9s&HwKPyby6T6aEj$1;#~O7#Of@S>_C z=PQkPit>yYX|@6JO3NRq!VD;MkafyK0g0h1nNYwIJXs71YyjB4(Ysh6Y9)wWcipO` zM<65w2xJb1PH`MO4?xWbTjwV(Q_>c}0%_6|#a9D3TXP;r88wYK6kNv}^GF;4e<)Ro zXg#X{HouTE5xR3!yWu=2SiF)#HPU%FX&$9*Z0uHqZ(xf9 zFyV1Pq8_Z=K}s~Zvy-=3++0%tOImqL@E$DoBMoK(4-%|7A)o`ar;Lfi;*nTtYDn}P zeA4Mk56wYip7K>E-c71zv5(w>DY>YkH%z|+g1l9b)_9sFadUsMCO}dw;&?Ga<#M3RbK6eg!M06$5fnk4e81lK>iy$bEABwo=r?ZU8F;O= z+AG-*zu3Gfi43>OU(f_GdQ)5)M)5AQlz;(NS!9$sDwjxc66{j9Fmb9#o#tvNFYPXU z0OR1IaP}`yzE-H$oCl8q>vy6^kp%IJ9^yz57(y0n0PC6nLYGCeqsf(}EIAvEw2{mW zr6*#)=Bj*=gw zt(1TYG;f2VT0(c~v-w@W%D|j{?}Zn2z@7SA#slW~n&xfD!~CIk{sv!w*Ez)B4j{cE ziN$G&jRjt^obbxfAy$`Hm%df{goP%OK9$#B7dG+R83){V9O%eSDnU+ufn=(Icy%)EIwe18d%^X6le=BqF(sj+)Q%O$00>JH z;t%lczv{7d*Ro^yyTJMHM7;N#p@t_AKo^@Dh??oVtpv9qM=se$)@%fjwWN}@gpnmG z!gz2gFCdXXSybBM{mULz886r~qdyK_G;c;8kY9#NCzmi}Y{ zkETpn=GuXsf@WqUyprx7eLThQ!Qj5f{|2=~Nv~kv{*pBpTN=Jm5`KAwfqGmtM0ANF zPL<_U%hx#Kg-=A`P}`*&RVfhGs%`F|->rX;BMaTqxExl+ z-XE{zd!$T27#d@2#<4sal~V$P;~H5pV$BQ{w+H?_ zQa1s(vKR{t=V1Y|70Gx+|7Eajvx zts+bLTck)q$-vhe``JE|?>>C!D23Un)T<=pTqwDho{g8xH;6goJZtSb8y~-Ji+iCF z1{f0PuC9ymJMMNy$sBL+eKN!PZswghb|Emn33%$Pn8qC+yQ-wz1H%h|JHRl+KO?<_ z>#0D8C*0^6YJu#JpDAXGSWtfdey+9-q&Qa#tH}O*$>ox^0pkyS6ZM2l@KEHfMmr>W zP&O zxDoA=`lREzT2*AKCppVbKe|6L$B*Q?d+I6H=D_WMhu8K{h3;{T)uJetAY_1q`3>od zYT%WT=2K>IK*ZzT`P(cn_69}M@@Ie{?Xt1MJF2~%vxdI{P%n>3ahK(shv@TA_NWYy zLcD`I7^s{%bp&6h+HZu~hkPPXV%_H(^Zz(#B^}}aanOE45ENHZ>r>__q&2b(039@% z4eLD$gw=00VzfVPh~#W*;^R7a>$p-^&>%lW@27+I_UWKq#8pPkEQ-VaQZonBM17(;ETe%)GVA$u<&1(+ZpX3#G-2=C%SR#l9f ze!Q^a_nx3YtN8`VMMCDxM79WUZ~ThH`(v&$9s^zcWa{l!3pd}P$hvs_yR%I;D*))C zkuGCkxV-gEcABlOT0wq0_w^QNOwCr^;dF7XGDM4-op9sXH#kL&apM6Eep&z9T(1Y^ ztuC{R&b5)HM1ab3VABL`aGKK=wB?<9##U+YCUn;jc#PxqXLr)gdts1mf%D^S!p)FB z6eZW==MdRR;p;&D4!HD!IP1MqEdYG?<7+>lJAbFCls3tFi7J~{KHoV?`!)J&KXi#T zcK^}wO6ZkGSmXm548G>S2*X$L7u1`<2ca#s|3(e_%JO6H?`8wpTfhiI&dhfJ{M0+tG5Z_A|IK`Z@vx_Y7622S?5v-mZ(6{< z*8kugwt#E0G;aQbjS=-@E*abzf4BC8RpWqVS4rY!L=TIHhNR*%k&MIXL^^~JU=W)x z8-Y#!dEdmQ+NSO6r3$s)h>Bw0!!GD-f&Z9Tjy9J&5SF3KMPQk5(RY;UqcQ z^l$PKkQgA&=S4=jAp~0ytNQ+0DWFAZ40dk`JvwAc1S?V=#8VL4MIbr&M^_PjX^Onz z=F+%W%t_lrWZ;a^7xkAgzGz>={ovAUl}WPnP#sS=7^AHpL8i66$5kgxECU}f7o z$%PdzVQkQtEau>f9)j^sS?>bdCN`U;1`2e8_>d`b~{;PI2|v^;8NllRwA51#vc@dk0%`qg(@Dhos>JE ztT&7QsIkE+@qN!|14po{nK-p6*l*6_>kWYGc35qS`gRF-8CN%-^u}s4Ia3hc2}>*nZB4`6bUY#fJT>OIJur`^oB_u5 zWOvG3l{ZdreN@2Y7q^5$*mqE&@L_o|jnCR06oSM)NK=2*xVzn)t^MA*TXY1F^gX=b){1BYmJ9XOs2xX9z(=l zw~*7}c!4$qDgw7eHvmp}D#Odkj>Z1Z#Hh#;t-U$jRX4}W?dVnF~mbMyjOF7v1 zyFOc|<=s33gzxWaQ#F??x(WcrUb+CI6|ao}TEpyo6grvT0ftir-2{(>(8vh{dMV{L z8e0~lVo{URZ_Nia$}}aMby$pnlQm7I4j8zQs5oJ<2oyBVwoJ0g&pqYvnODz}j$|eS z26f?`fTxa*%UkTo%_NeA{~s(bGgiX-pjKA`0fBNB|MV(vmbG>pf8{ zn@lTh`C9*CR3a>a@kM|Lt~;{}dFiP0MbVaSN)87=%-lzcE7$N)~Y)UPu6LB|^0c#&wfAaHkge&LYQ z_Js>=W8NbM7zmsYfAS4xs6h3<+s-2Xb~)G6Y^u+v_C8%bFy-_AkPV=n*ZT+~OBRgxy+j?%$Z>d8I6L>|LCetn z84_q$?US@*yGZSVaKi`xcZDdwIq!KXN3)HgUj6qPX0`f*IDV%gxPW5b!X z%L(#TA^(b{-atq+Hev91eYQ2L9>@iIYus4Nh*Mh?a{u{ZfSBp#DOCIJdolJGKo1+e zW;vC*iKXdP{V*XJnyREeB@qH{poo%jc4pSFTEyP+3qLANKk3uc0F@8b5z4-MgIZ_t zKkWcq%`upP!T@LG0J01wAZY>XTK_YC|JO>G0|6Yry8>g)E*VQX&vC$mI;kItl9vLL z`lB-nTUhy7Eo-aAPRozT#;8NNvsG2NAxv32MENyezhiVI*-5iZVG5e?H^2(N< zJ|=ZNK+~n?`=7MaW$+W=TOS~@y&NA&B3Vx2uF)A$(k!RF;%`OJvhk@fIP0>gAtAw_ zE$BI^^er&)GN>zoT-7zyih%#!3{{hFv(3^|L%mAf-f8l0r-iQZvdIY; zU%&)Nc95#a!(-u4`BLh_v%vIngS``dFg012_%%>k!JS&ChOMp6ZbK5fomX4*wpb&REiIb$@D`CG+-XJxpu-`lG{77T5%IQ8d#W|I~g?*wZh31IQFy zCdAPo;lFW!Wf0~uyGrmY8l*=d`2JRNEBs;?hz_glF&Oo?n{&$X2*Ht6=Ft=?&N!cY zALk76DEQ&e#^tu0n+*4~ul50##}@+z|u=lw|z$pQXbARnh>H zX9qZf*tVIubRIJ~s9&~7048A)Yo~GW6W12n#nrnuBj?3Rg(*3$dLT{59U!($n4mw& zP5N&=Mu`}KwoQI0z*u;){7c@5{}DM4JNrTpbn1hW$g`KRZMpO#vkgF3RYBG&AF_nW z8bQ`7xvZCx9QfX|pb9Y`3Rnt%uh6i<#KWpf0kTCe<=lp3RM z_wt6hFDl+%eMi+jx(x~|ike?VB@~T#Fq9Ojs zC0z*{U3uAMnm`f?icLA~itT)IW?Kh-02!*^*c8$i3D#Y!NL)aw7WME|TKAbo$g3ZX zlfZ$kF)f(Qpv-hHC&sRqDFM8ZVp}M^;xrz{ct|Ft^1hgJp#v!$!IL+`mPUi?ZN=4` z(=2ARzMVWs&_2|lGg36yC^2*LglD#=K}<^?&-2WL9l_H=DT=qPv)|6d3Ecq%4!)r2 zMg}%mN#RR{tvnzq2;qE{M*!%14&nfJOuuQPir*sjkPi8o<1Bj<$yM5ag!r7`3MAc2 zSZHn7T2b@e{Cs+fDi|I4`)2@p@BAWP=uRL!5v7yTxR)DtQKHpd<{nFVAQpL6(f1f9 zxl)%}3%Y~JmUo#mlX`8@UIQ|3k9l!IY3dP870s40Js4p96vV2y@SN8)ep6tZx(b(j zgCe@E!+?gxw7;@M+P)lq=vmt`Qa@3w<#6MEx5KhXYz)aJ%{(W*uZw@n{58R-Z{r~8 zmqLg_7Q1SJI+t><3>?O0atc>1ghf}ztlF!k6*xEIiI?iZV?k}-!cyT&y7uqj5+nqD zZd!XI`2xV0!=qJT)h;3yV*A%29tceuGa<3%*$uj(0ew-y6vD)+rtQu(#(bMyV(=%XKl%`Vtqlk8fP93A)={a^sxpJsDnfT?+6oh=`-{ zol%^&1}E?CAI-p_e>ZftJ6u#>WIk_L&n5TY2ue$PB~@$u_J#{(P}Wivz|w`fh_>tW z9{Hw#FbifpdRrQr7HUE(d|#NGj2!yOcl&zNcOzB=4fFwI4+eSz%T>BdX5OH!(23Fi zT`#FN5fE75EWpK2RD9qd9muqS1%TfrT|nPAv{^=CeKW|!X$!MKjv=E4Gb#VQzYZ4l z{(vMcouUpMZM`TB|74Kx)#*Fl1Q&+bFk}AS{#MiQ)>BJOU%;$x;_wfts%~xR9}Ohg zB#HP=9Iw7Sc;$wzbdtt)rV+Q+jyv!>{Y-rA zY7zl(=U)f2LIqiDmm#vm1 zjK0dmnSL3v4nPdCTbhn;hJXgsoHg^cv8Z8qIzG#cZ-NLKq$QT@^jsDbL$Ld}xJQCU zf=WJ2ZljQ5kAVjKvMRaKln;NmDpB7*vid1P&ktmIjy3jek$9D!VFT>Nevk9*SQSnIvo{ZpF&#rLpVtAc}f#|YRJ<}b-}nWLb=TCh`Q z%773Ujk5G)*jj}8DmkB58@+xgm_A{qNYH~x18k2Lq6&7-cNpC_MxqF_kf&<|L-R;1T>rzk~yjK71-7$jI zRO_A6$$XK+AqT*&O-)vBTPaT7bSlEzaiI(@A|Ochg`G}C@rAwO27U#DzI0dI!w3Sd*ZUz92UdH^+lEHLPj zo7VS!Bd_dIE^m-3GG=dj!i-Jk_ z9#&PX3y15uhvSoip;))<0q9cGX!vjGj}bd{J0w3(4LzY5H2cn}O=ZYx1RkU6vNyw| zk$znLq@fJV3!c`J%ZE{M1^S=iOOB@7N zVlN&2XGJ3lAfcwT@>?Jlej_i`bKIRs%8{18O-o9a9nJlwJB> z!-21Uxe9Vq;ABT`w>LJoy@<$4;a`DeJB)D#aA5($oiH^pJQ0S*>ZI5WR(x((Iwe`?3f8VfAok#i6fke>`2fML*wN_YUj7l!VV-K?0RYrJ_I z+xTMg@BfdgbBd0Hi`H#y+qTuQopfy5wv&o&+fFCx*tXHJZFUD8-|GLIJMOqId96Iu z*tPds-#2FqZz2g02$9VK3RjAG7f>}-7B0*pGivUzxpnCBZpHL8v8FeHH`0-i5ki2PU@f1z=ue+U*&7TB14mB*Fn3>rs9KP zXiSSjF1r8vZBJlqNu!6yMUbga-Wg-8F!5$(UN?778t5v|NRV!ZprczUhXirv^xFTmscH@=w^IOA29JSp znt!x9g}dqoWd|GDG9*IM@y^!Hnh#BKo$9j!bMd0<*QI8duG%s)ft7G7SNc+Rw(SVt zVju>x*#e%fJt$MtvPH4WvV{!o*Q?yx)rmIVb3E8?F3n?^$_B1Aer#D|x>~rpD<3%v z_O>ELuFW6*xn3RQT-(OuuwX!#DoQY(Ba-P1?(e*~g1LbERLl!TP)brHFD2ct!YM(H zR{gNNN>Lrf&wE}dlOnvdk+zmO37|9@bURdeZA}zx2a+3PmCkmSoOrUAgAeNX2~zBWm=Y5N=MHhIPM&Vj z-J4c{)Stn7h}HlmLn)B$rw|mKvk09CX(fS5rx>M0zT)TxIQK`_);iiuoXDPESM(&i zEIy-$aqn-!AGWG1EWrTx0(_9f)xAFY3p&vV-qfjP?zDs@%EU&)@yttROzqt1X2oEn zY#rUyxR$rb~*y<`AAgEox#q=kKlP5S3ehF(XY`ldvkg_5TK)f@b&< z)N*JoRFW#n4M#v{>Jv!)N~b0y*ePh3gLpWF>4d9XU48&vDhTexzxuing#&3!0eCpy zNnwCxVz^UsfCx|q^+ciV|7D7wTx2&qI)4RqX?!ilM&opJFJ3zreW-myHo#Py|L^7l z#>15{Fa`E+CkLwc|B1DwXG3BBS;I=>&@FwW?c80YT?=I@qze(ThWasq8q6csQ8U`RfskdZ4X-Z&+<3kZwo(4+8SfiACvwMK& z80Z5K5|~eQHaV?BT7+h0>n7;SN3H=!M7(9d0J|Pj zive~QKXgNbK@>?6jm#&!n_Sr1U(CnLk_J&FZ5wA@9}P9t^*8JFb+OhaeJuIpV<9%2 zqR}mjcPG1NV_Aj!Edjd)27c@k<{12tWO{5pQTJ_mvh)E{pj}r9QT(#E!=0)Nam!n?2lfU02q}>ZKdlOL)hHp=B-eQr%BuNx7$}N7^WH z?S^vklD_B&L43IO24vIXXOWijD|nJ_GFdSwSq5jvF9rG zdByPHX*^G?oaCPMNWG1L!3ovT=25A$*{W{=34t4aB)-VO zy+E{X_r{~4&~^d`*Z4L!-HU0qU)&$(fv{-=@Cw916XY!3e!(BC{o)ZugNyZG=+#C7NxKl4C=6+7!!Q;a zC-F3v{#80lGe@iS3!}(8&xzwxG%K(g_VOa4s5$2|=ebQ-U5texF4|`3xN=MI6 z>*rBo8_1zlB;v$D>8OXN2qOv#2+u|Q0yrMbKZX;fK==Y_0T?=PhT4z(NIRs_RhSh*O$~V$Aj_m??QGTgk8FgN zrw~s)>?_3rSpj1ajc+fpfQRP*qxdv4q*VriPSio$4O@k9(fC75Hu%!>vGcErW^I;+ zPJUP}g!Q$4bj=c$ySe4B4sfjDelQVLs(#ROgzg$KrVv}0uuwp6OtEtrFxykd zSzA-*-c(()#nsy4%VYz?lG!F$R)&5e(M0!4j@f98VD`wqm%mMG%0~LEoNb{ zV5NmY6h)%AxzwVEZGJARzTG*v*y(NF+nf>`n_h*SY* zbGtZ7>-B4f?b@!snH|7_3<=xaV6I~xFdQUy8K&UsXjw$B8O&XZT{hcOl#urPGX`cP z>cMv2E_&sx6U5;fadjY~H@~am`4?6UGhP>F-=9(ZYu>vERf0Ex=akvWC8E5CQ46*b znWVz|U-%oV5GQ*^?qjkeKu4z850;b$9-T9GuP-O3gPUdvg737o?V;Jj zu_~@05~Y6NBYIApC{C$}Ih65ef7fn$SO$TM`t^8e)B4tywHP*>#`@H}0Rz$2p`_Xl z1UiCdnfhCz;aP^a-8skjcvQQ5@oaxHBF8tveYEPg-dhhKEa@~08Mtnu8nf#zbv!>@ zhSlqSwKxaAt^oionY8|VSaHx6g$Kp#u`yYpw-#V7Kn2_p!DEHf`|z;13{1)NHVI#H zihcV(naAKS0+G9o;jIHDaZhJyDgt%|eFZIhrb#mVvfy#E)SD^1?IZ-kQ57D=AEp|f zQed5DesrW_221WQMtq5@M@Cq1SPCLA{ONcE*Q^+K0QMfR>8_eP#i=G#y z(^sM;>(;x-9*z$OlV>8%mJF0Un_oF>V;VTe;TCob1z`Ig(v=KA*Tsx`4wm`h!>^bP zwr`2ZfT*17MBTa}T*Lrdzg^96=;N15AJ|ePtBqUnWW$U1%1fIA5Vnh+>O9n@pJH6v zT#hvQm{ppS{Peml67EsY4S52_Q;U;q0;;`dW}{gWI{J7UrLNR+r?pQDGbp;Ey~?1>ld~R2SrXRdfF;XNfZjUA-u;|~et|PFT$tgnXKNS) z)Wo}DYBH7taTFSq(BZ2zQW5T*vza`cU_251p4rD&!yB!w+K4Xus#xCCr{7@-n**Ii zxu&h{bX*2rI{l-yObJFTuJZR|-@#?Eawzwp3;98gL1_x0X|xH9k-|0ulPL+t^cB21 z0er#5HpK7=lq3ST^)OJdpZJifpgdZ4L+1S@CIS#?4f>TrP4#&r$HhI+I|UZjRb9j~ zyjQ#aF8~=3Im{8YMQ{*ekiQ`PbKw0aFxk$I;6`v#m<&SSK<1`+{W)MX?i|2#W=i_k zNzMama0rai2wA*{p?vrM7GS7=G;hBoaA5d;VF6u|ONJ952(o{=I;9bgTJ5a@LL)Tw zJ);ENnU_yyw57RMIoI0*MB}#Kp<$I|AO1T_!Fjm3{^K8jbFs5!EcAfUX3X_MzyJoM z&>~xXQ#PSM7fU(OI4Tce7^5kWIa*p_{}B*8f{VX))?>)dOB&O-t&D}NZaX|JJgf-v zB)EBV-}!Uio%$Q4NhzyhEhUrsPLO;o^w0uZ>#lx0D2q-YgNOjy0YP^DZm0fffGYFPRk`Z1AH z2pe?&tPlhFysGaScEYC&K2&Es5>Sp@0Tj{%G}0%zFNn! z>rVQk3keRmyc1@eZo*k7r7*Mxik+~9G#Zu+8S4Jxn#cofaL?rYV8bRS9#%{w&o60Q zG|{zlI7u*N(b$$dwO0USFpgz2*FbS`AA?f$-W<^_mFjSq+%gu~#Ct2_s6#bK;&ve% zOc!o9WJKE;91hD`T-Qh4Kzh>wU~bp?ffMXdd2lVs8i_B)scrXTXPJOTHpuH@WCRuZ zq%tkzjy|t@Ff>K8jiI~nLy3&G|I5xe=|=<)!hU&6V-cWHajIp${) z+NlM*t1uM%n69&8nP_GvRwdR?P&0=-3)yf5Rh4iUGqTu}rD)wwhbWhT+S7VbqQIRcSNoC{P}qDm)&lL1 zEEELq392A%EW>p5W1sJ}r*)QlS*_z@Ci4X|`c0Lq8;^k3qqR6g4IhZ{K%P0$JP^Tm z9n`f+QqKnV8q#{2EVkTHb`tC{kVfaOPK+}$W5S=m+OF27Vw zZTM3Zat>u`abA-PwP2Jp)+sYg7x2G1nF$~BGmnp z@e8Z&ND5ueSCdvp!4`)KQL}#wE7?5cvxsSEq2D)p`2H@hia|Sj=s%6`66^&DAEVyC zE3fY7XlIRc6>3}2huY+07bWz%nGi6%vBZJGqG$qmw!r@^Z*HRU)U8wkPn)cjO*19j zSk}q0eOhNRH@85-y=?7Skrj*I0jrMa#}D4_bo0e76ytgZh5s?9_Z6LPDPtiH8S)QqZ(O?6g;Yo~%QK2~zxK?bDBWET%nk`zw})_&CTPoocM)YZ0Oj~S z66a!D`&)J^v&$Tx`>9wb>mZCk=|hUFKTIE>)n(=I2!WB5`UGhewXya)e8KV3Y7T!c z);5@!1(j`N|Kx_+cbWuM1)Q^7(8QS=&J6kHIB>+*5Hh^=V@F4Pl+-71vOcaZqI-xksjp8H z6IZU|QK-Sc=Ye5Fzw;D?@C%3}^Bi+_N^$l07BG`ZGB4{T%aK_Y zVsB~_h;M!GM%!Ngeo;e2aJT;HQ`CE#L&+r*wPNm(El;lbtDn@y$;C!IrdQ^CF_}hX z;>wzcvVWdA4FLJJ9kl&FJ25&>2&4@ER!G7WCr@}#&VR24`iyZ4a6~}z9~lyuMC5kH zc`%U_F24V1p~|dqhiaKX!tfMz*qKt#vfb_l)fB z5r9mKGK_%wu~{BR3mRCPxSHtR@J!GG$P)^K%mQT1G6ic{HU%)3thfPon7TyunEhh~ zg`YHl5?U zXVm?;h9b74yNZMl!u5ZK4klxaSmMM>G4M31fO{ZkRusdHp7Ap% z5Y=>O4b{>l0&xrk3pSTLk^&W6Dp!UaD!wvl(hPiffrxda)GP(MI_lM;C$m>hE~cy% ztt1@Q2!}H`<_N&*%8+R5C5&Sp3V{YjO382Zo@CSr%}3dOwO=<1!6b4W7pG+eTW6fI zUurxTLPr=6j;-?UJmS|A!L(GW6u4iIDuehblgCj=Pl83kocKy1QlflSk4gcLk3_I; zhTTEN8)wp6$XFV0x4-8$*{hT^U?10 zx?(w}t)8e}sQgbbF&V7zV+PB^1=_~_Pvu@hXot3gz_2LuRWaS4;KS3k(;>tBu7{vT z%dx5X&}5kG0lCo0ZqwW#cC{8`@rd>xHx{?3`!N7Vf1#g`ob8V;LrGHD*tXLiy*v+t z1?Thd#&e&cdJF}CzaKt6pZC`zhB3#7kH^4_p;=kCUO?Zw@yk)S0`mTvEkhO7MCfsi zHPc%41})cEldXe%kS|BrlebPlTR?-tTAHK5*UQDn;|1HQBRM~{J9xyAS-_^kiX7b9KuP4r%AB#*Ffc18Kz;^Vz9H_C%z0$G=ePsL z*kf+lzHi=7tKgZfAl(UCTn9N_PA=IKMZ)VlP=WWGbo>HI>@efea(oIbWnl#G5BE8& z0~hA_(Nf%D`;u;IURdy?n?f{vcC@8T4idH2IF3UemrEXSUK&t>mK(kpDmU%8i8KT@ckk#7iiY&#g6?x)}h~)7L)My)^mi{&7 zyzi00$P{9Cemv`Jys3I{lD7Ep=|S$b4(Cp9$6TPG8`LH$bWA#A&<}^T77^~Dj9(HVb{I!zWjaRW$WB90vI=FhPE8d5!LXjY}eB@N68R6!h z5$oECNP#QP6Gl)!YxqdoJ^Hs zO`y%r)6Ub6VOLco9afrS#`|%r@0Uns&C^m`S|zY3LLqGQe9eUQ27~4n2IC|6YA*PC zu3f4Wj6Ok;ZAdmtp@1R9s+mcRn$0}_@>hl@E4rZy7|tHCdH?$`LJr_!&ss>kM+^e+ zSfqIV$tbD#vk-v_i3prqv7?MS%bBFsNuA!p=m>v(7k5gfd02?kA!owWV|U~9VJ8Fq zAC9S+nbh}aSudv&*VZYd8X(8CcrAy89i6qVergNUj-#JqCrca!Cs^I|$(IhP=Z~^LI?%Ri0P5fI5FQ`wz)A5`AH$8kk;HNN_LNGkQG_k_q7TNS`%8AIT`A5+T>28sr>{|GcGFVt5ptaW_DnTXc2Z4Z`N#+{l|5L+ z<&va}b#+j`Na*DpKCv-;+$eXH=%-Lqdp4%2ouq%GchzdnbZG1^Ku4e8tY%?7DChK$ zO~nq=T3H<&bCN2m3>qXFwVU$TS|wpX=B%=g0jxpC~3SY)_O3mp$``aBbnmS-G^eS{knJE zCGLpAkT1UGZpJ*fiMhX?@}c--fP^pxk`L+WJUzgD@=iIJvSKJ7@vQl#1tAqtKCB{~ zwLMu}T>^!-!>8Y;MLx)Jnb_5NVEg-wQwRKN-Y04^8e!rX5c=R_q3fw=4weP2nGA@x zt*wfW!NCTlbd!>`{^kg)snzy{K?eES@IBBUWWNIpvK~8!yiacJh3m7E!kaH9&lG&Y z``w8Sn%6V}UVHxrAASk`7?-yO^Ud75VU!56?!uX&MWOS8#hI_r#fken8(U5ZE0M3g z@ya6&Bf4)+0}sa;*kMe=ciOBJK#j^gWGlk=?PpB&m>+|-V!f{HV#%+|V*27T%H^Iz zQn}I0C~`!e#YA$%7gmm8i^8LcT8_{lWSm3fdIZ<=vD%d;ng;PQV@> zt{sM|m0t*i>Y7!MN>Kv~K^*lN9k2FqRBW_4AvMGDLV{(5Tb4bCrW?H2C5Vn4q-{o&O|r zLw?ci3AU3Bsf+TOEXkS5He!q_m{|YFy|WNf-k#bAOZ{{9j?}6QrND1fHu-Xp9b-e@ zWRN*uC0@`qf_4+Rtuqe-w^B;_j!ugu4_1LbqpUK!aqc{R-)3=K(9S+TXVT&x4O!}((RCHqa2gFDvBv{p$9q*QaNBI0N+dk0@7C3BO=}J#L zTb3DXSA%K2xE4zP2sl9pn}@+`;+5aaYz(`@!9eTEV;#b`?p$pY=e}zF`_^gF2E3iZ zQoEChI&f?pS2X{SkEYFVbq%f`{KB04~Vh+IRIdo*q+Kgy>L!)@zc9gRh)0G1=?Ps~6P-C*Y*=FLBUQq$Kk zu6^GYD3-{(g-u19g;^=wExJ#x6%kz|H{d-eBR6>Uyi5M}9elUqE?F88ORg8r01rd4 zP7jS_+hsYmdfWD__YFBT078R8ptxXFTu9ATF0e2H5a5FttICbn+Arh~60!sWZGWTA z;Z+&g0nyv4c3RVURzig3X8lHNtSVYyj#j9wUK@rrrD+pBKcwzCTc|T`%5|i*&9}Tw zQ1b>_!)FPlN?Y*bCiivSwF-(@p#HPV`C$tIs=OF+O4kxIJn=D9P+UV2~ zzivetK(iytiVTZT%1;HdBl|->5Tf<{5%P**{6a?BEy>cIaC20ar;Bi`s&)^{V2OU$ z@x@$_CvUy&P5ooGmA!DJeQGK7XjRHJjJo|83D=k)yp7XHZCGVV;si!KsoH55u+j;Od+y zX!-Bt1!MVNfAqQ&6axTv%Hfdn?xudP7VW3WOL}PjhCk<-F&As1Sf{YMwu0JP@@jGp zV)Uo4rL=4#rsbvGqFa|cQV}=7tZ%qjcGCC3@yiM1UlVQhW}+(Dc*f&yz|ZB7$B0rF zRi~S9lVl1$y<}MwS!gz7+sW*Y>*$b^DKiqa4zYeOO1ekIk5FbJ1~ zHHNEIiFGfY5Ucve@VRgj zHIe<^T8InDx*`_g5YZr%i=9!%kT@9U<^6X54~rMg`rX`aauoimQSQNgcVbkg_IrTO ztrH3d)P5LOMloC}`ij9u{ln7*$gIIf<5T#Ps#sk310KNY-Yf=DF4w*FI#~9vy;Y)^ z{5_BNlI6ZvDMD>22HAHhGiVpyOg=VRa{?(fdXbdPWRySK$skDODz=(v8aam8=7QA_ ztQu)I1;-uW>&e(~@jJy#akZe+3;9^Yn=_qG!?z--dg3}~5e{F6JNU?~Pvf~&#d=u^ z`%}f+4M%`+-b7WZW5VB_iloG90CS)886o-tuJ?kr*|ecqW?wI7NFH;DXmsaDQ}78~ zTKN<;o(69DWPPY-i%=IftXzHbCf*~4_Rp&PYigb~8T<99Bxwqzi%>@dEbU+Y=k?l3 zuk2}X7Vw6#@yb!o#j!yemgtVB$X3ig$hi@C3KxJ~v5DXV#QaS?=&4RRSGXP+F#Ocd z^zUsF@*I9tgaeielYdx@MZz%xTc4UCFRjV-1&TM{xDUWMWK{kpV&G9oy&R9VR$9!2 zw5(cFU#?M;kB~(W$iN_)ZlyP&q*~dg?p~~GL5GB|n!BG1H~j!|H*~vz1!gY24Q~2} z_EkVpzhspb@{&tn#2FbYT7K-VnN1)XJFTQ&9Xkpy-n=} z1$pke=)iXUNvu;`WK1DJkh||=365mFrwB+!ZB>L33YHW6Ti5t#ca<-IFKiXR867QH znX3gFHm5^Ns&%9!MFYr{{q3P&-%YyNXhlSJ=a3e36-MHzZqej{omlN3_T*y!-pD;B zqikT%;yB+}AdO1_^H?^Oeu|InWs99|FMa!A(@TaY-ebkO!QO7;a=b^b%r;yz=;G!5i==%wV?NY(-{lbNzaA{WRZWUR3y@jI~r)6uk_| zUZK#|?PDQhx9Bg_-&rG$e^VWFg7j^&*%h zS^s53*=H4JJEhNO#7UX;R?_?rX4xx}J9l);2*IqgAlX&H=|m+VzN@kUp`h=_?#p$T z670FJt@KX*lUqWH25FvsCMS<*I&d&g+ieZ^%(FT{Wk{a`-nVmOvP!cfD>2$QxM@29 zywtK{gv}%C`!<|d*UWlvi@5*yUi+Wjn3engYj3b-I7Y3hdTw4*X%*U=6aw2D(eh(p zX0$D-5HS*8Z%D++lp~VY&C(k`{7}A8d}B^#FOa1AC++fh*tC0?BIcLGv;CLC1_DJc zwF;$&wXEVT;N5sW{n>%_ZQ7cNREhh)%WuDc9C`<~l+;mlH27(%0t?F$uBL@kR7e2q zzhsLMm6JFbhhYMf5NdPaC%ZVyDr=`_(~5K@&IW>htYGZ_gCI6xO5o#o&3pGwA<_Rc zogB$~*`H`1OiNcckLP9E^Qc%YIfgXri;&rWzpHzC0lp0Z6~~FdFvpnfRLm$NtFRZ~pWiSJCP6!b;39e~x8wxl zNmuSiM(EF!4$H-Jp50F0Y7VNU)|DS?om*j{kse}T3@j%quZd2szG-ED3@9S))T)>j zEGjB$nbRlf4<1}x`2<+7^%W>n4$Up#9Eez#IEZ=HDJ@Y$h(i4A7{0-7C9!UaG1YI=qjTtaa zj>R@E@wVYXHPeGAW=L0W*QJax89e?Q0Cti_-RlW3I9e_rpS-@>N)2++5z(z(Y@8#X zskeo?%pv3Q4(ppSHX^Fv4mSs|nUO$3s8&Opv5ok_*u{z@fZ{%^Um~l~{n(CoTqfSxmahaba@#G2@o{OljBv*}fI0)akDh zcZ?}(11{z1=B(b&KM!erd{a~WwXTMVT1Hs@xjlK^S@MGNz}g5Pl59pevp?G^m67_C z7&cq%Ll=k;M|eH(VN6njs-yG~^5!BP0LHCxfN|@sCk>3+qJ7EZb^8FVT43C|#dCj^ zpI-G;asy*|GOMFjDjFiLUS!i=z7RdvPG9XG?qCtYRjfAW3>|3eYmr3RwO0e$`h4g9 z(GE2AMP*C?l2wS|^K=|a(~y?Bm;~mVGia9(0S;c8RSk)<)IH)hqHPAInrT7fbxN&p zU3iNz_c*oP%(t}=)fiYXgY8v8yrR<5gnLlWl!uG_V!2U+kFBf<}SpOo9+$28^a zQbT{{bzrkq@>~uP)kgV{I9zMZ-u*|c5* zS<7O%`gOO3P_M;*wAgqUHD)|(g1V{Naue~sBZ1yA$fp z?ah1P!h#hS372d1)@&`k_-)xiGe>XiE{_0QRDDo9j=eWZ*ETHT0y%Q;`gs*XhM6U_ zU%O%o+Z)6ES^+z)Rc%F?ry>^4>oz@eODn}DY3ft9Ea%13x@j{e6#IB~MA8Fq@+90- zw4934iWDI=%FsS8h1AeKzxf};+1gouD+G}71jhJa_^^pG*6AU^RJu1R)MHC%5IX`u zhi*_frwDPbsE=e|VAK&*MUWAWSaD&{g}u;wz`&d63=t!DcV5-%gMqnL@))Y zKLIDXNx908>`f@77IBv}&Wal97(4_N`+&`ZRha}{NG&gd>3B&7bgPEnz;=JuSJ)d0 z1SkM-@U5`U<4PcWxdl zwBU*ea>&OH*||qthBYo8m22{GGA8z0BGm|_Uh*4d&Xc*0To20N_)c5_zSBHj@ z><%w$%(;x0=K4-W)aM$XT*AO&zP}ze|2!$xb$#}xV1V-Yb8PrJycF;)iDJl8sGhOQ zE}Nst1p81^dU?dqdu7Sg&cVmR^Npze+h?x? z+*%CsXZP_+f;z-dYNH_j9*qWBhb135DJU7C!<$HQoc%lYH?N}2|ISiy7B=>b{R;>T zV7htX9LVpv&f0eU#f{Rx`$zL^A&XQrnQ}ef7wiVkJf4Tf+zW(gNz0o5aE;VMXYb_m zc{9yy?8T@q%mCS8F+zv9W_wv@@so_*MFz*4*T+xL#|y23q9h9|J9jP;Bio{iB1*1m z+QcP4#d9HL*{hgrv-vPedhu*w>KAmco5goqyi0mOv@G2y@oYgt03WeGf%DIP80shx z^JFRp(qAKI+t89ORsaQ@xTaJ+zADHh-Y`oUg9L*(t-Csa3eqeqom*@P2Q`p}ZOgwo z9pRcyOX(zPmCrtTFgzFbi=$+#QT+SQN=CaT z`;$??h35_|IeL+iXjZ|%;iAS%x8e>Z7hJYq zFCcBMyEZm57?3_7#Dtp}tH1AN=d36_fXLs6S~zRb)W=9D&5IbZQf9Cm(>Bbv7 zhnv6F7%S^;x35FDj=^G(&nzvE9%YI9UTHHgu5?M<>A_rYZ@K2hKxmK$H zz@xq8We=;-9%p~Aq^08?o1sT1oRXtKtFmhSjP(#(7e%6eW`V`1^BUYr6dF?PX@19xR4hwLSjszS$7ykq(^Z;XORoK(zyhv0L4G@=`w3ggls+tRE=*$Q9;Pa&q9+x@DmG=V z|E82kFtzOS9PYLaE;qty9G+D|3m-)0>W6P$frisKQt}j|nyDZL-D}+dV8>?k)**3V;cvaUEzXO83Ue9jIoP)q6Ea`rn=;dPX&Cu#xSP>V#UJwLyY#prt-P_# zYz}%U8Th&DW9#_l3!~RD0Xv7uXbb*X^y81AjCn3s*xmEzmp0Rsc)e_&l?@xq)EVY6 zFc}YB&cc2y%x}=3r*0tR22HTrxUn!P+8gy0ls<7loUNpa~P0hI$)JIZEqLNjI#A3#$c6aL&bqdXt>(` zHnNOA3n@d24=xg_-rFyV$#q{Swv)1Q0aqPCx^zdtdv_Z-i1|1_leL;|_${p|)wwaR z?o(RhTS{Lv!20Oki55w9uycM>5FXbMqeUD!w&P*oCPbt=48UVc&kgQ=7A*?&guvyowoH7o0DCG3O# z@-Eb&r(wIkS9XxM{a$MKLvi6olj>LxL2wIf9(1=SKW9s|19^K`3b;Tr9vij(3W=!k zS{>^HC4L=q{@+V9`+uHOa8^#v3}+Y!h79IiFlfMh3FH#NZR*d8I(=aOI-3eAy68HD zY^nid-G!0In)RyhmLNHqk`ghQ`+Lqn01It2zi0lf5*i{C7#=}FKu&xB51KMcik2&( z+-cBJ_HYtHY;0t#1WO(y@mM|QzIa?yH4^of_+bV$5D2tmtzjmU)&Va;vA=(MzPWJw zYXOjf3Xa5K6tpiahbAVU$RtH9^vek9&=Fi#oB&eOV}&h|H@FpMR`OPA>AMsxcoEIM z&Ys;&FydA_rmLfuE0C4xNy|$*QCTA?l2H zAtE)INu|XdWnc%ZEO}K9XS-ZRkW)6kNGd?Zqdkybg4@&z!MeF`ATlx76G}YM!;#*^ zM@~H!_Kr zNtko!j5Gef*{V>lC%2P{u-DBDWfa75drQV|PaWTH;IjtT_Q#0V%-zeK25GS#z%rkc1Gld#d^FO;x1PCzcKzLaNoeynW1&bg%XAUzin_~p{n zjlTW(c-w)$HMs%8!P3OVbe?$uhGy<_nc(09t&6O-R9~-3GoSbHw{VEydYLScAQ44m zWN1MS8rjdAb~%V)8F}U$nNF}2{%3O7k>1hqQ!@;k?G8QT^s7^vq^c+eEnVG{F@uks z>u?of2_)>LaNg8dL>9Z(k>5&ljas{yS_AGFBKr09yFpEgln(3Pv>`$PD6!&-ktxw) z_~+mXL{7g0Q-q+XF(VX8d*M@MgTmyt|1y+);oHVesQ*)*1R_CY2g-=g#5C7 z`Jf(Afu+@orVd_&HWo&YEk!>t8Io1)gMhs_wF5(kP^<$X)z9Oeky4kv~=}O1pE1 zp(+Kt&Ua@^eo8&Bz7=uXTzlUH&?GAmweaT;wuaDUeh$EHzBZlcz35KNJ zpHKzn1Wz~9s|$H2J-A3M6kd>Fes3iK!mZGDdRG##STI*G@aOtW35DN6q`#=~_@|UF zDr@WHD=dC@8NtfVq!OQ+=lwb6vxJfBDau z^NCjHDr3x+w)@|wV>J6*3?7VtPt^EtQMGT~LXHSAO!WACV-nu^B+4cHuxENX?gu>$ zp}&9L!*DgCju-BV1(|$%Uh-1!(T4s-KaAVx>(YR_$4=WC*ycp6tx50`!XuYsvwm1LUYEbs=mpgBTZ zhIF&0z$TpW*$kWy&>@T0ZZ2&`Qx@dbGKfBAtZk;GU3sb>W@RC7F4^Xm$u!M}VuQM` zYqG)A)s_#`0-W-`S>Z%hy}6=i=I)kIPyGFR#|2(MVy)it#T;WCek;!Ig0A*&S@rhd z_RjoG?nin@)v7B8Ine zw)SSN0F5E$pb!-%!2pmEJ=^F!EB&`sNixjjwNg1PPwb;#OfjeP>%IMAFlL_uC(~gl zHjV}c;U{i>YdsqI`>1JWm`rv_CsgUzx#v(?-o$HtrC^9=ga5K?5WKu8;2O|033k5_ zQ^=`d7*j^fAQ6F+h~|2F$=%x%1I(*($mhCXYOKuZl=RpgQV{@Yq*A)cU3jq2X(mWaC9_nj z{L~6C=rb`NhIETn(QRY@R1xr)I+SiZ{CU;|{KzamEuxbL%TQ*7APm;UGyOoa%HXRK zk+6!UhtYQS;S@c2r8}!E@iQrphCk%f!S01W?%XhT1!o zin8g`H)n{dzkySl50P>}v2LRYRK)A_!ZUKr7HAmmz5Z$bc%ua%B3AkS2*41)qOh=1 zgaRDME;z6pj*4w%e$xr*$yL@30Z%Cv3F)cP%t8PX3HR|a^?;`ns@IB@ufn6IMr9!! znblWeH^=MX+wMu*I=G@IXxFtYbBar#2sZIhZc4ZA1qbbtic&s>&%=5_0nEhgw*tV; z`oFlk0_J|At;JsG2OG{Kz8h3DANYrqF28LfTa;tc;<)%I+O9DIhB7#sz6cnvoKthA zYU%@({O9*{G)PUe2ni<+n0o>7e`A-cdtV=g-w}hv{-V*JIlLeDg*4SuD_nq+1#N{% z#cD>tqsT*|OML$$58-q`1GgxZlSn{+#)CA@%LZYDC&|f0bI#b5*ZYYL}M-!GRrC zc6Bedx83_ob9dBi7k2%V(~(}LzOIMqsfYQkdc@d%aYX&Vei_!orjK^JC-B+&i8r%g zi}b)HepBr4F|-;#OQo;E)KtpSxru5^mO}L!ll9T%@bc?@aaYyzef8zkN7h6(Bl8B3 zk*PKL&h`EFHRb6R{RCV73^67!GJL028pEo(WF{-HAgaW!Tkw3)i||00agzb^^{Q`K zxR|&a3p>uo`IaCuxK}{3Jv82z?6;8=Q59$1i9BA4#*>dbk*L7B*$g?fssY351=!_S zBhnW~!T2K%MW-k}|6Po~Z$*B*+T#L1u&+@urHCb1B@Zi{fUi#x8*J2mbB@+hk0Yb2 zX^)E07imdHUF~T}-gHaC^rw9Et4+hw3*pYO%$g%=`Ef$7YDOaA7jVU-M1YciYEf|AD&nI@vg6%x|=MHx!cTBC-bG5&(M>CD;cs&Y8dbj%hbr*2Ho}= z@-hx`D>ybLN7>SoOeyFu{Sn)waF>v%12wd>U=GsrZs1r*cgDcJ3=we53m};!q`DT{ zEsu`YEf-zNG=|KazCSeos{0!a#FErshOiUni^6ijqdmbVxrIr+1^WVNjFtgYwl%H@ z`>)iz<&P!F=y-rj3M2(%TqM!ck>$2Wu#g9>PY&o$GdX8Ek+nGJML>Af)QMTZ+1QsoGc1)P~VXu)4n2vr3KzxN{ ztGCP{u`NVC8^%qFI;%1F1$OLyv*y>M0P41{*iUmqm00EKBE&C1R6^?^)M1^F zW<caoF;-HUN>{0FF}yre-e z05!DjR=F^I9;>(Vq5BD>;u8O0Lbn!7C|ir4;+={wz$6# z@w(1{i$nCcXY)@z(R{asBR>qdqz0{?(DLHA;geq_>n`f@lpuf)Zv41PrOt^Jv^Pt3+D_KRY$VIb z2cYRFxN@YHvkei3^vvwsXOX2G^wO|+nchzMMIfw~r}v;e3Uv1V%UI(lfQk}v+n%5- zh1w4UO-J;V9q9n`YFABn@t0g+kyg*W*6fZ$2ohqZORK9WwjFXE7r1{g6dc)u=JFwZG$qL)GYxG%~>5A}~3^*1DDXdH=|5KKpFBz2QMgzO|NO9-*ibgSxE<$6#efV1$)4nDb+hIQ3 zK^F^Qv8{FDa5nt;N^s4AG;l?|pDOjz_$g5Ccg+Yo*HcUlpj8hz+%-UjRwFgu1;Ld@ zpylCx^EgyEzxc7Vi_hMOjGS##GHuwoczpOaoAK??;jbJNih*zVhQ%+%v59~uNU}M- zjNRAk^IX_pIkS)m%b_wzX8w*?;_h*sliCE1+Dw;zNK|srQ_AZ8ZD77cK~G?vl8otf z__JR*G?)!h0`4||6El{m_FV1w8T)h1)s%$|Y_3^_zkKWT+WN#uDtF$=#|dhpVCgsN zez0T=lOr18T2Y$=XYj-%*8f2!gkptvp(j2lu$2f`_O>SlJckhz(TKikbZq&#$^W$_)U=sBHWyaQSN_;Jpeq)Y5a@_l> zjo14abrA~-a>mOA|%K_{~+ETvZNz9GaNZf1U)OjG5!K4eJQ zGvo=x-*_rihaYvPE}u0hFm=rSgUE_!$+{23y|@V6a3rQr$+8-k7J(;>|c z1ev2X;5JB#iW{rgM+zEtEs9{dVblE?=P~v}mDglJ0u%&@0!g)t;b^NNCYLYQ8fOvR z7ekbQ)~`?PT3|UXFJx5wz{n3!BKyn=8;&tjV#q;~# zgr8m3%34w3J>h5gd1z$yuR_A#VpJeBC?rw<3O{S0N7W4+oso;G-~c1w4yZ)AG3Oxw zN!^?h#Gpmd{|!I$gTl}7RPU^Atz*d4ppZ!O0~Nsvg91JK%)OW950K+i(opdO59IiS zNHYLAKL1lrO|U4Gu%mm6iCATF`McHWach%YFfM|OALZKwKo2x_=`8j@HADZ;kO-1} zVnZ?I0*uf6jhUh`X%d%qGzY*$J8VJ`h9N^<55fBTa5CX?_*hP#UpmL#yBOVA9k$&j zv`37=Eza>nTwA-XYvAVE#paqjKTCzEJJuRy4cM;6J~OTv9&jFVLx18AD5CtSoZ4;J z|CW%9a|Cn)g+z8D;l?t>A6y2!CzYJwU({tYQv&V#*VvCEGi}!e)nL$1swOM?TiW3P z>7bCvn!$MC9qG1*({IpGNHNV+HU~@^pOnyzG&s2f!2zwyf0~Ee&x6f{yz3oCxh1a$6v0Nlfxf>4@ zFF~vf>+(c=BhiJM4`uk!egkm_@Cc7`&K(TgMKEHi7#8E`nZA}2MfPb-){zM~@p_so zb#^fp4rHK)Qpq?*tjMqGu`85e3-!*rO%-;Dn0A};)z!BxSuo+Ia=gsmR_^a@6TQ!x zKrIw3cSPiWXgp9ww>xYo5LKdw0W57!a`~fnff1^>D!7$RGT!BCJ%c*mf&Bzp%VxUe z9;gTgc##?ms|*K0r#f~El<%$DP|^Ds)HSn2NFkEoxf$u;A&5LC-J}Wu;sw*w&4i(n z0PTFAb`L|5y@Dj`P9++#u+slfTi1C6>elvV4?~!s$a&&CM6e-Sai#}ma}auH%wl)!#IgM?ftmKt zj?>?$Bj#{TXq;ZV#t4S8*U4LTD-TpwOP$xi4PN=`V+TB0dY|?ljD{MUYa}D&5*8XF zf9o@ue>Z|4^&Z|AXCiidO4xJ!1r>zabl@nDLp9o-spIq7f?k*5_BN3Wk7!Vu`{Syn z5CW9_xRZu{tU#50@1UxoJ&!i}06y%0RXM7zYcfXmo4TVE-I%xW54`oG_6<>%`8w@f=wWZzumF_7bQ1MNp^I9 z^ki~3gvw3R6J`W2XC}!Kgiaod1rrgNKZ21JqhFDy5pAO?!8&X9x;S#pzRBMZBu9S= z3kuTZ#UwQ41Jyqd$^Y*e`E>LOIwNzszCqpg=VX}8697ze7^jzy)tvNJh_=@#)Fh^bh}Q{M(2LOYk)YQj`^)M8pFo zf!-X{cv7~#_ab9(;OTO#jqd>P;=Kdbovs*B_tfU$Q42KRjxS_@$||YR6=Wlf80XZM zPJQgKkzOI`9Kz+UCS@`(EuDrfvr;0Ens{tMO&?1zqN_zB1c4&>V50`#c;mx*5VhbS z?f^ZYU^7{$J{OLeQ@^*41<3q|)Z!ZlMKl)_K20b4nS2q17(P;vsX+h70bJ$J8x*6< zs^C>dPp+hNEkM+84amb>QW{Pt)QlK2=r-g$UU&)SNH*>2@Mgb57QLdF8Hlse`-Qq) z-TAS>4GO;G2q0X5f-epg*C~kXSzTKGkLuiv0r`E3hLogF74Ay2=#Y??S)KZssD>F% z!``~rv7hP^!-%lk_%F6V)<;<`nqsS8Lm=;x*lAUcKk~o!k<@fsGudwxMK1Vj4oXN2RBj0CGaD`1? z1XE$(-q$^Mz2(if-oF~qIhQ{bR)*NAY|1tV(&e7-2zQ0}T&2PT=ff&GD}8#dKfLe1 zoL?^}xwQuw$!Dcf#onfh)W$AR^p<~f5aWhEV;nw~3XP~Q6y!^{K5WF-!;y?&5UI!u zKy!BkvXaZi&t1p{D(OX#*0QP}6PY6i*H1oyIPmJ{Lm1h12RnhJUH6t@cEplN)bdb> zn`Q(6ET*ZRH}LtVZiJYg*zurX^~cLQu5A6O&BXH8Y&14tD`djJSi2UMrP-mY(j|B! zWHp%A;r=}t$pMGR7MmTdubQCi#nn?olhXo$2385TJ3=-ygel&SjOT6D<0j5g{tBeF zu0XQ%eWOw-{ zS?Sp^>ZGwlWC$gaz!m&M+&Es*4=$0?-d6Xn@_*mWj`s2@PSviMkrhhfQ^mI(e5qmG z9DS*Up?){hmqaZA6lhW><}X9!H&*APu@B7$sFb$@XCS$j-!cxavXyDKI@%tI3$;HU zFc4K%J^-}gNs?SX`Cr9)*SQFP7AT`MJQMGUy3+jbVVgk+<25LhjWm?x90XMhB>nbUNvdm^F>_730iQRmj%_TO` zl+c`C`J2@F+|;tUP}FSk7Hr=H;(3$^26PO6vv7=nM!)K z{b~+sfZE9?PZd*yl8DE(ky3(0XbLR;wQtxC@;FE6!Y3G22`}95?bAG!3zZMX3; zHjP>4H++cTx(QRiT`1uD*?9-cpw2Llrgp(-d8Ob(9-{0+LY>o+%f%{n`8>_qS|R0f8`Nq)QENI-JcDmN-Wnz{$T@DQyW%1l%K7h; zhRA+qvdfCl5-J8)ZCr5V_FvQ*M?0I%zDAU*%?`UYQ%{(G^g-x!ZQaZ+{3dx54BHr^ zfv%%=*4A(XJrT$IAv^?VXIY;D_#Sy**Nx*^z9dcJUKe zqE>L)>g2)!;wURAg-9d*HR*QiJzgSjSA z^tQI#kMdMe{hjQxzphge&ZhtDoIVFBEBn*30rP~)fKc)Q@QcL#-(X~|!Aw`j@t`vE z+x%uAz$WrdMJEwU!Z6RGqmvjvtGcdg`RrG{=kH=tSl_jK0hibwN3}M@w}rmqB8c{D zhDzYd%$_~^Aeozk4ZZ4|(?PD4pmSwN)%|gsniB-C>SJT&kF?)0!Y->GN{jpXE|oP7 z@xR_?u9L_Me@`Q&@sll1Oi0b%KCs)E>NZjSc4ux=pvM<M zRIQNZl3B2G5Oxrw7K0oNiJy(FYV_gKscv7}1znNJKM9K^g6$>+@F4QUeX~-#I-@v~ zTe;56i$8i=N!n@M-<_Afa2P@q37(==03lgDiSfJI#lv;r0KU6wGsQF=P8%?{dJZc%+P>5z^t7 zglxCK7PA!zCzVBaV` zKDlFLa1-ZZN@U}I^{axc{bFS-LiPo5+ODxjQnWR90Tq}>w0qsr1pS39TQ%wb?&ZYK zMrJmQZK^AGa(f=&c1kswFQrx@1^LaEp&nL@c#PeVf z_+fa}9r2xzmBpfBwjqKyaMcX)Mn}bKlK-aKe#ywFf+A3J9G^;X^t@*c9n)AWms3Ge z6xQ0-_?P5Mtu|_yB|f_A%eO`;*jy40)WSFOpa&Y=pxPf%RBEhkjS_whN48|7-HhR6 zFV?(Y7EKN@;F;uset?zNTjrKSXtB&ZV29hTQ-s3Fo3 zx-Y&0I)gqe{PDgC*TueldLi`b<5gpO-R89)0rpj6Wigy{0Nzoj;qvqH)?9xvy9-+(uEQEY`ECz zTT(Pq=wyyol6V9%UXu8K{*sfSlH=%+mj5Wo{A3}CLzi1nN2sb5pe0R0DIa}JQk^zv zV3cBiZF%beS%v|uaM1aV_Q#|!%g29yS0ymeL%>@Y+Qy10!xmXPVu~zO+6Zq_Pkp1S z`g!Ao&20TxTH0UXyo^LLpW$)aFx` zWF5q)bVu7k$2&Wjl$>WZTeKtJc%sDZ?|TriwdA zZ!4by%_6xMlh=an@4e%HkX_4afGS*OsB5KXvRyTL)>qDhxKVog!AYIV6%p--Tv|gy zIK)UmxAu*@KfEKYlI*v3lY++(-yO*M=zn^3lMLE;ZPjAV7fEKcf5c~st}+F5w}pEv z6J$mQ=s;!j4DgxkAS7Ux%5=^ZiVJU6aM7Z1SO?_liW?x0Rx)xG*5(mNRk9?kU=e)k z`;EL&`xWq=>oIpaVT?gTyu6Ocr@o(228deD@~Q8?haxb21L^yrglyfZBWq*n+{6 zl;&5#hcHrcNsBFwtkJhn@~#GZ7NLQvMH-=ctni&e#q?Lrib7U=&DO@IMuMUZcRMnmgWpJYz$AJT`3; zl2CWYEP#39SuLe2#I);VRwEg_Y$Kj#?fk~JN-JZ+Qc(ntn=jfxc#dxkqkfjn-6av^&VYXuX)pmUc6#`?UBzsr;Ah&Ix) ziv0ruwlSnNM8PkEuk;o43H^3%9~SQ>vJ`(~&yR8xA;WcYxir(2R-K*;0#Y|T1?y6n zOe~ktd{wU~b>f?eU(SQTBCE=05~D8F?jN|iB@$47T?{^`B2;>Dgot6wVLtBkzy%Q~ z>8i>Vn!;ZYl?gckMI^S*PQV9Ig-WYLA8W9Z2-NGSBOphO=xTU?ag38d^{_(>dKm2|w<`I*t z9NAl$z>61s3GDlDmjq{VyxJ6SeYX?`OUMDwr0c? z0**x*!H!WHnz&vt`>~-5Rv@XBrX`myAt99N#^8#L@Z|+yvX{LD{4V_#UKM!#Qoj`|97@eyaH)9a80X}GfoL&%3nubPd@b#^q4HqN|*Pg zkX*iT+M)P*XIfyI&O9-wHlug9H!;nnY91NV#14#{om4d2@n)*bvcz9IHO)x0e$+~R zbc|NL$853r1oP*4YdUZ=2@&}XGT7H5A!V_Ob2h5z2t0jN{$^;C8@7L z()P>=k5DEmci-5kxyqOpD4bXMkxP|Fxv&*ge%MFz>kY`E+JR@{xA%3_f<#8@G)O7GQayR)(!_8DA{6aA^Z~O-NOUrAay(id@yAxT8Fola z>?|J;FX02?B|3BeabGGuVnt^s8YUKe-JYh!{iAc%2NaA@9_10Z#)PV7J$TrPdAizC zx0L)gyq*T?A;GkNK#K9l0Uc!7oO~9?ydYfS#1e(v6ON_$Ws#1bc{}!;GKKs{0yjJ5 zk1Nf94*`!YZ!#fx+K`l>WjP~rZ<}-nvhxtQ!2HCfUSV%c*j)A#*@cfvpwJD_TW=@b zVW~hG2;wCGat1#aGU{n5OpuP9UihZc=TY0)h7hAt9jstij2f)32Ob%1dYhhg-))u) zC{tRsxQYm(*p}~qkh~+A3c@3nlnBA`917w%q&FNEkDt=fZz^7L;hW&pEWQRzHMuJ_ z&%~MqcRwTt&0uUyF;sIlpIc2LBTm&#*;d$wfAYh`*=Dn5T1ZW(8)>K-hT?fh4?r)V0Xp39WIAA9?gn@FVnoOalF)|Xns?OTKl@wc$& zug*VuG9ogwGX@3GT|LSl3-b$OW<`J9mH6GgRW+3Z9)y~g!P88$6tA{a&xeG>kVosN z=kaooStCYzl5m&>Z@d8sHK5A^*E@ zEaW~ov$id!*(O9vxS&Rk`L|Tw1wPi6qWZt1JWq-e1Zb4!;!I%;gP}`d+yqsD{J+q| z%Kt(Wv;PB4*nC10S7e&XGbGXVe{j!W6Y_?g4xf-IQJur!_z2&)2;UrgjT5)NvIZ47 zQKa@tF~nlAVgV#(ai3XyYQv};t;_h*SqNjYyS(qmA17rEXGZ@afF8pC79XE}A`>86 z0y2~mumJbVe-GjNM}5@(W-RY`sN)GZ-VXK2pSA>uteA}`$=GNEcrny*jHXXpLbHR- z6{zcpL0y_>?r1gBrsiH{SQ8N=P&t$kNLwnkY`;9R&x<0 z8?nFj)ew^MJDLnJ1t5UBm-sii`z@2-F7Gq)f5G`v$8kklJFR>VMEQh|36T-4zWj!E z`m88EIHT;#TF{&DZBqBth7k{u0lkEuH{^fYMaFNwS~v!-4A7w_YyMZh^gqNzss?DR zrgl;&;C5_efBXunT3^*_FtTz?LE|_t28Dt^x`f1<4L#5s%rMl7S<=DO^;wkjUQi%8 z|6GeBudmw*FtJ{}{J!zMJ`;D!5M}hJ?<*UxkjeR`Cv$s53oK0GR|9BE!6Prrli#ec zFhGBsLbMgx_xsNDH*~BGOgxxomRvNj$zb>x2gFuh%MF`}1;iliEK?}CRIqqb=OTm% z_xQ-MiE(SMCcV9+%l-0DX}IbYeV>tt-bXGo(_(QHZL?&$y{tgkRPTE7h1eVamW$S< z;GSCoh+i&G@S)#yqPvL9P`~)A5D1gWO9NqSDx!JZ`$x#--*GY%5&3FgnG~gwm$d}p zgJ21s89-D{L2o8EKe5Jiq^ z5Fc+!h%D`;M0kLRiK&_1A4uaF;G?_6!Cn8s!Tp=$??l&+LtE7(1Wtop5ncX33Lcm# z0XDFy2sUpPI5qn}eg+6MSDgvYKsCgL)FX13kH?{N^oY!TDt7Y=5k&K4ZeqZpC&|rN zyEL+h^H3grx^34wCn^$gsDkF7h+ zVVetPBE#_@N2>hN5Sn3y5`EChKvcy`>keo$K%^k5!v+(dls%s;qW(}RLc+C~I7YHg zM`M^inbNKYWyiL2)76+uWwhVHOW?fmqg9&~J!53Yo zgkZ|`mG2p29#u_h0@{6RRMmF77x4HgAoI~`8s}M#yxFOviC_E;IY{3va94Kcq;qQu zzYkQQJTPggq*st!lI#cNTs7f=-~KdetHEa%qny$uSF@-&Rr8>sq1r%gLY+n$&pVrT*;= zM|dUR+^X554M5+kmBSVj=q=@z%1WJX1o6pCB+$T&9{W*2P{1r{=3bE zt3XMPD6}ho&JZUMGob)J@#B-3z(a#1AHN1M6Ni&>45=IMre^1p(zZO+$g{HGpUlJ) znQn&4u-KN{l7cTieSORP79#xy-r)B|!#2R=wA5O{!Jdgn2AIEbYq?Ghclg97Gx1L6 z^0%xC#7u0uc00t*g}ueg-WT`~1EnMl)tQ*ewAsP?e$-ciXDMnwR;JzCotr9@=S142 z3mBj(Czu@)nR)i+ev$V0DGOl)(1163d@xlQ@U(-D{S z%ljGIh~@`zI+jIP%G2Wn6fbswq^pP!*)#uO>m4zKL=1mNlJ?3lN<~h%UO#OY@SiKPEvbwU04R4xRZhOuafhE<@OZlj3k_rgSJ^) zrf4ZSJuUnJN+TBz#*!yY+>z4aI*A4fs1+Uz_R>23!KPa@;(c>iu{nklSJ632H4L#i zO42d25CT@QH8`n53<2{&YYpP-d6cgAe$x>~> ztFu+P(>1^|A$ks3LA{`0&M642Vl~-viZ+#_V_CGL*7H7#! zkO(Vq!iqt|-Pei3UV@k1d*`%h1|RoRnj~Vr876|ID9}$h&4bf`ZcPQCDZ>EpzB8FF zvGYIy9>T2*s3dg*a+G4VB&SQx>Tx-KjtIfpPj~@cwt0%~-3+Bey^*%kS;}D3g68U{ zG|W*8Ae4jlmdz{byE|p3=d1i&u*T|qp^$Dp{0?K&)f19PetVCDuhU(CFDRr}WA6Cx zSq%`WohbEU%Lz&|S9P|Aj^V>SZEfhxyI3(-*)Gr8=&7r66PZlY5y6xvwy>v8Fc(qKg-gg<BZ@%0R zOdy>L1hTjsJFTg4j)2y6Nyu{v&Mn;z+L{e z>io58^0n%hwe0*60c7(Q$*@B|BebX!u-KkAHn9F4&Ydkjl!79SV{l?xb?dr-#LiWP zk9qf@;|9pYDt*yoKIvmVv13n?daQXjuuw?wLOzrqh6PkpkcBv|==fl0t_f@gs44Vk zRBT{@0}PN>p{Gv$s+Y|!4+Fp?Q|G2S1|+rQk*v`=0S!(5?iV^M6lZ4U^X)&+lU0!2 zdl|i8iv4z0?nJ`|eDUBUoDmHxU|;x?<{lJJ3JFV6Zrty0j;riE>Q6HWofeD5Py>6G za$a`{@(;r||D}J8Jsx+>NFcB~?79xLA3^`HcG(5^sVmZFAC43WoLB%u=Hrl8p>fy# z^kvl}{0JO?tbg_^MxBBbT~$K)9roy}qfCJZZsb`Sa%_Yx*=+xeJs;A1i`}_uM+xK= z#>T7oO}OPfUk}SR@>e)~65_J*w_xVhmFrb(Q%pWylrz!rmP4|8<}Vxi2NB7plXbF^ z*Zl(R#sY0?`ov1bCb2dk>dAwi+O1knrDF8Rva$me`P#Hrg~?lR(TF{hLT&6MOX2c0 zO&i%G<0F6i$91gI{LaTA4ij8bXD&JAP@=s#G^d$PCHw9qaSd_54jj^EI>uvKz#4acEa{_L?M*_ znz;XuQ3-|`WK>mlsMP4f5u7?mbKMkRwSt;1_7;Y>BqP{Y@J zHDh)=*A}N%Pxff$dM_E5^UnTrl>>^eXJqA@>1Uzr1Pk|EOPCOOY6g!L6kyh4!W!u3 zcBSLQPik?tp;`{T7b5Xikwob7i+<8S+s@940w7VV5mIlo16p^2Lzw4PA0lT8suJ;qP0_Wy2=vJXh#vP zSMES`SZm4w;ZXxL(L6fa;=;Bl0Me_9p_V||UPM|$_iIa`F^@EnwhCpSTb7j|p(p9~ zaI|xk7czmIwGXz+SJwx)5`Pg2OLg913dA} z6gBfZNqo2Pxn0W<;{tGLj$_9S>cyPCq&E`Le4&9!Vht7HC=M#N_Im$xMjWPE?S(V`9JT(SekAnaA9{W$|Q1lobTu}|C4Vg+`vhlm3=Q> z)sSo7-9~n?4A9fU8^BynpvM*7feXhXJ@Zd@jDSXVj{;R>JalStWuT0OE_L?u?wxKO ziTx^*GxDWR5~2sJ_gnBoLq5LmP2R9Mu8_u)d^e%wtc|Ccuk~}qDYOuRnhy@Hfr`8s ziIW~zO|e!Z(n|{}S|~Bh?^Gx~o&_?rWp#bJj75qkaNx#RLF4?TBDUWRm++9`d8&-H z) zCwVvF9%X2mc0->F(0@fAxVd`+Js&+NF8N0);qEl>GQr!!@?(9|sCS!;vD|&njSHtJA*E!v0~RaBr(8;jDw%fTBGcIp?O z|4vKL^;(n^1{0E#>%W9AJJ14>RVExo>WJ3n7xqYD*rG3r6!M?1s}Lq5aeH#Jc^@5p zAto{pSf?E8R6&n57$JRWcEK2j=yKC|sLtHamO{_l$=_%OYY{2ZtG}R7M3YC05g8J( zb13|6yPldip&M+qrJ5y)9Aw^X_t^ez#4h0NG!FKjIrras~F4h6vFH}UlU3W68U>jjAwrMJ%#TyshH@X+_4t5m5xLU)x-w+ zpmQMtbG3GmHZ%4<)N8u`IH>od*S1ZrK7afCJ%2&yhYPGGK zc_f5vi_IhrcphQoMhoXX7(OQcA$L~Mf0k6F3UUJ}?Go$SJl3qNnmcPW?B)g3X@oO^ zNvu?Je|)ukA@+c4L>{E)#2#!0sWVGifVMZbsrVkHFX`x@2u9We#gK1pEHY?O=i-Sr z{q3>{BDw)lzJu8Xawwe#UMx_fJ6Coxdlh@>e)_%HZAS&mEY=;j*A|=csKGW^^?*mr z?ZZS?d!INPk~mR}i9hAOD`JZJeF~_yQG^jcY9OPa83-hYn>dFR1jvFHDvH=Nl;8Iz z{&4xiZ0$0+ka6IzEWCNtC>_Ab-KO4=p_aRLKFUYGz`Vkio%rqK_bnEPLkT zA-^+M_X9oe3{v=S!_29yQu))B5$-&4VT3~Hp>Y`^vgHeAyCoI&fZsl&<3{OmOf({6 z7A&3IUX$r}zk!RY%PEOt-y4ES-*u~24~?>fA?hE1J8}zE%|WV~_ZIEd_dm1ww}18; znyYRc6jgBaL&8j&9KIZ;69|bwbtzBK&kHC{{FCO)j{BL;%>w$R|42aagWjK#<5YJq z?ZjI?yKPMK@s%#eJ`rV(hU@1Z<)z)$h`*BNn~I%`u#2_saKhxMIb+Yc3U&go2Jb;l zK*ov$!oEkJ-eG!{(FY{PUY8r?msg~TxX7VOMQ(KCKi zd(zV!dgRaHnfG~_iOn%7lDF$pv_^v4gqw4W(=#(N_gKWblRo4h5HpC96*=RU+vYZ=gg?u~|6&Kg7LN zSX|w+=B!u+#Q0uTW}{paCe8`b}RYU+WYJykM~<|ycQ2* z&N+JPtsN6frbK^JTP?!`O69N6S}n25?zt|WdacL67S2`DGv0TMF$YXlH8ZQlDPXU+ z@M;t?up(YqwoY9)+-<3k(x#?PtIq`cX4Y^L&6GHe;@Oq8TyBYHoGgFnq?NZeJ8ia4 zvwL5vUwytP7zZ>bE8a&|!B#AtAH=rx-DtKZ^*XDz!M)B}o%F5dUrSrY_1MBpIj^U(Jgr`*pgMO*dvf_T?6m70q~#6d_9zzsGVt)@>}TD;qbn1@jvLI zW~nG&MOkG=q7CC6gG^sq*`t`(U_6@MF@y;J5QKx3j6)QFpvj)4@%2CZiBaEiYcabGU|5j#C^t4lr*o8TjMFt&~^!BmK_ z(tXz}?gF+Fs`8krNeCsrM<^xd&4p0l<>+iey3Lj7;R#RdXMPU>T7bC+PF*iO8~ z)BH$E+Chwm((Aq7589MFNc{@@&1uk~8x#%N(eMNHWlgBJyw5CVN=sm1SOi{M@Bp+z z8Sujr5?9;@rGlY5IGC8!HR9Tu5phX&>k)-99`4l2F3PVJ|&DNBi zfyR<*&ixaUIkucTTv8VFSLHKbT!k z&VWd&de-PucjFZ78|l=;bO`ULCnt^Z%@6YQD>&)R^u~SpMT@TX}usp?S|)?coCP4~^R=YDIlf?9WtDxe*p{3b?NMoGfIoj^(QDB>;2aVU9h zC`v(&%W(VCn~E`gD2S3{0PxMr**w!Fn;t?X-ec372z{860u4cIuclxK&b(sIvP<#0 z1BuQ!)GZkE8x5Gfau!s)8{rD8=SU#mo(3tiy{C=np8HzS8BS?Tt?b$sgxTU5lhgQW zw8tt6F&-R*XfL5JZNSx=`y?OJmIe#5E;_Wan;_E=+D_pxPwuEv4geM%|JT=G{DUt7 zixX(y{1!C$3(d8p!s7>V-enF$r6CmQ1@nQFzDotb!wAD{w9ZQz@$n02R-t0HFW0uC z46KRL{j3snY{Oc-2m8k#jtmZ`+R7pHl$ZScp}6C;G$T{5tOIQJEyLB@C&0BWX2_Ao z?Cg-qdLRP|@hL)lLjXu0=?d5R!5Kd(0uB+N6WJ|aQn%yi-%_``m7;iQm200jQrU{w zC|^`uUk+mrM%TgLVm~NV-Co)XzqGw;zLm)Sls6s8etwQ4Wm3X)?AFDjvemL>>mI3A za1reuU$sIileMaLuN#l5NZe*vgf+izX1VWE@>qO4`BW{Mq664VYTa5ca}U0k{8khO z&OHxj(4V@lqpn@)03C>+B?~4^#0DmA`n7pYL&I_Pl=j1YnHl4%q)|r3)pY+|gPyxq z=YUK_NA~P@mHj4YMosYVQ^N6eF>$W8$TDH zb)w=1?toOvho^_CX+o$B=}+x(_Abk3aNVtEYNVaSc#1tfIJ49>0h_5~KqO&MFf3$?)PnxxTCANvSzv&gsjgrHN<&G6hmSe5)Np*FKR)NsW=IX+2el#=ieI;gKIa zYi334c})!_MLc`wax#Z+$zX^e3-p_uwgG@Hy2A^T>P~Y>D04!1q^et+;UeN@?C4xp z6xSe@I&nrr$LdUrFepReJR}d}7e9utKAKa#(!ND4PiyD=q&yE}`D4AUA%PR%9FDVh zu{)N;8yI@b42_KtyFwGzx}>DYYRnfWH}~~=4n))mXjs)f*1m-fyc5H$W8e4&@LH;x zq!e3^t7VE?`+vrox3A-{TtF2)MWSZY?rGT4@Az64V@#CWMy0azvE5eX@j7mA1Y*c+ z(&u-6)v|{HPuC7j7++m#;-MN~Jdn-X#!#!i&v6O{pck=8Tf!Hb+{P;dtWm+9hb%;m z7ZH8x7j46WS9ct8r#G>)?BWU0H`8q)vP4pvAujY8`&wPh98mZxna2Z^bSIN(VGPvt>_Iyl~=j#fms?q9?_IIHy84OD!u#{ML5yy%eOw4LElj*mi zjOF-}i1yIgM#B|BKRlZoGe7{If*MxwC&=X14>Xi;{ppc`BS`X=#vG{q=1^Oyoc@f7 z=#o2Fn)~P+X((;}svLmCLg&6%U-Dj(Y$hhUghwl(XiF z*AuUw42&b#LrWV<{7diTvPWZMHNN0)B|M072bGCV_msvZG0;~jeM+b_Kg3fb>)Loz zc|O5#cyRZimyW;bm}LUEJTD)KTE53`2Fq+pDB=q%Jh%D)PRMVePAqr+O*J1=bWZ3{ z1`?7dFwq!@4R~q18`*@LH@)?>&aGN1nU<#v)wTTVdX)8ZvCeH>y)YVu1Wbsgd4YW~iD#j9=h87}bh9ODwq72^B&G@&xneHLle=AehV7^j zAO3rQ0YUi<9H5vN6eG~+12iI#6cq{@FmgmMOSqC|srrF~pO3$X%G@Q40y`mU&i!el z-8(+Xnz|NKOIF~z*PGcB_Y(*T#1LDI$Ss&jjGkeg@{YmC1X&e+Ab~bRFc7gK@jx5H z(MSfdIaM@j{5&3&?HC;p2&d;+UD(&e`yl*exYK|v_oQur2${c2wYIf5qjHy z4;{3Dv1lOr34{Uzki#O>@&3>xJOX@jyy4Wb7!Pi9?SJAM`Gt!zJ7f!br){drOWaWl z#vpB>MfKgLf}F)#Pzm}?zhR1$|ucVH=b}Q-j!0l7k9ab_0`gQu6{tJU*iqca2-t4!&4cr zjZYkVWOLtaaSVh(1Qp8%T-Qvn?(=;3#L?w~Y0#MdSZ6b2iMf6pj>0iHc0#7|SXX8F zl^(WU-c#5F2dT-TdbP`Az9Ul^-bq)@>;zDEi>$aD0$am(6s9-PcGbvq$WSq@QVkp% z6`&oO!2Qw%;#3y*efvfpIx+2;cY7BI`$Fl1a&!#soCO;?h*PtzblMMvlByLin}v4R@L=z<6m#^`?Qd$e1l9|5&?noM%Yr^dGUF16&inl zJK#gqBG0E2`1&$}!f`}ecSchGY`0j(jD4ptn=VSU4gEA%2mT#rgSRy6rV#IzH#Rvx~05j~n4Y%HsK#g2$uHC<#^C7cebYK#M@nyjKw8 zGXlb!P0KbrUEXt8MMXISNzC`nR{ELRWQ76)gwWq*8xo_ZN-diejRhbZ5v318W^&WjrX;(!pBEyr!h5 z#Tk_byg%0u1mKFmM^h9G4R;J`>M8BZSlSUQDw?JQI2Vh$84!8peHT*E*4!SG z`!|}4bDE6h2blgI7ucJO@j$3 zmav(n;F)*86_*BkAH_^ z0@6YBpnRMSx>)eUcT_Txe*y}T~rI|b-V{)x*^_{l@y zNhrSu0Q!{Yf;5G&%U5Y4@_Ue+MtU-$4D!J!Amp`+42jy(0WD8AQ(_c?7F3k~Sx}iF zfN}INTrCRUlY^(x|BP*zUMZ7Ba70rrM{5a;!-6LefoyIM3!tT2DlIjwq?4B81cj02 z|AdhgD!GClY=RfKM= zN})??)6OqX3(-11dV(+q)TIPUK~MY+=TwE|$2YM|%cXb2ZhqfrGEiq^XINx%CE~Kz zp*yj&KhOlZuihARHq#Adc7no4XY=mfpBwu*@B}(QXS01ZF*AYJubyZ?v*IF)W@ODc z!ES9a$O!-Qyl)E=(~g?_)cid1w=aw5es(FSGm@kE{a5;G5tPC+Jvh^ z`r3HkH`HQo>@EgyVe+QDNIoJo%_TY&N}jg7o*IfrWfKRXbFUYpxJd6_+7H_9grX}U zK`QtXm?Xgtp}6~gP$3HbjV(n1hfLJgeNgepf|~{@IK?o(Q_MSb@HU3WBIJG%5q?Qc z?THS)>0OqFG^QuBn%RZwp#>8Gzq|)Grsv{1mo}y+=Sl~-{kTH&HdH@KG^v?I6Q~Oe zyw9q9E(l_KkjxQ%uo2Vl6I=TD1vhkx$zAhgTtC&-a>2*vc1XJKktF_wqk3)(CuuPj zsezfv=&{RIq~~bgL+x>aX{~VT%S|2rM7e7sa3$=#uKaA9P1`E)hwYrJY`ubimXoX6 z`~4_bFI+63NF*7&gkw`3=1UHTC>vis7|wsUHaZmYE1QXFB zBg?qmR=Evy{r3u%K0f{G+xeI1XDOWsKp$K%I-tO_rNO3 zb&QPa3XAwEB)QaLmqaI=-i(-*muiR7NNpb{6u~UssoYrPrZx6?Y?{;=O z4a0fYh(Nwcs;W!Gw+>FGwo3ieOx$@3+elk{8PT1EO5R?=Po=1Yacs;4fep8y=fCzu zDiJU_Cvm|ed5_GBOyp+Su}2RY?|!KQy*>b-k#FkpcdROI%|Rk(W}7x zx=Q^peeXy0EtPSjYj4j6OAj-MxZA$zq=uprn&C#KN5|anzwx{JKlmL0#NSDH{+qu8 z{uh7u-}s%`{|mqKx3Jusl&cb~M*SCl*Dlq@aqw?tv0T0X^#6k2q0Icj?@sNX;{OMJ zR}FY$2Jv@}ApQQ&BUbe_+5wudD8EnsZawLHCO}ZXJgq>8y(nu>!C{R*eI>xS6Hvq{a5FB z)_v?mK}udoC4ymd#QpcJW;J?j3)ky{FzO$TU*}#HKJYoa?z#4Ka&Nv_O-U?}Tn&nn z9u4LKC{VNd0m-u9!hd$DM;>90ux5G%rDs1S>r zsDz0?1Ttwv2I39D%PM!JX97U0;wRN;z4Aqe^}>zf`o(N1hikiMA>Qt15%d9+d@19r z->@8v&754;MKR zG&)yN_=)6w%u#|YL61{F5+uNOqO!oI4#idQIyA9djwAx?neeknHfrO+t*;CC-kEV? z-;S(>jBUS(PsG(57}1_|6RH(=tv?Fd8B_jT#fZL=YikI-W!h8j%JJ0`2)vYtTT~ z%>>BC6jC!rJq`uxLMIGk9`S+<9X~pu!>-?&dLn}WcfReZ#w_Of0#RJILjtj9swh+| zviNvSjD?ia0-gYVdAv-TGap_wMxD2AAgIkHwJ9iv$IH=gbAonm!QDNdwMIS&9}w3G znrV{h+uu^ZC{|S0Z2q2iM69;{0GerfuL$aLoz(_L&M6wPeuM)|(CsQ~tkTBZsfrRN z4OmCIxux<`1Sk8HoTsU$D&r|Y(exd!(&YDYBKpX{fdNpaO8hVu+N0}+rCG&HNs=zd zIEX8MgY~;n`umN)d0yP`DI z94>o+fY6cwMFCl?RTFkNuC1zpmegV zBEG$Kp94S>%92C5;7^$7_}-iGqD_DB08&*J6`3#kgXCw$%3F<%>y#S47gcqQBGGv2 z*edo2ShmsW)w6F+JYZ?LU4<-pu~(syixjbuevOzrHA2ZKbKWxu%!ysqfe-A+U7k4b zr5shr>aQ7P{9s4rRZ&C|*iJZNkIMXOmMvHeiqC*M-5_a{J)I~Ay848^Xld1}N?^#v5zrrLm&pB2Q zI`sf29ZRR0Q}TseHwG3$Rw|VZf>tvTM-!3s*9Hn5v+uuSQ)e}OVY_Fik-Y1<8VUU> z&_Cn({^YV}rm6^Cvvm&k5jFS4d;$yLv}f2(skNbwxI!AUu28U7o(gB+ezoUqBXb!V zT8(u2I4p8rq*qm;AI>VhB&D_QzIeKj9Rmv}1WK6+V|OhUK|AkQR`?#(ww_0YfS&X^ z@Q$Yo`cpeUmdp)%2O?55AWQv1p{ene?iQ|&Apw?`+u_+Dl@&_wZ8lpTaxLo*sj@in zgZYOW|JB1imJKIx;Q$s;yxaom7nF(V^UA*1>r1j%#Yw?|Td!y$xP%*;G!USI}C&y)66}ZE(Y|F7Yv~cBe zO=4xX-gCOJ`EEN7u8gJZsF*rSLf zd;b^8{8SSKKkhH>jVMj~Any2-g_ph3WO{KEP3BULB1eydN)5=Rtl0HqmMrqqFUmca zu;+wfhd~0#{pTOw1}>E+=%K%EgB^>@C;cl^##;jI8-}m-1lbN%8**u3~lS$FKOvhclvGfQf4oi3~299Pu6ASqa2r;~9o-g-@I)0PqY$E*#lz z&h{Dhe?2^3?v5aQc;CQ46A8-AVG?T$gkG?VB$@j5%}g97P%Hrnz&NCDruf$;(DF{i)ODFl{cGw-1o=a&*ABzNF7TIBW&qzG{3?+pAbNRW%372x`| zfA|%Eo|^G7Q@v~AH-P!Ruv&!454Fj$^GgGX2uaYm?r*bs4m7R;bzopR)jmpSAI9r+ zJyJ-YxexwuYktNrj%k~e;#TgVY>BXOx1-uGy+8Izx*9~fb_dkD9+LB-S;KqqyX3{{ zZ|x9>P!aF1Hc_0VqIEhnIV_rjFwF(t)hx8@MX65!T_;)jwDK{zTs^C!MmGms#JP>bwiArY8F&#QODI;{NMdndkx=)rng_4$pZ5%b!x#tg^1dKbPIEB2Vx=y2*ybc8`A z<+y$6YE;mBHGVrYx9Mj*wKTm2ld$fn7MJ<`sYK(CV^qKxU3=f*m(sb9pGXp12Lx-k zo3fv?FVA)gS0KQhOC*ZIixDRlOE)2_mmKdJJ%TSbv zeK4#Au&&|P0a(tsb`gbu=SWN4DV_wbFN><;YSwS0z%{$F#kaoe%|%tf{DoaLY)|W* z0Qf}nBE6OKojVWsWX>dwC_P4*JCm?$xdgdvZ)=Nxq7}>JeZ%zK1CHFYi0thrp&*1w znK!R@IEE0K(!GigK|H%?`3X|f&*kq{OeyL>-_12blzR~h=PAlQDDxUsfh2smoZs~l zYXED1oQQws2agKS*bp4Nz+M?pCnehx2JYW-sjgWTga$&wOY*f~rmst~Hg?v(VCmyqX{2{v$nfNH-oH>IOhbZXo!cYD@Pj^-%d3Zxn^jv!6pnp7Npg6h- zx*L~X{>l}q23x{TrDG60V!_osX}7=GXI`CbY7fgl*3lr;dar^U%Yryc00IW+i^04{ zeltFVZY|dF16l*rlb|G99OZ9gONRty^alR)*!8%GInW3}4m3ho1TCau3xVWP{7tCL ze?|z_&6m%9q9%wMjXIW#KCLp>kHy-GUOG)&49y&YUk_`@LANL}2`M0B0QU(}WiJ&z zZ;`|OAXs{hXBMon!)HJvx^bJu%;fUVCSb~nfsVP9S-8gRR;OYV_?%$DtqQodlh}!z z1d*GU^`g?$Jtzt^QqIu)FS(Qrb{jliYPGhd#;2=gGrJxu(uK{!zjCR`qamgV%pFJB zdhkS#sgG`n6d(H+;05mB1_C*os!Az9muDQYY{59I0CYb|Hr|CcIMWj3up=ColfQB) ziAfWXTx$N0T#Dom2SW@}m5QYB#cWM6-4CE4mi0aKBz$yS7R#qC>X}8o*32!5hZJ;0 z1NH^<+ixGNgr#N`y+6NxpZ*LriTUYFx~=tVTW^)s!?{9t>IYPjH$Qql5F1w0XzR6PD95VM?AKptIb+qhrHeQ>21wkiDdxZsP8*OBh-Fh;Ie+1WJjJ1bd8)S;uLHdOE)P#b;NZnh_VrU zY_C6rMNP)l0T{eyZhi36se|MKpTrH1zo8)NU5Me~)iKzAmVP{kXUbotNKAO`+le>F zh7%=WG5c_c4I*3~L^f*{wh%Iw>KXVibxz-@GOaY$q;UY_a&O;%j*$}CUNP`7C8)<< zHQ9g0cUC(Zq|ExU?lFtA2L|*zk06w09JNfe9HH<6$)(J;;DpMb)j)Eo#Ss=kbh5ky z2`X^}CL4D#DqKldQK~EGgiQ2=Lq@#0OIb;XG#JCba;ai##s5Pt<^R9Qr7UbX4QPD~ zVX&tA^eICN;oX;Z83HO-QvGX{vZK}Y=XZfDhQH3$3?g-&2iC-s$py-UIi`JuCvS8o zAobdpfs9=Ll1sflOlWg$NwRPoqW{?G`-DQiewVyId;muUx8i>ggZ3)Z)M8QXl>$mntDq6&z`s{T^$7%`V_!y%+Bb{VJ55PmX{5fa*2u#r0nck-&0i zXhd+Xe+l>gxlaKK3&J7-AlW6Nl=4crY;Ncf>^+fpYbL}JTJ7@cc4d}@lz(@7J;YaP zEa(Z^cqN8@LHn^~7S@mNp9BAAQ{PwQ*@yr03*#KfFBLlE&FY)-fl%uS zd8D~z&Do-t`RxKAK~(-x$pFL9;hwx`m{wiYDQEN;3|GgY{6{clldD+EJz!giK+9x5 z;F`tD7IHldq_ABaL{zov_}p1q@zv=SYgy#BUv7i#=f2*u$Fir>pcerv)o=Ne+!BNn zUJEgZvCJ0`t)UzPb~`t+*fQ)rSRpKw4xMESjpRu zh7}E9uwg(BE)W{?o$2%CNxNt@I+PNHJ<-y(4=MUv>g|+SKlva+Ok8j~-+oQYug6az zDeFdAJ5Kh*-&`1mbwP>lUs8Y&lLhkdwr#uX(y2a|$jDoagC@?K zME%6f^VQCHcp5CZj3DF2+g1r$sp^768N68hTdTgiV}k^%f&$Sc%%abHMT=At!L{-0 z7*?q#pA{hdW*)_RB7IcUohJd`L4J|}V|;n-gf@=IlX zf(wyUj297mf;zf~JmP`&=(`sefEC*104ek1{a^q3rNkR#Ma2I4rBt=WAvTbiJD;Qxqs1IC5Hy+S#Lh>|#jz))=~xw2hO(FB>D-QJ(iP5$rkZl5n8yA;Mh zb}82`GF3?~1*%93aSMWPH!&TE+4jYp*r{!4laiTGafaC<&PAMRcm{-8Dgbp=_E+b( zFV`!NyE`Gl&>#6CK@C4HOZK#CnhO!OZ(`4Geb%WoyUTLlBVsVTadvNa=Rq$QEC{I%hj* zie>EVo~UJU*46|2TnQB5%t%+X$}F;R<_LYz$WR=7JQ~smu-@=DF&TK2m5?J=O)Krh zRJ!jNiB&}tXqHFK8tV~W%+JQGs`i@dP0lbH>`quMswXSrM>S(MMvp4|XCt;Ol}M@4mq^X(fw{)f(grMugy3qn2$Q87To8Kd?!QIWzA7avBOE844P zRm&U#JZ*_oi;^5za*InhiFm7HC^vd-=p<(B;6^$&zFTMZ(1E->Y%9cRt-IYBL$5|wouGoa@KwM z;Ru3n`oce{!Y5+#7>?e9jCzFn9c_+#kY^PD^siWj!C5TXzsE&?NR^P{W`>Z4fw$Vw zby<*}S$uWW;)wZ{L`Nh*9h_2c&|;+`haXPs*h|-#HnU%qdanp2V{jQ&7EmILxv&xq zG1;}Hg0>S001Ty>e5t~DQkpIy)d3P2Fe#nS=h`{F%y6+Udfs<`-@oHc}6 z{dy)Dwv9|qMzhZXlT$C_L24d4XVsagUL_85*F#sR!h>e_ST}P+1U^k7nf3Qc<^ z0@YGprF0-T_B<%v-2h9eSbz7DXusC$mDBs4 z)Akx+n*Ao00=Ilp8WSg9ZzhhEU}-R>TyaQxcj0KH*&dyGB>O&_vz1i`Mq<@)Z9gdX zgs5QiD^;3ldQQ786qQS<9PL-Z!Tn+g{jooHFk;yBB!*9;XdGU)LKf2k2zdmIfJ9WA zKxaN0JegY!6?HWf`X`;nk#2PhGftx`oVkWUyC}va4%W(PL-CI2=(Mk8iyB_sa};BB z*GPdPNBO})9(f0r7Nh%YU0@$WIiNAn`J$JF0(_ayLSs){=z^#bIkdHPc=c#{QxdKq z8vPuHDC#t@ZNK`a?MREf(<{^eOpX=<$!M0wFlFdHtzdp zOz3_!Kl>7Re@h<;3%MuMPY@5X@%=EPP>hVW~W939JO3AV|_ zx_iXAQ&Tw0`(;%@uv( zmF|{Ory44MVTS#qV7^2Bk5bWH4m8sx7!1xp>4&a6c z2o?k_YX7^~{hyFe0YDX||D=2h@bNz@p8_2HXXR4>nE$MN3Ly8Nl}`bJ{?FE1v?a{5SpbpO8-hNdJG7Pr)KGBybr*Zp}sL^yG4Qqrk^U z4SkQx&BYsiV5OOF_5xkH01KU=F@PqsFqn|+pf=!iCj`U)7EHa!Z^{=1Ht0k-q?=kQgLo zW+6lfeR^FIR{i=T?8m|B_b@gF&QBuGI-L12p$ADF7o8`y*2D!wF{bKxk@d*5)JXOo zC|-|&y8H$5#l4}JTJmle9}N|7+?*`+;xzG(L<*V=Byuq`D-F0(2v{Ozp_5YzGIlWo zTk&-Zv{M&sa5w=J!3Sl9x^^4Fp(({dZcq|MG$_st$ynb}WTWnCifv#3{yuYQsznOv z->F>*OTKgS7(hqZ6U^zF%=Is9|I#%8M~1K0;rt+!dSCgl@$4nLj{Zw1Z4jh{owJk< znfThh)Y%-IOOMA&p&!NItmxh0PGoagE(l>bQ4=dVRGbI+*ng!vw%t?&Ljaz|!*VF8 z9~Q8R9rZU7*se5+MqT7wha}G98)nx6OH&ZDgSl1*2l9x}Z^*-=88bAZfIK2@>{(b@ z^6{pcWq^*!uh}V`@y_m_+PFkuYsj95emvZM@lng#)gbxf5#cAb&U+58eBD_`ynyh6 zRi4BGaK|qcOlegugVjT#5iurS`CfZH``#UB9(U9JG0Sc8 zJuQW)l%_aZXAa-tX$*(4hocE@B>pC%AwFFN<>YLn2`ezzFd&z z`d=RXj>v--*-0SYQ>M%onOVk5F!7dkTgSC3eCg%#tVx!^AB7WVVvWAVNP){hzwF8; zHOTQ9<0v*@fq{$C45;R}D1tw-LR}U+&ZRp(&C}g*cVDdi3wZMlNmUiy} zXb@T=_lyEFV(yqb*&m1YMxO}*FV|m5j9{Oqc=WC5yXTG%*5?1zQkN7E{?Uj`DUYoM z|A6!?{lF9cV`s$=_uRPTGfo}27R(=wNM1+jUyTU;0Z1cK&=!R2L)Ys7A&R>FMbsz> z-D9bd3ln)!4HcvjF*^9<1xS%G#*P#X>Pz^EwD#q+512Sh8Cwm0OAPh>W;GB;yUOQ< zj1xK=GxC#U8p3{}Zxo@f4yOINr?0a7@_IB_oVE3%PJVBlp8Jp2fJ`W%H0J%pAQE5~ zW)S4~aSnuCV8YYSQ)m)s#wm>GO&J{g93Zmte4PQ@lcJ1qBK+lmCE$|6rkrBM@39CX zKnwPBb^Y=}UR(w$L7T24Y2q3QYEV+(&z}pDkA+*`d+VjrjC`I5AI}F~okkD`?qB@C#$NGoWH>m6+4mkJ-=%EzEm9ue=>Qtxfu8I4exD zm!*r{FZ*xI)LRBa4FJi2ucRkEyBf5TjI4r&N-1MUg{{6!$7#2nrY=_*jK@8D8i5HN z>up``6diuSk!2^?%NiGW;k3ty*<)XtGTREC+OV=&_c5on2p5FIE3$l71`Q7?`k_DO zZaTR2dw#&OgJ$o#@!HNZ@=MOmY~~PBfca?gTx?xqs55g=b_}!pit7^y`=^--#mCOe z_Fs~vzrxtf3`hik%*6kUr_%frPhG$&if|?Qv#A&aM*l5Yux@9$_7kzB5Y972&9jSa z5DU5(tMms2Y1UZp7$hFhjIL8Oh~C~bupy$BjYz@jkm<=sID2?FCF3gOi0|oYcm8iY zmFAy#>JIAMVu4XHXheqq0FCHmIE`s)Xb6g;XO>|9<&0H`5z$gdq*6y(Bcv zSO4X_6kEzJ^X%nCO&NAK|RKU+S3 zoUvA*RmFe>J_o2P^G?S$(N(=F{uEWseo!8e$}&m73hsL!)E~VP!6uypDBFkpQoc8l z3##@xG!fYl4L4zAD_0aJ)`vU zSvm!+Dz0_6-g+8q2VXO_fQ0{pwWCHH<6Lj$upQm$HuyxuZJ^M~klk4HAT#^)6=2=w z`3F9F3V-DyVR(TVr(cxqjrhvs4i24IC5V#qbh?3WE{m_%W~w8BJy z1Pl?!X8ceuxvI7GDw1Sj$aj?whQgd=uCsDH8}wLtlEzZo;L)qJH~^CYQLrQfCfC&D z5g$h-2bDZ%{NDFBw%uWq_&tF}3)a1AMt|gKQk;D8%sbeILB>uMzi`X5dbM&>U#iemi2I6Kgyo&>zI&ajE zd^xN7r@wG;ab#WA3O$$$N`PZ&38|topl)jXSh)ThUF#~bn90D`)=bQ>NRBC5ASvKD z$%hSvvrO4kCO0j~M^bhqUf-3UOQHKSk253;7ui(<1V{4iIr5L? z>O(waL@cx0Afa~GWc2pv#z7=UAF`MElpEm|M(=F0i6*{Zy_&|Dyijv4Oa+bo!m=qB zy@rEl%(lEo0A7kBcrR|a=_$zK@cvKgs!T8qTz~SZ!YI0~u*#ovE+ju;i6bv=8&0dT zdbnzYg3T&wda+6gMXH7Y6gYlzc$(y}{d)hYf-tQA8F18c(=OG^Ry1xWTZ`^3q|zrD z0Mxqc9IK5Sd+mBqX%d^u*gMtON)NC^A*M@sYezswtdFo=T6}h@6J7WRV*uy<_bcST z0ccqe0FBjkqBX7p)pvA?=xckz<)I7}%RB%}3Hy;?1%gfmy^Ko~v~t6XNFSAeJm$Gp z9FLNoHng>}&rB*CZ_GL_9Z12~+ zLJFtD;D@ZNuBdu9t+sqm7jn?b%`+dsN6=Ro-;YEk9<OEV`v+J^cv}Dejq@UTCrAko!@1y4lZ1u>&CWq2WLtFAv(+q zqu~N0A{fmYQWPHqCd?9y8;6jI=AfT88sds=H}$%}3Ex}jnfOj=*53Hy zjhB7{oHn?9)%3GeqLx+!u{mKx4(dV?EFoLr8<>XvnN1iT5 z1R7hu=OEA27UV?6PDpLyHfelRpDYPh&GnPAc@LTVw9M`WdQm_V4GLO+r#v0mys3z_RJ@`@B{7cg0<4@gbwL zo;PuzO7Cm_Gd^O4jXT3J|J*s77mkt5(JP@m>|v!OA@gG|Kb`-jaQrHbTn7=8AFrp0KKST{YU1d6 z;rjtHnJaHJDw@@a?VhP9mz&myA0cZ=S9y5I-ncF88BiW(#g^i+A0E2%SCIzR-{qZs zPBzWMtbQU*m8@54UQrDx$SqQrf<-}Ld*gx`0lu(7QFjTtPo=@cxJcehyKhL`-$k4o zp{+e*VI{3ap7X1_K3^Zcsc9rnL0@1KWgc(73VQ7zmOf8cth}qZJApOMP_}J^pOdca zH05R!+Dk&*eipqaXMMcut+@NXO5kj{a=Mk!NYL==+x06cuh-veA_F}tt#D}H&whPq zU;Fif%PA*FIrRK^?Gi2;KXGcd9dPHgO9vkh7Ir3q(F-d@LiG{pEBQ#k&Arc$nP1s6cnXZf{kUbiuThm> z<20DLi{pa`^x|VSzKK)6Gm~SsD@*VM=3>#=l&0yDvBOmcHnu4TmGZ+>G}NhbR*qEd zl@}p$Yiq)V26;Hw8h;lprN^pbk)bPk41!=Z2FQjfFyAv9f5gxevn978yZR1xNg zUf0_CRXk;vggbaw1Y5|m%pgeXn1EVL!l1z1THBSgzO^Ds7%kL(-Y=w}m8-c2Ql+*O zM>~b^OIXNldb?IBg}@T^xr-_gNp-QuH>n+FTdwsdHkGxqr;`+UT6?thEKgw&S;d21 zDByenXCjc{8wC94hVL-2ifbat{~uFl6;#*4gjwL=?(Xg$BtUR?ch}%f(1Sy8cPF^J zyE}y79^47;%t`KFGxI=EP!ul|y?b|my;koaQCO!V+G7AuLw{ce6AYIdQmIp!J%Yv# z`~Vra=9Jxi3sc+FC?U5Kp~^_rXXLiT;8#(RVpZuYz)E6P2NNxT8{OLqmA&OxUSHKm zv@+%1J)YxQzYu;AoWkQLLVDX~Q(+JXZ9l=uz z?U3PA%X&?@Nf(!PM5f#u?O4)KS>$L zFSxY#MJxq!f?EX8-Yl1%0Tj7Yxp(#`Mld8$@LlSqRgnhbOW}idIRA2+sgizsp1Wlfx|}9tPMh>p=UH4r=uQ z6K{m7m8}UXa^AdnON$iC4>#|~U0Vz&krpG@u@?s>CXh7v)(n#D6?g*~;lqt_6OgVyO5= zDBia@VaH)pk@6r1E9kucbjlp08GHaf5a&}dk=dhh55vexsftzkq*HbAQ=;V53Tz)L zEQ7-)5uG26@q!hEg!9){SU^Ag;a3_gu+D~YmX5cAOru>abaes~BSJ_J3dV|{)&0mBI+5L7Kn5jW5gWw#Y$%ueenpxyBJ?pmBiPyPcAkGfIX$(6^(rc-s=&y z=4=U9d}!xB%s4io9k_ys_{K(^5QjCH7L;=3oMJT{J|-!PNd$U!lA5L*T}#sFQZ^#s z2^7whr1ze#caO&T30e_#nmqXDc9@_D6{kUq9R$Ezi@flF4T@|2m;wNyXwuwz(W<44 znE*ofW!A)!!&XnX27p@w*=FDy^Uu7Mc<|M|cbw{Td-Yu^hsi7B08T71VXif5u*w6e`5Xt4cj(sGafjdQhB$Ax21A@;r`^?Yu zh{k(qeO>+G6i{4?Q@}%M85%Yq>LfRdBQ~4468Us?Y-6t!p*n<_VF=0sD?|(F;4-TG zH7ep|+x`}la9f|y&I?n+{NCHLW-ed5~X8ax#b zg9LCJBZ)Ogb*!_ZrhEfF52{Fff5Av1>P8gd8+>7Br0Pz(YUQmIo2Hg?TELPwnk=6A z$558oeJ!5^mja7G}!NQ{HQumT(w;piWt>Lz&ZD1)s`eCQ*2K|{fKr1c*YL6F2 z@DY_VjhI?af%|UNi!=j*^qc>{OFV=usp{orPi-ienmMr1!XEJqp{Sj0Tlr1Zie#It zWI0&>;pc(*;zdd&-N^|wtjZ579ca-l8wi(PHlhLAAgp~U++{vB-V|X&v|IUXmO$X6 zeWG=@$T~(WsKZ~0kS+ZSvyNwKgh#?04Q`0{FZ5YwtW(%oLcRakt zG4i-rQJNBMh%{SC|ITr&Ht*`W<9GySc;{|mPDHIc=A3|z<~^k;O0DDRPl45L?}Xkm zIf)r+NM{m?UvNdLV|?rcvd|QJMrul|_1w7_=nYo4 z2g0N~?06m5q~uH@0KJ_Lh>1!#s*N!kC`w3p-$swa4qaQii~{TnU8#p(0ga!O7AY*; z?t5=1IhA26Y1fe?Zs|yYzIpsRUSE9+uKM?f>!G_p&JXPNCsMxMWKMe5$n8j{+qJ;R zU_p>ay&IQ_I1*N;c$f7bp57I^oAzKav|b0VaO*?Vm2Tr>I^NM#+Eweu+M$~5q`6gK zK$|a^6j-z>yWz3H2q>A1i7zE(J&VK5VSlm z7e;l03xU@a)%6M0qI*Eg?NiUY!DjRY$IyAGs7L=crcL5k@qRl ze=s9Vx=DuxWMMhi1jbPOzS$(6PS=ph6Q<31nM5J4hw>sHuFA+|9`XL9*)8a+liY#n zL-G1GvFMI$o`Hivy!YWiB;YyY7TBem;&#(fw%EY?P;xw>y{$NfNZFn16g3v0WJD!d zNg1v@c(PAz$E9Hi1)q95+1yc{1qJ`urzkV{pq- z{YjKbi7++|dA;1T)j5GH=JdLNb&WB9nD?613JI?IyDdF;D{W=~b6a8c8IX~NmudXX z%cazqg|R|;VHi`IuZ6y)Q26^wadO+dN<%vppFIM%yRi!;E_YCFFg<@Qz_#m;AUD z$~edKwaOeTUf_1Cv_>*?vcT#5qO@(ohq@?{C6LPpz((pHW!z#CA1cV#MIj+q&iYe8 zlDNaTYcM7WY@#~81%fYPtKr7m362v2_uOOmct>|4;c~M(`C&3>s1U1~!iWDz12TI8 z6p85~gp3sO+*zkehujUmOLZ2=?$LpGsyNk{o~y>IR}!{3^8E9S6bOyKmz{4o3(Ji} z*J(9AxY1 zwQDTSJklt!fv_Oa;Rw7y9wL?nJ*9l5iTfG&&^`~3?M~i=pf++Ah)pIA8-UOURXCZ_ z&3U;d=8klr(AQHV0Q^J0gZE@8J8b^Tx?3UBX_Y7gu7mYgC(-M?{1FVSWN7y2bI-yI z?|bfytg}n?4x%c$v;L$BYjhsvZ+{z|dyu36mEAT}LJ95L4e;&>>TIBHjaZ}V$P;V-hjS?ela>|Nu zHD(NnSHv$?0u+NV#M;meT^%#3M02&5w}IkBZ>V`WzD>YF0vq}<)~*Ec2Qzp`no1yb z8m}UBa5a9QcUgHFPtZyp#QRS z?D){TuA(mUU68|v4Vhf~iVHa-REXs(w4+v<1wUEEDbUxtu%yE-G!k}->XHXfp{7!+ zC4zU#%PLl+(y6ot0or;tM%4b;*%+N4c{7Lo3(Evi)Z+G~{Gy%9IR>Aa_5gIlV;6lD z_3T4Qq-NcF0IZs2FPUgLmAt&`sjOX#vh|3SCh+LKadyB&GS}cx1r}hHQ;Q? zeuCW48Cc>O$+eb;jH#Wrp291t7`*qryHpt2F`@k@T(c)wWaaw-eKP5=E9RC4eM_>8 zVcB3y@;H(Pz3^l{LuaE3+;5P)ZQZq~eq46mr%nY56_1gtN3@99W)p@MeqnsKUU0kn zXF>=}#IcrPi3J+BVS|q@Rb*VmkWvsy5+h0^Ik3v$>}-l&gZia&4AoFmvrJAe!%vS{ zRg()b-k(WO&ShVB%&u)x1E;XPXfsXUn~%3U;oQ+qn-H6#psC6UXFVj~1VZndaO&G2 zxB)a_9I8Cirhg1mMv^X4ev=g$ODBQXSrpVB>rgpV5;>LJqC)vx8Dz>gSfjD;u4$j7 zvw@T_`QB9p;LFD=N`M_34IYJPf`GV2Ubw>Vg?a6zwV#kUbso*Y9bk6zOmX?G7Qc_F zE-g4&)2L3YemR?Vea3d z??L6<;|@a#QJRc(sM}%U>g*bN&#fi17Y5=jx+`!4D;MgNi+FDM)DB%T=mqQ_irMdOhM zBM42KlA7ibAg{0S_@nAy?+1En}EfL z3~JY|$+kx!eM+>f<4N za}+GlRZ4&_D5x#%u+D|qJyWx-4Dp%M1EdhxfPkU>xjcWry+>-pL;OjHI-xj5`L^f5 zDPBT_@Rx!rAKNfYqK}UcLFz+1eqc4K@C?pY6*i6FA6zOPWx0G1#`*uj{uc1{A-A}9 zRG{0>`>7&-Z?CYFY_+bYGrO)@FZ~6Uc54H>v|d|vI(3z1LBnk{fH8z5rHFQ0>o?I^ z{390BKK}1>P5bom|5$&9ojRxvpy75Dc^aL4E0#EttB(+W#}rE8Kh~e#qp+p8^@dbO zXLV(|selTlm4TOCi(7z#W4(v+kd|_c+8}FenG;5rXm2L24WyH8gM|k91wSyBCq+fa z8Jy`mUJ*4exk`7C2{R7?8qfIf2D&8N>&gy*tzV>^mRIUWoh6?Yp%h*?A-;HxV_sYk zkF!#$a1ekS?@?d4(sCv7!6C?iOpE_J=jkZsOc>SMU%|^g- z>>c{;4icv(U-wz)8cY4@>TKb(Gcn<;(Ym%QoTb5yIKNxB#0-|U%XhITs~f*1x0 zwx7-NwUAaQ4swK*LlFi#O7V>a6D%ASgW~wx?ne}?5Pen}mY@V!1#94%OTNc_JJRt( zx5tM%E^s0U49}IM6XNxB;o}z=T%XSgj!)98z9b7`Ikr4lXu*lVdof(gnggFrrXN~n-mZvXq01m!Y_RDhw%Xi?6C&-9 z96uFdgR`a6!+wwD;ClBR@y_I7Fb5o=o1cUAiWGDmPVr+ocHyuup3c7&riVT`M>xZe#VVJZ4d@2{&4{(i|%Kz;SdH?MW zQ`rTfm{ap&pb&uI93y;mXJzNj1yG@t-{<%teH}4Z&`4#=t2k*x-yVnzC@0F12K7%k z1FnrC!ax?N&m=|Rc~s;_=X-ay*QdGbd5|=J51>gwLyxGxLl5*A3+^L&uZEZs_HizG ze)Cnans>j4NWsrD5w_i9K9VK@+OJ>l{jNuBuRTTjfDpo%U!lh#7sU!)KeauJ%_5C% zfiQh0vt5}@A|iNJ2(D~TtYrU}13e9LR~c^;>^yb<$AMlAyYf!KcEK6$9IN=*w$ef& z9vEs@+w1^qD-vfHK5q0+$ZKDUgyAc}%3Ze!`@00G{TSYfqz&}8e>@0vO9`|{S~UZO zEB?8wFdUQa!>AVFUfbsR@jA28-RK6nXj z9sP+zvIXHQR11RiEydeyx-;~%*uP{Fc7fbg+x!T}=vqRKll!uv@yv!*y@wS9DP(i` z6}1VD-ga)v^Be%8+-#tqfi3C|XJ%Yj@o(>o!V6}?=CozTzdqg?GfC%e`3JSXKHk;Z zDET%9xQvSw$ktv^xI$LM*F%5rI1k-QSACVl(na#;1CH!Ik&|Cr8y|XFWOZ@En3b~H z%|Qo}uz6w^Yf@-3h4CQNA2x<^PKWLsChSbcWgZa^$E(~zprX&{0^Z&hZkE!*=k7^& z4)$<#dy(W>chFtt6^bL7nx*rN=^MiL5ALi-rCB6e?jpD(R=U|F0$WlLPt|-scriCjN92Tzx(DnmyLEoJd83cz(tuc zlp%J7X`o3wIfWt8ef%1yeDey+g4-u?5`RUpBiSzqMB0HWOar$-K{H^DMk-;6zTzo6s=s2kPwmhRP00e?YcL4$-{oe5bz-#;IP%KB~Nihg7&D=#~eWn@jjvj83$o<<7)8grpf84 zzeoCl<{dC=2pSkP0-SBOA~lnPF8%B>pSg4`y*;pS^723Z4jMmgPh`|zHgC@1KL3Dj z&Y64}*JY{nFlJn(=4>yotx=#j%LrIE1vxp3Nqu(LllXa#yfH56r3J; z649`;S5PZxl^2#cu;e_J$f{=enExv-z*pl}uUlvSXU+m65Cc>NR9qCKBd8IPB z!hgjj^#3a^GJkE~bOU;-Ajo{Mk-bINU)#4U4FYh`caIJPXr^J#rvd3a0?AacplJ^R z8*=;$rGZ+%IfHU_H{nznf5j*dn>3*DFhM9Z=8iux7g6_=@V8 zC4Tt&aNHsb|1tZy7;k6bhP4y9_HHSe3K*c{nSs!QK!ASnWp8d9hS}0so6_Tv( z=tg`TC>#ck{*TSvst;t09NVUpIxqYA&YP*5(EUHe{M1H5ubyi*D7dAqy+753)Hg=$ zZCr{;FWDcC@OvDS`{qDVm3s(C$+A^BQQXRepz3WSsRdUJx~lCLz2+Q+#KPoQ40SYZ zuEQHdSW`A{%zm9He1r)q=V*JbdxzTo*lbHc?s#7Bl7zCA9IE7lOT@$|QzoZeOuw>M zZvEAQL})kqEG@+uql%uM7Jp>ZaNoK8VC_}csMvCP0EOA!W%fX@MoJ6xf<<@K8F(6l zSfjmJfTs!jIhU&tZ#EtoxA%<`(2t(Ljw zX@6;$v7{ogFjf1s0w|lHsPx_ii_t^Bqa+{$b#1oPs^m+lp1n1w)G&--Sx2g@etFD! z!)i`w!$&k*r*7JQrlQFSdZjCd&TT}<8!s};|G^Umwp{$m=9`9e)m&{Kt>~zlwm^sM z-~g_xv$-MQedbNq5Sc%lY^!KNbmmpS~7n& zy;rT2BjlY7Go$}rt(I3H zNBYHor79Jo6tw=~;QGrRqfh;;00sXKQ`|y%n`D0j2~WAk)n|$1)q`j);+$=o% zv5A+EVCROh+#yUH;#)hqdf|Z49ayXxKJRrX`xafPH~8=Z6?k!`$>Rw4w%5aZDv=m&-${=d+@ zp}w;AW$5{M@x8^x$s9e+uH`THCG;am8gCqV38d7)AA#dhpwK-L_$FbMGGlFY@leF* zwkLhr;%Xv8+E*Yw&xld!uR$nh3JL$ zSj)UZ03mimbye*U)ab1%y(Gkw-Wso$Z@O_ykP$RXT9S|7xYWdG?O&&3nPG%gSq%mq z>B@U~cXo?*$5Cr?P=9}7JjFfY`Si<*$3Rz`e@z*Xh?))DXwAcLB7okTRa!qJL@IH7 z{ef8c1CxD%)GXGy8|h(kFUiTLKo>7`-4GPI??ET+Q?n+j4$hoXSH~{QBpuQ%`ndl5 zKzlf{BFSv2)0^zF;BKSqiZWXyk9y+vZBt-eW2wOU>+3+JBp8jg>yvgz5V>t5uodD%ry-?!QE_D&QwF@;z zMu1J7zIwKUhAGUiX$=VrkpQi(4byxq8?JLwkJ(hJGixCGVam zxm(3R>*W6Jc_cL(+UWPD?O#H%c6mDy?>T&>fqaHQ-%Mn$Tix7CEyB-v?BtCqJW0?o zdvaeh_Un?J$MM#d92==Qlj@F1mOoC~bWKyUH>sBqcP6T4^z(i{+N`1wMJR4n>tsLSl@Fksu~skdwhi;;P(G&l#P*h}D;Q$Jk|^9+#I*1ol@5 zpsxi30oIR%%cGo#VIqE*l|G4Ph^+8ZU@M=;v2Ej`o!#OPR?v*Tr2wk^&u;Vf`2(b$ zkHkkhiV%Y25jlf|cCltdYJ=*4>~#8bb1=zBVYN1M6hv^?W7%H$uM=vM6>csVT}LwE z!vMz38vN1F>7c&Yij&D|k*Ae=)LttSbw(nf7@tIwjfpE;Jn*G}mP>zfh+NrrRZKxw z-B>A4W9^wg&$bt=Evo3%1f1WKD?7ESt9+dhUcxzMrD`BBdq!3)ffniK3z^cyX}fmE zsB$5eA6aaBzer1?zL~>7gME81b~y~~rEFM-!+>oEABsI#)yiNWK7x#>Fj@76amg4^ zu4v^}{Fj@qSC4T2YS+MSJ>8PM<3_5gqp!J*xBlW1n^a~wJ~hMIJJxBZwhwiNAf_$O z=P(yvk#m|~ej?{v&`rB=gN%OgO$es6wC^INZ$^~93!Dq75I>>OE!9v2pHr4vIxaEg z2&}>#g}RZ`y2E@4v8VFt-`M<^Pubpq7c=ITQ}Pg~rvn6MPiToB*ttbj24pHI`i}eP zkUxk^2ReOCBKK7xNe8ZX1Y7ep#Arpmd+KcBW|6cOS0MgevIo-YMIpF#2s^%d=Gi#d z6G~M^wlesCB~U_h9DWm5Z86t!al^4{F>fKD}F#KUWW^KwAkKH31hkoy%sf09O^C~F{h*jU$>jKGc7?OE+6 z)4~vPM^z67?UzFkZ^Cubj?e?_Z9y$zS#XR)(j3i8;nTqcXFJu}uZNa0+MMK39`5)!(k{ zg1S~%gB-2Zhf%JY7w-P9^?Q!)htpn1*l7+D5EkCw)UNXf$?@(2oL=X%@iE}M<6oNJ zCQ^bAI3YA5ZpqDz9h_?ca9&dK8RI=s+-V&GZRKGrCbQ!M_RI(_(j!3Pp{81Lg6n%3 z*yAf1f23hO84oJkjF7RPbMmOGxU)9A-J&E}`KXy>h{MA(V6KG9$b z{{w^M;WWc~w|hLWI*#N#JPe~nl6VjEIyzFDKt;R7U>I~v*(Ja6a@+Xy%5L|!5UwF$ z(!}<-TaAWeYbl~ewQfygs$#l)f4l2Oc^wL+R`c&h)$yp~%62ZOhdWP89dE;oSG|rW z-3HQO>_RBOlGmg_WV#2j7CBgq{xV)RL6^5@gMq(N-1d+a z_I@IMpfpYz%b{(+LvI4qdBU2A?m#lIlXH!D*4O^pzGysfEh3YQ<@or*JcoRQ66}(_ zSe^QWS-ny3T{axgCJql>o?289_sCmR9Z@XTVSkXWW_~P%^jzH`^V+(rD1DIz9B+|C z{zkdIUJu~qi3?)l4M*PFMjHcfu_6e#iINp!%IWByhgyS_I~~2 zF7D2^t$-mbDiSIXa!Wo0u^hMqBsug_t+~IB;sy&D<^)4o{Rt5*yoP1$%w2Fpwh}{YeRwv9cU+WAWfD7gI6*W95 z>Xp7|rLn!W#HuF~bWjx9$J`7nf<5$d4OQP)V7Zbn?%Q_5WjjW)VTufNezgDcEMEij zGj)yW6U@*fJX#N!COTTzEO5Dp4gD?gd8D;JtNc*(FeXJdwa0^fnbkp1IYttc0yq=8 zCQjI6E80Gf9of&-ZQb~)3*@cK?x^JlI{IzC;oEE=_6(g&2nH1>)vu(COG;oFj>TEt6INk6t!V3`tW6msusVdS7r24(>(E%jRC)fZWI9f~3e|J}T zNG2+&`wbrbxI6;{gNb}-`B$+)ukhdn5SXbiFCai-<#&+9L&JJlqz;gkb4EGMJ|_3u zdKg9#84+s5wv38$KWgo-CQbyTiCdJ>TN{&tLHh=_8M^-h`#n!qY<8k=?Az519XIVz znF)M!2}l#CN)d+*9hp@42U4GMrhG?=y4gOIqFCPf_5DtnHhbl#MH3PhNCP|&yUQJf zv)gwF4jNB_C}4QB7+M(7*DKqAR7B&j)| z9mT(G?v+~*UKHi@Qi2_`J(cRIcy&v>f2hcndbig`$+iiib8dV=Hwt7+WhaE2SSYC< z^`;4MFOhlKx3ib#0#$1$$xg%W%M{4xg2;F?_Vkp<$|q}4$NI78fAhioA(%fVe)?*W zPm|M`l|H(92A_sruYv3BBCM@p`A6ruf7dT+cho^Ly?8Qftjy=`eqL+?DQaJro>F0) zQ1L;YxOd=NWcmjKawo&t9jn7&Qa`@?Lipc7;pNnE9K@0O<%F&MR@Hd1R!T_K^ISNR z03;_|E!xA_pSVP`>$P(Chz$H*gM=S#_4%ws>?L2+Ql_PV3^J%95XlVtP~=TgsNGE_Bx?O&Vh zdx?HojU}1{5(%_^t@E*{U`*0IGt`JwY>qvcQb$AUp6vg2aSqKB3uf4826zPbe={$g ztbcyc(AN%CF+WUnzoo~{-%w42wkCalKMF8{Bq&3<-4;SYzTI{LeTm7@d$b1nj6eJR z3#S0>!Gi?yk74u}kDr0PQy7N;2xQ|vlqKkgF&H2%WpbU}=PTsL645?!AT) z4y@#@y$Qf7=JI8u)L_dC%PW*2bp2v>w);aer&bHw{bxeB#oQsj!0r|SnNiswq~ned zEOPL+5G-*BYAX}1iW39bcCc~5Pj50vf!ghH5{Mssx!lNyZ*04|BZ9LNJ-rb}fYnQ( zmo6ZX;^9#oyfVZD{2nQ+X*^(G#`b6U3#h8JFrC?r@ybX!Ul^QGMDu9N*}L0xWozQ{ zTx-1oMA8@BJa|#jN5TccnlcHE)vk(JZk-sq+M-DTm6;(o`H+L%?m4TP$US9p7LlIu zyOzl~i=yy|zqe@P;+4*rOJf344@CiWd_bh7cZ-2j=*_v4=A9AD5*%s>gWGf`!L?qo zMzxc+Y;$$w4$k51A=&ud-NZ!NGTTn;Cuj4D4a{=$FS4~(hg0`&G7Sg%+q(t$fkFF& zH{{&lVA^!Cnz=P4x?VBv_%;zg7vCzdwE@KpA z;FEG5=aSJ!9S_{_cR_alb;Il&so-spn5p1;&yzUHzy-_d*F6f4P6#Mr1l>96N+O3!K z=j_*8KH0c_83}ax!*EITir~UDnly&cV%~OGKkYCY@>zL;95E;KPOpapNp8NSA_anT zYzP;^klbRR15J-SjUn|vksVFI>72@!HNWWoO%_J z@uI=4ig3TkI8@o*!oq(34*6J$`P251l%s}2d1oK45Sl<+nHItR#7 zv4^e!A(@oHF<^R(hsiNr03MKUJBrPtab?=_Fo^3yX4*6_g~8I?u$;)Qw8AnzZKO!X z=VoTf90UdU`g5WqV0pA2G}LvuCGMLj1O|J?PF}SGDb|Us-pl!VkkMlLo<>U|O_BS= zxeWVVo_*XPQ)_aVdQUkd2)^hOUbr}mjitkta@k6G&z6uq`$uC(@T+5RBcH{ZkP7U?(I7PaBDp~gsH z{+iPhJ~cv2nwm1r>rEjKtlWyWt^E#hSC99XKOg*+fx;m;Jl{=d&EOPB*(RI59anVc}J!8 z%_6LgHNLBYtLYatpcA$XHjWc5@Wb(awHaZ{e1qQog}fZM4KEaON0inO2i|8lcDMfA zL#K;isEva+y1<}&aqgp=RJ2yNh=7{sA5>{=+P%d#2^IdVhsggcS&?iu0=Rf7v-J7g z#YDJ#LfYWe2_6Sqm1y*Epl^EDm}r^@`z+ioM(Z%#EeG~AjiPjUN-NAI0_u%f3q~l} zHAbta@{D-Dlf|o{ow*06IN@rY^77=$VBfo#RZ1)k%?}4tjD!SgE)^=MG)^lW#}78h zV9FW>B`^Fmj9W>u&Mfjr`YxxTv_G4x5ojYu{_uaS;wtA|av% zxt(uCr;X!{hL)%8U$dG!A0t_zuPUrjE<&^rHnve6VH<>IQ7cxXy@AqeHp;y32Bp&m zILZw_)7hrn>}!dPtL4qK0Lvb*p3zCfQf|Jgm#1D!3>B#r?e%>mei3n?$NldDT!mkC z#%_>KlBf@Aq|6amG2L^u5X1@wLIdz8e>8ntVTB!*gPfy6xiSJ8I5A{!k449{AH9N6c1K{0%AAZ zJ|K+1Ftn&nmg{)^0sKy{MI?Rst{cyMf=fN$&2$pciaGK99BBCC^@Oo3iz9TC9Ie}F z4nDk?w>zl?9t*zXc091`mfc_fcTJ|}1BH~xA3%uA!vW7CXKrulYDLP%2||S}13)qg zEm<2vN!0Gknj=%^<72NoKyV*Q79=`r9g1`?azrO3wS)~NUKTL7MyI~c!h@r#$=06E(W=>Lq%7~^@OB));#0R=zP$@y6ssxejdD+HIVy$eo{egBfvDY%l>w_}* zR3!BC6DI!OkKYDdL7_6-DP(v4_?(rkpM+>}mOfQ#j=FJlW4jUHohBb}ff_O=!e84} zyYQU+JT|aF8D+AwR#j_K0f}a*jI3@baZDCY`j7*9kX+l~k(Mn_n!>}*KoNHBICiO7 zbx5SK7AWb79BQr;bk51=arm+Gev9pOFWXO!$<2X~`W}RabtRBCakQ{DOSPmb8_@US zNxtTL2Amx%qg`6ghNyvQpB3nTobc?ErrSZ$iH_r4PI@Lr)I`;YSIEwmwyi-`2bd=B zgsQ{>$Y|5s)X45eIbimQfxOu2%Tfj)o>H?`38ZZ^NIqj1tyF@nXTM|*R;UQ! z`jJJ(`?9i=@pLPs*f_7$Kh?0~B93t=AZB?E!%bwGkC4rTmg)ye05u5NL~@vxn1u@+ zW2=P5bEFMxG+HJU`hRLjN>&^{9lX*L5``S|E{;vHPe0YX|H!BOar6w=mlPbe<--9? z$Sl!&{r)^(2>RKfp@XyiXL`c0_PFgm)0SVeBM+1|am0bO@> zS1Vp9)+jPho_Xw9dp*6+RJ_05WZnQZ<`buePVdB95)_I_N^*-!Mt+g3*Kq`km5Bko zoyX>m{Y?oLCUmFbc>xctG&kmHe#@P!!N=N<7iX9A9-61XNU1GvuZuCH$lu87BjW)_8j`<6mlp^i(#NBfI>+ABymxM5q{`Ote zgASs8-M$o{vPm+U$p-ZPVgWK^Xe7<^eitlfg|botP5?b#Nev^wX<;Y>TF#{mtz`f# zj`n%O3C!?5^(yGexog#~yU~@$@JqdCJWGrJ%Og9$+_t8i8Bpc?gA;->+6p{1z?w7) z36i{NSYrZ=l}&|Xni+=c>%xqhjy`|`rhw5QAq9d$gkK^w|aqFzQG@TDoVQ$$@Qw(KY_UOA| zKM#HY*@y}-6Mwc$hoRc*=B_#knD&nZM^?9uiHI=H5Lo6GgpJSGZRcEbz?fH3n;U&f z#Fw1{2+1ga1v`3BUs+(E3P@X|h<+T!RkK|hYKFpesJnT?&U;B$=4~R{FD2BAd8HZA zEai=uQ)B%A@|#5n{8YK*!g#Jp6SiJLvtFtLX1XDSKObLW2c)r@7Mo|W<1>N;9^c~S z0N@BRUiRjAqtcL-Y@M$-Tf$apT>n`EX4t(K!{yJB;if574xOv+Gh5)MJXr6&*bT7>Qu zMUq1d`@aSobaj!R3BZ70!$_nY<#f=^wT1AI)4jcD`S;IhGQ^pg`2F z4o45ARzRyDRR2ynA?u8mZMWMNbKU;^u)qCi?~R1zb&Z_mx^enVOjTU`75MeZ{@$AR zg?%?K08OD1%s4{FLb^F!-^XMR{pb?5klo2_$=NQP9eFs=C(Adj&PZQS1$mf_K59@u zG?9sMot!!J#!_mpvALGRI~uol`(yG!a}% zs5P9sciUmzqOwToB8tvSaDtn*@TaHKLQdY+CS<5|{%RnQ#+GeXfnIyA9Xn6=?66kPkxBYt3RH@^P zot7~kyVlux##0m7DAz*d3#)oAU7;1wY=>CmDrk)|4U_9aC{ij8Tbks^&nv?_j*{ql z*|Okv5xZI0*Q8kcO%OoV`1ucXu7(}8-bN~XE0ldY+XlALrKr|CELdW`VgLy8bluNI8Su<`(vGV%o- zH>}wn0{AARo$_RZeDO-CRIHtbN|l=|vr%!`Hlag&JvF0aF9V$fq;&nC`eLqt9(Qj= zNVWN4>L9TTh_$>r8gtV6T+HnLoPKC0Tcy-KF$nI{r?=kKM4)-k>yySFAYf0L^8gLm z;W_GRe?pKX6FE?a)d13iu6*0E;4T%Jp{wU};DcsQWl-V3FQr28R2c2`=wH2q-j-)L z{9?d<_e)AAyCVajd6GS#!W-3h02c3~pb=(PA_u#WsbTEXELa~buL zc)CJZ!$sbWoj~s-{{|%$zg)0U(wKpbu;G&U2AD|n05*Af5&X2Ih5A{^p}ZLI z;lGEK1m73}~8<>p%#sgOs0rxJ$Rs(^PA&^pX%bqG>Q?eV-Y zG$!G-O@8tjjtKOptU3iWvG&0Pe$42k8S(gpUNo`dXz{HTo4(~{4@>hk*zq^t-B+G} zwLUZ8;>^bl`}taXS?>7z>x(`^_-jzdWy=SRzu{(}GxPBI$vJ*y7%HITbvJS~!cZ+ShP=@DWfUZRQCdRf~1U*Cl(WufvSE5|$ zLONzzxG~ftN35Pr3SsPZ>eDRmmqDlo(MB+P_4yYcEoep1s9F*?vB&Q!%;YLT zL3sNfyp;7@Zr2Kv zm3^Mr^HjC|+i5eYQ51IF_`;)_e2k_Arl9OpewJIiRkJztXEMGuPbc9)b7rz7`5`;t z^jt{6QjW~;ddlF;$)E(HG2zsUe0GomW&<-}NSbj%j#|=Odwmu8*QYkD;J}w+Qh+{NsK`3z4nb*j zwQtX#{?ql;u0iiy^WB^8RS#sQd_p`xzj2U1`SM|hWV=qOYV2g`83*HIYo>24jy{_A z?1*f}5jr2rL~T-Y*QCAiQV?T00Cwz0H#ondf?e-+QMN?fw6JNb4sTa>ZNzq$9IteD z$h0(kz>2f+X|Hg>Y>dYz5j)@%(@zcz~M4|=l{~_v~!sFoHx9!-rZQE`d z8;xz-n6OD>+qP}nX>2D=W24D8efs;q-%d8>$i{4~x!1j}>pYtp-P$dWMQ9d|kpRu~ zv#?n!N;QZMt0d1T7a{JdYX^D}^(~{BoBC=v6n(g#R)at2E2pj1UkNDYi`lU^IUu+k z5VCxXwtzhEj*s-naV!sU!^_xSnEU{f#hl*z_u>;~#?+Qj}Mjy;Bj+ z+B>*`feUupY;&Z`w##5wMYj@zEoOG9SQZCekY@!2gb@T>Bt%`@DTQ20>Z#sex(uF; zX#I;=2jM4^1A^uNa9TfS8il~Gc*Q;#SIS+IH({bq))YzLZj=%1V)dx^Yxz7FzqZK! zXo6lml0wER&P<5L@;$R(grJjX!s_pAHE zw%r?v4bs1qnCnK(k&B)N8R z$O`H_aRW>ttw~h4BS%gqQW(C~Z9x;|WJ5!IRp93ES2*=j$1337_I@GB)f5mFVXrOb z)1yZagKjTyqz<&HBk4K1&14HW> zMk2MY_sx*N|JSHa0cd%X6aSAXiI(hqw6D(Txfm@fFuGPU3idfgW874SkDPGfn zTwUU@tt6s?m}`gAjl$5VuLu(2@Ku-Og-)9=*n@Jy0(&G$k!1SCfZ!4m%^kURbsVUP zekt?d>zS+zXjFR~Iuju4=-ibV6DL`and=zy5R%G)S#wcVFwk$E1&3-&L(cN7SS~qgjvQ9SdI$ z3W;-->m(lmr-B~wNf2Wa^-L0?y_ZMN;+<24Ba2Msi|nkQO7zcb&NCJw#X zJ#u5x$pQq;C6W|cwA#jlGVn^eMdb1ohW3xubFi&c%#J4Q%FHJu^tIksOQv1BqsD}d ztaV8NX*CILIo_{yYgunWBo*E=n1QnmD)sqfICMezWS(geeVt~?mv)$e97q%zv!!IG zW}lMUa5P9k6Zsfziz*^kRkfPE7(6#Xjp5GWIbc!|=6sEmGcX3FCmn|GL#uijrk4{h z*NoGQ?5u5-0Ss~SyJO=$%2pC0?XL|?^mr3OQ9o5RdDc2D(+z5vb1`G8Ci{Q~&}C>% z0FEa10!Z`mH%)ArfaU!jBfoTPX*Y|u7(`5>78nNVm4#<=NDq@6MAgv%{$7A1z!f$u~B)~@+l zWkN_K3=8+F-p_vh`oX+){l%TgyW{DTkt>g)!{a&^(*FI-z}YYg`T&=O&X8?sA-dQ5 zuKw4<@vL_*_A@b5(QR0L^>tmsTI-#GW#XB{zw_k()K8rM%{i%YU=R@h6XUT?a#P;_ zJRytZ>U2UljJp(#KhrF;rB2!0$~y&IU6X1pQ`u$l&DiG?h&gi{3W(1Zj8kH5g6zP_LYBG) zYVj0+Q%>u8L;LNhL80vyPXE?I{_gnMU1JRIC>AcsH@d9c zLv}VF0S!-onVWYEMZmUQKWi#8ZVksv1*DL{v>7fM;rIViI-OY2I_8GEjey0ONJKKZ zMp!Rvx*V674AoUT)_N_p0Xmo7u^7`X`6sD=wGiV>XAR)HFC(mDFl*{UYRJa4Tf9ZK zOrD*3`6q8Ce?m&HlB21OTa7LviT{Pcf=}ZICnMl#@~WPp15cXj57?25#b^7|P^oEW z;w*%7xf|h4bh*3Anlu2JfG&AX`(?xA8T!beY{c}X;UjeD6O&2^vyHEevq1YG&4pv1 zHHH*e0$F{RXyZtStcmos?r;iUhJ%Ps3s@Q?>dh*}YNEtVaW6QpHt(rE7QJRQ#=@HB zv$VGjL$FZDf-JT^+Gy5Nu$kT<(xI*-JQW<(PveBQYdabb<*5$J2}_fkEc z#NUxm4aDKO+XakM8GcMnfBvmo{Xj?t`p=XOr`Fznb1i*vQpNZalSH>Ri(}|;?uKs zA<=dg_(ldZ2#YRAf2JipE2AHl46NuuYx+hd!zAqDTmq&@HDUWzycDxc6g(u^>;ulc zo9U2-{V_IqD6Ojm;QJu*4sR^szZ%fF7@?)fF0iKtvtio@E68uieX_{^m( zUf1lK=uh97MIUoIr5)#_YsM(Er!4IouzVJ!XX;~@6u#p^Y8NHv<^W!Qje#xVsSbNL z%q52AFaWxcwCW_4=w4~G4C@`gK8%?feXCmdWoQdZ^vkgE54ujk?GDo)13J3^!Lm(> zE33gh%P&*5;`~*6zKK{~ZU7@PkSjWa?WC)ZIuZNj^FRLE0alOQ-+iWtp|Wz8ui)$> zmfW=Lq&c@3ERL(-O1EgleX|^d! zOS$CPr}OPhXAgG|MU<6>SjG7$FjxKu9F9m4bpJIHn~wxmulXB3)}j4NkPvy$_Kd$! z_MdC|Smhw}VGKS!a$qUWIFJn0B;L`rL(HQ8oGxopWJR9GLYd(G{=@;OOA^D+US4+t zqJTnk6?Ue#vu1jx05p~);RWG=EP>=``L_K0Z{l-sr&s@Vjm;*Tzlsgd;kmN;2$OH~ z1<~SsWl`O9rjMY*X_L?;xEr)ChCnCc#m4H;Jo^&to`Or+6f5FUNj(c@YJlKs!B=)L^FpRx` zs6G)S=)iItGR_)NE>j^(x|&&oGI1!^H595tnTL4gRvKL%M-hMb(6lktf?4a zM~N9-%ESPWucg;>cy(0DlIjH#F^9g|>m}nuE*>`mGV4h-e6~^|GW_D^o8c1lSw2KJy@pa zpO@e<>tcIlH&9AUxBQOd#3kF@P?_9LmO&BH2fFAb5*7jAIm)!QlX6H z==*_3Ju;MfEimnKaToY`(rdJpp7ZJgw345*|3lu_c%-uPJ9^|jf77iLtSGG#Xon;H z5t+`LY^xe@KffmJ+fGbXZFfAqT5FK$H8B$hc%_CWN90295b~65&b0UoYn>g-^#*W+ zrA&;Wm72SFDdSt0N_`*s({2Sfcf>1`$Y^hh$!?JPZ) zdK=s1U{;NzYuz_8;L&*JRlZGm1>rBkP(?Bq;)mpGIX@|G^a4BQ@o@z|e?FQ^oP z#naGCe&#>-n-hPt6~XHjzX_c1?y*Pjri2fN%%Te^KELxk+s5XBAUh0L;L*#Oz6XJH z;BHPRViZvhUjJeXyhn|D9J;X}R{?3-dZ~;r+zEjBPWzBfGo0k;>G6#WR%n&`wkh<^ z+Uc4y)XxHIfl95)C6>w*%J!r;K_MXZW*2zVWaIo#4w~u!1Hk~$(s9_}!uXq6DMa|m zaFtMJB(m(T2alnriVSpBh)l{=$*1Vb#-t*?UGaBGwQ!V1E*i>*J@=y_kGqh2%}^8l zgR<`^N-6?&VP%{u(!>_wDbfb4$dnk+fV8v{7gr)domgPC&y78&j^~GhzxTsXZ+6DO z>H72cAuvGWP1xD_eB{~bL3j{E5KROw3px)K>qJW79Wump;0GS+)FOo4Rv9H4U7$ta zcI=CBL2vN@uA$hGT>lx$<71_MxgyRUGXI`!QW& z#s1d_I`;Z6Co{+}qe@Oq)0Af7uIbFsQi~DkNW5%d=iHw(E3>Nn#&dudd7(?xJqWbt^<|vaH1GanD4{O+MfPr2sLJX38 zXmSWj&%xJ3LDsqJ?X{;!PT-)7)Lu=0=^WFc%HwNn+)WWeI3<`!bmV$+`9p>^|GG&M zrKv^8!;8A)PZzl=@O%`as^UVSXcVOhw*#u0v*w7*fJo%zl_A>W5umCWD_fBwWI#(D z(<24kN&Zsn@A24{mkZ#3^SXn%6de?f&GF29z-180FeVzU{*_vSYyRTLzlT$i)EwOV z!h8>|M5abx-xKP6fB6ft_w&I^8YzL%Bh7IDJuARWA(MM)lK?bt2CD-Wg*q2nQ&kUP zZg#o&exynm@;k|5n1KGwMtmjE6_;~$^d#gTv{K8o2M>u)r4ERN{bbz}rg~>iyuLt{ zQ*kmGz=m7aDt=11hQd_=bj0$hHRUT-O8c!oC>s$!lfD*f7~@vpe3C~yMLjw0ba*LkVl3&J^%J;Q zo)3WlA0YM75dtjA99fS89l*9vF^Et{$uw z3&2@h@7v1)xLpUKhnj?M$6oKF>I)1+GJ`Sm{9u*07st+WuG8LHbQ|bB$4-#n5}9k~ zCIIiuWL-1wOSHwFt#iB`%sp5u&a^rF1c|z7=@;qeY#ih^(-D#YBfXGsPWcMO7i!DzBKAeaFM#~`O zv%{h13fa+et!k04(rS&Av}E5E($QkaJj;NLwXMJqWQ&)*CfX7}g- zE8rJjxpOjK2-q3-SW!nul2HKX=Hdt%3_6yti3GeOtF|V97t)W?Ak=b+X1CkB;&^sj zpPV{h`n)Ya`rx+h)O%S)@3Y@<@jpvm=Ub*|a1^V?Go zEEbEooudOh^7)2JpLCC#*PCIzw#ZP4Epu7`e3FzfE@E69h*bj9%wiJK(mTFK_sPHc zI@NFi3M17Z9Fj4$PX!VIV8fK_omXntD&MJ@w>D&nbVh`c-m;X;SX)Fv6Y=qc#GAyx z3yWf*TqI3MLdr{VGQ8(YK`xOJ5}!E!)HuG8YbvIaAwfpg2&qg~U{xShg;t>=ZSLZX z`>qtGN|;uHSW2c4cGNzZ@=xcwM|EI4i{{qe}DB?-zZK;U8+u7R*{yvoS(! z*aymvMl9h=vuG!>a}=?~nMyP2cbjTjpt8s{=dem}+5I>gyD1G#={Qbv3kG^Isebk| zzGu8zs4{3=bXEfBF!!uo;%h{`TLJVz#A9N}umdWt*^b6^+VzTffUVVd!DN3cMlnDBp@xT@A3uf>|ztIAkn`DCcQispApVZj<{~f6@U8aga7_j%~2KUMrhyL&IDOYWF&!S_!zn{@C>Iu>T7UF%I?bAd7yzk!hvjjRUIFFTvxvLXH-7w4XW1*+? zNkdWu@Br9a=U?Y0$Fq`(AEMAr)^0@y#!vFl7!t?i52v9rH!g#Q@e=c{*rYI ziQwtpTtywG_8v2jYzQKFQxlC_z3+>l`93y3w+J|T+7LDGWyNMHH2&q=g;0BH0Ildd zMR&mnp4ul~nhhztcu77xr@I=hJki;|Be>Mi+lwe)5;SQ9;J?26|5u~C20H`)g%|%iz$wf`UN|%kuK=ZDxdLImm#mGdsKqq1s6$95K#>u?bRu)~=~?M{^cYPhCs0q(a<2#hfEu zF@geP&^P&cEbe@WJ)Vkd0y^2jm{)z087`M9+o^>Cw?|DO$|+y3GDaibLMZ~}xA1kz zpZ-KYQ_$$*kcq_X%0WO6&pYvS`Wy}S0*nD5Xp%oaJe1!yO^Kt2xw;Tip+(r`9xN@c zxflt-LnHu=dft7ThIbR&L7zh%%(oR4C&N%89tc;|AXmNme~g>~20e`Hn9EE9A-r)y zjmFdF_P;)kvks=)S6i5o{UNbA1cR>)&*}a3IrCWi*BfRj z?GU)QpTWlP&h;(THx<^!+(;zV2xI!?_XeO--|Wl2<1;igGd_SEf=Tian+en+L=G+~_b(vYb^o*#;&!POS>hk? zQx1p`X;u+@yu?=u9~L#TlOk^d9nsaRZH*zE+f)@_Ups=)DQZict}AtcNh>dCVn^p= zBk-(C2T!(cBodIF>fYDVGWMun6RhOmX;iIcXR4g`i&-;?64L#-c4KO z#LO%fmfBeA6ZGAxntH!zSr-!=n^%5a{iKkjmr{xSAUnDA5PMA41Xek(D>EGNXv3HK zg{Nn9O*=*fpMJ_DK?Qh}B4wpU_;G%MT6+Gv`?oRS`oEwJ*WcVE9Uw#20iPQs;OZ4q zKt_b~C{wnH2Iw1)&mz$Jill(Fv9zx3YDc@kCxLR`>mhZ?&t|w*V+L6{m_U#KjM^Na zW6O?X<{!G=Z}{FH^GR&QFMTU* z$lOA#6lNr^B$}FHz`hjHI5O(mOpig)_n^+WzwAkvVU)4-hwdy=#CGF5#aG*RrC&HD zH5KKi6kb#eu+EQ9d?gGt53(E-6`yLC7DBbP$>vP>Zr*L|43HPU-h@$-@p6ixgv?^a zMzC_#>KBpf*8vkvaBl`PxjE@v5d&ATGQp2#pv&YWUoL=9Uk>fUt4o=aAhi1~TSrpI zS-lY!;ynwbefG-U#_aCbPgIkqW-b5M7i#ihhDL&lJ~3;fkaCTA^DJ*DiP4~hxv8jB z$31N*6Qu`i>PItSHGl6H3s>N0n)%U?2|xDb%T1b}+SPzR+|RGlGAo)8l!W6|uup0_ zc~iwR)nlQX#IWDpVj;2&QDj2Njr`s`awxkK``T2Cy`NcuYvXRu-Le$-{6DxN!IyVr z3Lmf)qTYp*VH#`kc{0DRT}F{Gy3#FH&eqHycy)>ZnSLC9ZY^WShSi)n?UB0}CAW3P zSGxIyOnZFTCm8Hq^`ZaJG4l01nZrCaw^UibFPaFxwf=rq;(F-gI8qTELQIc9ElcC8Mob@ zW7hpl;Sz)yAfmhEq5{Xg^no) zzF~cLK^c=@f!oPNrdNf74)}s~AV!W3H@Hc8;DvT_MkFBca$K>3GK1Z!pFiuL7eR$y zGBWvmJkcy8>%VO_%yuYbQ67An?W2ab-!&Go@ik&=?FKbb2NGlDR%9wL4V)EOOs*9Y zP@MdPrmBRbws94nR;~J;e5Pu@UXh+nF z)f1YR^JD6{i!Y058)Ya8I07^d5{m!=!WI^X<%%EhLw^WP=IdWge$GN?TPKaQ-l(_g z%oNChJu0i8bQ01K!@Y;TCWL5ljz`q@E6EYzYJtO%G>C2V{FaV&NXbE zNrHKeR>R6Ie=ofKnwav_Z|DJBhANTQ=Q<>j?CorgL%Zy;|yVK<&?CR=D8Eqy{ z3OPv^82MS7{|qRMb8#CKTZSqu5*g3`3MTDd2vq?APAo@2r;KFV5Hue|0)YU(o`6q@ zp@Nh3g)>%_vFXqWaNSdXVvVMKqg(wwi;Y31jGQ+M4X!_xzA(!W7EKkaHeo9WI^L74 zwaQ{YZmo-HIc_*E66S`Zo%yA2)rDo>>I}t-ZTwn7p0cs$u3+Yi&FwuEsIlO*aC%@XRtMhQ}f!A1RqNP z56Vuc{ik)S%&xegPLLU5A|n=0<_a06*r_th@ti7G=G~7ykdbmbksc~$L^}$KTsdCnJH3irLag)j-$|E3f3EE(u3**yW9#A z;eSFPgV?M!>@RegHPp!R5m%@iI>A=|QFbyMR^~lzsL|v#Jq?N6pB|uBzreT)M_~=- zUR+iK{QtJF0KM{_V~F1}!^Uj6N>(*Kpn!!bY@~015~`}iUw8{Yv%q0gU0e*NdJ>q4 z`s*-mwX(CSN;LMmI&xGz(MvpfKLd-ydNH^Rg#5gFy&r$mjA=*Cjj<{4;7N4A{4}1Y zwnl}4GF}V}7o)Yt4qN>bnqrej}%H#--MT9helM)r36-h)?!K zp-qbXU|>{XniToXTVKKjLV-}S;D<%p0>RMvUKXiz$s|^Cr4!N$Jt;s_CAiCKG%X_8 z`9?sECp&MpdvhrS4#)O3(t;qq_$}FtL=-ApcqGMM8E7Qor;l zonXG3@uPng*(R5O~wW?bWc@pmS^l;jr5b+dX*D8K-cDeW1cPU z&uK^0ASHw(IUxwu56%@sP&lUC5qBI4HEa9q#S2$jx2pTWm--5iuFEIYG?I~p|6tvTR zsQGOp6f{d>bG!F$Ag@qfMKa?M;b*h2k~jOVGUKdMx(T^H6w%5p!D;2eu0Ah#L;g@O zcO-5c-V8w~k;dekN64E#{RR?^&gBlQy5v$J`LFqUoqht3`)@4ZM7@|(fw%`eo(mbE zUsaQW`F|sfMH|zBm#0%;;o%_QDu8;CxQ&=~t*O2^jUm1B6g_~#5&Y@@BI$pf7I;Z; z`vDHk7?bhev73qo1%(O9p33qAiXNant$M(P(R)%mH=kpyzSB}lJ>l-LdIs8X_8auk zkbtty?KcYlWK;IXmEUV!qG$e>fPp%6q%rTSGe2o>VObrKAWa7p?)UMxRsthcVL3j(sT{+O?>YI!-*1oQMED>&^JdY0a?H73S4f7QEyFl>^JFEBbs z+!_XRVNu@_|8E~!0H>NiWtxu<(NKQ#6@{AX6c}3EdLITp7BRMm{CzB9FDCnzBg%@M zWe0@xwyvR#(gGp9f~+HA6+By(ML)1NG=ED2%DRYZbMJf6@lB(AQLWwh5uI!^egcD8(NgIb)7ez zL~zx0Z@DuLx*n7hBg%*v{axt)7x*TZ62daDNxPOG#eEi|76Hr2=*cJw;%rZ^BM0!H z&om}b&FILe(=|x`DntWWUrw_nY~vc%aK!Qxzr8q{UI!w4(GSjSF=?vWxjoF<6;-;d zc{cyxsvBB};wE@XMY>*(j_a}AJ`9A^Bcxu&iW)fEfxn$tU8ArLFzQPR^uvZ68yVxu zh!j|Wcj^>U*@#A7C_FTDyT@vAJ^-2uU})lqyuk;szt2FZ2q9Dz7}wYs;pO9NnHqzbWoB|uOo4Z12HJh*u1f|8Qy07 z=#Kj<-W|}^L}5`7=577;hE{iL?j$|uSk+o2_e09_34FLTu==?b^ zm$|XzzKD8o4x+ppkmy?QXr*G7c4AyFxq7*y&)BG%o=c3CKlGoCG+z1W#RIf{Hhoem zGz4D^8EWsFw$V{9(g@2YxlmdkaWu?Hsrz%WKs5+`>Z>vfmOgB?Geh?2TG5o&dd^Qq)r1b@P>!><$e%CLhAjKhUB(bx63s; zpoUc zq^64b@@2%+qN}0K(pGF*rnA|X54>Cr3?ftY*Sf2?k`;W9NQ*uQC4hUSb46=uXB#i4 z8EWdQvQ}+C%T$+7jOr{@LAQy>Z$g(US+XBF{L9EmD5r~sEc@c=d&%ev>h9`~kC7vp z^;f|>Q6Uk*CW=#8YN~SGpngCJm)ChRRyBGX<3z(OLa6g^3vzmVe#nJQd!Nb%_^%O$ zEkWFgWz~h14BVxk!T^Ha*tx7fCo$&lIv9Y5FaWMC6J(xC!@}h&0og7Y5)~7Ra2-Bd zb#v)Aw{zVwU2!9EaK*Ee^45z#$^B&PE>Audu0ADE#cO)J&sUI3e(+CsP_v^)w|to) zKe}gGPziZohjjI-8Y)05JFNfwTtC`!mF2ei6D_^S==+p$qA!WESB`5BW8Xu)n~liz zeiMjMS4{lA5zG&eCc!C5YWG!=`w^g}LWU@W|F+xYmE&~0 zFeBu%75tlLfp=jbIs=T2^`F;0L)r!SR`&N!%oD*56pE*3sg%lRp5?c2PWO)omRLrz zC!IPSlIu!nWn(E4!6UIr)ePbX~S=$8;HRKS~KVM{#rA= z0OOv;H!CHi&z0>Ag@q>S03%8u2lJ$$gc6FbpWm*RhkT#qBrdFDpY^S5Ep!VF{e+TK z*Mf*@&5C!U!>5RW>Syu{!-4MQm!OhPQc!!AW0mi5j*T4*kyYrhO_6k&%*-yO#nsFy zbTs=9w|*YldCVO+(o|uo>gqz;NDx4^vshptoB)cgr%uY!D?_d#;CA?o&fw@|setKt zMRb)&tf1iYQt+D8quhmw0h6r73t9AP<^UNuh2j@CG}^Y{6>oNy-PRfGdKc|dq7VhNA)3j9b-~&5 z4$>Q}+{}g!rzBa~tSFunkzRV?tBR^ry<3U?#-_AZHvrW;QA|$|i*5Sp*~VgP>6Ozd zJB1i6Uf25)Crw(;NNKfYu6ebfQede_;D0U^*rTS_$}oWXp}r zBc1y2!jY{8>t_4C_K4`L@2VR7rj@r>H?)exkk6(eyjYgt*XrnbzZnibuYWR3o?jLv zBlDefvtXUUw}+-J#_VDLJ86tMIIxOz{u+SCm<4dn+h!+t>vQ-tCX95ug_RVs9qDTh zfuJrtbNBom=KQE~2E|a8ZP@~5HiNWJo7)j&XBuT<-@I4y!hWc=%wVcj$>YR1cDB|i zx1WQ%S`q|VmZ67#M0HH|^^2e4bI!FSS=UAY-}Ae|fT|VC%05Wgt9#Lw@T;)XvuK_j zsTSHV5t`Xq6O*T5CfWdKWdGXpnbszVtV&vVZ56p6edAKF{0N_#Z-83tJxJ(Jqzu4y z5JVN9J>Ib@eW&#YauNhV{NF?EuY}<*vI3MR^*2mD?bvEh=QZ2*7}1eUzYx`uvXNer!#4YY_gzjIsIuW;g126 zq+M~=P;+V^5-3qKPijb$f?)dil;*h|sg#YSk}9i#21)a>rzKP8lZcvGNGY9CRmyNT>ZiBk+W|Os&70@E^h0%_P81x8*v@Q&mm?L* zE97&M%`HW+nZMJEDFm_GjMAT#upV_F_MM*<&?#=!S!0#x8>QYxPx4k!VuY#^JSEGy zY}v!4-q&R;XJEkM8FUxwsqP}R$hK;!MFA;t%Aw^-?t^)=Fs|tMkt7Osu9;Zjoq`xn z41i+WVct!krL1{FMtnk1X$sN;98~hmQG1^TSWWX{j;f2Jli|X$`n|+O^dCkpv&&^w zc5H-Ttxb0Cdob78!&Ychdhw2*KlQ0#&~&0yXYB7I`Cjr(*1eA%cYYQE(d(&HU_f=e zzD0jw_Wt1)M2-HRru)#xR$xFCdT9ihri8ZN9Z|Q?#Lf&cFo$e7K_L`+A&n^KdHwxVC zR)M`p0(97ze{LaTm8gMf)cJ&t@_gUiJgBHVvN5S|2@PlXTrw?A_ShLz%H=TsIMtgtL&%^y~gVsC#PBv)$ z^e2|nJe8py=f|&9?-tOQ^(iflnq>owEM~UW?efwN*Wl3cRE0kbI@Qfj+BUlwQ}sxh zLj#^}sWuvEk}&WX!$xiezL3V2nU*`5x7^yjI@h@x%s z`Pw{D{%(}iW0QrV&tucc56f6T$b&=gb#e>=iwBmbFvD_P3OmE<%ap^quwRK?3)5e2 z=%q*lrzO4zZ0U+x`z`0+wN9jC1S9{rkLOv;mLjxG-ah)J<;aHx8Z=1TGJVD*t7m$K zdF$S39?^QM-sBOI2a)Fhcx95&!_=FFq{&iXeD{91t2!T58wF%G-Rv)QP;;eFc%HF# ziOtqx4zveQGd^Y+&cZ%s?OO4Go}iViHfIIEN06fli_s6|4q|0oEuwniu*ZVmDu*1n zD+&~jz#MSlHzO86W6N9CS8Mr=^`z~rcqKC4AqZjZfQTlu-#A+VG(2@}E0mdsG)cNG ztDrYvU-Hi*H1n!QbBE04Os&E?vdhIjP3E`mzef`0E}x@N@avE{Og23lKx;J#y~z01 zARla{B!A-UcyNs95q)yXJ{F(PyV~VUwwyFxc7T{SIqJ>$?HK(8V*{Yh1hUw+qPp|> zx<>_4VW8*y#vRNtWd;6SWPy5vgCo+L#IZyRCi{%(fPua=+<~;)p=&fmlTG=(0nMKl z3+#lAl0u4XMFU3a?<8@7h@kYy1mm}64IXteSY3yFGpUDsr@E~K#7Xv$kSBplX%hLL zJX4>bNCKXztaiXaDi0g?zq$`6+rM}|i4p`nV1pv>Sn7rh*5}tcr;f6r4O$+u9x+Dx zkI?Z1n{l@Wqffsufg}ccq+N=y>j;m*Qba^K_{=ATrV=$UuRLH{rssTIMl@zg-Z^943gSO6iK$JHiD!OBq*+M4#$ z<8XZTsESW7M$OI=>EZLC+-8K%Shm|s>=wqQ;NQplStLs0AxrE zl+j}`{AwwquUbjfv>%Xy)Ux@u+EoUy;LiWn4{vJ@z|85be!4xe(SZF{VvQdGMfCf9 z%*9dEF~hUhAhT;~^WJRcSN_$vj09TTRQ>rLCMD>^4f$$?vg07j8rsx#1?CsI0Pf}% zsqeOh<~<}}76Mpmv`1rmH7DMd45oqPIq^1x|3n++EZoYIKBvQk@?H zH?}&_g0#@_eucj=9x+-lM_Yb5Tf*#`3kqXRd8K?_{pqB*f@R22TXQpwO!WV{TQYLu zm-YLD9PkH$_$0}R18`C@}Je+JJ-70kdG{mv| ze9tkVUmkmHMN<;eGLsBSV@OA?0Q}2x1=@oah)PTrk*O^$oV%??CCMP?oc(m*Ek5b1 z5FebePk}3PscRS;3-Dy+jALrzhtLGf*w3!|z)%vG!XfoZB7L50gCqZVq{%9GEzS0L zo@hD75O?uV34nh)#wT@}+A^XJ;WKkZEwK(lJ{w>wl9 z0%hZZub2+*m_56#>o{{O+{uG8E*#e8Z}||dqtU5|655o!(vDkivHT$B$N8I<;Q@h8 zU0T&T%J@-Tuc_ow-4{D&;F~_Hr>90ul9gO&L@tR267ml8;lwDS@bQGt$%MN7%xx7% z?Qy!itYa>RMdZ33!$$iwKrO6vo|{yczPb-8Q48EzX@n&6ReVJ=dl19AS@Kcrav>KJ zQBsxe-R{rerpN%M6Ng+)3#?cHQ&@`B>pssr+V|I?RVj1l9&Xup7D!y)8+wLoGP?%}1bVQ+U<00@Xrx6LuGenD#S zMcdhz!M)W7UzCdq&FB+qfw&zS=2Xz`dRJ)Au*cM4*WNmajU6>+8{q1bv#C=@4VZD z6IQtm%)dI`wQ*zz0Yg^p!m`Fk@+K3`Z}vyV*G!OFe-|2C@;H@-%;NW_=xyQvFh{tlu9izJ9FyPN@F2ON zoXSJ?_Jo;luAmShCFjYE0#_iNt{Gc#8&JHr7L_*H(@NVVG_pn9vXK;w^7^tA-EV(5 zznN=g8X25lG{@DuqABebK;q}T*kF-?iYjAYE!O;nM@glxWdXwh^_M=1AiO9XK(cZpGh%Ms6QjQuMHB|IlFW+2gLlh0TApA)qweoQZ7}@^8 z+h^=>%`XyCXQ@1CZQ9Ka$`^^0xUs!Z>os&2b5D)#Y(7!26*-p4iRXScbbP%0x`R=@ z!{O3~=!$P@)nSy~S~uK42k>WxXphO~7Yy1brx6MQ>^p!*Twtjw`%=>!qktnR2(!{K zRXo}l8ABpP5TWN9%0N{eIK~X~1UT^7-ff8)D-@oFhd+@RD-wL3OGrz(L4Tf^Ul~}M zit|3f=MECZfgm)=1tW9yTi96|^_Q2MLw%Bju)s1gsZsnsTeL zHH_3S|1*fiFAMc^ghVH*etwBtqidq!rQWahS4sh94Y5uKnS53jJ;*E@W zGUVpJ-ri9WP7c|hyH2^Lyg!d#?Sv|xv^2ade+MRV8}APemrhs4Pw&Em0FXg63kXnu zS)CD+^TU#VWgDR|$5dZd^v}^?llz;+05QNs?*0EdTOPp97NYAWS`KmKpcb&TQ1b=G zLMTMQjG~?HJd?Y#f@wwFihFx+gbaarZx!y#F@raW8*vz(asoa_O2F8e6e(E*Cv8EkVqWJ`{2am zTZTL~yv#^f#r>8<{uQ%CtbOfEF6t@XNhFDA^$G(MDl&Qnun6Yu1o_vxW*-y!t^RMk z^&EzWu44<$1|0D5_^*WiC!8bF+9$HQEP!-F0+pS>)YCJ{bvC{;t65Q8vvKdUJQldR$g*Gst}b9=UVO(_7mq7ZLwuXJ*r@opFu$Qy zjQBHTxJ`+Wo0eu`V~cl9Qy%t|KPR~TtQq*gL{Ft8&0<3iCXkwWIwPVFhIP}p22R7%sco0#8DLyK8&d^sC`)T)TdKZvjuE{rqZla+f9iD;Tomy_{Q< zN5S=a)(rV#i6t>R0yl&00cZ@*j$8n#B2_6m!{fNq<=hFu`O1~bGgu`+E*_6Ne*(Dw zbSqT-hPZYo^CQ8gwvP066$PNH@D1QA%eQN@O51fyQ2&u?Z>;LMBz`Fx}RVL z!Tw;MAvT4dAB5NFf#R@j)yS6d=QHbh{J?&`{K$W%$K>*FT?4(wHz3J0QA^h-^{phN zg^il@(cH4Th+jE)Af&#&U_xNO+aK5mr+)2)jRPa=dQt?7@$Y8_E;&PKXx#78Vv?UoLEK0Y?8#qZD8vv>A0F7@6Z6Pf-kk9|3Q(8w#rA_(OvZC)!cVVvEOiU zV?{SgQ$(nF);cX!tlKE4P}NE{fteqa-RUgO2+|EpZQF41S#)50G6$gBF9*y|!he^M z)7({~qeX&AzzCbnpu+Wie+*1hDwa>UpuFX%yWm7B0ux6{tkB?5TGc1msH8U}3(Q1( z=V7_hx*2?HC98!c$dT)GIsASy_@i&|qNmY^7+MsaML*>K92$dv9U1{Qcqwi$u4#DI z90K}2S^|Pf0C4oE86({+bR%HsNAJrG@9g|FMvUZyZc>u-6j~^O^6{IaqPzsIN1+S7 z8|f1*>E0+UaJ`wVZ6edQ$ym{VV-_@Imi#e!E>J+Q3J)tuER{NP0`k4#bAo>($t!f> ziZr<^+d9A3^Hca~+cVWM7HlHD0BXVe`endfvY!AF07FEdc$4#TGRhi9$6jXJTjNK1 z`}sZEBeVw9Ufzq27W{j;oE2P+myN#OFab!L)kLvh3=I}MmR|DK^eUwrNmP8fQXUP# zvzF?p%3w|L7u)HAOwIbTZBCxM$Q7L|-67SP0;*WE|BtGF436yk-*DmBwryi#ClgL= z+nLzx*tRFOZ6}jtV%xSe@zeAD{hvDLyxHmAySgf`R;~5f_kCT8`{f#}9_bpLb-f!c zQ#DgZe@Ki&_J3Xio;JC!S{Srn6PmtDKKucL?2(pNY1@tqz1D8G;OE+oNrnh8>Ti0f$}t4ZOsIZ8ZoKb%!ezrF~r149mQGPdt-nd+pJgH`hU~_1pUA0pF`*q-k_qdqaarT zuwQB_x%?X-<t)i3G}Qbpw?bC(*l~a?>PObQy@qJ0?F*J<=LY7@S^dx| znf$QJQehF7occFxtT_q2=T7FkETT0F%xIHuy>jeO^5QX}J>#vOzms#Qsb$e%O&h;?;vb7#Q zvSwOo@h{dN6ffkE&~jH(TCFq?M?yJgdv4jjVXtkb5{1~ke<4@zT%~t@e(Wa!juZo( zhywe|>EHLtm9$*0I#^H)mYXxfVgs%X+ezpUwf>YUZ={)-07F!7aX#?>w;@c^M1Vp} z%O?VAjX2r=K|vVOg!rJL0Vi0v;abW*Qlbjd^Idhq=(Pa^i6ALvUW}^9l8H%7{};5U z-!g1<{Rx(!>Y8AB>G*lR-b=pOZS-93P@`}rAY5F=*oWY0Hph*v(yO-9EE_=pi>m( zr(q?vUYECmz5IwnBa+;r?yR^8j?A0v{sWX7xo#;9^wG+I4NqDRci~Y9qEE#Q8&$E% z&>*u0Q}a%u<4eq$t66OltR;{=jZ`*^Ru2`8DzJ?IDKE z3XQZq2*{Cn013+4jzFLh*oZ9K_p%KLa@`w4k{x~C>{N>AT_CD=AReZCz@s)n+-`Nt zm{~@|OlXuZs5|&-akjf11ByU>-cNvYK_d0@dSA!8R)8i~Gn1EXvayG(u5HrY=hz8G z3T6tLNiPrvhNaej_+4G~ib&91f^z=VZ3(FfAVJ`n{wV9O5MZcFz$ z>ASEUvY)D$L`gbf94muFaqrto%L^;& zT;XD{bQEB^!%V>Kl$S&A4W+o?o1kZ_t?CP%vbCOpQ1n$X6spdhXla35?Se zvPSFxf?Y)nPM=7!3K9B!i;b5UKVSR^C`2Ervh2@){dwQE+qbQ^fzV~g5~lz;$hi&w zj*|IkUbC&l~!K?a2HJuV{iSj}_e3_pUevEhIuP|x8J8O_uxw(Co$Bek zcTL~9-`1FDNR+;PLQEBlx?E~KZwLo=fDg^hYl$8GxVApYK^8QK)2cNN!Vs3Z787Xf zUV;88I;*5YS=0J@1W`vJ`gxz$IX8-TQ7-)CT9;MR%STn|?RXf>*UGBZBk2lwy_U9; zMHQwGp>@KxODxg|DY#OIi*?w;+L}K_{_C5WA^^ne7t3#!x|^oMOs(&IwDYzyfD(2h zr!VE!DT4_J7e9kj&ape_GDmnOoZb#iT#&#YcIHmF^sVT;gFpKnLSuHRWnZPPH!#fk zwpSne{?eU)geWO3)`Zm|e zM8F%LLZqxlO|3*-Jy#QHC}N zr4xBLJL^Yy(eiRIMw7gG)J!QIVo>*OqgA-#H5(}+9bnxUjr_3)Wn_w+Lp8qF_qwnChC>v2i|@j90ZZE8{nNoqqRy`XTnSO6TNgy56T79 zApDGNk(1?$`mln%+nE&%zE&4EaPT)K{ov+Q4lV4#V#yIdZWaQCs zG?0|Wd86@W9;Pf-gK4l&wMrh0ArRl2S?r%7lVdmEq48UZR{uK?fbo1w>#u;q00K6F zRRH?5Iwv5J>PBkvJB_}NoPzCq(W%GUkYkouBDi=z7B$9cd~#0H{MVKqgH%G(#x1#H zVyq8~zn-CihtCh;4Zi!fXP2k_v5QV>x+k>MV73Q&c>zYT)S*TU(SaQ07yqb&kOJ#h@ya*XV^>zqi{6tBh4T&@s0?rn@#vaHUZCUNrz68A z%Bqs8#<$ASDCTf3qn?T2V$5mrWtf4LcVh}=g%7zKkYdAxcbWIT7TJcVp3Ux%%Um5% zIq)n3Xre%*>I%~vD#IXz#)|$%k+q_PhB!16bL%UB_`JBu#bG53R%%G1Fauv`e>PVWO+ZX{)3t#fT)BEQ^YWu;jpt8&KJPKoNeUditrALq0yE zj}>eh-u&l@P${qW*$Z{F&p=(x(L%tX4icPM)PW@!CLWo2e$vxOURJNv^Cb!}HobJ2 zRNs(29n@wNnR&!&>pjsn^j9iM}5Q9?LuvB!Qf%7UtQd`&zgY#5p|as+iW z)|qt-_7#Wkp)!+2vLzZC2uXH}MQ6_HApsAOHsGk8JBc0mW_}h*1hYdT8syL_AiorT z4*HDWnfbH%(lX6CLdx3O+T02tol?Bty9+w~hfDXA&0YxY(xs-|pdHmr{E+G+-o6F@ zgc%1fOubJlnhQmINCnY6rKzqs^!W2t&d~*nJ(KG$THNZ_*qkH)Qqd1=Cc(=3 zr+Yf)^-vK!GD?WH=aHsKc>`=n(D=P0Sb_>t?8s`XaL-f&Lk;Spvb9j_McP}961jUYbg}Y}!5Mx?E*|2QeF&1?t4$2gg>d1QrLJEK}$XYSAyPjK%o;wG4d3wRX6L zEw#PX#b``?)}7LYA_0gyZR=n74Sub4jsj^J_=`o{$JpvzZr7b!AB$|vyth-08)L4l z`(-xGlTS6_YB_UWZf~_Tcy7J-;21Rhd(abUu4Gya$S-%K21EydKewa?etkZ;g11Jj z6w6c-ywZkFLUIHAW0|U!$e?K)A65-56^DAxrGk?$^@ zvtji>_$>(!kmLoZLN@#`>%(i!Ln^T8*A_wWc;0>I>0irG+9BaSL+hG189FtPz0qTKj%wa9VSy(P&W_dYNYgU+ZpLknIH+m* znjkB7A6Q%fS8l$GN+uqP^ScCD7&C{qLAyM3!JUoIdxDE2vTv1<;v6CWP1rT0uzkyB zF=rw>mo-4GpQ=IqtUn0aNmhnPiC(Xo;ZyAKG876SgA+2J(oUl8R|v;anR;x@{c|-kQ@bw2hYZ&s^%6x_i5K=iF|g zso6x>-KAQ?K$~!@GW0J@ue7cpt>j4!afW9a7p&zXos z4R|m@EC7Q6`^KFX5CKjPFaXjkPyo-RJB5%71YiF~R&JN-7@Aq!>tf5$;w2{e4F@t# zLB=cY+l10%EoUIoYt2@>{ONm}w;t{k*M0>9qnJhqF9)|ick}ES@yR6;IBW)Jln8R@ z;>Ib8DKcyZ@m%xNa^L1v*4<`hhsGY#GZ6f9brv}}AORm1_}4{o2vcjrELegj5O z65J7xG%Ekzpe`qI+2d+~d_WqhmcX{VDccmtg4s$>QUAYYRs~JFMW7?pLyabWJ5||A zR3_I0Dp_e6&gAEj9Zu#~(}ij>Bev<6IPgdRXatJ2XZYIv&`Df|;8dt^BsRMDSwZ!4-naKUz9g|k7>Pn* z6367G*6niHLAX7G71RgU2@?*h$p=Ub-mabQjct9Kxt(2&gXcvJH4?VNk9^B6+{K91 z8E27^$*+5mL87tfbeNWv!TpW3DZ_HWL^<@%LfHqVQr@fpn{{cXbxfTN$7)k@&2kK< z)u`Jw6Ggw7&|;4><_wAKD$k#R<-9zqRBY35ZO8F0etKYKLx($pqc-UoNUT|PQEEb6 zo@c7O6Fya!Q#|hYBUN9Xg#_STrq_8?7I_ylB8Me-uNV25()>wUTiK$yG6H3$w+Wy3 zH%uz;EK%5#1NM%80c4LkhNTt!tQ&WE`&wmlR) zhnR);epYV~XZmNzFd zC8({jyybDQ8}PE8N65HCI?FXc$e6F4Q5)lyYL?^6+GRpASPJfz{>D3Vd3P>0B9KjM zz0>?`1Wx?vOG@0ot4l8+Dmc8BJNVQRcW&Ek$y|45i&Y1oKOr=jd1?|DKoc<>k_58iVE0uxEb6MEOwuYI29R`E5pGN1_@!TUf7 zm5bhZi=?0kN5}EbBf8nX3y-dlyo!dhug}j|Q><2Oa&}+YYVjHdMUz=hfsh0Ql(=i!vB^fjSE$ZQ!JNp=!S^$^O!a)6M$CWr(dhr7R{w|5yaYx zKonzr({SgMCepJR6bsMn%u|)Y(;x^sbm|u}fzhx$Ak^Oc+=0iuaMk~tioQF28z%hS z5Ea}d^pUnk-7kIh^r-;JYD7S7FxoKq#DaCc;QrE8DfRcjyxBDwi_k?`hW&V*3aX_y z^&nCsxIAM85nvLyu&hDwqSV1!d&G#;UR z=T|+z{rxTBE||ZU<}NrdayBJPEOT){!>+7H6O3GA?Amd?1u^o~yQHR<)rP?-4|;lA z?-1(-jn31nVxx52w_;2f|p=uto-h5WDX^Y}!+TaD_E)xANW{~Lns#muJvU-CLhB%U^j&=4M!HO&F| zIutOOHf=}1g)nmchT#QP{au+17Ki6sfITD_S6GV#l0*j$9E6)8pYZF`2e(yJRacVI z#UK4Hg6X(|htv6Ar(}sTXJn~Gd#y@rk=wa+tbzKK37+Gb=|`qDKW- z6?8lZ3!q9Lh)R<^6A~a72PVPa))CdR&qed!Q0Va3;`|IF16raqTBVoD1zQZ(0Byb zSUe^%-MS4jh7E8D%1xU9-><2CP(Ta70^$|XeTOcyw8vED@J5YoB!x4;PoHzRA?&^tEPq*lU(xisa#$~K+Xv5g+ zWSe?|B=>JGbw4_mIDdY|$NC$f6S*M3pADat6$UUicuTDLaWRY{lCxDfGbzvj%H;j9 zIIG#|!>;bqW7Xm((@oC8xz>Q#pQ=SVz^O^2Qg2%aYcUwP3gKvI%5w@>K&?uJf8!jj z?we~sG!{5q@oW`A)66`|eysNHIc_}W`=h}9gE}YVlix9QlJ}2!wkyJJ-nir83Y5w3 zy&lAxYfbQQdO7n9kX44xQ;1Q>Jli16(~L4XfAI!2z9fMkhvkjQxz`Mb(iVgPHdA;c z1e5JXlABN(&sCs5QyP~65m@yGhf7r22o{U#)WURH-S$D;cupIO(ePtN5H+~w{!57L zft8`SeXfHDI~_(64v*^J{LfnpKy`aDV|KJQBddNnq;~ab*)C}TY)7y)(~c5ageUn*8b}^adE?0ROyATzdTbul(gemTcu08gLc- z+Z@85Y~zXWk7dw{^L>_hS+U3_H{NyMo%Z-PAHzQGkW0VR_|xjy|DR+v=YOh_{{=WW ztAS4EH&mhhvZygdW zv#Xttopg+j*7g6FV>cC8f`hm6)*=lXRVxR=D)_)CxF{VmMRzgEU2bf&l8c9qEE`_V zpsWOwbfTz50%OgT2=~crEVIxM4H=ITD9oJJSoA}_2e7}DWtQ~-BL8S&a-mYHIRA93 zPrTf8PhphuY=52Oo^xQalqpx`$>oApri{1M{KtEgT%q2G8dN0Rj^HdE;;Fj3dQq^o zZhPbG19HjJ`7@gCNA+``*asBs-ZD15d0Ddk|6kl)37}bzP|)C`4k6+{n%H6Uy!gBT zfPLm>b#)rZ-Q_n&clt>uXh!&0>EJUwWG)RuKhd2iGQG&OsghzOdbt>yvX1Pt=l0g^jtX4rwhQ=sY&Od2bHO)ic|JZXMs3Mb zCe2nVZ&%4_wf?Hux%L+FkR6buEv{1sglCa6ojrFD7C9%Ap{V0t1_Ssbf>_GDk|qJ? z2BYsnyZt6n%Vkb-R#5BM=$7Lu*`k(HSsL{e3FR&Hz8S5o82fS=8vBMrxp;vkvi=b) zs|F+4-ye0wU`;7HA~G0*YaqSs$1CpKL$q}I<9eD`(o=eE(#-a+)puFZw4ikX8tpe4 zQp_z(TI+Sc%=vc)|41;msB``(5N9Aksw7cKh-i=gY#`oBqM^x6d-P`R*-CfCvH7t{ zFf+^4e7#8&jYRQ49PF&;Z?95@Fv~EtWA!ClI5^1lr|WSJni0$MQnEJaJty}ZZzep+ zrL@D{L7(%*wfNXKl4c>=j=94Ou-J3e@uTO7YrRu{XQx;=J6kOKgFY)u-o#cLkQA03 zjqpvU)@*kH8xOFh8cM=5Oj|XY#F`%5kaEKwl!JRQVQ3KEPthfb(-GBAv41nY1B-Jp zXBX+4@(uxUK7MIo#e*2;2>aD+VS(f=g=B)UR1q(RhkNc!mzl{(>^8Pr^jqFtv9`6=Yn^0NTz7N#y(MB5(NXW<88uPh4@cO&EDWl+ z?5XG&1V_IqoFz}XX0o5(v4^f7En$RccG&mq+=O8C6hQuK)HwUZ%H;f(tg$Q&#YX3% zFNBhv9V^GZ@O@x0LvHFPz{xy`d63Et7LJC~y&qOV1lAXYlT?%LI{g067?M}btBk9y z?4u$=(M~t*EavpG8=yz6v`0B|jBO(6KoDh69+`C;XAtG8X9|~1R%_azs#z$4J5ihH zSnsx%_RZIvEVE16F{Z>UiHLIWnYS&*A@oQB zktBN+Bzp;NAgrn|RV=+?AyhP}!G_8DMV-Ip6wX`L;whM#TJ!xQR{HUIeT)NmIomT9 zN8Eu_-xwkJ?dZ?+Siu+?45`#5%Q54kx%7Q16T_eFvW)G5dL*W z1VAON0GfN6g9i5=)Y0|vbW1i--(an6;&Nyplk}+V3Ej{dI3<^^lusOHsB(JjrINH> z=a1cEw}3S~ZD0*AbI?xw@9^d4c{Q+x#|kkm+75vgPhfLKIVh!3tG;u-i1 zdPUzx=i6y}Kx{2QzL$w9;wGJbRPTr5FW-gB0i&ph%0v|T3~zG$#C_LxY8ewzz4JL4 z-LWik(vqxy^Jw7ON^aE7`=`;x0d43?)#{5wkc;BOqh3`oo~lN|T@0+_#Dy#)dTN}l zx0RTC#grKy5|*yae|ooQyy~UWMRIMMs@Y7>dJIZjBil(4%qGQ4BP}crHUTt!9tVs2t=2fWR7Ol3>{{L z+Q^MH!A*HHhb8RvCyJOzPdJIv^E4!;qV+n01;q#c!ODKr5Wy4eOOn_nBzTw8Fq$)4OH#CQ zxDOU4rgz_GRI)|U{X@1XO=&YOdJ6?NW=fqH=Gag%{zQ$wLI3h2J*jN;LWB8NT6KRx zlYVmQk5Y6Dwl`bAGM(cUe_9H$Ug~4|z;}gIwG2RJ$5bS|kYOf`ijMnXK8UuF{{01U zD@9=chwJJe=WQbH!i=$F5B}Y3F@eVTF}2j=PZgn*Eb4mtMb7z{Ui%>7lI%T*r{PAVGQu-YOaeDv(p$uR*AB7$5F%-~7!WWOU-2Yjkg zqDTO&o$tpiNUo$a7ES&Low_9%%*~|(q$n%pCF0~Gqnm~Sld5QeJ12?d88aZZ!pVx? zsv)DimpVc2ik6iA5}jKg6S6KNX@Y4yMc@IaN7vM<8#2I`P%|pdRc+;hEgo5g`|ggX za(r(NqlJ>&ivxh;bqDac2&PA}Fzqs-=5uQ>p;j1_-@w99-IP(_ zrm>bI4$t-B>jM#Pwv~UtmI!Vd;g8jMAT0P!OqxrNy=VAc5DVL@%!V3R)ZUx4DOG$I zn*5oY^$NY`q=c1JRacT(%=vav1LxH$x@#Bm{k}^7sPRaiOgE^CnNYpCykor}4Fa$o z{X1Q{J?NUy=X&SOYG>V6gmSq0W)i|@*4PVr`#JPl4#Kmfts1g~%+IJ!?pwA=P^&of z`5o2lfwG?+r9OYvD?}TPER(;tiIX%I&9aj;ol%s*mcRxmuE7r&sQ-P zS=#e$pJ-~ClarzP0IhrdDqhavjlWnLhHCf9-$4j>q}>w+!*N1ighEKYzx`V%fk|SZ zSw))Wwnp+^NC@d%`!wSB-*(si_ zI#W#x#o^y}^rjN;|8i%)(EMwf)Jh1+N^a-KNb)}d$E4j9GB{^BWa>N>T@>>?FWiFV z4G~1xS+<<0OECty-JYo1Q&A1+wvpU3s!9pIfXp7kk8gy&xQ=ywFx2Y)Y~qZK6b7+^ ze#WLqcdfxnr-Uz9=8O?+NV$}rLS9_PV|)@k+{0xoXcqYLbblRwc=%}$Sf;R#7sZgi zYaSdj1hcL)EmiKAFUP9qBK#U#)BDv&1)&vYNx-3tW&)WKYm$BdAJ9(Jt;8UYk8n?! z0AO{ZFJIyf|A7M>lS;BAbDV+$$E35UQi<+DHr4{~A%`(D%Ed8{)e={8O-sh)KnE2& zjZIKYaPyg_4O3V^@M={CF)_n;U=d^=SOkHgh+9sV{Ohr3`d!xU{TkS{7GdOOM$?U? zgOP{ma(SKGQG+MbpR~yFmlqR@3Ef`=obA<^KtZAAFfrkL*ADf+fFEW(F5?Lqq&5pr zROZ%_pcEMMgnu6L80QvbWeAH8OEmQCrRalFDR*Un$MpBAFEcSHb7tDc;_2L+S6TJ()T@<^}YC3JKdg zUB(4rUj^M5#>Iq~6x)>6MhfBu!R+SYPoIx%6XUP^YRw$;lcRTGn96ss47ieQYhI9+ zri$!m=U|fOQBi%eCHM)iXZG{mFN@cZNatxN$I*#^t+zc2*(3c^6bF&_L z3mq2auJ ziPpzJ*l7V&q)`x_vMT)+NNOf%w75@3KB*5Ow2jhVOmOi|M-SMgXRTCd-JOt<3w}Qn zic%#1*WWAgcMkehUgl!cKTk3cKlpx1d7co>G+q^ojqAW+cYom!;<-3V0qjXLQ@`>@ zThC<(2RR^KBSM}GE!#ST=}7gKfNl-(1Xpg@_YJj5 z@ROAXl-CfT7yHUZ!hPdM={wr!( z)1r-tdAU+tUZH|y!<0buZ)c2~Lm^BA7Di9FzP>4vqA+5f4)rF8L^b~7Ss6ByIv7FN zL8g>k4lC`L!+O*q9w1GU5Z2$Gl(+?SlSu8?@NYTHWrm|+ewiB7_nVe=26YW^<6mh} zS$|u!80sB`)#s=?*o`x#!=+v3qVGzjn;NZs=ZiFNo4AIWpzYN&`Unqf*-Z4OiFu!M z-U!QpieRF*%NtQBXdRgyNa?QF>5A6pOZClfeBo-wN*XCIKFslit(C)d7uJx97ax_+ zIc7?*b{n|EG}vV*^?wfNz`9vfZFy z0qVHbT0OM+rEaa8<^ctAOX5iVV8A>HntEziYL}HFkcap;o}nBT@3>uu20DQNi3d6H z-Vq1gB?88a{mqEy?TMPG07f#Bwy8@vkd`0>%nH>Q)v-x8zj0^LttVbYo9iBO-stAT zUUIu_OVwzARyihm~ldsz3n}!sig~`uMX-k!~H)#_>#fg^FKcL6c7*o5c~8G z55C|0D=HL-2M0K8oxTm@?1tfnZ7gCw^GI&e5~QW$FvA+9w`Z9O^Q?Ay=ab2n(Z*=y zJGLXjW+I7!F#z|R9r1OmIoO_Tkq~R&Q=UxBkZ62;>s5i?*R(@IMStuZMvA0a}ZhP2KAHV?C2XSvp*52ypa)lH4}Zke`eBfYa}`}h z7h%;5pwu9PRv=zZY|H4BJwRTJY?_yfy-%6}~G=l#78;QnW>p+fm3>;rb22I}YxQC!d($PEvK zO{-0Rk*~;W>%{u2ma?Z9cSlDW;a}0cu?jH zmP5V`3goC1j;B&u8{QGE$t#W+R`0uOfcq5-PZd6{iRD;QrpR%G&W4T*{pT7*Tir@W zOi-hODT1-??Q6&-edC7evo%(oU(vzpolcm1$cLBd9W2=I1F{|h%V<|}4mt?|S_3gk zWslI1y0_=|23J>`BTGvSOZ0x#XHRhI9bdx2)pwP)*=qa!`nX>dB5*57?w{fV%rU*p zCB?iWeKJj3yK%u zZJ=RO*H%ReyN$^gP1ZYz9;AEI^!qfZhdQo?gW;=(k+yLB`}m&Pv5b& zxzkEW2w&GfY(U^Cumm<>6Bm^UAi_~4yviEZ5 z4UMuA#iTNJ@L-~biCh96A@@|INRkJJ2!ZQYd5=A8?Obo2%B=BNl5XJ%$f(T{z5pRh zm=!|uyA@Q&TMclE@SX64t+_YP%S>oPi5{PGyMI;~AZDnDHT`(L!^ZqNjtO+>9XPHe z!bFLVVvPAD34#!L|rLJN8>1RV4?g?LpmQ7j82me+XSvChnvA!d2V*^rGe3_ z9`){q=RFybdj!K`Lt@ha=-XfQ(f|{cE~(VaVI>y~v9_Q!QZ=+ic#u)-2ul}>*y-XJ z6DP|*0=WG=uGNDUK5VL5szeae*!Oo86^X2mdCSJT(f9=;FklhzCu+!_i~y>Sk=$-Z zGHQJ{1(aEa)?{U|5JPvnEFEC}hd+-l=jeT2jcl}OjflEeHC=@dklgDy!5uZ5JKRIn z7|3G8h(u8ApV-$P0v*E`*S)*S@7$JVqLg~io7otFEJC{O*E-{atGYF>DYFlfS3^X-?C8ktro?|oyR2mxzmUsSrWoW ziuz{5vqr{T@PEDlywoI+wI2q{KZ~_}IP7RBI+1>;K&sf^H#ni950r2SIm^Sn21_@6 zin+otAzl7bGxUz%gIx#M?VgxEmVXE}f0aIcojiR>*i2VL`Bv1l5;qymti!{2!^dn8 zX58oHD*Z)b{e0;LAMI)U+6~_i5~7w0OKcshMqWiHjZ@bJwDn62mCWSefA$ybjRFe& zgd2-!eeYgLIkNXJlG2b%Xw7#PO79%$h)eHoPYwq|(gGixG+qqXgpnHeH~tbc;r}Lb z8F7a{I4TbGoA?nD+}_y4XV$fSpw+mUg4`~jR}FdW`XTiUn+GQGW%dl)*H(WkDAJtG zgAgN>+_4XYqxFofC$Qrdre(exnBQrpL|`KxL@+y zTJZ*mDO8saQkj9bfQ<#|k^a=Z$Q}UEi_Z`I1ucbo0QzK_1jV-w(zeRO<2ieBYQ`@t z91gysh6Mu(3+};9`UHY#1GBIS-Zwc$8!UmW2+|(NpQnxQpF%8*2myNb+8)pb65Y2g zjD7)Y1ZV{F5?v(G;DgpcL0=Gux;Q%CHMBr}!4&hq)FAO^T-nD)>|-VZiD!m5ID^$& zy4O&&a`R`KS%baUKRo~e=~x3vUR_)PJu@UOn*r^Eaf8$hxCoeP0jayZM)BfxTH^(Q zv_%wHN1>As&EQ7ACya%t8*WP@c=D6wm1U%_m7^O zyoSuOluB&Wz6J+~E{Od}CQ@(urv@*=j4249A)sT;%U{or8N{$DOn4)hhug=;XXUbs zA3%Cxh|K54Wl>@Pf3n6W>>jpp6HCX5drKy}C0R|^HMN?4WO4Dlfk z2k~01nxw3em^MFa7Nj0^snNgc=blTr2mg{2*^-@HmAUaX^I34bgK+o0S#6N;Gmp{D z;mI_N=@A(izui_8oS`KBn!;Vf8fEU70(=>Q-9QB71$??Y5ws{y+>bV^C`J|5s=$UTWM`w0jBGZR5OzS-k~k_BI1w2 ztN=1;kNW_+I`dw5K;j>r7WTV#Vd1m*?ytMsmv!hjoXptrMgYmoaqn-ele5E@JwUD9 zmj!us{{Gbt?Crbc_ZcDjO9V_2zVn^eueElAr(QCdu?jeFh`-#R8#7_(9bt#Mwx)ed zOp05%mc0_9OQ35cFe`&``(Iby)Eaehm0w?qE4*!M?{utvBY$GVrWgA+;fpBV6r9Uo zF5@PUAV3|!gs*1we%emo+VpRG?*P)$&(mw?tuV2-F6@o`7LFydqLWSM=A6P`*2=&Gmu@F#R!*IqA3@QNf#QWDt(Xd|8tNwa9 zA9?6DQ6u?Cp~A<(w_n%CGl2TkXD2uHFet-!q0JY2vAn3D#_ccG4`zDs89?mmL*K*6TWh z+v?^7>FEXbH^i?}cxLYd+su+2fC}Y+V?~2&UD@!y4f}3OeQb@`;^@#Egv2ETag&IP3l-J_vD1(5Gtd)%DXdJN(X`VvDdzJ8KKG&_R2a{&2L zQ)II2xB~v(8eldKDR+s?(_;X0fcP4Pvam7V|I7@1f(Gd5hc<(*e+KzjWVIATA-*v{ znn~{Zj0SfJ*|w+1T{4X8z4uq2d;>7UOwJ!82j>zI033HhYtEjrgO_%Of8hy}cl+m} z^g@1l=2?Dr@n*rEvj3PE;^ok5wcCd?I~1gJco5u~3B%m0j68oYCo}DKu{V&n+rMse&7`A5vIi zq?&3x`E=xstmyM79#tc>g ze6He*C>wt_iYtu9v8pKncPp;$^)=w8VGB!xj22=?;67^BCL^q@%y$Zwx*mLa9!ez)1GvO_#hHu zuzkMX@%Q<8J{d(_XT$aC>cHxT-5F;}u@LG*Gm39vH*ketIU`-wc9L0_=K6;IyovxD zi(r~neIn9qbWr2i6VWqiV6uIh^pdQWhlnn9`9PhF`izc=$pe5V+s2A3u>5uB)U0~l zmA7G_Qpib(tW(UEvt)?wnmV2cd#ETaZ=^*+V?}zoaG~>-;xV)c{dL$X(;#Ziik5cH zfgAbur1cHyA>I{qAw&cnnKKP)i9G$6;12D^Vn?O>09hcXabpbgd(hgEwhat;J=1k) zQ@9--bb(BVL^B}M$5IQrRgyw;$k$-BNts{5f?05?FWz-q3q_6B#n9x;Fso~29xmJ1 zx?AA_JX+vy#-B;{)T9T}+W2r^s?dR>#SC5+w@ZaX{ooIV0n|C4zb|SPm^{km?GqfpF zKrPYAwBrV@84oQKeQcnFR0vP=mKx=r*n8*)tO=~-idi(I29Uj5(8(M}<<>pwIvDk3 zI|5pS8RV+4u6d__yM)2-H)yn?J{vfqBRAUcai#*Y?#sr;3ssyjg@n0n3gGRU+9o*( zpMqVY=d9^HQfd(k`i+xkb8H+tI2wC?K#L|dT0PyRc3}K=#N>chjuk(j0EFYG)JHLAZC`9oS*6{vbccO1oa5ZlVkk zqCm{%);7rRHlf%639B zNXx?|D(ZWkr5AH#DTI?F3uybckfl;%i=1(m*WHVgGx=7rbI32G2~}#rwD6}b;Forg1IIk0m|&g7+20i z>5ZlC7%UUYwLcnXxFTyi^>VA(4FSS4VVy+LXBnA4}Mr!c%?7dlceTg&;Wpg zx$f>Lan(Mhg4ES~x>cA-q(@bpgtMu4m}!p4dljP?TF^x6Wo zBsgZGJH+`P>`%<3=YSBQaGkCGZJBPT&DYfhS#8Z{rtc&Zu$AL5s>mcVRUPIh%b61{LMU3e>Rw`9U@{nn!V`Q8J2;C_$CzRQUz#HSSlvPY zUBc`g-1D1gx_57DpG{+c7E9yU zoCUgr+@4t*0U4Zn$Ck(8ko-P5Ya^{gNzREcX{?TyH^6Kp&rws9@lagDI8@|^YZYuU(PHfQG zCv7-2?KuI_$GOeU5cxUL{|`YxzQ0&zk8^2eQgxA8&m%h$b>CcNV!!qt{bhw=t=CJj z>*h9R+diiLo2+{DK!y;hL0_Wx&(REb@0+ngBCGQOH!Qk!`YEK zO%iuILS!xvN^-1Km3YpLGuI)O&?`jVaQ`wTyM@moTpQ1YlVOJNvuaRcw0f6M-D$)3 zI5S_1d9wj3`q_R?s84QaEiXIO^$c=}o{ckAzM7tacuI#<)g7rYmNO5$e|vhaqE23B zrp^ZlVW`lP@TSvD=!4PXmJz+#)p^wk_-u z1)ASt3U~DMujsYMY4B)Je~2f(prFAn!73X)Ye;Y@$928!arhd*_cdJ(_~H>c5x(m! z*=Kdx=DF8lui^*;3f;3B;dlq zKnV_$I3}Q#7j)P{H5W>6zRBh-{PN_MO@#9W5hI0;z&4k={XOU-f9$1S(qJa*nn|7C zVo1t5q0xDoZNz%{Og^E#acKNdJIf%2blLGcoQ*@j>H)3~>xNuv$_n4dZSv1@vfm17 zr4|Z);0r{tJw<-5sjAqMc@TVQxBZ6AsR!V=A^T9=%>}rMA=P-iR3}>4izcQ#o=lKo zebYSQUz5Qz7O9U$e+SCbH-ELCgU`p4u>3qo3Kps6veJ6XnK40Nw-S+uf+nweYs?kt zwR44L-X6wWl|$)zsZKWo((=Xf_{|&KOI3oX(mbo$y%}U_(eDw=liJ328s>#h*51Ng zVm#LINaknyNTfIU!i9vD(H;gfK}Vkmy-T!HvnI1WbPs!Je@5}#F5V;mkcyFZTGu$D z_lh5($&ZWCQrwY<{T%Q`&}ZSx>4Te<;kPcV;v+YeANswJ?jb@=u{u}ouQ@NVJ>9Gd0w->ldP*%nNcQp>YFSlx(B#dlS(p#n z<23-t7B;%Ke|QG->28jo6fi{wxJ5{Xof~h5>dy$^>Nqq`OoQ(F6Vroik?lg_oX230 zKc=W@TnkpkVD9!DW?x<;EZUE=sH2#4 zdwukfuKdChHD=dq-uqnTyV1BpyfyIBRsF0~^WXf~kT>ZTp`vVV)__1gn@0oixiddrd4 zFDRd9rO15=I*g!bV~a7XNo7@x`yQF{t<{J|e`*Ea#;@22@d3tanBvJ(DQO9Br#s)S zQ^PIjb85rJekUk}mhc5Vrx^hoIgnC{J&)80!>9i(Jh4no|JP{z=vX+BD6Wgx0b;Q4 z=htimo0-|fR!*mClZgf^DIwBX@-!q-B^b>aSGi>73A~5$XX>#X7Ha(7LLaCddox}r ze{%7E&n_0Tp7yb1xdi;=WP61HFLT`O8+9122bQT`Efl&x7kclg$IE`;B#~02BgxrW z$G^EcNoLq$ublVkb8Haq5u$%}UidWp#+z|X0vpR!A;)235j1+j*g+$(9LSo72-_hD zC3X~C3g2cZ+$HvGhU^Bfcv09`5$D9Be||bH-rNfi$egd>fOq19BXBcE7Q)rorcsEn z`iP$5_r|Qpr01)eT?1jio@=ph2oD~GF+;J&mZBA_^Otv(qzqrrUc4E5ep@+>n1^X< z#aK=ub3S->@Qo+#In5h;Sk%kvXj}<>_=j11lGcbxb29}dtbqb#T4| zp2E&AtI_xGNgcN9D|&S}XYkebe=jlIop2|Mx6)_y44iU`QO`RN2!3Xqo$(18Qz;b< zFTtT-F_PelsNjnlEfAk{_%hV~z z^%w(Ule>82+XLV0C8E0bpSVY@_LvU68Av9R73mwvI0@jPX%9h5ulHcGGV$dD(i5D_ z>>$WB@2hNCTLwNXWe;PNfHL()5-R`jMhf8K%Z4{ez;H#n7pwv~bv4>{b&17YA z4_Jjd#3m*4b`mS%NyCNaV!C|ww=2^4@>kLv-V5V2oJ1py0wvh5g&OzUZZ{9%&w^3U zJ=*tBIB;d#f}8NqFfP8peT;5eb{|swA`^$7@X3~4yc<3%Y5G{Ff2@AmoBi2dI(Z0+ z!YxaXhFRbHnpwdUl&-3*vf7IOaUhy1Z8fj7W(dD2Go^T=kUK_v%^&u8&RHVF>04Y$ zY5o^{S=h zEsOP(Sx>TQ^pS;z8B&})oAkZd*lk^9bsBpVlb8z+!i(|mexP(8nyAoHI=_n{RO_F2h5ULQ3Hr5uC(m*B))zz^@R`w~Irl7{7RBsersv z{)vEVZH{EXe?^{GYBdR`cX1bE69;Fjd`L0i?J@9MMegBvwh*dd7Q&bY@x+yN6bmg@ z3c>3-rW>q0Mb-h@(3kxbsZsf_+y}%niwEPv50iEBZ;Kmc#-4K&BlpMDygE?}ICe+n;SRT=jx-n+pH_j<9RcT9G7 zIzf+l{m$vt`+niZsP9yVY26XVxhUI;8uDq_i*U}2YB+;w!E9J14#cSOenfsz3& zV)U@J)5H7V*?0;u$E+i^%qz}_C40t8YQ3wWo*}(33zn3@7Xvo=2M^_k-X=hLl z?7WX8+y2TuU?BDmms`00=&=z($6u)>M#^bOd+Cz)nHuZ;w;Eo=ZgHbqGk6=>2L&db zxH6%>QkI7g>N+?qZAqUY$UvVtA_;wD`-W0)e+~3jQX5G5FtsARE;?+3tVfZv@du); zl2j`g6<-XUS-Z(cd3|)*5sllJ!i8W;IzKl|hSVnH;vlqdy21;lAwizt!J)G(M%kpM z0~UC>otdg27*uLz?HOToh<7C_Go$gXftvNJVUaiZ>E^U44#J{e(61ZsVZJB$D$2y3 ze}Sm7`8Aza>9$+w*_Y!5D?*v;RchDm*Iqh=O?|(p?i7X<$Y!7??vzADjkL-&lWtQr z<#WEqz`qP##UnMu97>Vq$9GFgcaPkp*d|J|=7yURq7Xid#HYQgUcp>~yEMJyd>yM= zF4p+AgY3sO!@K>mYk*$pR9|Mi1siX4f2O0CMuR@Bq$_-DXfxJmO9}D?=K6$3$4riE zstRqlSdRV_K#f1A~J zT`3e|%T`?G8bvB;LzqK^E_zOW_FyaA+mXL2*Q)o~?80T^`+VHfIDg_ajN5CDLX80ug|Gi=!y4E9u5`B%-^wG7Pu*S#11f2;D)V zt)npyzjdLmc^!fBDz>pE>oxe6f8X-OBk;w)$pkz zqDB$)Z?UQ1>%JdUKeN z8#AY4yLLp{5T=OgHa_osduj1;@+=_+_!Wx=r`mWGo@S-Zpubgq{@ku8i16{eRjcBw z>Tais#hXcbWYHOHc=JC|H>$HGSo71iRs!*(207zrnGFf1Hpv-@Tngfn+GF zW!fF5H*EQ3xFxvkGp|^`HqiVE^J|dXS=#$KTqV*+(Y4)6lexe;hX+3Up>^3vvpvql z*u@gmpI$adwz<56d6D)Zi5Of(F_Z3+lLc_Y=c5fC99gIaV%}YjDGJK+xaU-#F13@i z6tdyJEhxCZyr!F$f8NgFa-ZG4nzJ}3Fa-YqhkCgN1vv&%sJW@zU(ixemf9kZ1?|0K zX~HnStRd`ESi~7XaSqX2_whk`m@lM(ZK%bTt@=z8IZ}1{JSv_nr6+r>g$|pewTyFb z+a<|1l;wD}T%0ICOR6kf2k!dW>coY0Edj<+m39%B>_INwe@^yY^Gsd}e3f^wg#WS6 zPZ|+%KRHV=OTtsR3}JEDA5yHw`42o{dPs37y6$( z*GmVt5;rA;HIol7bA9-pX)z6i?8S4Ok>^HS6}oCIqny1=^-?^0Mp2+KFHvuoD{Dh0 zOqb;y2xgqazIvp{=V3OlZ&c4pZWx5DoG`nkr72y{e?;C?hyLOMa_n2av#mhSm%A?| zy;}RVWH<{T40d>qDD)J`QXecSsW@y)Jl~sQE;zb7R{F+6dH)vWR8dc;-=w9m?XF(B z-bQb``6qGce4=Cm{qEIA(_9g9n_!qJg$q$Mdj$Ofn8YUV$Sfgz!r36xSW&DX`k6IQ z7HptFf7zPikPa!RCe%p6!5a0;^tS_XIy+}`~YE>7}BuPNK?;{Xv z;#SM#O0+&^0k)9$ReyI_T!Nnm;(qIFpr*^XwZx5a3y;Z`2mRxU@{4#WixUf&G!Z;1 zHYN<1X6prs+bNp@-A{@0g>EGm80bDaf zgPr3d?;yqX6bLh73HEkdjORD%S_dy_E4|-e$h3>&04LNYCKdzT962MxL|9+PpM$_< ze=iWr1PW?sz6rfaqHr^eCo1?nA&s!VoJ-3q42V3A>?C2Xt>OF>!s%&x+vD8XkSac#nF{)s-bXD)>cGoSLN_Te|L|og$X)P6#XSj67RhzwKyP4VJj5p3K z{{xqzY*8?EWv{gE8-d#ujCuv)VWpY!XwT`C+`NKC=_mU3bv7R>o~>MYmQmSg zU5%h!3@=#N4v9w_KlA5QrZD7Cp#4rDIvIrJU`Vgxl0Lkn?lU#h_1Id3f5#7>AgjHt z%=_JdxS23sZ1;#j*LN)A2e+ECS$7Y z@9!NVH)M(dBnU{7xtTBKcz~YGGQ1{wX%ut;#_WKYur-!BhVTtMZ67)kY7TEEMi<3- z?OejDVR0*Bo}c2$@;U7ve*{OlZL%|r0+&}4);=y^ov}l7^q=vtQ<}YT<|*uHofFh> zs~EbyRv)&y0E8;odxvsSQbnt4j)_j2zan{{d=KCeothRiO(dEilPL`C*Vth6cV;5GPWXf8F}ztE5a`YJ|p=Zvr{Aor}xG_-x(-BEI=?{k%1*$*8A>$2xG8 zi97mKjT%fX=@{F zRV7{D0w8GbvB;~MIPv4N;Ey@vQf6inaSAa~$G10+_MLwwe+0TONF-Ibpf8uwV`Ax3 z_`n-!{kXI=wq0U=z3)Z&8lf#~pPRmt;2y8M>eQ9HwQnNhD`?%BK42BI3%O>D!4$To zDK#AHT+@3_`n);9P7rP)nNMFsWnqF?(UoVgia=V?vr_g|?$gWaeqL#Ry1Qi-A~xI%Ni3OyvR5O=UUnG+lXa=f;$36kXdk`vIZ{G@p zvgTP29y$npXmGaWd6pieX?u6PbH?FiSylgDK(7cPQK6PIs>qyhx83Wj$Kes`4y;y> zZ47h1f0PdVbj3Vnm7^?@+S_-0(nC5-w412=m$BjRttXCH*E1coV|sQeRPrYb4$L?1 zQpcDwljo>6`vn!vR@-iMqT7Q((M4MdC6~cY-{bHa5p4cE#{scT;pW_#w$qP|IjrqX((@lojZPVWMXQE3} z1|~cQT*cgbAmh*)%j~+ALe**}+)hFF&gI#XYnsz$$g(-c70I5wBpdx`<|B#R{qkFq zf7h>wMT^dVF11aB3FjDIgfBm@BjaKZNN-n3ISy=_?_IWIxy3)0EhJ^5G+1ikdz$oQ z)Ytc@*`Bs+7#JO&#@`#SfPp*UwwRVM&$waRQ_5%?7=DELa1>?bdmuO~>(O&Y95$)P zbNaEe>60a0U7$zJnn3t6LyO7E2?*u{e}(~F6O-_^cqamV0H-Xe`kGRC;!WrNulU4+-l}v7sTQ5`$v5O;cj8C zwDMj3Xn_hKa*0?-_`3Vk?S4UvO zd%A-0q)o3F?pA_f#XhBVRJN|#s@rZs$`4%xa5+b}2l7TCU1Y{bu7*!GOiK5Z z8>@Ff`L2U7{-p)Q;LzTooOO&Se>YPS#?c{_;FRUXLUCRL*d71bU)`$t5jXgOW|@=fBLU9;CW<@ z5st=h(EFDHPlWQ;7a^bAf2t^D-(cDn_j{g@ z#f1^AVkDek!{dIer5AWMl0xs?^@&FeoFAxOBr&=hOdO$8o^kX2R^ZJ(x!ZfgI9_dz znBC@YpL@UHmrgc0=Jn-w*kZwaX6ipJ(~bY2xxq5@p>t>NJA>m9$;S2lrF1xo+{u(g z*@uBqs#P$y-04?qe@-tD^5VyaTMyga0vyR|{MgXTh_lJacjv}!lPD6G9Xg}xj-lWR z){t6HFm1t654Pe0+S=raPan^?(hZ;l1ZV}o9ij*$^Av& zr;`eSO!;J(deKA^3In>^%xC0E%!+lD#{JnA4PoiR+<*_469DdT!g_!uV@%o?Fsgpi zRLU-i5tTfoe_7>nBzLngL5LFdQRl93JU8Aa#dFq2Z=~tz8gOSd9*vP3A}*N>+A#d0 zq>tH^Y^m(7RpSxza3U_hVyJZH>*M834=B%rZrB&RH#w@@eU7x}!EooKK13vIO; z2+>BHo4g!G-0iM+>~JC;AJL|Z^$zq>ify$YExU8{f7&m#KA5(@wHrn6OO$4CYiEq4 zCryM`+4gG7cyNU@>gy|+@FyaCs|G!)Yd+`j32ZvvB4I%fu4aU)s+FZk)E#S-_Unez;W6wu=#n}7G-D#^r=zah+c9Ft zWM54d;f;l2%e4Mm86Wt3C@1~K_we?u<1%?#G6_O!E)uBH#sH~OC61`zmdh@ zg$M@crdo2Pqgse=MB-w&S@ty$gnP(6s1GBdcEzV2ZC8jDBpfERd94 z#2&8CZPmhb!yz0Hp2;cdxPQ<--H)^1C5{_UW$KBiXPKq>8p(hvUnfdn&ZPEg-%`bR zYqL|~q#L&+EIM+aM?lf^ZfS*bB_D-cf7S?tbb8k6BWhU$*o9kWeq)|3FdEkyx!YNb z(r0@X%wUE2^(ll(Vs0)Wv|>Bn#4~KEESU8M%M_-X+42-A#j@vlB)+>@_!@+FbwGfA z`!ejgb;w|e=bL+K%*f9cWp5)X3GQF&d{R2a+&v15ia+Q}e;4XRl1VLaWoAl>f41YM zY9;x74Hoq!IT_>RSc2_iAJZbKS9sARY;WH-t>%epws!6J6E0)+Nn@>;^??FPKG_JL z`$)Cq+@U>Q1+)1EmcgciOVt$*i?>AuBzT>NSaVlAM5+EbysU&(v+2CJY9gzL$|JFC z>*Ll>s7KbXBX_GIFQyViuTUV>bEDO5)A}vEN{07M#L>1 zTZCyICM`a`sR>Q%#<)kfh`J}u*0I(f72y7!qodNp{DSAXiSt1PD=hlKK>y4PZKuzk z@1;*wYtk}@b%4zG!)BERO`6iS2uhy==bS4A1m$uuUirSrp~u2@;dzZae+f>a#5zSD z^&eX^_5t;DYAoE?2o(ys*`yK{T(PglXfmYC2fIzMB*du?WOP5uusle>JdmB!BE37L;|X9p7NhGc2DG8g*zDg+hw)($|wk z7l|B<&*R6zhLeHo5i7Jie==ZvK>jSep>O&}JD3TVz-TKd5@`gaId^ii&r{mj@on9v zEEMTm(e{{*G++)CPEMvTX4B;Ml^--zc#F|xCGJjePm5wEO3duI<&Nh;SND8v+eoym zS%|ZnBt0J&9QIx3)|;}bm}x-t!Q;IqL7ZQm9mCv5GKYvwr#UonfA{E{kGF8bq6Uc9 zgZ1By``>w?;z_6llj(;qa2vE$)UC5B5YF8U8Xs6*lX*7r5e>>TVb)tsHK3mRBt$DaU)7jD*~@3sk2yVl0Fi@sIKNe z4v341Jol-aN3+`Dr*B_C`0PWpKI+#nmh9lGeS~~$R&SUnkw2+G5+g7jt#My5ur5Db z_?BZo+pO}&=EV7p{y9lt93EDWRe52|;fo&be3M1uX>%jve}K~;&(1z?3Vmh_KB!)b z{J6k6DA`(!wYK&`dmZypNCwy*D1~{IdF-)dCLivG$fK*@_R8%|V>c6D%deu@?nl^5aaG>iBokev(WkCNs)d9lmVN&uB7++m3Lv zapO~xO8y|p=K?MyCL9l#2gy@d&d)P9h_KgQULcsaoIJukTlUakUX?8$KCL^AqstRr z(fb~oe^*0QS(DsEd-hpOhFaV6mRxMeXO0G>yG+Q!It7p_^I)s=4sTt34dT z;(r~I;)zmEK8S8L_X@ANe}*R2_v>9N|1CaBMi~GjUgRStGNtkm7yHkY*beE$L@=?q zQzDQz^14;cl1XK1UXF{S>BZ3rTyiAyNL2+>e`|5w_WI0A+7LYLtP^A#UJn9YyPp>* zQ(1aE?K9>zkv?RxOFd)t$jRBy8ZTE64%ckH?pR^2AtCpQ$@Y;te1)+(+$0Lf5-XXF zpR*U?Tqllw>bjiTIY+vhM{qPYlx+67O1+@m2tZ0&uEu;;_w-#Nlf7wi=j3fTh8L~O ze|!7@-I>!W;iQlkUk>(!ntXMhm4+eOSJl9@v!=Ddwj_%hKV(Ul&WZHBxlMI$^I|G& zn@c1(F}Y9E%H+E)aWD6ZIS+pfi7{)-1C!eT##n(eu}Fj?M)*oqcZ8pW^IiiocSNFW5ka1&>)*8sGH~$1DP3 z-zgnXD>kRfGe;9YZ-0!n8##^tl8K$&Xl}v*B%5eV=awNkQg~fXLPz~-N-krOe*uqH zMwtf5wlX5)u>6zE`G-LH+0KwQFU!*^>0CpktT3~op}I{Ka*d#xS+TY}O1TPx*l7=I z;=<;4%WNGUgjv_dpD;7TQb{QDRrNlE{G3ZX3uq9FLb$Fx9@{Eey@u~ana%5fw6V~^ zS8elNLV%D~M8Bcb0ZR2UIUQM>N_a8!|A8Mt=)_K0G-y zU~v`mJ%^wk6#;M5AF$-Me>)-N&u76JztWd+&3x;z>Cc+Iw5tWrpbr?8!)JRXG?b|Y zRQsT8e&1$U&-lQn$)9#X)CvC{@feYC z3+rKh*U|chew91MC;!LNykLvDlm6~?0JX?a&e1kwO@qA0jtWhje?gf(xu^lJj|q;F zsU;&9>PP&~O=L8La;h)|%Mh&)ROj$3rm{Dj6dZflny-Kt>)YC*M##)<#N7{FIi;nS z2{)KU$zYvpiNTjs7FqHHJu0u5oBByOBa2N%(AJ#$&r{HU(1vV#BhCnx@U*!dhNktp zS8O2?U%gtKUJe`Af4Eb8*QsqntlITa8B4U`a4F{{4t?Nc3-_orDzdU+veZ#&hN9{+ z9CN2#Y%n`hY;aZj3-*#_$;eikTeWq@(nzX~9h>EwEdHYNLFzN|6I^lfdDbVHmPe*N zICl!m@lN|=%_rv5GR|HTXSBd?4D=3CR&YJoIl7#r_g zpLisak^6nAT~Mv56^Ho6H@evoS{fG#Dam{Signg$Jw60T*3NsXYLG!tGtHFxs&jqz z%x0Fxc1Kqv9a5Fg2YW<@;eB^5%=+s|P3fX3~d6 z&RRBdLk7FcBi=rFicI8pl?zuk3(lzHrh$$CyDE+>tDWP(Ne?7XJxVeF z3cOhoe@DonKu1CLf!Bx#_Ok}W$LLz50*%&9z$fLk@jXe*g*5+80fttYE;U&_zl*%< zpl;MzB(t)(Xnc#)LFVLa-qJHiPvE+>`E}x^HaRnsRFuv3dW%s`Iy~9Ce2nj>4Ky*6 zj!kf}t?ds{rc?0Vc0b@;l#F*gxg3WBV53{af7uc=KW)0S9T#qe=Wt+IrqQ!rNU_pz zYO7Q~3Jr(`)T$1$H+T6pwsfbM54Ff(GW>`u@M1J3ZGW1}`-$fA_-520rDl1bSo;xj zHt9>gtOH+dP4*&RQN5H|ns({+YXkOGabI zKa@!}MP@(>Zp=gb(w8=4C=xMU_1tGqe+ka6ZHQgV2Da-|zB`)rBWgW-Vqdw@T?phc z4`ZuHd{j(rtqFZ!y~YqbyWmd%(8|Em5sZ{RS->Y0jQsHgD9}N}yWP!HSxeloC*C=g zSgtMt*@eiTDbIh7^vgjJUtK63g_G(xr93BP^xmHHKU)=;>KOe=_VN zTYOZGzW77+6$$HSm&8VHn^eW%^XNmw>eV>y zf>g^I^10{xOY93Gep=3wv60>=sxzKvMZw>Q1z;+2*OOS?I^0uBR2bwQmS+Gd#msYb z&B1XB(pU(Woxe})KAhj^C5rM~$mI`X{^DGo#^-&c8dI1ve*!s7V^rD+#Av9y8`YJV|p;e--Ri4lr6; zRBi{N!znb+!ipo)S9G1swdrCzdp*P6u?~6L8@)|2nUqR)S9@IAiMcs9?(K~{>hl;b z_X+Z1nPK;T#TE#U7)UZ8XBCK!#8E0T1Kf2Vczsk-T-P0bnl zagz?{(K=3~_N#5JndY8uovK05q&L0FsXX0zd12b*`-SU80SdcrEs(I10z$I|uEIEY z#wtmSwW}y%mEWYExn8+w#3C)75h45H2wgL+AycZZiMthLNAle$=q8sm& z?{zNzDv~=w13KJ|f1n82Er>eXmX_0GHMV0`p%4Jh@EMQwO+>IeyP*r+w^+Y zSja&`Cp_7T2*lVG3dkV_bLM#w96Prtm)zdcUrSALkOB$ee_(cM6SB^1rovV-jNuwI z_fDI;*7wONzmK!RZowOs8~XBFmdU+*yy zKJh-9s$um0JZ>nBev)zd>;^UkhW{2qa;@`}ZK!!7u=7?~B>BW~##ei1D;F4PH;`MH z*^EMpBHOf#qi05wtu1yRH=IdE@_JyYetU(=xp`!|eb2mIqC&z?z5bt1`8x zFXCj+XZTR`PhNc-z$EJh2bL9MJFUS?B_ z2#P;a?&}xNdxXDtSd3!aHQSb1oDahx8BHOW=40x8;A|F7;Ebuj(m>fwQ6`TyX1Y9G z;?>W%fA=?61mVx2(Z_xJrrZ=;!HL2TB%r41K}Z##rFKRX)G7#im(NHWT!XTyYK8`2 zMyu)`qVmo&-z0w=Q5aP~qYVS5P0F$_@6?(uFr*JConSY#t*?|81laKynX6ix)FQaN zb)l-}?f7okir!p+EADF2vWUAf$;=T}QD2wEe73`Uo=Q0zO=~)F zM!cp=vMym$XgSV30`wHHNpmcD>P2*j25D%foN=MZ=^RjbV@5ylVC!1nXq`e+-p7E zB$6T^j{tlkUpS$CkPx_|4~Qd)nBxyrf1L*q5i_@$fN&ec^XI&TYLws0}Ahnk8Jg%yH#y5+a9z4lWr=3CkW(-#ZhBdxz|e;FE^ z_QRYVS)(-sNqmZXA(kdzO@xG&Q&8{|nNmt@bx3RBcKPB^l!05!Ji(N8piccS620tK6wue`0GECoWsYnR32FIXjv50)7{a2^{x$b$n43q{k-h z)O3bX;H7wgG1}zA>MkB;PBMAYJ&0~N_S8O*Ne}UDL+yB$X zJvCGUC~6qac1?DZZQC_9**2$|>{^+VZBMo_xz)IPBp0kC z)a!Fq(MmE-7Ap7X7TEmHZc!?|rjW7CvXeCRq6PjW3Wu(kxekY9VUe#kP83VM*pKFl zHF%Uf{-cfIH`p%%@z)5Be{aNNR_$`s9`-zwCaiHS%2tn?_Bx7Ru&*kS=++wq_cE;J zimX`K$OX(3%@>9Ja2?uj{rPOWX@_eQGe|LDx#w)pnM5ZzEN4fD|T~M_nM=LecOiZeD#om*K`kmDHV`?3h z2ZWH~BA4eoKE>$1IfDBl!ic`n`Eal(avK%mi(9C)csgB`s0f6mv3;&;Nte+`zgbAiJjf#a|N1N&51 zX-~c}LYA%&Zc{G@%H{8yprm$ z3(Th@tvG4rf4RsG{w9R>502U`9tcucTC5H9L7HE6DCU|IP2Or5qbT}UlJ6^ws80w7 z=qf-vI8dM9n{E~cH&F2JC5|5k8B!X|lSLr@{-CKrISdk1h1MvXiB$J59^L#RnV9T| zT>~IbvI$D|bSD|rMCJbI#nSX=JI~LmH=o&v0r2DE2;e1`3{G ze=K>XB;e`{T!yzDU_yDih)l%VH|*BqwRurJEdHoaM7lA!m|?aTAaF{^H$qB+5Mm zH%ykrdboBdOz^$9$0OZ~+CQvg;k~A*f9HDVkTDjeSm#6o)d$57IdrK!$`zd@{)TIY z_FXkE467eLb>TLkR{Yj$)|XN|F=$pEqODm%0;K)AsGFsYG^hFABK0|sbX@JgwU?!} zCZ%S>%C)V$iyogS$T2D5^^FOX%O9GjJaOVe?--@-*O0Jh4L`ZF+nCMRG4$YKe@RfP zn`IJ1mv8d*GRgrkEU;V#>L!`^Wk5(A3gV#<%)n#tE&bdzGGx#{khwx7%2Z}*hW;p^ zAqWmPmkZY+|=BXMk~+1O$lZo6T+Hmvk2ybqLT8a!7Hb{nYV@b56evY8w6 zywn5t4|NRa5cadqWC#g9dcntrf1l1l>8f;&D)GjTk>IjBQ9x=$SSV_47VYBL6;Eow zEA5Vvq7YXJ<9y_MW72(RtaaeEn<8iH6^2Yll?9Z)UKyPxkMIbWL|LVNPD&kYB-A4vazkf-%hw){aFh9xVS3wcXKV z5U=T@Kl!aAtcw|fz~@Q`J){&3w&JJ&>{quk;cL@-R+oTH{!ud@#IPTfsT@vqv}!ytD`88@pI}w7{Gmmx zVe)G=?%lJsyu*5eQF32c9nf{hH1)}eMh z|8-YCkyzE6-;pLAY3)zih8^00B7SGF4)2|?$B*yEf9IbY*$voIl3%a*!{>|f19r?b zGtgi0^;U!ar$wKFD~Dj{0q}0K;@wmW)U^p(Wj}M%8D%4+Fh-KFz5Lv z1A$TP)fz4^c)b=db(IC{KVEW+a;Hm7gB>8RfBOjWl+G7{S*fc0f=M(dfBQqctI4k0 zEEz*aHOIoIU)h6t<;%hmTmLb1Ax*g7Yd$AJm0MI^^kCrkLB#3IG7%%(@(=oE%wn>) zX!a^|y2>$-g&k)!CI6kTPMtn~=NOgG`!4sq!o7EK+P8Q$mSqG0cR+~0g^VN76I0fV z)ho~I)_-XRp^^ZjqBhe_7*U>kk7?6phy8Liao~_?A96wX)N&D>l;^<1HOLXOF)*4` zD0TB--1)Qw)u%Zh|F9AY0-axzSa|9)ri7i<#u*c#I5$FtU{8qM5{VjgHPRuZZNMY? zSNKvTA|l3!fnN6#D6}@pTwq2BC+t;Qi(ctTazCVylr$OCQ&U4WT!8F^_c{u(%=P$SN0!+%cr&D5QfbHwWN}#8U{e>jkbS2`3vbn zf0G^j&KHeZeo1H>Oe0p)abJtp5wwU%Jzq76L#RezYCGC^rdrj2GWBIkT)tCoUqham zlYjkEwco9l&TM)guG8+n-?bEL6DacM*U7npkKrzi>CH8r>vZ4TNUCSQKMkV} zt_L1u_9g0~Mh$ya<{ur3cKRxWY-G*(Pk-GEdYD?OOhxr~ij3A5?#hWtT3#|2%);U6tLth<6V`&gc)x z459OMlI9civ!Kn+{C`nqenz~vVhlc>FVcI@Iso>&UUHgr1riI@Pu)0X(q>xnS%1o1 z6AT+aP_g!f0kJ1lI_Hww?n_E-5k`cE0);PWs$U@Y8*74M%;Lw?`}>ZUp4US3LLqd= zld3{}f~aBqnJOR(Z|Hs$79TmC-KqRfR1%M@K4Gt_Dcon#?ZLU^HMhsTMwvB6NrsFy zJo)%FmdNC_7AsvdQ7~}bx(@Mv@_*7eASH@6p9$@Ts5jmsxFk9c0q(pM{A z=fVa$%I{9%xcq8pf!;;5uj?3>7t7ohgWiKo)#)w~s#AyG0kz;x_#Xn6P2u7LHSELP z1brW22vnjF<&1vwdO)MS8H6~IbQ11V(=ZFxR-`p3S>T%uBP(M`wf5J`xi=`0pR~B9lPfx3S>F&7Y-n81leAC@A;lsg6*NmuCCP zbII zH2J*REGrPP>_9G=ZH2dSGkwA)3H!)DFKyD>-{Kz_wZMzV5T167X5D-Io`A#e*EN#Sl#jk@Bu`eJ zef~y=Z*@ZVcpGT83*g=XBs;)tdQk$(o7*qgB+0dJP!e`B0_x~2ChW?LsD@5eZ51O@ zTZWJ1|AqIPzZhC)`h!`{vI9<>0-yL};a(oSnsX+f2!77U-+#pb9tM_0#3x+)floHc zBt3Kz5u09A?-&!F-{Y#4QE@CwCwUhB(w*t)j(pyFJ@0KB6A_Cb-z zhsK0pVSggMZ~72aVo}+h4oxl->uzIkdKlxHe_U#|qjT)LJ2gKf^Kx`g&bA~y|Ft~I9=-GwOybg*T>t4aR+u?;=oE>D(}=;x?W`XjKk>ZXc_GwDPCjy z4DKMy@PAjv5v;tQ-^?_gMaYkMf_JAYM_67DBFdqsAvCc?h8;n(gtPzeY1Zp{ay^0d z->LP}*7zN`?i}+;a?J-aB1_YxXW9K$2kiTK)=#2lO@{wm`6Jgwc zzcjmujlvC6W46V9&Xg=QQ5(@4SpCC$+^azudw((o@Ld^OUPq;AeI{{qfyhfY#1LT` z>73Y75y2~Z`GO2Yk zuZk*S;yK9*FGsc;d$j-**nafqz$_M9wncUQRLTzS$~Rg2#M0pjfxypI@QqB67TPwR zJ=~G*?7u$jEGxJa!IbX91N109o)LeJhkqS=k^i)>+pnA;Y~}TeE#()ZmRTo{e;3+Y z!_l`FTO)ZqB@6V8SK->SgECsGpNsA;oHWDrXG7$`!h^pHY%T-AVE0A!r)s0L>2&TF z%T9}6>Ll_vqvQ!Lbdb3Bwj|lyoE6V&=y`0NadqTn<@GJGxgQAxt>IZTMVseZRni6GNyX_lEEIbQ{$FB&5AbVx`XfGt@d2bxX^*add@M4AGI2BZh-+!?#$dDeF z7||s$7NEpz+DRAq1xn_6c6d33Viab7YIwm%2JcUU&z@jBCJ~#3;PYpvp@-CI=;M?X zcPJ5ZxCC9dib?F3yKsp@ve>M^31@L#4S;%M5}h*R8?wafUqwI~(t@$UOWk?2p5bqX zW_BNWb#;CSf5f&_Fjqnr!GF~!`Cs9&0av3+Bp#dZJG=`E7cXP9z6{E(tAwi>6=~AMt3|T;;D<8Q{ePS+hTN$6H-dlk zm5)vE+*5pi;bXkIE#a{1I_qZpazmI161gqLj??{qz|C2kW;nszL(JaMC0xd9m535G zd&`2@Ie$TnpKB-~xm|N|?Y!s)i-(-P9@O@fjAk8e(6sYduDhVA-ymqFVXL07uaX|P zMJrsL$T1~Uz~QPhLw^+jpYtG(vc{fZDvsaCpyeFWnnF;xaJN_3!E}t?-J*qT(elR3 zhrA!~M6m;LU#&i!{(AARsRSA~gkwlj(exlMtAE7%Szv4s(&V6P(g)1p58DY%=K64 zE5VzWfGdambT(#H`HHrB@ps)Pr9&nbWWr_$B@z60reZRIuD@8(EVG(oIe47Er)hEo z16eHkM`FuAED3KL=;xhg?ZESN;pqaEa50uNmkXt` zIi7B8QYyzNA%90v95Jtfikwfg*5cH(?rf;rfifcQEJ|~fA25`8@VJUTtPp!<8sqmf zSvh-C)m4?Jnt$^-5b=Kx5nFcLd@OwBWa;i! zXQm1-d}#t~s?AhLQ$eTl8gFfmSh*Fd;#;Z$UitX88D9OY3)Bks9`R)~z)dT_tX8td ztr6$o^5^5qglzC!5jS53a-ntVw;NOq$)LG1p7NJigzVdkUWZ5pI7*sk-<+1_=12o3 z6QZtkrhmAn10i>f-WZAmQzviXChVmG4WiYFDLPE#fiTX@l_Gw;0`?qU-UJn z3X}SdyjcwY9u#LFE8jH64ZcjSd|Q-reAEVnLp`X33+9UJvvm`=AJ`(gKAaN+7$2O; zT7OG#p+j6|2iTfo6Woy!OdR&+>qDi|dnq#F-4zB5Yc5)}9(gCto}1=-g6Ws_yNh_$ z`IA<0TpErM5o=U`s+yj0IoLmu{JpGO;;(847+D)NQ_@nGyQ!!t^2+sUmIPaxr#bbW zWaJ7gZR>sWY2|a*CQ$5SP5!gG&m2VXo`1^vvfy8P@4Yn27rmPHkN2;y{$$qQI+dk! zLeB>!TTyn0_o!QGeu>L~!H+JpngfY7k=`^f7}xGuiyk9*)wO`*e|Y-===m8g{KRi; zO;aP1+WpBOiT?oiD4F)gi(lZYsy-s0OB?G&)%O&r(gVk|2JF6pB1Dt~}E z>X}t%%JY(t*Y52KmlDl21he{jdwI(2p>eICCrZrUYW`=hiA(sUR9H@^5*ST??%Hb$HUs-{v*U+xqb3}Pkk$-qN{4^r(L4V+57hX%KA5rURn#0tQTH|0C4cNQi&{>Us`4=>4four`^X1Bsw5w2d^1oL^ID+E z{@S3RbRJAO;y9^aHTVmPX{2;YY*T0o_*NY`od4%1UXOfq={)fWDC!nW77Q zSM`5ckXlw*+wQ{?B{&5fbeI8I;Al;PhImVYWZTQ%D#!4{Zq|{7=;_ak-D_iM)1K{+ zi*qET!4WI|5ufW%Bpt}FL4S?{#O2{{t>HHj?d=2Q>F&;TaL7KDNiQu*)1fF zhEZm^!o8WP&&ceCOZ>ysji}zVbFJE-?CGHM7zz736ti>t-@?5(QfwoKX@G7G@y61j z;oD*C>r5;>+g!`gdHY1J8CR_G3P6$N&)@^yOm2O}o&fzmrQRUZ=zpVj$Bf?0HBWxf zALYyxbk81Zsi*37zV=`a$;J3P$ApX1LOh3Pp&P7FBPm9j50?z-B)o7sD}`Yhxtq}w z%h}10pW-2D`KmIjIz~gT*Q*+kSs;mhk0U1kVj2^x0P1Fx!xyyC2k_jQ!$VO`%rvjh zh60x-QlJeNW0ZeLRez@khQ0x9H(+pRk5OR;y%^uiu3fcdA&=?;+GgKu9j8hVabv@}OfR+{6s`q(s@8j!4loa8Z zBxwgD&eHiwIAB~hmq~gE1iU3M2Zh{Q7xzPPp0$@{$H9hU$$vEG6N@X~TFVhCAm*jo z2!$W9S(!8*j=fuJ_-Du@5?gzh1TQw;*9(v!D%fzhsZ72;m&jqFVEdo)k1VIw>X=$$!c!L z?Qg9NSpvO?Bj~bqdU3|>G$2O^BxV=rHNEl0fP(Z z*+br71FKaAriX!EC6Z)c8A7%K_J1 z;#RbkeLQUH2z(5Hlbg0ihfhDmz^FdJgJU!hrpc<_$LeV6Ty0R@#Wl8VT{#PfJ~I2F z4=h)jNiP(pU{M1#uKVqtdFz?wVXX08Jjddu_J`O0-ya@fm;YJv`{nw{=R0AgfLYZW z%oaA?6n}aI7vr56oFXd59i16=&ed5`&7K-l^II)C)UGFql1TXkZu-H{oTy~8TQ7gf zbYaYVucqg}bHZ|Wt2X8hH(eKU7r&vm=TEflyagVy&=^7F zFSH9lRNUd5p1o4;tA-td5{zRRa+zt#&SL%tPZ|Wam$5Sj6ah4sv8)FaEHW`RGYT(E zWo~D5Xfhx%GB`3a3NK7$ZfA68GaxVuFHB`_XLM*FF*GqWHk084D1W$RR9s=QHX7XB zEi~@#7Tn!k8fc)gCb+w6&;)l679@CZ2n2Wc;BLXfM>2C}&YAn2b??u+dhOM_s@|%4 zN_X$3p-|Ig5x0bxgJd9%t}Gm^?1BI-ke;lUGe{2P3~^zRfY@8gy8`XO7649Gc6M%L z8X8Gw5YQD2ag+kOf`0@7T zClCjK9{86~gSfb|m;+s2#UMv(up@}!RYelw2y_6sfB+UYKxd$ZE6CXe-~oE|1GKdK2W~l_BS6ar z^m+juZCGC+YPvZ&L7e{?m87PYwk$J1N?b)t8UWH^2FPk_YB2*;v|gEiC4WG@-T>qs zEy2J)>dMku;(uEDYSJ8Rf3gAK0Jy*U1ph($AK}ox1_StaG_R^w&Jc&c4gmBvuC7jk zY-}DL9<0`GF0QN)XKPj`dxk#_v~0kyF+iN{0I%Q9AbZf?6uUWEz81#yHITms{*)P@ z1h#n1CFpNZAkbf-vbc)8jI^c}%WJk+{v@2`Z~a+aJ%3&QhN2-YE~PB}f06!y2et>f z{H@j>OO~%C2HU%^zPkDc!{N2wuXtWvy8bKX*Rr_&fouN{Bmfr>=+)5wJvcV2SIjPK z|2*o#_9qS&8C4Z67A1K}X%$WBzaSyb|2E+2X8lL^|C8eXNSqDO$fNXXihmDgT$q`CrlfS1}|Yui+Tk`}hGp z{u5GQ~Y(B1{) z2etyeej)p~0Nr0Z)!7Z?=kwnM|C2)I-~(8KEnHux|8=n-|FtgfXaxZX{Db|9X z9IwkC{O95EN5uXgve&-1uyX{txBz$s{(p)c9FJ$)DCgbGc0r+sd&W|O?^KTad*jODQuCFQpCpTBWKQ%`F z(<%I%uWtUZ{!#*b05;&iC=PZG02}CEBo7yW%?j-P-x#mDRuDJm|E9nXV6*=h$$!lY zU~>XFgCUmxKEc5QU~~Dm1$F?Ns|VyS{XdhS_Gi=l9UAt3XXT#{mA|y6t24w7qzkru zeKh~KBg#NmXRxOs`)kK@yz*Z^|8-~lKOE5fdszRQwuA)4(}#tJn*+eY#m)!d;C`J3 z4h~K(zyG0Y@sDlzciLXd_h0m%MSlbUfjmJL$cu9j3!zZkk4@p_{?dgL6>u~HtjC}6 z-{~nN!Y*b^w384@zd^iFLdLI*B&^bmQpq+=&2z7TfJXb=f2&K-5zN{SFiJKlxEorT!IXOLuvm3$J8 zAS)u_*Z|3*qSXph< z6)&kEKfwOnW)lSfA~ew&tZW9tzr>x_)%v2hXRS}{YE`*W>uJI8kgogPtSV3ZJP>~@ z#7}=LvnB1Dn^M-GQ8V7RE%4+xw(0pa!2&*Pv`ATT-%q}RiTpLtjenMDySFy9UAJS= zut#^4c^oStpiIlfuyXMsePQ*8gmVp`Q-RNHletyS_ES3Zk$c0ykrf9N7f-)&dnIt- z+o8Vh{=vBS$}RYpAdO94IP{y_pMM)_l;*16VcK3d6V;d0 zd@GFqRF*gqme?z@5{;{TkzcO;Aw_QSc3)+4`mG_H9PiO}Hb3?Tev`$bx?W&G94-dc5a_6l(qFr$=02by(m}O95<2BvHU~+M>=HDyv%= z136OS{Aa4R)(!gH2C9VvFjFngL6MQ;*(Z{YPc~-vs>-po5v{uB9MGenHy_sA4CQFo zAJFTkDtcXPO*+i5_Q*vij`GTtx~ANk!K%M%3rdbs$bTlRf_k$(gSmxr#iM^2C~pTY zIYT{L4HgFe63Xc?g zyLI*GO*+q54qI)LT{}TNI{kNxE5&RkTf!fab1|5jP))9D@Oov0y1D@f@6uKk_94)e zW>3Gda(`#6Yu&;UBqFu*|lOzZ!gh zuUGmVw%h|rEi7j91N4;Uj>0CvEnUEK;_AJc?nQ~s9ga6DcY-tu&KdN)v@c=kmhH{$ zFLA3Sre6K<&gLw2GMW48$_8<&^M@gQy6sl<$$uXXb{yZB90hiT^w(`N6H%6s(Kw=% zgq1sZGiJ-shRTa8y$By_oi;<^JG+qTSDwDWv1jK?7aK5JTWl<}N26R*n@5@Z(`++@ zqS>5RU5i#*IhM0=$IxAV#JjIpUILh_!+buz55sRU5EZvJI(7DL-Ovg3xu2l_UJB#d-812+&8;2%&&n}BA#zm`o9QO6h^$^^w&OY zE#GP2!52CuV)5;$fvv6V>qIQ(9@H_EQ z3ik_rQ*L|h?rOQ?Cb<<9FGJh!52Ht!{qd@gmmxzy9Zy~!`;HsJ?#5pE@v4MK0}-V{ zR9E0TXt)}x3JObU%0?PtWki0axy8%w;P*9OHWM9f%`c&47Qa+pP<@Q+?Aln)Qhzpl zC%$qh^0w3l0)PC#Fk3dX6S7%V; zg@G@G#?RWFP_I@7^-QCr{dP~Os>M_80iW#cuga4Vd{Jniwok=B43S2mp?`mRh99g* zWPG1t1U0$r6|i19Kz$gg#ZF)v`Q13;En8@SGHaYO%H`GQ-b?p)Lqqzgs=?K2KG?I` zO98)hhy>{elp`)C9W8dd?&RB5^W<{I@kc%hS!V?SsAnw)8AAnm30}j43^rGF^#nNz zV%TeX%YwLMGsy&5%CR(0`+pw#RlB83)yNe}WzJkN52f3@+E1lAHMPcC4!3dXYP|gZ zAFmh+AB(>kiq3nB#RQqFx>ASW=EVq%NJgL8ETdgszTkvd1}piA_qK?nGztBh+|(FS zi{p|*g;*vV%$BzcinL4fXqk1Ypc+Rs*0+$y&gczBv_DR7Po=nMT7Slxw?C&65pMS; zbcdpr)c~_!$AA$vs_mjuuXp(%Lv%*0#ydy-aB8vW`#?j^NU`!{pL=y<~)OwSC*K5&mK0(G-ddhtPwk#s_2 zMVK-h-d$DD4}|t6wHCG6zD6;f4(?C>>KKB}EtF4o7}cplP&$DROAkvEY-7P#!*szW z&%a8hizT)%DSz<{^%&B3w@w7e94shfTMj!XmA5#vM%E~qlsI0F*i#!xBctxEKJ^P zc=f$I5|VR&onFzKJjQyilOUoi_#dXURNt0v%%E&MjITbuzuudYJuLo4a;&)umHpJt zo?bbkX0#LFe_rXk_j5r*Vfiqj(baw|dLyJpB)UN3=_$&~fiG})EvGoP_vvZ#en0Aj zYek$dUVpEH>sr|zpztF8c;fShQrn4~scI`k*E&XIX_=)fcF^jl2s&TSADvb4ZI^JU~e+xJ7G3){gcS&eC2eOJ$WZ*gK_u7ks5q35|r=3 zIeZ5&v1ffG`Oa{9Nqz3P0n4GZFsmgKbR&~X(Td;uy;4?5P%q3tIm!}n@MjdGx1AV58bj1e1~`%xYNpvvh40=S`{f%#&}OI zl_W~jI^ZE3JyC|~2_;#Nj&GdmeE+mT_J4ID`%NV|?n?Kb0lz?dqv$ZUzbCy^ka~3J zmxZ%~u2rX@zA)tdrE|=O9xrl*V@d=mTT5LuEC@d(x*9$~dZ#ay{z^Bg!0)>1Wy_g| z>klrE1i(x-{s$UF40pB#)E)NsK;A{heuiaEo=Cq zR3^Ae!SC}7uCEyCzYztHZbU1G^R&lQO`EDs5R^NH--GA*vFVHwTfl7bjulaSf&IZ} zf?nUxt?RmHzaQY~vjtS%aD8D`x_`6o=DU;|(zpY*I?sxnk&Utq*6S;Vbzj0ZsbyC;I-y%XnD2G_UPWc0eFMp4zJ)Qo@ z>86{P?Lg(Wz1#-d}0hhaA-6S7|bNfOjVO0nE>QQkN?tpijh>!461)U#y9SUsj z8sk-4eUp|Lj{B^?K~HSc0FBPfZF^l@3B`rcj6Ns62gLOuC^i6VLi~kXUlbD? znop>eIx|RgvBTz=_SHY?hMXX{#K@TOGw;```xVxxKSC2T;Y3Pgei@m?bao5Ed%`@4BaI`^H*}6}&`V`mh=FGe{0at@a)O3A z5p{k7wIVF|KUq3TEPvEuX*GH;GBy16cv3lHB$ppt#LfgIbjh$2CJtX(w2$06Vq@@{ z5*75YS|wr^oM{GM=$}Vbn?L1gy$I|cza@`HXvW5kQb(zo+S5IxeYP?)n`DY7>rNNhI#qX#N*~V=h4ibZ= z9klfm!^ImH4JzN~Mf_fp$!$M;71N1o>+XWN4{m|$@PD&*HVQd=Pt?;_S)-2pSO+au zDD@rd1z+Dx(l%yIKSdFt{B1s)=Z~w-vFBkZ1S5nd-@)7OLB%&y0xfRz&So1A8|XOT zyUL%6sf5_WlsIAs$s)uu83HgLB`K4qxzog6U)gmLGF%IA#*t8lyzcpwUsO2#3Vz|j zZtchP*njWvjzqApk|~=!+&tLIa-o8-!pxZQ=96x?ECo38P9v?+D_LZCb8+n5&3FE^%vJ=(e=Et^R4fX37x zMd(01`?w!hN**^E9z*)u{Omv4&obr&wuLA(my*~_NG-H=+al3XL6xdwg+wN zz>Zun?~u}duyqcRFS#{(Ay$paGkj(U+f`I`8HcxL$}+wcT|sV3-RLJ*FJ$+bl04HX z@~B^LAFAyYy%tFa)<$C zoj&hJ&tmLDJZrhScmE4<4p)_imyQ6@gAlM(e-NR=ujOGK%zNNx9p!6n2;1aQs?ZnD zjjjK*`Zg|^UhJvR*#+TwTmqi*h`V8Xm4C%<-cMrY!qR?<{9N*Z6rZH#8{r2uHB_Z- z{R~AyYoKKYL829!f?OTJ>`YyXwL~_jS0+B?rK6q2E=&t- z@KLmS(`EvN{L^*Uon%?t)mh!n=zk9P zk(8&A@4lo-px^%H*!qiF=QH(L#gY!^krhgoBv;6=%xRWKh~0qkMQe&K6szX8YAS|Q zqmN0gGOv(f=?k`s@P}i0xQt8C(~pdi$jN-q*m;oWPib^oWTJr*f#hGCXs+V!AkO8S zmnboV&U6pwu^wqX2+8}2ZxPveoPULgc5Rt!g&02r8mQ~}MEO<}Rokfgw%!Ftgu-^Z zv7ZRTc&qydC?^e81`w6>J0|ztMZF1^>yFr!C^A}H$Hs!1F2gYH%tTCP;`$M=dGJ$K z@BkO(*zmNr`R?0yT8_#c3&wm;ZZ~p;?I*j#cUqv2PGSs?{hnFO0i!TO+3PcdQ^MKq_ zg78LWixu~UE`pge%W}!`0;=d>wN;1crHtEu=p&v8ez)(`FQJc^aKoytU0bq0(3Z)j&YClWGk;GSw^z+>B;RfR zbdE(J?}BLJElmDAcRv)rl@@@5%v~^=2^OpzC!0$6a9l)Nvv4d4KNK2&VO+z;qzmX) z3&hWLff^T9{C1x4f%tcqQ?@<-R(j7J`ljipA}G`%<9$yr?*7XmAOMx(+r}s1Sa(pFPSc` z@&1Gf0?SDOv0D^^Yf-*_^bD2lRF5Xc`-&FB_-S~e8i_Qc{1|pCl0#~u$}Evp;bSxo zZp+zaCb?M2g(uJe6(K8J?Bj#eGvejpLQ!X<&DPeA1dRUedVixz*|04oVyb=l(}hW zr9Iw?%hBV_oU4lVGSfi7P|^+b(A|$H9-YC}lREKX%$6AeXB?&r5l0#zDL1l!-Z0cq z;(HsHpC|m_qko$cXN|LBUE-kP>$GH4-FFzN1;ZeB6{egmjP!Q95$!;N(?h7+CU8hN z4FRgDtIaiq~*>+g(RBN`>DK1U{Utf8A$8U^@{c8q|kwP%$(`qn0cpp zlOBV##D7e9s=kJZI}y*t{-QS@m>Nv1-qjC@LzA)R*TFR_Bya4S8=^49x}CDsyVh0E zl2eYl-8wp_7HIu`IZNb~JF23Xy{8c9xF9=LGb94+*2XSo-?@;)Ao`+`sSj8zmohQh zcn#c`magL;ba;2T3a@-6Fx0I*_1+rs8HbOTlz+`R%Yylp0}ZwaK|ws|oOu5AZY3&g zBkg#)dG7WG@t9oyl+s_-mWOe_(KW(;b9_^uiWu5KP&5kG&Fh)I?IpJVk+mgq*<5RU z9zN6wX}${zI|Wge$NS-&Js-J^14Y>y2YC-pkeSlwLP{dP3QtF0pPXU^R;ECn&xq;A zwtsuddc4--O8(Y6+4jrtwpn_+0&2_pJDf~rVq5X^-J+2krf|~RBybepDLz{m`|X=_ zM@+m_m=1|#{q^`rvcUX-|cPJW7aetAQV5OA-$$L-`IIG7;P?F4Zd@*qKGu8I3 zE|1vDxMJMmn6rOtTvS(~?qz3N3oJEJG1mAO=bD+%W86I{RVo9bRxwVi_e>_PIx26j z)?Nt1ul_e|+nbF+z)WIR`? z_A66eW_d#Xvf{p+HwNtE^YjQ8k@{@N!2sAd-KY*Ph{m3amC-J!=;@oYdw-5&(*^q8 ze6_lv`cYpSRh1ESKkeu@-rFH9nZ2pb`?)d-V`Lw|18OL+x2Nw4v;L-MHj#`LphHZG zYA|6$$GfXY%9qAu`$U;Ja9%3Bb+8mMXzp>I^sV6Sr*70R2@A}gCn<|kcg zSpS~u6*H`A&-hqxBi~y6OxV)YbM<;LH~gg>ho-C{@PqnJDB>xZ8hJTZhm`ND`kA5$AF)w@$FTBGO#24 zgGhjpyovpioxXow+$`4$dR*B3(v#_e#5Dn}7Tq?<#>-AiGSDe?AAbiw*Cz6mD;<a5*Z}5Q{p^MdKAV% zw9;&PpI8=Uwa>O(xVbsgJ*EV3qTy8VlXKcWyu}YuA*493LNN<>Gkku9c(~&-HF4g1 zj7)U{J=vIEkL#Gmbt?4@-sRzs(&W9!SlUzPcb->cs+0DP#eZ#}Pk9}r_HWGPA}pS3 zy##vFskOHG)5_GjRamu8>;YZBm%Yy5VqnGD2?g1iX1U!g`z#0!bFUKQDtTq!+TlGD z6Do`4Uy}41b+1?FKx9|-hZA?dfk z@>29<_Y;D`b+ZfZNn`Sy&~#rmSQ+4F!xYC4*6d)HRD8@k)=U&W39Lc+1QT0)vwky8 z^U;(ZbxjKTIOr71=w8TN^2K)QJ1EzT5-e+cP|Ip-zJEvuW{BanGyu1RQmy7G5Uy)s zo*r+dd^>b~7Lv^O9D-zgl;Fp^d0<9rHQ-&rHFv-yQNi-HxZEp&r&|#l$*8lC(XjZa z;RZj9nh|L!{-S;S3qB{f?K|5f=MfY?L4Z$1u8)K4v&eUi-?)i!F;zst@l6MwT@$NB zP>;GF(timj{7Wqjevv0^+{PG7xRK1Wm{8vY=IVVT*X~$fxIVcWnxVMiZdI8D>r)*_6m()th4RN=a@|9N};mnJbzVUB8$lKOp7FozrX%e)XCE_-i;ws z0tR?xcCI<)O>>3n7c+ke*Q5Hu8jCFa>w~w%c6!HCXk*v}B_sUOJFx-TpXshyG)8ns zS7eG-8?{4fnD}kEQdw{+i9f2r(SmwuuG(THH-}f@ekcW)NFC!F^Ed4eZ1foU?@ipl z@PC&pXfh0Vaf<1;NIVt{OkD839Qg-*kY(q|c77zc+^!Wb$)py04o=xHov$EqiFDGm zBb-KLQ@B<6&XL)3ZY?cAFcRE~5o(qgl2w$=K&0!8t38ir71IvW!gekGi7)iMTT%hrZWS}tsYrE$&&3Zk6){JP zV@PuP+mwX2_6pO^Wit3ctz?15RA@S?Zr$`<;a*dCT6CPNpUpJCfHLm#lPGe|XMa6k zbSedD=#dE*cvKYh8}6QthU`Ye?U(U*?U`srV4ZQQSJ<=A$4R)b)v?1DdZz>CH`p0P zlLU{w*tq-4PZj7xLUVjaD3jC$NaP3l!o8mc$78>b_hAzgoxi~NRx{aEc~>bS)I$Yy zFf}|U48iPGD(B9uW@k8EeDA|Mn|}{b=uzKihQw7k%Zrs;rdtU|Ho<-=yO(uBwm^Bd zRX^gx)d~i?K>^qq`RHKs-Ilrzg+JFQdGx#Vm!6g&cM%kh%(d$0e`fl8q4ri~<_t=- zh?Em&IY-yd`=CnI@MBhX)*5WEdqu4G+m`vcuT+*etu+frR_sHycXM?YCVxQ5w0C9# zxl<|3t--Z1Xj6pI$)6>j7O?IH(;O(Umoqp3;>3YYWw5CPz2(NTZ>zIIep=3t-NmWT z&;pE|DpiEDU(lGEQNJYq+UB+n4b6w-B)-4gvB^GKH-b}U{o>mb@b0IHY!WhLEAQ{t6G^hj z=dK`=)q5SWMLs@OAK@%$3>1CkpYazSDLgLEBj+oM_bE9dMDcbGlj;LLNFTi?krz1X znVHV#c8zqFOml%(R-J4$5-((Ap4qTCW}9`$V39_4GuYv2aOGhHb$_`*g6IK?1xB7D zLMJBPi~OPyP!xO!slk*T4;9Vtk5{uIdUzOXbq8ay8>lRd%!+Osv!ZjRp|C5?=u4_h z`Cdp-eDFQ|d5<=3s4iS5n*-tv;78bC>eCi(s5V4an(BAIY!_bOj^dFpC0`4iIetL2 z^qF$o+Lj@})H`N>XMf(TQil0-^yMQaBU0b2vQ^{i&n5*reRTUC?!H^QCp_o(R@uWT z3547@@VycYl*I@cZLZ>?ls>dx5TF2^%q*+&#NUZ(eS@3%b3Y4U$?{+dS1ehxRi@%}(y z`&D=U`dvoL8;4G;2a?URn8mB*d^-`|)CZdnC4kj%p;=x9`ZbA=MR35QV10|JKoJ=$ zYG~!u%YOohhEs4%A*|TzcjK?Ba2_PR@;xtB(mPbB6pd z(3xjW5&yFNx;+;@PTV&d%Ub#~Kf|U;rH0Cu+otPYnjvh8TO zFr@`?iBWlJlgT^q_hyaAcfF>FTP?DD`#BD~x4F_VvY1r;`*&XOcyD%#1oi{#*9C=> zyMKywFQ}F5OeFZzT%3v{cixo-1vvY6UV9Z=x7NE$1TT5kM^1S=9Aj>_;BAf5>K2U5 z5(h`WI9Sjm9iEw75XF1#ltkM1acd9sspNjWF`czcrM>4d5yiCLYG~LyV<*IO>i!W( z8UcRal>wPH0k~B?5XN7~!`p7pd(htf(0|Q4$#FD8o~ZP){*)Kfi|VH}JkL}Y_jI@c z4AUiA;Ml@+$Ia0%g5FQztqa_!U|T#c#(w;~D)AA?0|MJOyECC&{mn?$$oJis{X{p+ z$QjJ)^5Nd@KA_$W;(TR5deubQYgno_m@T_vp2seWEV5ZRgn6rhwko-M7mHMFB~; zKBK96;AXf8S6gNPV?dn0?IwP!U5$s`?0kRsCH-1zjIO;d7L;rEd7Byjf?hA0OlzO# z@99zPYo}%E$l)-*N37}JD+_SzqXk8XXp&t&hJ+`;tEsrxoSF)d*Mo@HN9?Tj<9%{ zjQ;4Xt=09ruAtohQR9Zi1dLw_mc!o1WG8o__Bp;o4NGCA4FK+wxihn)~8VpVp7IxoAMv@gyK zX4eYGCZ;F9JXe2*DgnhF zqMu89#gl(N4a-i%e#^Vc4(d7HWE_0`-7zl?VO*0)bF?0|k9<-RIsorv^ zc>898hZOC#t6d}*%#G5N40$fZD_!`hWNp5_AVT_?5gv-$c*S(7I~jVqtv2=$uU^uM zl5o&R#_z6nM(!9Hh#@aYhBt~ z3Kl@*8}Rv6qo)0u=1kFakwam``qPcUA-ZoT)wn~FuYPf$A8i)Eh#&&U%tq#MkPQi z;>qWjxI@dgqp7_IrR{%9lpMs~pDHSc)*ENwp`rBx)wzI|_M46TQ}C==Bv*m?>NQsh z&w3kq;f!3pMK9zNJ9O5>jiqAKgT0S&gMOSlrWMi;;`AWw2iV}m+PA=hRr-^BMbnFu z;Z_=5alNwVy5-_T=NxS7h52TVA%N(tEKKLy5h|v#heg+K4;_E;l*|6V8n+7)Le7L` zML}xyzse<=i<-OKsaAyJoGaS+_Mmyk$8LgAA-$ymrrOh}&?NJC*qj$%M;~*D78@dv zMuv~;G1kL|=8q-&g?~?60rw4%*h!^~M1r4%1n@EADG%&O!)K-Z{0tITd`o zIL0;|+R^U1CZ2zj#y79sVztjgh70fv8}E&#Sq<_{j4d`Yo+)O8Ml*QEL4hyUwmBW`6UmxXa3KWvy)7uDjK1fLwxQ~D1)*DXMv&^yK1(nk?SK;!1 z`Y4pG$2-wWi^~L;Rfgxb9hlSTW}}MQc{G;O&LY(a+$BwYUZM*p(V_Vc9EVph+&{(- zFc7si%#$u#$moyp03ag`xb0|qX*78ComAgG?h1L2xotsxEP#90k$^uHGK#uR+5Y*n z9lgvc08W44Ml?hefzCf0MiR^SaAx}s^7$78;Sl>B+TwZS+M>xuG$*?oUG94@7F8A1hhffuvaDV(zOmy zsp;{d=y$WVa(7huji)FbUQC|v&}E)NgMQ>LklCkA-8MQpTL<=o68U3n1Wf}<$4W&VJbuxXZ&}VUECH^@VmHFk- z6uxkpyvXTtibjwj=<9GZbo`MZ0-CH14ahj-TsuO8GEg6N)vx7 zssnY~YZjX3ol#lh+M(Uoq{PS8sm@t(5ZI7g*i&v34aR4pUp?CDlr%7+IIN3OsqKUU zq~q=pr+Q=-*(;1HAIx69J93`d&K%3xcYZJ44&B=FG5#zGMu8)lJ$&gM>3Sa_z(V=5 zYaq|I_I7c7Qcb#7Iwa$~pa7vCBBFo$Ydyd?8w~OuBIm?Gip%q5J-R{B}k+_Az#0D8!lz393H? zOxOhng{0FDD80pqA^}>pVz6~6B~49=Fc)OCRl-rqvbRbr@RKcPcQPU?i1L4g&R4=0 zOcAsl{BXI|%PuE`0+%aE8GkLd7Z|NX9*JE$HMDWnF7ASq|4tzYI$sPij)O+}mNlRV z+d9QWRI*cEWJGywO%Y8Oi)0JOaxY*tx~$>O zPajL!Sg${}s!z$#(Fm$TssDdted>AwzVWvU@0PO0h!0Gc>$gm*cIvrbg$n5UY3f_> zM9TG>7=``S9W6o$WdKow?Q8vT`ps;^8FkZBF0{vRK7=7FPe?{%Xi3nUNf-KtV+!v4 z;U{R1jLrk$UX;gz9ct{|iRmA|os%~XkvYTn@h=q3-MI=Pg`$^+?)rZjr&@lO^CQup z7^ihk-xBnm(i{{?d)p#LoBxhkL+~u!kB0@!tA)nS@SuysBfs?<%@noW^Qi>qV~&oB zyG41Ndec=TD*q#ue5d+iP+oMt=59b1_6jOXcIw?eMc`L!&X^}n=5bp11l!vJ#TztiZzgCck zuslu2(qpXW3H*PRNj*yOr8TNy9N3e`Y__4JBQF)FNOy6dvR&6uIk^Qc|9Izp>?^3=;j!Lm5g{#E3bVVw}QrWq%G2XcRsSLMuZ3SS;Uu=PNQN5g$h z5B8R9JT;X21QF}U{+96w9qmoiaUg178P)SHYiNMXX{l%QoJaS$>$>D6E+MWAX>@*W zU%5YrcA*JZabV~<|F^y$T;dcO{yd`@_kiEaEpKy;nrT$Hy4@SfH;p`1=TR&ciIfYi z@@i*CLjf*^$<73e)PPnOta0MoaH4?;a(h{JD3I7ln8_|*6E&_r!@zliSt0X&!U z+n2F31{4A`IhWy;2ox(YI5!F}Ol59obZ9alF*PzUGYT(EWo~D5Xfq%%3NK7$ZfA68 zATc&HHaU~w11NvFWl&vV(k_ZyaCbKD?(XjH&c@x{o!}PS-Q5Wu2=49>EJ(26T#}jZ z%zSgE>fWEXs8xG+_uKtG-A{Kf3do6-ROyAy987=`4)(6}%nVFC05zbNq?a>L4d`qK zbfFhxZ*5fQ5;P8;%?x3A6_~ ze;CaGCSCw}psTT(mm`oFKxO<_P;zi_r8hBl`7i_REv)Q;)E_RQ4vt>VRu-17e`0XZ z{|N*zcX0j#1Mmk20O;uow0HTq)#Xo65e9&av8j!Nhl`CBz}VglAj2Tf08nu7_)uB_ zs2uD8CP05nV_S28gZbYO>Z;-@ssKq9MRg@rY6gIY70}h*_#-hOz|_*%+1S(-=h-!TFzAiK?opOVRkndF{{XiA z2Nr+}5cm=3zo*A&{(;(s@t;Rs82@BKFQKTQMlUBVDz2a^{uiZ#^S=VPx>@}3{r}|n zze;Cm?D7|~oRX3pz|Ppp{-f)R?M*-Mxf*}Fy14*I{^~v+pc%#Ni_yJzF0?V~_uATw{AT7w>=L`+rku`qA)KF0L;BhzR^=rENb{AKY5m z|G#th$Kg*%VKKRnS!HJeuzWmBA5$!DZzk$sXZHcz1@2E*h*^CwUsG7W?P<4;9?MbQVBY022V{^fAh&mW+R{{5uGL z)Xaa>AJy>laddD5m>b)=0R61Yfgc}mJ}$=YA1&(a2K4j!cf%)IA7lTq zQQ-bYm$o-|0C4|9{ek3vO#f^^s=t5RjQV4hnK{_odVMslIUJ*cgX>4DQ2qaX8T|)p z2{&6?g^vJK|2IAVdD7U<%GT@uKKmcXG=YDTr}{4etXw3lJb`9PR<5R&|KRB#dTCeV zk0BGbx3C3%aQs)L{%7&neoVv1zPI}Gx&Y8KGySLSqtQ)m?13&W0QP^FfFFP5`wz?? zRQ^E>V3d~CR1?vr{Vz@U_n^4Fse_r7y~Rg|a{!E;osGTVm_9m-g`FMX!~8KTW#CiRb8DOY=D|pW*;xre>);??CNag zsmt`yvdka)kDvefrvJY#Aph62{hPOlh=ZpOJv$c%fS#3&8NkfS#Qp)1nal5g`I`P? zi~Sv!4;KDM{K7K07-Tn13mSyT4Lc z*%sAv1sS&oZ)K(j)b)S;5k3C1@qq9u&Ad@zIOezvlw&;h#{x&1RHjU5y;=ML z@aEE>d5nrMLmbgW&h8pmFJ0$U{L#B&=4OgW1DtT2c)`gvor~dThv#KeF?_jZ^JGNper3n1FQkl>|ol7`l5 zSC_^kv%e=L-eG?sx}1n>!;$6+&~tH@8p#3s)nXQ#q4>+;-Lwix17}?E);+Bdw@v2_ zYVzFfURh}V7i9^R!KHXDg_Cn#V;bTk+1ER~(y^{!Z|GncbFa{@ik-!XiI_3$6a>qN z`%mnp@JuOd3~7IRZ?Lz;b-@s9@<^Le?|Lp&38L=bX+D2CGVZdfEycjZ;4=HcOJKUu z!ir0DnRlAiYdPGR-K8*HLliAOym^YZE%l@%hS zTM*lxsQu6`2aQn@TUMR=wDVCMFzmI)%arlSACI-E%D{hP!afWff)I-Gy9#7MPH)!r zWOl)|0qL)n&(`UqMCpDR!Xc*sj$2tQ@%(;Ni*JKO_+N#ZBhOk;%C(A@=P#WkiT8iJ2}MQ}pjagxf{!S<@>vhnW5-%QBsuZ}v>h!PMrZs1WkmtZw2Gb^=}^^Mis z%#aHU!o)!_x+tbPzmE~5yXRb5Q^77Rde z%&pDJSDWKjvcx3-=~-9ctlaN&E22gs)L{d|2{eCb*B+V&)9IGGFt42S;=LfhrQ%C% zh2izGe}e|C%x!WxlKT`$_~URSL!7(NF5O~r(PytGql(g;oK>&QYg zo4g}_9W))U(CM}rESIxteHa1URw;juZeo{B>cE#7(u~gwrL}n%R`5ETd8{oauFTjv zzBxNQ+X{9_)g{BQP%A@iSTs_Yxl?XOU+{lz-eJE6%I=iW)Ext=(P3fY@$2pmDDgFLc4v zH+GL9C+!qN;(6UDcM@(0NT4^>5<`5+t+ErE+HQ)#>RW|thAO#|^LNfV{TYo`@S;xOeJ=XIz?mum{*U|8KP zz-q*5_@@wi8m2H|45GDqc(J<`V49RSWxr&7Za(Ni5Qrmw#x-ihf6Bc;`2PD*#-M(sz6XdGLk5_bS1Ff>0ucYz5jn0TjtfR zh?#Gh`69VQ>W(Y0!XDnp^=g3{)QJeL-8&Ky76FdpI;}Nr^m$e8z`XxOVC__3PA}~( zs%#=N;50od6ix#$x~ZsGTeI!r|Fsg4E;ZbEhQLSRw>F+3azF^~eITeqlOQSil@`lq zWmRHD$H+vz$KNC>`9|)SV`_ha;Ut-BL#YB6zk}3gE9T%*s+#sUB5@Kgt7zL~5Bj4!eoG4d}oi1G_--TE(T{pR+Iv~~P zaSy{Y0ix*6Jp;4trpBYxx>fNxu3#{{i@_@50S0n@4b@&@GZNz0SQE6tCcu}y8*43& zTrUZ82Smyaj{UApWJZ4$;BDPK-KwG8ss}H1I93CdhqQwK^>j^heL&1O3a;D~XPfGDiKh(m7 zCYKb3SGAIJmDxj6qB1F&B&nTa)Y^GF=oPxQ8X{ijAt**-gqnw2V*ZGTwu{RM>ah}%JlnhL#3P+`9iYY7)HhuDm3_yAw!pa>kP`yPLW!_1dn3C?p2#NA|iD+415 zNSymStcY3`DaA6n(Li8X`X!xgOTPE%i$hgC%2}b8y7uO#YGy5r_gqt2E4psU+qB;Z zKNq4w4B{N~lw7Z%B7RpmcddFb5D=S-K?+OIsxm`Q(7ioT2bpPyNvH>RPxN6wVyG#N zw?^2&djNm4JcNl^KitvyN;5L1zgxDfDMghSQ&o;@$T9I5H_1pZl5X7^yetW?<3TsM z+U#+ZPFx$MB7Z|C_t}Z*!ugC9O&M{W;5IfM3Ihx@7D;5TPsMHc!n==ejXDaZt(OB$ zKWokvZ?PDu{!>LC`Wms=^WF=~p2jcoG6cKqFHnDKc^*22;Y8m~6HoA7kV_Upp|wVO zJKT)np!n@Bpp6XG@oTyL3v2wqu-%;Cf%3WO&R(AsRfVuXFMjz~<9jEdr#;wkU-p%h zwr^jqp)TeemhTnTE%CBMxa~K~x#;@sxZ$5gkLcfH$C}W+%>=Cs+?*+?_j#z7zDybh zICOuX3PcszEY5|XH=>2fwV=4wM@~H7Uo_kK3^p|i`WjU;m!I=IMET6xcanTEv8~d4 z-wu;Sp>bDiZnKg-?1WkRju-`hOF8~(O&yJAkl(r$Vw@28CIatbIef%B9WlhW7$=+n zbnszkAd7-DdIf;1HRV!Bi&7swvgy)#2N!?fe_ld~%Wzt@}LeH|uwl7zNifSG!qKo7X0Ff0ZAc z?533qy)ApmP|bOA+d}?$ zuk=-et5}loLCJb{;CB|m%rGQgPfuA2RX8?5)WfMy0glQ3xSJ=8W1FVFMF?%g4tWM$ z&^{rF%^c>DB)aK>CW1oL?Id#rA2WYLv4td)^y^~_4Akgb>|_dmonZ5Rk?9on*@R** z%FnxHmG!wkb$KyuoFwUe9dYyGN*ruDf5C%Way;ya!V$KgU-Ba* zq20$4NIQ?n$o29c%d*yrU+bL3SFYU7UDKcBzd0kc8PT7IsfR@*jRcxq`>cNlfLd8n zSTgFw23wmUB|mA(vypG2ZXIeae2r#es=dk->K|Xfx4%>(Y^3x#=4??4KR)rNj{H?9 zyPg2f)r>|sVPqy95`?=)UQSe$0<|nacDN&Fk2uSK@$OoEAHQ`<6T1N_cGTa6nZ`~D zX}M!m<8w{Sj2wb8bO3Ua~^<)dyIchJK@Q{kG={pUb?L)@k zdGCDR@|(h6y4%SWjv%ta8R%++C$G!9b6P#xj%}dj;<=CZj%IyS0 z#YN1syWpY~aOLkCMs2KzNTsQ#xJ^DZ!j5hTT#3u`Vy+=q>E3@SvR{?^_hxhiIVW01 zZu8OI&`)8xY8&hqyrGD0>hE+$T`v!*)^QT1t`v|$vfVjw8X>P9gCx;? z0AG7$&Z%X6hpm61zKoGXi7;fswSjooR=zc-X!5pk!h;o*iMCM?H6Wr{KQZy>u0*c{ z?Q>FzY1wPy6qUj0Rku?N@$L~=BPm@v+;H0*H>zQjZ|fW+22$(!d|+DHH~&mU`P zu}}5uK|v+s1yODO$9-c@x%wr_k-qZ zRSkM43)clnqTP$x35Lz*>rtfqPq8(93fV?fvW!f?}VAe6bYfJb>Hy1r23% zfj^>`rFQDxMi^a+!7XxLiiosP*36sN)y)eJ#%?YuidNwF9{gm?lfS zFJ+rEoe8;Pxj-H8uU!#j?$}w5omwSc*%r3+ zj>*emxBR|DxGb5CpQ5D-)Xx^-^!pR@6j9pGgsHNl<13CH5h(X#%R2YDLF+WXttTI5 zCiU&BK4XPVXSe!B*16HqAXF*k$t+2K_Z%kr&K_a;&p{o#wQC24o65?p~3 zAqX-`EE@s>>YN=})Cg%-k;!3E$Gsm1-mULx1BO_UL-Sy%JAqU$*3WX4hdNs_Va}gV zIPcOWks<7bs1VQD)UA{hX#FZpMn8TLQ&NA%$nwpRE2{U=#m3IqtO45JrxTR}` zGwu4R_S1BtAuhQaYmk&2g(eJwUE%Hu_E@#^N0&Y=eJn5$9k6*llvh0 zl*BSWL$^0Owqwa$OOIR~vaaBIvOOq+{O`qm*qGV0{u_&ER>WP2m|=#1`mMZ-3Y>pH zJwoiS6tik5lTs75{Qii-r}rp{R|Io1j6Fl=YZLvOEetqzTb`KxuILV}ZKOS^zH))e zZ`FIXl$-qDn^W2Hxk+ld>~>~`^fM-2)y8Q;P!R6<4QMw5p^=1q_E`jVs;=9s6(zhfgs!xN;5wiE%%?_%gadzwrahm+ z_@$3Rb17x1vmOI<#$9d5@s-4Z@JpZf6len$?k6-O&RH@kf``NJeujdfNm<2CwyMIt z$$64mdm`kvkP;P&gjKKJYFX^-vv$T14mPnKanK zLhzj+06J`Nm&}+1OPG=HKn8#5^9q$1zxW8U)3t_E`jgw`uexCuOe$X0wX&{p+730c z9lN#1Zwvkl@(zB&)rrSK^3f+MgWuw0Y{qJ=k~sq)qD^1Fu3~jL#bt{<2&Ya+QXo%d z^XJezw8Mhh^-fsjrNWMJvIw-fS|t&BYXg@hi z)(LARpm@_|W>`q2n~dzMheeUZ*xAu#5bioi7Kz3bT~NMFrHPK||KP9(3vvwZb=avF zkuDB}t1k3yu%rWLCL@TDrcXLfHYJ~?L8dhZK$$@-^8NG`A+?`5gjFG`;rqUAx44>f zUB{-X(s*y|@Tju1XB>Y4#Dei1$W6BX3Je^fF4Lw-$W)Aa-rK);iCYx7E-OtR{1q?6 z@YPmhe5g^0Y)%SN0sPCVPVwY=*#zYb}!HWi!Z{ zrWsp#i(R)n_F%U0hcIQu#rNA&p&%RjkaPy-Uss|!mm6Sw@aTUiG*8|;Ewqo2s#3po zwe%z%N55on+V;xvr!LgBkVtw@SmhJXPydoid2WFP!#(3x!`=g1Wh$m{oyYv_Uw1uy z_u075cN+9E?=foB>ZJ&qY8;aanRBd+bj+X7uVXpaoUEPIX(L{Q`WQogsi%tIZsKWN z9d22sxGQZ^d4_+nAS1gyu2kZiSq~tx=n|x)-CAw+Zr`uVj_~~*`7%*3>g_YMlI4%M z)t*_WB4h-4tCbRdj8M{ zE!a14nddYj%b0LbaWSi#gh1H@?mZ&hm*l`}pwoWiaPEJ;i_IoSA%k&%iQvyZQAr)7 zrNGS+jpxNURqRRU3E6s0(QNQ>y<87v7hLJH`(BTl8j|;ro^YZ`=v^jyYo30{`@RAm z+jEhZp!a3;&1aL(kB4IJ&EHub<%%|RMp=jIVUa`4Azf!_5o_jq0CoI$!CpA;2PR3! z;1Gu2md}4FQL|4)ADkUOo4{OO=u?o8apD|5EJ@}Q%vy^AA>wI{6-i70+nq?AU-Z$; zFlO#koiudF@bVI$p&&M+EhH9Nk2bP`uj$?9%J2;&e_ZeeF>_qo{_343fL$Vqq(a@%`*a7H`?X$efq?>idN z`#pcp>%pn@_|PJfx_i#}&X`=923{GyuV>ZFdv;aMDx8(K5y@ttM85thswh^It{kNV zu1bn31BEP;_q;%puqgnLGeCP*#?n zJCQEx-wzK1Cm&8aPN!>mY=2goGW76j35S3G?vHMZv_jdpN8MqV_Rrb)Mwij$A1@O- zzBBWKI1=>q88nZ@KCFBqjhh>+(yF9Wgoum8?P}=23)j@iMJ3~5RWS1uuFku5ph_II6ERE!l#b%eevyV-vS z!4mjTm+27&qc0AII@bCP!#z3VdQLN}=e7%}=5MjZUsRna+axJp8qBWIAs^#+y^pI# zf(WZ7oyJ1W@oTOv+jRi(1Y9fx{ihF@oJcN(U~(DGi0>^)B@_x z28wP)fRU53mh(d6aLr)SVZ>(7YGLL}9%+fC9~h@CabJFJO6xIK3 zuucY;m|a)F$WiOPCnjcIBELUngrw2@@(j$a@va-o++RSCiLa5TG}pbIw!2x|eInz& zsl)q{wL0F^dld}4S+;nFlQDn1e+;@k+*T4G3GJQ}@@10T@Y=$wup0Q}LQ_Q^rRq@B zERYoXY3_?7rN#YL0B_@Sfj-#gmB5B3MIm@N+E#j38$C*m^(KgH5-Uh#{2X{;+n>b`Sxq;FBUL#b}(CuShN?(}l8)Hw%}3 z+`9>Ms*rr7z1ZXvUkFtk2m<+%8w>OOL_kyxm3xqK0;#_K=ii3~SN4`<&&}R9M?zYV zFpDau<{)UEeY*(5&02q=d7C(XSOc8i*U4t6OnT)<*9MS@aKR5`8FymFfB3dyQxH&4 z=YM6wa+KmX4<;U*!-J;DZ|CGo-~75PX7F9#EEZeYH@Caa#KJ#3)A;j}sP)l+&B( z4smaFbckr$QZ=3xAN>~vRw{WKwllby1^K@JHI=ER0s&4!5jRDsmpYBUBA6b8L`C?B z{QJPjsc6K8-m)2@L#~pCiVuB+Iwzr4da?@w7-H1V?@Om=jBLkZ& zoCh0xyTtlC`KIo#m|x!W!Q=12j%HfO+odnaozzCm71NVdRb>6p0&&4+?P z>zan;P?EhX0ANls!YULh92dPW0x}van4%E(Eb{>U>lrcm#zLTdNctSZ<>SA$`-z-% zaeVri%zJ+?qooh~L@I_e^Sj?^Y~idnPNt5V?4VkRwpXl4dbNeo@{vq_mw0~LOz-KX zH%nAL{O4!cl^lRWj z+1S0hqrWJ194|QMGZOzG{hb|+wBd&$3KOoS0#w%0+k8Tr7P@^WSquzKD8H=&_{<3;QoL-h_93(u`)B7eG z{tG^jvZhPkiD*f<)udJUouyb%zokIs=2A|Ga2^DFk+ei`;n{Lzt?i0_IR2RB9mWTJ zdYgY=a3|(;pqCv*6mP8#5WZLwwgI=&@rGC|!Eem}bsGoF!ZTv%q)TBXqQ3zRv4Q&t4$G%LYUb4-x)p~Vhh4ob2`pM!I zQ7(JkV*+|4KeHaG{E^>`mI*2mXE03pR_w(padx76xEae8QPo0yTS!mC6F;47aV>#3 zH4Hfln@{r3QeowI08Ev%A@T;^l!Jd>Nh-cFN(rMY=tAvl3F>7yqa4Bzb|$PC1?JqAZ zd~@L?I!}8;8x+R%#K7{HMMR)ngpi#&4DaqO{Jsa^rzViLs$WyVE~|8O`HhwDCXO&gM$8wTfYWdjju*JTfTd*; z#bzixQMNNF)&5D8vSQV!y_tV(TPV$R1Y_uvqwv#4EG?WhCAbosGYn~OiG~x}nppAX zd=QQaT3;RMjwq=b3)ZEU$WMb$^nzXKHxVIms`wKRMqIm^^Xnnr0xb9K%<#(Ap~v351_axb55)?Vos$O^aN4|w3f5deib8+-wr>!e6*N1L`hK&P zCiad%Eo>~!(S6Ih@Q||!gGrx`Js0zM0=24*=IFxA?Rh=#y0D@)Tr1KR8Qbx8*4CxW zRk0^UycY0#q=}qQ9)^o{X;nMMZGDCv3Vn$qWqf3?>Vgn`L{udqt?+W0v)Exf#IPO< zAWD*y6V5W!gJyplg_$Gn6dl>w-9n+w@ovn#FuoFr1OX!D9E-S%LOTlBs$(cf*2>8$ z&wZe#jj9si1lv#-I&OlV;jdIU(P!t|nlq^V&1_PdZWRf@EaNsCa@>8AMCVu;Igl9| z1_jmJYGt7acgOXGMl4enVkPiKSacymwlhO?TgctQxBGYMzJT$0_c7E8aW)W(?cYBs_% zLy2|oFmHe3npVFm`$_*Tl$|`ImwH%E43q#aHiY4c!|fNBgJ8ZRoClYG`A^|cRWr<` z0kL_9*6RW&7ntY@Zu}a4*=i?N=3RpLj24+imp(50M?Nom39%pMMqf4L%aS2vip#DN zYH9`Bf=09udZ%TBn;?Unw^pjcqB&uN3}{3ShkSn=npvIe?{Bzx1D80Ljms*MrnRu+ z>+=;C96U?fgYnUVOjF%lnsXMLd$8%**#|~TM9wfx(%8)!%9;`NA8tR3^68ZvbTmGJ zMuV$&MtFGIN*xivDU6UH?yQrm-6hF2RG0-1cdpBl7(ZAfHjCC|D~r)lWr4tkTsVvc zkwt&F#r#y7g7+nuL}c#p5v-%=u#hZ2+DPIpzqCzH3Jz1IIVDOcPDX;hO*-#Gk01|> z%PwY#V}dPeh>_jL*1xU?zB59UJ+Fa|+&Bbir6u7WGh=>7R0uytmL%{l&D#m8vn_Pl z&nzQR`mGWv^1``_7cObYHxieQ=TEbyRQi7uN=(l2>1G2(EY){M`?igQijk<{F}&ml z{h;@7Xr(I_6{cklQYu|M|H+$ZTR^P;WSZE)5sndBk{se)SrMt{P3^>)e?z~!iLpKU z!UC+9UIe-CJCyRHXZ{zE0+F>c-T*v|0L3>@bxuF9K13wwF=vkkmzul;0*Xd;k$is! z$a;D?bMTfW3f6@U+Y`Kyx?6zV0)_?hZ9@p^vIt}OtMho9gd1G8?_*_e4S*X8DaNLG zAiANWr1CkSLop?IXCU+nf02Q*HH;HKLdRiWm&SkcTDoA_zCN=32P(Ig3ODn*Vx?E~ zNx~BUd6X+jc#{djn2fUGw|KtJTXdayX8O`t`ddeMv+Uu|~#>UW)zIvRU zq&cQOPGrtxVdeB&Kxiy`C)C9lvAjN;lTd9Jj zrMUf{nkqfCNoexaPd!k(z*|7NA%?4CH}{{s;FUPiloC916k(Y%Ey==C;+!^9_hCk50INf=`5rkEGaFG9a())2DMm_iLE zueFmsn>b;E;7b6#DQIkiwTZO{Kbea4g4zxqQu`R}r!-@no$RaYlI1j(H9;T5mx@dg zy-Eo^{)JGH>}uRZp0hiZpsvZiy(T@a&;XA1h>O`J>ShnnShbg8+=hSVK)zuNNdm=o zge!j9I)mu^G}63>%w~(|R-+VBVQQ-vf}e|ox`NdLodKvKdiNAhn*pHwJ@(j3e7APh zy@UDO!li~TwW~_XJ*<3RK9h%a&4Om;>U}CF@!&twqzD$Air7uza&Oickg`|XF??Pq0m%p3Mx88Z zH0J{00UIDc+?G1TtoiNhrC04 zZr-iyTdO&fpgSi`KB~#LlVNc!(!uD2!w--{@j5z0MM@-~c;5JiuOL4WK0m^EvSU@? ztaCP@*YLZ7JE(nyImwAAT@c~KMx6ETq%DcLt^^Fi+?Xuw(XGI1I?<%AHiNoR( zN-e=4Q*L|M^rwYb{Jzb4jMWmfXBu~CtNW0h(!7ZzJ$>@78R7GiO%3gQ4tSy(bDi~* zVQ?Bd`z~a|5}>`=@ee$CK34=X`v!vnY(e}spsM@bo0*lfHQpDeU$hFr9Hdc!t2l$R z{T7ia@C<)x1v`Cf3Eo)Y(bYF3*;oz(HqU$NH5R@-cy2HFN*rh6a`8vPpPFU&dl*H* z=0Yzt%YkqG#j~2}!L0}C8-rQp)(TQ)qprlu!yZSy_NzRQ9!H}Mo=VGOLxiH?8o!ys9VV`&A4c`N)j(hUxye@vye zW!7kJab_S2xM9C0kE8)-GmA1{tdc4~sP%JJ-|{->8dT|}+XO9bG>Mkd#E4kdCB*9` zOz&-wuvcY_1H>8x7!qqWZRKL^5l;{c2xFjYcsA{>QTV=Qx_tRjeoXcSMVtbc%W{Dn z4qJZ`PJ}qF=XVE~@btU}uPA!cPzT=~?L+1;n>qMr$UbdiSKyZlZSN_@^1I3tOsMYo zjyEM_K~PZZYfSv;+lcJbA{UieGf@7D{<*MUhW>QA^Ic#t z3C&GJsx`!eA}Mi2w%}J%pbl7GHQs&^*R3!_gKynn?vk?ysvNsM#`J%b z9jx5M#zm6orGAFwO0O#E@=|&o+X?r*?PGihkdTcFq>&t;jHg{h*ei#sUw-k|e)ZL#W6`;_ds zQ6LkG4Y$%82!~{LK!ixx6N+Cj0cmbOa^4%x)Z%tywYx*?x(BZZVNJ#wAVGf!6UgLi zk2$AFz`qAk{xD_e;))$E=VSg2&qd@*833bjdR8m&d}pmIuujl>N#gtyFou9(5`0o> z3qSkwiku=TgfiluDGbjDR;v6`gDfS4tf2E|s8#MVOke)@!M&o5-$!AMW8|G#_tfBI z!+A_WHe|6ZFe+C=+WtmbVDo=K$}V3{Eh^n8p@%HJ0G2}~k=GWu5PY~5@lq3%f;k?+ zq;_4}PV8p(0n3ptzuVwWGW2 zZ08{Mo|C`Nno#;n`%5eP(8V;SK491Qkx6|}l&%@IlRB@}JvU81;*EbM3(AC5hrVMJ zvF)n`G9Hl<(%HBpRlW09->yQ|_!}Sd^<@Zir-8%mZ1jzIvWl&9JM1Oux+`|?iY)EI zJmp;&Do|v_H+M>YxRlX>ElqOvMO`9~DP`ICl1>tP5O;?M>L^1hLlhFg0~0tzmlrq{ zdRJAM$j@Vi!Ef-vL2rNO$0X0xW5d~opu52YXUdo?gX(M1Hv(CjzYsR&cQmdA!;^F;+V9 zn=(;zW2vlL$8?=JsZb##bKf}ZlCOIr?C3u=DP|{o-d#+4cLaYb{J72m86NAjItp`p)J*r7If#H|ag(EZWmE_pRtGiuw|0NT5%R-CHlMxMLneCJKvru64;Fq`;dh+Bd6&Ue4xl;ylmds<8MG zlKo%?Lj7m9r*E$k{SMr&Jqnuy=*{^jc=?mA+aWw_zR|K|izP!YA#+fCv`Q~=B8Y&h z1CuB)sadAyHwc5k0_fWSX+W00FDDu6HV}YItiZw2Wk+S1G6(2?pJzECEVc8L$zdK^ z3qxg5wG{imXo8C+UXB^`0=iysBXv z)%Tfq>oXAsp%oSg6784fkUJGs2&vV3z`rB6bBB#zWxW1cZ(ELDlgtJ?_9diJKP-Ay zJYZ0(Q#bwRG-w^fqP9dM9M!WVHjz?Psj$n}C?Uw_D862Q{jdc0mdfL_1dv*arBH0x z#j6&2?H_gKbgvcF*hM_v+P7ed@Ci6X78^d2JOQ zDbKLBk~1fNm{Ob?qcpqQndDKN#<5&+n!?$NraLQxGsJO--lj*{%Xe3~Q4_k@PQFh)9Y-@s0XyWFb0=2`A5{j8>9IBYK?mW3!0G zDqIsO`+n2x1*jMJ$|p5OSB1(uWP5(Cj72TPU_L^BYlolVF}!{Ed<1vC#-|e$Gr31H z$h=8pw$eeFu(MaPZS_gop2L<=iYXB%R@SV+oT&0=q~lQ?9fzfD9HDY|R-og{wVG`z z-O(esE;`@R*n!PKgtgh^FXv4io447?C4c4Ef+^)`LwC$ZKMM=bgjJ`*$zT%0l|lub z&7*ODTsiM!C<~(~hZCSjW27-?!T{mRbw@FUme=A@9~`w;Ie-LmCwiT5A0Hz59H7Ka z&hvPPh9# z&$k|tACAP7p$EGOAsF z(I8X>?G*X451`3v6(!NzlX=yuZN{@7PMS^>hYrW6hM@C2@RUaTOCR)dTa_7 zEUju?H&ru769VT;IqKjj9dm-UheWeiAZ`?|_E*4jexEUc>Cth``iyeBVNJLj^CWW? z7e9>wl!71ZE9QqL+ej6_J|1P)H*cbU|IKStJh^81sm+%A6d2Kharb>DED&_&Dz-=v zivXfQm2EYrjj~Luf~*$-60eQ_l=ib5j-`#$n?TyDs?URz<;Hm|Beq?EWLe-vCdSdA z`pg;Gk#heJ$ILy@Z;aTT4|t=yp55Qkrez_qUGDBu2Ac3key!h5zdMSmt}lLnZEaC7 z%PwR6F_?TCArA%$d74LOu7t2^g()^>=?`mp5T&>cxk_$? zIo0F46z0v^X3%mtFUoeeCVi=Y1&u3_QNxf8i_6FP_eQ$t=Ba`|sT^BG=b;7X>9HRA zVcpwZ$fqd8pAZp7Ds$Q3CQea=JRyLKoG5&so2L~hxY{xhGMxq4w36U;`7W+Sh@42( z%D3D01JP=^!M8nzzINeF$}`$obPz&Op`q5zQYW4R#k zHa$!Ly;4~$36z$s3PkX^C0&b!bIv~_>h*CPoq{`brO>2Itq-=jNrn-q3+9nfT27gj zbQ^ZfP5a!;-B=*=icC&u)oCcgAC-YuYg-#vk=cs>NK=BH+1ECBeCH8lNP(DeJ)oGG ziMkUY0Ln&P$i?K(Bk^^AAv{FJjX@7V)kB1w_%zki%0Uyt*Y^M)B~xpRFgJeg=aija z1BfY&9G0N`kqpas4D_apINm1gHPugo^fcOU3*55==g7`pXbR&yV0{$7++oyyGehv! zjG-??HA7FATQz`+#2MF{Lv3mZj8 z_qS1ZPQ|3jp1&ED?9(Otj)*0a?+<89zNLq0F zB1Y(lGK6cTVVV7dfj%rbrs#^fl}muY6E29#TqYhlsoEez239}!@R`*@qN@bTh{fw` z1%`rD+3sXdw+^K6y8({ePb8j%?A*Aa*C-i*HNxRX4~NI9sZXin^Ei5&$6^DMzR7zz zB3K1a>hYIvA2P$GY0Ga_S;dXSrb6-{uF#Y!C7mn8)4?M?BB8tMkPUd`_^RYwP|_<8x~0z zMk`Z)q}Oj%x0D?eid=A_%UgWGuqgCB$@J3__0*0()OLum0t3o;iIE95k?#reZplIu zizQ3TC-Gr~c-};MHk_Q4O<@+zc{UfvsbMp`<{FvXbTp)FaonyBXKurR4qO|^sgHtP#t*>DLglXC-}?lyuPKm0QaXIk{pO~B zi}$$Z$)ASY{PwLMDDnqRxUy+u+V{h}=7JW{sYS`DE+EM^bWoO3c^?pW7|aa1lrD8+ zWuhBkDPyLlWq~=JT`~iRZ3h0gxC*eZ+-*N)R+s{{NZYs|WDCIbr(ms}9x3aCE9n#!V!iApiJuq72i59Y!M1#uZLD_T;gGjCKgY`g}3 zco~rXKy$EbFIf-iHh+*x1lTQZARohf&0S8 zSu2))&%G!abUK$^T+V**xo>gXU_wN2<=`4RKsLutUQ7V5BryfoB42uv0Q&@_J;3Fd^B^yCzlZU@k3DcO1+E#i> zH*;Q!+^RAP{CQzAiwsVBdNKav6A4V4&ZEXpKQ`F7hVjDu-#wV`rmP2h`<=5HbrOPT z?vywxDqDn~0yQz0;gtvzw*ue@vw#6Jm(ha+6BRKa zGBz_f3NK7$ZfA68G9WTCH#9ky-e3t912Qu?li>p=mmXmW3x9&U)4034ySoJl(m0JZ z?gUA2x8M+*;2tzcAh^4`Cs^>)*?Zo}p8002@BBQA)pTD~cU4^_cRjtDhC*G7MZ(g_ z94PAq0<&Was`@!ZJj{UW?-No zfDdc~P_qC-%zs@0ob2oZ$TR>sAPDFRQCb4by#Xpfu$i{EGmry7Z}t~ZcX9)>n47sl z)IgB6EeOZ}F_Cg|_I9&0F3K1kkntLSAMd8&(KKEq7;UC)a;v zC8edUBgYJomQdA}0RVNG0dhK8+ROk|ZHVwM&2LhW4*&&_rLEa-a}^nF32g&)84kAJ z)c|k+JbxfDZGSWUuXJc3$pHRj12MI7b#nYG0D#^G40aY|WApU%WVLp81G750TC+Mk zF#HanZDR|`!O7Jg0C{%>IspGFu{+2T(iku#k-r@LZZSaF)&f#X;9p4rfqyAgBvch- zWwf+eAk|{|U2vAad(R5?0{@kZri_HNip>8~|9>WE>i~57t6#r;Swfm@>)^%;3HG}5%?iTWjqP7Y-PnF-!Xm4ts?DOTASI)! zCG!_cC)Ym?!0y(+ZU0{x{zvI-%-sH>tgNoC3~)5F1wp3H3}gY}2Q~w{y8$Twl0jZT zOMlA0iw*=xxx2dlPEF$pVjf1bhndg5Gt{KSP&F3He{?ArgKnC8{ z4ea)}N8rCI?En!$dTR^%|KGdc2EScONGn6`Di1q=6Y^q*++rD!rIeGSBZRmc^6#mT zwuN*E?Bwdr_CGJbJ;=!u40oq+<^+x|FVFHkpIZ6fnWeT z0O$g_&K5Rozr+4@8Geg7ev2U$@%MFhat2tLIk*A+ZLNTiH)LNoGY`m^y1E1XegCQW zPlU|D2e7oY07I@mWUCTmhq@gzXj4nP142hZO^o!=|S0dg-Oo8R{Lg9D;sXa6r9WaKUE zK|nV*059)fDj=kY|HT{9(BG^9Y=3fE68iE=O#gEj|2irIvT(Ar1zAI;oflx{>T2eV z%nq3_P97eBF9+n_SOUHN8bJUXE6529F#$NcgZ+Ou82R^@@bUoIBz}wjMtlG^sXvGx zz$X1~#K#U`ll_A@Al&{SP5_(yAH)S&g2c1p!)DD6M~gJAkafKSv<6Z2k?oA*HqPcD4b6{&4~#v;7Bz)W+@~5JJ}BPY4J*hu>rJ zM-QRz_y=-84*bJ62ZX-UKYt*Eq4OUykVwuzS6iolKadl`%X|IaYV%o>}u;}#17eM91uC=@Bcm-|3?6tKkN7(){>G=UcM~ckbfCs;e-q|2iNa^ z?0oG0|6yzK_oMEweG0jt|A&7+WB@>*7tjKEan8v?DAX>kDZDH|rf{Mho<@N6q!Le5 zUoio0F>~SzF@bd679~)uD7Yo)BW;nBvb>;iKuR#ESf3^o*Wr1sHMwg1%2Gpo+blpO zfEZ0i;(M+xt4_#Am4Ahx@=i*IL&e+zgA(qkk8KHUWB{G-M^XY`y6$2)$6hdhrc%Bs zZ(GTS_xv=&(TwBjfaSG-LDWIKFwp@Ge!0Vmi#F?(SY(`jTM&--T@k^#rwe;8r|m#= z%V9eBP=+ACqTQ;y#QYBV0+Z(KswHzuTFQOn^J@`LNgU4ECV%)@DSnUK@F*TKp^Idy zPa~TVhlkrg2fOU5M6od+U4EVu#bGBwzlDP)F!LcoedLFK$6ik>i*FTCM`Tpot(d;fHMt$ta)U zx9@sr<~buYo3QOO#ecXBQHgZZ-NA>ieyD}}_MTIq^+l9#1W86>(!4wd_Trd9&?Hve zUsATM9OGiq#X%Tn-|5$nm-a=3)~H#3WT3MV`!ousAMh*NA zGHC_~5q=u`C;`aJlxEc?(XBRbw?Q@tTc6NOxsYtJ1X)m3DwIuf7Nh1EKO;@j6P)mm zM|GGo`3rSbmn@Z$|bROz~M5=Swk`{>d2oRWep*mJ*AOq1cGdLi^$t$MM3LAaAzXZ z{@o44>M)!O*6A-i3z8=3H?xt~<|I=d-#_M8bg*2Xi5bvH8C8urdMe}7g^>l;ydakX zBQ4ZYbA#Dpg-|afkJl~FSZm>9T!e1YgV^X3wSVH>%6wG3dDaXIiZaFPUqukVMi459 z`MS`4%RXNWV9v%r`7|0$e7?KDNn50t3zjy2I&SEOeH(5xi4Sk-+icy%id7@{z&ZL^ ztUW0r?fqR845s;u5_ zE`K>RrTV*wcc13=J}T*-kIrRx8vg3)ki;h+6_os`$0*rwm7VhG+1F>7!r6*IXf{3Y z920BA5t{eDNoE^uq+&p4yNQsUhZHPsd@cZJuzubU+KV;tJQjJ6!RGdc6VI+u0Ffch z1~veQBbk848v)PKQk}Jo&kG&Hrfc7@7k?4GaPqR8=#gU!K!7ddn20t?1!1C-1cOD6 zPXsgKdB*#v$+mCx_L7`xs{6>o;AXX6dUWjgE(DVqEQadzl{XbA%geT9?B>wQC6)Jr zhXg%k9T4Q{4n~TWZs(|uTHOk?`f07SC(FrK2@7Pwx23bi)X|FAVgWm8O-Ez+8h?(% ztMQtq>N44jB18JT%f5xoc5is-n>FZ` zy(FneHr_wFD;cY}ge^e5P{Ur94FFW6u$h!3GJXuqSFcgV>AUlS)=K7;t7vxXxVS2Q z25uSzpfKI}Yrx%FpQZ&w87|UaCV%zBa~CbWIA`Hw&~LyM3kBtqHMjG*7k3p8mU58S zsC!35&S3g-d}eG4pxnW~#T-Zd zXf(Mzyf1a)pErW zFQq8I9jI$iq-v5Ee1O}=T{14I%XF9k&C3o>+Zan|GEx}^!UQp10nD{}S04of_Pe%( zjxKLZ4Bc!AD=p})P)1~wHwx%%SnBQ@fgM_89pX1A45y))UB!O((2AVPkJ9|*e(Oz{ zyNA^RXGb1%GJ}0%Ziv>O!GBS4TzeMs|?sGSpmhw&~9?zcle&FuDwzgAH1;z2?$C>uBw*v%%DA4aziB|UW zuFU37#geI8nh$z3SF0S+Q<3N{$C-#uI>!g3Lh}%D3?oY`q_1u>X;viPF~dzFQ&eC8 zsDDDmm}NJY3V-t;Zdq6Zwv3{g(YxMj+iz9Wa zV|h!-Oj72RVOO2vn<~7wmmfpWx2ogL5lf^#v37hlrTAL-i^ykLe^3$^Zf%QYtl)DC zogJmw#~3QSsTWfT9vnHG26%F-T}9E#bE#AZPR9UJbbrTaLDJ~uT616O0t{L^_#AG= z%_Y$q1UEP{3fcZ4j=W-fO_aX}tiFhXHS&-*F+SPVYQxIi_c0LR8q@gkPboLx6= zZoyD<&3_oeQmjiS1X9X-!-7~}*{>C7FzeZVoqyicdG|`18sk$=mJ3&k+zV*oz`SshyUI)4d|BTo@mo zuYVki_9p#^tMQc_gE2tF{>#B3Lp#pP;kGMbLiu~BrU$g{mwGbmU<%UJ+Jsk&Z?OWt zkc)p{U&0qs{#49nlm7>s}JT1h&hHS8sX)zG21>(5$vW=?sYr>3ux;JN{ zNT9F|pf7Bve1gxC*T3`go(N5>+%6Xt&VTuN&Ls76EbVmgVMEZ8=VL$i!q-sgOpkr7 z7*hDd>%eUMU=p_>$ zh<~z{0F~*|%;9QTj78nn>2xdXS`5uX>0&sWWaHm%V-?I+-MlC7u$thbXv-oF!hfTQ zGr(sAe{DMW-ezlDFI-nmVAv_(Sl#8;9n=<&cW6cdNn!YG9d-ewtw8WVa zhSTmn~P5g0p{ za}+@8r;4Q`P zP!*?Qx-ziSX?p73RM;t=nAYjA12bBPv8P26ikv(KbeQ=Fzq2*>)p8Imr*-=l$hjI) zKio5=oQ%U{+7o=jnnpQ(ZMPnDP2-o5GH}s#EN0aGEYlP`D6HO=sefR#xoo)8Gcj-V zU29_N(9T|U-Lz3{j;J(hVJA!H3$e|>Yxk{7Xp|n4xN%l_QB0O<&5o=O{pvZdW3ctq zdPjxWKf=&5;CWc?YYCoRE897qWE+E6NWBCQt8~xCm600ob>&HYE-|bMiabL@-UKo$ z3^baIK2|VAOrVA~O@GV>PE%iKeRA3vwR)@GprbrCueGc>R~q|jpZx2QdJ9x?Qet}i zas5S)joe3j-vnFBJ0ti*lAi_yFDLmNav9=?{N_}1$tcqrk(aD*IN=(z#z<-`ERK0M zSFr`M^6@^d1Y)S2BQY|6d-d`%$S<~tu^QisT4+e{m2)}=?|<&P!aul~p~#^EV_#NJ z#Y=1Rj%8L2$C#_rRYJohh`rC?)C)6}aUv2M)ie0g>vI82QUc78XmnTkr$-?dG0>D9 znh(%_3veQEK0?8bihv!m!3DXxk>9(fwR62Ok| z*k7*rildRS?pWuSZc9D!aJB!~bhf%YS;EBhJ}w|jyfvCvQt6Sul;U&S^~B(TtTrQ0 z?CZFY`G3SJhAg8od$f-p=#}OnQ6HIwDkVO?5-=+pe4Qd4FUCoj9B7zlE+DXGkykW) z&dE8!8MsOu+X;j_^26psczp$jAgN2JvN0!G1EV)L~pQVN?o>^CFA zSDJcTtd%-SP~lj3Eyc`YIxvA7WHv%OOOuAR(|_opb+^D_ZM~O=T2cQdqKaams_+vE zIH3iOms%$43AY{7_f48^TQKy%Md@Zf`{ma|gAjHp1WpAE}0Fzi&6NiPE1$$Z234@LQ#JDq zxQh9Pw~nNIxy}H5e@8m#8(Bdqu=dny*?(G?)4^6fuy>pw1Q)5XsT|__W-i4^$^E8U zo)5?&i75AU(quiyt@5Z|y!80h-`W)G-8z~Ki_wXm6G36Du*_z7%TdpGi;_J~xkj6t z`5mF~QPiFDUPN|_A&>2M^iDyGLiy08__Xdj*ozAjbk8HBN6AXB9_zf_F@pD58-ERo zu(*h7Z}b`wTVPL&=ohevXx+PNwSq9~Nlnsn**omyL#J7Luu)W{N*=pkzEko+FTyiO z5FljCYJ5Y%kC*8ba|kdH_4zPV*(YJW*kX_gCA z92159is2HtF!>rD-=03n%oa6_=G@STyTcE5^u&hF@#RWFhkaI^KQlHYG6npeQk-8Z z{AM-%jd*i#Is$?*fP3|GmM{M`OerHO&rc<*$z8vT3u%u&=GS9fh(C7MwWPe!MFT7{ zQ0vRwMx?5HJGEFRu)ZGa(|^!b5SU``lY@!bAMlJw!H04$slQs z@7XLGZ!vt5J(V4)3WY{^rDprtkKL~2c>kSDt#3$bc&|wE@lm!z4sdL>iK>;!2H8WY zIzH@jko9SX^{2^~<_M@fEE-=fCCgaMufUJg3->`Pns_Ql3Yz_S-AOc3uN~Neh@%4J zyBP>H2dV|7T?cIR27fgiGge7!o%7MG?~hH#p?s@bY{;{6Hq>k54e`wr%jD8%6MP6~ z!egP?Q8k9JI{n(r)Ars)?MC7HZ#w5 z2p!lq?0hT4r}GMKA%Ih&f*5(1?L#D$0>>T3?CPuQ;=K>ahLf|$R6CcHT?>Yq%uPWb@$jIx}ngGr$*+x437TSDn~gTNrD zwQB}p=nwW7#eYjK`8H~fd#la+!62oGNG4-l@-+OnTqT7SMK<>WHK}l%LGCMfDtjGP zy@ssbP=LpTJ4`!Mdm8dlcsK6<8_SUceV2~ikYl2Xh zEIYy9)8Oz*Ru6hW?KnUq6=tBJc(i|tLn0z?@&8=9byIdLe8{-jM(o${?8Z)_b1k~4 zj+rIG>G*-6m51UHH4bL84<}uWEp;AQSled|98I0sc)UKQ6{I**!P5s5+5I#xT_XtN zuQ+N942~B=S(-H3`URdE)Asl>p+928Y%6FX45gpdm!Oi#xVuDOHMF@E&h%2&T@e{! z6Mq_6QP7U3wHz}(hgvyarVgll&}z7>xsRL{hEE?PLOg8>u=hpco)OBVzAo!H5^+q8 zuW@-vQyRL0(_12rT5rvMk4{XBHH)-a3_v`abY%T9U&XGz7sX~2k<3*@K1?;dxl$@% zNsLlA-uVNL0G!?;NY?mZ!m(A*%G)SyNPk;~{kRUuD7c9YUh~@l2PW0y- zrG)ikO)cDhpr>sw-Fq&@gduX6F@J009u>!c>xENwq=%r4u!qIM!)#JB>cWO4(o26k z#L=)@Qv^%hKIgBL=HNLLx3bcFpUg~t=a|hzIDOd<*8*J*L0Q-Gg#AF!EptpOY%j?+ z%HR{;s?t-hdG#1ydRBnMy>3+gGxpt6{Zo{tj_6Rv!j^Z+eB5G|UT9tOV1GZ-VXM#x z1JBspX=Dri*+8xcb-KFX1zNS>Mhk+DHsKnMxg!R#DyE;s&;4Qqx)t&7nY9*@WZ#Kj z2J@+{v^IQbadt^X7Q^eXTapKf-28-v#Es#SaDJ#bT_o8^GK_mKX=_-Logk=_km&2BscQ2dxF!*JyAKsva0V}4StogeMGUB8V=5WGwODWCTFG6HpJQN*|`fdCIq?;Q)_p= zygpy@%aa>(X-J|uKY#F7kA}j+l;Zw=MMu!}HBd^n-jcsn1?JjZuAZKHZRa$;It_q~ zQJ+D91@x~YZ78U5I^!Cr$FTIEtgw_xxeZ6h<>wV3C`2H;+$Ly!x9eepHmmt*(1vSm z=rQDYX?=3vz;MCSMkVokNyr4Ey<}6N=T?c|aQYk*F-3F~AAf<=>h((72y=@kS!g&; ze{E<3>n9w|Yw=7N!87&fF75G!e4zz^n4G^o5?1YrvtIDeuwa|2O5p4D0Tf0rp3d{fFd&f@(1!8674 zeYYGXL7~xTuv;y{^JDOl;QIy`Wy_K@aeft~(YUb-ntx@$&`+*~unx&?l_7Ri<$EZ# z55>q`JHSHi2Idd$U^e$JP2D4Bn7of(w*w7B)H!NDtSr@>6O9AgCa*i|@&n#~+8L+L zQnBB`ZdVE06)#wxVgI?wxuKdr)5M_0h{EBnUE+93C-oT44DXkRqyAGrcQ1+oKT|ZV z@S@&O?0;b0h$gHUcMQ}5HEAu=e{ien8616rpq-O+f%Xj*cX<{MiL(4>4>6}_u)$}L zLfqS0d#0YywkZMiy67N<0GeD`?!k2@?C-EiX=*IUNmF~8d3P$2&_8+l#KpKgl`m>r zV{vLnc0>|t`Oe}~gLYgSg;_ROs{OFeui9zof>rEHS{DX>Mo2gI$~(ax~e zj@V}hcyc(TbiHrOMyjd(h@1^W&m3Dx{E(rcex!wsY>hcQ!rga=ms3okFJqT9WVnkQ zZH7@(0;dYmv(_?95K39mL{t#)&dvmrmuW`{7kyDD!pJZf-Z$7H*i#5xHA!E%Rw~=` zJ%9fclxr-4jnLeuqK|dZl@_{ixMlH}d3(;?1Vi;`=6t{j@Sn z0CT}5VU+dNtJkk@yA`fIG3?@p`T0Tken_$b_dj!0+fEDZBT`^Q_KK`ZZsym?*aj=$ z?%b8|sFn@Z#wQtD9FtT=NEe)FJmKHJCVCp!R}C0Ay-&k3;pG_eR0c`V5KaFId4KdU zqiNEy&=aG4k2=oNn=840gL#tQJ>z+9qrT>Bc9h(@wMne{A^hUYIkM@!n*%0oZ^flN zg7z$I*&CS((z|K1g`h0r=5Mev#)sp=1%QxS@$Le`+|#_S$ruA4gj0A7l%&OACHyv( zX#*1DcdiUqwuxU!>PNk0cgn-7HGjihgOT%4b3Zx^Qjx`xG{ab`9Njv%bB6@M5=`?i zgdQKC)B5f{*3==@#6zVK6lFQO>K<>bQ(a#4C#86>G8g6!-M1ZKLZf1+wGGNiQjrhkmctxLdj zYg7%NF@6TkwR3oU)V$?2Jbkn6Wjz1xt6FOdVL$19X~A6~1vO)1edAoCfE#_}lD>+N zj9J0bkKGCUL7Zhq!Z-FF3o+9RqY~LS&fZ7w3LSoqWDT}o!;Z956VB*=p6S}RRRTG4 zMVU#Mlk^Bq3SBY4*iN5-N`D%72QL~5wqG*phRJ^DC8Vs=C`|`-%yb-hi*6;}oFsz+ z97``n!n$^26r3^3TX6*y0GzjBkG!FS&V(h=@%_va=24Ne42ilFm8!czMX9w2Y|A_< zux5qu3O|qmii;@aw|TA7DF$*Fx9t|BS*~MiNm`y_9WTA8_b@AYfq#09Kk(ElDDy@0 zGyIKk>@utzO}g*rDs#2cYnL_j5uTjIdhvK1keUm%zN{wG^LyyJ-cO9-iQ~(A5_pk> zrCCQTi)Naol@_qXe?JOC{_!RE6sfbVf|1Fk+^lfmjix@gw+{mK4=X1bh4ZDRO4`UP zRGsy{f)M>O)F?G>LVr53hqafTH*>EY5abVD`|1e}OzhIsB@^;YtIcSJP~bIvJHV0; zJdb9{TVlp|kF%gsPt=_ucP_-hLrsJNh@8~iq=KHkaxw)qF5dLWgb-_gCiZ784NeiW zr}DqDRBF0+@HK8Qi1EO%LK-2;2*!Gfe}kh$+>CS`}`iu-0djIa&`7U2RLUMzSp8jRO5pEu+1x{5`0ybU#-ro9&U) z0~rdRcCL$G7JqR!yH9@=cu(dxTGf+JQNMVfRN{=)K61e4o36W;F&W2yL90SIgZTiZ zfJ2WjeU|(w%&=^7g@9}y_q(2-$|H?DBV7UdOVh0sJZL7Q3R zL*+&^2fsv#UjO5Q%-}`m2+PTc-2|*9NZbO45UTS&SAT%L1P*=@bwF$1VLPcd!JGvi z{kcHaq70^M2eV*dv8%mh?3~WXDbZ`ZDP$|C+)sSY zO=KaB5H87qmH%X!`+nSI*I)J5q8-03&#mveyD5}vP@^PpsTA7VIk=V`pyvUqdArd9 zo=a`pXMbqREAc6n*G{xo5$Z@#n{~fb3iRU-%I>dug*veXla65T)$FY@qh9uf4)KE6 zv=23{{2}EVLmMHrn;=<>K6z>RN|aNO$VjBIA5J0zg*WVRilg~$0jcKrFx<6_HwNR! zXfOGZuSFZb09@ZXKDCA;sVeZM+QCFwe5lFbO@EvW_Za1Kkwy#{dvL)*Ku6jIL(uOF5BeE6zCS35>E)rnU&^(g=Rv^- zj!OAYvOMY}>0hIQZ7`|tyB&82s|@4N;eRPm77@#Ro%Gq>-hBqR&O%E?)L5#cgasnp zp{5Mx7!{i~@qJ|pr`~-0q}1qn1>G>kS=wfY41_L}TsuE~kelNDu`VB5hJmV(8PQ#Z zN87G#o>_u&qLe8^gqb0=b<)7D;JH4cbYQQ)6`8B+{HcIwMZ@5gKddIfCVGLwDu1E* zpr>SMH|CIe)M=K_f~5~`?E<*bm9>smMs>=ZDD_f8B?|O}IMN>SknZauz&@lm!1)-b zkN1<@mbR(y1T{Dc88^x+rJcHKoTBJW%I%&c$N6OsOiR9#f3xDvLUR%HI_+W;{Oyul zYNY^P0`#va4f0?7!xK-KE!B*SYJVmJYMD;O+PfgD_V=vT7HnQSN5I@S>mlTuNCKLs z1*17U>2b3y`bzp!W%k9o6O+7$PIUDH22#p>s31X$l+Wi7kvbH0}Ad%~-qJKJNO~qyq zWUkhHf+zdMzt`}vD{6Wp9>!JH^~7{oJSyu<(&{8R(L-Xp+i$av|8`$aU!!`9hWq1U z5{OQ9{?qsfl-}ydGjal2S?nW6p14Fy;Z7Mey_){VQM6+`IJc0nZ`Jx(eI^Idem$b= z&wDl5D9_u2WwZkBt?5d7l7Cft0~ri>a0MRU+Gd;uO^RHKeNS3kqqq9@zwQZNGn3!S z{MLs)E7u`Vc za~)sU45*Qkk{u=;eex}Hl20VAB)ZvsGxav+v&%0utaHRQaYm6D!hfuplYVGbeq!BE%tf+C8XKaUpoi; ze2FdUS-WtWw(`a>C2QRFt`^ z&dMK=g>wXZ2Mdv_OX!!6vCd5n>lIemlq%$q*|qXpN-x1V_6!;A{bO#_bd%mno?qRG z_pWprq8c<8j%vp&nt1_)FBW-J17ZL%ESvJ8o0^bLJ7i7`5UEAqkRm9WeNUz&4 z`3BAwku4_(4N!T5({4I!J-LN@^f@JmE|0X$rQI^N_-nm8b5k}S9&;g+Z~6dQGLODu z(|F+tUTcKRd5E~Q+_!+4R|o}#Tq76bat(HT>_U9w)%)s zoj!zo`vAQfgHrr~qaZlot8>m#vtmh=aDCT@t7kNf%f%A-8{!lw|yu#i8{#N#;iB2&?@JU$c?*)h96&K4ew z6b7%UUnFp;oH|Xd)g6z+y@*jigFs)Q2Of~Mlkujmz1xhLBv!Qe%7>3ePvZQhh57I1xEVc^eGUC zINdHSboZT!E?t1)zFn#}%S{azwdm3yGzy=amZr5Uk-pX59H)h%V6a?fog5FoJfsV= z3H{plwKCv+1Af7hFZ%wS&ujSZlntnamVa9}U^nTWj$$-dTpig#-#mc$WeF4|kO_5s zM0zq85Lm3M9#+Z5;z>7=s_k2Fpsa~Ig<-dR+tU2%mAm1}FBATW8wyhq{h*9_;g1tv z4qwjSW<6u8AISF{AnktYq^cF|akQXyt(mH}G^}pOeixm)*8Vh&)%g8UF<~b6E`J-& zABr8vR8V3fK5NK*uSvmkrfcron=GoO$ek3Y!(X2S`}2}h2yoTY6csNP^%A!*RP^}* z24uSc@=PC!3&u;^X3)Q$VGNK*BA%dQvG|HH1t*HBj@tXy$b}V|`lQCW{RnNr#4i-M znt`wX#h&t9l(E7Yq}}yulq4TF-GBA4kXh^{o36w1^j1&Fj4AA>BGew#BfZ9=;qt%M z*l0_WtZIc`+zaD|&;4?wiB{s^E%N6Q^AsY-4E+ zt?KE!;q_~eIeqm<6J2fbh;ry&BGs24g|9i^&mxvC(b2p7oKtFHnZG2C4S$~_(#}Qw zyc<8hCT!MLL<*ftnQ&i>@f@u@s#j7vbo~l5X$$2|dW{lEU;_uA`K3Qo>4?2=73YLb z{t-oSL34(6?L^ls!d8U3lKnZFRR%}mw|7=zk{G)dwbKT{eRut?w zL5OR#%LWk|Bg0q4JsP9I<9_=OlnFshyL9#YJe@7^+G1E}4xEFIy%zIHdYen5&5>r1XZ&)6jmNCGn?pR`6J;8N2mLdpr<`u;v`D2lec znm*Qh@iZx8Hb&1&0Dm8G4>a!c9X#m7WA`8g#RBd#nEYWyE%QUsF-ijAk|`avxINMV zi3F#8IVwF4y>tpY-({PIVDdx9!)m4Jp#Ww;nZFMo6uN?b@?swJJX#?sFlMR4oKM7H z>1)+DN48#D&I?s>CRO>38vysnSXx%KTC~PHT(+mlD)vj|>_Fj(Fyw!4bQl!eN#bHs z8D)Mi%ao5uN{OSS6A!>xC~s2!KT+2%zZg?D+&Zn5t(kSGwI;XF$%&@ ziEz;7(E`bRS=twJBE%%d$d{JYwHjK8iYak&7J9V!=f*!a2}nOkN3dI^H4P)*q7o_s z;0G}pTKQl*ks1Q5< zLg@3zmbUFAr0i)vdl)9qNV-$wIk3`aqBAWNjV)4_Q1 zDv#*<=I}dB&p913%(OHfj$PC=gnLn}`Sc{zN3Z4vixhf-#9h-g%!PQVg zAC01jGj?hXy$<4`nH>=u+cKt77kE*sE+mS!5j|U~1*;_YssWIe$y;&#rm1 z^7>mn_A?<(#&u7pW)-miHVQ5pioSZF=!MX%w4tQ{i8|xy^{A5Ruqs^J|DwaU+k=#7CsRwkiZs8J`cJQRLhq6YbrY+hx4!6}*N87e~zBBd64m#v68 zCnY6`c^XrV;RcPvZi85?9wq((WmvHe@sov|K_h>iEyl2w-+6-Vk%LbEF}$(#6N9;P zawxj%_|D*U=rpWz&SGKm;Bxmpe7L%Oww-yqN5=dUPwzu0mQ(0WrQCOR%4v5pdl#w) z7jaQs37t(Kk5>v+J8{*JRY($eXIN*%1$6S2r{CGOOyApBd_YsqTY43L4SWiW8+G}ZYf zEY0vXJ_(<@VDv71Q>5d3fvl8~qB-Gm8*@~RPeWTSx2alj%#&tNNcD5cYk8`y>MwaQ zY{5FglCm?g-`+-%0tDC4SG6J|MfIcClGhrFdD14o@EBh?Nl;MQMVI1ki2dZ1&SHA3CGOjskQnZR8+OcdjF38iL=`FU zrJ}(#)#B#i#j{Sc^;no9aV;MW!EJw#U{tJIk6(tU<40#}=GH+vV#`$? zuA}|YmcZcxdrTlm48;fb*qafnsH}cU+*Pl2A26%eVfp|!yW(NfS7(s+1#v(F25E~N zw_`YI9FJ)tCzT{dGm6j7W9y-33HsA`p!W^kt_mMt1}3dNoi~UWjbVG>7t&=aqaX93Q;^aREIA2|_tWDiwh(j5C62k#2km`?h>Gdn*{OQ8bYgr|#1 zuxB0~wRN(Ir%)AYaId%3t5lPt8G4K;JA3;j4NG2f7A#`4-nr_;jxKC&k=f>^APweeq;@k|1RAf=G~AFpFPjL|XzhT&ts5OQC--Su zNEs5!c2AgMqDg-~omJbt=01xvR7?Ax<5%W?AqkJeDBEf}XX{W?*todh++lNCm114Q zTRNW{f8LKji#Gq!3CD-O1y-8y&Op)(_)x0TU90uFbf4YpNN$o`$hVVl%Y&W?>$hj%21-;B?Phyr&jO@j+@R^TZt(B$YRVpcu2 zMRufs(;Qh8+zl3#x5s$SF-%*-@WNcxI5TpG3T*MdvsG+3Z9MIuWR4$;eNYag$zLy$ zp^a*!%p@n74vIr@zNyq*jzJ-7~5zT%AI=^3s34 zINxG?eZC!~A8o08ea)hVPc&qk<#zCtk4dC=5-`Udk+f7?%2-lFWaOnDt5N42sopomzHEKzk+B|8K0JVY+wumq=c(tD7XBzK4JbdGM z(RKevq2evcy#Pv0-$_60Nh#|YuY%PQt_q(nHy2cq#A8cEvT&iXTAc(Hfq4>j|57*a z)5y4Zt``PL@xm=G0XMe0yC+)hQq6zn=OU;>=-U0~$W1#&He4)v7!Y9_d^J{7g#^c@ zmuY*s*zjnUm&dZH_ZQB|qDpTO;hn67H9GS$mJNz%73KNPHgM-G(F5W!o@`S5Gv$_F zc{9^PJVM6au&*@>Ac}lW2#Q{<=-C;=_+Fpg=z;j%_@f6+4ox^RC+*^Gm;`?X@>DrU zn}cMI(3@_)kb3Q#xV(grEvLOScC%ncfgUvMc1F(STk7|BV==%{{Zc6d3(0KGR8^70 zaUl1=p0TMn+Dh&WK#|ZBneg>Ow?3>Sf8WXb{$*YID@T9D%P16$kG0S2cZUlFL z3>5=AyJxOqRy%y!qDP)xHeG+UCE~c}G$X^YmMl{o1O4}8o2XEF} zsI?ux^=iOKGQORgMUZs)kc8diWKMbw?2hekSQD;l*BY@47vaK%eiMK8zNZB-BJ6ar zXGtw5Q&{hkh!~tLlusfo1z^5JpL`|aTAsyDk&bB=ENWOZfDcpf-M=mfy>~h;lyBmG zx)o{Lr+Uhv5+}g{v-UB+$ECUU-RZAvs2o$ed133;YrJ*%?QT)w(EL&|@=2m+>;T6h1nka|Yv(D%%9(DmT1SH#jm!_(zyy$_m*m1egx zSvhf85zto}EcW5OlNNmxL5m8F+HqnW&(<}D;i!wunVzJ@q=og9LL7!!5 zF4xY~>qn>V5Yf-yr%vf81bd#%TyjV`QhruV(j4z3zr_T;q1b<7(FR~if`lgw*tEvl z5%BprSi<)!WWs;^k&>I@ud@|1%XVW?64y*Fl8V@9k!yi&=8J>Ic{(-aTVvuWZ*>#1`Q2*PI@m2Tc{16vubukT=}9i`)m%xD26eQbsLBVkO?1&8l5;hVe}L{O zu(|p3B#s9-CDO9cwxt+v^#!js+icphFud?CH(i@-IGez03ADu;ZTqQ9I)L?S6k^lRRK!%v8z zL~iaBE;J{pFP!X{=tET%zf%20G6x|)J`?H5YYC>9gyh=B2P8|vpe8R8DkqYmW{mI5e%vbGJf%JNyHIo@LcB^K82~j%-Uxk-% znC7-duU!$Ixqi&_37!GIbZprt0aUJK=edaFL)T*Wju7hKZ|r|cP8%l`W>1*$;|xTPCO6U8uPkb{;@ejjISDF9 zZ}eZGq0fnr?nqMikd<-GPg@2yg;I<-La@cI@9TsJ%*W9&qA#7@7@<;wAwQcBdaVRL zqdl!x(a~To)X1hV{B6Ol^OQ7n9iE z#Eyb>e|RR8O6rVZ+<^j=p!bf`!PhSQ5lu=!|^9KHvW4wze=vBF~L}uGS-GseKjiAT}!Z28xI* zO0#XsbmY4v%45ik3S(YNj(mSdL$F00=`k2c@vvlvD|LyPuP-Dw1rQv3;w={2*4X?4 zFw%!w;`19)wV@*yu}@YXR0d{Y1B~*?JMWEy;X`F>0L>waDu|^%RD5=pOUUqJ_=qlSMVAgU{#bD--V zzI$-U&I;vpCRZnwu!3v#1TNj>iCE;4jR0&=7jSGG4CbJWfRTOC5wQ=d_}mxo`+7!m zJSTi*2Ea&(=udM?3idyIu2dhLQ64SMg2cu_Kr5p*5oPJvy{wU!>`DcS%;60=V>}7D zIV_Zn@nvtRdIhOBqpyD=>N%H>9d{;@uAqyL!ci5%wVM`kt`^|4UMLATW@ah?sDlKUE5jBz08 zOKDQA_2a~_R61IWF4w9tM)!xvdwt`Rp{k)Cz8|M#PMY00v{Z<=kQr*ptC;W%nxYIa z8V$F+!>?)d@xG+ZaUYIVMkf={NS(Du?86(q>bNm1-$-|hpWVJQ32hvCPc&~r2-NSt zk2!jF#n?#)h}e56JZ~vGjcz5cK!#!0s>=r{SV8$3-F}fEU-AZgf@l0>fu!s z!$ZhTIC{#IlCHJ^(L4e5Xv%^%z3$8=Ni|gZ%@Vc7iQD6ybGnS22|x2}0Eny)ggEK1 zU-7}bpTTuPVE@3aL{XEz#2~6-G2PO(pd~O=4ZVNx{(gU>%gp{OjvR=;`jJgf0ZDkx z8-izk-{^1YVoS()4woG{Qe=zcth6iaZChQS%JG|0py{-1Y5uWL!f^aKx}G3J?7@D+ z%Cwh`yqyJSohb@6YUo2zc!(xmSJzR?zN|ALi^>?VxYsE4>w2))#~}*>Q0Ph1TaKBw zrX_|QEwq0TmSHAan|MGKAg^!N9tsw`mraidXWgHw(~3rWORk+eU5g=EP|Q4fFuly? zev!ib%j4ZsS92}sND?<2wKl|#jfMA-7jLsg`_!k(R?zk_X(Mjzemr{68c$_PG{MGv zIRS>waU*!lVi#6^LNlo|;D`uA_W=AKU}gF@@<@NKQla~)gTWs8ki|5gNkRaqkJ=*Q zPhDSq@a|<9m&{w=7D6CkMD%cfKSDWoPQ}utG5Kxx(7@xXxThd>qz*s7OEDlpX2#CM>kxfqlNq9bWav@*@d6Io=)@Y&-Rr{_>Nm&jZSGd{RvGGIn zMkgg8tD^p9eXVms-LOPrS&i}lOy@>6^Q~4KB6182c=QcM|JAbQRsy;kajQ)LbJrci zf;qfsjXz&u%R{a$`yd<#n+$h)%>od;r0{=k^?UyM54uqb_D&Shk)byF(84Mgaj!A@ zl_iUBGjd60e-^Ex9KmcQgW~2${UibX1DU7%h@8l;e}Tc)s??}So2i?Htw-wwc_P+y z#eb&aP(CeT*Sc#9txfH`2{nq59t#Sc-acQZir=59dLZCl0(<C5*$J_ z7V9sZq*$p5Pyo2k+6E&4<|k_g1m=C!HF2du{qK2*shJJQ-mZ4s|45H4f!(_v&|H5S z?$J&X;ccr%Ov2u0WEva!-ln$#!mCj$9!u+5%rwr@#!p~pU)0i(5DK}JCnIy-qe&LncXc}eWix5 zj-+2YWmchy_Sg9$xLIbC{nZ(UN0PQq*_5|Uugo*r-NsESjG5mEa3}08$k~5lU%aF& zCp#`f*a8s~V~EZw+Z%I`wf!&q`YV;}&jOlj7^M=^4C@PO-+=jZl1LD$QlauZH00B& zh5{yFJ!;j2=_C>e)_MMHcqy5(j1^%Hv_9{^ z>gAF{mk3)E7u5nO)eqXb>H>cqhSrM$bON7J(=d!zb4xkk7X9t0NTxe{t$yhiYN6x6 z7Kf%-^;o#}6&7d>v%p#Ehn})E!||m!Gv4Y$zEv6~5}Nv*@r$wACYrp6!U|cgKfFc&qViFmaW zTaPFY6M24+?Q;*rI1rA#==wG=LcO_<2UQsmv$a)*;AaP9^Rcqf7CDt*`1W;A+VxS4j_XGV@5F5A( z5f8UvR{H>)J)dtJi%&1|-miAa z(6OR(!R@BE zc(0jU#yWAeO8i@T8RLjWw052$B?*CcID}jS(KY1=PLGZ)t1KndVdC4bsb&!B>4q1x za7NQ_X*Cuud+UGTS69>hHW+iJ$1=vi^40YG3<3X*)e>m_JL_P$U0* zpQnNzTvaa=&b#dUc4d~?Bi?FA8S~w-K^!+{huq9YntEz~$9NeH)voLBn`#426EhUc zQ6;q^RyzX9wR@e#znHOG2++3T{RJIa_ts2hE)$2nFeozGI|NFFKDkX*JyU)+?h`^? ziV*VhiQ9kbJDsf|>BKSa)hD+kX4G`M^~CJn7Ow}G*G3`}5!sP8zx3Tf&T6H$*&}7r zRK>s#;=cN6-Fsz!#;n<$cuT3VUGP1IU8csRK9v2TE{4y6kjAkBl{@E#adH1_53rb{uudn^t^HBc-l8P+COXBFnPcQ;ILi5=;aA%cSA-7)H3s~jsGtZ40}%efL< zhvzTrPz)?u@j`Kz?q)ajITANT%87GYoyLBR{yy)iZi>5H{V2*9&5#qhcknQGd%3wh zzny<6V;<%$99g>Vl@@9c3`ZD;{X1qK=kJ)&y#=dH1~<7IZKZ#lx=b>a!)y8ugUr3s zX<1(z-lWoEY6{jr!iU8)D2a0Fj1|FCJW!K`tOkGX5JOvyVc)&JSt=G@9;hD(jGEzO zL&fI{!H)uxL)P|zvwS=P+A&Qg!hw~c^u&KK?44X#%TdLl=mCjqNcGBn*wMJ1R|0X) zM9IAIS8uYJ!(M{XvhxRz>nreP z(uP!uD6bqoEOykbvelr9+#NZcre{WnhRvxL0J}7WII5n0p``B8a5=;co)Loo6v=;_ zPtg6aHG8!qKRpj(67UlTExa0$*7a{2;ys$vh+Zu6pU8%54}$SnxmG>p_QE9(y%iKd z^u^6ZPsV(0KpjCJajt_#Ih1#zzq8loTmB!QW;9oEj^$PduUv**>IP6755+gs8;z|q zU@a7HFH@0nn^DbhJCEmq>1MsTk&Ff=`}oAM4gQ0#C3Qr{3RkRIh18(xzrDBpiusDC z$w^=-J#i)<3m)#;*_Bf#5CngAz&jHf1p4y-3(n~RC@jidp^6WbN8YSC6dp>9g@mJy zS4XTCsyCWq?fVmWs4u7`5x*FRIC?2Ja$gIpn|UF3UF4g{6DNqW=t1x$YL(@k@ZYYi z$)ZVW0$%w$i3SNuyBd5KdY}b9v0D1-K;s!E4UNkL8GD4?DY)~-W8!}=b*{kB*h-cy zN}rIKwZn)JLhKX^*cVB2qXTn8ZR(cq^FdFi<=;~A57UKUDa$FUg|1?gxF-iAU_S}s zPkSx`QU(i#-_w!SPC(+`J1`5zBIEe^?gJl%;khIqo_TU1$7!H{Rk4#=D4f>D>UEWzd z^PaT=M&Z-IBCx@M@(`0n4H+hWHpbP%tAHSr#b%4))gpMU3eW!yzo;*Hg!`a42La zF4(uj_HU@|7&kO;nw~T+>oX?9XA;@{Twj7N6dtIdDpasU5vk@#oqsdD`&%KOK3u?2=LK@o?%^gNz_awOWo>}xd*;9pUbx#?Ec`TX!D*Y5p5bOc&@F2&u3~OUDO3#CMZ#p`Z-Tf=p3&jYd^p}6?FU} z&fDKIlIoYj=Yaa=FLKE=esd_@szTYTa|eHKFq6*m27kZTOtBt_=J)E4!Wqq_l=C7y zBEATuB`(gN1!8&hl-03flA^iRlGb7yKtb36XjsQVyt^Deb%}7)|gBFZ98f(9* znn0U;-qBoWBtL!!Ub^Z9-GSe{37K33FZ@K$Fd1zb4RO@-I#U`XX1daePx~IT8v}pu zgRER&bHGB5wKOoILoS{k(63eS^?{BWx~hEW%A{Hi2dbURo7NFr*9#-5S}g}NQFd$k zSz}w0<`PmOX$M!wzAs+-FOI#5K&VsO6$`1W`{*BcXNY};tA_IIugdebg9+0s>MJR| z8maf4ux&q~q0WKA9;0U9a~OQwGF@)ya5Y#Z-FQfkN{ z6Y|sq^56J`rB}6(9J{^Q5BC6{j7m$b1_JEKfvK(sE-;XN~7) z&zjb-LteZO;Vl>X6Y1Be83GXv2pv!DE2RXE*oqy+DnBUp(b#@%#^&2N7NoEQxi2+kw?&&+F#oZ=F>o?P2w4$p`J} zK%0tNsNrS8&YVa>ss-_H2ELxKRIb8n}PfU@pK$%af- zvE0j{@Rwf?yXP8S`!q*rk!WKd4z<~@%()YFcdm&jC1*6Hq*GLWQ| z4@7@1cCS?zQsD1kxPU(>oewn~ zJanKykaR~wGIc4jntN$rx+9~uK2CrMN<(0T*=R}UAibPjClOu(UURhJd{oZ8IL4n( zv^Wh}B(Lal0BNB&y5;vAY?=!UbWDdh(XlX>sbzt1z?!Ftw&zvuZ#Om|%Z7KmNXgrB zS4NmS_aEQ;0ZD?64gGgcB9=>+u`>n~0yQ<4;gtvzw>rNG0~rD{HJ7oh2NWqWIWaK` zFHB`_XLM*XAU8QSHVQ9HWo~D5Xfq%%3NK7$ZfA68AUQBGmvIOLDSv&HbyyTy*Y+vt zZpooRI)?6$970N@V}Ox{p}Rpk1VI`kMWj=Z1}W+86p)aT{>F2jbKrU2>-w(wXMSs~ zz1O|&y=M;tjk+egl!b#C__>2Ul%1P{OBev<_JBeGyc}HU3=A^PU{ff>!CuxB3Kj-% z^Kf$Waq@6+aRE%BFn+y3@*Ls;wor#a z&8-1YXIJpwVQqU0u(K`19<1)*0{LSJfSsF*>wj`u)(~?Wd$5ZO0QjGjssj{a4%4Rd zpAlgbvH|4PRsL59*be61Kl_=wn1k)10KtFQ0{nM?=RX0ky~Y390CV>*6F8-mWnQVi zV*UFN|H{ePn}0i4Kuv5}3%iH^MELmrMC|My^!>TjoEDD| z))M@1s(*jT$<@^MQ31>{%ZC;)C6*AkhZVp-X$M#5M+;yjRu4PE@>YMI8Svv0m@MlD zkuWo?JsqvV_KzxHF~}o?`TzP6!YsFWgs{0E6!XIdwEgoVeaORHvU@;oSiz%K+_0G) z9>lAJVY3j;79F`~Ny0KJNcS|9|^*_+Y9XVMpxn$Zu|#J5G-f=ENgo zxM5>I2nWKnxPa{-|9z&wKQ&;tM{WUOo47zc9&H0_{2&7eQwOzn20uD9*c4EAher!w zhPpo7Dp&{CKaZY^xr6g#D_}mm{foRXW85Gv5HpzBjs)_6|9mt2zpt#cw1bB?I}rBz!yX52AgoT1hsXE7>dal8VJ8j!>t7D` zRR6=45ZIp#80-NyN1vT?Fc%4VT@}*u`+u_(xjXyj5c2YBYh=7$cLWg1IGy8dt%8y+ zKjtKDVo^>ykg7gY5;i*JL;mdG_ppaSdq&_=ib6INPOf`h`iMQZ|MH~W3QT3;KxQ=} zkQ%v;cbK3-iDROVq|cP3J9QH((80U?X{+G2)n)sY&>p}JPWFZ|6gw8eq_tKU`bm+kvxmH&-G#T^au6c7u`{uR)@S<-*DL68;P6kRI7O zcB2!&JHFE?+k$lY<~KQK`jW|9t6uCwqU+?(^uBO%h(LLDPJy#G(%?1Wxqq0M*XxPP z#JiM~nk1nkrGBPI`w#%{LcYM{KspXdb$i2XV|*S3i3u;vOaTBrA={lNrk7853whvew3!0r~>Ss(Fp!n+UnzQkuV!3eh)zht= zJM-b?{vS_Usqc_$k!E@Vd}w04Cmh&J#O1h&l{+q#5|vyTgm0dNj(?1DH{vYcOnkCJ z8Pqu-o6FESN7`p0VgU6SM@udh=I=Ce=eQxdYb)Be_woC%s$jLsW1u^`(^}vPOMG4b zRnjFV(w-dLT&!>!o^;2IfbESwIgTJ*rb~%`-WJ~Cgu)L7w!dqb2Hh$&wq|fCn4yT21R9% z_=gJQ*)WfH<^g&CwJJ^8*}3TUTj$qI$wo0hj_3P>yRn?Iaxm4PfOab3x zbD29F?w9U4i+}C9{-)k&!AzP(Jvtb26SGt{#Yh+YFIm^7q9aTX@pe+YSh>G$Fh?A< zHj^LhKvZK`-Sbu2gHFP1>1ktZ?3Xm59W-inE$ZL4lPIk_5Xn*`f zIMeJ2q3v7J`kYj&<&T$=(4JCLL`u@*0T-W&sz2~1#eelx@ZL!ZWCV4cxJu$)ELwh0 zD5XfQ-W`dzm6?gqsmLVJS_TE7gYJ31efNx<#_}0zdPd@ghB8 zj?kBVVVn>Q*BK<|OW?a#&08GUTFP#I(y4kwx8JtLc{(*gPHi1H=t1xt9k1Ib!`n^? zZg$x2B!A7P1oau+NeffIZ1rce@FLGN@(UwU52nzzH-5|aP4D>Ox?$FCdcXPs6NnI& z`a5w-BG#({JD0P;!u^~zkNV3*h!xK&D$qdqx31=JQImCFLkQmR<#7QGL{&ObN{nex zjktxYv_K)KlqN(lx}7o5!&1tl!|JyuI&rgI#eZEizR;lFl%R!{Jhc%V1{73K;JjOM zo?}zjaZ4*S`(suUT~mK99CVi(eSOrO>GtFZ1LKA*!umGykk5bGYFud)%I!s#Y4-%J zGJx$gzN3Di|2ds`>BH}Sc!04PQbNOorr(DRa3u*~rpR^&d=!MJ@P zlwqc&qnlqYTuumbI%|{I9aXAdAt=}4s8YKsAEZ|%5F*$oV9KzW=ndHQfGKxHtKk z`J3im!%SSpBZmXZQMpAZA%$kR;DteyQ%BQi%WF z-LOqb%i<3DdA4&fAahY&5&x!0$k^1aAIq&rmk6zUN;z+3nX77^$IDxD3nZy+)PEl; z7*Wu@dS%GkC{iMH;y^i<_;lsFWrC&N;7w;mRD2&-{jX!=$=lNPgII)|wu7zoh^-bI zj=S5U%az7{;`{d(Ogu?tL?ZTejfD+YsMGe97ZxTR%ui1Z*XSE)RU@GC z6Rk;O5qyVzRrQsqo?}5rtZKl&aUJ1}T`^>F<@q;m$Nu9mOi{FL#-TTPsA z?dO?dgqKsV{a+ur2rI8|6FEk1DC3oOc=kZ?q|I*ejq*)MqL|{cPAo>HYQe|LL3}1z z{f7TE^P5xDmhL1_c7Oob^{mWLp;{uH0l3(OxwCVyta=d(Y=C?(o| zM`%##;Qvn3%H2-o7{FQ${&X(>-r!d#6wRaCCP9y3{??KEJESDFe_^on9b!%J8o55Y zFQ;xofMS=@LVsed8KPiNh|Ir6!hgd}B{RhKdTOOoq%T)*`A74eyAmpyzo0%Ppd-dy(SR-}pKz(h z(l;)qQneYw@6E-WtV5S=m@ZXx;7go--YShhUl#42&G(Z@ zj|<6|_{#0uyvY$N=>o;{KtGK zZ$KR6mfrF5-SDUp^0iz(Aw#27D=I8Q&D)WD>c4`~g^}KytCI+xHo?n)jVDwOEFn4f zYiK6S-(}MeG=KNAS3BNLTT@tmmL}Va#h{}nT|;`z{bt6QGy=jfHeqph4}}@B zz3&%Ui=op1Ok8KKPjMoCOB6eT$nlN-dCAW77AVs_pns?LrMMII@8sj}289V}eZ4l# zO)EWm$cCQcS!IFOfCX=gG~F({rpSfjI6#!t#;+SEpr|1;Ac-| zg0Fd1TZbMzGS}@rJoW~D{f2F?Gy=!`HbFq|&f2S{FWuGTGj1qV2C$rIfcraFGJfOF z{phS6yVR)xm3jD45z4FeuS~`=J*H|st?(5LP=Dq0z1@8=+7rZEw~M=M9>=l?6}c8s z1gm*YMJoEPi)Mn$()l@nnFgYZotD@t(k51!Hs?vHN)j!P!gBGLn!8CP)3ai|Io1p# zQW+jnA;u5bSd(~kjk#kl{`PEIzNtrL$oSZdJUl`nAa!w=E;fJ5u-})(`Ho9|v zP^99|D2AtmFz06X#i@x_)vdmbm3+RRhKrAL-uE+q)98vF?Iee$HuaeRve&7BEuu0n zxv*krpxJmQ*?u-wbG9e82z)q2sP`)70e^sXkB09K1rtX&+V9=|@JqDq4@Cga7?q5R zpxS!$NS75gHI$`Jo{z+S%o&4mL75w_I0+d&cwNUSvsDF)LPB9c=qKsXU@U4xBcz5+ zNr9I)Yufz44-Fm^&06r`WNU4cgDUt`OJ4-a50l(@cGiO}^yWW(5|<`g9!0xntACQ5 zNJ&O-_s?32m5_0~GT6G1u={vm*o+8FNSv;2aUaV5AtYLzo1ovt|FIJBR!i0X<^|wW)l^(e--vRoOa*xheW$&3}v+Ato(?E#H zd^u_F8zNA;XXk)VlJ0f=IDbsRh1O)=Z{SR@TEfrQn!?;Hnc}S$Y}gvpr0zw` zDY8R+SJviwOCQf5+xY2H{WaZ&gAQ1=2=e_K5(eqfRb!T692Z=)E`OI;RpNZzpkro3 z${Zo>{TmJs*=wYQm+i#H!w8?7ujLg4%8A-=(6|L}IO>^+D~qlOZDi?+b4`C0a|8m6 za5RK>U8Ct7yHW|-s+3z_W)g8>yLiwj2A@p!)!A@LH4$6Cw_PjudTGQ^sWGpcH0+Y* zKjGAmTHp*lQHpgbKYx_QtANm<{78{Dz9mc${XNAkf+p8E8*#sFW=-+F=Per|R8v=6 zCE9y6DTJQLjZQIXX?gf?NIjfZW%BeiNr^kAP6aKl?MV3r=2O9Z?$m4T&->Y*-Pyjcn(3;(r>dv7rb}4%_^}YkKi_*O z^2d-$thlG{WiCN&DP0yCBVSgZ+MU_FPVYwQsLcmIb!GN**nah z&-9~Hs!Si&mS72Uxj0GTpM(H#Rxp-B3JM0Pnn#(vJLnZQqei86TVe)-R$hzgL_=WN zjgAc3mZL>B&bZO349uQUDEQ6}jfoC}f|~H?k4CVel5?~RsmWO?o#qgZT9mu z?d+d47P5Vsp53XB`+hVe)K2luFU5ufwbM?hWgCGF&|_-^W3uHbw_JUyUnFIF7WZx` zHlh)N7EV1ukh9?VrG_4i&Y^R zP0ih1ls49IXx;XH>d4&O-gHyhbcX@g8>SZ348N_^B=!)mkv;>$ZoR(KROk#3+gH%z zB~P(SZ)9k_Oe{HvbS}iYBqds1PT8indU^kSe&lH+jQ4^PZX5b3NZA;FFM)R z)b(}ff(4e@7l!XZhehTcBvq$eRY!T&XA+{?3%(8hkSnYWzUYj@&6*TsFE(pGQJ7<` zY+s$QuXZW~^?Gy9PO4w2a5klnH#s`|soP`M^!we4w0NeRJhc{EO%i9~kdUsvAZMn3 zjPwBJ!2c&Nx~Y@x*nM|mU0G{Rk#mN_rLVUxR{Hjf*T!HQ2reO*G^BVYo3bwPLWtQk z^`D@Ji*QHteNv(^Yv}>+M#Z{>tCu`0fojw~J&$g|ISvqcsOF4lTN3r(l)vtgexPw* zt*#b>OYn7ik1ThZFU+i*rHO*(=8rCL_dfHX8Ey^hTNA>CdYRx|xIpcqK{fkk#pZB& z+y07|kAv+7Y|+kONaBf65Jn|sFqAVdXmmk!`(801^9|QiN90GWL8S?LXOpu%7&*s1sNBug}- z$i=fh55#~z3{l@#&Y33t0&lk@b#N{Faw2CGYCDu@vSjtk;&ZI)JU_|S)yW8XJ)t4Y zhLq1DU~AbHrh)AU_+?LJSuXQC~8-a(A0f8%9Ea zf=-0~k)%_fyQ^uc1!qJ)M5+^`&RZzPt~G*N=(%AWa*{L^k!-oN2)swQaAa$L5=@Ml zOl)}HufNv!$SiTx=h=z$uS@kZ`nwDBcq?M(0P(WAY;keTnRQDh)|XjkhP5^H?L)lF za^`#|b=^-m_oLa5-A$IPLH>h1SDMo{XoA$*`qz&c4TlTQP$&Cu_gBe+s3q+!*ULvq zU)0teoqTEaoG72jBwjvG&tK#Z%_-;%DQ!?$|LWH za6(VD#eFGPaRc^mEloQ0R%yevo zBl?cPML9j7)nS-SMlTEL7SD(KFo4)^a<=Vb(s8(b%a)Wr(Y0)$10lOJA|$#~khGdy%PQ8dcTTh7rYOWR-RU1X2)Ffu;P~S=Ft^l?)1E~GqT-Y@CuMc#y<=N|~{ zI!z8rS*2Qh0a-s`s1lMQe3{qb!*lz^XwaN&+BH?DZXRKML{~cWGr4ZtrLV`gwa%CUCFW!eX}c<@f}>Y z9r+ZmG*nzNB2`2iUE6jB@9hS^et#cshq;y>`7us>*ZcEI{ZEgz6GP9RYE%_Qe-VY2 z%e?fT!(3~KZ7#db!|%*6KpGHqGBKKkaC&*I?NV0sGA|o~F|1IE-hs6~ zI#1JNl8dxCL-JPU$h^wLxnbjAPZKofG)DmLpmrH-N zN%ciU#X3jD{+f5zaRBO` zUU$2NX$Ipy_}!S+<^}`Sh_X3ejZutm7du*skJ13iErACSqxzbSxzT*0MUxw{lsvr8 zPQo9J@GTL4WNldv+(t3U>dox7L^dDP^4rMR_>TP~vAW=*OJIGp_mXFXma>7a;tv|% zwfNQu0}n4+7Z70VsviymPy&xDvhw)AU&FAEY&3#9-f?`M<HlmRJ*B<#fKNB%vuY=3beIvnVCE#hjbD2L5{ZI}y z-J~H%7jyVk4LG2#E{rZ=Vk&Z5%B-0~?<(}9;?)flu`3OmWJXs(HxD^kC|7I2H~ztT zFw%V8QA4%cb9kuR^Zr6JpLTeYNboGQ67CbWXx-!TsCGyPc3;%%*^K7MWWB10W4DIl+`H@y`rS%Q^`>b1Spp ze|bqFbT>O;^PX~W2{Uj>#zvcUj40B(T3a+u4=PTETC#ilN#N#ZzF-YaD=ly5|Cqzn zB`8W>@C5;`V82~Op~Oe;YdLRyJswv9tA-lajV1oH6-hfaNL zx1QZjK#<1YYUhvWk-vryzy~rO(XC`8+|n_B+UcEeq@<0>&OZ8JNDK+j<`U(j)>V1$ z_J_GYR9wsOU|>;WR{p#>1+|X_DXX?KE>LD5ViTBXWpWx!iu_}dqW-12uxf}MIIo|H z#^M?={Gv8NS|0ZEE#p$*jAA%0_HkJthqO!8y9@j0V?x1_=SyQ#y94lbzO({H=+rYc zeXnSC6^tj=-Eq(5T#nS0-os8D!KSNVH<9%L_Cpb~oFKB*DZ+RGd% z8QmkMEt~c5s?REiPL7&fB@b?`W;+4uTfTeaSfccyijdI$_*2Qf7H?UcuCNV_**NS_ zx%Z8!ql~c;fuCi$Tuw+wszvIfUJfmw^`7FL@VDX2$XcOjbwb^6eX?j{6H~ko!ha+r zw)d(m1{Ih))$o;$ig-KKh}dhM%hfdSJ2iWKxkbchej6m&=-!K5h9LY&^m~b+3jSOX zbh8quwJ*0HH0&*o>BW(%%tKvx!aol^UOF0-(UfQ4m1y=O{GE)r`Vhft2Opjjo$sNnL(=z0)FL^8V!T^$5n6utSeK4 zHdg2E!r$YiD9xx4&8EpqFIn6uZwnvuwyw7}3-iL9P*4!R163cH2=jHI2xSt-rObm1)k?6V0hloI6~>pmeuCqY|nrtmi=bESIyGOHKmx zzD5By#dWMJMH>-y6nctC8dzPk?1vxs6AN5iwn2`~$KYjWUttfgS``oN>+2-Jy<8fx^i%5xlza7#8-!V0E5>Tnw;M71F zMXm|nk~?zF@lc0WJ<%%N485|H5Qqg3sq%>d^$D6YzdezD%SDb^ir=XkF|XL$X~R7Fa{5#>IhG8pd>GT<9$<8G5q+p*-qVZ zp^PMf_z5PdH%QhHLkhOe<+vx9`7J&xU>dU3ulwQhM{^BE(PQ)hPbW#ty4~y3F_KiM zXszM!QaoWmjpj65O3x~3}^(V{G)5Q@x!Q`ll%9{MZ_IevNKNqWFWiNJS?A; zm!A}c<(j!OeCg`aR{qPd$~&`vymHjauuk@}#?qaTC>ff2)Z_`(7tds7vN^%eT;Fqe zagR;SS9BOwfDVNEl9nJggTj=MLk3+|4l4bE(dg6M61y?U=wsa4Sks2H zO08rbPJ_F5zTOb(5T^|>f{iq`PIO~mqh9bdkv%tj+q##DfvB1zbkD3K52oHV4zm%m z-ut_3%I`-~42D8Z-Me?uZ`8L2CdS9Ln6(cRp8B8$Aj#Q5>dv)D5lQdm;?6bo>?i8b zdGmukJO3oDmE&cs=)Us9dcivrm5;tsUA?!O=M zw@W|}FU9rcJ>yJ2O|L9I6_Oy7dMEmeJK-J*%9qP+e9<6PNIl6#m{}o(*8R#cXCby@ zfLCLz3zU~o@>P3(42~hdIrWw*6n_%&?lrv>{0q0?k)1v4Fox4brGB!I20DDIo4z&9 zKOP;7&BI9VCiSe$n`3av4fpHkn6;3k{E+C~L8=71G-Dtoqs)&J&O!)i8-F=tF-Sg? z!Ot8!!<+wpB1hXSAK#c`Ee>pKA9F@Ii@V910Eqpi1nnNmcjhBE)g2p_up`v`=2_#8 zDoE`4*lDoC4b2KM-}5$V2rRHPSI#YDHRwfAPjc{)W{9JeU1e??kC_lR*3dG2Ipgd? zG{~{nO@0PN$9a=bY;bbiZbxHbWo5HYsF|?Z^Xg}&oa&(A<7lPy#U}PyF5eT3TPIB) z168+?bcXVyw~>P;xajsBd1#BXH`D5Tc0OH(syg3GR^#+OD;K!uthQHT2k#;L5t_!k z;jd-8**FILU!z_;Bohr47#P1_K{krrw3VP6#I7%C;x`uGPuz5-vBZ@5oRsZ9do6DZj}==aZH-raPuApts*BfeT>LfH^X1P zy$={&F8FpUKN5;ER#n5lWd0RG9cF!ieG4OV@n_%0A2{I-jV{UG(Sb=B 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

    Zn_!8M@TBG%MT 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

    G7 zHog?O>-=z{61M-PRJhW-Gp~UsUg)k%eDZZpV*Pnh<$SI*y=PF0F`73*{pvWG*LkbY zYn(d1TXtD4Z66#yHU99`&?f;nC7kl)ootP4O@9Cem&$1Xv4B_% zH%4?tbUiSUcz3oDpq=V?BZ4R*ZpRpI3ODtw?$Xbd)c?%kcyk1Aq%WT91NR5+wi&C> zFbvAz5iuYV5PEjRVp^#M;}jh@?N$TqM)HT*H8imC*T!lYo)5oWu*iQhWSSlKha| zjM2ZTkiS*6IM48Rzm_1c&0*F3(EgJ8zTckx1%>HB{1=iKdXkHSa>>w(oRBYGw+@&V zVOi<)m*Qu?mdpaq(gbow=shJ?eI4xaTS7jMoF4#rE zY$uKh?DuGlt?1>itDUQni&>Ev*kYG7D(85I$(=+dI567&~&=II~V_B}n=|4?rMO```u>OjJZv(CP-Cfpefe6B@q3XToIhh)ICy5y0wu zc=({PkC+}Z>E8e!Z*lNIU-JKVsmNp@DJP(;`0(K)VL>J3M{=SH{Er?A2?&Y^iOGpR zQWoV`7M5oE|0TJDp#h@)^Bwpfiag{`UBlsku`LDp812AT{DfPv$WG&~d5L}FzuEin zW^dSs7dByX-Pd}Z?z&@Ne_c@jf;_aw+c~948@@iMz0Ug{vP;0>PR3`Ek?LPDPLWWf zX`o~f4StDwf%RUAcHVdKswkytR;aPTF}8Cjw5kMyg($3|F05e1{1woB+9Jj49`Cy}zJejH*U9bULsjMy>}q2-}=5@Qg5m-s-l0=oZ37Eog%4|7+io7O=TnUHs~9pq4)@^4XZ{a=*8U9hE(Hs zC}UmF;02Ux3RN5Q86V0uEe$#O7z3@EI?f2*#%i2~{-~dO6A5*hIzF1q>V^J-!hX~` zzi?>0-soyhbHvg}4E<5J6ZUFaxYE9PB7kE`xT2%CbX`Vo;avv%=QqxJTooN74&8Zr zE`}Q34)D;*CZ&BIVVpnh^9+qXeR#)N^B2$sMBIjVV+VAn-}pFs9v^Cf(Adyu41rQ( zXMUz=B%M}A8a>r=>oR{n`fQ@q7bfdQ9u&D~=wduH)~3{{FHzYP-l26+9#WEF6O#QlAms4eK^n~eOXHtf8hv$T}Q30LtV_^GB_89ghIoTI2QtN(gH(^-iSZc zh?vpJwS8(tL3qfSL8B2j2FRr`E(pi;RaHZJu5KcGsir)yxMA3+wb7}J+Vg90QftGZ zg6~5>M$0^zFf9pc&A2hx-j@d1OIR#!TqT8b;ra1?PE}t49%>I7XWH?L8{S-DZ}RJB zeRrsW8s%jK%}|IqGiI`{SPg;YL2pUL$=Q5$)8-dXI{bp3S&! z={5x(#`FZ-3#5DF=p2#>;kaTj+6hGP{44J_4>OzK+CW$-lYWwW>nw%*98{>Juy?-^+bdSN7AZBcq6!0nbNL} z1J`foCUp>R0b&BVqvk6Hh6)A+Mp&rWK3ys2DJ!e+9dbV~z`5B6u49Bxp;axEk=?5V*Bn8@>Gp5ydvuqI-p z+fx+`X5Z?#5smrf+A_TfGkPAhhihh(gG;!^XZ}Xky{E!;@&Fq@g8xomqiz#6 zdi>pGD&?I9!u8C&(QoQFeQxI$v~6k^b1qsnx*jOksqqlDzgW^#hpMe2q2N@^z((PQjzroYU>M7I~*L?PR!y_kLu%xhTBES-q zU9+SitqTD0S4%3=hFs)E*|0$bLWiWBusQbq9Q#vUtq)p@_N2+Z(2s84NP?mSt3byB zQtvo9+cW3vrIfO?u>ecXhdu@lj;Y~6cK14t&m2$(J8}_(0V|xSKUNqe2p#~pZ{k52 zxV~$`UI|hv*lnIUAHF8Wog5g((S$}?3Lxl7QQs>_Dur?BO^pQxRcigctfb- z$*tk%Mcur2Iga(_RN>7xs$(%qWf482D9n<8gEFpfi5*1{F;mztDu>!8dSV2`&Iie%HtPqd% zKyn_KE6+a+Fkl!=0bGL+VWG9du3b0u9{}h22LK}mfasY|1FlkF&{(!;e+>)7gTkDg zv6dJYS)Itokyu9yNa(G#1?zME0dzKK4Bql58(%Iks5?g#tyt(m_;d8QNLaPJOHu5S zTKDpU26hs78v&4w&w;9M1A|tKFOrrNx|drG+!)(3!#a#swSv1h@xaEk$F{RE-ar`_ z3LQ!35M!g~GC1Jqh+(n}lnX51Hg~Y}?d_grXus$YZw|?|pepKhMPIHwe3Y?3f2<$E zM-t3)RvT8L#_#lRoP)q>_j2}_IxuVz9lz4%EnKgQBP=YYCMc-DtaPf}Z28E*hX2wk zp|t?B8~M%N1kVILts<3PyuOgLN(DmqG|e)JbV@cgZviO8==VqQ|bQcc2CRIuIu^*&SZ0}Iwi$_xTVPQe{_$4g#$w$ zdgrLl-aAKg!`-Tdz=%=!@}82mI7mPblO;%mjYRwbodnfh>$_k%k$=L?=FjLU(cRtL zZi}yj!A1bN8Nyc-U?(6jro;Y(Ezkl!*dCYc|A(tRq(KjnT}^2ICj{GrP6Z&q3UQ~- zgfRSMWfN=<|H%lW>G~M)2Zk10?seID{Q}JNmhQSW*nTu)sHCt5SQwVj6_C+Ln zW3Ztx8IqK4A`$l00Uu0_dEXzSmG~si12VRgz$Qc3Mf0sx%fkMIXRV$EG%XgUucX=N z_<8t4#6?5VS_uQd6{m$<_f@x#=Ou6{yJ1(db%_NwE(8ch)sIJ$NO^1&eu`&%bTu1T zC*gn&+T1a|zLy9Cj%E1L9j{B)wp?6agHK1~NOdxV*6o2;^;N(sDbf9XUCj}0HJ`|6 zJDc3iOFtm&PYfXO~jK#8@czLh*bp4VH)wi-(C_z}9sy^V}V%x7d+{ z0pk86j5@ZB{O+G*r51$z5Zk1T~wj_-6}5Qeaqn)KYIleo!{7@4O@e;v;;6 zX@io(IwZm~-Cfx*gI0jK!vLeVK4^9?yUmC^e)66S?w9i`!4a4|$Peu>_a`2=;C>vk z0zchvqg$8=yqOTuM*fDn$q%$6oBgx(_K2#hU~1Gp3@o73XMJz#1~$swp!KK`I4S54 z;vNMyy$tJEc!WFyHt!z*^<@TKJF908nliwYoZEoa>t4=luL;GgX*ffeKzQJcLa2V_Asf%OARd}v(PrV7z{SQ_M;+MN%{9R<#bRL^T* z`mlo{ycpVEfyd`_ZG6HXR(OtjA}nM?7#vOy#C$WQ6tUajbZxy1%;8q1iAxTzQo4D$ z2Rfg;0?!lofP3wL8iXptR%9*}45Uw7g6M#8zM?bz`Rw6KNKYiNd0`>S4->6yM{mPN z3HocRka*ZA>K;+w=nmCxX_mVKy!F+%NP!41qy~x%>muHhHf|&b)+24(FN(tGSUmN* zsq_O{LKL+?f9*ea5_jDcqho*#iaO^x-bFlwZiu(U0K@NV{r8!2X_M!F@?@@~s0l@U z(JEGu>}gw2M*#$trr0{pJpfYx%S9W$i};ESgfqBNXuy=nLZe&S_5n=H_a(Sh01`tH zwxxj;s3(Bn4LF4a<+VV^z;G-f-&`v#An{E<_=+L$K5?fI7>_bOjOOBn8xVP0*A}Q5 z5QzF(U`#l^dNUzEu=PxKd9G)eSu2}1T6Mr z44-4v0wM;^><5wDeGIVdST6?{=g0fa!;>T!$fMXdMqU@CL7H#;XVJr>(%V^6dZ7VF2 zu{jJOMml)gqE#(?srJOQ^&2*@WbMGML>nv+(xDp=(XqlMhUtfZmSMN`F4h9K64y7T z#g`NM8&BKgVFlk*4g0Hrx$)wX!t4{s>p-*MCk`h9J zf<;0jTz~Qgy`VEDw=4ETu#}jAj%A=>uV7QSbK54!N5{3@b=? zDIJQPh5{P23E*Fn%d_4lgo1#rrh>3~9N4isEiI>nP+-P9V3h#ls!X%RB~&Q%8>kpD zQr<L<9#c$h?2rQX=`fmtAiNL*I2=yC8y#NC?yad4cyIB&2N}_6HAK|Cnm6rcHH{RiO#PwQGx{Vlq_86X1#Np(k{nZTk~ z@ALlS7rnY21Dq(pWZ3P_Bwsg};fRBKF~-KB0gR190~i}8BB4w-g7G<#Dox|32tiy# zPV|D4Fi!#j%3)3TH^%3z_oN+he|yrs%)O|*Vl#OJrsZA?B03tl2vPHR^W05Q7+BmL zIxURPIY;VIj4^T^sNMyqR%}kN3AvsN{Y6MHQF8Yk<*3eULEazTh~f^w0<}Nb6JYj% z+?@@xU&upG!CrjK&Y^@_V=>#66O!Pt9gbe;NT;$0a8a;On^6|edCe^fmM)&_z1rNaAgkO!(Yk_rYB+LF=qM5+p$EA+Ce7#2hxa z2>cU{2FltTaCA7?o6w>g9!PUacm9~VfE#d48eALD7A|z9!BtSJJvHo4r}LZ>8*onk zbW+bbffx_#B4i-5_yp~poPuqd2hIs-PY@xXjb2a%iinN6_~^Fb(i98EgweDNG2DZ6 zc{~?+8Y2ah2aIoeYzPOXq4_Nj0$uz^O&OF6FrKt6pYvHEU3`nm?(i}K#1Eq8WT1>d zB$m+AJShz@y72p;5Q+|91bUJ&Ht)hAg2e<82c(bSs$h&B8tAm+yA59vA*YKS$>|AQ z(e&IP61K*Lp)NxGX+Nvjvj7~a2TMWyoE&_Gs*+_cUXTPxn@+|Ad}shEFOCNmv^$9Q zEQ$Ws^CKDeaV|nWi$6u%y)Hg86={1eFhhwNdNFjsx8i3h@$`8$GowPgHOqkND?vx-nJ@vTPm(EmiSX(^6M*XTcEoXX^DJhdi-2#MhaW&YqA;26JlPH@FIl>o5YUIGrNYLXko1N5*C^1J>3 z?kDTu4DeJ;ec(4QVqrw6#F9DjMxbB4kG2NQVQ5Y3-3d>|_>?T1jp!TpLsh-nfeJnH zt#K{Ld(o>^q@(XvV#(AEaIbfL}&11KBhhbNu5J}`M0 zAccJy#N}(QJ*sGJ>tK<~IGEEyljZ=Q61~i~E~l8~ZPs1@5x8@n7*!*&5xf*yPy{3W zpPd1t2iAAAdq|HW0K1sAdgz9_4*(|bqrXLw0|YQIE-MF@l3r4~dzpD~Q4_wss)mgs zk=rbdRKnK*J~{!v2nV;ge|A`hLQ+et&3I2ea6Sy5)%O-fZmB~2%6Cg&DB<%Zbsy+H zJG&8-3>=ZlUSI@4FvyC@>)!Zk5#X$Zos`WLV0;YJ9=R5m20Ro64z5_(L!~i!>VA zQXCE*SMWR_K$MkawOK;rfUn6pP}S>*p!o-Y8UZfSAkieo0$~m?lRaw~okIhd?4?0z zM}Vu4cSx$~_?Ja&Qw> zIA0VV7NWk|GE&}z0KPTb;bNkpg)2LxfXu%algZ=^7YPQH19aDO(%J<=L>Zko38S6g zEw~P0^%{uq0Qa${E{1Nf+Bm?;sU^Cy2?2auwuVKhkp+?&a58uQT*-qX0|R)P-KQx* zpl2ZOBI@xuCL-j^%`erEMkQeaq=AEOFVM!Dfd6}vu7OhKZt3s-&qQ-FlyNW87}uY# z0F8tc9NR8>Vp1=h%%YbhIf?ieX}9RKfl`Krz#d@z63)TGM{x>NuL(L{=R%YXH#}c? zA~4n?ZC@&sTk}D-TRI&W!N_<1Wt8lv?D`6zGeh2 zjz;ARTJ%I7A$$bCN#i3?F4{00|hF zFfpnn%2?PWPA4*ix3KZWw8bQ(K;zI3)D;8~TV#?%rp0zNm{F6O$_Rj>i)lS=^qt?% zy?&9qKDH)Un=D0)5;KrFotV)sega5KLwk1^6tyBlzD{}gOULyCQDU2P+Ozip(0s&V zKnkV+jD=jXgA@!5NF$Huoh;A0egT-{7Vn8b!D<1=o^7&M^UiQEE$xS`sA5nD`A14x z@jp`K|40QyGBc*Yb^!h)JXYTNV3UB*^YO3toQ+@*5O(cZhdO#cd!#vJttS2>Ak>|0 zh5a`Ud+Phc|Iy}Y{*PAO;2$%>F^?xF4)9Sz-ORNq?JZDx;E?UYm`yatj|LKX^teFG zANHK&ek`=SbDe$gdlg7;?4LOp!|9DZ^;V&A@;ga&km2)=U)K>^CFMkMyD$b2DthZr zHL5&&1vGg}lg%p4@U;A8Scvw^R`-enJrFnM-gzcxuv83`84wETJbMKtM30Uu+-2Ya zI+t2hlUW(m0AfclB&qUX{3#jYZMjSJE<-gdNZE`lnLc}EoCR%J$~<@vb2JKNYb zttxxy^h^!xs4{3u7Q4;I=g4HK7@ew7o{gE7ng@YZMFG*kE`t!r81HV)*R`sk^EJP` z$IX_C_dx{yyM?#t2v%ZX-o8TMI$;cP7hC|)!wZV8~!Hno+Z=3txwL-ie?*wCnq znghMZ_y6{l?w3ZwRyKIf$8eyfku|+lL21O|4~^_HbHCT>&J)`#sPm z_SMwzrsZFg)BE&?wb^rvB6HO~%Y;JpVzVSOQtAV+B6hUDOyO4Vaqlr$vCU55?u(#f%pCKNPcc_QT+eheO()Uz!RKh?hJM8+V$KLw7UyA{3>6wE z$G^}{zaS`Nk;YP0&i)+N=d9=irmC3|+6-W)Dh1*DHJ?r9frNlNM^L1D@B#=QZ_?gouS<+?bl$ErNeQ9ms`aFmS4W zT^Rq?4clWIozw}+>85=N+}maL!{?pA*aA1mU*Wvml@+lNH8Zy5>U#_6Chu||t)oFX zS*v4?t}vjZZVnL&bJ0FGFpNP`hs3I`<7Uu87j96_6s>rf@hy0>T1TPI97w|nSBUta zON1V&feIKqi$;KgQ}?oixaibJ5R)`#k&xs)p&|!kJ``fitQ(p8HprTWb!dGg2K9JA z0(#bwP{55)1orchg--V}`{MJ&T3}umq87$fTyencIKPeQ`GSla0Cdr=ZO6zRuWf<_ zw4|4!K4{yD0bVQtzXgp+S^`Np08D*40HqZHB|7o$129j4Nt$`!-9kK0ikHSPNgZLC zdE$Lr;5aoC_7sxB5bf7c!px#+%^M0}+i+trSsf4Z2nCE;MQ>Y>D-AZ-BWndrQfFbf z^Eukj1srjfbTL*{7`QL!GJVhT=9%AptrR&NlyHyePmEawKpG~i6XCTD%7s!O6C*xiybC)hh|C*g_e~%kI=eQ%C=k}+9a0s|5qK9| zfY~PT+NBXLa=$b{0h2#n&^md3?0EhZ-pug`1eTuY7GqOEy9bIIK&slXYYin@Qq;md zV~-BN|07RZWf@?*l;-XPiuLW-L2aB%y0Gle1VMNxUxU^{=*)I7fCj!QI6q;z0P`i! zNaud=7)-<_>p*S_OoW4btKJFFpg?Jn@-vt|*e$_Vm^n&lho;nGq37?Hd%59)SsX8J z!CjMon;?Jq8C}rm2LCf%a5wdTI1_FddZkO6hp|VOH_-j=>}MOGq5=4bkOxOZV|L3| zpohZ^WF|0#go%&C(VIDfTVM&Q`CzFI5jqdgFoO@0P@gIOPt58mW*4mpq|Z|@QzYu) zs0|Rnj0{E>@6obYVd(OGP+Qh&DkkBIW@`sLVTcD+rH(YZsNq2suLDYrX`n1wfUY#Q z{#2tzF^b(qyj@TAhT;(-CyqXY>OH14YkCQ++u6oV3kB>p=k-)j&H%Lr+JXjnBY47u zrNuyzG2Dtw`aH@C97L?aAmD^)V*pUQ$Fv~Pif)gAQerrO&&gmofN&EWVe@AjpmGn2 z6#X0{=qToK&)Eh>CAsbv&^a`d!B21WbHpI_agiMnN1x?<@v(y5LxLyJ8u>#gJs2Ht zb}zd;IJc8&%L(h4H9YaSFpsFEcd)djwdkcP={b;xP?R|?I zU0NLu@hg6|Al2^?;YAb_8`dGx^BQO-x-~^tHBQ;@3ZMf}(2CTG5Fmm;9Wt;Pv?C-5 zU*GEcRQNAVx%i&_fp=(hFYg`B4?cd-k@?4t8YOf2s%JUJ&I*07p2FD8X3^R54z(Ff z1S;~m6%&DK)zzRQ&{KAF9Us$;i9nZG_b?IYd*}OK0W;81T37^`(*d={ozCC#KyE0QYt9PYOiHzZ+|b!q$5ZeqK!3AZwPk`*#v}(w^nj-;o5aBt z39>~~K8GOBgX5r*s$TGBJDjH0r=zME8ZxVhNrlKK>?}4sp!2A}a{8OdC)3>v` zN{qUL6?EW0>uRe*4&QQb>e)k@VWSpDg#AGwzdOHe?)rPQ{qq)CSfxPS19b$ze7K1W zzV)@Shi?u5=)jWpGGc@(T*|M8coPJhkkLGsNK9%6O$ySj_#h`AcqkxD z4Dtcg%u=t>Rl^WvRnmONq3WhfSD;~6+z4-#`BgEHDUk9jArAcl?$%afLr=Xc1rUtO zAlW-}3qGp4+JmVXQWHud(AE!)zyz59arUpCflZo^sb`2DFi7^)plcFV^pam|fa3~) zOBg5{f||*f$N|JNP{7a+IAm!G2ND;E8SF*C%G}#}K;;nZN)xRlImUR3aL>}0M`v2G4nFm6-#sB}7qLS1t+!nN0uDu9Xwn~#Vu5C0J zO9t7?+GKgIRBj}UkZs&1`_8DzP7)KE$~JZtrmTgr3^VgR&*S^&_ut>|uje?=dCqg5 z<2mzLUhgyG`xAzT+9CY{3otxne5h?f;2}733tnjOnFtu=)1be2RGz`MPv=`mWD7{} z9HhH%DV}{6Py2whYJ_7-qUJ0w*~8-s(ox7@;BWK*_faRr_Kk?Dufq{#=)#lZCPplY)72iV4k%R(zC75dgD_qJF%CK%(Hm%mm2s03Akk z6d?KFg?u3@UulCJyMESy52%Y`BX7q}MruD#2jL`$9cOrf>oB*sZ~t%|crmSDVrWzH zXDg@O47`w|EkGdyP-|_J*Wfi1H9V9s@?)Jt&KIx9(CIS86QL-11TV^5GZ7P zwiPlt^RRQ-eI)o62q3TLy6w|^21sGKx$#aVXYv=XK0@=x`?;07K=dLyd{M1HG7@k? zs+6iFy#=f)3k#J8qFsn*nO70TPcOw~q|3}X0Z@oH23=NwJn9(Qcs&nsEq`xJo>PQ? zWBEpX+p$Dg;bL)G`hh&JHG*KT$u&Mk+>o;Q32WOi_yc@r# zgTh6?38S9-w$}c@t*)dBRkcZ+avyA z`QFiI0ddh+fRfWfzmqQ8OzPS&^}G4OdY<>fC}}!rIBtxvez;uQO*1K7sClUuqyRj z_13f9+b4H~X(7$hP9HddYvG)jyY^&|uY!33zGCuO_{4Ags|+W<-|z6e4g+^}@>3Q) zv7Ufj3p`>cmIggLs(~7KYl25j=^wao5>DkbKyX#K+VNehQjzKj@Tvo!&jR)EsvDE| z$qT~1D_~^xk;tmc=-S0s1)zO}dfMItaB{U}3@7zh0#JtT2u(_xXa)kc6ZDK-V;2!- ze{HAV1aLV;=Rn~kHu5PLlhK5ai}@-T`ri7$Gne53LHqrj0MCHO+j_j?;BWA=N_H3l zNn%uk%%zksJn*9!0i=jL@!qQa+7-Hdp_YIuB9Cj7;7Y&8)}Uu}v3UF8WyrBTx|&@v zF*z+|*%S#DA{bcVcr(H?WIWIa&yeiyhsA~049R_SmjQpx%Nazdy$llOHIF?7sT@G< z{rt7GD`0F-{k77ptS0^&Xox{_IeEJV5q)UhE=;2`NKb$xSc~97B*u%>z666s5WkOK z1UXjliO>`YVmx5aa6qmGJ})|o21Vh+=eL@`{+K0LBfLH#7vc3ta0ht0*GXXB{$Udb zQ)i`ZI72!+S3~cW=(@P*?%346)X#JDLIs~Uq&ic8SL5Gpc2L{R8mm?$t+yMgX5V?b+vl2+> zgFAqnD!AIsk?mNO3MfNbIJ14a+o{QYwU3L?d+q2(HWKPB?yct_&LmtwY~9)}2d=v} z@c2OiLb9r%JIlFRb_*Y^Azk@ajwOF{1no!(H`5ki9=Ko$vf^x_%ylmCC_&-d5C;MH z+JyrU9PCAy%`hpjAapIqfh!Yy4m@7r02elQY~tjME>%$)jB8&%1S>+3{{E^<-|i3L z7;rZT$1s~>EMAK+yS}=J;EWEIE`l>~Yy@XyBr=<5Zc%`L z9K}F7I+};+>;gJhEaTyxxyu#0Ac49c9JyFE(S!5{P7ttlBJ|xDuBP_|oeKUc&Ur)L zYfkECW?`8O|C}3+?eSrMfAa$PY8oWS)8x#X+1Q_q9R20TRf9d1Zy;i+O#X*``<^%K zOM;`k-h}dwO&3U|iUTK4*_B`zK$5+4wf(@QO~j!T*W5Kv0}Q{JLqBzs3rrr;4M?zn zHhZg>z)9)jdtbpdIYSqhh7ta*x%ebEVDrG~JXbcbdZ7EBDh{xFpwRxDT@0tg)Cs}?@%2)mOU`bw!TfQP)GQwrw-a8lTn zKkOjD^5Nc#*@#Rg{_q`u^5OB-gC&O?fk%lPJwY@8rokco4#<7G^we{Vf<-_90;ND2 z_>Z;c;n@g6j6aM+5F$7t2r+&)#u4Ef?e|I+5rkNoW;c#qJqWH=p)_jF9Re4-`G!*l zUx491a2iJlBHS1uh?OU2>tKQi$#<|2f+)^k)rb&87jk3cEChR)?QY@W1M~oJc{hty z2D_Nz8B8V?R*Nd$VSx+_NDC4hfdNF0^m+~CPkNZSlZaM0SaUe|2;9pSxOvr4kId$U zF4Q+!Gc9xwHWY+t;uN++xyX$HnB3Jl@)`001IZ<0H! z3BW!W)^3cr;`l$?rE$RZ;Q=Nvomm3^TMCEWPqTecRU;xLH3a_*#QT&6{{pZ%;wTs< zli7d}4G-SFR5;EHxA?iz0E^djWWY4TcF;`f&KQjKvrT>?I#Qjq2|O%Z+r-_I1|sc! ztJGaIL`Euo_|G5va=^H8J6(^*R)Og-`7h`AAr>z*m$dh(f_yC)o^mAN)Nk-inf&+k zdPNi5Rub@hFb_Y@R{0&~M<#J|rt>2YGKrU%K42dMczUTDUSipmH?5>_v;EnRFN_+tpP>h~*A2_3dPG-ON!vbKu zn5`qc9z%)I{S;sVn~99)OhEMa(wDWW8<7P$c;60It!;Y0DTSH7P6l)f7S=e?$h|C} z+6H~3*gC>UAMQgP=(dqQ5YEWJ-wa0FoC6NMNncb1@zy?N z5xJ6$GC-gDz01}RVOzwoGI8@!6jMxWh{HE*+lm0%I~4WrPyBG zl9OQ42Jh0UtijOK>=us#DWW#bZB`prXk;go$_xsj>p(gthr-raaBl${S#l)kfib%k z=rqU{y~$^pg0RXBGBUU6>eaP}w@#q27)$OgRpj~iWwN4~$V1Bo&4>e;H!XmEcUx0R zYCtrl#-GLzO{qn1-$kY%kZp+kS9YujdJUvtJ7#7`tmt8+>N2PTy3!ppp1G`O;P3#1 zVQtB71ra?!7_35w^TikB0@(JF*4$fyKy=h6Y0VUb@xN8*w!JKB*v9{TW83(@r~za~ zA3y(kr()8gj1}#%r0yZU)mcMvWLpW#inU6;+F& zXHV4Sk3I17OP7dxckt$sMnx>BgLdTC9fvDbqWYkOxHptFU_eLB4#l~JHvmb%l@N9C zG2jc7-`L@s{R0_*QPftN7t~glalS~BI*&c@^n2Ls`jtz$`h3Qsffa4@2ovsdSrsHq zKgGrE?E@K8(CBaxNX-1Z;Bj6vP{x_vI()_Ee7fkW8+}ZYqXc=G6qLDlR+Rh5wQ_9a zR?J-pL0Pt!R`kIU$l8EQ~{e6aS zkmipkmB`U^uV|`EVN%J5e1s)2pGY?LFF#ATRt>fJjRAwLI8aw0{aYj1D6_(4RrT@=jMd>{h8Ww2)NLQ8CZGD!qt91z?G(m<{T z1ouVSh$InZdw5?DWu*=%eCc+Hs>IW?2 z8E5r`%K+HKvA#r%hj%dv%Zvv+9R)PvM%3N(!ESJ|MI!^rh2A(5dVmZlxt;glG+22P z8vDbKhU7wHbo@HdS1?bNVIIKLY!kYAD;IRG{8aw{mT_jSZ(0>q-NYQRrm>H6v5f=EgjO1rx z|5=3LAb4(rwR*6JFtP!qx00g)sa$Uv``X?`q|o;VR#0wc5&@k6kLMn7_f;i8Om^q5 zo57xI0~n9DGf+@bZoVZV)L-FPN&Z_0FnxzUYXc~__k-Q}8#Jj^-j=}Fv_Lbkq3PbZ zu)r`G?70AwBsH1@Fhz3>%4My@y@gY?f3v)?*)R6#B6M!S@g7?eZAVxFy9t~2&l!4l z)$iKuY$oP7fW3sSP6PbfcS85BrUH^%=MD%(Y9yAn;>47sJMsow&Jp2l7rd(yx*r^` z0y7GMoXws&!$qLR(W;PcKtylE6*vvbQztf8=<;%?v)MOhG^xAqs}fJ0!#w6KG*g-y zsZGts_Vp<7fDT|X0S2)MZzEI&T@-_Dgsx6zck{tELeTIBmP-1H{2h9bsa%l}yw>IZ zXX=TZ)RqB%4qOvtjQt}FOq^4QKczPaY$!Bt zZLb-#5QzZuo%{UjeZRt4W8pbSNq}EE#28zNC!d)vEIb2^IuYB7K;OTKBLWoT9W-ssV976Tx6 z`rT3bp)nTd!LK-8(6pbq0CaKeY259?S%4^35>?*iLS=CNG*~*p7^~o|@X7DP>C{@V z$MBJkzePIAOv0!~(8P@y+dVo`?A+KtBgJ4bgLYIHxtjjCn%~0udV=PFa zUeVMXwx3}ERrpXZm0>Xe5aOqZ4;NEwku_>+kXrks0?4pF7^T*NMfzwu5F*s}1_6k8 zK1-!Dw+sm6NNJfj6@yeOH6KachHnFy#av?&Ew>DgD}&wtGsc1~zI*6d35r25MXXya z2`roiIh|d>Ie}9E<%ii>p7ZMv#Lw~_5MGY>7V@5}x0RLsr}3I!a&Ebr(h0?B?V2oT zL#eZ7j1bTOp1C@6#pA>_VD_P0xLhD3N3q9e42e?Cpl0mq0n9C^;!4;>0xr8QI<5V$vGgRBECneGX zIG#ZRwZ!h6E61q9Rmt9GhN*TqK77WU#9{*2*;kcOufLkGMs--)F{rO2u}R(W`N{!; z-sGPemt|u%ppE#v+Xs^3JI*bg(=atnNSZwCA5)#sGr3>GSVxj!7;ug&!gbJDIkEBB zUSa^EKDfd87K>*FeAQ)@ZI!2R-@X6Re>T%*IA)`1Yj$HG?gmFUXc3B%{Bi7I>DX!ubyN95g|(?9uPn^sYE~BTDG^ zix)%U1;=^89|*g|(JMYIx;C z?gA!Fo$BkS8e7Uo1<1v*8(fyzw4Z=^(>wKbd|k`ppg_cZ-)EzkF0QWGltTJjzeWM_ zwYIGR-R$(1skKpF-S2AayD2TSLIJWgxR|rHlpi z2jWOKI8BE0Zsxb&UL2|zP6n+#5i z;#|xteNmobr(O*%Q`DNUR^AQ-TMo_cyQA2fmw4S@-%Go%z2%{(iJulDzuefPfm#(3 z8jjEvzxDLaME`V;1g)Uyifv2`wkea6DM_KGqT0r4dli%FBn0uRldrl%VxSlv=t4Q? zzk>Bo+-K2RzZUiGCO6GHc@furD7MR)i!KsoYdZP|goOss(|*f=i{B=9QuQdyR&&d! zHk+nYioFD0c2z*op!-Y_R4yW<>#tLuvbpvvN^4Xtz6@*hzJc}4%%Zcmy1ywUNozg` zWBx0fd)=X%$8EWKAS-8t%AH!MuSlCaji)d967=O6M>`ge2tf;*@#A_+VPEx7ZDxXb zDf*`w8*d+ei?T$uIeOFhYgZ#3!V~g0BFwF}wr1*`EC!SLrlu32#tSQ#i1Qu>+OM%z zTDIwH$(k#RJ{@H3Acr*)>1%n@zb~UkYb!O)-q`CedB0ahwUu*B#t7}s(}Pdn1%wcV zYZ?mH<37}<^I1)MB);_QapAd_0fT9SYJ5IoeYhg?Gf$KXAxe@6XcsOB7`}`P_5DslNRq zXDz3f#JNVE_^^qq1U}Y}(lo7iv_FZ|*3HK~X3Xq$S-$oKs%=rHiyyy*C8DD1)5s9`o9pdxw!poNpe4F+fvWQ5 zF+EM|MA4h3vLiy=;FHkp;(`&@aeT9-5cONSr-9h#YJ!!p5cd~lIpqOPmFkkTbdaoE z4E+ROd{3M_s*jqI&dw3sUEImsLk`RpYIEmlY1?Hv6TM9qYsaW-@U}V{D;~%Ys+{8I4 z{N!gb|9|W4til+a7Kh+l!Rg{e{gWeYpxi7gDr zTCHwf7V~im44&Mv>!n1z=yj8&iXD38XX5|pQ29;xNHQctyD-ynh8L`!Jr}vbI1kQ4 z($bgD^^#^h9aS5evG1Ff@+~`!*cdfONG}jq8CExbn=q#&%e8$M9_=VsTYX2rKb4zP zu$5fC^hU-%s#-X?DMJ0FygC$%+i{1j`JnSj25M@&hDdoD$_$A($FJjVJvBq}FVIHU znYiu^8dpnx&=d5{D#cj+U4E58?IrDG*Uru}H^R(0{XdEC{eNKU!uY5$Qy7adDAZhI zFk#L0UZPoloaJWBdnn<#da~;~bIs%jO=RVew4w3FbQ^QcT$}v&y_}xM6@~J>rF!{Q zfoe|qRS$g~8Z4|hvAcnpB6+e4OYj*e-=KMWb1ROxu1U9M{j)!sGF;l9uCl=+3WP9iV7+a0m6T@jW z0h8Cwtv4eax^J|L7^H~5QVC$h7P;aB$3{@3d`8vPo2xHM3v3%sm$Pz9y{?%D<(-KQ zcax;a5}2B)Nin3N6?O2rPW_rH7gI#hG4zofyrd>(3}nz~s@p;U8%>nR#xnlv*JS3mWKhJKaoto4$IdC*G8auL}P%j5)Q zZT({}S7ge$;n2O$Yd3Z1AtvmWgL%-o>=E=>pYAfmaGdS2xY2q&iQ*|&jXJ@YBJqvT4e-?`jF82$ z60>Iy=BwV16q07*IXB1r({a0B8>9N-{R|aiKe+CGT_=3@v$+o?wn%q_UF;}goyFBE zzWAebbvLRn%JC7_0G%X%^Hos+>qldKf@^Zse}ib!_|WlKs3@CVhgaohcs>svr4!rU zRbL8C`J?lg)1r{I?pi3G{O~62m=miM>-b7sp-7AqU7!A-Sux39kdq9hrkD8)6whNm z&ls6AJB9G4_-ApE8Mdo@s6O!1WOhfaxt;M-jubxG(E*iq4VcYIHpx?h-*?5WMyTPV-B^4+Pob;KQ~6_o zc?GOZV@q;z*@vNCy9Mx5wHhzG`~@UZLwwSyF`AA-)=f;x(o7cV?mU;cxkdgxdMv$A zrihsTP1`Rt$=${;ojUYKT+WCqcSdBX=+xq)j~Q;zt0UG;T$RE>YcptUva&P7?S0mg zpZn5f;gr7&4~STEpPzd9xV9uSaY{%>rijzTs=pP3)40!%3PL?>HbL8UDB3F&i8L4} zsGIP|r!7Uub8~wag!{5p8E(@fD0{4xA4|VdRU+h&67VWL%p2HBjJ~Zs4WF7$120&5 z@NdX!k#z>&=~k6pZ)vs2hAf9s{@JWZ5~~?XwmnP@pOH3PFs03ZYmc2dGu||Hq{dWH zxUZdS>sgbr#Y<(6QVbSm8n5{)tziin7erV#cIM%%(vkORf*odV88I`up^`6c3C9&@ zsU#9>>3x00vywA4yZtpWc2*R2Uwsi4N)JvLdHT%m{qJ2kkdX5ZbaY3$#`*ATZ zMe||6=E7}4MsR@5d?kq$zZE=2I+b2V@Q>!K_w{B9e*c_z?HEaBt#OE*H}cDKEyF*% zc+~H`fZyGUAGYS~{D=$U2@n4aSsR~!FY22<>9C*&zE}E4ALQ)k@bTcjyJ$AJG?G6yyxYbKmWL({e1TDoqYuGBPBw8&@5zJ zdap~V2yzei_N~Mitqgx_gHX&Q@a8R$sRA-nJG5B*g+~YD*9f90CiiEyMQ6>fxaB+I zRG%|7<=>)6th(_IyZsyOtKV+d=yAXJ<)sX3eMlU+b31Y}I5t*79aBvhu}usW*HI|q zQfbqE0bXsAgyScxTX4SGvWrt)q4>@$k{flnX5wgZk}8V1$j*T1KwnFkRQ_t;+e9je zz@IFyy+U zSgio-e21*=pcDvYPL_?jrKU?cN{ZkPYt>a3VAj6jPYpOsziDHluKifE?Aas-y9I}u zFZX9(Qy4fmR61ynxhdinpzU0?5Z+WUn5^}zuZdh!tDZV8Cg-`jRafssaZ^ePKy`DP z64O;eu^axInqKq|4l)SOOW|;KId}T-PTof+^$d=zW zHxGDzLFw6Rwc2;jZ~K_{u*iiPu>;?a-FxSQ>Q3$~)bQy44#mA&>Zh=0d;KkBl_o86 zrb*MLGD?5xk3Ta`^e_GRgETG3zT$9ez3=Alqjw4mHePUbUfN%qxZ>f0|IYrkyKq#& z^KQ!Y{zh^lq`)7Op1m&L-}Xhpbme7jUL&X=N!` zR5!FdTR62+MYdMpi%EC9la-!iuTW#~^@@4Vr{wg*)(VO@J!}5%-3ozDzqD6LWsk?0qbT1K>b zEGl-fTTWQP)3wh3ZR&EKhIzWm3k{(n!`l7rWoxl0rdKCaS!0zVTIxEuJka@hMbmZT zPB`X6K{&_QwPuyp=^tW;iC7U#o{DFCLl{mh!*yeMY%R6y>6A!BnLMOA$}a6+M|*`8 zt2Xu>9QXX!PxUS3*jKv&lQ6G}h}oil{jz-5`+wUI#*ZK48^18lE}a!?3`*Iw^I?^~ z0kokZfm!_Laeu=i(Yt2-dbnXb%}oMlQ}Lg&>46LgQpG(YZL$6hfbk5!z7( z6OfDRP9`LyjnK9-7{^>(crwA-+6ZkegE7vS!{5qh@_hCk=mH~)6Q2yI%^KILqy1S1Pnk)Z(QqA&rKlhT{m zhTDrVN=cl;?Zz0Q6Z>!ih0p)k-sN zKg^WOCIn1s)m+p$BSK~5B!^v6OjM$}`aiIj9Owx8eAPE0V^Vk{W<)Ba1G}X9=~vd& z6Yht_yKz|;8ZFyHX4Xwb#|yt{28HE6S?v9lbpiT6YybaMLjTvG{$JfbMKhw4dQflV0LPF=od) zc&ie Hy6=AgP`TeT diff --git a/Packages/com.waveharmonic.crest/Documentation~/Manual.pdf b/Packages/com.waveharmonic.crest/Documentation~/Manual.pdf index 3e2bfb4fd75e592d891dd5902b75276487ed7570..a3cd4cb39f58b7d712d70e8718c5bed6c0c0de59 100644 GIT binary patch delta 316818 zcmZs@b8se6`z<=LZQJ%6+qUgY>|~O>u`%()wr$(CZB6Vu-}gKB+`9LkKe}r5Q@g6G zx^}H+?e(ng&rZIPDWTdeFfdkj_SC#R5NhC*)|fq>BzosP-S*tH@VPGtJXmZrw#fcq zGyY*doVYTkX`~rBtai7+Bc;&{dx<5AC`7=K#f(Oc!P14fL_D$NINBF?0x0k$p1h07 zS}Hjg4u&I5>TiTimXK੟&gPU} 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%0Ab+dZTn6{n#Cp3wDuI(UPx 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

    W;=&~$ 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 z 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 O`UVneYIX#BiGKmgpnClP delta 248919 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%0DBrbc)P5Q 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�@2Smp5Oo$Pe|nDc)yvkY^ne{W-Y*YTvd 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 bKSk data) { // Not one of our shaders. @@ -49,6 +51,8 @@ namespace WaveHarmonic.Crest.Editor.Build return; } + // NOTE: There is no point checking against sub-shader count. + _VariantCount += data.Count; // Strip BIRP sub-shader if not using BIRP, as Unity only strips HDRP/URP sub-shaders. @@ -61,34 +65,36 @@ namespace WaveHarmonic.Crest.Editor.Build for (var i = data.Count - 1; i >= 0; --i) { + var strip = false; var keywords = data[i].shaderKeywordSet.GetShaderKeywords(); + var isLightingPass = snippet.passType is PassType.ForwardBase or PassType.ForwardAdd; var isTransparent = keywords.Any(x => x.name == "_BUILTIN_SURFACE_TYPE_TRANSPARENT"); + var isTransparentShadowReceiver = keywords.Any(x => x.name == "_BUILTIN_TRANSPARENT_RECEIVES_SHADOWS"); - foreach (var keyword in keywords) + // Invalid combination. + if (isLightingPass && !isTransparent && isTransparentShadowReceiver) { - var name = keyword.name; - var strip = - // Main light shadows. Never used. - name.StartsWithNoAlloc("_MAIN_LIGHT_") || - // Additional lights. Never used. Although, vertex lighting keyword is set. - name.StartsWithNoAlloc("_ADDITIONAL_LIGHT") || - // Never used. Used in deferred pass, but not defined in deferred pass. - keyword.name is "LIGHTMAP_SHADOW_MIXING" or "SHADOWS_SHADOWMASK" || - // Never used. - keyword.name is "_SCREEN_SPACE_OCCLUSION" or "_SHADOWS_SOFT" or "_CASTING_PUNCTUAL_LIGHT_SHADOW" || - // BIRP does not support this feature (URP does). - keyword.name is "_GBUFFER_NORMALS_OCT" || - // TODO: check LightMode instead of pass name. - // Shadow keywords are not enabled for transparent objects, except if casting. - isTransparent && snippet.passName == "ShadowCaster" && keyword.name.Contains("SHADOW"); + strip = true; + } - if (strip) + if (!strip) + { + foreach (var keyword in keywords) { - _VariantCountStripped++; - data.RemoveAt(i); - break; + var name = keyword.name; + strip = + // Invalid combination. + isLightingPass && (!isTransparent || !isTransparentShadowReceiver) && s_ShadowCollectorKeywords.Contains(keyword.name); + + if (strip) break; } } + + if (strip) + { + _VariantCountStripped++; + data.RemoveAt(i); + } } } @@ -217,6 +223,14 @@ namespace WaveHarmonic.Crest.Editor.Build } } + if (!RenderPipelineHelper.IsLegacy) + { + if (shader.name.StartsWithNoAlloc("Hidden/Crest/Legacy/")) + { + return true; + } + } + return false; } @@ -273,8 +287,8 @@ namespace WaveHarmonic.Crest.Editor.Build return false; } - // There will be at least three sub-shaders if one per render pipeline. - if (shader.subshaderCount <= 2) + // There will be at least two sub-shaders if other render pipelines. + if (shader.subshaderCount <= 1) { return false; } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Editors.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Editors.cs index 833fab3ac..03f19beaf 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Editors.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Editors.cs @@ -10,10 +10,14 @@ namespace WaveHarmonic.Crest.Editor [CustomEditor(typeof(WaterRenderer))] sealed class WaterRendererEditor : Inspector { + // Whether validation was triggered by user request, which should never skip console logging. + internal static bool ManualValidation { get; private set; } + WaterRenderer _Target; - void OnEnable() + protected override void OnEnable() { + base.OnEnable(); _Target = (WaterRenderer)target; } @@ -65,9 +69,9 @@ namespace WaveHarmonic.Crest.Editor if (i < target.LodLevels - 1) message += "\n\n"; } - if (target.Material.HasVector(WaterRenderer.ShaderIDs.s_Absorption)) + if (target.Surface.Material.HasVector(WaterRenderer.ShaderIDs.s_Absorption)) { - message += $"\n\nDepth Fog Density: {target.Material.GetVector(WaterRenderer.ShaderIDs.s_Absorption)}"; + message += $"\n\nDepth Fog Density: {target.Surface.Material.GetVector(WaterRenderer.ShaderIDs.s_Absorption)}"; } EditorGUILayout.HelpBox(message, MessageType.None); @@ -98,6 +102,8 @@ namespace WaveHarmonic.Crest.Editor if (GUILayout.Button("Validate Setup")) { + ManualValidation = true; + ValidatedHelper.ExecuteValidators(target, ValidatedHelper.DebugLog); foreach (var component in FindObjectsByType(FindObjectsSortMode.None)) @@ -107,6 +113,8 @@ namespace WaveHarmonic.Crest.Editor } Debug.Log("Crest: Validation complete!", target); + + ManualValidation = false; } } } @@ -128,8 +136,10 @@ namespace WaveHarmonic.Crest.Editor _HostComponentType = hostComponentType; } - void OnEnable() + protected override void OnEnable() { + base.OnEnable(); + Undo.undoRedoEvent -= OnUndoRedo; Undo.undoRedoEvent += OnUndoRedo; } @@ -297,7 +307,8 @@ namespace WaveHarmonic.Crest.Editor switch (spectrumModel) { case WaveSpectrum.SpectrumModel.PiersonMoskowitz: - spec.ApplyPiersonMoskowitzSpectrum(); + var water = WaterRenderer.Instance; + spec.ApplyPiersonMoskowitzSpectrum(water != null ? water.Gravity : Mathf.Abs(Physics.gravity.y)); break; } } @@ -383,7 +394,7 @@ namespace WaveHarmonic.Crest.Editor var canBake = !onDemand && !Application.isPlaying; var canPopulate = Application.isPlaying ? onDemand : target.Type != DepthProbeMode.Baked; - if (target.SavedTexture != null && isBaked ? GUILayout.Button("Switch to Real-Time") : GUILayout.Button("Switch to Baked")) + if (isBaked ? GUILayout.Button("Switch to Real-Time") : target.SavedTexture != null && GUILayout.Button("Switch to Baked")) { Undo.RecordObject(target, isBaked ? "Switch to Real-Time" : "Switch to Baked"); target.Type = isBaked ? DepthProbeMode.RealTime : DepthProbeMode.Baked; @@ -451,6 +462,10 @@ namespace WaveHarmonic.Crest.Editor settings.singleChannelComponent = TextureImporterSingleChannelComponent.Red; ti.SetTextureSettings(settings); } + else + { + ti.textureType = TextureImporterType.Default; + } // Set format. { diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Gizmos.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Gizmos.cs index c27c61edc..c29972f89 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Gizmos.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Gizmos.cs @@ -16,6 +16,12 @@ namespace WaveHarmonic.Crest.Editor : s_VisualizeMaterial = new(Shader.Find("Local/Debug/Visualize Signed Texture")); #endif + static void DrawLine(Vector3 start, Vector3 end, Color color, float _) + { + Gizmos.color = color; + Gizmos.DrawLine(start, end); + } + [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected)] static void DrawGizmos(WaterRenderer target, GizmoType type) { @@ -51,12 +57,12 @@ namespace WaveHarmonic.Crest.Editor // Create proxy if not present already, and proxy enabled if (target._ProxyPlane == null && target._ShowWaterProxyPlane) { - target._ProxyPlane = GameObject.CreatePrimitive(PrimitiveType.Plane); + target._ProxyPlane = GameObject.CreatePrimitive(PrimitiveType.Quad); Helpers.Destroy(target._ProxyPlane.GetComponent()); target._ProxyPlane.hideFlags = HideFlags.HideAndDontSave; target._ProxyPlane.transform.parent = target.transform; - target._ProxyPlane.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); - target._ProxyPlane.transform.localScale = 4000f * Vector3.one; + target._ProxyPlane.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.Euler(90f, 0f, 0f)); + target._ProxyPlane.transform.localScale = 1000000f * Vector3.one; target._ProxyPlane.GetComponent().sharedMaterial = new(Shader.Find(WaterRenderer.k_ProxyShader)); } @@ -70,11 +76,6 @@ namespace WaveHarmonic.Crest.Editor EditorWindow view = EditorWindow.GetWindow(); view.Repaint(); } - - if (target.Root != null) - { - target.Root.gameObject.SetActive(!target._ShowWaterProxyPlane); - } } [DrawGizmo(GizmoType.Selected)] @@ -87,7 +88,8 @@ namespace WaveHarmonic.Crest.Editor var rect = target.Rect; if (rect != Rect.zero) { - var height = WaterRenderer.Instance ? WaterRenderer.Instance.SeaLevel : target.transform.position.y; + var water = WaterRenderer.Instance; + var height = water ? water.SeaLevel : target.transform.position.y; Gizmos.color = Color.magenta; Gizmos.DrawWireCube ( @@ -146,7 +148,8 @@ namespace WaveHarmonic.Crest.Editor var rect = target.Rect; if (rect != Rect.zero) { - var height = WaterRenderer.Instance ? WaterRenderer.Instance.SeaLevel : target.transform.position.y; + var water = WaterRenderer.Instance; + var height = water ? water.SeaLevel : target.transform.position.y; Gizmos.color = Color.magenta; Gizmos.DrawWireCube ( @@ -209,6 +212,14 @@ namespace WaveHarmonic.Crest.Editor } } + [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected)] + static void DrawGizmos(CollisionAreaVisualizer target, GizmoType type) + { + var water = WaterRenderer.Instance; + if (water == null) return; + target.Render(water, DrawLine); + } + [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected)] static void DrawGizmos(DepthProbe target, GizmoType type) { diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations.meta b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations.meta new file mode 100644 index 000000000..2e9e01034 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 76bb1904a4c3377478b2e551e16f2d59 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia.meta b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia.meta new file mode 100644 index 000000000..77a6a129b --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2a5b1db7ccbfeda46871d9c365e6a914 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs new file mode 100644 index 000000000..758e48398 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs @@ -0,0 +1,6 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// Define empty namespaces for when assemblies are not present. + +namespace WaveHarmonic.Crest.ShallowWater { } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs.meta b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs.meta new file mode 100644 index 000000000..ed25b2979 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/Assembly.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a1364267b3de043daae23dda97c99063 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs new file mode 100644 index 000000000..273ca1658 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs @@ -0,0 +1,259 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// This file is subject to the MIT License as seen in the root of this folder structure (LICENSE) + +using Gaia; +using UnityEditor; +using UnityEngine; +using WaveHarmonic.Crest.ShallowWater; + +namespace WaveHarmonic.Crest +{ + sealed class GRC_Crest : GaiaRuntimeComponent + { + [SerializeField] + bool _Wind = true; + + [SerializeField] + bool _Swell = true; + + [SerializeField] + bool _ShallowWater = true; + + GUIContent _HelpLink; + GUIContent _PanelLabel; + + /// + public override GUIContent PanelLabel + { + get + { + if (_PanelLabel == null || _PanelLabel.text == "") + { + _PanelLabel = new GUIContent("Crest Water", "Adds Crest Water to your scene."); + } + + return _PanelLabel; + } + } + + /// + public override void Initialize() + { + // Order components appear in the UI. Try to keep in alphabetical order. + m_orderNumber = 210; + + if (_HelpLink == null || _HelpLink.text == "") + { + _HelpLink = new GUIContent("Crest Online documentation", "Opens the documentation for the Crest Water System in your browser."); + } + } + + /// + public override void DrawUI() + { + // Displays "?" help button. + DisplayHelp + ( + "This module adds the Crest Water System to your scene. Please visit the link to learn more:", + _HelpLink, + "https://docs.crest.waveharmonic.com/About/Introduction.html" + ); + + EditorGUI.BeginChangeCheck(); + + { + _Swell = EditorGUILayout.Toggle("Swell Waves", _Swell); + DisplayHelp("Whether to add swell waves to the scene. Swell waves will come from conditions far away from the scene. Modify the component after creation to customize."); + + _Wind = EditorGUILayout.Toggle("Wind Waves", _Wind); + DisplayHelp("Whether to add wind waves to the scene. These waves are based on local wind conditions. Requires Gaia's Wind Zone (note that the defaul wind value will produce no waves). Modify the component after creation to customize."); + +#if d_WaveHarmonic_Crest_ShallowWater + _ShallowWater = EditorGUILayout.Toggle("Shoreline Simulation", _ShallowWater); + DisplayHelp("Whether to add a shoreline shallow water simulation to the scene. Modify the component after creation to customize."); +#endif + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Remove")) RemoveFromScene(); + GUILayout.Space(15); + if (GUILayout.Button("Apply")) AddToScene(); + GUILayout.EndHorizontal(); + } + + if (EditorGUI.EndChangeCheck()) + { + EditorUtility.SetDirty(this); + } + } + + /// Called when either "Apply" or "Create Runtime" is pressed. + /// + public override void AddToScene() + { + // Re-initialize to keep user's changes. + var water = FindFirstObjectByType(FindObjectsInactive.Include); + + if (water == null) + { + water = new GameObject("Water").AddComponent(); + } + + // Sea level is height above terrain bottom. + var seaLevel = GaiaAPI.GetSeaLevel(); + + water.transform.position = new Vector3(0f, seaLevel, 0f); + + var managed = water.transform.Find("Managed"); + + if (managed == null) + { + managed = new GameObject("Managed").transform; + } + + managed.SetParent(water.transform, worldPositionStays: false); + + // Wind + if (_Wind) + { + var wind = FindFirstObjectByType(); + + if (wind != null) + { + water.WindZone = wind.GetComponent(); + } + } + + // Depth + water.DepthLod.IncludeTerrainHeight = false; + + foreach (var terrain in FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + { + var dp = terrain.GetComponentInChildren(includeInactive: true); + + if (dp == null) + { + dp = new GameObject("WaterDepthProbe").AddComponent(); + } + + dp.gameObject.layer = water.Surface.Layer; + dp.transform.SetParent(terrain.transform, worldPositionStays: false); + dp.transform.localPosition = terrain.terrainData.size * 0.5f; + var position = dp.transform.position; + position.y = seaLevel; + dp.transform.position = position; + dp.transform.localScale = new(terrain.terrainData.size.x, 1f, terrain.terrainData.size.z); + dp.Layers = 1 << terrain.gameObject.layer; + // 1m below terrain bottom to 1m above maximum terrain height. + dp.CaptureRange = new(-seaLevel + -1f, terrain.terrainData.size.y - seaLevel + 1); + dp.Resolution = terrain.terrainData.heightmapResolution - 1; + dp.Populate(); + } + + // Wind Waves + if (_Wind && water.WindZone != null) + { + GetOrAddComponentToScene(managed, "WaterWindWaves", out _); + } + else + { + RemoveComponentFromScene(managed); + } + + // Swell Waves + if (_Swell) + { + GetOrAddComponentToScene(managed, "WaterSwellWaves", out var waves); + + waves.OverrideGlobalWindDirection = true; + waves.OverrideGlobalWindSpeed = true; + waves.ReverseWaveWeight = 0; + waves.Swell = true; + + if (!waves.TryGetComponent(out var fft)) + { + fft = waves.gameObject.AddComponent(); + fft.Spectrum = AssetDatabase.LoadAssetAtPath("Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset"); + } + + fft.OverrideGlobalWindDirection = true; + fft.OverrideGlobalWindSpeed = true; + fft.OverrideGlobalWindTurbulence = true; + fft.WindAlignment = 0.5f; + } + else + { + RemoveComponentFromScene(managed); + } + +#if d_WaveHarmonic_Crest_ShallowWater + if (_ShallowWater) + { + water.FlowLod.Enabled = true; + + if (GetOrAddComponentToScene(managed, "ShorelineSimulation", out var sws)) + { + water.Surface.Material = AssetDatabase.LoadAssetAtPath("Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat"); + sws.Width = 256; + } + + if (!sws.TryGetComponent(out var dp)) + { + dp = sws.gameObject.AddComponent(); + } + + dp.GenerateSignedDistanceField = false; + + sws.Preset = ShallowWaterSimulationPreset.Shoreline; + sws.Placement = Placement.Viewpoint; + sws.DynamicSeabed = true; + } + else + { + RemoveComponentFromScene(managed); + } +#endif + } + + bool GetOrAddComponentToScene(Transform managed, string name, out T component) where T : MonoBehaviour + { + component = managed.GetComponentInChildren(); + + var create = component == null; + + if (create) + { + component = new GameObject(name).AddComponent(); + component.transform.SetParent(managed.transform, worldPositionStays: false); + } + + return create; + } + + void RemoveComponentFromScene(Transform managed) where T : MonoBehaviour + { + var component = managed.GetComponentInChildren(); + + if (component != null) + { + DestroyImmediate(component.gameObject); + } + } + + /// Called when "Remove" is pressed. + /// + public override void RemoveFromScene() + { + var water = FindFirstObjectByType(FindObjectsInactive.Include); + if (water != null) DestroyImmediate(water.gameObject); + + foreach (var terrain in FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + { + var depthCache = terrain.GetComponentInChildren(includeInactive: true); + if (depthCache != null) DestroyImmediate(depthCache.gameObject); + } + } + } +} diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs.meta b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs.meta new file mode 100644 index 000000000..1bcd3fdcf --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/GRC_Crest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f9d5fab14f7242db80be581a62d53c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef new file mode 100644 index 000000000..554564d43 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef @@ -0,0 +1,32 @@ +{ + "name": "WaveHarmonic.Crest.Integration.Gaia", + "rootNamespace": "", + "references": [ + "GUID:532136e3ad79fba44b9e7d74f4e53abe", + "GUID:cc49c744ac0d6fa459f6fb20f0066991", + "GUID:7c347618730f5467f86a58f333ce21df", + "GUID:98db37baed0fc4b73a47a9d66f791aae", + "GUID:056ff2a5b2f124d468c6655552acdca5", + "GUID:d365b04c036e04304a59ef9aa90b3924" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": false, + "defineConstraints": [ + "UNITY_2022_3_OR_NEWER", + "GAIA_2023" + ], + "versionDefines": [ + { + "name": "com.waveharmonic.crest.shallow-water", + "expression": "", + "define": "d_WaveHarmonic_Crest_ShallowWater" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef.meta b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef.meta new file mode 100644 index 000000000..3e117d4fa --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Integrations/Gaia/WaveHarmonic.Crest.Integration.Gaia.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1c4070cb1d689471b80e17ee7aa518e6 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialDrawers.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialDrawers.cs index 3a81dc21d..c9fe8f827 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialDrawers.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialDrawers.cs @@ -25,7 +25,7 @@ namespace WaveHarmonic.Crest.Editor internal static readonly Dictionary> s_Grouped = new() { { - "Crest/Underwater", new() + UnderwaterRenderer.k_ShaderNameEffect, new() { { "_Crest_DataSliceOffset", new() { _IntegerRange = new(0, Lod.k_MaximumSlices - 2) } }, } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialTooltips.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialTooltips.cs index aec8fe30c..38eebcb7d 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialTooltips.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/MaterialTooltips.cs @@ -50,7 +50,7 @@ namespace WaveHarmonic.Crest.Editor } }, { - "Crest/Underwater", new() + UnderwaterRenderer.k_ShaderNameEffect, new() { { "_Crest_ExtinctionMultiplier", "Scales the depth fog density. Useful to reduce the intensity of the depth fog when underwater only" }, { "_Crest_SunBoost", "Boost the intensity of the sun scattering" }, @@ -149,7 +149,26 @@ namespace WaveHarmonic.Crest.Editor internal static MaterialProperty[] FilterProperties(MaterialProperty[] properties) { - return properties.Where(x => x.name != "_Crest_Absorption").ToArray(); + // Show specular control. + var specular = true; + + if (!RenderPipelineHelper.IsHighDefinition) + { + specular = properties + .First(x => x.name == (RenderPipelineHelper.IsLegacy ? "_BUILTIN_WorkflowMode" : "_WorkflowMode")).floatValue == 0; + } +#if UNITY_6000_0_OR_NEWER + else + { + // Always show specular control for U5, as it cannot be overriden by the material. + specular = properties + .First(x => x.name == "_MaterialID").floatValue == 4; + } +#endif + + return properties + .Where(x => (specular || x.name != "_Crest_Specular") && x.name != "_Crest_Absorption") + .ToArray(); } } @@ -175,7 +194,11 @@ namespace WaveHarmonic.Crest.Editor foreach (var property in properties) { +#if UNITY_6000_2_OR_NEWER if ((property.propertyFlags & UnityEngine.Rendering.ShaderPropertyFlags.HideInInspector) != 0) continue; +#else + if ((property.flags & MaterialProperty.PropFlags.HideInInspector) != 0) continue; +#endif var name = property.name; s_Label.text = property.displayName; @@ -187,7 +210,7 @@ namespace WaveHarmonic.Crest.Editor } #if d_UnityShaderGraph - class LegacyCustomShaderGUI : UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInBaseShaderGUI + class LegacyCustomShaderGUI : ShaderGraph.CustomBuiltInLitGUI { MaterialEditor _Editor; MaterialProperty[] _Properties; diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Previews.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Previews.cs index 58910e10c..ef39fdb18 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Previews.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Previews.cs @@ -1,6 +1,7 @@ // Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. +using System.Reflection; using UnityEditor; using UnityEngine; @@ -21,7 +22,17 @@ namespace WaveHarmonic.Crest.Editor { get { - if (!Lod.Enabled || !((WaterRenderer)target).isActiveAndEnabled) return null; + var water = (WaterRenderer)target; + + if ((!Application.isPlaying && !water.runInEditMode) || !water.isActiveAndEnabled) + { + return null; + } + + if (!Lod.Enabled) + { + return null; + } var texture = Lod.DataTexture; @@ -245,21 +256,41 @@ namespace WaveHarmonic.Crest.Editor sealed class WaterLevelDepthPreview : TexturePreview { public override GUIContent GetPreviewTitle() => new("Water Level Screen-Space Depth"); - protected override Texture OriginalTexture => (target as WaterRenderer).WaterLevelDepthTexture; + protected override Texture OriginalTexture => (target as WaterRenderer).Surface.WaterLevelDepthTexture; + } + + [CustomPreview(typeof(WaterRenderer))] + sealed class WaterLinePreview : TexturePreview + { + public override GUIContent GetPreviewTitle() => new("Pre-Computed Displacement"); + protected override Texture OriginalTexture => (target as WaterRenderer).Surface.HeightRT; } [CustomPreview(typeof(WaterRenderer))] sealed class WaterVolumeMaskPreview : TexturePreview { public override GUIContent GetPreviewTitle() => new("Water Volume Mask"); - protected override Texture OriginalTexture => RenderPipelineHelper.IsLegacy && (target as WaterRenderer)._Underwater._MaskRT && (target as WaterRenderer)._Underwater._MaskRT.width > 0 ? (target as WaterRenderer)._Underwater._MaskRT : null; + protected override Texture OriginalTexture + { + get + { + var target = this.target as WaterRenderer; + return target._Mask?.ColorT != null && target._Mask?.ColorT.width > 0 + ? target._Mask.ColorT + : null; + } + } } #endif [CustomPreview(typeof(WaterRenderer))] sealed class ReflectionPreview : TexturePreview { + static readonly PropertyInfo s_DefaultReflection = typeof(RenderSettings).GetProperty("defaultReflection", BindingFlags.NonPublic | BindingFlags.Static); + public override GUIContent GetPreviewTitle() => new("Water Reflections"); - protected override Texture OriginalTexture => (target as WaterRenderer)._Reflections._Enabled ? (target as WaterRenderer)._Reflections.ReflectionTexture : null; + protected override Texture OriginalTexture => (target as WaterRenderer)._Reflections._Enabled + ? (target as WaterRenderer)._Reflections.ReflectionTexture + : s_DefaultReflection?.GetValue(null) as Texture; } } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/ProjectSettings.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/ProjectSettings.cs index 7158d75c3..7697c5737 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/ProjectSettings.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/ProjectSettings.cs @@ -2,6 +2,8 @@ // Copyright © 2024 Wave Harmonic. All rights reserved. using System.IO; +using System.Linq; +using System.Reflection; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; @@ -41,9 +43,13 @@ namespace WaveHarmonic.Crest.Editor.Settings [@DecoratedField, SerializeField] bool _FullPrecisionDisplacementOnHalfPrecisionPlatforms = true; - [Tooltip("Whether to sample shadow maps for built-in renderer.")] + [Tooltip("Whether to render atmospheric scattering (ie fog) for pixels receiving aquatic scattering (underwater only).\n\nWhen disabled, if a pixel is receiving aquatic scattering, then it will not receive atmospheric scattering.")] [@DecoratedField, SerializeField] - bool _BuiltInRendererSampleShadowMaps = true; + bool _RenderAtmosphericScatteringWhenUnderWater; + + [Tooltip("Renders the underwater effect after transparency and uses the more expensive mask.\n\nYou may need this if rendering the underwater to multiple cameras. The other benefit is that transparent objects will be fogged (albeit incorrectly).\n\nThe downsides are that there can be artifacts if waves are very choppy, has a less impressive meniscus, and generally more expensive to execute.")] + [@DecoratedField, SerializeField] + bool _LegacyUnderwater; #pragma warning restore IDE0032 // Use auto property @@ -63,7 +69,8 @@ namespace WaveHarmonic.Crest.Editor.Settings internal bool LogStrippedVariants => _DebugEnableStrippingLogging && !_DebugOnlyLogRemainingVariants; internal bool LogKeptVariants => _DebugEnableStrippingLogging && _DebugOnlyLogRemainingVariants; internal bool FullPrecisionDisplacementOnHalfPrecisionPlatforms => _FullPrecisionDisplacementOnHalfPrecisionPlatforms; - internal bool BuiltInRendererSampleShadowMaps => _BuiltInRendererSampleShadowMaps; + internal bool RenderAtmosphericScatteringWhenUnderWater => _RenderAtmosphericScatteringWhenUnderWater; + internal bool LegacyUnderwater => _LegacyUnderwater; void OnEnable() @@ -83,12 +90,83 @@ namespace WaveHarmonic.Crest.Editor.Settings { switch (path) { - case nameof(_BuiltInRendererSampleShadowMaps): case nameof(_FullPrecisionDisplacementOnHalfPrecisionPlatforms): - ShaderSettingsGenerator.Generate(); + case nameof(_RenderAtmosphericScatteringWhenUnderWater): + case nameof(_LegacyUnderwater): + UpdateSymbols(); break; } } + + void UpdateScriptingSymbols() + { + ScriptingSymbols.Set(ProjectSymbols.k_LegacyUnderwaterScriptingSymbol, _LegacyUnderwater); + } + + void UpdateSymbols() + { + UpdateScriptingSymbols(); + ShaderSettingsGenerator.Generate(); + } + + sealed class ProjectSymbols : AssetModificationProcessor + { + public const string k_LegacyUnderwaterScriptingSymbol = "d_Crest_LegacyUnderwater"; + + static FileSystemWatcher s_Watcher; + + // Will run on load and recompile preventing symbol removal in player settings. + [InitializeOnLoadMethod] + static void OnLoad() + { + if (Instance != null) + { + Instance.UpdateScriptingSymbols(); + } + + Directory.CreateDirectory(Path.GetDirectoryName(k_Path)); + + s_Watcher = new(Path.GetDirectoryName(k_Path)) + { + Filter = Path.GetFileName(k_Path), + NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size, + EnableRaisingEvents = true + }; + + s_Watcher.Changed -= OnChanged; + s_Watcher.Changed += OnChanged; + } + + // Handle external edits. Possibly unreliable, but not important if fails. + static void OnChanged(object sender, FileSystemEventArgs e) + { + EditorApplication.delayCall += () => + { + // Destroy instance to reflect changes. + Helpers.Destroy(Instance); + typeof(ScriptableSingleton) + .GetField("s_Instance", BindingFlags.Static | BindingFlags.NonPublic) + .SetValue(null, null); + Instance.UpdateSymbols(); + }; + } + + static AssetDeleteResult OnWillDeleteAsset(string path, RemoveAssetOptions options) + { + // Only remove symbols if this file is deleted. + if (Path.GetFullPath(path) == GetCurrentFileName()) + { + ScriptingSymbols.Remove(ScriptingSymbols.Symbols.Where(x => x.StartsWith("d_Crest_")).ToArray()); + } + + return AssetDeleteResult.DidNotDelete; + } + + static string GetCurrentFileName([System.Runtime.CompilerServices.CallerFilePath] string fileName = null) + { + return fileName; + } + } } sealed class SettingsProvider : UnityEditor.SettingsProvider diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Requirements/WaveHarmonic.Crest.Editor.Requirements.asmdef b/Packages/com.waveharmonic.crest/Editor/Scripts/Requirements/WaveHarmonic.Crest.Editor.Requirements.asmdef index 8dd5e1a09..74ef8cfd2 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Requirements/WaveHarmonic.Crest.Editor.Requirements.asmdef +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Requirements/WaveHarmonic.Crest.Editor.Requirements.asmdef @@ -14,37 +14,37 @@ "versionDefines": [ { "name": "com.waveharmonic.crest.cpu-queries", - "expression": "(,1.0.4)", + "expression": "(,1.0.8)", "define": "d_UpdateCPUQueries" }, { "name": "com.waveharmonic.crest.paint", - "expression": "(,1.2.0)", + "expression": "(,1.2.3)", "define": "d_UpdatePaint" }, { "name": "com.waveharmonic.crest.portals", - "expression": "(,1.2.1)", + "expression": "(,1.2.8)", "define": "d_UpdatePortals" }, { "name": "com.waveharmonic.crest.shallow-water", - "expression": "(,1.3.1)", + "expression": "(,1.3.3)", "define": "d_UpdateShallowWater" }, { "name": "com.waveharmonic.crest.shifting-origin", - "expression": "(,1.2.1)", + "expression": "(,1.3.0)", "define": "d_UpdateShiftingOrigin" }, { "name": "com.waveharmonic.crest.splines", - "expression": "(,1.3.2)", + "expression": "(,1.4.4)", "define": "d_UpdateSplines" }, { "name": "com.waveharmonic.crest.whirlpool", - "expression": "(,1.0.1)", + "expression": "(,1.0.3)", "define": "d_UpdateWhirlpool" } ], diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/ShaderSettings.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/ShaderSettings.cs index e4c548cde..6c37e2566 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/ShaderSettings.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/ShaderSettings.cs @@ -26,6 +26,11 @@ namespace WaveHarmonic.Crest.Editor return; } + if (EditorApplication.isUpdating) + { + return; + } + EditorApplication.update -= GenerateAfterReloadScripts; // Generate HLSL from C#. Only targets WaveHarmonic.Crest assemblies. @@ -46,6 +51,8 @@ namespace WaveHarmonic.Crest.Editor sealed class AssetPostProcessor : AssetPostprocessor { + const string k_SettingsPath = "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl"; + static async void OnPostprocessAllAssets(string[] imported, string[] deleted, string[] movedTo, string[] movedFrom, bool domainReload) { // Unused. @@ -53,12 +60,32 @@ namespace WaveHarmonic.Crest.Editor if (EditorApplication.isCompiling) { +#if CREST_DEBUG + if (imported.Contains(k_SettingsPath)) + { + UnityEngine.Debug.Log($"Crest: Settings.Crest.hlsl changed during compilation!"); + } +#endif + return; + } + + if (EditorApplication.isUpdating) + { +#if CREST_DEBUG + if (imported.Contains(k_SettingsPath)) + { + UnityEngine.Debug.Log($"Crest: Settings.Crest.hlsl changed during asset database update!"); + } +#endif return; } // Regenerate if file changed like re-importing. - if (imported.Contains("Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl")) + if (imported.Contains(k_SettingsPath)) { +#if CREST_DEBUG + UnityEngine.Debug.Log($"Crest: Settings.Crest.hlsl changed!"); +#endif // Generate HLSL from C#. Only targets WaveHarmonic.Crest assemblies. await ShaderGeneratorUtility.GenerateAll(); AssetDatabase.Refresh(); @@ -70,6 +97,19 @@ namespace WaveHarmonic.Crest.Editor [GenerateHLSL(sourcePath = "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest")] sealed class ShaderSettings { + // These two are here for compute shaders. + public static int s_CrestPackageHDRP = 0 +#if d_UnityHDRP + + 1 +#endif + ; + + public static int s_CrestPackageURP = 0 +#if d_UnityURP + + 1 +#endif + ; + public static int s_CrestPortals = #if d_CrestPortals 1 @@ -86,7 +126,10 @@ namespace WaveHarmonic.Crest.Editor #endif ; - public static int s_CrestShadowsBuiltInRenderPipeline = ProjectSettings.Instance.BuiltInRendererSampleShadowMaps ? 1 : 0; public static int s_CrestFullPrecisionDisplacement = ProjectSettings.Instance.FullPrecisionDisplacementOnHalfPrecisionPlatforms ? 1 : 0; + + public static int s_CrestDiscardAtmosphericScattering = ProjectSettings.Instance.RenderAtmosphericScatteringWhenUnderWater ? 0 : 1; + + public static int s_CrestLegacyUnderwater = ProjectSettings.Instance.LegacyUnderwater ? 1 : 0; } } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Attributes.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Attributes.cs index b86708537..ea7139604 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Attributes.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Attributes.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Adapted from: @@ -619,6 +619,44 @@ namespace WaveHarmonic.Crest } } + sealed class InlineToggle : DecoratedProperty + { + // Add extra y offset. Needed for foldouts in foldouts so far. + readonly bool _Fix; + + public InlineToggle(bool fix = false) + { + _Fix = fix; + } + + internal override bool NeedsControlRectangle(SerializedProperty property) + { + return false; + } + + internal override void OnGUI(Rect position, SerializedProperty property, GUIContent label, DecoratedDrawer drawer) + { + var r = position; + r.x -= 16f; + // Align with Space offset. + if (drawer.Space > 0) r.y += drawer.Space + 2f; + if (_Fix) r.y += EditorGUIUtility.singleLineHeight + 2f; + // Seems to be needed. + r.width = 16f * (1f + EditorGUI.indentLevel); + r.height = EditorGUIUtility.singleLineHeight; + label.text = ""; + + using (new EditorGUI.PropertyScope(r, label, property)) + { + EditorGUI.BeginProperty(r, label, property); + // Passing a tooltip to Toggle does nothing. + GUI.Label(r, label); + property.boolValue = EditorGUI.Toggle(r, property.boolValue); + EditorGUI.EndProperty(); + } + } + } + ///

    /// Allows an enum to render only a subset of options in subclasses. /// @@ -793,6 +831,9 @@ namespace WaveHarmonic.Crest case SerializedPropertyType.Float: EditorGUILayout.FloatField(label, (float)_PropertyInfo.GetValue(_Target)); break; + case SerializedPropertyType.Integer: + EditorGUILayout.IntField(label, (int)_PropertyInfo.GetValue(_Target)); + break; case SerializedPropertyType.Enum: _EnumValues ??= Enum.GetValues(_PropertyInfo.PropertyType); EditorGUILayout.Popup(label, Array.IndexOf(_EnumValues, _PropertyInfo.GetValue(_Target)), property.enumDisplayNames); @@ -886,7 +927,7 @@ namespace WaveHarmonic.Crest /// sealed class Space : Decorator { - readonly float _Height; + public readonly float _Height; readonly bool _AlwaysVisible; public Space(float height, bool isAlwaysVisible = false) @@ -978,13 +1019,13 @@ namespace WaveHarmonic.Crest } } - sealed class AttachMaterialEditor : Decorator + sealed class AttachMaterialEditor : Attribute { - public override bool AlwaysVisible => true; + public int Order { get; private set; } - internal override void Decorate(Rect position, SerializedProperty property, GUIContent label, DecoratedDrawer drawer) + public AttachMaterialEditor(int order = 0) { - Inspector.Current._Materials.Add((Material)property.objectReferenceValue); + Order = order; } } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Embedded.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Embedded.cs index 67a45c596..7c954746b 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Embedded.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Embedded.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEditor; @@ -11,17 +11,19 @@ namespace WaveHarmonic.Crest sealed class Embedded : DecoratedProperty { internal EmbeddedAssetEditor _Editor; - readonly int _BottomMargin; + public int BottomMargin { get; private set; } + public string DefaultPropertyName { get; private set; } - public Embedded(int margin = 0) + public Embedded(int margin = 0, string defaultPropertyName = null) { _Editor = new(); - _BottomMargin = margin; + BottomMargin = margin; + DefaultPropertyName = defaultPropertyName; } internal override void OnGUI(Rect position, SerializedProperty property, GUIContent label, DecoratedDrawer drawer) { - _Editor.DrawEditorCombo(label, drawer, property, "asset", _BottomMargin); + _Editor.DrawEditorCombo(this, label, drawer, property, "asset"); } internal override bool NeedsControlRectangle(SerializedProperty property) => false; diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/HelpBox.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/HelpBox.cs index c4c92f585..77ea34c3e 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/HelpBox.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/HelpBox.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEditor; diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Layer.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Layer.cs index 26601c70b..bbbeaae37 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Layer.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Layer.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEditor; diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Predicated.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Predicated.cs index c3ffae915..79f7c2884 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Predicated.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Attributes/Predicated.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System; @@ -51,6 +51,12 @@ namespace WaveHarmonic.Crest _Member = _Type.GetMember(member, Helpers.s_AnyMethod)[0]; } + /// + public Predicated(Type type, string member, bool inverted = false, bool hide = false) : this(type, member, true, inverted, hide) + { + + } + /// /// Enable/Disable field depending on the current type of the component. /// @@ -165,11 +171,11 @@ namespace WaveHarmonic.Crest if (_Member is PropertyInfo autoProperty) { // == operator does not work. - enabled = autoProperty.GetValue(@object).Equals(_DisableValue); + enabled = !autoProperty.GetValue(@object).Equals(_DisableValue); } else if (_Member is MethodInfo method) { - enabled = method.Invoke(@object, new object[] { }).Equals(_DisableValue); + enabled = !method.Invoke(@object, new object[] { }).Equals(_DisableValue); } if (_Inverted) enabled = !enabled; diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/DecoratedDrawer.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/DecoratedDrawer.cs index 9aa60c592..48088bb08 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/DecoratedDrawer.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/DecoratedDrawer.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Adapted from: @@ -27,6 +27,8 @@ namespace WaveHarmonic.Crest.Editor public static bool s_TemporaryColor; public static Color s_PreviousColor; + public float Space { get; private set; } + List _Decorators = null; List Decorators { @@ -84,6 +86,16 @@ namespace WaveHarmonic.Crest.Editor attribute.Decorate(position, property, label, this); } + Space = 0; + + // Execute all labels + for (var index = 0; index < Decorators.Count; index++) + { + var attribute = (Decorator)Decorators[index]; + if (attribute is Space space) Space = space._Height; + label = attribute.BuildLabel(label); + } + if (!s_HideInInspector && (!s_IsFoldout || s_IsFoldoutOpen)) { // Execute all visual attributes. @@ -91,7 +103,6 @@ namespace WaveHarmonic.Crest.Editor { var attribute = (Decorator)Decorators[index]; if (attribute.AlwaysVisible) continue; - label = attribute.BuildLabel(label); attribute.Decorate(position, property, label, this); } @@ -101,6 +112,7 @@ namespace WaveHarmonic.Crest.Editor : position; // Call for labels again as EditorGUI.GetPropertyHeight will revert them. + // Specifically for nested classes where the label will revert once opened. for (var index = 0; index < Decorators.Count; index++) { var attribute = (Decorator)Decorators[index]; @@ -163,7 +175,7 @@ namespace WaveHarmonic.Crest.Editor var targetType = target.GetType(); var isActive = true; - if (property.serializedObject.targetObject is Internal.EditorBehaviour c && !c.isActiveAndEnabled) + if (property.serializedObject.targetObject is Crest.Internal.EditorBehaviour c && !c.isActiveAndEnabled) { isActive = false; } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/EmbeddedAssetHelpers.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/EmbeddedAssetHelpers.cs index 348402057..319d41ca8 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/EmbeddedAssetHelpers.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/EmbeddedAssetHelpers.cs @@ -7,9 +7,10 @@ // Lovingly adapted from Cinemachine: // https://github.com/Unity-Technologies/com.unity.cinemachine/blob/593fa283bee378322337e5d9f5a7b91331a45799/Editor/Utility/EmbeddedAssetHelpers.cs -using UnityEngine; +using System.Reflection; using UnityEditor; using UnityEditor.VersionControl; +using UnityEngine; namespace WaveHarmonic.Crest.Editor { @@ -66,23 +67,24 @@ namespace WaveHarmonic.Crest.Editor System.Type _Type; Object _DefaultTarget; + FieldInfo _DefaultTargetField; const int k_IndentOffset = 3; - public void DrawEditorCombo(GUIContent label, PropertyDrawer drawer, SerializedProperty property, string extension, int bottomMargin = 0) + public void DrawEditorCombo(Embedded embedded, GUIContent label, PropertyDrawer drawer, SerializedProperty property, string extension) { _Type = drawer.fieldInfo.FieldType; DrawEditorCombo ( + embedded, label, $"Create {property.displayName} Asset", $"{property.displayName.Replace(' ', '_')}", extension, string.Empty, false, - property, - bottomMargin + property ); } @@ -92,17 +94,17 @@ namespace WaveHarmonic.Crest.Editor /// public void DrawEditorCombo ( + Embedded embedded, GUIContent label, string title, string defaultName, string extension, string message, bool indent, - SerializedProperty property, - int bottomMargin + SerializedProperty property ) { - UpdateEditor(property); + UpdateEditor(property, embedded); EditorGUI.BeginChangeCheck(); var rect = AssetField(label, property, title, defaultName, extension, message); @@ -110,7 +112,7 @@ namespace WaveHarmonic.Crest.Editor if (EditorGUI.EndChangeCheck()) { property.serializedObject.ApplyModifiedProperties(); - UpdateEditor(property); + UpdateEditor(property, embedded); } // Display embedded editor. @@ -145,9 +147,9 @@ namespace WaveHarmonic.Crest.Editor EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); - if (bottomMargin > 0) + if (embedded.BottomMargin > 0) { - EditorGUILayout.Space(bottomMargin); + EditorGUILayout.Space(embedded.BottomMargin); } } @@ -201,14 +203,31 @@ namespace WaveHarmonic.Crest.Editor } } - public void UpdateEditor(SerializedProperty property) + public void UpdateEditor(SerializedProperty property, Embedded embedded) { var target = property.objectReferenceValue; + var hasDefaultField = !string.IsNullOrEmpty(embedded.DefaultPropertyName); - if (target == null && _DefaultTarget == null) + if (target == null) { - _DefaultTarget = ScriptableObject.CreateInstance(_Type); - _DefaultTarget.hideFlags = HideFlags.DontSave | HideFlags.NotEditable; + if (!hasDefaultField) + { + if (_DefaultTarget == null) + { + _DefaultTarget = ScriptableObject.CreateInstance(_Type); + _DefaultTarget.hideFlags = HideFlags.DontSave | HideFlags.NotEditable; + } + } + else + { + if (_DefaultTargetField == null) + { + _DefaultTargetField = property.serializedObject.targetObject.GetType().GetField(embedded.DefaultPropertyName, Helpers.s_AnyMethod); + } + + // Always call, as it is dynamic. + _DefaultTarget = (Object)_DefaultTargetField.GetValue(property.serializedObject.targetObject); + } } if (target == null) diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Helpers.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Helpers.cs index 637c91561..7464fbd5d 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Helpers.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Helpers.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System.Diagnostics.CodeAnalysis; @@ -15,7 +15,7 @@ namespace WaveHarmonic.Crest.Editor /// /// Provides general helper functions for the editor. /// - static class EditorHelpers + static partial class EditorHelpers { internal static ComputeShader s_VisualizeNegativeValuesShader; internal static ComputeShader VisualizeNegativeValuesShader @@ -227,27 +227,6 @@ namespace WaveHarmonic.Crest.Editor UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEngine.SceneManagement.SceneManager.GetActiveScene()); } } - - static readonly MethodInfo s_ButtonWithDropdownList = typeof(EditorGUI).GetMethod - ( - "ButtonWithDropdownList", - BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public, - null, - new System.Type[] { typeof(GUIContent), typeof(string[]), typeof(GenericMenu.MenuFunction2), typeof(GUILayoutOption[]) }, - null - ); - - static readonly GUILayoutOption[] s_GUILayoutOptionsZero; - - public static bool ButtonWithDropdownList(GUIContent name, string[] names, GenericMenu.MenuFunction2 callback) - { - if (names == null) - { - return GUILayout.Button(name); - } - - return (bool)s_ButtonWithDropdownList.Invoke(null, new object[] { name, names, callback, s_GUILayoutOptionsZero }); - } } static partial class Extensions @@ -269,4 +248,241 @@ namespace WaveHarmonic.Crest.Editor return tag.name; } } + + static partial class EditorHelpers + { + const int k_ButtonDropDownWidth = 15; + + static readonly GUIContent s_ButtonDropDownIcon = new(EditorGUIUtility.FindTexture("icon dropdown@2x")); + static readonly PropertyInfo s_TopLevel = typeof(GUILayoutUtility).GetProperty("topLevel", BindingFlags.NonPublic | BindingFlags.Static); + static readonly MethodInfo s_GetLast = typeof(GUILayoutUtility).Assembly.GetType("UnityEngine.GUILayoutGroup").GetMethod("GetLast", BindingFlags.Public | BindingFlags.Instance); + + // Only way to identify the caller is its rect. + static Rect s_ButtonChooser; + static int s_ButtonChoice = -2; + + // Normal button or split button with dropdown. + public static bool Button + ( + GUIContent label, + out int choice, + string[] labels, + bool disableMain = false, + bool disableDropDown = false, + bool centerLabel = false, + bool expandWidth = true, + int minimumWidth = 0 + ) + { + choice = -2; + var chosen = false; + + var hasDropDown = labels?.Length > 0; + var skin = GUI.skin.button; + + using (new EditorGUI.DisabledGroupScope(disableMain)) + { + var style = new GUIStyle(hasDropDown ? EditorStyles.miniButtonLeft : EditorStyles.miniButton) + { + padding = skin.padding, + stretchHeight = skin.stretchHeight, + fixedHeight = skin.fixedHeight + }; + + var width = style.CalcSize(label).x + style.padding.left + + style.padding.right + style.border.left + style.border.right; + width = Mathf.Max(width, minimumWidth); + // TODO: Add option to disable this (consistent width). + if (!hasDropDown && minimumWidth > 0) width += k_ButtonDropDownWidth; + if (centerLabel && hasDropDown) style.padding.left += k_ButtonDropDownWidth; + + if (GUILayout.Button(label, style, expandWidth ? GUILayout.ExpandWidth(true) : GUILayout.Width(width))) + { + choice = -1; + chosen = true; + } + } + + if (hasDropDown) + { + using (new EditorGUI.DisabledGroupScope(disableDropDown)) + { + // TODO: color interior border same as exterior (lighten). + var style = new GUIStyle(EditorStyles.miniButtonRight) + { + padding = new(1, 1, 3, 3), + stretchHeight = skin.stretchHeight, + fixedHeight = skin.fixedHeight + }; + + var rect = (Rect)s_GetLast.Invoke(s_TopLevel.GetValue(null), null); + rect.width += k_ButtonDropDownWidth; + + if (s_ButtonChoice > -1 && s_ButtonChooser == rect) + { + choice = s_ButtonChoice; + chosen = true; + s_ButtonChoice = -2; + s_ButtonChooser = Rect.zero; + } + + if (GUILayout.Button(s_ButtonDropDownIcon, style, GUILayout.Width(k_ButtonDropDownWidth), GUILayout.ExpandHeight(true))) + { + var menu = new GenericMenu(); + + for (var i = 0; i < labels.Length; i++) + { + menu.AddItem(new(labels[i]), false, x => { s_ButtonChoice = (int)x; s_ButtonChooser = rect; }, i); + } + + menu.DropDown(rect); + } + } + } + + return chosen; + } + } + + static partial class EditorHelpers + { + // Adapted from (public API may support this in future): + // com.unity.splines@2.7.2/Editor/Components/SplineContainerEditor.cs + static GUIStyle s_HelpLabelStyle; + static GUIStyle HelpLabelStyle => s_HelpLabelStyle ??= new(EditorStyles.label) + { + wordWrap = EditorStyles.helpBox.wordWrap, + fontSize = EditorStyles.helpBox.fontSize, + padding = new(-2, 0, 0, 0), + richText = true, + }; + + static readonly MethodInfo s_GetHelpIcon = typeof(EditorGUIUtility).GetMethod("GetHelpIcon", BindingFlags.Static | BindingFlags.NonPublic); + + internal static int? HelpBox + ( + GUIContent message, + MessageType type, + GUIContent button = null, + string[] buttons = null, + bool buttonCenterLabel = false, + int buttonMinimumWidth = 0 + ) + { + return HelpBox + ( + message, + new GUIContent((Texture2D)s_GetHelpIcon.Invoke(null, new object[] { type })), + button, + buttons, + buttonCenterLabel, + buttonMinimumWidth + ); + } + + internal static int? HelpBox + ( + GUIContent message, + GUIContent icon, + GUIContent button = null, + string[] buttons = null, + bool buttonCenterLabel = false, + int buttonMinimumWidth = 0 + ) + { + int? result = null; + + // Box + EditorGUILayout.BeginHorizontal(EditorStyles.helpBox); + + // Icon + EditorGUIUtility.SetIconSize(new(32f, 32f)); + EditorGUILayout.LabelField(icon, GUILayout.Width(34), GUILayout.MinHeight(34), GUILayout.ExpandHeight(true)); + EditorGUIUtility.SetIconSize(Vector2.zero); + + // Text + EditorGUILayout.LabelField(message, HelpLabelStyle, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); + + // Button + if (button != null) + { + GUILayout.FlexibleSpace(); + + EditorGUILayout.BeginVertical(); + GUILayout.FlexibleSpace(); + + EditorGUILayout.BeginHorizontal(); + + if (Button(button, out var choice, buttons, centerLabel: buttonCenterLabel, minimumWidth: buttonMinimumWidth, expandWidth: false)) + { + result = choice; + } + + EditorGUILayout.EndHorizontal(); + + GUILayout.FlexibleSpace(); + EditorGUILayout.EndVertical(); + + } + + EditorGUILayout.EndHorizontal(); + + return result; + } + } + + namespace Internal + { + static class Extensions + { + // Recursively find the field owner (instance). + public static bool FindOwner(this FieldInfo field, ref object target) + { + if (field.DeclaringType.IsAssignableFrom(target.GetType())) + { + return true; + } + + return field.FindOwnerInFields(ref target); + } + + public static bool FindOwnerInFields(this FieldInfo targetField, ref object target) + { + if (target == null) + { + return false; + } + + var fields = target.GetType() + .GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + + foreach (var field in fields) + { + if (field.GetCustomAttribute() == null) + { + continue; + } + + var value = field.GetValue(target); + if (value == null) + { + continue; + } + + if (targetField.DeclaringType.IsAssignableFrom(value.GetType())) + { + target = value; + return true; + } + + if (FindOwnerInFields(targetField, ref value)) + { + return true; + } + } + + return false; + } + } + } } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.Validation.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.Validation.cs index f56859f06..914108340 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.Validation.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.Validation.cs @@ -9,16 +9,12 @@ namespace WaveHarmonic.Crest.Editor { partial class Inspector { - static readonly bool s_GroupMessages = false; - static GUIContent s_JumpButtonContent = null; - static GUIContent s_FixButtonContent = null; + static readonly string[] s_FixButtonDropDown = { "Inspect" }; + static readonly GUIContent s_FixButtonContent = new("Fix"); + static readonly GUIContent s_InspectButtonContent = new("Inspect", "Jump to object to resolve issue."); protected virtual void RenderValidationMessages() { - // Enable rich text in help boxes. Store original so we can revert since this might be a "hack". - var styleRichText = GUI.skin.GetStyle("HelpBox").richText; - GUI.skin.GetStyle("HelpBox").richText = true; - // This is a static list so we need to clear it before use. Not sure if this will ever be a threaded // operation which would be an issue. foreach (var messages in ValidatedHelper.s_Messages) @@ -30,7 +26,43 @@ namespace WaveHarmonic.Crest.Editor // We only want space before and after the list of help boxes. We don't want space between. var needsSpaceAbove = true; - var needsSpaceBelow = false; + + // Work out if button label needs aligning. + var needsAlignment = false; + var hasBoth = false; + var hasEither = false; + for (var messageTypeIndex = 0; messageTypeIndex < ValidatedHelper.s_Messages.Length; messageTypeIndex++) + { + var messages = ValidatedHelper.s_Messages[messageTypeIndex]; + + if (messages.Count > 0) + { + var messageType = (MessageType)ValidatedHelper.s_Messages.Length - messageTypeIndex; + + foreach (var message in messages) + { + var hasFix = message._Action != null; + var hasInspect = false; + + if (message._Object != null) + { + var casted = message._Object as MonoBehaviour; + + if (Selection.activeObject != message._Object && (casted == null || casted.gameObject != Selection.activeObject)) + { + hasInspect = true; + } + } + + if (hasFix && hasInspect) hasBoth = true; + if (hasInspect != hasFix) hasEither = true; + if (hasBoth && hasEither) goto exit; + } + } + } + + exit: + needsAlignment = hasBoth && hasEither; // We loop through in reverse order so errors appears at the top. for (var messageTypeIndex = 0; messageTypeIndex < ValidatedHelper.s_Messages.Length; messageTypeIndex++) @@ -41,118 +73,87 @@ namespace WaveHarmonic.Crest.Editor { if (needsSpaceAbove) { - // Double space looks good at top. EditorGUILayout.Space(); - // EditorGUILayout.Space(); needsSpaceAbove = false; } - needsSpaceBelow = true; - // Map Validated.MessageType to HelpBox.MessageType. var messageType = (MessageType)ValidatedHelper.s_Messages.Length - messageTypeIndex; - if (s_GroupMessages) + foreach (var message in messages) { - // We join the messages together to reduce vertical space since HelpBox has padding, borders etc. - var joinedMessage = messages[0]._Message; - // Format as list if we have more than one message. - if (messages.Count > 1) joinedMessage = $"- {joinedMessage}"; + EditorGUILayout.BeginHorizontal(); - for (var messageIndex = 1; messageIndex < messages.Count; messageIndex++) + var originalGUIEnabled = GUI.enabled; + + if ((message._Action == ValidatedHelper.FixAddMissingMathPackage || message._Action == ValidatedHelper.FixAddMissingBurstPackage) && PackageManagerHelpers.IsBusy) { - joinedMessage += $"\n- {messages[messageIndex]}"; + GUI.enabled = false; } - EditorGUILayout.HelpBox(joinedMessage, messageType); - } - else - { - foreach (var message in messages) + if (message._FixDescription != null) { - EditorGUILayout.BeginHorizontal(); - - var fixDescription = message._FixDescription; - var originalGUIEnabled = GUI.enabled; - - if (message._Action != null) - { - fixDescription += " Click the fix/repair button on the right to fix."; - - if ((message._Action == ValidatedHelper.FixAddMissingMathPackage || message._Action == ValidatedHelper.FixAddMissingBurstPackage) && PackageManagerHelpers.IsBusy) - { - GUI.enabled = false; - } - } - - EditorGUILayout.HelpBox($"{message._Message} {fixDescription}", messageType); - - // Jump to object button. - if (message._Object != null) - { - // Selection.activeObject can be message._object.gameObject instead of the component - // itself. We soft cast to MonoBehaviour to get the gameObject for comparison. - // Alternatively, we could always pass gameObject instead of "this". - var casted = message._Object as MonoBehaviour; - - if (Selection.activeObject != message._Object && (casted == null || casted.gameObject != Selection.activeObject)) - { - s_JumpButtonContent ??= new(EditorGUIUtility.FindTexture("scenepicking_pickable_hover@2x"), "Jump to object to resolve issue"); - - if (GUILayout.Button(s_JumpButtonContent, GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(true))) - { - Selection.activeObject = message._Object; - } - } - } - - // Fix the issue button. - if (message._Action != null) - { - s_FixButtonContent ??= new(EditorGUIUtility.FindTexture("SceneViewTools")); - - if (message._FixDescription != null) - { - var sanitisedFixDescr = Regex.Replace(message._FixDescription, @"<[^<>]*>", "'"); - s_FixButtonContent.tooltip = $"Apply fix: {sanitisedFixDescr}"; - } - else - { - s_FixButtonContent.tooltip = "Fix issue"; - } - - if (GUILayout.Button(s_FixButtonContent, GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(true))) - { - // Run fix function - var serializedObject = new SerializedObject(message._Object); - // Property is optional. - var property = message._PropertyPath != null ? serializedObject?.FindProperty(message._PropertyPath) : null; - var oldValue = property?.boxedValue; - message._Action.Invoke(serializedObject, property); - if (serializedObject.ApplyModifiedProperties()) - { - // SerializedObject does this for us, but gives the history item a nicer label. - Undo.RecordObject(message._Object, s_FixButtonContent.tooltip); - DecoratedDrawer.OnChange(property, oldValue); - } - } - } - - GUI.enabled = originalGUIEnabled; - - EditorGUILayout.EndHorizontal(); + var sanitized = Regex.Replace(message._FixDescription, @"<[^<>]*>", "'"); + s_FixButtonContent.tooltip = $"Fix: {sanitized}"; } + else + { + s_FixButtonContent.tooltip = "Fix issue"; + } + + var canFix = message._Action != null; + var canInspect = false; + + // Jump to object button. + if (message._Object != null) + { + // Selection.activeObject can be message._object.gameObject instead of the component + // itself. We soft cast to MonoBehaviour to get the gameObject for comparison. + // Alternatively, we could always pass gameObject instead of "this". + var casted = message._Object as MonoBehaviour; + + if (Selection.activeObject != message._Object && (casted == null || casted.gameObject != Selection.activeObject)) + { + canInspect = true; + } + } + + var result = EditorHelpers.HelpBox + ( + new($"{message._Message} {message._FixDescription}"), + messageType, + canFix ? s_FixButtonContent : canInspect ? s_InspectButtonContent : null, + buttons: canInspect && canFix ? s_FixButtonDropDown : null, + buttonCenterLabel: needsAlignment, + buttonMinimumWidth: 72 + ); + + if (canFix && result == -1) + { + // Run fix function. + var serializedObject = new SerializedObject(message._Object); + // Property is optional. + var property = message._PropertyPath != null ? serializedObject?.FindProperty(message._PropertyPath) : null; + var oldValue = property?.boxedValue; + message._Action.Invoke(serializedObject, property); + if (serializedObject.ApplyModifiedProperties()) + { + // SerializedObject does this for us, but gives the history item a nicer label. + Undo.RecordObject(message._Object, s_FixButtonContent.tooltip); + DecoratedDrawer.OnChange(property, oldValue); + } + } + else if (canInspect && result != null) + { + Selection.activeObject = message._Object; + } + + GUI.enabled = originalGUIEnabled; + + EditorGUILayout.EndHorizontal(); } } } - - if (needsSpaceBelow) - { - // EditorGUILayout.Space(); - } - - // Revert skin since it persists. - GUI.skin.GetStyle("HelpBox").richText = styleRichText; } } } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.cs index 508ff883b..c8a6eaf78 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Inspector.cs @@ -3,9 +3,11 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; using UnityEditor; using UnityEngine; +using WaveHarmonic.Crest.Editor.Internal; using WaveHarmonic.Crest.Internal; namespace WaveHarmonic.Crest.Editor @@ -21,15 +23,32 @@ namespace WaveHarmonic.Crest.Editor internal static Inspector Current { get; private set; } + readonly Dictionary _MaterialOwners = new(); readonly Dictionary _MaterialEditors = new(); - public override bool RequiresConstantRepaint() => TexturePreview.AnyActivePreviews; + public override bool RequiresConstantRepaint() => TexturePreview.s_ActiveInstance?.Open == true; - // Set this from a decorator to enable the material editor. - internal List _Materials = new(); + static readonly IOrderedEnumerable s_AttachMaterialEditors = TypeCache + .GetFieldsWithAttribute() + .OrderBy(x => x.GetCustomAttribute().Order); readonly Utility.SortedList _Properties = new(Helpers.DuplicateComparison); + protected virtual void OnEnable() + { + _MaterialOwners.Clear(); + + foreach (var field in s_AttachMaterialEditors) + { + var target = (object)this.target; + + if (field.FindOwner(ref target)) + { + _MaterialOwners.Add(field, target); + } + } + } + public override void OnInspectorGUI() { // Reset foldout values. @@ -61,7 +80,7 @@ namespace WaveHarmonic.Crest.Editor } } - protected void RenderBeforeInspectorGUI() + protected virtual void RenderBeforeInspectorGUI() { if (this.target is EditorBehaviour target && target._IsPrefabStageInstance) { @@ -143,13 +162,14 @@ namespace WaveHarmonic.Crest.Editor protected virtual void RenderAfterInspectorGUI() { - foreach (var material in _Materials) + foreach (var mapping in _MaterialOwners) { - if (material == null) continue; - DrawMaterialEditor(material); + var material = (Material)mapping.Key.GetValue(mapping.Value); + if (material != null) + { + DrawMaterialEditor(material); + } } - - _Materials.Clear(); } // Adapted from: http://answers.unity.com/answers/975894/view.html diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs new file mode 100644 index 000000000..f904cef78 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs @@ -0,0 +1,75 @@ + +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using System.Linq; +using UnityEditor; +using UnityEditor.Build; + +namespace WaveHarmonic.Crest.Editor.Settings +{ + static class ScriptingSymbols + { + static NamedBuildTarget CurrentNamedBuildTarget + { + get + { +#if UNITY_SERVER + return NamedBuildTarget.Server; +#else + return NamedBuildTarget.FromBuildTargetGroup(BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget)); +#endif + } + } + + public static string[] Symbols => PlayerSettings.GetScriptingDefineSymbols(CurrentNamedBuildTarget).Split(';'); + + public static void Add(string[] symbols) + { + // We remove our symbols from the list first to prevent duplicates - just to be safe. + SetScriptingDefineSymbols(Symbols.Except(symbols).Concat(symbols).ToArray()); + } + + public static void Add(string symbol) + { + Add(new string[] { symbol }); + } + + public static void Remove(string[] symbols) + { + SetScriptingDefineSymbols(Symbols.Except(symbols).ToArray()); + } + + public static void Remove(string symbol) + { + Remove(new string[] { symbol }); + } + + public static void Set(string[] symbols, bool enable) + { + if (enable) + { + Add(symbols); + } + else + { + Remove(symbols); + } + } + + public static void Set(string symbol, bool enable) + { + Set(new string[] { symbol }, enable); + } + + static void SetScriptingDefineSymbols(string[] symbols) + { + SetScriptingDefineSymbols(string.Join(";", symbols)); + } + + static void SetScriptingDefineSymbols(string symbols) + { + PlayerSettings.SetScriptingDefineSymbols(CurrentNamedBuildTarget, symbols); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs.meta b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs.meta new file mode 100644 index 000000000..66bd5bc96 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ScriptingSymbols.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c03a1671f6a84ed4ac42813e95a07d7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs new file mode 100644 index 000000000..989b0784f --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs @@ -0,0 +1,739 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEditor.Rendering.BuiltIn; +using UnityEditor.Rendering.BuiltIn.ShaderGraph; +using UnityEditor.ShaderGraph; +using UnityEngine; +using UnityEngine.Rendering; + +#if UNITY_2022_3_OR_NEWER +using UnityEngine.UIElements; +#else +using UnityEngine.UIElements; +using UnityEditor.UIElements; +#endif + +using UnityBuiltInLitSubTarget = UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInLitSubTarget; + +namespace WaveHarmonic.Crest.Editor.ShaderGraph +{ + sealed class MaterialModificationProcessor : AssetModificationProcessor + { + static void OnWillCreateAsset(string asset) + { + if (!asset.ToLowerInvariant().EndsWith(".mat")) + { + return; + } + + MaterialPostProcessor.s_CreatedAssets.Add(asset); + } + } + + sealed class MaterialPostProcessor : AssetPostprocessor + { + public override int GetPostprocessOrder() + { + return 1; + } + + internal static readonly List s_CreatedAssets = new(); + + static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) + { + foreach (var asset in importedAssets) + { + // We only care about materials + if (!asset.EndsWith(".mat", System.StringComparison.InvariantCultureIgnoreCase)) + { + continue; + } + + // Load the material and look for it's BuiltIn ShaderID. + // We only care about versioning materials using a known BuiltIn ShaderID. + // This skips any materials that only target other render pipelines, are user shaders, + // or are shaders we don't care to version + var material = (Material)AssetDatabase.LoadAssetAtPath(asset, typeof(Material)); + var shaderID = ShaderUtils.GetShaderID(material.shader); + if (shaderID == ShaderUtils.ShaderID.Unknown) + { + continue; + } + + if (material.shader == null || material.shader.name != "Crest/Water") + { + continue; + } + + // Look for the BuiltIn AssetVersion + AssetVersion assetVersion = null; + var allAssets = AssetDatabase.LoadAllAssetsAtPath(asset); + foreach (var subAsset in allAssets) + { + if (subAsset is AssetVersion sub) + { + assetVersion = sub; + } + } + + if (!assetVersion) + { + if (s_CreatedAssets.Contains(asset)) + { + s_CreatedAssets.Remove(asset); + CustomBuiltInLitGUI.UpdateMaterial(material); + } + } + } + } + } + + class CustomBuiltInLitGUI : BuiltInLitGUI + { + MaterialEditor _MaterialEditor; + MaterialProperty[] _Properties; + + static readonly GUIContent s_WorkflowModeText = EditorGUIUtility.TrTextContent + ( + "Workflow Mode", + "Select a workflow that fits your textures. Choose between Metallic or Specular." + ); + + static readonly GUIContent s_TransparentReceiveShadowsText = EditorGUIUtility.TrTextContent + ( + "Receives Shadows", + "When enabled, other GameObjects can cast shadows onto this GameObject." + ); + + public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) + { + _MaterialEditor = materialEditor; + _Properties = properties; + + base.OnGUI(materialEditor, properties); + } + + public override void ValidateMaterial(Material material) + { + base.ValidateMaterial(material); + UpdateMaterial(material); + } + + public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader) + { + base.AssignNewShaderToMaterial(material, oldShader, newShader); + UpdateMaterial(material); + } + + protected override void DrawSurfaceOptions(Material material) + { + var materialEditor = _MaterialEditor; + var properties = _Properties; + + var workflowProperty = FindProperty(Property.SpecularWorkflowMode(), properties, false); + if (workflowProperty != null) + { + DoPopup(s_WorkflowModeText, materialEditor, workflowProperty, System.Enum.GetNames(typeof(WorkflowMode))); + } + + base.DrawSurfaceOptions(material); + + var surfaceTypeProp = FindProperty(Property.Surface(), properties, false); + if (surfaceTypeProp != null && (SurfaceType)surfaceTypeProp.floatValue == SurfaceType.Transparent) + { + var trsProperty = FindProperty(BuiltInLitSubTarget.s_TransparentReceiveShadowsProperty, properties, false); + DrawFloatToggleProperty(s_TransparentReceiveShadowsText, trsProperty); + } + } + + // Should be called by ShaderGraphMaterialsUpdater, but we will never upgrade. + public static new void UpdateMaterial(Material material) + { + if (material.HasProperty(Property.SpecularWorkflowMode())) + { + var workflow = (WorkflowMode)material.GetFloat(Property.SpecularWorkflowMode()); + CoreUtils.SetKeyword(material, BuiltInLitSubTarget.LitDefines.s_SpecularSetup.referenceName, workflow == WorkflowMode.Specular); + } + + if (material.HasProperty(BuiltInLitSubTarget.s_TransparentReceiveShadowsProperty)) + { + var receive = material.GetFloat(BuiltInLitSubTarget.s_TransparentReceiveShadowsProperty) == 1f; + CoreUtils.SetKeyword(material, BuiltInLitSubTarget.LitDefines.s_TransparentReceivesShadows.referenceName, receive); + } + } + } + + sealed class BuiltInLitSubTarget : BuiltInSubTarget + { + const string k_ShaderPath = "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy"; + const string k_TemplatePath = "Packages/com.waveharmonic.crest/Editor/Shaders/Templates"; + + readonly UnityBuiltInLitSubTarget _BuiltInLitSubTarget; + +#pragma warning disable IDE0032, IDE1006 + [SerializeField] + WorkflowMode m_WorkflowMode = WorkflowMode.Metallic; + + [SerializeField] + NormalDropOffSpace m_NormalDropOffSpace = NormalDropOffSpace.Tangent; + + [SerializeField] + bool m_TransparentReceiveShadows = true; +#pragma warning restore IDE0032, IDE1006 + + public static readonly string s_TransparentReceiveShadowsProperty = "_BUILTIN_TransparentReceiveShadows"; + + public BuiltInLitSubTarget() + { + _BuiltInLitSubTarget = new(); + displayName = _BuiltInLitSubTarget.displayName; + } + + protected override ShaderUtils.ShaderID shaderID => ShaderUtils.ShaderID.SG_Lit; + public override bool IsActive() => true; + + WorkflowMode WorkflowMode + { + get => m_WorkflowMode; + set => m_WorkflowMode = value; + } + + NormalDropOffSpace NormalDropOffSpace + { + get => m_NormalDropOffSpace; + set => m_NormalDropOffSpace = value; + } + + bool TransparentReceiveShadows + { + get => m_TransparentReceiveShadows; + set => m_TransparentReceiveShadows = value; + } + +#if UNITY_2022_3_OR_NEWER + static FieldInfo s_CustomEditorForRenderPipelines; + static FieldInfo CustomEditorForRenderPipelines => s_CustomEditorForRenderPipelines ??= typeof(TargetSetupContext).GetField("customEditorForRenderPipelines", BindingFlags.NonPublic | BindingFlags.Instance); +#endif + + public override void Setup(ref TargetSetupContext context) + { + _BuiltInLitSubTarget.target = target; + _BuiltInLitSubTarget.normalDropOffSpace = NormalDropOffSpace; + _BuiltInLitSubTarget.Setup(ref context); + + // Caused a crash: !context.HasCustomEditorForRenderPipeline(null) + if (string.IsNullOrEmpty(target.customEditorGUI)) + { +#if UNITY_2022_3_OR_NEWER + var editors = (List)CustomEditorForRenderPipelines.GetValue(context); + if (editors.Count > 0) + { + editors.RemoveAt(editors.Count - 1); + } + + context.AddCustomEditorForRenderPipeline(typeof(CustomBuiltInLitGUI).FullName, ""); +#else + if (context.customEditorForRenderPipelines.Count > 0) + { + context.customEditorForRenderPipelines.RemoveAt(context.customEditorForRenderPipelines.Count - 1); + } + + context.customEditorForRenderPipelines.Add((typeof(CustomBuiltInLitGUI).FullName, "")); +#endif + } + + context.subShaders.RemoveAt(0); + context.AddSubShader(SubShaders.Lit(this)); + } + + public override void ProcessPreviewMaterial(Material material) + { + _BuiltInLitSubTarget.target = target; + _BuiltInLitSubTarget.normalDropOffSpace = NormalDropOffSpace; + _BuiltInLitSubTarget.ProcessPreviewMaterial(material); + CustomBuiltInLitGUI.UpdateMaterial(material); + } + + public override void GetFields(ref TargetFieldContext context) + { + _BuiltInLitSubTarget.target = target; + _BuiltInLitSubTarget.normalDropOffSpace = NormalDropOffSpace; + _BuiltInLitSubTarget.GetFields(ref context); + // Do not use this, as we handle this properly. + context.AddField(BuiltInFields.SpecularSetup, false); + } + + public override void GetActiveBlocks(ref TargetActiveBlockContext context) + { + _BuiltInLitSubTarget.target = target; + _BuiltInLitSubTarget.normalDropOffSpace = NormalDropOffSpace; + _BuiltInLitSubTarget.GetActiveBlocks(ref context); + + context.activeBlocks.Remove(BlockFields.SurfaceDescription.Metallic); + var insertion = context.activeBlocks.FindIndex(x => x == BlockFields.SurfaceDescription.Occlusion) + 1; + + if ((WorkflowMode == WorkflowMode.Specular) || target.allowMaterialOverride) + { + context.activeBlocks.Insert(insertion, BlockFields.SurfaceDescription.Specular); + } + + if ((WorkflowMode == WorkflowMode.Metallic) || target.allowMaterialOverride) + { + context.activeBlocks.Insert(insertion, BlockFields.SurfaceDescription.Metallic); + } + } + + public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode) + { + if (target.allowMaterialOverride) + { + collector.AddFloatProperty(Property.SpecularWorkflowMode(), (float)WorkflowMode); + } + + _BuiltInLitSubTarget.target = target; + _BuiltInLitSubTarget.normalDropOffSpace = NormalDropOffSpace; + _BuiltInLitSubTarget.CollectShaderProperties(collector, generationMode); + + if (target.allowMaterialOverride) + { + collector.AddFloatProperty(s_TransparentReceiveShadowsProperty, TransparentReceiveShadows ? 1f : 0f); + } + + // LEqual + collector.AddFloatProperty(SubShaders.k_ShadowCasterZTest, 4, UnityEditor.ShaderGraph.Internal.HLSLDeclaration.UnityPerMaterial); + } + + public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, System.Action onChange, System.Action registerUndo) + { + target.AddDefaultMaterialOverrideGUI(ref context, onChange, registerUndo); + + context.AddProperty("Workflow", new EnumField(WorkflowMode.Metallic) { value = WorkflowMode }, (evt) => + { + if (Equals(WorkflowMode, evt.newValue)) + return; + + registerUndo("Change Workflow"); + WorkflowMode = (WorkflowMode)evt.newValue; + onChange(); + }); + + target.GetDefaultSurfacePropertiesGUI(ref context, onChange, registerUndo); + + context.AddProperty("Transparent Receives Shadows", new Toggle() { value = TransparentReceiveShadows }, (evt) => + { + if (Equals(TransparentReceiveShadows, evt.newValue)) + return; + + registerUndo("Change Transparent Receives Shadows"); + TransparentReceiveShadows = evt.newValue; + onChange(); + }); + + context.AddProperty("Fragment Normal Space", new EnumField(NormalDropOffSpace.Tangent) { value = NormalDropOffSpace }, (evt) => + { + if (Equals(NormalDropOffSpace, evt.newValue)) + return; + + registerUndo("Change Fragment Normal Space"); + NormalDropOffSpace = (NormalDropOffSpace)evt.newValue; + _BuiltInLitSubTarget.normalDropOffSpace = NormalDropOffSpace; + onChange(); + }); + } + + static class SubShaders + { + static readonly string s_ShaderPathDefines = $"{k_ShaderPath}/Defines.hlsl"; + static readonly string s_ShaderPathBuilding = $"{k_ShaderPath}/LegacyBuilding.hlsl"; + + // SetShaderPassEnabled on ShadowCaster pass does not work for BIRP. We set ZTest + // to Never which is the best we can do. We are still incurring the draw call cost. + // This is an issue because of the way we trigger motion vectors, but is a bug with + // Unity and should be reported. + internal const string k_ShadowCasterZTest = "_Crest_BUILTIN_ShadowCasterZTest"; + + internal static System.Type s_SubShadersType; + internal static System.Type SubShadersType => s_SubShadersType ??= typeof(UnityBuiltInLitSubTarget).GetNestedType("SubShaders", BindingFlags.Static | BindingFlags.NonPublic); + internal static MethodInfo s_LitMethod; + internal static MethodInfo LitMethod => s_LitMethod ??= SubShadersType.GetMethod("Lit", BindingFlags.Static | BindingFlags.Public); + + static void PatchIncludes(ref PassDescriptor result) + { + var includes = new IncludeCollection(); + + includes.Add(s_ShaderPathDefines, IncludeLocation.Pregraph); + includes.Add("Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShaderPass.hlsl", IncludeLocation.Pregraph); + + foreach (var include in result.includes) + { + includes.AddInternal(include.guid, include.path, include.location, include.fieldConditions); + } + + result.includes = includes; + } + + static void PatchSpecularIncludes(ref PassDescriptor result, string file) + { + var ic = new IncludeCollection(); + foreach (var include in result.includes) + { + if (include.path.EndsWith(file)) + { + ic.Add(s_ShaderPathBuilding, include.location); + ic.AddInternal(include.guid, include.path, include.location, include.fieldConditions); + } + else + { + ic.AddInternal(include.guid, include.path, include.location, include.fieldConditions); + } + } + + result.includes = ic; + } + + static readonly Dictionary s_Mappings = new() + { + { "SHADERPASS_FORWARD", "PBRForwardPass.hlsl" }, + { "SHADERPASS_FORWARD_ADD", "PBRForwardAddPass.hlsl" }, + { "SHADERPASS_DEFERRED", "PBRDeferredPass.hlsl" }, + }; + + static readonly string[] s_SkipVariants = new string[] + { + "LIGHTMAP_ON", + "LIGHTMAP_SHADOW_MIXING", + "DIRLIGHTMAP_COMBINED", + "DYNAMICLIGHTMAP_ON", + "SHADOWS_SHADOWMASK", + }; + + public static SubShaderDescriptor Lit(BuiltInLitSubTarget subtarget) + { + var target = subtarget.target; + var ssd = (SubShaderDescriptor)LitMethod.Invoke(null, new object[] { target, target.renderType, target.renderQueue }); + + PassCollection passes = new(); + + foreach (var item in ssd.passes) + { + // Many artifacts in U6 if our Write Depth enabled. + // Caused by _SURFACE_TYPE_TRANSPARENT in m_ValidKeywords. + if (item.descriptor.referenceName == "SceneSelectionPass") + { + continue; + } + + var result = item.descriptor; + + var keywords = new KeywordCollection(); + + foreach (var keyword in result.keywords) + { + // All others are either duplicate or unused. + if (!keyword.descriptor.referenceName.StartsWith("_BUILTIN_")) + { + continue; + } + + keywords.Add(keyword.descriptor, keyword.fieldConditions); + } + + result.keywords = keywords; + + switch (item.descriptor.referenceName) + { + case "SHADERPASS_FORWARD": + case "SHADERPASS_FORWARD_ADD": + case "SHADERPASS_DEFERRED": + AddWorkflowModeControlToPass(ref result, target, subtarget.WorkflowMode); + PatchSpecularIncludes(ref result, s_Mappings[item.descriptor.referenceName]); + + var pragmas = new PragmaCollection(); + foreach (var pragma in result.pragmas) + { + // For UAVs (RWStructuredBuffer). + if (pragma.descriptor.value.StartsWithNoAlloc("target")) + { + pragmas.Add(Pragma.Target(ShaderModel.Target45)); + continue; + } + + if (pragma.descriptor.value.StartsWithNoAlloc("vertex")) + { + pragmas.Add(Pragma.SkipVariants(s_SkipVariants)); + } + + pragmas.Add(pragma.descriptor, pragma.fieldConditions); + } + result.pragmas = pragmas; + + goto default; + default: + PatchIncludes(ref result); + break; + } + + switch (item.descriptor.referenceName) + { + case "SHADERPASS_FORWARD": + case "SHADERPASS_FORWARD_ADD": + AddReceivesShadowsControlToPass(ref result, target, subtarget.TransparentReceiveShadows); + break; + case "SHADERPASS_SHADOWCASTER": + var states = new RenderStateCollection(); + foreach (var state in result.renderStates) + { + if (state.descriptor.type == RenderStateType.ZTest) + { + states.Add(RenderState.ZTest($"[{k_ShadowCasterZTest}]")); + continue; + } + + states.Add(state.descriptor, state.fieldConditions); + } + + result.renderStates = states; + break; + } + + // Add missing cull render state. + if (item.descriptor.referenceName == "SHADERPASS_FORWARD_ADD") + { + CoreRenderStates.AddUberSwitchedCull(target, result.renderStates); + } + + // Inject MV before DO pass. + if (item.descriptor.referenceName == "SHADERPASS_DEPTHONLY") + { + var mv = LitPasses.MotionVectors(target); + PatchIncludes(ref mv); + passes.Add(mv); + } + + // Fix XR SPI. + if (result.requiredFields != null) + { + var found = false; + + foreach (var collection in result.requiredFields) + { + if (collection.field == StructFields.Attributes.instanceID) + { + found = true; + break; + } + } + + if (!found) + { + result.requiredFields.Add(StructFields.Attributes.instanceID); + } + } + + passes.Add(result); + } + + ssd.passes = passes; + + return ssd; + } + + static void AddWorkflowModeControlToPass(ref PassDescriptor pass, BuiltInTarget target, WorkflowMode workflowMode) + { + if (target.allowMaterialOverride) + { + pass.keywords.Add(LitDefines.s_SpecularSetup); + } + else if (workflowMode == WorkflowMode.Specular) + { + pass.defines.Add(LitDefines.s_SpecularSetup, 1); + } + } + + static void AddReceivesShadowsControlToPass(ref PassDescriptor pass, BuiltInTarget target, bool receives) + { + if (target.allowMaterialOverride) + { + pass.keywords.Add(LitDefines.s_TransparentReceivesShadows); + pass.keywords.Add(LitDefines.s_ShadowsSingleCascade); + pass.keywords.Add(LitDefines.s_ShadowsSplitSpheres); + pass.keywords.Add(LitDefines.s_ShadowsSoft); + } + else if (receives) + { + pass.defines.Add(LitDefines.s_TransparentReceivesShadows, 1); + pass.keywords.Add(LitDefines.s_ShadowsSingleCascade); + pass.keywords.Add(LitDefines.s_ShadowsSplitSpheres); + pass.keywords.Add(LitDefines.s_ShadowsSoft); + } + } + } + + static class LitPasses + { + static readonly string s_ShaderPathMotionVectorCommon = $"{k_ShaderPath}/MotionVectorCommon.hlsl"; + static readonly string s_ShaderPathMotionVectorPass = $"{k_ShaderPath}/MotionVectorPass.hlsl"; + + public static RenderStateDescriptor UberSwitchedCullRenderState(BuiltInTarget target) + { + if (target.allowMaterialOverride) + { + return RenderState.Cull(CoreRenderStates.Uniforms.cullMode); + } + else + { + return RenderState.Cull(CoreRenderStates.RenderFaceToCull(target.renderFace)); + } + } + + public static PassDescriptor MotionVectors(BuiltInTarget target) + { + var result = new PassDescriptor() + { + // Definition + displayName = "BuiltIn MotionVectors", + referenceName = "SHADERPASS_MOTION_VECTORS", + lightMode = "MotionVectors", + useInPreview = false, + + // Template + passTemplatePath = BuiltInTarget.kTemplatePath, + sharedTemplateDirectories = BuiltInTarget.kSharedTemplateDirectories.Union + ( + new string[] + { + k_TemplatePath, + "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph" + } + ).ToArray(), + + // Port Mask + validVertexBlocks = new BlockFieldDescriptor[] + { + BlockFields.VertexDescription.Position, + }, + validPixelBlocks = CoreBlockMasks.FragmentAlphaOnly, + + // Fields + structs = CoreStructCollections.Default, + requiredFields = new() + { + // Needed for XR, but not sure if correct. + StructFields.Attributes.instanceID, + }, + fieldDependencies = CoreFieldDependencies.Default, + + // Conditional State + renderStates = new() + { + { RenderState.ZTest(ZTest.LEqual) }, + { RenderState.ZWrite(ZWrite.On) }, + { UberSwitchedCullRenderState(target) }, + // MVs write to the depth buffer causing z-fighting. Luckily, the depth texture has + // already been updated, and will not be updated before water renders. + { RenderState.ColorMask("ColorMask RG\nOffset 1, 1") }, + }, + + pragmas = new() + { + { Pragma.Target(ShaderModel.Target35) }, // NOTE: SM 2.0 only GL + { Pragma.MultiCompileInstancing }, + { Pragma.Vertex("vert") }, + { Pragma.Fragment("frag") }, + }, + + defines = new() { CoreDefines.BuiltInTargetAPI }, + keywords = new(), + includes = new() + { + // Pre-graph + { CoreIncludes.CorePregraph }, + { CoreIncludes.ShaderGraphPregraph }, + + // Post-graph + { s_ShaderPathMotionVectorCommon, IncludeLocation.Postgraph }, + { CoreIncludes.CorePostgraph }, + { s_ShaderPathMotionVectorPass, IncludeLocation.Postgraph }, + }, + + // Custom Interpolator Support + customInterpolators = CoreCustomInterpDescriptors.Common, + }; + + // Only support time for now. + result.defines.Add(LitDefines.s_AutomaticTimeBasedMotionVectors, 1); + + CorePasses.AddAlphaClipControlToPass(ref result, target); + return result; + } + } + + internal static class LitDefines + { + public static readonly KeywordDescriptor s_AutomaticTimeBasedMotionVectors = new() + { + displayName = "Automatic Time-Based Motion Vectors", + referenceName = "AUTOMATIC_TIME_BASED_MOTION_VECTORS", + type = KeywordType.Boolean, + definition = KeywordDefinition.Predefined, + scope = KeywordScope.Local, + stages = KeywordShaderStage.Vertex, + }; + + public static readonly KeywordDescriptor s_SpecularSetup = new() + { + displayName = "Specular Setup", + referenceName = "_BUILTIN_SPECULAR_SETUP", + type = KeywordType.Boolean, + definition = KeywordDefinition.ShaderFeature, + scope = KeywordScope.Local, + stages = KeywordShaderStage.Fragment + }; + + public static readonly KeywordDescriptor s_TransparentReceivesShadows = new() + { + displayName = "Transparent Receives Shadows", + referenceName = "_BUILTIN_TRANSPARENT_RECEIVES_SHADOWS", + type = KeywordType.Boolean, + definition = KeywordDefinition.ShaderFeature, + scope = KeywordScope.Local, + stages = KeywordShaderStage.Fragment + }; + + public static readonly KeywordDescriptor s_ShadowsSingleCascade = new() + { + displayName = "Single Cascade Shadows", + referenceName = "SHADOWS_SINGLE_CASCADE", + type = KeywordType.Boolean, + definition = KeywordDefinition.MultiCompile, + scope = KeywordScope.Global, + stages = KeywordShaderStage.All, + }; + + public static readonly KeywordDescriptor s_ShadowsSoft = new() + { + displayName = "Soft Shadows", + referenceName = "SHADOWS_SOFT", + type = KeywordType.Boolean, + definition = KeywordDefinition.MultiCompile, + scope = KeywordScope.Global, + stages = KeywordShaderStage.All, + }; + + public static readonly KeywordDescriptor s_ShadowsSplitSpheres = new() + { + displayName = "Stable Fit Shadows", + referenceName = "SHADOWS_SPLIT_SPHERES", + type = KeywordType.Boolean, + definition = KeywordDefinition.MultiCompile, + scope = KeywordScope.Global, + stages = KeywordShaderStage.All, + }; + } + } +} diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs.meta b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs.meta new file mode 100644 index 000000000..1ef0bb2d8 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/ShaderGraphLegacySubTarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4c99fd6915934b21a43efb6ca9915f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/TexturePreview.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/TexturePreview.cs index 0c425d3ad..4abbc215f 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/TexturePreview.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/TexturePreview.cs @@ -10,7 +10,8 @@ namespace WaveHarmonic.Crest.Editor { abstract class TexturePreview : ObjectPreview { - public static bool AnyActivePreviews { get; private set; } + public static TexturePreview s_ActiveInstance; + public bool Open { get; private set; } UnityEditor.Editor _Editor; RenderTexture _RenderTexture; @@ -34,7 +35,11 @@ namespace WaveHarmonic.Crest.Editor public override bool HasPreviewGUI() { - AnyActivePreviews = false; + if (Event.current != null && Event.current.type == EventType.Layout) + { + Open = false; + } + return OriginalTexture; } @@ -61,7 +66,8 @@ namespace WaveHarmonic.Crest.Editor public override void OnPreviewGUI(Rect rect, GUIStyle background) { - AnyActivePreviews = true; + s_ActiveInstance = this; + Open = true; // This check is in original. if (Event.current.type == EventType.Repaint) @@ -69,6 +75,18 @@ namespace WaveHarmonic.Crest.Editor background.Draw(rect, false, false, false, false); } + if (Texture is Cubemap) + { + if (_Editor == null || _Editor.target != Texture) + { + Object.DestroyImmediate(_Editor); + _Editor = UnityEditor.Editor.CreateEditor(Texture); + } + + _Editor.DrawPreview(rect); + return; + } + var descriptor = Texture.GetDescriptor(); if (Helpers.RenderTextureNeedsUpdating(descriptor, _OriginalDescriptor)) @@ -111,6 +129,11 @@ namespace WaveHarmonic.Crest.Editor { OnPreviewGUI(rect, background); + if (Texture is Cubemap) + { + return; + } + // Show pixel value in preview. _Slice = Development.Utility.GetPreviewSlice(_Editor, Texture); var color = Development.Utility.InspectPixel(rect, OriginalTexture, Flipped, _Slice); diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Validation.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Validation.cs index 7d3c1c95b..3220fa210 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Validation.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Utility/Shared/Validation.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // How to use: @@ -79,7 +79,7 @@ namespace WaveHarmonic.Crest.Editor s_Messages[(int)type].Add(new() { _Message = message, _FixDescription = fixDescription, _Object = @object, _Action = action, _PropertyPath = property }); } - public static void Suppressed(string message, string fixDescription, MessageType type, Object @object = null, FixValidation action = null, string property = null) + public static void Suppressed(string _0, string _1, MessageType _2, Object _3 = null, FixValidation _4 = null, string _5 = null) { } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/Validators.cs b/Packages/com.waveharmonic.crest/Editor/Scripts/Validators.cs index ed45d2deb..c16869d59 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/Validators.cs +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/Validators.cs @@ -6,6 +6,7 @@ using System.Reflection; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; using UnityEngine.Rendering.Universal; using WaveHarmonic.Crest.Internal; using WaveHarmonic.Crest.Watercraft; @@ -17,7 +18,11 @@ namespace WaveHarmonic.Crest.Editor { static class Validators { + // HDRP sub-shader always first. + const int k_SubShaderIndexHDRP = 0; internal static WaterRenderer Water => Utility.Water; + static readonly System.Collections.Generic.List s_Terrains = new(); + static readonly ShaderTagId s_RenderPipelineShaderTagID = new("RenderPipeline"); [Validator(typeof(LodInput))] static bool ValidateTextureInput(LodInput target, ShowMessage messenger) @@ -94,6 +99,7 @@ namespace WaveHarmonic.Crest.Editor { var material = materials[i]; if (material == null) continue; + if (material.shader == null) continue; if (data._OverrideShaderPass && data._ShaderPassIndex > material.shader.passCount - 1) { @@ -119,6 +125,22 @@ namespace WaveHarmonic.Crest.Editor ); } } + +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + if (AssetDatabase.GetAssetPath(material.shader).EndsWith(".shadergraph") && material.shader.FindSubshaderTagValue(k_SubShaderIndexHDRP, s_RenderPipelineShaderTagID).name == "HDRenderPipeline") + { + messenger + ( + "It appears you are using Shader Graph with the HDRP target. " + + "Make sure to use the Built-In target instead for your Shader Graph to work.", + "Remove the HDRP target and add the Built-In target.", + MessageType.Warning, material.shader + ); + } + } +#endif } return isValid; @@ -126,18 +148,18 @@ namespace WaveHarmonic.Crest.Editor static bool ValidateRendererLayer(GameObject gameObject, ShowMessage messenger, WaterRenderer water) { - if (water != null && gameObject.layer != water.Layer) + if (water != null && gameObject.layer != water.Surface.Layer) { - var layerName = LayerMask.LayerToName(water.Layer); + var layerName = LayerMask.LayerToName(water.Surface.Layer); messenger ( - $"The layer is not the same as the {nameof(WaterRenderer)}.{nameof(WaterRenderer.Layer)} ({layerName}) which can cause problems if the {layerName} layer is excluded from any culling masks.", + $"The layer is not the same as the {nameof(WaterRenderer)}.{nameof(WaterRenderer.Surface)}.{nameof(SurfaceRenderer.Layer)} ({layerName}) which can cause problems if the {layerName} layer is excluded from any culling masks.", $"Set layer to {layerName}.", MessageType.Warning, gameObject, (_, _) => { Undo.RecordObject(gameObject, $"Change Layer to {layerName}"); - gameObject.layer = water.Layer; + gameObject.layer = water.Surface.Layer; } ); } @@ -155,7 +177,7 @@ namespace WaveHarmonic.Crest.Editor return isValid; } - var material = water.Material; + var material = water.Surface.Material; if (material != null) { @@ -231,9 +253,38 @@ namespace WaveHarmonic.Crest.Editor return isValid; } - if (water != null && water.Material != null) +#if !d_Crest_LegacyUnderwater + if (target.AllCameras) { - var material = water.Material; + messenger + ( + "All Cameras requires Legacy Underwater to be enabled.", + "Either disable All Cameras or enable Project Settings > Crest > Legacy Underwater.", + MessageType.Warning, water + ); + } +#endif + + if (target.Material != null) + { + var material = target.Material; + + if (material.shader.name.StartsWithNoAlloc("Crest/") && material.shader.name != "Crest/Underwater") + { + messenger + ( + $"The material {material.name} assigned to Underwater has the wrong shader ({material.shader.name}).", + "Use a material with the correct shader (Crest/Underwater).", + MessageType.Error, water + ); + + isValid = false; + } + } + + if (water != null && water.Surface.Material != null) + { + var material = water.Surface.Material; var cullModeName = #if d_UnityURP @@ -290,6 +341,34 @@ namespace WaveHarmonic.Crest.Editor return isValid; } + static bool Validate(Meniscus target, ShowMessage messenger, WaterRenderer water) + { + var isValid = true; + + if (!target._Enabled) + { + return isValid; + } + + if (target._Material == null) + { + messenger + ( + "The meniscus material is missing. The meniscus will not render.", + "Add the default material or your own.", + MessageType.Warning, + water, + (so, sp) => + { + sp.objectReferenceValue = AssetDatabase.LoadAssetAtPath(Meniscus.k_MaterialPath); + }, + $"{nameof(WaterRenderer._Meniscus)}.{nameof(Meniscus._Material)}" + ); + } + + return isValid; + } + [Validator(typeof(WaterRenderer))] static bool Validate(WaterRenderer target, ShowMessage messenger) { @@ -299,6 +378,7 @@ namespace WaveHarmonic.Crest.Editor isValid = isValid && Validate(target._Underwater, messenger, target); isValid = isValid && Validate(target._Reflections, messenger, target); + isValid = isValid && Validate(target._Meniscus, messenger, target); isValid = isValid && ValidateNoRotation(target, target.transform, messenger); isValid = isValid && ValidateNoScale(target, target.transform, messenger); @@ -326,7 +406,7 @@ namespace WaveHarmonic.Crest.Editor isValid = false; } - if (target.Material == null) + if (target.Surface.Material == null) { messenger ( @@ -339,33 +419,33 @@ namespace WaveHarmonic.Crest.Editor } else { - isValid = ValidateWaterMaterial(target, messenger, water, target.Material) && isValid; + isValid = ValidateWaterMaterial(target, messenger, water, target.Surface.Material) && isValid; - if (RenderPipelineHelper.IsHighDefinition && target.Material.GetFloat("_RefractionModel") > 0) + if (RenderPipelineHelper.IsHighDefinition && target.Surface.Material.GetFloat("_RefractionModel") > 0) { messenger ( - $"Refraction Model is not None for {target.Material}. " + + $"Refraction Model is not None for {target.Surface.Material}. " + "This is set by default so it is available in the inspector, " + "but it incurs an overhead and will produce a dark edge at the edge of the viewport (see Screen Space Refraction > Screen Weight Distance). " + "Enabling the refraction model is only useful to allow volumetric clouds to render over the water surface when view from above. " + "The refraction model has no effect on refractions.", $"Set Refraction Model to None.", - MessageType.Info, target.Material + MessageType.Info, target.Surface.Material ); } - if (RenderPipelineHelper.IsHighDefinition && target.Material.HasFloat("_TransparentWritingMotionVec") && target.WriteMotionVectors != (target.Material.GetFloat("_TransparentWritingMotionVec") == 1f)) + if (RenderPipelineHelper.IsHighDefinition && target.Surface.Material.HasFloat("_TransparentWritingMotionVec") && target.WriteMotionVectors != (target.Surface.Material.GetFloat("_TransparentWritingMotionVec") == 1f)) { messenger ( - $"Water Renderer > Surface Renderer > Motion Vectors and Transparent Writes Motion Vectors on {target.Material} do not match. ", + $"Water Renderer > Surface Renderer > Motion Vectors and Transparent Writes Motion Vectors on {target.Surface.Material} do not match. ", $"Either disable or enable both Water Renderer > Surface Renderer > Motion Vectors and Transparent Writes Motion Vectors", - MessageType.Info, target.Material + MessageType.Info, target.Surface.Material ); } - ValidateMaterialParent(target._VolumeMaterial, target.Material, messenger); + ValidateMaterialParent(target.Surface.VolumeMaterial, target.Surface.Material, messenger); } if (Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None).Length > 1) @@ -403,13 +483,13 @@ namespace WaveHarmonic.Crest.Editor } // We need to find hidden probes too, but do not include assets. - if (Resources.FindObjectsOfTypeAll().Where(x => !EditorUtility.IsPersistent(x)).Count() > 0) + if (Resources.FindObjectsOfTypeAll().Count(x => !EditorUtility.IsPersistent(x)) > 0) { messenger ( "There are reflection probes in the scene. These can cause tiling to appear on the water surface if not set up correctly.", "For reflections probes that affect the water, they will either need to cover the visible water tiles or water tiles need to ignore reflection probes (can done done with Water Tile Prefab field). " + - $"For all reflection probles that include the {LayerMask.LayerToName(target.Layer)} layer, make sure they are above the water surface as underwater reflections are not supported.", + $"For all reflection probles that include the {LayerMask.LayerToName(target.Surface.Layer)} layer, make sure they are above the water surface as underwater reflections are not supported.", MessageType.Info, target ); } @@ -470,7 +550,7 @@ namespace WaveHarmonic.Crest.Editor } // For safety. - if (target != null && target.Material != null) + if (target != null && target.Surface.Material != null) { foreach (var simulation in target.Simulations) { @@ -488,7 +568,7 @@ namespace WaveHarmonic.Crest.Editor ); } - if (target.Viewer == null) + if (target.Viewer == null && !target.IsRunningWithoutGraphics) { messenger ( @@ -503,7 +583,10 @@ namespace WaveHarmonic.Crest.Editor #if d_UnityHDRP if (RenderPipelineHelper.IsHighDefinition) { - var hdAsset = GraphicsSettings.currentRenderPipeline as UnityEngine.Rendering.HighDefinition.HDRenderPipelineAsset; + var material = target.Surface.Material; + var camera = target._Camera != null ? target._Camera : Camera.main; + var hdCamera = camera != null ? HDCamera.GetOrCreate(camera) : null; + var hdAsset = GraphicsSettings.currentRenderPipeline as HDRenderPipelineAsset; var mvs = hdAsset.currentPlatformRenderPipelineSettings.supportMotionVectors; // Only check the RP asset for now. @@ -518,6 +601,50 @@ namespace WaveHarmonic.Crest.Editor MessageType.Info, target ); } + + if (!hdAsset.currentPlatformRenderPipelineSettings.supportCustomPass) + { + messenger + ( + "Custom passes are disabled. Underwater and other features require them to work.", + "Enabled them on the global asset.", + MessageType.Error, hdCamera.camera + ); + } + + if (target.RenderBeforeTransparency && WaterRenderer.s_CameraMSAA) + { + messenger + ( + $"The water injection point is before transparency and MSAA is enabled for a camera. This combination is not currently supported for HDRP.", + "Disable MSAA or change the water injection point.", + MessageType.Error, target + ); + } + + // Seems that logging is too early for these. And edit mode has false positives. + if (Application.isPlaying && messenger == ValidatedHelper.HelpBox) + { + if (hdCamera?.frameSettings.IsEnabled(FrameSettingsField.CustomPass) == false) + { + messenger + ( + $"Custom passes are disabled for the primary camera ({camera}). Underwater and other features require them to work.", + "Enable them in the camera frame settings on the camera or the default frame settings in the global settings.", + MessageType.Error, hdCamera.camera + ); + } + + if (hdCamera?.frameSettings.IsEnabled(FrameSettingsField.Refraction) == false && material != null && SurfaceRenderer.IsTransparent(material)) + { + messenger + ( + "Refraction is disabled. Transparency requires it to work.", + "Enable it in the camera frame settings on the camera, or the default frame settings in the global settings.", + MessageType.Error, hdCamera.camera + ); + } + } } #endif // d_UnityHDRP @@ -541,11 +668,11 @@ namespace WaveHarmonic.Crest.Editor } #endif // d_UnityURP - if (!RenderPipelineHelper.IsHighDefinition && target.Material != null) + if (!RenderPipelineHelper.IsHighDefinition && target.Surface.Material != null) { - if (!target.AllowRenderQueueSorting && !System.Enum.IsDefined(typeof(RenderQueue), target.Material.renderQueue)) + if (!target.Surface.AllowRenderQueueSorting && !System.Enum.IsDefined(typeof(RenderQueue), target.Surface.Material.renderQueue)) { - var field = nameof(WaterRenderer.AllowRenderQueueSorting).Pretty().Italic(); + var field = nameof(SurfaceRenderer.AllowRenderQueueSorting).Pretty().Italic(); messenger ( $"The render queue has a sub-sort applied, but {field} is not enabled. Sub-sorting will not work.", @@ -563,11 +690,13 @@ namespace WaveHarmonic.Crest.Editor { var isValid = true; + var water = Water; + if (Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None).Length == 0) { messenger ( - $"Water body {target.gameObject.name} requires an water renderer component to be present.", + $"Water body {target.gameObject.name} requires a {nameof(WaterRenderer)} component to be present.", $"Create a separate GameObject and add an {nameof(WaterRenderer)} component to it.", MessageType.Error, target ); @@ -595,6 +724,25 @@ namespace WaveHarmonic.Crest.Editor isValid = isValid && ValidateNoRotation(target, target.transform, messenger); + if (target.Clipped && water != null) + { + // Validate main material, then overriden material. + ValidateLod(OptionalLod.Get(typeof(ClipLod)), messenger, water); + ValidateLod(OptionalLod.Get(typeof(ClipLod)), messenger, water, material: target._Material); + + if (water.ClipLod.DefaultClippingState == DefaultClippingState.NothingClipped) + { + messenger + ( + $"The {nameof(ClipLod.DefaultClippingState)} on the {nameof(WaterRenderer)} is set to {DefaultClippingState.NothingClipped}. " + + $"The {nameof(WaterBody.Clipped)} option will have no effect.", + $"Disable {nameof(WaterBody.Clipped)} or set {nameof(ClipLod.DefaultClippingState)} to {DefaultClippingState.NothingClipped}.", + MessageType.Warning, + water + ); + } + } + return isValid; } @@ -602,7 +750,7 @@ namespace WaveHarmonic.Crest.Editor /// /// Does validation for a feature on the water component and on the material /// - internal static bool ValidateLod(OptionalLod target, ShowMessage messenger, WaterRenderer water, string dependent = null) + internal static bool ValidateLod(OptionalLod target, ShowMessage messenger, WaterRenderer water, string dependent = null, Material material = null, Object context = null) { var isValid = true; @@ -620,7 +768,7 @@ namespace WaveHarmonic.Crest.Editor dependentClause = $", as {dependent} needs it."; } - if (!simulation._Enabled) + if (!simulation._Enabled && material == null) { messenger ( @@ -645,7 +793,10 @@ namespace WaveHarmonic.Crest.Editor isValid = false; } - var material = water.Material; + if (material == null) + { + material = water.Surface.Material; + } if (target.HasMaterialToggle && material != null) { @@ -709,7 +860,7 @@ namespace WaveHarmonic.Crest.Editor } // These checks are not necessary for our material but there may be custom materials. - if (!water.Material.HasProperty(target.MaterialProperty)) + if (!water.Surface.Material.HasProperty(target.MaterialProperty)) { return true; } @@ -717,14 +868,14 @@ namespace WaveHarmonic.Crest.Editor var feature = target.GetLod(water); // There is only a problem if there is a mismatch. - if (feature.Enabled == (water.Material.GetFloat(target.MaterialProperty) == 1f)) + if (feature._Enabled == (water.Surface.Material.GetFloat(target.MaterialProperty) == 1f)) { return true; } - if (feature.Enabled) + if (feature._Enabled) { - ShowMaterialValidationMessage(target, water.Material, messenger); + ShowMaterialValidationMessage(target, water.Surface.Material, messenger); } else if (messenger != DebugLog) { @@ -756,7 +907,7 @@ namespace WaveHarmonic.Crest.Editor ); } - if (target.Blend == LodInputBlend.AlphaClip && target.Mode is not LodInputMode.Texture or LodInputMode.Paint) + if (target.Blend == LodInputBlend.AlphaClip && target.Mode is not (LodInputMode.Texture or LodInputMode.Paint)) { messenger ( @@ -999,19 +1150,20 @@ namespace WaveHarmonic.Crest.Editor { var isValid = true; - var camera = target._Camera; - if (camera != null && camera.targetTexture != null && target.RealtimeTexture != null) + messenger + ( + "If you see an error RenderTexture color format cannot be set to a depth/stencil format or RenderTexture.Create failed, this is likely a bug with Unity (grab pass) or third-party, as they may be registered to execute a custom pass to the DepthProbe camera.", "", MessageType.Info, target + ); + + if (target.Outdated && (messenger != DebugLog || WaterRendererEditor.ManualValidation)) { - if (target.Outdated) - { - messenger - ( - "Depth Probe is outdated.", - "Click Populate or re-bake the probe to bring the probe up-to-date with component changes.", - MessageType.Warning, target, - (_, _) => target.Populate() - ); - } + messenger + ( + "Depth Probe is outdated.", + "Click Populate or re-bake the probe to bring the probe up-to-date with component changes.", + MessageType.Warning, target, + (_, _) => target.Populate() + ); } if (target.Type == DepthProbeMode.Baked) @@ -1042,12 +1194,34 @@ namespace WaveHarmonic.Crest.Editor messenger ( "No layers specified for rendering into depth probe.", - "Specify one or may layers using the Layers field.", + "Specify one or many layers using the Layers field.", MessageType.Error, target ); isValid = false; } +#if d_Unity_Terrain + else + { + Terrain.GetActiveTerrains(s_Terrains); + foreach (var terrain in s_Terrains) + { + if (Helpers.MaskIncludesLayer(target.Layers, terrain.gameObject.layer)) + { + continue; + } + + messenger + ( + $"There are terrains on a layer that is not in {nameof(DepthProbe)}.{nameof(DepthProbe.Layers)}.", + "This is typically mistake leading to no data (ie no shorelines). Please ignore if intentional.", + MessageType.Info, target + ); + + break; + } + } +#endif // d_Unity_Terrain if (target._Debug._ForceAlwaysUpdateDebug) { @@ -1196,6 +1370,19 @@ namespace WaveHarmonic.Crest.Editor { isValid = isValid && ValidateSignedDistanceFieldsLod(messenger, water, "Generate Signed Distance Field"); } + + if (water.DepthLod.IncludeTerrainHeight && Object.FindAnyObjectByType(FindObjectsInactive.Include) != null) + { + messenger + ( + "The Water Depth data is configured to automatically include terrain height via Include Terrain Height. " + + "Using a DepthProbe is still valid to capture non-terrain details like rocks. " + + "But typically, if you are using a DepthProbe, it is best to capture the terrain too, as it is more accurate. " + + "One reason to use a DepthProbe together with the auto capture is for better real-time/on-demand depth capture performance.", + string.Empty, + MessageType.Info, water + ); + } } diff --git a/Packages/com.waveharmonic.crest/Editor/Scripts/WaveHarmonic.Crest.Editor.asmdef b/Packages/com.waveharmonic.crest/Editor/Scripts/WaveHarmonic.Crest.Editor.asmdef index 86b226451..ed39db94f 100644 --- a/Packages/com.waveharmonic.crest/Editor/Scripts/WaveHarmonic.Crest.Editor.asmdef +++ b/Packages/com.waveharmonic.crest/Editor/Scripts/WaveHarmonic.Crest.Editor.asmdef @@ -31,6 +31,11 @@ "expression": "", "define": "d_ModuleUnityDirector" }, + { + "name": "com.unity.modules.terrain", + "expression": "", + "define": "d_Unity_Terrain" + }, { "name": "com.unity.postprocessing", "expression": "", diff --git a/Packages/com.waveharmonic.crest/Editor/Shaders/Templates.meta b/Packages/com.waveharmonic.crest/Editor/Shaders/Templates.meta new file mode 100644 index 000000000..c1dcc114c --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Shaders/Templates.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d8df6c721738dc4e9406af4d13e5e63 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl b/Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl new file mode 100644 index 000000000..0a9d7cdcc --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl @@ -0,0 +1,6 @@ +// Shader Graph Complete +// Copyright © 2025 Wave Harmonic. All rights reserved. + +$include("Templates/SharedCode.template.hlsl") + +$VertexDescriptionInputs.TimeParameters: #define GRAPH_VERTEX_USES_TIME_PARAMETERS_INPUT diff --git a/Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl.meta b/Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl.meta new file mode 100644 index 000000000..0dc2682ba --- /dev/null +++ b/Packages/com.waveharmonic.crest/Editor/Shaders/Templates/SharedCode.template.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ee5a966d356084782a3e3e78ec78b8e3 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Editor/Shaders/VisualizeNegativeValues.compute b/Packages/com.waveharmonic.crest/Editor/Shaders/VisualizeNegativeValues.compute index 9f23f4a92..1c7ca254a 100644 --- a/Packages/com.waveharmonic.crest/Editor/Shaders/VisualizeNegativeValues.compute +++ b/Packages/com.waveharmonic.crest/Editor/Shaders/VisualizeNegativeValues.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #pragma kernel CrestVisualizeNegativeValues_Scalar diff --git a/Packages/com.waveharmonic.crest/Editor/Shaders/WaterLevel.shader b/Packages/com.waveharmonic.crest/Editor/Shaders/WaterLevel.shader index dcf0708b1..388051dfb 100644 --- a/Packages/com.waveharmonic.crest/Editor/Shaders/WaterLevel.shader +++ b/Packages/com.waveharmonic.crest/Editor/Shaders/WaterLevel.shader @@ -62,10 +62,7 @@ Shader "Hidden/Crest/Editor/Water Level (Depth)" #pragma vertex Vertex #pragma fragment Fragment - #include "UnityCG.cginc" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" #include "Packages/com.waveharmonic.crest/Editor/Shaders/WaterLevel.hlsl" ENDHLSL diff --git a/Packages/com.waveharmonic.crest/Editor/Shaders/WaterProxy.shader b/Packages/com.waveharmonic.crest/Editor/Shaders/WaterProxy.shader index ffa242f57..13fd1aad9 100644 --- a/Packages/com.waveharmonic.crest/Editor/Shaders/WaterProxy.shader +++ b/Packages/com.waveharmonic.crest/Editor/Shaders/WaterProxy.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. Shader "Hidden/Crest/Editor/WaterProxy" @@ -8,6 +8,7 @@ Shader "Hidden/Crest/Editor/WaterProxy" Tags { "RenderType"="Transparent" "Queue"="Transparent"} Blend SrcAlpha OneMinusSrcAlpha ZWrite Off + Cull Off Pass { diff --git a/Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset b/Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset new file mode 100644 index 000000000..9503d9c34 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset @@ -0,0 +1,67 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 382a5d8b1147b4e78a31353c022b8e15, type: 3} + m_Name: WavesSwell + m_EditorClassIdentifier: + _Version: 0 + _WaveDirectionVariance: 90 + _GravityScale: 1 + _Multiplier: 1 + _PowerLogarithmicScales: + - -7.10794 + - -6.42794 + - -5.93794 + - -5.27794 + - -4.67794 + - -3.71794 + - -3.17794 + - -2.60794 + - -1.93794 + - -1.11794 + - -0.85794 + - -0.36794 + - 0.04206 + - -8 + _PowerDisabled: 0101010101010101000000000000 + _ChopScales: + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + _GravityScales: + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + _Chop: 1.6 + _ShowAdvancedControls: 0 + _Model: 0 diff --git a/Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset.meta b/Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset.meta new file mode 100644 index 000000000..2e59737a1 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Data/WaveSpectra/WavesSwell.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: efa03f442951949c7bbfadb22765f653 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat b/Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat new file mode 100644 index 000000000..da2e532e3 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Meniscus + m_Shader: {fileID: 4800000, guid: ec7c774912c6f4b3cb6d73444cdedeca, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - d_Crest_Lighting + - d_Crest_Refraction + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: + - _Crest_LightingEnabled: 1 + - _Crest_RefractionEnabled: 1 + m_Floats: + - _Crest_Radius: 0.01 + - _Crest_RefractionStrength: 0.2 + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat.meta b/Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat.meta new file mode 100644 index 000000000..df80d51d2 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 238e45299a5ec46308e9bf99ddf67963 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat b/Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat new file mode 100644 index 000000000..d3ba6b877 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat @@ -0,0 +1,92 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-3046556431833965186 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 639247ca83abc874e893eb93af2b5e44, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 0 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Water (Flow) + m_Shader: {fileID: -6465566751694194690, guid: 00ffe7d0b7161420897069dc6e12822c, type: 3} + m_Parent: {fileID: 2100000, guid: 8ab064b6606504a55b489af2787350c2, type: 2} + m_ModifiedSerializedProperties: 26 + m_ValidKeywords: + - CREST_FLOW_ON + - _ALPHATEST_ON + - _BUILTIN_ALPHATEST_ON + - _BUILTIN_AlphaClip + - _BUILTIN_SURFACE_TYPE_TRANSPARENT + - _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS + - _DOUBLESIDED_ON + - _ENABLE_FOG_ON_TRANSPARENT + - _SURFACE_TYPE_TRANSPARENT + - _TRANSPARENT_WRITES_MOTION_VEC + m_InvalidKeywords: + - _EMISSION + m_LightmapFlags: 2 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 1 + m_CustomRenderQueue: 3000 + stringTagMap: + MotionVector: User + RenderType: Transparent + disabledShaderPasses: + - TransparentDepthPostpass + - TransparentBackface + - RayTracingPrepass + - MOTIONVECTORS + - SHADOWCASTER + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: [] + m_Floats: + - CREST_FLOW: 1 + - _SrcBlend: 5 + m_Colors: [] + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &84831097882938775 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: da692e001514ec24dbc4cca1949ff7e8, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 13 + hdPluginSubTargetMaterialVersions: + m_Keys: [] + m_Values: +--- !u!114 &8072045821928201339 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 10 diff --git a/Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat.meta b/Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat.meta new file mode 100644 index 000000000..976aa5c0c --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Materials/Water (Flow).mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4b26ad6c6869b4091881e76c99363dac +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat b/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat index 81df789dc..6783ed774 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat +++ b/Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat @@ -12,16 +12,16 @@ Material: m_Parent: {fileID: 0} m_ModifiedSerializedProperties: 0 m_ValidKeywords: + - d_Crest_NoMaskDepth - d_Dithering - - d_Meniscus m_InvalidKeywords: - _ALPHATEST_ON - _BUILTIN_ALPHATEST_ON - _BUILTIN_AlphaClip - _BUILTIN_SURFACE_TYPE_TRANSPARENT + - _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS - _DOUBLESIDED_ON - _ENABLE_FOG_ON_TRANSPARENT - - _SPECULAR_SETUP - _SURFACE_TYPE_TRANSPARENT - _TRANSPARENT_WRITES_MOTION_VEC m_LightmapFlags: 4 @@ -45,7 +45,6 @@ Material: m_Ints: - _Crest_DataSliceOffset: 13 - _Crest_DitheringEnabled: 1 - - _Crest_MeniscusEnabled: 1 - _Crest_Version: 0 m_Floats: - CREST_FLOW: 0 @@ -69,7 +68,7 @@ Material: - _Crest_ShadowsAffectsAmbientFactor: 0.5 - _Crest_SunBoost: 2 m_Colors: - - _Crest_AbsorptionColor: {r: 0.34162676, g: 0.6954546, b: 0.85, a: 0.1019608} - - _Crest_Scattering: {r: 0, g: 0.09803919, b: 0.19999996, a: 1} + - _Crest_AbsorptionColor: {r: 0.46502313, g: 0.4716981, b: 0.4662141, a: 0.1019608} + - _Crest_Scattering: {r: 0.11320752, g: 0.11320752, b: 0.11320752, a: 1} m_BuildTextureStacks: [] m_AllowLocking: 1 diff --git a/Packages/com.waveharmonic.crest/Runtime/Materials/Water.mat b/Packages/com.waveharmonic.crest/Runtime/Materials/Water.mat index 6ab1506d8..b27826ec3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Materials/Water.mat +++ b/Packages/com.waveharmonic.crest/Runtime/Materials/Water.mat @@ -45,9 +45,9 @@ Material: - _BUILTIN_ALPHATEST_ON - _BUILTIN_AlphaClip - _BUILTIN_SURFACE_TYPE_TRANSPARENT + - _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS - _DOUBLESIDED_ON - _ENABLE_FOG_ON_TRANSPARENT - - _SPECULAR_SETUP - _SURFACE_TYPE_TRANSPARENT - _TRANSPARENT_WRITES_MOTION_VEC m_InvalidKeywords: [] @@ -70,29 +70,20 @@ Material: m_TexEnvs: [] m_Ints: [] m_Floats: - - CREST_FLOW: 0 - - _AlphaClip: 1 - _AlphaDstBlend: 10 - _BUILTIN_DstBlend: 10 - _BUILTIN_QueueControl: 0 - _BUILTIN_SrcBlend: 5 - _BUILTIN_ZWrite: 1 - - _Crest_AlbedoEnabled: 0 - - _Crest_CausticsEnabled: 1 - - _Crest_FoamEnabled: 1 - - _Crest_NormalMapEnabled: 1 + - _Crest_FoamEnabled: 0 - _Crest_PlanarReflectionsEnabled: 1 - - _Crest_RefractionStrength: 1 - _Crest_SSSEnabled: 0 - - _Crest_ShadowsEnabled: 1 - _CullMode: 0 - _CullModeForward: 0 - _DstBlend: 10 - _QueueControl: 0 - - _ReceiveShadows: 1 - _RefractionModel: 0 - _SrcBlend: 5 - - _WorkflowMode: 0 - _ZTestGBuffer: 3 m_Colors: - _DoubleSidedConstants: {r: 1, g: 1, b: 1, a: 0} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Constants.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Constants.cs index 479a118e3..c32e32fdc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Constants.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Constants.cs @@ -1,6 +1,8 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. +// 9160b2d47f1cb3d7559ed4fafa79e52b9448ef2a6d863948fe3c4eeddcd958da + namespace WaveHarmonic.Crest { static class Constants diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AbsorptionLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AbsorptionLod.cs index 51690a7ee..3721fa329 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AbsorptionLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AbsorptionLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -32,10 +32,11 @@ namespace WaveHarmonic.Crest get { var color = Color.clear; + var surface = _Water.Surface; - if (_Water.Material != null) + if (surface.Material != null && surface.Material.HasVector(WaterRenderer.ShaderIDs.s_Absorption)) { - color = _Water.Material.GetVector(WaterRenderer.ShaderIDs.s_Absorption); + color = surface.Material.GetVector(WaterRenderer.ShaderIDs.s_Absorption); color.a = 0f; } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AlbedoLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AlbedoLod.cs index 65fcbee1a..a6510b944 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AlbedoLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AlbedoLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AnimatedWavesLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AnimatedWavesLod.cs index 49b9c082c..d93462789 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AnimatedWavesLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/AnimatedWavesLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -20,55 +20,39 @@ namespace WaveHarmonic.Crest /// /// The source of collisions (ie water shape). /// + [@GenerateDoc] public enum CollisionSource { - /// - /// No collision source. Flat water. - /// + /// + [Tooltip("No collision source. Flat water.")] None = 0, // GerstnerWavesCPU = 1, - /// - /// Uses AsyncGPUReadback to retrieve data from GPU to CPU. - /// - /// - /// This is the most optimal approach. - /// + /// + [Tooltip("Uses AsyncGPUReadback to retrieve data from GPU to CPU.\n\nThis is the most optimal approach.")] GPU = 2, - /// - /// Computes data entirely on the CPU. - /// + /// + [Tooltip("Computes data entirely on the CPU.")] CPU = 3, } /// /// The pass to render displacement into. /// + [@GenerateDoc] public enum DisplacementPass { - /// - /// Displacement that is dependent on an LOD (eg waves). - /// - /// - /// Uses filtering to determine which LOD to write to. - /// + /// [Tooltip("Displacement that is dependent on an LOD (eg waves).\n\nUses filtering to determine which LOD to write to.")] LodDependent, - /// - /// Renders to all LODs. - /// + /// [Tooltip("Renders to all LODs.")] LodIndependent, - /// - /// Renders to all LODs, but as a separate pass. - /// - /// - /// Typically used to render visual displacement which does not affect collisions. - /// + /// [Tooltip("Renders to all LODs, but as a separate pass.\n\nTypically used to render visual displacement which does not affect collisions.")] [InspectorName("Lod Independent (Last)")] LodIndependentLast, @@ -78,35 +62,24 @@ namespace WaveHarmonic.Crest /// Flags to enable extra collsion layers. /// [System.Flags] + [@GenerateDoc] public enum CollisionLayers { // NOTE: numbers must be in order for defaults to work (everything first). - /// - /// All layers. - /// + /// [Tooltip("All layers.")] Everything = -1, - /// - /// No extra layers (ie single layer). - /// + /// [Tooltip("No extra layers (ie single layer).")] Nothing, - /// - /// Separate layer for dynamic waves. - /// - /// - /// Dynamic waves are normally combined together for efficiency. By enabling this - /// layer, dynamic waves are combined and added in a separate pass. - /// + /// [Tooltip("Separate layer for dynamic waves.\n\nDynamic waves are normally combined together for efficiency. By enabling this layer, dynamic waves are combined and added in a separate pass.")] DynamicWaves = 1 << 1, - /// - /// Extra displacement layer for visual displacement. - /// + /// [Tooltip("Extra displacement layer for visual displacement.")] Displacement = 1 << 2, } @@ -180,6 +153,9 @@ namespace WaveHarmonic.Crest internal BakedWaveData _BakedWaveData; + const string k_DrawCombine = "Combine"; + + internal static new partial class ShaderIDs { public static readonly int s_WaveBuffer = Shader.PropertyToID("_Crest_WaveBuffer"); @@ -201,7 +177,6 @@ namespace WaveHarmonic.Crest private protected override bool NeedToReadWriteTextureData => true; private protected override Color ClearColor => Color.black; internal override int BufferCount => _Water.WriteMotionVectors ? 2 : 1; - internal override bool RunsInHeadless => true; // NOTE: Tried RGB111110Float but errors becomes visible. One option would be to use a UNORM setup. private protected override GraphicsFormat RequestedTextureFormat => _TextureFormatMode switch @@ -259,7 +234,7 @@ namespace WaveHarmonic.Crest internal override void BuildCommandBuffer(WaterRenderer water, CommandBuffer buffer) { - buffer.BeginSample(Name); + buffer.BeginSample(ID); FlipBuffers(); @@ -267,8 +242,7 @@ namespace WaveHarmonic.Crest // Get temporary buffer to store waves. They will be copied in the combine pass. buffer.GetTemporaryRT(ShaderIDs.s_WaveBuffer, DataTexture.descriptor); - buffer.SetRenderTarget(ShaderIDs.s_WaveBuffer, 0, CubemapFace.Unknown, -1); - buffer.ClearRenderTarget(false, true, ClearColor); + CoreUtils.SetRenderTarget(buffer, ShaderIDs.s_WaveBuffer, ClearFlag.Color, ClearColor); // LOD dependent data. // Write to per-octave _WaveBuffers. Not the same as _AnimatedWaves. @@ -304,7 +278,7 @@ namespace WaveHarmonic.Crest } } - buffer.BeginSample("Combine"); + buffer.BeginSample(k_DrawCombine); // Combine waves. for (var slice = lastSlice; slice >= 0; slice--) @@ -327,7 +301,7 @@ namespace WaveHarmonic.Crest wrapper.Dispatch(threadSize, threadSize, 1); } - buffer.EndSample("Combine"); + buffer.EndSample(k_DrawCombine); } buffer.ReleaseTemporaryRT(ShaderIDs.s_WaveBuffer); @@ -372,16 +346,22 @@ namespace WaveHarmonic.Crest // Query collisions including only Animated Waves. // Requires copying the water level. - Provider.UpdateQueries(_Water, CollisionLayer.AfterAnimatedWaves); + // Guard not required, as Query already does this check before returning the + // correct provider, thus nothing would be reqistered nor dispatched. But seems + // right to do so anyhow. + if (_CollisionLayers != CollisionLayers.Nothing) + { + Provider.UpdateQueries(_Water, CollisionLayer.AfterAnimatedWaves); + } // Transfer Dynamic Waves to Animated Waves. if (_CollisionLayers.HasFlag(CollisionLayers.DynamicWaves) && _Water._DynamicWavesLod.Enabled) { - buffer.BeginSample("Combine"); + buffer.BeginSample(k_DrawCombine); // Clearing not required as we overwrite enter texture. buffer.GetTemporaryRT(ShaderIDs.s_DynamicWavesTarget, DataTexture.descriptor); - var wrapper = new PropertyWrapperCompute(buffer, _CombineShader, 8); + var wrapper = new PropertyWrapperCompute(buffer, _CombineShader, 9); wrapper.SetTexture(ShaderIDs.s_DynamicWavesTarget, ShaderIDs.s_DynamicWavesTarget); @@ -392,22 +372,28 @@ namespace WaveHarmonic.Crest { wrapper.SetInteger(Lod.ShaderIDs.s_LodIndex, slice); wrapper.Dispatch(threadSize, threadSize, 1); + + // Change to kernel with combine enabled. + if (slice == lastSlice) + { + wrapper = new(buffer, _CombineShader, 8); + } } // Copy Dynamic Waves displacement into Animated Waves. { - wrapper = new PropertyWrapperCompute(buffer, _CombineShader, 9); + wrapper = new(buffer, _CombineShader, 10); wrapper.SetTexture(ShaderIDs.s_AnimatedWavesTarget, DataTexture); wrapper.SetTexture(ShaderIDs.s_DynamicWavesTarget, ShaderIDs.s_DynamicWavesTarget); wrapper.Dispatch(threadSize, threadSize, Slices); } buffer.ReleaseTemporaryRT(ShaderIDs.s_DynamicWavesTarget); - buffer.EndSample("Combine"); + buffer.EndSample(k_DrawCombine); // Query collisions including Dynamic Waves. // Does not require copying the water level as they are added with zero alpha. - _Water.CollisionProvider.UpdateQueries(_Water, CollisionLayer.AfterDynamicWaves); + Provider.UpdateQueries(_Water, CollisionLayer.AfterDynamicWaves); } if (_CollisionLayers.HasFlag(CollisionLayers.Displacement)) @@ -429,7 +415,12 @@ namespace WaveHarmonic.Crest Shader.SetGlobalTexture(_TextureShaderID, DataTexture); } - buffer.EndSample(Name); + buffer.EndSample(ID); + } + + internal override void AfterExecute() + { + Provider.SendReadBack(_Water, _CollisionLayers); } /// diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ClipLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ClipLod.cs index 1b1ebcb53..45babc546 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ClipLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ClipLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -11,16 +11,15 @@ namespace WaveHarmonic.Crest /// /// The default state for clipping. /// + [@GenerateDoc] public enum DefaultClippingState { - /// - /// By default, nothing is clipped. Use clip inputs to remove water. - /// + /// + [Tooltip("By default, nothing is clipped. Use clip inputs to remove water.")] NothingClipped, - /// - /// By default, everything is clipped. Use clip inputs to add water. - /// + /// + [Tooltip("By default, everything is clipped. Use clip inputs to add water.")] EverythingClipped, } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ColorLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ColorLod.cs index 399df336c..1d0a965cb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ColorLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ColorLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -10,21 +10,19 @@ namespace WaveHarmonic.Crest /// /// The source of depth color. /// + [@GenerateDoc] public enum ShorelineVolumeColorSource { - /// - /// No depth color. - /// + /// + [Tooltip("No depth color.")] None, - /// - /// Depth color based on water depth. - /// + /// + [Tooltip("Depth color based on water depth.")] Depth, - /// - /// Depth color based on shoreline distance. - /// + /// + [Tooltip("Depth color based on shoreline distance.")] Distance, } @@ -32,6 +30,7 @@ namespace WaveHarmonic.Crest /// Contains shared functionality for and . /// [FilterEnum(nameof(_TextureFormatMode), Filtered.Mode.Exclude, (int)LodTextureFormatMode.Automatic)] + [System.Serializable] public abstract partial class ColorLod : Lod { [@Space(10f)] diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DepthLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DepthLod.cs index da061407d..87a7f47cb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DepthLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DepthLod.cs @@ -1,8 +1,10 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; +using WaveHarmonic.Crest.Internal; using WaveHarmonic.Crest.Utility; namespace WaveHarmonic.Crest @@ -13,6 +15,13 @@ namespace WaveHarmonic.Crest [FilterEnum(nameof(_TextureFormatMode), Filtered.Mode.Exclude, (int)LodTextureFormatMode.Automatic)] public sealed partial class DepthLod : Lod { + [@Space(10)] + + [Tooltip("Whether to include the terrain height automatically.\n\nThis will not include terrain details, nor will it produce a signed-distance field. There may also be a slight deviation due to differences in height data and terrain mesh. In these cases, please use the DepthProbe.")] + [@GenerateAPI] + [@DecoratedField, SerializeField] + internal bool _IncludeTerrainHeight = true; + [Tooltip("Support signed distance field data generated from the depth probes.\n\nRequires a two component texture format.")] [@GenerateAPI(Setter.Custom)] [@DecoratedField, SerializeField] @@ -30,7 +39,6 @@ namespace WaveHarmonic.Crest internal override Color GizmoColor => s_GizmoColor; private protected override Color ClearColor => s_NullColor; private protected override bool NeedToReadWriteTextureData => true; - internal override bool RunsInHeadless => true; private protected override GraphicsFormat RequestedTextureFormat => _TextureFormatMode switch { @@ -89,6 +97,76 @@ namespace WaveHarmonic.Crest ReAllocate(); } +#if d_Unity_Terrain + TerrainDepthInput _TerrainDepthInput; + + internal override void Enable() + { + base.Enable(); + + if (Enabled) + { + _TerrainDepthInput ??= new(this); + Inputs.Add(_TerrainDepthInput.Queue, _TerrainDepthInput); + } + } + + internal override void Disable() + { + base.Disable(); + + Inputs.Remove(_TerrainDepthInput); + } + + sealed class TerrainDepthInput : ILodInput + { + public bool Enabled => _DepthLod._IncludeTerrainHeight; + public bool IsCompute => true; + public int Queue => int.MinValue; + public int Pass => -1; + public Rect Rect => Rect.zero; + public MonoBehaviour Component => null; + public float Filter(WaterRenderer water, int slice) => 1f; + + readonly DepthLod _DepthLod; + readonly System.Collections.Generic.List _Terrains = new(); + + public TerrainDepthInput(DepthLod lod) + { + _DepthLod = lod; + } + + public void Draw(Lod lod, CommandBuffer buffer, RenderTargetIdentifier target, int pass = -1, float weight = 1, int slices = -1) + { + var resources = WaterResources.Instance; + var wrapper = new PropertyWrapperCompute(buffer, resources.Compute._DepthTexture, 0); + + var threads = lod.Resolution / k_ThreadGroupSize; + + wrapper.SetTexture(Crest.ShaderIDs.s_Target, target); + wrapper.SetVector(Crest.ShaderIDs.s_TextureRotation, new(0, 1)); + wrapper.SetBoolean(DepthLodInput.ShaderIDs.s_SDF, false); + wrapper.SetKeyword(resources.Keywords.DepthTextureSDF, lod._Water._DepthLod._EnableSignedDistanceFields); + + Terrain.GetActiveTerrains(_Terrains); + foreach (var terrain in _Terrains) + { + var data = terrain.terrainData; + if (data == null) continue; + var size = data.size; + var position = terrain.GetPosition(); + + wrapper.SetFloat(DepthLodInput.ShaderIDs.s_HeightOffset, position.y); + wrapper.SetVector(Crest.ShaderIDs.s_Multiplier, new(size.y * 2f, 1, 1, 1)); + wrapper.SetVector(Crest.ShaderIDs.s_TexturePosition, position.XZ() + (size.XZ() * 0.5f)); + wrapper.SetVector(Crest.ShaderIDs.s_TextureSize, size.XZ()); + wrapper.SetTexture(Crest.ShaderIDs.s_Texture, data.heightmapTexture); + wrapper.Dispatch(threads, threads, slices); + } + } + } +#endif // d_Unity_Terrain + #if UNITY_EDITOR [@OnChange] private protected override void OnChange(string propertyPath, object previousValue) diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DynamicWavesLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DynamicWavesLod.cs index fb85024e4..0c3e1c5fc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DynamicWavesLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/DynamicWavesLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -41,7 +41,6 @@ namespace WaveHarmonic.Crest internal override string Name => "Dynamic Waves"; internal override Color GizmoColor => s_GizmoColor; private protected override Color ClearColor => Color.black; - internal override bool RunsInHeadless => true; private protected override ComputeShader SimulationShader => WaterResources.Instance.Compute._UpdateDynamicWaves; private protected override GraphicsFormat RequestedTextureFormat => _TextureFormatMode switch { @@ -88,7 +87,7 @@ namespace WaveHarmonic.Crest target.SetFloat(ShaderIDs.s_DisplaceClamp, Settings._DisplaceClamp); } - private protected override void SetAdditionalSimulationParameters(T simMaterial) + private protected override void SetAdditionalSimulationParameters(PropertyWrapperCompute simMaterial) { base.SetAdditionalSimulationParameters(simMaterial); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FlowLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FlowLod.cs index 40b501fde..cff9f4824 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FlowLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FlowLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -21,7 +21,6 @@ namespace WaveHarmonic.Crest internal override Color GizmoColor => s_GizmoColor; private protected override Color ClearColor => Color.black; private protected override bool NeedToReadWriteTextureData => true; - internal override bool RunsInHeadless => true; private protected override GraphicsFormat RequestedTextureFormat => _TextureFormatMode switch { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FoamLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FoamLod.cs index 1c71cbd06..653a820d4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FoamLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/FoamLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -52,7 +52,7 @@ namespace WaveHarmonic.Crest _ => throw new System.NotImplementedException(), }; - private protected override void SetAdditionalSimulationParameters(T properties) + private protected override void SetAdditionalSimulationParameters(PropertyWrapperCompute properties) { base.SetAdditionalSimulationParameters(properties); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Generated/Lod.Generated.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Generated/Lod.Generated.cs index 8470f269c..15aca1ef6 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Generated/Lod.Generated.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Generated/Lod.Generated.cs @@ -8,6 +8,32 @@ using WaveHarmonic.Crest.Utility; namespace WaveHarmonic.Crest { + [System.Serializable] + partial class AbsorptionLod + { + } + + [System.Serializable] + partial class AlbedoLod + { + } + + [System.Serializable] + partial class AnimatedWavesLod + { + } + + [System.Serializable] + partial class ClipLod + { + } + + [System.Serializable] + partial class DepthLod + { + } + + [System.Serializable] partial class DynamicWavesLod { DynamicWavesLodSettings _DefaultSettings; @@ -36,6 +62,12 @@ namespace WaveHarmonic.Crest } } + [System.Serializable] + partial class FlowLod + { + } + + [System.Serializable] partial class FoamLod { FoamLodSettings _DefaultSettings; @@ -63,4 +95,19 @@ namespace WaveHarmonic.Crest Helpers.Destroy(_DefaultSettings); } } + + [System.Serializable] + partial class LevelLod + { + } + + [System.Serializable] + partial class ScatteringLod + { + } + + [System.Serializable] + partial class ShadowLod + { + } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AbsorptionLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AbsorptionLodInput.cs index f5947af48..5a1cb4fc4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AbsorptionLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AbsorptionLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AlbedoLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AlbedoLodInput.cs index 85484d7a0..7b81eb2a8 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AlbedoLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AlbedoLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AnimatedWavesLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AnimatedWavesLodInput.cs index 2e161871d..da2b9a89e 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AnimatedWavesLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/AnimatedWavesLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthLodInput.cs index 340c0a3af..2371e1d2c 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -32,7 +32,7 @@ namespace WaveHarmonic.Crest [Tooltip("Whether the data is relative to the input height.\n\nUseful for procedural placement.")] [@GenerateAPI] [@DecoratedField, SerializeField] - internal bool _Relative; + internal bool _Relative = true; [@Label("Copy Signed Distance Field")] [Tooltip("Whether to copy the signed distance field.")] diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthProbe.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthProbe.cs index a5b6a5b16..c541ec527 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthProbe.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthProbe.cs @@ -1,11 +1,8 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. -using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering.Universal; using WaveHarmonic.Crest.Internal; using WaveHarmonic.Crest.Utility; @@ -14,55 +11,51 @@ namespace WaveHarmonic.Crest /// /// 's update mode. /// + [@GenerateDoc] public enum DepthProbeMode { - /// - /// is updating in real-time, in accordance to . - /// + /// + [Tooltip("Update in real-time in accordance to refresh mode.")] RealTime, - /// - /// is baked in the Editor. - /// + /// + [Tooltip("Baked in the editor.")] Baked, } /// /// How the refreshes when using . /// + [@GenerateDoc] public enum DepthProbeRefreshMode { - /// - /// Populates the in Start. - /// + /// + [Tooltip("Populates the DepthProbe in Start.")] OnStart = 0, // EveryFrame = 1, - /// - /// Requires manual updating via . - /// + /// + [Tooltip("Requires manual updating via DepthProbe.Populate.")] ViaScripting = 2, } /// /// How a component is placed in the world. /// + [@GenerateDoc] public enum Placement { - /// - /// The component is in a fixed position. - /// + /// + [Tooltip("The component is in a fixed position.")] Fixed, - /// - /// The component follows the transform. - /// + /// + [Tooltip("The component follows the transform.")] Transform, - /// - /// The component follows the viewpoint. - /// + /// + [Tooltip("The component follows the viewpoint.")] Viewpoint, } @@ -317,17 +310,6 @@ namespace WaveHarmonic.Crest public static readonly int s_VoronoiPingPong1 = Shader.PropertyToID("_Crest_VoronoiPingPong1"); } -#if d_UnityHDRP - static readonly List s_FrameSettingsFields = new() - { - FrameSettingsField.OpaqueObjects, - FrameSettingsField.TransparentObjects, - FrameSettingsField.TransparentPrepass, - FrameSettingsField.TransparentPostpass, - FrameSettingsField.AsyncCompute, - }; -#endif - internal void Bind(T wrapper) where T : IPropertyWrapper { wrapper.SetTexture(ShaderIDs.s_DepthProbe, Texture); @@ -446,39 +428,13 @@ namespace WaveHarmonic.Crest if (RenderPipelineHelper.IsUniversal) { #if d_UnityURP - var additionalCameraData = _Camera.GetUniversalAdditionalCameraData(); - additionalCameraData.renderShadows = false; - additionalCameraData.requiresColorTexture = false; - additionalCameraData.requiresDepthTexture = false; - additionalCameraData.renderPostProcessing = false; - additionalCameraData.allowXRRendering = false; + SetUpCameraURP(); #endif } else if (RenderPipelineHelper.IsHighDefinition) { #if d_UnityHDRP - var additionalCameraData = _Camera.gameObject.AddComponent(); - - additionalCameraData.clearColorMode = HDAdditionalCameraData.ClearColorMode.Color; - additionalCameraData.volumeLayerMask = 0; - additionalCameraData.probeLayerMask = 0; - additionalCameraData.xrRendering = false; - - // Override camera frame settings to disable most of the expensive rendering for this camera. - // Most importantly, disable custom passes and post-processing as third-party stuff might throw - // errors because of this camera. Even with excluding a lot of HDRP features, it still does a - // lit pass which is not cheap. - additionalCameraData.customRenderingSettings = true; - - foreach (FrameSettingsField frameSetting in System.Enum.GetValues(typeof(FrameSettingsField))) - { - if (!s_FrameSettingsFields.Contains(frameSetting)) - { - // Enable override and then disable the feature. - additionalCameraData.renderingPathCustomFrameSettingsOverrideMask.mask[(uint)frameSetting] = true; - additionalCameraData.renderingPathCustomFrameSettings.SetEnabled(frameSetting, false); - } - } + SetUpCameraHD(); #endif } } @@ -557,6 +513,10 @@ namespace WaveHarmonic.Crest OnBeforeRender?.Invoke(this); + _CommandBuffer ??= new(); + _CommandBuffer.Clear(); + _CommandBuffer.name = "Crest.DepthProbe"; + #if UNITY_EDITOR try #endif @@ -566,6 +526,9 @@ namespace WaveHarmonic.Crest if (_FillHolesCaptureHeight > 0f) { + Graphics.ExecuteCommandBuffer(_CommandBuffer); + _CommandBuffer.Clear(); + // Fill holes pass. RenderDepthIntoProbe(k_FillKernel, _CaptureRange.y + _FillHolesCaptureHeight); } @@ -588,10 +551,14 @@ namespace WaveHarmonic.Crest if (_GenerateSignedDistanceField) { + _CommandBuffer.BeginSample("SDF"); RenderSignedDistanceField(inverted: false); RenderSignedDistanceField(inverted: true); + _CommandBuffer.EndSample("SDF"); } + Graphics.ExecuteCommandBuffer(_CommandBuffer); + HashState(ref _RenderedStateHash); } @@ -621,9 +588,17 @@ namespace WaveHarmonic.Crest backFaces = RenderTexture.GetTemporary(target.descriptor); _Camera.targetTexture = backFaces; + // Does not work for HDRP (handled elsewhere). var oldInvertCulling = GL.invertCulling; GL.invertCulling = true; +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + _HDAdditionalCameraData.invertFaceCulling = true; + } +#endif + // Render scene, saving depths in depth buffer. #if d_UnityURP if (RenderPipelineHelper.IsUniversal) @@ -637,6 +612,14 @@ namespace WaveHarmonic.Crest } _Camera.targetTexture = target; + +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + _HDAdditionalCameraData.invertFaceCulling = false; + } +#endif + GL.invertCulling = oldInvertCulling; } @@ -652,7 +635,7 @@ namespace WaveHarmonic.Crest _Camera.Render(); } - var wrapper = new PropertyWrapperComputeStandalone(WaterResources.Instance.Compute._RenderDepthProbe, kernel); + var wrapper = new PropertyWrapperCompute(_CommandBuffer, WaterResources.Instance.Compute._RenderDepthProbe, kernel); wrapper.SetFloat(ShaderIDs.s_HeightOffset, transform.position.y); @@ -699,13 +682,12 @@ namespace WaveHarmonic.Crest return; } + var buffer = _CommandBuffer; + var cameraToWorldMatrix = _Camera.cameraToWorldMatrix; var projectionMatrix = _Camera.projectionMatrix; var projectionToWorldMatrix = cameraToWorldMatrix * projectionMatrix.inverse; - var buffer = _CommandBuffer ??= new(); - buffer.Clear(); - buffer.name = "Jump Flood"; // Common uniforms. buffer.SetComputeFloatParam(shader, DepthLodInput.ShaderIDs.s_HeightOffset, transform.position.y); buffer.SetComputeIntParam(shader, Crest.ShaderIDs.s_TextureSize, _Resolution); @@ -802,7 +784,6 @@ namespace WaveHarmonic.Crest ); } - Graphics.ExecuteCommandBuffer(buffer); buffer.ReleaseTemporaryRT(voronoiPingPong0); buffer.ReleaseTemporaryRT(voronoiPingPong1); } @@ -929,6 +910,7 @@ namespace WaveHarmonic.Crest wrapper.SetVector(Crest.ShaderIDs.s_TextureSize, _Probe.Scale); wrapper.SetVector(Crest.ShaderIDs.s_TexturePosition, position.XZ()); wrapper.SetVector(Crest.ShaderIDs.s_TextureRotation, new Vector2(matrix.m20, matrix.m00).normalized); + wrapper.SetVector(Crest.ShaderIDs.s_Multiplier, Vector4.one); wrapper.SetInteger(Crest.ShaderIDs.s_Blend, (int)LodInputBlend.Maximum); wrapper.SetTexture(Crest.ShaderIDs.s_Texture, _Probe.Texture); wrapper.SetTexture(Crest.ShaderIDs.s_Target, target); @@ -962,9 +944,9 @@ namespace WaveHarmonic.Crest Hash.AddBool(_EnableBackFaceInclusion, ref hash); Hash.AddInt(_AdditionalJumpFloodRounds, ref hash); Hash.AddBool(_GenerateSignedDistanceField, ref hash); - Hash.AddObject(Position, ref hash); - Hash.AddObject(Rotation, ref hash); - Hash.AddObject(Scale, ref hash); + Hash.AddObject(Managed ? Vector3.zero : Position, ref hash); + Hash.AddObject(Managed ? Quaternion.identity : Rotation, ref hash); + Hash.AddObject(Managed ? Vector2.zero : Scale, ref hash); } #if UNITY_EDITOR @@ -992,7 +974,7 @@ namespace WaveHarmonic.Crest void Update() { - if (_Debug._ForceAlwaysUpdateDebug) + if (_Debug._ForceAlwaysUpdateDebug && _Type != DepthProbeMode.Baked) { Populate(); } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DynamicWavesLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DynamicWavesLodInput.cs index f29751aaf..943a043bc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DynamicWavesLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DynamicWavesLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FlowLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FlowLodInput.cs index d04063ddf..3a112dce8 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FlowLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FlowLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FoamLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FoamLodInput.cs index 351af4db4..91b2de6fb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FoamLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/FoamLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/GeometryLodInputData.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/GeometryLodInputData.cs index 67f3bf311..23beb86a0 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/GeometryLodInputData.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/GeometryLodInputData.cs @@ -97,6 +97,7 @@ namespace WaveHarmonic.Crest /// [ForLodInput(typeof(LevelLodInput), LodInputMode.Geometry)] + [System.Serializable] public sealed class LevelGeometryLodInputData : GeometryLodInputData { private protected override Shader GeometryShader => WaterResources.Instance.Shaders._LevelGeometry; @@ -104,6 +105,7 @@ namespace WaveHarmonic.Crest /// [ForLodInput(typeof(DepthLodInput), LodInputMode.Geometry)] + [System.Serializable] public sealed class DepthGeometryLodInputData : GeometryLodInputData { private protected override Shader GeometryShader => WaterResources.Instance.Shaders._DepthGeometry; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LevelLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LevelLodInput.cs index 488f21916..68995c1b5 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LevelLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LevelLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInput.cs index 09267b46a..621ecf8d3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System; @@ -17,7 +17,7 @@ namespace WaveHarmonic.Crest /// /// Draw the input (the render target will be bound) /// - public void Draw(Lod simulation, CommandBuffer buffer, RenderTargetIdentifier target, int pass = -1, float weight = 1f, int slice = -1); + void Draw(Lod simulation, CommandBuffer buffer, RenderTargetIdentifier target, int pass = -1, float weight = 1f, int slice = -1); float Filter(WaterRenderer water, int slice); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInputData.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInputData.cs index d7395d4fc..7965fd430 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInputData.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/LodInputData.cs @@ -23,6 +23,7 @@ namespace WaveHarmonic.Crest /// /// Data storage for an input, pertinent to the associated input mode. /// + [Serializable] public abstract class LodInputData { [SerializeField, HideInInspector] @@ -109,82 +110,70 @@ namespace WaveHarmonic.Crest /// /// Modes that inputs can use. Not all inputs support all modes. Refer to the UI. /// + [@GenerateDoc] public enum LodInputMode { - /// - /// Unset is the serialization default. - /// - /// - /// This will be replaced with the default mode automatically. Unset can also be - /// used if something is invalid. - /// + /// + [Tooltip("Unset is the serialization default.\n\nThis will be replaced with the default mode automatically. Unset can also be used if something is invalid.")] Unset = 0, - /// - /// Hand-painted data by the user. Currently unused. - /// + + /// + [Tooltip("Hand-painted data by the user.")] Paint, - /// - /// Driven by a user created spline. - /// + + /// + [Tooltip("Driven by a user created spline.")] Spline, - /// - /// Attached 'Renderer' (mesh, particle or other) used to drive data. - /// + + /// + [Tooltip("Attached 'Renderer' (mesh, particle or other) used to drive data.")] Renderer, - /// - /// Driven by a mathematical primitive such as a cube or sphere. - /// + + /// + [Tooltip("Driven by a mathematical primitive such as a cube or sphere.")] Primitive, - /// - /// Covers the entire water area. - /// + + /// + [Tooltip("Covers the entire water area.")] Global, - /// - /// Data driven by a user provided texture. - /// + + /// + [Tooltip("Data driven by a user provided texture.")] Texture, - /// - /// Renders geometry using a default material. - /// + + /// + [Tooltip("Renders geometry using a default material.")] Geometry, } /// /// Blend presets for inputs. /// + [@GenerateDoc] public enum LodInputBlend { - /// - /// No blending. Overwrites. - /// + /// + [Tooltip("No blending. Overwrites.")] Off, - /// - /// Additive blending. - /// + /// + [Tooltip("Additive blending.")] Additive, - /// - /// Takes the minimum value. - /// + /// + [Tooltip("Takes the minimum value.")] Minimum, - /// - /// Takes the maximum value. - /// + /// + [Tooltip("Takes the maximum value.")] Maximum, - /// - /// Applies the inverse weight to the target. - /// - /// - /// Basically overwrites what is already in the simulation. - /// + /// + [Tooltip("Applies the inverse weight to the target.\n\nBasically overwrites what is already in the simulation.")] Alpha, - /// - /// Same as alpha except anything above zero will overwrite rather than blend. - /// + /// + [Tooltip("Same as alpha except anything above zero will overwrite rather than blend.")] AlphaClip, } @@ -192,21 +181,19 @@ namespace WaveHarmonic.Crest /// Primitive shapes. /// // Have this match UnityEngine.PrimitiveType. + [@GenerateDoc] public enum LodInputPrimitive { - /// - /// Spheroid. - /// + /// + [Tooltip("Spheroid.")] Sphere = 0, - /// - /// Cuboid. - /// + /// + [Tooltip("Cuboid.")] Cube = 3, - /// - /// Quad. - /// + /// + [Tooltip("Quad.")] Quad = 5, } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe.meta new file mode 100644 index 000000000..6c0904843 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ef4f3d3c2ad88274294da9c9be0143e7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs new file mode 100644 index 000000000..b4878e530 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs @@ -0,0 +1,54 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityHDRP + +using System.Collections.Generic; +using UnityEngine.Rendering.HighDefinition; + +namespace WaveHarmonic.Crest +{ + partial class DepthProbe + { + static readonly List s_FrameSettingsFields = new() + { + FrameSettingsField.OpaqueObjects, + FrameSettingsField.TransparentObjects, + FrameSettingsField.TransparentPrepass, + FrameSettingsField.TransparentPostpass, + FrameSettingsField.AsyncCompute, + }; + + HDAdditionalCameraData _HDAdditionalCameraData; + + void SetUpCameraHD() + { + var additionalCameraData = _Camera.gameObject.AddComponent(); + + additionalCameraData.clearColorMode = HDAdditionalCameraData.ClearColorMode.Color; + additionalCameraData.volumeLayerMask = 0; + additionalCameraData.probeLayerMask = 0; + additionalCameraData.xrRendering = false; + + // Override camera frame settings to disable most of the expensive rendering for this camera. + // Most importantly, disable custom passes and post-processing as third-party stuff might throw + // errors because of this camera. Even with excluding a lot of HDRP features, it still does a + // lit pass which is not cheap. + additionalCameraData.customRenderingSettings = true; + + foreach (FrameSettingsField frameSetting in System.Enum.GetValues(typeof(FrameSettingsField))) + { + if (!s_FrameSettingsFields.Contains(frameSetting)) + { + // Enable override and then disable the feature. + additionalCameraData.renderingPathCustomFrameSettingsOverrideMask.mask[(uint)frameSetting] = true; + additionalCameraData.renderingPathCustomFrameSettings.SetEnabled(frameSetting, false); + } + } + + _HDAdditionalCameraData = additionalCameraData; + } + } +} + +#endif // d_UnityHDRP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs.meta new file mode 100644 index 000000000..188a39cc2 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.HighDefinition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93b38270a78f94e43bfbbe01ef2e351b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 300 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs new file mode 100644 index 000000000..e0db58ed9 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs @@ -0,0 +1,24 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityURP + +using UnityEngine.Rendering.Universal; + +namespace WaveHarmonic.Crest +{ + partial class DepthProbe + { + void SetUpCameraURP() + { + var additionalCameraData = _Camera.GetUniversalAdditionalCameraData(); + additionalCameraData.renderShadows = false; + additionalCameraData.requiresColorTexture = false; + additionalCameraData.requiresDepthTexture = false; + additionalCameraData.renderPostProcessing = false; + additionalCameraData.allowXRRendering = false; + } + } +} + +#endif // d_UnityURP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs.meta new file mode 100644 index 000000000..3aa4c07c6 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Probe/DepthProbe.Universal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3d572236539a490aaddc647129ad141 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 300 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/RendererLodInputData.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/RendererLodInputData.cs index 921ee1cfd..3789db0a4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/RendererLodInputData.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/RendererLodInputData.cs @@ -11,6 +11,7 @@ namespace WaveHarmonic.Crest /// /// Data storage for for the Renderer input mode. /// + [System.Serializable] public abstract partial class RendererLodInputData : LodInputData { [Tooltip("The renderer to use for this input.\n\nCan be anything that inherits from Renderer like MeshRenderer, TrailRenderer etc.")] @@ -47,12 +48,6 @@ namespace WaveHarmonic.Crest #pragma warning restore 414 - static class ShaderIDs - { - public static readonly int s_Time = Shader.PropertyToID("_Time"); - } - - // Some renderers require multiple materials like particles with trails. // We pass this to GetSharedMaterials to avoid allocations. internal List _Materials = new(); @@ -169,35 +164,31 @@ namespace WaveHarmonic.Crest } #endif - var pass = _ShaderPassIndex; + // BIRP/URP SG first pass is the right one. + // HDRP SG does not support matrix override, but users can just use BIRP instead. + var pass = 0; + if (ShapeWaves.s_RenderPassOverride > -1) { // Needs to use a second pass to disable blending. pass = ShapeWaves.s_RenderPassOverride; } - else if (!_OverrideShaderPass) + else if (_OverrideShaderPass) { - // BIRP/URP SG first pass is the right one. - pass = 0; - - // Support HDRP SG. It will always have more than one pass. - if (RenderPipelineHelper.IsHighDefinition && material.shader.passCount > 1) - { - var sgPass = material.FindPass("ForwardOnly"); - if (sgPass > -1) pass = sgPass; - } + pass = _ShaderPassIndex; } - else if (_ShaderPassIndex > material.shader.passCount - 1) + + if (pass > material.shader.passCount - 1) { return; } // Time is not set for us for some reason… Use Time.timeSinceLevelLoad as per: // https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html - if (RenderPipelineHelper.IsLegacy) + if (RenderPipelineHelper.IsLegacy || RenderPipelineHelper.IsHighDefinition) { _Renderer.GetPropertyBlock(_MaterialPropertyBlock); - _MaterialPropertyBlock.SetVector(ShaderIDs.s_Time, new + _MaterialPropertyBlock.SetVector(ShaderIDs.Unity.s_Time, new ( Time.timeSinceLevelLoad / 20, Time.timeSinceLevelLoad, diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ScatteringLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ScatteringLodInput.cs index 9c2718f7f..ab37d95fc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ScatteringLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ScatteringLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ShadowLodInput.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ShadowLodInput.cs index 55e5026d9..8d989a2ef 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ShadowLodInput.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/ShadowLodInput.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeFFT.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeFFT.cs index b3cf7abb0..1cbed8353 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeFFT.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeFFT.cs @@ -14,14 +14,21 @@ namespace WaveHarmonic.Crest { // Waves - [Tooltip("How turbulent/chaotic the waves are.")] - [@Range(0, 1, order = -3)] + [Tooltip("Whether to use the wind turbulence on this component rather than the global wind turbulence.\n\nGlobal wind turbulence comes from the Water Renderer component.")] [@GenerateAPI] + [@InlineToggle(order = -3), SerializeField] + bool _OverrideGlobalWindTurbulence; + + [Tooltip("How turbulent/chaotic the waves are.")] + [@Predicated(nameof(_OverrideGlobalWindTurbulence), hide: true)] + [@ShowComputedProperty(nameof(WindTurbulence))] + [@Range(0, 1, order = -4)] + [@GenerateAPI(Getter.Custom)] [SerializeField] float _WindTurbulence = 0.145f; [Tooltip("How aligned the waves are with wind.")] - [@Range(0, 1, order = -4)] + [@Range(0, 1, order = -5)] [@GenerateAPI] [SerializeField] float _WindAlignment; @@ -51,23 +58,39 @@ namespace WaveHarmonic.Crest [@Heading("Collision Data Baking")] +#if !d_WaveHarmonic_Crest_CPUQueries + [HideInInspector] +#endif + [Tooltip("Enable running this FFT with baked data.\n\nThis makes the FFT periodic (repeating in time).")] [@Predicated(nameof(_Mode), inverted: true, nameof(LodInputMode.Global), hide: true)] [@DecoratedField, SerializeField] internal bool _EnableBakedCollision = false; +#if !d_WaveHarmonic_Crest_CPUQueries + [HideInInspector] +#endif + [Tooltip("Frames per second of baked data.\n\nLarger values may help the collision track the surface closely at the cost of more frames and increase baked data size.")] [@Predicated(nameof(_EnableBakedCollision))] [@Predicated(nameof(_Mode), inverted: true, nameof(LodInputMode.Global), hide: true)] [@DecoratedField, SerializeField] internal int _TimeResolution = 4; +#if !d_WaveHarmonic_Crest_CPUQueries + [HideInInspector] +#endif + [Tooltip("Smallest wavelength required in collision.\n\nTo preview the effect of this, disable power sliders in spectrum for smaller values than this number. Smaller values require more resolution and increase baked data size.")] [@Predicated(nameof(_EnableBakedCollision))] [@Predicated(nameof(_Mode), inverted: true, nameof(LodInputMode.Global), hide: true)] [@DecoratedField, SerializeField] internal float _SmallestWavelengthRequired = 2f; +#if !d_WaveHarmonic_Crest_CPUQueries + [HideInInspector] +#endif + [Tooltip("FFT waves will loop with a period of this many seconds.\n\nSmaller values decrease data size but can make waves visibly repetitive.")] [@Predicated(nameof(_EnableBakedCollision))] [@Predicated(nameof(_Mode), inverted: true, nameof(LodInputMode.Global), hide: true)] @@ -75,21 +98,28 @@ namespace WaveHarmonic.Crest [SerializeField] internal float _BakedTimeLoopLength = 32f; - internal float LoopPeriod => _EnableBakedCollision ? _BakedTimeLoopLength : _TimeLoopLength; + internal float LoopPeriod => +#if d_WaveHarmonic_Crest_CPUQueries + _EnableBakedCollision ? _BakedTimeLoopLength : +#endif + _TimeLoopLength; private protected override int MinimumResolution => 16; private protected override int MaximumResolution => int.MaxValue; + FFTCompute _FFTCompute; + FFTCompute.Parameters _OldFFTParameters; - internal FFTCompute.Parameters FFTParameters => new + internal FFTCompute.Parameters GetFFTParameters(float gravity) => new ( _ActiveSpectrum, Resolution, _TimeLoopLength, WindSpeedMPS, WindDirRadForFFT, - _WindTurbulence, - _WindAlignment + WindTurbulence, + _WindAlignment, + gravity ); private protected override void OnUpdate(WaterRenderer water) @@ -103,7 +133,7 @@ namespace WaveHarmonic.Crest ReportMaxDisplacement(water); // If geometry is being used, the water input shader will rotate the waves to align to geo - var parameters = FFTParameters; + var parameters = GetFFTParameters(water.Gravity); // Don't create tons of generators when values are varying. Notify so that existing generators may be adapted. if (parameters.GetHashCode() != _OldFFTParameters.GetHashCode()) @@ -111,6 +141,10 @@ namespace WaveHarmonic.Crest FFTCompute.OnGenerationDataUpdated(_OldFFTParameters, parameters); } +#if UNITY_EDITOR + _FFTCompute = FFTCompute.GetInstance(parameters); +#endif + _OldFFTParameters = parameters; } @@ -118,14 +152,22 @@ namespace WaveHarmonic.Crest { if (_LastGenerateFrameCount != Time.frameCount) { + // Parameters will unlikely change as our Update is called in LateUpdate with Draw + // not too far after. + var parameters = GetFFTParameters(lod.Water.Gravity); + _WaveBuffers = FFTCompute.GenerateDisplacements ( buffer, lod.Water.CurrentTime, - FFTParameters, + parameters, UpdateDataEachFrame ); +#if UNITY_EDITOR + _FFTCompute = FFTCompute.GetInstance(parameters); +#endif + _LastGenerateFrameCount = Time.frameCount; } @@ -157,11 +199,6 @@ namespace WaveHarmonic.Crest } } - private protected override void DestroySharedResources() - { - FFTCompute.CleanUpAll(); - } - float WindDirRadForFFT { get @@ -172,36 +209,64 @@ namespace WaveHarmonic.Crest return 0f; } - return _WaveDirectionHeadingAngle * Mathf.Deg2Rad; + return WaveDirectionHeadingAngle * Mathf.Deg2Rad; } } + float GetWindTurbulence() + { + return _OverrideGlobalWindTurbulence || WaterRenderer.Instance == null ? _WindTurbulence : WaterRenderer.Instance.WindTurbulence; + } + #if UNITY_EDITOR void OnGUI() { if (_DrawSlicesInEditor) { - FFTCompute.GetInstance(FFTParameters)?.OnGUI(); + _FFTCompute?.OnGUI(); } } - - internal FFTCompute GetFFTComputeInstance() - { - return FFTCompute.GetInstance(FFTParameters); - } #endif } + partial class ShapeFFT + { + static int s_InstanceCount; + + private protected override void Awake() + { + base.Awake(); + s_InstanceCount++; + } + + private protected override void OnDestroy() + { + base.OnDestroy(); + + if (--s_InstanceCount <= 0) + { + FFTCompute.CleanUpAll(); + } + } + } + partial class ShapeFFT : ISerializationCallbackReceiver { [SerializeField, HideInInspector] #pragma warning disable 414 - int _Version = 1; + int _Version = 2; #pragma warning restore 414 void ISerializationCallbackReceiver.OnAfterDeserialize() { _Version = MigrateV1(_Version); + + if (_Version < 2) + { + _OverrideGlobalWindTurbulence = true; + } + + _Version = MigrateV2(_Version); } void ISerializationCallbackReceiver.OnBeforeSerialize() @@ -209,4 +274,19 @@ namespace WaveHarmonic.Crest // Empty. } } + +#if UNITY_EDITOR + partial class ShapeFFT + { + private protected override void Reset() + { + base.Reset(); + + if (_Mode != LodInputMode.Global) + { + _OverrideGlobalWindTurbulence = true; + } + } + } +#endif } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeGerstner.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeGerstner.cs index 10e0783a1..de3179a85 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeGerstner.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeGerstner.cs @@ -17,9 +17,17 @@ namespace WaveHarmonic.Crest { // Waves - [Tooltip("The weight of the opposing, second pair of Gerstner waves.\n\nEach Gerstner wave is actually a pair of waves travelling in opposite directions (similar to FFT). This weight is applied to the wave travelling in against-wind direction. Set to zero to obtain simple single waves which are useful for shorelines waves.")] - [@Range(0f, 1f, order = -3)] + [@Space(10)] + + [Tooltip("Use a swell spectrum as the default.\n\nUses a swell spectrum as default (when none is assigned), and disabled reverse waves.")] [@GenerateAPI] + [@DecoratedField(order = -3), SerializeField] + bool _Swell = true; + + [Tooltip("The weight of the opposing, second pair of Gerstner waves.\n\nEach Gerstner wave is actually a pair of waves travelling in opposite directions (similar to FFT). This weight is applied to the wave travelling in against-wind direction. Set to zero to obtain simple single waves which are useful for shorelines waves.")] + [Predicated(nameof(_Swell), inverted: true)] + [@Range(0f, 1f, order = -4)] + [@GenerateAPI(Getter.Custom)] [SerializeField] float _ReverseWaveWeight = 0.5f; @@ -37,6 +45,11 @@ namespace WaveHarmonic.Crest [SerializeField] int _RandomSeed = 0; + [Tooltip("Prevent data arrays from being written to so one can provide their own.")] + [@GenerateAPI] + [SerializeField] + bool _ManualGeneration; + private protected override int MinimumResolution => 8; private protected override int MaximumResolution => 64; @@ -45,12 +58,39 @@ namespace WaveHarmonic.Crest const int k_MaximumWaveComponents = 1024; // Data for all components - float[] _Wavelengths; - float[] _Amplitudes; + + /// + /// Wavelengths. Requires Manual Generation to be enabled. + /// + [System.NonSerialized] + public float[] _Wavelengths; + + /// + /// Amplitudes. Requires Manual Generation to be enabled. + /// + [System.NonSerialized] + public float[] _Amplitudes; + + /// + /// Powers. Requires Manual Generation to be enabled. + /// + [System.NonSerialized] + public float[] _Powers; + + /// + /// Angles. Requires Manual Generation to be enabled. + /// + [System.NonSerialized] + public float[] _AngleDegrees; + + /// + /// Phases. Requires Manual Generation to be enabled. + /// + [System.NonSerialized] + public float[] _Phases; + + // Reverse. float[] _Amplitudes2; - float[] _Powers; - float[] _AngleDegrees; - float[] _Phases; float[] _Phases2; struct GerstnerCascadeParams @@ -82,6 +122,33 @@ namespace WaveHarmonic.Crest ComputeShader _ShaderGerstner; int _KernelGerstner = -1; + private protected override WaveSpectrum DefaultSpectrum => _Swell ? SwellSpectrum : WindSpectrum; + static WaveSpectrum s_SwellSpectrum; + static WaveSpectrum SwellSpectrum + { + get + { + if (s_SwellSpectrum == null) + { + s_SwellSpectrum = ScriptableObject.CreateInstance(); + s_SwellSpectrum.name = "Swell Waves (auto)"; + s_SwellSpectrum.hideFlags = HideFlags.DontSave | HideFlags.NotEditable; + s_SwellSpectrum._PowerDisabled[0] = true; + s_SwellSpectrum._PowerDisabled[1] = true; + s_SwellSpectrum._PowerDisabled[2] = true; + s_SwellSpectrum._PowerDisabled[3] = true; + s_SwellSpectrum._PowerDisabled[4] = true; + s_SwellSpectrum._PowerDisabled[5] = true; + s_SwellSpectrum._PowerDisabled[6] = true; + s_SwellSpectrum._PowerDisabled[7] = true; + s_SwellSpectrum._WaveDirectionVariance = 15f; + s_SwellSpectrum._Chop = 1.3f; + } + + return s_SwellSpectrum; + } + } + static new class ShaderIDs { @@ -103,6 +170,11 @@ namespace WaveHarmonic.Crest s_Instances.Clear(); } + float GetReverseWaveWeight() + { + return _Swell ? 0f : _ReverseWaveWeight; + } + void InitData() { if (_WaveBuffers == null) @@ -167,7 +239,7 @@ namespace WaveHarmonic.Crest { UpdateGenerateWaves(buffer); // Above changes the render target. Change it back if necessary. - if (!IsCompute) buffer.SetRenderTarget(target, 0, CubemapFace.Unknown, slice); + if (!IsCompute) CoreUtils.SetRenderTarget(buffer, target, depthSlice: slice); } _LastGenerateFrameCount = Time.frameCount; @@ -196,6 +268,16 @@ namespace WaveHarmonic.Crest var outputIdx = 0; _CascadeParameters[0]._StartIndex = 0; + if (_ManualGeneration) + { + for (var i = 0; i < _WaveData.Length; i++) + { + _WaveData[i]._Phase2 = Vector4.zero; + _WaveData[i]._Amplitude2 = Vector4.zero; + _WaveData[i]._ChopAmplitude2 = Vector4.zero; + } + } + // Seek forward to first wavelength that is big enough to render into current cascades var minWl = MinWavelength(cascadeIdx); while (componentIdx < _Wavelengths.Length && _Wavelengths[componentIdx] < minWl) @@ -230,10 +312,13 @@ namespace WaveHarmonic.Crest _WaveData[vi]._WaveDirectionZ[ei] = 0f; _WaveData[vi]._Omega[ei] = 0f; _WaveData[vi]._Phase[ei] = 0f; - _WaveData[vi]._Phase2[ei] = 0f; _WaveData[vi]._ChopAmplitude[ei] = 0f; - _WaveData[vi]._Amplitude2[ei] = 0f; - _WaveData[vi]._ChopAmplitude2[ei] = 0f; + if (!_ManualGeneration) + { + _WaveData[vi]._Phase2[ei] = 0f; + _WaveData[vi]._Amplitude2[ei] = 0f; + _WaveData[vi]._ChopAmplitude2[ei] = 0f; + } ei = (ei + 1) % 4; outputIdx++; } @@ -254,11 +339,15 @@ namespace WaveHarmonic.Crest var ei = outputIdx - vi * 4; _WaveData[vi]._Amplitude[ei] = _Amplitudes[componentIdx]; - _WaveData[vi]._Amplitude2[ei] = _Amplitudes2[componentIdx]; var chopScale = _ActiveSpectrum._ChopScales[componentIdx / _ComponentsPerOctave]; _WaveData[vi]._ChopAmplitude[ei] = -chopScale * _ActiveSpectrum._Chop * _Amplitudes[componentIdx]; - _WaveData[vi]._ChopAmplitude2[ei] = -chopScale * _ActiveSpectrum._Chop * _Amplitudes2[componentIdx]; + + if (!_ManualGeneration) + { + _WaveData[vi]._Amplitude2[ei] = _Amplitudes2[componentIdx]; + _WaveData[vi]._ChopAmplitude2[ei] = -chopScale * _ActiveSpectrum._Chop * _Amplitudes2[componentIdx]; + } var angle = Mathf.Deg2Rad * _AngleDegrees[componentIdx]; var dx = Mathf.Cos(angle); @@ -295,7 +384,11 @@ namespace WaveHarmonic.Crest // Repeat every 2pi to keep angle bounded - helps precision on 16bit platforms _WaveData[vi]._Omega[ei] = k * c; _WaveData[vi]._Phase[ei] = Mathf.Repeat(_Phases[componentIdx], Mathf.PI * 2f); - _WaveData[vi]._Phase2[ei] = Mathf.Repeat(_Phases2[componentIdx], Mathf.PI * 2f); + + if (!_ManualGeneration) + { + _WaveData[vi]._Phase2[ei] = Mathf.Repeat(_Phases2[componentIdx], Mathf.PI * 2f); + } outputIdx++; } @@ -316,10 +409,13 @@ namespace WaveHarmonic.Crest _WaveData[vi]._WaveDirectionZ[ei] = 0f; _WaveData[vi]._Omega[ei] = 0f; _WaveData[vi]._Phase[ei] = 0f; - _WaveData[vi]._Phase2[ei] = 0f; _WaveData[vi]._ChopAmplitude[ei] = 0f; - _WaveData[vi]._Amplitude2[ei] = 0f; - _WaveData[vi]._ChopAmplitude2[ei] = 0f; + if (!_ManualGeneration) + { + _WaveData[vi]._Phase2[ei] = 0f; + _WaveData[vi]._Amplitude2[ei] = 0f; + _WaveData[vi]._ChopAmplitude2[ei] = 0f; + } ei = (ei + 1) % 4; outputIdx++; } @@ -340,8 +436,7 @@ namespace WaveHarmonic.Crest void UpdateGenerateWaves(CommandBuffer buf) { // Clear existing waves or they could get copied. - buf.SetRenderTarget(_WaveBuffers, 0, CubemapFace.Unknown, -1); - buf.ClearRenderTarget(RTClearFlags.Color, Color.black, 0, 0); + CoreUtils.SetRenderTarget(buf, _WaveBuffers, ClearFlag.Color); buf.SetComputeFloatParam(_ShaderGerstner, ShaderIDs.s_TextureRes, _WaveBuffers.width); buf.SetComputeIntParam(_ShaderGerstner, ShaderIDs.s_FirstCascadeIndex, _FirstCascade); buf.SetComputeBufferParam(_ShaderGerstner, _KernelGerstner, ShaderIDs.s_CascadeParams, _BufferCascadeParameters); @@ -358,13 +453,23 @@ namespace WaveHarmonic.Crest /// Wind speed in m/s void UpdateWaveData(WaterRenderer water, float windSpeed) { + if (_ManualGeneration) + { + if (_Wavelengths != null) + { + SliceUpWaves(water, windSpeed); + } + + return; + } + // Set random seed to get repeatable results var randomStateBkp = Random.state; Random.InitState(_RandomSeed); _ActiveSpectrum.GenerateWaveData(_ComponentsPerOctave, ref _Wavelengths, ref _AngleDegrees); - UpdateAmplitudes(); + UpdateAmplitudes(water); // Won't run every time so put last in the random sequence if (_Phases == null || _Phases.Length != _Wavelengths.Length || _Phases2 == null || _Phases2.Length != _Wavelengths.Length) @@ -377,7 +482,7 @@ namespace WaveHarmonic.Crest SliceUpWaves(water, windSpeed); } - void UpdateAmplitudes() + void UpdateAmplitudes(WaterRenderer water) { if (_Amplitudes == null || _Amplitudes.Length != _Wavelengths.Length) { @@ -396,9 +501,9 @@ namespace WaveHarmonic.Crest for (var i = 0; i < _Wavelengths.Length; i++) { - var amp = _ActiveSpectrum.GetAmplitude(_Wavelengths[i], _ComponentsPerOctave, windSpeed, out _Powers[i]); + var amp = _ActiveSpectrum.GetAmplitude(_Wavelengths[i], _ComponentsPerOctave, windSpeed, water.Gravity, out _Powers[i]); _Amplitudes[i] = Random.value * amp; - _Amplitudes2[i] = Random.value * amp * _ReverseWaveWeight; + _Amplitudes2[i] = Random.value * amp * ReverseWaveWeight; } } @@ -490,8 +595,6 @@ namespace WaveHarmonic.Crest } } - private protected override void DestroySharedResources() { } - #if UNITY_EDITOR void OnGUI() { @@ -503,16 +606,44 @@ namespace WaveHarmonic.Crest #endif } + partial class ShapeGerstner + { + static int s_InstanceCount; + + private protected override void Awake() + { + base.Awake(); + s_InstanceCount++; + } + + private protected override void OnDestroy() + { + base.OnDestroy(); + + if (s_SwellSpectrum != null) + { + Helpers.Destroy(s_SwellSpectrum); + } + } + } + partial class ShapeGerstner : ISerializationCallbackReceiver { [SerializeField, HideInInspector] #pragma warning disable 414 - int _Version = 1; + int _Version = 2; #pragma warning restore 414 void ISerializationCallbackReceiver.OnAfterDeserialize() { _Version = MigrateV1(_Version); + + if (_Version < 2) + { + _Swell = false; + } + + _Version = MigrateV2(_Version); } void ISerializationCallbackReceiver.OnBeforeSerialize() diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeWaves.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeWaves.cs index 14a131d02..38a952124 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeWaves.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/Shape/ShapeWaves.cs @@ -18,7 +18,7 @@ namespace WaveHarmonic.Crest [@Heading("Waves")] [Tooltip("The spectrum that defines the water surface shape.")] - [@Embedded] + [@Embedded(defaultPropertyName: nameof(_ActiveSpectrum))] [@GenerateAPI] [SerializeField] internal WaveSpectrum _Spectrum; @@ -35,17 +35,25 @@ namespace WaveHarmonic.Crest [SerializeField] float _RespectShallowWaterAttenuation = 1f; + [Tooltip("Whether to use the wind direction on this component rather than the global wind direction.\n\nGlobal wind direction comes from the Water Renderer component.")] + [@GenerateAPI] + [@InlineToggle, SerializeField] + bool _OverrideGlobalWindDirection; + + [@Label("Wind Direction")] [Tooltip("Primary wave direction heading (degrees).\n\nThis is the angle from x axis in degrees that the waves are oriented towards. If a spline is being used to place the waves, this angle is relative to the spline.")] [@Predicated(nameof(_Mode), inverted: false, nameof(LodInputMode.Paint))] + [@Predicated(nameof(_OverrideGlobalWindDirection), hide: true)] + [@ShowComputedProperty(nameof(WaveDirectionHeadingAngle))] [@Range(-180, 180)] - [@GenerateAPI] + [@GenerateAPI(Getter.Custom)] [SerializeField] private protected float _WaveDirectionHeadingAngle = 0f; [Tooltip("Whether to use the wind speed on this component rather than the global wind speed.\n\nGlobal wind speed comes from the Water Renderer component.")] [@GenerateAPI] - [SerializeField] - bool _OverrideGlobalWindSpeed = false; + [@InlineToggle, SerializeField] + bool _OverrideGlobalWindSpeed; [Tooltip("Wind speed in km/h. Controls wave conditions.")] [@ShowComputedProperty(nameof(WindSpeedKPH))] @@ -86,19 +94,21 @@ namespace WaveHarmonic.Crest public static readonly int s_AxisX = Shader.PropertyToID("_Crest_AxisX"); } - static WaveSpectrum s_DefaultSpectrum; - private protected static WaveSpectrum DefaultSpectrum + private protected virtual WaveSpectrum DefaultSpectrum => WindSpectrum; + + static WaveSpectrum s_WindSpectrum; + private protected static WaveSpectrum WindSpectrum { get { - if (s_DefaultSpectrum == null) + if (s_WindSpectrum == null) { - s_DefaultSpectrum = ScriptableObject.CreateInstance(); - s_DefaultSpectrum.name = "Default Waves (instance)"; - s_DefaultSpectrum.hideFlags = HideFlags.DontSave | HideFlags.NotEditable; + s_WindSpectrum = ScriptableObject.CreateInstance(); + s_WindSpectrum.name = "Wind Waves (instance)"; + s_WindSpectrum.hideFlags = HideFlags.DontSave | HideFlags.NotEditable; } - return s_DefaultSpectrum; + return s_WindSpectrum; } } @@ -113,7 +123,7 @@ namespace WaveHarmonic.Crest internal static int s_RenderPassOverride = -1; private protected WaveSpectrum _ActiveSpectrum = null; - private protected Vector2 PrimaryWaveDirection => new(Mathf.Cos(Mathf.PI * _WaveDirectionHeadingAngle / 180f), Mathf.Sin(Mathf.PI * _WaveDirectionHeadingAngle / 180f)); + private protected Vector2 PrimaryWaveDirection => new(Mathf.Cos(Mathf.PI * WaveDirectionHeadingAngle / 180f), Mathf.Sin(Mathf.PI * WaveDirectionHeadingAngle / 180f)); /// /// The wind speed in kilometers per hour (KPH). @@ -121,7 +131,7 @@ namespace WaveHarmonic.Crest /// /// Wind speed can come from this component or the . /// - public float WindSpeedKPH => _OverrideGlobalWindSpeed || WaterRenderer.Instance == null ? _WindSpeed : WaterRenderer.Instance.WindSpeedKPH; + public float WindSpeedKPH => _OverrideGlobalWindSpeed || WaterRenderer.Instance == null ? _WindSpeed : WaterRenderer.Instance.WindSpeed; /// /// The wind speed in meters per second (MPS). @@ -301,7 +311,7 @@ namespace WaveHarmonic.Crest // Wave generation done in Draw. Keeps track to limit to once per frame. private protected int _LastGenerateFrameCount = -1; - internal override bool Enabled => _FirstCascade > -1 && WaterRenderer.Instance.Gravity != 0f && Mode switch + internal override bool Enabled => _FirstCascade > -1 && (WaterRenderer.Instance == null || WaterRenderer.Instance.Gravity != 0f) && Mode switch { LodInputMode.Global => enabled && s_TransferWavesComputeShader != null, _ => base.Enabled, @@ -324,7 +334,6 @@ namespace WaveHarmonic.Crest private protected float MaximumReportedVerticalDisplacement { get; set; } private protected float MaximumReportedWavesDisplacement { get; set; } - static int s_InstanceCount = 0; private protected bool UpdateDataEachFrame { @@ -349,7 +358,6 @@ namespace WaveHarmonic.Crest } private protected abstract void ReportMaxDisplacement(WaterRenderer water); - private protected abstract void DestroySharedResources(); private protected override void OnUpdate(WaterRenderer water) { @@ -367,26 +375,6 @@ namespace WaveHarmonic.Crest wrapper.SetFloat(ShaderIDs.s_MaximumAttenuationDepth, water._AnimatedWavesLod.ShallowsMaximumDepth); } - private protected override void Awake() - { - base.Awake(); - s_InstanceCount++; - } - - private protected void OnDestroy() - { - // Since FFTCompute resources are shared we will clear after last ShapeFFT is destroyed. - if (--s_InstanceCount <= 0) - { - DestroySharedResources(); - - if (s_DefaultSpectrum != null) - { - Helpers.Destroy(s_DefaultSpectrum); - } - } - } - private protected override void Initialize() { base.Initialize(); @@ -441,6 +429,11 @@ namespace WaveHarmonic.Crest return false; } + + float GetWaveDirectionHeadingAngle() + { + return _OverrideGlobalWindDirection || WaterRenderer.Instance == null ? _WaveDirectionHeadingAngle : WaterRenderer.Instance.WindDirection; + } } partial class ShapeWaves @@ -455,6 +448,28 @@ namespace WaveHarmonic.Crest } } + partial class ShapeWaves + { + static int s_InstanceCount = 0; + + private protected override void Awake() + { + base.Awake(); + s_InstanceCount++; + } + + private protected virtual void OnDestroy() + { + if (--s_InstanceCount <= 0) + { + if (s_WindSpectrum != null) + { + Helpers.Destroy(s_WindSpectrum); + } + } + } + } + partial class ShapeWaves { [HideInInspector, SerializeField] @@ -486,5 +501,34 @@ namespace WaveHarmonic.Crest return version; } + + private protected int MigrateV2(int version) + { + // Version 2 + // - Global wind direction + if (version < 2) + { + _OverrideGlobalWindDirection = true; + version = 2; + } + + return version; + } } + +#if UNITY_EDITOR + partial class ShapeWaves + { + private protected override void Reset() + { + base.Reset(); + + if (_Mode != LodInputMode.Global) + { + _OverrideGlobalWindSpeed = true; + _OverrideGlobalWindDirection = true; + } + } + } +#endif } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/SphereWaterInteraction.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/SphereWaterInteraction.cs index 290608d36..f12b4f83f 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/SphereWaterInteraction.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/SphereWaterInteraction.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/TextureLodInputData.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/TextureLodInputData.cs index e7238b257..e225608a4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/TextureLodInputData.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/TextureLodInputData.cs @@ -18,6 +18,11 @@ namespace WaveHarmonic.Crest [@DecoratedField, SerializeField] internal Texture _Texture; + [Tooltip("Multiplies the texture sample.\n\nThis is useful for normalized textures. The four components map to the four color/alpha components of the texture (if they exist).\n\nIf you just want to fade out the input, consider using weight instead.")] + [@GenerateAPI] + [@DecoratedField, SerializeField] + Vector4 _Multiplier = Vector4.one; + private protected abstract ComputeShader TextureShader { get; } internal override bool IsEnabled => _Texture != null; internal override bool HasHeightRange => false; @@ -41,6 +46,7 @@ namespace WaveHarmonic.Crest wrapper.SetVector(ShaderIDs.s_TexturePosition, transform.position.XZ()); wrapper.SetVector(ShaderIDs.s_TextureRotation, rotation); wrapper.SetVector(ShaderIDs.s_Resolution, new(_Texture.width, _Texture.height)); + wrapper.SetVector(ShaderIDs.s_Multiplier, _Multiplier); wrapper.SetFloat(ShaderIDs.s_FeatherWidth, _Input.FeatherWidth); wrapper.SetTexture(ShaderIDs.s_Texture, _Texture); wrapper.SetInteger(ShaderIDs.s_Blend, (int)_Input.Blend); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/WatertightHull.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/WatertightHull.cs index 350568d83..422103176 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/WatertightHull.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/WatertightHull.cs @@ -13,17 +13,14 @@ namespace WaveHarmonic.Crest /// /// Each mode has its strengths and weaknesses. /// + [@GenerateDoc] public enum WatertightHullMode { - /// - /// Uses to remove water. - /// + /// [Tooltip("Use displacement to remove water.\n\nUsing displacement will also affect the underwater and can nest bouyant objects. Requires the displacement layer to be enabled.")] Displacement, - /// - /// Uses to remove water. - /// + /// [Tooltip("Clips the surface to remove water.\n\nThis option is more precise and can be submerged.")] Clip, } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/LevelLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/LevelLod.cs index f90e4967d..80ef07eb6 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/LevelLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/LevelLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // We do not add height to displacement directly for better precision and layering. @@ -21,7 +21,6 @@ namespace WaveHarmonic.Crest internal override Color GizmoColor => s_GizmoColor; private protected override Color ClearColor => Color.black; private protected override bool NeedToReadWriteTextureData => true; - internal override bool RunsInHeadless => true; private protected override GraphicsFormat RequestedTextureFormat => _TextureFormatMode switch { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Lod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Lod.cs index 323028631..6608109ec 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Lod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Lod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -18,32 +18,23 @@ namespace WaveHarmonic.Crest /// /// Texture format preset. /// + [@GenerateDoc] public enum LodTextureFormatMode { - /// - /// Uses . - /// + /// + [Tooltip("Uses the Texture Format property.")] Manual, - /// - /// Chooses a texture format for performance. - /// + /// + [Tooltip("Chooses a texture format for performance.")] Performance = 100, - /// - /// Chooses a texture format for precision. - /// - /// - /// This format can reduce artifacts. - /// + /// + [Tooltip("Chooses a texture format for precision.\n\nThis format can reduce artifacts.")] Precision = 200, - /// - /// Chooses a texture format based on another. - /// - /// - /// For example, Dynamic Waves will match precision of Animated Waves. - /// + /// + [Tooltip("Chooses a texture format based on another.\n\nFor example, Dynamic Waves will match precision of Animated Waves.")] Automatic = 300, } @@ -61,11 +52,13 @@ namespace WaveHarmonic.Crest [Tooltip("Whether to override the resolution.\n\nIf not enabled, then the simulation will use the resolution defined on the Water Renderer.")] [@Predicated(typeof(AnimatedWavesLod), inverted: true, hide: true)] [@GenerateAPI(Setter.Dirty)] - [@DecoratedField, SerializeField] + [@InlineToggle(fix: true), SerializeField] internal bool _OverrideResolution = true; [Tooltip("The resolution of the simulation data.\n\nSet higher for sharper results at the cost of higher memory usage.")] [@Predicated(typeof(AnimatedWavesLod), inverted: true, hide: true)] + [@Predicated(nameof(_OverrideResolution), hide: true)] + [@ShowComputedProperty(nameof(Resolution))] [@Delayed] [@GenerateAPI(Getter.Custom, Setter.Dirty)] [SerializeField] @@ -151,8 +144,6 @@ namespace WaveHarmonic.Crest // Always use linear filtering. GraphicsFormatUsage.Linear; - internal virtual bool RunsInHeadless => false; - private protected BufferedData _Targets; internal RenderTexture DataTexture => _Targets.Current; internal RenderTexture GetDataTexture(int frameDelta) => _Targets.Previous(frameDelta); @@ -218,8 +209,14 @@ namespace WaveHarmonic.Crest ReAllocate(); } - _Targets.Flip(); - _SamplingParameters.Flip(); +#if UNITY_EDITOR + // Fixes flickering in frame debugger when navigating draw calls. + if (!UnityEditor.EditorApplication.isPaused || Time.deltaTime > 0) +#endif + { + _Targets.Flip(); + _SamplingParameters.Flip(); + } UpdateSamplingParameters(); } @@ -245,12 +242,11 @@ namespace WaveHarmonic.Crest { FlipBuffers(); - buffer.BeginSample(Name); + buffer.BeginSample(ID); if (_TargetsToClear > 0 || AlwaysClear) { - buffer.SetRenderTarget(DataTexture, 0, CubemapFace.Unknown, -1); - buffer.ClearRenderTarget(RTClearFlags.Color, ClearColor, 0, 0); + CoreUtils.SetRenderTarget(buffer, DataTexture, ClearFlag.Color, ClearColor); _TargetsToClear--; } @@ -270,7 +266,7 @@ namespace WaveHarmonic.Crest Queryable?.UpdateQueries(_Water); - buffer.EndSample(Name); + buffer.EndSample(ID); } private protected bool SubmitDraws(CommandBuffer buffer, Inputs draws, RenderTargetIdentifier target, int pass = -1, bool filter = false) @@ -323,8 +319,8 @@ namespace WaveHarmonic.Crest // Parameters override RTI values: // https://docs.unity3d.com/ScriptReference/Rendering.CommandBuffer.SetRenderTarget.html - buffer.SetRenderTarget(target, 0, CubemapFace.Unknown, slice); - buffer.SetGlobalInt(ShaderIDs.s_LodIndex, slice); + CoreUtils.SetRenderTarget(buffer, target, depthSlice: slice); + buffer.SetGlobalInteger(ShaderIDs.s_LodIndex, slice); // This will work for CG but not for HDRP hlsl files. buffer.SetViewProjectionMatrices(_ViewMatrices[slice], _Water.GetProjectionMatrix(slice)); @@ -373,24 +369,35 @@ namespace WaveHarmonic.Crest wrapper.Dispatch(1, size, 1); } - void UpdateSamplingParameters() + void UpdateSamplingParameters(bool initialize = false) { - for (var slice = 0; slice < Slices; slice++) + var position = _Water.Position; + var resolution = _Enabled ? Resolution : TextureArrayHelpers.k_SmallTextureSize; + + var parameters = _SamplingParameters.Current; + var levels = Slices; + + for (var slice = 0; slice < levels; slice++) { // Find snap period. - var texel = 2f * 2f * _Water.CalcLodScale(slice) / Resolution; + var texel = 2f * 2f * _Water._CascadeData.Current[slice].x / resolution; // Snap so that shape texels are stationary. - var snapped = _Water.Root.position - new Vector3(Mathf.Repeat(_Water.Root.position.x, texel), 0, Mathf.Repeat(_Water.Root.position.z, texel)); + var snapped = position - new Vector3(Mathf.Repeat(position.x, texel), 0, Mathf.Repeat(position.z, texel)); - var cascade = new Cascade(snapped.XZ(), texel, Resolution); + var cascade = new Cascade(snapped.XZ(), texel, resolution); _Cascades[slice] = cascade; - _SamplingParameters.Current[slice] = cascade.Packed; + parameters[slice] = cascade.Packed; + if (initialize && BufferCount > 1) _SamplingParameters.Previous(1)[slice] = cascade.Packed; _ViewMatrices[slice] = WaterRenderer.CalculateViewMatrixFromSnappedPositionRHS(snapped); } - Shader.SetGlobalVector(_SamplingParametersShaderID, new(_Water.LodLevels, Resolution, 1f / Resolution, 0)); - Shader.SetGlobalVectorArray(_SamplingParametersCascadeShaderID, _SamplingParameters.Current); + if (initialize) + { + Shader.SetGlobalVector(_SamplingParametersShaderID, new(levels, resolution, 1f / resolution, 0)); + } + + Shader.SetGlobalVectorArray(_SamplingParametersCascadeShaderID, parameters); if (BufferCount > 1) { @@ -490,13 +497,6 @@ namespace WaveHarmonic.Crest return; } - // Some simulations are pointless in non-interactive mode. - if (_Water.IsRunningHeadless && !RunsInHeadless) - { - _Valid = false; - return; - } - // Validate textures. { // Find a compatible texture format. @@ -522,6 +522,21 @@ namespace WaveHarmonic.Crest if (_Water.IsRunningWithoutGraphics) return; // Bind/unbind data texture for all shaders. Shader.SetGlobalTexture(_TextureShaderID, enable && Enabled ? DataTexture : NullTexture); + + if (BufferCount > 1) + { + Shader.SetGlobalTexture(_TextureSourceShaderID, enable && Enabled ? GetDataTexture(1) : NullTexture); + } + + if (_SamplingParameters == null || _SamplingParameters.Size != BufferCount) + { + _SamplingParameters = new(BufferCount, () => new Vector4[k_MaximumSlices]); + } + + // For safety. Disable to see if we are sampling outside of LOD chain. + _SamplingParameters.RunLambda(x => System.Array.Fill(x, Vector4.zero)); + + UpdateSamplingParameters(initialize: true); } internal virtual void Enable() @@ -545,13 +560,16 @@ namespace WaveHarmonic.Crest }); } + internal virtual void AfterExecute() + { + + } + private protected virtual void Allocate() { _Targets = new(BufferCount, CreateLodDataTextures); _Targets.RunLambda(Clear); - _SamplingParameters = new(BufferCount, () => new Vector4[k_MaximumSlices]); - // Bind globally once here on init, which will bind to all graphics shaders (not compute) Shader.SetGlobalTexture(_TextureShaderID, DataTexture); @@ -580,7 +598,7 @@ namespace WaveHarmonic.Crest SetGlobals(current); } - int GetResolution() => _OverrideResolution ? _Resolution : Water.LodResolution; + int GetResolution() => _OverrideResolution || Water == null ? _Resolution : Water.LodResolution; private protected void ReAllocate() { @@ -597,6 +615,8 @@ namespace WaveHarmonic.Crest }); _ReAllocateTexture = false; + + UpdateSamplingParameters(initialize: true); } #if UNITY_EDITOR @@ -641,6 +661,7 @@ namespace WaveHarmonic.Crest /// Base type for simulations with a provider. /// /// The query provider. + [System.Serializable] public abstract class Lod : Lod where T : IQueryProvider { /// @@ -662,5 +683,10 @@ namespace WaveHarmonic.Crest // None providers are not IQueryable. Queryable = Provider as IQueryable; } + + internal override void AfterExecute() + { + Queryable?.SendReadBack(_Water); + } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/PersistentLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/PersistentLod.cs index a9765c356..74b1083fc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/PersistentLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/PersistentLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -9,6 +9,7 @@ namespace WaveHarmonic.Crest /// /// A persistent simulation that moves around with a displacement LOD. /// + [System.Serializable] public abstract partial class PersistentLod : Lod { [Tooltip("Frequency to run the simulation, in updates per second.\n\nLower frequencies are more efficient but may lead to visible jitter or slowness.")] @@ -37,6 +38,8 @@ namespace WaveHarmonic.Crest internal int LastUpdateSubstepCount { get; private set; } + private protected virtual int Kernel => 0; + private protected virtual bool SkipFlipBuffers => false; private protected abstract ComputeShader SimulationShader { get; } private protected abstract void GetSubstepData(float timeToSimulate, out int substeps, out float delta); @@ -61,9 +64,12 @@ namespace WaveHarmonic.Crest internal override void BuildCommandBuffer(WaterRenderer water, CommandBuffer buffer) { - buffer.BeginSample(Name); + buffer.BeginSample(ID); - FlipBuffers(); + if (!SkipFlipBuffers) + { + FlipBuffers(); + } var slices = water.LodLevels; @@ -91,19 +97,19 @@ namespace WaveHarmonic.Crest // artifacts if not and there is a renderer input. Happens for foam and dynamic // waves. Confusing/concerning. buffer.GetTemporaryRT(ShaderIDs.s_TemporaryPersistentTarget, DataTexture.descriptor); - buffer.SetRenderTarget(ShaderIDs.s_TemporaryPersistentTarget, 0, CubemapFace.Unknown, -1); - buffer.ClearRenderTarget(RTClearFlags.Color, ClearColor, 0, 0); + CoreUtils.SetRenderTarget(buffer, ShaderIDs.s_TemporaryPersistentTarget, ClearFlag.Color, ClearColor); } var target = new RenderTargetIdentifier(DataTexture); var source = new RenderTargetIdentifier(ShaderIDs.s_TemporaryPersistentTarget); var current = target; + var wrapper = new PropertyWrapperCompute(buffer, SimulationShader, Kernel); + for (var substep = 0; substep < substeps; substep++) { var isFirstStep = substep == 0; var frame = isFirstStep ? 1 : 0; - var wrapper = new PropertyWrapperCompute(buffer, SimulationShader, 0); // Record how much we caught up _TimeToSimulate -= delta; @@ -168,14 +174,15 @@ namespace WaveHarmonic.Crest // Set the target texture as to make sure we catch the 'pong' each frame. Shader.SetGlobalTexture(_TextureShaderID, DataTexture); - buffer.EndSample(Name); + buffer.EndSample(ID); } /// /// Set any simulation specific shader parameters. /// - private protected virtual void SetAdditionalSimulationParameters(T properties) where T : IPropertyWrapper + private protected virtual void SetAdditionalSimulationParameters(PropertyWrapperCompute properties) { + } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionAreaVisualizer.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionAreaVisualizer.cs index dfd3b922c..227542e12 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionAreaVisualizer.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionAreaVisualizer.cs @@ -1,8 +1,9 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; using WaveHarmonic.Crest.Internal; +using WaveHarmonic.Crest.Utility; namespace WaveHarmonic.Crest { @@ -84,60 +85,46 @@ namespace WaveHarmonic.Crest } } - if (_UseDisplacements) + var success = _UseDisplacements + ? collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultDisplacements, _UseNormals ? _ResultNormals : null, null, _Layer)) + : collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultHeights, _UseNormals ? _ResultNormals : null, null, _Layer)); + +#if !UNITY_EDITOR + // Gizmos handle this in editor. + if (success) { - if (collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultDisplacements, _UseNormals ? _ResultNormals : null, null, _Layer))) - { - for (var i = 0; i < _Steps; i++) - { - for (var j = 0; j < _Steps; j++) - { - var result = _SamplePositions[j * _Steps + i]; - result.y = water.SeaLevel; - result += _ResultDisplacements[j * _Steps + i]; - - var norm = _UseNormals ? _ResultNormals[j * _Steps + i] : Vector3.up; - - DebugDrawCross(result, norm, Mathf.Min(_StepSize / 4f, 1f), Color.green); - } - } - } - } - else - { - if (collProvider.RetrieveSucceeded(collProvider.Query(GetHashCode(), _ObjectWidth, _SamplePositions, _ResultHeights, _UseNormals ? _ResultNormals : null, null, _Layer))) - { - for (var i = 0; i < _Steps; i++) - { - for (var j = 0; j < _Steps; j++) - { - var result = _SamplePositions[j * _Steps + i]; - result.y = _ResultHeights[j * _Steps + i]; - - var norm = _UseNormals ? _ResultNormals[j * _Steps + i] : Vector3.up; - - DebugDrawCross(result, norm, Mathf.Min(_StepSize / 4f, 1f), Color.green); - } - } - } + Render(water, Debug.DrawLine); } +#endif } - public static void DebugDrawCross(Vector3 pos, float r, Color col, float duration = 0f) + internal void Render(WaterRenderer water, DebugUtility.DrawLine draw) { - Debug.DrawLine(pos - Vector3.up * r, pos + Vector3.up * r, col, duration); - Debug.DrawLine(pos - Vector3.right * r, pos + Vector3.right * r, col, duration); - Debug.DrawLine(pos - Vector3.forward * r, pos + Vector3.forward * r, col, duration); - } + if (_SamplePositions == null) + { + return; + } - public static void DebugDrawCross(Vector3 pos, Vector3 up, float r, Color col, float duration = 0f) - { - up.Normalize(); - var right = Vector3.Normalize(Vector3.Cross(up, Vector3.forward)); - var forward = Vector3.Cross(up, right); - Debug.DrawLine(pos - up * r, pos + up * r, col, duration); - Debug.DrawLine(pos - right * r, pos + right * r, col, duration); - Debug.DrawLine(pos - forward * r, pos + forward * r, col, duration); + for (var i = 0; i < _Steps; i++) + { + for (var j = 0; j < _Steps; j++) + { + var result = _SamplePositions[j * _Steps + i]; + + if (_UseDisplacements) + { + result.y = water.SeaLevel; + result += _ResultDisplacements[j * _Steps + i]; + } + else + { + result.y = _ResultHeights[j * _Steps + i]; + } + + var normal = _UseNormals ? _ResultNormals[j * _Steps + i] : Vector3.up; + DebugUtility.DrawCross(draw, result, normal, Mathf.Min(_StepSize / 4f, 1f), Color.green); + } + } } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionProvider.cs index 2bc43cc94..e5ba95825 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // NOTE: DWP2 depends on this file. Any API changes need to be communicated to the DWP2 authors in advance. @@ -13,23 +13,18 @@ namespace WaveHarmonic.Crest /// /// A layer/event where queries are executed. /// + [@GenerateDoc] public enum CollisionLayer { - /// - /// Include all displacement. - /// + /// [Tooltip("Include all displacement.")] Everything, - /// - /// Only include Animated Waves. - /// + /// [Tooltip("Only include Animated Waves.")] AfterAnimatedWaves, - /// - /// Include Animated Waves and Dynamic Waves. - /// + /// [Tooltip("Include Animated Waves and Dynamic Waves.")] AfterDynamicWaves, } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionQuery.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionQuery.cs index 5bddbf916..d8f4dfa6d 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionQuery.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/CollisionQuery.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -82,27 +82,28 @@ namespace WaveHarmonic.Crest { var layers = _Water.AnimatedWavesLod._CollisionLayers; + // Displacement is the fallback if there are no layers (ie single layer). if (layers == CollisionLayers.Nothing) { return _Displacement; } - if (layer == CollisionLayer.Everything) + var everything = layer == CollisionLayer.Everything; + + // Displacement is the final layer, if present. + if (everything && layers.HasFlag(CollisionLayers.Displacement)) { - if (layers.HasFlag(CollisionLayers.Displacement)) - { - return _Displacement; - } + return _Displacement; } - if (layer >= CollisionLayer.AfterDynamicWaves) + // Chosen/fallback to Dynamic Waves. + if ((everything || layer >= CollisionLayer.AfterDynamicWaves) && + layers.HasFlag(CollisionLayers.DynamicWaves) && _Water.DynamicWavesLod.Enabled) { - if (layers.HasFlag(CollisionLayers.DynamicWaves) && _Water.DynamicWavesLod.Enabled) - { - return _DynamicWaves; - } + return _DynamicWaves; } + // If not single layer, this is always present. return _AnimatedWaves; } @@ -131,6 +132,19 @@ namespace WaveHarmonic.Crest _Displacement.UpdateQueries(water); } + public void SendReadBack(WaterRenderer water, CollisionLayers layers) + { + // Will only submit readback if there are queries. + _AnimatedWaves.SendReadBack(water); + _DynamicWaves.SendReadBack(water); + _Displacement.SendReadBack(water); + } + + public void SendReadBack(WaterRenderer water) + { + _Displacement.SendReadBack(water); + } + public void CleanUp() { _AnimatedWaves.CleanUp(); @@ -143,6 +157,7 @@ namespace WaveHarmonic.Crest { public static void UpdateQueries(this ICollisionProvider self, WaterRenderer water, CollisionLayer layer) => (self as CollisionQueryWithPasses)?.UpdateQueries(water, layer); public static void UpdateQueries(this ICollisionProvider self, WaterRenderer water) => (self as IQueryable)?.UpdateQueries(water); + public static void SendReadBack(this ICollisionProvider self, WaterRenderer water, CollisionLayers layer) => (self as CollisionQueryWithPasses)?.SendReadBack(water, layer); public static void CleanUp(this ICollisionProvider self) => (self as IQueryable)?.CleanUp(); } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceHelper.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceHelper.cs index db8ace44f..28b23f318 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceHelper.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceHelper.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceVisualizer.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceVisualizer.cs index 629bc1023..aacb94177 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceVisualizer.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Collision/RayTraceVisualizer.cs @@ -1,8 +1,9 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; using WaveHarmonic.Crest.Internal; +using WaveHarmonic.Crest.Utility; namespace WaveHarmonic.Crest { @@ -33,7 +34,7 @@ namespace WaveHarmonic.Crest { var endPos = transform.position + transform.forward * dist; Debug.DrawLine(transform.position, endPos, Color.green); - CollisionAreaVisualizer.DebugDrawCross(endPos, 2f, Color.green, 0f); + DebugUtility.DrawCross(Debug.DrawLine, endPos, 2f, Color.green, 0f); } else { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthProvider.cs index 9df5c3458..acaa35535 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthQuery.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthQuery.cs index 7f62dbae1..aaf71d6c1 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthQuery.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Depth/DepthQuery.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowProvider.cs index 7a23be980..ac3e4df91 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowQuery.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowQuery.cs index 67a95b7bf..36ffacebd 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowQuery.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Flow/FlowQuery.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. namespace WaveHarmonic.Crest diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Query.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Query.cs index 618abda01..f2f85bead 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Query.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/Query.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Potential improvements @@ -43,6 +43,7 @@ namespace WaveHarmonic.Crest int RequestCount { get; } int QueryCount { get; } void UpdateQueries(WaterRenderer water); + void SendReadBack(WaterRenderer water); void CleanUp(); } @@ -512,7 +513,20 @@ namespace WaveHarmonic.Crest if (_SegmentRegistrarRingBuffer.Current._QueryCount > 0) { ExecuteQueries(); + } + } + public void SendReadBack(WaterRenderer water) + { +#if UNITY_EDITOR + // Seems to be a terrible memory leak coming from creating async GPU readbacks. + // This was marked as resolved by Unity and confirmed fixed by forum posts. + // May be worth keeping. See issue #630 for more details. + if (!water._HeightQueries && !Application.isPlaying) return; +#endif + + if (_SegmentRegistrarRingBuffer.Current._QueryCount > 0) + { // Remove oldest requests if we have hit the limit while (_Requests.Count >= k_MaximumRequests) { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/QueryEvents.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/QueryEvents.cs index b05134751..504b3e154 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/QueryEvents.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/QueryEvents.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -10,19 +10,15 @@ namespace WaveHarmonic.Crest /// /// What transform to use for queries. /// + [@GenerateDoc] public enum QuerySource { - /// - /// This game object's transform. - /// + /// + [Tooltip("This game object's transform.")] Transform, - /// - /// The viewer's transform. - /// - /// - /// The viewer is the main camera the system uses. - /// + /// + [Tooltip("The viewer's transform.\n\nThe viewer is the main camera the system uses.")] Viewer } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/SamplingHelpers.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/SamplingHelpers.cs index bc1930725..efff75dd7 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/SamplingHelpers.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Query/SamplingHelpers.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -226,7 +226,7 @@ namespace WaveHarmonic.Crest public bool Sample(Vector3 position, out Vector2 flow, float minimumLength = 0f) { var water = WaterRenderer.Instance; - var flowProvider = WaterRenderer.Instance == null ? null : water.FlowLod.Provider; + var flowProvider = water == null ? null : water.FlowLod.Provider; if (flowProvider == null) { @@ -262,7 +262,7 @@ namespace WaveHarmonic.Crest bool Sample(Vector3 position, out Vector2 result) { var water = WaterRenderer.Instance; - var depthProvider = WaterRenderer.Instance == null ? null : water.DepthLod.Provider; + var depthProvider = water == null ? null : water.DepthLod.Provider; if (depthProvider == null) { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsHDRP.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsHDRP.cs index 361e5e395..ca0e427d3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsHDRP.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsHDRP.cs @@ -1,10 +1,8 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if d_UnityHDRP -using UnityEditor; -using UnityEngine; using UnityEngine.Rendering.HighDefinition; namespace WaveHarmonic.Crest @@ -14,36 +12,20 @@ namespace WaveHarmonic.Crest static SampleShadowsHDRP s_Instance; static readonly string s_Name = "Sample Shadows"; - // These values come from unity_MatrxVP value in the frame debugger. unity_MatrxVP is marked as legacy and - // breaks XR SPI. It is defined in: - // "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/EditorShaderVariables.hlsl" - static readonly Matrix4x4 s_Matrix = new - ( - new(2f, 0f, 0f, 0f), - new(0f, -2f, 0f, 0f), - new(0f, 0f, 0.00990099f, 0f), - new(-1f, 1f, 0.990099f, 1f) - ); - - static class ShaderIDs - { - public static readonly int s_ViewProjectionMatrix = Shader.PropertyToID("_Crest_ViewProjectionMatrix"); - } - - GameObject _GameObject; + WaterRenderer _Water; int _XrTargetEyeIndex = -1; protected override void Execute(CustomPassContext context) { - var water = WaterRenderer.Instance; + var water = _Water; - if (water == null || !water._ShadowLod.Enabled) + if (!water._ShadowLod.Enabled) { return; } #if UNITY_EDITOR - if (!WaterRenderer.IsWithinEditorUpdate || EditorApplication.isPaused) + if (!WaterRenderer.IsWithinEditorUpdate) { return; } @@ -58,36 +40,19 @@ namespace WaveHarmonic.Crest camera.TryGetComponent(out var cameraData); - if (cameraData != null && cameraData.xrRendering) + // Skip the right eye for multi-pass as data is not stereo. + if (Rendering.HDRP.SkipPassXR(ref _XrTargetEyeIndex, cameraData)) { - XRHelpers.UpdatePassIndex(ref _XrTargetEyeIndex); - - // Skip the right eye as data is not stereo. - if (_XrTargetEyeIndex == 1) - { - return; - } + return; } // Disable for XR SPI otherwise input will not have correct world position. - if (cameraData != null && cameraData.xrRendering && XRHelpers.IsSinglePass) - { - context.cmd.DisableShaderKeyword("STEREO_INSTANCING_ON"); - } + Rendering.HDRP.DisableXR(context.cmd, cameraData); - // We cannot seem to override this matrix so a reference manually. - context.cmd.SetGlobalMatrix(ShaderIDs.s_ViewProjectionMatrix, s_Matrix); water._ShadowLod.BuildCommandBuffer(water, context.cmd); - // Restore matrices otherwise remaining render will have incorrect matrices. Each pass is responsible for - // restoring matrices if required. - context.cmd.SetViewProjectionMatrices(camera.worldToCameraMatrix, camera.projectionMatrix); - // Restore XR SPI as we cannot rely on remaining pipeline to do it for us. - if (cameraData != null && cameraData.xrRendering && XRHelpers.IsSinglePass) - { - context.cmd.EnableShaderKeyword("STEREO_INSTANCING_ON"); - } + Rendering.HDRP.EnableXR(context.cmd, cameraData); } internal static void Enable(WaterRenderer water) @@ -103,11 +68,12 @@ namespace WaveHarmonic.Crest ( gameObject, ref s_Instance, - s_Name, - CustomPassInjectionPoint.BeforeTransparent + WaterRenderer.k_DrawLodData, + // Earliest point after shadow maps have populated. + CustomPassInjectionPoint.AfterOpaqueAndSky ); - s_Instance._GameObject = gameObject; + s_Instance._Water = water; } internal static void Disable() diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.RenderGraph.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.RenderGraph.cs index b3cfeb8db..de8c6757e 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.RenderGraph.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.RenderGraph.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if d_UnityURP @@ -32,7 +32,7 @@ namespace WaveHarmonic.Crest public override void RecordRenderGraph(RenderGraph graph, ContextContainer frame) { - using (var builder = graph.AddUnsafePass(k_Name, out var data)) + using (var builder = graph.AddUnsafePass(WaterRenderer.k_DrawLodData, out var data)) { data.Init(frame, builder); builder.AllowPassCulling(false); @@ -49,7 +49,7 @@ namespace WaveHarmonic.Crest public override void Execute(ScriptableRenderContext context, ref RenderingData data) { _PassData.Init(data.GetFrameData()); - var buffer = CommandBufferPool.Get(k_Name); + var buffer = CommandBufferPool.Get(WaterRenderer.k_DrawLodData); Execute(context, buffer, _PassData); context.ExecuteCommandBuffer(buffer); CommandBufferPool.Release(buffer); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.cs index aaa8a0f33..7bae8db40 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/SampleShadowsURP.cs @@ -1,9 +1,8 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if d_UnityURP -using UnityEditor; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; @@ -12,55 +11,38 @@ namespace WaveHarmonic.Crest { sealed partial class SampleShadowsURP : ScriptableRenderPass { - const string k_Name = "Crest Shadow Data"; - static SampleShadowsURP s_Instance; internal static bool Created => s_Instance != null; + WaterRenderer _Water; + SampleShadowsURP(RenderPassEvent renderPassEvent) { this.renderPassEvent = renderPassEvent; } - internal static void Enable() + internal static void Enable(WaterRenderer water) { - s_Instance ??= new(RenderPassEvent.AfterRenderingSkybox); - - RenderPipelineManager.beginCameraRendering -= EnqueuePass; - RenderPipelineManager.beginCameraRendering += EnqueuePass; - - RenderPipelineManager.activeRenderPipelineTypeChanged -= s_Instance.OnActiveRenderPipelineTypeChanged; - RenderPipelineManager.activeRenderPipelineTypeChanged += s_Instance.OnActiveRenderPipelineTypeChanged; + s_Instance ??= new(RenderPassEvent.AfterRenderingShadows); + s_Instance._Water = water; } - internal static void Disable() + internal static void EnqueuePass(ScriptableRenderContext context, Camera camera) { - // TODO: Currently on RP change this method can be called with Enable ever being called leading to null - // exceptions. It can be removed once those problems are sorted. - if (s_Instance != null) + if (s_Instance == null) { - RenderPipelineManager.activeRenderPipelineTypeChanged -= s_Instance.OnActiveRenderPipelineTypeChanged; + return; } - RenderPipelineManager.beginCameraRendering -= EnqueuePass; - } + var water = s_Instance._Water; - void OnActiveRenderPipelineTypeChanged() - { - Disable(); - } - - static void EnqueuePass(ScriptableRenderContext context, Camera camera) - { - var water = WaterRenderer.Instance; - - if (water == null || !water._ShadowLod.Enabled) + if (!water._ShadowLod.Enabled) { return; } #if UNITY_EDITOR - if (!WaterRenderer.IsWithinEditorUpdate || EditorApplication.isPaused) + if (!WaterRenderer.IsWithinEditorUpdate) { return; } @@ -84,7 +66,7 @@ namespace WaveHarmonic.Crest public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) #endif { - var water = WaterRenderer.Instance; + var water = _Water; if (water == null || !water._ShadowLod.Enabled) { @@ -103,30 +85,16 @@ namespace WaveHarmonic.Crest var camera = renderingData.cameraData.camera; #if !UNITY_6000_0_OR_NEWER - var buffer = CommandBufferPool.Get(k_Name); + var buffer = CommandBufferPool.Get(WaterRenderer.k_DrawLodData); #endif - // We need to check the mask or it will cause entire pipeline to output black. Appears to only affect URP. - var isStereoRendering = renderingData.cameraData.xrRendering && XRHelpers.IsSinglePass && - camera.stereoTargetEye == StereoTargetEyeMask.Both; - // Disable for XR SPI otherwise input will not have correct world position. - if (isStereoRendering) - { - buffer.DisableShaderKeyword("STEREO_INSTANCING_ON"); - } + Rendering.URP.DisableXR(buffer, renderingData.cameraData); water._ShadowLod.BuildCommandBuffer(water, buffer); - // Restore matrices otherwise remaining render will have incorrect matrices. Each pass is responsible for - // restoring matrices if required. - buffer.SetViewProjectionMatrices(camera.worldToCameraMatrix, camera.projectionMatrix); - // Restore XR SPI as we cannot rely on remaining pipeline to do it for us. - if (isStereoRendering) - { - buffer.EnableShaderKeyword("STEREO_INSTANCING_ON"); - } + Rendering.URP.EnableXR(buffer, renderingData.cameraData); #if !UNITY_6000_0_OR_NEWER context.ExecuteCommandBuffer(buffer); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ScatteringLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ScatteringLod.cs index 264e15d68..8a30e9bc7 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ScatteringLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ScatteringLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -32,10 +32,11 @@ namespace WaveHarmonic.Crest get { var color = Color.clear; + var surface = _Water.Surface; - if (_Water.Material != null) + if (surface.Material != null && surface.Material.HasColor(WaterRenderer.ShaderIDs.s_Scattering)) { - color = _Water.Material.GetColor(WaterRenderer.ShaderIDs.s_Scattering).MaybeLinear(); + color = surface.Material.GetColor(WaterRenderer.ShaderIDs.s_Scattering).MaybeLinear(); color.a = 0f; } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/DynamicWavesLodSettings.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/DynamicWavesLodSettings.cs index 3232c99d5..b070873cc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/DynamicWavesLodSettings.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/DynamicWavesLodSettings.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/FoamLodSettings.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/FoamLodSettings.cs index a16908872..28a86537c 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/FoamLodSettings.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/FoamLodSettings.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/LodSettings.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/LodSettings.cs index c1b9bbed7..1087bf9fd 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/LodSettings.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Settings/LodSettings.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs new file mode 100644 index 000000000..ecab8beec --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs @@ -0,0 +1,119 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; +using UnityEngine.Rendering; + +namespace WaveHarmonic.Crest +{ + partial class ShadowLod + { + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + { + // TODO: refactor this similar to MaskRenderer. + if (!RenderPipelineHelper.IsLegacy) + { +#if d_UnityURP + if (RenderPipelineHelper.IsUniversal) + { + SampleShadowsURP.EnqueuePass(context, camera); + } +#endif + + return; + } + +#if UNITY_EDITOR + // Do not execute when editor is not active to conserve power and prevent possible leaks. + if (!UnityEditorInternal.InternalEditorUtility.isApplicationActive) + { + CopyShadowMapBuffer?.Clear(); + return; + } + + if (!WaterRenderer.IsWithinEditorUpdate) + { + CopyShadowMapBuffer?.Clear(); + return; + } +#endif + + var water = _Water; + + if (water == null) + { + return; + } + + if (!WaterRenderer.ShouldRender(camera, water.Surface.Layer)) + { + return; + } + + if (camera == water.Viewer && CopyShadowMapBuffer != null) + { + if (_Light != null) + { + // Calling this in OnPreRender was too late to be executed in the same frame. + _Light.RemoveCommandBuffer(LightEvent.BeforeScreenspaceMask, CopyShadowMapBuffer); + _Light.AddCommandBuffer(LightEvent.BeforeScreenspaceMask, CopyShadowMapBuffer); + } + + // Disable for XR SPI otherwise input will not have correct world position. + Rendering.BIRP.DisableXR(CopyShadowMapBuffer, camera); + + BuildCommandBuffer(water, CopyShadowMapBuffer); + + // Restore XR SPI as we cannot rely on remaining pipeline to do it for us. + Rendering.BIRP.EnableXR(CopyShadowMapBuffer, camera); + } + } + + internal void OnEndCameraRendering(Camera camera) + { + if (!RenderPipelineHelper.IsLegacy) + { + return; + } + +#if UNITY_EDITOR + // Do not execute when editor is not active to conserve power and prevent possible leaks. + if (!UnityEditorInternal.InternalEditorUtility.isApplicationActive) + { + CopyShadowMapBuffer?.Clear(); + return; + } + + if (!WaterRenderer.IsWithinEditorUpdate) + { + CopyShadowMapBuffer?.Clear(); + return; + } +#endif + + var water = _Water; + + if (water == null) + { + return; + } + + if (!WaterRenderer.ShouldRender(camera, water.Surface.Layer)) + { + return; + } + + if (camera == water.Viewer) + { + // CBs added to a light are executed for every camera, but the LOD data is only + // supports a single camera. Removing the CB after the camera renders restricts the + // CB to one camera. Careful of recursive rendering for planar reflections, as it + // executes a camera within this camera's frame. + if (_Light != null && CopyShadowMapBuffer != null) + { + _Light.RemoveCommandBuffer(LightEvent.BeforeScreenspaceMask, CopyShadowMapBuffer); + } + } + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs.meta new file mode 100644 index 000000000..51cbf5262 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.Legacy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a4edb90370784ae2be24a7f430ee23e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.cs index 10e1b528d..71e0a1ffb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/ShadowLod.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // BIRP fallback not really tested yet - shaders need fixing up. @@ -20,7 +20,7 @@ namespace WaveHarmonic.Crest /// sampling for (very) soft shadows. Soft shadows is red, hard shadows is green. /// [FilterEnum(nameof(_TextureFormatMode), Filtered.Mode.Exclude, (int)LodTextureFormatMode.Automatic)] - public sealed partial class ShadowLod : Lod + public sealed partial class ShadowLod : PersistentLod { [@Space(10)] @@ -77,13 +77,14 @@ namespace WaveHarmonic.Crest public static readonly int s_Scale = Shader.PropertyToID("_Crest_Scale"); public static readonly int s_JitterDiameters_CurrentFrameWeights = Shader.PropertyToID("_Crest_JitterDiameters_CurrentFrameWeights"); public static readonly int s_MainCameraProjectionMatrix = Shader.PropertyToID("_Crest_MainCameraProjectionMatrix"); - public static readonly int s_SimDeltaTime = Shader.PropertyToID("_Crest_SimDeltaTime"); // BIRP only. - public static readonly int s_ShadowCastersPresent = Shader.PropertyToID("_Crest_ShadowCastersPresent"); + public static readonly int s_ShadowPassExecuteLastFrame = Shader.PropertyToID("_Crest_ShadowPassExecuteLastFrame"); public static readonly int s_ClearShadows = Shader.PropertyToID("_Crest_ClearShadows"); } + const string k_DrawLodSample = "Sample"; + const float k_MaximumJitter = 32f; internal static readonly Color s_GizmoColor = new(0f, 0f, 0f, 0.5f); @@ -120,6 +121,13 @@ namespace WaveHarmonic.Crest Error _Error; + private protected override int Kernel => (int)RenderPipelineHelper.RenderPipeline; + private protected override bool SkipFlipBuffers => true; + private protected override ComputeShader SimulationShader => WaterResources.Instance.Compute._UpdateShadow; + + bool _IsSimulationBuffer; + + internal override void Initialize() { if (WaterResources.Instance.Shaders._UpdateShadow == null) @@ -178,7 +186,7 @@ namespace WaveHarmonic.Crest if (RenderPipelineHelper.IsLegacy) { - Helpers.SetGlobalBoolean(ShaderIDs.s_ShadowCastersPresent, true); + Helpers.SetGlobalBoolean(ShaderIDs.s_ShadowPassExecuteLastFrame, true); } } @@ -186,14 +194,6 @@ namespace WaveHarmonic.Crest { base.Enable(); - if (RenderPipelineHelper.IsLegacy) - { - Camera.onPreCull -= OnPreCullCamera; - Camera.onPreCull += OnPreCullCamera; - Camera.onPostRender -= OnPostRenderCamera; - Camera.onPostRender += OnPostRenderCamera; - } - CleanUpShadowCommandBuffers(); if (RenderPipelineHelper.IsHighDefinition) @@ -205,7 +205,7 @@ namespace WaveHarmonic.Crest else if (RenderPipelineHelper.IsUniversal) { #if d_UnityURP - SampleShadowsURP.Enable(); + SampleShadowsURP.Enable(_Water); #endif } } @@ -217,16 +217,9 @@ namespace WaveHarmonic.Crest CleanUpShadowCommandBuffers(); Shader.SetGlobalFloat(ShaderIDs.s_DynamicSoftShadowsFactor, 1f); - Camera.onPreCull -= OnPreCullCamera; - Camera.onPostRender -= OnPostRenderCamera; - #if d_UnityHDRP SampleShadowsHDRP.Disable(); #endif - -#if d_UnityURP - SampleShadowsURP.Disable(); -#endif } internal override void Destroy() @@ -265,7 +258,7 @@ namespace WaveHarmonic.Crest else if (RenderPipelineHelper.IsUniversal) { #if d_UnityURP - SampleShadowsURP.Enable(); + SampleShadowsURP.Enable(_Water); #endif } } @@ -276,106 +269,6 @@ namespace WaveHarmonic.Crest _Targets.RunLambda(buffer => Clear(buffer)); } - void OnPreCullCamera(Camera camera) - { -#if UNITY_EDITOR - // Do not execute when editor is not active to conserve power and prevent possible leaks. - if (!UnityEditorInternal.InternalEditorUtility.isApplicationActive) - { - CopyShadowMapBuffer?.Clear(); - return; - } - - if (!WaterRenderer.IsWithinEditorUpdate) - { - CopyShadowMapBuffer?.Clear(); - return; - } -#endif - - var water = _Water; - - if (water == null) - { - return; - } - - if (!Helpers.MaskIncludesLayer(camera.cullingMask, water.Layer)) - { - return; - } - - if (camera == water.Viewer && CopyShadowMapBuffer != null) - { - // Calling this in OnPreRender was too late to be executed in the same frame. - AddCommandBufferToPrimaryLight(); - - // Disable for XR SPI otherwise input will not have correct world position. - if (camera.stereoEnabled && XRHelpers.IsSinglePass) - { - CopyShadowMapBuffer.DisableShaderKeyword("STEREO_INSTANCING_ON"); - } - - BuildCommandBuffer(water, CopyShadowMapBuffer); - - // Restore XR SPI as we cannot rely on remaining pipeline to do it for us. - if (camera.stereoEnabled && XRHelpers.IsSinglePass) - { - CopyShadowMapBuffer.EnableShaderKeyword("STEREO_INSTANCING_ON"); - } - } - } - - void OnPostRenderCamera(Camera camera) - { -#if UNITY_EDITOR - // Do not execute when editor is not active to conserve power and prevent possible leaks. - if (!UnityEditorInternal.InternalEditorUtility.isApplicationActive) - { - CopyShadowMapBuffer?.Clear(); - return; - } - - if (!WaterRenderer.IsWithinEditorUpdate) - { - CopyShadowMapBuffer?.Clear(); - return; - } -#endif - - var water = _Water; - - if (water == null) - { - return; - } - - if (!Helpers.MaskIncludesLayer(camera.cullingMask, water.Layer)) - { - return; - } - - if (camera == water.Viewer) - { - // CBs added to a light are executed for every camera, but the LOD data is only supports a single - // camera. Removing the CB after the camera renders restricts the CB to one camera. - RemoveCommandBufferFromPrimaryLight(); - } - } - - internal void AddCommandBufferToPrimaryLight() - { - if (_Light == null || CopyShadowMapBuffer == null) return; - _Light.RemoveCommandBuffer(LightEvent.BeforeScreenspaceMask, CopyShadowMapBuffer); - _Light.AddCommandBuffer(LightEvent.BeforeScreenspaceMask, CopyShadowMapBuffer); - } - - internal void RemoveCommandBufferFromPrimaryLight() - { - if (_Light == null || CopyShadowMapBuffer == null) return; - _Light.RemoveCommandBuffer(LightEvent.BeforeScreenspaceMask, CopyShadowMapBuffer); - } - /// /// Validates the primary light. /// @@ -476,7 +369,7 @@ namespace WaveHarmonic.Crest CopyShadowMapBuffer = null; } - void Update() + void Update(CommandBuffer buffer) { // If disabled then we hit a failure state. Try and recover in edit mode by proceeding. if (!_Valid && Application.isPlaying) @@ -502,7 +395,7 @@ namespace WaveHarmonic.Crest return; } - CopyShadowMapBuffer ??= new() { name = "Crest Shadow Data" }; + CopyShadowMapBuffer ??= new() { name = WaterRenderer.k_DrawLodData }; CopyShadowMapBuffer.Clear(); FlipBuffers(); @@ -514,7 +407,9 @@ namespace WaveHarmonic.Crest if (Application.isPlaying) #endif { - Clear(DataTexture); + buffer.BeginSample(ID); + CoreUtils.SetRenderTarget(buffer, DataTexture, ClearFlag.Color, ClearColor); + buffer.EndSample(ID); } } @@ -522,6 +417,8 @@ namespace WaveHarmonic.Crest { var isSimulationBuffer = buffer == _Water.SimulationBuffer; + _IsSimulationBuffer = isSimulationBuffer; + if (isSimulationBuffer) { var skip = true; @@ -529,101 +426,94 @@ namespace WaveHarmonic.Crest { // If no shadow casters are present, BIRP will not execute the command buffer // leaving outdated shadows in data. We set a flag to determine if the command - // buffer was executed. - skip = Helpers.GetGlobalBoolean(ShaderIDs.s_ShadowCastersPresent); - Helpers.SetGlobalBoolean(ShaderIDs.s_ShadowCastersPresent, false); + // buffer was executed. There will a 1-frame delay. + skip = Helpers.GetGlobalBoolean(ShaderIDs.s_ShadowPassExecuteLastFrame); + Helpers.SetGlobalBoolean(ShaderIDs.s_ShadowPassExecuteLastFrame, false); } - Update(); + Update(buffer); // Only do a partial update when called by WaterRenderer as we want to execute // with the camera's command buffer (in frame). - if (skip) return; + if (skip) + { + return; + } } - // NOTE: FlipBuffers called elsewhere. - // Cache the camera for further down. var camera = water.Viewer; -#pragma warning disable 618 - using (new ProfilingSample(buffer, isSimulationBuffer ? "Shadows" : "Crest.Shadows")) -#pragma warning restore 618 + if (camera == null) { - var jitter = new Vector4 - ( - _JitterDiameterSoft, - _JitterDiameterHard, - _CurrentFrameWeightSoft, - _CurrentFrameWeightHard - ); + return; + } - var waterMaterial = _Water.Material; - var hasColor = waterMaterial.HasVector(WaterRenderer.ShaderIDs.s_Absorption) && waterMaterial.HasProperty(WaterRenderer.ShaderIDs.s_Scattering); - var absorption = hasColor ? waterMaterial.GetVector(WaterRenderer.ShaderIDs.s_Absorption).XYZ() : Vector3.zero; - var scattering = hasColor ? ((Vector4)waterMaterial.GetColor(WaterRenderer.ShaderIDs.s_Scattering).MaybeLinear()).XYZ() : Vector3.zero; - var sampleAbsorption = _Water.AbsorptionLod.Enabled; - var sampleScattering = _Water.ScatteringLod.Enabled; - var sampleColor = sampleAbsorption || sampleScattering; + base.BuildCommandBuffer(water, buffer); - if (_DynamicSoftShadows && hasColor && !sampleColor) - { - // This approximates varying of soft shadowing by volume scattering/absorption density. - var extinction = absorption + scattering; - var factor = Mathf.Clamp01(Mathf.Min(Mathf.Min(extinction.x, extinction.y), extinction.z) * _SoftJitterExtinctionFactor); - jitter.x = (1f - factor) * k_MaximumJitter; - } + if (RenderPipelineHelper.IsLegacy && !isSimulationBuffer) + { + buffer.SetGlobalBoolean(ShaderIDs.s_ShadowPassExecuteLastFrame, true); + } + } - Shader.SetGlobalFloat(ShaderIDs.s_DynamicSoftShadowsFactor, _DynamicSoftShadows ? _SoftJitterExtinctionFactor : 1f); + private protected override void GetSubstepData(float timeToSimulate, out int substeps, out float delta) + { + substeps = Mathf.FloorToInt(timeToSimulate * _SimulationFrequency); + delta = substeps > 0 ? (1f / _SimulationFrequency) : 0f; + } - buffer.BeginSample("Sample"); + private protected override void SetAdditionalSimulationParameters(PropertyWrapperCompute properties) + { + base.SetAdditionalSimulationParameters(properties); - for (var slice = Slices - 1; slice >= 0; slice--) - { - _RenderMaterial[slice].SetVector(ShaderIDs.s_CenterPos, _Cascades[slice]._SnappedPosition.XNZ(_Water.SeaLevel)); - var scale = water.CalcLodScale(slice); - _RenderMaterial[slice].SetVector(ShaderIDs.s_Scale, new(scale, 1f, scale)); - _RenderMaterial[slice].SetVector(ShaderIDs.s_JitterDiameters_CurrentFrameWeights, jitter); - _RenderMaterial[slice].SetMatrix(ShaderIDs.s_MainCameraProjectionMatrix, GL.GetGPUProjectionMatrix(camera.projectionMatrix, renderIntoTexture: true) * camera.worldToCameraMatrix); - _RenderMaterial[slice].SetFloat(ShaderIDs.s_SimDeltaTime, Time.deltaTime); + var jitter = new Vector4 + ( + _JitterDiameterSoft, + _JitterDiameterHard, + _CurrentFrameWeightSoft, + _CurrentFrameWeightHard + ); - // Dynamic Soft Shadows. - _RenderMaterial[slice].SetBoolean(ShaderIDs.s_SampleColorMap, _DynamicSoftShadows && sampleColor); - if (_DynamicSoftShadows && sampleColor) - { - _RenderMaterial[slice].SetVector(WaterRenderer.ShaderIDs.s_Absorption, absorption); - _RenderMaterial[slice].SetVector(WaterRenderer.ShaderIDs.s_Scattering, scattering); - } + var waterMaterial = _Water.Surface.Material; + var hasColor = waterMaterial != null && waterMaterial.HasVector(WaterRenderer.ShaderIDs.s_Absorption) && waterMaterial.HasProperty(WaterRenderer.ShaderIDs.s_Scattering); + var absorption = hasColor ? waterMaterial.GetVector(WaterRenderer.ShaderIDs.s_Absorption).XYZ() : Vector3.zero; + var scattering = hasColor ? ((Vector4)waterMaterial.GetColor(WaterRenderer.ShaderIDs.s_Scattering).MaybeLinear()).XYZ() : Vector3.zero; + var sampleAbsorption = _Water.AbsorptionLod.Enabled; + var sampleScattering = _Water.ScatteringLod.Enabled; + var sampleColor = sampleAbsorption || sampleScattering; - _RenderMaterial[slice].SetTexture(_TextureSourceShaderID, _Targets.Previous(1)); + if (_DynamicSoftShadows && hasColor && !sampleColor) + { + // This approximates varying of soft shadowing by volume scattering/absorption density. + var extinction = absorption + scattering; + var factor = Mathf.Clamp01(Mathf.Min(Mathf.Min(extinction.x, extinction.y), extinction.z) * _SoftJitterExtinctionFactor); + jitter.x = (1f - factor) * k_MaximumJitter; + } -#if UNITY_EDITOR - // On recompiles this becomes unset even though we run over the code path to set it again... - _RenderMaterial[slice].SetInteger(Lod.ShaderIDs.s_LodIndex, slice); -#endif + Shader.SetGlobalFloat(ShaderIDs.s_DynamicSoftShadowsFactor, _DynamicSoftShadows ? _SoftJitterExtinctionFactor : 1f); - if (RenderPipelineHelper.IsLegacy) - { - // If we are executing the simulation buffer, then we are clearing. - _RenderMaterial[slice].SetBoolean(ShaderIDs.s_ClearShadows, isSimulationBuffer); - } + var camera = _Water.Viewer; - Helpers.Blit(buffer, DataTexture, _RenderMaterial[slice].Material, depthSlice: slice); - } + properties.SetVector(ShaderIDs.s_JitterDiameters_CurrentFrameWeights, jitter); + properties.SetMatrix(ShaderIDs.s_MainCameraProjectionMatrix, GL.GetGPUProjectionMatrix(camera.projectionMatrix, renderIntoTexture: true) * camera.worldToCameraMatrix); - buffer.EndSample("Sample"); + // Dynamic Soft Shadows. + properties.SetBoolean(ShaderIDs.s_SampleColorMap, _DynamicSoftShadows && sampleColor); - // BUG: These draw calls will "leak" and be duplicated before the above blit. They are executed at - // the beginning of this CB before any commands are applied. - SubmitDraws(buffer, s_Inputs, DataTexture); + if (_DynamicSoftShadows && sampleColor) + { + properties.SetVector(WaterRenderer.ShaderIDs.s_Absorption, absorption); + properties.SetVector(WaterRenderer.ShaderIDs.s_Scattering, scattering); + } - // Set the target texture as to make sure we catch the 'pong' each frame - Shader.SetGlobalTexture(_TextureShaderID, DataTexture); + if (RenderPipelineHelper.IsLegacy) + { + // If we are executing the simulation buffer, then we are clearing. + properties.SetBoolean(ShaderIDs.s_ClearShadows, _IsSimulationBuffer); - if (RenderPipelineHelper.IsLegacy && !isSimulationBuffer) - { - buffer.SetGlobalBoolean(ShaderIDs.s_ShadowCastersPresent, true); - } + properties.SetKeyword(new LocalKeyword(SimulationShader, "SHADOWS_SINGLE_CASCADE"), QualitySettings.shadowCascades == 1); + properties.SetKeyword(new LocalKeyword(SimulationShader, "SHADOWS_SPLIT_SPHERES"), QualitySettings.shadowProjection == ShadowProjection.StableFit); } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Debug/DebugGUI.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Debug/DebugGUI.cs index fe18658a4..38c19d3e5 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Debug/DebugGUI.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Debug/DebugGUI.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if d_UnityInputSystem && ENABLE_INPUT_SYSTEM @@ -249,7 +249,7 @@ namespace WaveHarmonic.Crest #if UNITY_EDITOR if (GUI.Button(new(x, y, w, h), "Select Water Material")) { - var path = UnityEditor.AssetDatabase.GetAssetPath(_Water.Material); + var path = UnityEditor.AssetDatabase.GetAssetPath(_Water.Surface.Material); var asset = UnityEditor.AssetDatabase.LoadMainAssetAtPath(path); UnityEditor.Selection.activeObject = asset; } @@ -415,7 +415,7 @@ namespace WaveHarmonic.Crest GUI.color = Color.white; // Only use Graphics.DrawTexture in EventType.Repaint events if called in OnGUI - if (Event.current.type.Equals(EventType.Repaint)) + if (Event.current.type == EventType.Repaint) { for (var idx = 0; idx < lodData.DataTexture.volumeDepth; idx++) { @@ -453,7 +453,7 @@ namespace WaveHarmonic.Crest GUI.color = Color.white; // Only use Graphics.DrawTexture in EventType.Repaint events if called in OnGUI - if (Event.current.type.Equals(EventType.Repaint)) + if (Event.current.type == EventType.Repaint) { for (var idx = 0; idx < data.volumeDepth; idx++) { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs new file mode 100644 index 000000000..912ff29cb --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs @@ -0,0 +1,154 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using System; +using UnityEngine; + +namespace WaveHarmonic.Crest +{ + partial class WaterRenderer + { + const string k_SurfaceRendererObsoleteMessage = "This property can now be found on WaterRenderer.Surface"; + + // + // Fields + // + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("The water chunk renderers will have this layer.")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [SerializeField] + int _Layer = 4; // Water + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("Material to use for the water surface.")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [SerializeField] + internal Material _Material = null; + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("Underwater will copy from this material if set.\n\nUseful for overriding properties for the underwater effect. To see what properties can be overriden, see the disabled properties on the underwater material. This does not affect the surface.")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [SerializeField] + internal Material _VolumeMaterial = null; + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("Template for water chunks as a prefab.\n\nThe only requirements are that the prefab must contain a MeshRenderer at the root and not a MeshFilter or WaterChunkRenderer. MR values will be overwritten where necessary and the prefabs are linked in edit mode.")] + [SerializeField] + internal GameObject _ChunkTemplate; + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("Have the water surface cast shadows for albedo (both foam and custom).")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [SerializeField] + internal bool _CastShadows; + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("Whether 'Water Body' components will cull the water tiles.\n\nDisable if you want to use the 'Material Override' feature and still have an ocean.")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [SerializeField] + bool _WaterBodyCulling = true; + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("How many frames to distribute the chunk bounds calculation.\n\nThe chunk bounds are calculated per frame to ensure culling is correct when using inputs that affect displacement. Some performance can be saved by distributing the load over several frames. The higher the frames, the longer it will take - lowest being instant.")] + [@Range(1, 30, Range.Clamp.Minimum)] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [SerializeField] + int _TimeSliceBoundsUpdateFrameCount = 1; + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("How to handle self-intersections of the water surface.\n\nThey can be caused by choppy waves which can cause a flipped underwater effect. When not using the portals/volumes, this fix is only applied when within 2 metres of the water surface. Automatic will disable the fix if portals/volumes are used which is the recommend setting.")] + [SerializeField] + internal SurfaceRenderer.SurfaceSelfIntersectionFixMode _SurfaceSelfIntersectionFixMode = SurfaceRenderer.SurfaceSelfIntersectionFixMode.Automatic; + + [Obsolete(k_SurfaceRendererObsoleteMessage)] + [HideInInspector] + [Tooltip("Whether to allow sorting using the render queue.\n\nIf you need to change the minor part of the render queue (eg +100), then enable this option. As a side effect, it will also disable the front-to-back rendering optimization for Crest. This option does not affect changing the major part of the render queue (eg AlphaTest, Transparent), as that is always allowed.\n\nRender queue sorting is required for some third-party integrations.")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [SerializeField] + bool _AllowRenderQueueSorting; + + + // + // API + // + + int GetLayer() + { + return Surface.Layer; + } + + void SetLayer(int previous, int current) + { + Surface.Layer = current; + } + + Material GetMaterial() + { + return Surface.Material; + } + + void SetMaterial(Material previous, Material current) + { + Surface.Material = current; + } + + Material GetVolumeMaterial() + { + return Surface.VolumeMaterial; + } + + void SetVolumeMaterial(Material previous, Material current) + { + Surface.VolumeMaterial = current; + } + + bool GetCastShadows() + { + return Surface.CastShadows; + } + + void SetCastShadows(bool previous, bool current) + { + Surface.CastShadows = current; + } + + bool GetWaterBodyCulling() + { + return Surface.WaterBodyCulling; + } + + void SetWaterBodyCulling(bool previous, bool current) + { + Surface.WaterBodyCulling = current; + } + + int GetTimeSliceBoundsUpdateFrameCount() + { + return Surface.TimeSliceBoundsUpdateFrameCount; + } + + void SetTimeSliceBoundsUpdateFrameCount(int previous, int current) + { + Surface.TimeSliceBoundsUpdateFrameCount = current; + } + + bool GetAllowRenderQueueSorting() + { + return Surface.AllowRenderQueueSorting; + } + + void SetAllowRenderQueueSorting(bool previous, bool current) + { + Surface.AllowRenderQueueSorting = current; + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs.meta new file mode 100644 index 000000000..8d2f70a8a --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Deprecated.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 40c7e9cba055f4ed9a6dfb8dc5de0051 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/API.Generated.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/API.Generated.cs index 3a10b657c..01b907897 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/API.Generated.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/API.Generated.cs @@ -245,6 +245,14 @@ namespace WaveHarmonic.Crest /// Requires a two component texture format. /// public bool EnableSignedDistanceFields { get => _EnableSignedDistanceFields; set => SetEnableSignedDistanceFields(_EnableSignedDistanceFields, _EnableSignedDistanceFields = value); } + + /// + /// Whether to include the terrain height automatically. + /// + /// + /// This will not include terrain details, nor will it produce a signed-distance field. There may also be a slight deviation due to differences in height data and terrain mesh. In these cases, please use the DepthProbe. + /// + public bool IncludeTerrainHeight { get => _IncludeTerrainHeight; set => _IncludeTerrainHeight = value; } } } @@ -740,6 +748,27 @@ namespace WaveHarmonic.Crest } } +namespace WaveHarmonic.Crest +{ + partial class Meniscus + { + /// + /// Whether the meniscus is enabled. + /// + public bool Enabled { get => GetEnabled(); set => SetEnabled(_Enabled, _Enabled = value); } + + /// + /// Any camera with this layer in its culling mask will render the meniscus. + /// + public int Layer { get => _Layer; set => _Layer = value; } + + /// + /// The meniscus material. + /// + public UnityEngine.Material Material { get => _Material; set => SetMaterial(_Material, _Material = value); } + } +} + namespace WaveHarmonic.Crest { partial class PersistentLod @@ -1013,6 +1042,14 @@ namespace WaveHarmonic.Crest /// public float MaximumVerticalDisplacement { get => _MaximumVerticalDisplacement; set => _MaximumVerticalDisplacement = value; } + /// + /// Whether to use the wind turbulence on this component rather than the global wind turbulence. + /// + /// + /// Global wind turbulence comes from the Water Renderer component. + /// + public bool OverrideGlobalWindTurbulence { get => _OverrideGlobalWindTurbulence; set => _OverrideGlobalWindTurbulence = value; } + /// /// FFT waves will loop with a period of this many seconds. /// @@ -1026,7 +1063,7 @@ namespace WaveHarmonic.Crest /// /// How turbulent/chaotic the waves are. /// - public float WindTurbulence { get => _WindTurbulence; set => _WindTurbulence = value; } + public float WindTurbulence { get => GetWindTurbulence(); set => _WindTurbulence = value; } } } @@ -1039,6 +1076,11 @@ namespace WaveHarmonic.Crest /// public int ComponentsPerOctave { get => _ComponentsPerOctave; set => _ComponentsPerOctave = value; } + /// + /// Prevent data arrays from being written to so one can provide their own. + /// + public bool ManualGeneration { get => _ManualGeneration; set => _ManualGeneration = value; } + /// /// Change to get a different set of waves. /// @@ -1050,7 +1092,15 @@ namespace WaveHarmonic.Crest /// /// Each Gerstner wave is actually a pair of waves travelling in opposite directions (similar to FFT). This weight is applied to the wave travelling in against-wind direction. Set to zero to obtain simple single waves which are useful for shorelines waves. /// - public float ReverseWaveWeight { get => _ReverseWaveWeight; set => _ReverseWaveWeight = value; } + public float ReverseWaveWeight { get => GetReverseWaveWeight(); set => _ReverseWaveWeight = value; } + + /// + /// Use a swell spectrum as the default. + /// + /// + /// Uses a swell spectrum as default (when none is assigned), and disabled reverse waves. + /// + public bool Swell { get => _Swell; set => _Swell = value; } } } @@ -1066,6 +1116,14 @@ namespace WaveHarmonic.Crest /// public bool EvaluateSpectrumAtRunTimeEveryFrame { get => _EvaluateSpectrumAtRunTimeEveryFrame; set => _EvaluateSpectrumAtRunTimeEveryFrame = value; } + /// + /// Whether to use the wind direction on this component rather than the global wind direction. + /// + /// + /// Global wind direction comes from the Water Renderer component. + /// + public bool OverrideGlobalWindDirection { get => _OverrideGlobalWindDirection; set => _OverrideGlobalWindDirection = value; } + /// /// Whether to use the wind speed on this component rather than the global wind speed. /// @@ -1101,7 +1159,7 @@ namespace WaveHarmonic.Crest /// /// This is the angle from x axis in degrees that the waves are oriented towards. If a spline is being used to place the waves, this angle is relative to the spline. /// - public float WaveDirectionHeadingAngle { get => _WaveDirectionHeadingAngle; set => _WaveDirectionHeadingAngle = value; } + public float WaveDirectionHeadingAngle { get => GetWaveDirectionHeadingAngle(); set => _WaveDirectionHeadingAngle = value; } /// /// Wind speed in km/h. Controls wave conditions. @@ -1203,10 +1261,79 @@ namespace WaveHarmonic.Crest } } +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + /// + /// Whether to allow sorting using the render queue. + /// + /// + /// If you need to change the minor part of the render queue (eg +100), then enable this option. As a side effect, it will also disable the front-to-back rendering optimization for Crest. This option does not affect changing the major part of the render queue (eg AlphaTest, Transparent), as that is always allowed. + /// + public bool AllowRenderQueueSorting { get => _AllowRenderQueueSorting; set => _AllowRenderQueueSorting = value; } + + /// + /// Have the water surface cast shadows for albedo (both foam and custom). + /// + public bool CastShadows { get => GetCastShadows(); set => _CastShadows = value; } + + /// + /// Whether the underwater effect is enabled. + /// + /// + /// Allocates/releases resources if state has changed. + /// + public bool Enabled { get => GetEnabled(); set => SetEnabled(_Enabled, _Enabled = value); } + + /// + /// The water chunk renderers will have this layer. + /// + public int Layer { get => _Layer; set => _Layer = value; } + + /// + /// Material to use for the water surface. + /// + public UnityEngine.Material Material { get => _Material; set => _Material = value; } + + /// + /// How many frames to distribute the chunk bounds calculation. + /// + /// + /// The chunk bounds are calculated per frame to ensure culling is correct when using inputs that affect displacement. Some performance can be saved by distributing the load over several frames. The higher the frames, the longer it will take - lowest being instant. + /// + public int TimeSliceBoundsUpdateFrameCount { get => _TimeSliceBoundsUpdateFrameCount; set => _TimeSliceBoundsUpdateFrameCount = value; } + + /// + /// Underwater will copy from this material if set. + /// + /// + /// Useful for overriding properties for the underwater effect. To see what properties can be overriden, see the disabled properties on the underwater material. This does not affect the surface. + /// + public UnityEngine.Material VolumeMaterial { get => _VolumeMaterial; set => _VolumeMaterial = value; } + + /// + /// Whether 'Water Body' components will cull the water tiles. + /// + /// + /// Disable if you want to use the 'Material Override' feature and still have an ocean. + /// + public bool WaterBodyCulling { get => _WaterBodyCulling; set => _WaterBodyCulling = value; } + } +} + namespace WaveHarmonic.Crest { partial class TextureLodInputData { + /// + /// Multiplies the texture sample. + /// + /// + /// This is useful for normalized textures. The four components map to the four color/alpha components of the texture (if they exist). + /// + public UnityEngine.Vector4 Multiplier { get => _Multiplier; set => _Multiplier = value; } + /// /// Texture to render into the simulation. /// @@ -1506,7 +1633,8 @@ namespace WaveHarmonic.Crest /// /// If you need to change the minor part of the render queue (eg +100), then enable this option. As a side effect, it will also disable the front-to-back rendering optimization for Crest. This option does not affect changing the major part of the render queue (eg AlphaTest, Transparent), as that is always allowed. /// - public bool AllowRenderQueueSorting { get => _AllowRenderQueueSorting; set => _AllowRenderQueueSorting = value; } + [System.Obsolete("This property can now be found on WaterRenderer.Surface")] + public bool AllowRenderQueueSorting { get => GetAllowRenderQueueSorting(); set => SetAllowRenderQueueSorting(_AllowRenderQueueSorting, _AllowRenderQueueSorting = value); } /// /// All waves (including Dynamic Waves) are written to this simulation. @@ -1524,7 +1652,16 @@ namespace WaveHarmonic.Crest /// /// Have the water surface cast shadows for albedo (both foam and custom). /// - public bool CastShadows { get => GetCastShadows(); set => _CastShadows = value; } + [System.Obsolete("This property can now be found on WaterRenderer.Surface")] + public bool CastShadows { get => GetCastShadows(); set => SetCastShadows(_CastShadows, _CastShadows = value); } + + /// + /// Keep the center of detail from drifting from the viewpoint. + /// + /// + /// Large horizontal displacement can displace the center of detail. This uses queries to keep the center of detail aligned. + /// + public bool CenterOfDetailDisplacementCorrection { get => _CenterOfDetailDisplacementCorrection; set => _CenterOfDetailDisplacementCorrection = value; } /// /// Clip surface information for clipping the water surface. @@ -1593,10 +1730,19 @@ namespace WaveHarmonic.Crest /// public float GravityOverride { get => _GravityOverride; set => _GravityOverride = value; } + /// + /// When in the render pipeline the water is rendered. + /// + /// + /// Default is the old behaviour which is controlled by Unity. + /// + public WaterInjectionPoint InjectionPoint { get => _InjectionPoint; set => _InjectionPoint = value; } + /// /// The water chunk renderers will have this layer. /// - public int Layer { get => _Layer; set => _Layer = value; } + [System.Obsolete("This property can now be found on WaterRenderer.Surface")] + public int Layer { get => GetLayer(); set => SetLayer(_Layer, _Layer = value); } /// /// Varying water level to support water bodies at different heights and rivers to run down slopes. @@ -1606,7 +1752,13 @@ namespace WaveHarmonic.Crest /// /// Material to use for the water surface. /// - public UnityEngine.Material Material { get => _Material; set => _Material = value; } + [System.Obsolete("This property can now be found on WaterRenderer.Surface")] + public UnityEngine.Material Material { get => GetMaterial(); set => SetMaterial(_Material, _Material = value); } + + /// + /// The meniscus module. + /// + public Meniscus Meniscus => _Meniscus; /// /// Provide your own gravity value instead of Physics.gravity. @@ -1689,6 +1841,11 @@ namespace WaveHarmonic.Crest /// public int LodLevels { get => _Slices; set => _Slices = value; } + /// + /// The water surface renderer. + /// + public SurfaceRenderer Surface => _Surface; + /// /// The distance threshold for when the viewer has considered to have teleported. /// @@ -1703,7 +1860,8 @@ namespace WaveHarmonic.Crest /// /// The chunk bounds are calculated per frame to ensure culling is correct when using inputs that affect displacement. Some performance can be saved by distributing the load over several frames. The higher the frames, the longer it will take - lowest being instant. /// - public int TimeSliceBoundsUpdateFrameCount { get => _TimeSliceBoundsUpdateFrameCount; set => _TimeSliceBoundsUpdateFrameCount = value; } + [System.Obsolete("This property can now be found on WaterRenderer.Surface")] + public int TimeSliceBoundsUpdateFrameCount { get => GetTimeSliceBoundsUpdateFrameCount(); set => SetTimeSliceBoundsUpdateFrameCount(_TimeSliceBoundsUpdateFrameCount, _TimeSliceBoundsUpdateFrameCount = value); } /// /// The underwater renderer. @@ -1724,7 +1882,8 @@ namespace WaveHarmonic.Crest /// /// Useful for overriding properties for the underwater effect. To see what properties can be overriden, see the disabled properties on the underwater material. This does not affect the surface. /// - public UnityEngine.Material VolumeMaterial { get => _VolumeMaterial; set => _VolumeMaterial = value; } + [System.Obsolete("This property can now be found on WaterRenderer.Surface")] + public UnityEngine.Material VolumeMaterial { get => GetVolumeMaterial(); set => SetVolumeMaterial(_VolumeMaterial, _VolumeMaterial = value); } /// /// Whether 'Water Body' components will cull the water tiles. @@ -1732,7 +1891,16 @@ namespace WaveHarmonic.Crest /// /// Disable if you want to use the 'Material Override' feature and still have an ocean. /// - public bool WaterBodyCulling { get => _WaterBodyCulling; set => _WaterBodyCulling = value; } + [System.Obsolete("This property can now be found on WaterRenderer.Surface")] + public bool WaterBodyCulling { get => GetWaterBodyCulling(); set => SetWaterBodyCulling(_WaterBodyCulling, _WaterBodyCulling = value); } + + /// + /// Base wind direction in degrees. + /// + /// + /// Controls wave conditions. Can be overridden on Shape* components. + /// + public float WindDirection { get => GetWindDirection(); set => _WindDirection = value; } /// /// Base wind speed in km/h. @@ -1740,7 +1908,23 @@ namespace WaveHarmonic.Crest /// /// Controls wave conditions. Can be overridden on Shape* components. /// - public float WindSpeed { get => _WindSpeed; set => _WindSpeed = value; } + public float WindSpeed { get => GetWindSpeed(); set => _WindSpeed = value; } + + /// + /// Base wind turbulence. + /// + /// + /// Controls wave conditions. Can be overridden on ShapeFFT components. + /// + public float WindTurbulence { get => GetWindTurbulence(); set => _WindTurbulence = value; } + + /// + /// Uses a provided WindZone as the source of global wind. + /// + /// + /// It must be directional. Wind speed units are presumed to be in m/s. + /// + public UnityEngine.WindZone WindZone { get => _WindZone; set => _WindZone = value; } /// /// Whether to enable motion vector support. @@ -1748,12 +1932,20 @@ namespace WaveHarmonic.Crest public bool WriteMotionVectors { get => GetWriteMotionVectors(); set => _WriteMotionVectors = value; } /// - /// Whether to write the water surface depth to the depth texture (URP only). + /// Whether to write the water surface color to the color/opaque texture. /// /// - /// The water surface writes to the depth buffer, but Unity does not copy it to the depth texture for post-processing effects like Depth of Field. This will copy the depth buffer to the depth texture. + /// This is likely only beneficial if the water injection point is before transparency, and there are shaders which need it (like refraction). /// - public bool WriteToDepthTexture { get => _WriteToDepthTexture; set => _WriteToDepthTexture = value; } + public bool WriteToColorTexture { get => GetWriteToColorTexture(); set => _WriteToColorTexture = value; } + + /// + /// Whether to write the water surface depth to the depth texture. + /// + /// + /// The water surface writes to the depth buffer, but Unity does not copy it to the depth texture for post-processing effects like Depth of Field (or refraction). This will copy the depth buffer to the depth texture. + /// + public bool WriteToDepthTexture { get => GetWriteToDepthTexture(); set => _WriteToDepthTexture = value; } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs new file mode 100644 index 000000000..cb31f4f00 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs @@ -0,0 +1,453 @@ +// + +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +namespace WaveHarmonic.Crest.Generated +{ + enum CollisionLayer + { + /// + /// Include all displacement. + /// + Everything, + + /// + /// Only include Animated Waves. + /// + AfterAnimatedWaves, + + /// + /// Include Animated Waves and Dynamic Waves. + /// + AfterDynamicWaves, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum CollisionLayers + { + /// + /// All layers. + /// + Everything, + + /// + /// No extra layers (ie single layer). + /// + Nothing, + + /// + /// Separate layer for dynamic waves. + /// + /// + /// Dynamic waves are normally combined together for efficiency. By enabling this layer, dynamic waves are combined and added in a separate pass. + /// + DynamicWaves, + + /// + /// Extra displacement layer for visual displacement. + /// + Displacement, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum CollisionSource + { + /// + /// No collision source. Flat water. + /// + None, + + /// + /// Uses AsyncGPUReadback to retrieve data from GPU to CPU. + /// + /// + /// This is the most optimal approach. + /// + GPU, + + /// + /// Computes data entirely on the CPU. + /// + CPU, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum DefaultClippingState + { + /// + /// By default, nothing is clipped. Use clip inputs to remove water. + /// + NothingClipped, + + /// + /// By default, everything is clipped. Use clip inputs to add water. + /// + EverythingClipped, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum DepthProbeMode + { + /// + /// Update in real-time in accordance to refresh mode. + /// + RealTime, + + /// + /// Baked in the editor. + /// + Baked, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum DepthProbeRefreshMode + { + /// + /// Populates the DepthProbe in Start. + /// + OnStart, + + /// + /// Requires manual updating via DepthProbe.Populate. + /// + ViaScripting, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum DisplacementPass + { + /// + /// Displacement that is dependent on an LOD (eg waves). + /// + /// + /// Uses filtering to determine which LOD to write to. + /// + LodDependent, + + /// + /// Renders to all LODs. + /// + LodIndependent, + + /// + /// Renders to all LODs, but as a separate pass. + /// + /// + /// Typically used to render visual displacement which does not affect collisions. + /// + LodIndependentLast, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum FloatingObjectModel + { + /// + /// A simple model which aligns the object with the wave normal. + /// + AlignNormal, + + /// + /// A more advanced model which samples water at the probes positions. + /// + Probes, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum LodInputBlend + { + /// + /// No blending. Overwrites. + /// + Off, + + /// + /// Additive blending. + /// + Additive, + + /// + /// Takes the minimum value. + /// + Minimum, + + /// + /// Takes the maximum value. + /// + Maximum, + + /// + /// Applies the inverse weight to the target. + /// + /// + /// Basically overwrites what is already in the simulation. + /// + Alpha, + + /// + /// Same as alpha except anything above zero will overwrite rather than blend. + /// + AlphaClip, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum LodInputMode + { + /// + /// Unset is the serialization default. + /// + /// + /// This will be replaced with the default mode automatically. Unset can also be used if something is invalid. + /// + Unset, + + /// + /// Hand-painted data by the user. + /// + Paint, + + /// + /// Driven by a user created spline. + /// + Spline, + + /// + /// Attached 'Renderer' (mesh, particle or other) used to drive data. + /// + Renderer, + + /// + /// Driven by a mathematical primitive such as a cube or sphere. + /// + Primitive, + + /// + /// Covers the entire water area. + /// + Global, + + /// + /// Data driven by a user provided texture. + /// + Texture, + + /// + /// Renders geometry using a default material. + /// + Geometry, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum LodInputPrimitive + { + /// + /// Spheroid. + /// + Sphere, + + /// + /// Cuboid. + /// + Cube, + + /// + /// Quad. + /// + Quad, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum LodTextureFormatMode + { + /// + /// Uses the Texture Format property. + /// + Manual, + + /// + /// Chooses a texture format for performance. + /// + Performance, + + /// + /// Chooses a texture format for precision. + /// + /// + /// This format can reduce artifacts. + /// + Precision, + + /// + /// Chooses a texture format based on another. + /// + /// + /// For example, Dynamic Waves will match precision of Animated Waves. + /// + Automatic, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum Placement + { + /// + /// The component is in a fixed position. + /// + Fixed, + + /// + /// The component follows the transform. + /// + Transform, + + /// + /// The component follows the viewpoint. + /// + Viewpoint, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum QuerySource + { + /// + /// This game object's transform. + /// + Transform, + + /// + /// The viewer's transform. + /// + /// + /// The viewer is the main camera the system uses. + /// + Viewer, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum ShorelineVolumeColorSource + { + /// + /// No depth color. + /// + None, + + /// + /// Depth color based on water depth. + /// + Depth, + + /// + /// Depth color based on shoreline distance. + /// + Distance, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum WaterInjectionPoint + { + /// + /// Renders in the default pass. + /// + /// + /// For the water surface, this will be determined by the material (opaque or transparent). This pass is controlled by Unity, and is not compatible with certain features like soft particles. + /// + Default, + + /// + /// Renders before the transparent pass. + /// + /// + /// This has advantages like being compatible with soft particles, refractive shaders, and possibly third-party fog. + /// + BeforeTransparent, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum WaterReflectionSide + { + /// + /// Both sides. Most expensive. + /// + Both, + + /// + /// Above only. Typical for planar reflections. + /// + Above, + + /// + /// Below only. For total internal reflections. + /// + Below, + } +} + + +namespace WaveHarmonic.Crest.Generated +{ + enum WatertightHullMode + { + /// + /// Use displacement to remove water. + /// + /// + /// Using displacement will also affect the underwater and can nest bouyant objects. Requires the displacement layer to be enabled. + /// + Displacement, + + /// + /// Clips the surface to remove water. + /// + /// + /// This option is more precise and can be submerged. + /// + Clip, + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs.meta new file mode 100644 index 000000000..54053f317 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Generated/Documentation.Generated.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b32089d5327840948a90ac2add66a1d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Interaction/FloatingObject.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Interaction/FloatingObject.cs index c611f63e4..87cbaffa1 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Interaction/FloatingObject.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Interaction/FloatingObject.cs @@ -3,22 +3,22 @@ using UnityEngine; using WaveHarmonic.Crest.Internal; +using WaveHarmonic.Crest.Utility; namespace WaveHarmonic.Crest { /// /// Different physics models for /// + [@GenerateDoc] public enum FloatingObjectModel { - /// - /// A simple model which aligns the object with the wave normal. - /// + /// + [Tooltip("A simple model which aligns the object with the wave normal.")] AlignNormal, - /// - /// A more advanced model which samples water at the probes positions. - /// + /// + [Tooltip("A more advanced model which samples water at the probes positions.")] Probes, } @@ -165,6 +165,10 @@ namespace WaveHarmonic.Crest internal bool _DrawQueries = false; } + internal const string k_FixedUpdateMarker = "Crest.FloatingObject.FixedUpdate"; + + static readonly Unity.Profiling.ProfilerMarker s_FixedUpdateMarker = new(k_FixedUpdateMarker); + /// /// Is any part of this object in water. /// @@ -204,7 +208,7 @@ namespace WaveHarmonic.Crest private protected override System.Action OnFixedUpdateMethod => OnFixedUpdate; void OnFixedUpdate(WaterRenderer water) { - UnityEngine.Profiling.Profiler.BeginSample("Buoyancy.FixedUpdate"); + s_FixedUpdateMarker.Begin(this); var points = Advanced ? _Probes : _Probe; @@ -232,7 +236,7 @@ namespace WaveHarmonic.Crest { var query = _QueryPoints[i]; query.y = water.SeaLevel + _QueryResultDisplacements[i].y; - CollisionAreaVisualizer.DebugDrawCross(query, 1f, Color.magenta); + DebugUtility.DrawCross(Debug.DrawLine, query, 1f, Color.magenta); } } } @@ -276,7 +280,7 @@ namespace WaveHarmonic.Crest if (!InWater) { - UnityEngine.Profiling.Profiler.EndSample(); + s_FixedUpdateMarker.End(); return; } } @@ -290,13 +294,13 @@ namespace WaveHarmonic.Crest { var surfPos = transform.position; surfPos.y = height; - CollisionAreaVisualizer.DebugDrawCross(surfPos, normal, 1f, Color.red); + DebugUtility.DrawCross(Debug.DrawLine, surfPos, normal, 1f, Color.red); } InWater = bottomDepth > 0f; if (!InWater) { - UnityEngine.Profiling.Profiler.EndSample(); + s_FixedUpdateMarker.End(); return; } @@ -366,7 +370,7 @@ namespace WaveHarmonic.Crest _RigidBody.AddForceAtPosition(_Drag.z * Vector3.Dot(transform.forward, -velocityRelativeToWater) * transform.forward, forcePosition, ForceMode.Acceleration); } - UnityEngine.Profiling.Profiler.EndSample(); + s_FixedUpdateMarker.End(); } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask.meta new file mode 100644 index 000000000..a26b19ca3 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2b0d4d3edfa685248878df8f18fd1756 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs new file mode 100644 index 000000000..3e7035014 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs @@ -0,0 +1,97 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityHDRP + +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; + +namespace WaveHarmonic.Crest +{ + sealed class MaskRendererHDRP : MaskRenderer + { + const string k_Name = "Water Mask"; + MaskCustomPass _MaskCustomPass; + GameObject _GameObject; + + public MaskRendererHDRP(WaterRenderer water) : base(water) { } + + public override void Enable() + { + base.Enable(); + + _GameObject = CustomPassHelpers.CreateOrUpdate + ( + parent: _Water.Container.transform, + k_Name, + hide: !_Water._Debug._ShowHiddenObjects + ); + + CustomPassHelpers.CreateOrUpdate + ( + _GameObject, + ref _MaskCustomPass, + UnderwaterRenderer.k_DrawMask, + CustomPassInjectionPoint.BeforeRendering + ); + + _MaskCustomPass._MaskPass = this; + } + + public override void Disable() + { + base.Disable(); + + if (_GameObject != null) + { + // Will also trigger Cleanup below. + _GameObject.SetActive(false); + } + } + + public override void OnBeginCameraRendering(Camera camera) + { + + } + + public override void OnEndCameraRendering(Camera camera) + { + + } + + sealed class MaskCustomPass : CustomPass + { + internal MaskRenderer _MaskPass; + + // Called when the custom pass object is enabled making it somewhat useless. + protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd) + { + _MaskPass.Allocate(); + } + + protected override void Cleanup() + { + _MaskPass.Release(); + } + + protected override void Execute(CustomPassContext context) + { + var camera = context.hdCamera.camera; + + if (!_MaskPass.ShouldExecute(camera)) + { + return; + } + + // HDRP does not need ReAllocate. But it is easier to also call Allocate here. + // Allocating RTHandles outside the render loop raises an error. Seriously, do not + // attempt to optmize this away. + _MaskPass.Allocate(); + _MaskPass.Execute(camera, context.cmd); + } + } + } +} + +#endif // d_UnityHDRP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs.meta new file mode 100644 index 000000000..842e1c173 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.HighDefinition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c293f6238a2e7418f9348c7c99b8aacf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs new file mode 100644 index 000000000..1bd46eaf6 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs @@ -0,0 +1,63 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; +using UnityEngine.Rendering; + +namespace WaveHarmonic.Crest +{ + sealed class MaskRendererBIRP : MaskRenderer + { + CommandBuffer _Commands; + + public MaskRendererBIRP(WaterRenderer water) : base(water) { } + + public override void Enable() + { + base.Enable(); + Allocate(); + } + + + public override void OnBeginCameraRendering(Camera camera) + { + if (!ShouldExecute(camera)) + { + return; + } + + + _Commands ??= new() + { + name = UnderwaterRenderer.k_DrawMask, + }; + + _Water.UpdateMatrices(camera); + + var descriptor = Rendering.BIRP.GetCameraTargetDescriptor(camera); + descriptor.useDynamicScale = camera.allowDynamicResolution; + + Allocate(); + + ReAllocate(descriptor); + Execute(camera, _Commands); + + // Handles both forward and deferred. + camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _Commands); + camera.AddCommandBuffer(CameraEvent.BeforeDepthTexture, _Commands); + } + + public override void OnEndCameraRendering(Camera camera) + { + if (_Commands == null) + { + return; + } + + camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, _Commands); + camera.RemoveCommandBuffer(CameraEvent.BeforeDepthTexture, _Commands); + + _Commands.Clear(); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs.meta new file mode 100644 index 000000000..c4bc204ae --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Legacy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8abc65ea1dd9433c972aa074694f5b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs new file mode 100644 index 000000000..8d5fcf4f0 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs @@ -0,0 +1,103 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityURP + +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +namespace WaveHarmonic.Crest +{ + sealed class MaskRendererURP : MaskRenderer + { + readonly MaskRenderPass _MaskRenderPass = new(); + + public MaskRendererURP(WaterRenderer water) : base(water) { } + + public override void OnBeginCameraRendering(Camera camera) + { + if (!ShouldExecute(camera)) + { + return; + } + + _MaskRenderPass._Renderer = this; + _MaskRenderPass.EnqueuePass(camera); + } + + public override void OnEndCameraRendering(Camera camera) + { + + } + + sealed partial class MaskRenderPass : ScriptableRenderPass + { + const string k_Name = "Crest.DrawMask"; + + internal MaskRenderer _Renderer; + + public MaskRenderPass() + { + // Will always execute and matrices will be ready. + renderPassEvent = RenderPassEvent.BeforeRenderingPrePasses; + } + + internal void EnqueuePass(Camera camera) + { + // TODO: check if we need to even enqueue a pass + var renderer = camera.GetUniversalAdditionalCameraData().scriptableRenderer; + +#if UNITY_EDITOR + if (renderer == null) + { + return; + } +#endif + + _Renderer.Allocate(); + + // Enqueue the pass. This happens every frame. + renderer.EnqueuePass(this); + } + +#if UNITY_6000_0_OR_NEWER + class PassData + { + public UniversalCameraData _CameraData; + public MaskRenderer _Renderer; + } + + public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, ContextContainer frame) + { + using (var builder = graph.AddUnsafePass(k_Name, out var data)) + { + builder.AllowPassCulling(false); + + data._CameraData = frame.Get(); + data._Renderer = _Renderer; + + builder.SetRenderFunc((data, context) => + { + var buffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd); + data._Renderer.ReAllocate(data._CameraData.cameraTargetDescriptor); + data._Renderer.Execute(data._CameraData.camera, buffer); + }); + } + } + + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData data) + { + var buffer = CommandBufferPool.Get(k_Name); + _Renderer.ReAllocate(data.cameraData.cameraTargetDescriptor); + _Renderer.Execute(data.cameraData.camera, buffer); + context.ExecuteCommandBuffer(buffer); + CommandBufferPool.Release(buffer); + } + } + } +} + +#endif // d_UnityURP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs.meta new file mode 100644 index 000000000..e9ec7dc74 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.Universal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b884ed0c0033342c78bdc398e0060299 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs new file mode 100644 index 000000000..4f6c36ec7 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs @@ -0,0 +1,314 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; + +namespace WaveHarmonic.Crest +{ + abstract partial class MaskRenderer + { + protected const string k_MaskColor = "_Crest_MaskColor"; + protected const string k_MaskDepth = "_Crest_MaskDepth"; + + public static class ShaderIDs + { + public static readonly int s_WaterMaskTexture = Shader.PropertyToID("_Crest_WaterMaskTexture"); + public static readonly int s_WaterMaskDepthTexture = Shader.PropertyToID("_Crest_WaterMaskDepthTexture"); + } + + public static MaskRenderer Instantiate(WaterRenderer water) + { +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + return new MaskRendererHDRP(water); + } + else +#endif + +#if d_UnityURP + if (RenderPipelineHelper.IsUniversal) + { + return new MaskRendererURP(water); + } + else +#endif + + { + return new MaskRendererBIRP(water); + } + } + + // For PortalRenderer. + public static System.Action s_OnAllocate; + public static System.Action s_OnRelease; + public static System.Action s_OnReAllocate; + + public MaskRenderer(WaterRenderer water) + { + _Water = water; + } + + public bool Enabled => true; //_Water.Underwater.Enabled; + + internal RenderTargetIdentifier _ColorRTI; + internal RenderTargetIdentifier _DepthRTI; + + public RenderTextureDescriptor ColorDescriptor => ColorRT.descriptor; + public RenderTextureDescriptor DepthDescriptor => DepthRT.descriptor; + + public abstract void OnBeginCameraRendering(Camera camera); + public abstract void OnEndCameraRendering(Camera camera); + + + public virtual void Enable() + { + + } + + public virtual void Disable() + { + + } + + public virtual void Destroy() + { + Release(); + } + + protected void UpdateColor(Texture color) + { + _ColorRTI = new(color, mipLevel: 0, CubemapFace.Unknown, depthSlice: -1); + Shader.SetGlobalTexture(ShaderIDs.s_WaterMaskTexture, color); + } + + protected void UpdateDepth(Texture depth) + { + _DepthRTI = new(depth, mipLevel: 0, CubemapFace.Unknown, depthSlice: -1); + Shader.SetGlobalTexture(ShaderIDs.s_WaterMaskDepthTexture, depth); + } + + + // + // Pub/Sub + // + + [System.Flags] + public enum MaskInput + { + None, + Zero = 1 << 0, + Color = 1 << 1, + Depth = 1 << 2, + Both = Color | Depth, + } + + protected MaskInput _Inputs; + + protected readonly WaterRenderer _Water; + + internal readonly Utility.SortedList _Providers = new(Helpers.DuplicateComparison); + internal readonly List _Receivers = new(); + + public interface IMaskProvider + { + MaskInput Allocate(); + MaskInput Write(Camera camera); + void OnMaskPass(CommandBuffer commands, Camera camera, MaskRenderer mask); + } + + public interface IMaskReceiver + { + MaskInput Allocate(); + } + + void Initialize() + { + _Inputs = MaskInput.None; + + foreach (var receiver in _Receivers) + { + _Inputs |= receiver.Allocate(); + } + } + + internal void Add(IMaskReceiver receiver) + { + if (_Receivers.Contains(receiver)) + { + return; + } + + _Receivers.Add(receiver); + + Initialize(); + } + + internal void Remove(IMaskReceiver receiver) + { + if (!_Receivers.Remove(receiver)) + { + return; + } + + Initialize(); + } + + internal void Add(int queue, IMaskProvider provider) + { + if (_Providers.Contains(provider)) + { + return; + } + + _Providers.Add(queue, provider); + + Initialize(); + } + + internal void Remove(IMaskProvider provider) + { + if (!_Providers.Remove(provider)) + { + return; + } + + Initialize(); + } + + public void Execute(Camera camera, CommandBuffer commands) + { + foreach (var provider in _Providers) + { + if (provider.Value.Write(camera) == MaskInput.None) + { + continue; + } + + provider.Value.OnMaskPass(commands, camera, this); + } + } + + internal bool ShouldExecute(Camera camera) + { + var input = MaskInput.None; + + foreach (var providers in _Providers) + { + input |= providers.Value.Write(camera); + } + + return input != MaskInput.None; + } + } + + // Holds common stuff for SRPs + abstract partial class MaskRenderer + { + internal RTHandle _ColorRTH; + internal RTHandle _DepthRTH; + + + // Null check due to U6 not being able to cast if null (Unity bug?). + public Texture ColorT => _ColorRTH?.rt; + public Texture DepthT => _DepthRTH?.rt; + public RTHandle ColorRTH => _ColorRTH; + public RTHandle DepthRTH => _DepthRTH; + public RenderTexture ColorRT => _ColorRTH; + public RenderTexture DepthRT => _DepthRTH; + + public void ResetRenderTarget(CommandBuffer commands) + { + CoreUtils.SetRenderTarget(commands, ColorRTH, DepthRTH); + } + + public void Allocate() + { + if (_Inputs.HasFlag(MaskInput.Color) && _ColorRTH == null) + { + _ColorRTH = RTHandles.Alloc + ( + scaleFactor: Vector2.one, + slices: TextureXR.slices, + dimension: TextureXR.dimension, + depthBufferBits: DepthBits.None, + colorFormat: GraphicsFormat.R16_SFloat, + enableRandomWrite: true, + useDynamicScale: true, + name: k_MaskColor + ); + + UpdateColor(_ColorRTH); + } + + if (_Inputs.HasFlag(MaskInput.Depth) && _DepthRTH == null) + { + _DepthRTH = RTHandles.Alloc + ( + scaleFactor: Vector2.one, + slices: TextureXR.slices, + dimension: TextureXR.dimension, + depthBufferBits: Helpers.k_DepthBits, + colorFormat: GraphicsFormat.None, + enableRandomWrite: false, + useDynamicScale: true, + name: k_MaskDepth + ); + + UpdateDepth(_DepthRTH); + } + + s_OnAllocate?.Invoke(); + } + + public void ReAllocate(RenderTextureDescriptor descriptor) + { + // Shared settings. Enabling MSAA might be a good idea except cannot enable random + // writes. Having a raster shader to remove artifacts is a workaround. + // This looks safe to do as Unity's CopyDepthPass does the same. + descriptor.bindMS = false; + descriptor.msaaSamples = 1; + + s_OnReAllocate?.Invoke(descriptor); + + if (_Inputs.HasFlag(MaskInput.Depth)) + { + descriptor.graphicsFormat = GraphicsFormat.None; + descriptor.depthBufferBits = Helpers.k_DepthBufferBits; + + if (RenderPipelineCompatibilityHelper.ReAllocateIfNeeded(ref _DepthRTH, descriptor, name: k_MaskDepth)) + { + UpdateDepth(_DepthRTH); + } + } + + if (_Inputs.HasFlag(MaskInput.Color)) + { + // NOTE: Intel iGPU for Metal and DirectX both had issues with R16 (2021.11.18). + descriptor.graphicsFormat = GraphicsFormat.R16_SFloat; + descriptor.depthBufferBits = 0; + descriptor.enableRandomWrite = true; + + if (RenderPipelineCompatibilityHelper.ReAllocateIfNeeded(ref _ColorRTH, descriptor, name: k_MaskColor)) + { + UpdateColor(_ColorRTH); + } + } + } + + public void Release() + { + _ColorRTH?.Release(); + _DepthRTH?.Release(); + + // Set to null possibly due to Initialize/Destroy overlap. + _ColorRTH = null; + _DepthRTH = null; + + s_OnRelease?.Invoke(); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs.meta new file mode 100644 index 000000000..5a7df4f21 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Mask/MaskRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 797f30610ca4c477fbbaaf38f758dc95 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus.meta new file mode 100644 index 000000000..fe768b495 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a77538aae73c514bb42831e04b8041e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs new file mode 100644 index 000000000..f1f85f3ef --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs @@ -0,0 +1,32 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if UNITY_EDITOR + +using UnityEditor; +using UnityEngine; + +namespace WaveHarmonic.Crest +{ + partial class Meniscus + { + internal const string k_MaterialPath = "Packages/com.waveharmonic.crest/Runtime/Materials/Meniscus.mat"; + + internal void Reset() + { + _Material = AssetDatabase.LoadAssetAtPath(k_MaterialPath); + } + + [@OnChange] + void OnChange(string path, object previous) + { + switch (path) + { + case nameof(_Enabled): SetEnabled((bool)previous, _Enabled); break; + case nameof(_Material): SetMaterial((Material)previous, _Material); break; + } + } + } +} + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs.meta new file mode 100644 index 000000000..17d924af9 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Editor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20f5eb7691544460796ae81ca7816cbb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs new file mode 100644 index 000000000..0daab558a --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs @@ -0,0 +1,88 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityHDRP + +using UnityEngine; +using UnityEngine.Rendering.HighDefinition; + +namespace WaveHarmonic.Crest +{ + partial class Meniscus + { + internal sealed class MeniscusRendererHDRP : MeniscusRenderer + { + const string k_Name = "Meniscus"; + MeniscusCustomPass _CustomPass; + GameObject _GameObject; + + public MeniscusRendererHDRP(WaterRenderer water, Meniscus meniscus) : base(water, meniscus) + { + + } + + public override void Enable() + { + base.Enable(); + + _GameObject = CustomPassHelpers.CreateOrUpdate + ( + parent: _Water.Container.transform, + k_Name, + hide: !_Water._Debug._ShowHiddenObjects + ); + + CustomPassHelpers.CreateOrUpdate + ( + _GameObject, + ref _CustomPass, + k_Draw, + CustomPassInjectionPoint.BeforePostProcess, + priority: -1 + ); + + _CustomPass._Renderer = this; + } + + public override void Disable() + { + base.Disable(); + + if (_GameObject != null) + { + // Will also trigger Cleanup below. + _GameObject.SetActive(false); + } + } + + public override void OnBeginCameraRendering(Camera camera) + { + + } + + public override void OnEndCameraRendering(Camera camera) + { + + } + + sealed class MeniscusCustomPass : CustomPass + { + internal MeniscusRenderer _Renderer; + + protected override void Execute(CustomPassContext context) + { + var camera = context.hdCamera.camera; + + if (!_Renderer.ShouldExecute(camera)) + { + return; + } + + _Renderer.Execute(camera, new CommandWrapper(context.cmd)); + } + } + } + } +} + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs.meta new file mode 100644 index 000000000..7e9f4a598 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.HighDefinition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec8f31a3e4e434fa0a8e771834d9dc16 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs new file mode 100644 index 000000000..ddedc07b1 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs @@ -0,0 +1,57 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; +using UnityEngine.Rendering; + +namespace WaveHarmonic.Crest +{ + partial class Meniscus + { + internal sealed class MeniscusRendererBIRP : MeniscusRenderer + { + CommandBuffer _Commands; + + // NOTE: This will not work for recursive rendering. + bool _CommandsRegistered; + + public MeniscusRendererBIRP(WaterRenderer water, Meniscus meniscus) : base(water, meniscus) + { + + } + + public override void OnBeginCameraRendering(Camera camera) + { + if (!ShouldExecute(camera)) + { + return; + } + + _Commands ??= new() + { + name = k_Draw, + }; + + _Commands.Clear(); + + Execute(camera, new CommandWrapper(_Commands)); + + camera.AddCommandBuffer(CameraEvent.AfterForwardAlpha, _Commands); + + _CommandsRegistered = true; + } + + public override void OnEndCameraRendering(Camera camera) + { + if (!_CommandsRegistered) + { + return; + } + + camera.RemoveCommandBuffer(CameraEvent.AfterForwardAlpha, _Commands); + + _CommandsRegistered = false; + } + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs.meta new file mode 100644 index 000000000..fd4fac4e2 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Legacy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a79d71a3e88424f27877abd4102b5af9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs new file mode 100644 index 000000000..152b56b9a --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs @@ -0,0 +1,118 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityURP + +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +namespace WaveHarmonic.Crest +{ + partial class Meniscus + { + internal sealed class MeniscusRendererURP : MeniscusRenderer + { + readonly MeniscusRenderPass _MaskRenderPass = new(); + + public MeniscusRendererURP(WaterRenderer water, Meniscus meniscus) : base(water, meniscus) + { + + } + + public override void OnBeginCameraRendering(Camera camera) + { + if (!ShouldExecute(camera)) + { + return; + } + + _MaskRenderPass._Renderer = this; + _MaskRenderPass.EnqueuePass(camera); + } + + public override void OnEndCameraRendering(Camera camera) + { + + } + + sealed partial class MeniscusRenderPass : ScriptableRenderPass + { + const string k_Name = k_Draw; + + internal MeniscusRenderer _Renderer; + + bool _RequiresOpaqueTexture; + + public MeniscusRenderPass() + { + renderPassEvent = RenderPassEvent.AfterRenderingTransparents; + } + + internal void EnqueuePass(Camera camera) + { + // TODO: check if we need to even enqueue a pass + var renderer = camera.GetUniversalAdditionalCameraData().scriptableRenderer; + +#if UNITY_EDITOR + if (renderer == null) + { + return; + } +#endif + + _RequiresOpaqueTexture = _Renderer._Meniscus.RequiresOpaqueTexture; + + ConfigureInput(_RequiresOpaqueTexture ? ScriptableRenderPassInput.Color : ScriptableRenderPassInput.None); + + // Enqueue the pass. This happens every frame. + renderer.EnqueuePass(this); + } + +#if UNITY_6000_0_OR_NEWER + class PassData + { + public UniversalCameraData _CameraData; + public MeniscusRenderer _Renderer; + } + + public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, ContextContainer frame) + { + using (var builder = graph.AddRasterRenderPass(k_Name, out var data)) + { + builder.AllowPassCulling(false); + + var resources = frame.Get(); + + if (_RequiresOpaqueTexture) + { + builder.UseTexture(resources.cameraOpaqueTexture); + } + + data._CameraData = frame.Get(); + data._Renderer = _Renderer; + + builder.SetRenderAttachment(resources.activeColorTexture, index: 0); + + builder.SetRenderFunc((data, context) => + { + data._Renderer.Execute(data._CameraData.camera, new RasterCommandWrapper(context.cmd)); + }); + } + } + + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData data) + { + var buffer = CommandBufferPool.Get(k_Name); + _Renderer.Execute(data.cameraData.camera, new CommandWrapper(buffer)); + context.ExecuteCommandBuffer(buffer); + CommandBufferPool.Release(buffer); + } + } + } + } +} + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs.meta new file mode 100644 index 000000000..0654d0692 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.Universal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6888087ee71bb4b378cf0e4f30479f93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs new file mode 100644 index 000000000..eb5d94713 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs @@ -0,0 +1,250 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; + +namespace WaveHarmonic.Crest +{ + /// + /// Renders the meniscus (waterline). + /// + [System.Serializable] + public sealed partial class Meniscus + { + [@Space(10)] + + [Tooltip("Whether the meniscus is enabled.")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [@DecoratedField] + [SerializeField] + internal bool _Enabled = true; + + [Tooltip("Any camera with this layer in its culling mask will render the meniscus.")] + [@Layer] + [@GenerateAPI] + [SerializeField] + int _Layer = 4; // Water + + [Tooltip("The meniscus material.")] + [@AttachMaterialEditor(order: 2)] + [@MaterialField("Crest/Meniscus", name: "Meniscus", title: "Create Meniscus Material")] + [@GenerateAPI(Setter.Custom)] + [SerializeField] + internal Material _Material; + + + WaterRenderer _Water; + + internal MeniscusRenderer Renderer { get; private set; } + + internal bool RequiresOpaqueTexture => Enabled && Material != null && Material.IsKeywordEnabled("d_Crest_Refraction"); + + /// + /// Disables rendering without de-allocating. + /// + public bool ForceRenderingOff { get; set; } + + internal void Enable() + { + Initialize(_Water); + Renderer?.Enable(); + } + + internal void Disable() + { + Renderer?.Disable(); + } + + internal void Destroy() + { + Renderer?.Destroy(); + Renderer = null; + } + + internal void OnActiveRenderPipelineTypeChanged() + { + Destroy(); + Initialize(_Water); + } + + internal void Initialize(WaterRenderer water) + { + _Water = water; + + if (!Enabled) + { + return; + } + +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + Renderer ??= new MeniscusRendererHDRP(water, this); + } + else +#endif + +#if d_UnityURP + if (RenderPipelineHelper.IsUniversal) + { + Renderer ??= new MeniscusRendererURP(water, this); + } + else +#endif + + // Legacy + { + Renderer ??= new MeniscusRendererBIRP(water, this); + } + } + } + + // Getters/Setters + partial class Meniscus + { + bool GetEnabled() + { + return _Enabled && _Material != null; + } + + void SetEnabled(bool previous, bool current) + { + if (previous == current) return; + if (_Water == null || !_Water.isActiveAndEnabled) return; + if (_Enabled) Enable(); else Disable(); + } + + void SetMaterial(Material previous, Material current) + { + if (previous == current) return; + if (_Water == null || !_Water.isActiveAndEnabled) return; + if (previous == null) Enable(); else if (current == null) Disable(); + } + } + + partial class Meniscus + { + internal abstract partial class MeniscusRenderer + { + private protected const string k_Draw = "Crest.DrawWater/Meniscus"; + + private protected readonly WaterRenderer _Water; + internal readonly Meniscus _Meniscus; + + static partial class ShaderIDs + { + public static readonly int s_HorizonNormal = Shader.PropertyToID("_Crest_HorizonNormal"); + } + + public abstract void OnBeginCameraRendering(Camera camera); + public abstract void OnEndCameraRendering(Camera camera); + + public MeniscusRenderer(WaterRenderer water, Meniscus meniscus) + { + _Water = water; + _Meniscus = meniscus; + } + + public virtual void Enable() + { + + } + + public virtual void Disable() + { + + } + + public virtual void Destroy() + { + + } + + internal bool ShouldExecute(Camera camera) + { +#if UNITY_EDITOR + if (GL.wireframe) + { + return false; + } +#endif + + if (_Meniscus.ForceRenderingOff) + { + return false; + } + + // Meniscus is a product of the water surface. + if (!_Water.Surface.Enabled) + { + return false; + } + + if (camera.cameraType is not CameraType.Game and not CameraType.SceneView) + { + return false; + } + + if (!WaterRenderer.ShouldRender(camera, _Meniscus.Layer)) + { + return false; + } + +#if d_CrestPortals + if (_Water.Portals.Active) + { + // Near surface check not compatible with portals. + return true; + } +#endif + + _Water.UpdatePerCameraHeight(camera); + + // Only execute if near the surface. + if (_Water._ViewerHeightAboveWaterPerCamera is > 2f or < -8f) + { + return false; + } + + return true; + } + + internal void Execute(Camera camera, T commands) where T : ICommandWrapper + { + // Project water normal onto camera plane. + _Meniscus.Material.SetVector(ShaderIDs.s_HorizonNormal, new Vector2 + ( + Vector3.Dot(Vector3.up, camera.transform.right), + Vector3.Dot(Vector3.up, camera.transform.up) + )); + + var isFullScreenRequired = true; + var isMasked = false; + var passOffset = 1; + +#if d_CrestPortals + passOffset = (int)Portals.PortalRenderer.MeniscusPass.Length; + + if (_Water.Portals.Active) + { + isMasked = isFullScreenRequired = _Water._Portals.RenderMeniscus(commands, _Meniscus.Material); + } +#endif + + if (isFullScreenRequired) + { + var pass = isMasked ? 1 : 0; + var mpb = _Water.Surface._SurfaceDataMPB; + + if (_Water._Underwater.UseLegacyMask) + { + pass += passOffset; + mpb = null; + } + + commands.DrawFullScreenTriangle(_Meniscus.Material, pass, mpb); + } + } + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs.meta new file mode 100644 index 000000000..0a08bb790 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Meniscus/Meniscus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df109675493a845f7ad07008e1c1aaaa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Scripting/Extensions.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Scripting/Extensions.cs index 6913cab19..2fe00d128 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Scripting/Extensions.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Scripting/Extensions.cs @@ -23,7 +23,7 @@ namespace WaveHarmonic.Crest var input = gameObject.AddComponent(); input._Mode = mode; // Not all modes have associated data. - if (mode is not LodInputMode.Global or LodInputMode.Primitive or LodInputMode.Unset) AddData(input, mode); + if (mode is not (LodInputMode.Global or LodInputMode.Primitive or LodInputMode.Unset)) AddData(input, mode); input.InferBlend(); return input; } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs new file mode 100644 index 000000000..e04bdd91c --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs @@ -0,0 +1,215 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; +using UnityEngine.Rendering; +using WaveHarmonic.Crest.Internal; + +// Possible improvements: +// - Add quality property +// - Add water level separately (seems fine) +// - Loop over all chunks for larger near clip planes + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + internal const int k_SurfaceDataShaderPass = 2; + + internal static partial class ShaderIDs + { + public static int s_WaterLine = Shader.PropertyToID("_Crest_WaterLine"); + public static int s_WaterLineSnappedPosition = Shader.PropertyToID("_Crest_WaterLineSnappedPosition"); + public static int s_WaterLineResolution = Shader.PropertyToID("_Crest_WaterLineResolution"); + public static int s_WaterLineTexel = Shader.PropertyToID("_Crest_WaterLineTexel"); + } + + RenderTexture _HeightRT; + internal RenderTexture HeightRT { get => _HeightRT; } + + CommandBuffer _BeforeRenderingCommands; + Material _DisplacedMaterial; + + internal struct SurfaceDataParameters + { + public Vector2 _SnappedPosition; + public Vector2 _Resolution; + public float _Texel; + } + + internal SurfaceDataParameters _SurfaceDataParameters; + internal MaterialPropertyBlock _SurfaceDataMPB; + + internal void BindDisplacedSurfaceData(T properties) where T : IPropertyWrapper + { + properties.SetTexture(ShaderIDs.s_WaterLine, HeightRT); + properties.SetVector(ShaderIDs.s_WaterLineSnappedPosition, _SurfaceDataParameters._SnappedPosition); + properties.SetVector(ShaderIDs.s_WaterLineResolution, _SurfaceDataParameters._Resolution); + properties.SetFloat(ShaderIDs.s_WaterLineTexel, _SurfaceDataParameters._Texel); + } + + internal void UpdateDisplacedSurfaceData(Camera camera) + { + // World size of the texture. Formula should effectively cover the camera. + var size = 1f + (camera.nearClipPlane * 2f); + + // Do not use the water position. It will cause a mismatch when using displacement + // correction. + var bounds = new Bounds(camera.transform.position, Vector3.one * size); + + if (_DisplacedMaterial == null) + { + _DisplacedMaterial = new(WaterResources.Instance.Shaders._UnderwaterMask); + } + + _BeforeRenderingCommands ??= new(); + var commands = _BeforeRenderingCommands; + commands.name = "Crest.DrawMask"; + commands.Clear(); + + // TODO: add control so users can set this. + // Diminishing returns beyond 0.0125. + UpdateDisplacedSurfaceData + ( + commands, + bounds, + "_Crest_WaterLine", + ref _HeightRT, + texel: 0.0125f, + out _SurfaceDataParameters + ); + + _SurfaceDataMPB ??= new(); + var wrapper = new PropertyWrapperMPB(_SurfaceDataMPB); + BindDisplacedSurfaceData(wrapper); + + var lod = (int)Builder.PatchType.Interior; + var mpb = _PerCascadeMPB.Current[lod]; + + if (_Water.Viewpoint != camera.transform && Vector3.Distance(_Water.Viewpoint.position, camera.transform.position) > 0.01f) + { + foreach (var chunk in _Water.Surface.Chunks) + { + if (!bounds.IntersectsXZ(chunk.Rend.bounds)) + { + continue; + } + + commands.DrawMesh + ( + chunk._Mesh, + chunk.transform.localToWorldMatrix, + _DisplacedMaterial, + submeshIndex: 0, + shaderPass: k_SurfaceDataShaderPass, + chunk._MaterialPropertyBlock + ); + } + } + else + { + for (var i = 0; i < 4; i++) + { + commands.DrawMesh + ( + _Meshes[lod], + Root.localToWorldMatrix * Matrix4x4.TRS(Builder.s_OffsetsFirstLod[i].XNZ(), Quaternion.identity, Vector3.one), + _DisplacedMaterial, + submeshIndex: 0, + k_SurfaceDataShaderPass, + mpb + ); + } + } + + Graphics.ExecuteCommandBuffer(commands); + } + + internal void UpdateDisplacedSurfaceData(CommandBuffer commands, Bounds bounds, string name, ref RenderTexture target, float texel, out SurfaceDataParameters parameters) + { + var size = bounds.size.XZ(); + var position = bounds.center.XZ(); + + var scale = size; + + // TODO: texel needs to be calculates is clamped + // TODO: aspect ratio + var resolution = new Vector2Int + ( + // TODO: Floor, Ceil or Round? + Mathf.CeilToInt(size.x / texel), + Mathf.CeilToInt(size.y / texel) + ); + + // Snapping for spatial stability. Different results, but could not tell which is + // more accurate. At higher resolution, appears negligable anyway. + var snapped = position - new Vector2(Mathf.Repeat(position.x, texel), Mathf.Repeat(position.y, texel)); + + // Store for binding later. + parameters = new() + { + _SnappedPosition = snapped, + _Resolution = resolution, + _Texel = texel, + }; + + if (resolution.x > 2048 || resolution.y > 2048) + { + return; + } + + // FIXME: LOD scale less than two has cut off and fall off at edges. + var view = WaterRenderer.CalculateViewMatrixFromSnappedPositionRHS(snapped.XNZ()); + var projection = Matrix4x4.Ortho(size.x * -0.5f, size.x * 0.5f, size.y * -0.5f, size.y * 0.5f, 1f, 10000f + 10000f); + + if (target == null) + { + target = new(resolution.x, resolution.y, 0) + { + name = name, + // Needs this precision. + graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.R32_SFloat + }; + } + else if (target.width != resolution.x || target.height != resolution.y) + { + target.Release(); + target.width = resolution.x; + target.height = resolution.y; + } + + if (!target.IsCreated()) + { + target.Create(); + } + +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + var buffer = new UnityEngine.Rendering.HighDefinition.ShaderVariablesGlobal(); + + projection = GL.GetGPUProjectionMatrix(projection, true); + + // If we want to use camera relative rendering, then we should not set the matrix + // position. Instead set _WorldSpaceCameraPos_Internal. + buffer._ViewProjMatrix = projection * view; + + ConstantBuffer.PushGlobal(commands, buffer, Crest.ShaderIDs.Unity.s_ShaderVariablesGlobal); + } + else +#endif + { + commands.SetViewProjectionMatrices(view, projection); + } + + commands.SetRenderTarget(target); + commands.ClearRenderTarget(true, true, Color.clear); + + // For mask compute, meniscus etc. + commands.SetGlobalTexture(ShaderIDs.s_WaterLine, target); + commands.SetGlobalVector(ShaderIDs.s_WaterLineSnappedPosition, snapped); + commands.SetGlobalVector(ShaderIDs.s_WaterLineResolution, (Vector2)resolution); + commands.SetGlobalFloat(ShaderIDs.s_WaterLineTexel, texel); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs.meta new file mode 100644 index 000000000..fb3b1f9ae --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Displaced.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d53923414758449c896818d2fa45191 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs new file mode 100644 index 000000000..eee19dcd4 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs @@ -0,0 +1,50 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if UNITY_EDITOR + +using UnityEditor; +using UnityEngine; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + internal void Reset() + { + _Material = AssetDatabase.LoadAssetAtPath("Packages/com.waveharmonic.crest/Runtime/Materials/Water.mat"); + _ChunkTemplate = AssetDatabase.LoadAssetAtPath("Packages/com.waveharmonic.crest/Runtime/Prefabs/Chunk.prefab"); + } + + [@OnChange] + void OnChange(string path, object previous) + { + switch (path) + { + case nameof(_Enabled): + SetEnabled((bool)previous, _Enabled); + break; + case nameof(_Layer): + SetLayer((int)previous, _Layer); + break; + case nameof(_ChunkTemplate): + // We have to rebuild, as we instantiate entire GO. If we restricted it to just a + // MeshRenderer, then we could just replace those. + Rebuild(); + break; + case nameof(_CastShadows): + SetCastShadows((bool)previous, _CastShadows); + break; + case nameof(_AllowRenderQueueSorting): + SetAllowRenderQueueSorting((bool)previous, _AllowRenderQueueSorting); + break; + case nameof(_Debug) + "." + nameof(DebugFields._DisableSkirt): + case nameof(_Debug) + "." + nameof(DebugFields._UniformTiles): + Rebuild(); + break; + } + } + } +} + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs.meta new file mode 100644 index 000000000..02fa22da7 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Editor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 909d252964c5e41a8893e54eda8d7199 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs new file mode 100644 index 000000000..34cad4e02 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs @@ -0,0 +1,133 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityHDRP + +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; +using UnityEngine.Rendering.RendererUtils; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + internal sealed class WaterSurfaceCustomPass : CustomPass + { + const string k_Name = "Water Surface"; + + static WaterSurfaceCustomPass s_Instance; + + WaterRenderer _Water; + + // We disable the pass we want, so target another. + ShaderTagId _ShaderTagID = new("DepthOnly"); + + static readonly RenderTargetIdentifier[] s_RenderTargets = new RenderTargetIdentifier[2]; + + public static void Enable(WaterRenderer renderer) + { + var gameObject = CustomPassHelpers.CreateOrUpdate + ( + parent: renderer.Container.transform, + k_Name, + hide: !renderer._Debug._ShowHiddenObjects + ); + + CustomPassHelpers.CreateOrUpdate + ( + gameObject, + ref s_Instance, + WaterRenderer.k_DrawWater, + CustomPassInjectionPoint.BeforeTransparent + ); + + s_Instance._Water = renderer; + + s_Instance.targetColorBuffer = TargetBuffer.Camera; + s_Instance.targetDepthBuffer = TargetBuffer.Camera; + } + + public static void Disable() + { + // It should be safe to rely on this reference for this reference to fail. + if (s_Instance != null && s_Instance._GameObject != null) + { + // Will also trigger Cleanup below. + s_Instance._GameObject.SetActive(false); + } + } + + protected override void Execute(CustomPassContext context) + { + var hdCamera = context.hdCamera; + var camera = hdCamera.camera; + + if (!WaterRenderer.ShouldRender(camera, _Water.Surface.Layer)) + { + return; + } + + // Our reflections do not need them. + if (camera == WaterReflections.CurrentCamera) + { + return; + } + + if (_Water.Surface.Material == null) + { + return; + } + + if (hdCamera.msaaEnabled) + { + WaterRenderer.s_CameraMSAA = true; + return; + } + + var buffer = context.cmd; + + buffer.BeginSample(k_DrawWaterSurface); + + s_RenderTargets[0] = context.cameraColorBuffer; + s_RenderTargets[1] = context.cameraMotionVectorsBuffer; + + CoreUtils.SetRenderTarget(buffer, s_RenderTargets, context.cameraDepthBuffer); + + var apv = FrameSettingsField. +#if UNITY_6000_0_OR_NEWER + AdaptiveProbeVolume; +#else + ProbeVolume; +#endif + + var rendererConfiguration = HDUtils.GetRendererConfiguration + ( + context.hdCamera.frameSettings.IsEnabled(apv), + context.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask) + ); + + if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.MotionVectors)) + { + rendererConfiguration |= PerObjectData.MotionVectors; + } + + var rld = new RendererListDesc(_ShaderTagID, context.cullingResults, camera) + { + layerMask = 1 << _Water.Surface.Layer, + overrideShader = _Water.Surface.Material.shader, + overrideShaderPassIndex = _Water.Surface.Material.FindPass("Forward"), + renderQueueRange = RenderQueueRange.transparent, + sortingCriteria = SortingCriteria.CommonOpaque, + excludeObjectMotionVectors = false, + rendererConfiguration = rendererConfiguration, + }; + + buffer.DrawRendererList(context.renderContext.CreateRendererList(rld)); + + buffer.EndSample(k_DrawWaterSurface); + } + } + } +} + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs.meta new file mode 100644 index 000000000..28893bc54 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.HighDefinition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 144e7e4c014db437fbf04fcce4ae4aac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs new file mode 100644 index 000000000..80ecbd838 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs @@ -0,0 +1,243 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; +using UnityEngine.Rendering; +using WaveHarmonic.Crest.Internal; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + partial class ShaderIDs + { + public static readonly int s_DummyTarget = Shader.PropertyToID("_Crest_DummyTarget"); + public static readonly int s_WorldToShadow = Shader.PropertyToID("_Crest_WorldToShadow"); + + public static class Unity + { + public static readonly int s_BuiltInSurface = Shader.PropertyToID("_BUILTIN_Surface"); + public static readonly int s_BuiltInTransparentReceiveShadows = Shader.PropertyToID("_BUILTIN_TransparentReceiveShadows"); + } + } + + CommandBuffer _DrawWaterSurfaceBuffer; + + void OnBeginCameraRenderingLegacy(Camera camera) + { + _Water.UpdateMatrices(camera); + +#if UNITY_EDITOR + if (!Application.isPlaying) + { + OnPreRenderWaterLevelDepthTexture(camera); + } +#endif + + // Everything from here depends on the material being transparent. + if (!IsTransparent(Material)) + { + return; + } + + camera.depthTextureMode |= DepthTextureMode.Depth; + + _DrawWaterSurfaceBuffer ??= new() { name = WaterRenderer.k_DrawWater }; + _DrawWaterSurfaceBuffer.Clear(); + + // Create or update RT. + _Water.OnBeginCameraOpaqueTexture(camera); + + SetUpShadows(camera); + + + if (_Water.RenderBeforeTransparency) + { + Draw(_DrawWaterSurfaceBuffer, camera); + } + + camera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _DrawWaterSurfaceBuffer); + } + + void OnEndCameraRenderingLegacy(Camera camera) + { +#if UNITY_EDITOR + if (!Application.isPlaying) + { + OnPostRenderWaterLevelDepthTexture(camera); + } +#endif + + _Water.OnEndCameraOpaqueTexture(camera); + + if (_DrawWaterSurfaceBuffer != null) + { + camera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _DrawWaterSurfaceBuffer); + } + + if (QualitySettings.shadows != ShadowQuality.Disable && _Water.PrimaryLight != null) + { + if (_ScreenSpaceShadowMapBuffer != null) + { + _Water.PrimaryLight.RemoveCommandBuffer(LightEvent.AfterScreenspaceMask, _ScreenSpaceShadowMapBuffer); + } + + if (_DeferredShadowMapBuffer != null) + { + _Water.PrimaryLight.RemoveCommandBuffer(LightEvent.AfterShadowMap, _DeferredShadowMapBuffer); + } + } + + Shader.SetGlobalTexture(Crest.ShaderIDs.Unity.s_ShadowMapTexture, Texture2D.whiteTexture); + } + + // Draws the water surface including lighting. + internal void Draw(CommandBuffer commands, Camera camera) + { + commands.BeginSample(k_DrawWaterSurface); + + CoreUtils.SetRenderTarget(commands, BuiltinRenderTextureType.CameraTarget); + + var sun = RenderSettings.sun; + if (sun != null) + { + // Unity does not set up lighting for us so we will get the last value which could incorrect. + // SetGlobalColor is just an alias for SetGlobalVector (no color space conversion like Material.SetColor): + // https://docs.unity3d.com/2017.4/Documentation/ScriptReference/Shader.SetGlobalColor.html + commands.SetGlobalVector(Crest.ShaderIDs.Unity.s_LightColor0, sun.FinalColor()); + commands.SetGlobalVector(Crest.ShaderIDs.Unity.s_WorldSpaceLightPos0, -sun.transform.forward); + } + + // Always enabled. + commands.SetShaderKeyword("LIGHTPROBE_SH", true); + + UpdateChunkVisibility(camera); + + foreach (var chunk in Chunks) + { + var renderer = chunk.Rend; + + if (chunk.Rend == null) + { + continue; + } + + if (!chunk._Visible) + { + continue; + } + + if (chunk._Culled) + { + continue; + } + + if (!chunk._WaterDataHasBeenBound) + { + chunk.Bind(); + } + + var mpb = new PropertyWrapperMPB(chunk._MaterialPropertyBlock); + mpb.SetSHCoefficients(chunk.transform.position); + commands.DrawMesh(chunk._Mesh, chunk.transform.localToWorldMatrix, renderer.sharedMaterial, 0, 0, chunk._MaterialPropertyBlock); + } + + commands.EndSample(k_DrawWaterSurface); + } + } + + partial class SurfaceRenderer + { + Material _ForceShadowsMaterial; + ComputeBuffer _ShadowMatrixBuffer; + readonly Matrix4x4[] _ShadowMatrixDefaults = { Matrix4x4.zero, Matrix4x4.zero, Matrix4x4.zero, Matrix4x4.zero }; + Material _CaptureShadowMatrices; + + CommandBuffer _DeferredShadowMapBuffer; + CommandBuffer _ScreenSpaceShadowMapBuffer; + + void LegacyOnEnable() + { + _ShadowMatrixBuffer ??= new(4, sizeof(float) * 16, ComputeBufferType.Structured); + _ShadowMatrixBuffer.SetData(_ShadowMatrixDefaults); + } + + void LegacyOnDisable() + { + _ShadowMatrixBuffer?.Dispose(); + _ShadowMatrixBuffer = null; + } + + void SetUpShadows(Camera camera) + { + if (QualitySettings.shadows == ShadowQuality.Disable || _Water.PrimaryLight == null) + { + return; + } + + var transform = camera.transform; + + if (_ForceShadowsMaterial == null) + { + _ForceShadowsMaterial = new Material(WaterResources.Instance.Shaders._ForceShadows); + } + + // Force shadows, as Unity ignores transparent shadow receivers, otherwise shadow + // passes will skip if caster or receiver out of view. ShadowLod also depends on this. + Graphics.RenderMesh + ( + new(_ForceShadowsMaterial) + { + receiveShadows = true, + shadowCastingMode = ShadowCastingMode.Off, + }, + mesh: Helpers.QuadMesh, + submeshIndex: 0, + objectToWorld: QualitySettings.shadowProjection == ShadowProjection.StableFit + ? Matrix4x4.TRS(transform.position + transform.forward, Quaternion.LookRotation(transform.forward), Vector3.one * 0.01f) + // TODO: render water level inputs to support shadows for varying water level. + // Sort of works for close fit. But will decrease shadow quality. + : Matrix4x4.TRS(Vector3.up * _Water.SeaLevel, Quaternion.LookRotation(-Vector3.up), Vector3.one * 100f) + ); + + if (!Material.IsKeywordEnabled("_BUILTIN_TRANSPARENT_RECEIVES_SHADOWS")) + { + return; + } + + if (_CaptureShadowMatrices == null) + { + _CaptureShadowMatrices = new Material(WaterResources.Instance.Shaders._CaptureShadowMatrices); + } + + // Used ComputeBuffer must always be bound! + Shader.SetGlobalBuffer(ShaderIDs.s_WorldToShadow, _ShadowMatrixBuffer); + // Capture shadow matrices, as Unity clears all but the first cascade. + _ScreenSpaceShadowMapBuffer ??= new() { name = WaterRenderer.k_DrawWater }; + _ScreenSpaceShadowMapBuffer.Clear(); + // Cannot set target to None, as it will make some UI black (Unity bug?). + _ScreenSpaceShadowMapBuffer.GetTemporaryRT(ShaderIDs.s_DummyTarget, new RenderTextureDescriptor(4, 4)); + CoreUtils.SetRenderTarget(_ScreenSpaceShadowMapBuffer, ShaderIDs.s_DummyTarget); + // Setting the buffer (SetGlobalBuffer) and writing to it only worked with Metal. + // For other graphics APIs, had to use SetRandomWriteTarget. + _ScreenSpaceShadowMapBuffer.ClearRandomWriteTargets(); + _ScreenSpaceShadowMapBuffer.SetRandomWriteTarget(1, _ShadowMatrixBuffer); + _ScreenSpaceShadowMapBuffer.DrawProcedural(Matrix4x4.identity, _CaptureShadowMatrices, 0, MeshTopology.Triangles, 3); + _ScreenSpaceShadowMapBuffer.ClearRandomWriteTargets(); + _ScreenSpaceShadowMapBuffer.ReleaseTemporaryRT(ShaderIDs.s_DummyTarget); + _Water.PrimaryLight.AddCommandBuffer(LightEvent.AfterScreenspaceMask, _ScreenSpaceShadowMapBuffer); + + // Make shadow map available to transparents. + // Call this regardless of rendering path as it has no negative consequences for forward. + _DeferredShadowMapBuffer ??= new() { name = WaterRenderer.k_DrawWater }; + _DeferredShadowMapBuffer.Clear(); + _DeferredShadowMapBuffer.SetGlobalTexture(Crest.ShaderIDs.Unity.s_ShadowMapTexture, BuiltinRenderTextureType.CurrentActive); + _Water.PrimaryLight.AddCommandBuffer(LightEvent.AfterShadowMap, _DeferredShadowMapBuffer); + + // Set up shadow keywords. + _DrawWaterSurfaceBuffer.SetKeyword(new("SHADOWS_SINGLE_CASCADE"), QualitySettings.shadowCascades == 1); + _DrawWaterSurfaceBuffer.SetKeyword(new("SHADOWS_SPLIT_SPHERES"), QualitySettings.shadowProjection == ShadowProjection.StableFit); + _DrawWaterSurfaceBuffer.SetKeyword(new("SHADOWS_SOFT"), QualitySettings.shadows == ShadowQuality.All); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs.meta new file mode 100644 index 000000000..613f13307 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Legacy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 729ce6767111740d78a05608c8fb03c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs new file mode 100644 index 000000000..0fd2f3848 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs @@ -0,0 +1,70 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityHDRP + +using UnityEngine; +using UnityEngine.Rendering.HighDefinition; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + sealed class WaterLevelDepthTextureHDRP : CustomPass + { + static WaterLevelDepthTextureHDRP s_Instance; + WaterRenderer _Water; + SurfaceRenderer _Surface; + + internal static void Enable(WaterRenderer water, SurfaceRenderer surface) + { + var gameObject = CustomPassHelpers.CreateOrUpdate + ( + parent: water.Container.transform, + k_WaterLevelDepthTextureName, + hide: !water._Debug._ShowHiddenObjects + ); + + CustomPassHelpers.CreateOrUpdate + ( + gameObject, + ref s_Instance, + k_WaterLevelDepthTextureName, + CustomPassInjectionPoint.BeforeRendering + ); + + s_Instance._Water = water; + s_Instance._Surface = surface; + } + + public static void Disable() + { + // It should be safe to rely on this reference for this reference to fail. + if (s_Instance != null && s_Instance._GameObject != null) + { + // Will also trigger Cleanup below. + s_Instance._GameObject.SetActive(false); + } + } + + protected override void Execute(CustomPassContext context) + { + var camera = context.hdCamera.camera; + + if (Application.isPlaying) + { + return; + } + + if (camera.cameraType != CameraType.SceneView || camera != _Water.Viewer) + { + return; + } + + _Surface.ExecuteWaterLevelDepthTexture(camera, context.cmd); + } + } + } +} + +#endif // d_UnityHDRP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs.meta new file mode 100644 index 000000000..c507b4579 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.HighDefinition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bc32c22349e84f57b3571b886bc8b63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs new file mode 100644 index 000000000..0b4529075 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs @@ -0,0 +1,40 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; +using UnityEngine.Rendering; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + CommandBuffer _WaterLevelDepthBuffer; + + void OnPreRenderWaterLevelDepthTexture(Camera camera) + { + if (camera.cameraType != CameraType.SceneView || camera != _Water.Viewer) + { + return; + } + + _WaterLevelDepthBuffer ??= new() { name = k_WaterLevelDepthTextureName }; + _WaterLevelDepthBuffer.Clear(); + + ExecuteWaterLevelDepthTexture(camera, _WaterLevelDepthBuffer); + + // Both forward and deferred. + camera.AddCommandBuffer(CameraEvent.BeforeDepthTexture, _WaterLevelDepthBuffer); + camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _WaterLevelDepthBuffer); + } + + void OnPostRenderWaterLevelDepthTexture(Camera camera) + { + if (_WaterLevelDepthBuffer != null) + { + // Both forward and deferred. + camera.RemoveCommandBuffer(CameraEvent.BeforeDepthTexture, _WaterLevelDepthBuffer); + camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, _WaterLevelDepthBuffer); + } + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs.meta new file mode 100644 index 000000000..5a10c5f6a --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Legacy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb2445377c8974383bd1b3b4afa85646 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs new file mode 100644 index 000000000..d48fcd3de --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs @@ -0,0 +1,86 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityURP + +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + sealed class WaterLevelDepthTextureURP : ScriptableRenderPass + { + internal static WaterLevelDepthTextureURP s_Instance; + WaterRenderer _Water; + SurfaceRenderer _Surface; + + internal WaterLevelDepthTextureURP() + { + // Will always execute and matrices will be ready. + renderPassEvent = RenderPassEvent.BeforeRenderingPrePasses; + } + + internal static void Enable(WaterRenderer water, SurfaceRenderer surface) + { + s_Instance ??= new(); + s_Instance._Water = water; + s_Instance._Surface = surface; + } + + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + { + if (Application.isPlaying) + { + return; + } + + if (camera.cameraType != CameraType.SceneView || camera != _Water.Viewer) + { + return; + } + + // Enqueue the pass. This happens every frame. + camera.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(this); + } + +#if UNITY_6000_0_OR_NEWER + class PassData + { + public UniversalCameraData _CameraData; + public SurfaceRenderer _Surface; + } + + public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, ContextContainer frame) + { + using (var builder = graph.AddUnsafePass(k_WaterLevelDepthTextureName, out var data)) + { + builder.AllowPassCulling(false); + + data._CameraData = frame.Get(); + data._Surface = _Surface; + + builder.SetRenderFunc((data, context) => + { + var buffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd); + _Surface.ExecuteWaterLevelDepthTexture(data._CameraData.camera, buffer); + }); + } + } + + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData data) + { + var buffer = CommandBufferPool.Get(k_WaterLevelDepthTextureName); + _Surface.ExecuteWaterLevelDepthTexture(data.cameraData.camera, buffer); + context.ExecuteCommandBuffer(buffer); + CommandBufferPool.Release(buffer); + } + } + } +} + +#endif // d_UnityURP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs.meta new file mode 100644 index 000000000..f50b68d75 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.Universal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8926d03a42e31434eb70caddd59f0466 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs new file mode 100644 index 000000000..e2db06a3b --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs @@ -0,0 +1,84 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// FIXME: Broken for BIRP on MacOS. Either platform specific problem or bug in Unity. + +using UnityEngine; +using UnityEngine.Rendering; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + RenderTexture _WaterLevelDepthTexture; + internal RenderTexture WaterLevelDepthTexture => _WaterLevelDepthTexture; + RenderTargetIdentifier _WaterLevelDepthTarget; + Material _WaterLevelDepthMaterial; + + const string k_WaterLevelDepthTextureName = "Crest Water Level Depth Texture"; + + void ExecuteWaterLevelDepthTexture(Camera camera, CommandBuffer buffer) + { + Helpers.CreateRenderTargetTextureReference(ref _WaterLevelDepthTexture, ref _WaterLevelDepthTarget); + _WaterLevelDepthTexture.name = k_WaterLevelDepthTextureName; + + if (_WaterLevelDepthMaterial == null) + { + _WaterLevelDepthMaterial = new(Shader.Find("Hidden/Crest/Editor/Water Level (Depth)")); + } + + var descriptor = new RenderTextureDescriptor(camera.pixelWidth, camera.pixelHeight) + { + graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.None, + depthBufferBits = 32, + }; + + // Depth buffer. + buffer.GetTemporaryRT(Helpers.ShaderIDs.s_MainTexture, descriptor); + CoreUtils.SetRenderTarget(buffer, Helpers.ShaderIDs.s_MainTexture, ClearFlag.Depth); + + Render(camera, buffer, _WaterLevelDepthMaterial); + + // Depth texture. + // Always release to handle screen size changes. + _WaterLevelDepthTexture.Release(); + descriptor.graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.R32_SFloat; + descriptor.depthBufferBits = 0; + Helpers.SafeCreateRenderTexture(ref _WaterLevelDepthTexture, descriptor); + _WaterLevelDepthTexture.Create(); + + // Convert. + Helpers.Blit(buffer, _WaterLevelDepthTarget, Rendering.BIRP.UtilityMaterial, (int)Rendering.BIRP.UtilityPass.Copy); + + buffer.ReleaseTemporaryRT(Helpers.ShaderIDs.s_MainTexture); + } + + void EnableWaterLevelDepthTexture() + { + if (Application.isPlaying) return; + +#if d_UnityURP + if (RenderPipelineHelper.IsUniversal) + { + WaterLevelDepthTextureURP.Enable(_Water, this); + } +#endif + +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + WaterLevelDepthTextureHDRP.Enable(_Water, this); + } +#endif + } + + void DisableWaterLevelDepthTexture() + { + if (Application.isPlaying) return; + +#if d_UnityHDRP + WaterLevelDepthTextureHDRP.Disable(); +#endif + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs.meta new file mode 100644 index 000000000..a50c728f7 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.LevelDepthTexture.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b48c0a50256ea4177ba95870d7a211b2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs new file mode 100644 index 000000000..023398fbd --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs @@ -0,0 +1,163 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityURP + +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.RendererUtils; +using UnityEngine.Rendering.Universal; + +namespace WaveHarmonic.Crest +{ + partial class SurfaceRenderer + { + internal sealed class WaterSurfaceRenderPass : ScriptableRenderPass + { + readonly WaterRenderer _Water; + public static WaterSurfaceRenderPass Instance { get; set; } + + // We disable the pass we want, so target another. + ShaderTagId _ShaderTagID = new("DepthOnly"); + + public WaterSurfaceRenderPass(WaterRenderer water) + { + _Water = water; + renderPassEvent = RenderPassEvent.BeforeRenderingTransparents; + + // Copy color happens between "after skybox" and "before transparency". + ConfigureInput(ScriptableRenderPassInput.Color | ScriptableRenderPassInput.Depth); + } + + public static void Enable(WaterRenderer water) + { +#if UNITY_EDITOR + var data = water.Viewer != null ? water.Viewer.GetUniversalAdditionalCameraData() : null; + + // Type is internal. + if (data != null && data.scriptableRenderer.GetType().Name == "Renderer2D") + { + UnityEditor.EditorUtility.DisplayDialog + ( + "Crest Error!", + "The project has been detected as a URP 2D project. Crest only supports 3D projects. " + + "You may see errors from Crest in the console, and other issues.", + "Ok" + ); + } +#endif + + Instance = new WaterSurfaceRenderPass(water); + } + + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + { + if (!WaterRenderer.ShouldRender(camera, Instance._Water.Surface.Layer)) + { + return; + } + + // Our reflections do not need them. + if (camera == WaterReflections.CurrentCamera) + { + return; + } + + if (Instance._Water.Surface.Material == null) + { + return; + } + + if (!IsTransparent(Instance._Water.Surface.Material)) + { + return; + } + + camera.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(Instance); + } + +#if UNITY_6000_0_OR_NEWER + class PassData + { + public UnityEngine.Rendering.RenderGraphModule.RendererListHandle _RendererList; + } + + readonly RenderGraphHelper.PassData _PassData = new(); + + public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, ContextContainer frame) + { + if (!_Water.RenderBeforeTransparency) + { + return; + } + + using (var builder = graph.AddRasterRenderPass("Crest.DrawWater/Surface", out var data)) + { + + var resourceData = frame.Get(); + var cameraData = frame.Get(); + var renderingData = frame.Get(); + + // Make inputs show in RG viewer. We configure them already which makes them + // available, but that might change when Unity removes compatibility mode. If that + // happens, we also have to reconsider pass culling to ensure inputs are available + // when rendering to transparent pass. + builder.UseTexture(resourceData.cameraDepthTexture, UnityEngine.Rendering.RenderGraphModule.AccessFlags.Read); + builder.UseTexture(resourceData.cameraOpaqueTexture, UnityEngine.Rendering.RenderGraphModule.AccessFlags.Read); + + // We do not want to use the back buffers, as it will prevent merging? + // This is recommended. Back buffers are used at end of frame typically. + builder.SetRenderAttachment(resourceData.activeColorTexture, 0); + builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture); + + var rld = new RendererListDesc(_ShaderTagID, renderingData.cullResults, cameraData.camera) + { + layerMask = 1 << _Water.Surface.Layer, + overrideShader = _Water.Surface.Material.shader, + overrideShaderPassIndex = 0, // UniversalForward + renderQueueRange = RenderQueueRange.transparent, + sortingCriteria = SortingCriteria.CommonOpaque, + rendererConfiguration = renderingData.perObjectData, + }; + + data._RendererList = graph.CreateRendererList(rld); + builder.UseRendererList(data._RendererList); + + builder.SetRenderFunc((data, context) => + { + context.cmd.DrawRendererList(data._RendererList); + }); + } + } + + [System.Obsolete] +#endif + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + if (!_Water.RenderBeforeTransparency) + { + return; + } + + var buffer = CommandBufferPool.Get("Crest.DrawWater/Surface"); + + var rld = new RendererListDesc(_ShaderTagID, renderingData.cullResults, renderingData.cameraData.camera) + { + layerMask = 1 << _Water.Surface.Layer, + overrideShader = _Water.Surface.Material.shader, + overrideShaderPassIndex = 0, // UniversalForward + renderQueueRange = RenderQueueRange.transparent, + sortingCriteria = SortingCriteria.CommonOpaque, + rendererConfiguration = renderingData.perObjectData, + }; + + buffer.DrawRendererList(context.CreateRendererList(rld)); + + context.ExecuteCommandBuffer(buffer); + CommandBufferPool.Release(buffer); + } + } + } +} + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs.meta new file mode 100644 index 000000000..32ddb73e4 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.Universal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ea612be74ded47e5a970d7e4e8d540a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs new file mode 100644 index 000000000..26f446692 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs @@ -0,0 +1,858 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using System.Buffers; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using WaveHarmonic.Crest.Utility; + +namespace WaveHarmonic.Crest +{ + /// + /// Renders the water surface. + /// + [System.Serializable] + public sealed partial class SurfaceRenderer + { + [SerializeField, HideInInspector] +#pragma warning disable 414 + int _Version = 0; +#pragma warning restore 414 + + [@Space(10)] + + [Tooltip("Whether the underwater effect is enabled.\n\nAllocates/releases resources if state has changed.")] + [@GenerateAPI(Getter.Custom, Setter.Custom)] + [@DecoratedField, SerializeField] + internal bool _Enabled = true; + + [Tooltip("The water chunk renderers will have this layer.")] + [@Layer] + [@GenerateAPI] + [SerializeField] + internal int _Layer = 4; // Water + + [Tooltip("Material to use for the water surface.")] + [@AttachMaterialEditor(order: 0)] + [@MaterialField("Crest/Water", name: "Water", title: "Create Water Material")] + [@GenerateAPI] + [SerializeField] + internal Material _Material = null; + + [Tooltip("Underwater will copy from this material if set.\n\nUseful for overriding properties for the underwater effect. To see what properties can be overriden, see the disabled properties on the underwater material. This does not affect the surface.")] + [@AttachMaterialEditor(order: 1)] + [@MaterialField("Crest/Water", name: "Water (Below)", title: "Create Water Material", parent: "_Material")] + [@GenerateAPI] + [SerializeField] + internal Material _VolumeMaterial = null; + + [Tooltip("Template for water chunks as a prefab.\n\nThe only requirements are that the prefab must contain a MeshRenderer at the root and not a MeshFilter or WaterChunkRenderer. MR values will be overwritten where necessary and the prefabs are linked in edit mode.")] + [@PrefabField(title: "Create Chunk Prefab", name: "Water Chunk")] + [SerializeField] + internal GameObject _ChunkTemplate; + + [@Space(10)] + + [Tooltip("Have the water surface cast shadows for albedo (both foam and custom).")] + [@GenerateAPI(Getter.Custom)] + [@DecoratedField, SerializeField] + internal bool _CastShadows; + + [@Heading("Culling")] + + [Tooltip("Whether 'Water Body' components will cull the water tiles.\n\nDisable if you want to use the 'Material Override' feature and still have an ocean.")] + [@GenerateAPI] + [@DecoratedField, SerializeField] + internal bool _WaterBodyCulling = true; + + [Tooltip("How many frames to distribute the chunk bounds calculation.\n\nThe chunk bounds are calculated per frame to ensure culling is correct when using inputs that affect displacement. Some performance can be saved by distributing the load over several frames. The higher the frames, the longer it will take - lowest being instant.")] + [@Range(1, 30, Range.Clamp.Minimum)] + [@GenerateAPI] + [SerializeField] + internal int _TimeSliceBoundsUpdateFrameCount = 1; + + [@Heading("Advanced")] + + [Tooltip("How to handle self-intersections of the water surface.\n\nThey can be caused by choppy waves which can cause a flipped underwater effect. When not using the portals/volumes, this fix is only applied when within 2 metres of the water surface. Automatic will disable the fix if portals/volumes are used which is the recommend setting.")] + [@DecoratedField, SerializeField] + internal SurfaceSelfIntersectionFixMode _SurfaceSelfIntersectionFixMode = SurfaceSelfIntersectionFixMode.Automatic; + + [Tooltip("Whether to allow sorting using the render queue.\n\nIf you need to change the minor part of the render queue (eg +100), then enable this option. As a side effect, it will also disable the front-to-back rendering optimization for Crest. This option does not affect changing the major part of the render queue (eg AlphaTest, Transparent), as that is always allowed.\n\nRender queue sorting is required for some third-party integrations.")] + [@Predicated(RenderPipeline.HighDefinition, inverted: true, hide: true)] + [@GenerateAPI] + [@DecoratedField, SerializeField] + internal bool _AllowRenderQueueSorting; + + [@Space(10)] + +#if !CREST_DEBUG + [HideInInspector] +#endif + [@DecoratedField, SerializeField] + internal DebugFields _Debug = new(); + + [System.Serializable] + internal sealed class DebugFields + { +#if !CREST_DEBUG + [HideInInspector] +#endif + [Tooltip("Whether to generate water geometry tiles uniformly (with overlaps).")] + [@DecoratedField, SerializeField] + public bool _UniformTiles; + +#if !CREST_DEBUG + [HideInInspector] +#endif + [Tooltip("Disable generating a wide strip of triangles at the outer edge to extend water to edge of view frustum.")] + [@DecoratedField, SerializeField] + public bool _DisableSkirt; + } + + const string k_DrawWaterSurface = "Surface"; + + internal WaterRenderer _Water; + internal Transform Root { get; private set; } + internal List Chunks { get; } = new(); + internal bool _Rebuild; + + + // + // Level of Detail + // + + // Extra frame is for motion vectors. + internal BufferedData _PerCascadeMPB = new(2, () => new MaterialPropertyBlock[Lod.k_MaximumSlices]); + + // We are computing these values to be optimal based on the base mesh vertex density. + float _LodAlphaBlackPointFade; + float _LodAlphaBlackPointWhitePointFade; + + + // + // Culling + // + + internal readonly Plane[] _CameraFrustumPlanes = new Plane[6]; + bool _CanSkipCulling; + internal bool _DoneChunkVisibility; + + + // + // Events + // + + /// + /// Invoked after water chunk modification. + /// + /// + /// Gives an opportunity to modify the renderer. + /// + public static System.Action OnCreateChunkRenderer { get; set; } + + + internal Material _MotionVectorMaterial; + + internal Material AboveOrBelowSurfaceMaterial => _VolumeMaterial == null ? _Material : _VolumeMaterial; + + + // + // Facing + // + + internal enum SurfaceSelfIntersectionFixMode + { + [Tooltip("Uses VFACE/IsFrontFace.")] + Off, + + [Tooltip("Force entire water surface to render as below water.")] + ForceBelowWater, + + [Tooltip("Force entire water surface to render as above water.")] + ForceAboveWater, + + [Tooltip("Force entire water surface to render as above or below water if beyond a distance from surface, otherwise use mask/facing.")] + On, + + [Tooltip("Force entire water surface to render as above or below water if beyond a distance from surface (except in special circumstances like Portals).")] + Automatic, + } + + enum ForceFacing + { + None, + BelowWater, + AboveWater, + Facing, + } + + + static partial class ShaderIDs + { + public static readonly int s_ForceUnderwater = Shader.PropertyToID("g_Crest_ForceUnderwater"); + public static readonly int s_LodAlphaBlackPointFade = Shader.PropertyToID("g_Crest_LodAlphaBlackPointFade"); + public static readonly int s_LodAlphaBlackPointWhitePointFade = Shader.PropertyToID("g_Crest_LodAlphaBlackPointWhitePointFade"); + + public static readonly int s_BuiltShadowCasterZTest = Shader.PropertyToID("_Crest_BUILTIN_ShadowCasterZTest"); + + public static readonly int s_ChunkMeshScaleAlpha = Shader.PropertyToID("_Crest_ChunkMeshScaleAlpha"); + public static readonly int s_ChunkGeometryGridWidth = Shader.PropertyToID("_Crest_ChunkGeometryGridWidth"); + public static readonly int s_ChunkFarNormalsWeight = Shader.PropertyToID("_Crest_ChunkFarNormalsWeight"); + public static readonly int s_ChunkNormalScrollSpeed = Shader.PropertyToID("_Crest_ChunkNormalScrollSpeed"); + public static readonly int s_ChunkMeshScaleAlphaSource = Shader.PropertyToID("_Crest_ChunkMeshScaleAlphaSource"); + public static readonly int s_ChunkGeometryGridWidthSource = Shader.PropertyToID("_Crest_ChunkGeometryGridWidthSource"); + } + + internal void Initialize() + { + Root = Builder.GenerateMesh(_Water, this, Chunks, _Water.LodResolution, _Water._GeometryDownSampleFactor, _Water.LodLevels); + + Root.position = _Water.Position; + Root.localScale = new(_Water.Scale, 1f, _Water.Scale); + + // Populate MPBs with defaults. + for (var index = 0; index < _Water.LodLevels; index++) + { + for (var frame = 0; frame < 2; frame++) + { + var mpb = new MaterialPropertyBlock(); + mpb.SetInteger(Lod.ShaderIDs.s_LodIndex, index); + mpb.SetFloat(ShaderIDs.s_ChunkFarNormalsWeight, 1f); + mpb.SetFloat(ShaderIDs.s_ChunkMeshScaleAlpha, 0f); + mpb.SetFloat(ShaderIDs.s_ChunkMeshScaleAlphaSource, 0f); + _PerCascadeMPB.Previous(frame)[index] = mpb; + } + } + + // Resolution is 4 tiles across. + var baseMeshDensity = _Water.LodResolution * 0.25f / _Water._GeometryDownSampleFactor; + // 0.4f is the "best" value when base mesh density is 8. Scaling down from there produces results similar to + // hand crafted values which looked good when the water is flat. + _LodAlphaBlackPointFade = 0.4f / (baseMeshDensity / 8f); + _LodAlphaBlackPointWhitePointFade = 1f - _LodAlphaBlackPointFade - _LodAlphaBlackPointFade; + + Shader.SetGlobalFloat(ShaderIDs.s_LodAlphaBlackPointFade, _LodAlphaBlackPointFade); + Shader.SetGlobalFloat(ShaderIDs.s_LodAlphaBlackPointWhitePointFade, _LodAlphaBlackPointWhitePointFade); + + UpdateMaterial(_Material, ref _MotionVectorMaterial); + + _CanSkipCulling = false; + + if (RenderPipelineHelper.IsLegacy) + { + LegacyOnEnable(); + } + +#if UNITY_EDITOR + EnableWaterLevelDepthTexture(); +#endif + } + + internal void OnDestroy() + { +#if UNITY_EDITOR + DisableWaterLevelDepthTexture(); +#endif + + // Clean up everything created through the Water Builder. + // Not every mesh is assigned to a chunk thus we should destroy all of them here. + for (var i = 0; i < _Meshes?.Length; i++) + { + Helpers.Destroy(_Meshes[i]); + } + + Chunks.Clear(); + CoreUtils.Destroy(_MotionVectorMaterial); + CoreUtils.Destroy(_DisplacedMaterial); + + if (Root != null) + { + CoreUtils.Destroy(Root.gameObject); + Root = null; + } + + if (RenderPipelineHelper.IsLegacy) + { + LegacyOnDisable(); + } + } + + void ShowHiddenObjects(bool show) + { + foreach (var chunk in Chunks) + { + chunk.gameObject.hideFlags = show ? HideFlags.DontSave : HideFlags.HideAndDontSave; + } + } + + // Chunk Visibility. + // check if needed here + // complicated. cos we would have to either check everything that may need it + // or have a loop going over an abstraction + internal void UpdateChunkVisibility(Camera camera) + { + if (_DoneChunkVisibility) + { + return; + } + + GeometryUtility.CalculateFrustumPlanes(camera, _CameraFrustumPlanes); + + foreach (var chunk in Chunks) + { + var renderer = chunk.Rend; + // Can happen in edit mode. + if (renderer == null) continue; + chunk._Visible = GeometryUtility.TestPlanesAABB(_CameraFrustumPlanes, renderer.bounds); + } + + _DoneChunkVisibility = true; + } + + internal void UpdateMaterial(Material material, ref Material motion) + { + if (material == null) + { + return; + } + + var enable = !_Water.RenderBeforeTransparency; + material.SetShaderPassEnabled("Forward", enable); + material.SetShaderPassEnabled("ForwardAdd", enable); + material.SetShaderPassEnabled("ForwardBase", enable); + material.SetShaderPassEnabled("UniversalForward", enable); + + // HDRP will automatically disable this pass for unknown reasons. It might be that + // we are sampling from the depth texture which does not work with shadow casting. + if (RenderPipelineHelper.IsHighDefinition) + { + material.SetShaderPassEnabled("ShadowCaster", _CastShadows); + } + + UpdateMotionVectorsMaterial(material, ref motion); + } + + internal static bool IsTransparent(Material material) + { + return RenderPipelineHelper.IsLegacy + ? material.IsKeywordEnabled("_BUILTIN_SURFACE_TYPE_TRANSPARENT") + : material.IsKeywordEnabled("_SURFACE_TYPE_TRANSPARENT"); + } + + void Rebuild() + { + OnDestroy(); + Initialize(); + _Rebuild = false; + } + + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + { + if (!WaterRenderer.ShouldRender(camera, Layer)) + { + return; + } + + // Our planar reflection camera must never render the surface. + if (camera == WaterReflections.CurrentCamera) + { + return; + } + + if (Material == null) + { + return; + } + + WritePerCameraMaterialParameters(camera); + + // Motion Vectors. + if (ShouldRenderMotionVectors(camera) && _QueueMotionVectors) + { + UpdateChunkVisibility(camera); + + foreach (var chunk in Chunks) + { + chunk.RenderMotionVectors(this, camera); + } + } + +#if d_UnityURP + if (RenderPipelineHelper.IsUniversal) + { +#if UNITY_EDITOR + WaterLevelDepthTextureURP.s_Instance?.OnBeginCameraRendering(context, camera); +#endif + WaterSurfaceRenderPass.Instance?.OnBeginCameraRendering(context, camera); + } + else +#endif + + if (RenderPipelineHelper.IsLegacy) + { + OnBeginCameraRenderingLegacy(camera); + } + } + + internal void OnEndCameraRendering(Camera camera) + { + _DoneChunkVisibility = false; + + if (!WaterRenderer.ShouldRender(camera, Layer)) + { + return; + } + + // Our planar reflection camera must never render the surface. + if (camera == WaterReflections.CurrentCamera) + { + return; + } + + if (RenderPipelineHelper.IsLegacy) + { + OnEndCameraRenderingLegacy(camera); + } + } + + void WritePerCameraMaterialParameters(Camera camera) + { + if (Material == null) + { + return; + } + + // If no underwater, then no need for underwater surface. + if (!_Water.Underwater.Enabled) + { + Shader.SetGlobalInteger(ShaderIDs.s_ForceUnderwater, (int)ForceFacing.AboveWater); + return; + } + + _Water.UpdatePerCameraHeight(camera); + + // Override isFrontFace when camera is far enough from the water surface to fix self-intersecting waves. + // Hack - due to SV_IsFrontFace occasionally coming through as true for back faces, + // add a param here that forces water to be in underwater state. I think the root + // cause here might be imprecision or numerical issues at water tile boundaries, although + // i'm not sure why cracks are not visible in this case. + var height = _Water._ViewerHeightAboveWaterPerCamera; + + var value = _SurfaceSelfIntersectionFixMode switch + { + SurfaceSelfIntersectionFixMode.On => + height < -2f + ? ForceFacing.BelowWater + : height > 2f + ? ForceFacing.AboveWater + : ForceFacing.None, + // Skip for portals as it is possible to see both sides of the surface at any position. + SurfaceSelfIntersectionFixMode.Automatic => + _Water.Portaled + ? ForceFacing.None + : height < -2f + ? ForceFacing.BelowWater + : height > 2f + ? ForceFacing.AboveWater + : ForceFacing.None, + // Always use facing (VFACE). + SurfaceSelfIntersectionFixMode.Off => ForceFacing.Facing, + _ => (ForceFacing)_SurfaceSelfIntersectionFixMode, + }; + + Shader.SetGlobalInteger(ShaderIDs.s_ForceUnderwater, (int)value); + } + + internal void LateUpdate() + { + if (_Rebuild) + { + Rebuild(); + } + + Root.position = _Water.Position; + Root.localScale = new(_Water.Scale, 1f, _Water.Scale); + + _PerCascadeMPB.Flip(); + WritePerCascadeInstanceData(); + + foreach (var chunk in Chunks) + { + chunk.UpdateMeshBounds(_Water, this); + } + + ApplyWaterBodyCulling(); + + LateUpdateMotionVectors(); + + UpdateMaterial(_Material, ref _MotionVectorMaterial); + + foreach (var body in WaterBody.WaterBodies) + { + if (body._Material != null) + { + UpdateMaterial(body._Material, ref body._MotionVectorMaterial); + } + } + + foreach (var chunk in Chunks) + { + chunk.OnLateUpdate(); + } + } + + void WritePerCascadeInstanceData() + { + var levels = _Water.LodLevels; + var texel = _Water.LodResolution * 0.25f / _Water._GeometryDownSampleFactor; + var mpbsCurrent = _PerCascadeMPB.Current; + var mpbsPrevious = _PerCascadeMPB.Previous(1); + + // LOD 0 + { + var mpb = mpbsCurrent[0]; + + if (_Water.WriteMotionVectors) + { + // NOTE: it may be more optimal to store in an array than fetching from MPB. + mpb.SetFloat(ShaderIDs.s_ChunkMeshScaleAlphaSource, mpbsPrevious[0].GetFloat(ShaderIDs.s_ChunkMeshScaleAlpha)); + } + + // Blend LOD 0 shape in/out to avoid pop, if scale could increase. + mpb.SetFloat(ShaderIDs.s_ChunkMeshScaleAlpha, _Water.ScaleCouldIncrease ? _Water.ViewerAltitudeLevelAlpha : 0f); + } + + // LOD N + { + var mpb = mpbsCurrent[levels - 1]; + + // Blend furthest normals scale in/out to avoid pop, if scale could reduce. + mpb.SetFloat(ShaderIDs.s_ChunkFarNormalsWeight, _Water.ScaleCouldDecrease ? _Water.ViewerAltitudeLevelAlpha : 1f); + } + + for (var index = 0; index < levels; index++) + { + var mpbCurrent = mpbsCurrent[index]; + var mpbPrevious = mpbsPrevious[index]; + + // geometry data + // compute grid size of geometry. take the long way to get there - make sure we land exactly on a power of two + // and not inherit any of the lossy-ness from lossyScale. + var scale = _Water._CascadeData.Current[index].x; + var width = scale / texel; + + if (_Water.WriteMotionVectors) + { + // NOTE: it may be more optimal to store in an array than fetching from MPB. + mpbPrevious.SetFloat(ShaderIDs.s_ChunkGeometryGridWidthSource, mpbCurrent.GetFloat(ShaderIDs.s_ChunkGeometryGridWidth)); + } + + mpbCurrent.SetFloat(ShaderIDs.s_ChunkGeometryGridWidth, width); + + var mul = 1.875f; // fudge 1 + var pow = 1.4f; // fudge 2 + var texelWidth = width / _Water._GeometryDownSampleFactor; + mpbCurrent.SetVector(ShaderIDs.s_ChunkNormalScrollSpeed, new + ( + Mathf.Pow(Mathf.Log(1f + 2f * texelWidth) * mul, pow), + Mathf.Pow(Mathf.Log(1f + 4f * texelWidth) * mul, pow), + 0, + 0 + )); + } + } + + void ApplyWaterBodyCulling() + { + var canSkipCulling = WaterBody.WaterBodies.Count == 0 && _CanSkipCulling; + + // Chunk bounds needs to be up-to-date at this point. + foreach (var tile in Chunks) + { + if (tile.Rend == null) + { + continue; + } + + tile._Culled = false; + tile.MaterialOverridden = false; + + // If there are local bodies of water, this will do overlap tests between the water tiles + // and the water bodies and turn off any that don't overlap. + if (!canSkipCulling) + { + var chunkBounds = tile.Rend.bounds; + var chunkUndisplacedBoundsXZ = tile.UnexpandedBoundsXZ; + + var largestOverlap = 0f; + var overlappingOne = false; + foreach (var body in WaterBody.WaterBodies) + { + // If tile has already been excluded from culling, then skip this iteration. But finish this + // iteration if the water body has a material override to work out most influential water body. + if (overlappingOne && body.AboveSurfaceMaterial == null) + { + continue; + } + + var bounds = body.AABB; + + var overlapping = + bounds.max.x > chunkBounds.min.x && bounds.min.x < chunkBounds.max.x && + bounds.max.z > chunkBounds.min.z && bounds.min.z < chunkBounds.max.z; + if (overlapping) + { + overlappingOne = true; + + if (body.AboveSurfaceMaterial != null) + { + var overlap = 0f; + { + // Use the unexpanded bounds to prevent leaking as generally this feature will be + // for an inland body of water where hopefully there is attenuation between it and + // the water to handle the water's displacement. The inland water body will unlikely + // have large displacement but can be mitigated with a decent buffer zone. + var xMin = Mathf.Max(bounds.min.x, chunkUndisplacedBoundsXZ.min.x); + var xMax = Mathf.Min(bounds.max.x, chunkUndisplacedBoundsXZ.max.x); + var zMin = Mathf.Max(bounds.min.z, chunkUndisplacedBoundsXZ.min.y); + var zMax = Mathf.Min(bounds.max.z, chunkUndisplacedBoundsXZ.max.y); + if (xMin < xMax && zMin < zMax) + { + overlap = (xMax - xMin) * (zMax - zMin); + } + } + + // If this water body has the most overlap, then the chunk will get its material. + if (overlap > largestOverlap) + { + tile.MaterialOverridden = true; + tile.Rend.sharedMaterial = body.AboveSurfaceMaterial; + tile._MotionVectorMaterial = body._MotionVectorMaterial; + largestOverlap = overlap; + } + } + else + { + tile.MaterialOverridden = false; + } + } + } + + tile._Culled = _WaterBodyCulling && !overlappingOne && WaterBody.WaterBodies.Count > 0; + } + + tile.Rend.enabled = !tile._Culled; + } + + // Can skip culling next time around if water body count stays at 0 + _CanSkipCulling = WaterBody.WaterBodies.Count == 0; + } + + internal void Render(Camera camera, CommandBuffer buffer, Material material = null, int pass = 0, bool culled = false) + { + var noMaterial = material == null; + + if (noMaterial && Material == null) + { + return; + } + + UpdateChunkVisibility(camera); + + // Spends approx 0.2-0.3ms here on 2018 Dell XPS 15. + foreach (var chunk in Chunks) + { + var renderer = chunk.Rend; + + // Can happen in edit mode. + if (renderer == null) + { + continue; + } + + if (!chunk._Visible) + { + continue; + } + + if (culled && chunk._Culled) + { + continue; + } + + // Make sure properties are bound for this frame. + if (!chunk._WaterDataHasBeenBound) + { + chunk.Bind(); + } + + if (noMaterial) + { + material = renderer.sharedMaterial; + } + + buffer.DrawRenderer(renderer, material, submeshIndex: 0, pass); + } + } + } + + // API + partial class SurfaceRenderer + { + bool GetEnabled() + { + return _Enabled && !_Water.IsRunningWithoutGraphics; + } + + void SetEnabled(bool previous, bool current) + { + if (previous == current) return; + if (_Water == null || !_Water.isActiveAndEnabled) return; + if (_Enabled) Initialize(); else OnDestroy(); + } + + void SetLayer(int previous, int current) + { + if (previous == current) return; + + foreach (var chunk in Chunks) + { + chunk.gameObject.layer = current; + } + } + + bool GetCastShadows() + { + return _CastShadows; + } + + void SetCastShadows(bool previous, bool current) + { + if (previous == current) return; + + foreach (var chunk in Chunks) + { + chunk.Rend.shadowCastingMode = current ? ShadowCastingMode.On : ShadowCastingMode.Off; + } + } + + void SetAllowRenderQueueSorting(bool previous, bool current) + { + if (previous == current) return; + + foreach (var chunk in Chunks) + { + chunk.Rend.sortingOrder = current ? chunk._SortingOrder : 0; + } + } + } + + // Motion Vectors + partial class SurfaceRenderer + { + bool _QueueMotionVectors; + + bool ShouldRenderMotionVectors(Camera camera) + { + // Unity enables this when motion vectors are used - even for SRPs. + if (!camera.depthTextureMode.HasFlag(DepthTextureMode.MotionVectors)) + { + return false; + } + + return true; + } + + void LateUpdateMotionVectors() + { + _QueueMotionVectors = false; + + // Handled by Unity. + if (RenderPipelineHelper.IsHighDefinition) + { + return; + } + + if (!Application.isPlaying) + { + return; + } + + if (!_Water.WriteMotionVectors) + { + return; + } + + // This will not support WBs with material overrides, but mixing opaque and + // transparent would be odd. + if (!IsTransparent(Material)) + { + return; + } + + var pool = ArrayPool.Shared; + var cameras = pool.Rent(Camera.allCamerasCount); + Camera.GetAllCameras(cameras); + + for (var i = 0; i < Camera.allCamerasCount; i++) + { + var camera = cameras[i]; + + if (!WaterRenderer.ShouldRender(camera, _Layer)) + { + continue; + } + + if (!ShouldRenderMotionVectors(camera)) + { + continue; + } + + _QueueMotionVectors = true; + } + + pool.Return(cameras); + } + + void UpdateMotionVectorsMaterial(Material surface, ref Material motion) + { + if (!_QueueMotionVectors) + { + return; + } + + if (motion == null || motion.shader != surface.shader) + { + CoreUtils.Destroy(motion); + motion = CoreUtils.CreateEngineMaterial(surface.shader); + + // BIRP + motion.SetShaderPassEnabled("ForwardBase", false); + motion.SetShaderPassEnabled("ForwardAdd", false); + motion.SetShaderPassEnabled("Deferred", false); + + // URP + motion.SetShaderPassEnabled("UniversalForward", false); + motion.SetShaderPassEnabled("UniversalGBuffer", false); + motion.SetShaderPassEnabled("Universal2D", false); + + motion.SetShaderPassEnabled("ShadowCaster", false); + motion.SetShaderPassEnabled("DepthOnly", false); + motion.SetShaderPassEnabled("DepthNormals", false); + motion.SetShaderPassEnabled("Meta", false); + motion.SetShaderPassEnabled("SceneSelectionPass", false); + motion.SetShaderPassEnabled("Picking", false); + motion.SetShaderPassEnabled("MotionVectors", true); + } + + motion.CopyMatchingPropertiesFromMaterial(surface); + motion.renderQueue = (int)RenderQueue.Geometry; + motion.SetOverrideTag("RenderType", "Opaque"); + motion.SetFloat(Crest.ShaderIDs.Unity.s_Surface, 0); // SurfaceType.Opaque + motion.SetFloat(Crest.ShaderIDs.Unity.s_SrcBlend, 1); + motion.SetFloat(Crest.ShaderIDs.Unity.s_DstBlend, 0); + motion.SetFloat(ShaderIDs.s_BuiltShadowCasterZTest, 1); // ZTest Never + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs.meta new file mode 100644 index 000000000..f4074044c --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/SurfaceRenderer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 212222792a1a241d889bed1dc799ba37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBody.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBody.cs index a3c9e665c..efc9884dc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBody.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBody.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System.Collections.Generic; @@ -42,7 +42,7 @@ namespace WaveHarmonic.Crest internal Material _BelowSurfaceMaterial; [Tooltip("Overrides the Water Renderer's volume material when the camera is inside the bounds.")] - [@MaterialField("Crest/Underwater", name: "Underwater", title: "Create Underwater Material")] + [@MaterialField(UnderwaterRenderer.k_ShaderNameEffect, name: "Underwater", title: "Create Underwater Material")] [@AttachMaterialEditor] [@GenerateAPI] [SerializeField] @@ -52,13 +52,14 @@ namespace WaveHarmonic.Crest bool _RecalculateRect = true; bool _RecalculateBounds = true; + internal Material _MotionVectorMaterial; sealed class ClipInput : ILodInput { readonly WaterBody _Owner; readonly Transform _Transform; - public bool Enabled => WaterRenderer.Instance._ClipLod._DefaultClippingState == DefaultClippingState.EverythingClipped; + public bool Enabled => WaterRenderer.Instance != null && WaterRenderer.Instance._ClipLod._DefaultClippingState == DefaultClippingState.EverythingClipped; public bool IsCompute => true; public int Pass => -1; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBuilder.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBuilder.cs index af6c598b5..0e7a708bc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBuilder.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterBuilder.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. //#define PROFILE_CONSTRUCTION @@ -9,529 +9,529 @@ using UnityEngine.Rendering; namespace WaveHarmonic.Crest { - /// - /// Instantiates all the water geometry, as a set of tiles. - /// - static class WaterBuilder + partial class SurfaceRenderer { - // The comments below illustrate case when BASE_VERT_DENSITY = 2. The water mesh is built up from these patches. Rotational symmetry - // is used where possible to eliminate combinations. The slim variants are used to eliminate overlap between patches. - enum PatchType - { - /// - /// Adds no skirt. Used in interior of highest detail LOD (0) - /// - /// 1 ------- - /// | | | - /// z ------- - /// | | | - /// 0 ------- - /// 0 1 - /// x - /// - /// - Interior, - - /// - /// Adds a full skirt all of the way around a patch - /// - /// ------------- - /// | | | | | - /// 1 ------------- - /// | | | | | - /// z ------------- - /// | | | | | - /// 0 ------------- - /// | | | | | - /// ------------- - /// 0 1 - /// x - /// - /// - Fat, - - /// - /// Adds a skirt on the right hand side of the patch - /// - /// 1 ---------- - /// | | | | - /// z ---------- - /// | | | | - /// 0 ---------- - /// 0 1 - /// x - /// - /// - FatX, - - /// - /// Adds a skirt on the right hand side of the patch, removes skirt from top - /// - FatXSlimZ, - - /// - /// Outer most side - this adds an extra skirt on the left hand side of the patch, - /// which will point outwards and be extended to Zfar - /// - /// 1 -------------------------------------------------------------------------------------- - /// | | | | - /// z -------------------------------------------------------------------------------------- - /// | | | | - /// 0 -------------------------------------------------------------------------------------- - /// 0 1 - /// x - /// - /// - FatXOuter, - - /// - /// Adds skirts at the top and right sides of the patch - /// - FatXZ, - - /// - /// Adds skirts at the top and right sides of the patch and pushes them to horizon - /// - FatXZOuter, - - /// - /// One less set of verts in x direction - /// - SlimX, - - /// - /// One less set of verts in both x and z directions - /// - SlimXZ, - - /// - /// One less set of verts in x direction, extra verts at start of z direction - /// - /// ---- - /// | | - /// 1 ---- - /// | | - /// z ---- - /// | | - /// 0 ---- - /// 0 1 - /// x - /// - /// - SlimXFatZ, - - /// - /// Number of patch types - /// - Count, - } - // Keep references to meshes so they can be cleaned up later. - static Mesh[] s_Meshes; + readonly Mesh[] _Meshes = new Mesh[(int)Builder.PatchType.Count]; /// - /// Destroy tiles and any resources. + /// Instantiates all the water geometry, as a set of tiles. /// - public static void CleanUp(WaterRenderer water) + static class Builder { - // Not every mesh is assigned to a chunk thus we should destroy all of them here. - for (var i = 0; i < s_Meshes?.Length; i++) + // The comments below illustrate case when BASE_VERT_DENSITY = 2. The water mesh is built up from these patches. Rotational symmetry + // is used where possible to eliminate combinations. The slim variants are used to eliminate overlap between patches. + internal enum PatchType { - Helpers.Destroy(s_Meshes[i]); + /// + /// Adds no skirt. Used in interior of highest detail LOD (0) + /// + /// 1 ------- + /// | | | + /// z ------- + /// | | | + /// 0 ------- + /// 0 1 + /// x + /// + /// + Interior, + + /// + /// Adds a full skirt all of the way around a patch + /// + /// ------------- + /// | | | | | + /// 1 ------------- + /// | | | | | + /// z ------------- + /// | | | | | + /// 0 ------------- + /// | | | | | + /// ------------- + /// 0 1 + /// x + /// + /// + Fat, + + /// + /// Adds a skirt on the right hand side of the patch + /// + /// 1 ---------- + /// | | | | + /// z ---------- + /// | | | | + /// 0 ---------- + /// 0 1 + /// x + /// + /// + FatX, + + /// + /// Adds a skirt on the right hand side of the patch, removes skirt from top + /// + FatXSlimZ, + + /// + /// Outer most side - this adds an extra skirt on the left hand side of the patch, + /// which will point outwards and be extended to Zfar + /// + /// 1 -------------------------------------------------------------------------------------- + /// | | | | + /// z -------------------------------------------------------------------------------------- + /// | | | | + /// 0 -------------------------------------------------------------------------------------- + /// 0 1 + /// x + /// + /// + FatXOuter, + + /// + /// Adds skirts at the top and right sides of the patch + /// + FatXZ, + + /// + /// Adds skirts at the top and right sides of the patch and pushes them to horizon + /// + FatXZOuter, + + /// + /// One less set of verts in x direction + /// + SlimX, + + /// + /// One less set of verts in both x and z directions + /// + SlimXZ, + + /// + /// One less set of verts in x direction, extra verts at start of z direction + /// + /// ---- + /// | | + /// 1 ---- + /// | | + /// z ---- + /// | | + /// 0 ---- + /// 0 1 + /// x + /// + /// + SlimXFatZ, + + /// + /// Number of patch types + /// + Count, } - water.Chunks.Clear(); - - // May not be present when entering play mode. - if (water.Root) + // Instance Indices: + // 00 01 02 03 + // 04 05 + // 06 07 + // 08 09 10 11 + static readonly Vector2[] s_Offsets = { - Helpers.Destroy(water.Root.gameObject); - } - } + new(-1.5f, +1.5f), new(-0.5f, +1.5f), new(+0.5f, +1.5f), new(+1.5f, +1.5f), + new(-1.5f, +0.5f), new(+1.5f, +0.5f), + new(-1.5f, -0.5f), new(+1.5f, -0.5f), + new(-1.5f, -1.5f), new(-0.5f, -1.5f), new(+0.5f, -1.5f), new(+1.5f, -1.5f), + }; - public static Transform GenerateMesh(WaterRenderer water, List tiles, int lodDataResolution, int geoDownSampleFactor, int lodCount) - { - if (lodCount < 1) + // First LOD has inside bit as well: + // 00 01 02 03 + // 04 05 06 07 + // 08 09 10 11 + // 12 13 14 15 + internal static readonly Vector2[] s_OffsetsFirstLod = { - Debug.LogError("Crest: Invalid LOD count: " + lodCount.ToString(), water); - return null; - } + // Interior first for sorted rendering. + new(-0.5f, +0.5f), new(+0.5f, +0.5f), new(-0.5f, -0.5f), new(+0.5f, -0.5f), + + // Exterior. + new(-1.5f, +1.5f), new(-0.5f, +1.5f), new(+0.5f, +1.5f), new(+1.5f, +1.5f), + new(-1.5f, +0.5f), new(+1.5f, +0.5f), + new(-1.5f, -0.5f), new(+1.5f, -0.5f), + new(-1.5f, -1.5f), new(-0.5f, -1.5f), new(+0.5f, -1.5f), new(+1.5f, -1.5f), + }; + + // Usually rings have an extra side of vertices that point inwards. The outermost + // ring has both the inward vertices and also an additional outwards set of + // vertices that go to the horizon. + static readonly PatchType[] s_PatchTypes = + { + PatchType.SlimXFatZ, PatchType.SlimX, PatchType.SlimX, PatchType.SlimXZ, + PatchType.FatX, PatchType.SlimX, + PatchType.FatX, PatchType.SlimX, + PatchType.FatXZ, PatchType.FatX, PatchType.FatX, PatchType.FatXSlimZ, + }; + + // All interior - the "side" types have an extra skirt that points inwards - this + // means that this inner most section does not need any skirting. This is good, as + // this is the highest density part of the mesh. + static readonly PatchType[] s_PatchTypesFirstLod = + { + PatchType.Interior, PatchType.Interior, PatchType.Interior, PatchType.Interior, + PatchType.SlimXFatZ, PatchType.SlimX, PatchType.SlimX, PatchType.SlimXZ, + PatchType.FatX, PatchType.SlimX, + PatchType.FatX, PatchType.SlimX, + PatchType.FatXZ, PatchType.FatX, PatchType.FatX, PatchType.FatXSlimZ, + }; + + static readonly PatchType[] s_PatchTypesLastLod = + { + PatchType.FatXZOuter, PatchType.FatXOuter, PatchType.FatXOuter, PatchType.FatXZOuter, + PatchType.FatXOuter, PatchType.FatXOuter, + PatchType.FatXOuter, PatchType.FatXOuter, + PatchType.FatXZOuter, PatchType.FatXOuter, PatchType.FatXOuter, PatchType.FatXZOuter, + }; + + static int s_SiblingIndex; + + public static Transform GenerateMesh(WaterRenderer water, SurfaceRenderer surface, List tiles, int lodDataResolution, int geoDownSampleFactor, int lodCount) + { + if (lodCount < 1) + { + Debug.LogError("Crest: Invalid LOD count: " + lodCount.ToString(), water); + return null; + } #if PROFILE_CONSTRUCTION - var sw = new System.Diagnostics.Stopwatch(); - sw.Start(); + var sw = new System.Diagnostics.Stopwatch(); + sw.Start(); #endif - var root = new GameObject("Root"); - Debug.Assert(root != null, "Crest: The water Root transform could not be immediately constructed. Please report this issue to the Crest developers via our support email or GitHub at https://github.com/wave-harmonic/crest/issues ."); + s_SiblingIndex = 0; - root.hideFlags = water._Debug._ShowHiddenObjects ? HideFlags.DontSave : HideFlags.HideAndDontSave; - root.transform.parent = water.transform; - root.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); - root.transform.localScale = Vector3.one; + var root = new GameObject("Root"); + Debug.Assert(root != null, "Crest: The water Root transform could not be immediately constructed. Please report this issue to the Crest developers via our support email or GitHub at https://github.com/wave-harmonic/crest/issues ."); + + root.hideFlags = water._Debug._ShowHiddenObjects ? HideFlags.DontSave : HideFlags.HideAndDontSave; + root.transform.parent = water.Container.transform; + root.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); + root.transform.localScale = Vector3.one; - if (!water.IsRunningHeadless && !water.IsRunningWithoutGraphics) - { // create mesh data - s_Meshes = new Mesh[(int)PatchType.Count]; - var meshBounds = new Bounds[(int)PatchType.Count]; // 4 tiles across a LOD, and support lowering density by a factor var tileResolution = Mathf.Round(0.25f * lodDataResolution / geoDownSampleFactor); for (var i = 0; i < (int)PatchType.Count; i++) { - s_Meshes[i] = BuildPatch(water, (PatchType)i, tileResolution, out meshBounds[i]); + surface._Meshes[i] = BuildPatch(water, (PatchType)i, tileResolution); } for (var i = 0; i < lodCount; i++) { - CreateLOD(water, tiles, root.transform, i, lodCount, s_Meshes, meshBounds, lodDataResolution, geoDownSampleFactor, water.Layer); + CreateLOD(water, surface, tiles, root.transform, i, lodCount, surface._Meshes, lodDataResolution, geoDownSampleFactor, surface.Layer); } - } #if PROFILE_CONSTRUCTION - sw.Stop(); - Debug.Log( "Crest: Finished generating " + lodCount.ToString() + " LODs, time: " + (1000.0*sw.Elapsed.TotalSeconds).ToString(".000") + "ms" ); + sw.Stop(); + Debug.Log( "Crest: Finished generating " + lodCount.ToString() + " LODs, time: " + (1000.0*sw.Elapsed.TotalSeconds).ToString(".000") + "ms" ); #endif - return root.transform; - } + return root.transform; + } - static Mesh BuildPatch(WaterRenderer water, PatchType pt, float vertDensity, out Bounds bounds) - { - var verts = new List(); - var indices = new List(); - - // stick a bunch of verts into a 1m x 1m patch (scaling happens later) - var dx = 1f / vertDensity; - - - ////////////////////////////////////////////////////////////////////////////////// - // verts - - // see comments within PatchType for diagrams of each patch mesh - - // skirt widths on left, right, bottom and top (in order) - float skirtXminus = 0f, skirtXplus = 0f; - float skirtZminus = 0f, skirtZplus = 0f; - // set the patch size - if (pt == PatchType.Fat) { skirtXminus = skirtXplus = skirtZminus = skirtZplus = 1f; } - else if (pt is PatchType.FatX or PatchType.FatXOuter) { skirtXplus = 1f; } - else if (pt is PatchType.FatXZ or PatchType.FatXZOuter) { skirtXplus = skirtZplus = 1f; } - else if (pt == PatchType.FatXSlimZ) { skirtXplus = 1f; skirtZplus = -1f; } - else if (pt == PatchType.SlimX) { skirtXplus = -1f; } - else if (pt == PatchType.SlimXZ) { skirtXplus = skirtZplus = -1f; } - else if (pt == PatchType.SlimXFatZ) { skirtXplus = -1f; skirtZplus = 1f; } - - var sideLength_verts_x = 1f + vertDensity + skirtXminus + skirtXplus; - var sideLength_verts_z = 1f + vertDensity + skirtZminus + skirtZplus; - - var start_x = -0.5f - skirtXminus * dx; - var start_z = -0.5f - skirtZminus * dx; - var end_x = 0.5f + skirtXplus * dx; - var end_z = 0.5f + skirtZplus * dx; - - // With a default value of 100, this will reach the horizon at all levels at - // a far plane of 200k. - var extentsMultiplier = water._ExtentsSizeMultiplier * (Lod.k_MaximumSlices + 1 - water.LodLevels); - - for (float j = 0; j < sideLength_verts_z; j++) + static Mesh BuildPatch(WaterRenderer water, PatchType pt, float vertDensity) { - // interpolate z across patch - var z = Mathf.Lerp(start_z, end_z, j / (sideLength_verts_z - 1f)); + var verts = new List(); + var indices = new List(); - // push outermost edge out to horizon - if (pt == PatchType.FatXZOuter && j == sideLength_verts_z - 1f) - z *= extentsMultiplier; + // stick a bunch of verts into a 1m x 1m patch (scaling happens later) + var dx = 1f / vertDensity; - for (float i = 0; i < sideLength_verts_x; i++) + + ////////////////////////////////////////////////////////////////////////////////// + // verts + + // see comments within PatchType for diagrams of each patch mesh + + // skirt widths on left, right, bottom and top (in order) + float skirtXminus = 0f, skirtXplus = 0f; + float skirtZminus = 0f, skirtZplus = 0f; + // set the patch size + if (pt == PatchType.Fat) { skirtXminus = skirtXplus = skirtZminus = skirtZplus = 1f; } + else if (pt is PatchType.FatX or PatchType.FatXOuter) { skirtXplus = 1f; } + else if (pt is PatchType.FatXZ or PatchType.FatXZOuter) { skirtXplus = skirtZplus = 1f; } + else if (pt == PatchType.FatXSlimZ) { skirtXplus = 1f; skirtZplus = -1f; } + else if (pt == PatchType.SlimX) { skirtXplus = -1f; } + else if (pt == PatchType.SlimXZ) { skirtXplus = skirtZplus = -1f; } + else if (pt == PatchType.SlimXFatZ) { skirtXplus = -1f; skirtZplus = 1f; } + + var sideLength_verts_x = 1f + vertDensity + skirtXminus + skirtXplus; + var sideLength_verts_z = 1f + vertDensity + skirtZminus + skirtZplus; + + var start_x = -0.5f - skirtXminus * dx; + var start_z = -0.5f - skirtZminus * dx; + var end_x = 0.5f + skirtXplus * dx; + var end_z = 0.5f + skirtZplus * dx; + + // With a default value of 100, this will reach the horizon at all levels at + // a far plane of 200k. + var extentsMultiplier = water._ExtentsSizeMultiplier * (Lod.k_MaximumSlices + 1 - water.LodLevels); + + for (float j = 0; j < sideLength_verts_z; j++) { - // interpolate x across patch - var x = Mathf.Lerp(start_x, end_x, i / (sideLength_verts_x - 1f)); + // interpolate z across patch + var z = Mathf.Lerp(start_z, end_z, j / (sideLength_verts_z - 1f)); // push outermost edge out to horizon - if (i == sideLength_verts_x - 1f && (pt == PatchType.FatXOuter || pt == PatchType.FatXZOuter)) - x *= extentsMultiplier; + if (pt == PatchType.FatXZOuter && j == sideLength_verts_z - 1f) + z *= extentsMultiplier; - // could store something in y, although keep in mind this is a shared mesh that is shared across multiple lods - verts.Add(new(x, 0f, z)); + for (float i = 0; i < sideLength_verts_x; i++) + { + // interpolate x across patch + var x = Mathf.Lerp(start_x, end_x, i / (sideLength_verts_x - 1f)); + + // push outermost edge out to horizon + if (i == sideLength_verts_x - 1f && (pt == PatchType.FatXOuter || pt == PatchType.FatXZOuter)) + x *= extentsMultiplier; + + // could store something in y, although keep in mind this is a shared mesh that is shared across multiple lods + verts.Add(new(x, 0f, z)); + } } - } - ////////////////////////////////////////////////////////////////////////////////// - // indices + ////////////////////////////////////////////////////////////////////////////////// + // indices - var sideLength_squares_x = (int)sideLength_verts_x - 1; - var sideLength_squares_z = (int)sideLength_verts_z - 1; + var sideLength_squares_x = (int)sideLength_verts_x - 1; + var sideLength_squares_z = (int)sideLength_verts_z - 1; - for (var j = 0; j < sideLength_squares_z; j++) - { - for (var i = 0; i < sideLength_squares_x; i++) + for (var j = 0; j < sideLength_squares_z; j++) { - var flipEdge = false; - - if (i % 2 == 1) flipEdge = !flipEdge; - if (j % 2 == 1) flipEdge = !flipEdge; - - var i0 = i + j * (sideLength_squares_x + 1); - var i1 = i0 + 1; - var i2 = i0 + (sideLength_squares_x + 1); - var i3 = i2 + 1; - - if (!flipEdge) + for (var i = 0; i < sideLength_squares_x; i++) { - // tri 1 - indices.Add(i3); - indices.Add(i1); - indices.Add(i0); + var flipEdge = false; - // tri 2 - indices.Add(i0); - indices.Add(i2); - indices.Add(i3); - } - else - { - // tri 1 - indices.Add(i3); - indices.Add(i1); - indices.Add(i2); + if (i % 2 == 1) flipEdge = !flipEdge; + if (j % 2 == 1) flipEdge = !flipEdge; - // tri 2 - indices.Add(i0); - indices.Add(i2); - indices.Add(i1); + var i0 = i + j * (sideLength_squares_x + 1); + var i1 = i0 + 1; + var i2 = i0 + (sideLength_squares_x + 1); + var i3 = i2 + 1; + + if (!flipEdge) + { + // tri 1 + indices.Add(i3); + indices.Add(i1); + indices.Add(i0); + + // tri 2 + indices.Add(i0); + indices.Add(i2); + indices.Add(i3); + } + else + { + // tri 1 + indices.Add(i3); + indices.Add(i1); + indices.Add(i2); + + // tri 2 + indices.Add(i0); + indices.Add(i2); + indices.Add(i1); + } } } - } - ////////////////////////////////////////////////////////////////////////////////// - // create mesh + ////////////////////////////////////////////////////////////////////////////////// + // create mesh - var mesh = new Mesh(); - if (verts != null && verts.Count > 0) - { - var arrV = new Vector3[verts.Count]; - verts.CopyTo(arrV); + var mesh = new Mesh(); + if (verts != null && verts.Count > 0) + { + var arrV = new Vector3[verts.Count]; + verts.CopyTo(arrV); - var arrI = new int[indices.Count]; - indices.CopyTo(arrI); + var arrI = new int[indices.Count]; + indices.CopyTo(arrI); - mesh.SetIndices(null, MeshTopology.Triangles, 0); - mesh.vertices = arrV; + mesh.SetIndices(null, MeshTopology.Triangles, 0); + mesh.vertices = arrV; - // HDRP needs full data. Do this on a define to keep door open to runtime changing of RP. + // HDRP needs full data. Do this on a define to keep door open to runtime changing of RP. #if d_UnityHDRP - var norms = new Vector3[verts.Count]; - for (var i = 0; i < norms.Length; i++) norms[i] = Vector3.up; - var tans = new Vector4[verts.Count]; - for (var i = 0; i < tans.Length; i++) tans[i] = new(1, 0, 0, 1); + var norms = new Vector3[verts.Count]; + for (var i = 0; i < norms.Length; i++) norms[i] = Vector3.up; + var tans = new Vector4[verts.Count]; + for (var i = 0; i < tans.Length; i++) tans[i] = new(1, 0, 0, 1); - mesh.normals = norms; - mesh.tangents = tans; + mesh.normals = norms; + mesh.tangents = tans; #else - mesh.normals = null; + mesh.normals = null; #endif - mesh.SetIndices(arrI, MeshTopology.Triangles, 0); + mesh.SetIndices(arrI, MeshTopology.Triangles, 0); - // recalculate bounds. add a little allowance for snapping. in the chunk renderer script, the bounds will be expanded further - // to allow for horizontal displacement - mesh.RecalculateBounds(); - bounds = mesh.bounds; - // Increase snapping allowance (see #1148). Value was chosen by observation with a - // custom debug mode to show pixels that were out of bounds. - dx *= 3f; - bounds.extents = new(bounds.extents.x + dx, bounds.extents.y, bounds.extents.z + dx); - mesh.bounds = bounds; - mesh.name = pt.ToString(); + // recalculate bounds. add a little allowance for snapping. in the chunk renderer script, the bounds will be expanded further + // to allow for horizontal displacement + mesh.RecalculateBounds(); + var bounds = mesh.bounds; + // Increase snapping allowance (see #1148). Value was chosen by observation with a + // custom debug mode to show pixels that were out of bounds. + dx *= 3f; + bounds.extents = new(bounds.extents.x + dx, bounds.extents.y, bounds.extents.z + dx); + mesh.bounds = bounds; + mesh.name = pt.ToString(); + } + + return mesh; } - else + + static void CreateLOD(WaterRenderer water, SurfaceRenderer surface, List tiles, Transform parent, int lodIndex, int lodCount, Mesh[] meshData, int lodDataResolution, int geoDownSampleFactor, int layer) { - bounds = new(); - } + var horizScale = Mathf.Pow(2f, lodIndex); - return mesh; - } - - static void CreateLOD(WaterRenderer water, List tiles, Transform parent, int lodIndex, int lodCount, Mesh[] meshData, Bounds[] meshBounds, int lodDataResolution, int geoDownSampleFactor, int layer) - { - var horizScale = Mathf.Pow(2f, lodIndex); - - var isBiggestLOD = lodIndex == lodCount - 1; - var generateSkirt = isBiggestLOD; + var isBiggestLOD = lodIndex == lodCount - 1; + var generateSkirt = isBiggestLOD; #if CREST_DEBUG - generateSkirt = generateSkirt && !water._Debug._DisableSkirt; + generateSkirt = generateSkirt && !surface._Debug._DisableSkirt; #endif - Vector2[] offsets; - PatchType[] patchTypes; + Vector2[] offsets; + PatchType[] patchTypes; - var leadSideType = generateSkirt ? PatchType.FatXOuter : PatchType.SlimX; - var trailSideType = generateSkirt ? PatchType.FatXOuter : PatchType.FatX; - var leadCornerType = generateSkirt ? PatchType.FatXZOuter : PatchType.SlimXZ; - var trailCornerType = generateSkirt ? PatchType.FatXZOuter : PatchType.FatXZ; - var tlCornerType = generateSkirt ? PatchType.FatXZOuter : PatchType.SlimXFatZ; - var brCornerType = generateSkirt ? PatchType.FatXZOuter : PatchType.FatXSlimZ; - - if (lodIndex != 0) - { - // instance indices: - // 0 1 2 3 - // 4 5 - // 6 7 - // 8 9 10 11 - offsets = new Vector2[] { - new(-1.5f,1.5f), new(-0.5f,1.5f), new(0.5f,1.5f), new(1.5f,1.5f), - new(-1.5f,0.5f), new(1.5f,0.5f), - new(-1.5f,-0.5f), new(1.5f,-0.5f), - new(-1.5f,-1.5f), new(-0.5f,-1.5f), new(0.5f,-1.5f), new(1.5f,-1.5f), - }; - - // usually rings have an extra side of verts that point inwards. the outermost ring has both the inward - // verts and also and additional outwards set of verts that go to the horizon - patchTypes = new PatchType[] { - tlCornerType, leadSideType, leadSideType, leadCornerType, - trailSideType, leadSideType, - trailSideType, leadSideType, - trailCornerType, trailSideType, trailSideType, brCornerType, - }; - } - else - { - // first LOD has inside bit as well: - // 0 1 2 3 - // 4 5 6 7 - // 8 9 10 11 - // 12 13 14 15 - offsets = new Vector2[] { - new(-1.5f,1.5f), new(-0.5f,1.5f), new(0.5f,1.5f), new(1.5f,1.5f), - new(-1.5f,0.5f), new(-0.5f,0.5f), new(0.5f,0.5f), new(1.5f,0.5f), - new(-1.5f,-0.5f), new(-0.5f,-0.5f), new(0.5f,-0.5f), new(1.5f,-0.5f), - new(-1.5f,-1.5f), new(-0.5f,-1.5f), new(0.5f,-1.5f), new(1.5f,-1.5f), - }; - - - // all interior - the "side" types have an extra skirt that points inwards - this means that this inner most - // section doesn't need any skirting. this is good - this is the highest density part of the mesh. - patchTypes = new PatchType[] { - tlCornerType, leadSideType, leadSideType, leadCornerType, - trailSideType, PatchType.Interior, PatchType.Interior, leadSideType, - trailSideType, PatchType.Interior, PatchType.Interior, leadSideType, - trailCornerType, trailSideType, trailSideType, brCornerType, - }; - } + if (lodIndex != 0) + { + offsets = s_Offsets; + patchTypes = generateSkirt ? s_PatchTypesLastLod : s_PatchTypes; + } + else + { + offsets = s_OffsetsFirstLod; + patchTypes = s_PatchTypesFirstLod; + } #if CREST_DEBUG - // debug toggle to force all patches to be the same. they'll be made with a surrounding skirt to make sure patches - // overlap - if (water._Debug._UniformTiles) - { - for (var i = 0; i < patchTypes.Length; i++) + // debug toggle to force all patches to be the same. they'll be made with a surrounding skirt to make sure patches + // overlap + if (surface._Debug._UniformTiles) { - patchTypes[i] = PatchType.Fat; + patchTypes = new PatchType[patchTypes.Length]; + System.Array.Fill(patchTypes, PatchType.Fat); } - } #endif - // create the water patches - for (var i = 0; i < offsets.Length; i++) - { - // instantiate and place patch - var patch = water._ChunkTemplate - ? Helpers.InstantiatePrefab(water._ChunkTemplate) - : new(); - // Also applying the hide flags to the chunk will prevent it from being pickable in the editor. - patch.hideFlags = water._Debug._ShowHiddenObjects ? HideFlags.DontSave : HideFlags.HideAndDontSave; - patch.name = $"Tile_L{lodIndex}_{patchTypes[i]}"; - patch.layer = layer; - patch.transform.parent = parent; - var pos = offsets[i]; - patch.transform.localPosition = horizScale * new Vector3(pos.x, 0f, pos.y); - // scale only horizontally, otherwise culling bounding box will be scaled up in y - patch.transform.localScale = new(horizScale, 1f, horizScale); - - if (!patch.TryGetComponent(out var mr)) + // create the water patches + for (var i = 0; i < offsets.Length; i++) { - mr = patch.AddComponent(); - // I don't think one would use light probes for a purely specular water surface? (although diffuse - // foam shading would benefit). - mr.lightProbeUsage = LightProbeUsage.Off; - } + // instantiate and place patch + var patch = surface._ChunkTemplate + ? Helpers.InstantiatePrefab(surface._ChunkTemplate) + : new(); + // Also applying the hide flags to the chunk will prevent it from being pickable in the editor. + patch.hideFlags = water._Debug._ShowHiddenObjects ? HideFlags.DontSave : HideFlags.HideAndDontSave; + patch.name = $"Tile_L{lodIndex}_{patchTypes[i]}"; + patch.layer = layer; + patch.transform.parent = parent; + var pos = offsets[i]; + patch.transform.localPosition = horizScale * new Vector3(pos.x, 0f, pos.y); + // scale only horizontally, otherwise culling bounding box will be scaled up in y + patch.transform.localScale = new(horizScale, 1f, horizScale); - { - var mesh = Object.Instantiate(meshData[(int)patchTypes[i]]); - mesh.name = meshData[(int)patchTypes[i]].name; - patch.AddComponent().sharedMesh = mesh; - - var chunk = patch.AddComponent(); - chunk._Water = water; - chunk._BoundsLocal = meshBounds[(int)patchTypes[i]]; - - chunk.SetInstanceData(lodIndex); - tiles.Add(chunk); - } - - // Sorting order to stop unity drawing it back to front. Make the innermost four tiles draw first, - // followed by the rest of the tiles by LOD index. - if (RenderPipelineHelper.IsHighDefinition) - { - // HDRP has a different rendering priority system: - // https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@10.10/manual/Renderer-And-Material-Priority.html#sorting-by-renderer - mr.rendererPriority = -lodCount + (patchTypes[i] == PatchType.Interior ? -1 : lodIndex); - } - else if (!water.AllowRenderQueueSorting) - { - // Sorting order to stop unity drawing it back to front. make the innermost 4 tiles draw first, followed by - // the rest of the tiles by LOD index. all this happens before layer 0 - the sorting layer takes priority over the - // render queue it seems! ( https://cdry.wordpress.com/2017/04/28/unity-render-queues-vs-sorting-layers/ ). This pushes - // water rendering way early, so transparent objects will by default render afterwards, which is typical for water rendering. - mr.sortingOrder = -lodCount + (patchTypes[i] == PatchType.Interior ? -1 : lodIndex); - } - - mr.shadowCastingMode = water.CastShadows ? ShadowCastingMode.On : ShadowCastingMode.Off; - - // This setting is ignored by Unity for the transparent water shader. - mr.receiveShadows = false; - - // BIRP needs further investigation. - mr.motionVectorGenerationMode = !water.WriteMotionVectors - ? MotionVectorGenerationMode.ForceNoMotion - : MotionVectorGenerationMode.Object; - - mr.material = water.Material; - - // rotate side patches to point the +x side outwards - var rotateXOutwards = patchTypes[i] is PatchType.FatX or PatchType.FatXOuter or PatchType.SlimX or PatchType.SlimXFatZ; - if (rotateXOutwards) - { - if (Mathf.Abs(pos.y) >= Mathf.Abs(pos.x)) - patch.transform.localEulerAngles = 90f * Mathf.Sign(pos.y) * -Vector3.up; - else - patch.transform.localEulerAngles = pos.x < 0f ? Vector3.up * 180f : Vector3.zero; - } - - // rotate the corner patches so the +x and +z sides point outwards - var rotateXZOutwards = patchTypes[i] is PatchType.FatXZ or PatchType.SlimXZ or PatchType.FatXSlimZ or PatchType.FatXZOuter; - if (rotateXZOutwards) - { - // xz direction before rotation - var from = new Vector3(1f, 0f, 1f).normalized; - // target xz direction is outwards vector given by local patch position - assumes this patch is a corner (checked below) - var to = patch.transform.localPosition.normalized; - if (Mathf.Abs(patch.transform.localPosition.x) < 0.0001f || Mathf.Abs(Mathf.Abs(patch.transform.localPosition.x) - Mathf.Abs(patch.transform.localPosition.z)) > 0.001f) + if (!patch.TryGetComponent(out var mr)) { - Debug.LogWarning("Crest: Skipped rotating a patch because it isn't a corner, click here to highlight.", patch); - continue; + mr = patch.AddComponent(); + // I don't think one would use light probes for a purely specular water surface? (although diffuse + // foam shading would benefit). + mr.lightProbeUsage = LightProbeUsage.Off; } - // Detect 180 degree rotations as it doesn't always rotate around Y - if (Vector3.Dot(from, to) < -0.99f) - patch.transform.localEulerAngles = Vector3.up * 180f; - else - patch.transform.localRotation = Quaternion.FromToRotation(from, to); + var order = -lodCount + (patchTypes[i] == PatchType.Interior ? -1 : lodIndex); + + { + var mesh = meshData[(int)patchTypes[i]]; + patch.AddComponent().sharedMesh = mesh; + + var chunk = patch.AddComponent(); + chunk._Water = water; + chunk._SortingOrder = order; + chunk._SiblingIndex = s_SiblingIndex++; + + chunk.Initialize(lodIndex, mr, mesh); + + // When custom rendering, we loop over chunks to render, which means these need to + // be optimally sorted. We statically sort by LOD. Sub-sort is only done for LOD0, + // where interior tiles are placed first. Further sorting must be done dynamically. + tiles.Add(chunk); + } + + // Sorting order to stop unity drawing it back to front. Make the innermost four tiles draw first, + // followed by the rest of the tiles by LOD index. + if (RenderPipelineHelper.IsHighDefinition) + { + // HDRP has a different rendering priority system: + // https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@10.10/manual/Renderer-And-Material-Priority.html#sorting-by-renderer + mr.rendererPriority = order; + } + else if (!water.Surface.AllowRenderQueueSorting) + { + // Sorting order to stop unity drawing it back to front. make the innermost 4 tiles draw first, followed by + // the rest of the tiles by LOD index. all this happens before layer 0 - the sorting layer takes priority over the + // render queue it seems! ( https://cdry.wordpress.com/2017/04/28/unity-render-queues-vs-sorting-layers/ ). This pushes + // water rendering way early, so transparent objects will by default render afterwards, which is typical for water rendering. + mr.sortingOrder = order; + } + + mr.shadowCastingMode = water.Surface.CastShadows ? ShadowCastingMode.On : ShadowCastingMode.Off; + + // This setting is ignored by Unity for the transparent water shader. + mr.receiveShadows = false; + + mr.motionVectorGenerationMode = !water.WriteMotionVectors + ? MotionVectorGenerationMode.ForceNoMotion + : MotionVectorGenerationMode.Object; + + mr.material = water.Surface.Material; + + OnCreateChunkRenderer?.Invoke(mr); + + // rotate side patches to point the +x side outwards + var rotateXOutwards = patchTypes[i] is PatchType.FatX or PatchType.FatXOuter or PatchType.SlimX or PatchType.SlimXFatZ; + if (rotateXOutwards) + { + if (Mathf.Abs(pos.y) >= Mathf.Abs(pos.x)) + patch.transform.localEulerAngles = 90f * Mathf.Sign(pos.y) * -Vector3.up; + else + patch.transform.localEulerAngles = pos.x < 0f ? Vector3.up * 180f : Vector3.zero; + } + + // rotate the corner patches so the +x and +z sides point outwards + var rotateXZOutwards = patchTypes[i] is PatchType.FatXZ or PatchType.SlimXZ or PatchType.FatXSlimZ or PatchType.FatXZOuter; + if (rotateXZOutwards) + { + // xz direction before rotation + var from = new Vector3(1f, 0f, 1f).normalized; + // target xz direction is outwards vector given by local patch position - assumes this patch is a corner (checked below) + var to = patch.transform.localPosition.normalized; + if (Mathf.Abs(patch.transform.localPosition.x) < 0.0001f || Mathf.Abs(Mathf.Abs(patch.transform.localPosition.x) - Mathf.Abs(patch.transform.localPosition.z)) > 0.001f) + { + Debug.LogWarning("Crest: Skipped rotating a patch because it isn't a corner, click here to highlight.", patch); + continue; + } + + // Detect 180 degree rotations as it doesn't always rotate around Y + if (Vector3.Dot(from, to) < -0.99f) + patch.transform.localEulerAngles = Vector3.up * 180f; + else + patch.transform.localRotation = Quaternion.FromToRotation(from, to); + } } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterChunkRenderer.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterChunkRenderer.cs index b251b814d..3162ffeed 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterChunkRenderer.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterChunkRenderer.cs @@ -1,9 +1,8 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System.Collections.Generic; using UnityEngine; -using UnityEngine.Rendering; using WaveHarmonic.Crest.Internal; namespace WaveHarmonic.Crest @@ -27,29 +26,22 @@ namespace WaveHarmonic.Crest [@ExecuteDuringEditMode] sealed class WaterChunkRenderer : ManagedBehaviour { - [SerializeField, HideInInspector] -#pragma warning disable 414 - int _Version = 0; -#pragma warning restore 414 - [SerializeField] internal bool _DrawRenderBounds = false; - static class ShaderIDs - { - public static readonly int s_ChunkMeshScaleAlpha = Shader.PropertyToID("_Crest_ChunkMeshScaleAlpha"); - public static readonly int s_ChunkGeometryGridWidth = Shader.PropertyToID("_Crest_ChunkGeometryGridWidth"); - public static readonly int s_ChunkFarNormalsWeight = Shader.PropertyToID("_Crest_ChunkFarNormalsWeight"); - public static readonly int s_ChunkNormalScrollSpeed = Shader.PropertyToID("_Crest_ChunkNormalScrollSpeed"); - public static readonly int s_ChunkMeshScaleAlphaSource = Shader.PropertyToID("_Crest_ChunkMeshScaleAlphaSource"); - public static readonly int s_ChunkGeometryGridWidthSource = Shader.PropertyToID("_Crest_ChunkGeometryGridWidthSource"); - } + internal const string k_UpdateMeshBoundsMarker = "Crest.WaterChunkRenderer.UpdateMeshBounds"; - internal Bounds _BoundsLocal; - Mesh _Mesh; + static readonly Unity.Profiling.ProfilerMarker s_UpdateMeshBoundsMarker = new(k_UpdateMeshBoundsMarker); + + internal Transform _Transform; + internal Mesh _Mesh; public Renderer Rend { get; private set; } internal MaterialPropertyBlock _MaterialPropertyBlock; + Matrix4x4 _CurrentObjectToWorld; Matrix4x4 _PreviousObjectToWorld; + internal Material _MotionVectorMaterial; + internal int _SortingOrder; + internal int _SiblingIndex; internal Rect _UnexpandedBoundsXZ = new(); public Rect UnexpandedBoundsXZ => _UnexpandedBoundsXZ; @@ -72,24 +64,17 @@ namespace WaveHarmonic.Crest public static List HeightReporters { get; } = new(); public static List DisplacementReporters { get; } = new(); - private protected override System.Action OnLateUpdateMethod => OnLateUpdate; - - private protected override void Initialize() + // There is a 1-frame delay with Initialized in edit mode due to setting + // enableInEditMode in EditorApplication.update. This only really affect this + // component as it is instantiate via script, and is partial driven externally. + // So instead, call this after instantiation. + internal void Initialize(int index, Renderer renderer, Mesh mesh) { - base.Initialize(); - - _MaterialPropertyBlock ??= new(); - - if (Rend == null) - { - Rend = GetComponent(); - } - - if (_Mesh == null) - { - // Meshes are cloned so it is safe to use sharedMesh in play mode. We need clones to modify the render bounds. - _Mesh = GetComponent().sharedMesh; - } + _LodIndex = index; + Rend = renderer; + _Mesh = mesh; + _PreviousObjectToWorld = _CurrentObjectToWorld = transform.localToWorldMatrix; + _Transform = transform; } private protected override void OnStart() @@ -99,97 +84,95 @@ namespace WaveHarmonic.Crest UpdateMeshBounds(); } - void OnLateUpdate(WaterRenderer water) + internal void UpdateMeshBounds(WaterRenderer water, SurfaceRenderer surface) { + _WaterDataHasBeenBound = false; + + var count = surface.TimeSliceBoundsUpdateFrameCount; + // Time slice update to distribute the load. - if (!(transform.GetSiblingIndex() % water.TimeSliceBoundsUpdateFrameCount != Time.frameCount % water.Chunks.Count % water.TimeSliceBoundsUpdateFrameCount)) + if (count <= 1 || !(_SiblingIndex % count != Time.frameCount % surface.Chunks.Count % count)) { // This needs to be called on Update because the bounds depend on transform scale which can change. Also OnWillRenderObject depends on // the bounds being correct. This could however be called on scale change events, but would add slightly more complexity. UpdateMeshBounds(); } + } - // Update chunk shader data. - _MaterialPropertyBlock ??= new(); - - // FIXME: Sometimes thrown. - // NullReferenceException: Object reference not set to an instance of an object - // WaveHarmonic.Crest.WaterChunkRenderer.OnLateUpdate(WaveHarmonic.Crest.WaterRenderer water)(at Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterChunkRenderer.cs:119) - // WaveHarmonic.Crest.WaterRenderer.LateUpdate()(at Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.cs:733) - if (Rend == null) + bool ShouldRender(bool culled) + { + // Is visible to camera. + if (!_Visible) { - Rend = GetComponent(); + return false; } - Rend.GetPropertyBlock(_MaterialPropertyBlock); - _MaterialPropertyBlock.SetInteger(Lod.ShaderIDs.s_LodIndex, _LodIndex); - var data = water._PerCascadeInstanceData.Current[_LodIndex]; - _MaterialPropertyBlock.SetFloat(ShaderIDs.s_ChunkMeshScaleAlpha, data._MeshScaleLerp); - _MaterialPropertyBlock.SetFloat(ShaderIDs.s_ChunkGeometryGridWidth, data._GeometryGridWidth); - _MaterialPropertyBlock.SetFloat(ShaderIDs.s_ChunkFarNormalsWeight, data._FarNormalsWeight); - _MaterialPropertyBlock.SetVector(ShaderIDs.s_ChunkNormalScrollSpeed, data._NormalScrollSpeeds); - data = water._PerCascadeInstanceData.Previous(1)[_LodIndex]; - _MaterialPropertyBlock.SetFloat(ShaderIDs.s_ChunkMeshScaleAlphaSource, data._MeshScaleLerp); - _MaterialPropertyBlock.SetFloat(ShaderIDs.s_ChunkGeometryGridWidthSource, data._GeometryGridWidth); - Rend.SetPropertyBlock(_MaterialPropertyBlock); - -#if UNITY_6000_0_OR_NEWER - if (Application.isPlaying && RenderPipelineHelper.IsUniversal && water.WriteMotionVectors) + // If including culling, is it culled. + if (culled && _Culled) { - var material = water._MotionVectorsMaterial; - - var parameters = new RenderParams(material) - { - motionVectorMode = MotionVectorGenerationMode.Object, - material = material, - matProps = _MaterialPropertyBlock, - worldBounds = Rend.bounds, - layer = water.Layer, - receiveShadows = false, - shadowCastingMode = ShadowCastingMode.Off, - lightProbeUsage = LightProbeUsage.Off, - reflectionProbeUsage = ReflectionProbeUsage.Off, - }; - - if (_Mesh == null) - { - _Mesh = GetComponent().sharedMesh; - } - - Graphics.RenderMesh(parameters, _Mesh, 0, transform.localToWorldMatrix, _PreviousObjectToWorld); - _PreviousObjectToWorld = transform.localToWorldMatrix; + return false; } -#endif + + return true; + } + + internal void OnLateUpdate() + { + _PreviousObjectToWorld = _CurrentObjectToWorld; + _CurrentObjectToWorld = _Transform.localToWorldMatrix; + } + + internal void RenderMotionVectors(SurfaceRenderer surface, Camera camera) + { + if (!ShouldRender(culled: true)) + { + return; + } + + // RenderMesh will copy properties immediately, thus we need them bound. + if (!_WaterDataHasBeenBound) + { + Bind(); + } + + var material = MaterialOverridden ? _MotionVectorMaterial : surface._MotionVectorMaterial; + + var parameters = new RenderParams(material) + { + motionVectorMode = MotionVectorGenerationMode.Object, + material = material, + matProps = _MaterialPropertyBlock, + worldBounds = Rend.bounds, + layer = surface.Layer, + receiveShadows = false, + shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off, + lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off, + reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off, + camera = camera, + }; + + Graphics.RenderMesh(parameters, _Mesh, 0, _CurrentObjectToWorld, _PreviousObjectToWorld); } void UpdateMeshBounds() { - UnityEngine.Profiling.Profiler.BeginSample("Crest.WaterChunkRenderer.UpdateMeshBounds"); + s_UpdateMeshBoundsMarker.Begin(this); + + var bounds = _Mesh.bounds; if (WaterBody.WaterBodies.Count > 0) { - _UnexpandedBoundsXZ = ComputeBoundsXZ(transform, ref _BoundsLocal); + _UnexpandedBoundsXZ = ComputeBoundsXZ(_Transform, bounds); } - var newBounds = _BoundsLocal; - ExpandBoundsForDisplacements(transform, ref newBounds); + bounds = ExpandBoundsForDisplacements(_Transform, bounds); - // FIXME: Fixes a crash which was reported twice. Could not reproduce. - // NullReferenceException: Object reference not set to an instance of an object. - // at WaveHarmonic.Crest.WaterChunkRenderer.UpdateMeshBounds()[0x00000] in < 00000000000000000000000000000000 >:0 - // at WaveHarmonic.Crest.WaterChunkRenderer.OnUpdate(WaveHarmonic.Crest.WaterRenderer water)[0x00000] in < 00000000000000000000000000000000 >:0 - // at WaveHarmonic.Crest.WaterRenderer.Update()[0x00000] in < 00000000000000000000000000000000 >:0 - if (_Mesh == null) - { - _Mesh = GetComponent().sharedMesh; - } + Rend.localBounds = bounds; - _Mesh.bounds = newBounds; - - UnityEngine.Profiling.Profiler.EndSample(); + s_UpdateMeshBoundsMarker.End(); } - public static Rect ComputeBoundsXZ(Transform transform, ref Bounds bounds) + public static Rect ComputeBoundsXZ(Transform transform, Bounds bounds) { // Since chunks are axis-aligned it is safe to rotate the bounds. var center = transform.rotation * bounds.center * transform.lossyScale.x + transform.position; @@ -201,31 +184,14 @@ namespace WaveHarmonic.Crest }; } - static Camera s_CurrentCamera = null; - - static void BeginCameraRendering(ScriptableRenderContext context, Camera camera) - { - // Camera.current is only supported in the built-in pipeline. This provides the current camera for - // OnWillRenderObject for SRPs. BeginCameraRendering is called for each active camera in every frame. - // OnWillRenderObject is called after BeginCameraRendering for the current camera so this works. - s_CurrentCamera = camera; - } - // Used by the water mask system if we need to render the water mask in situations // where the water itself doesn't need to be rendered or has otherwise been disabled - internal void Bind(Camera camera) + internal void Bind() { + _MaterialPropertyBlock = _Water.Surface._PerCascadeMPB.Current[_LodIndex]; + Rend.SetPropertyBlock(_MaterialPropertyBlock); + _WaterDataHasBeenBound = true; - - if (Rend == null) - { - return; - } - - if (!MaterialOverridden && Rend.sharedMaterial != _Water.Material) - { - Rend.sharedMaterial = _Water.Material; - } } void OnDestroy() @@ -236,22 +202,21 @@ namespace WaveHarmonic.Crest // Called when visible to a camera void OnWillRenderObject() { - // Camera.current is only supported in built-in pipeline. - if (RenderPipelineHelper.IsLegacy && Camera.current != null) - { - s_CurrentCamera = Camera.current; - } - - // If only the game view is visible, this reference will be dropped for SRP on recompile. - if (s_CurrentCamera == null) + if (Rend == null) { return; } - // Depth texture is used by water shader for transparency/depth fog, and for fading out foam at shoreline. - s_CurrentCamera.depthTextureMode |= DepthTextureMode.Depth; + if (!MaterialOverridden && Rend.sharedMaterial != _Water.Surface.Material) + { + Rend.sharedMaterial = _Water.Surface.Material; + _MotionVectorMaterial = _Water.Surface._MotionVectorMaterial; + } - Bind(s_CurrentCamera); + if (!_WaterDataHasBeenBound) + { + Bind(); + } if (_DrawRenderBounds) { @@ -261,8 +226,11 @@ namespace WaveHarmonic.Crest // this is called every frame because the bounds are given in world space and depend on the transform scale, which // can change depending on view altitude - public void ExpandBoundsForDisplacements(Transform transform, ref Bounds bounds) + public Bounds ExpandBoundsForDisplacements(Transform transform, Bounds bounds) { + var extents = bounds.extents; + var center = bounds.center; + var scale = transform.lossyScale; var rotation = transform.rotation; @@ -276,14 +244,10 @@ namespace WaveHarmonic.Crest boundsY += 5f; } - var extents = bounds.extents; - // Extend bounds by global waves. - bounds.extents = new(extents.x + expandXZ, boundsY, extents.z + expandXZ); - - extents = bounds.extents; - var center = bounds.center; - var size = bounds.size; + extents.x += expandXZ; + extents.y += boundsY; + extents.z += expandXZ; // Get XZ bounds. Doing this manually bypasses updating render bounds call. Rect rect; @@ -291,7 +255,7 @@ namespace WaveHarmonic.Crest var p1 = transform.position; var p2 = rotation * new Vector3(center.x, 0f, center.z); var s1 = scale; - var s2 = rotation * new Vector3(size.x, 0f, size.z); + var s2 = rotation * (extents.XNZ(0f) * 2f); rect = new(0, 0, Mathf.Abs(s1.x * s2.x), Mathf.Abs(s1.z * s2.z)) { @@ -319,7 +283,9 @@ namespace WaveHarmonic.Crest expandXZ = boundsPadding / scale.x; boundsY = totalVertical; - bounds.extents = new(extents.x + expandXZ, extents.y + boundsY, extents.z + expandXZ); + extents.x += expandXZ; + extents.y += boundsY; + extents.z += expandXZ; } // Expand and offset bounds by height. @@ -342,35 +308,23 @@ namespace WaveHarmonic.Crest maximumWaterLevelBounds *= 0.5f; boundsY = minimumWaterLevelBounds + maximumWaterLevelBounds; - extents = bounds.extents; - bounds.extents = new(extents.x, extents.y + boundsY, extents.z); + extents.y += boundsY; + bounds.extents = extents; var offset = maximumWaterLevelBounds - minimumWaterLevelBounds; - center = bounds.center; - bounds.center = new(center.x, center.y + offset, center.z); + center.y += offset; + bounds.center = center; } - } - public void SetInstanceData(int lodIndex) - { - _LodIndex = lodIndex; + return bounds; } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] static void InitStatics() { - // Init here from 2019.3 onwards - s_CurrentCamera = null; HeightReporters.Clear(); DisplacementReporters.Clear(); } - - [RuntimeInitializeOnLoadMethod] - static void RunOnStart() - { - RenderPipelineManager.beginCameraRendering -= BeginCameraRendering; - RenderPipelineManager.beginCameraRendering += BeginCameraRendering; - } } static class BoundsHelper diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterReflections.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterReflections.cs index 51785dcd8..e0cc8bdbf 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterReflections.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Surface/WaterReflections.cs @@ -16,21 +16,19 @@ namespace WaveHarmonic.Crest /// /// What side of the water surface to render planar reflections for. /// + [@GenerateDoc] public enum WaterReflectionSide { - /// - /// Both sides. Most expensive. - /// + /// + [Tooltip("Both sides. Most expensive.")] Both, - /// - /// Above only. Typical for planar reflections. - /// + /// + [Tooltip("Above only. Typical for planar reflections.")] Above, - /// - /// Below only. For total internal reflections. - /// + /// + [Tooltip("Below only. For total internal reflections.")] Below, } @@ -269,27 +267,48 @@ namespace WaveHarmonic.Crest } } - internal void OnPreRenderCamera(Camera camera) + bool ShouldRender(Camera camera) { + // If no surface, then do not execute the reflection camera. + if (!WaterRenderer.ShouldRender(camera, _Water.Surface.Layer)) + { + return false; + } + + // This method could be executed twice: once by the camera rendering the surface, + // and once again by the planar reflection camera. For the latter, we do not want + // to proceed or infinite recursion. For safety. + if (camera == CurrentCamera) + { + return false; + } + + // Avoid these types for now. + if (camera.cameraType == CameraType.Reflection) + { + return false; + } + + return true; + } + + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + { + if (!ShouldRender(camera)) + { + return; + } + if (SupportsRecursiveRendering) { - if (camera.cameraType is CameraType.Preview or CameraType.Reflection) - { - return; - } - - if (!Helpers.MaskIncludesLayer(camera.cullingMask, _Water.Layer)) - { - return; - } - + // This option only valid for recursive, otherwise, it is always single camera. if (_RenderOnlySingleCamera && camera != _Water.Viewer) { return; } _CameraViewpoint = camera; - LateUpdate(); + LateUpdate(context); } if (camera == _CameraViewpoint) @@ -299,13 +318,17 @@ namespace WaveHarmonic.Crest } } - internal void OnAfterCameraRender(Camera camera) + internal void OnEndCameraRendering(Camera camera) { - if (SupportsRecursiveRendering && !_RenderOnlySingleCamera) return; + if (!ShouldRender(camera)) + { + return; + } + Shader.SetGlobalTexture(ShaderIDs.s_ReflectionTexture, Texture2D.blackTexture); } - internal void LateUpdate() + internal void LateUpdate(ScriptableRenderContext context) { // Frame rate limiter. if (_LastRefreshOnFrame > 0 && RefreshPerFrames > 1) @@ -362,7 +385,7 @@ namespace WaveHarmonic.Crest } // We do not want the water plane when rendering planar reflections. - _Water.Root.gameObject.SetActive(false); + _Water.Surface.Root.gameObject.SetActive(false); CurrentCamera = _CameraReflections; @@ -390,7 +413,7 @@ namespace WaveHarmonic.Crest try #endif { - Render(); + Render(context); } #if UNITY_EDITOR // Ensure that any global settings are restored. @@ -414,15 +437,18 @@ namespace WaveHarmonic.Crest _QualitySettingsOverride.Restore(); CurrentCamera = null; - _Water.Root.gameObject.SetActive(true); + _Water.Surface.Root.gameObject.SetActive(true); // Remember this frame as last refreshed. _LastRefreshOnFrame = Time.renderedFrameCount; } } - void Render() + void Render(ScriptableRenderContext context) { +#if UNITY_6000_0_OR_NEWER && d_UnityURP + _CameraReflections.targetTexture = _ReflectionTexture; +#else var descriptor = _ReflectionTexture.descriptor; descriptor.dimension = TextureDimension.Tex2D; descriptor.volumeDepth = 1; @@ -430,6 +456,7 @@ namespace WaveHarmonic.Crest // No need to clear, as camera clears using the skybox. var target = RenderTexture.GetTemporary(descriptor); _CameraReflections.targetTexture = target; +#endif if (_Mode != WaterReflectionSide.Below) { @@ -441,8 +468,11 @@ namespace WaveHarmonic.Crest _CameraReflections.cullingMask = _Layers & ~(1 << _UnderWater.Layer); } - RenderCamera(_CameraReflections, Vector3.up, false); + RenderCamera(context, _CameraReflections, Vector3.up, false, 0); + +#if !(UNITY_6000_0_OR_NEWER && d_UnityURP) Graphics.CopyTexture(target, 0, 0, _ReflectionTexture, 0, 0); +#endif _CameraReflections.ResetProjectionMatrix(); } @@ -459,29 +489,33 @@ namespace WaveHarmonic.Crest _CameraReflections.depthTextureMode = DepthTextureMode.Depth; } - RenderCamera(_CameraReflections, Vector3.down, _NonObliqueNearSurface); + RenderCamera(context, _CameraReflections, Vector3.down, _NonObliqueNearSurface, 1); + +#if !(UNITY_6000_0_OR_NEWER && d_UnityURP) Graphics.CopyTexture(target, 0, 0, _ReflectionTexture, 1, 0); +#endif _CameraReflections.ResetProjectionMatrix(); } - +#if !(UNITY_6000_0_OR_NEWER && d_UnityURP) RenderTexture.ReleaseTemporary(target); +#endif _ReflectionTexture.GenerateMips(); Shader.SetGlobalVectorArray(ShaderIDs.s_ReflectionPositionNormal, _ReflectionPositionNormal); } - void RenderCamera(Camera camera, Vector3 planeNormal, bool nonObliqueNearSurface) + void RenderCamera(ScriptableRenderContext context, Camera camera, Vector3 planeNormal, bool nonObliqueNearSurface, int slice) { // Find out the reflection plane: position and normal in world space - var planePosition = _Water.Root.position; + var planePosition = _Water.Position; var offset = _ClipPlaneOffset; { var viewpoint = _CameraViewpoint.transform; - if (offset == 0f && viewpoint.position.y == 0f && viewpoint.rotation.eulerAngles.y == 0f) + if (offset == 0f && viewpoint.position.y == planePosition.y) { // Minor offset to prevent "Screen position out of view frustum". Smallest number // to work with both above and below. Smallest number to work with both above and @@ -518,7 +552,7 @@ namespace WaveHarmonic.Crest if (SupportsRecursiveRendering) { - Helpers.RenderCamera(camera, _Water._Context); + Helpers.RenderCamera(camera, context, slice); } else { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CustomTimeProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CustomTimeProvider.cs index 088bc487b..9173879d3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CustomTimeProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CustomTimeProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -47,20 +47,34 @@ namespace WaveHarmonic.Crest readonly DefaultTimeProvider _DefaultTimeProvider = new(); float _TimeInternal = 0f; + bool _FirstUpdate = true; - private protected override void OnEnable() + private protected override void Initialize() { - base.OnEnable(); - - // May as well start on the same time value as unity - _TimeInternal = UnityEngine.Time.time; + base.Initialize(); + _FirstUpdate = true; } - void Update() + private protected override System.Action OnUpdateMethod => OnUpdate; + + void OnUpdate(WaterRenderer water) { // Use default TP delta time to update our time, because this dt works // well in edit mode - if (!_Paused) + if (_FirstUpdate) + { + _TimeInternal = _DefaultTimeProvider.Time; + +#if UNITY_EDITOR + if (!Application.isPlaying) + { + _TimeInternal += _DefaultTimeProvider.Delta; + } +#endif + + _FirstUpdate = false; + } + else if (!_Paused) { _TimeInternal += _DefaultTimeProvider.Delta; } @@ -71,20 +85,17 @@ namespace WaveHarmonic.Crest { get { + if (!isActiveAndEnabled) + { + return _DefaultTimeProvider.Time; + } + // Override means override if (_OverrideTime) { return _Time; } - // In edit mode, update is seldom called, so rely on the default TP -#if UNITY_EDITOR - if (!Application.isPlaying && !_Paused) - { - return _DefaultTimeProvider.Time; - } -#endif - // Otherwise use our accumulated time return _TimeInternal; } @@ -92,6 +103,27 @@ namespace WaveHarmonic.Crest // Either use override, or the default TP which works in edit mode /// - public override float Delta => _OverrideDeltaTime ? _DeltaTime : _DefaultTimeProvider.Delta; + public override float Delta + { + get + { + if (!isActiveAndEnabled) + { + return _DefaultTimeProvider.Delta; + } + + if (_Paused) + { + return 0f; + } + + if (_OverrideDeltaTime) + { + return _DeltaTime; + } + + return _DefaultTimeProvider.Delta; + } + } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CutsceneTimeProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CutsceneTimeProvider.cs index c3c2983b7..f0b28b78b 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CutsceneTimeProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/CutsceneTimeProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/DefaultTimeProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/DefaultTimeProvider.cs index b5d546026..cac6bf3a6 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/DefaultTimeProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/DefaultTimeProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. namespace WaveHarmonic.Crest @@ -19,7 +19,7 @@ namespace WaveHarmonic.Crest } else { - return WaterRenderer.LastUpdateEditorTime; + return WaterRenderer.EditorTime; } #else return UnityEngine.Time.time; @@ -38,7 +38,7 @@ namespace WaveHarmonic.Crest } else { - return 1f / 20f; + return WaterRenderer.EditorDeltaTime; } #else return UnityEngine.Time.deltaTime; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/NetworkedTimeProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/NetworkedTimeProvider.cs index 407c613d5..33a5b00d7 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/NetworkedTimeProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/NetworkedTimeProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/TimeProvider.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/TimeProvider.cs index 6a852a3fa..7f773ff66 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/TimeProvider.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Time/TimeProvider.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using WaveHarmonic.Crest.Internal; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Uniforms.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Uniforms.cs index f0b6198a6..710bb7fef 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Uniforms.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Uniforms.cs @@ -21,9 +21,38 @@ namespace WaveHarmonic.Crest public static readonly int s_TextureSize = Shader.PropertyToID("_Crest_TextureSize"); public static readonly int s_TexturePosition = Shader.PropertyToID("_Crest_TexturePosition"); public static readonly int s_TextureRotation = Shader.PropertyToID("_Crest_TextureRotation"); + public static readonly int s_Multiplier = Shader.PropertyToID("_Crest_Multiplier"); public static readonly int s_FeatherWidth = Shader.PropertyToID("_Crest_FeatherWidth"); public static readonly int s_NegativeValues = Shader.PropertyToID("_Crest_NegativeValues"); public static readonly int s_BoundaryXZ = Shader.PropertyToID("_Crest_BoundaryXZ"); public static readonly int s_DrawBoundaryXZ = Shader.PropertyToID("_Crest_DrawBoundaryXZ"); + + public static class Unity + { + public static readonly int s_CameraDepthTexture = Shader.PropertyToID("_CameraDepthTexture"); + public static readonly int s_CameraOpaqueTexture = Shader.PropertyToID("_CameraOpaqueTexture"); + public static readonly int s_MatrixPreviousM = Shader.PropertyToID("unity_MatrixPreviousM"); + public static readonly int s_SpecCube0 = Shader.PropertyToID("unity_SpecCube0"); + public static readonly int s_Time = Shader.PropertyToID("_Time"); + public static readonly int s_CameraToWorld = Shader.PropertyToID("_CameraToWorld"); + + + // Shader Graph + public static readonly int s_Surface = Shader.PropertyToID("_Surface"); + public static readonly int s_SrcBlend = Shader.PropertyToID("_SrcBlend"); + public static readonly int s_DstBlend = Shader.PropertyToID("_DstBlend"); + + + // Built-In Renderer + public static readonly int s_LightColor0 = Shader.PropertyToID("_LightColor0"); + public static readonly int s_ShadowMapTexture = Shader.PropertyToID("_ShadowMapTexture"); + public static readonly int s_WorldSpaceLightPos0 = Shader.PropertyToID("_WorldSpaceLightPos0"); + + // High Definition Renderer + public static readonly int s_ShaderVariablesGlobal = Shader.PropertyToID("ShaderVariablesGlobal"); + + // Universal Renderer + public static readonly int s_GlossyEnvironmentCubeMap = Shader.PropertyToID("_GlossyEnvironmentCubeMap"); + } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core.meta new file mode 100644 index 000000000..bae4c8c6f --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f03dd318ef494ed4793cac667ef2858f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime.meta new file mode 100644 index 000000000..aeed52fdd --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c9d8168ffc7eeda4fad34275d57c585d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs new file mode 100644 index 000000000..c9debe042 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs @@ -0,0 +1,7 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("WaveHarmonic.Crest")] +[assembly: InternalsVisibleTo("WaveHarmonic.Crest.Shared")] diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs.meta new file mode 100644 index 000000000..e4c8039e1 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/Assembly.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9d248516e9d84702a7da49167649f40 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref new file mode 100644 index 000000000..0319582cf --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref @@ -0,0 +1,3 @@ +{ + "reference": "GUID:df380645f10b7bc4b97d4f5eb6303d95" +} \ No newline at end of file diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref.meta new file mode 100644 index 000000000..630e0fc02 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Core/Runtime/WaveHarmonic.Crest.Bridge.asmref.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9a761b4f3cc5b4e468121ec3c51dda5a +AssemblyDefinitionReferenceImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Universal/Runtime/Assembly.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Universal/Runtime/Assembly.cs index 62ec8004b..c9debe042 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Universal/Runtime/Assembly.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Bridges/Unity.RenderPipelines.Universal/Runtime/Assembly.cs @@ -4,3 +4,4 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("WaveHarmonic.Crest")] +[assembly: InternalsVisibleTo("WaveHarmonic.Crest.Shared")] diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Collections/SortedList.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Collections/SortedList.cs index d58ae306b..0bbd08337 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Collections/SortedList.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Collections/SortedList.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System.Collections; @@ -42,6 +42,16 @@ namespace WaveHarmonic.Crest.Utility _NeedsSorting = true; } + public bool Contains(TValue value) + { + foreach (var item in _BackingList) + { + if (item.Value.Equals(value)) return true; + } + + return false; + } + public bool Remove(TValue value) { // This remove function has a fairly high complexity, as we need to search diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/Attributes.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/Attributes.cs index 65245785d..ca555c14d 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/Attributes.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/Attributes.cs @@ -84,6 +84,16 @@ namespace WaveHarmonic.Crest } } + [Conditional(Symbols.k_UnityEditor)] + [AttributeUsage(AttributeTargets.Enum, AllowMultiple = false, Inherited = false)] + sealed class GenerateDoc : Attribute + { + public GenerateDoc() + { + + } + } + #if !UNITY_EDITOR [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] @@ -102,12 +112,21 @@ namespace WaveHarmonic.Crest sealed class Disabled : Decorator { } [Conditional(Symbols.k_UnityEditor)] - sealed class AttachMaterialEditor : Decorator { } + sealed class AttachMaterialEditor : Attribute + { + public AttachMaterialEditor(int order = 0) { } + } + + [Conditional(Symbols.k_UnityEditor)] + sealed class InlineToggle : Decorator + { + public InlineToggle(bool fix = false) { } + } [Conditional(Symbols.k_UnityEditor)] sealed class Embedded : Decorator { - public Embedded(int margin = 0) { } + public Embedded(int margin = 0, string defaultPropertyName = null) { } } [Conditional(Symbols.k_UnityEditor)] diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/EditorBehaviour.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/EditorBehaviour.cs index 8006d5ca2..af1def4fa 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/EditorBehaviour.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Component/EditorBehaviour.cs @@ -21,8 +21,13 @@ namespace WaveHarmonic.Crest.Internal bool _IsFirstOnValidate = true; internal bool _IsPrefabStageInstance; + private protected virtual bool CanRunInEditMode => true; + private protected virtual void Awake() { + // Prevents allocations. + useGUILayout = false; + // When copy and pasting from one scene to another, destroy instance objects as // they will have bad state. foreach (var generated in transform.GetComponentsInChildren(includeInactive: true)) @@ -37,7 +42,7 @@ namespace WaveHarmonic.Crest.Internal /// /// Start method. Must be called if overriden. /// - protected virtual void Start() + private protected virtual void Start() { if (Application.isPlaying && !(bool)s_ExecuteValidators.Invoke(null, new object[] { this })) { @@ -63,6 +68,11 @@ namespace WaveHarmonic.Crest.Internal return; } + if (!CanRunInEditMode) + { + return; + } + if (_IsFirstOnValidate) { var attribute = Helpers.GetCustomAttribute(GetType()); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug.meta new file mode 100644 index 000000000..b34049290 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65e84a69730de24458beac07cc1bde92 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs new file mode 100644 index 000000000..eb310c67e --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs @@ -0,0 +1,29 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; + +namespace WaveHarmonic.Crest.Utility +{ + static class DebugUtility + { + public delegate void DrawLine(Vector3 position, Vector3 up, Color color, float duration); + + public static void DrawCross(DrawLine draw, Vector3 position, float r, Color color, float duration = 0f) + { + draw(position - Vector3.up * r, position + Vector3.up * r, color, duration); + draw(position - Vector3.right * r, position + Vector3.right * r, color, duration); + draw(position - Vector3.forward * r, position + Vector3.forward * r, color, duration); + } + + public static void DrawCross(DrawLine draw, Vector3 position, Vector3 up, float r, Color color, float duration = 0f) + { + up.Normalize(); + var right = Vector3.Normalize(Vector3.Cross(up, Vector3.forward)); + var forward = Vector3.Cross(up, right); + draw(position - up * r, position + up * r, color, duration); + draw(position - right * r, position + right * r, color, duration); + draw(position - forward * r, position + forward * r, color, duration); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs.meta new file mode 100644 index 000000000..d09e58170 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Debug/Debug.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afcafd3203e384a54aa71d2c40f2025c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Helpers.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Helpers.cs index 8500c7d33..e6037e6bf 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Helpers.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Helpers.cs @@ -21,6 +21,18 @@ namespace WaveHarmonic.Crest /// static partial class Helpers { + // Adapted from: + // Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs +#if UNITY_SWITCH || UNITY_ANDROID || UNITY_EMBEDDED_LINUX || UNITY_QNX + internal const GraphicsFormat k_DepthStencilFormat = GraphicsFormat.D24_UNorm_S8_UInt; + internal const int k_DepthBufferBits = 24; + internal const DepthBits k_DepthBits = DepthBits.Depth24; +#else + internal const GraphicsFormat k_DepthStencilFormat = GraphicsFormat.D32_SFloat_S8_UInt; + internal const int k_DepthBufferBits = 32; + internal const DepthBits k_DepthBits = DepthBits.Depth32; +#endif + public static class ShaderIDs { public static readonly int s_MainTexture = Shader.PropertyToID("_Utility_MainTexture"); @@ -128,31 +140,6 @@ namespace WaveHarmonic.Crest public static WaitForEndOfFrame WaitForEndOfFrame { get; } = new(); - static Material s_UtilityMaterial; - public static Material UtilityMaterial - { - get - { - if (s_UtilityMaterial == null) - { - s_UtilityMaterial = new(Shader.Find("Hidden/Crest/Utility/Blit")); - } - - return s_UtilityMaterial; - } - } - - // Need to cast to int but no conversion cost. - // https://stackoverflow.com/a/69148528 - internal enum UtilityPass - { - CopyColor, - CopyDepth, - ClearDepth, - ClearStencil, - Copy, - } - // Taken from: // https://github.com/Unity-Technologies/Graphics/blob/871df5563d88e1ba778c82a43f39c9afc95368e6/Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl#L1149-L1152 // Z buffer to linear 0..1 depth (0 at camera position, 1 at far plane). @@ -220,15 +207,22 @@ namespace WaveHarmonic.Crest } /// - /// Uses PrefabUtility.InstantiatePrefab in editor and GameObject.Instantiate in standalone. + /// Uses PrefabUtility.InstantiatePrefab in edit mode, otherwise uses GameObject.Instantiate. /// public static GameObject InstantiatePrefab(GameObject prefab) { #if UNITY_EDITOR - return (GameObject)UnityEditor.PrefabUtility.InstantiatePrefab(prefab); -#else - return GameObject.Instantiate(prefab); + if (!Application.isPlaying) + { + // Previously we always used this in the editor, including play mode. But it was + // reported to have failed (null return) when Asset Bundles were used in play mode. + return (GameObject)UnityEditor.PrefabUtility.InstantiatePrefab(prefab); + } + else #endif + { + return Object.Instantiate(prefab); + } } // Taken from Unity @@ -343,7 +337,7 @@ namespace WaveHarmonic.Crest if (RenderPipelineHelper.IsUniversal) { // MSAA will be the same for every camera if XR rendering. - isMSAA = isMSAA || XRHelpers.IsRunning; + isMSAA = isMSAA || Rendering.EnabledXR; } #endif @@ -588,7 +582,7 @@ namespace WaveHarmonic.Crest /// /// Uses Destroy in play mode or DestroyImmediate in edit mode. /// - public static void Destroy(Object @object) + public static void Destroy(Object @object, bool undo = false) { #if UNITY_EDITOR // We must use DestroyImmediate in edit mode. As it apparently has an overhead, use recommended Destroy in @@ -596,7 +590,14 @@ namespace WaveHarmonic.Crest // https://docs.unity3d.com/ScriptReference/Object.DestroyImmediate.html if (!Application.isPlaying) { - Object.DestroyImmediate(@object); + if (undo) + { + UnityEditor.Undo.DestroyObjectImmediate(@object); + } + else + { + Object.DestroyImmediate(@object); + } } else #endif @@ -605,11 +606,13 @@ namespace WaveHarmonic.Crest } } + static readonly Matrix4x4 s_ScaleMatrix = Matrix4x4.Scale(new(1f, 1f, -1f)); + // Borrowed from SRP code: // https://github.com/Unity-Technologies/Graphics/blob/7d292932bec3b4257a4defaf698fc7d77e2027f5/com.unity.render-pipelines.high-definition/Runtime/Core/Utilities/GeometryUtils.cs#L181-L184 public static Matrix4x4 CalculateWorldToCameraMatrixRHS(Vector3 position, Quaternion rotation) { - return Matrix4x4.Scale(new(1, 1, -1)) * Matrix4x4.TRS(position, rotation, Vector3.one).inverse; + return s_ScaleMatrix * Matrix4x4.TRS(position, rotation, Vector3.one).inverse; } /// @@ -618,14 +621,7 @@ namespace WaveHarmonic.Crest /// public static void Blit(CommandBuffer buffer, RenderTargetIdentifier target, Material material, int pass = -1, MaterialPropertyBlock properties = null) { - if (!RenderPipelineHelper.IsLegacy) - { - CoreUtils.SetRenderTarget(buffer, target); - } - else - { - buffer.SetRenderTarget(target); - } + CoreUtils.SetRenderTarget(buffer, target); buffer.DrawProcedural ( @@ -795,7 +791,7 @@ namespace WaveHarmonic.Crest static readonly UnityEngine.Rendering.RenderPipeline.StandardRequest s_RenderStandardRequest = new(); - public static void RenderCamera(Camera camera, ScriptableRenderContext context) + public static void RenderCamera(Camera camera, ScriptableRenderContext context, int slice) { #if d_UnityURP if (RenderPipelineHelper.IsUniversal) @@ -804,7 +800,9 @@ namespace WaveHarmonic.Crest // SingleCameraRequest does not render the full camera stack, thus should exclude // overlays which is likely desirable. Alternative approach worth investigating: // https://docs.unity3d.com/6000.0/Documentation/Manual/urp/User-Render-Requests.html - // TODO: pass destination texture and slice instead of copying later. + // Setting destination silences a warning if Opaque Texture enabled. + s_RenderSingleCameraRequest.destination = camera.targetTexture; + s_RenderSingleCameraRequest.slice = slice; UnityEngine.Rendering.RenderPipeline.SubmitRenderRequest(camera, s_RenderSingleCameraRequest); #else #pragma warning disable CS0618 // Type or member is obsolete @@ -828,7 +826,44 @@ namespace WaveHarmonic.Crest } + // Undo + static partial class Helpers + { + public static class Undo + { + static class Symbols + { + public const string k_UnityEditor = "UNITY_EDITOR"; + } + + [System.Diagnostics.Conditional(Symbols.k_UnityEditor)] + public static void RecordObject(Object @object, string label) + { +#if UNITY_EDITOR + UnityEditor.Undo.RecordObject(@object, label); +#endif + } + + [System.Diagnostics.Conditional(Symbols.k_UnityEditor)] + public static void SetSiblingIndex(Transform transform, int index, string label) + { +#if UNITY_EDITOR + UnityEditor.Undo.SetSiblingIndex(transform, index, label); +#endif + } + + [System.Diagnostics.Conditional(Symbols.k_UnityEditor)] + public static void RegisterCreatedObjectUndo(Object @object, string label) + { +#if UNITY_EDITOR + UnityEditor.Undo.RegisterCreatedObjectUndo(@object, label); +#endif + } + } + } + // Terrain +#if d_Unity_Terrain static partial class Helpers { static readonly List s_Terrains = new(); @@ -838,6 +873,11 @@ namespace WaveHarmonic.Crest foreach (var terrain in s_Terrains) { + if (terrain.terrainData == null) + { + continue; + } + var rect = new Rect(terrain.transform.position.XZ(), terrain.terrainData.size.XZ()); // Return the first one. @@ -850,6 +890,7 @@ namespace WaveHarmonic.Crest return null; } } +#endif // d_Unity_Terrain namespace Internal { @@ -869,6 +910,7 @@ namespace WaveHarmonic.Crest public static Vector4 XYNN(this Vector2 v, float n = 0f) => new(v.x, v.y, n, n); public static Vector4 XYNN(this Vector2 v, Vector2 n) => new(v.x, v.y, n.x, n.y); public static Vector4 NNZW(this Vector2 v, float n = 0f) => new(n, n, v.x, v.y); + public static Vector4 XNZW(this Vector4 v, float n) => new(v.x, n, v.z, v.w); public static float Maximum(this Vector3 v) => Mathf.Max(Mathf.Max(v.x, v.y), v.z); public static Vector2 Absolute(this Vector2 v) => new @@ -961,6 +1003,12 @@ namespace WaveHarmonic.Crest return GeometryUtility.CalculateBounds(s_BoundsPoints, transform.localToWorldMatrix); } + public static bool IntersectsXZ(this Bounds a, Bounds b) + { + return a.min.x <= b.max.x && a.max.x >= b.min.x && + a.min.z <= b.max.z && a.max.z >= b.min.z; + } + public static Rect RectXZ(this Bounds bounds) { return Rect.MinMaxRect(bounds.min.x, bounds.min.z, bounds.max.x, bounds.max.z); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs new file mode 100644 index 000000000..e1bbdbee2 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs @@ -0,0 +1,111 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; +using UnityEngine.Rendering; + +namespace WaveHarmonic.Crest +{ + interface ICommandWrapper : IPropertyWrapper + { + void SetInvertCulling(bool invert); + void DrawFullScreenTriangle(Material material, int pass, MaterialPropertyBlock block = null); + void DrawMesh(Mesh mesh, Matrix4x4 matrix, Material material, int pass = -1, MaterialPropertyBlock block = null); + } + + + readonly struct CommandWrapper : ICommandWrapper + { + public CommandBuffer Commands { get; } + public CommandWrapper(CommandBuffer commands) => Commands = commands; + public void SetFloat(int param, float value) => Commands.SetGlobalFloat(param, value); + public void SetFloatArray(int param, float[] value) => Commands.SetGlobalFloatArray(param, value); + public void SetTexture(int param, Texture value) => Commands.SetGlobalTexture(param, value); + public void SetVector(int param, Vector4 value) => Commands.SetGlobalVector(param, value); + public void SetVectorArray(int param, Vector4[] value) => Commands.SetGlobalVectorArray(param, value); + public void SetMatrix(int param, Matrix4x4 value) => Commands.SetGlobalMatrix(param, value); + public void SetInteger(int param, int value) => Commands.SetGlobalInteger(param, value); + public void SetBoolean(int param, bool value) => Commands.SetGlobalInteger(param, value ? 1 : 0); + + public void GetBlock() { } + public void SetBlock() { } + + public void SetInvertCulling(bool invert) => Commands.SetInvertCulling(invert); + + public void DrawFullScreenTriangle(Material material, int pass = -1, MaterialPropertyBlock block = null) + { + Commands.DrawProcedural + ( + Matrix4x4.identity, + material, + pass, + MeshTopology.Triangles, + vertexCount: 3, + instanceCount: 1, + block + ); + } + + public void DrawMesh(Mesh mesh, Matrix4x4 matrix, Material material, int pass = -1, MaterialPropertyBlock block = null) + { + Commands.DrawMesh + ( + mesh, + matrix, + material, + submeshIndex: 0, + pass, + block + ); + } + } + +#if UNITY_6000_0_OR_NEWER + readonly struct RasterCommandWrapper : ICommandWrapper + { + public RasterCommandBuffer Commands { get; } + public RasterCommandWrapper(RasterCommandBuffer commands) => Commands = commands; + public void SetFloat(int param, float value) => Commands.SetGlobalFloat(param, value); + public void SetFloatArray(int param, float[] value) => Commands.SetGlobalFloatArray(param, value); + // WARNING: bypasses RG checks. Only use for textures external to RG. + public void SetTexture(int param, Texture value) => Commands.m_WrappedCommandBuffer.SetGlobalTexture(param, value); + public void SetVector(int param, Vector4 value) => Commands.SetGlobalVector(param, value); + public void SetVectorArray(int param, Vector4[] value) => Commands.SetGlobalVectorArray(param, value); + public void SetMatrix(int param, Matrix4x4 value) => Commands.SetGlobalMatrix(param, value); + public void SetInteger(int param, int value) => Commands.SetGlobalInteger(param, value); + public void SetBoolean(int param, bool value) => Commands.SetGlobalInteger(param, value ? 1 : 0); + + public void GetBlock() { } + public void SetBlock() { } + + public void SetInvertCulling(bool invert) => Commands.SetInvertCulling(invert); + + public void DrawFullScreenTriangle(Material material, int pass, MaterialPropertyBlock block = null) + { + Commands.DrawProcedural + ( + Matrix4x4.identity, + material, + pass, + MeshTopology.Triangles, + vertexCount: 3, + instanceCount: 1, + block + ); + } + + public void DrawMesh(Mesh mesh, Matrix4x4 matrix, Material material, int pass = -1, MaterialPropertyBlock block = null) + { + Commands.DrawMesh + ( + mesh, + matrix, + material, + submeshIndex: 0, + pass, + block + ); + } + } +#endif // UNITY_6000_0_OR_NEWER +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs.meta new file mode 100644 index 000000000..7ffa291dc --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CommandWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a5766c3523cc4af586139878192e12d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CustomPassHelpers.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CustomPassHelpers.cs index 663c0693a..1eed39ae5 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CustomPassHelpers.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/CustomPassHelpers.cs @@ -9,6 +9,12 @@ using UnityEngine.Rendering.HighDefinition; namespace WaveHarmonic.Crest { + class CustomPass : UnityEngine.Rendering.HighDefinition.CustomPass + { + internal GameObject _GameObject; + internal CustomPassVolume _Volume; + } + static class CustomPassHelpers { internal static List s_Volumes = new(); @@ -62,7 +68,8 @@ namespace WaveHarmonic.Crest GameObject gameObject, ref T pass, string name, - CustomPassInjectionPoint injectionPoint + CustomPassInjectionPoint injectionPoint, + int priority = 0 ) where T : CustomPass, new() { @@ -85,14 +92,15 @@ namespace WaveHarmonic.Crest volume = gameObject.AddComponent(); volume.injectionPoint = injectionPoint; volume.isGlobal = true; + volume.priority = priority; } // Create custom pass. pass ??= new() { - name = $"Crest {name}", - targetColorBuffer = CustomPass.TargetBuffer.None, - targetDepthBuffer = CustomPass.TargetBuffer.None, + name = name, + targetColorBuffer = UnityEngine.Rendering.HighDefinition.CustomPass.TargetBuffer.None, + targetDepthBuffer = UnityEngine.Rendering.HighDefinition.CustomPass.TargetBuffer.None, }; // Add custom pass. @@ -100,6 +108,27 @@ namespace WaveHarmonic.Crest { volume.customPasses.Add(pass); } + + pass._GameObject = gameObject; + pass._Volume = volume; + } + + public static void Update(GameObject go, T pass, CustomPassInjectionPoint point, int priority = 0) where T : CustomPass + { + CustomPassVolume volume = null; + go.GetComponents(s_Volumes); + + foreach (var v in s_Volumes) + { + if (v.customPasses.Contains(pass)) + { + volume = v; + break; + } + } + + volume.injectionPoint = point; + volume.priority = priority; } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs new file mode 100644 index 000000000..610eda74e --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs @@ -0,0 +1,52 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// Adapted from: +// https://github.com/keijiro/LightProbeUtility/blob/85c93577338e10a52dd53f263056de08d883337a/Assets/LightProbeUtility.cs + +// With fixes from: +// https://github.com/keijiro/LightProbeUtility/pull/2 + +using UnityEngine; + +namespace WaveHarmonic.Crest +{ + static class LightProbeUtility + { + static readonly int[] s_SHA = + { + Shader.PropertyToID("unity_SHAr"), + Shader.PropertyToID("unity_SHAg"), + Shader.PropertyToID("unity_SHAb") + }; + + static readonly int[] s_SHB = + { + Shader.PropertyToID("unity_SHBr"), + Shader.PropertyToID("unity_SHBg"), + Shader.PropertyToID("unity_SHBb") + }; + + static readonly int s_SHC = Shader.PropertyToID("unity_SHC"); + + public static void SetSHCoefficients(this T properties, Vector3 position) where T : IPropertyWrapper + { + LightProbes.GetInterpolatedProbe(position, null, out var sh); + + // Constant + Linear. + for (var i = 0; i < 3; i++) + { + properties.SetVector(s_SHA[i], new(sh[i, 3], sh[i, 1], sh[i, 2], sh[i, 0] - sh[i, 6])); + } + + // Quadratic polynomials. + for (var i = 0; i < 3; i++) + { + properties.SetVector(s_SHB[i], new(sh[i, 4], sh[i, 5], sh[i, 6] * 3, sh[i, 7])); + } + + // Final quadratic polynomial. + properties.SetVector(s_SHC, new(sh[0, 8], sh[1, 8], sh[2, 8], 1)); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs.meta new file mode 100644 index 000000000..ab1d6c21f --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/LightProbeUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf4aa5298ac5b4562a8c1f0466045eff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/PropertyWrapper.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/PropertyWrapper.cs index f4fbfc9de..6d6a83c50 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/PropertyWrapper.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/PropertyWrapper.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs new file mode 100644 index 000000000..30eed4aef --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs @@ -0,0 +1,37 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// RTHandles for Built-In Render Pipeline. +// We cannot call dispose ourselves, but it does not seem to be a problem. + +using UnityEngine; + +namespace WaveHarmonic.Crest.Utility +{ + static class RTHandles + { + public static void Initialize() + { + if (!RenderPipelineHelper.IsLegacy) + { + return; + } + + // Check whether already initialized. + if (UnityEngine.Rendering.RTHandles.maxWidth > 1) + { + return; + } + + UnityEngine.Rendering.RTHandles.Initialize(Screen.width, Screen.height); + UnityEngine.Rendering.RTHandles.SetHardwareDynamicResolutionState(false); + } + + public static void OnBeginCameraRendering(Camera camera) + { + // Forget Dynamic Scaling, as is broken for Shader Graph and Post-Processing anyway. + // The only foreseeable problem is if a third party calls this with a different size. + UnityEngine.Rendering.RTHandles.SetReferenceSize(camera.pixelWidth, camera.pixelHeight); + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs.meta new file mode 100644 index 000000000..9096bd404 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RTHandles.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fed5f2fe3fcaa450f9c621080f7989ec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RenderGraphUtility.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RenderGraphUtility.cs index f7760fa44..7c9309bd8 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RenderGraphUtility.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/RenderGraphUtility.cs @@ -34,18 +34,48 @@ namespace WaveHarmonic.Crest public static implicit operator TextureHandle(Handle texture) => texture._TextureHandle; } - static readonly FieldInfo s_RenderContext = typeof(InternalRenderGraphContext).GetField("renderContext", BindingFlags.NonPublic | BindingFlags.Instance); static readonly FieldInfo s_WrappedContext = typeof(UnsafeGraphContext).GetField("wrappedContext", BindingFlags.NonPublic | BindingFlags.Instance); - static readonly FieldInfo s_FrameData = typeof(RenderingData).GetField("frameData", BindingFlags.NonPublic | BindingFlags.Instance); public static ScriptableRenderContext GetRenderContext(this UnsafeGraphContext unsafeContext) { - return (ScriptableRenderContext)s_RenderContext.GetValue((InternalRenderGraphContext)s_WrappedContext.GetValue(unsafeContext)); + return ((InternalRenderGraphContext)s_WrappedContext.GetValue(unsafeContext)).renderContext; } public static ContextContainer GetFrameData(this ref RenderingData renderingData) { - return (ContextContainer)s_FrameData.GetValue(renderingData); + return renderingData.frameData; + } + + internal class PassData + { +#pragma warning disable IDE1006 // Naming Styles + public UniversalCameraData cameraData; + public UniversalRenderingData renderingData; + public Handle colorTargetHandle; + public Handle depthTargetHandle; +#pragma warning restore IDE1006 // Naming Styles + + public void Init(ContextContainer frameData, IUnsafeRenderGraphBuilder builder = null) + { + var resources = frameData.Get(); + cameraData = frameData.Get(); + renderingData = frameData.Get(); + + if (builder == null) + { +#pragma warning disable CS0618 // Type or member is obsolete + colorTargetHandle = cameraData.renderer.cameraColorTargetHandle; + depthTargetHandle = cameraData.renderer.cameraDepthTargetHandle; +#pragma warning restore CS0618 // Type or member is obsolete + } + else + { + colorTargetHandle = resources.activeColorTexture; + depthTargetHandle = resources.activeDepthTexture; + builder.UseTexture(colorTargetHandle, AccessFlags.ReadWrite); + builder.UseTexture(depthTargetHandle, AccessFlags.ReadWrite); + } + } } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs new file mode 100644 index 000000000..d0f01b9fd --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs @@ -0,0 +1,260 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// ENABLE_VR is defined if the platform supports XR. +// d_UnityModuleVR is defined if the VR module is installed. +// VR module depends on XR module (which does nothing by itself) so we only need to check the VR module. +#if ENABLE_VR && d_UnityModuleVR +#define _XR_ENABLED +#endif + +using System.Collections.Generic; +using System.Diagnostics; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; +using UnityEngine.Rendering.Universal; +using UnityEngine.XR; + +namespace WaveHarmonic.Crest +{ + static partial class Rendering + { + // Adaptor layer for XR module similar to Unity's XRGraphics/XRSRPSettings. + // We cannot use theirs as they keep on renaming it… + + static readonly GlobalKeyword s_SinglePassInstancedKeyword = new("STEREO_INSTANCING_ON"); + static readonly GlobalKeyword s_SinglePassMultiViewKeyword = new("STEREO_MULTIVIEW_ON"); + +#if _XR_ENABLED + internal static GlobalKeyword SinglePassKeyword => XRSettings.stereoRenderingMode switch + { + XRSettings.StereoRenderingMode.SinglePassInstanced => s_SinglePassInstancedKeyword, + XRSettings.StereoRenderingMode.SinglePassMultiview => s_SinglePassMultiViewKeyword, + _ => throw new System.NotImplementedException(), + }; +#endif + + public static bool EnabledXR + { + get + { +#if _XR_ENABLED + return XRSettings.enabled; +#else + return false; +#endif + } + } + + static bool SinglePassXR + { + get + { +#if _XR_ENABLED + return XRSettings.enabled && (XRSettings.stereoRenderingMode is XRSettings.StereoRenderingMode.SinglePassInstanced or XRSettings.StereoRenderingMode.SinglePassMultiview); +#else + return false; +#endif + } + } + + static bool MultiPassXR + { + get + { +#if _XR_ENABLED + return XRSettings.enabled && XRSettings.stereoRenderingMode is XRSettings.StereoRenderingMode.MultiPass; +#else + return false; +#endif + } + } + + public static partial class BIRP + { + [Conditional("_XR_ENABLED")] + public static void EnableXR(CommandBuffer commands, Camera camera) + { +#if _XR_ENABLED + if (!SinglePassXR || !camera.stereoEnabled) + { + return; + } + + commands.EnableKeyword(SinglePassKeyword); +#endif + } + + [Conditional("_XR_ENABLED")] + public static void DisableXR(CommandBuffer commands, Camera camera) + { +#if _XR_ENABLED + if (!SinglePassXR || !camera.stereoEnabled) + { + return; + } + + commands.DisableKeyword(SinglePassKeyword); +#endif + } + } + + + // + // Stereo Rendering + // + +#if _XR_ENABLED + public static partial class BIRP + { + // NOTE: This is the same value as Unity, but in the future it could be higher. + const int k_MaximumViewsXR = 2; + + static partial class ShaderIDs + { + public static readonly int s_StereoInverseViewProjection = Shader.PropertyToID("_Crest_StereoInverseViewProjection"); + } + + static readonly List s_DisplayListXR = new(); + + // Unity only supports one display right now. + static XRDisplaySubsystem DisplayXR => XRSettings.enabled ? s_DisplayListXR[0] : null; + + static Matrix4x4[] InverseViewProjectionMatrixXR { get; set; } = new Matrix4x4[2]; + + static Texture2DArray s_WhiteTextureXR = null; + public static Texture2DArray WhiteTextureXR + { + get + { + if (s_WhiteTextureXR == null) + { + s_WhiteTextureXR = TextureArrayHelpers.CreateTexture2DArray(Texture2D.whiteTexture, k_MaximumViewsXR); + s_WhiteTextureXR.name = "_Crest_WhiteTextureXR"; + } + + return s_WhiteTextureXR; + } + } + + public static void SetMatricesXR(Camera camera) + { + if (!camera.stereoEnabled || !SinglePassXR) + { + return; + } + + SubsystemManager.GetSubsystems(s_DisplayListXR); + // XR SPI only has one pass by definition. + DisplayXR.GetRenderPass(renderPassIndex: 0, out var xrPass); + xrPass.GetRenderParameter(camera, renderParameterIndex: 0, out var xrLeftEye); + xrPass.GetRenderParameter(camera, renderParameterIndex: 1, out var xrRightEye); + // We must opt for renderIntoTexture for Unity to handle Y flip. + InverseViewProjectionMatrixXR[0] = (GL.GetGPUProjectionMatrix(xrLeftEye.projection, true) * xrLeftEye.view).inverse; + InverseViewProjectionMatrixXR[1] = (GL.GetGPUProjectionMatrix(xrRightEye.projection, true) * xrRightEye.view).inverse; + Shader.SetGlobalMatrixArray(ShaderIDs.s_StereoInverseViewProjection, InverseViewProjectionMatrixXR); + } + } +#endif // _XR_ENABLED + } +} + +#if d_UnityURP +namespace WaveHarmonic.Crest +{ +#if !UNITY_6000_0_OR_NEWER + using UniversalCameraData = CameraData; +#endif + + static partial class Rendering + { + public static class URP + { + [Conditional("_XR_ENABLED")] + public static void EnableXR(CommandBuffer commands, UniversalCameraData camera) + { +#if _XR_ENABLED + // We need to check the mask or it will cause entire pipeline to output black. Appears to only affect URP. + if (!SinglePassXR || !camera.xrRendering || camera.camera.stereoTargetEye != StereoTargetEyeMask.Both) + { + return; + } + + commands.EnableKeyword(SinglePassKeyword); +#endif + } + + [Conditional("_XR_ENABLED")] + public static void DisableXR(CommandBuffer commands, UniversalCameraData camera) + { +#if _XR_ENABLED + if (!SinglePassXR || !camera.xrRendering || camera.camera.stereoTargetEye != StereoTargetEyeMask.Both) + { + return; + } + + commands.DisableKeyword(SinglePassKeyword); +#endif + } + } + } +} +#endif // d_UnityURP + +#if d_UnityHDRP +namespace WaveHarmonic.Crest +{ + static partial class Rendering + { + public static class HDRP + { + [Conditional("_XR_ENABLED")] + public static void EnableXR(CommandBuffer commands, HDAdditionalCameraData camera) + { +#if _XR_ENABLED + if (!SinglePassXR || camera == null || !camera.xrRendering) + { + return; + } + + commands.EnableKeyword(SinglePassKeyword); +#endif + } + + [Conditional("_XR_ENABLED")] + public static void DisableXR(CommandBuffer commands, HDAdditionalCameraData camera) + { +#if _XR_ENABLED + if (!SinglePassXR || camera == null || !camera.xrRendering) + { + return; + } + + commands.DisableKeyword(SinglePassKeyword); +#endif + } + + public static bool SkipPassXR(ref int index, HDAdditionalCameraData data) + { +#if _XR_ENABLED + if (MultiPassXR && data != null && data.xrRendering) + { + // Alternate between left and right eye. + index += 1; + index %= 2; + } + else +#endif + + { + index = -1; + } + + // Skip if rendering the right eye. + return index == 1; + } + } + } +} +#endif // d_UnityHDRP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs.meta new file mode 100644 index 000000000..b2da90142 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.XR.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: beeb15d60da12461bb224ab1b3a6a12a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs new file mode 100644 index 000000000..2ace7ffc7 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs @@ -0,0 +1,124 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if ENABLE_VR && d_UnityModuleVR +#define _XR_ENABLED +#endif + +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.XR; + +namespace WaveHarmonic.Crest +{ + static partial class Rendering + { + public static partial class BIRP + { + static partial class ShaderIDs + { + public static readonly int s_InverseViewProjection = Shader.PropertyToID("_Crest_InverseViewProjection"); + } + + public static Texture GetWhiteTexture(Camera camera) + { +#if _XR_ENABLED + if (camera.stereoEnabled && SinglePassXR) + { + return WhiteTextureXR; + } +#endif + + return Texture2D.whiteTexture; + } + + public static void SetMatrices(Camera camera) + { + Shader.SetGlobalMatrix(ShaderIDs.s_InverseViewProjection, (GL.GetGPUProjectionMatrix(camera.projectionMatrix, true) * camera.worldToCameraMatrix).inverse); + +#if _XR_ENABLED + SetMatricesXR(camera); +#endif + } + + public enum FrameBufferFormatOverride + { + None, + LDR, + HDR, + } + + public static RenderTextureDescriptor GetCameraTargetDescriptor(Camera camera, FrameBufferFormatOverride hdrOverride = FrameBufferFormatOverride.None) + { + RenderTextureDescriptor descriptor; + +#if _XR_ENABLED + if (camera.stereoEnabled) + { + // Will not set the following correctly: + // - HDR format + descriptor = XRSettings.eyeTextureDesc; + } + else +#endif + { + // As recommended by Unity, in 2021.2 using SystemInfo.GetGraphicsFormat with DefaultFormat.LDR is + // necessary or gamma color space texture is returned: + // https://docs.unity3d.com/ScriptReference/Experimental.Rendering.DefaultFormat.html + descriptor = new(camera.pixelWidth, camera.pixelHeight, SystemInfo.GetGraphicsFormat(DefaultFormat.LDR), 0); + } + + // Set HDR format. + if (camera.allowHDR && QualitySettings.activeColorSpace == ColorSpace.Linear) + { + var format = DefaultFormat.HDR; + + if (hdrOverride is not FrameBufferFormatOverride.None) + { + format = hdrOverride is FrameBufferFormatOverride.HDR ? DefaultFormat.HDR : DefaultFormat.LDR; + } +#if UNITY_ANDROID || UNITY_IOS || UNITY_TVOS + else + { + format = DefaultFormat.LDR; + } +#endif + + descriptor.graphicsFormat = SystemInfo.GetGraphicsFormat(format); + } + + return descriptor; + } + } + } + + static partial class Rendering + { + // Blit + public static partial class BIRP + { + // Need to cast to int but no conversion cost. + // https://stackoverflow.com/a/69148528 + internal enum UtilityPass + { + CopyDepth, + Copy, + MergeDepth, + } + + static Material s_UtilityMaterial; + public static Material UtilityMaterial + { + get + { + if (s_UtilityMaterial == null) + { + s_UtilityMaterial = new(Shader.Find("Hidden/Crest/Legacy/Blit")); + } + + return s_UtilityMaterial; + } + } + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs.meta new file mode 100644 index 000000000..291243d2e --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/Rendering.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33d8472e9ea11461b8bf02d7c4a72ec4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/TextureArrayHelpers.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/TextureArrayHelpers.cs index 50908399c..352cb7b92 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/TextureArrayHelpers.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/Rendering/TextureArrayHelpers.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -7,7 +7,7 @@ namespace WaveHarmonic.Crest { static class TextureArrayHelpers { - const int k_SmallTextureSize = 4; + internal const int k_SmallTextureSize = 4; public static Texture2D CreateTexture2D(Color color, TextureFormat format) { diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/WaveHarmonic.Crest.Shared.asmdef b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/WaveHarmonic.Crest.Shared.asmdef index 69ab61993..25d16ebf4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/WaveHarmonic.Crest.Shared.asmdef +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/WaveHarmonic.Crest.Shared.asmdef @@ -16,6 +16,11 @@ "UNITY_2022_3_OR_NEWER" ], "versionDefines": [ + { + "name": "com.unity.modules.terrain", + "expression": "", + "define": "d_Unity_Terrain" + }, { "name": "com.unity.modules.xr", "expression": "", diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/XR/XRHelpers.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/XR/XRHelpers.cs index f556492d7..0fc2a485a 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/XR/XRHelpers.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Utility/Shared/XR/XRHelpers.cs @@ -1,183 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. -// Adaptor layer for XR module. Could be replaced with the following one day: -// com.unity.render-pipelines.core/Runtime/Common/XRGraphics.cs - -// Currently, only the horizon line uses it. - -// ENABLE_VR is defined if platform support XR. -// d_UnityModuleVR is defined if VR module is installed. -// VR module depends on XR module so we only need to check the VR module. -#if ENABLE_VR && d_UnityModuleVR -#define _XR_ENABLED -#endif - -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.XR; - -namespace WaveHarmonic.Crest -{ - static class XRHelpers - { - // NOTE: This is the same value as Unity, but in the future it could be higher. - const int k_MaximumViews = 2; - -#if _XR_ENABLED - static readonly List s_DisplayList = new(); - - // Unity only supports one display right now. - static XRDisplaySubsystem Display => IsRunning ? s_DisplayList[0] : null; -#endif - - static Matrix4x4 LeftEyeProjectionMatrix { get; set; } - static Matrix4x4 RightEyeProjectionMatrix { get; set; } - static Matrix4x4 LeftEyeViewMatrix { get; set; } - static Matrix4x4 RightEyeViewMatrix { get; set; } - static Matrix4x4 LeftInverseViewProjectionMatrixGPU { get; set; } - static Matrix4x4 RightInverseViewProjectionMatrixGPU { get; set; } - - static class ShaderIDs - { - public static readonly int s_InverseViewProjection = Shader.PropertyToID("_Crest_InverseViewProjection"); - public static readonly int s_InverseViewProjectionRight = Shader.PropertyToID("_Crest_InverseViewProjectionRight"); - } - - internal static bool IsRunning - { - get - { -#if _XR_ENABLED - return XRSettings.enabled; -#else - return false; -#endif - } - } - - public static bool IsSinglePass - { - get - { -#if _XR_ENABLED - return IsRunning && (XRSettings.stereoRenderingMode == XRSettings.StereoRenderingMode.SinglePassInstanced || - XRSettings.stereoRenderingMode == XRSettings.StereoRenderingMode.SinglePassMultiview); -#else - return false; -#endif - } - } - - static Texture2DArray s_WhiteTexture = null; - public static Texture2DArray WhiteTexture - { - get - { - if (s_WhiteTexture == null) - { - s_WhiteTexture = TextureArrayHelpers.CreateTexture2DArray(Texture2D.whiteTexture, k_MaximumViews); - s_WhiteTexture.name = "Crest White Texture XR"; - } - return s_WhiteTexture; - } - } - - public static RenderTextureDescriptor GetRenderTextureDescriptor(Camera camera) - { -#if _XR_ENABLED - if (camera.stereoEnabled) - { - return XRSettings.eyeTextureDesc; - } - else -#endif - { - // As recommended by Unity, in 2021.2 using SystemInfo.GetGraphicsFormat with DefaultFormat.LDR is - // necessary or gamma color space texture is returned: - // https://docs.unity3d.com/ScriptReference/Experimental.Rendering.DefaultFormat.html - return new(camera.pixelWidth, camera.pixelHeight, SystemInfo.GetGraphicsFormat(UnityEngine.Experimental.Rendering.DefaultFormat.LDR), 0); - } - } - - static void SetViewProjectionMatrices(Camera camera, int passIndex) - { -#if _XR_ENABLED - if (!XRSettings.enabled || IsSinglePass) - { - return; - } - // Not going to use cached values here just in case. - Display.GetRenderPass(passIndex, out var xrPass); - xrPass.GetRenderParameter(camera, renderParameterIndex: 0, out var xrEye); - camera.projectionMatrix = xrEye.projection; -#endif - } - - public static void UpdatePassIndex(ref int passIndex) - { - if (IsRunning) - { -#if _XR_ENABLED - if (XRSettings.stereoRenderingMode == XRSettings.StereoRenderingMode.MultiPass) - { - // Alternate between left and right eye. - passIndex += 1; - passIndex %= 2; - } - else - { - passIndex = 0; - } -#endif - } - else - { - passIndex = -1; - } - } - - public static void SetInverseViewProjectionMatrix(Camera camera) - { - // Have to set these explicitly as the built-in transforms aren't in world-space for the blit function. - if (camera.stereoEnabled && IsSinglePass) - { - Shader.SetGlobalMatrix(ShaderIDs.s_InverseViewProjection, LeftInverseViewProjectionMatrixGPU); - Shader.SetGlobalMatrix(ShaderIDs.s_InverseViewProjectionRight, RightInverseViewProjectionMatrixGPU); - } - else - { - Shader.SetGlobalMatrix(ShaderIDs.s_InverseViewProjection, LeftInverseViewProjectionMatrixGPU); - } - } - - public static void Update(Camera camera) - { -#if _XR_ENABLED - SubsystemManager.GetSubsystems(s_DisplayList); -#endif - - if (!camera.stereoEnabled || !IsSinglePass) - { - // Built-in renderer does not provide these matrices. - LeftInverseViewProjectionMatrixGPU = (GL.GetGPUProjectionMatrix(camera.projectionMatrix, false) * camera.worldToCameraMatrix).inverse; - return; - } - -#if _XR_ENABLED - // XR SPI only has one pass by definition. - Display.GetRenderPass(renderPassIndex: 0, out var xrPass); - // Grab left and right eye. - xrPass.GetRenderParameter(camera, renderParameterIndex: 0, out var xrLeftEye); - xrPass.GetRenderParameter(camera, renderParameterIndex: 1, out var xrRightEye); - // Store all the matrices. - LeftEyeViewMatrix = xrLeftEye.view; - RightEyeViewMatrix = xrRightEye.view; - LeftEyeProjectionMatrix = xrLeftEye.projection; - RightEyeProjectionMatrix = xrRightEye.projection; - LeftInverseViewProjectionMatrixGPU = (GL.GetGPUProjectionMatrix(LeftEyeProjectionMatrix, false) * LeftEyeViewMatrix).inverse; - RightInverseViewProjectionMatrixGPU = (GL.GetGPUProjectionMatrix(RightEyeProjectionMatrix, false) * RightEyeViewMatrix).inverse; -#endif - } - } -} +// Empty. diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPass.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPass.cs index beac85437..89f157fd3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPass.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPass.cs @@ -16,14 +16,15 @@ namespace WaveHarmonic.Crest RTHandle _ColorTarget; RTHandle _DepthTarget; - bool _FirstRender = true; readonly System.Action _CopyColorTexture; + readonly System.Action _SetRenderTargetToBackBuffers; public UnderwaterEffectPass(UnderwaterRenderer renderer) { _Renderer = renderer; _CopyColorTexture = new(CopyColorTexture); + _SetRenderTargetToBackBuffers = new(SetRenderTargetToBackBuffers); } void CopyColorTexture(CommandBuffer buffer) @@ -32,10 +33,20 @@ namespace WaveHarmonic.Crest CoreUtils.SetRenderTarget(buffer, _ColorTarget, _DepthTarget, ClearFlag.None); } + void SetRenderTargetToBackBuffers(CommandBuffer commands) + { + CoreUtils.SetRenderTarget(commands, _ColorTarget, _DepthTarget, ClearFlag.None); + } + public void Allocate(GraphicsFormat format) { + if (_Renderer.RenderBeforeTransparency && !_Renderer._NeedsColorTexture) + { + return; + } + // TODO: There may other settings we want to set or bring in. Not MSAA since this is a resolved texture. - _ColorTexture = RTHandles.Alloc + _ColorTexture ??= RTHandles.Alloc ( Vector2.one, TextureXR.slices, @@ -50,6 +61,11 @@ namespace WaveHarmonic.Crest public void ReAllocate(RenderTextureDescriptor descriptor) { + if (_Renderer.RenderBeforeTransparency && !_Renderer._NeedsColorTexture) + { + return; + } + // Descriptor will not have MSAA bound. RenderPipelineCompatibilityHelper.ReAllocateIfNeeded(ref _ColorTexture, descriptor, name: "_Crest_UnderwaterCameraColorTexture"); } @@ -62,22 +78,32 @@ namespace WaveHarmonic.Crest public void Execute(Camera camera, CommandBuffer buffer, RTHandle color, RTHandle depth, MaterialPropertyBlock mpb = null) { - _Renderer.UpdateEffectMaterial(camera, _FirstRender); + _Renderer.UpdateEffectMaterial(camera); _ColorTarget = color; _DepthTarget = depth; - CopyColorTexture(buffer); - buffer.SetGlobalTexture(UnderwaterRenderer.ShaderIDs.s_CameraColorTexture, _ColorTexture); + if (!_Renderer.RenderBeforeTransparency || _Renderer._NeedsColorTexture) + { + buffer.SetGlobalTexture(UnderwaterRenderer.ShaderIDs.s_CameraColorTexture, _ColorTexture); + } - _Renderer.ExecuteEffect(camera, buffer, _CopyColorTexture, mpb); + if (!_Renderer.RenderBeforeTransparency) + { + CopyColorTexture(buffer); + } + else + { + // TODO: needed for HDRP, but can set it on pass instead. + CoreUtils.SetRenderTarget(buffer, _ColorTarget, _DepthTarget, ClearFlag.None); + } + + _Renderer.ExecuteEffect(camera, buffer, _CopyColorTexture, _SetRenderTargetToBackBuffers, mpb); // The last pass (uber post) does not resolve the texture. // Although, this is wasteful if the pass after this does a resolve. // Possibly a bug with Unity? buffer.ResolveAntiAliasedSurface(color); - - _FirstRender = false; } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassHDRP.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassHDRP.cs index a26516fa8..0fca57ca1 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassHDRP.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassHDRP.cs @@ -7,7 +7,6 @@ using UnityEngine; using UnityEngine.Experimental.Rendering; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering.RendererUtils; namespace WaveHarmonic.Crest { @@ -17,13 +16,11 @@ namespace WaveHarmonic.Crest static UnderwaterRenderer s_Renderer; static UnderwaterEffectPass s_UnderwaterEffectPass; - static UnderwaterEffectPassHDRP s_Instance; + internal static UnderwaterEffectPassHDRP s_Instance; static CopyDepthBufferPassHDRP s_CopyDepthBufferPassHDRP; static ShaderTagId[] s_ForwardShaderTags; - GameObject _GameObject; - public static void Enable(UnderwaterRenderer renderer) { var gameObject = CustomPassHelpers.CreateOrUpdate @@ -37,25 +34,24 @@ namespace WaveHarmonic.Crest ( gameObject, ref s_CopyDepthBufferPassHDRP, - "Copy Depth Buffer", + UnderwaterRenderer.k_DrawVolume, CustomPassInjectionPoint.AfterOpaqueDepthAndNormal ); + var isBeforeTransparentPass = renderer.RenderBeforeTransparency; + CustomPassHelpers.CreateOrUpdate ( gameObject, ref s_Instance, - k_Name, - CustomPassInjectionPoint.BeforePostProcess + UnderwaterRenderer.k_DrawVolume, + GetInjectionPoint(isBeforeTransparentPass), + // Higher number (priority) means execute earlier. Volume executes first. + priority: 1 ); - s_Instance._GameObject = gameObject; - s_Renderer = renderer; s_UnderwaterEffectPass = new(renderer); - - RenderPipelineManager.beginCameraRendering -= s_Instance.OnBeginCameraRendering; - RenderPipelineManager.beginCameraRendering += s_Instance.OnBeginCameraRendering; } public static void Disable() @@ -68,9 +64,17 @@ namespace WaveHarmonic.Crest } } - void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + static CustomPassInjectionPoint GetInjectionPoint(bool isBeforeTransparentPass) + { + return isBeforeTransparentPass + ? CustomPassInjectionPoint.BeforeTransparent + : CustomPassInjectionPoint.BeforePostProcess; + } + + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) { s_CopyDepthBufferPassHDRP.enabled = s_Renderer.UseStencilBuffer; + s_Instance._Volume.injectionPoint = GetInjectionPoint(s_Renderer.RenderBeforeTransparency); } protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd) @@ -94,8 +98,6 @@ namespace WaveHarmonic.Crest protected override void Cleanup() { - RenderPipelineManager.beginCameraRendering -= s_Instance.OnBeginCameraRendering; - s_UnderwaterEffectPass?.Release(); } @@ -108,44 +110,15 @@ namespace WaveHarmonic.Crest return; } + // Allocate here in case user changes options and we skipped allocation in Setup. + s_UnderwaterEffectPass.Allocate(context.cameraColorBuffer.rt.graphicsFormat); + // Create a separate stencil buffer context by using a depth buffer copy if needed. var depthBuffer = s_Renderer.UseStencilBuffer ? s_CopyDepthBufferPassHDRP._DepthBufferCopy : context.cameraDepthBuffer; s_UnderwaterEffectPass.Execute(camera, context.cmd, context.cameraColorBuffer, depthBuffer, context.propertyBlock); - - // Renders transparent objects after the underwater effect. Using the correct - // shader, the above water portion of the object is rendered normally (in the - // transparent pass), and the below water portion is rendered here with underwater - // applied. - // See the following for reference: - // https://github.com/Unity-Technologies/Graphics/blob/master/Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/DrawRenderersCustomPass.cs - if (s_Renderer.EnableShaderAPI) - { - var renderConfig = HDUtils.GetRendererConfiguration - ( -#if UNITY_6000_0_OR_NEWER - context.hdCamera.frameSettings.IsEnabled(FrameSettingsField.AdaptiveProbeVolume), -#else - context.hdCamera.frameSettings.IsEnabled(FrameSettingsField.ProbeVolume), -#endif - context.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask) - ); - - var result = new RendererListDesc(s_ForwardShaderTags, context.cullingResults, context.hdCamera.camera) - { - rendererConfiguration = renderConfig, - renderQueueRange = GetRenderQueueRange(RenderQueueType.AllTransparent), - sortingCriteria = SortingCriteria.CommonTransparent, - excludeObjectMotionVectors = false, - layerMask = s_Renderer._TransparentObjectLayers, - }; - - context.cmd.EnableShaderKeyword(UnderwaterRenderer.k_KeywordUnderwaterObjects); - CoreUtils.DrawRendererList(context.renderContext, context.cmd, context.renderContext.CreateRendererList(result)); - context.cmd.DisableShaderKeyword(UnderwaterRenderer.k_KeywordUnderwaterObjects); - } } } @@ -166,13 +139,11 @@ namespace WaveHarmonic.Crest var buffer = context.cmd; - buffer.SetRenderTarget(BuiltinRenderTextureType.None, _DepthBufferCopy); - buffer.ClearRenderTarget(RTClearFlags.Depth, Color.black, 1, 0); - + // NOTE: previously we cleared the target depth first due to artifacts. buffer.CopyTexture(context.cameraDepthBuffer.rt, _DepthBufferCopy.rt); // Clear the stencil component just in case. - buffer.ClearRenderTarget(RTClearFlags.Stencil, Color.black, 1, 0); + CoreUtils.SetRenderTarget(buffer, BuiltinRenderTextureType.None, _DepthBufferCopy, ClearFlag.Stencil); } protected override void Cleanup() diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.RenderGraph.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.RenderGraph.cs index 1d664819a..209547f94 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.RenderGraph.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.RenderGraph.cs @@ -12,46 +12,16 @@ namespace WaveHarmonic.Crest { partial class UnderwaterEffectPassURP { - class PassData - { -#pragma warning disable IDE1006 // Naming Styles - public UniversalCameraData cameraData; - public RenderGraphHelper.Handle colorTargetHandle; - public RenderGraphHelper.Handle depthTargetHandle; -#pragma warning restore IDE1006 // Naming Styles - - public void Init(ContextContainer frameData, IUnsafeRenderGraphBuilder builder = null) - { - var resources = frameData.Get(); - cameraData = frameData.Get(); - - if (builder == null) - { -#pragma warning disable CS0618 // Type or member is obsolete - colorTargetHandle = cameraData.renderer.cameraColorTargetHandle; - depthTargetHandle = cameraData.renderer.cameraDepthTargetHandle; -#pragma warning restore CS0618 // Type or member is obsolete - } - else - { - colorTargetHandle = resources.activeColorTexture; - depthTargetHandle = resources.activeDepthTexture; - builder.UseTexture(colorTargetHandle, AccessFlags.ReadWrite); - builder.UseTexture(depthTargetHandle, AccessFlags.ReadWrite); - } - } - } - - readonly PassData _PassData = new(); + readonly RenderGraphHelper.PassData _PassData = new(); public override void RecordRenderGraph(RenderGraph graph, ContextContainer frame) { - using (var builder = graph.AddUnsafePass(k_Name, out var data)) + using (var builder = graph.AddUnsafePass(k_Name, out var data)) { data.Init(frame, builder); builder.AllowPassCulling(false); - builder.SetRenderFunc((data, context) => + builder.SetRenderFunc((data, context) => { var buffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd); OnSetup(buffer, data); @@ -76,60 +46,6 @@ namespace WaveHarmonic.Crest context.ExecuteCommandBuffer(buffer); CommandBufferPool.Release(buffer); } - - partial class RenderObjectsWithoutFogPass - { - class PassData - { -#pragma warning disable IDE1006 // Naming Styles - public UniversalCameraData cameraData; - public UniversalLightData lightData; - public UniversalRenderingData renderingData; - public CullingResults cullResults; -#pragma warning restore IDE1006 // Naming Styles - - public void Init(ContextContainer frameData, IUnsafeRenderGraphBuilder builder = null) - { - cameraData = frameData.Get(); - lightData = frameData.Get(); - renderingData = frameData.Get(); - cullResults = renderingData.cullResults; - } - } - - readonly PassData _PassData = new(); - - public override void RecordRenderGraph(RenderGraph graph, ContextContainer frame) - { - using (var builder = graph.AddUnsafePass(k_Name, out var data)) - { - data.Init(frame, builder); - builder.AllowPassCulling(false); - - builder.SetRenderFunc((data, context) => - { - var buffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd); - Execute(context.GetRenderContext(), buffer, data); - }); - } - } - - [System.Obsolete] - public override void OnCameraSetup(CommandBuffer buffer, ref RenderingData data) - { - _PassData.Init(data.GetFrameData()); - } - - [System.Obsolete] - public override void Execute(ScriptableRenderContext context, ref RenderingData data) - { - _PassData.Init(data.GetFrameData()); - var buffer = CommandBufferPool.Get(k_Name); - Execute(context, buffer, _PassData); - context.ExecuteCommandBuffer(buffer); - CommandBufferPool.Release(buffer); - } - } } partial class CopyDepthBufferPassURP @@ -150,11 +66,15 @@ namespace WaveHarmonic.Crest if (builder == null) { #pragma warning disable CS0618 // Type or member is obsolete + colorTargetHandle = cameraData.renderer.cameraColorTargetHandle; depthTargetHandle = cameraData.renderer.cameraDepthTargetHandle; #pragma warning restore CS0618 // Type or member is obsolete } else { + // We need reset render targets to these before the next pass, but we do not read + // or write to the color target. + colorTargetHandle = resources.activeColorTexture; depthTargetHandle = resources.activeDepthTexture; builder.UseTexture(depthTargetHandle, AccessFlags.ReadWrite); } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.cs index dd7a576de..c15d6c456 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterEffectPassURP.cs @@ -3,7 +3,6 @@ #if d_UnityURP -using System.Collections.Generic; using UnityEngine; using UnityEngine.Experimental.Rendering; using UnityEngine.Rendering; @@ -13,12 +12,11 @@ namespace WaveHarmonic.Crest { sealed partial class UnderwaterEffectPassURP : ScriptableRenderPass { - const string k_Name = "Crest Underwater Effect"; + const string k_Name = "Crest.DrawWater/Volume"; UnderwaterRenderer _Renderer; - static UnderwaterEffectPassURP s_Instance; - RenderObjectsWithoutFogPass _ApplyFogToTransparentObjects; + internal static UnderwaterEffectPassURP s_Instance; UnderwaterEffectPass _UnderwaterEffectPass; CopyDepthBufferPassURP _CopyDepthBufferPass; @@ -27,7 +25,6 @@ namespace WaveHarmonic.Crest public UnderwaterEffectPassURP() { - renderPassEvent = RenderPassEvent.AfterRenderingTransparents; ConfigureInput(ScriptableRenderPassInput.Color | ScriptableRenderPassInput.Depth); } @@ -38,18 +35,14 @@ namespace WaveHarmonic.Crest s_Instance = new(); s_Instance._Renderer = renderer; s_Instance._CopyDepthBufferPass = new(RenderPassEvent.AfterRenderingOpaques); - s_Instance._ApplyFogToTransparentObjects = new(); } - RenderPipelineManager.beginCameraRendering -= s_Instance.EnqueuePass; - RenderPipelineManager.beginCameraRendering += s_Instance.EnqueuePass; RenderPipelineManager.activeRenderPipelineTypeChanged -= Disable; RenderPipelineManager.activeRenderPipelineTypeChanged += Disable; } public static void Disable() { - if (s_Instance != null) RenderPipelineManager.beginCameraRendering -= s_Instance.EnqueuePass; RenderPipelineManager.activeRenderPipelineTypeChanged -= Disable; s_Instance?._UnderwaterEffectPass?.Release(); @@ -57,13 +50,15 @@ namespace WaveHarmonic.Crest s_Instance = null; } - void EnqueuePass(ScriptableRenderContext context, Camera camera) + internal void EnqueuePass(ScriptableRenderContext context, Camera camera) { if (!_Renderer.ShouldRender(camera, UnderwaterRenderer.Pass.Effect)) { return; } + s_Instance.renderPassEvent = _Renderer.RenderBeforeTransparency ? WaterRenderer.k_WaterRenderPassEvent : RenderPassEvent.AfterRenderingTransparents; + var renderer = camera.GetUniversalAdditionalCameraData().scriptableRenderer; #if UNITY_EDITOR @@ -80,25 +75,40 @@ namespace WaveHarmonic.Crest _UnderwaterEffectPass ??= new(_Renderer); renderer.EnqueuePass(s_Instance); - - if (_Renderer.EnableShaderAPI) - { - renderer.EnqueuePass(_ApplyFogToTransparentObjects); - } } #if UNITY_6000_0_OR_NEWER - void OnSetup(CommandBuffer buffer, PassData data) + bool _ErrorMissingColorTarget; + + void OnSetup(CommandBuffer buffer, RenderGraphHelper.PassData data) { _ColorBuffer = data.colorTargetHandle.Texture; _DepthBuffer = data.depthTargetHandle.Texture; + // Unity bug + if (_ColorBuffer?.rt == null) + { + if (!_ErrorMissingColorTarget) + { + Debug.LogError($"Crest: Your current URP setup has a Unity bug which prevents underwater from rendering on this camera ({data.cameraData.camera.name}). It is too complicated for us to advise which combination of settings are the issue (sorry), but they will be on either the URP asset or renderer file."); + _ErrorMissingColorTarget = true; + } + + return; + } + // TODO: renderingData.cameraData.cameraTargetDescriptor? _UnderwaterEffectPass.ReAllocate(_ColorBuffer.rt.descriptor); } - void Execute(ScriptableRenderContext context, CommandBuffer buffer, PassData data) + void Execute(ScriptableRenderContext context, CommandBuffer buffer, RenderGraphHelper.PassData data) { + // Unity bug + if (_ColorBuffer?.rt == null) + { + return; + } + if (_Renderer.UseStencilBuffer) { _DepthBuffer = _CopyDepthBufferPass._DepthBufferCopy; @@ -131,120 +141,13 @@ namespace WaveHarmonic.Crest CommandBufferPool.Release(buffer); } #endif - - // Renders transparent objects after the underwater effect. Using the correct - // shader, the above water portion of the object is rendered normally (in the - // transparent pass), and the below water portion is rendered here with underwater - // applied. - sealed partial class RenderObjectsWithoutFogPass : ScriptableRenderPass - { - FilteringSettings _FilteringSettings; - - static readonly List s_ShaderTagIdList = new() - { - new("SRPDefaultUnlit"), - new("UniversalForward"), - new("UniversalForwardOnly"), - new("LightweightForward"), - }; - - public RenderObjectsWithoutFogPass() - { - renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing; - _FilteringSettings = new(RenderQueueRange.transparent, 0); - } - -#if UNITY_6000_0_OR_NEWER - void Execute(ScriptableRenderContext context, CommandBuffer buffer, PassData renderingData) -#else - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) -#endif - { - _FilteringSettings.layerMask = s_Instance._Renderer._TransparentObjectLayers; - -#if !UNITY_6000_0_OR_NEWER - var buffer = CommandBufferPool.Get("Crest Underwater Objects"); -#endif - - // Disable Unity's fog keywords as there is no option to ignore fog for the Shader Graph. - if (RenderSettings.fog) - { - switch (RenderSettings.fogMode) - { - case FogMode.Exponential: - buffer.DisableShaderKeyword("FOG_EXP"); - break; - case FogMode.Linear: - buffer.DisableShaderKeyword("FOG_LINEAR"); - break; - case FogMode.ExponentialSquared: - buffer.DisableShaderKeyword("FOG_EXP2"); - break; - } - } - - buffer.EnableShaderKeyword(UnderwaterRenderer.k_KeywordUnderwaterObjects); - // If we want anything to apply to DrawRenderers, it has to be executed before: - // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.DrawRenderers.html - context.ExecuteCommandBuffer(buffer); - buffer.Clear(); - -#if UNITY_6000_0_OR_NEWER - var drawingSettings = RenderingUtils.CreateDrawingSettings - ( - s_ShaderTagIdList, - renderingData.renderingData, - renderingData.cameraData, - renderingData.lightData, - SortingCriteria.CommonTransparent - ); - - var parameters = new RendererListParams(renderingData.cullResults, drawingSettings, _FilteringSettings); - var list = context.CreateRendererList(ref parameters); - - buffer.DrawRendererList(list); -#else - var drawingSettings = CreateDrawingSettings - ( - s_ShaderTagIdList, - ref renderingData, - SortingCriteria.CommonTransparent - ); - - context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref _FilteringSettings); -#endif - - // Revert fog keywords. - if (RenderSettings.fog) - { - switch (RenderSettings.fogMode) - { - case FogMode.Exponential: - buffer.EnableShaderKeyword("FOG_EXP"); - break; - case FogMode.Linear: - buffer.EnableShaderKeyword("FOG_LINEAR"); - break; - case FogMode.ExponentialSquared: - buffer.EnableShaderKeyword("FOG_EXP2"); - break; - } - } - - buffer.DisableShaderKeyword(UnderwaterRenderer.k_KeywordUnderwaterObjects); - -#if !UNITY_6000_0_OR_NEWER - context.ExecuteCommandBuffer(buffer); - CommandBufferPool.Release(buffer); -#endif - } - } } // Copies the depth buffer to avoid conflicts when using the stencil buffer. sealed partial class CopyDepthBufferPassURP : ScriptableRenderPass { const string k_Name = "Crest Copy Depth Buffer"; + RTHandle _ColorBuffer; RTHandle _DepthBuffer; public RTHandle _DepthBufferCopy; @@ -264,9 +167,11 @@ namespace WaveHarmonic.Crest descriptor.bindMS = descriptor.msaaSamples > 1; #if UNITY_6000_0_OR_NEWER RenderingUtils.ReAllocateHandleIfNeeded(ref _DepthBufferCopy, descriptor, FilterMode.Point, name: "Crest Copied Depth Buffer"); + _ColorBuffer = data.colorTargetHandle; _DepthBuffer = data.depthTargetHandle; #else RenderingUtils.ReAllocateIfNeeded(ref _DepthBufferCopy, descriptor, FilterMode.Point, name: "Crest Copied Depth Buffer"); + _ColorBuffer = data.cameraData.renderer.cameraColorTargetHandle; _DepthBuffer = data.cameraData.renderer.cameraDepthTargetHandle; #endif } @@ -277,19 +182,26 @@ namespace WaveHarmonic.Crest public override void Execute(ScriptableRenderContext context, ref RenderingData data) #endif { + // Just in case. + if (_ColorBuffer == null || _DepthBuffer == null) + { + return; + } + #if !UNITY_6000_0_OR_NEWER var buffer = CommandBufferPool.Get(k_Name); #endif - // Must clear even though we are overwriting or there will be strange artifacts on new writes. - // This could be a Unity bug and may be worth reporting. - buffer.SetRenderTarget(BuiltinRenderTextureType.None, _DepthBufferCopy); - buffer.ClearRenderTarget(RTClearFlags.Depth, Color.black, 1, 0); - + // NOTE: previously we cleared the target depth first due to artifacts. buffer.CopyTexture(_DepthBuffer.rt, _DepthBufferCopy.rt); // Clear the stencil component just in case. - buffer.ClearRenderTarget(RTClearFlags.Stencil, Color.black, 1, 0); + // Previously we passed BuiltinRenderTextureType.None for color but this made the + // scene disappear in the scene view on DX11 only. + CoreUtils.SetRenderTarget(buffer, _ColorBuffer, _DepthBufferCopy, ClearFlag.Stencil); + + // Required for Unity 6+. + CoreUtils.SetRenderTarget(buffer, _ColorBuffer, _DepthBuffer); #if !UNITY_6000_0_OR_NEWER context.ExecuteCommandBuffer(buffer); diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPass.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPass.cs index 8b5f5c166..aa7e00f56 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPass.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPass.cs @@ -1,140 +1,2 @@ // Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. - -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Experimental.Rendering; - -namespace WaveHarmonic.Crest -{ - sealed class UnderwaterMaskPass - { - readonly UnderwaterRenderer _Renderer; -#if d_CrestPortals - readonly Portals.PortalRenderer _Portals; -#endif - - RTHandle _MaskTexture; - RTHandle _DepthTexture; - RenderTargetIdentifier _MaskTarget; - RenderTargetIdentifier _DepthTarget; - - public UnderwaterMaskPass(UnderwaterRenderer renderer) - { - _Renderer = renderer; -#if d_CrestPortals - _Portals = renderer._Portals; -#endif - } - - public void Allocate() - { - _MaskTexture = RTHandles.Alloc - ( - scaleFactor: Vector2.one, - slices: TextureXR.slices, - dimension: TextureXR.dimension, - depthBufferBits: DepthBits.None, - colorFormat: GraphicsFormat.R16_SFloat, - enableRandomWrite: true, - useDynamicScale: true, - name: "_Crest_WaterMask" - ); - - _MaskTarget = new(_MaskTexture, mipLevel: 0, CubemapFace.Unknown, depthSlice: -1); - - _DepthTexture = RTHandles.Alloc - ( - scaleFactor: Vector2.one, - slices: TextureXR.slices, - dimension: TextureXR.dimension, - depthBufferBits: UnderwaterRenderer.k_DepthBits, - colorFormat: GraphicsFormat.None, - enableRandomWrite: false, - useDynamicScale: true, - name: "_Crest_WaterMaskDepth" - ); - -#if d_CrestPortals - // For HDRP we cannot allocate in OnEnable as RTHandle will complain. - if (_Portals.Active) - { - _Portals.Allocate(); - } -#endif - - _DepthTarget = new(_DepthTexture, mipLevel: 0, CubemapFace.Unknown, depthSlice: -1); - - _Renderer.SetUpArtifactsShader(); - } - - // We should not have to reallocate, but URP will raise errors when an option like HDR is changed if we do not. - public void ReAllocate(RenderTextureDescriptor descriptor) - { - // Shared settings. Enabling MSAA might be a good idea except cannot enable random writes. Having a raster - // shader to remove artifacts is a workaround. - descriptor.bindMS = false; - descriptor.msaaSamples = 1; - - descriptor.graphicsFormat = GraphicsFormat.None; - - if (RenderPipelineCompatibilityHelper.ReAllocateIfNeeded(ref _DepthTexture, descriptor, name: "_Crest_WaterMaskDepth")) - { - _DepthTarget = new(_DepthTexture, mipLevel: 0, CubemapFace.Unknown, depthSlice: -1); - } - -#if d_CrestPortals - if (_Portals.Active) - { - _Portals.ReAllocate(descriptor); - } -#endif - - descriptor.graphicsFormat = GraphicsFormat.R16_SFloat; - descriptor.enableRandomWrite = true; - descriptor.depthBufferBits = 0; - - if (RenderPipelineCompatibilityHelper.ReAllocateIfNeeded(ref _MaskTexture, descriptor, name: "_Crest_WaterMask")) - { - _MaskTarget = new(_MaskTexture, mipLevel: 0, CubemapFace.Unknown, depthSlice: -1); - } - } - - public void Release() - { - _MaskTexture?.Release(); - _DepthTexture?.Release(); - -#if d_CrestPortals - if (_Portals.Active) - { - _Portals.Release(); - } -#endif - } - - public void Execute(Camera camera, CommandBuffer buffer) - { -#if d_CrestPortals - // Populate water volume before mask so we can use the stencil. - if (_Portals.Active) - { - _Portals.RenderMask(camera, buffer, _Renderer._MaskMaterial); - _Portals.RenderStencil(buffer, _DepthTexture); - } -#endif - - // For HDRP software dynamic scaling to work. - CoreUtils.SetRenderTarget(buffer, _MaskTexture, _DepthTexture); - Helpers.ScaleViewport(camera, buffer, _MaskTexture); - - _Renderer.SetUpMask(buffer, _MaskTarget, _DepthTarget); - _Renderer.PopulateMask(buffer, camera); - - var size = _MaskTexture.GetScaledSize(_MaskTexture.rtHandleProperties.currentViewportSize); - var descriptor = _MaskTexture.rt.descriptor; - descriptor.width = size.x; descriptor.height = size.y; - _Renderer.FixMaskArtefacts(buffer, descriptor, _MaskTarget); - } - } -} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassHDRP.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassHDRP.cs index fbe2b0235..aa7e00f56 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassHDRP.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassHDRP.cs @@ -1,78 +1,2 @@ // Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. - -#if d_UnityHDRP - -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.HighDefinition; - -namespace WaveHarmonic.Crest -{ - sealed class UnderwaterMaskPassHDRP : CustomPass - { - const string k_Name = "Underwater Mask"; - - static UnderwaterRenderer s_Renderer; - static UnderwaterMaskPass s_UnderwaterMaskPass; - static UnderwaterMaskPassHDRP s_Instance; - GameObject _GameObject; - - public static void Enable(UnderwaterRenderer renderer) - { - var gameObject = CustomPassHelpers.CreateOrUpdate - ( - parent: renderer._Water.Container.transform, - k_Name, - hide: !renderer._Water._Debug._ShowHiddenObjects - ); - - CustomPassHelpers.CreateOrUpdate - ( - gameObject, - ref s_Instance, - k_Name, - CustomPassInjectionPoint.BeforeRendering - ); - - s_Instance._GameObject = gameObject; - - s_Renderer = renderer; - s_UnderwaterMaskPass = new(renderer); - } - - public static void Disable() - { - // It should be safe to rely on this reference for this reference to fail. - if (s_Instance != null && s_Instance._GameObject != null) - { - // Will also trigger Cleanup below. - s_Instance._GameObject.SetActive(false); - } - } - - protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd) - { - s_UnderwaterMaskPass.Allocate(); - } - - protected override void Cleanup() - { - s_UnderwaterMaskPass?.Release(); - } - - protected override void Execute(CustomPassContext context) - { - var camera = context.hdCamera.camera; - - if (!s_Renderer.ShouldRender(camera, UnderwaterRenderer.Pass.Mask)) - { - return; - } - - s_UnderwaterMaskPass.Execute(camera, context.cmd); - } - } -} - -#endif // d_UnityHDRP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassURP.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassURP.cs index 36e5bc50f..aa7e00f56 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassURP.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterMaskPassURP.cs @@ -1,106 +1,2 @@ // Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. - -#if d_UnityURP - -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.Universal; - -namespace WaveHarmonic.Crest -{ - sealed partial class UnderwaterMaskPassURP : ScriptableRenderPass - { - const string k_Name = "Crest Underwater Mask"; - static UnderwaterMaskPassURP s_Instance; - UnderwaterRenderer _Renderer; - UnderwaterMaskPass _UnderwaterMaskPass; - - public UnderwaterMaskPassURP() - { - // Will always execute and matrices will be ready. - renderPassEvent = RenderPassEvent.BeforeRenderingPrePasses; - } - - public static void Enable(UnderwaterRenderer renderer) - { - s_Instance ??= new(); - s_Instance._Renderer = renderer; - - RenderPipelineManager.beginCameraRendering -= s_Instance.EnqueuePass; - RenderPipelineManager.beginCameraRendering += s_Instance.EnqueuePass; - RenderPipelineManager.activeRenderPipelineTypeChanged -= Disable; - RenderPipelineManager.activeRenderPipelineTypeChanged += Disable; - } - - public static void Disable() - { - if (s_Instance != null) RenderPipelineManager.beginCameraRendering -= s_Instance.EnqueuePass; - RenderPipelineManager.activeRenderPipelineTypeChanged -= Disable; - - s_Instance?._UnderwaterMaskPass?.Release(); - s_Instance = null; - } - - void EnqueuePass(ScriptableRenderContext context, Camera camera) - { - if (!_Renderer.ShouldRender(camera, UnderwaterRenderer.Pass.Mask)) - { - return; - } - - var renderer = camera.GetUniversalAdditionalCameraData().scriptableRenderer; - -#if UNITY_EDITOR - if (renderer == null) return; -#endif - - if (_UnderwaterMaskPass == null) - { - _UnderwaterMaskPass = new(_Renderer); - _UnderwaterMaskPass.Allocate(); - } - - // Enqueue the pass. This happens every frame. - renderer.EnqueuePass(this); - } - -#if UNITY_6000_0_OR_NEWER - class PassData - { - public UniversalCameraData _CameraData; - public UnderwaterMaskPass _UnderwaterMaskPass; - } - - public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, ContextContainer frame) - { - using (var builder = graph.AddUnsafePass(k_Name, out var data)) - { - builder.AllowPassCulling(false); - - data._CameraData = frame.Get(); - data._UnderwaterMaskPass = _UnderwaterMaskPass; - - builder.SetRenderFunc((data, context) => - { - var buffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd); - data._UnderwaterMaskPass.ReAllocate(data._CameraData.cameraTargetDescriptor); - data._UnderwaterMaskPass.Execute(data._CameraData.camera, buffer); - }); - } - } - - [System.Obsolete] -#endif - public override void Execute(ScriptableRenderContext context, ref RenderingData data) - { - var buffer = CommandBufferPool.Get(k_Name); - _UnderwaterMaskPass.ReAllocate(data.cameraData.cameraTargetDescriptor); - _UnderwaterMaskPass.Execute(data.cameraData.camera, buffer); - context.ExecuteCommandBuffer(buffer); - CommandBufferPool.Release(buffer); - } - } -} - -#endif // d_UnityURP diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Editor.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Editor.cs index 1e481dd74..441f99118 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Editor.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Editor.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if UNITY_EDITOR diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Effect.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Effect.cs index d6bb51123..eb704d8fd 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Effect.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Effect.cs @@ -9,16 +9,16 @@ namespace WaveHarmonic.Crest { partial class UnderwaterRenderer { - const string k_KeywordFullScreenEffect = "_FULL_SCREEN_EFFECT"; + internal const string k_ShaderNameEffect = "Crest/Underwater"; + internal const string k_DrawVolume = "Crest.DrawWater/Volume"; const string k_KeywordDebugVisualizeMask = "_DEBUG_VISUALIZE_MASK"; const string k_KeywordDebugVisualizeStencil = "_DEBUG_VISUALIZE_STENCIL"; - internal const string k_KeywordUnderwaterObjects = "CREST_UNDERWATER_OBJECTS_PASS"; + internal const string k_SampleSphericalHarmonicsMarker = "Crest.UnderwaterRenderer.SampleSphericalHarmonics"; + + static readonly Unity.Profiling.ProfilerMarker s_SampleSphericalHarmonicsMarker = new(k_SampleSphericalHarmonicsMarker); static partial class ShaderIDs { - // Local - public static readonly int s_HorizonNormal = Shader.PropertyToID("_Crest_HorizonNormal"); - // Global public static readonly int s_CameraColorTexture = Shader.PropertyToID("_Crest_CameraColorTexture"); public static readonly int s_WaterVolumeStencil = Shader.PropertyToID("_Crest_WaterVolumeStencil"); @@ -26,9 +26,10 @@ namespace WaveHarmonic.Crest public static readonly int s_ExtinctionMultiplier = Shader.PropertyToID("_Crest_ExtinctionMultiplier"); public static readonly int s_UnderwaterEnvironmentalLightingWeight = Shader.PropertyToID("_Crest_UnderwaterEnvironmentalLightingWeight"); - // Built-ins - public static readonly int s_WorldSpaceLightPos0 = Shader.PropertyToID("_WorldSpaceLightPos0"); - public static readonly int s_LightColor0 = Shader.PropertyToID("_LightColor0"); + public static readonly int s_OutScatteringFactor = Shader.PropertyToID("_Crest_OutScatteringFactor"); + public static readonly int s_OutScatteringExtinctionFactor = Shader.PropertyToID("_Crest_OutScatteringExtinctionFactor"); + public static readonly int s_SunBoost = Shader.PropertyToID("_Crest_SunBoost"); + public static readonly int s_DataSliceOffset = Shader.PropertyToID("_Crest_DataSliceOffset"); } @@ -43,6 +44,7 @@ namespace WaveHarmonic.Crest Material _CurrentWaterMaterial; readonly UnderwaterSphericalHarmonicsData _SphericalHarmonicsData = new(); System.Action _CopyColor; + System.Action _SetRenderTargetToBackBuffers; RenderTargetIdentifier _ColorTarget = new ( @@ -66,12 +68,20 @@ namespace WaveHarmonic.Crest -1 ); + // Requested the temporary color texture. + internal bool _NeedsColorTexture; + sealed class UnderwaterSphericalHarmonicsData { internal Color[] _AmbientLighting = new Color[1]; internal Vector3[] _DirectionsSH = { new(0.0f, 0.0f, 0.0f) }; } + void SetRenderTargetToBackBuffers(CommandBuffer commands) + { + commands.SetRenderTarget(_ColorTarget); + } + void CopyColorTexture(CommandBuffer buffer) { // Use blit instead of CopyTexture as it will smooth out issues with format @@ -92,38 +102,28 @@ namespace WaveHarmonic.Crest { _EffectCommandBuffer ??= new() { - name = "Underwater Pass", + name = k_DrawVolume, }; _CopyColor ??= new(CopyColorTexture); + _SetRenderTargetToBackBuffers ??= new(SetRenderTargetToBackBuffers); } void OnPreRenderUnderwaterEffect(Camera camera) { -#if UNITY_EDITOR - // Do not use this to prevent the mask from rendering due to portals and volumes feature. - if (!IsFogEnabledForEditorCamera(camera)) - { - _EffectCommandBuffer?.Clear(); - return; - } -#endif - - var descriptor = XRHelpers.GetRenderTextureDescriptor(camera); + var descriptor = Rendering.BIRP.GetCameraTargetDescriptor(camera, _Water.FrameBufferFormatOverride); descriptor.useDynamicScale = camera.allowDynamicResolution; - // Format must be correct for CopyTexture to work. Hopefully this is good enough. - if (camera.allowHDR && QualitySettings.activeColorSpace == ColorSpace.Linear) - { - descriptor.graphicsFormat = SystemInfo.GetGraphicsFormat(_Water.LikelyFrameBufferFormat); - } - - UpdateEffectMaterial(camera, _FirstRender); + UpdateEffectMaterial(camera); _EffectCommandBuffer.Clear(); - // No need to clear as Blit will overwrite everything. - _EffectCommandBuffer.GetTemporaryRT(ShaderIDs.s_CameraColorTexture, descriptor); + if (!RenderBeforeTransparency || _NeedsColorTexture) + { + // No need to clear as Blit will overwrite everything. + _EffectCommandBuffer.GetTemporaryRT(ShaderIDs.s_CameraColorTexture, descriptor); + _EffectCommandBuffer.SetGlobalTexture(ShaderIDs.s_CameraColorTexture, _ColorCopyTarget); + } var sun = RenderSettings.sun; if (sun != null) @@ -131,15 +131,16 @@ namespace WaveHarmonic.Crest // Unity does not set up lighting for us so we will get the last value which could incorrect. // SetGlobalColor is just an alias for SetGlobalVector (no color space conversion like Material.SetColor): // https://docs.unity3d.com/2017.4/Documentation/ScriptReference/Shader.SetGlobalColor.html - _EffectCommandBuffer.SetGlobalVector(ShaderIDs.s_LightColor0, sun.FinalColor()); - _EffectCommandBuffer.SetGlobalVector(ShaderIDs.s_WorldSpaceLightPos0, -sun.transform.forward); + _EffectCommandBuffer.SetGlobalVector(Crest.ShaderIDs.Unity.s_LightColor0, sun.FinalColor()); + _EffectCommandBuffer.SetGlobalVector(Crest.ShaderIDs.Unity.s_WorldSpaceLightPos0, -sun.transform.forward); + _EffectCommandBuffer.SetShaderKeyword("DIRECTIONAL_COOKIE", sun.cookie != null); } // Create a separate stencil buffer context by copying the depth texture. if (UseStencilBuffer) { descriptor.colorFormat = RenderTextureFormat.Depth; - descriptor.depthBufferBits = (int)k_DepthBits; + descriptor.depthBufferBits = (int)Helpers.k_DepthBits; // bindMS is necessary in this case for depth. descriptor.SetMSAASamples(camera); descriptor.bindMS = descriptor.msaaSamples > 1; @@ -152,150 +153,128 @@ namespace WaveHarmonic.Crest if (Helpers.IsMSAAEnabled(camera)) { // Blit with a depth write shader to populate the depth buffer. - Helpers.Blit(_EffectCommandBuffer, _DepthStencilTarget, Helpers.UtilityMaterial, (int)Helpers.UtilityPass.CopyDepth); + Helpers.Blit(_EffectCommandBuffer, _DepthStencilTarget, Rendering.BIRP.UtilityMaterial, (int)Rendering.BIRP.UtilityPass.CopyDepth); } else { - // Copy depth then clear stencil. + // Copy depth texture. Since this is not depth buffer, no need to clear stencil. + // SRPs copy the depth buffer, because they can. _EffectCommandBuffer.CopyTexture(BuiltinRenderTextureType.Depth, _DepthStencilTarget); - Helpers.Blit(_EffectCommandBuffer, _DepthStencilTarget, Helpers.UtilityMaterial, (int)Helpers.UtilityPass.ClearStencil); + CoreUtils.SetRenderTarget(_EffectCommandBuffer, _DepthStencilTarget); + } + + if (RenderBeforeTransparency) + { + _EffectCommandBuffer.SetRenderTarget(BuiltinRenderTextureType.CameraTarget, _DepthStencilTarget); } } - CopyColorTexture(_EffectCommandBuffer); + if (!RenderBeforeTransparency) + { + CopyColorTexture(_EffectCommandBuffer); + } - _EffectCommandBuffer.SetGlobalTexture(ShaderIDs.s_CameraColorTexture, _ColorCopyTarget); + ExecuteEffect(camera, _EffectCommandBuffer, _CopyColor, _SetRenderTargetToBackBuffers); - ExecuteEffect(camera, _EffectCommandBuffer, _CopyColor); + if (!RenderBeforeTransparency || _NeedsColorTexture) + { + _EffectCommandBuffer.ReleaseTemporaryRT(ShaderIDs.s_CameraColorTexture); + } - _EffectCommandBuffer.ReleaseTemporaryRT(ShaderIDs.s_CameraColorTexture); if (UseStencilBuffer) { _EffectCommandBuffer.ReleaseTemporaryRT(ShaderIDs.s_WaterVolumeStencil); } } - internal void ExecuteEffect(Camera camera, CommandBuffer buffer, System.Action copyColor, MaterialPropertyBlock properties = null) + internal void ExecuteEffect(Camera camera, CommandBuffer buffer, System.Action copyColor, System.Action resetRenderTargets, MaterialPropertyBlock properties = null) { - if (camera.cameraType == CameraType.Reflection) - { - buffer.DrawProcedural - ( - Matrix4x4.identity, - _VolumeMaterial, - shaderPass: (int)EffectPass.Reflections, - MeshTopology.Triangles, - vertexCount: 3, - instanceCount: 1, - properties - ); - } + var isFullScreenRequired = true; + #if d_CrestPortals - else if (_Portals.Active && _Portals.Mode != Portals.PortalMode.Tunnel) + if (_Portals.Active) { - _Portals.RenderEffect(camera, buffer, _VolumeMaterial, copyColor, properties); + isFullScreenRequired = _Portals.RenderEffect(camera, buffer, _VolumeMaterial, copyColor, resetRenderTargets, properties); } #endif - else + + if (!isFullScreenRequired) { - buffer.DrawProcedural - ( - Matrix4x4.identity, - _VolumeMaterial, - shaderPass: (int)EffectPass.FullScreen, - MeshTopology.Triangles, - vertexCount: 3, - instanceCount: 1, - properties - ); + return; } + + buffer.DrawProcedural + ( + Matrix4x4.identity, + _VolumeMaterial, + shaderPass: (int)(camera.cameraType == CameraType.Reflection ? EffectPass.Reflections : EffectPass.FullScreen), + MeshTopology.Triangles, + vertexCount: 3, + instanceCount: 1, + properties + ); } - internal static void UpdateGlobals(Material waterMaterial) + internal static void UpdateGlobals(Material source) { // We will have the wrong color values if we do not use linear: // https://forum.unity.com/threads/fragment-shader-output-colour-has-incorrect-values-when-hardcoded.377657/ // _CrestAbsorption is already set as global in Water Renderer. - Shader.SetGlobalColor(WaterRenderer.ShaderIDs.s_Scattering, waterMaterial.GetColor(WaterRenderer.ShaderIDs.s_Scattering).MaybeLinear()); - Shader.SetGlobalFloat(WaterRenderer.ShaderIDs.s_Anisotropy, waterMaterial.GetFloat(WaterRenderer.ShaderIDs.s_Anisotropy)); + Shader.SetGlobalColor(WaterRenderer.ShaderIDs.s_Scattering, source.GetColor(WaterRenderer.ShaderIDs.s_Scattering).MaybeLinear()); + Shader.SetGlobalFloat(WaterRenderer.ShaderIDs.s_Anisotropy, source.GetFloat(WaterRenderer.ShaderIDs.s_Anisotropy)); + Shader.SetGlobalFloat(WaterRenderer.ShaderIDs.s_AmbientTerm, source.GetFloat(WaterRenderer.ShaderIDs.s_AmbientTerm)); + Shader.SetGlobalFloat(WaterRenderer.ShaderIDs.s_DirectTerm, source.GetFloat(WaterRenderer.ShaderIDs.s_DirectTerm)); + Shader.SetGlobalFloat(WaterRenderer.ShaderIDs.s_ShadowsAffectsAmbientFactor, source.GetFloat(WaterRenderer.ShaderIDs.s_ShadowsAffectsAmbientFactor)); + + Shader.SetGlobalFloat(ShaderIDs.s_ExtinctionMultiplier, source.GetFloat(ShaderIDs.s_ExtinctionMultiplier)); + Shader.SetGlobalFloat(ShaderIDs.s_OutScatteringFactor, source.GetFloat(ShaderIDs.s_OutScatteringFactor)); + Shader.SetGlobalFloat(ShaderIDs.s_OutScatteringExtinctionFactor, source.GetFloat(ShaderIDs.s_OutScatteringExtinctionFactor)); + Shader.SetGlobalFloat(ShaderIDs.s_SunBoost, source.GetFloat(ShaderIDs.s_SunBoost)); + Shader.SetGlobalInteger(ShaderIDs.s_DataSliceOffset, source.GetInteger(ShaderIDs.s_DataSliceOffset)); } - internal void UpdateEffectMaterial(Camera camera, bool isFirstRender) + internal void UpdateEffectMaterial(Camera camera) { // Copy water material parameters to underwater material. + // WBs can change the material per camera, so disable optimization. + if (_MaterialLastUpdatedFrame < Time.frameCount || WaterBody.WaterBodies.Count > 0) { - var material = _SurfaceMaterial; - - if (_CopyWaterMaterialParametersEachFrame || isFirstRender || material != _CurrentWaterMaterial) + if (_CopyWaterMaterialParametersEachFrame || _SurfaceMaterial != _CurrentWaterMaterial) { - _CurrentWaterMaterial = material; + _CurrentWaterMaterial = _SurfaceMaterial; - if (material != null) + if (_SurfaceMaterial != null) { - _VolumeMaterial.CopyMatchingPropertiesFromMaterial(material); + _VolumeMaterial.CopyMatchingPropertiesFromMaterial(_SurfaceMaterial); - if (_EnableShaderAPI) + AfterCopyMaterial?.Invoke(_Water, _VolumeMaterial); + + // Make volume properties available to surface and meniscus. + if (RenderBeforeTransparency) { - UpdateGlobals(material); + UpdateGlobals(_VolumeMaterial); } } } + + // Enabling/disabling keywords each frame don't seem to have large measurable overhead + _VolumeMaterial.SetKeyword(k_KeywordDebugVisualizeMask, _Debug._VisualizeMask); + _VolumeMaterial.SetKeyword(k_KeywordDebugVisualizeStencil, _Debug._VisualizeStencil); + + // We use this for caustics to get the displacement. + _VolumeMaterial.SetInteger(Lod.ShaderIDs.s_LodIndex, 0); + + _MaterialLastUpdatedFrame = Time.frameCount; } - // Enabling/disabling keywords each frame don't seem to have large measurable overhead - _VolumeMaterial.SetKeyword(k_KeywordDebugVisualizeMask, _Debug._VisualizeMask); - _VolumeMaterial.SetKeyword(k_KeywordDebugVisualizeStencil, _Debug._VisualizeStencil); - - // We use this for caustics to get the displacement. - _VolumeMaterial.SetInteger(Lod.ShaderIDs.s_LodIndex, 0); - - if (!Portaled && camera.cameraType != CameraType.Reflection) + // Not applicable to reflection pass. + if (camera.cameraType != CameraType.Reflection) { - var seaLevel = _Water.SeaLevel; - - // We don't both setting the horizon value if we know we are going to be having to apply the effect - // full-screen anyway. - var forceFullShader = _Water.ViewerHeightAboveWater < -2f; - if (!forceFullShader) - { - var maxWaterVerticalDisplacement = _Water.MaximumVerticalDisplacement * 0.5f; - var cameraYPosition = camera.transform.position.y; - float nearPlaneFrustumWorldHeight; - { - var current = camera.ViewportToWorldPoint(new(0f, 0f, camera.nearClipPlane)).y; - float maxY = current, minY = current; - - current = camera.ViewportToWorldPoint(new(0f, 1f, camera.nearClipPlane)).y; - maxY = Mathf.Max(maxY, current); - minY = Mathf.Min(minY, current); - - current = camera.ViewportToWorldPoint(new(1f, 0f, camera.nearClipPlane)).y; - maxY = Mathf.Max(maxY, current); - minY = Mathf.Min(minY, current); - - current = camera.ViewportToWorldPoint(new(1f, 1f, camera.nearClipPlane)).y; - maxY = Mathf.Max(maxY, current); - minY = Mathf.Min(minY, current); - - nearPlaneFrustumWorldHeight = maxY - minY; - } - - forceFullShader = (cameraYPosition + nearPlaneFrustumWorldHeight + maxWaterVerticalDisplacement) <= seaLevel; - } - - _VolumeMaterial.SetKeyword(k_KeywordFullScreenEffect, forceFullShader); - } - - // Project water normal onto camera plane. - { - var projectedNormal = new Vector2 - ( - Vector3.Dot(Vector3.up, camera.transform.right), - Vector3.Dot(Vector3.up, camera.transform.up) - ); - - _VolumeMaterial.SetVector(ShaderIDs.s_HorizonNormal, projectedNormal); + // Skip work if camera is far enough below the surface. + var forceFullShader = !_Water.Surface.Enabled || (_Water._ViewerHeightAboveWaterPerCamera < -8f && !Portaled); + _VolumeMaterial.SetKeyword("d_Crest_NoMaskColor", forceFullShader); + _VolumeMaterial.SetKeyword("d_Crest_NoMaskDepth", !_Water.Surface.Enabled || RenderBeforeTransparency); } // Compute ambient lighting SH. @@ -304,11 +283,11 @@ namespace WaveHarmonic.Crest // at different position, as this would then thrash it and negate the priming functionality. We could create a dummy invis GO // with a dummy Renderer which might be enough, but this is hacky enough that we'll wait for it to become a problem // rather than add a pre-emptive hack. - UnityEngine.Profiling.Profiler.BeginSample("Crest: Underwater Sample Spherical Harmonics"); + s_SampleSphericalHarmonicsMarker.Begin(_Water); LightProbes.GetInterpolatedProbe(camera.transform.position, null, out var sphericalHarmonicsL2); sphericalHarmonicsL2.Evaluate(_SphericalHarmonicsData._DirectionsSH, _SphericalHarmonicsData._AmbientLighting); - Helpers.SetShaderVector(_VolumeMaterial, ShaderIDs.s_AmbientLighting, _SphericalHarmonicsData._AmbientLighting[0], _EnableShaderAPI); - UnityEngine.Profiling.Profiler.EndSample(); + Helpers.SetShaderVector(_VolumeMaterial, ShaderIDs.s_AmbientLighting, _SphericalHarmonicsData._AmbientLighting[0], RenderBeforeTransparency); + s_SampleSphericalHarmonicsMarker.End(); } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.EnvironmentalLighting.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.EnvironmentalLighting.cs index 69ae078e7..7795641eb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.EnvironmentalLighting.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.EnvironmentalLighting.cs @@ -58,6 +58,14 @@ namespace WaveHarmonic.Crest return; } +#if UNITY_EDITOR + // Only repaint, otherwise changes might persist. + if (Event.current.type != EventType.Repaint) + { + return; + } +#endif + // Restore lighting settings. if (_EnvironmentalLight != null) _EnvironmentalLight.intensity = _EnvironmentalLightIntensity; _EnvironmentalLight = null; @@ -77,7 +85,15 @@ namespace WaveHarmonic.Crest return; } - if (!_Water.Material.HasColor(WaterRenderer.ShaderIDs.s_AbsorptionColor)) +#if UNITY_EDITOR + // Only repaint, otherwise changes might persist. + if (Event.current.type != EventType.Repaint) + { + return; + } +#endif + + if (!_Water.Surface.Material.HasColor(WaterRenderer.ShaderIDs.s_AbsorptionColor)) { return; } @@ -94,7 +110,13 @@ namespace WaveHarmonic.Crest var density = extinction; _EnvironmentalAverageDensity = (density.x + density.y + density.z) / 3f; - var multiplier = Mathf.Exp(_EnvironmentalAverageDensity * Mathf.Min(height * k_DepthOutScattering, 0f) * _EnvironmentalLightingWeight); + var outScatteringFactor = 1f; + if (_VolumeMaterial.HasFloat(ShaderIDs.s_OutScatteringFactor)) + { + outScatteringFactor = _VolumeMaterial.GetFloat(ShaderIDs.s_OutScatteringFactor); + } + + var multiplier = Mathf.Exp(_EnvironmentalAverageDensity * Mathf.Min(height * k_DepthOutScattering * outScatteringFactor, 0f) * _EnvironmentalLightingWeight); // Darken environmental lighting when viewer underwater. if (_EnvironmentalLight != null) diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Legacy.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Legacy.cs index ddcd252b2..ab2ac04e4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Legacy.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Legacy.cs @@ -8,94 +8,49 @@ namespace WaveHarmonic.Crest { partial class UnderwaterRenderer { - bool _HasMaskCommandBuffersBeenRegistered; bool _HasEffectCommandBuffersBeenRegistered; void OnEnableLegacy() { - SetupMask(); - OnEnableMask(); SetupUnderwaterEffect(); - // Handle this internally rather than relying on Water Renderer. - Camera.onPreRender -= OnBeforeLegacyRender; - Camera.onPreRender += OnBeforeLegacyRender; - Camera.onPostRender -= OnAfterLegacyRender; - Camera.onPostRender += OnAfterLegacyRender; RenderPipelineManager.activeRenderPipelineTypeChanged -= OnDisableLegacy; RenderPipelineManager.activeRenderPipelineTypeChanged += OnDisableLegacy; } void OnDisableLegacy() { - Camera.onPreRender -= OnBeforeLegacyRender; - Camera.onPostRender -= OnAfterLegacyRender; RenderPipelineManager.activeRenderPipelineTypeChanged -= OnDisableLegacy; - - OnDisableMask(); - } - - internal void LateUpdate() - { - if (!Active) - { - return; - } - - if (!RenderPipelineHelper.IsLegacy) - { - return; - } - - Helpers.SetGlobalKeyword("CREST_UNDERWATER_BEFORE_TRANSPARENT", _EnableShaderAPI); } + // Listening to OnPreCull. Camera must have underwater layer. void OnBeforeLegacyRender(Camera camera) { - XRHelpers.Update(camera); - XRHelpers.SetInverseViewProjectionMatrix(camera); - - if (ShouldRender(camera, Pass.Mask)) - { - // It could be either one event. - camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _MaskCommandBuffer); - camera.AddCommandBuffer(CameraEvent.BeforeDepthTexture, _MaskCommandBuffer); - OnPreRenderMask(camera); - _HasMaskCommandBuffersBeenRegistered = true; - } - if (ShouldRender(camera, Pass.Effect)) { - var @event = _EnableShaderAPI ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha; + _Water.UpdateMatrices(camera); + + _Water.OnBeginCameraOpaqueTexture(camera); + + var @event = RenderBeforeTransparency ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha; camera.AddCommandBuffer(@event, _EffectCommandBuffer); OnPreRenderUnderwaterEffect(camera); _HasEffectCommandBuffersBeenRegistered = true; } - - _FirstRender = false; } void OnAfterLegacyRender(Camera camera) { - if (_HasMaskCommandBuffersBeenRegistered) - { - // It could be either one event. - camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, _MaskCommandBuffer); - camera.RemoveCommandBuffer(CameraEvent.BeforeDepthTexture, _MaskCommandBuffer); - _MaskCommandBuffer?.Clear(); - } - if (_HasEffectCommandBuffersBeenRegistered) { - var @event = _EnableShaderAPI ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha; + var @event = RenderBeforeTransparency ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha; camera.RemoveCommandBuffer(@event, _EffectCommandBuffer); _EffectCommandBuffer?.Clear(); } - _HasMaskCommandBuffersBeenRegistered = false; - _HasEffectCommandBuffersBeenRegistered = false; + _Water.OnEndCameraOpaqueTexture(camera); - OnAfterCameraRender(camera); + _HasEffectCommandBuffersBeenRegistered = false; } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Mask.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Mask.cs index da197c38f..088fcf0d4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Mask.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.Mask.cs @@ -2,34 +2,21 @@ // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; -using UnityEngine.Experimental.Rendering; using UnityEngine.Rendering; -using WaveHarmonic.Crest.Internal; namespace WaveHarmonic.Crest { - partial class UnderwaterRenderer + partial class UnderwaterRenderer : MaskRenderer.IMaskReceiver, MaskRenderer.IMaskProvider { - // Adapted from: - // Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderer.cs -#if UNITY_SWITCH || UNITY_ANDROID || UNITY_EMBEDDED_LINUX || UNITY_QNX - internal const GraphicsFormat k_DepthStencilFormat = GraphicsFormat.D24_UNorm_S8_UInt; - internal const int k_DepthBufferBits = 24; - internal const DepthBits k_DepthBits = DepthBits.Depth24; -#else - internal const GraphicsFormat k_DepthStencilFormat = GraphicsFormat.D32_SFloat_S8_UInt; - internal const int k_DepthBufferBits = 32; - internal const DepthBits k_DepthBits = DepthBits.Depth32; -#endif + internal const string k_DrawMask = "Crest.DrawMask"; + const string k_DrawMaskHorizon = "Horizon"; + const string k_DrawMaskSurface = "Surface"; + + internal const int k_VolumeMaskQueue = 1000; internal const int k_ShaderPassWaterSurfaceMask = 0; internal const int k_ShaderPassWaterSurfaceDepth = 1; - internal const int k_ShaderPassWaterHorizonMask = 2; - - // NOTE: Must match CREST_MASK_BELOW_SURFACE in Constants.hlsl. - const float k_MaskBelowSurface = -1f; - // NOTE: Must match CREST_MASK_BELOW_SURFACE_CULLED in Constants.hlsl. - const float k_MaskBelowSurfaceCull = -2f; + internal const int k_ShaderPassWaterHorizonMask = 0; internal const string k_ComputeShaderKernelFillMaskArtefacts = "FillMaskArtefacts"; @@ -37,25 +24,10 @@ namespace WaveHarmonic.Crest { // Local public static readonly int s_FarPlaneOffset = Shader.PropertyToID("_Crest_FarPlaneOffset"); - public static readonly int s_MaskBelowSurface = Shader.PropertyToID("_Crest_MaskBelowSurface"); - - // Global - public static readonly int s_WaterMaskTexture = Shader.PropertyToID("_Crest_WaterMaskTexture"); - public static readonly int s_WaterMaskDepthTexture = Shader.PropertyToID("_Crest_WaterMaskDepthTexture"); - - public static readonly int s_StencilRef = Shader.PropertyToID("_StencilRef"); } internal Material _MaskMaterial; - - internal RenderTargetIdentifier _MaskTarget; - internal RenderTargetIdentifier _DepthTarget; - - internal readonly Plane[] _CameraFrustumPlanes = new Plane[6]; - CommandBuffer _MaskCommandBuffer; - - internal RenderTexture _MaskRT; - RenderTexture _DepthRT; + internal Material _HorizonMaskMaterial; ComputeShader _ArtifactsShader; bool _ArtifactsShaderInitialized; @@ -63,30 +35,19 @@ namespace WaveHarmonic.Crest uint _ArtifactsThreadGroupSizeX; uint _ArtifactsThreadGroupSizeY; - void SetupMask() - { - _MaskCommandBuffer ??= new() - { - name = "Crest: Underwater Mask", - }; - } - internal void OnEnableMask() { - // Create a reference to handle the RT. The RT properties will be replaced with a descriptor before the - // native object is created, and since it is lazy it is near zero cost. - Helpers.CreateRenderTargetTextureReference(ref _MaskRT, ref _MaskTarget); - _MaskRT.name = "_Crest_WaterMaskTexture"; - Helpers.CreateRenderTargetTextureReference(ref _DepthRT, ref _DepthTarget); - _DepthRT.name = "_Crest_WaterMaskDepthTexture"; + _Water._Mask.Add(this); + _Water._Mask.Add(k_VolumeMaskQueue, this); SetUpArtifactsShader(); } internal void OnDisableMask() { - if (_MaskRT != null) _MaskRT.Release(); - if (_DepthRT != null) _DepthRT.Release(); + if (_Water == null) return; + _Water._Mask?.Remove(this as MaskRenderer.IMaskReceiver); + _Water._Mask?.Remove(this as MaskRenderer.IMaskProvider); } internal void SetUpArtifactsShader() @@ -108,70 +69,69 @@ namespace WaveHarmonic.Crest _ArtifactsShaderInitialized = true; } - internal void SetUpMaskTextures(RenderTextureDescriptor descriptor) + void MaskRenderer.IMaskProvider.OnMaskPass(CommandBuffer commands, Camera camera, MaskRenderer mask) { - if (!Helpers.RenderTargetTextureNeedsUpdating(_MaskRT, descriptor)) + var color = mask.ColorRTH; + var depth = mask.DepthRTH; + + var size = color.GetScaledSize(color.rtHandleProperties.currentViewportSize); + var descriptor = color.rt.descriptor; + descriptor.width = size.x; descriptor.height = size.y; + + if (UseLegacyMask) + { + // Portals changes the target. + // When using the stencil we are already clearing depth and do not want to clear the stencil too. Clear + // color only when using the stencil as the horizon effectively clears it when not using it. + CoreUtils.SetRenderTarget(commands, color, depth, UseStencilBuffer ? ClearFlag.Color : ClearFlag.DepthStencil); + Helpers.ScaleViewport(camera, commands, color); + + PopulateMask(commands, camera); + FixMaskArtefacts(commands, descriptor, mask._ColorRTI); + } + // Portals have their own fitted to the portal bounds. + else +#if d_CrestPortals + if (!Portaled || _Water.Portals.RequiresFullScreenMask) +#endif + { + RenderLineMask(commands, camera, mask.ColorRT.descriptor, mask._ColorRTI); + } + } + + internal void RenderLineMask(CommandBuffer buffer, Camera camera, RenderTextureDescriptor descriptor, RenderTargetIdentifier target) + { + if (!_Water.Surface.Enabled) { return; } - // This will disable MSAA for our textures as MSAA will break sampling later on. This looks safe to do as - // Unity's CopyDepthPass does the same, but a possible better way or supporting MSAA is worth looking into. - descriptor.msaaSamples = 1; - - // @Memory: We could investigate making this an 8-bit texture instead to reduce GPU memory usage. - // @Memory: We could potentially try a half resolution mask as the mensicus could mask resolution issues. - // Intel iGPU for Metal and DirectX both had issues with R16. 2021.11.18 - descriptor.colorFormat = Helpers.IsIntelGPU() ? RenderTextureFormat.RFloat : RenderTextureFormat.RHalf; - descriptor.depthBufferBits = 0; - descriptor.enableRandomWrite = true; - - _MaskRT.Release(); - _MaskRT.descriptor = descriptor; - - descriptor.colorFormat = RenderTextureFormat.Depth; - descriptor.depthBufferBits = (int)k_DepthBits; - descriptor.enableRandomWrite = false; - - _DepthRT.Release(); - _DepthRT.descriptor = descriptor; - } - - void OnPreRenderMask(Camera camera) - { - _MaskCommandBuffer.Clear(); - - var descriptor = XRHelpers.GetRenderTextureDescriptor(camera); - - descriptor.useDynamicScale = camera.allowDynamicResolution; - - // Keywords and other things. - SetUpMaskTextures(descriptor); + var keep = false; #if d_CrestPortals - // Populate water volume before mask so we can use the stencil. - if (_Portals.Active) + if (_Water.Portals.Active) { - _Portals.ReAllocate(descriptor); - _Portals.RenderMask(camera, _MaskCommandBuffer, _MaskMaterial); - _Portals.RenderStencil(_MaskCommandBuffer, _DepthRT, _DepthTarget); + keep = _Water.Portals.RenderLineMask(buffer, target); } #endif - _MaskCommandBuffer.SetRenderTarget(_MaskTarget, _DepthTarget); - SetUpMask(_MaskCommandBuffer, _MaskTarget, _DepthTarget); - PopulateMask(_MaskCommandBuffer, camera); + var wrapper = new PropertyWrapperCompute(buffer, WaterResources.Instance.Compute._Mask, (int)RenderPipelineHelper.RenderPipeline); - FixMaskArtefacts(_MaskCommandBuffer, descriptor, _MaskTarget); - } + var parameters = _Water.Surface._SurfaceDataParameters; - internal void SetUpMask(CommandBuffer buffer, RenderTargetIdentifier maskTarget, RenderTargetIdentifier depthTarget) - { - // When using the stencil we are already clearing depth and do not want to clear the stencil too. Clear - // color only when using the stencil as the horizon effectively clears it when not using it. - buffer.ClearRenderTarget(!UseStencilBuffer, UseStencilBuffer, Color.black); - buffer.SetGlobalTexture(ShaderIDs.s_WaterMaskTexture, maskTarget); - buffer.SetGlobalTexture(ShaderIDs.s_WaterMaskDepthTexture, depthTarget); + wrapper.SetTexture(SurfaceRenderer.ShaderIDs.s_WaterLine, _Water.Surface.HeightRT); + wrapper.SetVector(SurfaceRenderer.ShaderIDs.s_WaterLineSnappedPosition, parameters._SnappedPosition); + wrapper.SetVector(SurfaceRenderer.ShaderIDs.s_WaterLineResolution, parameters._Resolution); + wrapper.SetFloat(SurfaceRenderer.ShaderIDs.s_WaterLineTexel, parameters._Texel); + + // Only write if not written (ie zero). + wrapper.SetKeyword(new(WaterResources.Instance.Compute._Mask, "d_KeepValue"), keep); + + // Setting this sets unity_CameraToWorld. + wrapper.SetMatrix(Crest.ShaderIDs.Unity.s_CameraToWorld, camera.cameraToWorldMatrix); + + // Viewport sizes are not perfect so round up to cover. + wrapper.Dispatch(Mathf.CeilToInt(descriptor.width / 8f), Mathf.CeilToInt(descriptor.height / 8f), descriptor.volumeDepth); } internal void FixMaskArtefacts(CommandBuffer buffer, RenderTextureDescriptor descriptor, RenderTargetIdentifier target) @@ -181,9 +141,16 @@ namespace WaveHarmonic.Crest return; } - buffer.SetComputeTextureParam(_ArtifactsShader, _ArtifactsKernel, ShaderIDs.s_WaterMaskTexture, target); - // XR SPI will have a volume depth of two. If using RTHandles, then set manually as will be two for all cameras. - _ArtifactsShader.SetKeyword("STEREO_INSTANCING_ON", descriptor.dimension == TextureDimension.Tex2DArray); + if (!_Water.Surface.Enabled && Portaled) + { + return; + } + + // This will not be set automatically unless we use they RP variant approach + // similar to Mask.compute. + _ArtifactsShader.SetKeyword(new LocalKeyword(_ArtifactsShader, "STEREO_INSTANCING_ON"), descriptor.dimension == TextureDimension.Tex2DArray); + + buffer.SetComputeTextureParam(_ArtifactsShader, _ArtifactsKernel, MaskRenderer.ShaderIDs.s_WaterMaskTexture, target); buffer.DispatchCompute ( @@ -200,54 +167,55 @@ namespace WaveHarmonic.Crest // be able to avoid this pass completely if we can reuse the camera depth after transparents are rendered. internal void PopulateMask(CommandBuffer commandBuffer, Camera camera) { + if (!_Water.Surface.Enabled && Portaled) + { + return; + } + // Render horizon into mask using a fullscreen triangle at the far plane. Horizon must be rendered first or // it will overwrite the mask with incorrect values. { var zBufferParameters = Helpers.GetZBufferParameters(camera); // Take 0-1 linear depth and convert non-linear depth. - _MaskMaterial.SetFloat(ShaderIDs.s_FarPlaneOffset, Helpers.LinearDepthToNonLinear(_FarPlaneMultiplier, zBufferParameters)); + _HorizonMaskMaterial.SetFloat(ShaderIDs.s_FarPlaneOffset, Helpers.LinearDepthToNonLinear(_FarPlaneMultiplier, zBufferParameters)); // Render fullscreen triangle with horizon mask pass. - commandBuffer.DrawProcedural(Matrix4x4.identity, _MaskMaterial, shaderPass: k_ShaderPassWaterHorizonMask, MeshTopology.Triangles, 3, 1); + commandBuffer.BeginSample(k_DrawMaskHorizon); + commandBuffer.DrawProcedural(Matrix4x4.identity, _HorizonMaskMaterial, shaderPass: k_ShaderPassWaterHorizonMask, MeshTopology.Triangles, 3, 1); + commandBuffer.EndSample(k_DrawMaskHorizon); } - GeometryUtility.CalculateFrustumPlanes(camera, _CameraFrustumPlanes); - // Get all water chunks and render them using cmd buffer, but with mask shader. if (!_Debug._DisableMask) { - // Spends approx 0.2-0.3ms here on 2018 Dell XPS 15. - foreach (var chunk in _Water.Chunks) - { - var renderer = chunk.Rend; - // Can happen in edit mode. - if (renderer == null) continue; - var bounds = renderer.bounds; - if (GeometryUtility.TestPlanesAABB(_CameraFrustumPlanes, bounds)) - { - if ((!chunk._WaterDataHasBeenBound) && chunk.enabled) - { - chunk.Bind(camera); - } - - // Handle culled tiles for when underwater is rendered before the transparent pass. - chunk._MaterialPropertyBlock.SetFloat(ShaderIDs.s_MaskBelowSurface, !_EnableShaderAPI || renderer.enabled ? k_MaskBelowSurface : k_MaskBelowSurfaceCull); - renderer.SetPropertyBlock(chunk._MaterialPropertyBlock); - - commandBuffer.DrawRenderer(renderer, _MaskMaterial, submeshIndex: 0, shaderPass: k_ShaderPassWaterSurfaceMask); - - chunk._Visible = true; - } - chunk._WaterDataHasBeenBound = false; - } - -#if d_CrestPortals - if (_Portals.Active) - { - _Portals.PopulateMask(commandBuffer, _MaskMaterial); - } -#endif // d_CrestPortals + commandBuffer.BeginSample(k_DrawMaskSurface); + _Water.Surface.Render(camera, commandBuffer, _MaskMaterial, k_ShaderPassWaterSurfaceMask); + commandBuffer.EndSample(k_DrawMaskSurface); } } + + internal bool _MaskRead; + bool _DoneMaskRead; + + MaskRenderer.MaskInput MaskRenderer.IMaskProvider.Allocate() + { + return MaskRenderer.MaskInput.Both; + } + + MaskRenderer.MaskInput MaskRenderer.IMaskReceiver.Allocate() + { + return MaskRenderer.MaskInput.Both; + } + + MaskRenderer.MaskInput MaskRenderer.IMaskProvider.Write(Camera camera) + { + if (!_DoneMaskRead) + { + _MaskRead = ShouldRender(camera, Pass.Mask); + _DoneMaskRead = true; + } + + return _MaskRead ? _Water.Surface.Enabled ? MaskRenderer.MaskInput.Both : MaskRenderer.MaskInput.Color : MaskRenderer.MaskInput.None; + } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.cs index 6e6996e85..461a03eab 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Volume/UnderwaterRenderer.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; @@ -28,6 +28,8 @@ namespace WaveHarmonic.Crest [@DecoratedField, SerializeField] internal bool _Enabled = true; + // This is mainly for reflection probes (HDRP planar specifically). It gives + // developers the option to make a TIR probe which should not render the surface. [Tooltip("Any camera or probe with this layer in its culling mask will render underwater.")] [@Layer] [@GenerateAPI] @@ -35,8 +37,8 @@ namespace WaveHarmonic.Crest int _Layer = 4; // Water [Tooltip("The underwater material. The water surface material is copied into this material.")] - [@AttachMaterialEditor] - [@MaterialField("Crest/Underwater", name: "Underwater", title: "Create Underwater Material")] + [@AttachMaterialEditor(order: 2)] + [@MaterialField(k_ShaderNameEffect, name: "Underwater", title: "Create Underwater Material")] [@GenerateAPI] [SerializeField] internal Material _Material; @@ -68,21 +70,6 @@ namespace WaveHarmonic.Crest #endif - [@Heading("Shader API")] - - [Tooltip("Renders the underwater effect before the transparent pass (instead of after).\n\nSo one can apply the underwater fog themselves to transparent objects. Cannot be changed at runtime.")] - [@DecoratedField, SerializeField] - [HideInInspector] - bool _EnableShaderAPI = false; - internal bool EnableShaderAPI { get => _EnableShaderAPI; set => _EnableShaderAPI = value; } - - [@Predicated(nameof(_EnableShaderAPI))] - [@Predicated(RenderPipeline.Legacy, inverted: true, hide: true)] - [@DecoratedField, SerializeField] - [HideInInspector] - internal LayerMask _TransparentObjectLayers; - - [@Heading("Advanced")] [Tooltip("Whether to execute for all cameras.\n\nIf disabled, then additionally ignore any camera that is not the view camera or our reflection camera. It will require managing culling masks of all cameras.")] @@ -134,18 +121,33 @@ namespace WaveHarmonic.Crest internal bool _OnlyReflectionCameras; } + /// + /// Raised after copying the water material properties to the underwater material. + /// + public static System.Action AfterCopyMaterial { get; set; } + + // Always render before surface, unless legacy mode which always renders after transparency. +#if d_Crest_LegacyUnderwater + internal bool UseLegacyMask => true; + internal bool RenderBeforeTransparency => false; +#else + // Legacy mask works except for negative volumes. Not officially supported. + internal bool UseLegacyMask => _AllCameras; + internal bool RenderBeforeTransparency => true; +#endif + internal WaterRenderer _Water; #if d_CrestPortals // BUG: NonSerialized as Unity shows a serialization depth warning even though field is internal. [System.NonSerialized] internal Portals.PortalRenderer _Portals; - bool Portaled => _Portals.Active; + internal bool Portaled => _Portals.Active; #else bool Portaled => false; #endif - bool _FirstRender = true; + int _MaterialLastUpdatedFrame = -1; internal bool UseStencilBuffer { get; set; } @@ -168,9 +170,6 @@ namespace WaveHarmonic.Crest // Empty. } - // Disable underwater effect if height enough above surface. - internal bool Active => _Enabled && _Material != null && _ViewerWaterHeight < 2f || Portaled || _Debug._DisableHeightAboveWaterOptimization; - internal void OnEnable() { _VolumeMaterial = _Material; @@ -180,22 +179,27 @@ namespace WaveHarmonic.Crest _MaskMaterial = new(WaterResources.Instance.Shaders._UnderwaterMask); } + if (_HorizonMaskMaterial == null) + { + _HorizonMaskMaterial = new(WaterResources.Instance.Shaders._HorizonMask); + } + if (_ArtifactsShader == null) { _ArtifactsShader = WaterResources.Instance.Compute._UnderwaterArtifacts; } + OnEnableMask(); + if (RenderPipelineHelper.IsUniversal) { #if d_UnityURP - UnderwaterMaskPassURP.Enable(this); UnderwaterEffectPassURP.Enable(this); #endif } else if (RenderPipelineHelper.IsHighDefinition) { #if d_UnityHDRP - UnderwaterMaskPassHDRP.Enable(this); UnderwaterEffectPassHDRP.Enable(this); #endif } @@ -223,13 +227,13 @@ namespace WaveHarmonic.Crest { RenderPipelineManager.activeRenderPipelineTypeChanged -= OnActiveRenderPipelineTypeChanged; + OnDisableMask(); + #if d_UnityURP - UnderwaterMaskPassURP.Disable(); UnderwaterEffectPassURP.Disable(); #endif #if d_UnityHDRP - UnderwaterMaskPassHDRP.Disable(); UnderwaterEffectPassHDRP.Disable(); #endif @@ -243,27 +247,36 @@ namespace WaveHarmonic.Crest internal void OnDestroy() { Helpers.Destroy(_MaskMaterial); + Helpers.Destroy(_HorizonMaskMaterial); + // Without will cause exception in editor in play mode if disable Write Motion Vectors. + _MaskMaterial = null; + _HorizonMaskMaterial = null; } internal bool ShouldRender(Camera camera, Pass pass) { + if (!_Enabled || _Material == null) + { + return false; + } + if (_Water == null) { return false; } - if (!Helpers.MaskIncludesLayer(camera.cullingMask, _Layer)) + if (!WaterRenderer.ShouldRender(camera, _Layer)) + { + return false; + } + + // Skip entire mask pass if possible. + if (pass == Pass.Mask && !_Water.Surface.Enabled) { return false; } #if UNITY_EDITOR - // Do not execute when editor is not active to conserve power and prevent possible leaks. - if (!UnityEditorInternal.InternalEditorUtility.isApplicationActive) - { - return false; - } - if (GL.wireframe) { return false; @@ -275,16 +288,6 @@ namespace WaveHarmonic.Crest { return false; } - - if (_Water.IsProxyPlaneRendering) - { - return false; - } - - if (camera.cameraType == CameraType.Preview) - { - return false; - } #endif var isReflectionCamera = camera.cameraType == CameraType.Reflection; @@ -304,14 +307,20 @@ namespace WaveHarmonic.Crest // Otherwise, filtering depends on the camera's culling mask which is not always // accessible like with the global "Reflection Probes Camera". But whether those // cameras triggering camera events is a bug is TBD as it is intermittent. - if (!_AllCameras && camera != _Water.Viewer && camera.cameraType != CameraType.SceneView && camera != WaterReflections.CurrentCamera) + if (!_AllCameras && camera != _Water.GetViewer(includeSceneCamera: false) && camera.cameraType != CameraType.SceneView && camera != WaterReflections.CurrentCamera) { return false; } - if (pass != Pass.Culling && !Active) + if (!_Debug._DisableHeightAboveWaterOptimization && !Portaled) { - return false; + _Water.UpdatePerCameraHeight(camera); + _ViewerWaterHeight = _Water._ViewerHeightAboveWaterPerCamera; + + if (_ViewerWaterHeight > 2f) + { + return false; + } } return true; @@ -319,7 +328,7 @@ namespace WaveHarmonic.Crest void RevertCulling() { - foreach (var tile in _Water.Chunks) + foreach (var tile in _Water.Surface.Chunks) { if (tile.Rend == null || tile._Culled) { @@ -330,27 +339,65 @@ namespace WaveHarmonic.Crest } } - internal void OnBeforeCameraRender(Camera camera) + // Called by WaterRenderer. Camera must have water layer. + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + { + OnBeginCameraRendering(camera); + +#if UNITY_EDITOR + // Populated by this point. + if (_VolumeMaterial.shader != WaterResources.Instance.Shaders._UnderwaterEffect) + { + return; + } +#endif + +#if d_UnityURP + if (RenderPipelineHelper.IsUniversal) + { + UnderwaterEffectPassURP.s_Instance?.EnqueuePass(context, camera); + } + else +#endif + +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + UnderwaterEffectPassHDRP.s_Instance?.OnBeginCameraRendering(context, camera); + } + else +#endif + + { + OnBeforeLegacyRender(camera); + } + } + + internal void OnBeginCameraRendering(Camera camera) { if (!ShouldRender(camera, Pass.Culling)) { return; } - var viewpoint = camera.transform.position; - _SamplingHeightHelper.SampleHeight(System.HashCode.Combine(GetHashCode(), camera.GetHashCode()), viewpoint, out var height, allowMultipleCallsPerFrame: true); - _ViewerWaterHeight = viewpoint.y - height; - - // ShouldRender has a special case for this pass which skips the Active check so we - // can always continue sampling. - if (!Active) + // Only one camera supported due to LOD center dependency. + if (!UseLegacyMask && ShouldRender(camera, Pass.Mask) && camera == _Water.Viewer) { - return; + _Water.Surface.UpdateDisplacedSurfaceData(camera); } - _SurfaceMaterial = _Water.AboveOrBelowSurfaceMaterial; +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + _Water.UpdateHighDefinitionLighting(camera); + } +#endif + + _SurfaceMaterial = _Water.Surface.AboveOrBelowSurfaceMaterial; _VolumeMaterial = _Material; + var viewpoint = camera.transform.position; + // Grab material from a water body if camera is within its XZ bounds. foreach (var body in WaterBody.WaterBodies) { @@ -373,6 +420,13 @@ namespace WaveHarmonic.Crest } } +#if UNITY_EDITOR + if (_VolumeMaterial.shader != WaterResources.Instance.Shaders._UnderwaterEffect) + { + return; + } +#endif + var extinction = Vector3.zero; float minimumFogDensity = 0; @@ -405,7 +459,12 @@ namespace WaveHarmonic.Crest minimumFogDensity = Mathf.Max(minimumFogDensity, 0.0001f); } - UpdateEnvironmentalLighting(camera, extinction, _ViewerWaterHeight); + if (_EnvironmentalInitialized) + { + _Water.UpdatePerCameraHeight(camera); + _ViewerWaterHeight = _Water._ViewerHeightAboveWaterPerCamera; + UpdateEnvironmentalLighting(camera, extinction, _ViewerWaterHeight); + } if (Portaled || _ViewerWaterHeight > -5f) { @@ -415,7 +474,7 @@ namespace WaveHarmonic.Crest var extinctionLength = -Mathf.Log(_CullLimit) / minimumFogDensity; - foreach (var tile in _Water.Chunks) + foreach (var tile in _Water.Surface.Chunks) { if (tile.Rend == null || tile._Culled) { @@ -436,10 +495,16 @@ namespace WaveHarmonic.Crest } } - internal void OnAfterCameraRender(Camera camera) + internal void OnEndCameraRendering(Camera camera) { RestoreEnvironmentalLighting(); RevertCulling(); + _DoneMaskRead = false; + + if (RenderPipelineHelper.IsLegacy) + { + OnAfterLegacyRender(camera); + } } void SetEnabled(bool previous, bool current) diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Editor.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Editor.cs index 4c09e47b9..60350b53f 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Editor.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Editor.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if UNITY_EDITOR @@ -16,9 +16,11 @@ namespace WaveHarmonic.Crest { internal const string k_ProxyShader = "Hidden/Crest/Editor/WaterProxy"; internal GameObject _ProxyPlane; - internal bool IsProxyPlaneRendering => !Application.isPlaying && _ShowWaterProxyPlane; + private protected override bool CanRunInEditMode => !_ShowWaterProxyPlane; - internal static float LastUpdateEditorTime { get; set; } = -1f; + + internal static float EditorTime { get; set; } + internal static float EditorDeltaTime { get; set; } static int s_EditorFrames = 0; // Useful for rate limiting processes called outside of RunUpdate like camera events. @@ -34,6 +36,9 @@ namespace WaveHarmonic.Crest { _Underwater._Material = AssetDatabase.LoadAssetAtPath("Packages/com.waveharmonic.crest/Runtime/Materials/Water Volume.mat"); + _Surface.Reset(); + Meniscus.Reset(); + base.Reset(); } @@ -66,12 +71,13 @@ namespace WaveHarmonic.Crest if (!Application.isPlaying) { - if (EditorApplication.timeSinceStartup - LastUpdateEditorTime > 1f / Mathf.Clamp(Instance._EditModeFrameRate, 0.01f, 60f)) + if ((Time.time - EditorTime) >= (1f / Mathf.Clamp(Instance._EditModeFrameRate, 0.01f, 120f))) { s_EditorFrames++; s_EditorFramesSinceUpdate = 0; - LastUpdateEditorTime = (float)EditorApplication.timeSinceStartup; + EditorDeltaTime = Time.time - EditorTime; + EditorTime = Time.time; Instance.RunUpdate(); } @@ -90,6 +96,28 @@ namespace WaveHarmonic.Crest { AfterScriptReload(); } + + [@OnChange] + void OnChange(string path, object previous) + { + switch (path) + { + case nameof(_ExtentsSizeMultiplier): + case nameof(_GeometryDownSampleFactor): + Surface._Rebuild = true; + break; + case nameof(_ShowWaterProxyPlane): + SetShowProxyPlane((bool)previous, _ShowWaterProxyPlane); + break; + } + } + + void SetShowProxyPlane(bool previous, bool current) + { + if (previous == current) return; + if (!isActiveAndEnabled || Application.isPlaying) return; + if (!(runInEditMode = !_ShowWaterProxyPlane)) OnDisable(); + } } partial class WaterRenderer diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs new file mode 100644 index 000000000..bfe9c4b95 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs @@ -0,0 +1,306 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#if d_UnityHDRP + +using System.Reflection; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.HighDefinition; +using WaveHarmonic.Crest.Internal; + +namespace WaveHarmonic.Crest +{ + // High Definition Render Pipeline + partial class WaterRenderer + { + internal static partial class ShaderIDs + { + // High Definition Render Pipeline + public static readonly int s_PrimaryLightDirection = Shader.PropertyToID("g_Crest_PrimaryLightDirection"); + public static readonly int s_PrimaryLightIntensity = Shader.PropertyToID("g_Crest_PrimaryLightIntensity"); + } + + internal static bool s_CameraMSAA; + + bool _DoneHighDefinitionLighting; + + void OnBeginContextRendering(ScriptableRenderContext context, System.Collections.Generic.List cameras) + { + s_CameraMSAA = false; + } + + // This use to be in OnBeginContextRendering with comment: "Most compatible with + // lighting options if computed here". Cannot remember what that meant. + internal void UpdateHighDefinitionLighting(Camera camera) + { + if (_DoneHighDefinitionLighting) + { + return; + } + + var lightDirection = Vector3.zero; + var lightIntensity = Color.black; + var sun = PrimaryLight; + + if (sun != null && sun.isActiveAndEnabled && sun.TryGetComponent(out var data)) + { + lightDirection = -sun.transform.forward; + lightIntensity = Color.clear; + + // It was reported that Light.intensity causes flickering when updated with + // HDAdditionalLightData.SetIntensity, unless we get intensity from there. + { + // Adapted from Helpers.FinalColor. + var light = data; + var linear = GraphicsSettings.lightsUseLinearIntensity; + var color = linear ? light.color.linear : light.color; +#if UNITY_6000_0_OR_NEWER + color *= sun.intensity; +#else + color *= light.intensity; +#endif + if (linear && light.useColorTemperature) color *= Mathf.CorrelatedColorTemperatureToRGB(sun.colorTemperature); + if (!linear) color = color.MaybeLinear(); + lightIntensity = linear ? color.MaybeGamma() : color; + } + + // Transmittance is for Physically Based Sky. + var hdCamera = HDCamera.GetOrCreate(camera); + var settings = SkyManager.GetSkySetting(hdCamera.volumeStack); + var transmittance = settings != null + ? settings.EvaluateAtmosphericAttenuation(lightDirection, hdCamera.camera.transform.position) + : Vector3.one; + + lightIntensity *= transmittance.x; + lightIntensity *= transmittance.y; + lightIntensity *= transmittance.z; + } + + Shader.SetGlobalVector(ShaderIDs.s_PrimaryLightDirection, lightDirection); + Shader.SetGlobalVector(ShaderIDs.s_PrimaryLightIntensity, lightIntensity); + + _DoneHighDefinitionLighting = true; + } + } + + sealed class CrestInternalCopyToTextureCustomPass : CustomPass + { + const string k_Name = "Update Pyramids"; + + static CrestInternalCopyToTextureCustomPass s_Instance; + + WaterRenderer _Water; + + // Wraps depth pyramid, so we can use Blitter. + RTHandle _DepthPyramid; + + RenderTexture _DepthTexture; + RenderTexture _DepthTextureDynamic; + + public static void Enable(WaterRenderer renderer) + { + var gameObject = CustomPassHelpers.CreateOrUpdate + ( + parent: renderer.Container.transform, + k_Name, + hide: !renderer._Debug._ShowHiddenObjects + ); + + CustomPassHelpers.CreateOrUpdate + ( + gameObject, + ref s_Instance, + WaterRenderer.k_DrawWater, + renderer.RenderBeforeTransparency + ? CustomPassInjectionPoint.BeforeTransparent + : CustomPassInjectionPoint.BeforePostProcess, + priority: -1 + ); + + s_Instance._Water = renderer; + + RenderPipelineManager.beginCameraRendering -= s_Instance.OnBeginCameraRendering; + RenderPipelineManager.beginCameraRendering += s_Instance.OnBeginCameraRendering; + RenderPipelineManager.endCameraRendering -= s_Instance.OnEndCameraRendering; + RenderPipelineManager.endCameraRendering += s_Instance.OnEndCameraRendering; + } + + public static void Disable() + { + if (s_Instance != null) + { + RenderPipelineManager.beginCameraRendering -= s_Instance.OnBeginCameraRendering; + RenderPipelineManager.endCameraRendering -= s_Instance.OnEndCameraRendering; + } + + // It should be safe to rely on this reference for this reference to fail. + if (s_Instance != null && s_Instance._GameObject != null) + { + // Will also trigger Cleanup below. + s_Instance._GameObject.SetActive(false); + } + } + + void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) + { + s_Instance._Volume.injectionPoint = _Water.RenderBeforeTransparency + ? CustomPassInjectionPoint.BeforeTransparent + : CustomPassInjectionPoint.BeforePostProcess; + } + + void OnEndCameraRendering(ScriptableRenderContext context, Camera camera) + { + if (this == null) return; + + if (!WaterRenderer.ShouldRender(camera, _Water.Surface.Layer)) + { + return; + } + + // TODO: Work out conditions where depth copy is needed when rendering during transparency. + if (!_Water.RenderBeforeTransparency) + { + return; + } + + var rt = Shader.GetGlobalTexture(Shader.PropertyToID("_CameraDepthTexture")) as RenderTexture; + var hdCamera = HDCamera.GetOrCreate(camera); + + if (hdCamera.allowDynamicResolution && hdCamera.canDoDynamicResolution) + { + _DepthTextureDynamic = rt; + } + else + { + _DepthTexture = rt; + } + } + + protected override void Cleanup() + { + base.Cleanup(); + // Unset internal RT to avoid release it. + _DepthPyramid?.SetRenderTexture(null); + _DepthPyramid?.Release(); + } + + MipGenerator MipGenerator => +#if UNITY_6000_OR_NEWER + (RenderPipelineManager.currentPipeline as HDRenderPipeline).m_MipGenerator +#else + s_MipGenerator.GetValue(RenderPipelineManager.currentPipeline) as MipGenerator; + static readonly FieldInfo s_MipGenerator = typeof(HDRenderPipeline).GetField("m_MipGenerator", BindingFlags.NonPublic | BindingFlags.Instance); +#endif + + static readonly MethodInfo s_UseScaling = typeof(RTHandle).GetProperty("useScaling", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).SetMethod; + static readonly object[] s_UseScalingParameters = { true }; + + static void UseScaling(RTHandle rt) + { + s_UseScaling.Invoke(rt, s_UseScalingParameters); + } + + protected override void Execute(CustomPassContext context) + { + // We cannot override _ColorPyramidTexture or _CameraDepthTexture with our own + // texture, so we write to these textures instead. Getting these textures has + // been tricky. Getting _ColorPyramidTexture with Shader.GetGlobalTexture does + // not always work, as it is replaced with the distortion color pyramid before + // we can grab it. + + var hdCamera = context.hdCamera; + var camera = hdCamera.camera; + var buffer = context.cmd; + + if (!WaterRenderer.ShouldRender(camera, _Water.Surface.Layer)) + { + return; + } + + if (_Water.Surface.Material == null) + { + return; + } + + if (!SurfaceRenderer.IsTransparent(_Water.Surface.Material)) + { + return; + } + + // Our reflections do not need them. + if (camera == WaterReflections.CurrentCamera) + { + return; + } + + if (context.hdCamera.msaaEnabled) + { + WaterRenderer.s_CameraMSAA = true; + return; + } + + if (!_Water.RenderBeforeTransparency && hdCamera.frameSettings.IsEnabled(FrameSettingsField.Distortion)) + { + return; + } + + if (_Water.WriteToColorTexture) + { + var colorTexture = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.ColorBufferMipChain); + + if (colorTexture != null) + { + buffer.BeginSample(WaterRenderer.k_DrawCopyColor); + + var pyramidSize = new Vector2Int(hdCamera.actualWidth, hdCamera.actualHeight); + Blitter.BlitCameraTexture(buffer, context.cameraColorBuffer, colorTexture); + MipGenerator.RenderColorGaussianPyramid(buffer, pyramidSize, context.cameraColorBuffer, colorTexture); + + buffer.EndSample(WaterRenderer.k_DrawCopyColor); + } + } + + // TODO: Work out conditions where depth copy is needed when rendering during transparency. + if (!_Water.RenderBeforeTransparency) + { + return; + } + + if (_Water.WriteToDepthTexture) + { + // Texture is not set yet, so we need to store it at the end of rendering. + // Textures may be different depending on configuration. + var depthTexture = hdCamera.allowDynamicResolution && hdCamera.canDoDynamicResolution ? _DepthTextureDynamic : _DepthTexture; + + if (depthTexture != null) + { + buffer.BeginSample(WaterRenderer.k_DrawCopyDepth); + + // Set up wrapper, so we can use Blitter. + _DepthPyramid ??= RTHandles.Alloc(depthTexture); + _DepthPyramid.SetRenderTexture(depthTexture); + UseScaling(_DepthPyramid); + + // Blit to the bottom of the depth atlas. + Blitter.BlitCameraTexture(buffer, context.cameraDepthBuffer, _DepthPyramid, new Rect(0, 0, hdCamera.actualWidth, hdCamera.actualHeight)); + + // Regenerate the depth pyramid. + MipGenerator.RenderMinDepthPyramid + ( + buffer, + depthTexture, + hdCamera.depthBufferMipChainInfo +#if !UNITY_6000_0_OR_NEWER + , mip1AlreadyComputed: false +#endif + ); + + buffer.EndSample(WaterRenderer.k_DrawCopyDepth); + } + } + } + } +} + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs.meta new file mode 100644 index 000000000..1e095ea14 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.HighDefinition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b5f4ec80b27f479aa559923ae6ca939 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Legacy.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Legacy.cs index e457711c4..5bf33e026 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Legacy.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Legacy.cs @@ -1,161 +1,94 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; using UnityEngine.Rendering; -using UnityEngine.Experimental.Rendering; namespace WaveHarmonic.Crest { // Built-in Render Pipeline partial class WaterRenderer { + internal const string k_DrawWater = "Crest.DrawWater"; + internal const string k_DrawCopyColor = "CopyColor"; + internal const string k_DrawCopyDepth = "CopyDepth"; + partial class ShaderIDs { - public static readonly int s_CameraOpaqueTexture = Shader.PropertyToID("_CameraOpaqueTexture"); - public static readonly int s_ShadowMapTexture = Shader.PropertyToID("_ShadowMapTexture"); public static readonly int s_ScreenSpaceShadowTexture = Shader.PropertyToID("_Crest_ScreenSpaceShadowTexture"); + public static readonly int s_TemporaryDepthTexture = Shader.PropertyToID("_Crest_TemporaryDepthTexture"); + public static readonly int s_PrimaryLightHasCookie = Shader.PropertyToID("g_Crest_PrimaryLightHasCookie"); + + public static class Unity + { + public static readonly int s_CameraOpaqueTexture = Shader.PropertyToID("_CameraOpaqueTexture"); + } } - CommandBuffer _CopyColorTextureBuffer; - RenderTexture _CameraColorTexture; + bool _DoneMatrices; CommandBuffer _ScreenSpaceShadowMapBuffer; - CommandBuffer _DeferredShadowMapBuffer; + CommandBuffer _UpdateColorDepthTexturesBuffer; - internal DefaultFormat LikelyFrameBufferFormat + internal Rendering.BIRP.FrameBufferFormatOverride FrameBufferFormatOverride => + !_OverrideRenderHDR + ? Rendering.BIRP.FrameBufferFormatOverride.None + : _RenderHDR + ? Rendering.BIRP.FrameBufferFormatOverride.HDR + : Rendering.BIRP.FrameBufferFormatOverride.LDR; + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + static void InitializeOnLoad() { - get - { - if (_OverrideRenderHDR) - { - return _RenderHDR ? DefaultFormat.HDR : DefaultFormat.LDR; - } - -#if UNITY_EDITOR - var target = UnityEditor.EditorUserBuildSettings.activeBuildTarget; - if (target is UnityEditor.BuildTarget.Android or UnityEditor.BuildTarget.iOS or UnityEditor.BuildTarget.tvOS) - { - return DefaultFormat.LDR; - } -#endif - -#if UNITY_ANDROID || UNITY_IOS || UNITY_TVOS - return DefaultFormat.LDR; -#else - return DefaultFormat.HDR; -#endif - } + // Fixes error on first frame. + Shader.SetGlobalTexture(Crest.ShaderIDs.Unity.s_ShadowMapTexture, Texture2D.whiteTexture); } - void OnPreRenderCamera(Camera camera) + internal void UpdateMatrices(Camera camera) { -#if UNITY_EDITOR - UpdateLastActiveSceneCamera(camera); - - if (!Application.isPlaying) - { - OnPreRenderWaterLevelDepthTexture(camera); - } -#endif - - OnBeginCameraRendering(camera); - - if (!Helpers.MaskIncludesLayer(camera.cullingMask, Layer)) + if (_DoneMatrices) { return; } - XRHelpers.Update(camera); - XRHelpers.SetInverseViewProjectionMatrix(camera); + Rendering.BIRP.SetMatrices(camera); - _CopyColorTextureBuffer ??= new() { name = "Crest Copy Color Texture" }; - _DeferredShadowMapBuffer ??= new() { name = "Crest Deferred Shadow Data" }; - _ScreenSpaceShadowMapBuffer ??= new() { name = "Crest Screen-Space Shadow Data" }; - _CopyColorTextureBuffer.Clear(); - _DeferredShadowMapBuffer.Clear(); - _ScreenSpaceShadowMapBuffer.Clear(); + _DoneMatrices = true; + } - // Create or update RT. + void OnBeginCameraRenderingLegacy(Camera camera) + { + if (PrimaryLight == null) { - var descriptor = XRHelpers.GetRenderTextureDescriptor(camera); - - // Format must be correct for CopyTexture to work. Hopefully this is good enough. - if (camera.allowHDR && QualitySettings.activeColorSpace == ColorSpace.Linear) - { - descriptor.graphicsFormat = SystemInfo.GetGraphicsFormat(LikelyFrameBufferFormat); - } - - // Occurred in a build and caused a black screen. - if (descriptor.width <= 0) - { - return; - } - - if (_CameraColorTexture == null) - { - _CameraColorTexture = new(descriptor); - } - else - { - _CameraColorTexture.Release(); - _CameraColorTexture.descriptor = descriptor; - } - - _CameraColorTexture.Create(); + return; } - var target = new RenderTargetIdentifier(_CameraColorTexture, 0, CubemapFace.Unknown, -1); - - // Use blit instead of CopyTexture as it will smooth out issues with format - // differences which is very hard to get right for BIRP. - _CopyColorTextureBuffer.Blit(BuiltinRenderTextureType.CameraTarget, target); - _CopyColorTextureBuffer.SetGlobalTexture(ShaderIDs.s_CameraOpaqueTexture, _CameraColorTexture); - - camera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _CopyColorTextureBuffer); - - if (QualitySettings.shadows != ShadowQuality.Disable && PrimaryLight != null) + // Force shadow map to remain for transparent pass and beyond. { + _ScreenSpaceShadowMapBuffer ??= new() { name = "Crest.CausticsOcclusion" }; + _ScreenSpaceShadowMapBuffer.Clear(); + // Make the screen-space shadow texture available for the water shader for caustic occlusion. _ScreenSpaceShadowMapBuffer.SetGlobalTexture(ShaderIDs.s_ScreenSpaceShadowTexture, BuiltinRenderTextureType.CurrentActive); PrimaryLight.AddCommandBuffer(LightEvent.AfterScreenspaceMask, _ScreenSpaceShadowMapBuffer); - // Call this regardless of rendering path as it has no negative consequences for forward. - _DeferredShadowMapBuffer.SetGlobalTexture(ShaderIDs.s_ShadowMapTexture, BuiltinRenderTextureType.CurrentActive); - PrimaryLight.AddCommandBuffer(LightEvent.AfterShadowMap, _DeferredShadowMapBuffer); - } - { // Always set these in case shadow maps are disabled in the graphics settings which // we cannot check at runtime. // Black for shadowed. White for unshadowed. - if (camera.stereoEnabled && XRHelpers.IsSinglePass) - { - Shader.SetGlobalTexture(ShaderIDs.s_ScreenSpaceShadowTexture, XRHelpers.WhiteTexture); - } - else - { - Shader.SetGlobalTexture(ShaderIDs.s_ScreenSpaceShadowTexture, Texture2D.whiteTexture); - } + Shader.SetGlobalTexture(ShaderIDs.s_ScreenSpaceShadowTexture, Rendering.BIRP.GetWhiteTexture(camera)); } + + Helpers.SetGlobalBoolean(ShaderIDs.s_PrimaryLightHasCookie, PrimaryLight.cookie != null); } - void OnPostRenderCamera(Camera camera) + void OnEndCameraRenderingLegacy(Camera camera) { -#if UNITY_EDITOR - if (!Application.isPlaying) - { - OnPostRenderWaterLevelDepthTexture(camera); - } -#endif + _DoneMatrices = false; + _DoneCameraOpaqueTexture = false; - if (!Helpers.MaskIncludesLayer(camera.cullingMask, Layer)) + if (_UpdateColorDepthTexturesBuffer != null) { - return; - } - - if (_CopyColorTextureBuffer != null) - { - camera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _CopyColorTextureBuffer); + camera.RemoveCommandBuffer(RenderBeforeTransparency ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha, _UpdateColorDepthTexturesBuffer); } if (QualitySettings.shadows != ShadowQuality.Disable && PrimaryLight != null) @@ -164,11 +97,153 @@ namespace WaveHarmonic.Crest { PrimaryLight.RemoveCommandBuffer(LightEvent.AfterScreenspaceMask, _ScreenSpaceShadowMapBuffer); } + } - if (_DeferredShadowMapBuffer != null) + Shader.SetGlobalTexture(ShaderIDs.Unity.s_CameraOpaqueTexture, Texture2D.grayTexture); + } + + // Needs to be separate, as it needs to run after the water volume pass. + void OnLegacyCopyPass(Camera camera) + { + if (!ShouldRender(camera, Surface.Layer)) + { + return; + } + + if (Surface.Material == null) + { + return; + } + + if (!SurfaceRenderer.IsTransparent(Surface.Material)) + { + return; + } + + // Our reflections do not need them. + if (camera == WaterReflections.CurrentCamera) + { + return; + } + + _UpdateColorDepthTexturesBuffer ??= new() { name = k_DrawWater }; + _UpdateColorDepthTexturesBuffer.Clear(); + + var buffer = _UpdateColorDepthTexturesBuffer; + + if (WriteToColorTexture) + { + UpdateCameraOpaqueTexture(camera, buffer); + } + + if (WriteToDepthTexture && Shader.GetGlobalTexture(Crest.ShaderIDs.Unity.s_CameraDepthTexture) is RenderTexture depthRT) + { + buffer.BeginSample(k_DrawCopyDepth); + + // There is no way to update the depth texture with the depth buffer, as we cannot + // get a reference to it. We have to render water depth separately and then merge + // the results. + + var target = new RenderTargetIdentifier(depthRT, 0, CubemapFace.Unknown, -1); + + var id = ShaderIDs.s_TemporaryDepthTexture; + + buffer.GetTemporaryRT(id, depthRT.descriptor); + CoreUtils.SetRenderTarget(buffer, id, ClearFlag.Depth); + + Surface.Render(camera, buffer, pass: Surface.Material.FindPass("DepthOnly"), culled: true); + + buffer.SetGlobalTexture(Helpers.ShaderIDs.s_MainTexture, id); + + Helpers.Blit(buffer, target, Rendering.BIRP.UtilityMaterial, (int)Rendering.BIRP.UtilityPass.MergeDepth); + + // TODO: add debug toggle + // buffer.Blit(target, BuiltinRenderTextureType.CameraTarget); + + buffer.ReleaseTemporaryRT(id); + + buffer.EndSample(k_DrawCopyDepth); + } + + if (WriteToColorTexture || WriteToDepthTexture) + { + camera.AddCommandBuffer(RenderBeforeTransparency ? CameraEvent.BeforeForwardAlpha : CameraEvent.AfterForwardAlpha, buffer); + } + } + } + + // Camera Opaque Texture. + partial class WaterRenderer + { + bool _DoneCameraOpaqueTexture; + RenderTexture _CameraOpaqueTexture; + CommandBuffer _CameraOpaqueTextureCommands; + + internal void UpdateCameraOpaqueTexture(Camera camera, CommandBuffer commands) + { + commands.BeginSample(k_DrawCopyColor); + + var target = new RenderTargetIdentifier(_CameraOpaqueTexture, 0, CubemapFace.Unknown, -1); + + // Use blit instead of CopyTexture as it will smooth out issues with format + // differences which is very hard to get right for BIRP. + commands.Blit(BuiltinRenderTextureType.CameraTarget, target); + + commands.EndSample(k_DrawCopyColor); + } + + internal void OnBeginCameraOpaqueTexture(Camera camera) + { + if (_DoneCameraOpaqueTexture) + { + return; + } + + var descriptor = Rendering.BIRP.GetCameraTargetDescriptor(camera, FrameBufferFormatOverride); + + // Occurred in a build and caused a black screen. + if (descriptor.width <= 0) + { + return; + } + + if (_CameraOpaqueTexture == null) + { + _CameraOpaqueTexture = new(descriptor) { - PrimaryLight.RemoveCommandBuffer(LightEvent.AfterShadowMap, _DeferredShadowMapBuffer); - } + name = "_CameraOpaqueTexture", + }; + } + else + { + _CameraOpaqueTexture.Release(); + _CameraOpaqueTexture.descriptor = descriptor; + } + + _CameraOpaqueTexture.Create(); + + _CameraOpaqueTextureCommands ??= new() + { + name = "Crest.DrawWater", + }; + + _CameraOpaqueTextureCommands.Clear(); + + // Do every frame as we set to default texture at end of rendering. + _CameraOpaqueTextureCommands.SetGlobalTexture(Crest.ShaderIDs.Unity.s_CameraOpaqueTexture, _CameraOpaqueTexture); + + UpdateCameraOpaqueTexture(camera, _CameraOpaqueTextureCommands); + + camera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _CameraOpaqueTextureCommands); + + _DoneCameraOpaqueTexture = true; + } + + internal void OnEndCameraOpaqueTexture(Camera camera) + { + if (_CameraOpaqueTextureCommands != null) + { + camera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _CameraOpaqueTextureCommands); } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs new file mode 100644 index 000000000..b011c44a3 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs @@ -0,0 +1,44 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +using UnityEngine; + +namespace WaveHarmonic.Crest +{ + partial class WaterRenderer : ISerializationCallbackReceiver + { + [SerializeField, HideInInspector] +#pragma warning disable 414 + int _Version = 1; +#pragma warning restore 414 + + /// + void ISerializationCallbackReceiver.OnAfterDeserialize() + { + if (_Version < 1) + { +#pragma warning disable CS0618 // Type or member is obsolete + Surface._Layer = _Layer; + Surface._Material = _Material; + Surface._VolumeMaterial = _VolumeMaterial; + Surface._ChunkTemplate = _ChunkTemplate; + Surface._CastShadows = _CastShadows; + Surface._WaterBodyCulling = _WaterBodyCulling; + Surface._TimeSliceBoundsUpdateFrameCount = _TimeSliceBoundsUpdateFrameCount; + Surface._AllowRenderQueueSorting = _AllowRenderQueueSorting; + Surface._SurfaceSelfIntersectionFixMode = _SurfaceSelfIntersectionFixMode; +#pragma warning restore CS0618 // Type or member is obsolete + + _DepthLod._IncludeTerrainHeight = false; + + _Version = 1; + } + } + + /// + void ISerializationCallbackReceiver.OnBeforeSerialize() + { + + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs.meta b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs.meta new file mode 100644 index 000000000..8417133d7 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Migration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9bf05888fe7e048428e9c1fb978a0d85 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.SerializedFields.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.SerializedFields.cs index b8c983533..88b93a1dd 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.SerializedFields.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.SerializedFields.cs @@ -14,6 +14,21 @@ namespace WaveHarmonic.Crest } #endif + /// + /// The render pass injection point. + /// + [@GenerateDoc] + public enum WaterInjectionPoint + { + /// + [Tooltip("Renders in the default pass.\n\nFor the water surface, this will be determined by the material (opaque or transparent). This pass is controlled by Unity, and is not compatible with certain features like soft particles.\n\nFor the water volume, this will be after transparency.")] + Default, + + /// + [Tooltip("Renders before the transparent pass.\n\nThis has advantages like being compatible with soft particles, refractive shaders, and possibly third-party fog.")] + BeforeTransparent, + } + partial class WaterRenderer { internal const float k_MaximumWindSpeedKPH = 150f; @@ -25,37 +40,64 @@ namespace WaveHarmonic.Crest [Tooltip("The camera which drives the water data.\n\nSetting this is optional. Defaults to the main camera.")] [@GenerateAPI(Getter.Custom, name: "Viewer")] [@DecoratedField, SerializeField] - Camera _Camera; + internal Camera _Camera; [Tooltip("Optional provider for time.\n\nCan be used to hard-code time for automation, or provide server time. Defaults to local Unity time.")] [@DecoratedField, SerializeField] internal TimeProvider _TimeProvider; - [Tooltip("Whether to override the automatic detection of framebuffer HDR rendering (BIRP only).\n\nRendering using HDR formats is optional, but there is no way for us to determine if HDR rendering is enabled in the Graphics Settings. We make an educated based on which platform is the target. If you see rendering issues, try disabling this.\n\n This has nothing to do with having an HDR monitor.")] - [@Predicated(RenderPipeline.Legacy, hide: true)] - [@GenerateAPI] - [@DecoratedField, SerializeField] - bool _OverrideRenderHDR; - - [Tooltip("Force HDR format usage (BIRP only).\n\nIf enabled, we assume the framebuffer is an HDR format, otherwise an LDR format.")] - [@Predicated(RenderPipeline.Legacy, hide: true)] - [@Predicated(nameof(_OverrideRenderHDR))] - [@GenerateAPI] - [@DecoratedField, SerializeField] - bool _RenderHDR = true; - [@Group("Environment", Group.Style.Accordian)] - [Tooltip("Base wind speed in km/h.\n\nControls wave conditions. Can be overridden on Shape* components.")] - [@Range(0, k_MaximumWindSpeedKPH, scale: 2f)] + [Tooltip("Uses a provided WindZone as the source of global wind.\n\nIt must be directional. Wind speed units are presumed to be in m/s.")] [@GenerateAPI] + [@DecoratedField, SerializeField] + WindZone _WindZone; + + [Tooltip("Whether to override the given wind zone's wind speed.")] + [@Predicated(nameof(_WindZone), hide: true)] + [@InlineToggle, SerializeField] + bool _OverrideWindZoneWindSpeed; + + [Tooltip("Base wind speed in km/h.\n\nControls wave conditions. Can be overridden on Shape* components.")] + [@Predicated(typeof(WaterRenderer), nameof(WindSpeedOverriden), inverted: true, hide: true)] + [@ShowComputedProperty(nameof(WindSpeed))] + [@Range(0, k_MaximumWindSpeedKPH, scale: 2f)] + [@GenerateAPI(Getter.Custom)] [SerializeField] internal float _WindSpeed = 10f; + [Tooltip("Whether to override the given wind zone's wind direction.")] + [@Predicated(nameof(_WindZone), hide: true)] + [@InlineToggle, SerializeField] + bool _OverrideWindZoneWindDirection; + + [Tooltip("Base wind direction in degrees.\n\nControls wave conditions. Can be overridden on Shape* components.")] + [@Predicated(typeof(WaterRenderer), nameof(WindDirectionOverriden), inverted: true, hide: true)] + [@ShowComputedProperty(nameof(WindDirection))] + [@Range(-180, 180)] + [@GenerateAPI(Getter.Custom)] + [SerializeField] + internal float _WindDirection; + + [Tooltip("Whether to override the given wind zone's wind turbulence.")] + [@Predicated(nameof(_WindZone), hide: true)] + [@InlineToggle, SerializeField] + bool _OverrideWindZoneWindTurbulence; + + [Tooltip("Base wind turbulence.\n\nControls wave conditions. Can be overridden on ShapeFFT components.")] + [@Predicated(typeof(WaterRenderer), nameof(WindTurbulenceOverriden), inverted: true, hide: true)] + [@ShowComputedProperty(nameof(WindTurbulence))] + [@Range(0, 1)] + [@GenerateAPI(Getter.Custom)] + [SerializeField] + internal float _WindTurbulence = 0.145f; + + [@Space(10)] + [Tooltip("Provide your own gravity value instead of Physics.gravity.")] [@GenerateAPI] - [@DecoratedField, SerializeField] + [@InlineToggle, SerializeField] bool _OverrideGravity; [@Label("Gravity")] @@ -71,50 +113,47 @@ namespace WaveHarmonic.Crest [SerializeField] float _GravityMultiplier = 1f; + [@Space(10)] + [Tooltip("The primary light that affects the water.\n\nSetting this is optional. This should be a directional light. Defaults to RenderSettings.sun.")] [@GenerateAPI(Getter.Custom)] [@DecoratedField, SerializeField] Light _PrimaryLight; - [@Group("Surface Renderer", Group.Style.Accordian)] +#if !d_Crest_LegacyUnderwater + [@Group("Rendering", Group.Style.Accordian)] +#else + [HideInInspector] +#endif - [Tooltip("The water chunk renderers will have this layer.")] - [@Layer] + [Tooltip("When in the render pipeline the water is rendered.\n\nDefault is the old behaviour which is controlled by Unity.\n\nBefore Transparency has advantages like being compatible with soft particles, refractive shaders, and possibly third-party atmospheric fog.")] [@GenerateAPI] - [SerializeField] - int _Layer = 4; // Water - - [Tooltip("Material to use for the water surface.")] - [@AttachMaterialEditor] - [@MaterialField("Crest/Water", name: "Water", title: "Create Water Material")] - [@GenerateAPI] - [SerializeField] - internal Material _Material = null; - - [Tooltip("Underwater will copy from this material if set.\n\nUseful for overriding properties for the underwater effect. To see what properties can be overriden, see the disabled properties on the underwater material. This does not affect the surface.")] - [@AttachMaterialEditor] - [@MaterialField("Crest/Water", name: "Water (Below)", title: "Create Water Material", parent: "_Material")] - [@GenerateAPI] - [SerializeField] - internal Material _VolumeMaterial = null; - - [Tooltip("Template for water chunks as a prefab.\n\nThe only requirements are that the prefab must contain a MeshRenderer at the root and not a MeshFilter or WaterChunkRenderer. MR values will be overwritten where necessary and the prefabs are linked in edit mode.")] - [@PrefabField(title: "Create Chunk Prefab", name: "Water Chunk")] - [SerializeField] - internal GameObject _ChunkTemplate; + [@DecoratedField, SerializeField] + WaterInjectionPoint _InjectionPoint; +#if !d_Crest_LegacyUnderwater [@Space(10)] +#else + [@Group("Rendering", Group.Style.Accordian)] +#endif - [Tooltip("Have the water surface cast shadows for albedo (both foam and custom).")] - [@Predicated(RenderPipeline.Legacy, inverted: true, hide: true)] + [@Label("Color Texture")] + [Tooltip("Whether to write the water surface color to the color/opaque texture.\n\nThis is likely only beneficial if the water injection point is before transparency, and there are shaders which need it (like refraction).")] + [@Predicated(nameof(_InjectionPoint), inverted: false, nameof(WaterInjectionPoint.Default))] [@GenerateAPI(Getter.Custom)] [@DecoratedField, SerializeField] - internal bool _CastShadows; + internal bool _WriteToColorTexture = true; + + [@Label("Depth Texture")] + [Tooltip("Whether to write the water surface depth to the depth texture.\n\nThe water surface writes to the depth buffer, but Unity does not copy it to the depth texture for post-processing effects like Depth of Field (or refraction). This will copy the depth buffer to the depth texture.\n\nIf the water injection point is in the transparent pass, be wary that it will include all transparent objects that write to depth. Furthermore, other third parties may already be doing this, and we do not check whether it is necessary to copy or not.\n\nThis feature has a considerable overhead if using the built-in render pipeline, as it requires rendering the surface depth another time.")] + [@Predicated(nameof(_Surface) + "." + nameof(SurfaceRenderer._Enabled))] + [@GenerateAPI(Getter.Custom)] + [@DecoratedField, SerializeField] + internal bool _WriteToDepthTexture = true; [@Label("Motion Vectors")] [Tooltip("Whether to enable motion vector support.")] - [@Predicated(RenderPipeline.Legacy, inverted: true, hide: true)] #if !UNITY_6000_0_OR_NEWER [@Predicated(RenderPipeline.Universal, inverted: true, hide: true)] #endif @@ -122,36 +161,28 @@ namespace WaveHarmonic.Crest [@DecoratedField, SerializeField] internal bool _WriteMotionVectors = true; - [Tooltip("Whether to write the water surface depth to the depth texture (URP only).\n\nThe water surface writes to the depth buffer, but Unity does not copy it to the depth texture for post-processing effects like Depth of Field. This will copy the depth buffer to the depth texture.\n\nBe wary that it will include all transparent objects that write to depth. Furthermore, other third parties may already be doing this, and we do not check whether it is necessary to copy or not.")] - [@Predicated(RenderPipeline.Universal, hide: true)] + [@Space(10)] + + [Tooltip("Whether to override the automatic detection of framebuffer HDR rendering (BIRP only).\n\nRendering using HDR formats is optional, but there is no way for us to determine if HDR rendering is enabled in the Graphics Settings. We make an educated based on which platform is the target. If you see rendering issues, try disabling this.\n\n This has nothing to do with having an HDR monitor.")] + [@Predicated(RenderPipeline.Legacy, hide: true)] + [@GenerateAPI] + [@InlineToggle, SerializeField] + bool _OverrideRenderHDR; + + [Tooltip("Force HDR format usage (BIRP only).\n\nIf enabled, we assume the framebuffer is an HDR format, otherwise an LDR format.")] + [@Predicated(RenderPipeline.Legacy, hide: true)] + [@Predicated(nameof(_OverrideRenderHDR))] [@GenerateAPI] [@DecoratedField, SerializeField] - internal bool _WriteToDepthTexture = true; + bool _RenderHDR = true; - [@Heading("Culling")] - [Tooltip("Whether 'Water Body' components will cull the water tiles.\n\nDisable if you want to use the 'Material Override' feature and still have an ocean.")] - [@GenerateAPI] - [@DecoratedField, SerializeField] - bool _WaterBodyCulling = true; + [@Group(isCustomFoldout: true)] - [Tooltip("How many frames to distribute the chunk bounds calculation.\n\nThe chunk bounds are calculated per frame to ensure culling is correct when using inputs that affect displacement. Some performance can be saved by distributing the load over several frames. The higher the frames, the longer it will take - lowest being instant.")] - [@Range(1, 30, Range.Clamp.Minimum)] - [@GenerateAPI] - [SerializeField] - int _TimeSliceBoundsUpdateFrameCount = 1; - - [@Heading("Advanced")] - - [Tooltip("How to handle self-intersections of the water surface.\n\nThey can be caused by choppy waves which can cause a flipped underwater effect. When not using the portals/volumes, this fix is only applied when within 2 metres of the water surface. Automatic will disable the fix if portals/volumes are used which is the recommend setting.")] - [@DecoratedField, SerializeField] - SurfaceSelfIntersectionFixMode _SurfaceSelfIntersectionFixMode = SurfaceSelfIntersectionFixMode.Automatic; - - [Tooltip("Whether to allow sorting using the render queue.\n\nIf you need to change the minor part of the render queue (eg +100), then enable this option. As a side effect, it will also disable the front-to-back rendering optimization for Crest. This option does not affect changing the major part of the render queue (eg AlphaTest, Transparent), as that is always allowed.\n\nRender queue sorting is required for some third-party integrations.")] - [@Predicated(RenderPipeline.HighDefinition, inverted: true, hide: true)] - [@GenerateAPI] - [@DecoratedField, SerializeField] - bool _AllowRenderQueueSorting; + [Tooltip("The water surface renderer.")] + [@GenerateAPI(Setter.None)] + [@DecoratedField(isCustomFoldout: true), SerializeReference] + SurfaceRenderer _Surface = new(); [@Group("Level of Detail", Group.Style.Accordian)] @@ -174,7 +205,7 @@ namespace WaveHarmonic.Crest [@Range(2, Lod.k_MaximumSlices)] [@GenerateAPI(name: "LodLevels")] [SerializeField] - int _Slices = 7; + int _Slices = 9; [@Label("Resolution")] [Tooltip("The resolution of the various water LOD data.\n\nThis includes mesh density, displacement textures, foam data, dynamic wave simulation, etc. Sets the 'detail' present in the water - larger values give more detail at increased run-time expense. This value can be overriden per LOD in their respective settings except for Animated Waves which is tied to this value.")] @@ -204,6 +235,12 @@ namespace WaveHarmonic.Crest [@DecoratedField, SerializeField] Transform _Viewpoint; + [@Label("Displacement Correction")] + [Tooltip("Keep the center of detail from drifting from the viewpoint.\n\nLarge horizontal displacement can displace the center of detail. This uses queries to keep the center of detail aligned.")] + [@GenerateAPI] + [@DecoratedField, SerializeField] + bool _CenterOfDetailDisplacementCorrection = true; + [Tooltip("Also checks terrain height when determining the scale.\n\nThe scale is changed based on the viewer's height above the water surface. This can be a problem with varied water level, as the viewer may not be directly over the higher water level leading to a height difference, and thus incorrect scale.")] [Predicated(nameof(_Viewpoint), inverted: true)] [@GenerateAPI] @@ -307,6 +344,14 @@ namespace WaveHarmonic.Crest internal UnderwaterRenderer _Underwater = new(); + [@Group(isCustomFoldout: true)] + + [Tooltip("The meniscus module.")] + [@GenerateAPI(Setter.None)] + [@DecoratedField(isCustomFoldout: true), SerializeReference] + internal Meniscus _Meniscus = new(); + + #if !d_CrestPortals // Hide if package is not present. Fallback to dummy script. [HideInInspector] @@ -372,18 +417,6 @@ namespace WaveHarmonic.Crest public bool _DestroyResourcesInOnDisable; #if CREST_DEBUG - [Tooltip("Whether to disable chunk generation.")] - [@DecoratedField, SerializeField] - public bool _DisableChunks; - - [Tooltip("Whether to generate water geometry tiles uniformly (with overlaps).")] - [@DecoratedField, SerializeField] - public bool _UniformTiles; - - [Tooltip("Disable generating a wide strip of triangles at the outer edge to extend water to edge of view frustum.")] - [@DecoratedField, SerializeField] - public bool _DisableSkirt; - [@DecoratedField, SerializeField] public bool _DrawLodOutline; @@ -416,10 +449,6 @@ namespace WaveHarmonic.Crest [@Heading("Server")] - [Tooltip("Emulate batch mode which models running without a display (but with a GPU available). Equivalent to running standalone build with -batchmode argument.")] - [@DecoratedField, SerializeField] - public bool _ForceBatchMode; - [Tooltip("Emulate running on a client without a GPU. Equivalent to running standalone with -nographics argument.")] [@DecoratedField, SerializeField] public bool _ForceNoGraphics; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Universal.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Universal.cs index f767fc349..3280db98e 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Universal.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.Universal.cs @@ -1,8 +1,13 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if d_UnityURP +#if !UNITY_6000_3_OR_NEWER +#define URP_COMPATIBILITY_MODE +#endif + +using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; @@ -12,98 +17,26 @@ namespace WaveHarmonic.Crest // Universal Render Pipeline partial class WaterRenderer { - sealed class ConfigureUniversalRenderer : ScriptableRenderPass + internal const RenderPassEvent k_WaterRenderPassEvent = RenderPassEvent.BeforeRenderingTransparents; + + internal sealed class CopyTargetsRenderPass : ScriptableRenderPass { readonly WaterRenderer _Water; - public static ConfigureUniversalRenderer Instance { get; set; } - - public ConfigureUniversalRenderer(WaterRenderer water) - { - _Water = water; - renderPassEvent = RenderPassEvent.BeforeRenderingTransparents; - ConfigureInput(ScriptableRenderPassInput.Color | ScriptableRenderPassInput.Depth); - } - - public static void Enable(WaterRenderer water) - { -#if UNITY_EDITOR - var data = water.Viewer != null ? water.Viewer.GetUniversalAdditionalCameraData() : null; - - // Type is internal. - if (data != null && data.scriptableRenderer.GetType().Name == "Renderer2D") - { - UnityEditor.EditorUtility.DisplayDialog - ( - "Crest Error!", - "The project has been detected as a URP 2D project. Crest only supports 3D projects. " + - "You may see errors from Crest in the console, and other issues.", - "Ok" - ); - } -#endif - - Instance = new ConfigureUniversalRenderer(water); - RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering; - RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering; - } - - public static void Disable() - { - RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering; - } - - static void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) - { - // May cause assertions/exceptions for reflection camera. - if (camera.cameraType == CameraType.Reflection) return; - - if (!Helpers.MaskIncludesLayer(camera.cullingMask, Instance._Water.Layer)) - { - return; - } - - // TODO: Could also check RenderType. Which is better? - if (!Instance._Water.Material.IsKeywordEnabled("_SURFACE_TYPE_TRANSPARENT")) - { - return; - } - - camera.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(Instance); - } - -#if UNITY_6000_0_OR_NEWER - sealed class PassData { } - - public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, ContextContainer frame) - { - using (var builder = graph.AddUnsafePass("Crest Register Color/Depth Requirements.", out var data)) - { - builder.AllowPassCulling(false); - builder.SetRenderFunc((data, context) => { }); - } - } - - [System.Obsolete] -#endif - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) - { - // Blank - } - } - - internal sealed class UniversalCopyWaterSurfaceDepth : ScriptableRenderPass - { - readonly WaterRenderer _Water; - public static UniversalCopyWaterSurfaceDepth Instance { get; set; } + public static CopyTargetsRenderPass Instance { get; set; } readonly UnityEngine.Rendering.Universal.Internal.CopyDepthPass _CopyDepthPass; readonly Shader _CopyDepthShader; readonly Material _CopyDepthMaterial; - public UniversalCopyWaterSurfaceDepth(WaterRenderer water) + static readonly System.Reflection.FieldInfo s_OpaqueColor = typeof(UniversalRenderer).GetField("m_OpaqueColor", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + static readonly System.Reflection.FieldInfo s_ActiveRenderPassQueue = typeof(ScriptableRenderer).GetField("m_ActiveRenderPassQueue", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + readonly UnityEngine.Rendering.Universal.Internal.CopyColorPass _CopyColorPass; + readonly Material _CopyColorMaterial; + readonly Material _SampleColorMaterial; + + public CopyTargetsRenderPass(WaterRenderer water) { _Water = water; - renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing; _CopyDepthShader = Shader.Find("Hidden/Universal Render Pipeline/CopyDepth"); #if !UNITY_6000_0_OR_NEWER @@ -112,7 +45,7 @@ namespace WaveHarmonic.Crest _CopyDepthPass = new ( - RenderPassEvent.BeforeRenderingPostProcessing, + renderPassEvent, #if UNITY_6000_0_OR_NEWER _CopyDepthShader, #else @@ -122,52 +55,77 @@ namespace WaveHarmonic.Crest copyToDepth: true, copyResolvedDepth: RenderingUtils.MultisampleDepthResolveSupported(), shouldClear: false +#if UNITY_6000_0_OR_NEWER + , customPassName: "Crest.DrawWater" +#endif + ); + + _CopyColorMaterial = new(Shader.Find("Hidden/Universal/CoreBlit")); + _SampleColorMaterial = new(Shader.Find("Hidden/Universal Render Pipeline/Sampling")); + + _CopyColorPass = new + ( + renderPassEvent, + _SampleColorMaterial, + _CopyColorMaterial +#if UNITY_6000_0_OR_NEWER + , customPassName: "Crest.DrawWater" +#endif ); } public static void Enable(WaterRenderer water) { - Instance = new UniversalCopyWaterSurfaceDepth(water); - RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering; - RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering; + Instance = new(water); } - public static void Disable() + internal void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) { - RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering; - } + var water = _Water; - static void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) - { - // May cause assertions/exceptions for reflection camera. - if (camera.cameraType == CameraType.Reflection) return; - - if (!Instance._Water._WriteToDepthTexture) + if (!ShouldRender(camera, water.Surface.Layer)) { return; } - if (!Helpers.MaskIncludesLayer(camera.cullingMask, Instance._Water.Layer)) + // Our reflections do not need them. + if (camera == WaterReflections.CurrentCamera) + { + return; + } + + + if (!water.WriteToColorTexture && !water.WriteToDepthTexture) + { + return; + } + + if (water.Surface.Material == null) { return; } // TODO: Could also check RenderType. Which is better? - if (!Instance._Water.Material.IsKeywordEnabled("_SURFACE_TYPE_TRANSPARENT")) + if (!SurfaceRenderer.IsTransparent(water.Surface.Material)) { return; } + renderPassEvent = water.RenderBeforeTransparency ? RenderPassEvent.BeforeRenderingTransparents : RenderPassEvent.AfterRenderingTransparents; + _CopyColorPass.renderPassEvent = renderPassEvent; + _CopyDepthPass.renderPassEvent = renderPassEvent; + var renderer = camera.GetUniversalAdditionalCameraData().scriptableRenderer; // Needed for OnCameraSetup. - renderer.EnqueuePass(Instance); + renderer.EnqueuePass(this); #if UNITY_6000_0_OR_NEWER // Copy depth pass does not support RG directly. if (GraphicsSettings.GetRenderPipelineSettings().enableRenderCompatibilityMode) #endif { - renderer.EnqueuePass(Instance._CopyDepthPass); + if (water.WriteToColorTexture) renderer.EnqueuePass(_CopyColorPass); + if (water.WriteToDepthTexture) renderer.EnqueuePass(_CopyDepthPass); } } @@ -176,9 +134,18 @@ namespace WaveHarmonic.Crest { var resources = frame.Get(); var descriptor = resources.cameraDepthTexture.GetDescriptor(graph); - // Whether we a writing to color or depth format. - _CopyDepthPass.CopyToDepth = descriptor.colorFormat == UnityEngine.Experimental.Rendering.GraphicsFormat.None; - _CopyDepthPass.Render(graph, frame, resources.cameraDepthTexture, resources.cameraDepth); + + if (_Water.WriteToColorTexture) + { + _CopyColorPass.RenderToExistingTexture(graph, frame, resources.cameraOpaqueTexture, resources.cameraColor, UniversalRenderPipeline.asset.opaqueDownsampling); + } + + if (_Water.WriteToDepthTexture) + { + // Whether we a writing to color or depth format. + _CopyDepthPass.CopyToDepth = descriptor.colorFormat == UnityEngine.Experimental.Rendering.GraphicsFormat.None; + _CopyDepthPass.Render(graph, frame, resources.cameraDepthTexture, resources.cameraDepth); + } } [System.Obsolete] @@ -186,9 +153,20 @@ namespace WaveHarmonic.Crest public override void OnCameraSetup(CommandBuffer buffer, ref RenderingData data) { var renderer = (UniversalRenderer)data.cameraData.renderer; + var opaqueColorHandle = s_OpaqueColor.GetValue(renderer) as RTHandle; + // Also check internal RT because it can be null on Vulkan for some reason. + if (renderer.cameraColorTargetHandle?.rt != null && opaqueColorHandle?.rt != null) + { + _CopyColorPass.Setup(renderer.cameraColorTargetHandle, opaqueColorHandle, UniversalRenderPipeline.asset.opaqueDownsampling); + } + else + { + var queue = s_ActiveRenderPassQueue.GetValue(renderer) as List; + queue.Remove(_CopyColorPass); + } - +#if URP_COMPATIBILITY_MODE // Also check internal RT because it can be null on Vulkan for some reason. if (renderer.cameraDepthTargetHandle?.rt != null && renderer.m_DepthTexture?.rt != null) { @@ -197,6 +175,12 @@ namespace WaveHarmonic.Crest _CopyDepthPass.m_CopyResolvedDepth = false; _CopyDepthPass.Setup(renderer.cameraDepthTargetHandle, renderer.m_DepthTexture); } + else +#endif + { + var queue = s_ActiveRenderPassQueue.GetValue(renderer) as List; + queue.Remove(_CopyDepthPass); + } } #if UNITY_6000_0_OR_NEWER diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.WaterLevelDepth.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.WaterLevelDepth.cs index 2d6b5b960..aa7e00f56 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.WaterLevelDepth.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.WaterLevelDepth.cs @@ -1,273 +1,2 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. - -// FIXME: Broken for BIRP on MacOS. Either platform specific problem or bug in Unity. - -using UnityEngine; -using UnityEngine.Rendering; -using UnityEngine.Rendering.HighDefinition; -using UnityEngine.Rendering.Universal; - -namespace WaveHarmonic.Crest -{ - partial class WaterRenderer - { - CommandBuffer _WaterLevelDepthBuffer; - RenderTexture _WaterLevelDepthTexture; - internal RenderTexture WaterLevelDepthTexture => _WaterLevelDepthTexture; - RenderTargetIdentifier _WaterLevelDepthTarget; - Material _WaterLevelDepthMaterial; - internal readonly Plane[] _CameraFrustumPlanes = new Plane[6]; - - const string k_WaterLevelDepthTextureName = "Crest Water Level Depth Texture"; - - void RenderWaterSurface(CommandBuffer buffer, Camera camera, Material material) - { - GeometryUtility.CalculateFrustumPlanes(camera, _CameraFrustumPlanes); - - // Spends approx 0.2-0.3ms here on 2018 Dell XPS 15. - foreach (var chunk in Chunks) - { - var renderer = chunk.Rend; - // Can happen in edit mode. - if (renderer == null) continue; - - var bounds = renderer.bounds; - if (GeometryUtility.TestPlanesAABB(_CameraFrustumPlanes, bounds)) - { - if ((!chunk._WaterDataHasBeenBound) && chunk.enabled) - { - chunk.Bind(camera); - } - - renderer.SetPropertyBlock(chunk._MaterialPropertyBlock); - - // Assume correct pass is zero. Use to be k_ShaderPassWaterSurfaceMask. - buffer.DrawRenderer(renderer, material, submeshIndex: 0, shaderPass: 0); - } - - chunk._WaterDataHasBeenBound = false; - } - } - - void ExecuteWaterLevelDepthTexture(Camera camera, CommandBuffer buffer) - { - Helpers.CreateRenderTargetTextureReference(ref _WaterLevelDepthTexture, ref _WaterLevelDepthTarget); - _WaterLevelDepthTexture.name = k_WaterLevelDepthTextureName; - - if (_WaterLevelDepthMaterial == null) - { - _WaterLevelDepthMaterial = new(Shader.Find("Hidden/Crest/Editor/Water Level (Depth)")); - } - - var descriptor = new RenderTextureDescriptor(camera.pixelWidth, camera.pixelHeight) - { - graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.None, - depthBufferBits = 32, - }; - - // Depth texture. - // Always release to handle screen size changes. - _WaterLevelDepthTexture.Release(); - descriptor.graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.R32_SFloat; - descriptor.depthBufferBits = 0; - Helpers.SafeCreateRenderTexture(ref _WaterLevelDepthTexture, descriptor); - _WaterLevelDepthTexture.Create(); - - // Depth buffer. - buffer.GetTemporaryRT(Helpers.ShaderIDs.s_MainTexture, descriptor); - buffer.SetRenderTarget(Helpers.ShaderIDs.s_MainTexture); - buffer.ClearRenderTarget(true, false, Color.clear); - - RenderWaterSurface(buffer, camera, _WaterLevelDepthMaterial); - - // Convert. - Helpers.Blit(buffer, _WaterLevelDepthTarget, Helpers.UtilityMaterial, (int)Helpers.UtilityPass.Copy); - - buffer.ReleaseTemporaryRT(Helpers.ShaderIDs.s_MainTexture); - - } - - void EnableWaterLevelDepthTexture() - { - if (Application.isPlaying) return; - -#if d_UnityURP - if (RenderPipelineHelper.IsUniversal) - { - WaterLevelDepthTextureURP.Enable(); - } -#endif - -#if d_UnityHDRP - if (RenderPipelineHelper.IsHighDefinition) - { - WaterLevelDepthTextureHDRP.Enable(); - } -#endif - } - - void DisableWaterLevelDepthTexture() - { - if (Application.isPlaying) return; - -#if d_UnityURP - WaterLevelDepthTextureURP.Disable(); -#endif - -#if d_UnityHDRP - WaterLevelDepthTextureHDRP.Disable(); -#endif - } - - void OnPreRenderWaterLevelDepthTexture(Camera camera) - { - if (camera.cameraType != CameraType.SceneView || camera != Viewer) - { - return; - } - - _WaterLevelDepthBuffer ??= new() { name = k_WaterLevelDepthTextureName }; - _WaterLevelDepthBuffer.Clear(); - - ExecuteWaterLevelDepthTexture(camera, _WaterLevelDepthBuffer); - - // Both forward and deferred. - camera.AddCommandBuffer(CameraEvent.BeforeDepthTexture, _WaterLevelDepthBuffer); - camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, _WaterLevelDepthBuffer); - } - - void OnPostRenderWaterLevelDepthTexture(Camera camera) - { - if (_WaterLevelDepthBuffer != null) - { - // Both forward and deferred. - camera.RemoveCommandBuffer(CameraEvent.BeforeDepthTexture, _WaterLevelDepthBuffer); - camera.RemoveCommandBuffer(CameraEvent.BeforeGBuffer, _WaterLevelDepthBuffer); - } - } - -#if d_UnityURP - sealed class WaterLevelDepthTextureURP : ScriptableRenderPass - { - static WaterLevelDepthTextureURP s_Instance; - - internal WaterLevelDepthTextureURP() - { - // Will always execute and matrices will be ready. - renderPassEvent = RenderPassEvent.BeforeRenderingPrePasses; - } - - internal static void Enable() - { - s_Instance ??= new(); - - RenderPipelineManager.beginCameraRendering -= s_Instance.EnqueuePass; - RenderPipelineManager.beginCameraRendering += s_Instance.EnqueuePass; - RenderPipelineManager.activeRenderPipelineTypeChanged -= Disable; - RenderPipelineManager.activeRenderPipelineTypeChanged += Disable; - } - - internal static void Disable() - { - // FIXME: Out of range exception when no null check but shouldn't be necessary. - if (s_Instance != null) RenderPipelineManager.beginCameraRendering -= s_Instance.EnqueuePass; - RenderPipelineManager.activeRenderPipelineTypeChanged -= Disable; - } - - void EnqueuePass(ScriptableRenderContext context, Camera camera) - { - if (camera.cameraType != CameraType.SceneView || camera != Instance.Viewer) - { - return; - } - - // Enqueue the pass. This happens every frame. - camera.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(this); - } - -#if UNITY_6000_0_OR_NEWER - class PassData - { - public UniversalCameraData _CameraData; - } - - public override void RecordRenderGraph(UnityEngine.Rendering.RenderGraphModule.RenderGraph graph, ContextContainer frame) - { - using (var builder = graph.AddUnsafePass(k_WaterLevelDepthTextureName, out var data)) - { - builder.AllowPassCulling(false); - - data._CameraData = frame.Get(); - - builder.SetRenderFunc((data, context) => - { - var buffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd); - Instance.ExecuteWaterLevelDepthTexture(data._CameraData.camera, buffer); - }); - } - } - - [System.Obsolete] -#endif - public override void Execute(ScriptableRenderContext context, ref RenderingData data) - { - var buffer = CommandBufferPool.Get(k_WaterLevelDepthTextureName); - Instance.ExecuteWaterLevelDepthTexture(data.cameraData.camera, buffer); - context.ExecuteCommandBuffer(buffer); - CommandBufferPool.Release(buffer); - } - } -#endif - -#if d_UnityHDRP - sealed class WaterLevelDepthTextureHDRP : CustomPass - { - static WaterLevelDepthTextureHDRP s_Instance; - GameObject _GameObject; - - internal static void Enable() - { - var gameObject = CustomPassHelpers.CreateOrUpdate - ( - parent: Instance.Container.transform, - k_WaterLevelDepthTextureName, - hide: !Instance._Debug._ShowHiddenObjects - ); - - CustomPassHelpers.CreateOrUpdate - ( - gameObject, - ref s_Instance, - k_WaterLevelDepthTextureName, - CustomPassInjectionPoint.BeforeRendering - ); - - s_Instance._GameObject = gameObject; - } - - public static void Disable() - { - // It should be safe to rely on this reference for this reference to fail. - if (s_Instance != null && s_Instance._GameObject != null) - { - // Will also trigger Cleanup below. - s_Instance._GameObject.SetActive(false); - } - } - - protected override void Execute(CustomPassContext context) - { - var camera = context.hdCamera.camera; - - if (camera.cameraType != CameraType.SceneView || camera != Instance.Viewer) - { - return; - } - - Instance.ExecuteWaterLevelDepthTexture(camera, context.cmd); - } - } -#endif - } -} diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.cs index f8e0c5af2..be3ba8393 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterRenderer.cs @@ -1,11 +1,10 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; -using UnityEngine.Rendering.HighDefinition; using WaveHarmonic.Crest.Internal; using WaveHarmonic.Crest.RelativeSpace; using WaveHarmonic.Crest.Utility; @@ -22,10 +21,9 @@ namespace WaveHarmonic.Crest /// public sealed partial class WaterRenderer : ManagerBehaviour { - [SerializeField, HideInInspector] -#pragma warning disable 414 - int _Version = 0; -#pragma warning restore 414 + internal const string k_RunUpdateMarker = "Crest.WaterRenderer.RunUpdate"; + + static readonly Unity.Profiling.ProfilerMarker s_RunUpdateMarker = new(k_RunUpdateMarker); internal static partial class ShaderIDs { @@ -37,15 +35,15 @@ namespace WaveHarmonic.Crest public static readonly int s_LodChange = Shader.PropertyToID("g_Crest_LodChange"); public static readonly int s_MeshScaleLerp = Shader.PropertyToID("g_Crest_MeshScaleLerp"); public static readonly int s_LodCount = Shader.PropertyToID("g_Crest_LodCount"); - public static readonly int s_LodAlphaBlackPointFade = Shader.PropertyToID("g_Crest_LodAlphaBlackPointFade"); - public static readonly int s_LodAlphaBlackPointWhitePointFade = Shader.PropertyToID("g_Crest_LodAlphaBlackPointWhitePointFade"); - public static readonly int s_ForceUnderwater = Shader.PropertyToID("g_Crest_ForceUnderwater"); // Shader Properties public static readonly int s_AbsorptionColor = Shader.PropertyToID("_Crest_AbsorptionColor"); public static readonly int s_Absorption = Shader.PropertyToID("_Crest_Absorption"); public static readonly int s_Scattering = Shader.PropertyToID("_Crest_Scattering"); public static readonly int s_Anisotropy = Shader.PropertyToID("_Crest_Anisotropy"); + public static readonly int s_AmbientTerm = Shader.PropertyToID("_Crest_AmbientTerm"); + public static readonly int s_DirectTerm = Shader.PropertyToID("_Crest_DirectTerm"); + public static readonly int s_ShadowsAffectsAmbientFactor = Shader.PropertyToID("_Crest_ShadowsAffectsAmbientFactor"); public static readonly int s_PlanarReflectionsEnabled = Shader.PropertyToID("_Crest_PlanarReflectionsEnabled"); public static readonly int s_Occlusion = Shader.PropertyToID("_Crest_Occlusion"); public static readonly int s_OcclusionUnderwater = Shader.PropertyToID("_Crest_OcclusionUnderwater"); @@ -56,16 +54,6 @@ namespace WaveHarmonic.Crest // Underwater public static readonly int s_VolumeExtinctionLength = Shader.PropertyToID("_Crest_VolumeExtinctionLength"); - - - // High Definition Render Pipeline - public static readonly int s_PrimaryLightDirection = Shader.PropertyToID("g_Crest_PrimaryLightDirection"); - public static readonly int s_PrimaryLightIntensity = Shader.PropertyToID("g_Crest_PrimaryLightIntensity"); - - // URP Motion Vectors - public static readonly int s_Surface = Shader.PropertyToID("_Surface"); - public static readonly int s_SrcBlend = Shader.PropertyToID("_SrcBlend"); - public static readonly int s_DstBlend = Shader.PropertyToID("_DstBlend"); } @@ -97,10 +85,10 @@ namespace WaveHarmonic.Crest return null; } - Camera GetViewer() + internal Camera GetViewer(bool includeSceneCamera = true) { #if UNITY_EDITOR - if (!Application.isPlaying && _FollowSceneCamera && SceneView.lastActiveSceneView != null && IsSceneViewActive) + if (includeSceneCamera && !Application.isPlaying && _FollowSceneCamera && SceneView.lastActiveSceneView != null && IsSceneViewActive) { return SceneView.lastActiveSceneView.camera; } @@ -118,6 +106,8 @@ namespace WaveHarmonic.Crest // Cache the ViewCamera property for internal use. Camera _ViewCameraCached; + readonly SampleCollisionHelper _CenterOfDetailDisplacementCorrectionHelper = new(); + // // Viewer Height @@ -152,7 +142,7 @@ namespace WaveHarmonic.Crest readonly SampleCollisionHelper _SampleHeightHelper = new(); readonly SampleDepthHelper _SampleDepthHelper = new(); - float _ViewerHeightAboveWaterPerCamera; + internal float _ViewerHeightAboveWaterPerCamera; readonly SampleCollisionHelper _SampleHeightHelperPerCamera = new(); @@ -172,22 +162,44 @@ namespace WaveHarmonic.Crest #endif // - // Serialized Fields + // Wind // internal float WindSpeedKPH => _WindSpeed; + bool WindSpeedOverriden => _WindZone == null || _OverrideWindZoneWindSpeed; + bool WindDirectionOverriden => _WindZone == null || _OverrideWindZoneWindDirection; + bool WindTurbulenceOverriden => _WindZone == null || _OverrideWindZoneWindTurbulence; + + float GetWindSpeed() + { + return _OverrideWindZoneWindSpeed || _WindZone == null ? _WindSpeed : _WindZone.windMain * 3.6f; + } + + float GetWindDirection() + { + var wind = _WindZone != null ? _WindZone.transform : null; + return _OverrideWindZoneWindDirection || wind == null + ? _WindDirection + : Mathf.Atan2(wind.forward.z, wind.forward.x) * Mathf.Rad2Deg; + } + + float GetWindTurbulence() + { + return _OverrideWindZoneWindTurbulence || _WindZone == null ? _WindTurbulence : _WindZone.windTurbulence; + } + // // Transform // - internal Transform Root { get; private set; } + internal Vector3 Position { get; private set; } internal GameObject Container { get; private set; } /// /// Sea level is given by y coordinate of GameObject with WaterRenderer script. /// - public float SeaLevel => Root.position.y; + public float SeaLevel => Position.y; // Anything higher (minus 1 for near plane) will be clipped. const float k_RenderAboveSeaLevel = 10000f; @@ -248,34 +260,72 @@ namespace WaveHarmonic.Crest // Rendering // - internal Material AboveOrBelowSurfaceMaterial => _VolumeMaterial == null ? _Material : _VolumeMaterial; + // Used as an extra check to prevent null exceptions, as the events raised when an + // RP change happen too late for some things. + RenderPipeline _SetUpFor; -#if UNITY_6000_0_OR_NEWER - internal Material _MotionVectorsMaterial; + internal bool RenderBeforeTransparency => +#if d_Crest_LegacyUnderwater + false; +#else + _InjectionPoint == WaterInjectionPoint.BeforeTransparent; #endif - enum SurfaceSelfIntersectionFixMode - { - Off, - ForceBelowWater, - ForceAboveWater, - On, - Automatic, - } - #if d_CrestPortals - bool Portaled => _Portals.Active; + internal bool Portaled => _Portals.Active; #else - bool Portaled => false; + internal bool Portaled => false; #endif - bool GetCastShadows() => _CastShadows && !RenderPipelineHelper.IsLegacy; - bool GetWriteMotionVectors() => _WriteMotionVectors && -#if UNITY_6000_0_OR_NEWER - !RenderPipelineHelper.IsLegacy; -#else - RenderPipelineHelper.IsHighDefinition; + internal MaskRenderer _Mask; + + // Flags + bool _DonePerCameraHeight; + + bool GetWriteMotionVectors() => +#if !UNITY_6000_0_OR_NEWER + !RenderPipelineHelper.IsUniversal && #endif + _WriteMotionVectors; + + bool GetWriteToColorTexture() + { + return (_WriteToColorTexture && RenderBeforeTransparency) || Meniscus.RequiresOpaqueTexture; + } + + bool GetWriteToDepthTexture() + { + return _WriteToDepthTexture && Surface.Enabled; + } + + internal static bool ShouldRender(Camera camera) + { +#if UNITY_EDITOR + // Preview camera are for preview game view, preview panes, material previews etc. + if (camera.cameraType == CameraType.Preview) + { + return false; + } +#endif + + return true; + } + + internal static bool ShouldRender(Camera camera, int layer) + { + if (!ShouldRender(camera)) + { + return false; + } + + if (!Helpers.MaskIncludesLayer(camera.cullingMask, layer)) + { + return false; + } + + return true; + } + // // Material @@ -320,20 +370,6 @@ namespace WaveHarmonic.Crest internal List Simulations { get; } = new(); - // - // Water Chunks - // - - internal List Chunks { get; } = new(); - - - // - // Water Chunk Culling - // - - bool _CanSkipCulling; - - // // Instance // @@ -373,17 +409,14 @@ namespace WaveHarmonic.Crest /// /// Is runtime environment non-interactive (not displaying to user). /// - public static bool RunningHeadless => Application.isBatchMode || (Instance != null && Instance._Debug._ForceBatchMode); - - internal bool IsRunningHeadless => Application.isBatchMode || _Debug._ForceBatchMode; + [System.Obsolete("We no longer care whether Unity is running in non-interactive mode.")] + public static bool RunningHeadless => false; // // Frame Timing // - internal int LastUpdateFrame { get; private set; } = -1; - /// /// The frame count for Crest. /// @@ -409,28 +442,22 @@ namespace WaveHarmonic.Crest // Level of Detail // - // We are computing these values to be optimal based on the base mesh vertex density. - float _LodAlphaBlackPointFade; - float _LodAlphaBlackPointWhitePointFade; - + internal const string k_DrawLodData = "Crest.LodData"; internal CommandBuffer SimulationBuffer { get; private set; } + // Scale, Weight, MaximumWaveLength, Unused internal BufferedData _CascadeData; - internal struct PerCascadeInstanceData - { - public float _MeshScaleLerp; - public float _FarNormalsWeight; - public float _GeometryGridWidth; - public Vector2 _NormalScrollSpeeds; - } - - internal BufferedData _PerCascadeInstanceData; internal int BufferSize { get; private set; } internal float MaximumWavelength(int slice) { - var maximumDiameter = 4f * Scale * Mathf.Pow(2f, slice); + return MaximumWavelength(CalcLodScale(slice)); + } + + internal float MaximumWavelength(float scale) + { + var maximumDiameter = 4f * scale; // TODO: Do we need to pass in resolution? Could resolution mismatch with animated // and dynamic waves be an issue? var maximumTexelSize = maximumDiameter / LodResolution; @@ -453,11 +480,11 @@ namespace WaveHarmonic.Crest /// /// Could the water horizontal scale increase (for e.g. if the viewpoint gains altitude). Will be false if water already at maximum scale. /// - internal bool ScaleCouldIncrease => _ScaleRange.y < Mathf.Infinity || Root.localScale.x < _ScaleRange.y * 0.99f; + internal bool ScaleCouldIncrease => _ScaleRange.y == Mathf.Infinity || Scale < _ScaleRange.y * 0.99f; /// /// Could the water horizontal scale decrease (for e.g. if the viewpoint drops in altitude). Will be false if water already at minimum scale. /// - internal bool ScaleCouldDecrease => Root.localScale.x > _ScaleRange.x * 1.01f; + internal bool ScaleCouldDecrease => Scale > _ScaleRange.x * 1.01f; internal int ScaleDifferencePower2 { get; private set; } @@ -517,15 +544,30 @@ namespace WaveHarmonic.Crest { base.Initialize(); + _SetUpFor = RenderPipelineHelper.RenderPipeline; + _IsFirstFrameSinceEnabled = true; _ViewCameraCached = Viewer; + // Recompiled in play mode. + if (_Mask == null) + { + _Initialized = false; + } + if (_Initialized) { Enable(); return; } + Utility.RTHandles.Initialize(); + + _Mask = MaskRenderer.Instantiate(this); + + Meniscus.Initialize(this); + + Surface._Water = this; _Reflections._Water = this; _Reflections._UnderWater = _Underwater; _Underwater._Water = this; @@ -581,7 +623,7 @@ namespace WaveHarmonic.Crest SimulationBuffer ??= new() { - name = "Crest.LodData", + name = k_DrawLodData, }; Container = new() @@ -611,42 +653,16 @@ namespace WaveHarmonic.Crest BufferSize = Mathf.Max(BufferSize, simulation.BufferCount); } - - _PerCascadeInstanceData = new(BufferSize, () => new PerCascadeInstanceData[Lod.k_MaximumSlices]); - // The extra LOD accounts for reading off the cascade (eg CurrentIndex + LodChange + 1). _CascadeData = new(BufferSize, () => new Vector4[Lod.k_MaximumSlices + 1]); _ProjectionMatrix = new Matrix4x4[LodLevels]; - // Resolution is 4 tiles across. - var baseMeshDensity = _Resolution * 0.25f / _GeometryDownSampleFactor; - // 0.4f is the "best" value when base mesh density is 8. Scaling down from there produces results similar to - // hand crafted values which looked good when the water is flat. - _LodAlphaBlackPointFade = 0.4f / (baseMeshDensity / 8f); - // We could calculate this in the shader, but we can save two subtractions this way. - _LodAlphaBlackPointWhitePointFade = 1f - _LodAlphaBlackPointFade - _LodAlphaBlackPointFade; - -#if CREST_DEBUG - if (_Debug._DisableChunks) - { - Root = new GameObject("Root").transform; - } - else -#endif - { - Root = WaterBuilder.GenerateMesh(this, Chunks, _Resolution, _GeometryDownSampleFactor, _Slices); - } - - Root.SetParent(Container.transform, worldPositionStays: false); - if (Application.isPlaying && _Debug._AttachDebugGUI && !TryGetComponent(out _)) { gameObject.AddComponent().hideFlags = HideFlags.DontSave; } - _CanSkipCulling = false; - _GeneratedSettingsHash = CalculateSettingsHash(); // Prevent MVs from popping on first frame. @@ -656,13 +672,20 @@ namespace WaveHarmonic.Crest LateUpdateScale(); } -#if UNITY_6000_0_OR_NEWER - // Set up motion vector material. - if (RenderPipelineHelper.IsUniversal && WriteMotionVectors && _Material != null) + WritePerFrameMaterialParams(); + + if (Surface.Enabled) { - SetUpMotionVectorsMaterial(); + Surface.Initialize(); + } + + foreach (var body in WaterBody.WaterBodies) + { + if (body._Material != null) + { + Surface.UpdateMaterial(body._Material, ref body._MotionVectorMaterial); + } } -#endif Enable(); _Initialized = true; @@ -719,6 +742,19 @@ namespace WaveHarmonic.Crest { base.Enable(); +#if UNITY_EDITOR + EditorTime = Time.time; + EditorDeltaTime = 0; + + EditorApplication.update -= EditorUpdate; + EditorApplication.update += EditorUpdate; +#endif + + // Needs to be first or will get assertions etc. Unity bug likely. + RenderPipelineManager.activeRenderPipelineTypeChanged -= OnActiveRenderPipelineTypeChanged; + RenderPipelineManager.activeRenderPipelineTypeChanged += OnActiveRenderPipelineTypeChanged; + + // Needs to run even without graphics to initialize provider. foreach (var simulation in Simulations) { simulation.SetGlobals(enable: true); @@ -726,14 +762,17 @@ namespace WaveHarmonic.Crest simulation.Enable(); } + if (IsRunningWithoutGraphics) + { + // We need nothing from here on. + return; + } + #if d_WaveHarmonic_Crest_ShiftingOrigin ShiftingOrigin.OnShift -= OnOriginShift; ShiftingOrigin.OnShift += OnOriginShift; #endif - // Needs to be first or will get assertions etc. Unity bug likely. - RenderPipelineManager.activeRenderPipelineTypeChanged -= OnActiveRenderPipelineTypeChanged; - RenderPipelineManager.activeRenderPipelineTypeChanged += OnActiveRenderPipelineTypeChanged; RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering; RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering; RenderPipelineManager.endCameraRendering -= OnEndCameraRendering; @@ -743,30 +782,64 @@ namespace WaveHarmonic.Crest // when using scene filtering. if (RenderPipelineHelper.IsLegacy) { - Camera.onPreCull -= OnPreRenderCamera; - Camera.onPreCull += OnPreRenderCamera; - Camera.onPostRender -= OnPostRenderCamera; - Camera.onPostRender += OnPostRenderCamera; + Camera.onPreCull -= OnBeginCameraRendering; + Camera.onPreCull += OnBeginCameraRendering; + Camera.onPostRender -= OnEndCameraRendering; + Camera.onPostRender += OnEndCameraRendering; } + #if d_UnityURP - else if (RenderPipelineHelper.IsUniversal) + if (RenderPipelineHelper.IsUniversal) { - ConfigureUniversalRenderer.Enable(this); - UniversalCopyWaterSurfaceDepth.Enable(this); + // Always enable as it sets requirements. + SurfaceRenderer.WaterSurfaceRenderPass.Enable(this); } #endif +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + if (RenderBeforeTransparency) + { + SurfaceRenderer.WaterSurfaceCustomPass.Enable(this); + } + + CrestInternalCopyToTextureCustomPass.Enable(this); + } + #if UNITY_EDITOR - EnableWaterLevelDepthTexture(); + if (RenderPipelineHelper.IsHighDefinition) + { + RenderPipelineManager.beginContextRendering -= OnBeginContextRendering; + RenderPipelineManager.beginContextRendering += OnBeginContextRendering; + } +#endif #endif Container.SetActive(true); + _Mask.Enable(); + if (_Underwater._Enabled) { _Underwater.OnEnable(); } + if (Meniscus.Enabled) + { + Meniscus.Enable(); + } + +#if d_UnityURP + if (RenderPipelineHelper.IsUniversal) + { + if (WriteToColorTexture || WriteToDepthTexture) + { + CopyTargetsRenderPass.Enable(this); + } + } +#endif + #if d_CrestPortals if (_Portals._Enabled) { @@ -778,123 +851,217 @@ namespace WaveHarmonic.Crest { _Reflections.OnEnable(); } - -#if UNITY_EDITOR - EditorApplication.update -= EditorUpdate; - EditorApplication.update += EditorUpdate; -#endif } - internal ScriptableRenderContext _Context; - - void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) - { -#if UNITY_EDITOR - UpdateLastActiveSceneCamera(camera); -#endif - - _Context = context; - - OnBeginCameraRendering(camera); - } + // Because we cannot pass null when using built-in render pipeline. + // Being a struct there should not be any side effects. + internal ScriptableRenderContext _Context = new(); void OnBeginCameraRendering(Camera camera) { - if (_Underwater._Enabled) - { - _Underwater.OnBeforeCameraRender(camera); - } - -#if d_UnityHDRP - // This use to be in OnBeginContextRendering with comment: - // "Most compatible with lighting options if computed here" - // Cannot remember what that meant… - if (RenderPipelineHelper.IsHighDefinition) - { - var lightDirection = Vector3.zero; - var lightIntensity = Color.black; - var sun = PrimaryLight; - - if (sun != null && sun.isActiveAndEnabled && sun.TryGetComponent(out var data)) - { - lightDirection = -sun.transform.forward; - lightIntensity = Color.clear; - - // It was reported that Light.intensity causes flickering when updated with - // HDAdditionalLightData.SetIntensity, unless we get intensity from there. - { - // Adapted from Helpers.FinalColor. - var light = data; - var linear = GraphicsSettings.lightsUseLinearIntensity; - var color = linear ? light.color.linear : light.color; -#if UNITY_6000_0_OR_NEWER - color *= sun.intensity; -#else - color *= light.intensity; -#endif - if (linear && light.useColorTemperature) color *= Mathf.CorrelatedColorTemperatureToRGB(sun.colorTemperature); - if (!linear) color = color.MaybeLinear(); - lightIntensity = linear ? color.MaybeGamma() : color; - } - - // Transmittance is for Physically Based Sky. - var hdCamera = HDCamera.GetOrCreate(camera); - var settings = SkyManager.GetSkySetting(hdCamera.volumeStack); - var transmittance = settings != null - ? settings.EvaluateAtmosphericAttenuation(lightDirection, hdCamera.camera.transform.position) - : Vector3.one; - - lightIntensity *= transmittance.x; - lightIntensity *= transmittance.y; - lightIntensity *= transmittance.z; - } - - Shader.SetGlobalVector(ShaderIDs.s_PrimaryLightDirection, lightDirection); - Shader.SetGlobalVector(ShaderIDs.s_PrimaryLightIntensity, lightIntensity); - } -#endif - - if (_Reflections._Enabled) - { - _Reflections.OnPreRenderCamera(camera); - } - - if (!Helpers.MaskIncludesLayer(camera.cullingMask, Layer)) + if (_SetUpFor != RenderPipelineHelper.RenderPipeline) { return; } - var viewpoint = camera.transform.position; - _SampleHeightHelperPerCamera.SampleHeight(System.HashCode.Combine(GetHashCode(), camera.GetHashCode()), viewpoint, out var height, allowMultipleCallsPerFrame: true); - _ViewerHeightAboveWaterPerCamera = viewpoint.y - height; + if (!_Initialized || _IsFirstFrameSinceEnabled) + { + return; + } - WritePerCameraMaterialParameters(); + Utility.RTHandles.OnBeginCameraRendering(camera); + + OnBeginCameraRendering(_Context, camera); } - void OnEndCameraRendering(ScriptableRenderContext context, Camera camera) + // OnBeginCameraRendering or OnPreCull + void OnBeginCameraRendering(ScriptableRenderContext context, Camera camera) { - OnEndCameraRendering(camera); + // Guard against being called before the RP change events are raised. + if (_SetUpFor != RenderPipelineHelper.RenderPipeline) + { + return; + } + + if (!_Initialized || _IsFirstFrameSinceEnabled) + { + return; + } + +#if UNITY_EDITOR + UpdateLastActiveSceneCamera(camera); +#endif + + if (!ShouldRender(camera)) + { + return; + } + + var noSurface = !Surface.Enabled || !Helpers.MaskIncludesLayer(camera.cullingMask, Surface.Layer); + var noVolume = !Underwater.Enabled || !Helpers.MaskIncludesLayer(camera.cullingMask, Underwater.Layer); + + // Nothing to render to this camera. + if (noSurface && noVolume) + { + return; + } + + // Must render first so that we do not overwrite work below for game camera. + // Reflections only make sense with an active surface. + if (_Reflections._Enabled && Surface.Enabled) + { + _Reflections.OnBeginCameraRendering(context, camera); + } + + if (_Mask.Enabled) + { + _Mask.OnBeginCameraRendering(camera); + } + + // Water lighting etc. +#if d_UnityHDRP + if (RenderPipelineHelper.IsHighDefinition) + { + UpdateHighDefinitionLighting(camera); + } + else +#endif + + if (RenderPipelineHelper.IsLegacy) + { + OnBeginCameraRenderingLegacy(camera); + } + + // Always execute before surface, as order is only important when rendering volume + // before surface. + if (Underwater._Enabled) + { + Underwater.OnBeginCameraRendering(context, camera); + } + +#if d_CrestPortals + // Call between volume and surface. Sets water line uniforms. + if (Portals.Enabled) + { + Portals.OnBeginCameraRendering(camera); + } +#endif + + if (Surface.Enabled) + { + Surface.OnBeginCameraRendering(context, camera); + } + +#if d_UnityURP + // Always execute after surface. + if (RenderPipelineHelper.IsUniversal) + { + CopyTargetsRenderPass.Instance?.OnBeginCameraRendering(context, camera); + } + else +#endif + + if (RenderPipelineHelper.IsLegacy) + { + OnLegacyCopyPass(camera); + } + + // Execute after copy pass in case refraction. + if (Meniscus.Enabled) + { + Meniscus.Renderer.OnBeginCameraRendering(camera); + } + + if (_ShadowLod.Enabled) + { + _ShadowLod.OnBeginCameraRendering(context, camera); + } } void OnEndCameraRendering(Camera camera) { - if (_Underwater._Enabled) + OnEndCameraRendering(_Context, camera); + } + + void OnEndCameraRendering(ScriptableRenderContext context, Camera camera) + { + _DonePerCameraHeight = false; + +#if d_UnityHDRP + _DoneHighDefinitionLighting = false; +#endif + + if (RenderPipelineHelper.IsLegacy) { - _Underwater.OnAfterCameraRender(camera); + OnEndCameraRenderingLegacy(camera); + } + + if (_Mask.Enabled) + { + _Mask.OnEndCameraRendering(camera); + } + + if (Meniscus.Enabled) + { + Meniscus.Renderer.OnEndCameraRendering(camera); + } + + if (Underwater._Enabled) + { + Underwater.OnEndCameraRendering(camera); + } + + if (Surface.Enabled) + { + Surface.OnEndCameraRendering(camera); } if (_Reflections._Enabled) { - _Reflections.OnAfterCameraRender(camera); + _Reflections.OnEndCameraRendering(camera); } + + if (_ShadowLod.Enabled) + { + _ShadowLod.OnEndCameraRendering(camera); + } + +#if d_CrestPortals + if (_Portals.Enabled) + { + _Portals.OnEndCameraRendering(camera); + } +#endif + } + + internal void UpdatePerCameraHeight(Camera camera) + { + if (_DonePerCameraHeight) + { + return; + } + + // This will be 1-frame behind. + var viewpoint = camera.transform.position; + _SampleHeightHelperPerCamera.SampleHeight(System.HashCode.Combine(GetHashCode(), camera.GetHashCode()), viewpoint, out var height, allowMultipleCallsPerFrame: true); + _ViewerHeightAboveWaterPerCamera = viewpoint.y - height; + + _DonePerCameraHeight = true; } void OnActiveRenderPipelineTypeChanged() { + _Mask?.Destroy(); + _Mask = MaskRenderer.Instantiate(this); + + Meniscus.OnActiveRenderPipelineTypeChanged(); + if (isActiveAndEnabled) { + // Must destroy as there is still some state left like buffer count. Disable(); - Enable(); + Destroy(); + Initialize(); } } @@ -946,33 +1113,18 @@ namespace WaveHarmonic.Crest var settingsHash = Hash.CreateHash(); // Add all the settings that require rebuilding.. - Hash.AddInt(_Layer, ref settingsHash); Hash.AddInt(_Resolution, ref settingsHash); - Hash.AddInt(_GeometryDownSampleFactor, ref settingsHash); Hash.AddInt(_Slices, ref settingsHash); - Hash.AddFloat(_ExtentsSizeMultiplier, ref settingsHash); - Hash.AddBool(AllowRenderQueueSorting, ref settingsHash); - Hash.AddBool(CastShadows, ref settingsHash); Hash.AddBool(WriteMotionVectors, ref settingsHash); - Hash.AddBool(_Debug._ForceBatchMode, ref settingsHash); Hash.AddBool(_Debug._ForceNoGraphics, ref settingsHash); Hash.AddBool(_Debug._ShowHiddenObjects, ref settingsHash); -#if CREST_DEBUG - Hash.AddBool(_Debug._DisableChunks, ref settingsHash); - Hash.AddBool(_Debug._DisableSkirt, ref settingsHash); - Hash.AddBool(_Debug._UniformTiles, ref settingsHash); -#endif - if (_ChunkTemplate != null) - { - Hash.AddObject(_ChunkTemplate, ref settingsHash); - } return settingsHash; } void RunUpdate() { - UnityEngine.Profiling.Profiler.BeginSample("Crest.WaterRenderer.RunUpdate"); + s_RunUpdateMarker.Begin(this); // Rebuild if needed. Needs to run in builds (for MVs at the very least). if (CalculateSettingsHash() != _GeneratedSettingsHash) @@ -980,87 +1132,73 @@ namespace WaveHarmonic.Crest Rebuild(); } - _ViewCameraCached = Viewer; - - // Reset displacement reporting values. - // This is written to in Update, and read in LateUpdate (chunk) and LateUpdateScale. - MaximumHorizontalDisplacement = MaximumVerticalDisplacement = _MaximumVerticalDisplacementFromWaves = 0f; - - BroadcastUpdate(); - - if (!_Debug._DisableFollowViewpoint && _ViewCameraCached != null) + if (RunningWithoutGraphics) { - LateUpdatePosition(); - LateUpdateViewerHeight(); - LateUpdateScale(); + // All we need for servers. + BroadcastUpdate(); + Position = new(0f, transform.position.y, 0f); + base.LateUpdate(); } - - // Set global shader params - Shader.SetGlobalFloat(ShaderIDs.s_Time, CurrentTime); - Shader.SetGlobalFloat(ShaderIDs.s_LodCount, LodLevels); - Shader.SetGlobalFloat(ShaderIDs.s_LodAlphaBlackPointFade, _LodAlphaBlackPointFade); - Shader.SetGlobalFloat(ShaderIDs.s_LodAlphaBlackPointWhitePointFade, _LodAlphaBlackPointWhitePointFade); - - // HDRP will automatically disable this pass for the water shader for unknown reasons. It might be that we - // are sampling from the depth texture does not work with shadow casting. - if (RenderPipelineHelper.IsHighDefinition && Material != null) + else { - Material.SetShaderPassEnabled("ShadowCaster", CastShadows); - } + _ViewCameraCached = Viewer; -#if UNITY_6000_0_OR_NEWER - // Motion Vectors (URP). Shader Graph introduced the necessary toggle in U6. - if (Application.isPlaying && RenderPipelineHelper.IsUniversal && WriteMotionVectors && _Material != null) - { - if (_MotionVectorsMaterial.shader != _Material.shader) + // Reset displacement reporting values. + // This is written to in Update, and read in LateUpdate (chunk) and LateUpdateScale. + MaximumHorizontalDisplacement = MaximumVerticalDisplacement = _MaximumVerticalDisplacementFromWaves = 0f; + + BroadcastUpdate(); + + if (!_Debug._DisableFollowViewpoint && _ViewCameraCached != null) { - SetUpMotionVectorsMaterial(); + LateUpdatePosition(); + LateUpdateViewerHeight(); + LateUpdateScale(); + } + else + { + Position = new(0f, transform.position.y, 0f); } - _MotionVectorsMaterial.CopyMatchingPropertiesFromMaterial(_Material); - _MotionVectorsMaterial.renderQueue = (int)RenderQueue.Geometry; - _MotionVectorsMaterial.SetOverrideTag("RenderType", "Opaque"); - _MotionVectorsMaterial.SetFloat(ShaderIDs.s_Surface, 0); // SurfaceType.Opaque - _MotionVectorsMaterial.SetFloat(ShaderIDs.s_SrcBlend, 1); - _MotionVectorsMaterial.SetFloat(ShaderIDs.s_DstBlend, 0); - } -#endif + // Set global shader params + Shader.SetGlobalFloat(ShaderIDs.s_Time, CurrentTime); + Shader.SetGlobalFloat(ShaderIDs.s_LodCount, LodLevels); - // Needs updated transform values like scale. - WritePerFrameMaterialParams(); + // Needs updated transform values like scale. + WritePerFrameMaterialParams(); - SimulationBuffer.Clear(); - - // Construct the command buffer and attach it to the camera so that it will be executed in the render. -#if UNITY_EDITOR - if (Application.isPlaying || !_ShowWaterProxyPlane) -#endif - { - foreach (var simulation in Simulations) + // Construct the command buffer and attach it to the camera so that it will be executed in the render. { - if (!simulation.Enabled) continue; - simulation.BuildCommandBuffer(this, SimulationBuffer); - } + SimulationBuffer.Clear(); - // This will execute at the beginning of the frame before the graphics queue. - Graphics.ExecuteCommandBuffer(SimulationBuffer); + foreach (var simulation in Simulations) + { + if (!simulation.Enabled) continue; + simulation.BuildCommandBuffer(this, SimulationBuffer); + } + + // This will execute at the beginning of the frame before the graphics queue. + Graphics.ExecuteCommandBuffer(SimulationBuffer); + + foreach (var simulation in Simulations) + { + if (!simulation.Enabled) continue; + simulation.AfterExecute(); + } + } base.LateUpdate(); // Call after LateUpdate so chunk bounds are updated. - LateUpdateTiles(); - - if (_Underwater._Enabled) + if (Surface.Enabled) { - _Underwater.LateUpdate(); + Surface.LateUpdate(); } if (_Reflections._Enabled && !_Reflections.SupportsRecursiveRendering) { - _Reflections.LateUpdate(); + _Reflections.LateUpdate(_Context); } - - LastUpdateFrame = FrameCount; } // Run queries at end of update. For CollProviderBakedFFT calling this kicks off @@ -1074,133 +1212,66 @@ namespace WaveHarmonic.Crest _IsFirstFrameSinceEnabled = false; - UnityEngine.Profiling.Profiler.EndSample(); - } - - void WritePerCameraMaterialParameters() - { - if (Material != null) - { - // Override isFrontFace when camera is far enough from the water surface to fix self-intersecting waves. - // Hack - due to SV_IsFrontFace occasionally coming through as true for back faces, - // add a param here that forces water to be in underwater state. I think the root - // cause here might be imprecision or numerical issues at water tile boundaries, although - // i'm not sure why cracks are not visible in this case. - var height = _ViewerHeightAboveWaterPerCamera; - var value = (int)_SurfaceSelfIntersectionFixMode; - - switch (_SurfaceSelfIntersectionFixMode) - { - case SurfaceSelfIntersectionFixMode.On: - value = height < -2f ? 1 : height > 2f ? 2 : 0; - break; - case SurfaceSelfIntersectionFixMode.Automatic: - // Skip for portals as it is possible to see both sides of the surface at any position. - value = Portaled ? 0 : height < -2f ? 1 : height > 2f ? 2 : 0; - break; - } - - Shader.SetGlobalInteger(ShaderIDs.s_ForceUnderwater, value); - } + s_RunUpdateMarker.End(); } void WritePerFrameMaterialParams() { _CascadeData.Flip(); + var current = _CascadeData.Current; + // Update rendering parameters. { - for (var slice = 0; slice < LodLevels; slice++) + var levels = LodLevels; + + for (var slice = 0; slice < levels; slice++) { var scale = CalcLodScale(slice); - _CascadeData.Current[slice].x = scale; - _CascadeData.Current[slice].y = 1f; - _CascadeData.Current[slice].z = MaximumWavelength(slice); + current[slice] = new Vector4(scale, 1f, MaximumWavelength(scale), 0f); _ProjectionMatrix[slice] = Matrix4x4.Ortho(-2f * scale, 2f * scale, -2f * scale, 2f * scale, 1f, k_RenderAboveSeaLevel + k_RenderBelowSeaLevel); if (slice == 0) Shader.SetGlobalFloat(ShaderIDs.s_Scale, scale); } // Duplicate last element so that things can safely read off the end of the cascades - _CascadeData.Current[LodLevels] = _CascadeData.Current[LodLevels - 1]; - _CascadeData.Current[LodLevels].y = 0f; + current[levels] = current[levels - 1].XNZW(0f); } - Shader.SetGlobalVectorArray(ShaderIDs.s_CascadeData, _CascadeData.Current); + Shader.SetGlobalVectorArray(ShaderIDs.s_CascadeData, current); Shader.SetGlobalVectorArray(ShaderIDs.s_CascadeDataSource, _CascadeData.Previous(1)); - - _PerCascadeInstanceData.Flip(); - WritePerCascadeInstanceData(_PerCascadeInstanceData); } - void WritePerCascadeInstanceData(BufferedData instanceData) - { - for (var lodIdx = 0; lodIdx < LodLevels; lodIdx++) - { - // blend LOD 0 shape in/out to avoid pop, if the water might scale up later (it is smaller than its maximum scale) - var needToBlendOutShape = lodIdx == 0 && ScaleCouldIncrease; - instanceData.Current[lodIdx]._MeshScaleLerp = needToBlendOutShape ? ViewerAltitudeLevelAlpha : 0f; - - // blend furthest normals scale in/out to avoid pop, if scale could reduce - var needToBlendOutNormals = lodIdx == LodLevels - 1 && ScaleCouldDecrease; - instanceData.Current[lodIdx]._FarNormalsWeight = needToBlendOutNormals ? ViewerAltitudeLevelAlpha : 1f; - - // geometry data - // compute grid size of geometry. take the long way to get there - make sure we land exactly on a power of two - // and not inherit any of the lossy-ness from lossyScale. - var scale = CalcLodScale(lodIdx); - instanceData.Current[lodIdx]._GeometryGridWidth = scale / (0.25f * _Resolution / _GeometryDownSampleFactor); - - var mul = 1.875f; // fudge 1 - var pow = 1.4f; // fudge 2 - var texelWidth = instanceData.Current[lodIdx]._GeometryGridWidth / _GeometryDownSampleFactor; - instanceData.Current[lodIdx]._NormalScrollSpeeds[0] = Mathf.Pow(Mathf.Log(1f + 2f * texelWidth) * mul, pow); - instanceData.Current[lodIdx]._NormalScrollSpeeds[1] = Mathf.Pow(Mathf.Log(1f + 4f * texelWidth) * mul, pow); - } - } - -#if UNITY_6000_0_OR_NEWER - void SetUpMotionVectorsMaterial() - { - if (_MotionVectorsMaterial != null) Helpers.Destroy(_MotionVectorsMaterial); - _MotionVectorsMaterial = CoreUtils.CreateEngineMaterial(_Material.shader); - _MotionVectorsMaterial.SetShaderPassEnabled("UniversalForward", false); - _MotionVectorsMaterial.SetShaderPassEnabled("UniversalGBuffer", false); - _MotionVectorsMaterial.SetShaderPassEnabled("ShadowCaster", false); - _MotionVectorsMaterial.SetShaderPassEnabled("DepthOnly", false); - _MotionVectorsMaterial.SetShaderPassEnabled("DepthNormals", false); - _MotionVectorsMaterial.SetShaderPassEnabled("Meta", false); - _MotionVectorsMaterial.SetShaderPassEnabled("SceneSelectionPass", false); - _MotionVectorsMaterial.SetShaderPassEnabled("Picking", false); - _MotionVectorsMaterial.SetShaderPassEnabled("Universal2D", false); - _MotionVectorsMaterial.SetShaderPassEnabled("MotionVectors", true); - } -#endif - void LateUpdatePosition() { - var pos = Viewpoint.position; + var position = Viewpoint.position; + + // This will cause artifacts in motion vectors debug view, but are likely negligible. + if (_CenterOfDetailDisplacementCorrection && _CenterOfDetailDisplacementCorrectionHelper.SampleDisplacement(position, out var displacement)) + { + position = new(position.x - displacement.x, position.y, position.z - displacement.z); + } // maintain y coordinate - sea level - pos.y = Root.position.y; + position.y = transform.position.y; // Don't land very close to regular positions where things are likely to snap to, because different tiles might // land on either side of a snap boundary due to numerical error and snap to the wrong positions. Nudge away from // common by using increments of 1/60 which have lots of factors. // :WaterGridPrecisionErrors - if (Mathf.Abs(pos.x * 60f - Mathf.Round(pos.x * 60f)) < 0.001f) + if (Mathf.Abs(position.x * 60f - Mathf.Round(position.x * 60f)) < 0.001f) { - pos.x += 0.002f; + position.x += 0.002f; } - if (Mathf.Abs(pos.z * 60f - Mathf.Round(pos.z * 60f)) < 0.001f) + if (Mathf.Abs(position.z * 60f - Mathf.Round(position.z * 60f)) < 0.001f) { - pos.z += 0.002f; + position.z += 0.002f; } - Shader.SetGlobalVector(ShaderIDs.s_CenterDelta, pos - Root.position); + Shader.SetGlobalVector(ShaderIDs.s_CenterDelta, (position - Position).XZ()); - Root.position = pos; - Shader.SetGlobalVector(ShaderIDs.s_Center, Root.position); + Position = position; + Shader.SetGlobalVector(ShaderIDs.s_Center, Position); } void LateUpdateScale() @@ -1242,7 +1313,7 @@ namespace WaveHarmonic.Crest if (ratio != 1f) { EditorApplication.isPaused = EditorApplication.isPaused || _Debug._PauseOnScaleChange; - if (_Debug._LogScaleChange) Debug.Log($"Scale Change: {newScale} / {Scale} = {ratio}"); + if (_Debug._LogScaleChange) Debug.Log($"Scale Change: {newScale} / {Scale} = {ratio}. LOD Change: {ScaleDifferencePower2}"); } #endif #endif @@ -1250,8 +1321,6 @@ namespace WaveHarmonic.Crest Scale = newScale; - Root.localScale = new(Scale, 1f, Scale); - // LOD 0 is blended in/out when scale changes, to eliminate pops. Here we set it as // a global, whereas in WaterChunkRenderer it is applied to LOD0 tiles only through // instance data. This global can be used in compute, where we only apply this @@ -1276,6 +1345,7 @@ namespace WaveHarmonic.Crest ViewerHeightAboveWater = viewer.position.y - waterHeight; } +#if d_Unity_Terrain // Also use terrain height for scale. Viewpoint is absolute if set. if (_SampleTerrainHeightForScale && LevelLod.Enabled && _Viewpoint == null) { @@ -1301,6 +1371,7 @@ namespace WaveHarmonic.Crest viewerHeightAboveWaterOrTerrain = viewerHeightAboveTerrain; } } +#endif // d_Unity_Terrain // Calculate teleport distance and create window for height queries to return a height change. { @@ -1351,90 +1422,6 @@ namespace WaveHarmonic.Crest ViewerDistanceToShoreline = distance; } - void LateUpdateTiles() - { - var canSkipCulling = WaterBody.WaterBodies.Count == 0 && _CanSkipCulling; - - foreach (var tile in Chunks) - { - if (tile.Rend == null) - { - continue; - } - - tile._Culled = false; - tile.MaterialOverridden = false; - - // If there are local bodies of water, this will do overlap tests between the water tiles - // and the water bodies and turn off any that don't overlap. - if (!canSkipCulling) - { - var chunkBounds = tile.Rend.bounds; - var chunkUndisplacedBoundsXZ = tile.UnexpandedBoundsXZ; - - var largestOverlap = 0f; - var overlappingOne = false; - foreach (var body in WaterBody.WaterBodies) - { - // If tile has already been excluded from culling, then skip this iteration. But finish this - // iteration if the water body has a material override to work out most influential water body. - if (overlappingOne && body.AboveSurfaceMaterial == null) - { - continue; - } - - var bounds = body.AABB; - - var overlapping = - bounds.max.x > chunkBounds.min.x && bounds.min.x < chunkBounds.max.x && - bounds.max.z > chunkBounds.min.z && bounds.min.z < chunkBounds.max.z; - if (overlapping) - { - overlappingOne = true; - - if (body.AboveSurfaceMaterial != null) - { - var overlap = 0f; - { - // Use the unexpanded bounds to prevent leaking as generally this feature will be - // for an inland body of water where hopefully there is attenuation between it and - // the water to handle the water's displacement. The inland water body will unlikely - // have large displacement but can be mitigated with a decent buffer zone. - var xMin = Mathf.Max(bounds.min.x, chunkUndisplacedBoundsXZ.min.x); - var xMax = Mathf.Min(bounds.max.x, chunkUndisplacedBoundsXZ.max.x); - var zMin = Mathf.Max(bounds.min.z, chunkUndisplacedBoundsXZ.min.y); - var zMax = Mathf.Min(bounds.max.z, chunkUndisplacedBoundsXZ.max.y); - if (xMin < xMax && zMin < zMax) - { - overlap = (xMax - xMin) * (zMax - zMin); - } - } - - // If this water body has the most overlap, then the chunk will get its material. - if (overlap > largestOverlap) - { - tile.Rend.sharedMaterial = body.AboveSurfaceMaterial; - tile.MaterialOverridden = true; - largestOverlap = overlap; - } - } - else - { - tile.MaterialOverridden = false; - } - } - } - - tile._Culled = _WaterBodyCulling && !overlappingOne && WaterBody.WaterBodies.Count > 0; - } - - tile.Rend.enabled = !tile._Culled; - } - - // Can skip culling next time around if water body count stays at 0 - _CanSkipCulling = WaterBody.WaterBodies.Count == 0; - } - void Destroy() { foreach (var simulation in Simulations) @@ -1444,16 +1431,17 @@ namespace WaveHarmonic.Crest } Simulations.Clear(); + _Mask?.Destroy(); + + Meniscus.Destroy(); + // Clean up modules. #if d_CrestPortals _Portals.OnDestroy(); #endif _Underwater.OnDestroy(); _Reflections.OnDestroy(); - - // Clean up everything created through the Water Builder. - WaterBuilder.CleanUp(this); - Root = null; + Surface.OnDestroy(); if (Container) { @@ -1461,12 +1449,6 @@ namespace WaveHarmonic.Crest Container = null; } - Chunks.Clear(); - -#if UNITY_6000_0_OR_NEWER - Helpers.Destroy(_MotionVectorsMaterial); -#endif - _Initialized = false; } @@ -1482,19 +1464,22 @@ namespace WaveHarmonic.Crest if (RenderPipelineHelper.IsLegacy && Viewer != null) { // Need to call to prevent crash. - OnPostRenderCamera(Viewer); + OnEndCameraRenderingLegacy(Viewer); } #if UNITY_EDITOR EditorApplication.update -= EditorUpdate; #endif - Camera.onPreCull -= OnPreRenderCamera; - Camera.onPostRender -= OnPostRenderCamera; + Camera.onPreCull -= OnBeginCameraRendering; + Camera.onPostRender -= OnEndCameraRendering; -#if d_UnityURP - ConfigureUniversalRenderer.Disable(); - UniversalCopyWaterSurfaceDepth.Disable(); +#if d_UnityHDRP + SurfaceRenderer.WaterSurfaceCustomPass.Disable(); + CrestInternalCopyToTextureCustomPass.Disable(); +#if UNITY_EDITOR + RenderPipelineManager.beginContextRendering -= OnBeginContextRendering; +#endif #endif #if d_WaveHarmonic_Crest_ShiftingOrigin @@ -1505,15 +1490,18 @@ namespace WaveHarmonic.Crest RenderPipelineManager.endCameraRendering -= OnEndCameraRendering; RenderPipelineManager.activeRenderPipelineTypeChanged -= OnActiveRenderPipelineTypeChanged; + _Mask?.Disable(); + #if d_CrestPortals if (_Portals._Enabled) _Portals.OnDisable(); #endif if (_Underwater._Enabled) _Underwater.OnDisable(); if (_Reflections._Enabled) _Reflections.OnDisable(); -#if UNITY_EDITOR - DisableWaterLevelDepthTexture(); -#endif + if (Meniscus.Enabled) + { + Meniscus.Disable(); + } if (Container != null) { @@ -1523,6 +1511,7 @@ namespace WaveHarmonic.Crest base.Disable(); } +#if d_WaveHarmonic_Crest_ShiftingOrigin /// /// Notify water of origin shift /// @@ -1534,6 +1523,7 @@ namespace WaveHarmonic.Crest simulation.SetOrigin(newOrigin); } } +#endif /// /// Clears persistent LOD data. Some simulations have persistent data which can linger for a little while after diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterResources.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterResources.cs index db46dce27..b70d64458 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterResources.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaterResources.cs @@ -33,7 +33,9 @@ namespace WaveHarmonic.Crest public Shader _UnderwaterEffect; public Shader _UnderwaterMask; + public Shader _HorizonMask; public Shader _Portals; + public Shader _PortalsMask; public Shader _ClipConvexHull; @@ -41,11 +43,15 @@ namespace WaveHarmonic.Crest public Shader _DebugTextureArray; public Shader _Blit; + + public Shader _ForceShadows; + public Shader _CaptureShadowMatrices; } [Serializable] public sealed class ComputeResources { + public ComputeShader _Mask; public ComputeShader _UnderwaterArtifacts; public ComputeShader _ShapeWavesTransfer; @@ -60,6 +66,7 @@ namespace WaveHarmonic.Crest public ComputeShader _ShorelineColor; public ComputeShader _UpdateDynamicWaves; public ComputeShader _UpdateFoam; + public ComputeShader _UpdateShadow; public ComputeShader _PackLevel; public ComputeShader _AbsorptionTexture; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Watercraft/Controller.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Watercraft/Controller.cs index ef9ad0f66..1d79d38c4 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Watercraft/Controller.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Watercraft/Controller.cs @@ -70,7 +70,7 @@ namespace WaveHarmonic.Crest.Watercraft { if (!_FloatingObject.InWater) return; - UnityEngine.Profiling.Profiler.BeginSample("WaveHarmonic.Crest.Watercraft.Controller.FixedUpdate"); + UnityEngine.Profiling.Profiler.BeginSample("Crest.Watercraft.Controller.FixedUpdate"); var input = _Control.Input; var rb = _FloatingObject.RigidBody; diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaveHarmonic.Crest.asmdef b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaveHarmonic.Crest.asmdef index 1c2fcf618..1ac204578 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/WaveHarmonic.Crest.asmdef +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/WaveHarmonic.Crest.asmdef @@ -26,6 +26,11 @@ "expression": "", "define": "d_ModuleUnityDirector" }, + { + "name": "com.unity.modules.terrain", + "expression": "", + "define": "d_Unity_Terrain" + }, { "name": "com.unity.modules.vr", "expression": "", @@ -56,6 +61,11 @@ "expression": "", "define": "d_CrestPaint" }, + { + "name": "com.waveharmonic.crest.cpu-queries", + "expression": "", + "define": "d_WaveHarmonic_Crest_CPUQueries" + }, { "name": "com.waveharmonic.crest.splines", "expression": "", diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/FFTCompute.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/FFTCompute.cs index a7a950da1..10ce19661 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/FFTCompute.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/FFTCompute.cs @@ -85,8 +85,9 @@ namespace WaveHarmonic.Crest public readonly float _WindDirectionRadians; public readonly float _WindTurbulence; public readonly float _WindAlignment; + public readonly float _Gravity; - public Parameters(WaveSpectrum spectrum, int resolution, float period, float speed, float direction, float turbulence, float alignment) + public Parameters(WaveSpectrum spectrum, int resolution, float period, float speed, float direction, float turbulence, float alignment, float gravity) { _Spectrum = spectrum; _Resolution = resolution; @@ -95,17 +96,18 @@ namespace WaveHarmonic.Crest _WindDirectionRadians = direction; _WindTurbulence = turbulence; _WindAlignment = alignment; + _Gravity = gravity; } // Implement custom or incur allocations. public override int GetHashCode() { - return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, _Resolution); + return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, _Gravity, _Resolution); } public int GetHashCode(int resolution) { - return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, resolution); + return System.HashCode.Combine(_Spectrum, _LoopPeriod, _WindSpeed, _WindDirectionRadians, _WindTurbulence, _WindAlignment, _Gravity, resolution); } } @@ -279,7 +281,7 @@ namespace WaveHarmonic.Crest wrapper.SetFloat(ShaderIDs.s_WindSpeed, _Parameters._WindSpeed); wrapper.SetFloat(ShaderIDs.s_Turbulence, _Parameters._WindTurbulence); wrapper.SetFloat(ShaderIDs.s_Alignment, _Parameters._WindAlignment); - wrapper.SetFloat(ShaderIDs.s_Gravity, WaterRenderer.Instance.Gravity); + wrapper.SetFloat(ShaderIDs.s_Gravity, _Parameters._Gravity); wrapper.SetFloat(ShaderIDs.s_Period, period < Mathf.Infinity ? period : -1); wrapper.SetVector(ShaderIDs.s_WindDir, new(Mathf.Cos(_Parameters._WindDirectionRadians), Mathf.Sin(_Parameters._WindDirectionRadians))); wrapper.SetTexture(ShaderIDs.s_SpectrumControls, _Parameters._Spectrum.ControlsTexture); @@ -417,9 +419,9 @@ namespace WaveHarmonic.Crest DebugGUI.DrawTextureArray(WaveBuffers, 8, 0.5f, 20f); } - if (_Parameters._Spectrum != null && _Parameters._Spectrum.ControlsTexture != null) + if (_Parameters._Spectrum != null) { - GUI.DrawTexture(new(0f, 0f, 100f, 10f), _Parameters._Spectrum.ControlsTexture); + _Parameters._Spectrum.OnGUI(); } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/WaveSpectrum.cs b/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/WaveSpectrum.cs index 067e535e6..8943cc586 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/WaveSpectrum.cs +++ b/Packages/com.waveharmonic.crest/Runtime/Scripts/Waves/WaveSpectrum.cs @@ -88,9 +88,10 @@ namespace WaveHarmonic.Crest /// Wavelength in m /// How many waves we're sampling, used to conserve energy for different sampling rates /// Wind speed in m/s + /// Gravity /// The energy of the wave in J /// The amplitude of the wave in m - internal float GetAmplitude(float wavelength, float componentsPerOctave, float windSpeed, out float power) + internal float GetAmplitude(float wavelength, float componentsPerOctave, float windSpeed, float gravity, out float power) { Debug.AssertFormat(wavelength > 0f, this, "Crest: {0} wavelength must be > 0.", nameof(WaveSpectrum)); @@ -121,15 +122,18 @@ namespace WaveHarmonic.Crest var hasNextIndex = nextIndex < _PowerLogarithmicScales.Length; var nextPower = hasNextIndex && !_PowerDisabled[nextIndex] ? _PowerLogarithmicScales[nextIndex] : s_MinimumPowerLog; + // Empirical wind influence based on alpha-beta spectrum that underlies empirical spectra + gravity *= _GravityScale; + // The amplitude calculation follows this nice paper from Frechot: // https://hal.archives-ouvertes.fr/file/index/docid/307938/filename/frechot_realistic_simulation_of_ocean_surface_using_wave_spectra.pdf var wl_lo = Mathf.Pow(2f, Mathf.Floor(wl_pow2)); var k_lo = 2f * Mathf.PI / wl_lo; - var c_lo = ComputeWaveSpeed(wl_lo); + var c_lo = ComputeWaveSpeed(wl_lo, gravity); var omega_lo = k_lo * c_lo; var wl_hi = 2f * wl_lo; var k_hi = 2f * Mathf.PI / wl_hi; - var c_hi = ComputeWaveSpeed(wl_hi); + var c_hi = ComputeWaveSpeed(wl_hi, gravity); var omega_hi = k_hi * c_hi; var domega = (omega_lo - omega_hi) / componentsPerOctave; @@ -141,9 +145,6 @@ namespace WaveHarmonic.Crest power = hasNextIndex ? Mathf.Lerp(thisPower, nextPower, alpha) : thisPower; power = Mathf.Pow(10f, power); - // Empirical wind influence based on alpha-beta spectrum that underlies empirical spectra - var gravity = _GravityScale * WaterRenderer.Instance.Gravity; - // Zero gravity will cause NaNs, and they have always been flat. if (gravity <= 0f) return 0f; @@ -163,11 +164,11 @@ namespace WaveHarmonic.Crest return a * _Multiplier; } - static float ComputeWaveSpeed(float wavelength, float gravityMultiplier = 1f) + static float ComputeWaveSpeed(float wavelength, float gravity, float gravityMultiplier = 1f) { // wave speed of deep sea water waves: https://en.wikipedia.org/wiki/Wind_wave // https://en.wikipedia.org/wiki/Dispersion_(water_waves)#Wave_propagation_and_dispersion - var g = WaterRenderer.Instance.Gravity * gravityMultiplier; + var g = gravity * gravityMultiplier; var k = 2f * Mathf.PI / wavelength; //float h = max(depth, 0.01); //float cp = sqrt(abs(tanh_clamped(h * k)) * g / k); @@ -209,10 +210,8 @@ namespace WaveHarmonic.Crest } // This applies the correct PM spectrum powers, validated against a separate implementation - internal void ApplyPiersonMoskowitzSpectrum() + internal void ApplyPiersonMoskowitzSpectrum(float gravity) { - var gravity = WaterRenderer.Instance != null ? WaterRenderer.Instance.Gravity : Mathf.Abs(Physics.gravity.y); - for (var octave = 0; octave < k_NumberOfOctaves; octave++) { var wl = SmallWavelength(octave); diff --git a/Packages/com.waveharmonic.crest/Runtime/Settings/Resources.asset b/Packages/com.waveharmonic.crest/Runtime/Settings/Resources.asset index 3b2778fd4..bc9c7caa8 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Settings/Resources.asset +++ b/Packages/com.waveharmonic.crest/Runtime/Settings/Resources.asset @@ -24,14 +24,20 @@ MonoBehaviour: _UpdateShadow: {fileID: 4800000, guid: 6195b173b90b246ac9f5300b7e2aa482, type: 3} _UnderwaterEffect: {fileID: 4800000, guid: 034b985bd9c344992af148e26d2cdb24, type: 3} _UnderwaterMask: {fileID: 4800000, guid: edb653e62cc924b99b0a1086ffb39be7, type: 3} + _HorizonMask: {fileID: 4800000, guid: 80a81e5410296461d827cd6eed939b81, type: 3} _Portals: {fileID: 4800000, guid: 370ffa403718b4982a8a3e0101263093, type: 3} + _PortalsMask: {fileID: 4800000, guid: 3e6aaf795e0984bacb7a9fc4785f1f6a, type: 3} _ClipConvexHull: {fileID: 4800000, guid: 1f5d1e029c7564da8855bf97e3b9247a, type: 3} _ShallowWaterSimulationVisualizer: {fileID: 4800000, guid: 613caf76dccc3ea45b0501b731a55ec2, type: 3} _DebugTextureArray: {fileID: 4800000, guid: 9984e3507dd424fd49ce01182989250a, type: 3} _Blit: {fileID: 4800000, guid: b9836aaab4b1f45e4bd4fc4e6bcc7e74, type: 3} + _ForceShadows: {fileID: 4800000, guid: c9f384b6b84e943ed83161cb82d95b2e, type: 3} + _CaptureShadowMatrices: {fileID: 4800000, guid: 17feb724c7e004b4e8e418931db7eff3, + type: 3} _Compute: + _Mask: {fileID: 7200000, guid: 51ffca485396f4d8dbf07883c9303f3c, type: 3} _UnderwaterArtifacts: {fileID: 7200000, guid: 08549c36146ad4899a07193754b21ea2, type: 3} _ShapeWavesTransfer: {fileID: 7200000, guid: 3a487d04e47a14907809657d5ccf1917, @@ -46,6 +52,7 @@ MonoBehaviour: _UpdateDynamicWaves: {fileID: 7200000, guid: 0ba116507793f45b5ba3f016f0837660, type: 3} _UpdateFoam: {fileID: 7200000, guid: 1149a28b1712c464fbc3d96bea0bc34d, type: 3} + _UpdateShadow: {fileID: 7200000, guid: c47c6200534474da18e1134965c102f3, type: 3} _PackLevel: {fileID: 7200000, guid: 62854cc297743429aa087d7708d221c0, type: 3} _AbsorptionTexture: {fileID: 7200000, guid: 82d4c3f5aac084c2bad20d0a31f1168a, type: 3} diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AbsorptionColor.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AbsorptionColor.shader index 9da1693c7..24a4c2446 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AbsorptionColor.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AbsorptionColor.shader @@ -20,10 +20,12 @@ Shader "Crest/Inputs/Absorption/Color" SubShader { + ZTest Always + ZWrite Off + Pass { Blend SrcAlpha OneMinusSrcAlpha - ZWrite Off ColorMask RGB CGPROGRAM diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AlbedoColor.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AlbedoColor.shader index 39980c051..f3dec03a7 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AlbedoColor.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AlbedoColor.shader @@ -19,12 +19,13 @@ Shader "Crest/Inputs/Albedo/Color" } SubShader { + ZTest Always + ZWrite Off + Pass { Blend [_Crest_BlendModeSource] [_Crest_BlendModeTarget] - ZWrite Off - CGPROGRAM #pragma vertex Vertex #pragma fragment Fragment diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesAddFromTexture.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesAddFromTexture.shader index c30c3db99..d82dd9635 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesAddFromTexture.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesAddFromTexture.shader @@ -18,6 +18,8 @@ Shader "Crest/Inputs/Animated Waves/Add From Texture" SubShader { Blend One One + ZTest Always + ZWrite Off Pass { @@ -25,7 +27,7 @@ Shader "Crest/Inputs/Animated Waves/Add From Texture" #pragma vertex Vert #pragma fragment Frag - #pragma shader_feature_local d_HeightsOnly + #pragma shader_feature_local_fragment d_HeightsOnly #include "UnityCG.cginc" diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesRemoveGeometry.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesRemoveGeometry.shader index 245b58a0f..93f42d0cc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesRemoveGeometry.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesRemoveGeometry.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Push water under the geometry. Needs to be rendered into all LODs - set Octave Wave length to 0. @@ -13,6 +13,9 @@ Shader "Crest/Inputs/Animated Waves/Push Water Under Convex Hull" SubShader { + ZTest Always + ZWrite Off + Pass { BlendOp Min diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesSetHeightToGeometry.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesSetHeightToGeometry.shader index 9b7a2653f..b7631f614 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesSetHeightToGeometry.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesSetHeightToGeometry.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // This writes straight into the displacement texture and sets the water height to the y value of the geometry. @@ -16,6 +16,9 @@ Shader "Crest/Inputs/Animated Waves/Set Water Height Using Geometry" SubShader { + ZTest Always + ZWrite Off + Pass { Blend Off diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesWaveParticle.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesWaveParticle.shader index 58787b4dd..d63ae2f5a 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesWaveParticle.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/AnimatedWavesWaveParticle.shader @@ -16,6 +16,9 @@ Shader "Crest/Inputs/Animated Waves/Wave Particle" { Tags { "DisableBatching" = "True" } + ZTest Always + ZWrite Off + Pass { Blend One One diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesAddBump.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesAddBump.shader index b7db88de3..41382e785 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesAddBump.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesAddBump.shader @@ -14,6 +14,9 @@ Shader "Crest/Inputs/Dynamic Waves/Add Bump" SubShader { + ZTest Always + ZWrite Off + Pass { Blend One One diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesDampenCircle.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesDampenCircle.shader index e399baa9a..482554979 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesDampenCircle.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/DynamicWavesDampenCircle.shader @@ -14,6 +14,9 @@ Shader "Crest/Inputs/Dynamic Waves/Dampen Circle" SubShader { + ZTest Always + ZWrite Off + Pass { Blend SrcAlpha OneMinusSrcAlpha diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowAddFromTexture.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowAddFromTexture.shader index 43491ebd7..6976c20c7 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowAddFromTexture.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowAddFromTexture.shader @@ -26,6 +26,8 @@ Shader "Crest/Inputs/Flow/Add From Texture" SubShader { Blend One One + ZTest Always + ZWrite Off Pass { @@ -33,10 +35,10 @@ Shader "Crest/Inputs/Flow/Add From Texture" #pragma vertex Vert #pragma fragment Frag - #pragma shader_feature_local d_FlipX - #pragma shader_feature_local d_FlipZ - #pragma shader_feature_local d_Feather - #pragma shader_feature_local d_NegativeValues + #pragma shader_feature_local_fragment d_FlipX + #pragma shader_feature_local_fragment d_FlipZ + #pragma shader_feature_local_fragment d_Feather + #pragma shader_feature_local_fragment d_NegativeValues #include "UnityCG.cginc" diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowFixedDirection.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowFixedDirection.shader index a5049ebca..55988abb2 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowFixedDirection.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FlowFixedDirection.shader @@ -21,6 +21,9 @@ Shader "Crest/Inputs/Flow/Fixed Direction" SubShader { + ZTest Always + ZWrite Off + Pass { CGPROGRAM @@ -28,7 +31,7 @@ Shader "Crest/Inputs/Flow/Fixed Direction" #pragma fragment Frag #pragma shader_feature_local d_Feather - #pragma shader_feature_local d_ApplyRotation + #pragma shader_feature_local_fragment d_ApplyRotation #include "UnityCG.cginc" diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromTexture.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromTexture.shader index d0c888986..69e9edc19 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromTexture.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromTexture.shader @@ -15,6 +15,8 @@ Shader "Crest/Inputs/Foam/Add From Texture" SubShader { Blend One One + ZTest Always + ZWrite Off Pass { diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromVertexColor.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromVertexColor.shader index 6325f7a5e..602cd3dd8 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromVertexColor.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/FoamAddFromVertexColor.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. Shader "Crest/Inputs/Foam/Add From Vertex Colors" @@ -14,6 +14,8 @@ Shader "Crest/Inputs/Foam/Add From Vertex Colors" SubShader { Blend One One + ZTest Always + ZWrite Off Pass { diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/AbsorptionTexture.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/AbsorptionTexture.compute index a0f1ff939..875c9c10e 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/AbsorptionTexture.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/AbsorptionTexture.compute @@ -18,6 +18,7 @@ RWTexture2DArray _Crest_Target; CBUFFER_START(CrestPerMaterial) int _Crest_Blend; float _Crest_Weight; +float4 _Crest_Multiplier; float2 _Crest_TextureSize; float2 _Crest_TexturePosition; float2 _Crest_TextureRotation; @@ -42,7 +43,7 @@ void Execute(uint3 id) return; } - const half4 source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0); + const half4 source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0) * _Crest_Multiplier; const half3 target = _Crest_Target[id]; weight *= source.a; diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipConvexHull.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipConvexHull.shader index 8e6560bcf..ef5a18bbf 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipConvexHull.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipConvexHull.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Renders convex hull to the clip surface texture. @@ -70,8 +70,9 @@ Shader "Hidden/Crest/Inputs/Clip/Convex Hull" SubShader { - ZWrite Off ColorMask R + ZTest Always + ZWrite Off Pass { diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipTexture.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipTexture.compute index 705ad0a05..3a25bfe9b 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipTexture.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ClipTexture.compute @@ -18,6 +18,7 @@ Texture2D _Crest_Texture; RWTexture2DArray _Crest_Target; CBUFFER_START(CrestPerMaterial) +float _Crest_Multiplier; float2 _Crest_TextureSize; float2 _Crest_TexturePosition; float2 _Crest_TextureRotation; @@ -36,7 +37,7 @@ void Execute(uint3 id) return; } - const float result = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0).x; + const float result = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0).x * _Crest_Multiplier; // Painted clip defines a minimum value of the clip. _Crest_Target[id] = max(_Crest_Target[id], result); diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/DepthTexture.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/DepthTexture.compute index 3abedee1a..e1076e044 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/DepthTexture.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/DepthTexture.compute @@ -29,6 +29,7 @@ Texture2D _Crest_Texture; RWTexture2DArray _Crest_Target; CBUFFER_START(CrestInputTexture) +float2 _Crest_Multiplier; float2 _Crest_TextureSize; float2 _Crest_TexturePosition; float2 _Crest_TextureRotation; @@ -50,7 +51,7 @@ void Execute(uint3 id) } m_CrestType current = _Crest_Target[id]; - m_CrestType result = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0); + m_CrestType result = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0) * _Crest_Multiplier; result.x += _Crest_HeightOffset; // Take highest terrain height. diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FlowTexture.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FlowTexture.compute index 2df0e9fd2..72fe8af50 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FlowTexture.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FlowTexture.compute @@ -20,6 +20,7 @@ RWTexture2DArray _Crest_Target; CBUFFER_START(CrestPerMaterial) int _Crest_Blend; float _Crest_Weight; +float2 _Crest_Multiplier; float2 _Crest_TextureSize; float2 _Crest_TexturePosition; float2 _Crest_TextureRotation; @@ -53,6 +54,8 @@ void Execute(uint3 id) source = source * 2.0 - 1.0; } + source *= _Crest_Multiplier; + if (_Crest_Blend == m_CrestBlendAlpha) { weight *= saturate(length(source)); diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FoamTexture.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FoamTexture.compute index 8c5a66d46..e92268b28 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FoamTexture.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/FoamTexture.compute @@ -20,6 +20,7 @@ RWTexture2DArray _Crest_Target; CBUFFER_START(CrestPerMaterial) int _Crest_Blend; float _Crest_Weight; +float _Crest_Multiplier; float2 _Crest_TextureSize; float2 _Crest_TexturePosition; float2 _Crest_TextureRotation; @@ -45,7 +46,7 @@ void Execute(uint3 id) return; } - const float source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0).x; + const float source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0).x * _Crest_Multiplier; const float target = _Crest_Target[id]; _Crest_Target[id] = Blend(_Crest_Blend, weight, _Crest_SimDeltaTime, source, target); diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/JumpFloodSDF.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/JumpFloodSDF.compute index 16da02205..679d2fa46 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/JumpFloodSDF.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/JumpFloodSDF.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // An implementation of the Jump Flood algorithm by Rong and Tan diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/LevelTexture.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/LevelTexture.compute index e1d328bb0..be546e691 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/LevelTexture.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/LevelTexture.compute @@ -23,6 +23,7 @@ RWTexture2DArray _Crest_Target; CBUFFER_START(CrestPerMaterial) int _Crest_Blend; float _Crest_Weight; +float _Crest_Multiplier; float2 _Crest_TextureSize; float2 _Crest_TexturePosition; float2 _Crest_TextureRotation; @@ -48,10 +49,11 @@ void Execute(uint3 id) } #if d_CatmullRom - const float source = Utility::SampleTextureCatmullRom(_Crest_Texture, LODData_linear_clamp_sampler, uv, _Crest_Resolution).x; + const float source = Utility::SampleTextureCatmullRom(_Crest_Texture, LODData_linear_clamp_sampler, uv, _Crest_Resolution) #else - const float source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0.0).x; + const float source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0.0) #endif + .x * _Crest_Multiplier; const float target = _Crest_Target[id]; diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ScatteringTexture.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ScatteringTexture.compute index 8d981dcd4..e44e43f5b 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ScatteringTexture.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Hidden/ScatteringTexture.compute @@ -18,6 +18,7 @@ RWTexture2DArray _Crest_Target; CBUFFER_START(CrestPerMaterial) int _Crest_Blend; float _Crest_Weight; +float4 _Crest_Multiplier; float2 _Crest_TextureSize; float2 _Crest_TexturePosition; float2 _Crest_TextureRotation; @@ -42,7 +43,7 @@ void Execute(uint3 id) return; } - const half4 source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0); + const half4 source = _Crest_Texture.SampleLevel(LODData_linear_clamp_sampler, uv, 0) * _Crest_Multiplier; const half3 target = _Crest_Target[id]; weight *= source.a; diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Override.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Override.shader index bb55e2d0e..c8def22ae 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Override.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Override.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. Shader "Crest/Inputs/All/Override" @@ -15,11 +15,13 @@ Shader "Crest/Inputs/All/Override" SubShader { + ZTest Always + ZWrite Off + Pass { Blend Off ColorMask [_Crest_ColorMask] - ZWrite Off CGPROGRAM #pragma vertex Vertex diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Scale.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Scale.shader index f3890f2bb..688709428 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Scale.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Scale.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // 0-1 scaling of existing water data using multiplicative blending. @@ -32,6 +32,9 @@ Shader "Crest/Inputs/All/Scale" SubShader { + ZTest Always + ZWrite Off + Pass { // Multiply @@ -42,8 +45,8 @@ Shader "Crest/Inputs/All/Scale" #pragma fragment Frag #pragma shader_feature_local d_Texture - #pragma shader_feature_local d_Invert #pragma shader_feature_local d_Feather + #pragma shader_feature_local_fragment d_Invert #include "UnityCG.cginc" diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ScatteringColor.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ScatteringColor.shader index 0eb03e0f4..a26d04371 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ScatteringColor.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ScatteringColor.shader @@ -17,10 +17,12 @@ Shader "Crest/Inputs/Scattering/Color" SubShader { + ZTest Always + ZWrite Off + Pass { Blend SrcAlpha OneMinusSrcAlpha - ZWrite Off ColorMask RGB CGPROGRAM diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ShapeWavesFromGeometry.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ShapeWavesFromGeometry.shader index 13ba48457..270a413d6 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ShapeWavesFromGeometry.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/ShapeWavesFromGeometry.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Generates waves from geometry that is rendered into the water simulation from a top down camera. Expects @@ -39,7 +39,7 @@ Shader "Crest/Inputs/Shape Waves/Add From Geometry" #pragma fragment Fragment // #pragma enable_d3d11_debug_symbols - #pragma shader_feature_local d_Feather + #pragma shader_feature_local_fragment d_Feather #include "UnityCG.cginc" diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Utility.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Utility.shader index 46df5d243..d250ac2ef 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Utility.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/Utility.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. Shader "Crest/Inputs/All/Utility" @@ -17,12 +17,14 @@ Shader "Crest/Inputs/All/Utility" SubShader { + ZTest Always + ZWrite Off + Pass { Blend [_Crest_BlendModeSource] [_Crest_BlendModeTarget] BlendOp [_Crest_BlendOperation] ColorMask [_Crest_ColorMask] - ZWrite Off CGPROGRAM #pragma vertex Vertex diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterDepthFromGeometry.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterDepthFromGeometry.shader index 455acf4b1..cc8279cbe 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterDepthFromGeometry.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterDepthFromGeometry.shader @@ -12,6 +12,9 @@ Shader "Crest/Inputs/Depth/Water Depth From Geometry" SubShader { + ZTest Always + ZWrite Off + Pass { BlendOp Max diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterLevelFromGeometry.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterLevelFromGeometry.shader index bb7f60a7a..d21749aa1 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterLevelFromGeometry.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Input/WaterLevelFromGeometry.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // This sets base water height to Y value of geometry. @@ -17,6 +17,9 @@ Shader "Crest/Inputs/Level/Water Level From Geometry" SubShader { + ZTest Always + ZWrite Off + Pass { Blend [_Crest_BlendSource] [_Crest_BlendTarget] diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/PackLevel.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/PackLevel.compute index d9736ebe6..51a96d4ef 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/PackLevel.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/PackLevel.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #pragma kernel CrestPackLevel diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/Query.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/Query.compute index ec2e00192..f327e7ff1 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/Query.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/Query.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #pragma kernel CrestQueryDisplacement d_CrestDisplacement diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryDisplacements.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryDisplacements.compute index 542a4af0b..8991294cb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryDisplacements.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryDisplacements.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Merged into Query.compute. diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryFlow.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryFlow.compute index 542a4af0b..8991294cb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryFlow.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/Query/QueryFlow.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Merged into Query.compute. diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShapeCombine.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShapeCombine.compute index 13401d40d..30efd0ffa 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShapeCombine.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShapeCombine.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Compute shader to perform combine of displacements. Reads and writes to texture array which saves @@ -14,6 +14,7 @@ #pragma kernel ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON _FLOW_ON _DYNAMIC_WAVE_SIM_ON #pragma kernel ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON_DISABLE_COMBINE _FLOW_ON _DYNAMIC_WAVE_SIM_ON _DISABLE_COMBINE #pragma kernel ShapeCombineDynamicWaves +#pragma kernel ShapeCombineDynamicWaves_DISABLE_COMBINE _DISABLE_COMBINE #pragma kernel ShapeCombineCopyDynamicWaves #include "HLSLSupport.cginc" @@ -107,6 +108,7 @@ void ShapeCombineBase(uint3 id) #endif // _FLOW_ON } + // Disabled for last LOD. #if !_DISABLE_COMBINE { const Cascade cascade = Cascade::MakeAnimatedWaves(slice0 + 1); @@ -136,14 +138,19 @@ void ShapeCombineDynamicWaves(uint3 id) const float2 positionWSXZ = cascade.UVToWorld(uv); float3 result = 0.0; + // Disabled for last LOD. +#if !_DISABLE_COMBINE { - const Cascade cascade = Cascade::MakeDynamicWaves(slice0 + 1); + // We are sampling from the target which matches Animated Waves descriptor. + const Cascade cascade = Cascade::MakeAnimatedWaves(slice0 + 1); const float3 uv = cascade.WorldToUV(positionWSXZ); // Waves to combine down from the next lod up the chain. SampleDisplacementsCompute(_Crest_DynamicWavesTarget, cascade._Resolution, uv, 1.0, result); } +#endif { + // We are sampling from Dynamic Waves. const Cascade cascade = Cascade::MakeDynamicWaves(slice0); const float3 uv = cascade.WorldToUV(positionWSXZ); result += cascade.SampleDynamicWavesDisplacement(uv, _Crest_HorizontalDisplace, _Crest_DisplaceClamp); @@ -168,4 +175,5 @@ m_CrestNameSpaceEnd [numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON(uint3 id : SV_DispatchThreadID) { m_Crest::ShapeCombineBase(id); } [numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void ShapeCombine_FLOW_ON_DYNAMIC_WAVE_SIM_ON_DISABLE_COMBINE(uint3 id : SV_DispatchThreadID) { m_Crest::ShapeCombineBase(id); } [numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void ShapeCombineDynamicWaves(uint3 id : SV_DispatchThreadID) { m_Crest::ShapeCombineDynamicWaves(id); } +[numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void ShapeCombineDynamicWaves_DISABLE_COMBINE(uint3 id : SV_DispatchThreadID) { m_Crest::ShapeCombineDynamicWaves(id); } [numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void ShapeCombineCopyDynamicWaves(uint3 id : SV_DispatchThreadID) { m_Crest::ShapeCombineCopyDynamicWaves(id); } diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShorelineColor.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShorelineColor.compute index 926792aaa..46dff08e6 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShorelineColor.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/ShorelineColor.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #pragma kernel CrestShorelineColor diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateDynamicWaves.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateDynamicWaves.compute index 2f6a7c1a2..466ac359c 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateDynamicWaves.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateDynamicWaves.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Solves 2D wave equation @@ -40,10 +40,11 @@ void UpdateDynamicWaves(uint3 id) const float sliceIndexSource = id.z + _Crest_LodChange; const Cascade cascadeSource = Cascade::MakeDynamicWavesSource(sliceIndexSource); - // Off either end of the cascade - not useful to sample anything from previous frame. Always initialise - // with 0 values. - if (sliceIndexSource < 0.0 || sliceIndexSource >= cascadeSource._Count - 1.0) + // Off either end of the cascade. Not useful to sample anything from previous + // frame, as we do not produce any new data from sources of waves. + if (sliceIndexSource < 0.0 || sliceIndexSource >= cascadeSource._Count) { + // Always initialise with 0 values. _Crest_Target[id] = (float2)0; return; } @@ -91,21 +92,14 @@ void UpdateDynamicWaves(uint3 id) const float3 X = float3(1.0, 0.0, 0.0); const float3 Y = float3(-X.y, X.x, 0.0); - // no border wrap mode for RTs in unity it seems, - // so make any off-array reads 0 manually - const bool insideTarget = sliceIndexSource <= cascadeSource._Count && sliceIndexSource >= 0; - float fxm, fym, fxp, fyp; float2 ft_v; ft_v = fxm = fym = fxp = fyp = 0.0; - if (insideTarget) - { - fxm = cascadeSource.SampleDynamicWaves(uv_source - e * X).x; // x minus - fym = cascadeSource.SampleDynamicWaves(uv_source - e * Y).x; // y minus - fxp = cascadeSource.SampleDynamicWaves(uv_source + e * X).x; // x plus - fyp = cascadeSource.SampleDynamicWaves(uv_source + e * Y).x; // y plus - ft_v = cascadeSource.SampleDynamicWaves(uv_source); - } + fxm = cascadeSource.SampleDynamicWaves(uv_source - e * X).x; // x minus + fym = cascadeSource.SampleDynamicWaves(uv_source - e * Y).x; // y minus + fxp = cascadeSource.SampleDynamicWaves(uv_source + e * X).x; // x plus + fyp = cascadeSource.SampleDynamicWaves(uv_source + e * Y).x; // y plus + ft_v = cascadeSource.SampleDynamicWaves(uv_source); // wave propagation diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateFoam.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateFoam.compute index 2b64d0afb..3adf4376f 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateFoam.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateFoam.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #pragma kernel CrestUpdateFoam diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute new file mode 100644 index 000000000..4388987d8 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute @@ -0,0 +1,154 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// Soft shadow term is red, hard shadow term is green. + +#pragma kernel CrestUpdateShadowsBRP _BRP +#pragma kernel CrestUpdateShadowsHRP _HRP +#pragma kernel CrestUpdateShadowsURP _URP + +// Both BIRP. +#pragma multi_compile __ SHADOWS_SPLIT_SPHERES +#pragma multi_compile __ SHADOWS_SINGLE_CASCADE + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl" + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/InputsDriven.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl" + +// Noise functions used for jitter. +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Noise/Noise.hlsl" + + +// JitterDiameterSoft, JitterDiameterHard, CurrentFrameWeightSoft, CurrentFrameWeightHard +float4 _Crest_JitterDiameters_CurrentFrameWeights; +float _Crest_SimDeltaTime; +float4x4 _Crest_MainCameraProjectionMatrix; + +bool _Crest_SampleColorMap; +float3 _Crest_Absorption; +float3 _Crest_Scattering; + +RWTexture2DArray _Crest_Target; + + +m_CrestNameSpace + +half ComputeShadow(const float4 i_positionWS, const float i_jitterDiameter, const half i_terrainHeight, const uint i_LodIndex) +{ + float4 positionWS = i_positionWS; + bool noShadows = false; + + if (i_jitterDiameter > 0.0) + { + // Add jitter. + positionWS.xz += i_jitterDiameter * (hash33(uint3(abs(positionWS.xz * 10.0), _Time.y * 120.0)) - 0.5).xy; + + // Shadow Bleeding. + // If we are not within a terrain, then check for shadow bleeding. + if (i_positionWS.y > i_terrainHeight) + { + // WorldToSafeUV + half terrainHeight = Cascade::MakeDepth(i_LodIndex).SampleSceneHeight(positionWS.xz); + + // If our current position is below the jittered terrain height, then we have landed within a terrain and + // we do not want to sample those shadows. + if (i_positionWS.y < terrainHeight) + { + // Return no shadows. + noShadows = true; + } + } + } + + return noShadows ? 1.0 : Utility::SampleShadows(positionWS); +} + +void UpdateShadows(const uint3 id) +{ + const uint slice0 = id.z; + const Cascade cascade = Cascade::MakeShadow(slice0); + const float2 worldPosXZ = cascade.IDToWorld(id.xy); + + float4 positionWS = 1.0; + positionWS.xz = worldPosXZ; + positionWS.y = g_Crest_WaterCenter.y; + + // Shadow from last frame. Manually implement black border. + const float sliceIndexSource = clamp((int)slice0 + g_Crest_LodChange, 0.0, g_Crest_LodCount - 1.0); + half2 shadow = Cascade::MakeShadowSource(sliceIndexSource).SampleShadowOverflow(positionWS.xz, 1.0); + + // Add displacement so shorelines do not receive shadows incorrectly. + positionWS.xyz += Cascade::MakeAnimatedWaves(slice0).SampleDisplacement(positionWS.xz); + + // This was calculated in vertex but we have to sample sea level offset in fragment. + float4 mainCameraCoordinates = mul(_Crest_MainCameraProjectionMatrix, positionWS); + + // Check if the current sample is visible in the main camera (and therefore the shadow map can be sampled). This is + // required as the shadow buffer is world aligned and surrounds viewer. + float3 projected = mainCameraCoordinates.xyz / mainCameraCoordinates.w; + if (projected.z < 1.0 && projected.z > 0.0 && abs(projected.x) < 1.0 && abs(projected.y) < 1.0) + { + half2 shadowThisFrame = 1.0; + +#if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) + positionWS.xyz -= _WorldSpaceCameraPos.xyz; +#endif + + half terrainHeight = Cascade::MakeDepth(slice0).SampleSceneHeight(positionWS.xz); + + half softJitter = _Crest_JitterDiameters_CurrentFrameWeights[CREST_SHADOW_INDEX_SOFT]; + + if (_Crest_SampleColorMap) + { + half3 absorption = _Crest_Absorption; + half3 scattering = _Crest_Scattering; + + if (g_Crest_SampleAbsorptionSimulation) + { + absorption = Cascade::MakeAbsorption(slice0).SampleAbsorption(positionWS.xz); + } + + if (g_Crest_SampleScatteringSimulation) + { + scattering = Cascade::MakeScattering(slice0).SampleScattering(positionWS.xz); + } + + half3 extinction = absorption + scattering; + half factor = saturate(min(min(extinction.x, extinction.y), extinction.z) * g_Crest_DynamicSoftShadowsFactor); + softJitter = (1.0 - factor) * k_Crest_MaximumShadowJitter; + } + + // Add soft shadowing data. + shadowThisFrame[CREST_SHADOW_INDEX_SOFT] = ComputeShadow + ( + positionWS, + softJitter, + terrainHeight, + slice0 + ); + + // Add hard shadowing data. + shadowThisFrame[CREST_SHADOW_INDEX_HARD] = ComputeShadow + ( + positionWS, + _Crest_JitterDiameters_CurrentFrameWeights[CREST_SHADOW_INDEX_HARD], + terrainHeight, + slice0 + ); + + shadowThisFrame = (half2)1.0 - saturate(shadowThisFrame + Utility::ComputeShadowFade(positionWS)); + + shadow = lerp(shadow, shadowThisFrame, _Crest_JitterDiameters_CurrentFrameWeights.zw * _Crest_SimDeltaTime * 60.0); + } + + _Crest_Target[id] = shadow; +} + +m_CrestNameSpaceEnd + +m_CrestKernelXRP(UpdateShadows) diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute.meta new file mode 100644 index 000000000..9c7b48536 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.compute.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c47c6200534474da18e1134965c102f3 +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.hlsl index 05e595cff..d58bb60cf 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.hlsl @@ -100,7 +100,8 @@ half2 Fragment(Varyings input) float4 positionWS = float4(input.positionWS.xyz, 1.0); // Shadow from last frame. Manually implement black border. - half2 shadow = Cascade::MakeShadowSource(_Crest_LodIndex + g_Crest_LodChange).SampleShadowOverflow(positionWS.xz, 1.0); + const float sliceIndexSource = clamp((int)_Crest_LodIndex + g_Crest_LodChange, 0.0, g_Crest_LodCount - 1.0); + half2 shadow = Cascade::MakeShadowSource(sliceIndexSource).SampleShadowOverflow(positionWS.xz, 1.0); // Add displacement so shorelines do not receive shadows incorrectly. positionWS.xyz += Cascade::MakeAnimatedWaves(_Crest_LodIndex).SampleDisplacement(positionWS.xz); diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.shader index 069f8c60b..ed611f956 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.shader @@ -1,170 +1,7 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. -// Soft shadow term is red, hard shadow term is green. - -Shader "Hidden/Crest/Simulation/Update Shadow" +Shader "Hidden/Crest/Obsolete/Simulation/Update Shadow" { - SubShader - { - PackageRequirements - { - "com.unity.render-pipelines.high-definition" - } - - Tags { "RenderPipeline"="HDRenderPipeline" } - - Pass - { - HLSLPROGRAM - #pragma vertex Vertex - #pragma fragment Fragment - - // #pragma enable_d3d11_debug_symbols - - // SHADOW_ULTRA_LOW uses Gather which is 4.5. HDRP minimum is 5.0 so this is fine. - #pragma target 4.5 - - // TODO: We might be able to expose this to give developers the option. - // #pragma multi_compile SHADOW_ULTRA_LOW SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH - - // Ultra low uses Gather to filter which should be same cost as not filtering. See algorithms per keyword: - // Runtime/Lighting/Shadow/HDShadowAlgorithms.hlsl - #define SHADOW_ULTRA_LOW - #define AREA_SHADOW_LOW - #define PUNCTUAL_SHADOW_ULTRA_LOW - #define DIRECTIONAL_SHADOW_ULTRA_LOW - - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl" - #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" - #include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadow.hlsl" - - float4x4 _Crest_ViewProjectionMatrix; - - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.hlsl" - - m_CrestNameSpace - - half SampleShadows(const float4 i_positionWS) - { - // Get directional light data. By definition we only have one directional light casting shadow. - DirectionalLightData light = _DirectionalLightDatas[_DirectionalShadowIndex]; - HDShadowContext context = InitShadowContext(); - - // Zeros are for screen space position and world space normal which are for filtering and normal bias - // respectively. They did not appear to have an impact. - half shadows = GetDirectionalShadowAttenuation(context, 0, i_positionWS.xyz, 0, _DirectionalShadowIndex, -light.forward); - // Apply shadow strength from main light. - shadows = LerpWhiteTo(shadows, light.shadowDimmer); - - return shadows; - } - - half ComputeShadowFade(const float4 i_positionWS) - { - // TODO: Work out shadow fade. - return 0.0; - } - - m_CrestNameSpaceEnd - ENDHLSL - } - } - - SubShader - { - PackageRequirements - { - "com.unity.render-pipelines.universal" - } - - Tags { "RenderPipeline"="UniversalPipeline" } - - Pass - { - HLSLPROGRAM - - #pragma vertex Vertex - #pragma fragment Fragment - // #pragma enable_d3d11_debug_symbols - - // Maybe this is the equivalent of the SHADOW_COLLECTOR_PASS define? Inspired from com.unity.render-pipelines.universal/Shaders/Utils/ScreenSpaceShadows.shader - #define _MAIN_LIGHT_SHADOWS_CASCADE - #define MAIN_LIGHT_CALCULATE_SHADOWS - - #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" - #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl" - #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" - - #define CREST_SAMPLE_SHADOW_HARD - - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.hlsl" - - m_CrestNameSpace - - half SampleShadows(const float4 i_positionWS) - { - // Includes soft shadows if _SHADOWS_SOFT is defined (requires multi-compile pragma). - return MainLightRealtimeShadow(TransformWorldToShadowCoord(i_positionWS.xyz)); - } - - half ComputeShadowFade(const float4 i_positionWS) - { - return GetShadowFade(i_positionWS.xyz); - } - - m_CrestNameSpaceEnd - ENDHLSL - } - } - - SubShader - { - Pass - { - HLSLPROGRAM - #pragma vertex Vertex - #pragma fragment Fragment - - #pragma multi_compile_shadowcollector - - // #pragma enable_d3d11_debug_symbols - - #define CREST_SAMPLE_SHADOW_HARD - #define d_Crest_ReceiveShadowsTransparent 1 - - #include "UnityCG.cginc" - - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Data/UpdateShadow.hlsl" - - m_CrestNameSpace - - half SampleShadows(const float4 i_positionWS) - { - // NOTE: "Shadow Projection > Close Fit" can still produce artefacts when away from caster, but this - // appears to be an improvement over the compute shader. - float4 shadowCoord = GET_SHADOW_COORDINATES(i_positionWS); - half shadows = UNITY_SAMPLE_SHADOW(_ShadowMapTexture, shadowCoord); - if (_Crest_ClearShadows) shadows = 1.0; - shadows = lerp(_LightShadowData.r, 1.0, shadows); - - return shadows; - } - - half ComputeShadowFade(const float4 i_positionWS) - { - float z = dot(i_positionWS.xyz - _WorldSpaceCameraPos.xyz, unity_CameraToWorld._m02_m12_m22); - float fadeDistance = UnityComputeShadowFadeDistance(i_positionWS.xyz, z); - float fade = UnityComputeShadowFade(fadeDistance); - return fade; - } - - m_CrestNameSpaceEnd - ENDHLSL - } - } + // Replaced with UpdateShadow.compute. } diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl index 5184fb453..fbdb22702 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl @@ -106,7 +106,7 @@ { \ result = Sample##name(uv); \ } \ - else if (_Index < _Count) \ + else if ((_Index + 1) < _Count) \ { \ const Cascade cascade = Cascade::Make##name(_Index + 1, this); \ const float3 uv = cascade.WorldToUV(i_Position); \ @@ -128,7 +128,7 @@ { \ result = Sample##name(i_UV); \ } \ - else if (_Index < _Count) \ + else if ((_Index + 1) < _Count) \ { \ const Cascade cascade = Cascade::Make##name(_Index + 1, this); \ const float3 uv = cascade.WorldToUV(UVToWorld(i_UV)); \ diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl index 10994c83e..772ec85e0 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl @@ -42,9 +42,6 @@ #define CREST_SSS_MAXIMUM 0.6 #define CREST_SSS_RANGE 0.12 -// Note: Must match k_MaskBelowSurfaceCull in UnderwaterRenderer.Mask.cs. -// Fog rendered from below and before transparents and water tile is culled. -#define CREST_MASK_BELOW_SURFACE_CULLED -2.0 // Note: Must match k_MaskBelowSurface in UnderwaterRenderer.Mask.cs. // Fog rendered from below. #define CREST_MASK_BELOW_SURFACE -1.0 @@ -62,6 +59,7 @@ // used to scale the meniscus as it is calculate using a pixel offset which can make the meniscus large at a distance. #define MENISCUS_MAXIMUM_DISTANCE 15.0 +#define k_Crest_MaskInsidePortal 5 #if defined(STEREO_INSTANCING_ON) || defined(STEREO_MULTIVIEW_ON) #define CREST_HANDLE_XR 1 diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl index 62d606fee..c2e1b0a44 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl @@ -12,6 +12,8 @@ SamplerState LODData_linear_clamp_sampler; SamplerState LODData_point_clamp_sampler; SamplerState sampler_Crest_linear_repeat; +SamplerState _Crest_linear_clamp_sampler; + CBUFFER_START(CrestPerFrame) float3 g_Crest_WaterCenter; float g_Crest_WaterScale; @@ -31,6 +33,7 @@ int g_Crest_ForceUnderwater; float3 g_Crest_PrimaryLightDirection; float3 g_Crest_PrimaryLightIntensity; +bool g_Crest_PrimaryLightHasCookie; float g_Crest_DynamicSoftShadowsFactor; @@ -39,7 +42,7 @@ bool g_Crest_SampleScatteringSimulation; // Motion Vector Parameters float g_Crest_WaterScaleChange; -float3 g_Crest_WaterCenterDelta; +float2 g_Crest_WaterCenterDelta; // Shifting Origin #if (CREST_SHIFTING_ORIGIN != 0) diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Helpers.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Helpers.hlsl index 5b5746656..3bc7b279c 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Helpers.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Helpers.hlsl @@ -90,21 +90,27 @@ void PosToSliceIndices } } -bool IsUnderwater(const bool i_FrontFace, const int i_ForceUnderwater) +bool IsUnderWater(const bool i_FrontFace, const int i_ForceUnderwater) { + bool underwater = false; + // We are well below water. if (i_ForceUnderwater == 1) { - return true; + underwater = true; } - // We are well above water. - if (i_ForceUnderwater == 2) + else if (i_ForceUnderwater == 2) { - return false; + underwater = false; + } + // Use facing. + else + { + underwater = !i_FrontFace; } - return !i_FrontFace; + return underwater; } float FeatherWeightFromUV(const float2 i_uv, const half i_featherWidth) diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/InputsDriven.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/InputsDriven.hlsl index 9271bdf1b..99be4866e 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/InputsDriven.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/InputsDriven.hlsl @@ -9,15 +9,10 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" -CBUFFER_START(CrestChunkInstanceData) -uint _Crest_LodIndex; -float _Crest_ChunkMeshScaleAlpha; -float _Crest_ChunkMeshScaleAlphaSource; -float _Crest_ChunkGeometryGridWidth; -float _Crest_ChunkGeometryGridWidthSource; -float _Crest_ChunkFarNormalsWeight; -float2 _Crest_ChunkNormalScrollSpeed; -CBUFFER_END +// NOTE: Unity does not recognize uint in FrameDebugger. It will be under Floats +// with incorrect values. Change to int for debugging. +uint _Crest_LodIndex; + Texture2DArray g_Crest_CascadeAbsorption; m_DisplacementTexture(Texture2DArray, 4) g_Crest_CascadeAnimatedWaves; diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl index ea3410778..48bb0e5e7 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl @@ -31,6 +31,12 @@ type Fragment(m_Crest::Varyings i_Input) : SV_Target \ return m_Crest::Fragment(i_Input); \ } +#define m_CrestFragmentVariant(type, name) \ +type Fragment(m_Crest::Varyings i_Input) : SV_Target \ +{ \ + return m_Crest::name(i_Input); \ +} + #define m_CrestFragmentWithFrontFace(type) \ type Fragment(m_Crest::Varyings i_Input, const bool i_IsFrontFace : SV_IsFrontFace) : SV_Target \ { \ @@ -69,4 +75,10 @@ void Crest##name(uint3 id : SV_DispatchThreadID) \ m_Crest::name(uint3(id.xy, g_Crest_LodCount - 1 - id.z)); \ } +// Cross render pipeline kernels. +#define m_CrestKernelXRP(name) \ +[numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void Crest##name##BRP(uint3 id : SV_DispatchThreadID) { m_Crest::name(id); } \ +[numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void Crest##name##HRP(uint3 id : SV_DispatchThreadID) { m_Crest::name(id); } \ +[numthreads(THREAD_GROUP_SIZE_X, THREAD_GROUP_SIZE_Y, 1)] void Crest##name##URP(uint3 id : SV_DispatchThreadID) { m_Crest::name(id); } \ + #endif // CREST_MACROS_H diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl index 755738913..e0fe16020 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl @@ -7,10 +7,13 @@ // // WaveHarmonic.Crest.Editor.ShaderSettings: static fields // +#define CREST_PACKAGE_HDRP (1) +#define CREST_PACKAGE_URP (1) #define CREST_PORTALS (0) #define CREST_SHIFTING_ORIGIN (0) -#define CREST_SHADOWS_BUILT_IN_RENDER_PIPELINE (1) #define CREST_FULL_PRECISION_DISPLACEMENT (1) +#define CREST_DISCARD_ATMOSPHERIC_SCATTERING (1) +#define CREST_LEGACY_UNDERWATER (0) #endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl new file mode 100644 index 000000000..e94a647fb --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl @@ -0,0 +1,48 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Utility_Helpers +#define d_WaveHarmonic_Utility_Helpers + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Macros.hlsl" + +m_UtilityNameSpace + +void Swap(inout float a, inout float b) +{ + float t = a; a = b; b = t; +} + +// Adapted from: +// https://alex.vlachos.com/graphics/Alex_Vlachos_Advanced_VR_Rendering_GDC2015.pdf +float3 ScreenSpaceDither(const float2 i_ScreenPosition) +{ + // Iestyn's RGB dither (7 asm instructions) from Portal 2 X360, slightly modified for VR. + float3 dither = dot(float2(171.0, 231.0), i_ScreenPosition.xy); + dither.rgb = frac(dither.rgb / float3(103.0, 71.0, 97.0)) - float3(0.5, 0.5, 0.5); + return (dither.rgb / 255.0); +} + +float2 WorldNormalToScreenDirection(const float3 i_PositionWS, const float3 i_NormalWS, const float4x4 i_MatrixVP, const float i_Offset) +{ + const float3 p0 = i_PositionWS; + const float3 p1 = p0 + i_NormalWS * i_Offset; + + const float4 clip0 = mul(i_MatrixVP, float4(p0, 1)); + const float4 clip1 = mul(i_MatrixVP, float4(p1, 1)); + + const float2 uv0 = (clip0.xy / clip0.w) * 0.5 + 0.5; + const float2 uv1 = (clip1.xy / clip1.w) * 0.5 + 0.5; + + float2 direction = normalize(uv1 - uv0); + +#if UNITY_UV_STARTS_AT_TOP + direction.y = -direction.y; +#endif + + return direction; +} + +m_UtilityNameSpaceEnd + +#endif // d_WaveHarmonic_Utility_Helpers diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl.meta new file mode 100644 index 000000000..5057f0e50 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 90443daddb561477ca109fbfe1d80fdd +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Common.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Common.hlsl index 3515e6fcf..0fc2a485a 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Common.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Common.hlsl @@ -1,257 +1,4 @@ // Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. -// This file is subject to the Unity Companion License: -// https://github.com/Unity-Technologies/Graphics/blob/7ff8fd444c179fd9bb380d61f4865be6935b47dd/LICENSE.md - -// Adds functions from SRP. - -// Adapted from: -// https://github.com/Unity-Technologies/Graphics/blob/8f54e6591e93fb3bf8e9879a0e43665dfbe2f629/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl - -#ifndef UNITY_COMMON_INCLUDED -#define UNITY_COMMON_INCLUDED - -// Add "real" alias for "fixed". Helps with including files downstream. - -#define real fixed -#define real2 fixed2 -#define real3 fixed3 -#define real4 fixed4 - -// Commented lines have no "fixed" equivalent. - -#define real2x2 fixed2x2 -// #define real2x3 fixed2x3 -// #define real2x4 fixed2x4 -// #define real3x2 fixed3x2 -#define real3x3 fixed3x3 -// #define real3x4 fixed3x4 -// #define real4x3 fixed4x3 -#define real4x4 fixed4x4 - -// -// MACROS -// - -#define ZERO_INITIALIZE(type, name) UNITY_INITIALIZE_OUTPUT(type,name) -#define TransformObjectToHClip(positionOS) UnityObjectToClipPos(float4(positionOS, 1.0)) - -// Taken from: -// com.unity.render-pipelines.core@10.5.0/ShaderLibrary/API/D3D11.hlsl -// com.unity.render-pipelines.core@10.5.0/ShaderLibrary/API/Metal.hlsl -// com.unity.render-pipelines.core@10.5.0/ShaderLibrary/API/Switch.hlsl -// com.unity.render-pipelines.core@10.5.0/ShaderLibrary/API/Vulkan.hlsl - -// GameCore, PSSL etc require an NDA so hard to confirm how some of these APIs are implemented, but the PPv2 package has -// some of APIs (the ones we use) and they are the same: -// com.unity.postprocessing/PostProcessing/Shaders/API/ - -// Texture abstraction. - -#define TEXTURE2D(textureName) UNITY_DECLARE_TEX2D_NOSAMPLER(textureName) -#define TEXTURE2D_ARRAY(textureName) UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(textureName) -#define TEXTURECUBE(textureName) UNITY_DECLARE_TEXCUBE_NOSAMPLER(textureName) -// #define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName -// #define TEXTURE3D(textureName) Texture3D textureName - -// #ifdef SHADER_API_D3D11 - -// #define TEXTURE2D_FLOAT(textureName) TEXTURE2D(textureName) -// #define TEXTURE2D_ARRAY_FLOAT(textureName) TEXTURE2D_ARRAY(textureName) -// #define TEXTURECUBE_FLOAT(textureName) TEXTURECUBE(textureName) -// #define TEXTURECUBE_ARRAY_FLOAT(textureName) TEXTURECUBE_ARRAY(textureName) -// #define TEXTURE3D_FLOAT(textureName) TEXTURE3D(textureName) - -// #define TEXTURE2D_HALF(textureName) TEXTURE2D(textureName) -// #define TEXTURE2D_ARRAY_HALF(textureName) TEXTURE2D_ARRAY(textureName) -// #define TEXTURECUBE_HALF(textureName) TEXTURECUBE(textureName) -// #define TEXTURECUBE_ARRAY_HALF(textureName) TEXTURECUBE_ARRAY(textureName) -// #define TEXTURE3D_HALF(textureName) TEXTURE3D(textureName) - -// #else // !SHADER_API_D3D11 - -// #define TEXTURE2D_FLOAT(textureName) Texture2D_float textureName -// #define TEXTURE2D_ARRAY_FLOAT(textureName) Texture2DArray_float textureName -// #define TEXTURECUBE_FLOAT(textureName) TextureCube_float textureName -// #define TEXTURECUBE_ARRAY_FLOAT(textureName) TextureCubeArray_float textureName -// #define TEXTURE3D_FLOAT(textureName) Texture3D_float textureName - -// #define TEXTURE2D_HALF(textureName) Texture2D_half textureName -// #define TEXTURE2D_ARRAY_HALF(textureName) Texture2DArray_half textureName -// #define TEXTURECUBE_HALF(textureName) TextureCube_half textureName -// #define TEXTURECUBE_ARRAY_HALF(textureName) TextureCubeArray_half textureName -// #define TEXTURE3D_HALF(textureName) Texture3D_half textureName - -// #endif // SHADER_API_D3D11 - -// #define TEXTURE2D_SHADOW(textureName) TEXTURE2D(textureName) -// #define TEXTURE2D_ARRAY_SHADOW(textureName) TEXTURE2D_ARRAY(textureName) -// #define TEXTURECUBE_SHADOW(textureName) TEXTURECUBE(textureName) -// #define TEXTURECUBE_ARRAY_SHADOW(textureName) TEXTURECUBE_ARRAY(textureName) - -#define RW_TEXTURE2D(type, textureName) RWTexture2D textureName -#define RW_TEXTURE2D_ARRAY(type, textureName) RWTexture2DArray textureName -// #define RW_TEXTURE3D(type, textureName) RWTexture3D textureName - -#define SAMPLER(samplerName) SamplerState samplerName -// #define SAMPLER_CMP(samplerName) SamplerComparisonState samplerName -// #define ASSIGN_SAMPLER(samplerName, samplerValue) samplerName = samplerValue - -// #define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName) -// #define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER(samplerName) -// #define TEXTURECUBE_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER(samplerName) -// #define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER(samplerName) -// #define TEXTURE3D_PARAM(textureName, samplerName) TEXTURE3D(textureName), SAMPLER(samplerName) - -// #define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER_CMP(samplerName) -// #define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURE2D_ARRAY(textureName), SAMPLER_CMP(samplerName) -// #define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE(textureName), SAMPLER_CMP(samplerName) -// #define TEXTURECUBE_ARRAY_SHADOW_PARAM(textureName, samplerName) TEXTURECUBE_ARRAY(textureName), SAMPLER_CMP(samplerName) - -// #define TEXTURE2D_ARGS(textureName, samplerName) textureName, samplerName -// #define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) textureName, samplerName -// #define TEXTURECUBE_ARGS(textureName, samplerName) textureName, samplerName -// #define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) textureName, samplerName -// #define TEXTURE3D_ARGS(textureName, samplerName) textureName, samplerName - -// #define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) textureName, samplerName -// #define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName -// #define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) textureName, samplerName -// #define TEXTURECUBE_ARRAY_SHADOW_ARGS(textureName, samplerName) textureName, samplerName - -// We cannot use Unity's macros because they change the samplerName and it needs to be unchanged. -#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2) -#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod) -// #define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias) -// #define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, dpdx, dpdy) textureName.SampleGrad(samplerName, coord2, dpdx, dpdy) -#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index)) -// #define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod) -// #define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias) -// #define SAMPLE_TEXTURE2D_ARRAY_GRAD(textureName, samplerName, coord2, index, dpdx, dpdy) textureName.SampleGrad(samplerName, float3(coord2, index), dpdx, dpdy) -// #define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3) -// #define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod) -// #define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias) -// #define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index)) -// #define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod) -// #define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias) -// #define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3) -// #define SAMPLE_TEXTURE3D_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod) - -// #define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z) -// #define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z) -// #define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord4).xyz, (coord4).w) -// #define SAMPLE_TEXTURECUBE_ARRAY_SHADOW(textureName, samplerName, coord4, index) textureName.SampleCmpLevelZero(samplerName, float4((coord4).xyz, index), (coord4).w) - -#undef SAMPLE_DEPTH_TEXTURE -// #undef SAMPLE_DEPTH_TEXTURE_LOD -#define SAMPLE_DEPTH_TEXTURE(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2).r -// #define SAMPLE_DEPTH_TEXTURE_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod).r - -#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0)) -// #define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod)) -// #define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex) -#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0)) -// #ifndef SHADER_API_SWITCH -// #define LOAD_TEXTURE2D_ARRAY_MSAA(textureName, unCoord2, index, sampleIndex) textureName.Load(int3(unCoord2, index), sampleIndex) -// #endif -// #define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod)) -// #define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0)) -// #define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod)) - -// #define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2) -// #define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index)) -// #define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3) -// #define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index)) -// #define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2) -// #define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2) -// #define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2) -// #define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2) - -// Generates a triangle in homogeneous clip space, s.t. -// v0 = (-1, -1, 1), v1 = (3, -1, 1), v2 = (-1, 3, 1). -float2 GetFullScreenTriangleTexCoord(uint vertexID) -{ -#if UNITY_UV_STARTS_AT_TOP - return float2((vertexID << 1) & 2, 1.0 - (vertexID & 2)); -#else - return float2((vertexID << 1) & 2, vertexID & 2); -#endif -} - -float4 GetFullScreenTriangleVertexPosition(uint vertexID, float z = UNITY_NEAR_CLIP_VALUE) -{ - float2 uv = float2((vertexID << 1) & 2, vertexID & 2); - return float4(uv * 2.0 - 1.0, z, 1.0); -} - -#endif // UNITY_COMMON_INCLUDED - -// -// FUNCTIONS -// - -// Keep the following unguarded - -// Taken and modified from: -// com.unity.render-pipelines.core@12.0.0/ShaderLibrary/Common.hlsl -float4 CrestComputeClipSpacePosition(float2 positionNDC, float deviceDepth) -{ - float4 positionCS = float4(positionNDC * 2.0 - 1.0, deviceDepth, 1.0); - // positionCS.y was flipped here but that is SRP specific to solve flip baked into matrix. - return positionCS; -} - -// Taken and modified from: -// com.unity.render-pipelines.core@12.0.0/ShaderLibrary/Common.hlsl -float3 CrestComputeWorldSpacePosition(float2 positionNDC, float deviceDepth, float4x4 invViewProjMatrix) -{ - float4 positionCS = CrestComputeClipSpacePosition(positionNDC, deviceDepth); - float4 hpositionWS = mul(invViewProjMatrix, positionCS); - return hpositionWS.xyz / hpositionWS.w; -} - -// Taken from: -// com.unity.render-pipelines.core@12.0.0/ShaderLibrary/Common.hlsl -float3 CrestComputeWorldSpacePosition(float4 positionCS, float4x4 invViewProjMatrix) -{ - float4 hpositionWS = mul(invViewProjMatrix, positionCS); - return hpositionWS.xyz / hpositionWS.w; -} - -#undef ComputeClipSpacePosition -#undef ComputeWorldSpacePosition - -// Replace these with our own as ComputeClipSpacePosition flips the Y which is not correct for BIRP. -#define ComputeClipSpacePosition CrestComputeClipSpacePosition -#define ComputeWorldSpacePosition CrestComputeWorldSpacePosition - -// Taken from: -// com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl -real3 CrestUnpackNormalmapRGorAG(real4 packednormal) -{ - // This do the trick - packednormal.x *= packednormal.w; - - real3 normal; - normal.xy = packednormal.xy * 2 - 1; - normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy))); - return normal; -} - -// Taken from: -// com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl -inline real3 CrestUnpackNormal(real4 packednormal) -{ -#if defined(UNITY_NO_DXT5nm) - return packednormal.xyz * 2 - 1; -#elif defined(UNITY_ASTC_NORMALMAP_ENCODING) - return UnpackNormalDXT5nm(packednormal); -#else - return CrestUnpackNormalmapRGorAG(packednormal); -#endif -} - -#undef UnpackNormal - -// Replace these to solve Unity bug "ambiguous call to 'UnpackNormalmapRGorAG'" -#define UnpackNormal CrestUnpackNormal +// Empty. diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl index a07e1025f..8d2de128c 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl @@ -1,75 +1,35 @@ // Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. -// This file is subject to the Unity Companion License: -// https://github.com/Unity-Technologies/Graphics/blob/7ff8fd444c179fd9bb380d61f4865be6935b47dd/LICENSE.md +// Builds on Unity's shim for Shader Graph. -// Adds functions from SRP. +#define BUILTIN_TARGET_API 1 -// Adapted from: -// https://github.com/Unity-Technologies/Graphics/blob/8f54e6591e93fb3bf8e9879a0e43665dfbe2f629/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl -// https://github.com/Unity-Technologies/Graphics/blob/7ff8fd444c179fd9bb380d61f4865be6935b47dd/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/TextureXR.hlsl +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShaderPass.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl" +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl" +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" -#ifndef BUILTIN_PIPELINE_CORE_INCLUDED -#define BUILTIN_PIPELINE_CORE_INCLUDED +#ifndef d_WaveHarmonic_Utility_LegacyCore +#define d_WaveHarmonic_Utility_LegacyCore -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Common.hlsl" -// Stereo-related bits -#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) +// +// Inputs +// - #define SLICE_ARRAY_INDEX unity_StereoEyeIndex +#undef UNITY_MATRIX_I_VP - #define COORD_TEXTURE2D_X(pixelCoord) uint3(pixelCoord, SLICE_ARRAY_INDEX) - - #define TEXTURE2D_X(textureName) TEXTURE2D_ARRAY(textureName) - // #define TEXTURE2D_X_PARAM(textureName, samplerName) TEXTURE2D_ARRAY_PARAM(textureName, samplerName) - // #define TEXTURE2D_X_ARGS(textureName, samplerName) TEXTURE2D_ARRAY_ARGS(textureName, samplerName) - // #define TEXTURE2D_X_HALF(textureName) TEXTURE2D_ARRAY_HALF(textureName) - // #define TEXTURE2D_X_FLOAT(textureName) TEXTURE2D_ARRAY_FLOAT(textureName) - - #define RW_TEXTURE2D_X(type, textureName) RW_TEXTURE2D_ARRAY(type, textureName) - - #define LOAD_TEXTURE2D_X(textureName, unCoord2) LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, SLICE_ARRAY_INDEX) - // #define LOAD_TEXTURE2D_X_LOD(textureName, unCoord2, lod) LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, SLICE_ARRAY_INDEX, lod) - #define SAMPLE_TEXTURE2D_X(textureName, samplerName, coord2) SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, SLICE_ARRAY_INDEX) - // #define SAMPLE_TEXTURE2D_X_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, SLICE_ARRAY_INDEX, lod) - // #define GATHER_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, SLICE_ARRAY_INDEX) - // #define GATHER_RED_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_RED_TEXTURE2D(textureName, samplerName, float3(coord2, SLICE_ARRAY_INDEX)) - // #define GATHER_GREEN_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_GREEN_TEXTURE2D(textureName, samplerName, float3(coord2, SLICE_ARRAY_INDEX)) - // #define GATHER_BLUE_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_BLUE_TEXTURE2D(textureName, samplerName, float3(coord2, SLICE_ARRAY_INDEX)) - -#else // UNITY_STEREO - - #define SLICE_ARRAY_INDEX 0 - - #define COORD_TEXTURE2D_X(pixelCoord) pixelCoord - - #define TEXTURE2D_X(textureName) TEXTURE2D(textureName) - // #define TEXTURE2D_X_PARAM(textureName, samplerName) TEXTURE2D_PARAM(textureName, samplerName) - // #define TEXTURE2D_X_ARGS(textureName, samplerName) TEXTURE2D_ARGS(textureName, samplerName) - // #define TEXTURE2D_X_HALF(textureName) TEXTURE2D_HALF(textureName) - // #define TEXTURE2D_X_FLOAT(textureName) TEXTURE2D_FLOAT(textureName) - - #define RW_TEXTURE2D_X RW_TEXTURE2D - - #define LOAD_TEXTURE2D_X(textureName, unCoord2) LOAD_TEXTURE2D(textureName, unCoord2) - // #define LOAD_TEXTURE2D_X_LOD(textureName, unCoord2, lod) LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) - #define SAMPLE_TEXTURE2D_X(textureName, samplerName, coord2) SAMPLE_TEXTURE2D(textureName, samplerName, coord2) - // #define SAMPLE_TEXTURE2D_X_LOD(textureName, samplerName, coord2, lod) SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) - // #define GATHER_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_TEXTURE2D(textureName, samplerName, coord2) - // #define GATHER_RED_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) - // #define GATHER_GREEN_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) - // #define GATHER_BLUE_TEXTURE2D_X(textureName, samplerName, coord2) GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) - -#endif // UNITY_STEREO - -// Helper macro to assign view index during compute/ray pass (usually from SV_DispatchThreadID or DispatchRaysIndex()) -#if defined(SHADER_STAGE_COMPUTE) || defined(SHADER_STAGE_RAY_TRACING) - #if defined(UNITY_STEREO_INSTANCING_ENABLED) - #define UNITY_XR_ASSIGN_VIEW_INDEX(viewIndex) unity_StereoEyeIndex = viewIndex; - #else - #define UNITY_XR_ASSIGN_VIEW_INDEX(viewIndex) - #endif +#if defined(STEREO_INSTANCING_ON) || defined(STEREO_MULTIVIEW_ON) +float4x4 _Crest_StereoInverseViewProjection[2]; +#define UNITY_MATRIX_I_VP _Crest_StereoInverseViewProjection[unity_StereoEyeIndex] +#else +float4x4 _Crest_InverseViewProjection; +#define UNITY_MATRIX_I_VP _Crest_InverseViewProjection #endif -#endif // BUILTIN_PIPELINE_CORE_INCLUDED +// Not set and _ScreenParams.zw is "1.0 + 1.0 / _ScreenParams.xy" +#define _ScreenSize float4(_ScreenParams.xy, float2(1.0, 1.0) / _ScreenParams.xy) + +#endif // d_WaveHarmonic_Utility_LegacyCore diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl new file mode 100644 index 000000000..f7c590f2f --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl @@ -0,0 +1,111 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Utility_ShaderGraphDefines +#define d_WaveHarmonic_Utility_ShaderGraphDefines + +// +// Defines +// + +#ifdef _BUILTIN_SPECULAR_SETUP +#define _SPECULAR_SETUP _BUILTIN_SPECULAR_SETUP +#endif + +#ifdef _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS +#define _TRANSPARENT_RECEIVES_SHADOWS _BUILTIN_TRANSPARENT_RECEIVES_SHADOWS +#endif + + +// +// Passes +// + +#define SHADERPASS_FORWARD_ADD (20) +#define SHADERPASS_DEFERRED (21) +#define SHADERPASS_MOTION_VECTORS (22) + + +// +// Deferred Fix +// + +#if (defined(SHADER_API_GLES3) && !defined(SHADER_API_DESKTOP)) || defined(SHADER_API_GLES) || defined(SHADER_API_N3DS) + #define UNITY_ALLOWED_MRT_COUNT 4 +#else + #define UNITY_ALLOWED_MRT_COUNT 8 +#endif + +// Required on Windows (and possibly others) to prevent tiling. +#undef UNITY_SAMPLE_FULL_SH_PER_PIXEL +#define UNITY_SAMPLE_FULL_SH_PER_PIXEL 1 + + +// +// Stereo Instancing Fix +// + +#if defined(STEREO_INSTANCING_ON) && (defined(SHADER_API_D3D11) || defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE) || defined(SHADER_API_PSSL) || defined(SHADER_API_VULKAN) || (defined(SHADER_API_METAL) && !defined(UNITY_COMPILER_DXC))) +#define UNITY_STEREO_INSTANCING_ENABLED +#endif + +#if defined(STEREO_MULTIVIEW_ON) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE) || defined(SHADER_API_VULKAN)) && !(defined(SHADER_API_SWITCH)) +#define UNITY_STEREO_MULTIVIEW_ENABLED +#endif + +// Redeclared their includes to insert shadow declarations at the right spot. +// Adapted from: +// Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl + +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + +// Duplicate define in Macros.hlsl +#if defined (TRANSFORM_TEX) +#undef TRANSFORM_TEX +#endif + +#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) +#undef GLOBAL_CBUFFER_START +#if defined(UNITY_STEREO_MULTIVIEW_ENABLED) || ((defined(UNITY_SINGLE_PASS_STEREO) || defined(UNITY_STEREO_INSTANCING_ENABLED)) && (defined(SHADER_API_GLCORE) || defined(SHADER_API_GLES3) || defined(SHADER_API_METAL))) + #define GLOBAL_CBUFFER_START(name) cbuffer name { + #define GLOBAL_CBUFFER_END } +#else + #define GLOBAL_CBUFFER_START(name) CBUFFER_START(name) + #define GLOBAL_CBUFFER_END CBUFFER_END +#endif +#endif + +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/HLSLSupportShim.hlsl" + +// Fix wrong definitions. +#undef UNITY_SAMPLE_TEX2DARRAY +#define UNITY_SAMPLE_TEX2DARRAY(tex,coord) SAMPLE_TEXTURE2D_ARRAY(tex, sampler##tex, coord.xy, coord.z) + + +// +// Transparent Objects Receives Shadows +// + +#if _SURFACE_TYPE_TRANSPARENT +#if _TRANSPARENT_RECEIVES_SHADOWS +#if SHADERPASS == SHADERPASS_FORWARD || SHADERPASS == SHADERPASS_FORWARD_ADD +#if DIRECTIONAL || DIRECTIONAL_COOKIE +#if !SHADOWS_SCREEN + +StructuredBuffer _Crest_WorldToShadow; + +// Declarations for shadow collector. +UNITY_DECLARE_SHADOWMAP(_ShadowMapTexture); +float4 _ShadowMapTexture_TexelSize; +#define SHADOWMAPSAMPLER_DEFINED 1 +#define SHADOWMAPSAMPLER_AND_TEXELSIZE_DEFINED 1 + +#define d_Crest_ShadowsOverriden 1 + +#endif +#endif +#endif +#endif +#endif + +#endif // d_WaveHarmonic_Utility_ShaderGraphDefines diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl.meta new file mode 100644 index 000000000..a33dbe022 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1d26727ac31d94682896ffbfdc685804 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl index 7b40cd953..0fc2a485a 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl @@ -1,18 +1,4 @@ // Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. -// Defines missing inputs. - -float4x4 _Crest_InverseViewProjection; -float4x4 _Crest_InverseViewProjectionRight; - -#undef UNITY_MATRIX_I_VP - -#if defined(STEREO_INSTANCING_ON) || defined(STEREO_MULTIVIEW_ON) -#define UNITY_MATRIX_I_VP (unity_StereoEyeIndex == 0 ? _Crest_InverseViewProjection : _Crest_InverseViewProjectionRight) -#else -#define UNITY_MATRIX_I_VP _Crest_InverseViewProjection -#endif - -// Not set and _ScreenParams.zw is "1.0 + 1.0 / _ScreenParams.xy" -#define _ScreenSize float4(_ScreenParams.xy, float2(1.0, 1.0) / _ScreenParams.xy) +// Empty. diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl new file mode 100644 index 000000000..ff204997f --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl @@ -0,0 +1,109 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/LegacyBuilding.hlsl" + +// +// Transparent Objects Receives Shadows +// + +#if d_Crest_ShadowsOverriden + +#define unity_WorldToShadow _Crest_WorldToShadow + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl" + +#if defined(SHADER_API_MOBILE) +#define m_UnitySampleShadowmap_PCF UnitySampleShadowmap_PCF5x5 +#else +#define m_UnitySampleShadowmap_PCF UnitySampleShadowmap_PCF7x7 +#endif + +// Same as UnityComputeShadowFadeDistance, except it uses keywords. +float ComputeShadowFadeDistance(float3 positionWS, float viewZ) +{ + // Use keyword instead of unity_ShadowFadeCenterAndType.w, as we are already + // dependent on keywords anyway. + return +#if SHADOWS_SPLIT_SPHERES + distance(positionWS, unity_ShadowFadeCenterAndType.xyz); +#else + viewZ; +#endif +} + +float GetShadows(float3 positionWS, float4 uvLightMap) +{ + float viewZ = -UnityWorldToViewPos(positionWS).z; + float4 weights = GET_CASCADE_WEIGHTS(positionWS, viewZ); + float4 coordinates = GET_SHADOW_COORDINATES(float4(positionWS, 1.0), weights); +#if SHADOWS_SOFT + half shadow = m_UnitySampleShadowmap_PCF(coordinates, 0); +#else + half shadow = UNITY_SAMPLE_SHADOW(_ShadowMapTexture, coordinates); +#endif + shadow = lerp(_LightShadowData.r, 1.0, shadow); + + // Shadow Mask + mixed sun + static +#if LIGHTMAP_ON && SHADOWS_SHADOWMASK && LIGHTMAP_SHADOW_MIXING + float fade = UnityComputeShadowFade(ComputeShadowFadeDistance(positionWS, viewZ)); + half mask = UnitySampleBakedOcclusion(uvLightMap.xy, positionWS); + shadow = UnityMixRealtimeAndBakedShadows(shadow, mask, fade); +#endif + + return shadow; +} + +#ifdef DIRECTIONAL +#undef UNITY_LIGHT_ATTENUATION +#define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) \ + fixed destName = GetShadows(worldPos, input.lmap); +#endif + +#ifdef DIRECTIONAL_COOKIE +#undef UNITY_LIGHT_ATTENUATION +#define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) \ + DECLARE_LIGHT_COORD(input, worldPos); \ + fixed destName = tex2D(_LightTexture0, lightCoord).w * GetShadows(worldPos, input.lmap); +#endif + +#endif // d_Crest_ShadowsOverriden + + +// +// Specular +// + +#ifdef _SPECULAR_SETUP +#define SurfaceOutputStandard SurfaceOutputStandardSpecular +#define BuildStandardSurfaceOutput BuildStandardSpecularSurfaceOutput +#define LightingStandard LightingStandardSpecular +#define LightingStandard_GI LightingStandardSpecular_GI +#define LightingStandard_Deferred LightingStandardSpecular_Deferred + +#if SHADERPASS == SHADERPASS_FORWARD_ADD +#undef LightingStandard +#define LightingStandard(x, y, z) LightingStandardSpecular(x, y, z); c.rgb += o.Emission; +#endif +#endif + +#ifndef _SPECULAR_SETUP +#if SHADERPASS == SHADERPASS_FORWARD_ADD +#define LightingStandard(x, y, z) LightingStandard(x, y, z); c.rgb += o.Emission; +#endif // SHADERPASS_FORWARD_ADD +#endif // _SPECULAR_SETUP + +SurfaceOutputStandardSpecular BuildStandardSpecularSurfaceOutput(SurfaceDescription surfaceDescription, InputData inputData) +{ + SurfaceData surface = SurfaceDescriptionToSurfaceData(surfaceDescription); + + SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0; + o.Albedo = surface.albedo; + o.Normal = inputData.normalWS; + o.Specular = surface.specular; + o.Smoothness = surface.smoothness; + o.Occlusion = surface.occlusion; + o.Emission = surface.emission; + o.Alpha = surface.alpha; + return o; +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl.meta new file mode 100644 index 000000000..8ca1507d1 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/LegacyBuilding.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5eab24690c4a74ceca26a143da611306 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl new file mode 100644 index 000000000..6c7b065b0 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl @@ -0,0 +1,51 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// TODO: +// #if defined(USING_STEREO_MATRICES) +// float4x4 _StereoNonJitteredVP[2]; +// float4x4 _StereoPreviousVP[2]; +// #else +// float4x4 _NonJitteredVP; +// float4x4 _PreviousVP; +// #endif + +float4x4 _PreviousM; +float4x4 _PreviousVP; +float4x4 _NonJitteredVP; + +bool _HasLastPositionData; +bool _ForceNoMotion; +float _MotionVectorDepthBias; + +#undef UNITY_PREV_MATRIX_M +#define UNITY_PREV_MATRIX_M _PreviousM +#define _PrevViewProjMatrix _PreviousVP +#define _NonJitteredViewProjMatrix _NonJitteredVP + +// X : Use last frame positions (right now skinned meshes are the only objects that use this +// Y : Force No Motion +// Z : Z bias value +const static float4 unity_MotionVectorsParams = float4(_HasLastPositionData, !_ForceNoMotion, _MotionVectorDepthBias, 0); + +// Unity will populate this, but could not see when in source. +float4 _LastTime; + +// We want to gather some internal data from the BuildVaryings call to +// avoid rereading and recalculating these values again in the ShaderGraph motion vector pass +struct MotionVectorPassOutput +{ + float3 positionOS; + float3 positionWS; +}; + +SurfaceDescription BuildSurfaceDescription(Varyings varyings) +{ + SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(varyings); + SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs); + return surfaceDescription; +} + +// Very hacky, but works! +#define BuildVaryings(content) BuildVaryings(content, inout MotionVectorPassOutput motionVectorOutput) +#define TransformObjectToWorld(content) TransformObjectToWorld(content); motionVectorOutput.positionOS = input.positionOS; motionVectorOutput.positionWS = positionWS; diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl.meta new file mode 100644 index 000000000..b1712a873 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorCommon.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1eacca53c60984c4a8cadb624777e644 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl new file mode 100644 index 000000000..1db22e6a3 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl @@ -0,0 +1,159 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// Adapted from: +// Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/MotionVectorPass.hlsl + +// This file is subject to the Unity Companion License: +// https://github.com/Unity-Technologies/Graphics/blob/61584ec20cf305929dae85cec7b94ff2ed3942f3/LICENSE.md + +#ifndef SG_MOTION_VECTORS_PASS_INCLUDED +#define SG_MOTION_VECTORS_PASS_INCLUDED + +#undef BuildVaryings +#undef TransformObjectToWorld + +float2 CalcNdcMotionVectorFromCsPositions(float4 posCS, float4 prevPosCS) +{ + // Note: unity_MotionVectorsParams.y is 0 is forceNoMotion is enabled + bool forceNoMotion = unity_MotionVectorsParams.y == 0.0; + if (forceNoMotion) + return float2(0.0, 0.0); + + // Non-uniform raster needs to keep the posNDC values in float to avoid additional conversions + // since uv remap functions use floats + float2 posNDC = posCS.xy * rcp(posCS.w); + float2 prevPosNDC = prevPosCS.xy * rcp(prevPosCS.w); + + float2 velocity; + { + // Calculate forward velocity + velocity = (posNDC.xy - prevPosNDC.xy); + #if UNITY_UV_STARTS_AT_TOP + velocity.y = -velocity.y; + #endif + + // Convert velocity from NDC space (-1..1) to UV 0..1 space + // Note: It doesn't mean we don't have negative values, we store negative or positive offset in UV space. + // Note: ((posNDC * 0.5 + 0.5) - (prevPosNDC * 0.5 + 0.5)) = (velocity * 0.5) + velocity.xy *= 0.5; + } + + return velocity; +} + +struct MotionVectorPassAttributes +{ + float3 previousPositionOS : TEXCOORD4; // Contains previous frame local vertex position (for skinned meshes) +}; + +// Note: these will have z == 0.0f in the pixel shader to save on bandwidth +struct MotionVectorPassVaryings +{ + float4 positionCSNoJitter; + float4 previousPositionCSNoJitter; +}; + +struct PackedMotionVectorPassVaryings +{ + float3 positionCSNoJitter : CLIP_POSITION_NO_JITTER; + float3 previousPositionCSNoJitter : PREVIOUS_CLIP_POSITION_NO_JITTER; +}; + +PackedMotionVectorPassVaryings PackMotionVectorVaryings(MotionVectorPassVaryings regularVaryings) +{ + PackedMotionVectorPassVaryings packedVaryings; + packedVaryings.positionCSNoJitter = regularVaryings.positionCSNoJitter.xyw; + packedVaryings.previousPositionCSNoJitter = regularVaryings.previousPositionCSNoJitter.xyw; + return packedVaryings; +} + +MotionVectorPassVaryings UnpackMotionVectorVaryings(PackedMotionVectorPassVaryings packedVaryings) +{ + MotionVectorPassVaryings regularVaryings; + regularVaryings.positionCSNoJitter = float4(packedVaryings.positionCSNoJitter.xy, 0, packedVaryings.positionCSNoJitter.z); + regularVaryings.previousPositionCSNoJitter = float4(packedVaryings.previousPositionCSNoJitter.xy, 0, packedVaryings.previousPositionCSNoJitter.z); + return regularVaryings; +} + +float3 GetLastFrameDeformedPosition(Attributes input, MotionVectorPassOutput currentFrameMvData, float3 previousPositionOS) +{ + Attributes lastFrameInputAttributes = input; + lastFrameInputAttributes.positionOS = previousPositionOS; + + VertexDescriptionInputs lastFrameVertexDescriptionInputs = BuildVertexDescriptionInputs(lastFrameInputAttributes); +#if defined(AUTOMATIC_TIME_BASED_MOTION_VECTORS) && defined(GRAPH_VERTEX_USES_TIME_PARAMETERS_INPUT) + lastFrameVertexDescriptionInputs.TimeParameters = _LastTime.yxz; +#endif + + VertexDescription lastFrameVertexDescription = VertexDescriptionFunction(lastFrameVertexDescriptionInputs); + previousPositionOS = lastFrameVertexDescription.Position.xyz; + + return previousPositionOS; +} + +// ------------------------------------- +// Vertex +void vert( + Attributes input, + MotionVectorPassAttributes passInput, + out PackedMotionVectorPassVaryings packedMvOutput, + out PackedVaryings packedOutput) +{ + Varyings output = (Varyings)0; + MotionVectorPassVaryings mvOutput = (MotionVectorPassVaryings)0; + MotionVectorPassOutput currentFrameMvData = (MotionVectorPassOutput)0; + output = BuildVaryings(input, currentFrameMvData); + packedOutput = PackVaryings(output); + + const bool forceNoMotion = unity_MotionVectorsParams.y == 0.0; + + if (!forceNoMotion) + { + const bool hasDeformation = unity_MotionVectorsParams.x == 1; // Mesh has skinned deformation + float3 previousPositionOS = hasDeformation ? passInput.previousPositionOS : input.positionOS; + + #if defined(AUTOMATIC_TIME_BASED_MOTION_VECTORS) && defined(GRAPH_VERTEX_USES_TIME_PARAMETERS_INPUT) + const bool applyDeformation = true; + #else + const bool applyDeformation = hasDeformation; + #endif + +#if defined(FEATURES_GRAPH_VERTEX) + if (applyDeformation) + previousPositionOS = GetLastFrameDeformedPosition(input, currentFrameMvData, previousPositionOS); + else + previousPositionOS = currentFrameMvData.positionOS; + + #if defined(FEATURES_GRAPH_VERTEX_MOTION_VECTOR_OUTPUT) + previousPositionOS -= currentFrameMvData.motionVector; + #endif +#endif + + mvOutput.positionCSNoJitter = mul(_NonJitteredViewProjMatrix, float4(currentFrameMvData.positionWS, 1.0f)); + mvOutput.previousPositionCSNoJitter = mul(_PrevViewProjMatrix, mul(UNITY_PREV_MATRIX_M, float4(previousPositionOS, 1.0f))); + } + + packedMvOutput = PackMotionVectorVaryings(mvOutput); +} + +// ------------------------------------- +// Fragment +float4 frag( + // Note: packedMvInput needs to be before packedInput as otherwise we get the following error in the speed tree 8 SG: + // "Non system-generated input signature parameter () cannot appear after a system generated value" + PackedMotionVectorPassVaryings packedMvInput, + PackedVaryings packedInput) : SV_Target +{ + Varyings input = UnpackVaryings(packedInput); + MotionVectorPassVaryings mvInput = UnpackMotionVectorVaryings(packedMvInput); + UNITY_SETUP_INSTANCE_ID(input); + SurfaceDescription surfaceDescription = BuildSurfaceDescription(input); + +#if defined(_ALPHATEST_ON) + clip(surfaceDescription.Alpha - surfaceDescription.AlphaClipThreshold); +#endif + + return float4(CalcNdcMotionVectorFromCsPositions(mvInput.positionCSNoJitter, mvInput.previousPositionCSNoJitter), 0, 0); +} +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl.meta new file mode 100644 index 000000000..10831fff1 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/MotionVectorPass.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ae5323918c4b24b5c87c6f941810e225 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl index 7c67b1b50..7fd90a7fe 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl @@ -1,4 +1,5 @@ // Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. // Copyright (c) 2016 Unity Technologies // @@ -19,24 +20,9 @@ // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// Screen-space shadow helpers. - -// Taken and adapted from: +// Taken from: // 2020.3.12f1/DefaultResourcesExtra/Internal-ScreenSpaceShadows.shader -// Main changes is that now only world position is required. Specialised for the shadow LOD data. - -// Add multi_compile_shadowcollector pragma to get SHADOWS_SPLIT_SPHERES and SHADOWS_SINGLE_CASCADE. -// https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html - -// SHADOWS_SCREEN + SHADOWS_CUBE will never be triggered for transparency, but -// Unity still compiles the variant which causes compiler errors. -#if defined(_SURFACE_TYPE_TRANSPARENT) && !defined(SHADERGRAPH_PREVIEW) && !defined(SHADOWS_SCREEN) && !defined(SHADOWS_CUBE) -#define d_Crest_ReceiveShadowsTransparent 1 -#endif - -#if d_Crest_ReceiveShadowsTransparent - #include "UnityShadowLibrary.cginc" #ifndef SHADOWMAPSAMPLER_DEFINED @@ -49,30 +35,27 @@ float4 _ShadowMapTexture_TexelSize; #endif #endif - // // Keywords based defines // #if defined (SHADOWS_SPLIT_SPHERES) - #define GET_CASCADE_WEIGHTS(wpos) getCascadeWeights_splitSpheres(wpos) + #define GET_CASCADE_WEIGHTS(wpos, z) getCascadeWeights_splitSpheres(wpos) #else - #define GET_CASCADE_WEIGHTS(wpos) getCascadeWeights(wpos) + #define GET_CASCADE_WEIGHTS(wpos, z) getCascadeWeights( wpos, z ) #endif #if defined (SHADOWS_SINGLE_CASCADE) - #define GET_SHADOW_COORDINATES(wpos) getShadowCoord_SingleCascade(wpos) + #define GET_SHADOW_COORDINATES(wpos,cascadeWeights) getShadowCoord_SingleCascade(wpos) #else - #define GET_SHADOW_COORDINATES(wpos) getShadowCoord(wpos) + #define GET_SHADOW_COORDINATES(wpos,cascadeWeights) getShadowCoord(wpos,cascadeWeights) #endif /** * Gets the cascade weights based on the world position of the fragment. * Returns a float4 with only one component set that corresponds to the appropriate cascade. */ -inline fixed4 getCascadeWeights(float3 wpos) +inline fixed4 getCascadeWeights(float3 wpos, float z) { - // Calculate depth. Normally this would be depth from the depth buffer. - float z = dot(wpos - _WorldSpaceCameraPos.xyz, unity_CameraToWorld._m02_m12_m22); fixed4 zNear = float4( z >= _LightSplitsNear ); fixed4 zFar = float4( z < _LightSplitsFar ); fixed4 weights = zNear * zFar; @@ -99,9 +82,8 @@ inline fixed4 getCascadeWeights_splitSpheres(float3 wpos) * Returns the shadowmap coordinates for the given fragment based on the world position and z-depth. * These coordinates belong to the shadowmap atlas that contains the maps for all cascades. */ -inline float4 getShadowCoord(float4 wpos) +inline float4 getShadowCoord( float4 wpos, fixed4 cascadeWeights ) { - fixed4 cascadeWeights = GET_CASCADE_WEIGHTS(wpos.xyz); float3 sc0 = mul (unity_WorldToShadow[0], wpos).xyz; float3 sc1 = mul (unity_WorldToShadow[1], wpos).xyz; float3 sc2 = mul (unity_WorldToShadow[2], wpos).xyz; @@ -119,7 +101,5 @@ inline float4 getShadowCoord(float4 wpos) */ inline float4 getShadowCoord_SingleCascade( float4 wpos ) { - return float4(mul(unity_WorldToShadow[0], wpos).xyz, 0); + return float4( mul (unity_WorldToShadow[0], wpos).xyz, 0); } - -#endif // d_Crest_ReceiveShadowsTransparent diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Lighting.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Lighting.hlsl index 2f1fc1d3b..a96a589f8 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Lighting.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Lighting.hlsl @@ -9,55 +9,54 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" -TEXTURE2D_X(_Crest_ScreenSpaceShadowTexture); -float4 _Crest_ScreenSpaceShadowTexture_TexelSize; - #if CREST_URP #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" // Unity renamed keyword. #ifdef USE_FORWARD_PLUS #define USE_CLUSTER_LIGHT_LOOP USE_FORWARD_PLUS +#endif // USE_FORWARD_PLUS + +#ifdef FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECK +#define CLUSTER_LIGHT_LOOP_SUBTRACTIVE_LIGHT_CHECK FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECK +#endif // FORWARD_PLUS_SUBTRACTIVE_LIGHT_CHECK + +#if UNITY_VERSION >= 60000000 +#if defined(STEREO_INSTANCING_ON) || defined(STEREO_MULTIVIEW_ON) +#if _ALPHATEST_ON +#if !USE_CLUSTER_LIGHT_LOOP +// If not clustered and additional light shadows and XR, the shading model +// completely breaks. It is like shadow attenuation is NaN or some obscure +// compiler issue. For 2022.3, it is broken for forward+ only, but cannot be fixed. +#define d_ShadowMaskBroken 1 +#else +#if _RECEIVE_SHADOWS_OFF +// Right eye broken rendering similar to above. +#define d_AdditionalLightsBroken 1 #endif +#endif +#endif +#endif +#endif + #endif // CREST_URP #if CREST_HDRP #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" -#ifndef SHADERGRAPH_PREVIEW -#if CREST_HDRP_FORWARD_PASS -#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadow.hlsl" -#endif -#endif - #if UNITY_VERSION < 202310 #define GetMeshRenderingLayerMask GetMeshRenderingLightLayer -#endif +#endif // UNITY_VERSION #if UNITY_VERSION < 60000000 #if PROBE_VOLUMES_L1 #define AMBIENT_PROBE_BUFFER 1 -#endif +#endif // PROBE_VOLUMES_L1 +#endif // UNITY_VERSION #endif // CREST_HDRP m_CrestNameSpace -// TODO: Move -void ApplyIndirectLightingMultiplier -( - inout half3 io_AmbientLight -) -{ - // Allows control of baked lighting through volume framework. -#ifndef SHADERGRAPH_PREVIEW - // We could create a BuiltinData struct which would have rendering layers on it, but it seems more complicated. - io_AmbientLight *= GetIndirectDiffuseMultiplier(GetMeshRenderingLayerMask()); -#endif -} -#else // CREST_HDRP -m_CrestNameSpace -#endif - void PrimaryLight ( const float3 i_PositionWS, @@ -82,72 +81,46 @@ void PrimaryLight o_Direction = normalize(UnityWorldSpaceLightDir(i_PositionWS)); #else o_Direction = _WorldSpaceLightPos0.xyz; + // Prevents divide by zero. + if (all(o_Direction == 0)) o_Direction = half3(0.0, 1.0, 0.0); #endif o_Color = _LightColor0.rgb; +#if SHADERPASS == SHADERPASS_FORWARD_ADD +#if !SHADOWS_SCREEN + // FIXME: undeclared identifier 'IN' in Pass: BuiltIn ForwardAdd, Vertex program with DIRECTIONAL SHADOWS_SCREEN + UNITY_LIGHT_ATTENUATION(attenuation, IN, i_PositionWS) + o_Color *= attenuation; +#endif +#endif #endif } -void AmbientLight(out half3 o_AmbientLight) +half3 AmbientLight(const half3 i_AmbientLight) +{ + half3 ambient = i_AmbientLight; + +#ifndef SHADERGRAPH_PREVIEW +#if CREST_HDRP + // Allows control of baked lighting through volume framework. + // We could create a BuiltinData struct which would have rendering layers on it, but it seems more complicated. + ambient *= GetIndirectDiffuseMultiplier(GetMeshRenderingLayerMask()); +#endif // CREST_HDRP +#endif // SHADERGRAPH_PREVIEW + + return ambient; +} + +half3 AmbientLight() { // Use the constant term (0th order) of SH stuff - this is the average. - o_AmbientLight = + const half3 ambient = #if AMBIENT_PROBE_BUFFER half3(_AmbientProbeData[0].w, _AmbientProbeData[1].w, _AmbientProbeData[2].w); #else half3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); #endif -#if CREST_HDRP - ApplyIndirectLightingMultiplier(o_AmbientLight); -#endif -} - -// Position: SRP = WS / BIRP = SS (z ignored) -half PrimaryLightShadows(const float3 i_Position) -{ - // Unshadowed. - half shadow = 1; - -#if CREST_URP - // We could skip GetMainLight but this is recommended approach which is likely more robust to API changes. - float4 shadowCoord = TransformWorldToShadowCoord(i_Position); - Light light = GetMainLight(TransformWorldToShadowCoord(i_Position)); - shadow = light.shadowAttenuation; -#endif - -#ifndef SHADERGRAPH_PREVIEW -#if CREST_HDRP_FORWARD_PASS - DirectionalLightData light = _DirectionalLightDatas[_DirectionalShadowIndex]; - HDShadowContext context = InitShadowContext(); - context.directionalShadowData = _HDDirectionalShadowData[_DirectionalShadowIndex]; - - float3 positionWS = GetCameraRelativePositionWS(i_Position); - // From Unity: - // > With XR single-pass and camera-relative: offset position to do lighting computations from the combined center view (original camera matrix). - // > This is required because there is only one list of lights generated on the CPU. Shadows are also generated once and shared between the instanced views. - ApplyCameraRelativeXR(positionWS); - - // TODO: Pass in screen space position and scene normal. - shadow = GetDirectionalShadowAttenuation - ( - context, - 0, // positionSS - positionWS, - 0, // normalWS - light.shadowIndex, - -light.forward - ); - - // Apply shadow strength from main light. - shadow = LerpWhiteTo(shadow, light.shadowDimmer); -#endif // CREST_HDRP_FORWARD_PASS -#endif // SHADERGRAPH_PREVIEW - -#if CREST_BIRP - shadow = LOAD_TEXTURE2D_X(_Crest_ScreenSpaceShadowTexture, min(i_Position.xy, _Crest_ScreenSpaceShadowTexture_TexelSize.zw - 1.0)).r; -#endif - - return shadow; + return AmbientLight(ambient); } half3 AdditionalLighting(const float3 i_PositionWS, const float4 i_ScreenPosition, const float2 i_StaticLightMapUV) @@ -156,32 +129,38 @@ half3 AdditionalLighting(const float3 i_PositionWS, const float4 i_ScreenPositio #if CREST_URP #if defined(_ADDITIONAL_LIGHTS) + InputData inputData = (InputData)0; + inputData.normalizedScreenSpaceUV = i_ScreenPosition.xy / i_ScreenPosition.w; + inputData.positionWS = i_PositionWS; // Shadowmask. #if defined(SHADOWS_SHADOWMASK) && defined(LIGHTMAP_ON) - half4 shadowMask = SAMPLE_SHADOWMASK(i_StaticLightMapUV); -#elif !defined(LIGHTMAP_ON) - half4 shadowMask = unity_ProbesOcclusion; -#else - half4 shadowMask = half4(1, 1, 1, 1); + inputData.shadowMask = SAMPLE_SHADOWMASK(i_StaticLightMapUV); #endif + const half4 shadowMask = CalculateShadowMask(inputData); + + // No AO, but we need the struct. + AmbientOcclusionFactor aoFactor = CreateAmbientOcclusionFactor(inputData.normalizedScreenSpaceUV, 0.0); + uint pixelLightCount = GetAdditionalLightsCount(); #ifdef _LIGHT_LAYERS uint meshRenderingLayers = GetMeshRenderingLayer(); #endif -#if USE_CLUSTER_LIGHT_LOOP - InputData inputData = (InputData)0; - // For Foward+ LIGHT_LOOP_BEGIN macro uses inputData.normalizedScreenSpaceUV and inputData.positionWS. - inputData.normalizedScreenSpaceUV = i_ScreenPosition.xy / i_ScreenPosition.w; - inputData.positionWS = i_PositionWS; -#endif - LIGHT_LOOP_BEGIN(pixelLightCount) // Includes shadows and cookies. - Light light = GetAdditionalLight(lightIndex, i_PositionWS, shadowMask); + Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor); + +#if d_ShadowMaskBroken + light.shadowAttenuation = 1.0; +#endif + +#if d_AdditionalLightsBroken + light.color = 0.0; +#endif + #ifdef _LIGHT_LAYERS if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers)) #endif @@ -189,9 +168,29 @@ LIGHT_LOOP_BEGIN(pixelLightCount) color += light.color * (light.distanceAttenuation * light.shadowAttenuation); } LIGHT_LOOP_END + +#if USE_CLUSTER_LIGHT_LOOP + // Additional directional lights. + [loop] for (uint lightIndex = 0; lightIndex < min(URP_FP_DIRECTIONAL_LIGHTS_COUNT, MAX_VISIBLE_LIGHTS); lightIndex++) + { + CLUSTER_LIGHT_LOOP_SUBTRACTIVE_LIGHT_CHECK + + Light light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor); + +#ifdef _LIGHT_LAYERS + if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers)) +#endif + { + color += light.color * (light.distanceAttenuation * light.shadowAttenuation); + } + } +#endif // USE_CLUSTER_LIGHT_LOOP #endif // _ADDITIONAL_LIGHTS #endif // CREST_URP + // HDRP todo. + // BIRP has additional lights as additional passes. Handled elsewhere. + return color; } diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP.meta new file mode 100644 index 000000000..3d9a0b0c4 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a381e15a67ba0474ea0e685cc27a6f8a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl new file mode 100644 index 000000000..587d65f48 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl @@ -0,0 +1,71 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Utility_RenderPipeline_Compute +#define d_WaveHarmonic_Utility_RenderPipeline_Compute + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl" + +// Compute does not have an equivalent of PackageRequirements. +// We must handle it ourselves. + +// Fallback to BIRP if HDRP package missing. +#if _HRP +#if (CREST_PACKAGE_HDRP != 1) +#undef _HRP +#define _BRP 1 +#endif +#endif + +// Fallback to BIRP if URP package missing. +#if _URP +#if (CREST_PACKAGE_URP != 1) +#undef _URP +#define _BRP 1 +#endif +#endif + +#if _BRP +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" +#endif + +#if _HRP +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" +#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" +#endif + +#if _URP +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" +#endif + + +// +// Stereo Rendering +// + +// Unity 6 only, but had compilation errors for non HDRP anyway: +// #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureXR.hlsl" + +#ifndef RW_TEXTURE2D_X +#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define COORD_TEXTURE2D_X(pixelCoord) uint3(pixelCoord, SLICE_ARRAY_INDEX) + #define RW_TEXTURE2D_X(type, textureName) RW_TEXTURE2D_ARRAY(type, textureName) +#else // UNITY_STEREO + #define COORD_TEXTURE2D_X(pixelCoord) pixelCoord + #define RW_TEXTURE2D_X RW_TEXTURE2D +#endif // UNITY_STEREO +#endif // RW_TEXTURE2D_X + +#ifndef UNITY_XR_ASSIGN_VIEW_INDEX +// Helper macro to assign view index during compute/ray pass (usually from SV_DispatchThreadID or DispatchRaysIndex()) +#if defined(SHADER_STAGE_COMPUTE) || defined(SHADER_STAGE_RAY_TRACING) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) + #define UNITY_XR_ASSIGN_VIEW_INDEX(viewIndex) unity_StereoEyeIndex = viewIndex; + #else + #define UNITY_XR_ASSIGN_VIEW_INDEX(viewIndex) + #endif +#endif +#endif // UNITY_XR_ASSIGN_VIEW_INDEX + +#endif // d_WaveHarmonic_Utility_RenderPipeline_Compute diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl.meta new file mode 100644 index 000000000..3c17dd1c9 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 68cb1a44e787e45bd9de666d527b10f2 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP.meta new file mode 100644 index 000000000..a54fbc993 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de25b8cb31cac9b4db1835b9632de8db +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl new file mode 100644 index 000000000..d67b0eb4e --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl @@ -0,0 +1,12 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Utility_RenderPipeline_HDRP_Common +#define d_WaveHarmonic_Utility_RenderPipeline_HDRP_Common + +#define LoadSceneColor LoadCameraColor +#define LoadSceneDepth LoadCameraDepth +#define SampleSceneColor SampleCameraColor +#define SampleSceneDepth SampleCameraDepth + +#endif // d_WaveHarmonic_Utility_RenderPipeline_HDRP_Common diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl.meta new file mode 100644 index 000000000..1e5e64663 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 327c164f365e1468789c5950ac945e17 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl new file mode 100644 index 000000000..df7900179 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl @@ -0,0 +1,107 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Utility_RenderPipeline_Shadows +#define d_WaveHarmonic_Utility_RenderPipeline_Shadows + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Macros.hlsl" + +#if _BRP +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl" + +bool _Crest_ClearShadows; +#endif + +#if _HRP +// TODO: We might be able to expose this to give developers the option. +// #pragma multi_compile SHADOW_ULTRA_LOW SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH + +// Ultra low uses Gather to filter which should be same cost as not filtering. See algorithms per keyword: +// Runtime/Lighting/Shadow/HDShadowAlgorithms.hlsl +#define SHADOW_ULTRA_LOW +#define AREA_SHADOW_LOW +#define PUNCTUAL_SHADOW_ULTRA_LOW +#define DIRECTIONAL_SHADOW_ULTRA_LOW + +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl" +#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadow.hlsl" +#endif + +#if _URP +// Maybe this is the equivalent of the SHADOW_COLLECTOR_PASS define? +// Inspired from com.unity.render-pipelines.universal/Shaders/Utils/ScreenSpaceShadows.shader +#define _MAIN_LIGHT_SHADOWS_CASCADE +#define MAIN_LIGHT_CALCULATE_SHADOWS + +#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" +#endif + +m_UtilityNameSpace + +#if _BRP +half SampleShadows(const float4 i_positionWS) +{ + // NOTE: "Shadow Projection > Close Fit" can still produce artefacts when away from caster, but this + // appears to be an improvement over the compute shader. + + // Calculate depth. Normally this would be depth from the depth buffer. + float z = dot(i_positionWS.xyz - _WorldSpaceCameraPos.xyz, unity_CameraToWorld._m02_m12_m22); + + float4 weights = GET_CASCADE_WEIGHTS(i_positionWS.xyz, z); + float4 shadowCoord = GET_SHADOW_COORDINATES(i_positionWS, weights); + half shadows = UNITY_SAMPLE_SHADOW(_ShadowMapTexture, shadowCoord); + if (_Crest_ClearShadows) shadows = 1.0; + shadows = lerp(_LightShadowData.r, 1.0, shadows); + + return shadows; +} + +half ComputeShadowFade(const float4 i_positionWS) +{ + float z = dot(i_positionWS.xyz - _WorldSpaceCameraPos.xyz, unity_CameraToWorld._m02_m12_m22); + float fadeDistance = UnityComputeShadowFadeDistance(i_positionWS.xyz, z); + float fade = UnityComputeShadowFade(fadeDistance); + return fade; +} +#endif + +#if _HRP +half SampleShadows(const float4 i_positionWS) +{ + // Get directional light data. By definition we only have one directional light casting shadow. + DirectionalLightData light = _DirectionalLightDatas[_DirectionalShadowIndex]; + HDShadowContext context = InitShadowContext(); + + // Zeros are for screen space position and world space normal which are for filtering and normal bias + // respectively. They did not appear to have an impact. + half shadows = GetDirectionalShadowAttenuation(context, 0, i_positionWS.xyz, 0, _DirectionalShadowIndex, -light.forward); + // Apply shadow strength from main light. + shadows = LerpWhiteTo(shadows, light.shadowDimmer); + + return shadows; +} + +half ComputeShadowFade(const float4 i_positionWS) +{ + // TODO: Work out shadow fade. + return 0.0; +} +#endif + +#if _URP +half SampleShadows(const float4 i_positionWS) +{ + // Includes soft shadows if _SHADOWS_SOFT is defined (requires multi-compile pragma). + return MainLightRealtimeShadow(TransformWorldToShadowCoord(i_positionWS.xyz)); +} + +half ComputeShadowFade(const float4 i_positionWS) +{ + return GetShadowFade(i_positionWS.xyz); +} +#endif + +m_UtilityNameSpaceEnd + +#endif // d_WaveHarmonic_Utility_RenderPipeline_Shadows diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl.meta new file mode 100644 index 000000000..db96a6b5c --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Shadows.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 07d6b2cd79ac04fa5b56cffd5fb1bb31 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl new file mode 100644 index 000000000..c5e7193bd --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl @@ -0,0 +1,85 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef CREST_SHADOWS_H +#define CREST_SHADOWS_H + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" + +#if CREST_BIRP +TEXTURE2D_X(_Crest_ScreenSpaceShadowTexture); +float4 _Crest_ScreenSpaceShadowTexture_TexelSize; +#endif // CREST_BIRP + +#if CREST_URP +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" +#endif // CREST_URP + +#if CREST_HDRP +#include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + +#ifndef SHADERGRAPH_PREVIEW +#if CREST_HDRP_FORWARD_PASS +#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadow.hlsl" +#endif // CREST_HDRP_FORWARD_PASS +#endif // SHADERGRAPH_PREVIEW +#endif // CREST_HDRP + +m_CrestNameSpace + +// Position: SRP = WS / BIRP = SS (z ignored) +half PrimaryLightShadows(const float3 i_Position, const float2 i_ScreenPosition) +{ + // Unshadowed. + half shadow = 1; + +#if CREST_URP + // We could skip GetMainLight but this is recommended approach which is likely more robust to API changes. + float4 shadowCoord = TransformWorldToShadowCoord(i_Position); + Light light = GetMainLight(TransformWorldToShadowCoord(i_Position)); + shadow = light.shadowAttenuation; +#endif + +#ifndef SHADERGRAPH_PREVIEW +#if CREST_HDRP_FORWARD_PASS + DirectionalLightData light = _DirectionalLightDatas[_DirectionalShadowIndex]; + HDShadowContext context = InitShadowContext(); + context.directionalShadowData = _HDDirectionalShadowData[_DirectionalShadowIndex]; + + float3 positionWS = GetCameraRelativePositionWS(i_Position); + // From Unity: + // > With XR single-pass and camera-relative: offset position to do lighting computations from the combined center view (original camera matrix). + // > This is required because there is only one list of lights generated on the CPU. Shadows are also generated once and shared between the instanced views. + ApplyCameraRelativeXR(positionWS); + + // TODO: Pass in screen space position and scene normal. + shadow = GetDirectionalShadowAttenuation + ( + context, + 0, // positionSS + positionWS, + 0, // normalWS + light.shadowIndex, + -light.forward + ); + + // Apply shadow strength from main light. + shadow = LerpWhiteTo(shadow, light.shadowDimmer); +#endif // CREST_HDRP_FORWARD_PASS +#endif // SHADERGRAPH_PREVIEW + +#if CREST_BIRP + shadow = LOAD_TEXTURE2D_X(_Crest_ScreenSpaceShadowTexture, min(i_ScreenPosition, _Crest_ScreenSpaceShadowTexture_TexelSize.zw - 1.0)).r; +#if DIRECTIONAL_COOKIE + const half attenuation = tex2D(_LightTexture0, mul(unity_WorldToLight, float4(i_Position, 1.0)).xy).w; + shadow = min(attenuation, shadow); +#endif +#endif + + return shadow; +} + +m_CrestNameSpaceEnd + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl.meta new file mode 100644 index 000000000..974f25f9a --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b4623a51d04ef4e9c82e9196bf28e48d +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus.meta new file mode 100644 index 000000000..9bb1541c0 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7bf6aebdc1c0f3f47bad2841e2a11446 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl new file mode 100644 index 000000000..3eaf2374f --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl @@ -0,0 +1,69 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Crest_Meniscus +#define d_WaveHarmonic_Crest_Meniscus + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Depth.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" + +float2 _Crest_HorizonNormal; + +TEXTURE2D_X(_Crest_WaterMaskTexture); + +m_CrestNameSpace + +struct Attributes +{ + uint id : SV_VertexID; + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct Varyings +{ + float4 positionCS : SV_POSITION; + UNITY_VERTEX_OUTPUT_STEREO +}; + +Varyings Vertex(Attributes input) +{ + Varyings output; + ZERO_INITIALIZE(Varyings, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + output.positionCS = GetFullScreenTriangleVertexPosition(input.id, UNITY_RAW_FAR_CLIP_VALUE); + return output; +} + +half4 Fragment(Varyings input) +{ + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + + const uint2 positionSS = input.positionCS.xy; + const float mask = LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, positionSS).x; + const float2 offset = -((float2)mask) * _Crest_HorizonNormal; + float weight = 1.0; + + // Sample three pixels along the normal. If the sample is different than the + // current mask, apply meniscus. Offset must be added to positionSS as floats. + [unroll] + for (int i = 1; i <= 3; i++) + { + const float2 uv = positionSS + offset * (float)i; + const float newMask = LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, uv).r; + weight *= newMask != mask && newMask != 0.0 ? 0.9 : 1.0; + } + + return weight; +} + +m_CrestNameSpaceEnd + +m_CrestVertex +m_CrestFragment(half4) + +#endif // d_WaveHarmonic_Crest_Meniscus diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl.meta new file mode 100644 index 000000000..048c390b2 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0d256485a6a0c40f291276367afcede2 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl new file mode 100644 index 000000000..509a8c7d9 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl @@ -0,0 +1,245 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Crest_Meniscus +#define d_WaveHarmonic_Crest_Meniscus + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Depth.hlsl" + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Shim.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Lighting.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/VolumeLighting.hlsl" + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl" + +#if d_Masked +TEXTURE2D_X(_Crest_WaterMaskTexture); +#endif + +#if d_Crest_Lighting +// Surface/Volume parameters. +half4 _Crest_Absorption; +half4 _Crest_Scattering; +half _Crest_Anisotropy; +half _Crest_DirectTerm; +half _Crest_AmbientTerm; +half _Crest_ShadowsAffectsAmbientFactor; + +// Volume parameters. +half _Crest_SunBoost; +half3 _Crest_AmbientLighting; +int _Crest_DataSliceOffset; +#endif + +half _Crest_Radius; +half _Crest_RefractionStrength; + +m_CrestNameSpace + +struct Attributes +{ +#if d_Crest_Geometry + float3 positionOS : POSITION; +#else + uint id : SV_VertexID; +#endif + UNITY_VERTEX_INPUT_INSTANCE_ID +}; + +struct Varyings +{ + float4 positionCS : SV_POSITION; +#if d_Crest_Geometry + float3 positionWS : TEXCOORD; +#else + float2 uv : TEXCOORD; +#endif + UNITY_VERTEX_OUTPUT_STEREO +}; + +Varyings Vertex(Attributes input) +{ + Varyings output; + ZERO_INITIALIZE(Varyings, output); + UNITY_SETUP_INSTANCE_ID(input); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); + +#if d_Crest_Geometry + output.positionCS = TransformObjectToHClip(input.positionOS); + output.positionWS = TransformObjectToWorld(input.positionOS); +#else + output.positionCS = GetFullScreenTriangleVertexPosition(input.id); + output.uv = GetFullScreenTriangleTexCoord(input.id); +#endif + + return output; +} + +half4 Fragment(Varyings input) +{ + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + +#if d_Masked + // Prevent rendering inside of new portal modules. + if (LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, input.positionCS.xy).r == k_Crest_MaskInsidePortal) + { + discard; + } +#endif + + float3 positionWS; + float3 directionWS; + float2 uv; + +#if d_Crest_Geometry + { + positionWS = input.positionWS; +#if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) + positionWS.xyz += _WorldSpaceCameraPos.xyz; +#endif + directionWS = GetWorldSpaceNormalizeViewDir(positionWS); + uv = input.positionCS.xy / _ScreenSize.xy; + } +#else + { + positionWS = ComputeWorldSpacePosition(input.uv, UNITY_NEAR_CLIP_VALUE, UNITY_MATRIX_I_VP); + +#if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) + positionWS.xyz += _WorldSpaceCameraPos.xyz; +#endif + + directionWS = GetWorldSpaceNormalizeViewDir(positionWS); + + uv = input.uv; + } +#endif + + const float height = SampleWaterLineHeight(positionWS.xz).r; + + // Double as we half it if below. + float radius = _Crest_Radius * 2.0; + +#if d_Crest_Refraction + // Double the radius as aggressive falloff makes it much smaller. + radius *= 2.0; +#endif + + float signedDistance = positionWS.y - height; + + float3 viewDirWS = normalize(_WorldSpaceCameraPos - positionWS); + + const float distance = abs(signedDistance); + + if (signedDistance < 0) + { + radius = max(0.002, radius * 0.25); + } + + if (distance > radius) + { + discard; + } + + half3 color = 0.0; + +#if d_Crest_Lighting + { + half3 absorption = _Crest_Absorption.xyz; + half3 scattering = _Crest_Scattering.xyz; + + // Keep the same as the volume. + const int sliceIndex = clamp(_Crest_DataSliceOffset, 0, g_Crest_LodCount - 2); + + if (g_Crest_SampleAbsorptionSimulation) absorption = Cascade::MakeAbsorption(sliceIndex).Sample(_WorldSpaceCameraPos.xz).xyz; + if (g_Crest_SampleScatteringSimulation) scattering = Cascade::MakeScattering(sliceIndex).Sample(_WorldSpaceCameraPos.xz).xyz; + + float3 lightDirection; float3 lightColor; + PrimaryLight(positionWS, lightColor, lightDirection); + + const half3 extinction = VolumeExtinction(absorption, scattering); + + half opacity = 1.0; +#if !d_Crest_Refraction + // Meniscus can look too dark in shallow water. + { + const float depth = Cascade::MakeDepth(sliceIndex).SampleSignedDepthFromSeaLevel(_WorldSpaceCameraPos.xz); + opacity = VolumeOpacity(extinction, depth * 0.25); + } +#endif + + half shadow = 1.0; + { + // Soft in red, hard in green. But hard not computed in HDRP. + shadow = 1.0 - Cascade::MakeShadow(sliceIndex).SampleShadow(_WorldSpaceCameraPos.xz).x; + } + + half3 lighting = VolumeLighting + ( + extinction, + scattering, + _Crest_Anisotropy, + shadow, + lerp(half3(0, 1, 0), directionWS, opacity), + AmbientLight(_Crest_AmbientLighting), + lerp(half3(0, -1, 0), lightDirection, opacity), + lightColor, + half3(0.0, 0.0, 0.0), // Additional lights + _Crest_AmbientTerm, + _Crest_DirectTerm, + _Crest_SunBoost, + _Crest_ShadowsAffectsAmbientFactor + ); + +#if CREST_HDRP + lighting *= GetCurrentExposureMultiplier(); +#endif + + color = lighting; + } +#endif + + const float falloff = 1.0 - smoothstep(0.0, radius, distance); + +#if d_Crest_Refraction + { + const half3 normal = SampleWaterLineNormal(positionWS.xz, height); + float2 dir = Utility::WorldNormalToScreenDirection(positionWS, normal, UNITY_MATRIX_VP, 0.01); + + const float aspect = _ScreenParams.x / _ScreenParams.y; + dir.x /= aspect; + + const float2 uvRefracted = uv - dir * falloff * _Crest_RefractionStrength; + + half3 scene = SampleSceneColor(uvRefracted); + + if (signedDistance >= 0) + { + // Blend back in with original. Cannot seem to do this with alpha without losing + // some lighting. + scene = lerp + ( + scene, + SampleSceneColor(uv), + saturate((distance / radius) * 5.0) + ); + } + + color = lerp(color, scene, 0.5); + } +#endif + + return float4(color, falloff); +} + +m_CrestNameSpaceEnd + +m_CrestVertex +m_CrestFragment(half4) + +#endif // d_WaveHarmonic_Crest_Meniscus diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl.meta new file mode 100644 index 000000000..533fe5966 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f9eca4b9660d6423d89353a4148e9191 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader new file mode 100644 index 000000000..65de4fa0f --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader @@ -0,0 +1,594 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +Shader "Crest/Meniscus" +{ + Properties + { + _Crest_Radius("Radius", Range(0.001, 0.1)) = 0.01 + + [Space(10)] + + [Toggle(d_Crest_Refraction)] + _Crest_RefractionEnabled("Refraction", Integer) = 1 + _Crest_RefractionStrength("Refraction Strength", Range(0, 1)) = 0.2 + + [Space(10)] + + [Toggle(d_Crest_Lighting)] + _Crest_LightingEnabled("Lighting", Integer) = 1 + } + + HLSLINCLUDE + #pragma vertex Vertex + #pragma fragment Fragment + + // #pragma enable_d3d11_debug_symbols + ENDHLSL + + SubShader + { + PackageRequirements + { + "com.unity.render-pipelines.high-definition" + } + + Tags { "RenderPipeline"="HDRenderPipeline" } + + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + Cull Off + ZTest Always + ZWrite Off + + Pass + { + Name "Meniscus" + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl" + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Masked)" + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl" + + #define d_Masked 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Front Face)" + + Cull Back + ZTest LEqual + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl" + + #define d_Crest_Geometry 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Back Face)" + + Cull Front + ZTest LEqual + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl" + + #define d_Crest_Geometry 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + + // + // Obsolete. Depends on the raster mask. + // + + Pass + { + Name "Meniscus" + + Blend DstColor Zero + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Portal)" + + Blend DstColor Zero + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + + // Full-screen only applicable portals with back-faces. + #define d_Crest_HasBackFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Front Face)" + + Blend DstColor Zero + Cull Back + ZTest LEqual + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + + #define d_Crest_Geometry 1 + #define d_Crest_FrontFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Back Face)" + + Blend DstColor Zero + Cull Front + ZTest LEqual + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + + #define d_Crest_Geometry 1 + #define d_Crest_BackFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + } + + SubShader + { + PackageRequirements + { + "com.unity.render-pipelines.universal" + } + + Tags { "RenderPipeline"="UniversalPipeline" } + + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + Cull Off + ZTest Always + ZWrite Off + + Pass + { + Name "Meniscus" + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Masked)" + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + + #define d_Masked 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Front Face)" + + Cull Back + ZTest LEqual + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + + #define d_Crest_Geometry 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Back Face)" + + Cull Front + ZTest LEqual + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" + + #define d_Crest_Geometry 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + + // + // Obsolete. Depends on the raster mask. + // + + Pass + { + Name "Meniscus" + + Blend DstColor Zero + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Portal)" + + Blend DstColor Zero + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + + // Full-screen only applicable portals with back-faces. + #define d_Crest_HasBackFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Front Face)" + + Blend DstColor Zero + Cull Back + ZTest LEqual + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + + #define d_Crest_Geometry 1 + #define d_Crest_FrontFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Back Face)" + + Blend DstColor Zero + Cull Front + ZTest LEqual + + HLSLPROGRAM + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + + #define d_Crest_Geometry 1 + #define d_Crest_BackFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + } + + SubShader + { + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + Cull Off + ZTest Always + ZWrite Off + + Pass + { + Name "Meniscus" + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Masked)" + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + + #define d_Masked 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Front)" + + Cull Back + ZTest LEqual + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + #define d_Crest_Geometry 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Back)" + + Cull Front + ZTest LEqual + + HLSLPROGRAM + #pragma shader_feature_local_fragment _ d_Crest_Refraction + #pragma shader_feature_local_fragment _ d_Crest_Lighting + #define d_Crest_Geometry 1 + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/DeclareOpaqueTexture.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.hlsl" + ENDHLSL + } + + + // + // Obsolete. Depends on the raster mask. + // + + Pass + { + Name "Meniscus" + + Blend DstColor Zero + + HLSLPROGRAM + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.Obsolete.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Portal)" + + Blend DstColor Zero + + HLSLPROGRAM + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + + // Full-screen only applicable portals with back-faces. + #define d_Crest_HasBackFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Front Face)" + + Blend DstColor Zero + Cull Back + ZTest LEqual + + HLSLPROGRAM + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + + #define d_Crest_Geometry 1 + #define d_Crest_FrontFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Meniscus (Back Face)" + + Blend DstColor Zero + Cull Front + ZTest LEqual + + HLSLPROGRAM + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + + #define d_Crest_Geometry 1 + #define d_Crest_BackFace 1 + + #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Meniscus.hlsl" + ENDHLSL + } + } + + CustomEditor "WaveHarmonic.Crest.Editor.CustomShaderGUI" +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader.meta new file mode 100644 index 000000000..7660dcd08 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Meniscus/Meniscus.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ec7c774912c6f4b3cb6d73444cdedeca +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl new file mode 100644 index 000000000..42a6da350 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl @@ -0,0 +1,41 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Crest_SurfaceData +#define d_WaveHarmonic_Crest_SurfaceData + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Utility.hlsl" + +TEXTURE2D_FLOAT(_Crest_WaterLine); +float _Crest_WaterLineTexel; +float2 _Crest_WaterLineResolution; +float2 _Crest_WaterLineSnappedPosition; + +m_CrestNameSpace + +float SampleWaterLineHeight(const float2 i_PositionWS) +{ + const float2 uv = (i_PositionWS - _Crest_WaterLineSnappedPosition) / (_Crest_WaterLineTexel * _Crest_WaterLineResolution) + 0.5; + return _Crest_WaterLine.SampleLevel(_Crest_linear_clamp_sampler, uv, 0).r + g_Crest_WaterCenter.y; +} + +half3 SampleWaterLineNormal(const float2 i_PositionWS, const float i_Height) +{ + const float2 uv = (i_PositionWS - _Crest_WaterLineSnappedPosition) / (_Crest_WaterLineTexel * _Crest_WaterLineResolution) + 0.5; + const float3 dd = float3(1.0 / _Crest_WaterLineResolution.xy, 0.0); + const float xOffset = _Crest_WaterLine.SampleLevel(_Crest_linear_clamp_sampler, uv + dd.xz, 0).r; + const float zOffset = _Crest_WaterLine.SampleLevel(_Crest_linear_clamp_sampler, uv + dd.zy, 0).r; + + return normalize(half3 + ( + (xOffset - i_Height) / _Crest_WaterLineTexel, + 1.0, + (zOffset - i_Height) / _Crest_WaterLineTexel + )); +} + +m_CrestNameSpaceEnd + +#endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl.meta new file mode 100644 index 000000000..367339736 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 23b1ac5d9553947b69f3b3cfa0e3551d +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl new file mode 100644 index 000000000..4148dc64a --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl @@ -0,0 +1,35 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Crest_SurfaceFacing +#define d_WaveHarmonic_Crest_SurfaceFacing + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Helpers.hlsl" + +TEXTURE2D_X(_Crest_WaterMaskTexture); + +m_CrestNameSpace + +bool IsUnderWater(const bool i_FrontFace, const int i_ForceUnderwater, const uint2 i_PositionSS) +{ + bool underwater = false; + + // Use mask. + if (i_ForceUnderwater == 0) + { + underwater = LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, i_PositionSS).r <= CREST_MASK_BELOW_SURFACE; + } + else + { + underwater = IsUnderWater(i_FrontFace, i_ForceUnderwater); + } + + return underwater; +} + +m_CrestNameSpaceEnd + +#endif // d_WaveHarmonic_Crest_SurfaceFacing diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl.meta new file mode 100644 index 000000000..9837f09f1 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e6b28bd595bf6434facba01c0b5d41b9 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl new file mode 100644 index 000000000..fec0aeb9b --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl @@ -0,0 +1,67 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Crest_SurfaceFog +#define d_WaveHarmonic_Crest_SurfaceFog + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl" + +#define d_Crest_WaterSurface 1 + +#if (CREST_LEGACY_UNDERWATER != 1) +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl" +#endif + +m_CrestNameSpace + +#if (CREST_LEGACY_UNDERWATER != 0) +static bool s_IsUnderWater; +#endif + +void SetUpFog(bool i_Underwater, float3 i_PositionWS, float i_Multiplier, float i_FogDistance, half3 i_ViewWS, float2 i_PositionSS) +{ + s_IsUnderWater = i_Underwater; + +#if (CREST_LEGACY_UNDERWATER != 1) + s_PositionSS = i_PositionSS; + s_PositionWS = i_PositionWS; + s_ViewWS = i_ViewWS; + s_FogDistance = i_FogDistance; + s_DepthRaw = 0; + s_FogMultiplier = i_Multiplier; +#endif +} + +m_CrestNameSpaceEnd + +#if (CREST_LEGACY_UNDERWATER != 0) +#if (CREST_DISCARD_ATMOSPHERIC_SCATTERING != 0) + +#if CREST_BIRP +#ifdef UNITY_PASS_FORWARDADD +#define m_Unity_FogColor fixed4(0, 0, 0, 0) +#else +#define m_Unity_FogColor unity_FogColor +#endif // UNITY_PASS_FORWARDADD + +#undef UNITY_APPLY_FOG +#define UNITY_APPLY_FOG(coord, color) \ +if (!m_Crest::s_IsUnderWater) \ +{ \ + UNITY_APPLY_FOG_COLOR(coord, color, m_Unity_FogColor); \ +} +#endif // CREST_BIRP + +#if CREST_HDRP +#define EvaluateAtmosphericScattering(i, V, color) m_Crest::s_IsUnderWater ? color : EvaluateAtmosphericScattering(i, V, color) +#endif + +#if CREST_URP +#define MixFog(color, coord) m_Crest::s_IsUnderWater ? color : MixFog(color, coord) +#endif + +#endif // CREST_DISCARD_ATMOSPHERIC_SCATTERING +#endif // CREST_LEGACY_UNDERWATER + +#endif // d_WaveHarmonic_Crest_SurfaceFog diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl.meta new file mode 100644 index 000000000..9742b21d1 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 944710ebd91d247cca9b0a31307f6b87 +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fragment.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fragment.hlsl index 7878db793..0360294b8 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fragment.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fragment.hlsl @@ -30,6 +30,8 @@ // Guard against Shader Graph preview. #ifndef SHADERGRAPH_PREVIEW +#define d_Crest_WaterSurface 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Shim.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" @@ -45,6 +47,8 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Flow.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Lighting.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Facing.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Normal.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Reflection.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Refraction.hlsl" @@ -53,19 +57,12 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fresnel.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Foam.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Alpha.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Fog.hlsl" #if (CREST_PORTALS != 0) #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Library/Portals.hlsl" #endif -#if (CREST_SHADOWS_BUILT_IN_RENDER_PIPELINE != 0) -#if CREST_BIRP -#define SHADOWS_SPLIT_SPHERES 1 -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Shadows.hlsl" -#endif -#endif - bool _Crest_DrawBoundaryXZ; float4 _Crest_BoundaryXZ; @@ -92,6 +89,7 @@ void Fragment(m_Properties) o_Occlusion = 1.0; o_Alpha = 1.0; + const float2 positionSS = i_ScreenPosition.xy * _ScreenSize.xy; // Editor only. There is no defined editor symbol. if (_Crest_DrawBoundaryXZ) @@ -107,7 +105,7 @@ void Fragment(m_Properties) } } - const bool underwater = IsUnderwater(i_Facing, g_Crest_ForceUnderwater); + bool underwater = IsUnderWater(i_Facing, g_Crest_ForceUnderwater, positionSS); // TODO: Should we use PosToSIs or check for overflow? float slice0 = _Crest_LodIndex; @@ -121,6 +119,7 @@ void Fragment(m_Properties) const Cascade cascade1 = Cascade::Make(slice1); float sceneRawZ = i_SceneDepthRaw; + float negativeFog = _ProjectionParams.y; #if (CREST_PORTALS != 0) #ifndef CREST_SHADOWPASS @@ -128,7 +127,7 @@ void Fragment(m_Properties) if (m_CrestPortal) { const float pixelRawZ = i_ScreenPositionRaw.z / i_ScreenPositionRaw.w; - if (OutsideOfPortal(i_ScreenPosition.xy, pixelRawZ, sceneRawZ)) + if (Portal::EvaluateSurface(i_ScreenPosition.xy, pixelRawZ, i_PositionWS, underwater, sceneRawZ, negativeFog)) { o_Alpha = 0.0; return; @@ -242,15 +241,6 @@ void Fragment(m_Properties) // Normal. { - WaterNormal - ( - i_WaterLevelDerivatives, - i_ViewDirectionWS, - _Crest_MinimumReflectionDirectionY, - underwater, - o_NormalWS - ); - if (_Crest_NormalMapEnabled) { o_NormalWS.xz += SampleNormalMaps @@ -268,6 +258,17 @@ void Fragment(m_Properties) o_NormalWS = normalize(o_NormalWS); + WaterNormal + ( + i_WaterLevelDerivatives, + i_ViewDirectionWS, + _Crest_MinimumReflectionDirectionY, + underwater, + o_NormalWS + ); + + o_NormalWS = normalize(o_NormalWS); + o_NormalWS.xz *= _Crest_NormalsStrengthOverall; o_NormalWS.y = lerp(1.0, o_NormalWS.y, _Crest_NormalsStrengthOverall); @@ -282,11 +283,7 @@ void Fragment(m_Properties) float sceneDistance = 1000.0; float3 scenePositionWS = 0.0; - half3 ambientLight = 0.0; - AmbientLight - ( - ambientLight - ); + const half3 ambientLight = AmbientLight(); float3 lightIntensity = 0.0; half3 lightDirection = 0.0; @@ -300,15 +297,8 @@ void Fragment(m_Properties) half3 additionalLight = AdditionalLighting(i_PositionWS, i_ScreenPositionRaw, i_StaticLightMapUV); -#if d_Crest_ReceiveShadowsTransparent - // Sample shadow maps. - float4 shadowCoord = GET_SHADOW_COORDINATES(float4(i_PositionWS, 1.0)); - half shadows = UNITY_SAMPLE_SHADOW(_ShadowMapTexture, shadowCoord); - shadows = lerp(_LightShadowData.r, 1.0, shadows); - shadows = min(shadow.y, shadows); -#endif - #if d_Transparent +#ifndef d_SkipRefraction bool caustics; RefractedScene ( @@ -325,11 +315,24 @@ void Fragment(m_Properties) scenePositionWS, caustics ); -#endif - float refractedSeaLevel = 0; - float3 refractedSurfacePosition = 0; - if (!underwater) +#if CREST_BIRP +#if SHADERPASS == SHADERPASS_FORWARD_BASE + if (g_Crest_PrimaryLightHasCookie) + { + // If light has a cookie, it is zero for the ForwardBase pass. We need to split + // emission over ForwardBase and ForwardAdd. Ambient is done in the former, while + // direct (eg caustics) is done in ForwardAdd. + o_Emission = 0; + } +#endif +#endif +#endif // d_SkipRefraction +#endif // d_Transparent + + float refractedSeaLevel = g_Crest_WaterCenter.y; + float3 refractedSurfacePosition = float3(0, refractedSeaLevel, 0); + if (!underwater && slice1 < g_Crest_LodCount) { // Sample larger slice to avoid the first slice. float4 displacement = Cascade::MakeAnimatedWaves(slice1).Sample(scenePositionWS.xz); @@ -347,15 +350,11 @@ void Fragment(m_Properties) } #if d_Transparent +#ifndef d_SkipRefraction // Caustics if (_Crest_CausticsEnabled && !underwater && caustics) { - float3 position = scenePositionWS; -#if CREST_BIRP - position = float3(i_ScreenPosition.xy * _ScreenSize.xy, 0); -#endif - - half lightOcclusion = PrimaryLightShadows(position); + half lightOcclusion = PrimaryLightShadows(scenePositionWS, positionSS); half blur = 0.0; #ifdef CREST_FLOW_ON @@ -384,7 +383,8 @@ void Fragment(m_Properties) underwater ); } -#endif +#endif // d_SkipRefraction +#endif // d_Transparent half3 sss = 0.0; @@ -404,11 +404,11 @@ void Fragment(m_Properties) } // Volume Lighting - half3 volumeLight = 0.0; - half3 volumeOpacity = 0.0; - VolumeLighting + const half3 extinction = VolumeExtinction(absorption, scattering); + const half3 volumeOpacity = VolumeOpacity(extinction, sceneDistance); + const half3 volumeLight = VolumeLighting ( - absorption, + extinction, scattering, _Crest_Anisotropy, shadow.x, @@ -419,11 +419,8 @@ void Fragment(m_Properties) additionalLight, _Crest_AmbientTerm, _Crest_DirectTerm, - sceneDistance, sss, - _Crest_ShadowsAffectsAmbientFactor, - volumeLight, - volumeOpacity + _Crest_ShadowsAffectsAmbientFactor ); // Fresnel @@ -531,11 +528,6 @@ void Fragment(m_Properties) half3 intensity = _Crest_FoamIntensityAlbedo; -#if d_Crest_ReceiveShadowsTransparent - // @HACK: Scale intensity as BIRP does not support shadows for transparent objects. - intensity = max(_Crest_FoamIntensityAlbedo * saturate(ShadeSH9(float4(o_NormalWS, 1.0))), _Crest_FoamIntensityAlbedo * shadows); -#endif - ApplyFoamToSurface ( albedo, @@ -589,12 +581,15 @@ void Fragment(m_Properties) o_Alpha = min(o_Alpha, 1.0); } -#if d_Crest_ReceiveShadowsTransparent - // @HACK: Dull highlights as BIRP does not support shadows for transparent objects. - o_Smoothness *= lerp(1, shadows, foam * 100); - // @FIXME: 0.2 to difference when high. Likely incorrect shadow sampling. - o_Specular = shadows < 0.2 ? 1.0 - max(shadows, 0.3) : o_Specular; -#endif + SetUpFog + ( + underwater, + i_PositionWS, + 1.0, // N/A: multiplier for fog nodes + sceneDistance - negativeFog, + i_ViewDirectionWS, + positionSS + ); } m_CrestNameSpaceEnd diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Geometry.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Geometry.hlsl index 4779d6706..8cd0366e3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Geometry.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Geometry.hlsl @@ -8,6 +8,14 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl" +// These are per cascade, set per chunk instance. +CBUFFER_START(CrestChunkGeometryData) +float _Crest_ChunkMeshScaleAlpha; +float _Crest_ChunkMeshScaleAlphaSource; +float _Crest_ChunkGeometryGridWidth; +float _Crest_ChunkGeometryGridWidthSource; +CBUFFER_END + m_CrestNameSpace // i_meshScaleAlpha is passed in as it is provided per tile and is set only for LOD0 @@ -49,7 +57,8 @@ void SnapAndTransitionVertLayout(in const float4x4 i_objectMatrix, in const floa objectPosXZWS += _WorldSpaceCameraPos.xz; #endif - io_worldPos.xz -= frac(objectPosXZWS / GRID_SIZE_2) * GRID_SIZE_2; // caution - sign of frac might change in non-hlsl shaders + const float2 gridOffset = frac(objectPosXZWS / GRID_SIZE_2) * GRID_SIZE_2; + io_worldPos.xz -= gridOffset; // caution - sign of frac might change in non-hlsl shaders // compute lod transition alpha o_lodAlpha = ComputeLodAlpha(io_worldPos, i_meshScaleAlpha, i_cascadeData0); @@ -63,6 +72,20 @@ void SnapAndTransitionVertLayout(in const float4x4 i_objectMatrix, in const floa const float minRadius = 0.375; if (abs(offset.x) < minRadius) io_worldPos.x += offset.x * o_lodAlpha * GRID_SIZE_4; if (abs(offset.y) < minRadius) io_worldPos.z += offset.y * o_lodAlpha * GRID_SIZE_4; + +#if SHADER_API_VULKAN +#if CREST_HDRP +#if _TRANSPARENT_WRITES_MOTION_VEC + // Fixes artifacts where parts of the surface appear to be clipped. It appears to + // be a precision issue (LOD resolution not power of 2), but only when the MV code + // path is active - even though it writes to a separate target. + if (any(isinf(gridOffset))) + { + o_lodAlpha = 0.0; + } +#endif +#endif +#endif } void SnapAndTransitionVertLayout(in const float i_meshScaleAlpha, in const Cascade i_cascadeData0, in const float i_geometryGridSize, inout float3 io_worldPos, out float o_lodAlpha) diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Normal.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Normal.hlsl index bbeadbc45..416bdaea5 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Normal.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Normal.hlsl @@ -13,6 +13,10 @@ #include "Packages/com.waveharmonic.crest.shifting-origin/Runtime/Shaders/ShiftingOrigin.hlsl" #endif +// These are per cascade, set per chunk instance. +float _Crest_ChunkFarNormalsWeight; +float2 _Crest_ChunkNormalScrollSpeed; + m_CrestNameSpace half2 SampleNormalMaps diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Refraction.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Refraction.hlsl index 0439dfff3..06962c1ed 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Refraction.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Refraction.hlsl @@ -65,7 +65,7 @@ void RefractedScene #if (CREST_PORTALS != 0) #if _ALPHATEST_ON // Portals - ApplyPortalRefractions(positionNDCRefracted, i_SceneZRaw, i_Underwater, sceneDepthRawRefracted, o_Caustics); + Portal::EvaluateRefraction(positionNDCRefracted, i_SceneZRaw, i_Underwater, sceneDepthRawRefracted, o_Caustics); #endif #endif diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Shim.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Shim.hlsl index 3e71f9b7c..2626b6cdc 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Shim.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Shim.hlsl @@ -10,13 +10,12 @@ #ifndef CREST_SHADERGRAPH_CONSTANTS_H #define CREST_SHADERGRAPH_CONSTANTS_H +// "pow(f,e) will not work for negative f" +#pragma warning (disable : 3571) + #ifdef UNIVERSAL_PIPELINE_CORE_INCLUDED #define CREST_URP 1 - #if (SHADERPASS == SHADERPASS_SHADOWCASTER) - #define CREST_SHADOWPASS 1 - #endif - #if _SURFACE_TYPE_TRANSPARENT #define d_Transparent 1 #endif @@ -24,18 +23,11 @@ #elif BUILTIN_TARGET_API #define CREST_BIRP 1 - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Common.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" #if _BUILTIN_SURFACE_TYPE_TRANSPARENT #define d_Transparent 1 #endif - - // SHADERPASS is currently broken: - // https://forum.unity.com/threads/built-in-renderer-shaderpass-include-in-wrong-place.1444156/ - // #if (SHADERPASS == SHADERPASS_SHADOWCASTER) - // #define CREST_SHADOWPASS 1 - // #endif #else // HDRP does not appear to have a reliable keyword to target. #define CREST_HDRP 1 @@ -49,8 +41,21 @@ #endif #endif +#if defined(CREST_BIRP) || defined(CREST_URP) +#if (SHADERPASS == SHADERPASS_SHADOWCASTER) +#define CREST_SHADOWPASS 1 +#endif +#endif + #if defined(CREST_HDRP) && (SHADERPASS == SHADERPASS_FORWARD) #define CREST_HDRP_FORWARD_PASS 1 #endif +#if defined(CREST_BIRP) && (SHADERPASS == SHADERPASS_FORWARD_ADD) +#ifndef DIRECTIONAL_COOKIE +#define d_SkipRefraction 1 +#define d_IsAdditionalLight 1 +#endif +#endif + #endif // CREST_SHADERGRAPH_CONSTANTS_H diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Vertex.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Vertex.hlsl index 95a65140d..098a6bdf6 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Vertex.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Vertex.hlsl @@ -29,14 +29,14 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Depth.hlsl" -#if CREST_URP +#ifndef CREST_HDRP #if (SHADERPASS == SHADERPASS_MOTION_VECTORS) #define _TRANSPARENT_WRITES_MOTION_VEC 1 #endif #endif #if _TRANSPARENT_WRITES_MOTION_VEC -#define m_Slice clamp(_Crest_LodIndex + (isMotionVectors ? g_Crest_LodChange : 0), 0, g_Crest_LodCount) +#define m_Slice clamp((int)_Crest_LodIndex + (isMotionVectors ? g_Crest_LodChange : 0), 0, g_Crest_LodCount) #define m_Make(slice) Make(slice, isMotionVectors) #else #define m_Slice _Crest_LodIndex @@ -146,7 +146,7 @@ void Vertex(m_Properties) o_PositionWS.xz -= g_Crest_WaterCenter.xz; o_PositionWS.xz *= g_Crest_WaterScaleChange; o_PositionWS.xz += g_Crest_WaterCenter.xz; - o_PositionWS += g_Crest_WaterCenterDelta; + o_PositionWS.xz += g_Crest_WaterCenterDelta; } #endif } diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/VolumeLighting.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/VolumeLighting.hlsl index 36950af6f..c2616afdb 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/VolumeLighting.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/VolumeLighting.hlsl @@ -18,9 +18,22 @@ float SchlickPhase(float phaseG, float cosTheta) return (1.0 - schlickK * schlickK) / (4.0 * PI * phaseFactor * phaseFactor); } -void VolumeLighting +half3 VolumeExtinction(const half3 i_Absorption, const half3 i_Scattering) +{ + // Extinction is light absorbed plus light scattered out. + return i_Absorption + i_Scattering; +} + +half3 VolumeOpacity(const half3 i_Extinction, const half i_WaterRayLength) +{ + // Like 'alpha' value or obscurance. Volume light needs multiplying by this value + // to be correct in shallows. + return 1.0 - exp(-i_Extinction * max(0.0, i_WaterRayLength)); +} + +half3 VolumeLighting ( - const half3 i_Absorption, + const half3 i_Extinction, const half3 i_Scattering, const half i_PhaseG, const half i_DirectionalLightShadow, @@ -31,15 +44,11 @@ void VolumeLighting const half3 i_AdditionalLight, const half i_AmbientLightingTerm, const half i_PrimaryLightingTerm, - const half i_WaterRayLength, const half3 i_SunBoost, - const half i_ShadowsAffectAmbientLightingFactor, - out half3 o_VolumeLight, - out half3 o_VolumeOpacity + const half i_ShadowsAffectAmbientLightingFactor ) { - // Extinction is light absorbed plus light scattered out. - const half3 extinction = i_Absorption + i_Scattering; + const half3 extinction = i_Extinction; const float ambientLightShadow = lerp ( @@ -48,6 +57,9 @@ void VolumeLighting saturate(min(min(extinction.x, extinction.y), extinction.z) * i_ShadowsAffectAmbientLightingFactor * g_Crest_DynamicSoftShadowsFactor) ); +#ifdef d_IsAdditionalLight + const float3 inscattered = i_PrimaryLightIntensity; +#else // Sun const float sunPhase = SchlickPhase(i_PhaseG, dot(i_PrimaryLightDirection, i_ViewDirectionWS)); const float3 inScatteredSun = (1.0 + i_SunBoost) * sunPhase * i_PrimaryLightIntensity * i_PrimaryLightingTerm; @@ -55,11 +67,11 @@ void VolumeLighting // Total inscattered const float3 inscattered = (inScatteredAmbient + i_AdditionalLight + inScatteredSun * i_DirectionalLightShadow); - const float3 scatteringAmount = saturate(i_Scattering / max(extinction, 0.00001)); - o_VolumeLight = inscattered * scatteringAmount; +#endif - // Like 'alpha' value or obscurance. Volume light needs multiplying by this value to be correct in shallows. - o_VolumeOpacity = 1.0 - exp(-extinction * max(0.0, i_WaterRayLength)); + const float3 scatteringAmount = saturate(i_Scattering / max(extinction, 0.00001)); + + return inscattered * scatteringAmount; } half PinchSSS diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Water.shadergraph b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Water.shadergraph index 89206abdb..8a2f25858 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Water.shadergraph +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Water.shadergraph @@ -522,20 +522,6 @@ "m_SlotId": 0 } }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "6fb510b9ca124cf881fe849664df5924" - }, - "m_SlotId": 2 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "8e8aee51883445f1b08bfbec696cb18d" - }, - "m_SlotId": 0 - } - }, { "m_OutputSlot": { "m_Node": { @@ -862,10 +848,10 @@ "m_Id": "4bb923e45f9f48bab142707a3af6e4bd" }, { - "m_Id": "8e8aee51883445f1b08bfbec696cb18d" + "m_Id": "b7891fe7e5a34f03adebd8a45505c5fc" }, { - "m_Id": "b7891fe7e5a34f03adebd8a45505c5fc" + "m_Id": "8e8aee51883445f1b08bfbec696cb18d" }, { "m_Id": "e207931e020242bba83058a59f3fb07d" @@ -1170,7 +1156,7 @@ "m_ObjectId": "0b12e9fc0b164611b7fa17e0c6955043", "m_Title": "Interpolators", "m_Position": { - "x": 590.9999389648438, + "x": 591.0, "y": 208.5 } } @@ -2458,7 +2444,7 @@ "m_SGVersion": 0, "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.SystemData", "m_ObjectId": "4d02d98ad13c416c989fa4a1c65d2550", - "m_MaterialNeedsUpdateHash": 279864, + "m_MaterialNeedsUpdateHash": 279880, "m_SurfaceType": 1, "m_RenderingPass": 4, "m_BlendMode": 0, @@ -2483,7 +2469,7 @@ "m_TessellationShapeFactor": 0.75, "m_TessellationBackFaceCullEpsilon": -0.25, "m_TessellationMaxDisplacement": 0.009999999776482582, - "m_Version": 1, + "m_Version": 2, "inspectorFoldoutMask": 11 } @@ -3382,7 +3368,7 @@ "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, "m_Hidden": false, - "m_Value": 0.0, + "m_Value": 0.03, "m_FloatType": 1, "m_RangeValues": { "x": -1.0, @@ -3677,7 +3663,7 @@ "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, "m_Hidden": false, - "m_Value": 0.4000000059604645, + "m_Value": 0.8, "m_FloatType": 1, "m_RangeValues": { "x": 0.0, @@ -4620,7 +4606,7 @@ "m_SGVersion": 2, "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalLitSubTarget", "m_ObjectId": "a52dd0dd7c42405cabd2b96b877532a3", - "m_WorkflowMode": 0, + "m_WorkflowMode": 1, "m_NormalDropOffSpace": 2, "m_ClearCoat": false, "m_BlendModePreserveSpecular": false @@ -5096,10 +5082,11 @@ { "m_SGVersion": 0, - "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInLitSubTarget", + "m_Type": "WaveHarmonic.Crest.Editor.ShaderGraph.BuiltInLitSubTarget", "m_ObjectId": "bb3b0e5f6ef041aebb81194f38a5d07c", "m_WorkflowMode": 1, - "m_NormalDropOffSpace": 2 + "m_NormalDropOffSpace": 2, + "m_TransparentReceiveShadows": true } { @@ -5349,7 +5336,7 @@ "overrideHLSLDeclaration": false, "hlslDeclarationOverride": 0, "m_Hidden": false, - "m_Value": 10.0, + "m_Value": 3.0, "m_FloatType": 0, "m_RangeValues": { "x": 0.0, @@ -5433,7 +5420,8 @@ "m_Type": "UnityEditor.Rendering.HighDefinition.ShaderGraph.HDLitData", "m_ObjectId": "cee72db709954dd38e8039e087fe5744", "m_RayTracing": false, - "m_MaterialType": 4, + "m_MaterialType": 0, + "m_MaterialTypeMask": 18, "m_RefractionModel": 1, "m_SSSTransmission": true, "m_EnergyConservingSpecular": false, diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Blit.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Blit.shader index d72425c7d..3d8389a10 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Blit.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Blit.shader @@ -1,19 +1,15 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Provides utility passes for rendering like clearing the stencil buffer. -Shader "Hidden/Crest/Utility/Blit" +Shader "Hidden/Crest/Legacy/Blit" { HLSLINCLUDE #pragma vertex Vertex #pragma fragment Fragment - #include "UnityCG.cginc" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Depth.hlsl" struct Attributes @@ -44,28 +40,10 @@ Shader "Hidden/Crest/Utility/Blit" SubShader { - Cull Off ZWrite On ZTest Always - - Pass - { - // Copies the color texture. - Name "Copy Color" - - ZWrite Off - ZTest Always - Cull Off - - HLSLPROGRAM - TEXTURE2D_X(_CameraColorTexture); - - float4 Fragment(Varyings input) : SV_Target - { - // We need this when sampling a screenspace texture. - UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); - return LOAD_TEXTURE2D_X(_CameraColorTexture, input.positionCS.xy); - } - ENDHLSL - } + Blend Off + Cull Off + ZTest Always + ZWrite Off Pass { @@ -73,8 +51,6 @@ Shader "Hidden/Crest/Utility/Blit" Name "Copy Depth / Clear Stencil" ZWrite On - ZTest Always - Cull Off Stencil { @@ -94,52 +70,9 @@ Shader "Hidden/Crest/Utility/Blit" ENDHLSL } - Pass - { - // Clears the depth buffer without clearing the stencil. - Name "Clear Depth" - - ZWrite On - ZTest Always - Cull Off - - HLSLPROGRAM - float Fragment(Varyings input) : SV_Depth - { - return 0.0; - } - ENDHLSL - } - - Pass - { - // Clears the stencil buffer without clearing depth - Name "Clear Stencil" - - ZWrite Off - ZTest Always - Cull Off - Blend Zero One - - Stencil - { - Ref 0 - Comp Always - Pass Replace - } - - HLSLPROGRAM - float Fragment(Varyings input) : SV_Target - { - return 0.0; - } - ENDHLSL - } - Pass { Name "Copy" - Blend Off HLSLPROGRAM TEXTURE2D(_Utility_MainTexture); @@ -150,5 +83,23 @@ Shader "Hidden/Crest/Utility/Blit" } ENDHLSL } + + Pass + { + Name "Merge Depth" + + // All is required to merge depth. + ZTest Less + ZWrite On + + HLSLPROGRAM + TEXTURE2D_X(_Utility_MainTexture); + float Fragment(Varyings input) : SV_Depth + { + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + return LOAD_DEPTH_TEXTURE_X(_Utility_MainTexture, input.positionCS.xy); + } + ENDHLSL + } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Clear.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Clear.compute index 0f2948f03..4103fa5be 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Clear.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Clear.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Clear specific components using a mask. diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy.meta new file mode 100644 index 000000000..9dc073d4c --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c6a37fe33f609947b680abac9e850cc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader new file mode 100644 index 000000000..f8a208110 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader @@ -0,0 +1,42 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +Shader "Hidden/Crest/Legacy/CaptureShadowMatrices" +{ + SubShader + { + Blend Off + ColorMask 0 + Cull Off + ZTest Always + ZWrite Off + + Pass + { + HLSLPROGRAM + #pragma target 4.5 + #pragma vertex Vertex + #pragma fragment Fragment + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + + RWStructuredBuffer _Crest_WorldToShadow; + float4x4 unity_WorldToShadow[4]; + + float4 Vertex(uint id : SV_VertexID) : SV_POSITION + { + return GetFullScreenTriangleVertexPosition(id); + } + + float4 Fragment(float4 pos : SV_POSITION) : SV_Target + { + _Crest_WorldToShadow[0] = unity_WorldToShadow[0]; + _Crest_WorldToShadow[1] = unity_WorldToShadow[1]; + _Crest_WorldToShadow[2] = unity_WorldToShadow[2]; + _Crest_WorldToShadow[3] = unity_WorldToShadow[3]; + return 0; + } + ENDHLSL + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader.meta new file mode 100644 index 000000000..41896e7c9 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/CaptureShadowMatrices.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 17feb724c7e004b4e8e418931db7eff3 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader new file mode 100644 index 000000000..8ecec738d --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader @@ -0,0 +1,51 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +Shader "Hidden/Crest/Legacy/ForceShadows" +{ + CGINCLUDE + #pragma vertex Vertex + #pragma fragment Fragment + + fixed4 Vertex(fixed4 v : POSITION) : SV_POSITION + { + return 0; + } + + fixed4 Fragment(fixed4 i : SV_POSITION) : SV_Target + { + return 0; + } + ENDCG + + SubShader + { + ZTest Always + ZWrite Off + ColorMask 0 + + Pass + { + Tags + { + "LightMode" = "ForwardBase" + } + + CGPROGRAM + #pragma multi_compile_fwdbase + ENDCG + } + + Pass + { + Tags + { + "LightMode" = "ForwardAdd" + } + + CGPROGRAM + #pragma multi_compile_fwdadd_fullshadows + ENDCG + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader.meta new file mode 100644 index 000000000..3bc8c34d2 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/Legacy/ForceShadows.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c9f384b6b84e943ed83161cb82d95b2e +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/TextureArray.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/TextureArray.shader index 3a164ca90..444996aa3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/TextureArray.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Utility/TextureArray.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Renders a specific slice of a 2D Texture Array diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl new file mode 100644 index 000000000..5257b0443 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl @@ -0,0 +1,44 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#ifndef d_WaveHarmonic_Crest_VolumeDebug +#define d_WaveHarmonic_Crest_VolumeDebug + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Macros.hlsl" + +m_CrestNameSpace + +float4 DebugRenderWaterMask(const bool isWaterSurface, const bool isUnderwater, const float mask, const float3 sceneColour) +{ + // Red: surface front face when above water + // Green: surface back face when below water + // Cyan: background when above water + // Magenta: background when below water + if (isWaterSurface) + { + return float4(sceneColour * float3(mask >= CREST_MASK_ABOVE_SURFACE, mask <= CREST_MASK_BELOW_SURFACE, 0.0), 1.0); + } + else + { + return float4(sceneColour * float3(isUnderwater * 0.5, (1.0 - isUnderwater) * 0.5, 1.0), 1.0); + } +} + +float4 DebugRenderStencil(float3 sceneColour) +{ + float3 stencil = 1.0; +#if d_Crest_Portal +#if d_Crest_FogAfter + stencil = float3(1.0, 0.0, 0.0); +#elif d_Crest_FogBefore + stencil = float3(0.0, 1.0, 0.0); +#else + stencil = float3(0.0, 0.0, 1.0); +#endif +#endif + return float4(sceneColour * stencil, 1.0); +} + +m_CrestNameSpaceEnd + +#endif // d_WaveHarmonic_Crest_VolumeDebug diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl.meta new file mode 100644 index 000000000..d228a295c --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f174da407e60e4ed1b24dd11f44c9cdc +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph.meta new file mode 100644 index 000000000..9e65d2abb --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 557d66ce32c8ea44dba2cb2ff07dd49d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph new file mode 100644 index 000000000..2db46d16b --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph @@ -0,0 +1,1262 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "fa6863a20fe5453f84da2aefdcd78727", + "m_Properties": [ + { + "m_Id": "5d923c2657794970996af7cb7159276f" + }, + { + "m_Id": "0640f7e405ca4ded9cced0944e419139" + }, + { + "m_Id": "a0af5588d47b44b5b24f875b67acf31a" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "943e9ca00d7248afba41cc8024d2542a" + } + ], + "m_Nodes": [ + { + "m_Id": "dd5931412c824c66b095fb7819859502" + }, + { + "m_Id": "c0989029cf9b440b8d920d94483be2d4" + }, + { + "m_Id": "9ab1f5c4a6894323899049b311181b3f" + }, + { + "m_Id": "1e6912026741481fb3338b2e9c85a203" + }, + { + "m_Id": "3a66a62e50224c799de45b25a67a41c8" + }, + { + "m_Id": "bb35f5be46ba4350a77ad73886c2d67a" + }, + { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + { + "m_Id": "73c08bc2c7be45559da717ae630500f6" + }, + { + "m_Id": "6893ffaca70848d693feacf5b9a166ec" + }, + { + "m_Id": "b5b57b89f263474f8d5d5ffa3f3b30ec" + } + ], + "m_GroupDatas": [ + { + "m_Id": "1100f19ecd45464ca732f01d9e3a3cc4" + } + ], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1e6912026741481fb3338b2e9c85a203" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3a66a62e50224c799de45b25a67a41c8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3a66a62e50224c799de45b25a67a41c8" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bb35f5be46ba4350a77ad73886c2d67a" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3a66a62e50224c799de45b25a67a41c8" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bb35f5be46ba4350a77ad73886c2d67a" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 4 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dd5931412c824c66b095fb7819859502" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 8 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "dd5931412c824c66b095fb7819859502" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6893ffaca70848d693feacf5b9a166ec" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 3 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "73c08bc2c7be45559da717ae630500f6" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 6 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9ab1f5c4a6894323899049b311181b3f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b5b57b89f263474f8d5d5ffa3f3b30ec" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 7 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "bb35f5be46ba4350a77ad73886c2d67a" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c0989029cf9b440b8d920d94483be2d4" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "480703a4ce624a52bc7256f8e37a06d0" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [] + }, + "m_FragmentContext": { + "m_Position": { + "x": 0.0, + "y": 0.0 + }, + "m_Blocks": [] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Crest", + "m_GraphPrecision": 0, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "dd5931412c824c66b095fb7819859502" + }, + "m_SubDatas": [], + "m_ActiveTargets": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "0640f7e405ca4ded9cced0944e419139", + "m_Guid": { + "m_GuidSerialized": "33f7abbf-d481-4327-84fd-12645ebd2beb" + }, + "m_Name": "Multiplier", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Vector1_0640f7e405ca4ded9cced0944e419139", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 1.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "100759169f234f728c4532414590b1a0", + "m_Id": 7, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.GroupData", + "m_ObjectId": "1100f19ecd45464ca732f01d9e3a3cc4", + "m_Title": "Device Depth", + "m_Position": { + "x": -590.5, + "y": -78.5 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionNode", + "m_ObjectId": "1e6912026741481fb3338b2e9c85a203", + "m_Group": { + "m_Id": "1100f19ecd45464ca732f01d9e3a3cc4" + }, + "m_Name": "Screen Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -565.4999389648438, + "y": -19.999958038330079, + "width": 145.0, + "height": 128.5 + } + }, + "m_Slots": [ + { + "m_Id": "997795b49fd142219f3c653b993006cb" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_ScreenSpaceType": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "26ad05e7cf2e4a4ea25b5c24de47805b", + "m_Id": 0, + "m_DisplayName": "Multiplier", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "33b7e1b838534e1eb917b8dddc09da10", + "m_Id": 1, + "m_DisplayName": "World_Space_Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "World_Space_Position", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "3869cf8b70444512bb57c08b049d8040", + "m_Id": 6, + "m_DisplayName": "Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "3a66a62e50224c799de45b25a67a41c8", + "m_Group": { + "m_Id": "1100f19ecd45464ca732f01d9e3a3cc4" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -421.0, + "y": -20.0, + "width": 118.49996948242188, + "height": 101.0 + } + }, + "m_Slots": [ + { + "m_Id": "4b4a7611530e497b9aaf382ee1cb46e9" + }, + { + "m_Id": "d34c200c1e724ad58b511315e02a7adf" + }, + { + "m_Id": "aa670f1389b24b7a96377c5aa3ff2940" + }, + { + "m_Id": "6e8de798030b4e1a8c098766d08a075f" + }, + { + "m_Id": "807219348c604b578c843be8e94a292c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3be2aeeddcce4175abdff791fdd9f5a5", + "m_Id": 3, + "m_DisplayName": "Multiplier", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Multiplier", + "m_StageCapability": 3, + "m_Value": 1.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3d98351741854538b14ba5d65b699de0", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 2.0, + "y": 2.0, + "z": 2.0, + "w": 2.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.CustomFunctionNode", + "m_ObjectId": "480703a4ce624a52bc7256f8e37a06d0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "CrestNodeIntegrateWaterVolume (Custom Function)", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 289.0000305175781, + "y": -64.49995422363281, + "width": 331.5, + "height": 190.0 + } + }, + "m_Slots": [ + { + "m_Id": "fc76576996d147a6a18fa6e16a54409e" + }, + { + "m_Id": "33b7e1b838534e1eb917b8dddc09da10" + }, + { + "m_Id": "d82e7faaa0814772ac2d904701df5add" + }, + { + "m_Id": "3be2aeeddcce4175abdff791fdd9f5a5" + }, + { + "m_Id": "3869cf8b70444512bb57c08b049d8040" + }, + { + "m_Id": "100759169f234f728c4532414590b1a0" + }, + { + "m_Id": "be7a86b7ce45469dbaa830426ed7bf5c" + }, + { + "m_Id": "53b91b3c1d284b088db3b0ddd55fe57a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SourceType": 0, + "m_FunctionName": "CrestNodeIntegrateWaterVolume", + "m_FunctionSource": "d71d6be33f63546ff8a3e48fa55faa5f", + "m_FunctionBody": "Enter function body here..." +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4b4a7611530e497b9aaf382ee1cb46e9", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "53b91b3c1d284b088db3b0ddd55fe57a", + "m_Id": 8, + "m_DisplayName": "Out_Emission", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out_Emission", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "5d923c2657794970996af7cb7159276f", + "m_Guid": { + "m_GuidSerialized": "4e700f9f-71e1-44ca-82f1-a15c46d60057" + }, + "m_Name": "Color", + "m_DefaultRefNameVersion": 0, + "m_RefNameGeneratedByDisplayName": "", + "m_DefaultReferenceName": "Color_5d923c2657794970996af7cb7159276f", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "isMainColor": false, + "m_ColorMode": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "613443e60dfe4a6c8242f655a5c0ebe1", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "6893ffaca70848d693feacf5b9a166ec", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -39.0, + "y": 57.5, + "width": 123.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "26ad05e7cf2e4a4ea25b5c24de47805b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "0640f7e405ca4ded9cced0944e419139" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6e8de798030b4e1a8c098766d08a075f", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6e9dfffa8dd44af49ecd03bc70b53e3b", + "m_Id": 1, + "m_DisplayName": "Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "70cc196430a942c28a78823efac0213b", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "73c08bc2c7be45559da717ae630500f6", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -21.0, + "y": 91.5, + "width": 105.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "e2f3904697a242ec8f265071d93e8591" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "5d923c2657794970996af7cb7159276f" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "807219348c604b578c843be8e94a292c", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "8f9a320d616344e09bcb1f5e368c99c9", + "m_Id": 2, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "914b3ad544bc4c57b1b5d9b955d533c0", + "m_Id": 0, + "m_DisplayName": "Emission", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "943e9ca00d7248afba41cc8024d2542a", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "5d923c2657794970996af7cb7159276f" + }, + { + "m_Id": "a0af5588d47b44b5b24f875b67acf31a" + }, + { + "m_Id": "0640f7e405ca4ded9cced0944e419139" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "997795b49fd142219f3c653b993006cb", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.PositionNode", + "m_ObjectId": "9ab1f5c4a6894323899049b311181b3f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Position", + "m_DrawState": { + "m_Expanded": false, + "m_Position": { + "serializedVersion": "2", + "x": -122.0, + "y": -96.5, + "width": 206.0, + "height": 129.5 + } + }, + "m_Slots": [ + { + "m_Id": "dd9559ce5f2644919ef9122d4f557df6" + } + ], + "synonyms": [], + "m_Precision": 1, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Space": 2, + "m_PositionSource": 0 +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector3ShaderProperty", + "m_ObjectId": "a0af5588d47b44b5b24f875b67acf31a", + "m_Guid": { + "m_GuidSerialized": "bebcb4b2-70d3-4426-b192-1c54922e3a4a" + }, + "m_Name": "Emission", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "Emission", + "m_DefaultReferenceName": "_Emission", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "aa670f1389b24b7a96377c5aa3ff2940", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "aec8c45ce53547629ca39ff1eae3bc15", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "b5b57b89f263474f8d5d5ffa3f3b30ec", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -39.0, + "y": 125.5, + "width": 123.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "914b3ad544bc4c57b1b5d9b955d533c0" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a0af5588d47b44b5b24f875b67acf31a" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DivideNode", + "m_ObjectId": "bb35f5be46ba4350a77ad73886c2d67a", + "m_Group": { + "m_Id": "1100f19ecd45464ca732f01d9e3a3cc4" + }, + "m_Name": "Divide", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -302.5, + "y": -20.0, + "width": 126.0, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "70cc196430a942c28a78823efac0213b" + }, + { + "m_Id": "3d98351741854538b14ba5d65b699de0" + }, + { + "m_Id": "aec8c45ce53547629ca39ff1eae3bc15" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "be7a86b7ce45469dbaa830426ed7bf5c", + "m_Id": 4, + "m_DisplayName": "Out_Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out_Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ScreenPositionNode", + "m_ObjectId": "c0989029cf9b440b8d920d94483be2d4", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Screen Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -61.000003814697269, + "y": -224.99993896484376, + "width": 145.0, + "height": 128.5 + } + }, + "m_Slots": [ + { + "m_Id": "613443e60dfe4a6c8242f655a5c0ebe1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_ScreenSpaceType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d34c200c1e724ad58b511315e02a7adf", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d82e7faaa0814772ac2d904701df5add", + "m_Id": 2, + "m_DisplayName": "Device_Depth", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Device_Depth", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubGraphOutputNode", + "m_ObjectId": "dd5931412c824c66b095fb7819859502", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Output", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 720.5, + "y": -64.5, + "width": 101.0, + "height": 101.0 + } + }, + "m_Slots": [ + { + "m_Id": "6e9dfffa8dd44af49ecd03bc70b53e3b" + }, + { + "m_Id": "8f9a320d616344e09bcb1f5e368c99c9" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "IsFirstSlotValid": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "dd9559ce5f2644919ef9122d4f557df6", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "e2f3904697a242ec8f265071d93e8591", + "m_Id": 0, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "fc76576996d147a6a18fa6e16a54409e", + "m_Id": 0, + "m_DisplayName": "Screen_Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Screen_Position", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph.meta new file mode 100644 index 000000000..e6ee048a8 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/Integrate Water Volume.shadersubgraph.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: df63a8d198812478985b6d0a5d68a59a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 60072b568d64c40a485e0fc55012dc9f, type: 3} diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl new file mode 100644 index 000000000..561f33e06 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl @@ -0,0 +1,224 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +// NOTE: It is important that everything has a Crest prefix to avoid possible conflicts. +// NOTE: No keywords so no mask color/depth variants not available. + +#ifndef d_WaveHarmonic_Crest_ApplyWaterVolumeFog +#define d_WaveHarmonic_Crest_ApplyWaterVolumeFog + +#ifndef SHADERGRAPH_PREVIEW + +// TODO: enable dithering? +#define k_DisableCaustics +#define k_DisableDithering + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl" + +#if (CREST_PORTALS != 0) +#define d_Crest_Portal 1 +#endif + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Shim.hlsl" + +// Uses SHADERPASS which is broken for everyone else. +#undef d_IsAdditionalLight + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Depth.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterShared.hlsl" + +m_CrestNameSpace + +static bool s_IsUnderWater; +static float s_FogDistance; +static half s_FogMultiplier; + +static float2 s_PositionSS; +static float3 s_PositionWS; +static half3 s_ViewWS; +static float s_DepthRaw; + +float3 ApplyFog(float3 color) +{ +#if (CREST_DISCARD_ATMOSPHERIC_SCATTERING == 0) + if (!s_IsUnderWater) + { + return color; + } +#endif + + return ApplyUnderwaterEffect + ( + color, + s_DepthRaw, + 0, // Caustics only + s_FogDistance, + s_ViewWS, + s_PositionSS, + s_PositionWS, + false, // No caustics + true, // TODO: implement + true, // TODO: implement + s_FogMultiplier + ); +} + +float3 NoFog(float3 color) +{ + return color; +} + +void SetUpFog(const float2 i_PositionNDC, const float3 i_PositionWS, const float i_DepthRaw, const half i_Multiplier) +{ +#if !CREST_BIRP +// Uses SHADERPASS which is broken for everyone else. +#if CREST_SHADOWPASS + return; +#endif +#endif + + const float2 positionSS = i_PositionNDC.xy * _ScreenSize.xy; + + const half mask = LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, positionSS).r; + + // Skip if not underwater. We could also "&& rawSurfaceDepth < i_DepthRaw" to + // exclude objects behind the front-faces from receiving atmospheric fog, but we + // are using transparent blending which leaves a bright outline due to the edges + // receiving insufficient fog. Excluding these objects from atmospheric fog gives + // little benefit. + if (mask >= CREST_MASK_NO_FOG && mask < CREST_MASK_ABOVE_SURFACE_KEPT) + { + return; + } + +#if (CREST_DISCARD_ATMOSPHERIC_SCATTERING != 0) +#if !d_Transparent + // FIXME: Find alternative solution for new mask. + const float rawSurfaceDepth = LOAD_DEPTH_TEXTURE_X(_Crest_WaterMaskDepthTexture, positionSS).r; + + // Skip discarding fog if opaque object is behind back-faces. + if (mask < CREST_MASK_NO_FOG && mask > CREST_MASK_BELOW_SURFACE_KEPT && i_DepthRaw < rawSurfaceDepth) + { + return; + } +#endif +#endif + + // Get the largest distance. + float rawFogDistance = i_DepthRaw; + float fogDistanceOffset = _ProjectionParams.y; + float fogDistance = 0.0; + +#if (CREST_PORTALS != 0) + if (!Portal::EvaluateFog(i_PositionNDC, mask, rawFogDistance, fogDistanceOffset)) + { + return; + } + else +#endif + { + fogDistance = Utility::CrestLinearEyeDepth(rawFogDistance) - fogDistanceOffset; + } + + s_IsUnderWater = true; + s_PositionSS = positionSS; + s_PositionWS = i_PositionWS; + s_ViewWS = GetWorldSpaceNormalizeViewDir(i_PositionWS); + s_FogDistance = fogDistance; + s_DepthRaw = i_DepthRaw; + s_FogMultiplier = i_Multiplier; +} + +m_CrestNameSpaceEnd + +#if d_Transparent +#define ApplyFog(x) ApplyFog(x) +#else +#define ApplyFog(x) NoFog(x) +#endif + +#if CREST_BIRP +#ifdef UNITY_PASS_FORWARDADD +#define m_Unity_FogColor fixed4(0, 0, 0, 0) +#else +#define m_Unity_FogColor unity_FogColor +#endif // UNITY_PASS_FORWARDADD + +#undef UNITY_APPLY_FOG +#if (CREST_DISCARD_ATMOSPHERIC_SCATTERING != 0) +#define UNITY_APPLY_FOG(coord, color) \ +if (m_Crest::s_IsUnderWater) \ +{ \ + color.rgb = m_Crest::ApplyFog(color.rgb); \ +} \ +else \ +{ \ + UNITY_APPLY_FOG_COLOR(coord, color, m_Unity_FogColor); \ +} +#else +#define UNITY_APPLY_FOG(coord, color) \ +UNITY_APPLY_FOG_COLOR(coord, color, m_Unity_FogColor); \ +color.rgb = m_Crest::ApplyFog(color.rgb); +#endif // CREST_DISCARD_ATMOSPHERIC_SCATTERING +#endif // CREST_BIRP + +#if CREST_HDRP +#if (CREST_DISCARD_ATMOSPHERIC_SCATTERING != 0) +#define EvaluateAtmosphericScattering(i, V, color) m_Crest::s_IsUnderWater ? float4(m_Crest::ApplyFog(color.rgb), color.a) : EvaluateAtmosphericScattering(i, V, color) +#else +#define EvaluateAtmosphericScattering(i, V, color) EvaluateAtmosphericScattering(i, V, color); color.rgb = m_Crest::ApplyFog(color.rgb) +#endif +#endif + +#if CREST_URP +#if (CREST_DISCARD_ATMOSPHERIC_SCATTERING != 0) +#define MixFog(color, coord) m_Crest::s_IsUnderWater ? m_Crest::ApplyFog(color) : MixFog(color, coord) +#else +#define MixFog(color, coord) MixFog(color, coord); color.rgb = m_Crest::ApplyFog(color.rgb) +#endif +#endif + +#endif // SHADERGRAPH_PREVIEW + +void CrestNodeIntegrateWaterVolume_half +( + const float2 i_PositionNDC, + const float3 i_PositionWS, + const float i_DepthRaw, + const half i_Multiplier, + const half4 i_Color, + const half3 i_Emission, + out half4 o_Color, + out half3 o_Emission +) +{ + o_Color = i_Color; + o_Emission = i_Emission; + +#ifndef SHADERGRAPH_PREVIEW + m_Crest::SetUpFog(i_PositionNDC, i_PositionWS, i_DepthRaw, i_Multiplier); +#endif +} + +void CrestNodeIntegrateWaterVolume_float +( + const float2 i_PositionNDC, + const float3 i_PositionWS, + const float i_DepthRaw, + const half i_Multiplier, + const float4 i_Color, + const float3 i_Emission, + out float4 o_Color, + out float3 o_Emission +) +{ + o_Color = i_Color; + o_Emission = i_Emission; + +#ifndef SHADERGRAPH_PREVIEW + m_Crest::SetUpFog(i_PositionNDC, i_PositionWS, i_DepthRaw, i_Multiplier); +#endif +} + +#endif // d_WaveHarmonic_Crest_ApplyWaterVolumeFog diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl.meta new file mode 100644 index 000000000..0316ff200 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Graph/IntegrateWaterVolume.hlsl.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d71d6be33f63546ff8a3e48fa55faa5f +ShaderIncludeImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader new file mode 100644 index 000000000..6631876c9 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader @@ -0,0 +1,104 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +Shader "Hidden/Crest/Volume/Horizon Mask" +{ + SubShader + { + PackageRequirements + { + "com.unity.render-pipelines.high-definition" + } + + Tags { "RenderPipeline"="HDRenderPipeline" } + + Blend Off + Cull Off + ZTest Always + ZWrite Off + + Pass + { + Name "Water Horizon Mask" + + Stencil + { + Ref [_Crest_StencilReference] + Comp [_Crest_StencilComparison] + } + + HLSLPROGRAM + #pragma vertex Vertex + #pragma fragment Fragment + + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" + #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl" + ENDHLSL + } + } + + SubShader + { + PackageRequirements + { + "com.unity.render-pipelines.universal" + } + + Tags { "RenderPipeline"="UniversalPipeline" } + + Blend Off + Cull Off + ZTest Always + ZWrite Off + + Pass + { + Name "Water Horizon Mask" + + Stencil + { + Ref [_Crest_StencilReference] + Comp [_Crest_StencilComparison] + } + + HLSLPROGRAM + #pragma vertex Vertex + #pragma fragment Fragment + + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl" + ENDHLSL + } + } + + SubShader + { + Blend Off + Cull Off + ZTest Always + ZWrite Off + + Pass + { + Name "Water Horizon Mask" + + Stencil + { + Ref [_Crest_StencilReference] + Comp [_Crest_StencilComparison] + } + + HLSLPROGRAM + #pragma vertex Vertex + #pragma fragment Fragment + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl" + ENDHLSL + } + } +} diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader.meta new file mode 100644 index 000000000..67a7f17ac --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Horizon.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 80a81e5410296461d827cd6eed939b81 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute new file mode 100644 index 000000000..8399f625d --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute @@ -0,0 +1,51 @@ +// Crest Water System +// Copyright © 2024 Wave Harmonic. All rights reserved. + +#pragma kernel CrestWaterLineBRP _BRP +#pragma kernel CrestWaterLineHRP _HRP +#pragma kernel CrestWaterLineURP _URP + +// Not every RP handles this. HDRP seems to. +#pragma multi_compile _ STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON + +#pragma multi_compile_local _ d_KeepValue + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl" + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Cascade.hlsl" + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl" + +RW_TEXTURE2D_X(float, _Crest_WaterMaskTexture); + +m_CrestNameSpace + +void WaterLine(const uint3 id) +{ + UNITY_XR_ASSIGN_VIEW_INDEX(id.z); + +#if d_KeepValue + // Prevent rendering inside of portals. + if (_Crest_WaterMaskTexture[COORD_TEXTURE2D_X(id.xy)] != 0) + { + return; + } +#endif + + float3 position = ComputeWorldSpacePosition(id.xy / _ScreenSize.xy, UNITY_NEAR_CLIP_VALUE, UNITY_MATRIX_I_VP); + +#if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) + position.xyz += _WorldSpaceCameraPos.xyz; +#endif + + const float height = SampleWaterLineHeight(position.xz).x; + + _Crest_WaterMaskTexture[COORD_TEXTURE2D_X(id.xy)] = position.y <= height ? -1 : 1; +} + +m_CrestNameSpaceEnd + +m_CrestKernelXRP(WaterLine) diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute.meta b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute.meta new file mode 100644 index 000000000..f30c04809 --- /dev/null +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.compute.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 51ffca485396f4d8dbf07883c9303f3c +ComputeShaderImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl index 16bbf6d5c..a8369cdb9 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl @@ -1,8 +1,8 @@ // Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. -#ifndef CREST_UNDERWATER_MASK_SHARED_INCLUDED -#define CREST_UNDERWATER_MASK_SHARED_INCLUDED +#ifndef d_WaveHarmonic_Crest_Mask +#define d_WaveHarmonic_Crest_Mask #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Settings.Crest.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" @@ -18,43 +18,45 @@ #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Library/Portals.hlsl" #endif -// Variable mask for when fog is applied before transparent pass and water tile might be culled. -half _Crest_MaskBelowSurface; - m_CrestNameSpace struct Attributes { // The old unity macros require this name and type. - float4 vertex : POSITION; + float4 positionCS : POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Varyings { float4 positionCS : SV_POSITION; +#if d_LodInput + float3 positionWS : TEXCOORD; +#endif UNITY_VERTEX_OUTPUT_STEREO }; -Varyings Vertex(Attributes v) +Varyings Vertex(const Attributes i_Input) { // This will work for all pipelines. Varyings output = (Varyings)0; - UNITY_SETUP_INSTANCE_ID(v); + UNITY_SETUP_INSTANCE_ID(i_Input); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - const Cascade cascade0 = Cascade::Make(_Crest_LodIndex); - const Cascade cascade1 = Cascade::Make(_Crest_LodIndex + 1); + const uint slice0 = _Crest_LodIndex; + const uint slice1 = _Crest_LodIndex + 1; - float3 worldPos = mul(UNITY_MATRIX_M, float4(v.vertex.xyz, 1.0)).xyz; + const Cascade cascade0 = Cascade::Make(slice0); + const Cascade cascade1 = Cascade::Make(slice1); + + float3 positionWS = mul(UNITY_MATRIX_M, float4(i_Input.positionCS.xyz, 1.0)).xyz; #if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) - worldPos.xz += _WorldSpaceCameraPos.xz; + positionWS.xz += _WorldSpaceCameraPos.xz; #endif - // Vertex snapping and lod transition - float lodAlpha; - SnapAndTransitionVertLayout(_Crest_ChunkMeshScaleAlpha, cascade0, _Crest_ChunkGeometryGridWidth, worldPos, lodAlpha); + float alpha; + SnapAndTransitionVertLayout(_Crest_ChunkMeshScaleAlpha, cascade0, _Crest_ChunkGeometryGridWidth, positionWS, alpha); { // Scale up by small "epsilon" to solve numerical issues. Expand slightly about tile center. @@ -64,83 +66,82 @@ Varyings Vertex(Attributes v) tileCenterXZ += _WorldSpaceCameraPos.xz; #endif const float2 cameraPositionXZ = abs(_WorldSpaceCameraPos.xz); - // Scale "epsilon" by distance from zero. There is an issue where overlaps can cause SV_IsFrontFace - // to be flipped (needs to be investigated). Gaps look bad from above surface, and overlaps look bad - // from below surface. We want to close gaps without introducing overlaps. A fixed "epsilon" will - // either not solve gaps at large distances or introduce too many overlaps at small distances. Even - // with scaling, there are still unsolvable overlaps underwater (especially at large distances). - // 100,000 (0.00001) is the maximum position before Unity warns the user of precision issues. - worldPos.xz = lerp(tileCenterXZ, worldPos.xz, lerp(1.0, 1.01, max(cameraPositionXZ.x, cameraPositionXZ.y) * 0.00001)); + positionWS.xz = lerp(tileCenterXZ, positionWS.xz, lerp(1.0, 1.01, max(cameraPositionXZ.x, cameraPositionXZ.y) * 0.00001)); } - // Calculate sample weights. params.z allows shape to be faded out (used on last lod to support pop-less scale transitions) - const float wt_smallerLod = (1.0 - lodAlpha) * cascade0._Weight; - const float wt_biggerLod = (1.0 - wt_smallerLod) * cascade1._Weight; - // Sample displacement textures, add results to current world pos / normal / foam - const float2 positionWS_XZ_before = worldPos.xz; + const float weight0 = (1.0 - alpha) * cascade0._Weight; + const float weight1 = (1.0 - weight0) * cascade1._Weight; - // Data that needs to be sampled at the undisplaced position - if (wt_smallerLod > m_CrestSampleLodThreshold) + const float2 positionXZ = positionWS.xz; + + // Data that needs to be sampled at the undisplaced position. + if (weight0 > m_CrestSampleLodThreshold) { - Cascade::MakeAnimatedWaves(_Crest_LodIndex).SampleDisplacement(positionWS_XZ_before, wt_smallerLod, worldPos); + Cascade::MakeAnimatedWaves(slice0).SampleDisplacement(positionXZ, weight0, positionWS); } - if (wt_biggerLod > m_CrestSampleLodThreshold) + if (weight1 > m_CrestSampleLodThreshold) { - Cascade::MakeAnimatedWaves(_Crest_LodIndex + 1).SampleDisplacement(positionWS_XZ_before, wt_biggerLod, worldPos); + Cascade::MakeAnimatedWaves(slice1).SampleDisplacement(positionXZ, weight1, positionWS); } #if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) - worldPos.xz -= _WorldSpaceCameraPos.xz; + positionWS.xz -= _WorldSpaceCameraPos.xz; #endif - output.positionCS = mul(UNITY_MATRIX_VP, float4(worldPos, 1.0)); + output.positionCS = mul(UNITY_MATRIX_VP, float4(positionWS, 1.0)); + +#if d_LodInput + output.positionWS = positionWS; +#endif return output; } -half4 Fragment(const Varyings input, const bool i_isFrontFace) +half4 Fragment(const Varyings i_Input, const bool i_FrontFace) { - UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i_Input); - half4 result = 0.0; +#if d_LodInput + return half4(i_Input.positionWS.y - g_Crest_WaterCenter.y, 0, 0, 1); +#endif + + half result = 0.0; #if (CREST_PORTALS != 0) #if !d_Tunnel - bool masked = false; - if (m_CrestPortal) { - masked = ApplyVolumeToWaterMask(input.positionCS); + Portal::EvaluateMask(i_Input.positionCS); } #endif #endif - if (IsUnderwater(i_isFrontFace, g_Crest_ForceUnderwater)) + if (IsUnderWater(i_FrontFace, g_Crest_ForceUnderwater)) { - result = (half4)_Crest_MaskBelowSurface; + result = CREST_MASK_BELOW_SURFACE; } else { - result = (half4)CREST_MASK_ABOVE_SURFACE; + result = CREST_MASK_ABOVE_SURFACE; } #if (CREST_PORTALS != 0) +#if d_Crest_NegativeVolumePass + result = Portal::FixMaskForNegativeVolume(result, i_Input.positionCS.xy); +#endif + #if d_Tunnel - const float rawFrontFaceZ = LOAD_DEPTH_TEXTURE_X(_Crest_WaterVolumeFrontFaceTexture, input.positionCS.xy); - const float rawBackFaceZ = LOAD_DEPTH_TEXTURE_X(_Crest_WaterVolumeBackFaceTexture, input.positionCS.xy); - if (rawFrontFaceZ <= 0.0 && rawBackFaceZ > 0.0) + const float2 positionSS = i_Input.positionCS.xy; + const float ffz = LOAD_DEPTH_TEXTURE_X(_Crest_PortalFogBeforeTexture, positionSS); + const float bfz = LOAD_DEPTH_TEXTURE_X(_Crest_PortalFogAfterTexture, positionSS); + if (ffz <= 0.0 && bfz > 0.0) { - result = (half4)CREST_MASK_ABOVE_SURFACE; - } -#else - if (m_CrestPortal) - { - result *= masked ? 2 : 1; + result = CREST_MASK_ABOVE_SURFACE; } #endif #endif - return result; + return (half4)result; } m_CrestNameSpaceEnd @@ -148,4 +149,4 @@ m_CrestNameSpaceEnd m_CrestVertex m_CrestFragmentWithFrontFace(half4) -#endif // CREST_UNDERWATER_MASK_SHARED_INCLUDED +#endif // d_WaveHarmonic_Crest_Mask diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.shader index 3a3b715fa..c853ffa25 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.shader @@ -21,7 +21,7 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" Stencil { - Ref [_StencilRef] + Ref [_Crest_StencilReference] Comp [_Crest_StencilComparison] } @@ -31,7 +31,7 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" // for VFACE #pragma target 3.0 - #pragma multi_compile_local __ d_Tunnel + #pragma multi_compile_local_fragment __ d_Tunnel #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" @@ -42,9 +42,8 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" Pass { - Name "Water Surface Mask (Depth Only)" + Name "Water Surface Mask (Negative Volume)" Cull Off - ColorMask 0 HLSLPROGRAM #pragma vertex Vertex @@ -52,7 +51,9 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" // for VFACE #pragma target 3.0 - #define m_Discard discard + #define m_Return discard + + #define d_Crest_NegativeVolumePass 1 #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" @@ -63,26 +64,21 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" Pass { - Name "Water Horizon Mask" - Cull Off - ZWrite Off - // Horizon must be rendered first or it will overwrite the mask with incorrect values. ZTest not needed. - ZTest Always - - Stencil - { - Ref [_StencilRef] - Comp [_Crest_StencilComparison] - } + Name "Water Surface Data" + Cull Back HLSLPROGRAM #pragma vertex Vertex #pragma fragment Fragment + #pragma target 3.0 + + #define d_LodInput 1 + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl" ENDHLSL } } @@ -105,7 +101,7 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" Stencil { - Ref [_StencilRef] + Ref [_Crest_StencilReference] Comp [_Crest_StencilComparison] } @@ -115,7 +111,7 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" // for VFACE #pragma target 3.0 - #pragma multi_compile_local __ d_Tunnel + #pragma multi_compile_local_fragment __ d_Tunnel #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" @@ -125,9 +121,8 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" Pass { - Name "Water Surface Mask (Depth Only)" + Name "Water Surface Mask (Negative Volume)" Cull Off - ColorMask 0 HLSLPROGRAM #pragma vertex Vertex @@ -135,7 +130,9 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" // for VFACE #pragma target 3.0 - #define m_Discard discard + #define m_Return discard + + #define d_Crest_NegativeVolumePass 1 #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" @@ -145,25 +142,20 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" Pass { - Name "Water Horizon Mask" - Cull Off - ZWrite Off - // Horizon must be rendered first or it will overwrite the mask with incorrect values. ZTest not needed. - ZTest Always - - Stencil - { - Ref [_StencilRef] - Comp [_Crest_StencilComparison] - } + Name "Water Surface Data" + Cull Back HLSLPROGRAM #pragma vertex Vertex #pragma fragment Fragment + #pragma target 3.0 + + #define d_LodInput 1 + #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl" ENDHLSL } } @@ -179,75 +171,62 @@ Shader "Hidden/Crest/Underwater/Water Surface Mask" Stencil { - Ref [_StencilRef] + Ref [_Crest_StencilReference] Comp [_Crest_StencilComparison] } - CGPROGRAM + HLSLPROGRAM #pragma vertex Vertex #pragma fragment Fragment // for VFACE #pragma target 3.0 - #pragma multi_compile_local __ d_Tunnel - - #include "UnityCG.cginc" + #pragma multi_compile_local_fragment __ d_Tunnel #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl" - ENDCG + ENDHLSL } Pass { - Name "Water Surface Mask (Depth Only)" + Name "Water Surface Mask (Negative Volume)" Cull Off - ColorMask 0 - CGPROGRAM + HLSLPROGRAM #pragma vertex Vertex #pragma fragment Fragment // for VFACE #pragma target 3.0 - #define m_Discard discard + #define m_Return discard - #include "UnityCG.cginc" + #define d_Crest_NegativeVolumePass 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl" - ENDCG + ENDHLSL } Pass { - Name "Water Horizon Mask" - Cull Off - ZWrite Off - // Horizon must be rendered first or it will overwrite the mask with incorrect values. ZTest not needed. - ZTest Always + Name "Water Surface Data" + Cull Back - Stencil - { - Ref [_StencilRef] - Comp [_Crest_StencilComparison] - } - - CGPROGRAM + HLSLPROGRAM #pragma vertex Vertex #pragma fragment Fragment - #include "UnityCG.cginc" + #pragma target 3.0 + + #define d_LodInput 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl" - ENDCG + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Mask.hlsl" + ENDHLSL } } } diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskArtifacts.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskArtifacts.compute index 1ba4a4689..86ea8139d 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskArtifacts.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskArtifacts.compute @@ -4,13 +4,12 @@ // Checks both orthogonal and diagonal pixels to fill artefacts in the mask. If checked pixels are all the same then it // assumes that the current pixel should also be the same and fixes it. -#pragma kernel FillMaskArtefacts +#pragma kernel FillMaskArtefacts _BRP // Built-in will not handle this for us unlike other RPs. -#pragma multi_compile __ STEREO_INSTANCING_ON +#pragma multi_compile _ STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON -#include "UnityCG.cginc" -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/Compute.hlsl" RW_TEXTURE2D_X(float, _Crest_WaterMaskTexture); diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl index b6484c346..6dd5d5eb6 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/MaskHorizon.hlsl @@ -8,7 +8,6 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Constants.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Depth.hlsl" // Driven by scripting. It is a non-linear converted from a linear 0-1 value. float _Crest_FarPlaneOffset; diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl index b8bc28969..dcac03cb5 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl @@ -3,16 +3,32 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterShared.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Debug.hlsl" #ifndef SUPPORTS_FOVEATED_RENDERING_NON_UNIFORM_RASTER #define FoveatedRemapLinearToNonUniform(uv) uv #endif +#if (CREST_LEGACY_UNDERWATER != 0) || d_Crest_CustomColorTexture +TEXTURE2D_X(_Crest_CameraColorTexture); +#endif + +#if d_Crest_ComputeMask +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Data.hlsl" +#endif + m_CrestNameSpace +#if (CREST_LEGACY_UNDERWATER != 0) +float3 SampleSceneColor(float2 i_UV) +{ + return LOAD_TEXTURE2D_X(_Crest_CameraColorTexture, i_UV * _ScreenSize.xy).rgb; +} +#endif + struct Attributes { -#if CREST_WATER_VOLUME +#if d_Crest_Geometry float3 positionOS : POSITION; #else uint id : SV_VertexID; @@ -23,6 +39,9 @@ struct Attributes struct Varyings { float4 positionCS : SV_POSITION; +#if d_Crest_ComputeMask + float3 positionWS : TEXCOORD; +#endif UNITY_VERTEX_OUTPUT_STEREO }; @@ -33,9 +52,12 @@ Varyings Vertex(Attributes input) UNITY_SETUP_INSTANCE_ID(input); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); -#if CREST_WATER_VOLUME +#if d_Crest_Geometry // Use actual geometry instead of full screen triangle. output.positionCS = TransformObjectToHClip(input.positionOS); +#if d_Crest_ComputeMask + output.positionWS = TransformObjectToWorld(input.positionOS); +#endif #else output.positionCS = GetFullScreenTriangleVertexPosition(input.id, UNITY_RAW_FAR_CLIP_VALUE); #endif @@ -48,53 +70,70 @@ half4 Fragment(Varyings input) UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); uint2 positionSS = input.positionCS.xy; - float mask = LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, positionSS).x; + const float2 positionNDC = (positionSS + 0.5) / _ScreenSize.xy; + float mask = -1.0; - const float2 uv = FoveatedRemapLinearToNonUniform(positionSS / _ScreenSize.xy); +#if !d_Crest_NoMaskColor +#if d_Crest_ComputeMask + { + float3 positionWS = input.positionWS; +#if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) + positionWS.xyz += _WorldSpaceCameraPos.xyz; +#endif + mask = positionWS.y <= SampleWaterLineHeight(positionWS.xz) ? -1 : 1; + } +#else + mask = LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, positionSS).x; +#endif #if !_DEBUG_VISUALIZE_MASK -#if !d_Meniscus // Preserve alpha channel. if (mask > CREST_MASK_BELOW_SURFACE) { discard; } #endif -#endif +#endif // !d_Crest_NoMaskColor - float rawDepth = LoadCameraDepth(positionSS); - half3 sceneColour = LOAD_TEXTURE2D_X(_Crest_CameraColorTexture, positionSS).rgb; + float rawDepth = LoadSceneDepth(positionSS); + + half3 sceneColour; + +#if d_Crest_CustomColorTexture + if (m_CrestPortalNegativeVolume) + { + sceneColour = LOAD_TEXTURE2D_X(_Crest_CameraColorTexture, positionSS).rgb; + } + else +#endif + { + // Use sample in case texture is downsampled. + sceneColour = SampleSceneColor(positionNDC).rgb; + } + +#if d_Crest_NoMaskDepth + const float rawMaskDepth = 0.0; +#else const float rawMaskDepth = LOAD_TEXTURE2D_X(_Crest_WaterMaskDepthTexture, positionSS).x; +#endif #if _DEBUG_VISUALIZE_STENCIL return DebugRenderStencil(sceneColour); #endif - bool isWaterSurface; bool isUnderwater; bool hasCaustics; bool hasMeniscus; float sceneZ; float meniscusRawDepth; - GetWaterSurfaceAndUnderwaterData(input.positionCS, positionSS, rawMaskDepth, mask, rawDepth, meniscusRawDepth, isWaterSurface, isUnderwater, hasCaustics, hasMeniscus, sceneZ); - - float wt = 1.0; - - if (hasMeniscus) - { - wt = ComputeMeniscusWeight(positionSS, mask, _Crest_HorizonNormal, sceneZ); - } + bool isWaterSurface; bool isUnderwater; bool hasCaustics; float sceneZ; bool outScatterScene; bool applyLighting; + GetWaterSurfaceAndUnderwaterData(input.positionCS, positionSS, rawMaskDepth, mask, rawDepth, isWaterSurface, isUnderwater, hasCaustics, outScatterScene, applyLighting, sceneZ); #if !_DEBUG_VISUALIZE_MASK -#if d_Meniscus // Preserve alpha channel. - if (!isUnderwater && wt >= 1.0) + if (!isUnderwater) { discard; } -#endif #endif float fogDistance = sceneZ; - float meniscusDepth = 0.0; -#if defined(CREST_WATER_VOLUME) || defined(CREST_WATER_VOLUME_FULLSCREEN) - ApplyWaterVolumeToUnderwaterFogAndMeniscus(input.positionCS, meniscusRawDepth, fogDistance, meniscusDepth); -#endif + ApplyWaterVolumeToUnderwaterFog(input.positionCS, fogDistance); #if _DEBUG_VISUALIZE_MASK return DebugRenderWaterMask(isWaterSurface, isUnderwater, mask, sceneColour); @@ -102,15 +141,16 @@ half4 Fragment(Varyings input) if (isUnderwater) { + const float2 uv = FoveatedRemapLinearToNonUniform(positionNDC); float3 positionWS = ComputeWorldSpacePosition(uv, rawDepth, UNITY_MATRIX_I_VP); const half3 view = GetWorldSpaceNormalizeViewDir(positionWS); #if (SHADEROPTIONS_CAMERA_RELATIVE_RENDERING != 0) positionWS += _WorldSpaceCameraPos; #endif - sceneColour = ApplyUnderwaterEffect(sceneColour, rawDepth, sceneZ, fogDistance, view, positionSS, positionWS, hasCaustics); + sceneColour = ApplyUnderwaterEffect(sceneColour, rawDepth, sceneZ, fogDistance, view, positionSS, positionWS, hasCaustics, outScatterScene, applyLighting, 1.0); } - return half4(wt * sceneColour, 1.0); + return half4(sceneColour, 1.0); } half4 FragmentPlanarReflections(Varyings input) @@ -118,7 +158,8 @@ half4 FragmentPlanarReflections(Varyings input) UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); const uint2 positionSS = input.positionCS.xy; - float depth = LoadCameraDepth(positionSS); + const float2 positionNDC = (positionSS + 0.5) / _ScreenSize.xy; + float depth = LoadSceneDepth(positionSS); // TODO: Do something nicer. Could zero alpha if scene depth is above threshold. if (depth == 0.0) @@ -126,12 +167,12 @@ half4 FragmentPlanarReflections(Varyings input) return half4(_Crest_Scattering.xyz, 1.0); } - half3 color = LOAD_TEXTURE2D_X(_Crest_CameraColorTexture, positionSS).rgb; + half3 color = SampleSceneColor(positionNDC).rgb; // Calculate position and account for possible NaNs discovered during testing. float3 positionWS; { - float4 positionCS = ComputeClipSpacePosition(positionSS / _ScreenSize.xy, depth); + float4 positionCS = ComputeClipSpacePosition(positionNDC, depth); float4 hpositionWS = mul(UNITY_MATRIX_I_VP, positionCS); // w is sometimes zero when using oblique projection. @@ -146,7 +187,7 @@ half4 FragmentPlanarReflections(Varyings input) const half3 view = GetWorldSpaceNormalizeViewDir(positionWS); const bool hasCaustics = depth > 0.0; - color = ApplyUnderwaterEffect(color, depth, 0.0, 0.0, view, positionSS, positionWS, hasCaustics); + color = ApplyUnderwaterEffect(color, depth, 0.0, 0.0, view, positionSS, positionWS, hasCaustics, true, true, 1.0); return half4(color, 1.0); } diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.shader b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.shader index d711715cc..ac0983410 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.shader +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.shader @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. Shader "Crest/Underwater" @@ -17,11 +17,6 @@ Shader "Crest/Underwater" _Crest_DitheringEnabled("Dithering", Integer) = 1 _Crest_DitheringIntensity("Dithering Intensity", Range(0, 10)) = 1 - [Space(10)] - - [Toggle(d_Meniscus)] - _Crest_MeniscusEnabled("Meniscus", Integer) = 1 - [Header(Advanced)] [Space(6)] @@ -68,9 +63,13 @@ Shader "Crest/Underwater" // Also on the water shader. #pragma multi_compile_local_fragment __ CREST_FLOW_ON - #pragma shader_feature_local_fragment __ d_Meniscus #pragma shader_feature_local_fragment __ d_Dithering + // NOTE: FragmentPlanarReflections do not need these. + // Whether to skip mask and/or depth sampling. + #pragma multi_compile_local_fragment __ d_Crest_NoMaskColor + #pragma multi_compile_local_fragment __ d_Crest_NoMaskDepth + #pragma multi_compile_local_fragment __ _DEBUG_VISUALIZE_MASK #pragma multi_compile_local_fragment __ _DEBUG_VISUALIZE_STENCIL ENDHLSL @@ -84,239 +83,17 @@ Shader "Crest/Underwater" Tags { "RenderPipeline"="HDRenderPipeline" } - ZWrite Off Blend Off - - Pass - { - Name "Full Screen" - Cull Off - ZTest Always - - HLSLPROGRAM - #include_with_pragmas "UnderwaterHDRP.hlsl" - - // Both "__" and "_FULL_SCREEN_EFFECT" are fullscreen triangles. The latter only denotes an optimisation of - // whether to skip the horizon calculation. - #pragma multi_compile_local_fragment __ _FULL_SCREEN_EFFECT - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment Fragment - ENDHLSL - } - - Pass - { - Name "Reflection" - Cull Off - ZTest Always - - HLSLPROGRAM - #define CREST_REFLECTION 1 - #include_with_pragmas "UnderwaterHDRP.hlsl" - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment FragmentPlanarReflections - ENDHLSL - } - - Pass - { - PackageRequirements - { - "com.waveharmonic.crest.portals" - } - - // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (2D)" - Cull Back - ZTest LEqual - - HLSLPROGRAM - #include_with_pragmas "UnderwaterHDRP.hlsl" - - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment Fragment - ENDHLSL - } - - Pass - { - PackageRequirements - { - "com.waveharmonic.crest.portals" - } - - // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (3D)" - Cull Back - ZTest LEqual - - HLSLPROGRAM - #include_with_pragmas "UnderwaterHDRP.hlsl" - - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_HAS_BACKFACE 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment Fragment - ENDHLSL - } - - Pass - { - PackageRequirements - { - "com.waveharmonic.crest.portals" - } - - // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (Fly-Through)" - Cull Back - ZTest LEqual - - Stencil - { - // Must match k_StencilValueVolume in: - // Portals.cs - Ref 5 - Comp Always - Pass Replace - ZFail IncrSat - } - - HLSLPROGRAM - #include_with_pragmas "UnderwaterHDRP.hlsl" - - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_HAS_BACKFACE 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment Fragment - ENDHLSL - } - - Pass - { - // Back face will only render if view is within the volume and there is no scene in front. It will only add - PackageRequirements - { - "com.waveharmonic.crest.portals" - } - - // fog to the back face (and in effect anything behind it). No caustics. - Name "Volume: Back Face" - Cull Front - ZTest LEqual - - Stencil - { - // Must match k_StencilValueVolume in: - // Portals.cs - Ref 5 - Comp NotEqual - Pass Replace - ZFail IncrSat - } - - HLSLPROGRAM - #include_with_pragmas "UnderwaterHDRP.hlsl" - - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_BACK_FACE 1 - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment Fragment - ENDHLSL - } - - Pass - { - PackageRequirements - { - "com.waveharmonic.crest.portals" - } - - // When inside a volume, this pass will render to the scene within the volume. - Name "Volume: Scene (Full Screen)" - Cull Back - ZTest Always - Stencil - { - // We want to render over the scene that's inside the volume, but not over already fogged areas. It will - // handle all of the scene within the geometry once the camera is within the volume. - // 0 = Outside of geometry as neither face passes have touched it. - // 1 = Only back face z failed which means scene is in front of back face but not front face. - // 2 = Both front and back face z failed which means outside geometry. - Ref 1 - Comp Equal - Pass Replace - } - - HLSLPROGRAM - #include_with_pragmas "UnderwaterHDRP.hlsl" - - #define CREST_WATER_VOLUME_FULLSCREEN 1 - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment Fragment - ENDHLSL - } - - Pass - { - PackageRequirements - { - "com.waveharmonic.crest.portals" - } - - Name "Volume: Negative (Full Screen)" - Cull Off - ZTest Always - - HLSLPROGRAM - #include_with_pragmas "UnderwaterHDRP.hlsl" - - #define CREST_WATER_VOLUME_FULLSCREEN 1 - #define CREST_WATER_VOLUME_NEGATIVE 1 - #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" - - #pragma fragment Fragment - ENDHLSL - } - } - - Subshader - { - PackageRequirements - { - "com.unity.render-pipelines.universal" - } - - Tags { "RenderPipeline"="UniversalPipeline" } - + Cull Off + ZTest Always ZWrite Off Pass { Name "Full Screen" - Cull Off - ZTest Always HLSLPROGRAM - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" - - // Both "__" and "_FULL_SCREEN_EFFECT" are fullscreen triangles. The latter only denotes an optimisation of - // whether to skip the horizon calculation. - #pragma multi_compile_local_fragment __ _FULL_SCREEN_EFFECT - + #include_with_pragmas "UnderwaterHDRP.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -326,14 +103,10 @@ Shader "Crest/Underwater" Pass { Name "Reflection" - Cull Off - ZTest Always HLSLPROGRAM #define CREST_REFLECTION 1 - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include_with_pragmas "UnderwaterHDRP.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment FragmentPlanarReflections @@ -348,17 +121,19 @@ Shader "Crest/Underwater" } // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (2D)" + Name "Fog After" + Cull Back ZTest LEqual HLSLPROGRAM - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include_with_pragmas "UnderwaterHDRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 + #pragma multi_compile_local _ d_Crest_ComputeMask + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_FogAfter 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -373,18 +148,18 @@ Shader "Crest/Underwater" } // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (3D)" + Name "Fog After To Back-Face" + Cull Back ZTest LEqual HLSLPROGRAM - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include_with_pragmas "UnderwaterHDRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_HAS_BACKFACE 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_PortalWithBackFace 1 + #define d_Crest_FogAfter 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -399,7 +174,8 @@ Shader "Crest/Underwater" } // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (Fly-Through)" + Name "Fog After To Back-Face (Fly-Through)" + Cull Back ZTest LEqual @@ -414,13 +190,14 @@ Shader "Crest/Underwater" } HLSLPROGRAM - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include_with_pragmas "UnderwaterHDRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_HAS_BACKFACE 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 + #pragma multi_compile_local _ d_Crest_ComputeMask + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_PortalWithBackFace 1 + #define d_Crest_FogAfter 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -436,7 +213,8 @@ Shader "Crest/Underwater" } // fog to the back face (and in effect anything behind it). No caustics. - Name "Volume: Back Face" + Name "Fog Before (Fly-Through)" + Cull Front ZTest LEqual @@ -451,12 +229,13 @@ Shader "Crest/Underwater" } HLSLPROGRAM - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include_with_pragmas "UnderwaterHDRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_BACK_FACE 1 + #define d_Crest_CustomColorTexture 1 + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_FogBefore 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -471,9 +250,8 @@ Shader "Crest/Underwater" } // When inside a volume, this pass will render to the scene within the volume. - Name "Volume: Scene (Full Screen)" - Cull Back - ZTest Always + Name "Full Screen (Fly-Through)" + Stencil { // We want to render over the scene that's inside the volume, but not over already fogged areas. It will @@ -487,11 +265,9 @@ Shader "Crest/Underwater" } HLSLPROGRAM - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include_with_pragmas "UnderwaterHDRP.hlsl" - #define CREST_WATER_VOLUME_FULLSCREEN 1 + #define d_Crest_Portal 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -505,17 +281,16 @@ Shader "Crest/Underwater" "com.waveharmonic.crest.portals" } - Name "Volume: Negative (Full Screen)" - Cull Off - ZTest Always + Name "Full Screen (Negative)" HLSLPROGRAM - #include_with_pragmas "UnderwaterURP.hlsl" - #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" - #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include_with_pragmas "UnderwaterHDRP.hlsl" - #define CREST_WATER_VOLUME_FULLSCREEN 1 - #define CREST_WATER_VOLUME_NEGATIVE 1 + #define d_Crest_CustomColorTexture 1 + + #define d_Crest_Portal 1 + #define d_Crest_PortalNegativeVolume 1 + #define d_Crest_PortalWithBackFace 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -525,21 +300,257 @@ Shader "Crest/Underwater" SubShader { + PackageRequirements + { + "com.unity.render-pipelines.universal" + } + + Tags { "RenderPipeline"="UniversalPipeline" } + + Blend Off + Cull Off + ZTest Always ZWrite Off Pass { Name "Full Screen" - Cull Off - ZTest Always HLSLPROGRAM - #include_with_pragmas "UnderwaterBIRP.hlsl" - - // Both "__" and "_FULL_SCREEN_EFFECT" are fullscreen triangles. The latter only denotes an optimisation of - // whether to skip the horizon calculation. - #pragma multi_compile_local_fragment __ _FULL_SCREEN_EFFECT - + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment Fragment + ENDHLSL + } + + Pass + { + Name "Reflection" + + HLSLPROGRAM + #define CREST_REFLECTION 1 + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment FragmentPlanarReflections + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + // Only adds fog to the front face and in effect anything behind it. + Name "Fog After" + + Cull Back + ZTest LEqual + + HLSLPROGRAM + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + + #pragma multi_compile_local _ d_Crest_ComputeMask + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_FogAfter 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment Fragment + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + // Only adds fog to the front face and in effect anything behind it. + Name "Fog After To Back-Face" + + Cull Back + ZTest LEqual + + HLSLPROGRAM + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_PortalWithBackFace 1 + #define d_Crest_FogAfter 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment Fragment + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + // Only adds fog to the front face and in effect anything behind it. + Name "Fog After To Back-Face (Fly-Through)" + + Cull Back + ZTest LEqual + + Stencil + { + // Must match k_StencilValueVolume in: + // Portals.cs + Ref 5 + Comp Always + Pass Replace + ZFail IncrSat + } + + HLSLPROGRAM + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + + #pragma multi_compile_local _ d_Crest_ComputeMask + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_PortalWithBackFace 1 + #define d_Crest_FogAfter 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment Fragment + ENDHLSL + } + + Pass + { + // Back face will only render if view is within the volume and there is no scene in front. It will only add + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + // fog to the back face (and in effect anything behind it). No caustics. + Name "Fog Before (Fly-Through)" + + Cull Front + ZTest LEqual + + Stencil + { + // Must match k_StencilValueVolume in: + // Portals.cs + Ref 5 + Comp NotEqual + Pass Replace + ZFail IncrSat + } + + HLSLPROGRAM + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + + #define d_Crest_CustomColorTexture 1 + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_FogBefore 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment Fragment + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + // When inside a volume, this pass will render to the scene within the volume. + Name "Full Screen (Fly-Through)" + + Stencil + { + // We want to render over the scene that's inside the volume, but not over already fogged areas. It will + // handle all of the scene within the geometry once the camera is within the volume. + // 0 = Outside of geometry as neither face passes have touched it. + // 1 = Only back face z failed which means scene is in front of back face but not front face. + // 2 = Both front and back face z failed which means outside geometry. + Ref 1 + Comp Equal + Pass Replace + } + + HLSLPROGRAM + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + + #define d_Crest_Portal 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment Fragment + ENDHLSL + } + + Pass + { + PackageRequirements + { + "com.waveharmonic.crest.portals" + } + + Name "Full Screen (Negative)" + + HLSLPROGRAM + #include_with_pragmas "UnderwaterURP.hlsl" + #include_with_pragmas "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRenderingKeywords.hlsl" + #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/FoveatedRendering.hlsl" + + #define d_Crest_CustomColorTexture 1 + + #define d_Crest_Portal 1 + #define d_Crest_PortalNegativeVolume 1 + #define d_Crest_PortalWithBackFace 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" + + #pragma fragment Fragment + ENDHLSL + } + } + + SubShader + { + Blend Off + Cull Off + ZTest Always + ZWrite Off + + Pass + { + Name "Full Screen" + + HLSLPROGRAM + #include_with_pragmas "UnderwaterBIRP.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -549,8 +560,6 @@ Shader "Crest/Underwater" Pass { Name "Reflection" - Cull Off - ZTest Always HLSLPROGRAM #define CREST_REFLECTION 1 @@ -569,15 +578,19 @@ Shader "Crest/Underwater" } // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (2D)" + Name "Fog After" + Cull Back ZTest LEqual HLSLPROGRAM #include_with_pragmas "UnderwaterBIRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 + #pragma multi_compile_local _ d_Crest_ComputeMask + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_FogAfter 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -592,16 +605,18 @@ Shader "Crest/Underwater" } // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (3D)" + Name "Fog After To Back-Face" + Cull Back ZTest LEqual HLSLPROGRAM #include_with_pragmas "UnderwaterBIRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_HAS_BACKFACE 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_PortalWithBackFace 1 + #define d_Crest_FogAfter 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -616,7 +631,8 @@ Shader "Crest/Underwater" } // Only adds fog to the front face and in effect anything behind it. - Name "Volume: Front Face (Fly-Through)" + Name "Fog After To Back-Face (Fly-Through)" + Cull Back ZTest LEqual @@ -633,9 +649,11 @@ Shader "Crest/Underwater" HLSLPROGRAM #include_with_pragmas "UnderwaterBIRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_HAS_BACKFACE 1 - #define CREST_WATER_VOLUME_FRONT_FACE 1 + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_PortalWithBackFace 1 + #define d_Crest_FogAfter 1 + #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -651,7 +669,8 @@ Shader "Crest/Underwater" } // fog to the back face (and in effect anything behind it). No caustics. - Name "Volume: Back Face" + Name "Fog Before (Fly-Through)" + Cull Front ZTest LEqual @@ -668,8 +687,14 @@ Shader "Crest/Underwater" HLSLPROGRAM #include_with_pragmas "UnderwaterBIRP.hlsl" - #define CREST_WATER_VOLUME 1 - #define CREST_WATER_VOLUME_BACK_FACE 1 + #pragma multi_compile_local _ d_Crest_ComputeMask + + // For negative volumes. + #define d_Crest_CustomColorTexture 1 + + #define d_Crest_Portal 1 + #define d_Crest_Geometry 1 + #define d_Crest_FogBefore 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -684,9 +709,8 @@ Shader "Crest/Underwater" } // When inside a volume, this pass will render to the scene within the volume. - Name "Volume: Scene (Full Screen)" - Cull Back - ZTest Always + Name "Full Screen (Fly-Through)" + Stencil { // We want to render over the scene that's inside the volume, but not over already fogged areas. It will @@ -702,7 +726,7 @@ Shader "Crest/Underwater" HLSLPROGRAM #include_with_pragmas "UnderwaterBIRP.hlsl" - #define CREST_WATER_VOLUME_FULLSCREEN 1 + #define d_Crest_Portal 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment @@ -716,15 +740,16 @@ Shader "Crest/Underwater" "com.waveharmonic.crest.portals" } - Name "Volume: Negative (Full Screen)" - Cull Off - ZTest Always + Name "Full Screen (Negative)" HLSLPROGRAM #include_with_pragmas "UnderwaterBIRP.hlsl" - #define CREST_WATER_VOLUME_FULLSCREEN 1 - #define CREST_WATER_VOLUME_NEGATIVE 1 + #define d_Crest_CustomColorTexture 1 + + #define d_Crest_Portal 1 + #define d_Crest_PortalNegativeVolume 1 + #define d_Crest_PortalWithBackFace 1 #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/Underwater.hlsl" #pragma fragment Fragment diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterBIRP.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterBIRP.hlsl index 0fb106ed1..4a1951ed2 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterBIRP.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterBIRP.hlsl @@ -6,23 +6,16 @@ #define CREST_BIRP 1 #define CREST_SHADERGRAPH_CONSTANTS_H -#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Shim/Shims.hlsl" -#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Core.hlsl" +#pragma multi_compile_fragment _ DIRECTIONAL_COOKIE + +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/ShaderPass.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Defines.hlsl" + +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Core.hlsl" + #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/Lighting.hlsl" #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/Editor/ShaderGraph/Includes/LegacySurfaceVertex.hlsl" #include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/ShaderGraphFunctions.hlsl" -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/InputsDriven.hlsl" -#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Legacy/Common.hlsl" - -TEXTURE2D_X(_CameraDepthTexture); SAMPLER(sampler_CameraDepthTexture); - -m_CrestNameSpace - -float LoadCameraDepth(uint2 pixelCoords) -{ - return LOAD_TEXTURE2D_X(_CameraDepthTexture, pixelCoords).r; -} - -m_CrestNameSpaceEnd +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/DeclareOpaqueTexture.hlsl" +#include "Packages/com.unity.shadergraph/Editor/Generation/Targets/BuiltIn/ShaderLibrary/DeclareDepthTexture.hlsl" diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterHDRP.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterHDRP.hlsl index 1ff81d1e7..ba84092d2 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterHDRP.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterHDRP.hlsl @@ -16,3 +16,4 @@ #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl" #include "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/RP/HDRP/Common.hlsl" diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterShared.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterShared.hlsl index 81b022d98..f23a02f5e 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterShared.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterShared.hlsl @@ -11,8 +11,9 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Globals.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Helpers.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Depth.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Helpers.hlsl" -#if defined(CREST_WATER_VOLUME) || defined(CREST_WATER_VOLUME_FULLSCREEN) +#if d_Crest_Portal #include "Packages/com.waveharmonic.crest.portals/Runtime/Shaders/Library/Portals.hlsl" #endif @@ -20,6 +21,7 @@ #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Texture.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Lighting.hlsl" +#include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Utility/Shadows.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/VolumeLighting.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Surface/Caustics.hlsl" @@ -31,10 +33,16 @@ CBUFFER_START(CrestPerMaterial) // Surface Shared // +#ifndef d_Crest_WaterSurface + half4 _Crest_Absorption; half4 _Crest_Scattering; half _Crest_Anisotropy; +half _Crest_DirectTerm; +half _Crest_AmbientTerm; +half _Crest_ShadowsAffectsAmbientFactor; + bool _Crest_CausticsEnabled; float _Crest_CausticsTextureScale; float _Crest_CausticsScrollSpeed; @@ -48,16 +56,12 @@ half _Crest_CausticsMotionBlur; float4 _Crest_CausticsTexture_TexelSize; float4 _Crest_CausticsDistortionTexture_TexelSize; -half _Crest_DirectTerm; -half _Crest_AmbientTerm; -half _Crest_ShadowsAffectsAmbientFactor; +#endif // !d_Crest_WaterSurface // // Volume Only // -float2 _Crest_HorizonNormal; - // Out-scattering. Driven by the Water Renderer and Underwater Environmental Lighting. float _Crest_VolumeExtinctionLength; float _Crest_UnderwaterEnvironmentalLightingWeight; @@ -73,9 +77,10 @@ int _Crest_DataSliceOffset; half _Crest_DitheringIntensity; CBUFFER_END -TEXTURE2D_X(_Crest_WaterMaskTexture); TEXTURE2D_X(_Crest_WaterMaskDepthTexture); -TEXTURE2D_X(_Crest_CameraColorTexture); + +#ifndef d_Crest_WaterSurface +TEXTURE2D_X(_Crest_WaterMaskTexture); TEXTURE2D(_Crest_CausticsTexture); SAMPLER(sampler_Crest_CausticsTexture); @@ -87,118 +92,50 @@ static const m_Crest::TiledTexture _Crest_CausticsTiledTexture = m_Crest::TiledTexture::Make(_Crest_CausticsTexture, sampler_Crest_CausticsTexture, _Crest_CausticsTexture_TexelSize, _Crest_CausticsTextureScale, _Crest_CausticsScrollSpeed); static const m_Crest::TiledTexture _Crest_CausticsDistortionTiledTexture = m_Crest::TiledTexture::Make(_Crest_CausticsDistortionTexture, sampler_Crest_CausticsDistortionTexture, _Crest_CausticsDistortionTexture_TexelSize, _Crest_CausticsDistortionScale, 1.0); +#endif // !d_Crest_WaterSurface m_CrestNameSpace -float LinearToDeviceDepth(float linearDepth, float4 zBufferParam) +// Get the out-scattering term. +half3 EvaluateOutScattering +( + const half3 i_Extinction, + const float3 i_PositionWS, + const half3 i_ViewWS, + const half i_Multiplier, + const float i_RawDepth, + const float i_WaterLevel +) { - //linear = 1.0 / (zBufferParam.z * device + zBufferParam.w); - float device = (1.0 / linearDepth - zBufferParam.w) / zBufferParam.z; - return device; -} + float3 positionWS = i_PositionWS; -#if d_Dithering -// Adapted from: -// https://alex.vlachos.com/graphics/Alex_Vlachos_Advanced_VR_Rendering_GDC2015.pdf -float3 ScreenSpaceDither(const float2 i_ScreenPosition) -{ - // Iestyn's RGB dither (7 asm instructions) from Portal 2 X360, slightly modified for VR. - float3 dither = dot(float2(171.0, 231.0), i_ScreenPosition.xy); - dither.rgb = frac(dither.rgb / float3(103.0, 71.0, 97.0)) - float3(0.5, 0.5, 0.5); - return (dither.rgb / 255.0); -} +#if !CREST_REFLECTION + // Project point onto sphere at the extinction length. + const float3 toSphere = -i_ViewWS * _Crest_VolumeExtinctionLength * i_Multiplier * _Crest_OutScatteringExtinctionFactor; + const float3 toScene = i_PositionWS - _WorldSpaceCameraPos.xyz; + positionWS = _WorldSpaceCameraPos.xyz + toSphere; + + // Get closest position. + positionWS = dot(toScene, toScene) < dot(toSphere, toSphere) ? i_PositionWS : positionWS; #endif -float4 DebugRenderWaterMask(const bool isWaterSurface, const bool isUnderwater, const float mask, const float3 sceneColour) -{ - // Red: surface front face when above water - // Green: surface back face when below water - // Cyan: background when above water - // Magenta: background when below water - if (isWaterSurface) - { - return float4(sceneColour * float3(mask >= CREST_MASK_ABOVE_SURFACE, mask <= CREST_MASK_BELOW_SURFACE, 0.0), 1.0); - } - else - { - return float4(sceneColour * float3(isUnderwater * 0.5, (1.0 - isUnderwater) * 0.5, 1.0), 1.0); - } -} + // Account for average extinction of light as it travels down through volume. Assume flat water as anything + // else would be expensive. + float waterDepth = max(0.0, (i_WaterLevel - positionWS.y)); -float4 DebugRenderStencil(float3 sceneColour) -{ - float3 stencil = 1.0; -#if CREST_WATER_VOLUME_FRONT_FACE - stencil = float3(1.0, 0.0, 0.0); -#elif CREST_WATER_VOLUME_BACK_FACE - stencil = float3(0.0, 1.0, 0.0); -#elif CREST_WATER_VOLUME_FULLSCREEN - stencil = float3(0.0, 0.0, 1.0); -#endif - return float4(sceneColour * stencil, 1.0); -} - -float MeniscusSampleWaterMask(const float mask, const int2 positionSS, const float2 offset, const float magnitude, const float scale) -{ - float2 uv = positionSS + offset * magnitude -#if defined(CREST_WATER_VOLUME) || defined(CREST_WATER_VOLUME_FULLSCREEN) - * scale -#endif - ; - - float newMask = LOAD_TEXTURE2D_X(_Crest_WaterMaskTexture, uv).r; - -#if CREST_UNDERWATER_BEFORE_TRANSPARENT - // Normalize mask. - newMask = clamp(newMask, -1.0, 1.0); -#endif - -#if CREST_WATER_VOLUME - // No mask means no underwater effect so ignore the value. - return (newMask == CREST_MASK_NONE ? mask : newMask); -#endif - return newMask; -} - -half ComputeMeniscusWeight(const int2 positionSS, float mask, const float2 horizonNormal, const float meniscusDepth) -{ - float weight = 1.0; -#if d_Meniscus -#if !_FULL_SCREEN_EFFECT - -#if CREST_UNDERWATER_BEFORE_TRANSPARENT - // Normalize mask. - mask = clamp(mask, -1.0, 1.0); -#endif - - // Render meniscus by checking the mask along the horizon normal which is flipped using the surface normal from - // mask. Adding the mask value will flip the UV when mask is below surface. - float2 offset = (float2)-mask * horizonNormal; - float multiplier = 0.9; - -#if defined(CREST_WATER_VOLUME) || defined(CREST_WATER_VOLUME_FULLSCREEN) - // The meniscus at the boundary can be at a distance. We need to scale the offset as 1 pixel at a distance is much - // larger than 1 pixel up close. - const float scale = 1.0 - saturate(meniscusDepth / MENISCUS_MAXIMUM_DISTANCE); - - // Exit early. - if (scale == 0.0) - { - return 1.0; - } +#if CREST_REFLECTION + waterDepth *= 2.0; + if (i_RawDepth == 0.0) waterDepth = _Crest_VolumeExtinctionLength * i_Multiplier; #else - // Dummy value. - const float scale = 0.0; + // Full strength seems too extreme. Third strength seems reasonable. + waterDepth *= _Crest_OutScatteringFactor; #endif - // Sample three pixels along the normal. If the sample is different than the current mask, apply meniscus. - // Offset must be added to positionSS as floats. - weight *= (MeniscusSampleWaterMask(mask, positionSS, offset, 1.0, scale) != mask) ? multiplier : 1.0; - weight *= (MeniscusSampleWaterMask(mask, positionSS, offset, 2.0, scale) != mask) ? multiplier : 1.0; - weight *= (MeniscusSampleWaterMask(mask, positionSS, offset, 3.0, scale) != mask) ? multiplier : 1.0; -#endif // _FULL_SCREEN_EFFECT -#endif // d_Meniscus - return weight; + const float3 outScatteringTerm = exp(-i_Extinction * waterDepth); + + // Transition between the Underwater Environmental Lighting (if present) and this. This will give us the + // benefit of both approaches. + return lerp(outScatteringTerm, 1.0, _Crest_UnderwaterEnvironmentalLightingWeight); } void GetWaterSurfaceAndUnderwaterData @@ -208,11 +145,11 @@ void GetWaterSurfaceAndUnderwaterData const float rawMaskDepth, const float mask, inout float rawDepth, - inout float rawMeniscusDepth, inout bool isWaterSurface, inout bool isUnderwater, inout bool hasCaustics, - inout bool hasMeniscus, + inout bool io_OutScatterScene, + inout bool io_ApplyLighting, inout float sceneZ ) { @@ -220,75 +157,17 @@ void GetWaterSurfaceAndUnderwaterData hasCaustics = rawDepth != 0.0; isWaterSurface = false; isUnderwater = mask <= CREST_MASK_BELOW_SURFACE; - hasMeniscus = true; - rawMeniscusDepth = positionCS.z; + io_OutScatterScene = true; + io_ApplyLighting = true; -#if defined(CREST_WATER_VOLUME_HAS_BACKFACE) || defined(CREST_WATER_VOLUME_BACK_FACE) || defined(CREST_WATER_VOLUME_NEGATIVE) - const float rawGeometryDepth = -#if CREST_WATER_VOLUME_HAS_BACKFACE - // 3D has a back face texture for the depth. - LOAD_DEPTH_TEXTURE_X(_Crest_WaterVolumeBackFaceTexture, positionSS); -#elif CREST_WATER_VOLUME_NEGATIVE - LOAD_DEPTH_TEXTURE_X(_Crest_WaterVolumeFrontFaceTexture, positionSS); -#else - // Volume is rendered using the back face so that is the depth. - positionCS.z; -#endif // CREST_WATER_VOLUME_HAS_BACKFACE - ; - - if ((rawMaskDepth > 0.0 && rawMaskDepth <= rawSceneDepth) || (rawGeometryDepth > 0.0 && rawGeometryDepth <= rawSceneDepth)) - { - hasMeniscus = false; - } - - // Use backface depth if closest. - if (rawDepth < rawGeometryDepth) - { - // Cancels out caustics. - hasCaustics = false; - rawDepth = rawGeometryDepth; - } - -#if CREST_WATER_VOLUME_NEGATIVE - rawMeniscusDepth = rawGeometryDepth; - if (rawGeometryDepth == 0.0) - { - const float rawBackFaceDepth = LOAD_DEPTH_TEXTURE_X(_Crest_WaterVolumeBackFaceTexture, positionSS); - - // We are in the negative volume. Already handled by front face. - if (rawBackFaceDepth > 0.0) - { - if (rawBackFaceDepth <= rawSceneDepth) - { - hasMeniscus = false; - } - - isUnderwater = false; - } - } -#endif // CREST_WATER_VOLUME_NEGATIVE -#endif // CREST_WATER_VOLUME - -#if CREST_WATER_VOLUME_FRONT_FACE - // If negative volume, we keep the mask intact, and just mark it. - if (mask >= CREST_MASK_ABOVE_SURFACE_KEPT) - { - isUnderwater = true; - } - else if (mask <= CREST_MASK_BELOW_SURFACE_KEPT) - { - isUnderwater = false; - } +#if defined(d_Crest_PortalWithBackFace) || defined(d_Crest_FogBefore) + // Has back-face or is back-face. + Portal::EvaluateVolume(positionCS, positionSS, rawMaskDepth, rawSceneDepth, rawDepth, hasCaustics, isUnderwater, io_OutScatterScene, io_ApplyLighting); #endif // Merge water depth with scene depth. if (rawDepth < rawMaskDepth) { -#if CREST_UNDERWATER_BEFORE_TRANSPARENT - // Apply fog to culled tiles otherwise there will be no fog as water shader can only fog enabled tiles. And - // only apply fog to culled tiles otherwise it will be fogged twice (second by water shader). - isUnderwater = mask <= CREST_MASK_BELOW_SURFACE_CULLED; -#endif isWaterSurface = true; hasCaustics = false; rawDepth = rawMaskDepth; @@ -297,21 +176,19 @@ void GetWaterSurfaceAndUnderwaterData sceneZ = Utility::CrestLinearEyeDepth(rawDepth); } -void ApplyWaterVolumeToUnderwaterFogAndMeniscus(float4 positionCS, const float meniscusRawDepth, inout float fogDistance, inout float meniscusDepth) +void ApplyWaterVolumeToUnderwaterFog(float4 positionCS, inout float fogDistance) { -#if CREST_WATER_VOLUME_FRONT_FACE - float depth = Utility::CrestLinearEyeDepth(positionCS.z); - // Meniscus is rendered at the boundary so use the geometry z. - meniscusDepth = depth; - fogDistance -= depth; + // TODO: could we use min here with near plane? less optimized +#if d_Crest_FogAfter + fogDistance -= Utility::CrestLinearEyeDepth(positionCS.z); #else - float depth = Utility::CrestLinearEyeDepth(meniscusRawDepth); - // Meniscus is rendered at the boundary so use the geometry z. - meniscusDepth = depth; + // Subtract near plane. + fogDistance -= _ProjectionParams.y; #endif } -half3 ApplyUnderwaterEffect( +half3 ApplyUnderwaterEffect +( half3 sceneColour, const float rawDepth, const float sceneZ, @@ -319,8 +196,12 @@ half3 ApplyUnderwaterEffect( const half3 view, const uint2 i_positionSS, const float3 i_positionWS, - const bool hasCaustics -) { + const bool hasCaustics, + const bool i_OutScatterScene, + const bool i_ApplyLighting, + const half i_multiplier +) +{ const bool isUnderwater = true; float3 lightDirection; float3 lightColor; @@ -340,6 +221,9 @@ half3 ApplyUnderwaterEffect( if (g_Crest_SampleAbsorptionSimulation) absorption = Cascade::MakeAbsorption(sliceIndex).Sample(_WorldSpaceCameraPos.xz).xyz; if (g_Crest_SampleScatteringSimulation) scattering = Cascade::MakeScattering(sliceIndex).Sample(_WorldSpaceCameraPos.xz).xyz; + absorption *= _Crest_ExtinctionMultiplier; + scattering *= _Crest_ExtinctionMultiplier; + const float waterLevel = g_Crest_WaterCenter.y + Cascade::MakeAnimatedWaves(sliceIndex).Sample(_WorldSpaceCameraPos.xz).w; half shadow = 1.0; @@ -354,55 +238,35 @@ half3 ApplyUnderwaterEffect( // #endif } - half3 ambientLighting = _Crest_AmbientLighting; -#if CREST_HDRP - ApplyIndirectLightingMultiplier(ambientLighting); -#endif + half3 ambientLighting = AmbientLight(_Crest_AmbientLighting); + + const half3 extinction = VolumeExtinction(absorption, scattering); // Out-Scattering Term. { - float3 positionWS = i_positionWS; - -#if !CREST_REFLECTION - // Project point onto sphere at the extinction length. - float3 toSphere = -view * _Crest_VolumeExtinctionLength * _Crest_OutScatteringExtinctionFactor; - float3 toScene = i_positionWS - _WorldSpaceCameraPos.xyz; - positionWS = _WorldSpaceCameraPos.xyz + toSphere; - - // Get closest position. - positionWS = dot(toScene, toScene) < dot(toSphere, toSphere) ? i_positionWS : positionWS; -#endif - - // Account for average extinction of light as it travels down through volume. Assume flat water as anything - // else would be expensive. - half3 extinction = (absorption + scattering) * _Crest_ExtinctionMultiplier; - float waterDepth = max(0.0, (waterLevel - positionWS.y)); -#if CREST_REFLECTION - waterDepth *= 2.0; - if (rawDepth == 0.0) waterDepth = _Crest_VolumeExtinctionLength; -#else - // Full strength seems too extreme. Third strength seems reasonable. - waterDepth *= _Crest_OutScatteringFactor; -#endif - - float3 outScatteringTerm = exp(-extinction * waterDepth); - - // Transition between the Underwater Environmental Lighting (if present) and this. This will give us the - // benefit of both approaches. - outScatteringTerm = lerp(outScatteringTerm, 1.0, _Crest_UnderwaterEnvironmentalLightingWeight); + const half3 outScatteringTerm = EvaluateOutScattering + ( + extinction, + i_positionWS, + view, + i_multiplier, + rawDepth, + waterLevel + ); // Darken scene and light. - sceneColour *= outScatteringTerm; + sceneColour *= i_OutScatterScene ? outScatteringTerm : 1.0; #if !CREST_REFLECTION lightColor *= outScatteringTerm; ambientLighting *= outScatteringTerm; #endif } - VolumeLighting + volumeOpacity = VolumeOpacity(extinction, fogDistance); + volumeLight = VolumeLighting ( - absorption * _Crest_ExtinctionMultiplier, - scattering * _Crest_ExtinctionMultiplier, + extinction, + scattering, _Crest_Anisotropy, shadow, view, @@ -412,23 +276,15 @@ half3 ApplyUnderwaterEffect( half3(0.0, 0.0, 0.0), _Crest_AmbientTerm, _Crest_DirectTerm, - fogDistance, _Crest_SunBoost, - _Crest_ShadowsAffectsAmbientFactor, - volumeLight, - volumeOpacity + _Crest_ShadowsAffectsAmbientFactor ); } #ifndef k_DisableCaustics if (_Crest_CausticsEnabled && hasCaustics) { - float3 position = i_positionWS; -#if CREST_BIRP - position = float3(i_positionSS, 0); -#endif - - half lightOcclusion = PrimaryLightShadows(position); + half lightOcclusion = PrimaryLightShadows(i_positionWS, i_positionSS); half blur = 0.0; const uint slice0 = PositionToSliceIndex(i_positionWS.xz, 0, g_Crest_WaterScale); @@ -473,11 +329,16 @@ half3 ApplyUnderwaterEffect( #ifndef k_DisableDithering #if d_Dithering // Increasing intensity can be required for HDRP. - volumeLight += ScreenSpaceDither(i_positionSS) * _Crest_DitheringIntensity; + volumeLight += Utility::ScreenSpaceDither(i_positionSS) * _Crest_DitheringIntensity; #endif #endif - return lerp(sceneColour, volumeLight, volumeOpacity); + if (i_ApplyLighting) + { + sceneColour = lerp(sceneColour, volumeLight, volumeOpacity); + } + + return sceneColour; } m_CrestNameSpaceEnd diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterURP.hlsl b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterURP.hlsl index bd4794032..676f561f9 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterURP.hlsl +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Volume/UnderwaterURP.hlsl @@ -10,17 +10,7 @@ #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" - -TEXTURE2D_X(_CameraDepthTexture); SAMPLER(sampler_CameraDepthTexture); +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTexture.hlsl" +#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl" #include "Packages/com.waveharmonic.crest/Runtime/Shaders/Library/Macros.hlsl" - -m_CrestNameSpace - -// Shim as HDRP uses this. -float LoadCameraDepth(uint2 pixelCoords) -{ - return LOAD_TEXTURE2D_X(_CameraDepthTexture, pixelCoords).r; -} - -m_CrestNameSpaceEnd diff --git a/Packages/com.waveharmonic.crest/Runtime/Shaders/Waves/Gerstner/Gerstner.compute b/Packages/com.waveharmonic.crest/Runtime/Shaders/Waves/Gerstner/Gerstner.compute index a04d62570..7c2f80f49 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Shaders/Waves/Gerstner/Gerstner.compute +++ b/Packages/com.waveharmonic.crest/Runtime/Shaders/Waves/Gerstner/Gerstner.compute @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. // Computes a set of patches of waves, one for each scale. diff --git a/Packages/com.waveharmonic.crest/Runtime/Textures/Caustics/Caustics.png.meta b/Packages/com.waveharmonic.crest/Runtime/Textures/Caustics/Caustics.png.meta index d7a380aad..bf84057ca 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Textures/Caustics/Caustics.png.meta +++ b/Packages/com.waveharmonic.crest/Runtime/Textures/Caustics/Caustics.png.meta @@ -93,6 +93,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Runtime/Textures/WaveNormals/WaveNormals.png.meta b/Packages/com.waveharmonic.crest/Runtime/Textures/WaveNormals/WaveNormals.png.meta index 765a2a9c8..e98679f0d 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Textures/WaveNormals/WaveNormals.png.meta +++ b/Packages/com.waveharmonic.crest/Runtime/Textures/WaveNormals/WaveNormals.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 1 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Runtime/Textures/foam.png.meta b/Packages/com.waveharmonic.crest/Runtime/Textures/foam.png.meta index 4c572f475..75ef155a3 100644 --- a/Packages/com.waveharmonic.crest/Runtime/Textures/foam.png.meta +++ b/Packages/com.waveharmonic.crest/Runtime/Textures/foam.png.meta @@ -93,6 +93,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Flare50mm.psd.meta b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Flare50mm.psd.meta index e130c3cc5..5734ec99c 100644 --- a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Flare50mm.psd.meta +++ b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Flare50mm.psd.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/PartialRing.png.meta b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/PartialRing.png.meta index 05c0dd160..e2ea276f2 100644 --- a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/PartialRing.png.meta +++ b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/PartialRing.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Ring.png.meta b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Ring.png.meta index 2491f05d2..16c464994 100644 --- a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Ring.png.meta +++ b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Ring.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Shimmer.png.meta b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Shimmer.png.meta index b58d52a77..ecd196aa3 100644 --- a/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Shimmer.png.meta +++ b/Packages/com.waveharmonic.crest/Shared/Effects/LensFlares/Textures/Shimmer.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Shared/Prefabs/Camera.prefab b/Packages/com.waveharmonic.crest/Shared/Prefabs/Camera.prefab index e4c844be0..bf46945a1 100644 --- a/Packages/com.waveharmonic.crest/Shared/Prefabs/Camera.prefab +++ b/Packages/com.waveharmonic.crest/Shared/Prefabs/Camera.prefab @@ -73,7 +73,7 @@ Camera: y: 0 width: 1 height: 1 - near clip plane: 1 + near clip plane: 0.3 far clip plane: 10000 field of view: 60 orthographic: 0 diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/AlignSceneViewToCamera.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/AlignSceneViewToCamera.cs index 0be8999af..b24fa032d 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/AlignSceneViewToCamera.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/AlignSceneViewToCamera.cs @@ -54,7 +54,8 @@ namespace WaveHarmonic.Crest.Examples void EditorUpdate() { - if (s_SceneChanged && SceneView.lastActiveSceneView != null && WaterRenderer.Instance != null && WaterRenderer.Instance.IsSceneViewActive) + var water = WaterRenderer.Instance; + if (s_SceneChanged && SceneView.lastActiveSceneView != null && water != null && water.IsSceneViewActive) { TeleportSceneCamera(transform); s_SceneChanged = false; diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/CameraController.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/CameraController.cs index 248043346..3e8cbbe95 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/CameraController.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/CameraController.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. #if d_UnityInputSystem && ENABLE_INPUT_SYSTEM @@ -137,7 +137,6 @@ namespace WaveHarmonic.Crest.Examples forward = 1f; } - _TargetTransform.position += dt * forward * _LinearSpeed * _TargetTransform.forward; var speed = _LinearSpeed; #if INPUT_SYSTEM_ENABLED diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/LerpCamera.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/LerpCamera.cs index 53b78d611..e88ca29e5 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/LerpCamera.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/LerpCamera.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleDisplacementDemo.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleDisplacementDemo.cs index 9a2bb7656..94ebaf6db 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleDisplacementDemo.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleDisplacementDemo.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using System; diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleHeightDemo.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleHeightDemo.cs index b432adb1c..051fac8f3 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleHeightDemo.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/Queries/SampleHeightDemo.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/RandomMotion.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/RandomMotion.cs index 6f10041b4..5a865d3af 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/RandomMotion.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/RandomMotion.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/AmbientLightPatcher.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/AmbientLightPatcher.cs index 822f5ca8c..a08db24bd 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/AmbientLightPatcher.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/AmbientLightPatcher.cs @@ -83,6 +83,10 @@ namespace WaveHarmonic.Crest.Editor UnityEditor.Lightmapping.giWorkflowMode = oldWorkflow; #endif +#if CREST_DEBUG + Debug.Log($"Crest: Baked scene lighting!"); +#endif + if (!_Baked) { Debug.LogWarning($"Crest: Could not generate scene lighting. Lighting will look incorrect."); diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/RenderPipelineTerrainPatcher.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/RenderPipelineTerrainPatcher.cs index c31298888..c70e54690 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/RenderPipelineTerrainPatcher.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/Rendering/RenderPipelineTerrainPatcher.cs @@ -44,6 +44,7 @@ namespace WaveHarmonic.Crest.Editor return; } +#if d_Unity_Terrain foreach (var terrain in GetComponentsInChildren()) { terrain.materialTemplate = RenderPipelineHelper.RenderPipeline switch @@ -54,6 +55,7 @@ namespace WaveHarmonic.Crest.Editor _ => throw new System.NotImplementedException(), }; } +#endif // d_Unity_Terrain } #endif } diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/SimpleMotion.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/SimpleMotion.cs index a7a1d6183..ec8a19bb8 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/SimpleMotion.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/SimpleMotion.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/TimedDestroy.cs b/Packages/com.waveharmonic.crest/Shared/Scripts/TimedDestroy.cs index 5f96218dc..7b064ac06 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/TimedDestroy.cs +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/TimedDestroy.cs @@ -1,4 +1,4 @@ -// Crest Water System +// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; diff --git a/Packages/com.waveharmonic.crest/Shared/Scripts/WaveHarmonic.Crest.Samples.asmdef b/Packages/com.waveharmonic.crest/Shared/Scripts/WaveHarmonic.Crest.Samples.asmdef index eeced06e4..73dc4c27e 100644 --- a/Packages/com.waveharmonic.crest/Shared/Scripts/WaveHarmonic.Crest.Samples.asmdef +++ b/Packages/com.waveharmonic.crest/Shared/Scripts/WaveHarmonic.Crest.Samples.asmdef @@ -20,6 +20,11 @@ "UNITY_2022_3_OR_NEWER" ], "versionDefines": [ + { + "name": "com.unity.modules.terrain", + "expression": "", + "define": "d_Unity_Terrain" + }, { "name": "com.unity.modules.vr", "expression": "", diff --git a/Packages/com.waveharmonic.crest/Shared/Shaders/Lit.shadergraph b/Packages/com.waveharmonic.crest/Shared/Shaders/Lit.shadergraph index 36400493f..4cf3119ae 100644 --- a/Packages/com.waveharmonic.crest/Shared/Shaders/Lit.shadergraph +++ b/Packages/com.waveharmonic.crest/Shared/Shaders/Lit.shadergraph @@ -315,6 +315,9 @@ }, { "m_Id": "3dc06e3c9ccb4bc8b1479d4d78855705" + }, + { + "m_Id": "3d920b053a2f4bbfaaf6ba4f8c9f137e" } ], "m_GroupDatas": [ @@ -599,6 +602,34 @@ "m_SlotId": 0 } }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3d920b053a2f4bbfaaf6ba4f8c9f137e" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "bc13f29ae89348fd880b7361cff27f24" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3d920b053a2f4bbfaaf6ba4f8c9f137e" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fca2a686d3fd4b588cde3b54823bb062" + }, + "m_SlotId": 0 + } + }, { "m_OutputSlot": { "m_Node": { @@ -650,9 +681,9 @@ }, "m_InputSlot": { "m_Node": { - "m_Id": "bc13f29ae89348fd880b7361cff27f24" + "m_Id": "3d920b053a2f4bbfaaf6ba4f8c9f137e" }, - "m_SlotId": 0 + "m_SlotId": 18569658 } }, { @@ -1000,9 +1031,9 @@ }, "m_InputSlot": { "m_Node": { - "m_Id": "fca2a686d3fd4b588cde3b54823bb062" + "m_Id": "3d920b053a2f4bbfaaf6ba4f8c9f137e" }, - "m_SlotId": 0 + "m_SlotId": -457410494 } }, { @@ -2799,6 +2830,21 @@ } } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "2f7034eaf21b4eedaf6c9dbfbc101d80", + "m_Id": -1490972, + "m_DisplayName": "Multiplier", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Vector1_0640f7e405ca4ded9cced0944e419139", + "m_StageCapability": 3, + "m_Value": 1.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.Rendering.BuiltIn.ShaderGraph.BuiltInLitSubTarget", @@ -3144,6 +3190,64 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubGraphNode", + "m_ObjectId": "3d920b053a2f4bbfaaf6ba4f8c9f137e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Integrate Water Volume", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -494.00006103515627, + "y": 249.5000457763672, + "width": 195.00006103515626, + "height": 142.9999542236328 + } + }, + "m_Slots": [ + { + "m_Id": "620ebe491daf41b7a2a79b30e2820846" + }, + { + "m_Id": "9f92af83b5ad4eb6840f7858e51e9736" + }, + { + "m_Id": "2f7034eaf21b4eedaf6c9dbfbc101d80" + }, + { + "m_Id": "5bff6fd9b79f4cef83b76fa7991d407b" + }, + { + "m_Id": "7a6d09da26b84c7abd84a17926d857cf" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": false, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedSubGraph": "{\n \"subGraph\": {\n \"fileID\": -5475051401550479605,\n \"guid\": \"df63a8d198812478985b6d0a5d68a59a\",\n \"type\": 3\n }\n}", + "m_PropertyGuids": [ + "4e700f9f-71e1-44ca-82f1-a15c46d60057", + "bebcb4b2-70d3-4426-b192-1c54922e3a4a", + "33f7abbf-d481-4327-84fd-12645ebd2beb" + ], + "m_PropertyIds": [ + 18569658, + -457410494, + -1490972 + ], + "m_Dropdowns": [], + "m_DropdownSelectedEntries": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", @@ -3287,8 +3391,8 @@ "m_ObjectId": "40a7b9274eb447a48d0f1e31def6ba52", "m_Title": "Normal", "m_Position": { - "x": -2894.000244140625, - "y": 348.1286315917969 + "x": -2894.0, + "y": 348.5 } } @@ -3462,7 +3566,7 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 0 @@ -3818,7 +3922,7 @@ "hlslDeclarationOverride": 0, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, @@ -4131,8 +4235,8 @@ "m_ObjectId": "5a905965f0d64818bbfb2d4f869e738b", "m_Title": "Emission", "m_Position": { - "x": -1076.6800537109375, - "y": 971.6621704101563 + "x": -1077.0, + "y": 972.5 } } @@ -4208,6 +4312,31 @@ } } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "5bff6fd9b79f4cef83b76fa7991d407b", + "m_Id": 1, + "m_DisplayName": "Color", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", @@ -4473,6 +4602,31 @@ } } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "620ebe491daf41b7a2a79b30e2820846", + "m_Id": 18569658, + "m_DisplayName": "Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color_5d923c2657794970996af7cb7159276f", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector1Node", @@ -4674,7 +4828,7 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 0 @@ -4732,7 +4886,7 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 0 @@ -5150,8 +5304,8 @@ "m_ObjectId": "75ae407f7549455383d1c32d8989f303", "m_Title": "Albedo", "m_Position": { - "x": -2232.414306640625, - "y": -327.3903503417969 + "x": -2232.0, + "y": -326.5 } } @@ -5161,8 +5315,8 @@ "m_ObjectId": "7844c309071b4f42b7329805070ce54e", "m_Title": "Apply Albedo Detail", "m_Position": { - "x": -2462.000244140625, - "y": -812.8714599609375 + "x": -2462.0, + "y": -812.5 } } @@ -5272,6 +5426,29 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "7a6d09da26b84c7abd84a17926d857cf", + "m_Id": 2, + "m_DisplayName": "Emission", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.BooleanMaterialSlot", @@ -5298,7 +5475,7 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 3 @@ -5619,7 +5796,7 @@ "hlslDeclarationOverride": 0, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, @@ -5634,8 +5811,8 @@ "m_ObjectId": "8c0e1cebdf4b4a90ae93ed60f9876e72", "m_Title": "Occlusion", "m_Position": { - "x": -876.0001220703125, - "y": 1328.0001220703125 + "x": -876.0, + "y": 1328.5 } } @@ -5679,8 +5856,8 @@ "m_ObjectId": "8dbd81486d314bc690d94dc6281fe289", "m_Title": "Smoothness", "m_Position": { - "x": -1159.0020751953125, - "y": 590.990234375 + "x": -1159.0, + "y": 591.5 } } @@ -6223,7 +6400,7 @@ "hlslDeclarationOverride": 0, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, @@ -6287,12 +6464,35 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 0 } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "9f92af83b5ad4eb6840f7858e51e9736", + "m_Id": -457410494, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "_Emission", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.SamplerStateMaterialSlot", @@ -6341,7 +6541,7 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 0 @@ -6408,7 +6608,7 @@ "hlslDeclarationOverride": 0, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, @@ -6529,7 +6729,7 @@ "hlslDeclarationOverride": 0, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, @@ -6591,7 +6791,7 @@ "hlslDeclarationOverride": 2, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, @@ -6768,8 +6968,8 @@ "m_ObjectId": "adb53098703d462f9d82c495cfcb09e9", "m_Title": "Apply Normal Detail", "m_Position": { - "x": -2892.000244140625, - "y": 52.12871551513672 + "x": -2892.0, + "y": 52.5 } } @@ -6785,7 +6985,7 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 0 @@ -7155,8 +7355,8 @@ "m_ObjectId": "b8b5e48f3c87435c8fe78bddf85831ee", "m_Title": "Flip Normal", "m_Position": { - "x": -1531.8348388671875, - "y": -112.36843872070313 + "x": -1532.0, + "y": -111.5 } } @@ -8092,8 +8292,8 @@ "m_ObjectId": "cd446e3cb81b417a8bd2dc2ccafcd42e", "m_Title": "Detail Mask", "m_Position": { - "x": -2890.3525390625, - "y": -351.2122802734375 + "x": -2890.0, + "y": -350.5 } } @@ -8151,8 +8351,8 @@ "m_ObjectId": "cebae50b11e94e838b6e7a5a61d4f2e8", "m_Title": "Metallic", "m_Position": { - "x": -2030.0767822265625, - "y": 432.3829345703125 + "x": -2030.0, + "y": 432.5 } } @@ -8311,7 +8511,7 @@ "hlslDeclarationOverride": 0, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, @@ -9185,8 +9385,8 @@ "m_ObjectId": "f0446934f1f84b8480c20f72122e30f3", "m_Title": "Alpha", "m_Position": { - "x": -1165.30859375, - "y": -460.5617370605469 + "x": -1165.0, + "y": -460.5 } } @@ -9374,7 +9574,7 @@ "m_StageCapability": 3, "m_BareResource": false, "m_Texture": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "m_DefaultType": 3 @@ -9401,7 +9601,7 @@ "hlslDeclarationOverride": 0, "m_Hidden": false, "m_Value": { - "m_SerializedTexture": "{\"texture\":{\"instanceID\":0}}", + "m_SerializedTexture": "", "m_Guid": "" }, "isMainTexture": false, diff --git a/Packages/com.waveharmonic.crest/Shared/Textures/Red.png.meta b/Packages/com.waveharmonic.crest/Shared/Textures/Red.png.meta index a367c1a52..0ac24b73e 100644 --- a/Packages/com.waveharmonic.crest/Shared/Textures/Red.png.meta +++ b/Packages/com.waveharmonic.crest/Shared/Textures/Red.png.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/Shared/Textures/Skybox.hdr.meta b/Packages/com.waveharmonic.crest/Shared/Textures/Skybox.hdr.meta index 45a821ff4..2580a22b7 100644 --- a/Packages/com.waveharmonic.crest/Shared/Textures/Skybox.hdr.meta +++ b/Packages/com.waveharmonic.crest/Shared/Textures/Skybox.hdr.meta @@ -106,6 +106,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Packages/com.waveharmonic.crest/package.json b/Packages/com.waveharmonic.crest/package.json index 5a809aa60..27b5a4f20 100644 --- a/Packages/com.waveharmonic.crest/package.json +++ b/Packages/com.waveharmonic.crest/package.json @@ -1,6 +1,6 @@ { "name": "com.waveharmonic.crest", - "version": "5.4.2", + "version": "5.6.6", "displayName": "Crest", "description": "An advanced water system for Unity.", "unity": "2022.3", diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index d57187619..de5671957 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -841,7 +841,7 @@ PlayerSettings: QNX: TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial ReservedCFE: TextMeshPro;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial Server: UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI - Standalone: CINEMACHINE_URP;FAIRYGUI_TMPRO;OBI_ONI_SUPPORTED;TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;STEAMWORKS_NET;ENVIRO_3;ENVIRO_URP;VLB_URP;UPPipeline;__MICROSPLAT__;__MICROSPLAT_SNOW__;__MICROSPLAT_ALPHAHOLE__;__MICROSPLAT_MESH__;__MICROSPLAT_STREAMS__;__MICROSPLAT_GLOBALTEXTURE__;__MICROSPLAT_TRAX__;__MICROSPLAT_DECAL__;__MICROSPLAT_SCATTER__;__MICROSPLAT_TEXTURECLUSTERS__;__MICROSPLAT_MESHTERRAIN__;__MICROSPLAT_DETAILRESAMPLE__;__MICROSPLAT_TERRAINBLEND__;__MICROSPLAT_TESSELLATION__;__MICROSPLAT_WINDGLITTER__;__MICROSPLAT_LOWPOLY__;__MICROSPLAT_OBJECTSHADER__;__MICROSPLAT_PROCTEX__;__MICROSPLAT_TRIPLANAR__;__MICROSPLAT_MICROVERSEPREVIEW__;UNITY_POST_PROCESSING_STACK_V2;DotSpatial;FANTASY_UNITY;KWS_HD_MODULE_INSTALLED;KWS_URP;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3 + Standalone: CINEMACHINE_URP;FAIRYGUI_TMPRO;OBI_ONI_SUPPORTED;TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;STEAMWORKS_NET;ENVIRO_3;ENVIRO_URP;VLB_URP;UPPipeline;__MICROSPLAT__;__MICROSPLAT_SNOW__;__MICROSPLAT_ALPHAHOLE__;__MICROSPLAT_MESH__;__MICROSPLAT_STREAMS__;__MICROSPLAT_GLOBALTEXTURE__;__MICROSPLAT_TRAX__;__MICROSPLAT_DECAL__;__MICROSPLAT_SCATTER__;__MICROSPLAT_TEXTURECLUSTERS__;__MICROSPLAT_MESHTERRAIN__;__MICROSPLAT_DETAILRESAMPLE__;__MICROSPLAT_TERRAINBLEND__;__MICROSPLAT_TESSELLATION__;__MICROSPLAT_WINDGLITTER__;__MICROSPLAT_LOWPOLY__;__MICROSPLAT_OBJECTSHADER__;__MICROSPLAT_PROCTEX__;__MICROSPLAT_TRIPLANAR__;__MICROSPLAT_MICROVERSEPREVIEW__;UNITY_POST_PROCESSING_STACK_V2;DotSpatial;FANTASY_UNITY;KWS_HD_MODULE_INSTALLED;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3;KWS_URP VisionOS: TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial WebGL: TextMeshPro;UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;ENVIRO_3;ENVIRO_URP;UNITY_POST_PROCESSING_STACK_V2;DotSpatial Windows Store Apps: UNITY_VISUAL_SCRIPTING;ES3_TMPRO;ES3_UGUI;DotSpatial diff --git a/UMotionData/AutoBackups/20260108_205507_player_umotion_project.bak b/UMotionData/AutoBackups/20260108_205507_player_umotion_project.bak new file mode 100644 index 0000000000000000000000000000000000000000..96fb31c25fcd95621b8ae4297e8e159b6f0b9b68 GIT binary patch literal 306914 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 Ou~%{MdVw+6!T%p=a|~es literal 0 HcmV?d00001 diff --git a/UMotionData/AutoBackups/20260108_214600_player_umotion_project.bak b/UMotionData/AutoBackups/20260108_214600_player_umotion_project.bak new file mode 100644 index 0000000000000000000000000000000000000000..5c48be52c2be353eab8e0cfde1239eb12598e3fa GIT binary patch literal 306914 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

    RN`hxM`CgfPGy}OI^$G=jI+Mm08&(McBx1A)xRJ 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

    RN`hxM`CgfPGy}OI^$G=jI+Mm08&(McBx1A)xRJ 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

    UXY<$uIs1}r&MGUv0-T6ALf zqb-(tc;d6eX#YFPFVgaPSM=_Y!6zMT69`2NP!UiVI|C>T*F=3J1%fNj;G|0mMZuFi zs`hx>1VT|hL=}Q6&&L!Md*_Ik`I!0^SEZoG+a?f-@*zRF=VOX0&PU2q=40wxW%<}9 z5Q_3)*|#QC&W|aoIGA`Lyv)bcx61OdolX?xLxOV8#}rkZkCdm( z$JDpV^0A#x6y?LRZ%wFNZ>Ff?d>A|KL=Amt4Z&)_ylOH*ILgH7SI{PiN+o??)?to;&(9 zEOuqMAwYBkiviUj_Zn!!h+F?L0UwWRM88=*=&$zZ%j$b>jsmJ*7`^kHIRLGZh zyJ7ex4PnCwLC-19)_FT+5>{6;p6c#UXW)j@)kA%{<;IOXzrYQrtEu0t8!YQ=#|@{e z{*%o2A)EPaw5~b?*VTZgsSe{6aKq{9gURh2bOqdSx*GS^mkvi@zzwIX$y>VU3b>8d zRmb4EnzhNrkCgXc;D*!HxVF>!x#Nb@)!aWl?a+^qZ#Z53=^OL??b-1PxQ*6Tr{KDp z{Mbhh`vu^J)756T?zN&^SHKOYtCn?N7@tR(eH=M3o#_r{yE7ZBsy6U1z685-#%++e4a_ffkh5T_W zaKq_p^_r0m$5+4&r>h5!U+bVN;D*yxuL~zR=nA-v)>YTwy81)=t}DuQ1>A7Dy5!^m z4*UW)oUWexaT|wm61d@X^}#+v9CQWTM(b+l;JTW3*m{TY3b^5P^}U-OuYem)SL-f$ z-$7T%H=M3IOh48^SHRs^@l4oMZ*2T?<#|zf(|7ET^7B`_sQ-rD55BzB#}4yXzzwIX zw=VDDpex{p)74H7-{PPv;D*!H-V4uk&=qhSt*c#w>uS#WwGO%hZa7_izIPu7T>&?o zuAX}SRtH@HH=M5CS#ySiu7KNUU3Ckts|B019jqGV4dZ0~xE;9RbhYCZ9V_65)77gJ zcU$3}Z#Z4OHpk`o3UzL@uDYv|gxwF0+p)95cm>>Wy4w5B-W71e>FVYAyF2I#`G(Wg zl+6Y?j90*Iw61mwuB(R*_`Uk=g9aI4~oUTq;)zd*&$Tys>?wqragRX$vXkG0dTvr!g^T8n1 zC~x-TE8vFH)!bLj&o`gIk!-3yNlU;Dr>h%VdN}9`xZ!kl*HD-JAaEP4t6r+sVUMr= zI_w<>T>&?ou5Rz%;xJwTH=M36zp0ahu7Dd(S6%NJ;V@nSx6!)l6I@rXZZ_P3U*Lw* zRog+gRKN|VtDU+GaL^U<4X3NE&T?7D2;4^Ns&8;zZFJDd4&xPY!|Ce7fp1j64X3N4 z{@Tq!SI9S@Z#dx6!(yB}+}}i#E!cc*e#*SDxqZ-|jdEet{cKSNos#mkPMy zboJ&~m-#E?8%|g4H@M7S0k_e*>aRo;R#z|g{cs4BX+LfUZa7_i-eaA^yf<*e>8i(` zhc9!_H=M2(T{PTbyh6T>*42REx?0_Gy2H2u+;F<;eB*3~<165X(^b<&Lml)C+;F<; z^q~2D-r4hC;5J%Udj!|j)%(8CQr>@o8%|fNw%yY~SHKOYt2eeD=AbL!hSSxP?ap-= zuYlWVUC|QSu=~L?C%CL*1a3H89sTqY2VDU-oUR6a-N%7n;D*!H`3tsk*#82z(Ym5t zR#;t4Teq`A{{?P1U5#4#W(C}Ex;kY3W)8YSzTtG$?#ccYa2u^F>f&K__3r!44*UW) zoUYc~HqfE}0ymtlI^H^ONcnyrxZ!j)ZsJr2T>-bzx}uVV)m8iFnpc$98MxteHQ|j_ zR7BqF=b^w2r>jfveCY{y+;F;j;hJ3?bcK8yt*d5LlCZkksio(#@;U=IoUWQrd(q*1 z0l49G^;&FR_r zF30V_4X3M{UvYUk9&p3y>e)3T9drfUu)6x<+)Yb#^`qdry5Qbp9drfUaJriP$gLG{ z!|AHS=+(5d;SK#azdjcEhSOEw8R}gk&bVQ9HQGCs&{Sk1( z>1y2bD=XlJ)78H|?8<#NUFW>6kZ(9$9Y20Q2VDVoV-+4@Q@yeA&y}y!k@uC?|Dc(^ zqaWq>gZrufhSk*<=RZLw)w}^WUuWQk)79IXkD$pKN8E6_+J0LXT_N9ax@u}S!a-NS z4XZ0z=e({)D3h?dy5_4E2VDU-oUT5b*E~?>o7XdN!|7^$)7K9BLEwhd)wyR)aL^TS z!|Lj!-)=XIYK?Itud9*4bye-zuii>+0Rt&UKha0&X~6{eGs)I0@Wvy83MTrw-?XzzwIX+gGUv z_P1_0e$Jo&0ynI#mMmyfqN}mNb=Cg!?Hu|qaKq_p%FMTxm)9A%;dIqJ;$a6}0XLkk zu5H?;LY>3vs*~$kS2~PWzzwIXk@H>FsRB2guFiV&QitnDzzwIX$HrdZ zFkS(-(YiV)xUM?(JkUW`zzwIXXXefyR6bq-H=M5eEp%D;1>A7D+V@_U=OF{P(YpFc za9#EK`~4350ymtlR^PYq@p4@OH=M3c9ek+6eh|3fbalyim-{Aw`@f>Ag7d*6g6rz& zJLWiCrvq*{U9~%W_0n=(0XLkkhQBh+;XD+$;dFKE`7YxXa2u_w>A`iia`t-;#~Z*6 zr>kcdpH~4loUX>)v898qkZ(9$&3f>BhvRnOHdk1+r3$#=boI}TUEbG*e8cJL^Gdjl z*40&t|E5+IP|n0NHvYNtdcvhsUEV1S+;F-&`}K|v=VibRr>m(ap676!1Ke=BI{4o{ zaX9Y=ZliT|wGvTSUA=wV5QpOp;D*!H=8vD_us;HBI9<&=#pOAHzzwIXf6Q??z5;He zb#+~EU41j>>46yW?E69BhSSyL$!9wpUja9quAaQ1lY^dt8%|eyUF>pv1>8pK>bJpl z)uy&+Nx80o8%|ekYMm?KhSSx@PRBXOH=M4%tc2TWT{XAr$_baqh>yTX4!oJ}P|Un# z+u#FVjAr@O(ZiHUllt&ZtaxN7WzI@H(S1-CI+CR3qw)%Cv&M{;06( z-d9(q_1BJ36<3M+nnYh_ydS$|ZO))N}W9@EM}$EXUfE{(2}LDRak z`lA|CXH=$DOFmKYE~8)Tsr#-cY##4J`qgUxIcf9Ozta8$7WCKJ-RdtB)F0!gjq?xm z@tp(WAJunqi7ncypNQ)A>g#*zE7_u@^Y$O4ZbQ8Ay18acYJ<0^_PenywP>IJUfN=| zWGRtp^wG+n53NNX{OT7&^Om&FO19{ptG0fk7TtX7qlPxgQllT*K|Rwqn)lHFOPd<~ zjB9(TIPGoHaSLzJC-15GBtx5c6Fm%T(Tu0Mt2P(xa>&)$j9{tbIOI`hA4L(G;sPJW+!wA1?YMeZF`fZ2NTo7kiGzW$+z6P7woes_BG`!*+Cl|_f8 zj+5VZ9_?}HGt11DI!=B+c{J#?Ux_$7=Hlcxdq>M}yZDi8o3PYz^1HaB$0n>=Y_`;K z^4qhclhix3vzDE5==}cY=nq%jH`r{c(fN(d(c0aHtuR|^bbiNjbVsM|mNs>j_^rs% zj-z)KRqC9Jliw#C%|G!@(K}$NJVeWG`uO&uq{wKe*7 z{OKajuDLk*eWy{hyh*SLOC2Y_p)_jwe{U?!#tBOuC%;oPnsVyBf+JY!IQcE0(VtHr zFXG%e7bm|zGuo%=?K`vRu+(w#8!w~hm!5o=*;2>J@2HHv{@GZe5VWb|NxogiqW+f+-G4qpu#?Si}i*9Vfq~FgoOQIV$d& zi<95)7p=Q{n|rcx!cxb{Z{&;i-Q*v4n=N&m{0_aSZ}VC)DxystC%^SB`uW*%RK)wp zRJidL@%!SU(|>%t=pC@saq=79q8`7#Ow<#WI!=BkThzS&6{4Q7)N%4#)S{k0{iWc& zyNWKmm*Mx1MZdf8yF#C^)N%3~!=jr9?kqBbrH+%|@fEeq*jvO2OC2Y_l`ES5;<+Nu z-EwjA`>dibmh2&V2P}1*{06G%(QQt*Sn4?Wol(&vzgjGKN1HlMe#=ud_d6GeID6*e z*SB!d0>^oqoNxowMA5@Pj6^+QspI6g21WP1c%F!J_gtL( zzMbel+nguZgr$y?-;fhs{MZ?yAHh<`$?vp@j_fj6#0g6sC%=UzI(Mezy;m+yet%2! zzytqRpuGiqV+FbDC!AI9VfpfBWm~WX9?c>=Hle{OGKM}xsRw4 zEOngxMu=$5MQy}L3rig*zr!Kg=)rCxPFU(V`K=4l>}gV;>g-62OZ>iqX!74*6THJx z$H{LPh%R{cWswmqb)5W8fN0W!I|c8s)N%4t{G$oIB=2~>x(YYmB7XjTboBT(qVllR zaq<)EqwBtD5mkbvj+37;AH8s9kA4K@>2;7=N&)F#mUd}i{^g)qCkhGj+39j7fso%m&gc~ zI!=COp5eR$mO4&;%AMi7V|Xr3em-2Z$@I43{2i7$PJW_WbmI?C5*fi#$H~uNGn{w8 zQpd?pO*5Q#?3as^pEnkL^Gat?C0Ob>`3YgsANt;9vD9($GrbJw9cWX>$xq=joOj?l zjtV#4B7S~Vv~1qy0v(n*PJZH4^v_57iV+N!I!=B@lwp4aOC2Xa)yc3w8mXeoj-UKI zB*S?JEOngx1S7+F2P}1*{LCT4c?T?Yocxp^!+FQ3T%7!TooM6NuMnz(rH+%Ih!aiU z>}yd^Sn4?W88(LV4p{0q`KdF8^A247X=R<}z1wfOycR8b=7N3`_>XPXCn3U8$H`Av ziOyWody&~v$H~t`F`RdxO&upc#l&#laiEGI%R4{+!*JdKOC2XavBPlQ0ZSbxKV!pi z-T_M;CqEU#aNaRG7bibYBAPnAuizb)I!=B9M07^evldGoCqJ{naNdD7b)5W^1;csA zm|UFve1hozwE2lZhoz2_pC}Mr{lmFJpRm+%@-qMo=N+)raq?aJhVu^G$F0JRw}|g| zkB-cpcfeA|$#Nxo>@MwqJdB->vT@zxY?-AcWZ8-0M zrH+&Dcs87Oz*5J__b40AJ7B5fMkrIQbsR z=*AJ_hnOvOoP5_~^dG0m^SC2&_2l~nqgj1^yl1veSn4?W4!@|!-|iYfe`p3n$nk{vle9w@w>?d+Z zn>tRu%SWNhI4{e^$@j-ZlP>5buC~BZ$H{lJME|k-8Zi$BOC2ZQgAyHf>~f2xj+5^i ziDvy##(8-zPQKqF>ipFlahwcG9Vg!*5se>tmzW`krH+&DX^1{kE8wz~hoz2_??NzG zUX_cJ*YA_+MDDQEaq^0LgOXvXRg<>9y}U9<84-b3!j%+<)spI4orqQ=s-Yx10OC2Y#2{ot=mO4&e#hJ3)RK-W_ zv{zqPb3)ch6zXT*a%)heCwZ7X<(d@fN%&?@xke@JiK7v-r(CllJ?+uTH7wH89<5x{ zB0VWmbF^}e3p}xMg%~h<$~7<2)1IeX10y}{dCE00($k)&Tq6TdtY@+3Dc8(MPkWwn z4UP1)=PB3JNKbp7a*Yixs(;T#z%VE^OS3Tq^CVkxdupj+Vhlag5cSuG*7ukNP61y zlxv2hr#(-(hDdta^OS3f;Muh_Pr1fOdfM}pYmTI+Jx{p?NqXAzlxvdUxpQfra*dMo zwC5?;EJ;s$o^lP7^t9(G*EGR%m(o1t8Yk&#&r_~>lAiWF15-AeP6YrLeVJx{sjOM2S#lxx7Gr#(-(CJdfE zOY@X##H6P^Pq}7HdfM}pYsjRhJx{r&44%7}<|)^hNl$y8a?P3awC5?;ph-`Ao^nkZ zJbRVqDc7h;PkWwn&6@PI=PB2)Nl$y8a!ngN`;_J>*SJYfd!BO5oAk8jDc8VBPkWwn zO&mP?mgXtf$VpFoo^s8c^t9(G*U(8%d!BMl9X$J$<|)_MNl$y8a?PFewC5?;;7Lz= zo^nkdJh3WHrE8h}kZbg$r#(-(W>0$B^OS4&q^CVkxuy@ESXF1wQ?Buop7uQDnm_4j z&r_}el%DoH<(fcvVpX0!Pq{`=dfM}pYX+sKJx{rYP1oeX zt~r#R_B`bpMCobIQ?5ybCsqa8^OS28rKdelxn@y%+Vhla7^SB@Pr0TMo>*0A&r_~( zl%DoH<(fz7Y0p!xfs~&1Jms25cn(ns7SB$~HImZPo~K+hDLw6Z$~BbI)1IeXQwh)J z(mdrFOX+FPQ?9v`p7uQD8cgYF&r`0+gy*o*Jmnfq>1oeXuGy5H_B`bpPU&gSQ?BWR z=Z{MBlxsYtr#(-(=2Lpw^OS2qrKdelxh52zSe2>LwHy!0HKNkfo~K+hDn0Fa$~C0Y z)1IeXQwq=hO8Jy)Or@tiPr2q)dfM}pYfz=9Jx{qN6`mtX^OS2;rKdelxn@;*+Vhla zSf!^uPr0TQo>*0C*R5RRDn0Fa$~CXj)1IeX11ml4dCE1h@Eldjr(7c|J?(kQHM7#w zo~K+xD?ROb$~Cp{+`lwWxyDv{+VhlaZl$L^Pq_wHdfM}pYjWXo~K+>3{R};wd+={F_xb8Jms2W>1oeXu0fWb_B`d9WO!m#usu(? zMp=5=^OS3rrKdelxrSMK+Vhlan&Ej+scz*OXX$CrQ?7ZIp7uQD8ffWh&r`06h9_1! z+xe7hq@|}lPq}7VdfM}pYpA8CJx{r&8lG6yY|m4!v6i0pJms2e>1oeXuECa`_B`d9 zY1oeXt~r;U z_B`bpbm?i&Q?5yeCsu{q^OS4UrKdelxn^B@+Vhla*rlgEPr0TYo>!OZR<3cEp7uQD zns@1G&r_~}m!9@K<(hbSVpY1GPq{{3dfM}pYv!e=Jx{rYUV7T|lxynYiB;|PJmngD z>1oeXuDO?<_B`bpeCcV=Q?JRdU8=0&+X5&=0;_%ZPc`-QMfJl1_0=Z+mHz&%+S&&T^@rH!G5RU((^mbO@ln51I|Q&O>$`~loc7&B{c7}OL-nEBSeR{N zA^$5Cb2&a$fb(_6ClB5n@a;8Aa7$}OmcBJhd|N~IsaeuS!dVh~Y0cnE-+8O6W~2t@ zs07hJH;&j#XGt3#HG{8j&9 zc2&oKjISp*nKmkNllJxHhTBMLmejdW&*VdvK6=jh)={%OeiD1(7?8#%58hP%W#e{Q zo7tLC?M!+GvJ4*8CBD*W@PEBv&6TKnk8*`^iBANsoBQP zH6u&knkBw<)GTSkqh|2+t=U!-cQT&QFXcL8A7$xNvy3mn(dICoq>lqLZB(pT+BZzi zs1>)Gk)?0V5?`tpZ5}mC+VH3ueCa!H4)~NSje~T)!F5+Y@v#Q|)vab2N2~4w2ruzf zKlA1gv(#DAhDXidTcu{ypUIDEwuAa|)ysEGe(G<$Ipkf8OBpa3oUAWrRclteV zMP0r29a?Q1f2VF2Tcrm9Jnew3Se>=#=_%0)vt?46R?9(4Mu}&mQpct?35~Z_%g+C` z&|t}j&cd?8v>zDI$x@=P|JfIoHYNHAwQ=GZFcc@X8Hbnr5Z$-Ft9ZIeGQ2Az-dZ!N z)uvf2Wt?_P8K>D29C5p?=*1kREsHryTNZPawk+l-ZCT7w+On9Vv}G|zX-jiGY3E5+ zZkEK6*%EV`&^)Pw=wWO61zV0Y=}8_%o|;4HNzoN~YEILh=yye)nq%o%7Om!7dX`12 zH6T4H(xPa!CeogKSXSbxH6lIB^0a%F<*7X>C$c6DVZ^52F>>d}byipFs86FmS?8^2 z$5#8!p7hDz$t!O~Q`l72Y3kiVwc2gXc?+sZZ6n&#);6M8^A_#Mf;Pi6{Pyub)Mwt0 zp0&fdw4n^>tEu^WuJXxJhG*h=@25meDHw!g%1Uu zpg*S%LCBeG$)f7zgTzPqau5p7_3}Z^SGB>LYNKo#3VZTg8woyDzjtq&5|}eY6f55n(_IA!mY9oNS||5?VA~2&zfc0s93YKZ*5xkasbzT_>1cPUHIKi|KfmF(r+g_{G^) z&NuOQ;Mj!gn{O8tFZ(K7*UJY~=fp3Suj}Q5jDLblQE;EKUOq_sam<9R{L66DV*rP% zI#}C70$n~BcdELOu;0}GIQ1-f5rM+xFbgjtkQH@!OhwUm>U{CkN_r^31T`7QV|XpP zcCWvP$$4szERzE9XkUvyJ$mR6bDM<5TdUzYL2C6S+tsS=~))7)`0Y+NQB}5A;zM;w8%fO)T07hJH;&k=W=R_!HG{8j&9W2ulmyqzI+0I0 z%lZ&+#ds}F~mrOxvBQ~{2C z5jSg?ER*MZf)%@fXn{R#+o`NsWH}NBL+A8Lo_$PIC z%NKsW`F2sEvaiB*o%|<$6F#{hDnshbe@ z4xEwPJ8*Dz0)+zQ01K!6$%?ur7ep& zN?V%iNo>Bhs@hPrGMXp4yWlBWuzSMr`^WBe#9@XO$W6 z9iX=4v_Dzr+saP+%X>MwjKV7+`m7F91FBt8g2;ki!fBe$+eN- zQw7Y2n7Di)eOXr&fCE0%o3x>P;!~gm*LvCrAF`x&2(N0*5?}JC%^_x4v!sm#KZ%_} z%-mlhYX)EX&YJ_iy=J6T=Bl)2Wa(S8#5a!Et7b_X9yNonZ_Too0w@Wtnf3Akk(l*K z_$~C|eWc3Ib?S(4()-n_dd~P#TC_RnDXr&B8x^@p`}%UjZ6q~I>RhO2@*ztfJ!gEW zUbK1CERUbWUN{D%@yUZX2mJIHkgXZ@j`A^pe9(`4be8zW5qs4vX~RQj@C{Qls-|1b z$kJD5iEkY>OWN?L8GOUkj3!LnYDSj6HA{T!s9Dm6N6p~tTeGbwZiQQAAHY7IHOu&V z)-2OT#hRsk!_UAd zj2|1R4~M*qaqT)W;rix_>3A2e)3}MBXTFJlQfIe(;pdxg7Zor2DqPpg2gGmUm&(`m z@3Co5K0;k^T7B`+dSoB6h~7ZK#W z1Jn-Hr1&C2{@wxd%VNF! z^_RR|K3@7u-j2NE_9z}^NgXJ}7bobEhH(Vg=p zf7%p&*$EEzXt_3&uj{=H(w8}O#0URL8%fQmmEsdD_>iS<%@SXVmo|@@C2e@r48HW8 zHwS!s%}A+kH6u&knkBw*#9lQ^+VH3ue0^({z0g2OaLue28c1hZA3`qo;eD^lugVyZ z-d|T812Vpp7HtlCN{<1VHY#$H_Vwk4+em7b)Y*D*g18|cvh>k&##gn$n@7#^_(|-v zi^)uMq{r+ zNRY<$%@>pXE?lQ^6F<*<6MqMeO}M`KcHye34~6S`af0fc_@(kKyGW4cH}Ow!DFf!$ zdT}C+OV+$8|1#Y47{ETNgSFi@{a_>YeuEL}H3{<3L$B26rV40-IS++runv#^EX3);K4%xxkP+57Qz}Jw=#CCreo+yJfCQ zxpyX@o&?VAw#He^QQESYqqJo)M`_Dqj?$LJ9HlLbIZ9g=bCkBUSDvigEQuqtC8nd( z91%Tit-dE)jx*^=9z~v-L+MG;6?tk-)1K&eMV^{t=~))7=3IJ~MXNO+Jt@+nXtgHN zp6Itlo?0W)vn)@$XIY-wlOiK)(hx>$`W+*8c6ywwSY3se7syIpULdc0TiMGC@*V|h zhiYQKyg(N1$bvR;*?|6MyGMckm%m5hGWFMdjOF(zP-{O>Ul_x$n9;-fegoQ*^Df7ur-CWv3F@^W@q{@QHWxA*v0Z_2q~U^(OcV zH$G)faII5-@F7cT$K~)=#+>+)KW!d0OWN?L8GPwGZw~nOno+-Ju1af$@x`ZRiEnGj zJ~d0)@TeJleQTDT(x)W2X4cC9q_eCKA(#8`K2qi9It4^H>HTU|ZZf{AE#4gTlpX^z zZB*nY?d!`8w~^E=sdJ&8$%ia`#(<1(T(QbyK&B0knj!WuHKX29J_bL&Q8W04sToatxYdj-eQTEZ)={&h4Ud|^*SBVT z{-AKH>;uy0998>f#@DlEnKmlcEbSYnX4Fc#&Ip$*eRP)bt)pgn{3P~8+-z!kH+>wM z#wQQnRNc#t-6>ZZ2kE$h+90jOI-|e3)ePgPkIoWb!lun3=Jc@!#hkR^p)>easTuWW z@}rvhTn5PasWy0X$h#QVt`kg)r*VDr%}>Wu^sJMdKGV2~U!1KI&*^*&3e!)S%q0?3N`EoPL=*8<4ObS+@@VgFCu768j6Pad>uQQK8>#SA|z zsmJoxYT5IjUoXqf+mj_7(i6!Z45l<2?z_tyuR+mz_%95=(#W(=xgXhnbg z@?VK-0ff$DH3Dt5)bn|Agp_gGEoGc$OK`;PwxSnvl(sD9C~aBHQQESYqqJo)M`_Dq zj?$LJ9HlMI^&~dQ%FU8EGFxKq7@8-65It;7zhKL8COyfc$WwDDJt?{(Pt9rC6aB8p zQ*$gm%c9ksOV6@swFaaoMOqZC)T=Nk*lEgr}0w$CFDql1=cxyvZy+TpZF+WVxr11b4A6FBihDXid>szzzd^{z=HM7p)Q_ZqIgk0{!`?f^S366C>nsCzl!>W4D_!1m#4th$D z0hu-`a+CJ;<%ZixYL?Wwv}R=Kqi4cPe5qcvdDJXv!=q;KrSH5s;HSrcY|W^5l#c=A zgMQ?rv&1)!*sEqq8y+=-Zjtq z&5|}eY6f55n(=YJ!gZa)r+q;BT%l^;%=miNEYn8Cnx%ci)Qnmw*BRlGrH{@szID_r zkDtW8h?_Oc;e&7Z(s$le-OG;MDOVZ?(FSS7bq*gs7)O0{miWdISKbFu-IF#vbOzrl zHKYDaew4q@9Dc@6wZWSMSH-w?onVePjq96lelDG&=f0KGXBs#0i?em&Ih}9f@4&GM z*EioToSphmxUO^fROiGmm2cTxdOF|4Kf$F8xXv^oVVuKHb*;+026kNJZvXpV!EoGc$OK`;PwxSnvl(sD9C~aBHQQESYqqJo)M`_Dqj?$LJ z9HlMI^#n(5mc)_S64Sk;5O75Fu(kT0Y&p)PCwUZkY7V6*MOWmhIZb<_-xYakj-_W= zw3>72Sr)Cjtq&5|}eY6f55n(_IA!gak2Kx0DsoTF;r%=miNEYn8Cnx%ci)Qnmw z*BRlGrH{@szID_rkDtW8h?}+S1Jd~9!JDdk*|9t2O5!W6 z4~Ll3#~PG((uRl5;9I3;)St=G%p{Qy&V~^)dj}Iq^&7TQ(h^&NuN-a47?>v-L7S8kekj zQ~qVR=`nzPR0k_q$}g@35Gtb;UJD>A>bICtGB4#PE6ib%aXb{)q8D>Z`C*yl$%A$+ zI_*`tlpmJVV|i<}obivZ#bSE0xB5#=T@~wbb)@(o$B*ZYkq5TY@8Qw-vpZqqJo)M`_Dqj?$LJ9HlLb zIZ9g=bCk9$<|u7xt|#{1ZkEK6*%EWd&^#%G=wWO61zV0Y=}8_%o|;4HNzoN~YEILh z=yye)nq%o%7Om!7dX`12H6T4H(xPa!Ceohhw?&>>Bhs@hPrGMXp4yWlBWuzSMr`^W zBX@RgoUB+~h1UYeN?r?~HuG&|uLa1Z{L~KBr1)CE*2;imN}lRZepxJRHl8 z5ENbZz#wjs;)U1Etwl@c?Jw?4OM7y|QB7D%47+Ie`R}DIst^5cY)c#+c3Z$;5(y-d zmJ)+9H|O!euYNJK7Janx=i+`iU?eq*q-7eTczC+`)<;zy_guC06Zt&g8P`f$N(_6g z=6y6k<#A|-0fs!Xha%EaV%TdHM|Z}xy$pO1hOU*glo-T?nU6TSPu|s+utt>~hG}wP?mu-9;X0&lp2mN(?(62W;{17PaW1KHWtB0EX7Cw3HZjKF<8_ z+K^f_^_z9#KouC84{0ee?0oFB{(PmY{*&bWqQKC6NK0UJDCOh5uYaic7|=9T^pCV> z%!jm;7-{z#NYS9Oi+X+5^q4|)O62s2N9)~`&tQL)X>q~Kv4-CzRw3HZjJ_fz^ zE5*m;EhQho(0oWsV00|yWBF|tKT?ZkZF2D=+3_mv8S^16C5D}k$0n>&=gZ^TPU~mJ z(0oWsiDBpCq(42aZmXNCKFt`K4`~Su+RYb_C4ac;zQKx*$37B$Fzp%FN?J+`d#%>) zHf%*L+U(Z7#3>;#bgiVN#IV=uj!xZG9xdy>*e6>nVCY&&ONn9E?vA5(RoWf*R&O!3 z14C<9S^}eUDIfDsyi@IK_g>pc+_9hbjQNn362s2NC)ci8UW;B>@Ri+6RtbEBFA0=0jRa z3_Bm+jz3-T(d)uVf)8M5KBOfux~epb`G}S`sj=h_?YoMxB<&g3N?J+`swzd4RF~c8 zk1hZ2jit5dl9LCBS^*>R$XQAZs;U`d%BlCNe*WB#+lW304D#eHl9m#~&c~lmAFufM zV4op^4`66Mq$MzRRv{Ggu}{<6ch;hLhpiX=BkdXIAuT0_osZ|2o_tp=`rb{CTQD>q z(o$mB`S|*0W7U|r?vnQfAIL-VAuT0_osV-KJV)`-VfwLx4`66Mq$MzRDdppoeP7?X z7QMXH$Ku=|?HThSEhUDXk83ZuTVcF)c@Mz{FfV_^|44hrd`L@) zVdvxKfjcYC_r9~Y1w->8EhUDXkCqvGD?VPHzq{ZAd1yYQrNprFG5y7J6(3VJ8zlM% zFf!lw3HZjKIVSs0>#G;zZfd`0EXs6S^}eIDIZsidQ6?y){c-*MoW9f zd`L@)VdtaEq$||1=sAZD65|yxG#}DZV%Yh3_=l0|AE&J9Dfj?}=0jRa3_Bn9y?CDD z%f8cQy|=7T}maX0N5^C2xIhMkX#A3H5Od7B58Y;&tU}!$1B`|uG^6|g}|5w%O zufyIEe55^NKBT3@u=DZUz+DvQw|8$5d;ml9AuT0_osVBG>8-}A%Wvu=_yC6HLt07< zJ0A}`L*rG~dq#-<0SwKDv;;<25as8!lC=0jRa3_BkeJo~cZ zeE-w_V!_aSNK1)f=VQ`>JJopg=2&_Dfjl%H(o$mB`Iyj)#;f)l^KBT3@u=DZS0hg(9x5u7` zFEi(%`H+?p!_G&C&qt_QExKs9=pV>K^C2yPF`$%>`R8t`@>tz+y3lUgGv-5DN(?(6 zv;NRcU7P59<7~120EXs6T1pH%AH$c7QJgnjG*oa749$nMlo)nC9=eX^6FaF{#VqH* z(0oWsVC+%K$J(!7QRiw`@B2ba79;H$^C2xIhMkWdn_jQxOIB^Wr{Dt^nh$9yG3695Y$e7-U}!$1 zB`^k+@)2K!owjagp{ulK%!jm;7h3VX=>%>*CFL-Qdm zC5D}k_$q9>C;MA4G#}Cu7=ugsc$MZ!SS7|QU}!$1rNprF@%Slpz4p>OUlMC^fT8)2mJ-9x zM|>6bg==;dd;ml9AuWN?T*}AFgKFwrZKsx=Lc3|tm=9?wG3g)^+zAuT0_osak`Y=_aS#r^|%kSA}Ew3HZjKH{seeP>J&d;ml9AuWM1 zT!m1~$0pO;s`Xb>y8KLxC27w%4{0ee?0nq#!;=)}!O(n2ONn9UBfbjzuMfM5 z{((F+AJS4{*!hUB!X7_4_`)ws3z|ee1ONn9UBfbjT)NX{}0~neQ zX$g!Gs+7h3W7)jTRjsc1szvaT_Kf+EmJ-9x$3GwGtB$EZo7X%r%Q-MKAJS4{*!hUh zy4N>-EygQgXg;K+#IW-bpLL&m)&#)^FfGO>K~ho*?M`le*i=CAuT0_osak`>?a>|A8N+X zd`L@)Vdo>h3OoIceFPuKL-Qdmfw6xnABpr5*5t^JmwR%y?e4{0ee?0lTLq_=u5 z-ww4!qJIEG^C2xIhMkZ2D(spq|3~x>U}!$1rNprF5nqKJc<^z84`66Mq$My8EafA< z3VYQ2CQ+-jXUvDRlo)nC;;XRh_FZhj(0oWsiDBm>z6$%d4V^{*KpvV8X(=)6e8g8_ zzq&;pUjak&AuWM1x|ENp)BCFNYFLl8VxA%G8S^16C5D}kGn$@N7)y@aUhn}7&4;v< z7UXf`H8C4yRV%q&JEI@ zF(1-WV%Yh(`iFDX{^R#EWgi5F=0jRa3_Bn3RoKs_e=5c+U}!$1rNprF5nqM9eU%)q zfT8)2mcSTW%Eys>y|(@5+X-EzJ!3wkrNprFaXnwJoig(+v5x|V=0jRa3_BmI_sC(l6e!r+y+B4=uT1pH%AD5qYdwaEJ z;=YBCXSE9q&4;v<7tBO zgXfF!3K*IXX$g#9m-2DpQ{UdM`rux2f1dV?`H+?p!_LR0e_VWPExPjb6U06W7@7}h zDKYGPT>8g;N>_(XTqrmPhUP4IMB+V+NH zZVyO08#OvjFg*-GL(h?Y#m-5m1t2yd=RIN66advD^d&Yc7ONn9UWBkaw)ID*v+DjG; z&4;v<7KBT3@u=5d**i%nDPw)W@&4;v<79E$=& z^C2yPadjylbWRb9KgZHO3m)1EOO(o$mB`PgvHZxqJnkDnvP5@2XPq@~2L^AYbA zW}YJN!2*WnLt07q_~E_X^+4d0Je%OMAwANK1)f=Of-L zOrCtU*na>+^C2xIhMkXiukhpzodoB=(0oWsiDBm>-Ye{NvD|+EL-Qdmf$`f?J{}(S z@*TCPO>NPV?6{lujQNn362s2Nw_Dz=`bV2uXA6erLt07g)Gj>6M7X-_o1U>=8Kwy2NC=gbrE=sNX@c((a=T;se?(z!dBHggPK5TYK7ubAU- zYN+}o{B1yFHgho zny2H^fO<0S3Cc5YeuF#{?`e`};Q@0B4h!|J7F|;l%(FRPTc>^(-fo_Q=lRv=;;MRi z9`*(0yYc!)ISo&2lIP>k%;`9yRs9}3%bbC$!@Vn(&z@;9FT{-z>X|q=N?wEmk@8|( zJ66uZ2~qOBIDVX*jl<&P9Nafqz7Mx2$@k;SN90`m;|X~Q9^NNEfPLl%@dlrFXYt)K zt5W1VoS7y+gqzFdhw(t8ybNFIl9%J&c<-)s?h)pnL^&VF_~aG%yIy%EzG^PO=~KPC z*ttiUL31HaPEs$z7tO11>+Z@TYd&t4D zTQ0wV+gHdh;>?xuOE^#{zl>9hg75-q*?ak zcyj=MY2JpT+O(%0e{2ro&<^zmJk7ive-s_Yk$aK(%G`wG+SQwJmbnH0X5NA4bZSp4 z{=wXa6ZWa^#9y1+@%RJkyYQ#x4jg`1{dIiG+=;JutMA6WJ@Ou0a8%xl_aBq@;oRf$ zetgaR22Sr+e-jUy58&i?)DPl|=0iC4lzJCFZ$6AG-&cPNpBa#k;B}|vZruNY+=Gih tl#k-Bv+~>c6LT;2=ZxgYZzI!TK90N1C-8gbKK%1;?LUdrio!WM_aBwr=WhT2 diff --git a/UserSettings/EditorUserSettings.asset b/UserSettings/EditorUserSettings.asset index 0e74a16dc..f49612eb7 100644 --- a/UserSettings/EditorUserSettings.asset +++ b/UserSettings/EditorUserSettings.asset @@ -9,34 +9,34 @@ EditorUserSettings: value: 18134705175a055722080a3115371d4a0d55006876786860616b0471b8b3666cacb72ba5a52a362c3c0ee63201181433fe3e101bf3250b06144ca74c24f1190708e016c213c61a52f91c12cac80fd8edd298e1e4d1fde2cacddeacbcc1fee7eef0e3b6faa69af9ceaeaaec81a6d2c2c8c8c4b2e5dfd5ccd3f8cf flags: 0 RecentlyUsedSceneGuid-0: - value: 5b520400060d5a5a5b5b557641770b43424f1c28787d25612b2d196ab0b66068 - flags: 0 - RecentlyUsedSceneGuid-1: - value: 52530c5601535f020f565a2043770d1612154d2f747975692c7b4e66b5e3303b - flags: 0 - RecentlyUsedSceneGuid-2: value: 5303020755510a0f5e085c2744775a40454e1a2f282b72632f284d61e1e5673d flags: 0 - RecentlyUsedSceneGuid-3: + RecentlyUsedSceneGuid-1: value: 565700055d51590c0f56557545710744124f492b2a2976662828456ae6b03269 flags: 0 - RecentlyUsedSceneGuid-4: - value: 5309035757065a0a54575f7216265c4444151d28792e72627d2f1935bbb8673a - flags: 0 - RecentlyUsedSceneGuid-5: + RecentlyUsedSceneGuid-2: value: 0254070454505a0d55595d2113250844404f48297b7927342e281b6ab7b2676d flags: 0 - RecentlyUsedSceneGuid-6: + RecentlyUsedSceneGuid-3: value: 5301015756025c0a095d082148750c444f154e79752e2569787e4966b7b53561 flags: 0 - RecentlyUsedSceneGuid-7: + RecentlyUsedSceneGuid-4: value: 5307565150535b0b0c5a552711700644474e19297a29206379704b37e7b86368 flags: 0 + RecentlyUsedSceneGuid-5: + value: 00050c5150005f5f54560f2640270d4410161c28282b72357e7c4835e4b63760 + flags: 0 + RecentlyUsedSceneGuid-6: + value: 5b520400060d5a5a5b5b557641770b43424f1c28787d25612b2d196ab0b66068 + flags: 0 + RecentlyUsedSceneGuid-7: + value: 52530c5601535f020f565a2043770d1612154d2f747975692c7b4e66b5e3303b + flags: 0 RecentlyUsedSceneGuid-8: - value: 5505015f5c515a085f5b092149760f441716407a787d7564287b1b36e7e1366e + value: 5309035757065a0a54575f7216265c4444151d28792e72627d2f1935bbb8673a flags: 0 RecentlyUsedSceneGuid-9: - value: 00050c5150005f5f54560f2640270d4410161c28282b72357e7c4835e4b63760 + value: 5505015f5c515a085f5b092149760f441716407a787d7564287b1b36e7e1366e flags: 0 UnityEditor.ShaderGraph.Blackboard: value: 18135939215a0a5004000b0e15254b524c030a3f2964643d120d1230e9e93a3fd6e826abbd2e2d293c4ead313b08042de6030a0afa240c0d020be94c4ba75e435d8715fa32c70d15d11612dacc11fee5d3c5d1fe9ab1bf968e93e2ffcbc3e7e2f0b3ffe0e8b0be9afeffa9ffff8e85dd8390e2969e8899daa7

    Ad%xB)mS>7@nvGt1NGMXH} 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