diff --git a/Scripts/BlendShape/Editor/VRMBlnedShapeProxyEditor.cs b/Scripts/BlendShape/Editor/VRMBlnedShapeProxyEditor.cs index 622d67328..153ddaff6 100644 --- a/Scripts/BlendShape/Editor/VRMBlnedShapeProxyEditor.cs +++ b/Scripts/BlendShape/Editor/VRMBlnedShapeProxyEditor.cs @@ -23,22 +23,14 @@ namespace VRM m_key = key; } - public void Slider() + public KeyValuePair Slider() { - if (m_target.BlendShapeAvatar == null) - { - return; - } - var oldValue = m_target.GetValue(m_key); var enable = GUI.enabled; GUI.enabled = Application.isPlaying; var newValue = EditorGUILayout.Slider(m_key.ToString(), oldValue, 0, 1.0f); GUI.enabled = enable; - if (Application.isPlaying && oldValue != newValue) - { - m_target.SetValue(m_key, newValue); - } + return new KeyValuePair(m_key, newValue); } } List m_sliders; @@ -65,12 +57,14 @@ namespace VRM EditorGUILayout.HelpBox("Enable when playing", MessageType.Info); } + if (m_target.BlendShapeAvatar == null) + { + return; + } + if (m_sliders != null) { - foreach (var slider in m_sliders) - { - slider.Slider(); - } + m_target.SetValues(m_sliders.Select(x => x.Slider())); } } } diff --git a/Scripts/BlendShape/MaterialValueBindingMerger.cs b/Scripts/BlendShape/MaterialValueBindingMerger.cs index 31c2559a4..447795bb2 100644 --- a/Scripts/BlendShape/MaterialValueBindingMerger.cs +++ b/Scripts/BlendShape/MaterialValueBindingMerger.cs @@ -14,7 +14,9 @@ namespace VRM /// /// 名前とmaterialのマッピング /// - Dictionary m_materialMap; + Dictionary m_materialMap = new Dictionary(); + + delegate void Setter(float value, bool firstValue); /// /// MaterialValueの適用値を蓄積する @@ -24,11 +26,10 @@ namespace VRM /// Dictionary m_materialValueMap = new Dictionary(); - Dictionary> m_materialSetterMap = new Dictionary>(); + Dictionary m_materialSetterMap = new Dictionary(); public MaterialValueBindingMerger(Dictionary clipMap, Transform root) { - m_materialMap = new Dictionary(); foreach (var x in root.Traverse()) { var renderer = x.GetComponent(); @@ -59,9 +60,12 @@ namespace VRM if (binding.ValueName.EndsWith("_ST_S")) { var valueName = binding.ValueName.Substring(0, binding.ValueName.Length - 2); - Action setter = value => + Setter setter = (value, firstValue) => { - var propValue = binding.BaseValue + (binding.TargetValue - binding.BaseValue) * value; + var propValue = firstValue + ? (binding.BaseValue + (binding.TargetValue - binding.BaseValue) * value) + : (target.GetVector(binding.ValueName) + (binding.TargetValue - binding.BaseValue) * value) + ; var src = target.GetVector(valueName); src.x = propValue.x; // horizontal only src.z = propValue.z; // horizontal only @@ -72,9 +76,12 @@ namespace VRM else if (binding.ValueName.EndsWith("_ST_T")) { var valueName = binding.ValueName.Substring(0, binding.ValueName.Length - 2); - Action setter = value => + Setter setter = (value, firstValue) => { - var propValue = binding.BaseValue + (binding.TargetValue - binding.BaseValue) * value; + var propValue = firstValue + ? (binding.BaseValue + (binding.TargetValue - binding.BaseValue) * value) + : (target.GetVector(binding.ValueName) + (binding.TargetValue - binding.BaseValue) * value) + ; var src = target.GetVector(valueName); src.y = propValue.y; // vertical only src.w = propValue.w; // vertical only @@ -84,9 +91,12 @@ namespace VRM } else { - Action vec4Setter = x => + Setter vec4Setter = (value, firstValue) => { - var propValue = binding.BaseValue + (binding.TargetValue - binding.BaseValue) * x; + var propValue = firstValue + ? (binding.BaseValue + (binding.TargetValue - binding.BaseValue) * value) + : (target.GetVector(binding.ValueName) + (binding.TargetValue - binding.BaseValue) * value) + ; target.SetColor(binding.ValueName, propValue); }; m_materialSetterMap.Add(binding, vec4Setter); @@ -128,10 +138,10 @@ namespace VRM { foreach (var binding in clip.MaterialValues) { - Action setter; + Setter setter; if (m_materialSetterMap.TryGetValue(binding, out setter)) { - setter(value); + setter(value, true); } } } @@ -153,14 +163,29 @@ namespace VRM } } + Dictionary m_used = new Dictionary(); + public void Apply() { + m_used.Clear(); + + // (binding.Value-Base) * weight を足す foreach (var kv in m_materialValueMap) { - Action setter; + Setter setter; if (m_materialSetterMap.TryGetValue(kv.Key, out setter)) { - setter(kv.Value); + int count; + if (m_used.TryGetValue(kv.Key.MaterialName, out count)) + { + m_used[kv.Key.MaterialName] += 1; + } + else + { + m_used.Add(kv.Key.MaterialName, 1); + } + + setter(kv.Value, count == 0); } } m_materialValueMap.Clear();