public override void Update() { base.Update(); // Post-Initialization if (!init) { init = true; project = new ProjectData(VoezEditor.activeProjectFolder); project.LoadAllProjectData(); musicPlayer = new MusicPlayer(); ui = new EditorUI(); InitiateSong(); musicPlayer.PauseSong(); // wait for user to manually start the song with the play button } // Music Player updating sfxPlayer.Update(); musicPlayer.Update(); if (!musicPlayer.source.isPlaying && musicPlayer.hasStarted && !musicPlayer.paused) { currentFrame = 0f; if (project.songPath != null) { musicPlayer.PlayAudioClip(project.songPath); } } if (musicPlayer.source.isPlaying) { currentFrame += 1 * musicPlayer.playbackSpeed; // If editor playback time out of sync with music time, begin to speed up or slow down editor playback scrolling float nextTime = currentFrame / framesPerSecond; if (Mathf.Abs(musicPlayer.source.time - nextTime) > ((1f / VoezEditor.Editor.framesPerSecond) * VoezEditor.musicSyncThreshold)) { if (musicPlayer.source.time > nextTime) { if (syncSpeedup < 0f) { syncSpeedup += 0.25f; } else { syncSpeedup += 0.1f; } } else { if (syncSpeedup > 0f) { syncSpeedup -= 0.25f; } else { syncSpeedup -= 0.1f; } } } else { syncSpeedup *= 0.5f; if (Mathf.Abs(syncSpeedup) < 0.25f) { syncSpeedup = 0f; } } currentFrame += syncSpeedup * musicPlayer.playbackSpeed; } if (musicPlayer.source != null) { if (metronomeEnabled || hitSoundsEnabled) { musicPlayer.desiredVolume = Mathf.Lerp(musicPlayer.source.volume, 0.3f, 0.03f); } else { musicPlayer.desiredVolume = Mathf.Lerp(musicPlayer.source.volume, 1f, 0.01f); } } // Frame Advancing while Paused if (EditMode && !MenuOpen && !ui.bpmButton.toggled) { float delta = GetBPMTimeIncrement() * framesPerSecond; if (InputManager.UpTick()) { currentFrame = Mathf.Min(currentFrame + delta, musicPlayer.source.clip.length * framesPerSecond); } if (InputManager.DownTick()) { currentFrame = Mathf.Max(currentFrame - delta, 0); } if (InputManager.RightTick()) { currentFrame = Mathf.Min(currentFrame + (delta * 4f), musicPlayer.source.clip.length * framesPerSecond); } if (InputManager.LeftTick()) { currentFrame = Mathf.Max(currentFrame - (delta * 4f), 0); } } currentTime = currentFrame / framesPerSecond; lastSongTime = songTime; songTime = currentTime; // BPM Pulse Tracking if (musicPlayer.source.isPlaying) { int lastBeatFloor = Mathf.FloorToInt(SecondsToBeats(lastSongTime)); int curBeatFloor = Mathf.FloorToInt(SecondsToBeats(songTime)); if (curBeatFloor > lastBeatFloor) { bpmPulse = true; if (metronomeEnabled) { if (Mathf.FloorToInt(SecondsToBeats(songTime)) % 2 == 0) { sfxPlayer.metroSource.PlayOneShot(sfxPlayer.metroTick1); } else { sfxPlayer.metroSource.PlayOneShot(sfxPlayer.metroTick2); } } } else { bpmPulse = false; } } else { bpmPulse = false; } // Update all active objects int updateIndex = updateList.Count - 1; while (updateIndex >= 0) { UpdatableObject obj = updateList[updateIndex]; if (obj.readyForDeletion) { PurgeObject(obj); } else { obj.Update(); } updateIndex--; } ui.Update(); // Spawn Tracks for (int i = 0; i < project.tracks.Count; i += 1) { if (songTime >= project.tracks[i].start && songTime <= project.tracks[i].end && !TrackSpawned(project.tracks[i].id)) { AddObject(new Track(project.tracks[i])); } } // Spawn Notes for (int i = 0; i < project.notes.Count; i += 1) { float effHold = 0f; if (project.notes[i].type == ProjectData.NoteData.NoteType.HOLD) { effHold = project.notes[i].hold; } if (songTime >= project.notes[i].time - Note.NOTE_DURATION && songTime <= project.notes[i].time + effHold && !NoteSpawned(project.notes[i].id)) { AddObject(new Note(project.notes[i])); } } // Find track mouse is hovering over (or track closest to mouse if hovering over multiple) for (int i = 0; i < activeTracks.Count; i += 1) { activeTracks[i].activeHover = false; } if (EditMode && !MenuOpen) { float nearestDist = int.MaxValue; Track nearestTrack = null; for (int i = 0; i < activeTracks.Count; i += 1) { float dist = Mathf.Abs(Input.mousePosition.x - activeTracks[i].pos.x); if (activeTracks[i].MouseOver && dist < nearestDist) { nearestDist = dist; nearestTrack = activeTracks[i]; } } if (nearestTrack != null && !ui.HoveringOverSubmenuItem()) { nearestTrack.activeHover = true; if (!trackEditMode) { ui.trackAdder.notePreviewVisible = true; ui.trackAdder.pos.x = nearestTrack.pos.x; ui.trackAdder.pos.y = ui.grid.SnapToGridY(Input.mousePosition.y); } // Add New Note to Hovered Track if (InputManager.leftMousePushed && !HoveringOverAnyNote() && !trackEditMode) { float desiredSongTime = ui.grid.GetSongTimeAtGridY(Input.mousePosition.y); desiredSongTime = Mathf.Clamp(desiredSongTime, 0f, musicPlayer.source.clip.length); if (!TrackOccupiedAtTime(nearestTrack.ID, desiredSongTime)) { ProjectData.NoteData newNote = new ProjectData.NoteData(); newNote.id = GetUniqueTempNoteID(); newNote.time = desiredSongTime; newNote.track = nearestTrack.ID; newNote.type = selectedNoteType; project.AddNote(newNote); RefreshAllNotes(); } } } else { ui.trackAdder.notePreviewVisible = false; } } else { ui.trackAdder.notePreviewVisible = false; } if (readyToShutDown) { ShutDownProcess(); VoezEditor.activeProcess = new ProjectsProcess(); } }
public override void Update() { base.Update(); // Post-Initialization if (!init) { init = true; AddObject(new SolidBackground(Color.white)); ProjectIcon activeIcon = null; icons = new ProjectIcon[24]; for (int i = 0; i < icons.Length; i += 1) { int projectInd = IconIndToProjectInd(i) - 3; if (projectInd < 0 || projectInd >= projectDirectories.Count) { icons[i] = new ProjectIcon(null, Vector2.zero, i); } else { icons[i] = new ProjectIcon(projectDirectories[projectInd], Vector2.zero, i); if (projectDirectories[projectInd] == VoezEditor.activeProjectFolder) { activeIcon = icons[i]; } } AddObject(icons[i]); } ui = new ProjectsUI(); musicPlayer = new MusicPlayer(); musicPlayer.loopMode = true; if (activeIcon != null) { SetSelectedProject(activeIcon); } } // Control of scrolling the list around float snap = (ProjectIcon.size + GRID_MARGIN) * 0.5f; VoezEditor.projectScrollOff = Mathf.Lerp(VoezEditor.projectScrollOff, targetScroll, 0.1f); if (!Input.GetMouseButton(0)) { mouseDragInit = false; } if (InputManager.leftMousePushed && !ui.HoveringOverSubmenuItem()) { lastScrollOffset = targetScroll; mouseDragInit = true; } if (InputManager.leftMouseReleased) { if ((InputManager.screenPosOnLeftMousePush.x - Input.mousePosition.x) < 0) { targetScroll = Mathf.Floor(targetScroll / snap) * snap; } else { targetScroll = Mathf.Ceil(targetScroll / snap) * snap; } } if (Input.GetMouseButton(0) && Vector2.Distance(InputManager.screenPosOnLeftMousePush, Input.mousePosition) > 16 && mouseDragInit) { targetScroll = lastScrollOffset + (InputManager.screenPosOnLeftMousePush.x - Input.mousePosition.x); } else { float multi = 1; if (Util.ShiftDown()) { multi = 4; } if (InputManager.UpTick() || InputManager.RightTick()) { targetScroll += snap * multi; } if (InputManager.DownTick() || InputManager.LeftTick()) { targetScroll -= snap * multi; } } float maxTargetScroll = Mathf.Max((projectDirectories.Count / 2) * snap, snap * 5); if (targetScroll < 0) { targetScroll = 0; } if (targetScroll > maxTargetScroll) { targetScroll = maxTargetScroll; } musicPlayer.Update(); LayoutProjectIcons(); // Update all active objects int updateIndex = updateList.Count - 1; while (updateIndex >= 0) { UpdatableObject obj = updateList[updateIndex]; if (obj.readyForDeletion) { PurgeObject(obj); } else { obj.Update(); } updateIndex--; } ui.Update(); if (readyToShutDown) { ShutDownProcess(); VoezEditor.activeProcess = new EditorProcess(); } }