test 追加. VRMMaterialImporterの interface を調整

This commit is contained in:
ousttrue 2021-04-16 13:24:46 +09:00
parent 256f9d781c
commit 52f516d443
4 changed files with 43 additions and 24 deletions

View File

@ -94,7 +94,7 @@ namespace VRM
return true;
}
public IEnumerable<(SubAssetKey, TextureImportParam)> EnumerateTexturesForMaterial(GltfParser parser, int i)
public MaterialImportParam GetMaterialParam(GltfParser parser, int i)
{
// mtoon
if (!TryCreateParam(parser, i, out MaterialImportParam param))
@ -106,22 +106,12 @@ namespace VRM
GltfPBRMaterial.TryCreateParam(parser, i, out param);
}
}
foreach (var kv in param.TextureSlots)
{
var key = new SubAssetKey(typeof(Texture2D), kv.Value.UnityObjectName);
yield return (key, kv.Value);
}
return param;
}
public IEnumerable<(SubAssetKey, TextureImportParam)> EnumerateAllTexturesDistinct(GltfParser parser)
{
var used = new HashSet<SubAssetKey>();
Func<(SubAssetKey, TextureImportParam), bool> add = (kv) =>
{
var (key, textureInfo) = kv;
return used.Add(key);
};
for (int i = 0; i < parser.GLTF.materials.Count; ++i)
{
@ -129,22 +119,26 @@ namespace VRM
if (vrmMaterial.shader == MToon.Utils.ShaderName)
{
// MToon
foreach (var kv in EnumerateTexturesForMaterial(parser, i))
if (!TryCreateParam(parser, i, out MaterialImportParam param))
{
if (add(kv))
throw new Exception();
}
foreach (var (key, value) in param.EnumerateSubAssetKeyValue())
{
if (used.Add(key))
{
yield return kv;
yield return (key, value);
}
}
}
else
{
// PBR or Unlit
foreach (var kv in GltfTextureEnumerator.EnumerateTexturesForMaterial(parser, i))
foreach (var (key, value) in GltfTextureEnumerator.EnumerateTexturesForMaterial(parser, i))
{
if (add(kv))
if (used.Add(key))
{
yield return kv;
yield return (key, value);
}
}
}
@ -153,10 +147,10 @@ namespace VRM
// thumbnail
if (m_vrm.meta != null && m_vrm.meta.texture != -1)
{
var kv = GltfTextureImporter.CreateSRGB(parser, m_vrm.meta.texture, Vector2.zero, Vector2.one);
if (add(kv))
var (key, value) = GltfTextureImporter.CreateSRGB(parser, m_vrm.meta.texture, Vector2.zero, Vector2.one);
if (used.Add(key))
{
yield return kv;
yield return (key, value);
}
}
}

View File

@ -1,3 +1,5 @@
using System.IO;
using System.Linq;
using NUnit.Framework;
using UniGLTF;
using UnityEngine;
@ -54,5 +56,28 @@ namespace VRM
Assert.AreEqual(73, parser.GLTF.materials.Count);
Assert.True(materialImporter.TryCreateParam(parser, 0, out MaterialImportParam param));
}
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 parser = new GltfParser();
parser.ParsePath(AliciaPath);
var vrmImporter = new VRMImporterContext(parser, null);
var materialParam = new VRMMaterialImporter(vrmImporter.VRM).GetMaterialParam(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);
}
}
}

View File

@ -177,7 +177,7 @@ namespace UniVRM10
return true;
}
public static MaterialImportParam GetMaterialImportParam(GltfParser parser, int i)
public static MaterialImportParam GetMaterialParam(GltfParser parser, int i)
{
// mtoon
if (!TryCreateParam(parser, i, out MaterialImportParam param))
@ -248,7 +248,7 @@ namespace UniVRM10
var used = new HashSet<SubAssetKey>();
for (int i = 0; i < parser.GLTF.materials.Count; ++i)
{
var param = GetMaterialImportParam(parser, i);
var param = GetMaterialParam(parser, i);
foreach (var (key, value) in param.EnumerateSubAssetKeyValue())
{
if (used.Add(key))

View File

@ -24,7 +24,7 @@ namespace UniVRM10
var parser = new GltfParser();
parser.Parse(AliciaPath, migratedBytes);
var materialParam = Vrm10MaterialImporter.GetMaterialImportParam(parser, 0);
var materialParam = Vrm10MaterialImporter.GetMaterialParam(parser, 0);
Assert.AreEqual("VRM/MToon", materialParam.ShaderName);
Assert.AreEqual("Alicia_body", materialParam.TextureSlots["_MainTex"].UnityObjectName);