2019-01-24 08:43:03 +00:00
|
|
|
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
|
|
|
// See the LICENCE file in the repository root for full licence text.
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2019-12-18 14:59:48 +00:00
|
|
|
|
using System;
|
2018-11-20 07:51:59 +00:00
|
|
|
|
using osuTK;
|
|
|
|
|
using osuTK.Graphics;
|
2017-09-09 13:34:26 +00:00
|
|
|
|
using osu.Framework.Graphics;
|
2017-09-07 21:55:05 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2017-12-06 04:46:49 +00:00
|
|
|
|
using Newtonsoft.Json;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-09-07 21:55:05 +00:00
|
|
|
|
namespace osu.Game.Storyboards
|
|
|
|
|
{
|
2017-09-08 16:00:17 +00:00
|
|
|
|
public delegate CommandTimeline<T> CommandTimelineSelector<T>(CommandTimelineGroup commandTimelineGroup);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-09-07 21:55:05 +00:00
|
|
|
|
public class CommandTimelineGroup
|
|
|
|
|
{
|
|
|
|
|
public CommandTimeline<float> X = new CommandTimeline<float>();
|
|
|
|
|
public CommandTimeline<float> Y = new CommandTimeline<float>();
|
2019-12-18 08:21:38 +00:00
|
|
|
|
public CommandTimeline<float> Scale = new CommandTimeline<float>();
|
|
|
|
|
public CommandTimeline<Vector2> VectorScale = new CommandTimeline<Vector2>();
|
2017-09-07 21:55:05 +00:00
|
|
|
|
public CommandTimeline<float> Rotation = new CommandTimeline<float>();
|
|
|
|
|
public CommandTimeline<Color4> Colour = new CommandTimeline<Color4>();
|
|
|
|
|
public CommandTimeline<float> Alpha = new CommandTimeline<float>();
|
2019-08-21 04:29:50 +00:00
|
|
|
|
public CommandTimeline<BlendingParameters> BlendingParameters = new CommandTimeline<BlendingParameters>();
|
2017-09-07 21:55:05 +00:00
|
|
|
|
public CommandTimeline<bool> FlipH = new CommandTimeline<bool>();
|
|
|
|
|
public CommandTimeline<bool> FlipV = new CommandTimeline<bool>();
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2019-12-18 14:59:48 +00:00
|
|
|
|
private readonly ICommandTimeline[] timelines;
|
|
|
|
|
|
|
|
|
|
public CommandTimelineGroup()
|
|
|
|
|
{
|
|
|
|
|
timelines = new ICommandTimeline[]
|
|
|
|
|
{
|
|
|
|
|
X,
|
|
|
|
|
Y,
|
|
|
|
|
Scale,
|
|
|
|
|
VectorScale,
|
|
|
|
|
Rotation,
|
|
|
|
|
Colour,
|
|
|
|
|
Alpha,
|
|
|
|
|
BlendingParameters,
|
|
|
|
|
FlipH,
|
|
|
|
|
FlipV
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-06 04:46:49 +00:00
|
|
|
|
[JsonIgnore]
|
2019-12-18 14:59:48 +00:00
|
|
|
|
public double CommandsStartTime
|
2017-09-07 21:55:05 +00:00
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
2019-12-18 14:59:48 +00:00
|
|
|
|
double min = double.MaxValue;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < timelines.Length; i++)
|
|
|
|
|
min = Math.Min(min, timelines[i].StartTime);
|
|
|
|
|
|
|
|
|
|
return min;
|
2017-09-07 21:55:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-12-06 04:46:49 +00:00
|
|
|
|
[JsonIgnore]
|
2019-12-18 14:59:48 +00:00
|
|
|
|
public double CommandsEndTime
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
double max = double.MinValue;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2019-12-18 14:59:48 +00:00
|
|
|
|
for (int i = 0; i < timelines.Length; i++)
|
|
|
|
|
max = Math.Max(max, timelines[i].EndTime);
|
|
|
|
|
|
|
|
|
|
return max;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-12-06 04:46:49 +00:00
|
|
|
|
[JsonIgnore]
|
2017-09-08 16:03:04 +00:00
|
|
|
|
public double CommandsDuration => CommandsEndTime - CommandsStartTime;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-12-06 04:46:49 +00:00
|
|
|
|
[JsonIgnore]
|
2017-09-08 16:03:04 +00:00
|
|
|
|
public virtual double StartTime => CommandsStartTime;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-12-06 04:46:49 +00:00
|
|
|
|
[JsonIgnore]
|
2017-09-08 16:03:04 +00:00
|
|
|
|
public virtual double EndTime => CommandsEndTime;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-12-06 04:46:49 +00:00
|
|
|
|
[JsonIgnore]
|
2019-12-18 14:59:48 +00:00
|
|
|
|
public bool HasCommands
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < timelines.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
if (timelines[i].HasCommands)
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-09-08 16:00:17 +00:00
|
|
|
|
public virtual IEnumerable<CommandTimeline<T>.TypedCommand> GetCommands<T>(CommandTimelineSelector<T> timelineSelector, double offset = 0)
|
2017-09-07 21:55:05 +00:00
|
|
|
|
{
|
2017-09-08 16:00:17 +00:00
|
|
|
|
if (offset != 0)
|
2019-11-11 11:53:22 +00:00
|
|
|
|
{
|
2017-09-08 16:00:17 +00:00
|
|
|
|
return timelineSelector(this).Commands.Select(command =>
|
|
|
|
|
new CommandTimeline<T>.TypedCommand
|
|
|
|
|
{
|
|
|
|
|
Easing = command.Easing,
|
|
|
|
|
StartTime = offset + command.StartTime,
|
|
|
|
|
EndTime = offset + command.EndTime,
|
|
|
|
|
StartValue = command.StartValue,
|
|
|
|
|
EndValue = command.EndValue,
|
|
|
|
|
});
|
2019-11-11 11:53:22 +00:00
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-09-08 16:00:17 +00:00
|
|
|
|
return timelineSelector(this).Commands;
|
2017-09-08 10:11:57 +00:00
|
|
|
|
}
|
2017-09-07 21:55:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|