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;
}