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,10 +347,12 @@ private IEnumerable<ArraySegment<PathControlPoint>> convertPoints(PathType type,
vertices[i] = new PathControlPoint { Position = points[i] }; vertices[i] = new PathControlPoint { Position = points[i] };
// Edge-case rules (to match stable). // 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; int endPointLength = endPoint == null ? 0 : 1;
if (FormatVersion < LegacyBeatmapEncoder.FIRST_LAZER_VERSION)
{
if (vertices.Length + endPointLength != 3) if (vertices.Length + endPointLength != 3)
type = PathType.BEZIER; type = PathType.BEZIER;
else if (isLinear(points[0], points[1], endPoint ?? points[2])) else if (isLinear(points[0], points[1], endPoint ?? points[2]))
@ -359,6 +361,10 @@ private IEnumerable<ArraySegment<PathControlPoint>> convertPoints(PathType type,
type = PathType.LINEAR; 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. // The first control point must have a definite type.
vertices[0].Type = type; vertices[0].Type = type;