diff --git a/Assets/VRM10/Editor/Components/Expression/SerializedExpressionEditor.cs b/Assets/VRM10/Editor/Components/Expression/SerializedExpressionEditor.cs index d4fed5534..e1218b443 100644 --- a/Assets/VRM10/Editor/Components/Expression/SerializedExpressionEditor.cs +++ b/Assets/VRM10/Editor/Components/Expression/SerializedExpressionEditor.cs @@ -80,9 +80,9 @@ namespace UniVRM10 m_expressionNameProp = serializedObject.FindProperty(nameof(targetObject.ExpressionName)); m_presetProp = serializedObject.FindProperty(nameof(targetObject.Preset)); m_isBinaryProp = serializedObject.FindProperty(nameof(targetObject.IsBinary)); - m_ignoreBlinkProp = serializedObject.FindProperty(nameof(targetObject.IgnoreBlink)); - m_ignoreLookAtProp = serializedObject.FindProperty(nameof(targetObject.IgnoreLookAt)); - m_ignoreMouthProp = serializedObject.FindProperty(nameof(targetObject.IgnoreMouth)); + m_ignoreBlinkProp = serializedObject.FindProperty(nameof(targetObject.OverrideBlink)); + m_ignoreLookAtProp = serializedObject.FindProperty(nameof(targetObject.OverrideLookAt)); + m_ignoreMouthProp = serializedObject.FindProperty(nameof(targetObject.OverrideMouth)); m_morphTargetBindings = new ReorderableMorphTargetBindingList(serializedObject, previewSceneManager, 20); m_materialColorBindings = new ReorderableMaterialColorBindingList(serializedObject, previewSceneManager?.MaterialNames, 20); diff --git a/Assets/VRM10/Runtime/Components/Expression/ExpressionAccumulator.cs b/Assets/VRM10/Runtime/Components/Expression/ExpressionAccumulator.cs index 5905c8d70..ac798fd6a 100644 --- a/Assets/VRM10/Runtime/Components/Expression/ExpressionAccumulator.cs +++ b/Assets/VRM10/Runtime/Components/Expression/ExpressionAccumulator.cs @@ -46,15 +46,15 @@ namespace UniVRM10 var expression = m_clipMap[kv.Key]; - if (expression.IgnoreBlink && kv.Value > 0) + if (expression.OverrideBlink == VrmLib.ExpressionOverrideType.Block && kv.Value > 0) { IgnoreBlink = true; } - if (expression.IgnoreLookAt && kv.Value > 0) + if (expression.OverrideLookAt == VrmLib.ExpressionOverrideType.Block && kv.Value > 0) { IgnoreLookAt = true; } - if (expression.IgnoreMouth && kv.Value > 0) + if (expression.OverrideMouth == VrmLib.ExpressionOverrideType.Block && kv.Value > 0) { IgnoreMouth = true; } diff --git a/Assets/VRM10/Runtime/Components/Expression/VRM10Expression.cs b/Assets/VRM10/Runtime/Components/Expression/VRM10Expression.cs index cbdcb333d..f5d61dfec 100644 --- a/Assets/VRM10/Runtime/Components/Expression/VRM10Expression.cs +++ b/Assets/VRM10/Runtime/Components/Expression/VRM10Expression.cs @@ -83,19 +83,19 @@ namespace UniVRM10 /// この Expression と Blink(Blink, BlinkLeft, BlinkRight) が同時に有効な場合、Blink の Weight を 0 にする /// [SerializeField] - public bool IgnoreBlink; + public VrmLib.ExpressionOverrideType OverrideBlink; /// /// この Expression と LookAt(LookUp, LookDown, LookLeft, LookRight) が同時に有効な場合、LookAt の Weight を 0 にする /// [SerializeField] - public bool IgnoreLookAt; + public VrmLib.ExpressionOverrideType OverrideLookAt; /// /// この Expression と Mouth(Aa, Ih, Ou, Ee, Oh) が同時に有効な場合、Mouth の Weight を 0 にする /// [SerializeField] - public bool IgnoreMouth; + public VrmLib.ExpressionOverrideType OverrideMouth; void Reset() { diff --git a/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs b/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs index db4400a59..2647bda07 100644 --- a/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs +++ b/Assets/VRM10/Runtime/Format/Vrm/Deserializer.g.cs @@ -1674,18 +1674,18 @@ public static Expression Deserialize_Expressions_ITEM(ListTreeNode pa continue; } - if(key=="ignoreBlink"){ - value.IgnoreBlink = kv.Value.GetBoolean(); + if(key=="overrideBlink"){ + value.OverrideBlink = (ExpressionOverrideType)Enum.Parse(typeof(ExpressionOverrideType), kv.Value.GetString(), true); continue; } - if(key=="ignoreLookAt"){ - value.IgnoreLookAt = kv.Value.GetBoolean(); + if(key=="overrideLookAt"){ + value.OverrideLookAt = (ExpressionOverrideType)Enum.Parse(typeof(ExpressionOverrideType), kv.Value.GetString(), true); continue; } - if(key=="ignoreMouth"){ - value.IgnoreMouth = kv.Value.GetBoolean(); + if(key=="overrideMouth"){ + value.OverrideMouth = (ExpressionOverrideType)Enum.Parse(typeof(ExpressionOverrideType), kv.Value.GetString(), true); continue; } diff --git a/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs b/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs index b11da0357..d2719fe49 100644 --- a/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs +++ b/Assets/VRM10/Runtime/Format/Vrm/Format.g.cs @@ -427,6 +427,14 @@ namespace UniGLTF.Extensions.VRMC_vrm public float[] Offset; } + public enum ExpressionOverrideType + { + none, + block, + blend, + + } + public class Expression { // Dictionary object with extension-specific objects. @@ -454,14 +462,17 @@ namespace UniGLTF.Extensions.VRMC_vrm // Interpret non-zero values as 1 public bool? IsBinary; - // Disable Blink when this Expression is enabled - public bool? IgnoreBlink; + // Override values of Blink expressions when this Expression is enabled + [JsonSchema(EnumSerializationType = EnumSerializationType.AsString)] + public ExpressionOverrideType OverrideBlink; - // Disable LookAt when this Expression is enabled - public bool? IgnoreLookAt; + // Override values of LookAt expressions when this Expression is enabled + [JsonSchema(EnumSerializationType = EnumSerializationType.AsString)] + public ExpressionOverrideType OverrideLookAt; - // Disable Mouth when this Expression is enabled - public bool? IgnoreMouth; + // Override values of Mouth expressions when this Expression is enabled + [JsonSchema(EnumSerializationType = EnumSerializationType.AsString)] + public ExpressionOverrideType OverrideMouth; } public class VRMC_vrm diff --git a/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs b/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs index e26f43ab5..06579e338 100644 --- a/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs +++ b/Assets/VRM10/Runtime/Format/Vrm/Serializer.g.cs @@ -1416,19 +1416,19 @@ public static void Serialize_Expressions_ITEM(JsonFormatter f, Expression value) f.Value(value.IsBinary.GetValueOrDefault()); } - if(value.IgnoreBlink.HasValue){ - f.Key("ignoreBlink"); - f.Value(value.IgnoreBlink.GetValueOrDefault()); + if(true){ + f.Key("overrideBlink"); + f.Value(value.OverrideBlink.ToString()); } - if(value.IgnoreLookAt.HasValue){ - f.Key("ignoreLookAt"); - f.Value(value.IgnoreLookAt.GetValueOrDefault()); + if(true){ + f.Key("overrideLookAt"); + f.Value(value.OverrideLookAt.ToString()); } - if(value.IgnoreMouth.HasValue){ - f.Key("ignoreMouth"); - f.Value(value.IgnoreMouth.GetValueOrDefault()); + if(true){ + f.Key("overrideMouth"); + f.Value(value.OverrideMouth.ToString()); } f.EndMap(); diff --git a/Assets/VRM10/Runtime/IO/VrmExpressionAdapter.cs b/Assets/VRM10/Runtime/IO/VrmExpressionAdapter.cs index deb5fa37f..edccc368c 100644 --- a/Assets/VRM10/Runtime/IO/VrmExpressionAdapter.cs +++ b/Assets/VRM10/Runtime/IO/VrmExpressionAdapter.cs @@ -13,9 +13,9 @@ namespace UniVRM10 x.Name, x.IsBinary.HasValue && x.IsBinary.Value) { - IgnoreBlink = x.IgnoreBlink.GetValueOrDefault(), - IgnoreLookAt = x.IgnoreLookAt.GetValueOrDefault(), - IgnoreMouth = x.IgnoreMouth.GetValueOrDefault(), + OverrideBlink = EnumUtil.Cast(x.OverrideBlink), + OverrideLookAt = EnumUtil.Cast(x.OverrideLookAt), + OverrideMouth = EnumUtil.Cast(x.OverrideMouth), }; if (x.MorphTargetBinds != null) @@ -112,9 +112,9 @@ namespace UniVRM10 Preset = (UniGLTF.Extensions.VRMC_vrm.ExpressionPreset)x.Preset, Name = x.Name, IsBinary = x.IsBinary, - IgnoreBlink = x.IgnoreBlink, - IgnoreLookAt = x.IgnoreLookAt, - IgnoreMouth = x.IgnoreMouth, + OverrideBlink = EnumUtil.Cast(x.OverrideBlink), + OverrideLookAt = EnumUtil.Cast(x.OverrideLookAt), + OverrideMouth = EnumUtil.Cast(x.OverrideMouth), }; foreach (var blendShapeBind in x.MorphTargetBinds) { diff --git a/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs b/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs index 18638530c..6c0d79a08 100644 --- a/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs +++ b/Assets/VRM10/Runtime/UnityBuilder/ComponentBuilder.cs @@ -157,9 +157,9 @@ namespace UniVRM10 clip.Preset = expression.Preset; clip.ExpressionName = expression.Name; clip.IsBinary = expression.IsBinary; - clip.IgnoreBlink = expression.IgnoreBlink; - clip.IgnoreLookAt = expression.IgnoreLookAt; - clip.IgnoreMouth = expression.IgnoreMouth; + clip.OverrideBlink = expression.OverrideBlink; + clip.OverrideLookAt = expression.OverrideLookAt; + clip.OverrideMouth = expression.OverrideMouth; clip.MorphTargetBindings = expression.MorphTargetBinds.Select(x => x.Build10(asset.Root, asset.Map)) .ToArray(); diff --git a/Assets/VRM10/Runtime/VRMConverter/RuntimeVrmConverter.cs b/Assets/VRM10/Runtime/VRMConverter/RuntimeVrmConverter.cs index 5ca371964..47c952cf1 100644 --- a/Assets/VRM10/Runtime/VRMConverter/RuntimeVrmConverter.cs +++ b/Assets/VRM10/Runtime/VRMConverter/RuntimeVrmConverter.cs @@ -126,9 +126,9 @@ namespace UniVRM10 VrmLib.Expression ToVrmLib(VRM10Expression clip, GameObject root) { var expression = new VrmLib.Expression(clip.Preset, clip.ExpressionName, clip.IsBinary); - expression.IgnoreBlink = clip.IgnoreBlink; - expression.IgnoreLookAt = clip.IgnoreLookAt; - expression.IgnoreMouth = clip.IgnoreMouth; + expression.OverrideBlink = EnumUtil.Cast(clip.OverrideBlink); + expression.OverrideLookAt = EnumUtil.Cast(clip.OverrideLookAt); + expression.OverrideMouth = EnumUtil.Cast(clip.OverrideMouth); foreach (var binding in clip.MorphTargetBindings) { diff --git a/Assets/VRM10/Tests/SerializationTests.cs b/Assets/VRM10/Tests/SerializationTests.cs index ed635f801..4e39de004 100644 --- a/Assets/VRM10/Tests/SerializationTests.cs +++ b/Assets/VRM10/Tests/SerializationTests.cs @@ -235,7 +235,7 @@ namespace UniVRM10 { var data = new UniGLTF.Extensions.VRMC_vrm.Expression(); - data.IgnoreBlink = true; + data.OverrideBlink = UniGLTF.Extensions.VRMC_vrm.ExpressionOverrideType.block; var json = Serialize(data, UniGLTF.Extensions.VRMC_vrm.GltfSerializer.Serialize_Expressions_ITEM); Assert.AreEqual($"{{{q}preset{q}:{q}custom{q},{q}ignoreBlink{q}:true}}", json); @@ -244,22 +244,22 @@ namespace UniVRM10 { var expression = new VrmLib.Expression(VrmLib.ExpressionPreset.Blink, "blink", true) { - IgnoreBlink = true, - IgnoreLookAt = true, - IgnoreMouth = true, + OverrideBlink = VrmLib.ExpressionOverrideType.Block, + OverrideLookAt = VrmLib.ExpressionOverrideType.Block, + OverrideMouth = VrmLib.ExpressionOverrideType.Block, }; // export var gltf = UniVRM10.ExpressionAdapter.ToGltf(expression, new List(), new List()); - Assert.AreEqual(true, gltf.IgnoreBlink); - Assert.AreEqual(true, gltf.IgnoreLookAt); - Assert.AreEqual(true, gltf.IgnoreMouth); + Assert.AreEqual(true, gltf.OverrideBlink); + Assert.AreEqual(true, gltf.OverrideLookAt); + Assert.AreEqual(true, gltf.OverrideMouth); // import var imported = UniVRM10.ExpressionAdapter.FromGltf(gltf, new List(), new List()); - Assert.AreEqual(true, imported.IgnoreBlink); - Assert.AreEqual(true, imported.IgnoreLookAt); - Assert.AreEqual(true, imported.IgnoreMouth); + Assert.AreEqual(true, imported.OverrideBlink); + Assert.AreEqual(true, imported.OverrideLookAt); + Assert.AreEqual(true, imported.OverrideMouth); } } } diff --git a/Assets/VRM10/vrmlib/Runtime/Vrm/Expression.cs b/Assets/VRM10/vrmlib/Runtime/Vrm/Expression.cs index 0caf33f6a..fd76d338e 100644 --- a/Assets/VRM10/vrmlib/Runtime/Vrm/Expression.cs +++ b/Assets/VRM10/vrmlib/Runtime/Vrm/Expression.cs @@ -5,6 +5,13 @@ using System.Numerics; namespace VrmLib { + public enum ExpressionOverrideType + { + None, + Block, + Blend, + } + public class Expression { public readonly ExpressionPreset Preset; @@ -12,9 +19,9 @@ namespace VrmLib public bool IsBinary; - public bool IgnoreBlink; - public bool IgnoreLookAt; - public bool IgnoreMouth; + public ExpressionOverrideType OverrideBlink; + public ExpressionOverrideType OverrideLookAt; + public ExpressionOverrideType OverrideMouth; public readonly List MorphTargetBinds = new List();