Skip to content

Commit

Permalink
XGridCalculator provide new api ConvertXToXGridTotalUnit()
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Sep 11, 2024
1 parent a444f30 commit 08dd6d6
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ public class PlayerLocationRecorder
{
private readonly Record defaultRecord = new Record()
{
XGrid = XGrid.Zero,
XTotalUnit = 0,
Time = TimeSpan.Zero
};
private readonly SortableCollection<Record, TimeSpan> list;

public class Record
{
public XGrid XGrid { get; set; }
public double XTotalUnit { get; set; }
public TimeSpan Time { get; set; }
}

Expand All @@ -42,17 +42,17 @@ public void Trim(TimeSpan time)
}
}

public void Commit(TimeSpan time, XGrid xGrid)
public void Commit(TimeSpan time, double xGrid)
{
Trim(time);

var record = ObjectPool<Record>.Get();
record.Time = time;
record.XGrid = xGrid;
record.XTotalUnit = xGrid;
list.Add(record);

//check and remove duplicate records
while (list.Count >= 3 && list[^1].XGrid == list[^2].XGrid && list[^2].XGrid == list[^3].XGrid)
while (list.Count >= 3 && list[^1].XTotalUnit == list[^2].XTotalUnit && list[^2].XTotalUnit == list[^3].XTotalUnit)
{
var remove = list.RemoveAt(list.Count - 2);
ObjectPool<Record>.Return(remove);
Expand Down Expand Up @@ -80,22 +80,20 @@ public double GetLocationXUnit(TimeSpan time)
}

if (next == null)
return cur.XGrid.TotalUnit;
return cur.XTotalUnit;

//limit
var t = Math.Min(time.TotalMilliseconds, next.Time.TotalMilliseconds);
t = Math.Max(t, cur.Time.TotalMilliseconds);

var calXUnit = MathUtils.CalculateXFromTwoPointFormFormula(t, cur.XGrid.TotalUnit, cur.Time.TotalMilliseconds, next.XGrid.TotalUnit, next.Time.TotalMilliseconds);
var calXUnit = MathUtils.CalculateXFromTwoPointFormFormula(t, cur.XTotalUnit, cur.Time.TotalMilliseconds, next.XTotalUnit, next.Time.TotalMilliseconds);
return calXUnit;
}

public XGrid GetLocationXGrid(TimeSpan time)
internal void Clear()
{
var xGrid = new XGrid((float)GetLocationXUnit(time), 0);
xGrid.NormalizeSelf();

return xGrid;
list.Clear();
Log.LogDebug($"recorder list has clear.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void Draw(IFumenEditorDrawingContext target)
if (!enableShowPlayerLocation)
return;

var xGrid = target.Editor.PlayerLocationRecorder.GetLocationXGrid(target.CurrentPlayTime);
var xGrid = target.Editor.PlayerLocationRecorder.GetLocationXUnit(target.CurrentPlayTime);
var tGrid = TGridCalculator.ConvertAudioTimeToTGrid(target.CurrentPlayTime, target.Editor);

var x = XGridCalculator.ConvertXGridToX(xGrid, target.Editor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -969,12 +969,12 @@ public void OnMouseDown(ActionExecutionContext e)
}
else
{
if (arg.LeftButton == MouseButtonState.Pressed)
if (arg.LeftButton == MouseButtonState.Pressed && EditorGlobalSetting.Default.EnableShowPlayerLocation)
{
//check if is dragging playerlocation

var y = TGridCalculator.ConvertAudioTimeToY_PreviewMode(CurrentPlayTime, this);
var x = XGridCalculator.ConvertXGridToX(PlayerLocationRecorder.GetLocationXGrid(CurrentPlayTime), this);
var x = XGridCalculator.ConvertXGridToX(PlayerLocationRecorder.GetLocationXUnit(CurrentPlayTime), this);

var mouseX = position.X;
var mouseY = -position.Y + Rect.MaxY;
Expand All @@ -984,7 +984,7 @@ public void OnMouseDown(ActionExecutionContext e)
{
//click player location
isDraggingPlayerLocation = true;
draggingPlayerLocationCurrentX = XGridCalculator.ConvertXToXGrid(mouseX, this);
draggingPlayerLocationCurrentX = XGridCalculator.ConvertXToXGridTotalUnit(mouseX, this);
}
}
}
Expand Down Expand Up @@ -1102,7 +1102,7 @@ public async void OnMouseMove(Point pos)
if (isDraggingPlayerLocation)
{
//update current dragging player location
draggingPlayerLocationCurrentX = XGridCalculator.ConvertXToXGrid(pos.X, this);
draggingPlayerLocationCurrentX = XGridCalculator.ConvertXToXGridTotalUnit(pos.X, this);
}
}
}
Expand Down Expand Up @@ -1415,7 +1415,7 @@ private void OnWheelBeatSplit(MouseWheelEventArgs arg)
}

