public float CalculateKeyframeValue(int time) { EMA_Keyframe before = GetKeyframeBefore(time); EMA_Keyframe after = GetKeyframeAfter(time); if (before == null) { return(0f); } if (after == null) { after = new EMA_Keyframe() { Time = ushort.MaxValue, Value = before.Value }; } //Frame difference between previous frame and the current frame (current frame is AFTER the frame we want) int diff = after.Time - before.Time; //Keyframe value difference float keyframe2 = after.Value - before.Value; //Difference between the frame we WANT and the previous frame int diff2 = time - before.Time; //Divide keyframe value difference by the keyframe time difference, and then multiply it by diff2, then add the previous keyframe value return((keyframe2 / diff) * diff2 + before.Value); }
/// <summary> /// Returns the keyframe that appears just before the specified frame /// </summary> /// <returns></returns> public EMA_Keyframe GetKeyframeBefore(int time) { SortKeyframes(); EMA_Keyframe prev = null; foreach (var keyframe in Keyframes) { if (keyframe.Time >= time) { break; } prev = keyframe; } return(prev); }
public void AddKeyframesFromCommand(EMA_Command anim) { foreach (var keyframe in anim.Keyframes) { var existing = GetKeyframe(keyframe.Time); if (existing == null) { var newKeyframe = new EMA_Keyframe() { Time = keyframe.Time, Value = GetValue(keyframe.Time) }; Keyframes.Add(newKeyframe); } } }