Imagine first release
This commit is contained in:
182
run/main.gd
182
run/main.gd
@@ -1,19 +1,181 @@
|
||||
extends Control
|
||||
|
||||
signal params_loaded
|
||||
signal params_reset
|
||||
|
||||
@export var shader: ShaderMaterial
|
||||
var loaded_images := {}
|
||||
var loaded_image_paths := {}
|
||||
var image_modification_times := {}
|
||||
|
||||
var trans_tween = null
|
||||
var params := ImagineParams.new()
|
||||
var time = 0.0
|
||||
var time_scale_factor = 1.0
|
||||
var fx_path = ""
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
%LoadImageButton.pressed.connect(show_image_load_dialog)
|
||||
%LoadImageDialog.file_selected.connect(load_image)
|
||||
params.time_scale = 0.01
|
||||
params.transition_dur = 2
|
||||
|
||||
func show_image_load_dialog():
|
||||
%LoadImageDialog.visible = true
|
||||
%LoadImageButton.pressed.connect(func():
|
||||
%LoadImageDialog.visible = true
|
||||
)
|
||||
%LoadImageDialog.files_selected.connect(func(paths):
|
||||
for p in paths:
|
||||
load_image(p)
|
||||
)
|
||||
%SaveFXButton.pressed.connect(func():
|
||||
if fx_path == "":
|
||||
%SaveFXDialog.visible = true
|
||||
else:
|
||||
save_effects()
|
||||
)
|
||||
%SaveFXAsButton.pressed.connect(func():
|
||||
%SaveFXDialog.visible = true
|
||||
)
|
||||
%SaveFXDialog.file_selected.connect(func(path):
|
||||
fx_path = path
|
||||
save_effects()
|
||||
)
|
||||
%LoadFXDialog.file_selected.connect(func(path):
|
||||
fx_path = path
|
||||
params = ResourceLoader.load(path)
|
||||
params_loaded.emit()
|
||||
%FXFileLabel.text = fx_path
|
||||
)
|
||||
|
||||
func load_image(path: String) -> bool:
|
||||
%LoadFXButton.pressed.connect(func():
|
||||
%LoadFXDialog.visible = true
|
||||
)
|
||||
%NewFXButton.pressed.connect(func():
|
||||
params = ImagineParams.new()
|
||||
fx_path = ""
|
||||
%FXFileLabel.text = "unsaved FX"
|
||||
params_reset.emit()
|
||||
)
|
||||
|
||||
%ImageList.item_clicked.connect(func(index, at, btn):
|
||||
if btn == MouseButton.MOUSE_BUTTON_LEFT:
|
||||
transition_to_image(%ImageList.get_item_text(index))
|
||||
elif btn == MouseButton.MOUSE_BUTTON_RIGHT && Input.is_action_pressed("shift"):
|
||||
var file = %ImageList.get_item_text(index)
|
||||
loaded_images.erase(file)
|
||||
loaded_image_paths.erase(file)
|
||||
image_modification_times.erase(file)
|
||||
%ImageList.remove_item(index)
|
||||
)
|
||||
|
||||
for child in %Params.get_children():
|
||||
link_param(child)
|
||||
|
||||
func save_effects():
|
||||
ResourceSaver.save(params, fx_path)
|
||||
%FXFileLabel.text = fx_path
|
||||
%SaveConfirmPopup.dialog_text = "FX saved to %s" % fx_path
|
||||
%SaveConfirmPopup.show()
|
||||
|
||||
func _process(delta):
|
||||
if Input.is_action_just_pressed("toggle_fullscreen"):
|
||||
%ControlSide.visible = !%ControlSide.visible
|
||||
time += delta * params.time_scale * time_scale_factor
|
||||
shader.set_shader_parameter("time", time)
|
||||
|
||||
for path in loaded_image_paths.values():
|
||||
var prev_mod = image_modification_times[path.get_file()]
|
||||
var last_mod = FileAccess.get_modified_time(path)
|
||||
if last_mod > prev_mod:
|
||||
load_image(path)
|
||||
|
||||
func load_image(path: String):
|
||||
var file = path.get_file()
|
||||
var image = Image.load_from_file(path)
|
||||
if image == null:
|
||||
return false
|
||||
|
||||
return
|
||||
|
||||
var tex = ImageTexture.create_from_image(image)
|
||||
%PreviewImage.texture = tex
|
||||
%LoadImageButton.text = path.get_file()
|
||||
return true
|
||||
if file in loaded_images:
|
||||
for i in range(%ImageList.item_count):
|
||||
var txt = %ImageList.get_item_text(i)
|
||||
if txt == file:
|
||||
%ImageList.set_item_icon(i, tex)
|
||||
print("Reloaded %s" % txt)
|
||||
|
||||
var prev_tex = loaded_images[file]
|
||||
if shader.get_shader_parameter("texture1") == prev_tex:
|
||||
shader.set_shader_parameter("texture1", tex)
|
||||
if shader.get_shader_parameter("texture2") == prev_tex:
|
||||
shader.set_shader_parameter("texture2", tex)
|
||||
else:
|
||||
%ImageList.add_item(file, tex)
|
||||
|
||||
loaded_images[file] = tex
|
||||
loaded_image_paths[file] = path
|
||||
image_modification_times[file] = FileAccess.get_modified_time(path)
|
||||
|
||||
func transition_to_image(file: String):
|
||||
if trans_tween != null:
|
||||
if trans_tween.is_running():
|
||||
return
|
||||
trans_tween.kill()
|
||||
|
||||
var texture1 = shader.get_shader_parameter("texture1")
|
||||
var texture2 = loaded_images[file]
|
||||
shader.set_shader_parameter("texture2", texture2)
|
||||
|
||||
var tw = create_tween()
|
||||
trans_tween = tw
|
||||
var set_trans = func(x):
|
||||
shader.set_shader_parameter("transition", x)
|
||||
|
||||
tw.tween_callback(func():
|
||||
time_scale_factor = 5)
|
||||
tw.tween_method(set_trans, 0.0, 1.0, params.transition_dur/2).set_trans(Tween.TRANS_SINE)
|
||||
tw.tween_callback(func():
|
||||
shader.set_shader_parameter("texture1", texture2)
|
||||
shader.set_shader_parameter("texture2", texture1)
|
||||
)
|
||||
tw.tween_method(set_trans, 1.0, 0.0, params.transition_dur/2).set_trans(Tween.TRANS_SINE)
|
||||
tw.tween_callback(func():
|
||||
time_scale_factor = 1)
|
||||
|
||||
func link_param(node: Node):
|
||||
if node is Label:
|
||||
return
|
||||
|
||||
var param = node.name.to_snake_case()
|
||||
var slider = node.get_node("Slider")
|
||||
var button = node.get_node("ResetButton")
|
||||
var val = shader.get_shader_parameter(param)
|
||||
|
||||
if param == "time_scale":
|
||||
slider.value = params.time_scale
|
||||
elif param == "frequency":
|
||||
var noise = shader.get_shader_parameter("ripples").noise
|
||||
slider.value = noise.frequency
|
||||
slider.value_changed.connect(func(x):
|
||||
noise.frequency = x
|
||||
)
|
||||
elif param == "transition_dur":
|
||||
slider.value = params.transition_dur
|
||||
elif val != null:
|
||||
slider.value = val
|
||||
slider.value_changed.connect(func(x):
|
||||
shader.set_shader_parameter(param, x)
|
||||
)
|
||||
|
||||
slider.default_value = slider.value
|
||||
params[param] = slider.value
|
||||
slider.value_changed.connect(func(x):
|
||||
params[param] = x
|
||||
)
|
||||
params_loaded.connect(func():
|
||||
slider.value = params[param]
|
||||
)
|
||||
button.pressed.connect(func():
|
||||
slider.reset()
|
||||
)
|
||||
params_reset.connect(func():
|
||||
slider.reset()
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user