/// <summary> /// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する /// </summary> public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc) { var m = data.GLTF.materials[i]; if (!UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions, out UniGLTF.Extensions.VRMC_materials_mtoon.VRMC_materials_mtoon mtoon)) { // Fallback to glTF, when MToon extension does not exist. matDesc = default; return(false); } // use material.name, because material name may renamed in GltfParser. matDesc = new MaterialDescriptor( m.name, MToon10Meta.UnityShaderName, null, Vrm10MToonTextureImporter.EnumerateAllTextures(data, m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.Item2.Item2), TryGetAllFloats(m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.value), TryGetAllColors(m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.value), TryGetAllFloatArrays(m, mtoon).ToDictionary(tuple => tuple.key, tuple => tuple.value), new Action <Material>[] { material => { // Set hidden properties, keywords from float properties. new MToonValidator(material).Validate(); } }); return(true); }
/// <summary> /// glTF 全体で使うテクスチャーを列挙する /// </summary> private static IEnumerable <(SubAssetKey, TextureDescriptor)> EnumerateAllTextures(GltfData data) { if (!UniGLTF.Extensions.VRMC_vrm.GltfDeserializer.TryGet(data.GLTF.extensions, out UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm)) { throw new System.Exception("not vrm"); } // Textures referenced by Materials. for (var materialIdx = 0; materialIdx < data.GLTF.materials.Count; ++materialIdx) { var m = data.GLTF.materials[materialIdx]; if (UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions, out var mToon)) { foreach (var(_, tex) in Vrm10MToonTextureImporter.EnumerateAllTextures(data, m, mToon)) { yield return(tex); } } else { // Fallback to glTF PBR & glTF Unlit foreach (var tex in GltfPbrTextureImporter.EnumerateAllTextures(data, materialIdx)) { yield return(tex); } } } // Thumbnail Texture referenced by VRM Meta. if (TryGetMetaThumbnailTextureImportParam(data, vrm, out (SubAssetKey key, TextureDescriptor)thumbnail)) { yield return(thumbnail); } }
/// <summary> /// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する /// </summary> public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc) { var m = data.GLTF.materials[i]; if (!UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions, out UniGLTF.Extensions.VRMC_materials_mtoon.VRMC_materials_mtoon mtoon)) { // Fallback to glTF, when MToon extension does not exist. matDesc = default; return(false); } // use material.name, because material name may renamed in GltfParser. matDesc = new MaterialDescriptor(m.name, MToon10Meta.UnityShaderName); foreach (var(key, (subAssetKey, value)) in Vrm10MToonTextureImporter.EnumerateAllTextures(data, m, mtoon)) { matDesc.TextureSlots.Add(key, value); } foreach (var(key, value) in TryGetAllColors(m, mtoon)) { matDesc.Colors.Add(key, value); } foreach (var(key, value) in TryGetAllFloats(m, mtoon)) { matDesc.FloatValues.Add(key, value); } foreach (var(key, value) in TryGetAllFloatArrays(m, mtoon)) { matDesc.Vectors.Add(key, value); } matDesc.Actions.Add(material => { // Set hidden properties, keywords from float properties. new MToonValidator(material).Validate(); }); return(true); }