/// <summary> /// キーフレームをまとめて追加またはウェイト値修正する。 /// </summary> /// <param name="keyFrames">対象キーフレームリスト。</param> /// <param name="morphNames">対象モーフ名列挙。</param> /// <param name="frame">フレーム位置。</param> /// <param name="morphFrameWeightGetter"> /// 指定モーフ名&指定フレーム位置のウェイト値提供デリゲート。 /// </param> private static void AddOrModifyKeyFrames( KeyFrameList keyFrames, IEnumerable<string> morphNames, long frame, Func<string, long, float> morphFrameWeightGetter) { foreach (var name in morphNames) { // ウェイト値取得 var weight = morphFrameWeightGetter(name, frame); // 指定フレーム位置のキーフレーム取得 var frames = keyFrames.Where(f => f.MorphName == name && f.Frame == frame); if (frames.Any()) { // ウェイト値書き換え foreach (var f in frames) { f.Weight = weight; } } else { // 存在しないので追加 keyFrames.Add(new KeyFrame(name, frame, weight)); } } }
/// <summary> /// キーフレームリストから、末端および末端の次のキーフレーム位置を取得する。 /// </summary> /// <param name="keyFrames">キーフレームリスト。</param> /// <param name="frameBegin">先頭のキーフレーム位置の設定先。</param> /// <param name="frameEnd">終端のキーフレーム位置の設定先。</param> /// <param name="frameBeginNext"> /// 先頭の次のキーフレーム位置の設定先。存在しなければ null が設定される。 /// </param> /// <param name="frameEndNext"> /// 終端の手前のキーフレーム位置の設定先。存在しなければ null が設定される。 /// </param> private static void GetEdgeAndNextFrames( KeyFrameList keyFrames, out long frameBegin, out long frameEnd, out long? frameBeginNext, out long? frameEndNext) { frameBeginNext = null; frameEndNext = null; // 先頭と終端のキーフレーム位置設定 var begin = frameBegin = keyFrames.Min(f => f.Frame); var end = frameEnd = keyFrames.Max(f => f.Frame); // 先頭の次のキーフレーム位置があれば設定 var frames = keyFrames.Where(f => f.Frame > begin); if (frames.Any()) { var beginNext = frames.Min(f => f.Frame); frameBeginNext = (beginNext < end) ? (long?)beginNext : null; } // 終端の手前のキーフレーム位置があれば設定 frames = keyFrames.Where(f => f.Frame < end); if (frames.Any()) { var endNext = frames.Max(f => f.Frame); frameEndNext = (endNext > begin) ? (long?)endNext : null; } }