diff --git a/src/Autoload/HTML5FileExchange.gd b/src/Autoload/HTML5FileExchange.gd
index 96b380271..500f0acc5 100644
--- a/src/Autoload/HTML5FileExchange.gd
+++ b/src/Autoload/HTML5FileExchange.gd
@@ -226,6 +226,5 @@ func load_shader() -> void:
shader.code = file_data
var shader_effect_dialog = Global.control.get_node("Dialogs/ImageEffects/ShaderEffect")
- shader_effect_dialog.preview.material.shader = shader
- shader_effect_dialog.shader_loaded_label.text = tr("Shader loaded:") + " " + file_name.get_basename()
+ shader_effect_dialog.change_shader(shader, file_name.get_basename())
diff --git a/src/UI/Dialogs/ShaderEffect.gd b/src/UI/Dialogs/ShaderEffect.gd
index b9a161dd5..4cf428ad4 100644
--- a/src/UI/Dialogs/ShaderEffect.gd
+++ b/src/UI/Dialogs/ShaderEffect.gd
@@ -6,14 +6,15 @@ var current_cel : Image
onready var viewport : Viewport = $VBoxContainer/ViewportContainer/Viewport
onready var preview : TextureRect = viewport.get_node("Preview")
onready var shader_loaded_label : Label = $VBoxContainer/ShaderLoadedLabel
+onready var shader_params : BoxContainer = $VBoxContainer/ShaderParams
func _on_ShaderEffect_about_to_show() -> void:
current_cel = Global.current_project.frames[Global.current_project.current_frame].cels[Global.current_project.current_layer].image
current_cel.unlock()
- viewport.size = current_cel.get_size()
- var viewport_texture = viewport.get_texture().get_data()
- viewport_texture.convert(Image.FORMAT_RGBA8)
+ viewport.size = Global.current_project.size
+# var viewport_texture = viewport.get_texture().get_data()
+# viewport_texture.convert(Image.FORMAT_RGBA8)
var preview_image := Image.new()
preview_image.copy_from(current_cel)
@@ -23,7 +24,11 @@ func _on_ShaderEffect_about_to_show() -> void:
func _on_ShaderEffect_confirmed() -> void:
- var viewport_texture = viewport.get_texture().get_data()
+ var viewport_texture := Image.new()
+ viewport_texture.copy_from(viewport.get_texture().get_data())
+ var viewport_texture_size = viewport_texture.get_size()
+ if viewport_texture_size == Vector2.ZERO:
+ return
viewport_texture.flip_y()
viewport_texture.convert(Image.FORMAT_RGBA8)
print(viewport_texture.get_size())
@@ -45,12 +50,68 @@ func _on_ChooseShader_pressed() -> void:
if OS.get_name() == "HTML5":
Html5FileExchange.load_shader()
else:
- $FileDialog.popup_centered(Vector2(200, 340))
+ $FileDialog.popup_centered(Vector2(300, 340))
func _on_FileDialog_file_selected(path : String) -> void:
var shader = load(path)
if !shader is Shader:
return
+ change_shader(shader, path.get_file().get_basename())
+
+
+func change_shader(shader : Shader, name : String) -> void:
preview.material.shader = shader
- shader_loaded_label.text = tr("Shader loaded:") + " " + path.get_file().get_basename()
+ shader_loaded_label.text = tr("Shader loaded:") + " " + name
+ for child in shader_params.get_children():
+ child.queue_free()
+
+ var code = shader.code.split("\n")
+ var uniforms := []
+ for line in code:
+ if line.begins_with("uniform"):
+ uniforms.append(line)
+
+ for uniform in uniforms:
+ # Example uniform:
+ # uniform float parameter_name : hint_range(0, 255) = 100.0;
+ var uniform_split = uniform.split("=")
+ var u_value := ""
+ if uniform_split.size() > 1:
+ u_value = uniform_split[1].replace(";", "").strip_edges()
+
+ var u_left_side = uniform_split[0].split(":")
+ var u_hint := ""
+ if u_left_side.size() > 1:
+ u_hint = u_left_side[1].strip_edges()
+
+ var u_init = u_left_side[0].split(" ")
+ var u_type = u_init[1]
+ var u_name = u_init[2]
+
+ if u_type == "float":
+ var label := Label.new()
+ label.text = u_name
+ var spinbox := SpinBox.new()
+ spinbox.min_value = 0.01
+ spinbox.max_value = 255
+ spinbox.step = 0.01
+ if u_value != "":
+ spinbox.value = float(u_value)
+ spinbox.connect("value_changed", self, "set_shader_param", [u_name])
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ hbox.add_child(spinbox)
+ shader_params.add_child(hbox)
+
+# print("---")
+# print(uniform_split)
+# print(u_type)
+# print(u_name)
+# print(u_hint)
+# print(u_value)
+# print("--")
+
+
+func set_shader_param(value, param : String) -> void:
+ preview.material.set_shader_param(param, value)
diff --git a/src/UI/Dialogs/ShaderEffect.tscn b/src/UI/Dialogs/ShaderEffect.tscn
index f34128008..ad17d5097 100644
--- a/src/UI/Dialogs/ShaderEffect.tscn
+++ b/src/UI/Dialogs/ShaderEffect.tscn
@@ -7,7 +7,7 @@
[node name="ShaderEffect" type="ConfirmationDialog"]
margin_right = 200.0
margin_bottom = 228.0
-rect_min_size = Vector2( 0, 0 )
+rect_min_size = Vector2( 400, 300 )
resizable = true
script = ExtResource( 2 )
__meta__ = {
@@ -26,15 +26,15 @@ __meta__ = {
}
[node name="Label" type="Label" parent="VBoxContainer"]
-margin_right = 255.0
-margin_bottom = 48.0
+margin_right = 384.0
+margin_bottom = 31.0
text = "This is an experimental feature and may not be included in the stable version"
autowrap = true
[node name="ViewportContainer" type="ViewportContainer" parent="VBoxContainer"]
-margin_top = 52.0
-margin_right = 255.0
-margin_bottom = 53.0
+margin_top = 35.0
+margin_right = 384.0
+margin_bottom = 36.0
__meta__ = {
"_edit_use_anchors_": false
}
@@ -54,24 +54,28 @@ anchor_right = 1.0
anchor_bottom = 1.0
[node name="ChooseShader" type="Button" parent="VBoxContainer"]
-margin_top = 57.0
-margin_right = 255.0
-margin_bottom = 77.0
+margin_top = 40.0
+margin_right = 384.0
+margin_bottom = 60.0
mouse_default_cursor_shape = 2
text = "Choose Shader"
[node name="ShaderLoadedLabel" type="Label" parent="VBoxContainer"]
-margin_top = 81.0
-margin_right = 255.0
-margin_bottom = 95.0
+margin_top = 64.0
+margin_right = 384.0
+margin_bottom = 78.0
text = "No shader loaded!"
autowrap = true
+[node name="ShaderParams" type="VBoxContainer" parent="VBoxContainer"]
+margin_right = 40.0
+margin_bottom = 40.0
+
[node name="FileDialog" type="FileDialog" parent="."]
margin_left = 8.0
margin_top = 8.0
-margin_right = 263.0
-margin_bottom = 192.0
+margin_right = 392.0
+margin_bottom = 264.0
window_title = "Open a File"
resizable = true
mode = 0