150 lines
5.3 KiB
GDScript
150 lines
5.3 KiB
GDScript
extends GL_Node
|
|
class_name GL_Record
|
|
var timer:float
|
|
const sampleRate = 0.05
|
|
var recording:Dictionary
|
|
var oldTime:float = 0.000030042452 #sorta random number
|
|
var time:float = 0
|
|
var rng:RandomNumberGenerator
|
|
var oldRecording:bool
|
|
var defaultValues:Dictionary
|
|
|
|
func _ready():
|
|
super._ready()
|
|
_set_title("Record")
|
|
special_condition = "Record Node"
|
|
_create_row("Recording",false,null,true,false,0)
|
|
_create_row("Current Time",0.0,0.0,false,0,0)
|
|
_update_visuals()
|
|
rng = RandomNumberGenerator.new()
|
|
rng.seed = Time.get_ticks_msec()
|
|
pass
|
|
|
|
func _process(delta):
|
|
super._process(delta)
|
|
apply_pick_values()
|
|
for key in rows:
|
|
rows[key]["output"] = rows[key]["input"]
|
|
time = float(rows["Current Time"]["output"])
|
|
_traverse()
|
|
var recordBool = rows["Recording"]["input"]
|
|
if recordBool == true:
|
|
if recordBool != oldRecording || time == 0:
|
|
for key in rows:
|
|
defaultValues[key] = rows[key]["output"]
|
|
if timer <= 0:
|
|
timer = sampleRate
|
|
_record()
|
|
timer -= delta
|
|
oldTime = time
|
|
oldRecording = recordBool
|
|
for key in rows:
|
|
_send_input(key)
|
|
|
|
func _traverse():
|
|
if time == oldTime:
|
|
return
|
|
for key in recording:
|
|
if key == "Recording" || key == "Current Time":
|
|
continue
|
|
if recording[key]["start"] == null || recording[key]["end"] == null:
|
|
continue
|
|
if recording[key]["current"] == null:
|
|
recording[key]["current"] = recording[key]["start"]
|
|
if time < oldTime: #rewind
|
|
continue #fix pls
|
|
else: #forward
|
|
var current = recording[key]["current"]
|
|
var newCurrent = recursive_traverse_forward(key,current)
|
|
if current != newCurrent:
|
|
recording[key]["lastUsed"] = current
|
|
recording[key]["current"] = newCurrent
|
|
if recording[key]["lastUsed"] != null && recording[key]["current"] != recording[key]["end"]:
|
|
if(typeof(rows[key]["output"]) == TYPE_BOOL || rows[key]["output"] is GL_AudioType):
|
|
rows[key]["output"] = recording[key]["list"][recording[key]["current"]]["value"]
|
|
elif(typeof(rows[key]["output"]) == TYPE_FLOAT):
|
|
rows[key]["output"] = lerp(float(recording[key]["list"][recording[key]["lastUsed"]]["value"]),float(recording[key]["list"][recording[key]["current"]]["value"]),remap_time(time,recording[key]["list"][recording[key]["lastUsed"]]["time"],recording[key]["list"][recording[key]["current"]]["time"]))
|
|
elif(typeof(rows[key]["output"]) == TYPE_COLOR):
|
|
rows[key]["output"] = lerp(recording[key]["list"][recording[key]["lastUsed"]]["value"],recording[key]["list"][recording[key]["current"]]["value"],remap_time(time,recording[key]["list"][recording[key]["lastUsed"]]["time"],recording[key]["list"][recording[key]["current"]]["time"]))
|
|
|
|
func remap_time(value: float, start: float, end: float) -> float:
|
|
if start == end:
|
|
return 0.0
|
|
return (value - start) / (end - start)
|
|
|
|
func recursive_traverse_forward(key:String,current:String) -> String:
|
|
var dict = recording[key]["list"][current]
|
|
if dict["time"] > time:
|
|
if dict["back"] != null:
|
|
return recursive_traverse_forward(key,dict["back"])
|
|
if dict["time"] <= time:
|
|
if dict["forward"] != null && recording[key]["list"][dict["forward"]]["time"] <= time:
|
|
return recursive_traverse_forward(key,dict["forward"])
|
|
return current
|
|
|
|
func _record():
|
|
for key in recording:
|
|
if key == "Recording" || key == "Current Time":
|
|
continue
|
|
var currentSave = recording[key]["current"]
|
|
if currentSave == null:
|
|
var id = "ID_" + str(rng.randi())
|
|
recording[key]["list"][id] = {
|
|
"value":rows[key]["input"],
|
|
"time":time,
|
|
"back":null,
|
|
"forward":null
|
|
}
|
|
recording[key]["current"] = id
|
|
recording[key]["start"] = id
|
|
recording[key]["end"] = id
|
|
rows[key]["output"] = recording[key]["list"][id]["value"]
|
|
continue
|
|
if defaultValues[key] == rows[key]["input"]:
|
|
continue
|
|
elif defaultValues[key] != null:
|
|
defaultValues[key] = null #is this gonna bite me back if I allow null values to pass
|
|
if currentSave != null:
|
|
if time < oldTime: #rewind
|
|
continue #fix pls
|
|
else: #forward
|
|
if recording[key]["list"][currentSave]["time"] == time: #paused recording
|
|
recording[key]["list"][currentSave]["value"] = rows[key]["input"]
|
|
rows[key]["output"] = rows[key]["input"]
|
|
elif recording[key]["list"][currentSave]["time"] < time:
|
|
var id = "ID_" + str(rng.randi())
|
|
if recording[key]["list"][currentSave]["forward"] == null:
|
|
recording[key]["list"][id] = {
|
|
"value":rows[key]["input"],
|
|
"time":time,
|
|
"back":currentSave,
|
|
"forward":null
|
|
}
|
|
recording[key]["list"][currentSave]["forward"] = id
|
|
recording[key]["current"] = id
|
|
recording[key]["end"] = id
|
|
else:
|
|
var forward = recording[key]["list"][currentSave]["forward"]
|
|
recording[key]["list"][id] = {
|
|
"value":rows[key]["input"],
|
|
"time":time,
|
|
"back":currentSave,
|
|
"forward":forward
|
|
}
|
|
recording[key]["list"][forward]["back"] = id
|
|
recording[key]["list"][currentSave]["forward"] = id
|
|
recording[key]["current"] = id
|
|
rows[key]["output"] = recording[key]["list"][id]["value"]
|
|
#else: Somethings messed up and you need to re-traverse
|
|
|
|
continue
|
|
pass
|
|
|
|
|
|
func _create_row(name:String,input,output,picker:bool,pickDefault,pickFloatMaximum:float):
|
|
super._create_row(name,input,output,picker,pickDefault,pickFloatMaximum)
|
|
if name == "Recording" || name == "Current Time":
|
|
return
|
|
for key in rows:
|
|
if !recording.has(key):
|
|
recording[key] = {"start":null,"end":null,"current":null,"list":{},"lastUsed":null}
|