61 lines
1.6 KiB
Plaintext
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));
|
||
|
}
|
||
|
"
|