Files
2026-02-21 16:45:37 +08:00

117 lines
3.0 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Serialization;
namespace UltimateWater.Internal
{
public class GlobalWaterInteraction : MonoBehaviour, ILocalDisplacementMaskRenderer, IDynamicWaterEffects
{
[SerializeField]
[FormerlySerializedAs("maskDisplayShader")]
[HideInInspector]
private Shader _MaskDisplayShader;
[FormerlySerializedAs("intensityMask")]
[SerializeField]
private Texture2D _IntensityMask;
[FormerlySerializedAs("worldUnitsOffset")]
[SerializeField]
private Vector2 _WorldUnitsOffset;
[FormerlySerializedAs("worldUnitsSize")]
[SerializeField]
private Vector2 _WorldUnitsSize;
private MeshRenderer _InteractionMaskRenderer;
private Material _InteractionMaskMaterial;
public Vector2 WorldUnitsOffset
{
get
{
return _WorldUnitsOffset;
}
set
{
_WorldUnitsOffset = value;
}
}
public Vector2 WorldUnitsSize
{
get
{
return _WorldUnitsSize;
}
set
{
_WorldUnitsSize = value;
}
}
public void RenderLocalMask(CommandBuffer commandBuffer, DynamicWaterCameraData overlays)
{
float farClipPlane = overlays.Camera.CameraComponent.farClipPlane;
Vector3 position = overlays.Camera.transform.position;
position.y = overlays.DynamicWater.Water.transform.position.y;
_InteractionMaskRenderer.transform.position = position;
_InteractionMaskRenderer.transform.localScale = new Vector3(farClipPlane, farClipPlane, farClipPlane);
_InteractionMaskMaterial.SetVector("_OffsetScale", new Vector4(0.5f + _WorldUnitsOffset.x / _WorldUnitsSize.x, 0.5f + _WorldUnitsOffset.y / _WorldUnitsSize.y, 1f / _WorldUnitsSize.x, 1f / _WorldUnitsSize.y));
commandBuffer.DrawMesh(_InteractionMaskRenderer.GetComponent<MeshFilter>().sharedMesh, _InteractionMaskRenderer.transform.localToWorldMatrix, _InteractionMaskMaterial, 0, 0);
}
public void Enable()
{
throw new NotImplementedException();
}
public void Disable()
{
throw new NotImplementedException();
}
private void Awake()
{
OnValidate();
CreateMaskRenderer();
base.gameObject.layer = WaterProjectSettings.Instance.WaterTempLayer;
}
private void OnEnable()
{
DynamicWater.AddRenderer(this);
}
private void OnDisable()
{
DynamicWater.RemoveRenderer(this);
}
private void OnValidate()
{
if (_MaskDisplayShader == null)
{
_MaskDisplayShader = Shader.Find("UltimateWater/Utility/ShorelineMaskRenderSimple");
}
}
private void CreateMaskRenderer()
{
MeshFilter meshFilter = base.gameObject.AddComponent<MeshFilter>();
meshFilter.sharedMesh = Quads.BipolarXZ;
_InteractionMaskMaterial = new Material(_MaskDisplayShader)
{
hideFlags = HideFlags.DontSave
};
_InteractionMaskMaterial.SetTexture("_MainTex", _IntensityMask);
_InteractionMaskRenderer = base.gameObject.AddComponent<MeshRenderer>();
_InteractionMaskRenderer.sharedMaterial = _InteractionMaskMaterial;
_InteractionMaskRenderer.enabled = false;
base.transform.localRotation = Quaternion.identity;
}
}
}