diff --git a/scenes/main.tscn b/scenes/main.tscn index 6792ecb..8384d64 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,13 +1,18 @@ -[gd_scene load_steps=10 format=3 uid="uid://bjah7k4bxo044"] +[gd_scene load_steps=12 format=3 uid="uid://bjah7k4bxo044"] [ext_resource type="Script" path="res://src/Main.gd" id="1_2625y"] [ext_resource type="Script" path="res://src/ImageViewport.gd" id="2_hvo65"] +[ext_resource type="Shader" path="res://src/shader/ivd_outline.gdshader" id="3_6xihe"] [ext_resource type="Script" path="res://src/ImageViewportDisplay.gd" id="3_n4itb"] -[ext_resource type="Shader" path="res://src/ui_background.gdshader" id="4_ty3qx"] +[ext_resource type="Shader" path="res://src/shader/ui_background.gdshader" id="4_ty3qx"] [ext_resource type="Script" path="res://src/UIAppVersion.gd" id="5_o1ggv"] [ext_resource type="Script" path="res://src/Editor.gd" id="7_g8bap"] [ext_resource type="Script" path="res://src/Camera.gd" id="8_mls06"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_y2ea0"] +shader = ExtResource("3_6xihe") +shader_parameter/zoom_level = Vector2(1, 1) + [sub_resource type="ViewportTexture" id="ViewportTexture_lct1c"] viewport_path = NodePath("ImageViewport") @@ -30,6 +35,7 @@ unique_name_in_owner = true [node name="ImageViewportDisplay" type="Sprite2D" parent="."] unique_name_in_owner = true +material = SubResource("ShaderMaterial_y2ea0") texture = SubResource("ViewportTexture_lct1c") script = ExtResource("3_n4itb") diff --git a/src/Camera.gd b/src/Camera.gd index 1bc16f4..d30e160 100644 --- a/src/Camera.gd +++ b/src/Camera.gd @@ -29,17 +29,21 @@ func fit_image(): zoom = Vector2(zoomf, zoomf) global_position = Vector2(-((ui_container_size.x) / 2 / zoom.x), 0) +func update_viewport_display(): + image_viewport_display.update_zoom_texture_filter(zoom) + image_viewport_display.material.set_shader_parameter("zoom_level", zoom) + 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) + update_viewport_display() 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) + update_viewport_display() func _on_fit_image_button_pressed(): fit_image() diff --git a/src/Globals.gd b/src/Globals.gd index 0351452..727757e 100644 --- a/src/Globals.gd +++ b/src/Globals.gd @@ -1,7 +1,7 @@ extends Node var camera_freeze = false -@onready var shader: Shader = load("res://src/shaders/empty.gdshader") +@onready var shader: Shader = load("res://src/shader/template.gdshader") var target_viewport: SubViewport var cwd = "." var last_image_savepath = "" diff --git a/src/ImageViewport.gd b/src/ImageViewport.gd index 207d283..fc05b5c 100644 --- a/src/ImageViewport.gd +++ b/src/ImageViewport.gd @@ -2,6 +2,7 @@ extends SubViewport @onready var camera = %Camera @onready var image_sprite = %ImageSprite +@onready var image_viewport_display = %ImageViewportDisplay var image_original_tex: ImageTexture var image_result: Image @@ -36,7 +37,7 @@ func update(): # 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!") + printerr("Didn't find any load directives!") return var tex_path = get_absolute_path(regex_match.strings[1]) load_texture(tex_path) # load every time @@ -66,6 +67,7 @@ func update(): image_result = get_texture().get_image() image_sprite.material = null image_sprite.texture = ImageTexture.create_from_image(image_result) + image_viewport_display.show() func get_result(): return image_result diff --git a/src/ImageViewportDisplay.gd b/src/ImageViewportDisplay.gd index 9edcf83..7a9c827 100644 --- a/src/ImageViewportDisplay.gd +++ b/src/ImageViewportDisplay.gd @@ -1,5 +1,8 @@ extends Sprite2D +func _ready() -> void: + hide() + func update_zoom_texture_filter(zoom: Vector2): if zoom.x >= 1.5: texture_filter = TEXTURE_FILTER_NEAREST_WITH_MIPMAPS diff --git a/src/shader/ivd_outline.gdshader b/src/shader/ivd_outline.gdshader new file mode 100644 index 0000000..14ce6e0 --- /dev/null +++ b/src/shader/ivd_outline.gdshader @@ -0,0 +1,16 @@ +shader_type canvas_item; + +uniform vec2 zoom_level = vec2(1.0); +const float thickness = 3.0; + +void fragment() { + vec2 t = thickness * TEXTURE_PIXEL_SIZE / zoom_level; + if ( + UV.x < t.x || + UV.y < t.y || + UV.x > 1.0-t.x || + UV.y > 1.0-t.y + ) { + COLOR = mix(COLOR, vec4(1.0), 0.5); + } +} diff --git a/src/shaders/empty.gdshader b/src/shader/template.gdshader similarity index 100% rename from src/shaders/empty.gdshader rename to src/shader/template.gdshader diff --git a/src/ui_background.gdshader b/src/shader/ui_background.gdshader similarity index 100% rename from src/ui_background.gdshader rename to src/shader/ui_background.gdshader