summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/VRM/VRMShaders/UniUnlit/Scripts/Utils.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/VRM/VRMShaders/UniUnlit/Scripts/Utils.cs')
-rw-r--r--Assets/ThirdParty/VRM/VRMShaders/UniUnlit/Scripts/Utils.cs153
1 files changed, 153 insertions, 0 deletions
diff --git a/Assets/ThirdParty/VRM/VRMShaders/UniUnlit/Scripts/Utils.cs b/Assets/ThirdParty/VRM/VRMShaders/UniUnlit/Scripts/Utils.cs
new file mode 100644
index 00000000..74c47405
--- /dev/null
+++ b/Assets/ThirdParty/VRM/VRMShaders/UniUnlit/Scripts/Utils.cs
@@ -0,0 +1,153 @@
+using System;
+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 ShaderName = "UniGLTF/UniUnlit";
+ 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";
+ [Obsolete("Use PropNameVColBlendMode")]
+ public const string PropeNameVColBlendMode = PropNameVColBlendMode;
+ public const string PropNameVColBlendMode = "_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 void SetVColBlendMode(Material material, UniUnlitVertexColorBlendOp mode)
+ {
+ material.SetInt(PropNameVColBlendMode, (int)mode);
+ }
+
+ public static UniUnlitRenderMode GetRenderMode(Material material)
+ {
+ return (UniUnlitRenderMode)material.GetInt(PropNameBlendMode);
+ }
+
+ public static UniUnlitCullMode GetCullMode(Material material)
+ {
+ return (UniUnlitCullMode)material.GetInt(PropNameCullMode);
+ }
+
+ public static UniUnlitVertexColorBlendOp GetVColBlendMode(Material material)
+ {
+ return (UniUnlitVertexColorBlendOp)material.GetInt(PropNameVColBlendMode);
+ }
+
+ /// <summary>
+ /// Validate target material's UniUnlitRenderMode, UniUnlitVertexColorBlendOp.
+ /// Set appropriate hidden properties & keywords.
+ /// This will change RenderQueue independent to UniUnlitRenderMode if isRenderModeChangedByUser is true.
+ /// </summary>
+ /// <param name="material">Target material</param>
+ /// <param name="isRenderModeChangedByUser">Is changed by user</param>
+ public static void ValidateProperties(Material material, bool isRenderModeChangedByUser = false)
+ {
+ SetupBlendMode(material, (UniUnlitRenderMode)material.GetFloat(PropNameBlendMode),
+ isRenderModeChangedByUser);
+ SetupVertexColorBlendOp(material, (UniUnlitVertexColorBlendOp)material.GetFloat(PropNameVColBlendMode));
+ }
+
+ 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);
+ }
+ }
+} \ No newline at end of file