/** * 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 } }