Files
Ipseity-Demo/Assets/_Content/Scripts/Features/LiminalSpaces/BoatOnLake/Water/WaterVolumeHelper.cs
T

73 lines
1.9 KiB
C#

#region Using statements
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#endregion
namespace Unheimlich.VFX.StylisedWater
{
public class WaterVolumeHelper : MonoBehaviour
{
#region Private static fields
private static WaterVolumeHelper instance = null;
#endregion
#region Public fields
public WaterVolumeBase WaterVolume = null;
#endregion
#region Public static properties
public static WaterVolumeHelper Instance { get { return instance; } }
#endregion
#region Public methods
public float? GetHeight(Vector3 _position)
{
// ensure a water volume
if (!WaterVolume)
{
return 0f;
}
// ensure a material
var renderer = WaterVolume.gameObject.GetComponent<MeshRenderer>();
if (!renderer || !renderer.sharedMaterial)
{
return 0f;
}
// replicate the shader logic, using parameters pulled from the specific material, to return the height at the specified position
var waterHeight = WaterVolume.GetHeight(_position);
if (!waterHeight.HasValue)
{
return null;
}
var _WaveFrequency = renderer.sharedMaterial.GetFloat("_WaveFrequency");
var _WaveScale = renderer.sharedMaterial.GetFloat("_WaveScale");
var _WaveSpeed = renderer.sharedMaterial.GetFloat("_WaveSpeed");
var time = Time.time * _WaveSpeed;
var shaderOffset = (Mathf.Sin(_position.x * _WaveFrequency + time) + Mathf.Cos(_position.z * _WaveFrequency + time)) * _WaveScale;
return waterHeight.Value + shaderOffset;
}
#endregion
#region MonoBehaviour events
private void Awake()
{
instance = this;
}
#endregion
}
}