/// <summary> /// 設定内容を基にキーフレームリストを作成する。 /// </summary> /// <param name="fps">FPS値。</param> /// <param name="beginFrame">開始フレーム位置。</param> /// <param name="morphFrameWeightGetter"> /// 挿入位置前後のウェイト値を保持するために用いる、 /// 指定モーフ名&指定フレーム位置のウェイト値提供デリゲート。 /// 非対応ならば null 。 /// IsEdgeWeightHeld プロパティ値が false の場合は無視される。 /// </param> /// <returns>キーフレームリスト。</returns> public KeyFrameList MakeKeyFrames( decimal fps, long beginFrame, Func<string, long, float> morphFrameWeightGetter) { if (this.TimelineTable == null) { throw new InvalidOperationException( "`" + nameof(TimelineTable) + "` is null."); } // キーフレームリスト作成 var maker = new KeyFrameListMaker { UnitFrameLength = this.CalcUnitFrameLength(fps), IsEdgeWeightZero = this.IsEdgeWeightZero, }; var keyFrames = maker.Make(this.TimelineTable, beginFrame); // 必要ならウェイト値修正 if ( keyFrames.Count > 0 && this.IsNaturalLink && morphFrameWeightGetter != null) { ModifyKeyFramesForEdgeWeightHeld( keyFrames, this.GetTargetMorphNames(), morphFrameWeightGetter); } return keyFrames; }
/// <summary> /// キーフレームリストを作成する。 /// </summary> /// <returns>キーフレームリスト。</returns> private static KeyFrameList MakeKeyFrameListCore( MorphTimelineTable tlTable, LipSpanRange spanRange, decimal spanFrame, long beginFrame, bool edgeWeightZero) { // 基準フレーム長算出 if (spanRange == LipSpanRange.All) { var end = tlTable.GetEndPlace(); if (end > 0) { spanFrame /= end; } } // キーフレームリスト作成 KeyFrameList dest = null; { var maker = new KeyFrameListMaker(); maker.UnitFrameLength = spanFrame; maker.IsEdgeWeightZero = edgeWeightZero; dest = maker.Make(tlTable, beginFrame); } return dest; }