Merge pull request #949 from ousttrue/fix/mesh_export_validator_materials

materialsがsubmeshより多くて null を含む場合をValidationErrorにする
This commit is contained in:
PoChang007
2021-05-17 13:49:15 +09:00
committed by GitHub
2 changed files with 33 additions and 32 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

@@ -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>();
renderer.sharedMaterials = materials;
return root;
}
[Test]
public void NoMaterialTest()
{
var validator = ScriptableObject.CreateInstance<MeshExportValidator>();
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>();
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<MeshExportValidator>();
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>();
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<MeshExportValidator>();
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>();
renderer.sharedMaterials = new Material[] { null, null };
validator.SetRoot(root, MeshExportSettings.Default);
var vs = validator.Validate(root);
Assert.False(vs.All(x => x.CanExport));