HeavenStudio/Assets/Scripts/LevelEditor/BeatGrid.cs
minenice55 b1fab52ad9
Integration of Jukebox Library (#451) (#457)
* add Jukebox library

todo:
- saving / loading of new format
- inferrence of unknown data like past versions
- move the temporary float casts to proper use of double
- make sound related functions take double for timing
- inform people that the Jukebox sound player was renamed to SoundByte lol

* make sound, input scheduling, and super curve use double precision

* successfully load charts

* editor works again

v1 riqs can be saved and loaded

* first tempo and volume markers are unmovable

fix loading of charts' easing values

* use gsync / freesync

* update Jukebox refs to SoundByte

* game events use double part 1

Air Rally - Glee Club converted

* don't load song if chart load fails

* finish conversion of all minigames

* remove editor waveform toggle

* timeline now respects added song offset length

clear cache files on app close
prepped notes for dsp sync

* update timeline length when offset changed

* update to latest Jukebox

* make error panel object in global game manager

* improve conductor music scheduling

* added error message box

fix first game events sometimes not playing
2023-06-10 19:17:06 +00:00

114 lines
3.5 KiB
C#

using System.Collections.Generic;
using System.Globalization;
using Starpelly;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace HeavenStudio.Editor.Track
{
public class BeatGrid : MonoBehaviour
{
#region Public
public float snap;
public float count;
#endregion
#region Private
private RectTransform rectTransform;
private float lastPosX;
private float lastContentScale;
private float lastTimelineSize;
private float contentPosX => Mathf.Abs(scrollRect.content.localPosition.x / scrollRect.content.localScale.x);
private List<GameObject> Lines = new List<GameObject>();
#endregion
#region Exposed
[Header("Components")]
[SerializeField] private ScrollRect scrollRect;
#endregion
#region MonoBehaviour
private void Start()
{
rectTransform = GetComponent<RectTransform>();
UpdateCount();
}
private void LateUpdate()
{
if (Editor.instance.fullscreen) return;
var x = Mathf.FloorToInt(contentPosX);
var pos = new Vector3(x, transform.localPosition.y, transform.localPosition.z);
transform.localPosition = pos;
GetComponent<RectTransform>().anchoredPosition = new Vector3(rectTransform.anchoredPosition.x, rectTransform.anchoredPosition.y, 0);
UpdateCount();
}
#endregion
private void UpdateCount()
{
var changeScale = (scrollRect.viewport.rect.size.x != lastTimelineSize || scrollRect.content.localScale.x != lastContentScale);
if (changeScale)
{
var rightSide = (scrollRect.viewport.GetComponent<RectTransform>().rect.width / scrollRect.content.localScale.x) + contentPosX;
for (int i = 0; i < Lines.Count; i++)
Destroy(Lines[i].gameObject);
Lines.Clear();
count = Mathf.RoundToInt(rightSide - contentPosX) + 2;
for (int i = 0; i < count; i++)
{
var line = Instantiate(transform.GetChild(0).gameObject, transform);
line.transform.localPosition = new Vector3(i, line.transform.localPosition.y, line.transform.localPosition.z);
var halfBeatRect = line.transform.GetChild(2).GetComponent<RectTransform>();
halfBeatRect.anchoredPosition = new Vector3(scrollRect.content.localScale.x * 0.5f, halfBeatRect.anchoredPosition.y);
line.SetActive(true);
Lines.Add(line);
}
UpdateGridNum();
if (count > 0) transform.GetChild(0).gameObject.SetActive(false);
}
if (rectTransform.anchoredPosition.x != lastPosX)
{
UpdateGridNum();
}
lastContentScale = scrollRect.content.localScale.x;
lastTimelineSize = scrollRect.viewport.rect.size.x;
lastPosX = rectTransform.anchoredPosition.x;
}
private void UpdateGridNum()
{
for (int i = 0; i < Lines.Count; i++)
{
var line = Lines[i];
if (line.transform.childCount == 0) continue;
var newNum = Mathf.RoundToInt(rectTransform.anchoredPosition.x + ((i) / snap));
line.transform.GetChild(0).GetComponent<TMP_Text>().text = newNum.ToString(CultureInfo.CurrentCulture);
}
}
}
}