mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-07-19 16:51:55 -05:00
Merge branch 'master' of https://github.com/vrm-c/UniVRM into exportMtoon10
This commit is contained in:
commit
b5f18cd2a0
|
|
@ -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()}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
80
Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs
Normal file
80
Assets/UniGLTF/Tests/UniGLTF/MeshExportValidatorTests.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 125889535256e95488606b67463c18cb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user