diff --git a/README.md b/README.md deleted file mode 100644 index 275beb9..0000000 --- a/README.md +++ /dev/null @@ -1,120 +0,0 @@ - -


Pigment

- -

Use Godot's GLSL dialect for color grading and more.

- -![screenshot](./screenshot.png) - - -## Table of Contents - -- [Supported Platforms](#supported-platforms) -- [Usage](#usage) -- [Shaderlib](#shaderlib) -- [Commandline interface](#commandline-interface) -- [Known Issues](#known-issues) - - -## Supported Platforms - -- Linux - -You can find the latest release ... - -- [here (remotebranch.eu)](https://remotebranch.eu/ChaoticByte/Pigment/releases/latest) - - -## Supported Image Formats - -| Format | Import | Export | Notes | -| ------ | :----: | :----: | ----- | -| PNG | ✔ | ✔ | exports to 8-bit RGBA | -| JPEG | ✔ | | | -| WEBP | ✔ | | | - - -## Usage - -With Pigment, you process images by writing Shader code using Godot's GLSL dialect: GDShader. -If you want to learn GDShader, take a look at the [Godot docs](https://docs.godotengine.org/en/stable/tutorials/shaders/). - -To get started, use the project template (see the Releases section of this repo) and open it in Godot. The template includes examples that you can use as a starting-point to write your own stuff. - -After opening the project in Godot, start Pigment and open a `.gdshader` file & an image. Edit the shader using Godots `Shader Editor`, and hit `Apply` in Pigment. - - -## Shaderlib - -This repo comes with a (still small) shader library including pre-written functions and more. -Have a look at the `shaderlib` folder. - -Here is an example: - -```glsl -shader_type canvas_item; - -#include "./shaderlib/oklab.gdshaderinc" - -void fragment() { - vec4 oklab = rgb2oklab(COLOR); - vec4 oklch = oklab2oklch(oklab); - oklch.z -= 2.0; - COLOR = oklab2rgb(oklch2oklab(oklch)); -} -``` - - -## Commandline interface - -You can run Pigment from the commandline or scripts. - -> Note: Headless mode is not supported. Using the commandline interface still opens a window. - - -### Usage - -``` -~ Pigment CLI ~ --=============- - -Usage: - -./Pigment - -Commands: - - help - - | Shows this help text. - - apply --shader PATH --input PATH --output PATH - - | Applies a shader file. - - --shader PATH The path to the shader - --input PATH The path to the image - Passing a folder activates batch mode - --output PATH Where to write the resulting image to - In batch mode, this must be a folder - -``` - - -### Batch Mode - -You can pass a directory to `--input` and `--output`. This will process all images in the input directory and write the output to the output directory. - -> Note: This is not very fast, so using it on maaany images may take some time. - - -#### Examples - -``` -./Pigment apply --shader ./examples/oklab.gdshader --input ~/Pictures/test.png --output ./output.png -``` - - -## Known Issues - -- On some systems, screen scaling could lead to an either blurry UI, or no scaling at all -- CLI: Godot's `--headless` option is not supported diff --git a/dist.sh b/dist.sh deleted file mode 100755 index 52caf1b..0000000 --- a/dist.sh +++ /dev/null @@ -1,32 +0,0 @@ -set -e - -function log { - echo -e "\033[1;36m***** $@ *****\033[0m" -} - -mkdir -p dist - -log Building application - -VERSION="$(godot --headless --no-header -s tools/get_version.gd)" - -godot --headless --export-release "Linux/X11" "dist/Pigment-${VERSION}.x86_64" -godot --headless --export-release "Windows Desktop" "dist/Pigment-${VERSION}.exe" - -log Packing shaderlib - -ZIP_PATH_SHADERLIB=$(realpath "dist/Pigment-${VERSION}_shaderlib.zip") - -zip -r "${ZIP_PATH_SHADERLIB}" shaderlib/ - -log Packing project template - -ZIP_PATH_PROJECT_TEMPLATE=$(realpath "dist/Pigment-${VERSION}_project_template.zip") - -rm -f "${ZIP_PATH_PROJECT_TEMPLATE}" -( - cd examples/ - mv project.godot_ project.godot && trap "mv project.godot project.godot_" EXIT - zip -r "${ZIP_PATH_PROJECT_TEMPLATE}" * -) - diff --git a/examples/0_empty.tscn b/examples/0_empty.tscn deleted file mode 100644 index 5fa71b9..0000000 --- a/examples/0_empty.tscn +++ /dev/null @@ -1,3 +0,0 @@ -[gd_scene format=3 uid="uid://db2rhq8rwv5wo"] - -[node name="Node" type="Node"] diff --git a/examples/greyscale.gdshader b/examples/greyscale.gdshader deleted file mode 100644 index d7f4c1f..0000000 --- a/examples/greyscale.gdshader +++ /dev/null @@ -1,8 +0,0 @@ -shader_type canvas_item; - -void fragment() { - float v = (COLOR.r + COLOR.g + COLOR.b) / 3.0; - COLOR.r = v; - COLOR.g = v; - COLOR.b = v; -} diff --git a/examples/greyscale.gdshader.uid b/examples/greyscale.gdshader.uid deleted file mode 100644 index b6e1bbd..0000000 --- a/examples/greyscale.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dvarqolt6es27 diff --git a/examples/hsv.gdshader b/examples/hsv.gdshader deleted file mode 100644 index 20b2547..0000000 --- a/examples/hsv.gdshader +++ /dev/null @@ -1,10 +0,0 @@ -shader_type canvas_item; - -#include "./shaderlib/hsv.gdshaderinc" - -void fragment() { - vec4 hsv = rgb2hsv(COLOR); - hsv.xyz += vec3(0.65, .42-(hsv.y*.3), -.125); - hsv.xyz *= vec3(1.0, 1.0, 1.25); - COLOR = hsv2rgb(hsv); -} diff --git a/examples/hsv.gdshader.uid b/examples/hsv.gdshader.uid deleted file mode 100644 index d943067..0000000 --- a/examples/hsv.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://gd23hu7ro148 diff --git a/examples/images/CREDITS.md b/examples/images/CREDITS.md deleted file mode 100644 index 4b7dfd5..0000000 --- a/examples/images/CREDITS.md +++ /dev/null @@ -1,5 +0,0 @@ - -# Example Images - -- swamp.jpg by [clfr21 on Pixabay](https://pixabay.com/de/users/clfr21-6530007/) -- mountain.jpg by [Phghvvcftyyufj on Pixabay](https://pixabay.com/users/phghvvcftyyufj-12646982) diff --git a/examples/images/mountain.jpg b/examples/images/mountain.jpg deleted file mode 100644 index 591c06d..0000000 Binary files a/examples/images/mountain.jpg and /dev/null differ diff --git a/examples/images/mountain.jpg.import b/examples/images/mountain.jpg.import deleted file mode 100644 index 9288ecc..0000000 --- a/examples/images/mountain.jpg.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ben72llmopgaj" -path="res://.godot/imported/mountain.jpg-c1b7de1e6557b826bc6f9324027e11af.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://examples/images/mountain.jpg" -dest_files=["res://.godot/imported/mountain.jpg-c1b7de1e6557b826bc6f9324027e11af.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/examples/images/swamp.jpg b/examples/images/swamp.jpg deleted file mode 100644 index d7bdf3c..0000000 Binary files a/examples/images/swamp.jpg and /dev/null differ diff --git a/examples/images/swamp.jpg.import b/examples/images/swamp.jpg.import deleted file mode 100644 index 50879f2..0000000 --- a/examples/images/swamp.jpg.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ckjb0agn5btv7" -path="res://.godot/imported/swamp.jpg-1dfdcd52a5ef03d42a82a7f06acefa98.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://examples/images/swamp.jpg" -dest_files=["res://.godot/imported/swamp.jpg-1dfdcd52a5ef03d42a82a7f06acefa98.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/examples/lowpass.gdshader b/examples/lowpass.gdshader deleted file mode 100644 index 04d1dec..0000000 --- a/examples/lowpass.gdshader +++ /dev/null @@ -1,9 +0,0 @@ -shader_type canvas_item; - -const float threshold = 0.6; - -void fragment() { - vec4 tex = texture(TEXTURE , UV); - COLOR.rgb = min(tex.rgb, vec3(threshold)); - COLOR.a = tex.a; -} diff --git a/examples/lowpass.gdshader.uid b/examples/lowpass.gdshader.uid deleted file mode 100644 index 80b19c7..0000000 --- a/examples/lowpass.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dn02xsjm1kok8 diff --git a/examples/oklab.gdshader b/examples/oklab.gdshader deleted file mode 100644 index b01c285..0000000 --- a/examples/oklab.gdshader +++ /dev/null @@ -1,10 +0,0 @@ -shader_type canvas_item; - -#include "./shaderlib/oklab.gdshaderinc" - -void fragment() { - vec4 oklab = rgb2oklab(COLOR); - vec4 oklch = oklab2oklch(oklab); - oklch.z -= 2.0; - COLOR = oklab2rgb(oklch2oklab(oklch)); -} diff --git a/examples/oklab.gdshader.uid b/examples/oklab.gdshader.uid deleted file mode 100644 index 87cef6b..0000000 --- a/examples/oklab.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cu37y8lc0x83 diff --git a/examples/project.godot_ b/examples/project.godot_ deleted file mode 100644 index 9ff54b2..0000000 --- a/examples/project.godot_ +++ /dev/null @@ -1,15 +0,0 @@ -; Engine configuration file. -; It's best edited using the editor UI and not directly, -; since the parameters that go here are not all obvious. -; -; Format: -; [section] ; section goes between [] -; param=value ; assign values to parameters - -config_version=5 - -[application] - -config/name="Pigment Project" -run/main_scene="res://0_empty.tscn" -config/features=PackedStringArray("4.5", "Mobile") diff --git a/examples/shaderlib b/examples/shaderlib deleted file mode 120000 index dedec01..0000000 --- a/examples/shaderlib +++ /dev/null @@ -1 +0,0 @@ -../shaderlib \ No newline at end of file diff --git a/export_presets.cfg b/export_presets.cfg deleted file mode 100644 index b543db3..0000000 --- a/export_presets.cfg +++ /dev/null @@ -1,114 +0,0 @@ -[preset.0] - -name="Linux/X11" -platform="Linux" -runnable=true -advanced_options=true -dedicated_server=false -custom_features="" -export_filter="all_resources" -include_filter="" -exclude_filter="screenshot.png, examples/*, shaderlib/*, tools/*" -export_path="dist/Pigment.x86_64" -patches=PackedStringArray() -encryption_include_filters="" -encryption_exclude_filters="" -seed=0 -encrypt_pck=false -encrypt_directory=false -script_export_mode=2 - -[preset.0.options] - -custom_template/debug="" -custom_template/release="" -debug/export_console_wrapper=1 -binary_format/embed_pck=true -texture_format/s3tc_bptc=true -texture_format/etc2_astc=false -shader_baker/enabled=false -binary_format/architecture="x86_64" -ssh_remote_deploy/enabled=false -ssh_remote_deploy/host="user@host_ip" -ssh_remote_deploy/port="22" -ssh_remote_deploy/extra_args_ssh="" -ssh_remote_deploy/extra_args_scp="" -ssh_remote_deploy/run_script="#!/usr/bin/env bash -export DISPLAY=:0 -unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\" -\"{temp_dir}/{exe_name}\" {cmd_args}" -ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash -kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\") -rm -rf \"{temp_dir}\"" -texture_format/bptc=true -texture_format/s3tc=true -texture_format/etc=false -texture_format/etc2=false - -[preset.1] - -name="Windows Desktop" -platform="Windows Desktop" -runnable=true -advanced_options=false -dedicated_server=false -custom_features="" -export_filter="all_resources" -include_filter="" -exclude_filter="" -export_path="dist/Pigment.exe" -patches=PackedStringArray() -encryption_include_filters="" -encryption_exclude_filters="" -seed=0 -encrypt_pck=false -encrypt_directory=false -script_export_mode=2 - -[preset.1.options] - -custom_template/debug="" -custom_template/release="" -debug/export_console_wrapper=1 -binary_format/embed_pck=true -texture_format/s3tc_bptc=true -texture_format/etc2_astc=false -shader_baker/enabled=false -binary_format/architecture="x86_64" -codesign/enable=false -codesign/timestamp=true -codesign/timestamp_server_url="" -codesign/digest_algorithm=1 -codesign/description="" -codesign/custom_options=PackedStringArray() -application/modify_resources=true -application/icon="" -application/console_wrapper_icon="" -application/icon_interpolation=4 -application/file_version="" -application/product_version="" -application/company_name="" -application/product_name="" -application/file_description="" -application/copyright="" -application/trademarks="" -application/export_angle=0 -application/export_d3d12=0 -application/d3d12_agility_sdk_multiarch=true -ssh_remote_deploy/enabled=false -ssh_remote_deploy/host="user@host_ip" -ssh_remote_deploy/port="22" -ssh_remote_deploy/extra_args_ssh="" -ssh_remote_deploy/extra_args_scp="" -ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' -$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' -$trigger = New-ScheduledTaskTrigger -Once -At 00:00 -$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings -Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true -Start-ScheduledTask -TaskName godot_remote_debug -while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } -Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" -ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue -Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue -Remove-Item -Recurse -Force '{temp_dir}'" diff --git a/project.godot b/project.godot deleted file mode 100644 index e9c00e0..0000000 --- a/project.godot +++ /dev/null @@ -1,72 +0,0 @@ -; Engine configuration file. -; It's best edited using the editor UI and not directly, -; since the parameters that go here are not all obvious. -; -; Format: -; [section] ; section goes between [] -; param=value ; assign values to parameters - -config_version=5 - -[application] - -config/name="Pigment" -config/version="v1.0" -run/main_scene="res://src/scenes/main.tscn" -config/features=PackedStringArray("4.5", "Mobile") -config/icon="uid://kqwc4avs2xdp" - -[autoload] - -Filesystem="*res://src/Filesystem.gd" - -[display] - -window/size/viewport_width=640 -window/size/viewport_height=672 -window/energy_saving/keep_screen_on=false -window/subwindows/embed_subwindows=false - -[editor_plugins] - -enabled=PackedStringArray() - -[input] - -zoom_out={ -"deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":16,"position":Vector2(244, 15),"global_position":Vector2(248, 56),"factor":1.0,"button_index":5,"canceled":false,"pressed":true,"double_click":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":45,"physical_keycode":0,"key_label":0,"unicode":45,"location":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194435,"key_label":0,"unicode":45,"location":0,"echo":false,"script":null) -] -} -zoom_in={ -"deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":8,"position":Vector2(270, 19),"global_position":Vector2(274, 60),"factor":1.0,"button_index":4,"canceled":false,"pressed":true,"double_click":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":43,"physical_keycode":0,"key_label":0,"unicode":43,"location":0,"echo":false,"script":null) -, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194437,"key_label":0,"unicode":43,"location":0,"echo":false,"script":null) -] -} -drag={ -"deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(183, 23),"global_position":Vector2(187, 64),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) -] -} -apply_shader={ -"deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194336,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) -] -} -save_shader={ -"deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) -] -} - -[rendering] - -renderer/rendering_method="mobile" -textures/vram_compression/import_etc2_astc=true -textures/lossless_compression/force_png=true -shader_compiler/shader_cache/enabled=false -environment/defaults/default_clear_color=Color(0.501961, 0.501961, 0.501961, 1) diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index d7db167..0000000 Binary files a/screenshot.png and /dev/null differ diff --git a/shaderlib/common.gdshaderinc b/shaderlib/common.gdshaderinc deleted file mode 100644 index 7ee57f8..0000000 --- a/shaderlib/common.gdshaderinc +++ /dev/null @@ -1,5 +0,0 @@ - -// inefficient cuberoot function -float cbrt(float x) { - return pow(x, 1.0/3.0); -} diff --git a/shaderlib/common.gdshaderinc.uid b/shaderlib/common.gdshaderinc.uid deleted file mode 100644 index f43430d..0000000 --- a/shaderlib/common.gdshaderinc.uid +++ /dev/null @@ -1 +0,0 @@ -uid://764b6ekchgb8 diff --git a/shaderlib/hsv.gdshaderinc b/shaderlib/hsv.gdshaderinc deleted file mode 100644 index 2a7834d..0000000 --- a/shaderlib/hsv.gdshaderinc +++ /dev/null @@ -1,27 +0,0 @@ - -/* - rgb2hsv and hsv2rgb functions adapted - from https://godotshaders.com/shader/hsv-adjustment/ - original code by https://godotshaders.com/author/al1-ce/ - - Color space conversion functions always work with vec4. - The fourth value is always alpha. -*/ - -// Convert RGB to HSV (hue, saturation, brightness) -vec4 rgb2hsv(vec4 c) { - vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); - vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); - vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); - float d = q.x - min(q.w, q.y); - float e = 1.0e-10; - return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x, c.a); -} - -// Convert HSV back to RGB (red, green, blue) -vec4 hsv2rgb(vec4 c) { - vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); - vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); - vec3 rgb = c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); - return vec4(rgb.r, rgb.g, rgb.b, c.a); -} diff --git a/shaderlib/hsv.gdshaderinc.uid b/shaderlib/hsv.gdshaderinc.uid deleted file mode 100644 index 771cc38..0000000 --- a/shaderlib/hsv.gdshaderinc.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bbr3tq6mp5qa2 diff --git a/shaderlib/oklab.gdshaderinc b/shaderlib/oklab.gdshaderinc deleted file mode 100644 index 5a456c7..0000000 --- a/shaderlib/oklab.gdshaderinc +++ /dev/null @@ -1,70 +0,0 @@ - -/* - OkLab and OkLCh - For more details on oklab, see - - https://bottosson.github.io/posts/oklab/ - - https://en.wikipedia.org/wiki/Oklab_color_space - - Color space conversion functions always work with vec4. - The fourth value is always alpha. -*/ - -#include "./common.gdshaderinc" - -vec4 rgb2oklab(vec4 c) { - // oklab.x and .y (a and b) should range from -0.5 to 0.5 - - float l = 0.4122214708f * c.r + 0.5363325363f * c.g + 0.0514459929f * c.b; - float m = 0.2119034982f * c.r + 0.6806995451f * c.g + 0.1073969566f * c.b; - float s = 0.0883024619f * c.r + 0.2817188376f * c.g + 0.6299787005f * c.b; - - float l_ = cbrt(l); - float m_ = cbrt(m); - float s_ = cbrt(s); - - return vec4( - 0.2104542553f*l_ + 0.7936177850f*m_ - 0.0040720468f*s_, - 1.9779984951f*l_ - 2.4285922050f*m_ + 0.4505937099f*s_, - 0.0259040371f*l_ + 0.7827717662f*m_ - 0.8086757660f*s_, - c.a - ); -} - -vec4 oklab2rgb(vec4 c) { - // oklab.x and .y (a and b) should range from -0.5 to 0.5 - - float l_ = c.x + 0.3963377774f * c.y + 0.2158037573f * c.z; - float m_ = c.x - 0.1055613458f * c.y - 0.0638541728f * c.z; - float s_ = c.x - 0.0894841775f * c.y - 1.2914855480f * c.z; - - float l = l_*l_*l_; - float m = m_*m_*m_; - float s = s_*s_*s_; - - return vec4( - +4.0767416621f * l - 3.3077115913f * m + 0.2309699292f * s, - -1.2684380046f * l + 2.6097574011f * m - 0.3413193965f * s, - -0.0041960863f * l - 0.7034186147f * m + 1.7076147010f * s, - c.a - ); -} - -vec4 oklab2oklch(vec4 c) { - // oklch.z (hue) ranges from -3.6 to 3.6 - return vec4( - c.x, - sqrt((c.y * c.y) + (c.z * c.z)), - atan(c.z, c.y), - c.a - ); -} - -vec4 oklch2oklab(vec4 c) { - // oklch.z (hue) ranges from -3.6 to 3.6 - return vec4( - c.x, - c.y * cos(c.z), - c.y * sin(c.z), - c.a - ); -} diff --git a/shaderlib/oklab.gdshaderinc.uid b/shaderlib/oklab.gdshaderinc.uid deleted file mode 100644 index 7f0bf5f..0000000 --- a/shaderlib/oklab.gdshaderinc.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ckw4nfslk4m6l diff --git a/src/Camera.gd b/src/Camera.gd deleted file mode 100644 index 8d61a49..0000000 --- a/src/Camera.gd +++ /dev/null @@ -1,50 +0,0 @@ -extends Camera2D - -@onready var image_viewport_display = %ImageViewportDisplay - -var drag = false - -func _input(event): - if event.is_action_pressed("zoom_out"): - zoom_out() - elif event.is_action_pressed("zoom_in"): - zoom_in() - if event.is_action_pressed("drag"): - self.drag = true - elif event.is_action_released("drag"): - self.drag = false - if self.drag && event is InputEventMouseMotion: - self.global_position -= event.relative / self.zoom - -var old_zoom = self.zoom - -func _process(_delta: float) -> void: - if self.zoom != old_zoom: - image_viewport_display.update_zoom_texture_filter(self.zoom) - image_viewport_display.material.set_shader_parameter("zoom_level", self.zoom) - old_zoom = self.zoom - -func fit_image(): - if Filesystem.input_image_texture != null: - var image_size = Filesystem.input_image_texture.get_size() - var viewport_size = get_viewport_rect().size - var zoomf = 1.0 - if viewport_size.x / image_size.x * image_size.y > viewport_size.y: - zoomf = viewport_size.y / image_size.y / 1.25 - else: - zoomf = viewport_size.x / image_size.x / 1.2 - self.zoom = Vector2(zoomf, zoomf) - self.global_position = Vector2(0, 0) - -func zoom_in(): - var old_mouse_pos = get_global_mouse_position() - self.zoom *= 1.2 - self.global_position += old_mouse_pos - get_global_mouse_position() - -func zoom_out(): - var old_mouse_pos = get_global_mouse_position() - self.zoom *= 1/1.2 - self.global_position += old_mouse_pos - get_global_mouse_position() - -func _on_fit_image_button_pressed(): - fit_image() diff --git a/src/Camera.gd.uid b/src/Camera.gd.uid deleted file mode 100644 index f25b715..0000000 --- a/src/Camera.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b6r8rigubdctk diff --git a/src/Filesystem.gd b/src/Filesystem.gd deleted file mode 100644 index f6f1d9e..0000000 --- a/src/Filesystem.gd +++ /dev/null @@ -1,61 +0,0 @@ -extends Node - -const SUPPORTED_INPUT_EXT = [ - ".jpeg", ".jpg", ".png", ".webp" -] - -var cwd = "." - -var shader_path = "": - get(): - return shader_path - set(v): - shader_path = v - if "/" in v: # update current working directory - cwd = v.substr(0, v.rfind("/")) - -var shader: Shader: - get(): - if shader_path == "": - return null - print("Load ", shader_path) - return load(shader_path) - -var input_image_path = "" -var input_image_texture: ImageTexture -var last_input_image_path = "" - -var last_image_savepath = "" -var result: Image - -func get_absolute_path(p: String) -> String: - # this only works on Linux! - if !p.begins_with("/"): - return self.cwd + "/" + p.lstrip("./") - return p - -func load_image() -> String: # returns an error message - var supported = false - for e in SUPPORTED_INPUT_EXT: - if self.input_image_path.ends_with(e): - supported = true - if not supported: - return "File extension not supported." - print("Load ", self.input_image_path) - var img = Image.new() - var err = img.load(self.input_image_path) - if err == OK: - input_image_texture = ImageTexture.create_from_image(img) - if self.last_image_savepath == "" or self.input_image_path != self.last_input_image_path: - self.last_image_savepath = self.input_image_path - self.last_input_image_path = self.input_image_path - return "" - return error_string(err) + " " + self.input_image_path - -func save_result(path: String): - print("Export ", path) - var err = self.result.save_png(path) - if err != OK: - print("An error occured!") - else: - self.last_image_savepath = path diff --git a/src/Filesystem.gd.uid b/src/Filesystem.gd.uid deleted file mode 100644 index a89dcab..0000000 --- a/src/Filesystem.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://rlb041ygdwol diff --git a/src/ImageCompositor.gd b/src/ImageCompositor.gd deleted file mode 100644 index 4fa083c..0000000 --- a/src/ImageCompositor.gd +++ /dev/null @@ -1,89 +0,0 @@ -class_name ImageCompositor extends SubViewport - -var image_sprite: Sprite2D - -func _init() -> void: - # Overwrite some variables - self.render_target_update_mode = SubViewport.UPDATE_ALWAYS - self.disable_3d = true - self.transparent_bg = true - self.canvas_item_default_texture_filter = Viewport.DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST - self.image_sprite = Sprite2D.new() - -@onready var camera = %Camera -@onready var image_viewport_display = %ImageViewportDisplay - -func _ready() -> void: - # Add image sprite as child to be rendered - self.add_child(image_sprite) - -var _fragment_function_regex: RegEx = RegEx.create_from_string(r'\s*void\s+fragment\s*\(\s*\)\s*{\s*') - -func validate_shader_compilation(shader: Shader) -> bool: - # Inject code to validate shader compilation - var shader_code = shader.code; - # -> get position of fragment shader - var fragment_function_match = _fragment_function_regex.search(shader.code) - if fragment_function_match == null: - return false - # -> inject uniform - var uniform_name = "shader_compilation_validate_" + str(randi_range(999999999, 100000000)) - var uniform_code_line = "\nuniform bool " + uniform_name + ";\n" - shader_code = shader_code.insert(fragment_function_match.get_start(), uniform_code_line) - # -> inject variable access to prevent that the uniform gets optimized away - shader_code = shader_code.insert(fragment_function_match.get_end() + len(uniform_code_line), "\n" + uniform_name + ";\n") - # apply shader code - shader.code = shader_code - # test if uniform list is empty -> if it is empty, the shader compilation failed - return len(shader.get_shader_uniform_list()) > 0 - -func shader_has_uniform(shader: Shader, var_name: String, type: int) -> bool: - for u in shader.get_shader_uniform_list(): - if u["name"] == var_name && u["type"] == type: - return true - return false - -func set_vsync(enabled: bool): - if enabled: - DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED) - else: - DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) - -func update() -> Array: # returns error messages (strings) - if Filesystem.input_image_path == "": - return ["No image loaded!"] - var shader = Filesystem.shader # read from disk - if shader == null: - return ["No shader opened!"] - # validate shader - if not validate_shader_compilation(shader): - return ["Shader compilation failed!"] - var errors = [] - # load texture - var fit_image = Filesystem.input_image_path != Filesystem.last_input_image_path - var err = Filesystem.load_image() - if err != "": - errors.append(err) - image_viewport_display.hide() - return errors - # apply texture - image_sprite.texture = Filesystem.input_image_texture - image_sprite.offset = Filesystem.input_image_texture.get_size() / 2 - self.size = Filesystem.input_image_texture.get_size() - # show the image viewport & fit the image - if fit_image: camera.fit_image() - image_viewport_display.show() - # create shader material - var mat = ShaderMaterial.new() - mat.shader = shader - # assign material - image_sprite.material = mat - set_vsync(false) # speed up processing - # wait for next frame & get viewport texture - await RenderingServer.frame_post_draw # wait for next frame to get drawn - Filesystem.result = get_texture().get_image() - image_sprite.texture = ImageTexture.create_from_image(Filesystem.result) - set_vsync(true) # reenable vsync - image_sprite.material = null - # done - return errors diff --git a/src/ImageCompositor.gd.uid b/src/ImageCompositor.gd.uid deleted file mode 100644 index 2e55fae..0000000 --- a/src/ImageCompositor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://d106170kuigl3 diff --git a/src/ImageViewportDisplay.gd b/src/ImageViewportDisplay.gd deleted file mode 100644 index 7a9c827..0000000 --- a/src/ImageViewportDisplay.gd +++ /dev/null @@ -1,10 +0,0 @@ -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 - else: - texture_filter = TEXTURE_FILTER_LINEAR diff --git a/src/ImageViewportDisplay.gd.uid b/src/ImageViewportDisplay.gd.uid deleted file mode 100644 index dbde761..0000000 --- a/src/ImageViewportDisplay.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ctc4lhbdsoq7u diff --git a/src/Main.gd b/src/Main.gd deleted file mode 100644 index ef3cbe7..0000000 --- a/src/Main.gd +++ /dev/null @@ -1,114 +0,0 @@ -extends Node - -@onready var app_name = ProjectSettings.get_setting("application/config/name") - -func show_help(): - print( - "Usage:\n\n", - "./Pigment \n\n", - "Commands:\n\n", - " help\n\n", - " | Shows this help text.\n\n", - " apply --shader PATH --input PATH --output PATH\n\n", - " | Applies a shader file.\n\n", - " --shader PATH The path to the shader\n", - " --input PATH The path to the image\n", - " Passing a folder activates batch mode\n", - " --output PATH Where to write the resulting image to\n", - " In batch mode, this must be a folder\n") - -func parse_custom_cmdline(args: PackedStringArray): - var kwargs: Dictionary = {"--shader": null, "--output": null, "--input": null} - var args_len = args.size() - var i = 0 - while i < args_len: - var a = args[i] - if a in kwargs && args_len > i+1: - i += 1 - kwargs[a] = args[i] - i += 1 - return kwargs - -func cli_handle_errors(errors: Array) -> int: - # returns number of errors - var n_errors = errors.size() - if n_errors > 0: - print("One or more errors occurred.") - for e in errors: - printerr(e) - return n_errors - -func cli(args: PackedStringArray): - print( - "~ Pigment CLI ~\n", - "-=============-\n") - if "help" in args: - show_help() - get_tree().quit(1) - return - var kwargs: Dictionary = parse_custom_cmdline(args) - if kwargs["--shader"] == null or kwargs["--output"] == null or kwargs["--input"] == null: - show_help() - get_tree().quit(1) - return - var batch_mode = false - var load_image_dir: DirAccess - load_image_dir = DirAccess.open(kwargs["--input"]) - if load_image_dir != null: - # batch mode - if DirAccess.open(kwargs["--output"]) == null: - printerr("If --input is a directory, --output has to be one too.\n") - show_help() - get_tree().quit(1) - return - else: - batch_mode = true - # - Filesystem.shader_path = kwargs["--shader"] - # - if batch_mode: - var in_dir_path = load_image_dir.get_current_dir() - var out_dir_path: String = kwargs["--output"].rstrip("/") - for f in load_image_dir.get_files(): - var supported = false - for e in Filesystem.SUPPORTED_INPUT_EXT: - if f.ends_with(e): - supported = true - break - if supported: - f = in_dir_path + "/" + f - print(f) - var errors = await $Compositor.update(f) - if cli_handle_errors(errors) == 0: - var filename = out_dir_path + "/" + f.substr(f.rfind("/"), -1) - Filesystem.save_result(filename) - else: - get_tree().quit(1) - return - get_tree().quit(0) - else: - var errors = [] - Filesystem.input_image_path = kwargs["--input"] - errors = await $Compositor.update() - if cli_handle_errors(errors) == 0: - Filesystem.save_result(kwargs["--output"]) - get_tree().quit(0) - else: - get_tree().quit(1) - -func prepare_gui(): - update_title() - -func _ready(): - var args = OS.get_cmdline_args() - if len(args) > 0 and args[0] in ["apply", "help"]: - # use the commandline interface - cli(args) - else: - prepare_gui() - -func update_title(current_file: String = ""): - if current_file == "": - get_window().title = app_name + " - Viewer" - else: - get_window().title = current_file + " - " + app_name + " - Viewer" diff --git a/src/Main.gd.uid b/src/Main.gd.uid deleted file mode 100644 index 2f9a508..0000000 --- a/src/Main.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://5sbslwysin5a diff --git a/src/MainUI.gd b/src/MainUI.gd deleted file mode 100644 index 4de65b1..0000000 --- a/src/MainUI.gd +++ /dev/null @@ -1,135 +0,0 @@ -extends Control - -@onready var open_shader_dialog = %OpenShaderDialog -@onready var open_image_dialog = %OpenImageDialog -@onready var save_image_dialog = %SaveImageDialog - -@onready var open_shader_button = %OpenShaderButton -@onready var open_image_button = %OpenImageButton -@onready var save_image_button = %SaveImageButton -@onready var fit_image_button = %FitImageButton -@onready var apply_shader_button = %ApplyShaderButton - -@onready var status_indicator = %StatusIndicator -@onready var error_msg_dialog = %ErrorMessageDialog - -@onready var main = get_tree().root.get_node("Main") -@onready var compositor = %Compositor -@onready var camera = %Camera - -var status_okay_texture: CompressedTexture2D = preload("uid://m1omb6g45vst") -var status_error_texture: CompressedTexture2D = preload("uid://04iv1gogpuhu") - -enum Status {OKAY, ERROR, UNKNOWN = -1} - -# - -func _ready() -> void: - var exts = [] - for e in Filesystem.SUPPORTED_INPUT_EXT: - exts.append("*" + e) - open_image_dialog.add_filter(", ".join(exts), "Image") - open_shader_dialog.add_filter("*.gdshader", "Shader") - save_image_dialog.add_filter("*.png", "Image") - -func _input(event): - if event.is_action_pressed("apply_shader"): - _on_apply_shader_button_pressed() - elif event.is_action_pressed("save_shader"): - accept_event() # Event is now handled. - -# - -func set_buttons_disabled(disabled: bool): - var btns = [] - if disabled or (Filesystem.input_image_path != "" and Filesystem.shader_path != ""): - btns = [open_shader_button, open_image_button, save_image_button, fit_image_button, apply_shader_button, status_indicator] - else: - btns = [open_shader_button, open_image_button, fit_image_button, apply_shader_button, status_indicator] - for b in btns: - b.disabled = disabled -# - -func _on_open_shader_button_pressed(): - set_buttons_disabled(true) - open_shader_dialog.show() - -func _on_open_image_button_pressed(): - set_buttons_disabled(true) - open_image_dialog.show() - -func _on_fit_image_button_pressed(): - camera.fit_image() - -func _on_apply_shader_button_pressed(): - set_buttons_disabled(true) - var errors = await compositor.update() - set_buttons_disabled(false) - if len(errors) > 0: - update_status(Status.ERROR, "\n".join(errors)) - else: - update_status(Status.OKAY) - status_indicator.disabled = true - -func _on_save_image_button_pressed(): - if Filesystem.result != null: - set_buttons_disabled(true) - var p = Filesystem.last_image_savepath - for ext in Filesystem.SUPPORTED_INPUT_EXT: - p = p.trim_suffix(ext) - save_image_dialog.current_path = p + ".png" - save_image_dialog.show() - -# - -func _on_open_shader_dialog_file_selected(path: String): - Filesystem.shader_path = path - main.update_title(path.split("/")[-1]) - self._on_apply_shader_button_pressed() - -func _on_open_shader_dialog_canceled() -> void: - set_buttons_disabled(false) - -func _on_open_shader_dialog_confirmed() -> void: - set_buttons_disabled(false) - - -func _on_open_image_dialog_file_selected(path: String) -> void: - Filesystem.input_image_path = path - self._on_apply_shader_button_pressed() - -func _on_open_image_dialog_canceled() -> void: - set_buttons_disabled(false) - -func _on_open_image_dialog_confirmed() -> void: - set_buttons_disabled(false) - - -func _on_save_image_dialog_file_selected(path): - Filesystem.save_result(path) - set_buttons_disabled(false) - -func _on_save_image_dialog_canceled() -> void: - set_buttons_disabled(false) - -func _on_save_image_dialog_confirmed() -> void: - set_buttons_disabled(false) - -# - -func update_status(status: Status, msg: String = ""): - error_msg_dialog.dialog_text = msg - error_msg_dialog.reset_size() - if status == Status.OKAY: - status_indicator.texture_normal = status_okay_texture - elif status == Status.ERROR: - status_indicator.texture_normal = status_error_texture - else: - status_indicator.texture_normal = null - if msg == "": - status_indicator.disabled = true - else: - status_indicator.disabled = false - -func _on_status_indicator_pressed() -> void: - error_msg_dialog.show() diff --git a/src/MainUI.gd.uid b/src/MainUI.gd.uid deleted file mode 100644 index 0077ccd..0000000 --- a/src/MainUI.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bxgmf2ny7yuc8 diff --git a/src/VersionLabel.gd b/src/VersionLabel.gd deleted file mode 100644 index c3c07e7..0000000 --- a/src/VersionLabel.gd +++ /dev/null @@ -1,8 +0,0 @@ -extends Label - -func _ready(): - text = ProjectSettings.get_setting("application/config/name") \ - + " " \ - + ProjectSettings.get_setting("application/config/version") \ - + " | Godot " \ - + Engine.get_version_info()["string"] diff --git a/src/VersionLabel.gd.uid b/src/VersionLabel.gd.uid deleted file mode 100644 index e731c41..0000000 --- a/src/VersionLabel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bh0gpu3i2p47f diff --git a/src/assets/bg.png b/src/assets/bg.png deleted file mode 100644 index fb67c19..0000000 Binary files a/src/assets/bg.png and /dev/null differ diff --git a/src/assets/bg.png.import b/src/assets/bg.png.import deleted file mode 100644 index aeaccf6..0000000 --- a/src/assets/bg.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d2nwchyd6huob" -path="res://.godot/imported/bg.png-7c8713dd1fab321784216191fa747e53.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://src/assets/bg.png" -dest_files=["res://.godot/imported/bg.png-7c8713dd1fab321784216191fa747e53.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/src/assets/error.svg b/src/assets/error.svg deleted file mode 100644 index af2f066..0000000 --- a/src/assets/error.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/assets/error.svg.import b/src/assets/error.svg.import deleted file mode 100644 index 0fe0b4f..0000000 --- a/src/assets/error.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://04iv1gogpuhu" -path="res://.godot/imported/error.svg-28fb29635cf59d39cabf7052619f602f.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://src/assets/error.svg" -dest_files=["res://.godot/imported/error.svg-28fb29635cf59d39cabf7052619f602f.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=2.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/src/assets/icon.png b/src/assets/icon.png deleted file mode 100644 index 528bb00..0000000 Binary files a/src/assets/icon.png and /dev/null differ diff --git a/src/assets/icon.png.import b/src/assets/icon.png.import deleted file mode 100644 index 3a27dab..0000000 --- a/src/assets/icon.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://kqwc4avs2xdp" -path="res://.godot/imported/icon.png-d8298ab6eda392a806be6bb7eec65b9c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://src/assets/icon.png" -dest_files=["res://.godot/imported/icon.png-d8298ab6eda392a806be6bb7eec65b9c.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/src/assets/icon.pxo b/src/assets/icon.pxo deleted file mode 100644 index 2a7a2b5..0000000 Binary files a/src/assets/icon.pxo and /dev/null differ diff --git a/src/assets/okay.svg b/src/assets/okay.svg deleted file mode 100644 index 5668fe8..0000000 --- a/src/assets/okay.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/assets/okay.svg.import b/src/assets/okay.svg.import deleted file mode 100644 index 8822478..0000000 --- a/src/assets/okay.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://m1omb6g45vst" -path="res://.godot/imported/okay.svg-de66a022ef37753b085371b7c60aefd1.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://src/assets/okay.svg" -dest_files=["res://.godot/imported/okay.svg-de66a022ef37753b085371b7c60aefd1.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=2.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/src/scenes/main.tscn b/src/scenes/main.tscn deleted file mode 100644 index 8289af5..0000000 --- a/src/scenes/main.tscn +++ /dev/null @@ -1,240 +0,0 @@ -[gd_scene load_steps=15 format=3 uid="uid://bjah7k4bxo044"] - -[ext_resource type="Script" uid="uid://5sbslwysin5a" path="res://src/Main.gd" id="1_64y3g"] -[ext_resource type="Script" uid="uid://d106170kuigl3" path="res://src/ImageCompositor.gd" id="2_4ykh7"] -[ext_resource type="Shader" uid="uid://ctk7jomfyx0fh" path="res://src/shader/ivd_outline.gdshader" id="3_0fllm"] -[ext_resource type="Script" uid="uid://ctc4lhbdsoq7u" path="res://src/ImageViewportDisplay.gd" id="4_pbpx2"] -[ext_resource type="Script" uid="uid://b6r8rigubdctk" path="res://src/Camera.gd" id="5_hkdq6"] -[ext_resource type="Texture2D" uid="uid://d2nwchyd6huob" path="res://src/assets/bg.png" id="6_kokaf"] -[ext_resource type="Theme" uid="uid://cwqlns34rj3vx" path="res://src/theme.tres" id="6_rjp5f"] -[ext_resource type="Script" uid="uid://bxgmf2ny7yuc8" path="res://src/MainUI.gd" id="7_5puhk"] -[ext_resource type="Script" uid="uid://bh0gpu3i2p47f" path="res://src/VersionLabel.gd" id="8_kod8x"] -[ext_resource type="Shader" uid="uid://brjouqq6wqp5u" path="res://src/shader/uibarbg.gdshader" id="9_lp058"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_y2ea0"] -shader = ExtResource("3_0fllm") -shader_parameter/zoom_level = Vector2(1, 1) - -[sub_resource type="ViewportTexture" id="ViewportTexture_lct1c"] -viewport_path = NodePath("Compositor") - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_24j03"] -shader = ExtResource("9_lp058") - -[sub_resource type="LabelSettings" id="LabelSettings_6o860"] -font_size = 12 - -[node name="Main" type="Node2D"] -script = ExtResource("1_64y3g") - -[node name="Compositor" type="SubViewport" parent="."] -unique_name_in_owner = true -script = ExtResource("2_4ykh7") - -[node name="ImageViewportDisplay" type="Sprite2D" parent="."] -unique_name_in_owner = true -material = SubResource("ShaderMaterial_y2ea0") -texture = SubResource("ViewportTexture_lct1c") -script = ExtResource("4_pbpx2") - -[node name="Camera" type="Camera2D" parent="."] -unique_name_in_owner = true -offset = Vector2(0, -32) -script = ExtResource("5_hkdq6") - -[node name="CanvasLayerBg" type="CanvasLayer" parent="."] -layer = -1 - -[node name="Control" type="Control" parent="CanvasLayerBg"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="TextureRect" type="TextureRect" parent="CanvasLayerBg/Control"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -texture = ExtResource("6_kokaf") -stretch_mode = 1 - -[node name="CanvasLayer" type="CanvasLayer" parent="."] - -[node name="MainUI" type="Control" parent="CanvasLayer"] -unique_name_in_owner = true -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -pivot_offset = Vector2(320, 320) -theme = ExtResource("6_rjp5f") -script = ExtResource("7_5puhk") - -[node name="TopBarBg" type="ColorRect" parent="CanvasLayer/MainUI"] -material = SubResource("ShaderMaterial_24j03") -layout_mode = 1 -anchors_preset = 10 -anchor_right = 1.0 -offset_bottom = 48.0 -grow_horizontal = 2 -color = Color(0, 0, 0, 0.39215687) - -[node name="BottomBarBg" type="ColorRect" parent="CanvasLayer/MainUI"] -material = SubResource("ShaderMaterial_24j03") -layout_mode = 1 -anchors_preset = 12 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = -26.0 -grow_horizontal = 2 -grow_vertical = 0 -color = Color(0, 0, 0, 0.39215687) - -[node name="OpenShaderDialog" type="FileDialog" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -auto_translate_mode = 1 -title = "Load Shader" -size = Vector2i(521, 175) -ok_button_text = "Open" -mode_overrides_title = false -file_mode = 0 -access = 2 -use_native_dialog = true - -[node name="OpenImageDialog" type="FileDialog" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -auto_translate_mode = 1 -title = "Load Image" -size = Vector2i(521, 175) -ok_button_text = "Open" -mode_overrides_title = false -file_mode = 0 -access = 2 -use_native_dialog = true - -[node name="SaveImageDialog" type="FileDialog" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -auto_translate_mode = 1 -title = "Export Image" -size = Vector2i(661, 175) -mode_overrides_title = false -access = 2 -use_native_dialog = true - -[node name="ErrorMessageDialog" type="AcceptDialog" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -auto_translate_mode = 1 -title = "Status" -initial_position = 2 -size = Vector2i(256, 128) -popup_window = true -ok_button_text = "Close" - -[node name="OpenShaderButton" type="Button" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -layout_mode = 1 -offset_left = 16.0 -offset_top = 8.0 -offset_right = 128.0 -offset_bottom = 40.0 -text = "Open Shader" - -[node name="OpenImageButton" type="Button" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -layout_mode = 1 -offset_left = 144.0 -offset_top = 8.249329 -offset_right = 256.0 -offset_bottom = 40.24933 -text = "Open Image" - -[node name="SaveImageButton" type="Button" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -layout_mode = 1 -offset_left = 272.0 -offset_top = 8.249329 -offset_right = 344.0 -offset_bottom = 40.24933 -disabled = true -text = "Export" - -[node name="FitImageButton" type="Button" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -176.0 -offset_top = 8.249329 -offset_right = -128.0 -offset_bottom = 40.24933 -grow_horizontal = 0 -text = "Fit" - -[node name="ApplyShaderButton" type="Button" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -112.0 -offset_top = 8.249329 -offset_right = -16.0 -offset_bottom = 40.24933 -grow_horizontal = 0 -text = "Apply (F5)" - -[node name="StatusIndicator" type="TextureButton" parent="CanvasLayer/MainUI"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -220.0 -offset_top = 13.0 -offset_right = -196.0 -offset_bottom = 37.0 -grow_horizontal = 0 -disabled = true -ignore_texture_size = true -stretch_mode = 0 - -[node name="VersionLabel" type="Label" parent="CanvasLayer/MainUI"] -layout_mode = 1 -anchors_preset = 12 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 16.0 -offset_top = -24.0 -offset_right = -16.0 -grow_horizontal = 2 -grow_vertical = 0 -label_settings = SubResource("LabelSettings_6o860") -horizontal_alignment = 1 -vertical_alignment = 1 -script = ExtResource("8_kod8x") - -[connection signal="canceled" from="CanvasLayer/MainUI/OpenShaderDialog" to="CanvasLayer/MainUI" method="_on_open_shader_dialog_canceled"] -[connection signal="confirmed" from="CanvasLayer/MainUI/OpenShaderDialog" to="CanvasLayer/MainUI" method="_on_open_shader_dialog_confirmed"] -[connection signal="file_selected" from="CanvasLayer/MainUI/OpenShaderDialog" to="CanvasLayer/MainUI" method="_on_open_shader_dialog_file_selected"] -[connection signal="canceled" from="CanvasLayer/MainUI/OpenImageDialog" to="CanvasLayer/MainUI" method="_on_open_image_dialog_canceled"] -[connection signal="confirmed" from="CanvasLayer/MainUI/OpenImageDialog" to="CanvasLayer/MainUI" method="_on_open_image_dialog_confirmed"] -[connection signal="file_selected" from="CanvasLayer/MainUI/OpenImageDialog" to="CanvasLayer/MainUI" method="_on_open_image_dialog_file_selected"] -[connection signal="canceled" from="CanvasLayer/MainUI/SaveImageDialog" to="CanvasLayer/MainUI" method="_on_save_image_dialog_canceled"] -[connection signal="confirmed" from="CanvasLayer/MainUI/SaveImageDialog" to="CanvasLayer/MainUI" method="_on_save_image_dialog_confirmed"] -[connection signal="file_selected" from="CanvasLayer/MainUI/SaveImageDialog" to="CanvasLayer/MainUI" method="_on_save_image_dialog_file_selected"] -[connection signal="pressed" from="CanvasLayer/MainUI/OpenShaderButton" to="CanvasLayer/MainUI" method="_on_open_shader_button_pressed"] -[connection signal="pressed" from="CanvasLayer/MainUI/OpenImageButton" to="CanvasLayer/MainUI" method="_on_open_image_button_pressed"] -[connection signal="pressed" from="CanvasLayer/MainUI/SaveImageButton" to="CanvasLayer/MainUI" method="_on_save_image_button_pressed"] -[connection signal="pressed" from="CanvasLayer/MainUI/FitImageButton" to="CanvasLayer/MainUI" method="_on_fit_image_button_pressed"] -[connection signal="pressed" from="CanvasLayer/MainUI/ApplyShaderButton" to="CanvasLayer/MainUI" method="_on_apply_shader_button_pressed"] -[connection signal="pressed" from="CanvasLayer/MainUI/StatusIndicator" to="CanvasLayer/MainUI" method="_on_status_indicator_pressed"] diff --git a/src/shader/ivd_outline.gdshader b/src/shader/ivd_outline.gdshader deleted file mode 100644 index 7f3c267..0000000 --- a/src/shader/ivd_outline.gdshader +++ /dev/null @@ -1,17 +0,0 @@ -shader_type canvas_item; -render_mode unshaded; - -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(0.5), 0.5); - } -} diff --git a/src/shader/ivd_outline.gdshader.uid b/src/shader/ivd_outline.gdshader.uid deleted file mode 100644 index b42ac31..0000000 --- a/src/shader/ivd_outline.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ctk7jomfyx0fh diff --git a/src/shader/uibarbg.gdshader b/src/shader/uibarbg.gdshader deleted file mode 100644 index 86928c8..0000000 --- a/src/shader/uibarbg.gdshader +++ /dev/null @@ -1,11 +0,0 @@ -shader_type canvas_item; -render_mode unshaded; - -uniform sampler2D screen_texture: hint_screen_texture, filter_linear_mipmap; - -void fragment() { - vec4 screen = textureLod(screen_texture, SCREEN_UV, 4.0); - vec3 col = mix(screen.rgb, COLOR.rgb, COLOR.a); - COLOR.rgb = col; - COLOR.a = 1.0; -} diff --git a/src/shader/uibarbg.gdshader.uid b/src/shader/uibarbg.gdshader.uid deleted file mode 100644 index 3293e80..0000000 --- a/src/shader/uibarbg.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://brjouqq6wqp5u diff --git a/src/theme.tres b/src/theme.tres deleted file mode 100644 index 782d3e9..0000000 --- a/src/theme.tres +++ /dev/null @@ -1,57 +0,0 @@ -[gd_resource type="Theme" load_steps=4 format=3 uid="uid://cwqlns34rj3vx"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bm5o2"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.1, 0.1, 0.1, 0.3) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(1, 1, 1, 0.27451) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l0k8a"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.225, 0.225, 0.225, 0.6) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(1, 1, 1, 0.784314) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1dkyv"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.1, 0.1, 0.1, 0.6) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(1, 1, 1, 0.509804) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[resource] -Button/styles/disabled = SubResource("StyleBoxFlat_bm5o2") -Button/styles/hover = SubResource("StyleBoxFlat_l0k8a") -Button/styles/normal = SubResource("StyleBoxFlat_1dkyv") diff --git a/tools/get_version.gd b/tools/get_version.gd deleted file mode 100644 index 8384f1b..0000000 --- a/tools/get_version.gd +++ /dev/null @@ -1,7 +0,0 @@ -extends SceneTree - -# godot --headless --no-header -s tools/get_version.gd - -func _init() -> void: - print(ProjectSettings.get_setting("application/config/version")) - quit(0) diff --git a/tools/get_version.gd.uid b/tools/get_version.gd.uid deleted file mode 100644 index e14829d..0000000 --- a/tools/get_version.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cdhqbascy6pvy