From 91d39f5fba88367616265941ef1b657b7b04b051 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 17 May 2021 13:47:51 +0900 Subject: [PATCH] =?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));