private static IEnumerable <(SubAssetKey, TextureDescriptor)> EnumerateAllTextures(GltfData data, glTF_VRM_extensions vrm) { // Materials for (var materialIdx = 0; materialIdx < data.GLTF.materials.Count; ++materialIdx) { var material = data.GLTF.materials[materialIdx]; var vrmMaterial = vrm.materialProperties[materialIdx]; if (vrmMaterial.shader == VRM.glTF_VRM_Material.VRM_USE_GLTFSHADER) { // Unlit or PBR foreach (var kv in GltfPbrTextureImporter.EnumerateAllTextures(data, materialIdx)) { yield return(kv); } } else { // MToon など任意の shader foreach (var kv in VRMMToonTextureImporter.EnumerateAllTextures(data, vrm, materialIdx)) { yield return(kv); } } } // Thumbnail if (TryGetThumbnailTexture(data, vrm, out var thumbnail)) { yield return(thumbnail); } }
public static bool TryCreateParam(GltfData data, glTF_VRM_extensions vrm, int materialIdx, out MaterialDescriptor matDesc) { if (vrm?.materialProperties == null || vrm.materialProperties.Count == 0) { matDesc = default; return(false); } if (materialIdx < 0 || materialIdx >= vrm.materialProperties.Count) { matDesc = default; return(false); } var vrmMaterial = vrm.materialProperties[materialIdx]; if (vrmMaterial.shader == glTF_VRM_Material.VRM_USE_GLTFSHADER) { // fallback to gltf matDesc = default; return(false); } // // restore VRM material // // use material.name, because material name may renamed in GltfParser. var name = data.GLTF.materials[materialIdx].name; var textureSlots = new Dictionary <string, TextureDescriptor>(); var floatValues = new Dictionary <string, float>(); var colors = new Dictionary <string, Color>(); var vectors = new Dictionary <string, Vector4>(); var actions = new List <Action <Material> >(); matDesc = new MaterialDescriptor( name, vrmMaterial.shader, vrmMaterial.renderQueue, textureSlots, floatValues, colors, vectors, actions); foreach (var kv in vrmMaterial.floatProperties) { floatValues.Add(kv.Key, kv.Value); } foreach (var kv in vrmMaterial.vectorProperties) { // vector4 exclude TextureOffsetScale if (vrmMaterial.textureProperties.ContainsKey(kv.Key)) { continue; } var v = new Vector4(kv.Value[0], kv.Value[1], kv.Value[2], kv.Value[3]); vectors.Add(kv.Key, v); } foreach (var kv in vrmMaterial.textureProperties) { if (VRMMToonTextureImporter.TryGetTextureFromMaterialProperty(data, vrmMaterial, kv.Key, out var texture)) { textureSlots.Add(kv.Key, texture.Item2); } } foreach (var kv in vrmMaterial.keywordMap) { if (kv.Value) { actions.Add(material => material.EnableKeyword(kv.Key)); } else { actions.Add(material => material.DisableKeyword(kv.Key)); } } foreach (var kv in vrmMaterial.tagMap) { actions.Add(material => material.SetOverrideTag(kv.Key, kv.Value)); } if (vrmMaterial.shader == MToon.Utils.ShaderName) { // TODO: Material拡張にMToonの項目が追加されたら旧バージョンのshaderPropから変換をかける // インポート時にUniVRMに含まれるMToonのバージョンに上書きする floatValues[MToon.Utils.PropVersion] = MToon.Utils.VersionNumber; } return(true); }
public static bool TryCreateParam(GltfData data, glTF_VRM_extensions vrm, int materialIdx, out MaterialDescriptor matDesc) { if (vrm?.materialProperties == null || vrm.materialProperties.Count == 0) { matDesc = default; return(false); } if (materialIdx < 0 || materialIdx >= vrm.materialProperties.Count) { matDesc = default; return(false); } var vrmMaterial = vrm.materialProperties[materialIdx]; if (vrmMaterial.shader != UnlitTransparentZWriteShaderName) { matDesc = default; return(false); } // use material.name, because material name may renamed in GltfParser. var name = data.GLTF.materials[materialIdx].name; var textureSlots = new Dictionary <string, TextureDescriptor>(); var floatValues = new Dictionary <string, float>(); var colors = new Dictionary <string, Color>(); var vectors = new Dictionary <string, Vector4>(); var actions = new Collection <Action <Material> >(); if (vrmMaterial.textureProperties.ContainsKey(UnlitTransparentZWriteMainTexturePropName)) { if (VRMMToonTextureImporter.TryGetTextureFromMaterialProperty(data, vrmMaterial, UnlitTransparentZWriteMainTexturePropName, out var texture)) { textureSlots.Add(MToon.Utils.PropMainTex, texture.Item2); } } actions.Add(unityMaterial => { var mainTexture = (Texture2D)unityMaterial.GetTexture(MToon.Utils.PropMainTex); // NOTE: Unlit のフォールバックなので // Lit/Shade 色は黒として、Alpha のために Lit にテクスチャを設定する. // Emissive 色は白として、テクスチャを設定する. // また、元のシェーダのうちユーザが設定できるプロパティは Texture のみ. MToon.Utils.SetMToonParametersToMaterial(unityMaterial, new MToonDefinition { Meta = new MetaDefinition { Implementation = MToon.Utils.Implementation, VersionNumber = MToon.Utils.VersionNumber, }, Rendering = new RenderingDefinition { // NOTE: Transparent ZWrite RenderMode = RenderMode.TransparentWithZWrite, CullMode = CullMode.Back, RenderQueueOffsetNumber = 0, }, Color = new ColorDefinition { // NOTE: Unlit なので、RGB 値は黒とする。 // NOTE: Alpha は使うので、テクスチャを設定する. LitColor = new Color(0, 0, 0, 1), LitMultiplyTexture = mainTexture, ShadeColor = new Color(0, 0, 0, 1), ShadeMultiplyTexture = default,