// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osuTK; using osuTK.Graphics; using osu.Framework.Graphics; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; namespace osu.Game.Storyboards { public delegate CommandTimeline CommandTimelineSelector(CommandTimelineGroup commandTimelineGroup); public class CommandTimelineGroup { public CommandTimeline X = new CommandTimeline(); public CommandTimeline Y = new CommandTimeline(); public CommandTimeline Scale = new CommandTimeline(); public CommandTimeline VectorScale = new CommandTimeline(); public CommandTimeline Rotation = new CommandTimeline(); public CommandTimeline Colour = new CommandTimeline(); public CommandTimeline Alpha = new CommandTimeline(); public CommandTimeline BlendingParameters = new CommandTimeline(); public CommandTimeline FlipH = new CommandTimeline(); public CommandTimeline FlipV = new CommandTimeline(); private readonly ICommandTimeline[] timelines; public CommandTimelineGroup() { timelines = new ICommandTimeline[] { X, Y, Scale, VectorScale, Rotation, Colour, Alpha, BlendingParameters, FlipH, FlipV }; } [JsonIgnore] public double CommandsStartTime => timelines.Min(static t => t.StartTime); [JsonIgnore] public double CommandsEndTime => timelines.Max(static t => t.EndTime); [JsonIgnore] public double CommandsDuration => CommandsEndTime - CommandsStartTime; [JsonIgnore] public virtual double StartTime => CommandsStartTime; [JsonIgnore] public virtual double EndTime => CommandsEndTime; [JsonIgnore] public bool HasCommands => timelines.Any(static t => t.HasCommands); public virtual IEnumerable.TypedCommand> GetCommands(CommandTimelineSelector timelineSelector, double offset = 0) { if (offset != 0) { return timelineSelector(this).Commands.Select(command => new CommandTimeline.TypedCommand { Easing = command.Easing, StartTime = offset + command.StartTime, EndTime = offset + command.EndTime, StartValue = command.StartValue, EndValue = command.EndValue, }); } return timelineSelector(this).Commands; } } }