public TweenableProperty <T> AddFrame(float frame, T value, EasingFunction easingFunction) { var newFrame = new TweenKeyFrame <T>(frame, value, easingFunction); keyFrames.Add(newFrame); keyFrames = keyFrames.OrderBy(x => x.frame).ToList(); return(this); }
public bool Update(float timelineElapsed) { TweenKeyFrame <T> lastFrame = null; TweenKeyFrame <T> nextFrame = null; foreach (var frame in keyFrames) { if (frame.frame <= timelineElapsed) { lastFrame = frame; } else { nextFrame = frame; break; } } if (nextFrame == null) { if (!Done) { SetValue(lastFrame.value); } Done = true; return(false); } else { if (lastFrame == null) { var progress = timelineElapsed / nextFrame.frame; var easedProgress = nextFrame.easingFunction(progress); var newValue = lerpFunction(initialValue, nextFrame.value, easedProgress); SetValue(newValue); } else { var progress = (timelineElapsed - lastFrame.frame) / (nextFrame.frame - lastFrame.frame); var easedProgress = nextFrame.easingFunction(progress); var newValue = lerpFunction(lastFrame.value, nextFrame.value, easedProgress); SetValue(newValue); } } return(true); }