Created
February 12, 2025 20:45
-
-
Save jgdovin/a270178376753a1c07cbf7a95a94ee04 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment