add back protection against perfect curve segments with > 3 points

This commit is contained in:
OliBomby 2024-08-21 12:03:15 +02:00
parent db568bfb79
commit eefd7cf083
1 changed files with 12 additions and 6 deletions

View File

@ -347,17 +347,23 @@ private IEnumerable<ArraySegment<PathControlPoint>> convertPoints(PathType type,
vertices[i] = new PathControlPoint { Position = points[i] };
// Edge-case rules (to match stable).
if (type == PathType.PERFECT_CURVE && FormatVersion < LegacyBeatmapEncoder.FIRST_LAZER_VERSION)
if (type == PathType.PERFECT_CURVE)
{
int endPointLength = endPoint == null ? 0 : 1;
if (vertices.Length + endPointLength != 3)
type = PathType.BEZIER;
else if (isLinear(points[0], points[1], endPoint ?? points[2]))
if (FormatVersion < LegacyBeatmapEncoder.FIRST_LAZER_VERSION)
{
// osu-stable special-cased colinear perfect curves to a linear path
type = PathType.LINEAR;
if (vertices.Length + endPointLength != 3)
type = PathType.BEZIER;
else if (isLinear(points[0], points[1], endPoint ?? points[2]))
{
// osu-stable special-cased colinear perfect curves to a linear path
type = PathType.LINEAR;
}
}
else if (vertices.Length + endPointLength > 3)
// Lazer supports perfect curves with less than 3 points and colinear points
type = PathType.BEZIER;
}
// The first control point must have a definite type.