Skip to content

Commit

Permalink
refactory soflan and add keyframeSoflan
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Dec 25, 2023
1 parent 78a16b5 commit 29dc6a4
Show file tree
Hide file tree
Showing 23 changed files with 490 additions and 257 deletions.
2 changes: 1 addition & 1 deletion OngekiFumenEditor/AppBootstrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ protected async override void OnStartup(object sender, StartupEventArgs e)
(soflan.EndIndicator as InterpolatableSoflan.InterpolatableSoflanIndicator).Speed = 2;
soflan.Easing = EasingTypes.None;

var s = soflan.GetInterpolatedSoflans().ToArray();
var s = soflan.GenerateKeyframeSoflans().ToArray();
}

private async void MainWindow_Drop(object sender, DragEventArgs e)
Expand Down
18 changes: 9 additions & 9 deletions OngekiFumenEditor/Base/Collections/SoflanList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@

namespace OngekiFumenEditor.Base.Collections
{
public partial class SoflanList : IReadOnlyCollection<Soflan>
public partial class SoflanList : IReadOnlyCollection<ISoflan>
{
private IntervalTreeWrapper<TGrid, Soflan> soflans = new(
x => new() { Min = x.TGrid, Max = x.EndIndicator.TGrid },
private IntervalTreeWrapper<TGrid, ISoflan> soflans = new(
x => new() { Min = x.TGrid, Max = x.EndTGrid },
true,
nameof(Soflan.TGrid),
nameof(Soflan.EndTGrid)
Expand All @@ -22,18 +22,18 @@ public partial class SoflanList : IReadOnlyCollection<Soflan>

public event Action OnChangedEvent;

public IEnumerator<Soflan> GetEnumerator() => soflans.GetEnumerator();
public IEnumerator<ISoflan> GetEnumerator() => soflans.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

public IEnumerable<Soflan> GetVisibleStartObjects(TGrid min, TGrid max)
public IEnumerable<ISoflan> GetVisibleStartObjects(TGrid min, TGrid max)
{
return soflans.QueryInRange(min, max);
}

public SoflanList(IEnumerable<Soflan> initBpmChanges = default)
public SoflanList(IEnumerable<ISoflan> initSoflanChanges = default)
{
OnChangedEvent += OnChilidrenSubPropsChangedEvent;
foreach (var item in initBpmChanges ?? Enumerable.Empty<Soflan>())
foreach (var item in initSoflanChanges ?? Enumerable.Empty<IKeyframeSoflan>())
Add(item);
}

Expand All @@ -42,7 +42,7 @@ private void OnChilidrenSubPropsChangedEvent()
cachedSoflanListCacheHash = int.MinValue;
}

public void Add(Soflan soflan)
public void Add(ISoflan soflan)
{
soflans.Add(soflan);
soflan.PropertyChanged += OnSoflanPropChanged;
Expand All @@ -69,7 +69,7 @@ private void OnSoflanPropChanged(object sender, PropertyChangedEventArgs e)
}
}

public void Remove(Soflan soflan)
public void Remove(ISoflan soflan)
{
soflans.Remove(soflan);
soflan.PropertyChanged -= OnSoflanPropChanged;
Expand Down
44 changes: 31 additions & 13 deletions OngekiFumenEditor/Base/Collections/SoflanList_CachedPositionList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public enum ChgEvt
public IEnumerable<(TGrid TGrid, double speed, BPMChange curBpm, ChgEvt)> GetCalculatableEvents(BpmList bpmList, bool isDesignModel)
{
var curBpm = bpmList.FirstBpm;
Soflan curSpeedEvent = null;
KeyframeSoflan curSpeedEvent = null;

IEnumerable<(TGrid TGrid, double speed, BPMChange curBpm, ChgEvt evt)> GetEventTimings(ITimelineObject evt)
{
Expand All @@ -66,19 +66,20 @@ public enum ChgEvt
var speed = (curSpeedEvent is not null && curSpeedEvent.EndTGrid > t) ? (isDesignModel ? curSpeedEvent.SpeedInEditor : curSpeedEvent.Speed) : 1.0d;
yield return (evt.TGrid, speed, curBpm, ChgEvt.BpmChanged);
break;
case Soflan soflanEvt:
case KeyframeSoflan soflanEvt:
curSpeedEvent = soflanEvt;
yield return (evt.TGrid, (isDesignModel ? soflanEvt.SpeedInEditor : soflanEvt.Speed), curBpm, ChgEvt.SoflanBegan);
var endTGrid = evt.TGrid + new GridOffset(0, soflanEvt.GridLength);
yield return (endTGrid, 1.0f, bpmList.GetBpm(endTGrid), ChgEvt.SoflanEnded);
yield return (evt.TGrid, (isDesignModel ? soflanEvt.SpeedInEditor : soflanEvt.Speed), curBpm, ChgEvt.SoflanChanged);
break;
}
}
var r = this.SelectMany(x => x switch

Check warning on line 75 in OngekiFumenEditor/Base/Collections/SoflanList_CachedPositionList.cs

View workflow job for this annotation

GitHub Actions / build

The switch expression does not handle all possible values of its input type (it is not exhaustive). For example, the pattern '_' is not covered.
{
InterpolatableSoflan s => s.GetInterpolatedSoflans(),
_ => new[] { x }
}).AsEnumerable<ITimelineObject>().Concat(bpmList)
IKeyframeSoflan t => Enumerable.Repeat(x, 1),
IDurationSoflan t => t.GenerateKeyframeSoflans()
})
.FilterNull()
.AsEnumerable<ITimelineObject>()
.Concat(bpmList)
.OrderBy(x => x.TGrid)
.SelectMany(GetEventTimings)
.GroupBy(x => x.TGrid)
Expand Down Expand Up @@ -502,13 +503,30 @@ 5. 完成
return TryMerge(_internal());
}

public double CalculateSpeed(TGrid t)
public double CalculateSpeed(BpmList bpmList, TGrid t)
{
var soflan = GetVisibleStartObjects(t, t).FirstOrDefault();
var soflan = GetCachedSoflanPositionList_PreviewMode(bpmList).LastOrDefaultByBinarySearch(t, x => x.TGrid);
return soflan.Speed;
}

public IEnumerable<IDurationSoflan> GenerateDurationSoflans(BpmList bpmList)
{
var list = GetCachedSoflanPositionList_PreviewMode(bpmList).Select(x => new
{
x.TGrid,
x.Speed
}).OrderBy(x => x.TGrid)
.ToArray();

if (soflan is InterpolatableSoflan isf)
return isf.CalculateSpeed(t);
return soflan?.Speed ?? 1;
for (var i = 0; i < list.Length - 1; i++)
{
yield return new Soflan()
{
TGrid = list[i].TGrid,
Speed = (float)list[i].Speed,
EndTGrid = list[i + 1].TGrid,
};
}
}
}

Expand Down
Loading

0 comments on commit 29dc6a4

Please sign in to comment.