diff --git a/osu.Game.Modes.Osu/Objects/SliderCurve.cs b/osu.Game.Modes.Osu/Objects/SliderCurve.cs index e60e58da9a..e582cca580 100644 --- a/osu.Game.Modes.Osu/Objects/SliderCurve.cs +++ b/osu.Game.Modes.Osu/Objects/SliderCurve.cs @@ -29,26 +29,21 @@ namespace osu.Game.Modes.Osu.Objects case CurveTypes.Linear: return subControlPoints; case CurveTypes.PerfectCurve: - // If we have a different amount than 3 control points, use bezier for perfect curves. - if (ControlPoints.Count != 3) - return new BezierApproximator(subControlPoints).CreateBezier(); - else - { - Debug.Assert(subControlPoints.Count == 3); + //we can only use CircularArc iff we have exactly three control points and no dissection. + if (ControlPoints.Count != 3 || subControlPoints.Count != 3) + break; - // Here we have exactly 3 control points. Attempt to fit a circular arc. - List subpath = new CircularArcApproximator(subControlPoints[0], subControlPoints[1], subControlPoints[2]).CreateArc(); + // Here we have exactly 3 control points. Attempt to fit a circular arc. + List subpath = new CircularArcApproximator(subControlPoints[0], subControlPoints[1], subControlPoints[2]).CreateArc(); - if (subpath.Count == 0) - // For some reason a circular arc could not be fit to the 3 given points. Fall back - // to a numerically stable bezier approximation. - subpath = new BezierApproximator(subControlPoints).CreateBezier(); + // If for some reason a circular arc could not be fit to the 3 given points, fall back to a numerically stable bezier approximation. + if (subpath.Count == 0) + break; - return subpath; - } - default: - return new BezierApproximator(subControlPoints).CreateBezier(); + return subpath; } + + return new BezierApproximator(subControlPoints).CreateBezier(); } private void calculatePath() @@ -181,7 +176,7 @@ namespace osu.Game.Modes.Osu.Objects path.Clear(); int i = 0; - for (; i < calculatedPath.Count && cumulativeLength[i] < d0; ++i); + for (; i < calculatedPath.Count && cumulativeLength[i] < d0; ++i) ; path.Add(interpolateVertices(i, d0) + Offset); diff --git a/osu.Game/Database/BeatmapDatabase.cs b/osu.Game/Database/BeatmapDatabase.cs index f962146717..66c348279d 100644 --- a/osu.Game/Database/BeatmapDatabase.cs +++ b/osu.Game/Database/BeatmapDatabase.cs @@ -119,10 +119,6 @@ namespace osu.Game.Database using (var reader = ArchiveReader.GetReader(storage, path)) metadata = reader.ReadMetadata(); - if (metadata.OnlineBeatmapSetID.HasValue && - connection.Table().Count(b => b.OnlineBeatmapSetID == metadata.OnlineBeatmapSetID) != 0) - return; // TODO: Update this beatmap instead - if (File.Exists(path)) // Not always the case, i.e. for LegacyFilesystemReader { using (var md5 = MD5.Create()) @@ -131,10 +127,26 @@ namespace osu.Game.Database hash = BitConverter.ToString(md5.ComputeHash(input)).Replace("-", "").ToLowerInvariant(); input.Seek(0, SeekOrigin.Begin); path = Path.Combine(@"beatmaps", hash.Remove(1), hash.Remove(2), hash); - using (var output = storage.GetStream(path, FileAccess.Write)) - input.CopyTo(output); + if (!storage.Exists(path)) + using (var output = storage.GetStream(path, FileAccess.Write)) + input.CopyTo(output); } } + + var existing = connection.Table().FirstOrDefault(b => b.Hash == hash); + + if (existing != null) + { + if (existing.DeletePending) + { + existing.DeletePending = false; + Update(existing, false); + BeatmapSetAdded?.Invoke(existing); + } + + return; + } + var beatmapSet = new BeatmapSetInfo { OnlineBeatmapSetID = metadata.OnlineBeatmapSetID,