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.0025;                /* Относительное расстояние на котором выполняется сглаживание краёв по радиальным линиям */
const float dsr = 0.00025;               /* Относительное расстояние на котором выполняется сглаживание краёв по круговым линиям */


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);
}
