public void Add <TProperty>(Action <T, TProperty> setter, IAnimation <TProperty> animation) { var transitions = new List <AnimationTransition <T> >(); foreach (AnimationTransition <TProperty> propertyTransition in animation) { var transition = new AnimationTransition <T> { Begin = propertyTransition.Begin, End = propertyTransition.End, Action = (ref T animatable, float advance) => { TProperty property = default(TProperty); propertyTransition.Action?.Invoke(ref property, advance); setter(animatable, property); } }; transitions.Add(transition); } if (animation.Loop) { _loopedTransitions.Add(new LoopedAnimationTransition(transitions)); } else { _transitions.AddRange(transitions); if (animation.Duration > _linearDuration) { _linearDuration = animation.Duration; } } }
public AnimationTransitionDelegate <T> this[float begin, float end] { set { var step = new AnimationTransition <T> { Begin = begin, End = end, Action = value }; _list.Add(step); } }
public IAnimation <T> Create() { float loopDuration = GetLeastCommonMultiple(_loopedTransitions.Select(x => x.Duration).ToArray()); float linearDuration = _transitions.Any() ? _transitions.Max(x => x.End) : 0; float duration; if (loopDuration.EqualsZero()) { duration = linearDuration; } else { duration = loopDuration; while (duration < linearDuration) { duration += loopDuration; } } foreach (LoopedAnimationTransition loopedAnimationTransition in _loopedTransitions) { for (float i = 0; i < duration; i += loopedAnimationTransition.Duration) { foreach (AnimationTransition <T> animationTransition in loopedAnimationTransition.Transitions) { var transition = new AnimationTransition <T> { Begin = animationTransition.Begin + i, End = animationTransition.End + i, Action = animationTransition.Action }; _transitions.Add(transition); } if (loopedAnimationTransition.Duration.EqualsZero()) { break; } } } var animation = new Animation <T>(_transitions) { Loop = Loop }; return(animation); }
public int CompareTo(AnimationTransition <T> other) { return(Begin.CompareTo(other.Begin)); }