您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
73 行
2.2 KiB
73 行
2.2 KiB
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using VrmLib;
|
|
|
|
|
|
namespace UniVRM10
|
|
{
|
|
|
|
/// <summary>
|
|
/// ブレンドシェイプを蓄えてまとめて適用するクラス
|
|
/// </summary>
|
|
internal sealed class ExpressionMerger
|
|
{
|
|
/// <summary>
|
|
/// Key から Expression を得る
|
|
/// </summary>
|
|
Dictionary<ExpressionKey, VRM10Expression> m_clipMap;
|
|
|
|
/// <summary>
|
|
/// Expression のWeightを記録する
|
|
/// </summary>
|
|
Dictionary<ExpressionKey, float> m_valueMap;
|
|
|
|
MorphTargetBindingMerger m_morphTargetBindingMerger;
|
|
MaterialValueBindingMerger m_materialValueBindingMerger;
|
|
|
|
|
|
public ExpressionMerger(VRM10ObjectExpression expressions, Transform root)
|
|
{
|
|
m_clipMap = expressions.Clips.ToDictionary(x => expressions.CreateKey(x.Clip), x => x.Clip);
|
|
|
|
m_valueMap = new Dictionary<ExpressionKey, float>();
|
|
|
|
m_morphTargetBindingMerger = new MorphTargetBindingMerger(m_clipMap, root);
|
|
m_materialValueBindingMerger = new MaterialValueBindingMerger(m_clipMap, root);
|
|
}
|
|
|
|
/// <summary>
|
|
/// まとめて反映する。1フレームに1回呼び出されることを想定
|
|
/// </summary>
|
|
/// <param name="expressionWeights"></param>
|
|
public void SetValues(Dictionary<ExpressionKey, float> expressionWeights)
|
|
{
|
|
foreach (var (key, weight) in expressionWeights.Select(kv => (kv.Key, kv.Value)))
|
|
{
|
|
AccumulateValue(key, weight);
|
|
}
|
|
|
|
m_morphTargetBindingMerger.Apply();
|
|
m_materialValueBindingMerger.Apply();
|
|
}
|
|
|
|
private void AccumulateValue(ExpressionKey key, float value)
|
|
{
|
|
m_valueMap[key] = value;
|
|
|
|
VRM10Expression clip;
|
|
if (!m_clipMap.TryGetValue(key, out clip))
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_morphTargetBindingMerger.AccumulateValue(clip, value);
|
|
m_materialValueBindingMerger.AccumulateValue(clip, value);
|
|
}
|
|
|
|
public void RestoreMaterialInitialValues()
|
|
{
|
|
m_materialValueBindingMerger.RestoreMaterialInitialValues();
|
|
}
|
|
}
|
|
}
|