// Crest Water System // Copyright © 2024 Wave Harmonic. All rights reserved. using UnityEngine; using UnityEngine.Experimental.Rendering; using UnityEngine.Rendering; namespace WaveHarmonic.Crest { partial class WaterResources { public ComputeLibrary _ComputeLibrary; public sealed class ComputeLibrary { public BlitCompute _BlitCompute; public BlurCompute _BlurCompute; public ClearCompute _ClearCompute; public ShapeCombineCompute _ShapeCombineCompute; public ComputeLibrary(WaterResources resources) { _BlitCompute = new(resources.Compute._Blit); _BlurCompute = new(resources.Compute._Blur); _ClearCompute = new(resources.Compute._Clear); _ShapeCombineCompute = new(resources.Compute._ShapeCombine); } } public abstract class UtilityCompute { public readonly ComputeShader _Shader; public readonly LocalKeyword _Float1Keyword; public readonly LocalKeyword _Float2Keyword; public readonly LocalKeyword _Float3Keyword; public readonly LocalKeyword _Float4Keyword; public UtilityCompute(ComputeShader shader) { _Shader = shader; var keywords = shader.keywordSpace; _Float1Keyword = keywords.FindKeyword("d_Float1"); _Float2Keyword = keywords.FindKeyword("d_Float2"); _Float3Keyword = keywords.FindKeyword("d_Float3"); _Float4Keyword = keywords.FindKeyword("d_Float4"); } public void SetVariantForFormat(T wrapper, GraphicsFormat format) where T : IPropertyWrapperVariants { var count = GraphicsFormatUtility.GetComponentCount(format); wrapper.SetKeyword(_Float1Keyword, count == 1); wrapper.SetKeyword(_Float2Keyword, count == 2); wrapper.SetKeyword(_Float3Keyword, count == 3); wrapper.SetKeyword(_Float4Keyword, count == 4); } } public sealed class ClearCompute : UtilityCompute { public readonly int _KernelClearTarget; public readonly int _KernelClearTargetBoundaryX; public readonly int _KernelClearTargetBoundaryY; public ClearCompute(ComputeShader shader) : base(shader) { // Using FindKernel can fail if upgrading Crest, and is quite tricky to get right. _KernelClearTarget = 0; _KernelClearTargetBoundaryX = 1; _KernelClearTargetBoundaryY = 2; } } public sealed class BlitCompute : UtilityCompute { public readonly int _KernelAdd; public BlitCompute(ComputeShader shader) : base(shader) { _KernelAdd = 0; } } public sealed class BlurCompute : UtilityCompute { public readonly int _KernelHorizontal; public readonly int _KernelVertical; public BlurCompute(ComputeShader shader) : base(shader) { _KernelHorizontal = 0; _KernelVertical = 1; } } public sealed class ShapeCombineCompute { public readonly ComputeShader _Shader; public readonly LocalKeyword _CombineKeyword; public readonly LocalKeyword _DynamicWavesKeyword; public readonly LocalKeyword _FlowKeyword; public readonly int _CopyAnimatedWavesKernel; public readonly int _CombineAnimatedWavesKernel; public readonly int _CombineDynamicWavesKernel; public ShapeCombineCompute(ComputeShader shader) { _Shader = shader; var keywords = shader.keywordSpace; _CombineKeyword = keywords.FindKeyword("d_Combine"); _DynamicWavesKeyword = keywords.FindKeyword("d_DynamicWaves"); _FlowKeyword = keywords.FindKeyword("d_Flow"); _CombineAnimatedWavesKernel = 0; _CopyAnimatedWavesKernel = 1; _CombineDynamicWavesKernel = 2; } } } }