shader_type canvas_item; #include "res://shaders/tools.gdshaderinc" /* Закрашенный сектор окружности ограниченный угловым сектором и радиусами */ instance uniform vec4 color: source_color = vec4(1, 1, 1, 1); instance uniform vec4 clip_color: source_color = vec4(1.0, 0.5, 0.5, 1.0); instance uniform float width: hint_range(0.0, 360.0, 0.1) = 45.0; instance uniform float band: hint_range(0.0, 0.125) = 0.02; instance uniform float radius: hint_range(0.0, 0.125) = 0.08; instance uniform float dir: hint_range(0.0, 360.0) = 0.0; instance uniform float inner_clip: hint_range(0.0, 0.125) = 0.045; const vec2 center = vec2(0.125, 0.125); /* Центр. Должен быть в (0.5, 0.5), но это не так */ const float dsa = 0.003; /* Относительное расстояние на котором выполняется сглаживание краёв по радиальным линиям */ const float dsr = 0.0003; /* Относительное расстояние на котором выполняется сглаживание краёв по круговым линиям */ vec4 sector(vec4 c, vec2 uv_pos, float r0, float r1, float w) { bool rc = false; if (r1 > center.x) { rc = true; r1 = center.x; } if (r0 < inner_clip) { rc = true; r0 = inner_clip; } vec2 d = uv_pos - center; float theta = atan(d.x, d.y); w = radians(w / 2.0); float l = distance(center, uv_pos); float vr = smooth_px(r0, l, dsr) - smooth_px(r1, l, dsr); float va = smooth_px(-w, theta, dsa) - smooth_px(w, theta, dsa); if (rc) { c *= clip_color; } return c * sqrt(va * vr); } void vertex() { rotate_vec2(VERTEX, radians(90.0 - dir), vec2(0, 0)); } void fragment() { float dr = band / 2.0; COLOR = sector(color, UV, radius - dr, radius + dr, width); }