Merge branch 'master' of https://github.com/vrm-c/UniVRM into exportMtoon10

This commit is contained in:
Masataka SUMI 2021-05-17 17:40:43 +09:00
commit b5f18cd2a0
4 changed files with 118 additions and 14 deletions

View File

@ -193,7 +193,8 @@ namespace UniGLTF
public enum Messages
{
DIFFERENT_MATERIAL_COUNT,
MATERIALS_LESS_THAN_SUBMESH_COUNT,
MATERIALS_GREATER_THAN_SUBMESH_COUNT,
MATERIALS_CONTAINS_NULL,
UNKNOWN_SHADER,
}
@ -205,18 +206,22 @@ namespace UniGLTF
// invalid materials.len
if (info.Renderer.sharedMaterials.Length < info.Mesh.subMeshCount)
{
// すべての submesh に material が割り当てられていない
yield return Validation.Error(Messages.DIFFERENT_MATERIAL_COUNT.Msg());
// submesh より material の方が少ない
yield return Validation.Error(Messages.MATERIALS_LESS_THAN_SUBMESH_COUNT.Msg());
}
else if (info.Renderer.sharedMaterials.Length > info.Mesh.subMeshCount)
else
{
// 未使用の material がある
yield return Validation.Warning(Messages.DIFFERENT_MATERIAL_COUNT.Msg());
}
else if (info.Renderer.sharedMaterials.Any(x => x == null))
{
// material に null が含まれる(unity で magenta になっているはず)
yield return Validation.Error($"{info.Renderer}: {Messages.MATERIALS_CONTAINS_NULL.Msg()}");
if (info.Renderer.sharedMaterials.Length > info.Mesh.subMeshCount)
{
// submesh より material の方が多い
yield return Validation.Warning(Messages.MATERIALS_GREATER_THAN_SUBMESH_COUNT.Msg());
}
if (info.Renderer.sharedMaterials.Take(info.Mesh.subMeshCount).Any(x => x == null))
{
// material に null が含まれる(unity で magenta になっているはず)
yield return Validation.Error($"{info.Renderer}: {Messages.MATERIALS_CONTAINS_NULL.Msg()}");
}
}
}

View File

@ -0,0 +1,80 @@
using NUnit.Framework;
using System.Linq;
using UnityEngine;
namespace UniGLTF
{
public class MeshExportValidatorTests
{
static GameObject CreateTestObject(Material[] materials)
{
var root = new GameObject("root");
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.SetParent(root.transform);
var renderer = cube.GetComponent<Renderer>();
renderer.sharedMaterials = materials;
return root;
}
[Test]
public void NoMaterialTest()
{
var validator = ScriptableObject.CreateInstance<MeshExportValidator>();
// 0 material
var root = CreateTestObject(new Material[0]);
try
{
validator.SetRoot(root, MeshExportSettings.Default);
var vs = validator.Validate(root);
Assert.False(vs.All(x => x.CanExport));
}
finally
{
GameObject.DestroyImmediate(root);
ScriptableObject.DestroyImmediate(validator);
}
}
[Test]
public void NullMaterialTest()
{
var validator = ScriptableObject.CreateInstance<MeshExportValidator>();
// null を含む
var root = CreateTestObject(new Material[] { null });
try
{
validator.SetRoot(root, MeshExportSettings.Default);
var vs = validator.Validate(root);
Assert.False(vs.All(x => x.CanExport));
}
finally
{
GameObject.DestroyImmediate(root);
ScriptableObject.DestroyImmediate(validator);
}
}
[Test]
public void NullMaterialsTest()
{
var validator = ScriptableObject.CreateInstance<MeshExportValidator>();
// null を含むかつ submeshCount より多い
var root = CreateTestObject(new Material[] { null, null });
try
{
validator.SetRoot(root, MeshExportSettings.Default);
var vs = validator.Validate(root);
Assert.False(vs.All(x => x.CanExport));
}
finally
{
GameObject.DestroyImmediate(root);
ScriptableObject.DestroyImmediate(validator);
}
}
}
}

View File

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

View File

@ -280,7 +280,7 @@ namespace UniVRM10
public static void Migrate(glTF gltf, JsonNode json)
{
const float centimeterToMeter = 0.01f;
// Create MToonDefinition(0.x) from JSON(0.x)
var sourceMaterials = new (MToonValue, glTFMaterial)[gltf.materials.Count];
for (int i = 0; i < gltf.materials.Count; ++i)
@ -292,7 +292,7 @@ namespace UniVRM10
}
// VRM-0 MToon の情報
var mtoon = MToonValue.Create(vrmMaterial);
// KHR_materials_unlit として fallback した情報が入っている
var gltfMaterial = gltf.materials[i];
if (!glTF_KHR_materials_unlit.IsEnable(gltfMaterial))
@ -309,6 +309,10 @@ namespace UniVRM10
var transparentZWriteRenderQueues = new SortedSet<int>();
foreach (var (mtoon, gltfMaterial) in sourceMaterials)
{
if (mtoon == null)
{
continue;
}
switch (mtoon.Definition.Rendering.RenderMode)
{
case RenderMode.Opaque:
@ -337,10 +341,14 @@ namespace UniVRM10
{
transparentZWriteRenderQueueMap.Add(srcQueue, defaultTransparentZWriteQueue++);
}
// Main Pass
foreach (var (mtoon, gltfMaterial) in sourceMaterials)
{
if (mtoon == null)
{
continue;
}
var extensions = new glTFExtensionExport();
gltfMaterial.extensions = extensions;
extensions.Add(