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

  1. Avoid arbitrary-degree BSpline control points if the path must pass through legacy/Bezier conversion.
  2. Update to a version that implements the conversion (or implement ConvertBSplineToBezierAnchors for the degree).
  3. 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

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


AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13). Data as JSON: /api/errors/55432e0f742697f8. Report an issue: GitHub.