public static IEnumerable <TextureExportItem> GetTextures(Material m) { var props = PreShaderPropExporter.GetPropsForSupportedShader(m.shader.name); if (props == null) { yield return(new TextureExportItem(m.mainTexture, glTFTextureTypes.BaseColor)); } foreach (var prop in props.Properties) { if (prop.ShaderPropertyType == ShaderPropertyType.TexEnv) { yield return(new TextureExportItem(m.GetTexture(prop.Key), GetglTFTextureType(m.shader.name, prop.Key))); } } }
public static glTF_VRM_Material CreateFromMaterial(Material m, List <Texture> textures) { var material = new glTF_VRM_Material { name = m.name, shader = m.shader.name, renderQueue = m.renderQueue, }; if (!PreShaderPropExporter.VRMExtensionShaders.Contains(m.shader.name)) { material.shader = glTF_VRM_Material.VRM_USE_GLTFSHADER; return(material); } var prop = PreShaderPropExporter.GetPropsForSupportedShader(m.shader.name); if (prop == null) { Debug.LogWarningFormat("Fail to export shader: {0}", m.shader.name); } else { foreach (var keyword in m.shaderKeywords) { material.keywordMap.Add(keyword, m.IsKeywordEnabled(keyword)); } // get properties //material.SetProp(prop); foreach (var kv in prop.Properties) { switch (kv.ShaderPropertyType) { case ShaderPropertyType.Color: { var value = m.GetColor(kv.Key).ToArray(); material.vectorProperties.Add(kv.Key, value); } break; case ShaderPropertyType.Range: case ShaderPropertyType.Float: { var value = m.GetFloat(kv.Key); material.floatProperties.Add(kv.Key, value); } break; case 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 ShaderPropertyType.Vector: { var value = m.GetVector(kv.Key).ToArray(); material.vectorProperties.Add(kv.Key, value); } break; default: throw new NotImplementedException(); } } } foreach (var tag in TAGS) { var value = m.GetTag(tag, false); if (!String.IsNullOrEmpty(value)) { material.tagMap.Add(tag, value); } } return(material); }
public static glTF_VRM_Material CreateFromMaterial(Material m, ITextureExporter textureExporter) { var material = new glTF_VRM_Material { name = m.name, shader = m.shader.name, renderQueue = m.renderQueue, }; if (m.shader.name != MToon.Utils.ShaderName) { material.shader = glTF_VRM_Material.VRM_USE_GLTFSHADER; return(material); } var prop = PreShaderPropExporter.GetPropsForMToon(); if (prop == null) { throw new Exception("arienai"); } else { foreach (var keyword in m.shaderKeywords) { material.keywordMap.Add(keyword, m.IsKeywordEnabled(keyword)); } // get properties //material.SetProp(prop); foreach (var kv in prop.Properties) { switch (kv.ShaderPropertyType) { case ShaderPropertyType.Color: { // No color conversion. Because color property is serialized to raw float array. var value = m.GetColor(kv.Key).ToFloat4(ColorSpace.Linear, ColorSpace.Linear); material.vectorProperties.Add(kv.Key, value); } break; case ShaderPropertyType.Range: case ShaderPropertyType.Float: { var value = m.GetFloat(kv.Key); material.floatProperties.Add(kv.Key, value); } break; case ShaderPropertyType.TexEnv: { var texture = m.GetTexture(kv.Key); if (texture != null) { var value = -1; var isNormalMap = kv.Key == "_BumpMap"; if (isNormalMap) { value = textureExporter.RegisterExportingAsNormal(texture); } else { var needsAlpha = kv.Key == "_MainTex"; value = textureExporter.RegisterExportingAsSRgb(texture, needsAlpha); } 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 ShaderPropertyType.Vector: { var value = m.GetVector(kv.Key).ToArray(); material.vectorProperties.Add(kv.Key, value); } break; default: throw new NotImplementedException(); } } } foreach (var tag in TAGS) { var value = m.GetTag(tag, false); if (!String.IsNullOrEmpty(value)) { material.tagMap.Add(tag, value); } } return(material); }