Removed presets, load all images via load directives (implements #9), removed obsolete code, added some improvements

This commit is contained in:
ChaoticByte 2024-12-19 18:52:47 +01:00
parent 53d42de4a5
commit 4b28a6427e
No known key found for this signature in database
21 changed files with 231 additions and 205 deletions

View file

@ -2,8 +2,9 @@ extends Camera2D
var drag = false
@onready var user_interface_container = get_parent().get_node("UI_Layer/UserInterfaceContainer")
@onready var image_viewport = get_parent().get_node("ImageViewport")
@onready var user_interface_container = %UserInterfaceContainer
@onready var image_viewport = %ImageViewport
@onready var image_viewport_display = %ImageViewportDisplay
func _input(event):
if event.is_action_pressed("zoom_out") && !Globals.camera_freeze:
@ -32,11 +33,13 @@ func zoom_in():
var old_mouse_pos = get_global_mouse_position()
zoom *= 1.2
global_position += old_mouse_pos - get_global_mouse_position()
image_viewport_display.update_zoom_texture_filter(zoom)
func zoom_out():
var old_mouse_pos = get_global_mouse_position()
zoom *= 1/1.2
global_position += old_mouse_pos - get_global_mouse_position()
image_viewport_display.update_zoom_texture_filter(zoom)
func _on_fit_image_button_pressed():
fit_image()

View file

@ -1,11 +1,8 @@
extends Control
@onready var preset_options = $PresetOptions
@onready var code_editor = $CodeEdit
@onready var open_shader_dialog = $OpenShaderDialog
@onready var save_shader_dialog = $SaveShaderDialog
var selected_preset_name = ShaderPresets.default_preset
var last_save_filepath = ""
@onready var code_editor = %CodeEdit
@onready var open_shader_dialog = %OpenShaderDialog
@onready var save_shader_dialog = %SaveShaderDialog
# # # # # # # # # # #
# GDShader keywords #
@ -189,35 +186,17 @@ func _input(event):
accept_event() # Event is now handled.
_on_save_shader_button_pressed()
func _on_preset_options_item_selected(index):
selected_preset_name = preset_options.get_item_text(index)
Globals.shader = ShaderPresets.presets[selected_preset_name]
Globals.target_viewport.update()
update()
last_save_filepath = ""
func update():
preset_options.clear()
# the following lines are weird af
var presets: Array[String] = []
var current_p_idx = 0
for p in ShaderPresets.presets:
presets.append(p)
if p == selected_preset_name:
current_p_idx = len(presets) - 1
preset_options.add_item(p)
preset_options.select(current_p_idx)
# weirdness ends here
code_editor.text = Globals.shader.code
func _on_open_shader_button_pressed():
open_shader_dialog.show()
func _on_save_shader_button_pressed():
if last_save_filepath == "":
save_shader_dialog.current_file = selected_preset_name + "_custom.gdshader"
if Globals.last_shader_savepath == "":
save_shader_dialog.current_file = "shader.gdshader"
else:
save_shader_dialog.current_path = last_save_filepath
save_shader_dialog.current_path = Globals.last_shader_savepath
save_shader_dialog.show()
func _on_open_shader_dialog_file_selected(path: String):
@ -231,7 +210,7 @@ func _on_open_shader_dialog_file_selected(path: String):
Globals.cwd = path.substr(0, path.rfind("/"))
Globals.target_viewport.update()
update()
last_save_filepath = path
Globals.last_shader_savepath = path
func _on_save_shader_dialog_file_selected(path):
print("Save ", path)
@ -240,7 +219,7 @@ func _on_save_shader_dialog_file_selected(path):
file.store_string(content)
if "/" in path: # update current working directory
Globals.cwd = path.substr(0, path.rfind("/"))
last_save_filepath = path
Globals.last_shader_savepath = path
func _on_apply_shader_button_pressed():
var shader = Shader.new()

View file

@ -1,6 +1,8 @@
extends Node
var camera_freeze = false
@onready var shader: Shader = ShaderPresets.presets[ShaderPresets.default_preset]
@onready var shader: Shader = load("res://src/shaders/empty.gdshader")
var target_viewport: SubViewport
var cwd = "."
var last_image_savepath = ""
var last_shader_savepath = ""

View file

@ -1,46 +1,71 @@
extends SubViewport
@onready var image_sprite = $ImageSprite
@onready var camera = %Camera
@onready var image_sprite = %ImageSprite
var image_original_tex: ImageTexture
var image_result: Image
var load_uniform_regex: RegEx
var load_regex: RegEx
var load_additional_regex: RegEx
var last_tex_path = ""
func _ready():
load_uniform_regex = RegEx.new()
load_uniform_regex.compile(r'\/\/!load\s(\w*)\s(.*)')
load_regex = RegEx.new()
load_additional_regex = RegEx.new()
load_regex.compile(r'\/\/!load\s(.*)')
load_additional_regex.compile(r'\/\/!load\+\s(\w*)\s(.*)')
func set_original_image(image: Image):
image_original_tex = ImageTexture.create_from_image(image)
image_sprite.texture = image_original_tex
image_sprite.offset = image_original_tex.get_size() / 2
size = image_original_tex.get_size()
func load_texture(path):
print("Load ", path)
var img = Image.new()
var err = img.load(path)
if err == OK:
image_original_tex = ImageTexture.create_from_image(img)
image_sprite.texture = image_original_tex
image_sprite.offset = image_original_tex.get_size() / 2
size = image_original_tex.get_size()
else:
print("An error occured!")
func get_absolute_path(p: String) -> String:
if !p.begins_with("/"):
return Globals.cwd + "/" + p.lstrip("./")
return p
func update():
if image_original_tex != null:
image_sprite.texture = image_original_tex
var mat = ShaderMaterial.new()
mat.shader = Globals.shader
# load images from //!load directives and apply them to
# the material as shader parameters
for m in load_uniform_regex.search_all(Globals.shader.code):
# this only works for Linux!
var img_path = m.strings[2]
if !img_path.begins_with("/"):
img_path = Globals.cwd + "/" + img_path.lstrip("./")
#
print("Load ", img_path)
var u_image = Image.load_from_file(img_path)
mat.set_shader_parameter(
m.strings[1], # uniform param name
ImageTexture.create_from_image(u_image))
# assign material
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)
# load images from //!load directive -> TEXTURE
var regex_match = load_regex.search(Globals.shader.code)
if regex_match == null: # Error!
print("Didn't find any load directives!")
return
var tex_path = get_absolute_path(regex_match.strings[1])
load_texture(tex_path) # load every time
if tex_path != last_tex_path:
camera.fit_image()
last_tex_path = tex_path
if Globals.last_image_savepath == "":
Globals.last_image_savepath = tex_path
image_sprite.texture = image_original_tex
var mat = ShaderMaterial.new()
mat.shader = Globals.shader
# load images from //!load+ directives and apply them to
# the material as shader parameters
for m in load_additional_regex.search_all(Globals.shader.code):
# this only works for Linux!
var img_path = get_absolute_path(m.strings[2])
#
print("Load ", img_path)
var u_image = Image.load_from_file(img_path)
mat.set_shader_parameter(
m.strings[1], # uniform param name
ImageTexture.create_from_image(u_image))
# assign material
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