private bool isDraggingPlayerLocation = false;
private XGrid draggingPlayerLocationCurrentX = XGrid.Zero;
private double draggingPlayerLocationCurrentX = 0;

private void OnEditorUpdate(TimeSpan ts)
{
Expand All @@ -1427,7 +1427,7 @@ private void OnEditorUpdate(TimeSpan ts)
var tGrid = TGridCalculator.ConvertAudioTimeToTGrid(CurrentPlayTime, this);
var apfLane = Fumen.Lanes.GetVisibleStartObjects(tGrid, tGrid).OfType<AutoplayFaderLaneStart>()
.LastOrDefault();
var xGrid = apfLane?.CalulateXGrid(tGrid) ?? PlayerLocationRecorder.GetLocationXGrid(CurrentPlayTime);
var xGrid = apfLane?.CalulateXGrid(tGrid)?.TotalUnit ?? PlayerLocationRecorder.GetLocationXUnit(CurrentPlayTime);

PlayerLocationRecorder.Commit(CurrentPlayTime, xGrid);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ private void OnSettingPropertyChanged(object sender, PropertyChangedEventArgs e)
case nameof(EditorGlobalSetting.EnablePlayFieldDrawing):
enablePlayFieldDrawing = EditorGlobalSetting.Default.EnablePlayFieldDrawing;
break;
case nameof(EditorGlobalSetting.EnableShowPlayerLocation):
enableShowPlayerLocation = EditorGlobalSetting.Default.EnableShowPlayerLocation;
PlayerLocationRecorder.Clear();
break;
case nameof(EditorGlobalSetting.XGridUnitSpace):
case nameof(EditorGlobalSetting.DisplayTimeFormat):
case nameof(EditorGlobalSetting.BeatSplit):
Expand Down Expand Up @@ -153,6 +157,8 @@ public bool BrushMode
}

private bool isShowCurveControlAlways = false;
private bool enableShowPlayerLocation;

