Files
Fishing2/Packages/com.waveharmonic.crest/Runtime/Scripts/Data/Input/DepthLodInput.cs
2026-01-08 22:30:55 +08:00

73 lines
2.5 KiB
C#

// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
using UnityEngine.Rendering;
namespace WaveHarmonic.Crest
{
/// <summary>
/// Registers a custom input to the <see cref="DepthLod"/>.
/// </summary>
/// <remarks>
/// <para>
/// Attach this to objects that you want to use to add water depth.
/// </para>
/// <para>
/// Renders depth every frame and should only be used for dynamic objects. For
/// static objects, use a <see cref="DepthProbe"/>
/// </para>
/// </remarks>
[@HelpURL("Manual/ShallowsAndShorelines.html#sea-floor-depth")]
public sealed partial class DepthLodInput : LodInput
{
[SerializeField, HideInInspector]
#pragma warning disable 414
int _Version = 0;
#pragma warning restore 414
[@Space(10)]
[@Label("Relative Height")]
[Tooltip("Whether the data is relative to the input height.\n\nUseful for procedural placement.")]
[@GenerateAPI]
[@DecoratedField, SerializeField]
internal bool _Relative = true;
[@Label("Copy Signed Distance Field")]
[Tooltip("Whether to copy the signed distance field.")]
[@GenerateAPI]
[@DecoratedField, SerializeField]
internal bool _CopySignedDistanceField;
internal static new class ShaderIDs
{
public static readonly int s_HeightOffset = Shader.PropertyToID("_Crest_HeightOffset");
public static readonly int s_SDF = Shader.PropertyToID("_Crest_SDF");
}
internal override LodInputMode DefaultMode => LodInputMode.Geometry;
internal override void InferBlend()
{
base.InferBlend();
_Blend = LodInputBlend.Maximum;
}
internal override void Draw(Lod simulation, CommandBuffer buffer, RenderTargetIdentifier target, int pass = -1, float weight = 1f, int slice = -1)
{
var wrapper = new PropertyWrapperBuffer(buffer);
wrapper.SetFloat(ShaderIDs.s_HeightOffset, _Relative ? transform.position.y : 0f);
if (IsCompute)
{
wrapper.SetInteger(ShaderIDs.s_SDF, _CopySignedDistanceField ? 1 : 0);
buffer.SetKeyword(WaterResources.Instance.Compute._DepthTexture, WaterResources.Instance.Keywords.DepthTextureSDF, simulation._Water._DepthLod._EnableSignedDistanceFields);
}
base.Draw(simulation, buffer, target, pass, weight, slice);
}
}
}