49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
using UnityEngine;
|
|
|
|
// Sets up transformation matrices to scale&scroll water waves
|
|
// for the case where graphics card does not support vertex programs.
|
|
//
|
|
// Also disables reflection and/or refraction cameras if the shader
|
|
// falls back to non reflective/refractive one.
|
|
|
|
public class WaterWaveScroll : MonoBehaviour
|
|
{
|
|
private string oldWaterMode = "";
|
|
|
|
void Update()
|
|
{
|
|
if (!renderer)
|
|
return;
|
|
Material mat = renderer.material;
|
|
if (!mat)
|
|
return;
|
|
|
|
Vector4 waveSpeed = mat.GetVector("WaveSpeed");
|
|
float waveScale = mat.GetFloat("_WaveScale");
|
|
float t = Time.time / 40.0f;
|
|
|
|
Vector3 offset = new Vector3(t * waveSpeed.x, t * waveSpeed.y, 0);
|
|
Vector3 scale = new Vector3(1.0f / waveScale, 1.0f / waveScale, 1);
|
|
Matrix4x4 scrollMatrix = Matrix4x4.TRS(offset, Quaternion.identity, scale);
|
|
mat.SetMatrix("_WaveMatrix", scrollMatrix);
|
|
|
|
offset = new Vector3(t * waveSpeed.z, t * waveSpeed.w, 0);
|
|
scrollMatrix = Matrix4x4.TRS(offset, Quaternion.identity, scale * 0.45f);
|
|
mat.SetMatrix("_WaveMatrix2", scrollMatrix);
|
|
|
|
// Get reflection mode from shader's tag
|
|
string waterMode = mat.GetTag("WATERMODE", false);
|
|
if (waterMode != oldWaterMode)
|
|
{
|
|
// If reflection mode changed, enable/disable
|
|
// additional water cameras.
|
|
Component[] reflCameras = GetComponentsInChildren(typeof(Camera));
|
|
foreach (Camera cam in reflCameras)
|
|
{
|
|
cam.SendMessage("ExternalSetMode", waterMode, SendMessageOptions.DontRequireReceiver);
|
|
}
|
|
|
|
oldWaterMode = waterMode;
|
|
}
|
|
}
|
|
} |