61 lines
1.6 KiB
Plaintext

[gd_resource type="Shader" format=3 uid="uid://bpswjmm8i01cg"]
[resource]
code = "shader_type canvas_item;
render_mode blend_premul_alpha;
uniform sampler2D gradient;
uniform vec2 from;
uniform vec2 delta;
uniform int type;
float angle(vec2 dir) {
return atan(dir.x / dir.y) / PI * 0.5 + (dir.y < 0.0 ? 0.75 : 0.25);
}
void fragment() {
if (texture(TEXTURE, UV).r < 0.5) discard;
float pos;
switch (type)
{
case 0: // Line
// Stolen again from:
// https://iquilezles.org/articles/forgot-the-exact-link
vec2 delta_rotated = vec2(-delta.y, delta.x);
vec2 diff = UV - from;
float h = dot(diff, delta_rotated) / dot(delta_rotated, delta_rotated);
if (dot(diff, delta) > 0.0)
pos = length(diff - h * delta_rotated) / length(delta);
break;
case 1: // Line Mirrored
vec2 delta_rotated = vec2(-delta.y, delta.x);
float h = dot(UV - from, delta_rotated) / dot(delta_rotated, delta_rotated);
pos = length(UV - from - h * delta_rotated) / length(delta);
break;
case 2: // Radial
pos = length(UV - from) / length(delta);
break;
case 3: // Conic
vec2 dir = (UV - from);
pos = mod(angle(dir) - angle(delta), 1.0);
break;
case 4: // Bounds
vec2 abs_delta = abs(delta);
vec2 abs_from = from;
if (delta.x < 0.0) abs_from.x -= abs_delta.x;
if (delta.y < 0.0) abs_from.y -= abs_delta.y;
pos = min(
min(UV.x - abs_from.x, abs_delta.x - UV.x + abs_from.x),
min(UV.y - abs_from.y, abs_delta.y - UV.y + abs_from.y)
) / min(abs_delta.x, abs_delta.y) * 2.0;
break;
}
COLOR = texture(gradient, vec2(clamp(pos, 0.0, 0.999999), 0.5));
}
"