Files

107 lines
3.9 KiB
C#
Raw Permalink Normal View History

2023-10-09 14:28:08 -07:00
using System.Collections.Generic;
using System.Linq;
2023-09-17 23:51:50 -07:00
using System.Reflection.Metadata;
2023-09-16 00:40:36 -07:00
using Godot;
2023-09-17 23:51:50 -07:00
using WacK.Configuration;
2023-09-16 00:40:36 -07:00
using WacK.Data.Chart;
using WacK.Scenes;
2023-09-16 00:40:36 -07:00
namespace WacK.Things.TunnelObjects
{
public partial class THNoteHold : THNotePlay
{
2023-10-09 14:54:19 -07:00
public NoteHold holdData;
private Node2D longThing;
2023-09-16 00:40:36 -07:00
public void InitHold(NoteHold noteData, Control holdScroll)
2023-09-16 00:40:36 -07:00
{
2023-10-09 14:54:19 -07:00
holdData = noteData;
BuildLongThing(holdScroll);
GD.Print($"Building long at {holdData.measureBeat}----------------");
2023-09-16 00:40:36 -07:00
}
// Create longThing in segments.
2023-09-18 02:14:19 -07:00
private void BuildLongThing(Control holdScroll)
{
longThing = new Node2D();
holdScroll.AddChild(longThing);
2023-10-09 14:54:19 -07:00
longThing.Position = new Vector2(0, (float)-holdData.time * Play.ScrollPxPerSec);
2023-10-09 16:26:47 -07:00
// don't draw invisible hold-mids
var drawableMids = holdData.points.Values.Where(e => e.type != NotePlayType.HoldMidInvis).ToList();
2023-10-09 14:28:08 -07:00
if (drawableMids.Count > 0)
{
2023-10-09 14:54:19 -07:00
var lastMid = holdData.points.Values[^1];
2023-10-09 14:28:08 -07:00
if (drawableMids[^1] != lastMid) drawableMids.Add(lastMid);
}
2023-10-09 16:26:47 -07:00
else
// would most likely happen if HoldEnd is missing
2023-10-09 14:54:19 -07:00
drawableMids = holdData.points.Values.ToList();
2023-10-09 14:28:08 -07:00
if (drawableMids.Count() > 0)
{
2023-10-09 14:54:19 -07:00
NotePlay lastHold = holdData;
float segmentPos = 0;
2023-10-09 14:28:08 -07:00
foreach (var curNote in drawableMids)
{
var curLength = Play.ScrollPxPerSec * (float)(curNote.time - lastHold.time);
var segment = CreateSegment(lastHold, curNote);
longThing.AddChild(segment);
segment.Position = new Vector2(0, segmentPos);
segmentPos -= curLength;
lastHold = curNote;
}
}
else
{
2023-10-09 14:28:08 -07:00
GD.PrintErr("Tried to create a Hold note's long with no drawable segments!");
}
}
private Polygon2D CreateSegment(NotePlay origin, NotePlay destination)
{
var length = Play.ScrollPxPerSec * (float)(destination.time - origin.time);
var verts = new Vector2[4];
2023-10-09 23:22:09 -07:00
int destPosNearest = Util.NearestMinute((int) origin.pos, (int) destination.pos);
var (originPosPx, originSizePx) = Util.PixelizeNote((int)origin.pos, (int)origin.size);
2023-10-09 23:22:09 -07:00
var (destPosPx, destSizePx) = Util.PixelizeNote(destPosNearest, (int)destination.size);
verts[0] = new Vector2(originPosPx, 0);
verts[1] = new Vector2(verts[0].X + originSizePx, 0);
verts[2] = new Vector2(destPosPx + destSizePx, -length);
verts[3] = new Vector2(destPosPx, -length);
var segment = new Polygon2D() { Polygon = verts, Antialiased = true };
// draw overflow
var originFinalPos = origin.pos + origin.size;
2023-10-09 23:22:09 -07:00
var destinationFinalPos = destPosNearest + destination.size;
if (originFinalPos > 60 || destinationFinalPos > 60)
{
2023-10-09 23:22:09 -07:00
GD.Print("overflowed to the right!");
var subSegment = new Polygon2D
{
Polygon = verts,
Antialiased = true,
Position = new Vector2(-Constants.BASE_2D_RESOLUTION, 0)
};
segment.AddChild(subSegment);
}
if (origin.pos < 0 || destPosNearest < 0)
{
2023-10-09 23:22:09 -07:00
GD.Print("overflowed to the left!");
var subSegment = new Polygon2D
{
Polygon = verts,
Antialiased = true,
Position = new Vector2(Constants.BASE_2D_RESOLUTION, 0)
};
segment.AddChild(subSegment);
}
2023-09-18 02:14:19 -07:00
segment.Modulate = new Color("#FFFFFFD0");
return segment;
}
2023-09-16 00:40:36 -07:00
}
}