mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-09 12:29:23 -05:00
Modified MaterialValueBindingMerger.Setter
This commit is contained in:
@@ -23,22 +23,14 @@ namespace VRM
|
||||
m_key = key;
|
||||
}
|
||||
|
||||
public void Slider()
|
||||
public KeyValuePair<BlendShapeKey, float> 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<BlendShapeKey, float>(m_key, newValue);
|
||||
}
|
||||
}
|
||||
List<BlendShapeSlider> 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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,9 @@ namespace VRM
|
||||
/// <summary>
|
||||
/// 名前とmaterialのマッピング
|
||||
/// </summary>
|
||||
Dictionary<string, Material> m_materialMap;
|
||||
Dictionary<string, Material> m_materialMap = new Dictionary<string, Material>();
|
||||
|
||||
delegate void Setter(float value, bool firstValue);
|
||||
|
||||
/// <summary>
|
||||
/// MaterialValueの適用値を蓄積する
|
||||
@@ -24,11 +26,10 @@ namespace VRM
|
||||
/// <returns></returns>
|
||||
Dictionary<MaterialValueBinding, float> m_materialValueMap = new Dictionary<MaterialValueBinding, float>();
|
||||
|
||||
Dictionary<MaterialValueBinding, Action<float>> m_materialSetterMap = new Dictionary<MaterialValueBinding, Action<float>>();
|
||||
Dictionary<MaterialValueBinding, Setter> m_materialSetterMap = new Dictionary<MaterialValueBinding, Setter>();
|
||||
|
||||
public MaterialValueBindingMerger(Dictionary<BlendShapeKey, BlendShapeClip> clipMap, Transform root)
|
||||
{
|
||||
m_materialMap = new Dictionary<string, Material>();
|
||||
foreach (var x in root.Traverse())
|
||||
{
|
||||
var renderer = x.GetComponent<Renderer>();
|
||||
@@ -59,9 +60,12 @@ namespace VRM
|
||||
if (binding.ValueName.EndsWith("_ST_S"))
|
||||
{
|
||||
var valueName = binding.ValueName.Substring(0, binding.ValueName.Length - 2);
|
||||
Action<float> 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<float> 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<float> 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<float> setter;
|
||||
Setter setter;
|
||||
if (m_materialSetterMap.TryGetValue(binding, out setter))
|
||||
{
|
||||
setter(value);
|
||||
setter(value, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -153,14 +163,29 @@ namespace VRM
|
||||
}
|
||||
}
|
||||
|
||||
Dictionary<string, int> m_used = new Dictionary<string, int>();
|
||||
|
||||
public void Apply()
|
||||
{
|
||||
m_used.Clear();
|
||||
|
||||
// (binding.Value-Base) * weight を足す
|
||||
foreach (var kv in m_materialValueMap)
|
||||
{
|
||||
Action<float> 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();
|
||||
|
||||
Reference in New Issue
Block a user