public static TweenAnimation <T> Scale <T>(this TweenAnimation <T> tweenAnimation, Vector2 scale, float duration,
                                                   EasingFunction easingFunction)
            where T : IScalable
        {
            var scalable = tweenAnimation.Target;

            return(ScaleTo(tweenAnimation, scalable.Scale * scale, duration, easingFunction));
        }
        public static TweenAnimation <T> Rotate <T>(this TweenAnimation <T> tweenAnimation, float radians, float duration,
                                                    EasingFunction easingFunction)
            where T : IRotatable
        {
            var rotatable = tweenAnimation.Target;

            return(RotateTo(tweenAnimation, rotatable.Rotation + radians, duration, easingFunction));
        }
        public static TweenAnimation <T> Move <T>(this TweenAnimation <T> tweenAnimation, Vector2 direction, float duration,
                                                  EasingFunction easingFunction)
            where T : IMovable
        {
            var movable = tweenAnimation.Target;

            return(MoveTo(tweenAnimation, movable.Position + direction, duration, easingFunction));
        }
        public static TweenAnimation <T> ScaleTo <T>(this TweenAnimation <T> tweenAnimation, Vector2 scale, float duration,
                                                     EasingFunction easingFunction)
            where T : IScalable
        {
            var scalable = tweenAnimation.Target;

            tweenAnimation.Tweens.Add(new PropertyTween <Vector2>(() => scalable.Scale, v => scalable.Scale = v, scale,
                                                                  duration, easingFunction));
            return(tweenAnimation);
        }
        public static TweenAnimation <T> RotateTo <T>(this TweenAnimation <T> tweenAnimation, float radians, float duration,
                                                      EasingFunction easingFunction)
            where T : IRotatable
        {
            var rotatable = tweenAnimation.Target;

            tweenAnimation.Tweens.Add(new PropertyTween <float>(() => rotatable.Rotation, v => rotatable.Rotation = v,
                                                                radians, duration, easingFunction));
            return(tweenAnimation);
        }
        public static TweenAnimation <T> MoveTo <T>(this TweenAnimation <T> tweenAnimation, Vector2 position,
                                                    float duration, EasingFunction easingFunction)
            where T : IMovable
        {
            var movable = tweenAnimation.Target;

            tweenAnimation.Tweens.Add(new PropertyTween <Vector2>(() => movable.Position, v => movable.Position = v,
                                                                  position, duration, easingFunction));
            return(tweenAnimation);
        }
        public static TweenAnimation <T> FadeTo <T>(this TweenAnimation <T> tweenAnimation, float alpha, float duration,
                                                    EasingFunction easingFunction)
            where T : IColorable
        {
            var colorable    = tweenAnimation.Target;
            var initialColor = colorable.Color;

            tweenAnimation.Tweens.Add(new PropertyTween <float>(() => initialColor.A / 255f,
                                                                a => colorable.Color = initialColor * a, alpha, duration, easingFunction));
            return(tweenAnimation);
        }
 public static TweenAnimation <T> Delay <T>(this TweenAnimation <T> tweenAnimation, float duration)
 {
     tweenAnimation.Tweens.Add(new DelayTween(duration));
     return(tweenAnimation);
 }