View file

@ -1,9 +1,7 @@
extends Sprite2D
@onready var camera = get_parent().get_node("Camera")
func _process(_delta):
if camera.zoom.x >= 1.5:
func update_zoom_texture_filter(zoom: Vector2):
if zoom.x >= 1.5:
texture_filter = TEXTURE_FILTER_NEAREST_WITH_MIPMAPS
else:
texture_filter = TEXTURE_FILTER_LINEAR

View file

@ -1,33 +1,15 @@
extends Node2D
@onready var camera = $Camera
@onready var image_viewport = $ImageViewport
@onready var ui_container = $UI_Layer/UserInterfaceContainer
@onready var ui_control_fileopen = $UI_Layer/UserInterfaceContainer/OpenImageDialog
@onready var ui_control_filesave = $UI_Layer/UserInterfaceContainer/SaveImageDialog
var last_save_filepath = ""
@onready var image_viewport = %ImageViewport
@onready var ui_control_filesave = %SaveImageDialog
func _ready():
Globals.target_viewport = image_viewport
func _on_open_image_button_pressed():
ui_control_fileopen.show()
func _on_open_image_dialog_file_selected(path):
print("Load ", path)
var img = Image.new()
var err = img.load(path)
if err == OK:
image_viewport.set_original_image(img)
image_viewport.update()
camera.fit_image()
last_save_filepath = path
else:
print("An error occured!")
func _on_save_image_button_pressed():
if image_viewport.get_result() != null:
ui_control_filesave.current_path = last_save_filepath
ui_control_filesave.current_path = Globals.last_image_savepath
ui_control_filesave.show()
func _on_save_image_dialog_file_selected(path):
@ -36,4 +18,4 @@ func _on_save_image_dialog_file_selected(path):
if err != OK:
print("An error occured!")
else:
last_save_filepath = path
Globals.last_image_savepath = path

