using UltimateWater.Internal; using UnityEngine; using UnityEngine.Rendering; namespace UltimateWater { [RequireComponent(typeof(Renderer))] [AddComponentMenu("Ultimate Water/Dynamic/Water Interactive")] public sealed class WaterInteractive : MonoBehaviour, IWavesInteractive, IDynamicWaterEffects { [Tooltip("How much velocity modifies wave amplitude")] public float Multiplier = 1f; [Tooltip("Disables simulation when the object is outside the camera view frustum, note that this will probably cull the waves from the objects just outside the view")] [SerializeField] private bool _UseViewCulling; private Matrix4x4 _Previous; private Renderer _Renderer; private Material _Material; private bool _IsVisible; public void Render(Camera camera, CommandBuffer commandBuffer) { if (_Renderer.enabled && GeometryUtility.TestPlanesAABB(GeometryUtility.CalculateFrustumPlanes(camera), _Renderer.bounds) && (!_UseViewCulling || _IsVisible)) { _IsVisible = false; commandBuffer.DrawRenderer(_Renderer, _Material); } } public void Enable() { } public void Disable() { } private void OnWillRenderObject() { _IsVisible = true; } private void Awake() { _Material = ShaderUtility.Instance.CreateMaterial(ShaderList.Velocity); if (!_Material.IsNullReference(this)) { _Renderer = GetComponent(); if (!_Renderer.IsNullReference(this)) { _Previous = base.transform.localToWorldMatrix; } } } private void OnEnable() { DynamicWater.AddRenderer(this); } private void OnDisable() { DynamicWater.RemoveRenderer(this); } private void FixedUpdate() { Matrix4x4 localToWorldMatrix = base.transform.localToWorldMatrix; _Material.SetMatrix("_PreviousWorld", _Previous); _Material.SetMatrix("_CurrentWorld", localToWorldMatrix); _Material.SetFloat("_Data", Multiplier / Time.fixedDeltaTime); _Previous = localToWorldMatrix; } } }