/**
* 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
{
///
/// Default materials.
///
public static class CubismBuiltinMaterials
{
///
/// Default mask material.
///
public static Material Mask
{
get { return LoadMaskMaterial(); }
}
///
/// Default culled mask material.
///
public static Material MaskCulling
{
get { return LoadMaskCullingMaterial(); }
}
///
/// Unlit blit material for BlendMode.
///
public static Material UnlitBlit
{
get
{
return LoadBlendModeMaterial("UnlitBlit");
}
}
///
/// 's backing field.
///
private static Material _offscreenMask;
///
/// Unlit mask material for BlendMode.
///
public static Material OffscreenMask
{
get
{
if (_offscreenMask == null)
{
_offscreenMask = LoadBlendModeMaterial("OffscreenMask");
}
return _offscreenMask;
}
}
///
/// 's backing field.
///
private static Material _offscreenMaskCulling;
///
/// Unlit mask material for BlendMode.
///
public static Material OffscreenMaskCulling
{
get
{
if (_offscreenMaskCulling == null)
{
_offscreenMaskCulling = LoadBlendModeMaterial("OffscreenMaskCulling");
}
return _offscreenMaskCulling;
}
}
///
/// 's backing field.
///
private static Material _transparentPicking;
///
/// Transparent material for Scene View picking.
///
public static Material TransparentPicking
{
get
{
if (_transparentPicking == null)
{
_transparentPicking = LoadTransparentPickingMaterial();
}
return _transparentPicking;
}
}
///
/// Returns a material for the given BlendMode.
///
/// Name
/// ColorBlend type
/// AlphaBlend type
/// Is masked?
/// Is using invert mask?
/// Is double-sided rendering?
///
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
///
/// Resource directory of builtin s.
///
private const string ResourcesDirectory = "Live2D/Cubism/Materials";
///
/// Loads an mask material.
///
/// The material.
private static Material LoadMaskMaterial()
{
return Resources.Load(ResourcesDirectory + "/Mask");
}
///
/// Loads an mask culling material.
///
/// The material.
private static Material LoadMaskCullingMaterial()
{
return Resources.Load(ResourcesDirectory + "/MaskCulling");
}
///
/// Loads a material for BlendMode.
///
/// Material's name
/// Material
private static Material LoadBlendModeMaterial(string name)
{
var material = Resources.Load(ResourcesDirectory + "/BlendMode/" + name);
if (material == null)
{
Debug.LogError($"Could not load material '{name}'");
}
return material;
}
///
/// Loads a material for picking.
///
private static Material LoadTransparentPickingMaterial()
{
return Resources.Load(ResourcesDirectory + "/TransparentPicking");
}
#endregion
}
}