diff --git a/Assets/VRM10/Runtime/Migration/Materials/MigrationLegacyUnlitMaterial.cs b/Assets/VRM10/Runtime/Migration/Materials/MigrationLegacyUnlitMaterial.cs
new file mode 100644
index 000000000..e50641579
--- /dev/null
+++ b/Assets/VRM10/Runtime/Migration/Materials/MigrationLegacyUnlitMaterial.cs
@@ -0,0 +1,66 @@
+using System;
+using UniGLTF;
+using UniJSON;
+
+namespace UniVRM10
+{
+ ///
+ /// 過去の UniVRM において、KHR_materials_unlit 拡張を使わず、VRM 拡張を用いて Unlit を表現していた Material をマイグレーションする。
+ ///
+ public static class MigrationLegacyUnlitMaterial
+ {
+ public static glTFMaterial Migrate(JsonNode vrm0XMaterial)
+ {
+ var unlitMaterial = new glTFMaterial
+ {
+ pbrMetallicRoughness = new glTFPbrMetallicRoughness
+ {
+ metallicFactor = 0f,
+ roughnessFactor = 1f,
+ },
+ extensions = new glTFExtensionExport()
+ .Add(glTF_KHR_materials_unlit.ExtensionName, new ArraySegment(glTF_KHR_materials_unlit.Raw)),
+ };
+
+ switch (MigrationMaterialUtil.GetShaderName(vrm0XMaterial))
+ {
+ case "Unlit/Color":
+ unlitMaterial.pbrMetallicRoughness.baseColorFactor = MigrationMaterialUtil.GetBaseColorFactor(vrm0XMaterial);
+ unlitMaterial.pbrMetallicRoughness.baseColorTexture = null;
+ return unlitMaterial;
+ case "Unlit/Texture":
+ unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
+ unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
+ return unlitMaterial;
+ case "Unlit/Transparent":
+ unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
+ unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
+ unlitMaterial.alphaMode = "BLEND";
+ return unlitMaterial;
+ case "Unlit/Transparent Cutout":
+ unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
+ unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
+ unlitMaterial.alphaMode = "MASK";
+ unlitMaterial.alphaCutoff = MigrationMaterialUtil.GetCutoff(vrm0XMaterial);
+ return unlitMaterial;
+ case "VRM/UnlitTexture":
+ unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
+ unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
+ return unlitMaterial;
+ case "VRM/UnlitTransparent":
+ unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
+ unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
+ unlitMaterial.alphaMode = "BLEND";
+ return unlitMaterial;
+ case "VRM/UnlitCutout":
+ unlitMaterial.pbrMetallicRoughness.baseColorFactor = new float[] {1, 1, 1, 1};
+ unlitMaterial.pbrMetallicRoughness.baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
+ unlitMaterial.alphaMode = "MASK";
+ unlitMaterial.alphaCutoff = MigrationMaterialUtil.GetCutoff(vrm0XMaterial);
+ return unlitMaterial;
+ default:
+ return null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/VRM10/Runtime/Migration/Materials/MigrationLegacyUnlitMaterial.cs.meta b/Assets/VRM10/Runtime/Migration/Materials/MigrationLegacyUnlitMaterial.cs.meta
new file mode 100644
index 000000000..461c31842
--- /dev/null
+++ b/Assets/VRM10/Runtime/Migration/Materials/MigrationLegacyUnlitMaterial.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 46c50e244d72488dac8e26320bac782d
+timeCreated: 1635420423
\ No newline at end of file
diff --git a/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterialUtil.cs b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterialUtil.cs
new file mode 100644
index 000000000..b56fd35d7
--- /dev/null
+++ b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterialUtil.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Linq;
+using UniGLTF;
+using UniJSON;
+using UnityEngine;
+
+namespace UniVRM10
+{
+ internal static class MigrationMaterialUtil
+ {
+ private const string ShaderNameKey = "shader";
+ private const string VectorPropertiesKey = "vectorProperties";
+ private const string FloatPropertiesKey = "floatProperties";
+ private const string TexturePropertiesKey = "textureProperties";
+ private const string MainTexKey = "_MainTex";
+ private const string ColorKey = "_Color";
+ private const string CutoffKey = "_Cutoff";
+
+ public static string GetShaderName(JsonNode vrm0XMaterial)
+ {
+ try
+ {
+ return vrm0XMaterial[ShaderNameKey].GetString();
+ }
+ catch (Exception)
+ {
+ Debug.LogWarning($"Migration Warning: ShaderName fallback default.");
+ return string.Empty;
+ }
+ }
+
+ public static float[] GetBaseColorFactor(JsonNode vrm0XMaterial)
+ {
+ try
+ {
+ var factor = vrm0XMaterial[VectorPropertiesKey][ColorKey];
+ if (!factor.IsArray() || factor.GetArrayCount() != 4)
+ {
+ throw new Exception("not float4");
+ }
+ return factor.ArrayItems().Select(x => ListTreeNodeExtensions.GetSingle(x)).ToArray();
+ }
+ catch (Exception)
+ {
+ Debug.LogWarning($"Migration Warning: BaseColorFactor fallback default.");
+ return new float[] {1, 1, 1, 1};
+ }
+ }
+
+ public static glTFMaterialBaseColorTextureInfo GetBaseColorTexture(JsonNode vrm0XMaterial)
+ {
+ try
+ {
+ return new glTFMaterialBaseColorTextureInfo
+ {
+ index = vrm0XMaterial[TexturePropertiesKey][MainTexKey].GetInt32(),
+ };
+ }
+ catch (Exception)
+ {
+ Debug.LogWarning($"Migration Warning: BaseColorTexture fallback default.");
+ return null;
+ }
+ }
+
+ public static float GetCutoff(JsonNode vrm0XMaterial)
+ {
+ try
+ {
+ return vrm0XMaterial[FloatPropertiesKey][CutoffKey].GetSingle();
+ }
+ catch (Exception)
+ {
+ Debug.LogWarning($"Migration Warning: Cutoff fallback default.");
+ return 0.5f;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterialUtil.cs.meta b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterialUtil.cs.meta
new file mode 100644
index 000000000..7587a12df
--- /dev/null
+++ b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterialUtil.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: e9d2327bd1774f949440b833af321d69
+timeCreated: 1635423551
\ No newline at end of file
diff --git a/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterials.cs b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterials.cs
new file mode 100644
index 000000000..700432fce
--- /dev/null
+++ b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterials.cs
@@ -0,0 +1,47 @@
+using System;
+using UniGLTF;
+using UniJSON;
+using UnityEngine;
+
+namespace UniVRM10
+{
+ public static class MigrationMaterials
+ {
+ private const string DontUseExtensionShaderName = "VRM_USE_GLTFSHADER";
+ private const string MaterialPropertiesKey = "materialProperties";
+
+ public static void Migrate(glTF gltf, JsonNode vrm0)
+ {
+ for (var materialIdx = 0; materialIdx < gltf.materials.Count; ++materialIdx)
+ {
+ try
+ {
+ var vrm0XMaterial = vrm0[MaterialPropertiesKey][materialIdx];
+ var shaderName = MigrationMaterialUtil.GetShaderName(vrm0XMaterial);
+
+ // 1. material 拡張を使わない場合.
+ // NOTE: この ShaderName の場合、「この拡張に記載されている情報は無視する」ということを示す.
+ if (shaderName == DontUseExtensionShaderName)
+ {
+ continue;
+ }
+
+ // 2. VRM 拡張のうち、古い Unlit 情報からの取得を試みる.
+ var unlitMaterial = MigrationLegacyUnlitMaterial.Migrate(vrm0XMaterial);
+ if (unlitMaterial != null)
+ {
+ gltf.materials[materialIdx] = unlitMaterial;
+ continue;
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.LogException(ex);
+ }
+ }
+
+ // 3. VRM 拡張のうち、MToon 情報からの取得を試みる.
+ MigrationMToonMaterial.Migrate(gltf, vrm0);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterials.cs.meta b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterials.cs.meta
new file mode 100644
index 000000000..9924968b8
--- /dev/null
+++ b/Assets/VRM10/Runtime/Migration/Materials/MigrationMaterials.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 431e7e81ad3b4f7e9a03ad46d85f9d07
+timeCreated: 1635418411
\ No newline at end of file
diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrm.cs b/Assets/VRM10/Runtime/Migration/MigrationVrm.cs
index 64a46379e..e0039714f 100644
--- a/Assets/VRM10/Runtime/Migration/MigrationVrm.cs
+++ b/Assets/VRM10/Runtime/Migration/MigrationVrm.cs
@@ -105,9 +105,9 @@ namespace UniVRM10
UniGLTF.Extensions.VRMC_springBone.GltfSerializer.SerializeTo(ref gltf.extensions, springBone);
}
- // MToon
+ // Material
{
- MigrationMToonMaterial.Migrate(gltf, vrm0);
+ MigrationMaterials.Migrate(gltf, vrm0);
}
// Serialize whole glTF