Add project files
This commit is contained in:
parent
88517179f0
commit
68cccc2a62
17 changed files with 551 additions and 1 deletions
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Normalize EOL for all files that Git considers text files.
|
||||||
|
* text=auto eol=lf
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2024 Julian Müller
|
Copyright (c) 2024 Julian Müller (ChaoticByte)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
1
icon.svg
Normal file
1
icon.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 814 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H446l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z" fill="#478cbf"/><path d="M483 600c0 34 58 34 58 0v-86c0-34-58-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg>
|
After Width: | Height: | Size: 949 B |
37
icon.svg.import
Normal file
37
icon.svg.import
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bye3mkghgc0mg"
|
||||||
|
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://icon.svg"
|
||||||
|
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
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/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=1.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
58
project.godot
Normal file
58
project.godot
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
; 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="Glitch"
|
||||||
|
config/version="0.0.1s"
|
||||||
|
run/main_scene="res://scenes/main.tscn"
|
||||||
|
config/features=PackedStringArray("4.2", "Mobile")
|
||||||
|
run/low_processor_mode=true
|
||||||
|
config/icon="res://icon.svg"
|
||||||
|
|
||||||
|
[autoload]
|
||||||
|
|
||||||
|
ShaderPresets="*res://src/presets/Presets.gd"
|
||||||
|
GlitchShader="*res://src/GlitchShader.gd"
|
||||||
|
|
||||||
|
[display]
|
||||||
|
|
||||||
|
window/size/viewport_width=1280
|
||||||
|
window/size/viewport_height=720
|
||||||
|
window/energy_saving/keep_screen_on=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)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
[rendering]
|
||||||
|
|
||||||
|
renderer/rendering_method="mobile"
|
||||||
|
textures/vram_compression/import_etc2_astc=true
|
||||||
|
textures/lossless_compression/force_png=true
|
||||||
|
environment/defaults/default_clear_color=Color(0, 0, 0, 1)
|
153
scenes/main.tscn
Normal file
153
scenes/main.tscn
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
[gd_scene load_steps=9 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="Script" path="res://src/ImageViewportDisplays.gd" id="3_n4itb"]
|
||||||
|
[ext_resource type="Shader" path="res://src/ui_background.gdshader" id="4_ty3qx"]
|
||||||
|
[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="ViewportTexture" id="ViewportTexture_lct1c"]
|
||||||
|
viewport_path = NodePath("ImageViewport")
|
||||||
|
|
||||||
|
[sub_resource type="ShaderMaterial" id="ShaderMaterial_onhxk"]
|
||||||
|
shader = ExtResource("4_ty3qx")
|
||||||
|
|
||||||
|
[node name="Main" type="Node2D"]
|
||||||
|
script = ExtResource("1_2625y")
|
||||||
|
|
||||||
|
[node name="ImageViewport" type="SubViewport" parent="."]
|
||||||
|
disable_3d = true
|
||||||
|
canvas_item_default_texture_filter = 0
|
||||||
|
render_target_update_mode = 4
|
||||||
|
script = ExtResource("2_hvo65")
|
||||||
|
|
||||||
|
[node name="ImageSprite" type="Sprite2D" parent="ImageViewport"]
|
||||||
|
|
||||||
|
[node name="ImageViewportDisplay" type="Sprite2D" parent="."]
|
||||||
|
texture = SubResource("ViewportTexture_lct1c")
|
||||||
|
script = ExtResource("3_n4itb")
|
||||||
|
|
||||||
|
[node name="UI_Layer" type="CanvasLayer" parent="."]
|
||||||
|
|
||||||
|
[node name="UserInterfaceContainer" type="Control" parent="UI_Layer"]
|
||||||
|
layout_mode = 3
|
||||||
|
anchor_right = 0.225
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_right = 288.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="Background" type="ColorRect" parent="UI_Layer/UserInterfaceContainer"]
|
||||||
|
material = SubResource("ShaderMaterial_onhxk")
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
color = Color(1, 1, 1, 0)
|
||||||
|
|
||||||
|
[node name="OpenFileDialog" type="FileDialog" parent="UI_Layer/UserInterfaceContainer"]
|
||||||
|
title = "Open a File"
|
||||||
|
size = Vector2i(521, 159)
|
||||||
|
ok_button_text = "Öffnen"
|
||||||
|
file_mode = 0
|
||||||
|
access = 2
|
||||||
|
use_native_dialog = true
|
||||||
|
|
||||||
|
[node name="SaveFileDialog" type="FileDialog" parent="UI_Layer/UserInterfaceContainer"]
|
||||||
|
title = "Export Image"
|
||||||
|
size = Vector2i(661, 159)
|
||||||
|
ok_button_text = "Speichern"
|
||||||
|
access = 2
|
||||||
|
filters = PackedStringArray("*.png")
|
||||||
|
use_native_dialog = true
|
||||||
|
|
||||||
|
[node name="OpenImageButton" type="Button" parent="UI_Layer/UserInterfaceContainer"]
|
||||||
|
layout_mode = 0
|
||||||
|
offset_left = 24.0
|
||||||
|
offset_top = 24.0
|
||||||
|
offset_right = 136.0
|
||||||
|
offset_bottom = 56.0
|
||||||
|
text = "Load Image"
|
||||||
|
|
||||||
|
[node name="SaveImageButton" type="Button" parent="UI_Layer/UserInterfaceContainer"]
|
||||||
|
layout_mode = 0
|
||||||
|
offset_left = 152.0
|
||||||
|
offset_top = 24.0
|
||||||
|
offset_right = 272.0
|
||||||
|
offset_bottom = 56.0
|
||||||
|
text = "Export Image"
|
||||||
|
|
||||||
|
[node name="FitImageButton" type="Button" parent="UI_Layer/UserInterfaceContainer"]
|
||||||
|
layout_mode = 0
|
||||||
|
offset_left = 288.0
|
||||||
|
offset_top = 24.0
|
||||||
|
offset_right = 376.0
|
||||||
|
offset_bottom = 56.0
|
||||||
|
text = "Fit Image"
|
||||||
|
|
||||||
|
[node name="Editor" type="Control" parent="UI_Layer/UserInterfaceContainer"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_left = 24.0
|
||||||
|
offset_top = 80.0
|
||||||
|
offset_right = -24.0
|
||||||
|
offset_bottom = -24.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
script = ExtResource("7_g8bap")
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="UI_Layer/UserInterfaceContainer/Editor"]
|
||||||
|
layout_mode = 0
|
||||||
|
offset_top = 8.0
|
||||||
|
offset_right = 104.0
|
||||||
|
offset_bottom = 40.0
|
||||||
|
text = "Load Preset: "
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="PresetOptions" type="OptionButton" parent="UI_Layer/UserInterfaceContainer/Editor"]
|
||||||
|
layout_mode = 0
|
||||||
|
offset_left = 104.0
|
||||||
|
offset_top = 8.0
|
||||||
|
offset_right = 240.0
|
||||||
|
offset_bottom = 32.0
|
||||||
|
|
||||||
|
[node name="CodeEdit" type="CodeEdit" parent="UI_Layer/UserInterfaceContainer/Editor"]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_top = 48.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
theme_override_font_sizes/font_size = 14
|
||||||
|
placeholder_text = "// Test"
|
||||||
|
wrap_mode = 1
|
||||||
|
minimap_draw = true
|
||||||
|
minimap_width = 40
|
||||||
|
caret_blink = true
|
||||||
|
draw_control_chars = true
|
||||||
|
draw_tabs = true
|
||||||
|
draw_spaces = true
|
||||||
|
line_length_guidelines = Array[int]([80])
|
||||||
|
gutters_draw_line_numbers = true
|
||||||
|
code_completion_enabled = true
|
||||||
|
indent_automatic = true
|
||||||
|
auto_brace_completion_enabled = true
|
||||||
|
auto_brace_completion_highlight_matching = true
|
||||||
|
|
||||||
|
[node name="Camera" type="Camera2D" parent="."]
|
||||||
|
script = ExtResource("8_mls06")
|
||||||
|
|
||||||
|
[connection signal="file_selected" from="UI_Layer/UserInterfaceContainer/OpenFileDialog" to="." method="_on_open_file_dialog_file_selected"]
|
||||||
|
[connection signal="file_selected" from="UI_Layer/UserInterfaceContainer/SaveFileDialog" to="." method="_on_save_file_dialog_file_selected"]
|
||||||
|
[connection signal="pressed" from="UI_Layer/UserInterfaceContainer/OpenImageButton" to="." method="_on_open_image_button_pressed"]
|
||||||
|
[connection signal="pressed" from="UI_Layer/UserInterfaceContainer/SaveImageButton" to="." method="_on_save_image_button_pressed"]
|
||||||
|
[connection signal="pressed" from="UI_Layer/UserInterfaceContainer/FitImageButton" to="Camera" method="_on_fit_image_button_pressed"]
|
||||||
|
[connection signal="item_selected" from="UI_Layer/UserInterfaceContainer/Editor/PresetOptions" to="UI_Layer/UserInterfaceContainer/Editor" method="_on_preset_options_item_selected"]
|
||||||
|
[connection signal="code_completion_requested" from="UI_Layer/UserInterfaceContainer/Editor/CodeEdit" to="UI_Layer/UserInterfaceContainer/Editor" method="_on_code_edit_code_completion_requested"]
|
||||||
|
[connection signal="text_changed" from="UI_Layer/UserInterfaceContainer/Editor/CodeEdit" to="UI_Layer/UserInterfaceContainer/Editor" method="_on_code_edit_text_changed"]
|
48
src/Camera.gd
Normal file
48
src/Camera.gd
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
extends Camera2D
|
||||||
|
|
||||||
|
var drag = false
|
||||||
|
var _freeze = false
|
||||||
|
|
||||||
|
@onready var user_interface_container = get_parent().get_node("UI_Layer/UserInterfaceContainer")
|
||||||
|
@onready var image_viewport = get_parent().get_node("ImageViewport")
|
||||||
|
|
||||||
|
func _input(event):
|
||||||
|
if event.is_action_pressed("zoom_out") && !_freeze:
|
||||||
|
zoom_out()
|
||||||
|
elif event.is_action_pressed("zoom_in") && !_freeze:
|
||||||
|
zoom_in()
|
||||||
|
if event.is_action_pressed("drag") && !_freeze:
|
||||||
|
drag = true
|
||||||
|
elif event.is_action_released("drag"):
|
||||||
|
drag = false
|
||||||
|
if drag && event is InputEventMouseMotion:
|
||||||
|
global_position -= event.relative / zoom
|
||||||
|
|
||||||
|
func fit_image():
|
||||||
|
var ui_container_size = user_interface_container.size
|
||||||
|
var image_size = image_viewport.image_original.get_size()
|
||||||
|
var viewport_size = get_viewport_rect().size
|
||||||
|
var zoomf = (viewport_size.x - ui_container_size.x) / image_size.x / 1.1
|
||||||
|
if zoomf * image_size.y > viewport_size.y:
|
||||||
|
zoomf = viewport_size.y / image_size.y / 1.1
|
||||||
|
zoom = Vector2(zoomf, zoomf)
|
||||||
|
global_position = Vector2(-((ui_container_size.x) / 2 / zoom.x), 0)
|
||||||
|
|
||||||
|
func zoom_in():
|
||||||
|
var old_mouse_pos = get_global_mouse_position()
|
||||||
|
zoom *= 1.2
|
||||||
|
global_position += old_mouse_pos - get_global_mouse_position()
|
||||||
|
|
||||||
|
func zoom_out():
|
||||||
|
var old_mouse_pos = get_global_mouse_position()
|
||||||
|
zoom *= 1/1.2
|
||||||
|
global_position += old_mouse_pos - get_global_mouse_position()
|
||||||
|
|
||||||
|
func freeze():
|
||||||
|
_freeze = true
|
||||||
|
|
||||||
|
func unfreeze():
|
||||||
|
_freeze = false
|
||||||
|
|
||||||
|
func _on_fit_image_button_pressed():
|
||||||
|
fit_image()
|
135
src/Editor.gd
Normal file
135
src/Editor.gd
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
extends Control
|
||||||
|
|
||||||
|
@onready var preset_options = $PresetOptions
|
||||||
|
@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
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
const gdshader_datatypes = [
|
||||||
|
"in", "out", "inout",
|
||||||
|
"varying", "uniform",
|
||||||
|
"const", "lowp", "mediump", "heighp",
|
||||||
|
"void",
|
||||||
|
"bool", "bvec2", "bvec3", "bvec4",
|
||||||
|
"int", "ivec2", "ivec3", "ivec4",
|
||||||
|
"uint", "uvec2", "uvec3", "uvec4",
|
||||||
|
"float", "vec2", "vec3", "vec4",
|
||||||
|
"mat2", "mat3", "mat4",
|
||||||
|
"sample2D", "isampler2D", "usample2D",
|
||||||
|
"sampler2DArray", "isample2DArray", "usample2DArray",
|
||||||
|
"sample3D", "isampler3D", "usample3D",
|
||||||
|
"samplerCube", "sampleCubeArray"
|
||||||
|
]
|
||||||
|
|
||||||
|
const gdshader_builtins = [
|
||||||
|
"TIME", "PI", "TAU", "E",
|
||||||
|
"MODEL_MATRIX",
|
||||||
|
"CANVAS_MATRIX",
|
||||||
|
"SCREEN_MATRIX",
|
||||||
|
"INSTANCE_ID",
|
||||||
|
"INSTANCE_CUSTOM",
|
||||||
|
"AT_LIGHT_PASS",
|
||||||
|
"TEXTURE_PIXEL_SIZE",
|
||||||
|
"VERTEX",
|
||||||
|
"VERTEX_ID",
|
||||||
|
"UV",
|
||||||
|
"COLOR",
|
||||||
|
"POINT_SIZE",
|
||||||
|
"FRAGCOORD",
|
||||||
|
"SCREEN_PIXEL_SIZE",
|
||||||
|
"POINT_COORD",
|
||||||
|
"TEXTURE",
|
||||||
|
"TEXTURE_PIXEL_SIZE",
|
||||||
|
"SPECULAR_SHININESS_TEXTURE",
|
||||||
|
"SPECULAR_SHININESS",
|
||||||
|
"UV",
|
||||||
|
"SCREEN_UV",
|
||||||
|
"SCREEN_TEXTURE",
|
||||||
|
"NORMAL",
|
||||||
|
"NORMAL_TEXTURE",
|
||||||
|
"NORMAL_MAP",
|
||||||
|
"NORMAL_MAP_DEPTH",
|
||||||
|
"SHADOW_VERTEX",
|
||||||
|
"LIGHT_VERTEX"
|
||||||
|
]
|
||||||
|
|
||||||
|
const gdshader_flow_control = [
|
||||||
|
"if", "else",
|
||||||
|
"for",
|
||||||
|
"do", "while",
|
||||||
|
"switch", "case",
|
||||||
|
"break",
|
||||||
|
"return"
|
||||||
|
]
|
||||||
|
|
||||||
|
class ShaderSyntaxHighlighter extends CodeHighlighter:
|
||||||
|
func _init():
|
||||||
|
add_color_region("//", "", Color.WEB_GRAY, true)
|
||||||
|
add_color_region("/*", "*/", Color.WEB_GRAY, false)
|
||||||
|
function_color = Color.INDIAN_RED
|
||||||
|
keyword_colors = {
|
||||||
|
"shader_type": Color.ORCHID
|
||||||
|
}
|
||||||
|
for dt in gdshader_datatypes:
|
||||||
|
keyword_colors[dt] = Color.INDIAN_RED
|
||||||
|
for bi in gdshader_builtins:
|
||||||
|
keyword_colors[bi] = Color.DARK_TURQUOISE
|
||||||
|
for fc in gdshader_flow_control:
|
||||||
|
keyword_colors[fc] = Color.CORAL
|
||||||
|
member_variable_color = Color.LIGHT_BLUE
|
||||||
|
number_color = Color.AQUA
|
||||||
|
symbol_color = Color.GRAY
|
||||||
|
|
||||||
|
func _on_code_edit_code_completion_requested():
|
||||||
|
for dt in gdshader_datatypes:
|
||||||
|
code_editor.code_completion_prefixes.append(dt)
|
||||||
|
code_editor.add_code_completion_option(CodeEdit.KIND_CLASS, dt, dt, Color.INDIAN_RED)
|
||||||
|
for bi in gdshader_builtins:
|
||||||
|
code_editor.code_completion_prefixes.append(bi)
|
||||||
|
code_editor.add_code_completion_option(CodeEdit.KIND_VARIABLE, bi, bi, Color.DARK_TURQUOISE)
|
||||||
|
for fc in gdshader_flow_control:
|
||||||
|
code_editor.code_completion_prefixes.append(fc)
|
||||||
|
code_editor.add_code_completion_option(CodeEdit.KIND_PLAIN_TEXT, fc, fc, Color.DARK_TURQUOISE)
|
||||||
|
code_editor.update_code_completion_options(true)
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
code_editor.code_completion_enabled = true
|
||||||
|
code_editor.syntax_highlighter = ShaderSyntaxHighlighter.new()
|
||||||
|
for c in get_children():
|
||||||
|
c.connect("mouse_entered", camera_freeze)
|
||||||
|
c.connect("mouse_exited", camera_unfreeze)
|
||||||
|
update()
|
||||||
|
|
||||||
|
func _on_code_edit_text_changed():
|
||||||
|
var shader = Shader.new()
|
||||||
|
shader.code = code_editor.text
|
||||||
|
code_editor.request_code_completion()
|
||||||
|
GlitchShader.shader = shader
|
||||||
|
GlitchShader.apply()
|
||||||
|
|
||||||
|
func _on_preset_options_item_selected(index):
|
||||||
|
selected_preset_name = preset_options.get_item_text(index)
|
||||||
|
GlitchShader.shader = ShaderPresets.presets[selected_preset_name]
|
||||||
|
GlitchShader.apply()
|
||||||
|
update()
|
||||||
|
|
||||||
|
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 = GlitchShader.shader.code
|
10
src/GlitchShader.gd
Normal file
10
src/GlitchShader.gd
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
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
|
11
src/ImageViewport.gd
Normal file
11
src/ImageViewport.gd
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
extends SubViewport
|
||||||
|
|
||||||
|
@onready var image_sprite = $ImageSprite
|
||||||
|
|
||||||
|
var image_original: ImageTexture
|
||||||
|
|
||||||
|
func set_original_image(image: Image):
|
||||||
|
image_original = ImageTexture.create_from_image(image)
|
||||||
|
image_sprite.texture = image_original
|
||||||
|
image_sprite.offset = image_original.get_size() / 2
|
||||||
|
size = image_original.get_size()
|
9
src/ImageViewportDisplays.gd
Normal file
9
src/ImageViewportDisplays.gd
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
extends Sprite2D
|
||||||
|
|
||||||
|
@onready var camera = get_parent().get_node("Camera")
|
||||||
|
|
||||||
|
func _process(_delta):
|
||||||
|
if camera.zoom.x >= 1.5:
|
||||||
|
texture_filter = TEXTURE_FILTER_NEAREST_WITH_MIPMAPS
|
||||||
|
else:
|
||||||
|
texture_filter = TEXTURE_FILTER_LINEAR
|
39
src/Main.gd
Normal file
39
src/Main.gd
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
extends Node2D
|
||||||
|
|
||||||
|
@onready var camera = $Camera
|
||||||
|
@onready var image_viewport = $ImageViewport
|
||||||
|
@onready var image_sprite = $ImageViewport/ImageSprite
|
||||||
|
@onready var ui_container = $UI_Layer/UserInterfaceContainer
|
||||||
|
@onready var ui_control_fileopen = $UI_Layer/UserInterfaceContainer/OpenFileDialog
|
||||||
|
@onready var ui_control_filesave = $UI_Layer/UserInterfaceContainer/SaveFileDialog
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
GlitchShader.target_sprite = image_sprite
|
||||||
|
GlitchShader.shader = ShaderPresets.presets[ShaderPresets.default_preset]
|
||||||
|
|
||||||
|
func _on_open_image_button_pressed():
|
||||||
|
if OS.get_name() == "Android":
|
||||||
|
Engine.get_singleton("GodotGetImage").getGalleryImage()
|
||||||
|
else:
|
||||||
|
ui_control_fileopen.show()
|
||||||
|
|
||||||
|
func _on_open_file_dialog_file_selected(path):
|
||||||
|
var img = Image.new()
|
||||||
|
var err = img.load(path)
|
||||||
|
if err == OK:
|
||||||
|
image_viewport.set_original_image(img)
|
||||||
|
GlitchShader.apply()
|
||||||
|
camera.fit_image()
|
||||||
|
else:
|
||||||
|
print("An error occured!")
|
||||||
|
|
||||||
|
func _on_save_image_button_pressed():
|
||||||
|
ui_control_filesave.show()
|
||||||
|
|
||||||
|
func _on_save_file_dialog_file_selected(path):
|
||||||
|
# Get viewport texture
|
||||||
|
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:
|
||||||
|
print("An error occured!")
|
11
src/presets/Presets.gd
Normal file
11
src/presets/Presets.gd
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
|
||||||
|
var default_preset: String = "Empty"
|
5
src/presets/shaders/empty.gdshader
Normal file
5
src/presets/shaders/empty.gdshader
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
// Called for every pixel the material is visible on.
|
||||||
|
}
|
10
src/presets/shaders/greyscale.gdshader
Normal file
10
src/presets/shaders/greyscale.gdshader
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
// TODO: not only r
|
||||||
|
vec4 tex = texture(TEXTURE , UV);
|
||||||
|
COLOR.r = tex.r;
|
||||||
|
COLOR.g = tex.r;
|
||||||
|
COLOR.b = tex.r;
|
||||||
|
COLOR.a = tex.a;
|
||||||
|
}
|
13
src/presets/shaders/lowpass.gdshader
Normal file
13
src/presets/shaders/lowpass.gdshader
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
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;
|
||||||
|
}
|
8
src/ui_background.gdshader
Normal file
8
src/ui_background.gdshader
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, repeat_disable, filter_linear_mipmap_anisotropic;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
COLOR.rgb = clamp(textureLod(SCREEN_TEXTURE, SCREEN_UV, 10.0).rgb, 0.05, 0.7);
|
||||||
|
COLOR.a = 1.0;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue