diff --git a/osu.Game.Rulesets.Osu/Edit/OsuSelectionHandler.cs b/osu.Game.Rulesets.Osu/Edit/OsuSelectionHandler.cs
index 3a1ff34fb9..c591b79b29 100644
--- a/osu.Game.Rulesets.Osu/Edit/OsuSelectionHandler.cs
+++ b/osu.Game.Rulesets.Osu/Edit/OsuSelectionHandler.cs
@@ -253,7 +253,7 @@ namespace osu.Game.Rulesets.Osu.Edit
{
var hitObjects = selectedMovableObjects;
- Quad quad = GeometryUtils.GetSurroundingQuad(hitObjects);
+ Quad quad = GeometryUtils.GetSurroundingQuad(hitObjects, true);
Vector2 delta = Vector2.Zero;
diff --git a/osu.Game.Rulesets.Osu/Edit/OsuSelectionScaleHandler.cs b/osu.Game.Rulesets.Osu/Edit/OsuSelectionScaleHandler.cs
index 9a5d3c3bc1..3072e5d11b 100644
--- a/osu.Game.Rulesets.Osu/Edit/OsuSelectionScaleHandler.cs
+++ b/osu.Game.Rulesets.Osu/Edit/OsuSelectionScaleHandler.cs
@@ -81,12 +81,8 @@ namespace osu.Game.Rulesets.Osu.Edit
changeHandler?.BeginChange();
objectsInScale = selectedMovableObjects.ToDictionary(ho => ho, ho => new OriginalHitObjectState(ho));
- OriginalSurroundingQuad = objectsInScale.Count == 1 && objectsInScale.First().Key is Slider slider
- ? GeometryUtils.GetSurroundingQuad(slider.Path.ControlPoints.Select(p => slider.Position + p.Position))
- : GeometryUtils.GetSurroundingQuad(objectsInScale.Keys);
- originalConvexHull = objectsInScale.Count == 1 && objectsInScale.First().Key is Slider slider2
- ? GeometryUtils.GetConvexHull(slider2.Path.ControlPoints.Select(p => slider2.Position + p.Position))
- : GeometryUtils.GetConvexHull(objectsInScale.Keys);
+ OriginalSurroundingQuad = GeometryUtils.GetSurroundingQuad(objectsInScale.Keys);
+ originalConvexHull = GeometryUtils.GetConvexHull(objectsInScale.Keys);
defaultOrigin = GeometryUtils.MinimumEnclosingCircle(originalConvexHull).Item1;
}
diff --git a/osu.Game/Utils/GeometryUtils.cs b/osu.Game/Utils/GeometryUtils.cs
index eac86a9c02..185b1cc4f1 100644
--- a/osu.Game/Utils/GeometryUtils.cs
+++ b/osu.Game/Utils/GeometryUtils.cs
@@ -144,8 +144,9 @@ namespace osu.Game.Utils
/// Returns a gamefield-space quad surrounding the provided hit objects.
///
/// The hit objects to calculate a quad for.
- public static Quad GetSurroundingQuad(IEnumerable hitObjects) =>
- GetSurroundingQuad(enumerateStartAndEndPositions(hitObjects));
+ /// Whether to only include the start and end positions of the slider, or include every control point in the slider.
+ public static Quad GetSurroundingQuad(IEnumerable hitObjects, bool startAndEndOnly = false) =>
+ GetSurroundingQuad(startAndEndOnly ? enumerateStartAndEndPositions(hitObjects) : enumeratePositions(hitObjects));
///
/// Returns the points that make up the convex hull of the provided points.
@@ -202,7 +203,7 @@ namespace osu.Game.Utils
}
public static List GetConvexHull(IEnumerable hitObjects) =>
- GetConvexHull(enumerateStartAndEndPositions(hitObjects));
+ GetConvexHull(enumeratePositions(hitObjects));
private static IEnumerable enumerateStartAndEndPositions(IEnumerable hitObjects) =>
hitObjects.SelectMany(h =>
@@ -220,6 +221,17 @@ namespace osu.Game.Utils
return new[] { h.Position };
});
+ private static IEnumerable enumeratePositions(IEnumerable hitObjects) =>
+ hitObjects.SelectMany(h =>
+ {
+ if (h is IHasPath path)
+ {
+ return path.Path.ControlPoints.Select(p => h.Position + p.Position);
+ }
+
+ return new[] { h.Position };
+ });
+
#region Welzl helpers
// Function to check whether a point lies inside or on the boundaries of the circle