From c34bb2f0d4180e4059633f0ebb2060a3f0af37ed Mon Sep 17 00:00:00 2001 From: oO <47592289+oocytanb@users.noreply.github.com> Date: Thu, 13 May 2021 22:30:07 +0900 Subject: [PATCH 1/3] Add test cases for validating null materials --- .../Tests/UniGLTF/MeshExportValidatorTests.cs | 84 +++++++++++++++++++ .../UniGLTF/MeshExportValidatorTests.cs.meta | 11 +++ 2 files changed, 95 insertions(+) create mode 100644 Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs create mode 100644 Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs.meta diff --git a/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs new file mode 100644 index 000000000..72cd34ad3 --- /dev/null +++ b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs @@ -0,0 +1,84 @@ +using NUnit.Framework; +using System.Linq; +using UnityEngine; + +namespace UniGLTF +{ + public class MeshExportValidatorTests + { + [Test] + public void NoMaterialTest() + { + var validator = ScriptableObject.CreateInstance(); + var root = new GameObject("root"); + + try + { + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + cube.transform.SetParent(root.transform); + + var renderer = cube.GetComponent(); + renderer.sharedMaterials = new Material[0]; + + 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(); + var root = new GameObject("root"); + + try + { + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + cube.transform.SetParent(root.transform); + + var renderer = cube.GetComponent(); + renderer.sharedMaterials = new Material[] { null }; + + 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(); + var root = new GameObject("root"); + + try + { + var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); + cube.transform.SetParent(root.transform); + + var renderer = cube.GetComponent(); + renderer.sharedMaterials = new Material[] { null, null }; + + validator.SetRoot(root, MeshExportSettings.Default); + var vs = validator.Validate(root); + Assert.False(vs.All(x => x.CanExport)); + } + finally + { + GameObject.DestroyImmediate(root); + ScriptableObject.DestroyImmediate(validator); + } + } + } +} diff --git a/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs.meta b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs.meta new file mode 100644 index 000000000..ac66db37c --- /dev/null +++ b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 125889535256e95488606b67463c18cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 91d39f5fba88367616265941ef1b657b7b04b051 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 17 May 2021 13:47:51 +0900 Subject: [PATCH 2/3] =?UTF-8?q?materials=E3=81=8Csubmesh=E3=82=88=E3=82=8A?= =?UTF-8?q?=E5=A4=9A=E3=81=8F=E3=81=A6=20null=20=E3=82=92=E5=90=AB?= =?UTF-8?q?=E3=82=80=E5=A0=B4=E5=90=88=E3=82=92ValidationError=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B=20#946?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExportDialog/MeshExportValidator.cs | 27 +++++++------ .../Tests/UniGLTF/MeshExportValidatorTests.cs | 38 +++++++++---------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs b/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs index becf276b1..0f162ceb9 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs @@ -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()}"); + } } } diff --git a/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs index 72cd34ad3..a2d8058fa 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs @@ -6,20 +6,26 @@ 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.sharedMaterials = materials; + return root; + } + [Test] public void NoMaterialTest() { var validator = ScriptableObject.CreateInstance(); - var root = new GameObject("root"); + // 0 material + var root = CreateTestObject(new Material[0]); try { - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - cube.transform.SetParent(root.transform); - - var renderer = cube.GetComponent(); - renderer.sharedMaterials = new Material[0]; - validator.SetRoot(root, MeshExportSettings.Default); var vs = validator.Validate(root); Assert.False(vs.All(x => x.CanExport)); @@ -35,16 +41,11 @@ namespace UniGLTF public void NullMaterialTest() { var validator = ScriptableObject.CreateInstance(); - var root = new GameObject("root"); + // null を含む + var root = CreateTestObject(new Material[] { null }); try { - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - cube.transform.SetParent(root.transform); - - var renderer = cube.GetComponent(); - renderer.sharedMaterials = new Material[] { null }; - validator.SetRoot(root, MeshExportSettings.Default); var vs = validator.Validate(root); Assert.False(vs.All(x => x.CanExport)); @@ -60,16 +61,11 @@ namespace UniGLTF public void NullMaterialsTest() { var validator = ScriptableObject.CreateInstance(); - var root = new GameObject("root"); + // null を含むかつ submeshCount より多い + var root = CreateTestObject(new Material[] { null, null }); try { - var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); - cube.transform.SetParent(root.transform); - - var renderer = cube.GetComponent(); - renderer.sharedMaterials = new Material[] { null, null }; - validator.SetRoot(root, MeshExportSettings.Default); var vs = validator.Validate(root); Assert.False(vs.All(x => x.CanExport)); From ece63736ada43c1a4043656a6742b595b0714d78 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 17 May 2021 14:14:30 +0900 Subject: [PATCH 3/3] skip non mtoon material --- Assets/VRM10/Runtime/Migration/MigrationMToon.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationMToon.cs b/Assets/VRM10/Runtime/Migration/MigrationMToon.cs index 4e3551bfb..ee26401ec 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationMToon.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationMToon.cs @@ -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(); 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(