Modified MaterialValueBindingMerger.Setter

This commit is contained in:
ousttrue
2018-11-03 16:58:56 +09:00
parent 6d05fb44b7
commit 7733b896ea
2 changed files with 46 additions and 27 deletions

View File

@@ -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()));
}
}
}

View File

@@ -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();