Merge pull request #25269 from bdach/multiple-skips

Exclude video events from being accounted for when calculating storyboard time bounds
This commit is contained in:
Salman Ahmed 2023-10-28 04:16:36 +03:00 committed by GitHub
commit 4bdd7b2fb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 3 deletions

View File

@ -287,5 +287,26 @@ namespace osu.Game.Tests.Beatmaps.Formats
Assert.That(manyTimes.EndTime, Is.EqualTo(9000 + loop_duration));
}
}
[Test]
public void TestVideoAndBackgroundEventsDoNotAffectStoryboardBounds()
{
var decoder = new LegacyStoryboardDecoder();
using var resStream = TestResources.OpenResource("video-background-events-ignored.osb");
using var stream = new LineBufferedReader(resStream);
var storyboard = decoder.Decode(stream);
Assert.Multiple(() =>
{
Assert.That(storyboard.GetLayer(@"Video").Elements, Has.Count.EqualTo(1));
Assert.That(storyboard.GetLayer(@"Video").Elements.Single(), Is.InstanceOf<StoryboardVideo>());
Assert.That(storyboard.GetLayer(@"Video").Elements.Single().StartTime, Is.EqualTo(-5678));
Assert.That(storyboard.EarliestEventTime, Is.Null);
Assert.That(storyboard.LatestEventTime, Is.Null);
});
}
}
}

View File

@ -0,0 +1,5 @@
osu file format v14
[Events]
0,-1234,"BG.jpg",0,0
Video,-5678,"Video.avi",0,0

View File

@ -30,8 +30,12 @@ namespace osu.Game.Storyboards
/// </summary>
/// <remarks>
/// This iterates all elements and as such should be used sparingly or stored locally.
/// Sample events use their start time as "end time" during this calculation.
/// Video and background events are not included to match stable.
/// </remarks>
public double? EarliestEventTime => Layers.SelectMany(l => l.Elements).MinBy(e => e.StartTime)?.StartTime;
public double? EarliestEventTime => Layers.SelectMany(l => l.Elements)
.Where(e => e is not StoryboardVideo)
.MinBy(e => e.StartTime)?.StartTime;
/// <summary>
/// Across all layers, find the latest point in time that a storyboard element ends at.
@ -39,9 +43,12 @@ namespace osu.Game.Storyboards
/// </summary>
/// <remarks>
/// This iterates all elements and as such should be used sparingly or stored locally.
/// Videos and samples return StartTime as their EndTIme.
/// Sample events use their start time as "end time" during this calculation.
/// Video and background events are not included to match stable.
/// </remarks>
public double? LatestEventTime => Layers.SelectMany(l => l.Elements).MaxBy(e => e.GetEndTime())?.GetEndTime();
public double? LatestEventTime => Layers.SelectMany(l => l.Elements)
.Where(e => e is not StoryboardVideo)
.MaxBy(e => e.GetEndTime())?.GetEndTime();
/// <summary>
/// Depth of the currently front-most storyboard layer, excluding the overlay layer.