mirror of
https://github.com/ppy/osu.git
synced 2025-02-15 04:12:57 +08:00
Fix behavioural change in interaction between grid & distance snap
This commit is contained in:
parent
589035c534
commit
b04144df54
@ -52,10 +52,11 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.HitCircles
|
|||||||
|
|
||||||
public override SnapResult UpdateTimeAndPosition(Vector2 screenSpacePosition, double fallbackTime)
|
public override SnapResult UpdateTimeAndPosition(Vector2 screenSpacePosition, double fallbackTime)
|
||||||
{
|
{
|
||||||
var result = composer?.TrySnapToNearbyObjects(screenSpacePosition, fallbackTime)
|
var result = composer?.TrySnapToNearbyObjects(screenSpacePosition, fallbackTime);
|
||||||
?? composer?.TrySnapToDistanceGrid(screenSpacePosition)
|
result ??= composer?.TrySnapToDistanceGrid(screenSpacePosition);
|
||||||
?? composer?.TrySnapToPositionGrid(screenSpacePosition)
|
if (composer?.TrySnapToPositionGrid(result?.ScreenSpacePosition ?? screenSpacePosition, result?.Time ?? fallbackTime) is SnapResult gridSnapResult)
|
||||||
?? new SnapResult(screenSpacePosition, fallbackTime);
|
result = gridSnapResult;
|
||||||
|
result ??= new SnapResult(screenSpacePosition, fallbackTime);
|
||||||
|
|
||||||
UpdateTimeAndPosition(result);
|
UpdateTimeAndPosition(result);
|
||||||
HitObject.Position = ToLocalSpace(result.ScreenSpacePosition);
|
HitObject.Position = ToLocalSpace(result.ScreenSpacePosition);
|
||||||
|
@ -9,6 +9,7 @@ using System.Collections.Specialized;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Humanizer;
|
using Humanizer;
|
||||||
|
using JetBrains.Annotations;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
@ -48,6 +49,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
|
|||||||
public Action<List<PathControlPoint>> SplitControlPointsRequested;
|
public Action<List<PathControlPoint>> SplitControlPointsRequested;
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
|
[CanBeNull]
|
||||||
private OsuHitObjectComposer positionSnapProvider { get; set; }
|
private OsuHitObjectComposer positionSnapProvider { get; set; }
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
@ -433,14 +435,17 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
|
|||||||
{
|
{
|
||||||
// Special handling for selections containing head control point - the position of the hit object changes which means the snapped position and time have to be taken into account
|
// Special handling for selections containing head control point - the position of the hit object changes which means the snapped position and time have to be taken into account
|
||||||
Vector2 newHeadPosition = Parent!.ToScreenSpace(e.MousePosition + (dragStartPositions[0] - dragStartPositions[draggedControlPointIndex]));
|
Vector2 newHeadPosition = Parent!.ToScreenSpace(e.MousePosition + (dragStartPositions[0] - dragStartPositions[draggedControlPointIndex]));
|
||||||
SnapResult result = positionSnapProvider?.TrySnapToNearbyObjects(newHeadPosition, oldStartTime)
|
|
||||||
?? positionSnapProvider?.TrySnapToDistanceGrid(newHeadPosition)
|
|
||||||
?? positionSnapProvider?.TrySnapToPositionGrid(newHeadPosition);
|
|
||||||
|
|
||||||
Vector2 movementDelta = Parent!.ToLocalSpace(result?.ScreenSpacePosition ?? newHeadPosition) - hitObject.Position;
|
var result = positionSnapProvider?.TrySnapToNearbyObjects(newHeadPosition, oldStartTime);
|
||||||
|
result ??= positionSnapProvider?.TrySnapToDistanceGrid(newHeadPosition);
|
||||||
|
if (positionSnapProvider?.TrySnapToPositionGrid(result?.ScreenSpacePosition ?? newHeadPosition, result?.Time ?? oldStartTime) is SnapResult gridSnapResult)
|
||||||
|
result = gridSnapResult;
|
||||||
|
result ??= new SnapResult(newHeadPosition, oldStartTime);
|
||||||
|
|
||||||
|
Vector2 movementDelta = Parent!.ToLocalSpace(result.ScreenSpacePosition) - hitObject.Position;
|
||||||
|
|
||||||
hitObject.Position += movementDelta;
|
hitObject.Position += movementDelta;
|
||||||
hitObject.StartTime = result?.Time ?? hitObject.StartTime;
|
hitObject.StartTime = result.Time ?? hitObject.StartTime;
|
||||||
|
|
||||||
for (int i = 1; i < hitObject.Path.ControlPoints.Count; i++)
|
for (int i = 1; i < hitObject.Path.ControlPoints.Count; i++)
|
||||||
{
|
{
|
||||||
|
@ -108,10 +108,11 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
|
|
||||||
public override SnapResult UpdateTimeAndPosition(Vector2 screenSpacePosition, double fallbackTime)
|
public override SnapResult UpdateTimeAndPosition(Vector2 screenSpacePosition, double fallbackTime)
|
||||||
{
|
{
|
||||||
var result = composer?.TrySnapToNearbyObjects(screenSpacePosition, fallbackTime)
|
var result = composer?.TrySnapToNearbyObjects(screenSpacePosition, fallbackTime);
|
||||||
?? composer?.TrySnapToDistanceGrid(screenSpacePosition)
|
result ??= composer?.TrySnapToDistanceGrid(screenSpacePosition);
|
||||||
?? composer?.TrySnapToPositionGrid(screenSpacePosition)
|
if (composer?.TrySnapToPositionGrid(result?.ScreenSpacePosition ?? screenSpacePosition, result?.Time ?? fallbackTime) is SnapResult gridSnapResult)
|
||||||
?? new SnapResult(screenSpacePosition, fallbackTime);
|
result = gridSnapResult;
|
||||||
|
result ??= new SnapResult(screenSpacePosition, fallbackTime);
|
||||||
|
|
||||||
UpdateTimeAndPosition(result);
|
UpdateTimeAndPosition(result);
|
||||||
|
|
||||||
|
@ -60,7 +60,11 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
Vector2 movePosition = blueprints.First().originalSnapPositions.First() + distanceTravelled;
|
Vector2 movePosition = blueprints.First().originalSnapPositions.First() + distanceTravelled;
|
||||||
|
|
||||||
// Retrieve a snapped position.
|
// Retrieve a snapped position.
|
||||||
var result = Composer.TrySnapToDistanceGrid(movePosition) ?? Composer.TrySnapToPositionGrid(movePosition) ?? new SnapResult(movePosition, null);
|
var result = Composer.TrySnapToNearbyObjects(movePosition);
|
||||||
|
result ??= Composer.TrySnapToDistanceGrid(movePosition);
|
||||||
|
if (Composer.TrySnapToPositionGrid(result?.ScreenSpacePosition ?? movePosition, result?.Time) is SnapResult gridSnapResult)
|
||||||
|
result = gridSnapResult;
|
||||||
|
result ??= new SnapResult(movePosition, null);
|
||||||
|
|
||||||
var referenceBlueprint = blueprints.First().blueprint;
|
var referenceBlueprint = blueprints.First().blueprint;
|
||||||
bool moved = SelectionHandler.HandleMovement(new MoveSelectionEvent<HitObject>(referenceBlueprint, result.ScreenSpacePosition - referenceBlueprint.ScreenSpaceSelectionPoint));
|
bool moved = SelectionHandler.HandleMovement(new MoveSelectionEvent<HitObject>(referenceBlueprint, result.ScreenSpacePosition - referenceBlueprint.ScreenSpaceSelectionPoint));
|
||||||
|
@ -261,7 +261,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
}
|
}
|
||||||
|
|
||||||
[CanBeNull]
|
[CanBeNull]
|
||||||
public SnapResult TrySnapToPositionGrid(Vector2 screenSpacePosition)
|
public SnapResult TrySnapToPositionGrid(Vector2 screenSpacePosition, double? fallbackTime = null)
|
||||||
{
|
{
|
||||||
if (rectangularGridSnapToggle.Value != TernaryState.True)
|
if (rectangularGridSnapToggle.Value != TernaryState.True)
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
Reference in New Issue
Block a user