Optimized performance for complex shaders and refactored some of the code - fixes #1
This commit is contained in:
parent
7549d1685b
commit
d5ffa86e2c
7 changed files with 47 additions and 46 deletions
|
@ -20,7 +20,7 @@ config/icon="res://icon.svg"
|
||||||
[autoload]
|
[autoload]
|
||||||
|
|
||||||
ShaderPresets="*res://src/presets/Presets.gd"
|
ShaderPresets="*res://src/presets/Presets.gd"
|
||||||
GlitchShader="*res://src/GlitchShader.gd"
|
Globals="*res://src/Globals.gd"
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,16 @@
|
||||||
extends Camera2D
|
extends Camera2D
|
||||||
|
|
||||||
var drag = false
|
var drag = false
|
||||||
var _freeze = false
|
|
||||||
|
|
||||||
@onready var user_interface_container = get_parent().get_node("UI_Layer/UserInterfaceContainer")
|
@onready var user_interface_container = get_parent().get_node("UI_Layer/UserInterfaceContainer")
|
||||||
@onready var image_viewport = get_parent().get_node("ImageViewport")
|
@onready var image_viewport = get_parent().get_node("ImageViewport")
|
||||||
|
|
||||||
func _input(event):
|
func _input(event):
|
||||||
if event.is_action_pressed("zoom_out") && !_freeze:
|
if event.is_action_pressed("zoom_out") && !Globals.camera_freeze:
|
||||||
zoom_out()
|
zoom_out()
|
||||||
elif event.is_action_pressed("zoom_in") && !_freeze:
|
elif event.is_action_pressed("zoom_in") && !Globals.camera_freeze:
|
||||||
zoom_in()
|
zoom_in()
|
||||||
if event.is_action_pressed("drag") && !_freeze:
|
if event.is_action_pressed("drag") && !Globals.camera_freeze:
|
||||||
drag = true
|
drag = true
|
||||||
elif event.is_action_released("drag"):
|
elif event.is_action_released("drag"):
|
||||||
drag = false
|
drag = false
|
||||||
|
@ -20,7 +19,7 @@ func _input(event):
|
||||||
|
|
||||||
func fit_image():
|
func fit_image():
|
||||||
var ui_container_size = user_interface_container.size
|
var ui_container_size = user_interface_container.size
|
||||||
var image_size = image_viewport.image_original.get_size()
|
var image_size = image_viewport.image_original_tex.get_size()
|
||||||
var viewport_size = get_viewport_rect().size
|
var viewport_size = get_viewport_rect().size
|
||||||
var zoomf = (viewport_size.x - ui_container_size.x) / image_size.x / 1.1
|
var zoomf = (viewport_size.x - ui_container_size.x) / image_size.x / 1.1
|
||||||
if zoomf * image_size.y > viewport_size.y:
|
if zoomf * image_size.y > viewport_size.y:
|
||||||
|
@ -38,11 +37,5 @@ func zoom_out():
|
||||||
zoom *= 1/1.2
|
zoom *= 1/1.2
|
||||||
global_position += old_mouse_pos - get_global_mouse_position()
|
global_position += old_mouse_pos - get_global_mouse_position()
|
||||||
|
|
||||||
func freeze():
|
|
||||||
_freeze = true
|
|
||||||
|
|
||||||
func unfreeze():
|
|
||||||
_freeze = false
|
|
||||||
|
|
||||||
func _on_fit_image_button_pressed():
|
func _on_fit_image_button_pressed():
|
||||||
fit_image()
|
fit_image()
|
||||||
|
|
|
@ -2,10 +2,6 @@ extends Control
|
||||||
|
|
||||||
@onready var preset_options = $PresetOptions
|
@onready var preset_options = $PresetOptions
|
||||||
@onready var code_editor = $CodeEdit
|
@onready var code_editor = $CodeEdit
|
||||||
|
|
||||||
@onready var camera_freeze = get_parent().get_parent().get_parent().find_child("Camera").freeze
|
|
||||||
@onready var camera_unfreeze = get_parent().get_parent().get_parent().find_child("Camera").unfreeze
|
|
||||||
|
|
||||||
var selected_preset_name = ShaderPresets.default_preset
|
var selected_preset_name = ShaderPresets.default_preset
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -99,24 +95,30 @@ func _on_code_edit_code_completion_requested():
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
||||||
|
func _camera_freeze():
|
||||||
|
Globals.camera_freeze = true
|
||||||
|
|
||||||
|
func _camera_unfreeze():
|
||||||
|
Globals.camera_freeze = false
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
code_editor.code_completion_enabled = true
|
code_editor.code_completion_enabled = true
|
||||||
code_editor.syntax_highlighter = ShaderSyntaxHighlighter.new()
|
code_editor.syntax_highlighter = ShaderSyntaxHighlighter.new()
|
||||||
for c in get_children():
|
for c in get_children():
|
||||||
c.connect("mouse_entered", camera_freeze)
|
c.connect("mouse_entered", _camera_freeze)
|
||||||
c.connect("mouse_exited", camera_unfreeze)
|
c.connect("mouse_exited", _camera_unfreeze)
|
||||||
update()
|
update()
|
||||||
|
|
||||||
func _on_code_edit_text_changed():
|
func _on_code_edit_text_changed():
|
||||||
var shader = Shader.new()
|
var shader = Shader.new()
|
||||||
shader.code = code_editor.text
|
shader.code = code_editor.text
|
||||||
GlitchShader.shader = shader
|
Globals.shader = shader
|
||||||
GlitchShader.apply()
|
Globals.target_viewport.update()
|
||||||
|
|
||||||
func _on_preset_options_item_selected(index):
|
func _on_preset_options_item_selected(index):
|
||||||
selected_preset_name = preset_options.get_item_text(index)
|
selected_preset_name = preset_options.get_item_text(index)
|
||||||
GlitchShader.shader = ShaderPresets.presets[selected_preset_name]
|
Globals.shader = ShaderPresets.presets[selected_preset_name]
|
||||||
GlitchShader.apply()
|
Globals.target_viewport.update()
|
||||||
update()
|
update()
|
||||||
|
|
||||||
func update():
|
func update():
|
||||||
|
@ -131,4 +133,4 @@ func update():
|
||||||
preset_options.add_item(p)
|
preset_options.add_item(p)
|
||||||
preset_options.select(current_p_idx)
|
preset_options.select(current_p_idx)
|
||||||
# weirdness ends here
|
# weirdness ends here
|
||||||
code_editor.text = GlitchShader.shader.code
|
code_editor.text = Globals.shader.code
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
extends Node
|
|
||||||
|
|
||||||
var target_sprite: Sprite2D
|
|
||||||
|
|
||||||
@onready var shader: Shader = ShaderPresets.presets[ShaderPresets.default_preset]
|
|
||||||
|
|
||||||
func apply():
|
|
||||||
var mat = ShaderMaterial.new()
|
|
||||||
mat.shader = shader
|
|
||||||
target_sprite.material = mat
|
|
5
src/Globals.gd
Normal file
5
src/Globals.gd
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
extends Node
|
||||||
|
|
||||||
|
var camera_freeze = false
|
||||||
|
@onready var shader: Shader = ShaderPresets.presets[ShaderPresets.default_preset]
|
||||||
|
var target_viewport: SubViewport
|
|
@ -2,10 +2,26 @@ extends SubViewport
|
||||||
|
|
||||||
@onready var image_sprite = $ImageSprite
|
@onready var image_sprite = $ImageSprite
|
||||||
|
|
||||||
var image_original: ImageTexture
|
var image_original_tex: ImageTexture
|
||||||
|
var image_result: Image
|
||||||
|
|
||||||
func set_original_image(image: Image):
|
func set_original_image(image: Image):
|
||||||
image_original = ImageTexture.create_from_image(image)
|
image_original_tex = ImageTexture.create_from_image(image)
|
||||||
image_sprite.texture = image_original
|
image_sprite.texture = image_original_tex
|
||||||
image_sprite.offset = image_original.get_size() / 2
|
image_sprite.offset = image_original_tex.get_size() / 2
|
||||||
size = image_original.get_size()
|
size = image_original_tex.get_size()
|
||||||
|
|
||||||
|
func update():
|
||||||
|
if image_original_tex != null:
|
||||||
|
image_sprite.texture = image_original_tex
|
||||||
|
var mat = ShaderMaterial.new()
|
||||||
|
mat.shader = Globals.shader
|
||||||
|
image_sprite.material = mat
|
||||||
|
# Get viewport texture
|
||||||
|
await RenderingServer.frame_post_draw # for good measure
|
||||||
|
image_result = get_texture().get_image()
|
||||||
|
image_sprite.material = null
|
||||||
|
image_sprite.texture = ImageTexture.create_from_image(image_result)
|
||||||
|
|
||||||
|
func get_result():
|
||||||
|
return image_result
|
||||||
|
|
11
src/Main.gd
11
src/Main.gd
|
@ -2,14 +2,12 @@ extends Node2D
|
||||||
|
|
||||||
@onready var camera = $Camera
|
@onready var camera = $Camera
|
||||||
@onready var image_viewport = $ImageViewport
|
@onready var image_viewport = $ImageViewport
|
||||||
@onready var image_sprite = $ImageViewport/ImageSprite
|
|
||||||
@onready var ui_container = $UI_Layer/UserInterfaceContainer
|
@onready var ui_container = $UI_Layer/UserInterfaceContainer
|
||||||
@onready var ui_control_fileopen = $UI_Layer/UserInterfaceContainer/OpenFileDialog
|
@onready var ui_control_fileopen = $UI_Layer/UserInterfaceContainer/OpenFileDialog
|
||||||
@onready var ui_control_filesave = $UI_Layer/UserInterfaceContainer/SaveFileDialog
|
@onready var ui_control_filesave = $UI_Layer/UserInterfaceContainer/SaveFileDialog
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
GlitchShader.target_sprite = image_sprite
|
Globals.target_viewport = image_viewport
|
||||||
GlitchShader.shader = ShaderPresets.presets[ShaderPresets.default_preset]
|
|
||||||
|
|
||||||
func _on_open_image_button_pressed():
|
func _on_open_image_button_pressed():
|
||||||
if OS.get_name() == "Android":
|
if OS.get_name() == "Android":
|
||||||
|
@ -22,7 +20,7 @@ func _on_open_file_dialog_file_selected(path):
|
||||||
var err = img.load(path)
|
var err = img.load(path)
|
||||||
if err == OK:
|
if err == OK:
|
||||||
image_viewport.set_original_image(img)
|
image_viewport.set_original_image(img)
|
||||||
GlitchShader.apply()
|
image_viewport.update()
|
||||||
camera.fit_image()
|
camera.fit_image()
|
||||||
else:
|
else:
|
||||||
print("An error occured!")
|
print("An error occured!")
|
||||||
|
@ -31,9 +29,6 @@ func _on_save_image_button_pressed():
|
||||||
ui_control_filesave.show()
|
ui_control_filesave.show()
|
||||||
|
|
||||||
func _on_save_file_dialog_file_selected(path):
|
func _on_save_file_dialog_file_selected(path):
|
||||||
# Get viewport texture
|
var err = image_viewport.get_result().save_png(path)
|
||||||
await RenderingServer.frame_post_draw # for good measure
|
|
||||||
var img = image_viewport.get_texture().get_image()
|
|
||||||
var err = img.save_png(path)
|
|
||||||
if err != OK:
|
if err != OK:
|
||||||
print("An error occured!")
|
print("An error occured!")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue