Skip to content

Commit

Permalink
implement PlayerLocationRecorder for record player location within pr…
Browse files Browse the repository at this point in the history
…eview
  • Loading branch information
MikiraSora committed Sep 10, 2024
1 parent 3467cc6 commit d4ea7d5
Show file tree
Hide file tree
Showing 12 changed files with 616 additions and 422 deletions.
15 changes: 8 additions & 7 deletions OngekiFumenEditor/AppBootstrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using OngekiFumenEditor.Kernel.Audio;
using OngekiFumenEditor.Kernel.Scheduler;
using OngekiFumenEditor.Modules.AudioPlayerToolViewer;
using OngekiFumenEditor.Modules.FumenVisualEditor.Base;
using OngekiFumenEditor.Modules.SplashScreen;
using OngekiFumenEditor.Properties;
using OngekiFumenEditor.UI.KeyBinding.Input;
Expand Down Expand Up @@ -89,7 +90,7 @@ protected override void BindServices(CompositionBatch batch)
.Where(x => x.GetName().Name == pluginsName).FirstOrDefault();
if (pluginDllAssembly != null)
{
AssemblySource.AddRange(new[] {pluginDllAssembly});
AssemblySource.AddRange(new[] { pluginDllAssembly });
Debug.WriteLine($"Add plugin assembly {pluginDllAssembly.GetName().Name}.dll into AssemblySource");
}
}
Expand All @@ -114,18 +115,18 @@ protected override void Configure()
.Replace("[", string.Empty)
.Replace("]", string.Empty);

var splits = triggerDetail.Split((char[]) null, StringSplitOptions.RemoveEmptyEntries);
var splits = triggerDetail.Split((char[])null, StringSplitOptions.RemoveEmptyEntries);

switch (splits[0])
{
case "Key":
var key = (Key) Enum.Parse(typeof(Key), splits[1], true);
return new KeyTrigger {Key = key};
var key = (Key)Enum.Parse(typeof(Key), splits[1], true);
return new KeyTrigger { Key = key };

case "Gesture":
var mkg = (MultiKeyGesture) new MultiKeyGestureConverter().ConvertFrom(splits[1]);
var mkg = (MultiKeyGesture)new MultiKeyGestureConverter().ConvertFrom(splits[1]);
return new KeyTrigger
{Modifiers = mkg.KeySequences[0].Modifiers, Key = mkg.KeySequences[0].Keys[0]};
{ Modifiers = mkg.KeySequences[0].Modifiers, Key = mkg.KeySequences[0].Keys[0] };
}