public bool IsShowCurveControlAlways
{
get => isShowCurveControlAlways;
Expand Down
70 changes: 38 additions & 32 deletions OngekiFumenEditor/Modules/FumenVisualEditor/XGridCalculator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,48 @@

namespace OngekiFumenEditor.Modules.FumenVisualEditor
{
public static class XGridCalculator
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double CalculateXUnitSize(FumenVisualEditorViewModel editor)
=> CalculateXUnitSize(editor.Setting.XGridDisplayMaxUnit, editor.ViewWidth, editor.Setting.XGridUnitSpace);
public static class XGridCalculator
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double CalculateXUnitSize(FumenVisualEditorViewModel editor)
=> CalculateXUnitSize(editor.Setting.XGridDisplayMaxUnit, editor.ViewWidth, editor.Setting.XGridUnitSpace);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double CalculateXUnitSize(double xGridDisplayMaxUnit, double viewWidth, double xUnitSpace)
{
return viewWidth / (xGridDisplayMaxUnit * 2) * xUnitSpace;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double CalculateXUnitSize(double xGridDisplayMaxUnit, double viewWidth, double xUnitSpace)
{
return viewWidth / (xGridDisplayMaxUnit * 2) * xUnitSpace;
}

public static XGrid ConvertXToXGrid(double x, FumenVisualEditorViewModel editor)
{
var xUnit = ((x - editor.Setting.XOffset) - editor.ViewWidth / 2) / (CalculateXUnitSize(editor) / editor.Setting.XGridUnitSpace);
var nearXUnit = xUnit > 0 ? Math.Floor(xUnit + 0.5) : Math.Ceiling(xUnit - 0.5);
return new XGrid() { Unit = Math.Abs(xUnit - nearXUnit) < 0.00001 ? (int)nearXUnit : (float)xUnit };
}
public static XGrid ConvertXToXGrid(double x, FumenVisualEditorViewModel editor)
{
var xUnit = (float)ConvertXToXGridTotalUnit(x, editor);
return new XGrid() { Unit = xUnit };
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double ConvertXGridToX(XGrid xGrid, FumenVisualEditorViewModel editor)
=> ConvertXGridToX(xGrid, editor.Setting.XGridDisplayMaxUnit, editor.ViewWidth, editor.Setting.XGridUnitSpace, editor.Setting.XOffset);
public static double ConvertXToXGridTotalUnit(double x, FumenVisualEditorViewModel editor)
{
var xUnit = ((x - editor.Setting.XOffset) - editor.ViewWidth / 2) / (CalculateXUnitSize(editor) / editor.Setting.XGridUnitSpace);
var nearXUnit = xUnit > 0 ? Math.Floor(xUnit + 0.5) : Math.Ceiling(xUnit - 0.5);
return Math.Abs(xUnit - nearXUnit) < 0.00001 ? (int)nearXUnit : (float)xUnit;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double ConvertXGridToX(double xGridUnit, FumenVisualEditorViewModel editor)
=> ConvertXGridToX(xGridUnit, editor.Setting.XGridDisplayMaxUnit, editor.ViewWidth, editor.Setting.XGridUnitSpace, editor.Setting.XOffset);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double ConvertXGridToX(XGrid xGrid, FumenVisualEditorViewModel editor)
=> ConvertXGridToX(xGrid, editor.Setting.XGridDisplayMaxUnit, editor.ViewWidth, editor.Setting.XGridUnitSpace, editor.Setting.XOffset);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double ConvertXGridToX(XGrid xGrid, double xGridDisplayMaxUnit, double viewWidth, double xUnitSpace, double xOffset)
=> ConvertXGridToX(xGrid.TotalUnit, xGridDisplayMaxUnit, viewWidth, xUnitSpace, xOffset);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double ConvertXGridToX(double xGridUnit, FumenVisualEditorViewModel editor)
=> ConvertXGridToX(xGridUnit, editor.Setting.XGridDisplayMaxUnit, editor.ViewWidth, editor.Setting.XGridUnitSpace, editor.Setting.XOffset);

public static double ConvertXGridToX(double xGridUnit, double xGridDisplayMaxUnit, double viewWidth, double xUnitSpace, double xOffset)
{
var xUnitSize = CalculateXUnitSize(xGridDisplayMaxUnit, viewWidth, xUnitSpace);
var x = (xGridUnit * (xUnitSize / xUnitSpace)) + viewWidth / 2 + xOffset;
return x;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double ConvertXGridToX(XGrid xGrid, double xGridDisplayMaxUnit, double viewWidth, double xUnitSpace, double xOffset)
=> ConvertXGridToX(xGrid.TotalUnit, xGridDisplayMaxUnit, viewWidth, xUnitSpace, xOffset);

public static double ConvertXGridToX(double xGridUnit, double xGridDisplayMaxUnit, double viewWidth, double xUnitSpace, double xOffset)
{
var xUnitSize = CalculateXUnitSize(xGridDisplayMaxUnit, viewWidth, xUnitSpace);
var x = (xGridUnit * (xUnitSize / xUnitSpace)) + viewWidth / 2 + xOffset;
return x;
}
}
}

0 comments on commit 08dd6d6

Please sign in to comment.