using UnityEngine; using UnityEngine.Rendering; namespace UniGLTF.UniUnlit { public enum UniUnlitRenderMode { Opaque = 0, Cutout = 1, Transparent = 2, } public enum UniUnlitCullMode { Off = 0, // Front = 1, Back = 2, } public enum UniUnlitVertexColorBlendOp { None = 0, Multiply = 1, } public static class Utils { public const string PropNameMainTex = "_MainTex"; public const string PropNameColor = "_Color"; public const string PropNameCutoff = "_Cutoff"; public const string PropNameBlendMode = "_BlendMode"; public const string PropNameCullMode = "_CullMode"; public const string PropeNameVColBlendMode = "_VColBlendMode"; public const string PropNameSrcBlend = "_SrcBlend"; public const string PropNameDstBlend = "_DstBlend"; public const string PropNameZWrite = "_ZWrite"; public const string PropNameStandardShadersRenderMode = "_Mode"; public const string KeywordAlphaTestOn = "_ALPHATEST_ON"; public const string KeywordAlphaBlendOn = "_ALPHABLEND_ON"; public const string KeywordVertexColMul = "_VERTEXCOL_MUL"; public const string TagRenderTypeKey = "RenderType"; public const string TagRenderTypeValueOpaque = "Opaque"; public const string TagRenderTypeValueTransparentCutout = "TransparentCutout"; public const string TagRenderTypeValueTransparent = "Transparent"; public static void SetRenderMode(Material material, UniUnlitRenderMode mode) { material.SetInt(PropNameBlendMode, (int)mode); } public static void SetCullMode(Material material, UniUnlitCullMode mode) { material.SetInt(PropNameCullMode, (int) mode); } public static UniUnlitRenderMode GetRenderMode(Material material) { return (UniUnlitRenderMode)material.GetInt(PropNameBlendMode); } public static UniUnlitCullMode GetCullMode(Material material) { return (UniUnlitCullMode)material.GetInt(PropNameCullMode); } /// /// Validate target material's UniUnlitRenderMode, UniUnlitVertexColorBlendOp. /// Set appropriate hidden properites & keywords. /// This will change RenderQueue independent to UniUnlitRenderMode if isRenderModeChagedByUser is true. /// /// Target material /// Is changed by user public static void ValidateProperties(Material material, bool isRenderModeChangedByUser = false) { SetupBlendMode(material, (UniUnlitRenderMode)material.GetFloat(PropNameBlendMode), isRenderModeChangedByUser); SetupVertexColorBlendOp(material, (UniUnlitVertexColorBlendOp)material.GetFloat(PropeNameVColBlendMode)); } private static void SetupBlendMode(Material material, UniUnlitRenderMode renderMode, bool isRenderModeChangedByUser = false) { switch (renderMode) { case UniUnlitRenderMode.Opaque: material.SetOverrideTag(TagRenderTypeKey, TagRenderTypeValueOpaque); material.SetInt(PropNameSrcBlend, (int)BlendMode.One); material.SetInt(PropNameDstBlend, (int)BlendMode.Zero); material.SetInt(PropNameZWrite, 1); SetKeyword(material, KeywordAlphaTestOn, false); SetKeyword(material, KeywordAlphaBlendOn, false); if (isRenderModeChangedByUser) material.renderQueue = -1; break; case UniUnlitRenderMode.Cutout: material.SetOverrideTag(TagRenderTypeKey, TagRenderTypeValueTransparentCutout); material.SetInt(PropNameSrcBlend, (int)BlendMode.One); material.SetInt(PropNameDstBlend, (int)BlendMode.Zero); material.SetInt(PropNameZWrite, 1); SetKeyword(material, KeywordAlphaTestOn, true); SetKeyword(material, KeywordAlphaBlendOn, false); if (isRenderModeChangedByUser) material.renderQueue = (int)RenderQueue.AlphaTest; break; case UniUnlitRenderMode.Transparent: material.SetOverrideTag(TagRenderTypeKey, TagRenderTypeValueTransparent); material.SetInt(PropNameSrcBlend, (int)BlendMode.SrcAlpha); material.SetInt(PropNameDstBlend, (int)BlendMode.OneMinusSrcAlpha); material.SetInt(PropNameZWrite, 0); SetKeyword(material, KeywordAlphaTestOn, false); SetKeyword(material, KeywordAlphaBlendOn, true); if (isRenderModeChangedByUser) material.renderQueue = (int)RenderQueue.Transparent; break; } } private static void SetupVertexColorBlendOp(Material material, UniUnlitVertexColorBlendOp vColBlendOp) { switch (vColBlendOp) { case UniUnlitVertexColorBlendOp.None: SetKeyword(material, KeywordVertexColMul, false); break; case UniUnlitVertexColorBlendOp.Multiply: SetKeyword(material, KeywordVertexColMul, true); break; } } private static void SetKeyword(Material mat, string keyword, bool required) { if (required) mat.EnableKeyword(keyword); else mat.DisableKeyword(keyword); } } }