diff options
| author | Radio <radiohotline@disroot.org> | 2026-06-04 15:15:11 +0300 |
|---|---|---|
| committer | Radio <radiohotline@disroot.org> | 2026-06-04 15:15:11 +0300 |
| commit | 9d74b49ab62908d4acf53dde444413886b8b28e5 (patch) | |
| tree | 0cb785267ea7e239b19d88684c0d64b9bd5d52f0 /game/shaders | |
| parent | 2c85d452ad02a5f89cd43bad7f9de31d0e4fa0c1 (diff) | |
escoria setup and old branch archives
Diffstat (limited to 'game/shaders')
| -rw-r--r-- | game/shaders/outline.gdshader | 64 | ||||
| -rw-r--r-- | game/shaders/outline.gdshader.uid | 1 | ||||
| -rw-r--r-- | game/shaders/shadermaterial_outline_green5px.tres | 11 |
3 files changed, 76 insertions, 0 deletions
diff --git a/game/shaders/outline.gdshader b/game/shaders/outline.gdshader new file mode 100644 index 0000000..a925059 --- /dev/null +++ b/game/shaders/outline.gdshader @@ -0,0 +1,64 @@ +// Source : https://godotshaders.com/shader/2d-outline-inline/ + +shader_type canvas_item; + +uniform vec4 color : source_color = vec4(1.0); +uniform float width : hint_range(0, 10) = 1.0; +uniform int pattern : hint_range(0, 2) = 0; // diamond, circle, square +uniform bool inside = false; +uniform bool add_margins = true; // only useful when inside is false + +void vertex() { + if (add_margins) { + VERTEX += (UV * 2.0 - 1.0) * width; + } +} + +bool hasContraryNeighbour(vec2 uv, vec2 texture_pixel_size, sampler2D texture) { + for (float i = -ceil(width); i <= ceil(width); i++) { + float x = abs(i) > width ? width * sign(i) : i; + float offset; + + if (pattern == 0) { + offset = width - abs(x); + } else if (pattern == 1) { + offset = floor(sqrt(pow(width + 0.5, 2) - x * x)); + } else if (pattern == 2) { + offset = width; + } + + for (float j = -ceil(offset); j <= ceil(offset); j++) { + float y = abs(j) > offset ? offset * sign(j) : j; + vec2 xy = uv + texture_pixel_size * vec2(x, y); + + if ((xy != clamp(xy, vec2(0.0), vec2(1.0)) || texture(texture, xy).a <= 0.0) == inside) { + return true; + } + } + } + + return false; +} + +void fragment() { + vec2 uv = UV; + + if (add_margins) { + vec2 texture_pixel_size = vec2(1.0) / (vec2(1.0) / TEXTURE_PIXEL_SIZE + vec2(width * 2.0)); + + uv = (uv - texture_pixel_size * width) * TEXTURE_PIXEL_SIZE / texture_pixel_size; + + if (uv != clamp(uv, vec2(0.0), vec2(1.0))) { + COLOR.a = 0.0; + } else { + COLOR = texture(TEXTURE, uv); + } + } else { + COLOR = texture(TEXTURE, uv); + } + + if ((COLOR.a > 0.0) == inside && hasContraryNeighbour(uv, TEXTURE_PIXEL_SIZE, TEXTURE)) { + COLOR.rgb = inside ? mix(COLOR.rgb, color.rgb, color.a) : color.rgb; + COLOR.a += (1.0 - COLOR.a) * color.a; + } +}
\ No newline at end of file diff --git a/game/shaders/outline.gdshader.uid b/game/shaders/outline.gdshader.uid new file mode 100644 index 0000000..b3f146f --- /dev/null +++ b/game/shaders/outline.gdshader.uid @@ -0,0 +1 @@ +uid://crapjow6genqs diff --git a/game/shaders/shadermaterial_outline_green5px.tres b/game/shaders/shadermaterial_outline_green5px.tres new file mode 100644 index 0000000..fab515d --- /dev/null +++ b/game/shaders/shadermaterial_outline_green5px.tres @@ -0,0 +1,11 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://bredlcniiy5bp"] + +[ext_resource type="Shader" path="res://game/shaders/outline.gdshader" id="1_2bktm"] + +[resource] +shader = ExtResource("1_2bktm") +shader_parameter/color = Color(0, 1, 0, 1) +shader_parameter/width = 5.0 +shader_parameter/pattern = 0 +shader_parameter/inside = false +shader_parameter/add_margins = true |
