|
|
- namespace VRTK
- {
- using UnityEngine;
-
- public class VRTK_ScreenFade : MonoBehaviour
- {
- public static VRTK_ScreenFade instance;
-
- protected Material fadeMaterial = null;
- protected Color currentColor = new Color(0f, 0f, 0f, 0f);
- protected Color targetColor = new Color(0f, 0f, 0f, 0f);
- protected Color deltaColor = new Color(0f, 0f, 0f, 0f);
-
- public static void Start(Color newColor, float duration)
- {
- if (instance)
- {
- instance.StartFade(newColor, duration);
- }
- }
-
- public virtual void StartFade(Color newColor, float duration)
- {
- if (duration > 0.0f)
- {
- targetColor = newColor;
- deltaColor = (targetColor - currentColor) / duration;
- }
- else
- {
- currentColor = newColor;
- }
- }
-
- protected virtual void Awake()
- {
- fadeMaterial = new Material(Shader.Find("Unlit/TransparentColor"));
- instance = this;
- }
-
- protected virtual void OnPostRender()
- {
- if (currentColor != targetColor)
- {
- if (Mathf.Abs(currentColor.a - targetColor.a) < Mathf.Abs(deltaColor.a) * Time.deltaTime)
- {
- currentColor = targetColor;
- deltaColor = new Color(0, 0, 0, 0);
- }
- else
- {
- currentColor += deltaColor * Time.deltaTime;
- }
- }
-
- if (currentColor.a > 0 && fadeMaterial)
- {
- currentColor.a = (targetColor.a > currentColor.a && currentColor.a > 0.98f ? 1f : currentColor.a);
- fadeMaterial.color = currentColor;
- fadeMaterial.SetPass(0);
- GL.PushMatrix();
- GL.LoadOrtho();
- GL.Color(fadeMaterial.color);
- GL.Begin(GL.QUADS);
- GL.Vertex3(0f, 0f, 0.9999f);
- GL.Vertex3(0f, 1f, 0.9999f);
- GL.Vertex3(1f, 1f, 0.9999f);
- GL.Vertex3(1f, 0f, 0.9999f);
- GL.End();
- GL.PopMatrix();
- }
- }
- }
- }
|