From 6a4fb470eab15e3291f2bad2ae13f119e374d398 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 1 Feb 2022 14:18:18 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[1.0]=E4=BB=95=E6=A7=98=E3=82=92=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E3=80=82Expressoin.Neutral=20=E3=81=8C=E5=85=A5?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=81=AE=E3=81=AB=E5=BF=9C=E3=81=98=E3=81=A6?= =?UTF-8?q?=20Migration=20=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/Format/Vrm/Deserializer.g.cs | 236 ++++++++++++++++++ Assets/VRM10/Runtime/Format/Vrm/Format.g.cs | 3 + .../VRM10/Runtime/Format/Vrm/Serializer.g.cs | 229 +++++++++++++++++ .../VRM10/Runtime/Migration/MigrationVrm.cs | 8 +- .../Migration/MigrationVrmExpression.cs | 1 + vrm-specification | 2 +- 6 files changed, 472 insertions(+), 7 deletions(-) diff --git a/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs b/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs index d9f7f3b88..1e74785c2 100644 --- a/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs +++ b/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs @@ -2402,6 +2402,11 @@ public static Preset __expressions_Deserialize_Preset(JsonNode parsed) continue; } + if(key=="neutral"){ + value.Neutral = __expressions__preset_Deserialize_Neutral(kv.Value); + continue; + } + } return value; } @@ -6333,6 +6338,237 @@ public static float[] __expressions__preset__lookRight__textureTransformBinds_IT return value; } +public static Expression __expressions__preset_Deserialize_Neutral(JsonNode parsed) +{ + var value = new Expression(); + + foreach(var kv in parsed.ObjectItems()) + { + var key = kv.Key.GetString(); + + if(key=="extensions"){ + value.Extensions = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="extras"){ + value.Extras = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="morphTargetBinds"){ + value.MorphTargetBinds = __expressions__preset__neutral_Deserialize_MorphTargetBinds(kv.Value); + continue; + } + + if(key=="materialColorBinds"){ + value.MaterialColorBinds = __expressions__preset__neutral_Deserialize_MaterialColorBinds(kv.Value); + continue; + } + + if(key=="textureTransformBinds"){ + value.TextureTransformBinds = __expressions__preset__neutral_Deserialize_TextureTransformBinds(kv.Value); + continue; + } + + if(key=="isBinary"){ + value.IsBinary = kv.Value.GetBoolean(); + continue; + } + + if(key=="overrideBlink"){ + value.OverrideBlink = (ExpressionOverrideType)Enum.Parse(typeof(ExpressionOverrideType), kv.Value.GetString(), true); + continue; + } + + if(key=="overrideLookAt"){ + value.OverrideLookAt = (ExpressionOverrideType)Enum.Parse(typeof(ExpressionOverrideType), kv.Value.GetString(), true); + continue; + } + + if(key=="overrideMouth"){ + value.OverrideMouth = (ExpressionOverrideType)Enum.Parse(typeof(ExpressionOverrideType), kv.Value.GetString(), true); + continue; + } + + } + return value; +} + +public static List __expressions__preset__neutral_Deserialize_MorphTargetBinds(JsonNode parsed) +{ + var value = new List(); + foreach(var x in parsed.ArrayItems()) + { + value.Add(__expressions__preset__neutral_Deserialize_MorphTargetBinds_ITEM(x)); + } + return value; +} + +public static MorphTargetBind __expressions__preset__neutral_Deserialize_MorphTargetBinds_ITEM(JsonNode parsed) +{ + var value = new MorphTargetBind(); + + foreach(var kv in parsed.ObjectItems()) + { + var key = kv.Key.GetString(); + + if(key=="extensions"){ + value.Extensions = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="extras"){ + value.Extras = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="node"){ + value.Node = kv.Value.GetInt32(); + continue; + } + + if(key=="index"){ + value.Index = kv.Value.GetInt32(); + continue; + } + + if(key=="weight"){ + value.Weight = kv.Value.GetSingle(); + continue; + } + + } + return value; +} + +public static List __expressions__preset__neutral_Deserialize_MaterialColorBinds(JsonNode parsed) +{ + var value = new List(); + foreach(var x in parsed.ArrayItems()) + { + value.Add(__expressions__preset__neutral_Deserialize_MaterialColorBinds_ITEM(x)); + } + return value; +} + +public static MaterialColorBind __expressions__preset__neutral_Deserialize_MaterialColorBinds_ITEM(JsonNode parsed) +{ + var value = new MaterialColorBind(); + + foreach(var kv in parsed.ObjectItems()) + { + var key = kv.Key.GetString(); + + if(key=="extensions"){ + value.Extensions = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="extras"){ + value.Extras = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="material"){ + value.Material = kv.Value.GetInt32(); + continue; + } + + if(key=="type"){ + value.Type = (MaterialColorType)Enum.Parse(typeof(MaterialColorType), kv.Value.GetString(), true); + continue; + } + + if(key=="targetValue"){ + value.TargetValue = __expressions__preset__neutral__materialColorBinds_ITEM_Deserialize_TargetValue(kv.Value); + continue; + } + + } + return value; +} + +public static float[] __expressions__preset__neutral__materialColorBinds_ITEM_Deserialize_TargetValue(JsonNode parsed) +{ + var value = new float[parsed.GetArrayCount()]; + int i=0; + foreach(var x in parsed.ArrayItems()) + { + value[i++] = x.GetSingle(); + } + return value; +} + +public static List __expressions__preset__neutral_Deserialize_TextureTransformBinds(JsonNode parsed) +{ + var value = new List(); + foreach(var x in parsed.ArrayItems()) + { + value.Add(__expressions__preset__neutral_Deserialize_TextureTransformBinds_ITEM(x)); + } + return value; +} + +public static TextureTransformBind __expressions__preset__neutral_Deserialize_TextureTransformBinds_ITEM(JsonNode parsed) +{ + var value = new TextureTransformBind(); + + foreach(var kv in parsed.ObjectItems()) + { + var key = kv.Key.GetString(); + + if(key=="extensions"){ + value.Extensions = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="extras"){ + value.Extras = new glTFExtensionImport(kv.Value); + continue; + } + + if(key=="material"){ + value.Material = kv.Value.GetInt32(); + continue; + } + + if(key=="scale"){ + value.Scale = __expressions__preset__neutral__textureTransformBinds_ITEM_Deserialize_Scale(kv.Value); + continue; + } + + if(key=="offset"){ + value.Offset = __expressions__preset__neutral__textureTransformBinds_ITEM_Deserialize_Offset(kv.Value); + continue; + } + + } + return value; +} + +public static float[] __expressions__preset__neutral__textureTransformBinds_ITEM_Deserialize_Scale(JsonNode parsed) +{ + var value = new float[parsed.GetArrayCount()]; + int i=0; + foreach(var x in parsed.ArrayItems()) + { + value[i++] = x.GetSingle(); + } + return value; +} + +public static float[] __expressions__preset__neutral__textureTransformBinds_ITEM_Deserialize_Offset(JsonNode parsed) +{ + var value = new float[parsed.GetArrayCount()]; + int i=0; + foreach(var x in parsed.ArrayItems()) + { + value[i++] = x.GetSingle(); + } + return value; +} + public static Dictionary __expressions_Deserialize_Custom(JsonNode parsed) { var value = new Dictionary(); diff --git a/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs b/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs index ee4218d74..f77e38eef 100644 --- a/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs +++ b/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs @@ -532,6 +532,9 @@ namespace UniGLTF.Extensions.VRMC_vrm // Definition of expression by weighted animation public Expression LookRight; + + // Definition of expression by weighted animation + public Expression Neutral; } public class Expressions diff --git a/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs b/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs index 5f6f8c3c3..26e5b7f4a 100644 --- a/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs +++ b/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs @@ -2137,6 +2137,11 @@ public static void __expressions_Serialize_Preset(JsonFormatter f, Preset value) __expressions__preset_Serialize_LookRight(f, value.LookRight); } + if(value.Neutral!=null){ + f.Key("neutral"); + __expressions__preset_Serialize_Neutral(f, value.Neutral); + } + f.EndMap(); } @@ -5948,6 +5953,230 @@ public static void __expressions__preset__lookRight__textureTransformBinds_ITEM_ f.EndList(); } +public static void __expressions__preset_Serialize_Neutral(JsonFormatter f, Expression value) +{ + f.BeginMap(); + + + if(value.Extensions!=null){ + f.Key("extensions"); + (value.Extensions as glTFExtension).Serialize(f); + } + + if(value.Extras!=null){ + f.Key("extras"); + (value.Extras as glTFExtension).Serialize(f); + } + + if(value.MorphTargetBinds!=null&&value.MorphTargetBinds.Count()>=1){ + f.Key("morphTargetBinds"); + __expressions__preset__neutral_Serialize_MorphTargetBinds(f, value.MorphTargetBinds); + } + + if(value.MaterialColorBinds!=null&&value.MaterialColorBinds.Count()>=1){ + f.Key("materialColorBinds"); + __expressions__preset__neutral_Serialize_MaterialColorBinds(f, value.MaterialColorBinds); + } + + if(value.TextureTransformBinds!=null&&value.TextureTransformBinds.Count()>=1){ + f.Key("textureTransformBinds"); + __expressions__preset__neutral_Serialize_TextureTransformBinds(f, value.TextureTransformBinds); + } + + if(value.IsBinary.HasValue){ + f.Key("isBinary"); + f.Value(value.IsBinary.GetValueOrDefault()); + } + + if(true){ + f.Key("overrideBlink"); + f.Value(value.OverrideBlink.ToString()); + } + + if(true){ + f.Key("overrideLookAt"); + f.Value(value.OverrideLookAt.ToString()); + } + + if(true){ + f.Key("overrideMouth"); + f.Value(value.OverrideMouth.ToString()); + } + + f.EndMap(); +} + +public static void __expressions__preset__neutral_Serialize_MorphTargetBinds(JsonFormatter f, List value) +{ + f.BeginList(); + + foreach(var item in value) + { + __expressions__preset__neutral_Serialize_MorphTargetBinds_ITEM(f, item); + + } + f.EndList(); +} + +public static void __expressions__preset__neutral_Serialize_MorphTargetBinds_ITEM(JsonFormatter f, MorphTargetBind value) +{ + f.BeginMap(); + + + if(value.Extensions!=null){ + f.Key("extensions"); + (value.Extensions as glTFExtension).Serialize(f); + } + + if(value.Extras!=null){ + f.Key("extras"); + (value.Extras as glTFExtension).Serialize(f); + } + + if(value.Node.HasValue){ + f.Key("node"); + f.Value(value.Node.GetValueOrDefault()); + } + + if(value.Index.HasValue){ + f.Key("index"); + f.Value(value.Index.GetValueOrDefault()); + } + + if(value.Weight.HasValue){ + f.Key("weight"); + f.Value(value.Weight.GetValueOrDefault()); + } + + f.EndMap(); +} + +public static void __expressions__preset__neutral_Serialize_MaterialColorBinds(JsonFormatter f, List value) +{ + f.BeginList(); + + foreach(var item in value) + { + __expressions__preset__neutral_Serialize_MaterialColorBinds_ITEM(f, item); + + } + f.EndList(); +} + +public static void __expressions__preset__neutral_Serialize_MaterialColorBinds_ITEM(JsonFormatter f, MaterialColorBind value) +{ + f.BeginMap(); + + + if(value.Extensions!=null){ + f.Key("extensions"); + (value.Extensions as glTFExtension).Serialize(f); + } + + if(value.Extras!=null){ + f.Key("extras"); + (value.Extras as glTFExtension).Serialize(f); + } + + if(value.Material.HasValue){ + f.Key("material"); + f.Value(value.Material.GetValueOrDefault()); + } + + if(true){ + f.Key("type"); + f.Value(value.Type.ToString()); + } + + if(value.TargetValue!=null&&value.TargetValue.Count()>=4){ + f.Key("targetValue"); + __expressions__preset__neutral__materialColorBinds_ITEM_Serialize_TargetValue(f, value.TargetValue); + } + + f.EndMap(); +} + +public static void __expressions__preset__neutral__materialColorBinds_ITEM_Serialize_TargetValue(JsonFormatter f, float[] value) +{ + f.BeginList(); + + foreach(var item in value) + { + f.Value(item); + + } + f.EndList(); +} + +public static void __expressions__preset__neutral_Serialize_TextureTransformBinds(JsonFormatter f, List value) +{ + f.BeginList(); + + foreach(var item in value) + { + __expressions__preset__neutral_Serialize_TextureTransformBinds_ITEM(f, item); + + } + f.EndList(); +} + +public static void __expressions__preset__neutral_Serialize_TextureTransformBinds_ITEM(JsonFormatter f, TextureTransformBind value) +{ + f.BeginMap(); + + + if(value.Extensions!=null){ + f.Key("extensions"); + (value.Extensions as glTFExtension).Serialize(f); + } + + if(value.Extras!=null){ + f.Key("extras"); + (value.Extras as glTFExtension).Serialize(f); + } + + if(value.Material.HasValue){ + f.Key("material"); + f.Value(value.Material.GetValueOrDefault()); + } + + if(value.Scale!=null&&value.Scale.Count()>=2){ + f.Key("scale"); + __expressions__preset__neutral__textureTransformBinds_ITEM_Serialize_Scale(f, value.Scale); + } + + if(value.Offset!=null&&value.Offset.Count()>=2){ + f.Key("offset"); + __expressions__preset__neutral__textureTransformBinds_ITEM_Serialize_Offset(f, value.Offset); + } + + f.EndMap(); +} + +public static void __expressions__preset__neutral__textureTransformBinds_ITEM_Serialize_Scale(JsonFormatter f, float[] value) +{ + f.BeginList(); + + foreach(var item in value) + { + f.Value(item); + + } + f.EndList(); +} + +public static void __expressions__preset__neutral__textureTransformBinds_ITEM_Serialize_Offset(JsonFormatter f, float[] value) +{ + f.BeginList(); + + foreach(var item in value) + { + f.Value(item); + + } + f.EndList(); +} + public static void __expressions_Serialize_Custom(JsonFormatter f, Dictionary value) { f.BeginMap(); diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrm.cs b/Assets/VRM10/Runtime/Migration/MigrationVrm.cs index 294ac93dd..83dd2bf0f 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrm.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrm.cs @@ -96,15 +96,11 @@ namespace UniVRM10 case ExpressionPreset.lookDown: SetIfNull(ref vrm1.Expressions.Preset.LookDown, expression); break; case ExpressionPreset.lookLeft: SetIfNull(ref vrm1.Expressions.Preset.LookLeft, expression); break; case ExpressionPreset.lookRight: SetIfNull(ref vrm1.Expressions.Preset.LookRight, expression); break; - case ExpressionPreset.neutral: - // TODO: 仕様確定待ち - // Presetに格上げするか、小文字にする - vrm1.Expressions.Custom[VRM10ObjectExpression.NEUTRAL_KEY] = expression; - break; + case ExpressionPreset.neutral: SetIfNull(ref vrm1.Expressions.Preset.Neutral, expression); break; case ExpressionPreset.custom: if (vrm1.Expressions.Custom.ContainsKey(customName)) { - // 同名が既存。不採用 + // 同名が既存。先着を有効とする } else { diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmExpression.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmExpression.cs index 628863a98..91ec8c21c 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmExpression.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmExpression.cs @@ -32,6 +32,7 @@ namespace UniVRM10 switch (src) { // https://github.com/vrm-c/vrm-specification/issues/185 + // https://github.com/vrm-c/UniVRM/issues/1482 case "neutral": return ExpressionPreset.neutral; case "a": return ExpressionPreset.aa; diff --git a/vrm-specification b/vrm-specification index 6fb6baaf9..4b63473e7 160000 --- a/vrm-specification +++ b/vrm-specification @@ -1 +1 @@ -Subproject commit 6fb6baaf9b9095a84fb82c8384db36e1afeb3558 +Subproject commit 4b63473e79d96ab7e52d071a5b99d643b0d7cf20 From 945873a5b346d27fc12890f81c8c4341ea4d508a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 1 Feb 2022 14:31:51 +0900 Subject: [PATCH 2/2] =?UTF-8?q?neutral=20=E9=96=A2=E9=80=A3=E5=80=8B?= =?UTF-8?q?=E6=89=80(=E3=82=B7=E3=83=AA=E3=82=A2=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=82=BA=E5=91=A8=E3=82=8A)=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScriptedImporter/VrmScriptedImporterEditorGUI.cs | 1 + .../Components/VRM10Object/VRM10ObjectExpression.cs | 2 -- Assets/VRM10/Runtime/IO/Vrm10Exporter.cs | 1 + Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 9 +-------- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs index a28a625ad..cd8f7de2a 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/VrmScriptedImporterEditorGUI.cs @@ -49,6 +49,7 @@ namespace UniVRM10 if (expressions.Preset?.LookDown != null) yield return ExpressionKey.LookDown.SubAssetKey; if (expressions.Preset?.LookLeft != null) yield return ExpressionKey.LookLeft.SubAssetKey; if (expressions.Preset?.LookRight != null) yield return ExpressionKey.LookRight.SubAssetKey; + if (expressions.Preset?.Neutral != null) yield return ExpressionKey.Neutral.SubAssetKey; if (expressions.Custom != null) { diff --git a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs index ca4b8bc99..e9a99e213 100644 --- a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs @@ -9,8 +9,6 @@ namespace UniVRM10 [Serializable] public sealed class VRM10ObjectExpression { - public const string NEUTRAL_KEY = "Neutral"; - #region Preset [SerializeField, Header("Emotion")] public VRM10Expression Happy; diff --git a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs index 5ffb52b55..b310d15db 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs @@ -628,6 +628,7 @@ namespace UniVRM10 LookDown = ExportExpression(vrmController.Vrm.Expression.LookDown, vrmController, model, converter), LookLeft = ExportExpression(vrmController.Vrm.Expression.LookLeft, vrmController, model, converter), LookRight = ExportExpression(vrmController.Vrm.Expression.LookRight, vrmController, model, converter), + Neutral = ExportExpression(vrmController.Vrm.Expression.Neutral, vrmController, model, converter), }, Custom = vrmController.Vrm.Expression.CustomClips.ToDictionary(c => c.name, c => ExportExpression(c, vrmController, model, converter)), }; diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 82dcc4a3b..d6d0b0f96 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -421,20 +421,13 @@ namespace UniVRM10 vrm.Expression.LookDown = GetOrLoadExpression(ExpressionKey.LookDown.SubAssetKey, ExpressionPreset.lookDown, vrmExtension.Expressions?.Preset?.LookDown); vrm.Expression.LookLeft = GetOrLoadExpression(ExpressionKey.LookLeft.SubAssetKey, ExpressionPreset.lookLeft, vrmExtension.Expressions?.Preset?.LookLeft); vrm.Expression.LookRight = GetOrLoadExpression(ExpressionKey.LookRight.SubAssetKey, ExpressionPreset.lookRight, vrmExtension.Expressions?.Preset?.LookRight); + vrm.Expression.Neutral = GetOrLoadExpression(ExpressionKey.Neutral.SubAssetKey, ExpressionPreset.neutral, vrmExtension.Expressions?.Preset?.Neutral); if (vrmExtension?.Expressions?.Custom != null) { foreach (var (name, expression) in vrmExtension.Expressions.Custom.Select(kv => (kv.Key, kv.Value))) { var key = ExpressionKey.CreateCustom(name); var preset = ExpressionPreset.custom; - if (preset == ExpressionPreset.custom && name == VRM10ObjectExpression.NEUTRAL_KEY) - { - // TODO: - // 注意!JsonSchema の更新待ち? - key = ExpressionKey.CreateFromPreset(ExpressionPreset.neutral); - Debug.Log($"set neutral"); - preset = ExpressionPreset.neutral; - } var clip = GetOrLoadExpression(key.SubAssetKey, preset, expression); if (clip != null) {