49 lines
1.4 KiB
GDScript
49 lines
1.4 KiB
GDScript
## Gets a range of notes in a NoteData relative to a current beat.
|
|
class_name NoteView extends View
|
|
|
|
## The full set of notes.
|
|
@export var notes: NoteArray = null: set = _set_notes
|
|
|
|
## Get the array this NoteView refers to.
|
|
func get_data() -> NoteArray:
|
|
return notes
|
|
|
|
func update(beat: float) -> void:
|
|
_update_view_relative_to_notes(notes, beat)
|
|
_previous_beat = beat
|
|
|
|
func reset_view() -> void:
|
|
super.reset_view()
|
|
_previous_beat = -999.0
|
|
|
|
# ======= IMPLEMENTATION ======= #
|
|
var _previous_beat: float = -999.0
|
|
|
|
func _set_notes(p_notes: NoteArray) -> void:
|
|
notes = p_notes
|
|
reset_view()
|
|
|
|
## Update the view to match _current_beat.
|
|
func _update_view_relative_to_notes(p_notes: NoteArray, new_beat: float) -> void:
|
|
var new_begin = _begin
|
|
var new_end = _end
|
|
if new_beat > _previous_beat:
|
|
# Update forward.
|
|
while(new_begin < p_notes.size()) and (p_notes.beat_at(new_begin) < new_beat + offset_begin):
|
|
new_begin += 1
|
|
while(new_end < p_notes.size()) and (p_notes.beat_at(new_end) <= new_beat + offset_end):
|
|
new_end += 1
|
|
elif new_beat < _previous_beat:
|
|
# Update backward.
|
|
while(new_begin >= 0) and (p_notes.beat_at(new_begin) >= new_beat + offset_begin):
|
|
_begin -= 1
|
|
while(new_end >= 0) and (p_notes.beat_at(new_end) > new_beat + offset_end):
|
|
new_end -= 1
|
|
if(new_begin != _begin):
|
|
new_begin += 1
|
|
if(new_end != _end):
|
|
new_end += 1
|
|
|
|
_begin = new_begin
|
|
_end = new_end
|