mirror of
https://github.com/ppy/osu
synced 2025-01-26 15:53:12 +00:00
Move scaling logic out of OsuSelectionHandler
for reuse
This commit is contained in:
parent
87833bfb61
commit
a0f67ef3bc
@ -225,26 +225,10 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
private void scaleHitObjects(OsuHitObject[] hitObjects, Anchor reference, Vector2 scale)
|
private void scaleHitObjects(OsuHitObject[] hitObjects, Anchor reference, Vector2 scale)
|
||||||
{
|
{
|
||||||
scale = getClampedScale(hitObjects, reference, scale);
|
scale = getClampedScale(hitObjects, reference, scale);
|
||||||
|
|
||||||
// move the selection before scaling if dragging from top or left anchors.
|
|
||||||
float xOffset = ((reference & Anchor.x0) > 0) ? -scale.X : 0;
|
|
||||||
float yOffset = ((reference & Anchor.y0) > 0) ? -scale.Y : 0;
|
|
||||||
|
|
||||||
Quad selectionQuad = getSurroundingQuad(hitObjects);
|
Quad selectionQuad = getSurroundingQuad(hitObjects);
|
||||||
|
|
||||||
foreach (var h in hitObjects)
|
foreach (var h in hitObjects)
|
||||||
{
|
h.Position = GetScaledPosition(reference, scale, selectionQuad, h.Position);
|
||||||
var newPosition = h.Position;
|
|
||||||
|
|
||||||
// guard against no-ops and NaN.
|
|
||||||
if (scale.X != 0 && selectionQuad.Width > 0)
|
|
||||||
newPosition.X = selectionQuad.TopLeft.X + xOffset + (h.X - selectionQuad.TopLeft.X) / selectionQuad.Width * (selectionQuad.Width + scale.X);
|
|
||||||
|
|
||||||
if (scale.Y != 0 && selectionQuad.Height > 0)
|
|
||||||
newPosition.Y = selectionQuad.TopLeft.Y + yOffset + (h.Y - selectionQuad.TopLeft.Y) / selectionQuad.Height * (selectionQuad.Height + scale.Y);
|
|
||||||
|
|
||||||
h.Position = newPosition;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private (bool X, bool Y) isQuadInBounds(Quad quad)
|
private (bool X, bool Y) isQuadInBounds(Quad quad)
|
||||||
|
@ -375,6 +375,26 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Given a scale vector, a surrounding quad for all selected objects, and a position,
|
||||||
|
/// will return the scaled position in screen space coordinates.
|
||||||
|
/// </summary>
|
||||||
|
protected static Vector2 GetScaledPosition(Anchor reference, Vector2 scale, Quad selectionQuad, Vector2 position)
|
||||||
|
{
|
||||||
|
// adjust the direction of scale depending on which side the user is dragging.
|
||||||
|
float xOffset = ((reference & Anchor.x0) > 0) ? -scale.X : 0;
|
||||||
|
float yOffset = ((reference & Anchor.y0) > 0) ? -scale.Y : 0;
|
||||||
|
|
||||||
|
// guard against no-ops and NaN.
|
||||||
|
if (scale.X != 0 && selectionQuad.Width > 0)
|
||||||
|
position.X = selectionQuad.TopLeft.X + xOffset + (position.X - selectionQuad.TopLeft.X) / selectionQuad.Width * (selectionQuad.Width + scale.X);
|
||||||
|
|
||||||
|
if (scale.Y != 0 && selectionQuad.Height > 0)
|
||||||
|
position.Y = selectionQuad.TopLeft.Y + yOffset + (position.Y - selectionQuad.TopLeft.Y) / selectionQuad.Height * (selectionQuad.Height + scale.Y);
|
||||||
|
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a quad surrounding the provided points.
|
/// Returns a quad surrounding the provided points.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
Loading…
Reference in New Issue
Block a user