mirror of
https://github.com/ppy/osu.git
synced 2025-01-28 02:02:53 +08:00
Move distancing methods from IPositionSnapProvider
to IDistanceSnapProvider
This commit is contained in:
parent
66c730c382
commit
59cf3ff50f
@ -13,7 +13,6 @@ using osu.Game.Rulesets.Edit;
|
|||||||
using osu.Game.Rulesets.Mania.Beatmaps;
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
||||||
using osu.Game.Rulesets.Mania.Edit;
|
using osu.Game.Rulesets.Mania.Edit;
|
||||||
using osu.Game.Rulesets.Mania.UI;
|
using osu.Game.Rulesets.Mania.UI;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
using osu.Game.Rulesets.UI.Scrolling;
|
using osu.Game.Rulesets.UI.Scrolling;
|
||||||
@ -107,30 +106,5 @@ namespace osu.Game.Rulesets.Mania.Tests.Editor
|
|||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override float GetBeatSnapDistanceAt(HitObject referenceObject)
|
|
||||||
{
|
|
||||||
throw new System.NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float DurationToDistance(HitObject referenceObject, double duration)
|
|
||||||
{
|
|
||||||
throw new System.NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override double DistanceToDuration(HitObject referenceObject, float distance)
|
|
||||||
{
|
|
||||||
throw new System.NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override double GetSnappedDurationFromDistance(HitObject referenceObject, float distance)
|
|
||||||
{
|
|
||||||
throw new System.NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override float GetSnappedDistanceFromDistance(HitObject referenceObject, float distance)
|
|
||||||
{
|
|
||||||
throw new System.NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
|
|||||||
public Action<List<PathControlPoint>> RemoveControlPointsRequested;
|
public Action<List<PathControlPoint>> RemoveControlPointsRequested;
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private IPositionSnapProvider snapProvider { get; set; }
|
private IDistanceSnapProvider snapProvider { get; set; }
|
||||||
|
|
||||||
public PathControlPointVisualiser(Slider slider, bool allowSelection)
|
public PathControlPointVisualiser(Slider slider, bool allowSelection)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
private int currentSegmentLength;
|
private int currentSegmentLength;
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private HitObjectComposer composer { get; set; }
|
private IDistanceSnapProvider snapProvider { get; set; }
|
||||||
|
|
||||||
public SliderPlacementBlueprint()
|
public SliderPlacementBlueprint()
|
||||||
: base(new Objects.Slider())
|
: base(new Objects.Slider())
|
||||||
@ -220,7 +220,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
|
|
||||||
private void updateSlider()
|
private void updateSlider()
|
||||||
{
|
{
|
||||||
HitObject.Path.ExpectedDistance.Value = composer?.GetSnappedDistanceFromDistance(HitObject, (float)HitObject.Path.CalculatedDistance) ?? (float)HitObject.Path.CalculatedDistance;
|
HitObject.Path.ExpectedDistance.Value = snapProvider?.GetSnappedDistanceFromDistance(HitObject, (float)HitObject.Path.CalculatedDistance) ?? (float)HitObject.Path.CalculatedDistance;
|
||||||
|
|
||||||
bodyPiece.UpdateFrom(HitObject);
|
bodyPiece.UpdateFrom(HitObject);
|
||||||
headCirclePiece.UpdateFrom(HitObject.HeadCircle);
|
headCirclePiece.UpdateFrom(HitObject.HeadCircle);
|
||||||
|
@ -38,7 +38,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
protected PathControlPointVisualiser ControlPointVisualiser { get; private set; }
|
protected PathControlPointVisualiser ControlPointVisualiser { get; private set; }
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private HitObjectComposer composer { get; set; }
|
private IDistanceSnapProvider snapProvider { get; set; }
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private IPlacementHandler placementHandler { get; set; }
|
private IPlacementHandler placementHandler { get; set; }
|
||||||
@ -208,7 +208,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
// Move the control points from the insertion index onwards to make room for the insertion
|
// Move the control points from the insertion index onwards to make room for the insertion
|
||||||
controlPoints.Insert(insertionIndex, pathControlPoint);
|
controlPoints.Insert(insertionIndex, pathControlPoint);
|
||||||
|
|
||||||
HitObject.SnapTo(composer);
|
HitObject.SnapTo(snapProvider);
|
||||||
|
|
||||||
return pathControlPoint;
|
return pathControlPoint;
|
||||||
}
|
}
|
||||||
@ -230,7 +230,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Snap the slider to the current beat divisor before checking length validity.
|
// Snap the slider to the current beat divisor before checking length validity.
|
||||||
HitObject.SnapTo(composer);
|
HitObject.SnapTo(snapProvider);
|
||||||
|
|
||||||
// If there are 0 or 1 remaining control points, or the slider has an invalid length, it is in a degenerate form and should be deleted
|
// If there are 0 or 1 remaining control points, or the slider has an invalid length, it is in a degenerate form and should be deleted
|
||||||
if (controlPoints.Count <= 1 || !HitObject.Path.HasValidLength)
|
if (controlPoints.Count <= 1 || !HitObject.Path.HasValidLength)
|
||||||
|
@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
public class OsuSelectionHandler : EditorSelectionHandler
|
public class OsuSelectionHandler : EditorSelectionHandler
|
||||||
{
|
{
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private IPositionSnapProvider? positionSnapProvider { get; set; }
|
private IDistanceSnapProvider? snapProvider { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// During a transform, the initial origin is stored so it can be used throughout the operation.
|
/// During a transform, the initial origin is stored so it can be used throughout the operation.
|
||||||
@ -206,7 +206,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
|
|
||||||
// Snap the slider's length to the current beat divisor
|
// Snap the slider's length to the current beat divisor
|
||||||
// to calculate the final resulting duration / bounding box before the final checks.
|
// to calculate the final resulting duration / bounding box before the final checks.
|
||||||
slider.SnapTo(positionSnapProvider);
|
slider.SnapTo(snapProvider);
|
||||||
|
|
||||||
//if sliderhead or sliderend end up outside playfield, revert scaling.
|
//if sliderhead or sliderend end up outside playfield, revert scaling.
|
||||||
Quad scaledQuad = getSurroundingQuad(new OsuHitObject[] { slider });
|
Quad scaledQuad = getSurroundingQuad(new OsuHitObject[] { slider });
|
||||||
@ -219,7 +219,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
point.Position = oldControlPoints.Dequeue();
|
point.Position = oldControlPoints.Dequeue();
|
||||||
|
|
||||||
// Snap the slider's length again to undo the potentially-invalid length applied by the previous snap.
|
// Snap the slider's length again to undo the potentially-invalid length applied by the previous snap.
|
||||||
slider.SnapTo(positionSnapProvider);
|
slider.SnapTo(snapProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scaleHitObjects(OsuHitObject[] hitObjects, Anchor reference, Vector2 scale)
|
private void scaleHitObjects(OsuHitObject[] hitObjects, Anchor reference, Vector2 scale)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Edit
|
namespace osu.Game.Rulesets.Edit
|
||||||
{
|
{
|
||||||
@ -13,5 +14,45 @@ namespace osu.Game.Rulesets.Edit
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <seealso cref="BeatmapInfo.DistanceSpacing"/>
|
/// <seealso cref="BeatmapInfo.DistanceSpacing"/>
|
||||||
IBindable<double> DistanceSpacingMultiplier { get; }
|
IBindable<double> DistanceSpacingMultiplier { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves the distance between two points within a timing point that are one beat length apart.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
||||||
|
/// <returns>The distance between two points residing in the timing point that are one beat length apart.</returns>
|
||||||
|
float GetBeatSnapDistanceAt(HitObject referenceObject);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts a duration to a distance.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
||||||
|
/// <param name="duration">The duration to convert.</param>
|
||||||
|
/// <returns>A value that represents <paramref name="duration"/> as a distance in the timing point.</returns>
|
||||||
|
float DurationToDistance(HitObject referenceObject, double duration);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts a distance to a duration.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
||||||
|
/// <param name="distance">The distance to convert.</param>
|
||||||
|
/// <returns>A value that represents <paramref name="distance"/> as a duration in the timing point.</returns>
|
||||||
|
double DistanceToDuration(HitObject referenceObject, float distance);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts a distance to a snapped duration.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
||||||
|
/// <param name="distance">The distance to convert.</param>
|
||||||
|
/// <returns>A value that represents <paramref name="distance"/> as a duration snapped to the closest beat of the timing point.</returns>
|
||||||
|
double GetSnappedDurationFromDistance(HitObject referenceObject, float distance);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts an unsnapped distance to a snapped distance.
|
||||||
|
/// The returned distance will always be floored (as to never exceed the provided <paramref name="distance"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
||||||
|
/// <param name="distance">The distance to convert.</param>
|
||||||
|
/// <returns>A value that represents <paramref name="distance"/> snapped to the closest beat of the timing point.</returns>
|
||||||
|
float GetSnappedDistanceFromDistance(HitObject referenceObject, float distance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Edit
|
namespace osu.Game.Rulesets.Edit
|
||||||
@ -24,47 +23,5 @@ namespace osu.Game.Rulesets.Edit
|
|||||||
/// <param name="screenSpacePosition">The screen-space position to be snapped.</param>
|
/// <param name="screenSpacePosition">The screen-space position to be snapped.</param>
|
||||||
/// <returns>The position post-snapping. Time will always be null.</returns>
|
/// <returns>The position post-snapping. Time will always be null.</returns>
|
||||||
SnapResult SnapScreenSpacePositionToValidPosition(Vector2 screenSpacePosition);
|
SnapResult SnapScreenSpacePositionToValidPosition(Vector2 screenSpacePosition);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Retrieves the distance between two points within a timing point that are one beat length apart.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
|
||||||
/// <returns>The distance between two points residing in the timing point that are one beat length apart.</returns>
|
|
||||||
// todo: this, and other distance-related methods below it, should move to IDistanceSnapProvider.
|
|
||||||
// needs thought on how to properly share implementation, since not all composers inherit IDistanceSnapProvider.
|
|
||||||
float GetBeatSnapDistanceAt(HitObject referenceObject);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Converts a duration to a distance.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
|
||||||
/// <param name="duration">The duration to convert.</param>
|
|
||||||
/// <returns>A value that represents <paramref name="duration"/> as a distance in the timing point.</returns>
|
|
||||||
float DurationToDistance(HitObject referenceObject, double duration);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Converts a distance to a duration.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
|
||||||
/// <param name="distance">The distance to convert.</param>
|
|
||||||
/// <returns>A value that represents <paramref name="distance"/> as a duration in the timing point.</returns>
|
|
||||||
double DistanceToDuration(HitObject referenceObject, float distance);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Converts a distance to a snapped duration.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
|
||||||
/// <param name="distance">The distance to convert.</param>
|
|
||||||
/// <returns>A value that represents <paramref name="distance"/> as a duration snapped to the closest beat of the timing point.</returns>
|
|
||||||
double GetSnappedDurationFromDistance(HitObject referenceObject, float distance);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Converts an unsnapped distance to a snapped distance.
|
|
||||||
/// The returned distance will always be floored (as to never exceed the provided <paramref name="distance"/>.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="referenceObject">An object to be used as a reference point for this operation.</param>
|
|
||||||
/// <param name="distance">The distance to convert.</param>
|
|
||||||
/// <returns>A value that represents <paramref name="distance"/> snapped to the closest beat of the timing point.</returns>
|
|
||||||
float GetSnappedDistanceFromDistance(HitObject referenceObject, float distance);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Snaps the provided <paramref name="hitObject"/>'s duration using the <paramref name="snapProvider"/>.
|
/// Snaps the provided <paramref name="hitObject"/>'s duration using the <paramref name="snapProvider"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void SnapTo<THitObject>(this THitObject hitObject, IPositionSnapProvider? snapProvider)
|
public static void SnapTo<THitObject>(this THitObject hitObject, IDistanceSnapProvider? snapProvider)
|
||||||
where THitObject : HitObject, IHasPath
|
where THitObject : HitObject, IHasPath
|
||||||
{
|
{
|
||||||
hitObject.Path.ExpectedDistance.Value = snapProvider?.GetSnappedDistanceFromDistance(hitObject, (float)hitObject.Path.CalculatedDistance) ?? hitObject.Path.CalculatedDistance;
|
hitObject.Path.ExpectedDistance.Value = snapProvider?.GetSnappedDistanceFromDistance(hitObject, (float)hitObject.Path.CalculatedDistance) ?? hitObject.Path.CalculatedDistance;
|
||||||
|
@ -15,7 +15,6 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
||||||
@ -316,17 +315,5 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
|||||||
|
|
||||||
private double getTimeFromPosition(Vector2 localPosition) =>
|
private double getTimeFromPosition(Vector2 localPosition) =>
|
||||||
(localPosition.X / Content.DrawWidth) * track.Length;
|
(localPosition.X / Content.DrawWidth) * track.Length;
|
||||||
|
|
||||||
public IBindable<double> DistanceSpacingMultiplier => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public float GetBeatSnapDistanceAt(HitObject referenceObject) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public float DurationToDistance(HitObject referenceObject, double duration) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public double DistanceToDuration(HitObject referenceObject, float distance) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public double GetSnappedDurationFromDistance(HitObject referenceObject, float distance) => throw new NotImplementedException();
|
|
||||||
|
|
||||||
public float GetSnappedDistanceFromDistance(HitObject referenceObject, float distance) => throw new NotImplementedException();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user