Combine implementation of time-to-position lookup

This commit is contained in:
Dean Herbert 2020-05-20 21:42:21 +09:00
parent 63b5f1a376
commit 69db62b78a
5 changed files with 29 additions and 28 deletions

View File

@ -49,6 +49,8 @@ protected ManiaPlacementBlueprintTestScene()
public Column ColumnAt(Vector2 screenSpacePosition) => column;
public Vector2 ScreenSpacePositionAtTime(double time, Column column = null) => Vector2.Zero;
public int TotalColumns => 1;
}
}

View File

@ -33,6 +33,8 @@ protected ManiaSelectionBlueprintTestScene()
public Column ColumnAt(Vector2 screenSpacePosition) => column;
public Vector2 ScreenSpacePositionAtTime(double time, Column column = null) => Vector2.Zero;
public int TotalColumns => 1;
}
}

View File

@ -20,6 +20,9 @@ public class HoldNotePlacementBlueprint : ManiaPlacementBlueprint<HoldNote>
private readonly EditNotePiece headPiece;
private readonly EditNotePiece tailPiece;
[Resolved]
private IManiaHitObjectComposer composer { get; set; }
public HoldNotePlacementBlueprint()
: base(new HoldNote())
{
@ -39,8 +42,8 @@ protected override void Update()
if (Column != null)
{
headPiece.Y = positionAt(HitObject.StartTime);
tailPiece.Y = positionAt(HitObject.EndTime);
headPiece.Y = Parent.ToLocalSpace(composer.ScreenSpacePositionAtTime(HitObject.StartTime, Column)).Y;
tailPiece.Y = Parent.ToLocalSpace(composer.ScreenSpacePositionAtTime(HitObject.EndTime, Column)).Y;
}
var topPosition = new Vector2(headPiece.DrawPosition.X, Math.Min(headPiece.DrawPosition.Y, tailPiece.DrawPosition.Y));
@ -86,21 +89,5 @@ public override void UpdatePosition(SnapResult result)
originalStartTime = HitObject.StartTime = startTime;
}
}
[Resolved]
private IScrollingInfo scrollingInfo { get; set; }
private float positionAt(double time)
{
var pos = scrollingInfo.Algorithm.PositionAt(time,
EditorClock.CurrentTime,
scrollingInfo.TimeRange.Value,
Column.HitObjectContainer.DrawHeight);
if (scrollingInfo.Direction.Value == ScrollingDirection.Down)
pos = Column.HitObjectContainer.DrawHeight - pos;
return Column.HitObjectContainer.ToSpaceOfOtherDrawable(new Vector2(0, pos), Parent).Y;
}
}
}

View File

@ -10,6 +10,8 @@ public interface IManiaHitObjectComposer
{
Column ColumnAt(Vector2 screenSpacePosition);
Vector2 ScreenSpacePositionAtTime(double time, Column column = null);
int TotalColumns { get; }
}
}

View File

@ -53,6 +53,7 @@ public override SnapResult SnapScreenSpacePositionToValidTime(Vector2 screenSpac
var hoc = column.HitObjectContainer;
// convert to local space of column so we can snap and fetch correct location.
Vector2 localPosition = hoc.ToLocalSpace(screenSpacePosition);
var scrollInfo = drawableRuleset.ScrollingInfo;
@ -65,24 +66,31 @@ public override SnapResult SnapScreenSpacePositionToValidTime(Vector2 screenSpac
localPosition.Y = hoc.DrawHeight - localPosition.Y;
}
double targetTime = scrollInfo.Algorithm.TimeAt(localPosition.Y,
EditorClock.CurrentTime,
scrollInfo.TimeRange.Value,
hoc.DrawHeight);
double targetTime = scrollInfo.Algorithm.TimeAt(localPosition.Y, EditorClock.CurrentTime, scrollInfo.TimeRange.Value, hoc.DrawHeight);
// apply beat snapping
targetTime = BeatSnapProvider.SnapTime(targetTime);
localPosition = new Vector2(
hoc.DrawWidth / 2,
scrollInfo.Algorithm.PositionAt(targetTime, EditorClock.CurrentTime, scrollInfo.TimeRange.Value, hoc.DrawHeight));
// convert back to screen space
screenSpacePosition = ScreenSpacePositionAtTime(targetTime, column);
return new ManiaSnapResult(screenSpacePosition, targetTime, column);
}
public Vector2 ScreenSpacePositionAtTime(double time, Column column = null)
{
var hoc = (column ?? Playfield.GetColumn(0)).HitObjectContainer;
var scrollInfo = drawableRuleset.ScrollingInfo;
var pos = scrollInfo.Algorithm.PositionAt(time, EditorClock.CurrentTime, scrollInfo.TimeRange.Value, hoc.DrawHeight);
if (scrollInfo.Direction.Value == ScrollingDirection.Down)
{
// reapply the above.
localPosition.Y = hoc.DrawHeight - localPosition.Y;
// as explained above
pos = hoc.DrawHeight - pos;
}
return new ManiaSnapResult(hoc.ToScreenSpace(localPosition), BeatSnapProvider.SnapTime(targetTime), column);
return hoc.ToScreenSpace(new Vector2(hoc.DrawWidth / 2, pos));
}
protected override DrawableRuleset<ManiaHitObject> CreateDrawableRuleset(Ruleset ruleset, IBeatmap beatmap, IReadOnlyList<Mod> mods = null)