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;
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |