214 lines
7.0 KiB
C#
214 lines
7.0 KiB
C#
/*******************************************************************************
|
||
Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved.
|
||
|
||
NOTICE:All information contained herein is, and remains the property of
|
||
PICO Technology Co., Ltd. The intellectual and technical concepts
|
||
contained hererin are proprietary to PICO Technology Co., Ltd. and may be
|
||
covered by patents, patents in process, and are protected by trade secret or
|
||
copyright law. Dissemination of this information or reproduction of this
|
||
material is strictly forbidden unless prior written permission is obtained from
|
||
PICO Technology Co., Ltd.
|
||
*******************************************************************************/
|
||
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace Unity.XR.OpenXR.Features.PICOSupport
|
||
{
|
||
public class PICOScreenFade : MonoBehaviour
|
||
{
|
||
[Tooltip("The gradient of time.")]
|
||
public float gradientTime = 5.0f;
|
||
[Tooltip("Basic color.")]
|
||
public Color fadeColor = new Color(0.0f, 0.0f, 0.0f, 1.0f);
|
||
[Tooltip("The default value is 4000.")]
|
||
private int renderQueue = 4000;
|
||
private MeshRenderer gradientMeshRenderer;
|
||
private MeshFilter gradientMeshFilter;
|
||
private Material gradientMaterial = null;
|
||
private bool isGradient = false;
|
||
private float currentAlpha;
|
||
private float nowFadeAlpha;
|
||
private List<Vector3> verts;
|
||
private List<int> indices;
|
||
private int N = 5;
|
||
|
||
void Awake()
|
||
{
|
||
CreateFadeMesh();
|
||
SetCurrentAlpha(0);
|
||
}
|
||
void OnEnable()
|
||
{
|
||
StartCoroutine(ScreenFade());
|
||
}
|
||
void OnDestroy()
|
||
{
|
||
DestoryGradientMesh();
|
||
}
|
||
|
||
private void CreateFadeMesh()
|
||
{
|
||
verts = new List<Vector3>();
|
||
indices = new List<int>();
|
||
gradientMaterial = new Material(Shader.Find("PXR_SDK/PXR_Fade"));
|
||
gradientMeshFilter = gameObject.AddComponent<MeshFilter>();
|
||
gradientMeshRenderer = gameObject.AddComponent<MeshRenderer>();
|
||
|
||
CreateModel();
|
||
}
|
||
|
||
|
||
|
||
public void SetCurrentAlpha(float alpha)
|
||
{
|
||
currentAlpha = alpha;
|
||
SetAlpha();
|
||
}
|
||
|
||
IEnumerator ScreenFade()
|
||
{
|
||
float nowTime = 0.0f;
|
||
while (nowTime < gradientTime)
|
||
{
|
||
nowTime += Time.deltaTime;
|
||
nowFadeAlpha = Mathf.Lerp(1.0f, 0, Mathf.Clamp01(nowTime / gradientTime));
|
||
SetAlpha();
|
||
yield return new WaitForEndOfFrame();
|
||
}
|
||
}
|
||
|
||
private void SetAlpha()
|
||
{
|
||
Color color = fadeColor;
|
||
color.a = Mathf.Max(currentAlpha, nowFadeAlpha);
|
||
isGradient = color.a > 0;
|
||
if (gradientMaterial != null)
|
||
{
|
||
gradientMaterial.color = color;
|
||
gradientMaterial.renderQueue = renderQueue;
|
||
gradientMeshRenderer.material = gradientMaterial;
|
||
gradientMeshRenderer.enabled = isGradient;
|
||
}
|
||
}
|
||
|
||
void CreateModel()
|
||
{
|
||
for (float i = -N / 2f; i <= N / 2f; i++)
|
||
{
|
||
for (float j = -N / 2f; j <= N / 2f; j++)
|
||
{
|
||
verts.Add(new Vector3(i, j, -N / 2f));
|
||
}
|
||
}
|
||
for (float i = -N / 2f; i <= N / 2f; i++)
|
||
{
|
||
for (float j = -N / 2f; j <= N / 2f; j++)
|
||
{
|
||
verts.Add(new Vector3(N / 2f, j, i));
|
||
}
|
||
}
|
||
for (float i = -N / 2f; i <= N / 2f; i++)
|
||
{
|
||
for (float j = -N / 2f; j <= N / 2f; j++)
|
||
{
|
||
verts.Add(new Vector3(i, N / 2f, j));
|
||
}
|
||
}
|
||
for (float i = -N / 2f; i <= N / 2f; i++)
|
||
{
|
||
for (float j = -N / 2f; j <= N / 2f; j++)
|
||
{
|
||
verts.Add(new Vector3(-N / 2f, j, i));
|
||
}
|
||
}
|
||
for (float i = -N / 2f; i <= N / 2f; i++)
|
||
{
|
||
for (float j = -N / 2f; j <= N / 2f; j++)
|
||
{
|
||
verts.Add(new Vector3(i, j, N / 2f));
|
||
}
|
||
}
|
||
for (float i = -N / 2f; i <= N / 2f; i++)
|
||
{
|
||
for (float j = -N / 2f; j <= N / 2f; j++)
|
||
{
|
||
verts.Add(new Vector3(i, -N / 2f, j));
|
||
}
|
||
}
|
||
|
||
for (int i = 0; i < verts.Count; i++)
|
||
{
|
||
verts[i] = verts[i].normalized * 0.7f;
|
||
}
|
||
|
||
CreateMakePos(0);
|
||
CreateMakePos(1);
|
||
CreateMakePos(2);
|
||
OtherMakePos(3);
|
||
OtherMakePos(4);
|
||
OtherMakePos(5);
|
||
Mesh mesh = new Mesh();
|
||
mesh.vertices = verts.ToArray();
|
||
mesh.triangles = indices.ToArray();
|
||
mesh.RecalculateNormals();
|
||
mesh.RecalculateBounds();
|
||
Vector3[] normals = mesh.normals;
|
||
for (int i = 0; i < normals.Length; i++)
|
||
{
|
||
normals[i] = -normals[i];
|
||
}
|
||
mesh.normals = normals;
|
||
int[] triangles = mesh.triangles;
|
||
for (int i = 0; i < triangles.Length; i += 3)
|
||
{
|
||
int t = triangles[i];
|
||
triangles[i] = triangles[i + 2];
|
||
triangles[i + 2] = t;
|
||
}
|
||
mesh.triangles = triangles;
|
||
gradientMeshFilter.mesh = mesh;
|
||
}
|
||
public void CreateMakePos(int num)
|
||
{
|
||
for (int i = 0; i < N; i++)
|
||
{
|
||
for (int j = 0; j < N; j++)
|
||
{
|
||
int index = j * (N + 1) + (N + 1) * (N + 1) * num + i;
|
||
int up = (j + 1) * (N + 1) + (N + 1) * (N + 1) * num + i;
|
||
indices.AddRange(new int[] { index, index + 1, up + 1 });
|
||
indices.AddRange(new int[] { index, up + 1, up });
|
||
}
|
||
}
|
||
}
|
||
public void OtherMakePos(int num)
|
||
{
|
||
for (int i = 0; i < N + 1; i++)
|
||
{
|
||
for (int j = 0; j < N + 1; j++)
|
||
{
|
||
if (i != N && j != N)
|
||
{
|
||
int index = j * (N + 1) + (N + 1) * (N + 1) * num + i;
|
||
int up = (j + 1) * (N + 1) + (N + 1) * (N + 1) * num + i;
|
||
indices.AddRange(new int[] { index, up + 1, index + 1 });
|
||
indices.AddRange(new int[] { index, up, up + 1 });
|
||
}
|
||
}
|
||
}
|
||
}
|
||
private void DestoryGradientMesh()
|
||
{
|
||
if (gradientMeshRenderer != null)
|
||
Destroy(gradientMeshRenderer);
|
||
|
||
if (gradientMaterial != null)
|
||
Destroy(gradientMaterial);
|
||
|
||
if (gradientMeshFilter != null)
|
||
Destroy(gradientMeshFilter);
|
||
}
|
||
}
|
||
} |