ppy/osu · error · NotImplementedException
BSpline conversion of arbitrary degree is not implemented.
Error message
BSpline conversion of arbitrary degree is not implemented.
What it means
Thrown as NotImplementedException by BezierConverter when converting a slider path segment of type SplineType.BSpline that carries a non-null Degree. Only degree-less (uniform) BSplines are handled; arbitrary-degree conversion to legacy Bezier is not implemented.
Source
Thrown at osu.Game/Rulesets/Objects/BezierConverter.cs:89
var segmentType = controlPoints[start].Type ?? PathType.LINEAR;
switch (segmentType.Type)
{
case SplineType.Catmull:
result.AddRange(from segment in ConvertCatmullToBezierAnchors(segmentVertices) from v in segment select v + position);
break;
case SplineType.Linear:
result.AddRange(from segment in ConvertLinearToBezierAnchors(segmentVertices) from v in segment select v + position);
break;
case SplineType.PerfectCurve:
result.AddRange(ConvertCircleToBezierAnchors(segmentVertices).Select(v => v + position));
break;
case SplineType.BSpline:
if (segmentType.Degree != null)
throw new NotImplementedException("BSpline conversion of arbitrary degree is not implemented.");
foreach (Vector2 v in segmentVertices)
{
result.Add(v + position);
}
break;
default:
throw new ArgumentOutOfRangeException(nameof(segmentType.Type), segmentType.Type, "Unsupported segment type found when converting to legacy Bezier");
}
// Start the new segment at the current vertex
start = i;
}
return result;
}
View on GitHub (pinned to d9c73e12ad)
Solutions
- Avoid arbitrary-degree BSpline control points if the path must pass through legacy/Bezier conversion.
- Update to a version that implements the conversion (or implement ConvertBSplineToBezierAnchors for the degree).
- Treat the control point as degree-less (null Degree) before conversion, which is supported.
Example fix
// before: control point with arbitrary degree
new PathControlPoint(pos, new PathType { Type = SplineType.BSpline, Degree = 3 });
// after: degree-less BSpline is supported
new PathControlPoint(pos, PathType.BSpline); Defensive patterns
Strategy: validation
Validate before calling
// before conversion, ensure BSpline control points have no arbitrary degree:
foreach (var cp in path.ControlPoints)
if (cp.Type?.Type == SplineType.BSpline && cp.Type.Degree != null)
cp.Type = PathType.BSpline; // degree-less is supported Type guard
bool IsConvertible(PathType? t)
=> t == null || t.Type != SplineType.BSpline || t.Degree == null; Try / catch
try { BezierConverter.ConvertToBezierPath(path); }
catch (NotImplementedException) { /* arbitrary-degree BSpline: downgrade or skip */ } Prevention
- Avoid arbitrary-degree BSpline control points if legacy/Bezier conversion is required.
- Pre-flatten BSpline degrees before conversion.
- Track support for BSpline conversion in the version you depend on.
When it happens
Trigger: Converting a slider path that contains a PathControlPoint segment with Type.SplineType == BSpline and a non-null Degree. The conversion path (e.g. serialising to legacy slider anchors) has no implementation for that case.
Common situations: Beatmap uses the newer lazer BSpline-with-degree control point type and is run through legacy/Bezier conversion (difficulty calculation legacy path, editor legacy export, certain tools).
Related errors
- Repeat count is way too high
- Adjust via RepeatCount instead
- Beatmap file {b.File!.Filename} could not be opened!
- Timed out while loading beatmap ({beatmapInfo}).
- Creating ruleset instance failed when attempting to create p
AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13).
Data as JSON: /api/errors/55432e0f742697f8.
Report an issue: GitHub.