mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-24 19:45:37 -05:00
Merge pull request #949 from ousttrue/fix/mesh_export_validator_materials
materialsがsubmeshより多くて null を含む場合をValidationErrorにする
This commit is contained in:
@@ -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()}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user