View file

@ -1,14 +0,0 @@
extends Node
const dir = "res://src/presets/shaders/"
@onready var presets = {
"Empty": load(dir + "empty.gdshader"),
"Greyscale": load(dir + "greyscale.gdshader"),
"Lowpass": load(dir + "lowpass.gdshader"),
"Channel Offset": load(dir + "channel_offset.gdshader"),
"RGB -> UV Distort": load(dir + "rgb_uv_distort.gdshader"),
"Mix": load(dir + "mix.gdshader")
}
var default_preset: String = "Empty"

View file

@ -1,12 +0,0 @@
shader_type canvas_item;
const vec2 offset_r = vec2(-0.002, -0.002);
const vec2 offset_g = vec2(0., 0.);
const vec2 offset_b = vec2(0.002, 0.002);
void fragment() {
COLOR.r = texture(TEXTURE , UV + offset_r).r;
COLOR.g = texture(TEXTURE , UV + offset_g).g;
COLOR.b = texture(TEXTURE , UV + offset_b).b;
COLOR.a = COLOR.a;
}

View file

@ -1,10 +0,0 @@
shader_type canvas_item;
void fragment() {
vec4 tex = texture(TEXTURE , UV);
float b = (COLOR.r + COLOR.g + COLOR.b) / 3.0;
COLOR.r = b;
COLOR.g = b;
COLOR.b = b;
COLOR.a = tex.a;
}

View file

@ -1,13 +0,0 @@
shader_type canvas_item;
// Settings
const float threshold = 0.5;
//
void fragment() {
vec4 tex = texture(TEXTURE , UV);
COLOR.r = min(tex.r, threshold);
COLOR.g = min(tex.g, threshold);
COLOR.b = min(tex.b, threshold);
COLOR.a = tex.a;
}

View file

@ -1,8 +0,0 @@
shader_type canvas_item;
//!load img2 ./icon.png
uniform sampler2D img2: repeat_enable, filter_nearest;
void fragment() {
COLOR = mix(COLOR, texture(img2, UV), .5);
}

View file

@ -1,11 +0,0 @@
shader_type canvas_item;
const float strength = 0.1;
void fragment() {
vec2 uv = UV;
float b = (COLOR.r + COLOR.g + COLOR.b) / 3.0;
uv.x = mix(uv.x, b, strength);
uv.y = mix(uv.y, b, strength);
COLOR = texture(TEXTURE, uv);
}

View file

@ -1,5 +1,7 @@
shader_type canvas_item;
//!load /path/to/your/image
void fragment() {
// Called for every pixel the material is visible on.
}