Skip to content

Commit

Permalink
add VisibleTGridRange::TryMerge()/Merge() and fix playback soflan in …
Browse files Browse the repository at this point in the history
…DrawPlayFieldInternal()
  • Loading branch information
MikiraSora committed Sep 28, 2024
1 parent 1cfe43d commit 64d6afa
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,22 @@ public SoflanPoint(double y, TGrid tGrid, double speed, BPMChange bpm)
private List<SoflanPoint> cachedSoflanPositionList_DesignMode = new();
private List<SoflanPoint> cachedSoflanPositionList_PreviewMode = new();

public record VisibleTGridRange(TGrid minTGrid, TGrid maxTGrid);
public record VisibleTGridRange(TGrid minTGrid, TGrid maxTGrid)
{
public bool TryMerge(VisibleTGridRange another, out VisibleTGridRange mergedResult)
{
mergedResult = Merge(another);
return mergedResult != default;
}

public VisibleTGridRange Merge(VisibleTGridRange another)
{
if ((minTGrid <= another.minTGrid && another.minTGrid <= maxTGrid) ||
another.minTGrid <= minTGrid && minTGrid <= another.maxTGrid)
return new(MathUtils.Min(minTGrid, another.minTGrid), MathUtils.Max(maxTGrid, another.maxTGrid));
return default;
}
}
public record SoflanSegment(int curIdx, SoflanPoint cur, SoflanPoint next);

private IIntervalTree<double, SoflanSegment> cachePostionList_PreviewMode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
using OngekiFumenEditor.Utils.ObjectPool;
using EarcutNet;
using System.Drawing;
using Microsoft.CodeAnalysis;

namespace OngekiFumenEditor.Modules.FumenVisualEditor.Graphics.Drawing.Editors
{
Expand Down Expand Up @@ -83,6 +82,48 @@ public void DrawPlayField(IFumenEditorDrawingContext target, TGrid minTGrid, TGr
if (target.Editor.IsDesignMode || !enablePlayFieldDrawing)
return;

var fumen = target.Editor.Fumen;
var soflanList = fumen.Soflans.GetCachedSoflanPositionList_PreviewMode(fumen.BpmList);

var minIdx = soflanList.LastOrDefaultIndexByBinarySearch(minTGrid, x => x.TGrid);
var maxIdx = soflanList.LastOrDefaultIndexByBinarySearch(maxTGrid, x => x.TGrid);

// ---|------o----|-----------------------------|---o------|---
// x x x x

var curSoflanPoint = soflanList[minIdx];
var rangeInfos = ObjectPool<List<(TGrid tGrid, double speed)>>.Get();
rangeInfos.Clear();
rangeInfos.Add((minTGrid, soflanList[minIdx].Speed));

for (int i = minIdx + 1; i <= maxIdx; i++)
{
var soflanPoint = soflanList[i];

if (soflanPoint.Speed * rangeInfos[^1].speed < 0)
rangeInfos.Add((soflanPoint.TGrid, soflanPoint.Speed));

curSoflanPoint = soflanPoint;
}

if (rangeInfos[^1].tGrid != maxTGrid)
rangeInfos.Add((maxTGrid, rangeInfos[^1].speed));

for (int i = 0; i < rangeInfos.Count - 1; i++)
{
var segMinTGrid = rangeInfos[i].tGrid;
var segMaxTGrid = rangeInfos[i + 1].tGrid;

var isPlayback = rangeInfos[i].speed < 0;

DrawPlayFieldInternal(target, segMinTGrid, segMaxTGrid, isPlayback);
}

ObjectPool<List<(TGrid, double)>>.Return(rangeInfos);
}

public void DrawPlayFieldInternal(IFumenEditorDrawingContext target, TGrid minTGrid, TGrid maxTGrid, bool isPlaybackSoflan)
{
/*
画游戏(黑色可移动)区域
1. 计算一组轨道,每个轨道的节点都算一个point,如果存在轨道相交,那么相交点也算point
Expand Down Expand Up @@ -404,7 +445,7 @@ void appendPoint(List<Vector2> list, XGrid xGrid, float y)
polygonDrawing.End();


#if DEBUG
#if PLAYFIELD_DEBUG
playFieldForegroundColor.W = 0.4f;
lineDrawing.Draw(target, leftPoints.Select(p => new LineVertex(p, debugLeftColor, VertexDash.Solider)), 6);
lineDrawing.Draw(target, rightPoints.Select(p => new LineVertex(p, debugRightColor, VertexDash.Solider)), 6);
Expand Down Expand Up @@ -656,7 +697,7 @@ bool tryExchange(int li, int ri)

tryExchange(leftIdx, rightIdx);
}
#if DEBUG
#if PLAYFIELD_DEBUG
circleDrawing.Begin(target);
circleDrawing.Post(intersectionPoint, isCross ? new(1, 1, 0, 0.75f) : new(0, 153 / 255f, 153 / 255f, 0.75f), false, 30);
circleDrawing.End();
Expand Down
1 change: 1 addition & 0 deletions OngekiFumenEditor/OngekiFumenEditor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>
<DefineConstants>$(DefineConstants);PLAYFIELD_DEBUG</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
Expand Down

0 comments on commit 64d6afa

Please sign in to comment.