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