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

172 lines
3.5 KiB
C#

using UltimateWater.Internal;
using UltimateWater.Utils;
using UnityEngine;
using UnityEngine.Rendering;
namespace UltimateWater
{
public class WaterProjector : MonoBehaviour, ILocalDiffuseRenderer, ILocalDisplacementRenderer, IDynamicWaterEffects
{
public enum Type
{
Diffuse = 0,
Displacement = 1
}
[SerializeField]
private Type _Type;
[SerializeField]
private Material _Displacement;
[SerializeField]
private bool _UseChildrenRenderers;
private Renderer[] _Renderers;
[InspectorWarning("Warning", InspectorWarningAttribute.InfoType.Error)]
[SerializeField]
private string _Warning;
public void RenderLocalDiffuse(CommandBuffer commandBuffer, DynamicWaterCameraData overlays)
{
if (_Renderers != null && _Type == Type.Diffuse)
{
for (int i = 0; i < _Renderers.Length; i++)
{
commandBuffer.DrawRenderer(_Renderers[i], _Renderers[i].sharedMaterial);
}
}
}
public void RenderLocalDisplacement(CommandBuffer commandBuffer, DynamicWaterCameraData overlays)
{
if (_Renderers != null && _Type == Type.Displacement && !(_Displacement == null))
{
for (int i = 0; i < _Renderers.Length; i++)
{
commandBuffer.DrawRenderer(_Renderers[i], _Displacement);
}
}
}
public void Enable()
{
if (_Renderers != null)
{
for (int i = 0; i < _Renderers.Length; i++)
{
_Renderers[i].enabled = true;
}
}
}
public void Disable()
{
if (_Renderers != null)
{
for (int i = 0; i < _Renderers.Length; i++)
{
_Renderers[i].enabled = false;
}
}
}
private void Awake()
{
if (_UseChildrenRenderers)
{
_Renderers = GetComponentsInChildren<Renderer>();
}
else
{
Renderer component = GetComponent<Renderer>();
if (component != null)
{
_Renderers = new Renderer[1] { component };
}
}
if (_Renderers == null)
{
Debug.LogError("[WaterProjector] : no renderers found");
base.enabled = false;
return;
}
for (int i = 0; i < _Renderers.Length; i++)
{
_Renderers[i].enabled = false;
}
if (_Type == Type.Displacement && _Displacement == null)
{
_Displacement = Resources.Load<Material>("Materials/Overlay (Displacements)");
}
}
private void OnEnable()
{
Unregister();
Register();
}
private void OnDisable()
{
Unregister();
}
private void OnDrawGizmos()
{
MeshFilter component = GetComponent<MeshFilter>();
if (!(component == null) && !(component.sharedMesh == null))
{
Gizmos.color = new Color(0.5f, 0.2f, 1f);
Gizmos.matrix = base.transform.localToWorldMatrix;
Gizmos.DrawWireMesh(component.sharedMesh);
}
}
private void OnValidate()
{
if (!Application.isPlaying)
{
if (_Type == Type.Displacement && _Displacement == null)
{
_Displacement = Resources.Load<Material>("Materials/Overlay (Displacements)");
}
}
else
{
Unregister();
Register();
}
}
private void Register()
{
DynamicWater.AddRenderer(this);
}
private void Unregister()
{
DynamicWater.RemoveRenderer(this);
}
private string Warning()
{
bool flag = true;
if (_UseChildrenRenderers)
{
Renderer[] componentsInChildren = GetComponentsInChildren<Renderer>();
if (componentsInChildren == null || componentsInChildren.Length == 0)
{
flag = false;
}
}
else if (GetComponent<Renderer>() == null)
{
flag = false;
}
return (!flag) ? "error: no renderers found,\nadd renderer to GameObject or its children" : string.Empty;
}
}
}