Files
dungeons/Assets/UltimateXR/Runtime/Scripts/Animation/GameObjects/UxrObjectFade.ObjectEntry.cs
2024-08-06 21:58:35 +02:00

123 lines
4.8 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="UxrObjectFade.ObjectEntry.cs" company="VRMADA">
// Copyright (c) VRMADA, All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using UltimateXR.Core;
using UltimateXR.Extensions.System.Collections;
using UnityEngine;
using UnityEngine.Rendering;
namespace UltimateXR.Animation.GameObjects
{
public partial class UxrObjectFade
{
#region Private Types & Data
/// <summary>
/// Stores information about an object in a fade animation.
/// </summary>
private partial class ObjectEntry
{
#region Constructors & Finalizer
/// <summary>
/// Constructor.
/// </summary>
/// <param name="renderer">Renderer component</param>
public ObjectEntry(Renderer renderer)
{
Renderer = renderer;
SharedMaterials = renderer.sharedMaterials;
Materials = renderer.materials;
MaterialEntries = new MaterialEntry[Materials.Length];
for (int i = 0; i < Materials.Length; ++i)
{
MaterialEntries[i].StartColor = Materials[i].color;
MaterialEntries[i].ShaderChanged = false;
}
}
#endregion
#region Public Methods
/// <summary>
/// Changes the material transparency.
/// </summary>
/// <param name="startQuantity">Start alpha</param>
/// <param name="endQuantity">End alpha</param>
/// <param name="fadeT">Interpolation factor [0.0, 1.0]</param>
public void Fade(float startQuantity, float endQuantity, float fadeT)
{
for (int i = 0; i < Materials.Length; ++i)
{
if (!MaterialEntries[i].ShaderChanged)
{
ChangeStandardMaterialRenderMode(Materials[i]);
MaterialEntries[i].ShaderChanged = true;
}
Color color = MaterialEntries[i].StartColor;
color.a *= Mathf.Lerp(startQuantity, endQuantity, fadeT);
Materials[i].color = color;
}
Renderer.materials = Materials;
}
/// <summary>
/// Restores the original material(s).
/// </summary>
public void Restore()
{
Renderer.sharedMaterials = SharedMaterials;
MaterialEntries.ForEach(m => m.ShaderChanged = false);
}
#endregion
#region Private Methods
/// <summary>
/// Enables transparency on a material.
/// </summary>
/// <param name="material">Material to enable transparency on</param>
private void ChangeStandardMaterialRenderMode(Material material)
{
if (material.HasProperty(UxrConstants.Shaders.SurfaceModeVarName))
{
// Universal render pipeline
material.SetInt(UxrConstants.Shaders.SurfaceModeVarName, UxrConstants.Shaders.SurfaceModeTransparent);
material.SetInt(UxrConstants.Shaders.BlendModeVarName, UxrConstants.Shaders.BlendModeAlpha);
material.renderQueue = (int)RenderQueue.Transparent;
}
else if (material.IsKeywordEnabled(UxrConstants.Shaders.AlphaBlendOnKeyword) == false)
{
// Built-in render pipeline
material.SetInt(UxrConstants.Shaders.SrcBlendVarName, (int)BlendMode.SrcAlpha);
material.SetInt(UxrConstants.Shaders.DstBlendVarName, (int)BlendMode.OneMinusSrcAlpha);
material.SetInt(UxrConstants.Shaders.ZWriteVarName, 0);
material.DisableKeyword(UxrConstants.Shaders.AlphaTestOnKeyword);
material.EnableKeyword(UxrConstants.Shaders.AlphaBlendOnKeyword);
material.DisableKeyword(UxrConstants.Shaders.AlphaPremultiplyOnKeyword);
material.renderQueue = (int)RenderQueue.Transparent;
}
}
#endregion
#region Private Types & Data
private MaterialEntry[] MaterialEntries { get; }
private Renderer Renderer { get; }
private Material[] Materials { get; }
private Material[] SharedMaterials { get; }
#endregion
}
#endregion
}
}