From ca8a04d6cbca57f154f96876def847f51c18fc1f Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 2 Jun 2021 17:25:25 +0900 Subject: [PATCH] =?UTF-8?q?VertexColorState=20=E3=82=92=E6=A0=BC=E4=B8=8A?= =?UTF-8?q?=E3=81=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExportDialog/MeshExportValidator.cs | 8 +- .../UniGLTF/IO/MeshIO/MeshExportInfo.cs | 67 ---------------- .../MeshIO/MeshExporter_SharedVertexBuffer.cs | 6 +- .../UniGLTF/IO/MeshIO/VertexColorState.cs | 76 +++++++++++++++++++ .../IO/MeshIO/VertexColorState.cs.meta | 11 +++ Assets/VRM/Editor/Format/VRMExporterWizard.cs | 2 +- 6 files changed, 95 insertions(+), 75 deletions(-) create mode 100644 Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs create mode 100644 Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs.meta diff --git a/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs b/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs index 0f162ceb9f..a22dcca351 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ExportDialog/MeshExportValidator.cs @@ -96,11 +96,11 @@ public virtual void CalcMeshSize(ref MeshExportInfo info, sb.Append($") x {info.Mesh.vertexCount}"); switch (info.VertexColor) { - case MeshExportInfo.VertexColorState.ExistsAndIsUsed: - case MeshExportInfo.VertexColorState.ExistsAndMixed: // エクスポートする + case VertexColorState.ExistsAndIsUsed: + case VertexColorState.ExistsAndMixed: // エクスポートする sb.Insert(0, "[use vcolor]"); break; - case MeshExportInfo.VertexColorState.ExistsButNotUsed: + case VertexColorState.ExistsButNotUsed: sb.Insert(0, "[remove vcolor]"); break; } @@ -150,7 +150,7 @@ bool TryGetMeshInfo(GameObject root, Renderer renderer, out MeshExportInfo info) return false; } - info.VertexColor = MeshExportInfo.DetectVertexColor(info.Mesh, info.Renderer.sharedMaterials); + info.VertexColor = VertexColorUtility.DetectVertexColor(info.Mesh, info.Renderer.sharedMaterials); var relativePath = UniGLTF.UnityExtensions.RelativePathFrom(renderer.transform, root.transform); CalcMeshSize(ref info, relativePath); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExportInfo.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExportInfo.cs index de78ce3157..768f27ce7b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExportInfo.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExportInfo.cs @@ -21,75 +21,8 @@ public struct MeshExportInfo public bool HasSkinning => Mesh.boneWeights != null && Mesh.boneWeights.Length == Mesh.vertexCount; - /// - /// Mesh に頂点カラーが含まれているか。 - /// 含まれている場合にマテリアルは Unlit.VColorMultiply になっているか? - /// - public enum VertexColorState - { - // VColorが存在しない - None, - // VColorが存在して使用している(UnlitはすべてVColorMultiply) - ExistsAndIsUsed, - // VColorが存在するが使用していない(UnlitはすべてVColorNone。もしくはUnlitが存在しない) - ExistsButNotUsed, - // VColorが存在して、Unlit.Multiply と Unlit.NotMultiply が混在している。 Unlit.NotMultiply を MToon か Standardに変更した方がよい - ExistsAndMixed, - } public VertexColorState VertexColor; - static bool MaterialUseVertexColor(Material m) - { - if (m == null) - { - return false; - } - if (m.shader.name != UniGLTF.UniUnlit.Utils.ShaderName) - { - return false; - } - if (UniGLTF.UniUnlit.Utils.GetVColBlendMode(m) != UniGLTF.UniUnlit.UniUnlitVertexColorBlendOp.Multiply) - { - return false; - } - return true; - } - - public static VertexColorState DetectVertexColor(Mesh mesh, Material[] materials) - { - if (mesh != null && mesh.colors != null && mesh.colors.Length == mesh.vertexCount) - { - // mesh が 頂点カラーを保持している - VertexColorState? state = default; - if (materials != null) - { - foreach (var m in materials) - { - var currentState = MaterialUseVertexColor(m) - ? MeshExportInfo.VertexColorState.ExistsAndIsUsed - : MeshExportInfo.VertexColorState.ExistsButNotUsed - ; - if (state.HasValue) - { - if (state.Value != currentState) - { - state = MeshExportInfo.VertexColorState.ExistsAndMixed; - break; - } - } - else - { - state = currentState; - } - } - } - return state.GetValueOrDefault(VertexColorState.None); - } - else - { - return VertexColorState.None; - } - } public int VertexCount; /// diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs index 68c1360573..fc7c1fa8b3 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs @@ -47,9 +47,9 @@ public static (glTFMesh, Dictionary blendShapeIndexMap) Export(glTF gl var colorAccessorIndex = -1; - var vColorState = MeshExportInfo.DetectVertexColor(mesh, materials); - if (vColorState == MeshExportInfo.VertexColorState.ExistsAndIsUsed // VColor使っている - || vColorState == MeshExportInfo.VertexColorState.ExistsAndMixed // VColorを使っているところと使っていないところが混在(とりあえずExportする) + var vColorState = VertexColorUtility.DetectVertexColor(mesh, materials); + if (vColorState == VertexColorState.ExistsAndIsUsed // VColor使っている + || vColorState == VertexColorState.ExistsAndMixed // VColorを使っているところと使っていないところが混在(とりあえずExportする) ) { // UniUnlit で Multiply 設定になっている diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs new file mode 100644 index 0000000000..c4e3a3c5e2 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs @@ -0,0 +1,76 @@ +using UnityEngine; + +namespace UniGLTF +{ + /// + /// Mesh に頂点カラーが含まれているか。 + /// 含まれている場合にマテリアルは Unlit.VColorMultiply になっているか? + /// + public enum VertexColorState + { + // VColorが存在しない + None, + // VColorが存在して使用している(UnlitはすべてVColorMultiply) + ExistsAndIsUsed, + // VColorが存在するが使用していない(UnlitはすべてVColorNone。もしくはUnlitが存在しない) + ExistsButNotUsed, + // VColorが存在して、Unlit.Multiply と Unlit.NotMultiply が混在している。 Unlit.NotMultiply を MToon か Standardに変更した方がよい + ExistsAndMixed, + } + + public static class VertexColorUtility + { + static bool MaterialUseVertexColor(Material m) + { + if (m == null) + { + return false; + } + if (m.shader.name != UniGLTF.UniUnlit.Utils.ShaderName) + { + return false; + } + if (UniGLTF.UniUnlit.Utils.GetVColBlendMode(m) != UniGLTF.UniUnlit.UniUnlitVertexColorBlendOp.Multiply) + { + return false; + } + return true; + } + + public static VertexColorState DetectVertexColor(Mesh mesh, Material[] materials) + { + if (mesh != null && mesh.colors != null && mesh.colors.Length == mesh.vertexCount) + { + // mesh が 頂点カラーを保持している + VertexColorState? state = default; + if (materials != null) + { + foreach (var m in materials) + { + var currentState = MaterialUseVertexColor(m) + ? VertexColorState.ExistsAndIsUsed + : VertexColorState.ExistsButNotUsed + ; + if (state.HasValue) + { + if (state.Value != currentState) + { + state = VertexColorState.ExistsAndMixed; + break; + } + } + else + { + state = currentState; + } + } + } + return state.GetValueOrDefault(VertexColorState.None); + } + else + { + return VertexColorState.None; + } + } + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs.meta new file mode 100644 index 0000000000..9be5ba96eb --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/VertexColorState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 63e5d425c70cb5f4480e3ad09f323425 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM/Editor/Format/VRMExporterWizard.cs b/Assets/VRM/Editor/Format/VRMExporterWizard.cs index f90ca01730..51cc1fd15a 100644 --- a/Assets/VRM/Editor/Format/VRMExporterWizard.cs +++ b/Assets/VRM/Editor/Format/VRMExporterWizard.cs @@ -258,7 +258,7 @@ protected override bool DoGUI(bool isValid) { switch (meshInfo.VertexColor) { - case UniGLTF.MeshExportInfo.VertexColorState.ExistsAndMixed: + case UniGLTF.VertexColorState.ExistsAndMixed: Validation.Warning($"{meshInfo.Renderer}: Both vcolor.multiply and not multiply unlit materials exist").DrawGUI(); break; }