From 08dd6d6e62b29b06bae2f9a7dca84dcc8cef1395 Mon Sep 17 00:00:00 2001 From: MikiraSora Date: Wed, 11 Sep 2024 15:53:01 +0800 Subject: [PATCH] XGridCalculator provide new api ConvertXToXGridTotalUnit() --- .../Base/PlayerLocationRecorder.cs | 22 +++--- .../Editors/DrawPlayerLocationHelper.cs | 2 +- ...lEditorViewModel.UserInteractionActions.cs | 12 ++-- .../ViewModels/FumenVisualEditorViewModel.cs | 6 ++ .../FumenVisualEditor/XGridCalculator.cs | 70 ++++++++++--------- 5 files changed, 61 insertions(+), 51 deletions(-) diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/Base/PlayerLocationRecorder.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/Base/PlayerLocationRecorder.cs index 40128424..85115e99 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/Base/PlayerLocationRecorder.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/Base/PlayerLocationRecorder.cs @@ -13,14 +13,14 @@ public class PlayerLocationRecorder { private readonly Record defaultRecord = new Record() { - XGrid = XGrid.Zero, + XTotalUnit = 0, Time = TimeSpan.Zero }; private readonly SortableCollection list; public class Record { - public XGrid XGrid { get; set; } + public double XTotalUnit { get; set; } public TimeSpan Time { get; set; } } @@ -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.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.Return(remove); @@ -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."); } } } diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayerLocationHelper.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayerLocationHelper.cs index 15f9e948..c5c78df0 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayerLocationHelper.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayerLocationHelper.cs @@ -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); diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs index 59109a9a..ff792965 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.UserInteractionActions.cs @@ -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; @@ -984,7 +984,7 @@ public void OnMouseDown(ActionExecutionContext e) { //click player location isDraggingPlayerLocation = true; - draggingPlayerLocationCurrentX = XGridCalculator.ConvertXToXGrid(mouseX, this); + draggingPlayerLocationCurrentX = XGridCalculator.ConvertXToXGridTotalUnit(mouseX, this); } } } @@ -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); } } } @@ -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) { @@ -1427,7 +1427,7 @@ private void OnEditorUpdate(TimeSpan ts) var tGrid = TGridCalculator.ConvertAudioTimeToTGrid(CurrentPlayTime, this); var apfLane = Fumen.Lanes.GetVisibleStartObjects(tGrid, tGrid).OfType() .LastOrDefault(); - var xGrid = apfLane?.CalulateXGrid(tGrid) ?? PlayerLocationRecorder.GetLocationXGrid(CurrentPlayTime); + var xGrid = apfLane?.CalulateXGrid(tGrid)?.TotalUnit ?? PlayerLocationRecorder.GetLocationXUnit(CurrentPlayTime); PlayerLocationRecorder.Commit(CurrentPlayTime, xGrid); } diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.cs index b08ffb40..ec59e043 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.cs @@ -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): @@ -153,6 +157,8 @@ public bool BrushMode } private bool isShowCurveControlAlways = false; + private bool enableShowPlayerLocation; + public bool IsShowCurveControlAlways { get => isShowCurveControlAlways; diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/XGridCalculator.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/XGridCalculator.cs index f3e4d911..4534f4dc 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/XGridCalculator.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/XGridCalculator.cs @@ -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; + } + } }