mirror of
https://github.com/ppy/osu.git
synced 2025-03-28 03:07:19 +08:00
filter currentEndPointPositions
This commit is contained in:
parent
98ffcd33c7
commit
b8e6a2d87b
@ -440,7 +440,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
#region Selection Movement
|
#region Selection Movement
|
||||||
|
|
||||||
private Vector2[] movementBlueprintOriginalPositions;
|
private Vector2[] movementBlueprintOriginalPositions;
|
||||||
private Vector2[] movementBlueprintEndPositions;
|
private Vector2[] movementBlueprintOriginalEndPositions;
|
||||||
private SelectionBlueprint<T>[] movementBlueprints;
|
private SelectionBlueprint<T>[] movementBlueprints;
|
||||||
private bool isDraggingBlueprint;
|
private bool isDraggingBlueprint;
|
||||||
|
|
||||||
@ -462,7 +462,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
movementBlueprints = SortForMovement(SelectionHandler.SelectedBlueprints).ToArray();
|
movementBlueprints = SortForMovement(SelectionHandler.SelectedBlueprints).ToArray();
|
||||||
movementBlueprintOriginalPositions = movementBlueprints.Select(m => m.ScreenSpaceSelectionPoint)
|
movementBlueprintOriginalPositions = movementBlueprints.Select(m => m.ScreenSpaceSelectionPoint)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
movementBlueprintEndPositions = movementBlueprints.Where(m => m.ScreenSpaceSelectionPoint != m.ScreenSpaceEndPoint)
|
movementBlueprintOriginalEndPositions = movementBlueprints.Where(m => m.ScreenSpaceSelectionPoint != m.ScreenSpaceEndPoint)
|
||||||
.Select(m => m.ScreenSpaceEndPoint)
|
.Select(m => m.ScreenSpaceEndPoint)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
@ -476,33 +476,6 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
/// <returns>Sorted blueprints.</returns>
|
/// <returns>Sorted blueprints.</returns>
|
||||||
protected virtual IEnumerable<SelectionBlueprint<T>> SortForMovement(IReadOnlyList<SelectionBlueprint<T>> blueprints) => blueprints;
|
protected virtual IEnumerable<SelectionBlueprint<T>> SortForMovement(IReadOnlyList<SelectionBlueprint<T>> blueprints) => blueprints;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check for positional snap for every given positions.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="distanceTraveled">Distance traveled since start of dragging action. </param>
|
|
||||||
/// <param name="originalPositions">The positions to check for snapping before start of dragging action. </param>
|
|
||||||
/// <param name="currentPositions">The positions to check for snapping at the current time.</param>
|
|
||||||
/// <returns>Whether found object to snap to.</returns>
|
|
||||||
private bool checkSnappingForNearbyObjects(Vector2 distanceTraveled, Vector2[] originalPositions, Vector2[] currentPositions)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < originalPositions.Length; i++)
|
|
||||||
{
|
|
||||||
Vector2 originalPosition = originalPositions[i];
|
|
||||||
var testPosition = originalPosition + distanceTraveled;
|
|
||||||
|
|
||||||
var positionalResult = snapProvider.FindSnappedPositionAndTime(testPosition, SnapType.NearbyObjects);
|
|
||||||
|
|
||||||
if (positionalResult.ScreenSpacePosition == testPosition) continue;
|
|
||||||
|
|
||||||
var delta = positionalResult.ScreenSpacePosition - currentPositions[i];
|
|
||||||
|
|
||||||
// attempt to move the objects, and abort any time based snapping if we can.
|
|
||||||
if (SelectionHandler.HandleMovement(new MoveSelectionEvent<T>(movementBlueprints[i], delta)))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Moves the current selected blueprints.
|
/// Moves the current selected blueprints.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -523,8 +496,10 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
if (checkSnappingForNearbyObjects(distanceTraveled, movementBlueprintOriginalPositions, currentSelectionPointPositions))
|
if (checkSnappingForNearbyObjects(distanceTraveled, movementBlueprintOriginalPositions, currentSelectionPointPositions))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
var currentEndPointPositions = movementBlueprints.Select(m => m.ScreenSpaceEndPoint).ToArray();
|
var currentEndPointPositions = movementBlueprints.Where(m => m.ScreenSpaceSelectionPoint != m.ScreenSpaceEndPoint)
|
||||||
if (checkSnappingForNearbyObjects(distanceTraveled, movementBlueprintEndPositions, currentEndPointPositions))
|
.Select(m => m.ScreenSpaceEndPoint)
|
||||||
|
.ToArray();
|
||||||
|
if (checkSnappingForNearbyObjects(distanceTraveled, movementBlueprintOriginalEndPositions, currentEndPointPositions))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -545,6 +520,33 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
return ApplySnapResult(movementBlueprints, result);
|
return ApplySnapResult(movementBlueprints, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check for positional snap for every given positions.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="distanceTraveled">Distance traveled since start of dragging action. </param>
|
||||||
|
/// <param name="originalPositions">The position of objects before start of dragging action. </param>
|
||||||
|
/// <param name="currentPositions">The positions of object at the current time.</param>
|
||||||
|
/// <returns>Whether found object to snap to.</returns>
|
||||||
|
private bool checkSnappingForNearbyObjects(Vector2 distanceTraveled, Vector2[] originalPositions, Vector2[] currentPositions)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < originalPositions.Length; i++)
|
||||||
|
{
|
||||||
|
Vector2 originalPosition = originalPositions[i];
|
||||||
|
var testPosition = originalPosition + distanceTraveled;
|
||||||
|
|
||||||
|
var positionalResult = snapProvider.FindSnappedPositionAndTime(testPosition, SnapType.NearbyObjects);
|
||||||
|
|
||||||
|
if (positionalResult.ScreenSpacePosition == testPosition) continue;
|
||||||
|
|
||||||
|
var delta = positionalResult.ScreenSpacePosition - currentPositions[i];
|
||||||
|
|
||||||
|
// attempt to move the objects, and abort any time based snapping if we can.
|
||||||
|
if (SelectionHandler.HandleMovement(new MoveSelectionEvent<T>(movementBlueprints[i], delta)))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
protected virtual bool ApplySnapResult(SelectionBlueprint<T>[] blueprints, SnapResult result) =>
|
protected virtual bool ApplySnapResult(SelectionBlueprint<T>[] blueprints, SnapResult result) =>
|
||||||
SelectionHandler.HandleMovement(new MoveSelectionEvent<T>(blueprints.First(), result.ScreenSpacePosition - blueprints.First().ScreenSpaceSelectionPoint));
|
SelectionHandler.HandleMovement(new MoveSelectionEvent<T>(blueprints.First(), result.ScreenSpacePosition - blueprints.First().ScreenSpaceSelectionPoint));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user