diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialImporterParamExtensions.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialImporterParamExtensions.cs new file mode 100644 index 000000000..7a0711156 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialImporterParamExtensions.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using UnityEngine; +using VRMShaders; + +namespace UniGLTF +{ + public static class MaterialImporterParamExtensions + { + public static IEnumerable<(SubAssetKey, TextureImportParam)> EnumerateSubAssetKeyValue(this MaterialImportParam param) + { + foreach (var kv in param.TextureSlots) + { + var key = new SubAssetKey(typeof(Texture2D), kv.Key); + yield return (key, kv.Value); + } + } + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialImporterParamExtensions.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialImporterParamExtensions.cs.meta new file mode 100644 index 000000000..d60b35107 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialImporterParamExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95bb02953e0720c45a848856c1006ed4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/SubAssetKey.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/SubAssetKey.cs index 10e8cbb1b..21ec0a3bb 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/SubAssetKey.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/SubAssetKey.cs @@ -31,5 +31,10 @@ namespace UniGLTF Type = t; Name = name; } + + public override string ToString() + { + return $"{Type}:{Name}"; + } } } diff --git a/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs b/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs index d0f00b682..d9f7804cb 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs @@ -177,13 +177,7 @@ namespace UniVRM10 return true; } - /// - /// Material一つ分のテクスチャーを列挙する。重複する場合がある - /// - /// - /// - /// - public static IEnumerable<(SubAssetKey, TextureImportParam)> EnumerateTexturesForMaterial(GltfParser parser, int i) + public static MaterialImportParam GetMaterialImportParam(GltfParser parser, int i) { // mtoon if (!TryCreateParam(parser, i, out MaterialImportParam param)) @@ -195,12 +189,7 @@ namespace UniVRM10 GltfPBRMaterial.TryCreateParam(parser, i, out param); } } - - foreach (var kv in param.TextureSlots) - { - var key = new SubAssetKey(typeof(Texture2D), kv.Key); - yield return (key, kv.Value); - } + return param; } /// @@ -257,18 +246,14 @@ namespace UniVRM10 } var used = new HashSet(); - Func<(SubAssetKey, TextureImportParam), bool> add = (kv) => - { - var (key, textureInfo) = kv; - return used.Add(key); - }; for (int i = 0; i < parser.GLTF.materials.Count; ++i) { - foreach (var kv in EnumerateTexturesForMaterial(parser, i)) + var param = GetMaterialImportParam(parser, i); + foreach (var (key, value) in param.EnumerateSubAssetKeyValue()) { - if (add(kv)) + if (used.Add(key)) { - yield return kv; + yield return (key, value); } } } diff --git a/Assets/VRM10/Tests/MaterialImportTests.cs b/Assets/VRM10/Tests/MaterialImportTests.cs new file mode 100644 index 000000000..b9481e678 --- /dev/null +++ b/Assets/VRM10/Tests/MaterialImportTests.cs @@ -0,0 +1,35 @@ +using System.IO; +using System.Linq; +using NUnit.Framework; +using UniGLTF; +using UnityEngine; + +namespace UniVRM10 +{ + public class MaterialImporterTests + { + static string AliciaPath + { + get + { + return Path.GetFullPath(Application.dataPath + "/../Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm") + .Replace("\\", "/"); + } + } + + [Test] + public void MaterialImporterTest() + { + var migratedBytes = MigrationVrm.Migrate(File.ReadAllBytes(AliciaPath)); + var parser = new GltfParser(); + parser.Parse(AliciaPath, migratedBytes); + + var materialParam = Vrm10MaterialImporter.GetMaterialImportParam(parser, 0); + Assert.AreEqual("VRM/MToon", materialParam.ShaderName); + Assert.AreEqual("Alicia_body", materialParam.TextureSlots["_MainTex"].UnityObjectName); + + var (key, value) = materialParam.EnumerateSubAssetKeyValue().First(); + Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "Alicia_body"), key); + } + } +} diff --git a/Assets/VRM10/Tests/MaterialImportTests.cs.meta b/Assets/VRM10/Tests/MaterialImportTests.cs.meta new file mode 100644 index 000000000..086e968df --- /dev/null +++ b/Assets/VRM10/Tests/MaterialImportTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9609b7e054ece274bbe4a2e1a3405373 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Tests/VRM10.Tests.asmdef b/Assets/VRM10/Tests/VRM10.Tests.asmdef index 06f9033ee..3d13df4f6 100644 --- a/Assets/VRM10/Tests/VRM10.Tests.asmdef +++ b/Assets/VRM10/Tests/VRM10.Tests.asmdef @@ -4,6 +4,7 @@ "VrmLib", "VRM10", "UniGLTF", + "VRMShaders.GLTF.IO.Runtime", "VRMShaders.GLTF.IO.Editor" ], "optionalUnityReferences": [