// Update is called once per frame
    void Update()
    {
        // Wait until the scene is fully loaded
        if (!transitionFinished)
        {
            return;
        }

        //if (Input.GetKeyDown(KeyCode.J))
        //    activeNotes.ForEach(x => x.transform.position -= new Vector3(0, 0, 0.5f));

        //var inactive = activeNotes.Where(x => x.transform.position.z < CullLocation);
        //for (int i = 0; i < inactive.Count(); i++)
        //{
        //    inactive.ElementAt(i).SetActive(false);
        //    activeNotes.Remove(inactive.ElementAt(i));
        //}



        // Draw notes (always)
        if (Globals.CurrentNoteCollection != null)
        {
            var currentBeat = Globals.MusicManager.GetCurrentBeat();
            var motions     = Globals.CurrentNoteCollection.Motions.Where(p => p.BeatLocation > currentBeat - 6 && p.BeatLocation < currentBeat + 16);
            var holds       = Globals.CurrentNoteCollection.Holds.Where(p => p.StartNote.BeatLocation > currentBeat - 16 && p.StartNote.BeatLocation < currentBeat + 16);
            var notes       = Globals.CurrentNoteCollection.Steps.Where(p => p.BeatLocation > currentBeat - 6 && p.BeatLocation < currentBeat + 16);
            var marks       = Globals.CurrentNoteCollection.Markers.Where(p => p.BeatLocation > currentBeat - 6 && p.BeatLocation < currentBeat + 16);

            foreach (var mark in marks)
            {
                mark.Draw(currentBeat);
            }

            foreach (var motion in motions)
            {
                motion.Draw(currentBeat);
            }

            foreach (var hold in holds)
            {
                hold.Draw(currentBeat);
            }

            foreach (var note in notes)
            {
                note.Draw(currentBeat);
            }
        }

        // Draw foot markers
        TouchCollection.Draw();

        // Update UI
        CanvasObj.transform.Find("ScrollNumMajor").gameObject.SetText(((int)Math.Floor(GameState.ScrollSpeed)).ToString("D1"));
        CanvasObj.transform.Find("ScrollNumMinor").gameObject.SetText("." + ((int)((GameState.ScrollSpeed - Math.Truncate(GameState.ScrollSpeed)) * 10)).ToString("D1"));
        var score = Globals.CurrentNoteCollection.CurrentScore / Globals.CurrentNoteCollection.TotalNotes * 100.00f;

        CanvasObj.transform.Find("ScoreNumMajor").gameObject.SetText(((int)Math.Floor(score)).ToString("D3"));
        CanvasObj.transform.Find("ScoreNumMinor").gameObject.SetText("." + ((int)((score - Math.Truncate(score)) * 1000)).ToString("D3") + "%");
        CanvasObj.transform.Find("AutoModeLabel").gameObject.SetActive(GameState.CurrentSettings.AutoSetting != Settings.AutoMode.Off);

        // Transitions
        float ratio;

        switch (GameState.TransitionState)
        {
        case TransitionState.LeavingLoadScreen:
            SetFields();
            ratio = DrawLoadingScreenTransition(false);
            if (ratio >= 1.0f)
            {
                GameState.TransitionState = TransitionState.ScreenActive;
                if (!Globals.MusicManager.IsPlaying)      // UNDO LATER
                {
                    Globals.MusicManager.Play();
                }
            }
            break;

        case TransitionState.ScreenActive:
            transitionStartTime = -1;
            if (Globals.MusicManager.IsFinished)
            {
                Globals.CurrentNoteCollection.SongEnd = SongEndReason.Cleared;
                GameState.TransitionState             = TransitionState.EnteringLoadingScreen;
            }
            break;

        case TransitionState.EnteringLoadingScreen:
            ratio = DrawLoadingScreenTransition(true);
            if (ratio <= 0.0f)
            {
                GameState.TransitionState = TransitionState.SwitchingScreens;
                GameState.Destination     = Mode.Results;
                loadStarted = false;
            }
            break;

        case TransitionState.SwitchingScreens:
            loadingLeft.anchoredPosition  = new Vector2(-200, 0);
            loadingRight.anchoredPosition = new Vector2(200, 0);
            if (!loadStarted)
            {
                if (Globals.MusicManager.IsPlaying)
                {
                    Globals.MusicManager.Pause();
                }
                StartCoroutine(Util.SwitchSceneAsync());
                loadStarted = true;
            }
            break;

        default:
            break;
        }
    }