using System.Collections.Generic; using System.Linq; namespace UniVRM10 { public class DefaultExpressionAccumulator : IExpressionAccumulator { Dictionary m_clipMap; Dictionary expressionKeyWeights = new Dictionary(); public bool IgnoreBlink { get; private set; } public bool IgnoreLookAt { get; private set; } public bool IgnoreMouth { get; private set; } /// /// initilaize /// /// public void OnStart(VRM10ExpressionAvatar avatar) { m_clipMap = avatar.Clips.ToDictionary(x => ExpressionKey.CreateFromClip(x), x => x); expressionKeyWeights = m_clipMap.Keys.ToDictionary(x => x, x => 0.0f); } /// /// each frame /// /// public IEnumerable> FrameExpression() { IgnoreBlink = false; IgnoreLookAt = false; IgnoreMouth = false; // // except blink, lookat, mouth // foreach (var kv in expressionKeyWeights) { if (kv.Key.IsProcedual) { // 後で continue; } var expression = m_clipMap[kv.Key]; if (expression.OverrideBlink == VrmLib.ExpressionOverrideType.Block && kv.Value > 0) { IgnoreBlink = true; } if (expression.OverrideLookAt == VrmLib.ExpressionOverrideType.Block && kv.Value > 0) { IgnoreLookAt = true; } if (expression.OverrideMouth == VrmLib.ExpressionOverrideType.Block && kv.Value > 0) { IgnoreMouth = true; } yield return kv; } // // blink, lookat, mouth // foreach (var kv in expressionKeyWeights) { if (kv.Key.IsBlink) { if (IgnoreBlink) { // skip continue; } } else if (kv.Key.IsLookAt) { if (IgnoreLookAt) { // skip continue; } } else if (kv.Key.IsMouth) { if (IgnoreMouth) { // skip continue; } } else { // already return continue; } yield return kv; } } /// /// Get a expression value /// /// /// public float GetValue(ExpressionKey key) { if (expressionKeyWeights.ContainsKey(key)) { return expressionKeyWeights[key]; } else { return 0.0f; } } public IEnumerable> GetValues() { return expressionKeyWeights.Select(x => new KeyValuePair(x.Key, x.Value)); } /// /// SetValue /// /// /// public void SetValue(ExpressionKey key, float value) { if (expressionKeyWeights.ContainsKey(key)) { expressionKeyWeights[key] = value; } } public void SetValues(IEnumerable> values) { foreach (var keyValue in values) { if (expressionKeyWeights.ContainsKey(keyValue.Key)) { expressionKeyWeights[keyValue.Key] = keyValue.Value; } } } } }