mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-01-18 17:19:50 +00:00
Experimental shader feature: Expose shader's float uniforms to the UI
If the loaded shader has uniforms, they will be exposed to the UI, so the users will be able to modify the shader parameters easily. Currently only works with float uniforms.
This commit is contained in:
parent
86ee5d1abf
commit
ec81950139
|
@ -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())
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue