101 lines
2.7 KiB
C#
101 lines
2.7 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
public class LuxWater_SetToGerstnerHeight : MonoBehaviour {
|
||
|
||
public Material WaterMaterial;
|
||
public Vector3 Damping = new Vector3(0.3f, 1.0f, 0.3f);
|
||
public float TimeOffset = 0.0f;
|
||
public bool UpdateWaterMaterialPerFrame = false;
|
||
|
||
[Space(8)]
|
||
public bool AddCircleAnim = false;
|
||
public float Radius = 6.0f;
|
||
public float Speed = 1.0f;
|
||
|
||
[Space(8)]
|
||
public Transform[] ManagedWaterProjectors;
|
||
|
||
[Header("Debug")]
|
||
public float MaxDisp;
|
||
|
||
private Transform trans;
|
||
|
||
private LuxWaterUtils.GersterWavesDescription Description;
|
||
private bool ObjectIsVisible = false;
|
||
private Vector3 Offset = Vector3.zero;
|
||
|
||
void Start () {
|
||
trans = transform;
|
||
// Get the Gestner Wave settings from the material and store them into or Description struct
|
||
LuxWaterUtils.GetGersterWavesDescription(ref Description, WaterMaterial);
|
||
}
|
||
|
||
void OnBecameVisible () {
|
||
ObjectIsVisible = true;
|
||
}
|
||
|
||
void OnBecameInvisible () {
|
||
ObjectIsVisible = false;
|
||
}
|
||
|
||
void LateUpdate () {
|
||
|
||
// In case the object is rendered by any camera we have to update its position.
|
||
if (ObjectIsVisible || AddCircleAnim) {
|
||
|
||
// Check for material – you could add a check here if Gerstner Waves are enabled
|
||
if (WaterMaterial == null) {
|
||
return;
|
||
}
|
||
|
||
if (UpdateWaterMaterialPerFrame) {
|
||
// Update the Gestner Wave settings from the material if needed
|
||
LuxWaterUtils.GetGersterWavesDescription(ref Description, WaterMaterial);
|
||
}
|
||
|
||
var pos = trans.position;
|
||
// Reset pos by subtracting the last Offset
|
||
pos -= Offset;
|
||
|
||
// Animate the position
|
||
if(AddCircleAnim) {
|
||
pos.x += Mathf.Sin(Time.time * Speed) * Time.deltaTime * Radius;
|
||
pos.z += Mathf.Cos(Time.time * Speed) * Time.deltaTime * Radius;
|
||
}
|
||
|
||
// Sync assigned Managed Water Projectors (transform)
|
||
var count = ManagedWaterProjectors.Length;
|
||
if(count > 0) {
|
||
for(int i = 0; i != count; i++) {
|
||
var cpos = ManagedWaterProjectors[i].position;
|
||
cpos.x = pos.x;
|
||
cpos.z = pos.z;
|
||
ManagedWaterProjectors[i].position = cpos;
|
||
}
|
||
}
|
||
|
||
// Get the offset of the Gerstner displacement. We have to pass:
|
||
// - a sample location in world space,
|
||
// - the Gestner Wave settings from the material sttored in our Description struct,
|
||
// - a time offset (in seconds) which lets us create an effect of the inertia of masses.
|
||
Offset = LuxWaterUtils.GetGestnerDisplacement(pos, Description, TimeOffset);
|
||
|
||
#if UNITY_EDITOR
|
||
var maxd = Offset.magnitude;
|
||
if(maxd > MaxDisp) {
|
||
MaxDisp = maxd;
|
||
}
|
||
#endif
|
||
|
||
// Calculate the new Offset
|
||
Offset.x += Offset.x * Damping.x;
|
||
Offset.y += Offset.y * Damping.y;
|
||
Offset.z += Offset.z * Damping.z;
|
||
|
||
trans.position = pos + Offset;
|
||
}
|
||
}
|
||
}
|