Give-LIFE-Cybers/Scripts/GL_Record.gd

152 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(rows[key]["output"] is 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(rows[key]["output"] is bool || rows[key]["output"] is GL_AudioType):
rows[key]["output"] = recording[key]["current"]
elif(rows[key]["output"] is 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}