mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 11:37:28 +08:00
Add tests for consecutive perfect-curve segments
This commit is contained in:
parent
d81f270e21
commit
dd902441b0
@ -740,6 +740,36 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
Assert.That(fifth.ControlPoints[5].Type.Value, Is.EqualTo(PathType.Bezier));
|
Assert.That(fifth.ControlPoints[5].Type.Value, Is.EqualTo(PathType.Bezier));
|
||||||
Assert.That(fifth.ControlPoints[6].Position.Value, Is.EqualTo(new Vector2(5, 5)));
|
Assert.That(fifth.ControlPoints[6].Position.Value, Is.EqualTo(new Vector2(5, 5)));
|
||||||
Assert.That(fifth.ControlPoints[6].Type.Value, Is.EqualTo(null));
|
Assert.That(fifth.ControlPoints[6].Type.Value, Is.EqualTo(null));
|
||||||
|
|
||||||
|
// Implicit perfect-curve multi-segment(Should convert to bezier to match stable)
|
||||||
|
var sixth = ((IHasPath)decoded.HitObjects[5]).Path;
|
||||||
|
|
||||||
|
Assert.That(sixth.ControlPoints[0].Position.Value, Is.EqualTo(Vector2.Zero));
|
||||||
|
Assert.That(sixth.ControlPoints[0].Type.Value == PathType.Bezier);
|
||||||
|
Assert.That(sixth.ControlPoints[1].Position.Value, Is.EqualTo(new Vector2(75, 145)));
|
||||||
|
Assert.That(sixth.ControlPoints[1].Type.Value == null);
|
||||||
|
Assert.That(sixth.ControlPoints[2].Position.Value, Is.EqualTo(new Vector2(170, 75)));
|
||||||
|
|
||||||
|
Assert.That(sixth.ControlPoints[2].Type.Value == PathType.Bezier);
|
||||||
|
Assert.That(sixth.ControlPoints[3].Position.Value, Is.EqualTo(new Vector2(300, 145)));
|
||||||
|
Assert.That(sixth.ControlPoints[3].Type.Value == null);
|
||||||
|
Assert.That(sixth.ControlPoints[4].Position.Value, Is.EqualTo(new Vector2(410, 20)));
|
||||||
|
Assert.That(sixth.ControlPoints[4].Type.Value == null);
|
||||||
|
|
||||||
|
// Explicit perfect-curve multi-segment(Should not convert to bezier)
|
||||||
|
var seventh = ((IHasPath)decoded.HitObjects[6]).Path;
|
||||||
|
|
||||||
|
Assert.That(seventh.ControlPoints[0].Position.Value, Is.EqualTo(Vector2.Zero));
|
||||||
|
Assert.That(seventh.ControlPoints[0].Type.Value == PathType.PerfectCurve);
|
||||||
|
Assert.That(seventh.ControlPoints[1].Position.Value, Is.EqualTo(new Vector2(75, 145)));
|
||||||
|
Assert.That(seventh.ControlPoints[1].Type.Value == null);
|
||||||
|
Assert.That(seventh.ControlPoints[2].Position.Value, Is.EqualTo(new Vector2(170, 75)));
|
||||||
|
|
||||||
|
Assert.That(seventh.ControlPoints[2].Type.Value == PathType.PerfectCurve);
|
||||||
|
Assert.That(seventh.ControlPoints[3].Position.Value, Is.EqualTo(new Vector2(300, 145)));
|
||||||
|
Assert.That(seventh.ControlPoints[3].Type.Value == null);
|
||||||
|
Assert.That(seventh.ControlPoints[4].Position.Value, Is.EqualTo(new Vector2(410, 20)));
|
||||||
|
Assert.That(seventh.ControlPoints[4].Type.Value == null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,3 +15,10 @@ osu file format v128
|
|||||||
|
|
||||||
// Last control point in segment duplicated
|
// Last control point in segment duplicated
|
||||||
0,0,5000,2,0,B|1:1|2:2|3:3|3:3|B|4:4|5:5,2,200
|
0,0,5000,2,0,B|1:1|2:2|3:3|3:3|B|4:4|5:5,2,200
|
||||||
|
|
||||||
|
// Implicit perfect-curve multi-segment (Should convert to bezier to match stable)
|
||||||
|
0,0,6000,2,0,P|75:145|170:75|170:75|300:145|410:20,1,475,0:0:0:0:
|
||||||
|
|
||||||
|
// Explicit perfect-curve multi-segment (Should not convert to bezier)
|
||||||
|
0,0,7000,2,0,P|75:145|P|170:75|300:145|410:20,1,650,0:0:0:0:
|
||||||
|
|
||||||
|
@ -333,7 +333,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
|
|
||||||
// Explicit segments have a new format in which the type is injected into the middle of the control point string.
|
// Explicit segments have a new format in which the type is injected into the middle of the control point string.
|
||||||
// To preserve compatibility with osu-stable as much as possible, explicit segments with the same type are converted to use implicit segments by duplicating the control point.
|
// To preserve compatibility with osu-stable as much as possible, explicit segments with the same type are converted to use implicit segments by duplicating the control point.
|
||||||
// One exception are consecutive perfect curves, which aren't supported in osu-stable
|
// One exception are consecutive perfect curves, which aren't supported in osu!stable and can lead to decoding issues if encoded as implicit segments
|
||||||
bool needsExplicitSegment = point.Type.Value != lastType || point.Type.Value == PathType.PerfectCurve;
|
bool needsExplicitSegment = point.Type.Value != lastType || point.Type.Value == PathType.PerfectCurve;
|
||||||
|
|
||||||
// Another exception to this is when the last two control points of the last segment were duplicated. This is not a scenario supported by osu!stable.
|
// Another exception to this is when the last two control points of the last segment were duplicated. This is not a scenario supported by osu!stable.
|
||||||
|
Loading…
Reference in New Issue
Block a user