From e7ea49f89da770a578702f69db926897785037b5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 31 Jul 2018 22:04:01 +0900 Subject: [PATCH] Added VRMPreShaderPropExporter --- Scripts/Format/glTF_VRM_Material.cs | 147 ++++++++------- Scripts/PreExportShaderProps.meta | 9 + .../VRMPreShaderPropExporter.cs | 167 ++++++++++++++++++ .../VRMPreShaderPropExporter.cs.meta | 12 ++ Scripts/PreExportShaderProps/VRM_MToon.cs | 55 ++++++ .../PreExportShaderProps/VRM_MToon.cs.meta | 12 ++ .../PreExportShaderProps/VRM_UnlitCutout.cs | 27 +++ .../VRM_UnlitCutout.cs.meta | 12 ++ .../PreExportShaderProps/VRM_UnlitTexture.cs | 26 +++ .../VRM_UnlitTexture.cs.meta | 12 ++ .../VRM_UnlitTransparent.cs | 26 +++ .../VRM_UnlitTransparent.cs.meta | 12 ++ .../VRM_UnlitTransparentZWrite.cs | 26 +++ .../VRM_UnlitTransparentZWrite.cs.meta | 12 ++ 14 files changed, 487 insertions(+), 68 deletions(-) create mode 100644 Scripts/PreExportShaderProps.meta create mode 100644 Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs create mode 100644 Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs.meta create mode 100644 Scripts/PreExportShaderProps/VRM_MToon.cs create mode 100644 Scripts/PreExportShaderProps/VRM_MToon.cs.meta create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitCutout.cs create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitCutout.cs.meta create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitTexture.cs create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitTexture.cs.meta create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs.meta create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs create mode 100644 Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs.meta diff --git a/Scripts/Format/glTF_VRM_Material.cs b/Scripts/Format/glTF_VRM_Material.cs index 3964695af..de1cc87b2 100644 --- a/Scripts/Format/glTF_VRM_Material.cs +++ b/Scripts/Format/glTF_VRM_Material.cs @@ -4,19 +4,16 @@ using System.Linq; using UniGLTF; using UnityEngine; using UniJSON; -#if UNITY_EDITOR -using UnityEditor; -#endif namespace VRM { [Serializable] - public class glTF_VRM_Material : UniGLTF.JsonSerializableBase + public class glTF_VRM_Material : JsonSerializableBase { public string name; public string shader; - public int renderQueue=-1; + public int renderQueue = -1; public Dictionary floatProperties = new Dictionary(); public Dictionary vectorProperties = new Dictionary(); @@ -60,7 +57,7 @@ namespace VRM } { f.Key("keywordMap"); f.BeginMap(); - foreach(var kv in keywordMap) + foreach (var kv in keywordMap) { f.Key(kv.Key); f.Value(kv.Value); } @@ -78,12 +75,12 @@ namespace VRM public static List Parse(string src) { - var json = UniJSON.JsonParser.Parse(src)["extensions"]["VRM"]["materialProperties"]; + var json = UniJSON.JsonParser.Parse(src)["extensions"]["VRM"]["materialProperties"]; var materials = json.DeserializeList(); var jsonItems = json.ArrayItems.ToArray(); - for(int i=0; i x.Key, x => x.Value.Value.GetSingle()); materials[i].vectorProperties = jsonItems[i]["vectorProperties"].ObjectItems.ToDictionary(x => x.Key, x => @@ -109,73 +106,87 @@ namespace VRM renderQueue = m.renderQueue, }; -#if UNITY_EDITOR - for (int i = 0; i < ShaderUtil.GetPropertyCount(m.shader); ++i) + var prop = VRMPreShaderPropExporter.GetPropsForSupportedShader(m.shader.name); + if (prop == null) { - var name = ShaderUtil.GetPropertyName(m.shader, i); - var propType = ShaderUtil.GetPropertyType(m.shader, i); - switch (propType) - { - case ShaderUtil.ShaderPropertyType.Color: - { - var value = m.GetColor(name).ToArray(); - material.vectorProperties.Add(name, value); - } - break; - - case ShaderUtil.ShaderPropertyType.Range: - case ShaderUtil.ShaderPropertyType.Float: - { - var value = m.GetFloat(name); - material.floatProperties.Add(name, value); - } - break; - - case ShaderUtil.ShaderPropertyType.TexEnv: - { - var texture = m.GetTexture(name); - if (texture != null) - { - var value = textures.IndexOf(texture); - if (value == -1) - { - Debug.LogFormat("not found {0}", texture.name); - } - else - { - material.textureProperties.Add(name, value); - } - } - - // offset & scaling - var offset = m.GetTextureOffset(name); - var scaling = m.GetTextureScale(name); - material.vectorProperties.Add(name, - new float[] { offset.x, offset.y, scaling.x, scaling.y }); - } - break; - - case ShaderUtil.ShaderPropertyType.Vector: - { - var value = m.GetVector(name).ToArray(); - material.vectorProperties.Add(name, value); - } - break; - - default: - throw new NotImplementedException(); - } - } -#else - Debug.LogWarning("cannot export material properties on runtime"); +#if UNITY_EDITOR + // fallback + Debug.LogWarningFormat("Unsupported shader: {0}", m.shader.name); + prop = VRMPreShaderPropExporter.ShaderProps.FromShader(m.shader); #endif + } + + if (prop == null) + { + Debug.LogWarningFormat("Fail to export shader: {0}", m.shader.name); + } + else + { + // get properties + //material.SetProp(prop); + foreach (var kv in prop.Properties) + { + switch (kv.Value) + { + case VRMPreShaderPropExporter.ShaderPropertyType.Color: + { + var value = m.GetColor(kv.Key).ToArray(); + material.vectorProperties.Add(kv.Key, value); + } + break; + + case VRMPreShaderPropExporter.ShaderPropertyType.Range: + case VRMPreShaderPropExporter.ShaderPropertyType.Float: + { + var value = m.GetFloat(kv.Key); + material.floatProperties.Add(kv.Key, value); + } + break; + + case VRMPreShaderPropExporter.ShaderPropertyType.TexEnv: + { + var texture = m.GetTexture(kv.Key); + if (texture != null) + { + var value = textures.IndexOf(texture); + if (value == -1) + { + Debug.LogFormat("not found {0}", texture.name); + } + else + { + material.textureProperties.Add(kv.Key, value); + } + } + + // offset & scaling + var offset = m.GetTextureOffset(kv.Key); + var scaling = m.GetTextureScale(kv.Key); + material.vectorProperties.Add(kv.Key, + new float[] { offset.x, offset.y, scaling.x, scaling.y }); + } + break; + + case VRMPreShaderPropExporter.ShaderPropertyType.Vector: + { + var value = m.GetVector(kv.Key).ToArray(); + material.vectorProperties.Add(kv.Key, value); + } + break; + + default: + throw new NotImplementedException(); + } + } + + } foreach (var keyword in m.shaderKeywords) { material.keywordMap.Add(keyword, m.IsKeywordEnabled(keyword)); } - foreach(var tag in TAGS) + foreach (var tag in TAGS) { var value = m.GetTag(tag, false); if (!String.IsNullOrEmpty(value)) diff --git a/Scripts/PreExportShaderProps.meta b/Scripts/PreExportShaderProps.meta new file mode 100644 index 000000000..c49cf8b4c --- /dev/null +++ b/Scripts/PreExportShaderProps.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3fa98374d2ce76443981cc61ab80e6ce +folderAsset: yes +timeCreated: 1533035745 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs b/Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs new file mode 100644 index 000000000..a0e5390de --- /dev/null +++ b/Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using UniGLTF; +using UnityEditor; +using UnityEngine; + + +namespace VRM +{ + public class VRMPreExportShaderAttribute : Attribute { } + + public static partial class VRMPreShaderPropExporter + { + public static string[] SupportedShaders = new string[] + { + "VRM/MToon", + "VRM/UnlitTexture", + "VRM/UnlitCutout", + "VRM/UnlitTransparent", + "VRM/UnlitTransparentZWrite", + }; + +#if UNITY_EDITOR + [MenuItem(VRMVersion.VRM_VERSION + "/PreExport ShaderProps")] + static void PreExport() + { + foreach (var shaderName in SupportedShaders) + { + var shader = Shader.Find(shaderName); + PreExport(shader); + } + } + + static string EscapeShaderName(string name) + { + return name.Replace("/", "_").Replace(" ", "_"); + } + + const string EXPORT_DIR = "Assets/VRM/Scripts/PreExportShaderProps/"; + static void PreExport(Shader shader) + { + var path = UnityPath.FromUnityPath(EXPORT_DIR + EscapeShaderName(shader.name) + ".cs"); + Debug.LogFormat("PreExport: {0}", path.FullPath); + + var props = ShaderProps.FromShader(shader); + + File.WriteAllText(path.FullPath, props.ToString(shader.name)); + } +#endif + + public enum ShaderPropertyType + { + TexEnv, + Color, + Range, + Float, + Vector, + } + + public class ShaderProps + { + public KeyValuePair[] Properties; + +#if UNITY_EDITOR + static ShaderPropertyType ConvType(ShaderUtil.ShaderPropertyType src) + { + switch (src) + { + case ShaderUtil.ShaderPropertyType.TexEnv: return ShaderPropertyType.TexEnv; + case ShaderUtil.ShaderPropertyType.Color: return ShaderPropertyType.Color; + case ShaderUtil.ShaderPropertyType.Float: return ShaderPropertyType.Float; + case ShaderUtil.ShaderPropertyType.Range: return ShaderPropertyType.Range; + case ShaderUtil.ShaderPropertyType.Vector: return ShaderPropertyType.Vector; + default: throw new NotImplementedException(); + } + } + + public static ShaderProps FromShader(Shader shader) + { + var properties = new List>(); + for (int i = 0; i < ShaderUtil.GetPropertyCount(shader); ++i) + { + var name = ShaderUtil.GetPropertyName(shader, i); + var propType = ShaderUtil.GetPropertyType(shader, i); + properties.Add(new KeyValuePair(name, ConvType(propType))); + } + + return new ShaderProps + { + Properties = properties.ToArray(), + }; + } + + public string ToString(string shaderName) + { + var list = new List(); + foreach(var kv in Properties) + { + list.Add(string.Format("new KeyValuePair(\"{0}\", ShaderPropertyType.{1})\r\n", kv.Key, kv.Value)); + } + + return string.Format(@"using System.Collections.Generic; + + +namespace VRM +{{ + public static partial class VRMPreShaderPropExporter + {{ + [VRMPreExportShader] + static KeyValuePair {0} + {{ + get + {{ + return new KeyValuePair( + ""{1}"", + new ShaderProps + {{ + Properties = new KeyValuePair[]{{ +{2} + }} + }} + ); + }} + }} + }} +}} +" +, EscapeShaderName(shaderName) +, shaderName +, String.Join(",", list.ToArray())); + } +#endif + } + + #region Runtime + static Dictionary m_shaderPropMap; + + public static ShaderProps GetPropsForSupportedShader(string shaderName) + { + if (m_shaderPropMap == null) + { + m_shaderPropMap = new Dictionary(); + foreach (var prop in typeof(VRMPreShaderPropExporter).GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) + { + if (prop.GetCustomAttributes(typeof(VRMPreExportShaderAttribute), true).Any()) + { + var kv = (KeyValuePair)prop.GetValue(null, null); + m_shaderPropMap.Add(kv.Key, kv.Value); + } + } + } + + ShaderProps props; + if (!m_shaderPropMap.TryGetValue(shaderName, out props)) + { + return null; + } + + return props; + } + #endregion + } +} diff --git a/Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs.meta b/Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs.meta new file mode 100644 index 000000000..431e9cca2 --- /dev/null +++ b/Scripts/PreExportShaderProps/VRMPreShaderPropExporter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 50935dd2f9f3fa445a687f30d4dd663b +timeCreated: 1533035131 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/PreExportShaderProps/VRM_MToon.cs b/Scripts/PreExportShaderProps/VRM_MToon.cs new file mode 100644 index 000000000..4bfc0f263 --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_MToon.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; + + +namespace VRM +{ + public static partial class VRMPreShaderPropExporter + { + [VRMPreExportShader] + static KeyValuePair VRM_MToon + { + get + { + return new KeyValuePair( + "VRM/MToon", + new ShaderProps + { + Properties = new KeyValuePair[]{ +new KeyValuePair("_Cutoff", ShaderPropertyType.Range) +,new KeyValuePair("_Color", ShaderPropertyType.Color) +,new KeyValuePair("_ShadeColor", ShaderPropertyType.Color) +,new KeyValuePair("_MainTex", ShaderPropertyType.TexEnv) +,new KeyValuePair("_ShadeTexture", ShaderPropertyType.TexEnv) +,new KeyValuePair("_BumpScale", ShaderPropertyType.Float) +,new KeyValuePair("_BumpMap", ShaderPropertyType.TexEnv) +,new KeyValuePair("_ReceiveShadowRate", ShaderPropertyType.Range) +,new KeyValuePair("_ReceiveShadowTexture", ShaderPropertyType.TexEnv) +,new KeyValuePair("_ShadeShift", ShaderPropertyType.Range) +,new KeyValuePair("_ShadeToony", ShaderPropertyType.Range) +,new KeyValuePair("_LightColorAttenuation", ShaderPropertyType.Range) +,new KeyValuePair("_SphereAdd", ShaderPropertyType.TexEnv) +,new KeyValuePair("_EmissionColor", ShaderPropertyType.Color) +,new KeyValuePair("_EmissionMap", ShaderPropertyType.TexEnv) +,new KeyValuePair("_OutlineWidthTexture", ShaderPropertyType.TexEnv) +,new KeyValuePair("_OutlineWidth", ShaderPropertyType.Range) +,new KeyValuePair("_OutlineScaledMaxDistance", ShaderPropertyType.Range) +,new KeyValuePair("_OutlineColor", ShaderPropertyType.Color) +,new KeyValuePair("_OutlineLightingMix", ShaderPropertyType.Range) +,new KeyValuePair("_DebugMode", ShaderPropertyType.Float) +,new KeyValuePair("_BlendMode", ShaderPropertyType.Float) +,new KeyValuePair("_OutlineWidthMode", ShaderPropertyType.Float) +,new KeyValuePair("_OutlineColorMode", ShaderPropertyType.Float) +,new KeyValuePair("_CullMode", ShaderPropertyType.Float) +,new KeyValuePair("_OutlineCullMode", ShaderPropertyType.Float) +,new KeyValuePair("_SrcBlend", ShaderPropertyType.Float) +,new KeyValuePair("_DstBlend", ShaderPropertyType.Float) +,new KeyValuePair("_ZWrite", ShaderPropertyType.Float) +,new KeyValuePair("_IsFirstSetup", ShaderPropertyType.Float) + + } + } + ); + } + } + } +} diff --git a/Scripts/PreExportShaderProps/VRM_MToon.cs.meta b/Scripts/PreExportShaderProps/VRM_MToon.cs.meta new file mode 100644 index 000000000..fd900fccd --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_MToon.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4629d794c8969c141a4724e182af082e +timeCreated: 1533041756 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/PreExportShaderProps/VRM_UnlitCutout.cs b/Scripts/PreExportShaderProps/VRM_UnlitCutout.cs new file mode 100644 index 000000000..dedfa93bf --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitCutout.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + + +namespace VRM +{ + public static partial class VRMPreShaderPropExporter + { + [VRMPreExportShader] + static KeyValuePair VRM_UnlitCutout + { + get + { + return new KeyValuePair( + "VRM/UnlitCutout", + new ShaderProps + { + Properties = new KeyValuePair[]{ +new KeyValuePair("_MainTex", ShaderPropertyType.TexEnv) +,new KeyValuePair("_Cutoff", ShaderPropertyType.Range) + + } + } + ); + } + } + } +} diff --git a/Scripts/PreExportShaderProps/VRM_UnlitCutout.cs.meta b/Scripts/PreExportShaderProps/VRM_UnlitCutout.cs.meta new file mode 100644 index 000000000..e8189be1c --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitCutout.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 611b546ea471ad34cb7d94740c63b558 +timeCreated: 1533041756 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/PreExportShaderProps/VRM_UnlitTexture.cs b/Scripts/PreExportShaderProps/VRM_UnlitTexture.cs new file mode 100644 index 000000000..b5ba277e6 --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitTexture.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + + +namespace VRM +{ + public static partial class VRMPreShaderPropExporter + { + [VRMPreExportShader] + static KeyValuePair VRM_UnlitTexture + { + get + { + return new KeyValuePair( + "VRM/UnlitTexture", + new ShaderProps + { + Properties = new KeyValuePair[]{ +new KeyValuePair("_MainTex", ShaderPropertyType.TexEnv) + + } + } + ); + } + } + } +} diff --git a/Scripts/PreExportShaderProps/VRM_UnlitTexture.cs.meta b/Scripts/PreExportShaderProps/VRM_UnlitTexture.cs.meta new file mode 100644 index 000000000..66b977400 --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitTexture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 22a8083880389b3498f421e6a5c340d5 +timeCreated: 1533041756 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs b/Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs new file mode 100644 index 000000000..ef5d8fe7a --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + + +namespace VRM +{ + public static partial class VRMPreShaderPropExporter + { + [VRMPreExportShader] + static KeyValuePair VRM_UnlitTransparent + { + get + { + return new KeyValuePair( + "VRM/UnlitTransparent", + new ShaderProps + { + Properties = new KeyValuePair[]{ +new KeyValuePair("_MainTex", ShaderPropertyType.TexEnv) + + } + } + ); + } + } + } +} diff --git a/Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs.meta b/Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs.meta new file mode 100644 index 000000000..c86b4cc0f --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitTransparent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 140d6538826e0eb448929d3e4bb2f1cd +timeCreated: 1533041756 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs b/Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs new file mode 100644 index 000000000..68dcd5f7d --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + + +namespace VRM +{ + public static partial class VRMPreShaderPropExporter + { + [VRMPreExportShader] + static KeyValuePair VRM_UnlitTransparentZWrite + { + get + { + return new KeyValuePair( + "VRM/UnlitTransparentZWrite", + new ShaderProps + { + Properties = new KeyValuePair[]{ +new KeyValuePair("_MainTex", ShaderPropertyType.TexEnv) + + } + } + ); + } + } + } +} diff --git a/Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs.meta b/Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs.meta new file mode 100644 index 000000000..559b57d77 --- /dev/null +++ b/Scripts/PreExportShaderProps/VRM_UnlitTransparentZWrite.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 165ec79b7aac1564a850fb3d3d19396e +timeCreated: 1533041756 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: