Merge pull request #879 from ousttrue/fix10/fix_subassetkey

Vrm1のSubAssetKey作成のバグ修正
This commit is contained in:
PoChang007
2021-04-16 13:40:04 +09:00
committed by GitHub
12 changed files with 157 additions and 45 deletions

View File

@@ -179,14 +179,14 @@ namespace UniGLTF
if (m_parser.GLTF.materials == null || m_parser.GLTF.materials.Count == 0)
{
// no material. work around.
var param = GltfMaterialImporter.CreateParam(m_parser, 0);
var param = GltfMaterialImporter.GetMaterialParam(m_parser, 0);
var material = await MaterialFactory.LoadAsync(param, TextureFactory.GetTextureAsync);
}
else
{
for (int i = 0; i < m_parser.GLTF.materials.Count; ++i)
{
var param = GltfMaterialImporter.CreateParam(m_parser, i);
var param = GltfMaterialImporter.GetMaterialParam(m_parser, i);
var material = await MaterialFactory.LoadAsync(param, TextureFactory.GetTextureAsync);
}
}

View File

@@ -34,7 +34,7 @@ namespace UniGLTF
return $"material_{index:00}";
}
public MaterialImportParam CreateParam(GltfParser parser, int i)
public MaterialImportParam GetMaterialParam(GltfParser parser, int i)
{
foreach (var tryCreate in GltfMaterialParamProcessors)
{

View File

@@ -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.Value.UnityObjectName);
yield return (key, kv.Value);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 95bb02953e0720c45a848856c1006ed4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -31,5 +31,10 @@ namespace UniGLTF
Type = t;
Name = name;
}
public override string ToString()
{
return $"{Type}:{Name}";
}
}
}

View File

@@ -185,5 +185,32 @@ namespace UniGLTF
EditorLoad(gltf, root.FullName.Length);
}
}
[Test]
public void GltfSampleModelsTest_DamagedHelmet()
{
var env = System.Environment.GetEnvironmentVariable("GLTF_SAMPLE_MODELS");
if (string.IsNullOrEmpty(env))
{
return;
}
var root = new DirectoryInfo($"{env}/2.0");
if (!root.Exists)
{
return;
}
{
var path = Path.Combine(root.FullName, "DamagedHelmet/glTF-Binary/DamagedHelmet.glb");
var parser = new GltfParser();
parser.ParsePath(path);
var materialParam = new GltfMaterialImporter().GetMaterialParam(parser, 0);
Assert.AreEqual("Standard", materialParam.ShaderName);
Assert.AreEqual(5, materialParam.TextureSlots.Count);
var (key, value) = materialParam.EnumerateSubAssetKeyValue().First();
Assert.AreEqual(new SubAssetKey(typeof(Texture2D), "texture_0"), key);
}
}
}
}

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,13 +177,7 @@ namespace UniVRM10
return true;
}
/// <summary>
/// Material一つ分のテクスチャーを列挙する。重複する場合がある
/// </summary>
/// <param name="parser"></param>
/// <param name="m"></param>
/// <returns></returns>
public static IEnumerable<(SubAssetKey, TextureImportParam)> EnumerateTexturesForMaterial(GltfParser parser, int i)
public static MaterialImportParam GetMaterialParam(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;
}
/// <summary>
@@ -257,18 +246,14 @@ namespace UniVRM10
}
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)
{
foreach (var kv in EnumerateTexturesForMaterial(parser, i))
var param = GetMaterialParam(parser, i);
foreach (var (key, value) in param.EnumerateSubAssetKeyValue())
{
if (add(kv))
if (used.Add(key))
{
yield return kv;
yield return (key, value);
}
}
}

View File

@@ -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.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

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9609b7e054ece274bbe4a2e1a3405373
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -4,6 +4,7 @@
"VrmLib",
"VRM10",
"UniGLTF",
"VRMShaders.GLTF.IO.Runtime",
"VRMShaders.GLTF.IO.Editor"
],
"optionalUnityReferences": [