return defaultCreateTrigger(target, triggerText);
Expand Down Expand Up @@ -280,7 +281,7 @@ private async void MainWindow_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
var files = (string[]) e.Data.GetData(DataFormats.FileDrop);
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files != null && files.Length == 1)
{
var filePath = files[0];
Expand Down
200 changes: 106 additions & 94 deletions OngekiFumenEditor/Base/Collections/Base/SortableCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,103 +6,115 @@

namespace OngekiFumenEditor.Base.Collections.Base
{
public class SortableCollection<T, X> : IBinaryFindRangeEnumable<T, X> where X : IComparable<X>
{
private List<T> items = new();
private readonly Func<T, X> sortKeySelector;
private ComparerWrapper<T> comparer;

public bool IsBatching { get; private set; }
public int Count => items.Count;

public int Capacity
{
get => items.Capacity;
set => items.Capacity = value;
}

public T this[int i] => items[i];

public SortableCollection(Func<T, X> sortKeySelector)
{
comparer = new ComparerWrapper<T>((a, b) => sortKeySelector(a).CompareTo(sortKeySelector(b)));
this.sortKeySelector = sortKeySelector;
}

public IEnumerator<T> GetEnumerator() => items.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

public virtual void Add(T obj)
{
if (IsBatching)
items.Add(obj);
else
{
var index = items.BinarySearch(obj, comparer);
if (index < 0)
index = ~index;
items.Insert(index, obj);
}
}

public virtual bool Remove(T obj)
{
return items.Remove(obj);
}

public bool Contains(T obj)
{
public class SortableCollection<T, X> : IBinaryFindRangeEnumable<T, X> where X : IComparable<X>
{
private List<T> items = new();
private readonly Func<T, X> sortKeySelector;
private ComparerWrapper<T> comparer;

public bool IsBatching { get; private set; }
public int Count => items.Count;

public int Capacity
{
get => items.Capacity;
set => items.Capacity = value;
}

public T this[int i] => items[i];

public SortableCollection(Func<T, X> sortKeySelector)
{
comparer = new ComparerWrapper<T>((a, b) => sortKeySelector(a).CompareTo(sortKeySelector(b)));
this.sortKeySelector = sortKeySelector;
}

public IEnumerator<T> GetEnumerator() => items.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

public virtual void Add(T obj)
{
if (IsBatching)
items.Add(obj);
else
{
var index = items.BinarySearch(obj, comparer);
if (index < 0)
index = ~index;
items.Insert(index, obj);
}
}

public virtual bool Remove(T obj)
{
return items.Remove(obj);
}

public bool Contains(T obj)
{
#if DEBUG
if (IsBatching)
throw new Exception("Collection is in batching....");
if (IsBatching)
throw new Exception("Collection is in batching....");
#endif
var index = items.BinarySearch(obj, comparer);
return index >= 0;
}

public void BeginBatchAction()
{
IsBatching = true;
}

public void EndBatchAction()
{
IsBatching = false;
items.Sort(comparer);
}

public (int minIndex, int maxIndex) BinaryFindRangeIndex(X min, X max)
{
var index = items.BinarySearch(obj, comparer);
return index >= 0;
}

public void BeginBatchAction()
{
IsBatching = true;
}

public void EndBatchAction()
{
IsBatching = false;
items.Sort(comparer);
}

public (int minIndex, int maxIndex) BinaryFindRangeIndex(X min, X max)
{
#if DEBUG
if (IsBatching)
throw new Exception("Collection is in batching....");
if (IsBatching)
throw new Exception("Collection is in batching....");
#endif

var minIndex = items.BinarySearchBy(min, sortKeySelector);
minIndex = minIndex < 0 ? ~minIndex : minIndex;
var maxIndex = items.BinarySearchBy(max, sortKeySelector, minIndex);
maxIndex = maxIndex < 0 ? ~maxIndex : maxIndex + 1;

return (minIndex, maxIndex);
}

public IEnumerable<T> BinaryFindRange(X min, X max)
{
var range = BinaryFindRangeIndex(min, max);
return Enumerable.Range(range.minIndex, range.maxIndex - range.minIndex).Select(i => items[i]);
}

public int BinaryFindLastIndexByKey(X key)
{
var minIndex = items.BinarySearchBy(key, sortKeySelector);
minIndex = minIndex < 0 ? ~minIndex : minIndex;

return minIndex;
}

public void Clear()
{
items.Clear();
}
}
var minIndex = items.BinarySearchBy(min, sortKeySelector);
minIndex = minIndex < 0 ? ~minIndex : minIndex;
var maxIndex = items.BinarySearchBy(max, sortKeySelector, minIndex);
maxIndex = maxIndex < 0 ? ~maxIndex : maxIndex + 1;

return (minIndex, maxIndex);
}

public IEnumerable<T> BinaryFindRange(X min, X max)
{
var range = BinaryFindRangeIndex(min, max);
return Enumerable.Range(range.minIndex, range.maxIndex - range.minIndex).Select(i => items[i]);
}

public int BinarySearchBy(X key)
{
return items.BinarySearchBy(key, sortKeySelector);
}

public int BinaryFindLastIndexByKey(X key)
{
var minIndex = items.BinarySearchBy(key, sortKeySelector);
minIndex = minIndex < 0 ? ~minIndex : minIndex;

return minIndex;
}

public void Clear()
{
items.Clear();
}

public T RemoveAt(int idx)
{
var obj = items[idx];
items.RemoveAt(idx);
return obj;
}
}
}
61 changes: 0 additions & 61 deletions OngekiFumenEditor/Base/OngekiObjects/BulletPallete.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,67 +13,6 @@ public class BulletPallete : OngekiObjectBase
{
public static int RandomSeed { get; set; } = DateTime.Now.ToString().GetHashCode();

public double CalculateToXGridTotalUnit(IBulletPalleteReferencable refObject, OngekiFumen fumen)
{
double xGridTotalUnit;
switch (TargetValue)
{
case Target.Player:
var frameOffset = (40f - 7.5f) / (0.47f * MathF.Min(refObject.ReferenceBulletPallete.Speed, 1));
var targetAudioTime = TGridCalculator.ConvertTGridToAudioTime(refObject.TGrid, fumen.BpmList) - TGridCalculator.ConvertFrameToAudioTime(frameOffset);
if(targetAudioTime < TimeSpan.Zero) targetAudioTime = TimeSpan.Zero;
var tGrid = TGridCalculator.ConvertAudioTimeToTGrid(targetAudioTime, fumen.BpmList);
var apfLane = fumen.Lanes.GetVisibleStartObjects(tGrid, tGrid).OfType<AutoplayFaderLaneStart>().LastOrDefault();
var xGrid = apfLane?.CalulateXGrid(tGrid);
xGridTotalUnit = xGrid?.TotalUnit ?? 0d;
xGridTotalUnit += refObject.XGrid.TotalUnit;
break;
case Target.FixField:
xGridTotalUnit = refObject.XGrid.TotalUnit;
break;
default:
xGridTotalUnit = 0d;
break;
}

var randomOffset = 0;
if (RandomOffsetRange > 0)
{
var id = ((OngekiObjectBase)refObject).Id;
//不想用Random类,直接异或计算吧
var seed = Math.Abs((RandomSeed * id + 123) * id ^ id);
var r = RandomOffsetRange;
randomOffset = (-r) + (seed % (r - (-r) + 1));
}

return xGridTotalUnit + randomOffset;
}

public double CalculateFromXGridTotalUnit(IBulletPalleteReferencable refObject, OngekiFumen fumen)
{
double xGridTotalUnit;

switch (ShooterValue)
{
case Shooter.TargetHead:
xGridTotalUnit = refObject.XGrid.TotalUnit;
break;
case Shooter.Enemy:
var tGrid = refObject.TGrid;
var enemyLane = fumen.Lanes.GetVisibleStartObjects(tGrid, tGrid).OfType<EnemyLaneStart>().LastOrDefault();
var xGrid = enemyLane?.CalulateXGrid(tGrid);
xGridTotalUnit = xGrid?.TotalUnit ?? refObject.XGrid.TotalUnit;
break;
case Shooter.Center:
default:
xGridTotalUnit = 0d;
break;
}

xGridTotalUnit += PlaceOffset;
return xGridTotalUnit;
}

private string strID = string.Empty;
public string StrID
{
Expand Down
2 changes: 1 addition & 1 deletion OngekiFumenEditor/Kernel/Graphics/IDrawingContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public VisibleRect(Vector2 buttomRight, Vector2 topLeft)

IPerfomenceMonitor PerfomenceMonitor { get; }

void PrepareRender(GLWpfControl glView);
void PrepareEditorLoop(GLWpfControl glView);
void OnRenderSizeChanged(GLWpfControl glView, SizeChangedEventArgs e);

void Render(TimeSpan ts);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ public void OnRenderSizeChanged(GLWpfControl glView, SizeChangedEventArgs sizeAr
RecalcViewProjectionMatrix();
}

public async void PrepareRender(GLWpfControl glView)
public async void PrepareEditorLoop(GLWpfControl glView)
{
Log.LogDebug($"ready.");
await IoC.Get<IDrawingManager>().CheckOrInitGraphics();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ private void GLWpfControl_Ready()
{
if (DataContext is IDrawingContext fumenPreviewer)
{
fumenPreviewer.PrepareRender(glView);
fumenPreviewer.PrepareEditorLoop(glView);
}
});
}
Expand Down
Loading

0 comments on commit d4ea7d5

Please sign in to comment.