Files
StoryGame_Unity/Assets/Live2D/Cubism/Rendering/CubismBuiltinMaterials.cs

192 lines
5.7 KiB
C#

/**
* Copyright(c) Live2D Inc. All rights reserved.
*
* Use of this source code is governed by the Live2D Open Software license
* that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
*/
using Live2D.Cubism.Rendering.Util;
using UnityEngine;
namespace Live2D.Cubism.Rendering
{
/// <summary>
/// Default materials.
/// </summary>
public static class CubismBuiltinMaterials
{
/// <summary>
/// Default mask material.
/// </summary>
public static Material Mask
{
get { return LoadMaskMaterial(); }
}
/// <summary>
/// Default culled mask material.
/// </summary>
public static Material MaskCulling
{
get { return LoadMaskCullingMaterial(); }
}
/// <summary>
/// Unlit blit material for BlendMode.
/// </summary>
public static Material UnlitBlit
{
get
{
return LoadBlendModeMaterial("UnlitBlit");
}
}
/// <summary>
/// <see cref="OffscreenMask"/>'s backing field.
/// </summary>
private static Material _offscreenMask;
/// <summary>
/// Unlit mask material for BlendMode.
/// </summary>
public static Material OffscreenMask
{
get
{
if (_offscreenMask == null)
{
_offscreenMask = LoadBlendModeMaterial("OffscreenMask");
}
return _offscreenMask;
}
}
/// <summary>
/// <see cref="OffscreenMaskCulling"/>'s backing field.
/// </summary>
private static Material _offscreenMaskCulling;
/// <summary>
/// Unlit mask material for BlendMode.
/// </summary>
public static Material OffscreenMaskCulling
{
get
{
if (_offscreenMaskCulling == null)
{
_offscreenMaskCulling = LoadBlendModeMaterial("OffscreenMaskCulling");
}
return _offscreenMaskCulling;
}
}
/// <summary>
/// <see cref="TransparentPicking"/>'s backing field.
/// </summary>
private static Material _transparentPicking;
/// <summary>
/// Transparent material for Scene View picking.
/// </summary>
public static Material TransparentPicking
{
get
{
if (_transparentPicking == null)
{
_transparentPicking = LoadTransparentPickingMaterial();
}
return _transparentPicking;
}
}
/// <summary>
/// Returns a material for the given BlendMode.
/// </summary>
/// <param name="materialName">Name</param>
/// <param name="colorBlend">ColorBlend type</param>
/// <param name="alphaBlend">AlphaBlend type</param>
/// <param name="masked">Is masked?</param>
/// <param name="inverted">Is using invert mask?</param>
/// <param name="isDoubleSided">Is double-sided rendering?</param>
/// <returns></returns>
public static Material GetBlendModeMaterial(string materialName, BlendTypes.ColorBlend colorBlend, BlendTypes.AlphaBlend alphaBlend, bool masked, bool inverted, bool isDoubleSided)
{
var maskedString = masked ? "Masked" : "";
var invertedString = masked && inverted ? "Invert" : "";
var cullingString = isDoubleSided ? "" : "Culling";
switch (colorBlend)
{
case BlendTypes.ColorBlend.Add:
case BlendTypes.ColorBlend.Multiply:
materialName += $"{invertedString}{maskedString}{colorBlend}{cullingString}";
break;
default:
materialName += $"{invertedString}{maskedString}{colorBlend}{alphaBlend}{cullingString}";
break;
}
return LoadBlendModeMaterial(materialName);
}
#region Helper Methods
/// <summary>
/// Resource directory of builtin <see cref="Material"/>s.
/// </summary>
private const string ResourcesDirectory = "Live2D/Cubism/Materials";
/// <summary>
/// Loads an mask material.
/// </summary>
/// <returns>The material.</returns>
private static Material LoadMaskMaterial()
{
return Resources.Load<Material>(ResourcesDirectory + "/Mask");
}
/// <summary>
/// Loads an mask culling material.
/// </summary>
/// <returns>The material.</returns>
private static Material LoadMaskCullingMaterial()
{
return Resources.Load<Material>(ResourcesDirectory + "/MaskCulling");
}
/// <summary>
/// Loads a material for BlendMode.
/// </summary>
/// <param name="name">Material's name</param>
/// <returns>Material</returns>
private static Material LoadBlendModeMaterial(string name)
{
var material = Resources.Load<Material>(ResourcesDirectory + "/BlendMode/" + name);
if (material == null)
{
Debug.LogError($"Could not load material '{name}'");
}
return material;
}
/// <summary>
/// Loads a material for picking.
/// </summary>
private static Material LoadTransparentPickingMaterial()
{
return Resources.Load<Material>(ResourcesDirectory + "/TransparentPicking");
}
#endregion
}
}