shader_type canvas_item;

#include "tools.gdshaderinc"

#define ANT_BAND_FAILED    0U     /* Антенна (модуль ФС) не исправно (или нет данных) */
#define ANT_BAND_READY     1U     /* Антенна (модуль ФС) готова или исправна */
#define ANT_BAND_ASSIGNED  2U     /* Антенна (модуль ФС) назначена на излучение */
#define ANT_BAND_SELECTED  4U     /* Антенна (модуль ФС) выбрана оператором */
#define ANT_BAND_ACTIVE    8U     /* Антенна (модуль ФС) излучает */
#define ANT_BAND_DENIED    16U    /* Антенна (модуль ФС) запрет работы */

#define PI2 (PI * 2.0)

// Конфигурация сетки
uniform int grid_cells_angle = 4;     /* Количество секторов (90° каждый) */
uniform int grid_layers_radius = 7;   /* Количество слоёв по радиусу */
uniform float alpha: hint_range(0.0, 1.0) = 0.5;
uniform float inner_radius = 0.36;    /* Внутренняя незакрашенная окружность. Относительное значение */
uniform float outer_radius = 1.0;     /* Внешний радиус. Относительное значение */
uniform float grid_line_width = 0.0025; /* Сетка, ширина линий. Относительное значение */
uniform float rotation: hint_range(0, 360) = 0.0;
uniform float ffr: hint_range(0.0, 1.0) = 0.15;  /* Индикация неисправности модулей ФС. Заметность штриховки. Индикация неисправности модулей ФС */
uniform float sfr: hint_range(0.0, 10.0) = 0.0;  /* Индикация неисправности модулей ФС. Скорость движения штрховки */
uniform float pfr: hint_range(0.01, 1.0) = 0.025;  /* Индикация неисправности модулей ФС. Частота штриховки */
uniform float afr: hint_range(0.0, 180.0) = 0.0; /* Индикация неисправности модулей ФС. Угол наклона штриховки */

uniform sampler2D sec_colors; /* Цвета для секторов */
uniform uint ant_band_m[28];
varying vec2 centered_uv;


void vertex()
{
    // 1. Переводим UV в координаты относительно центра (-1..1)
    centered_uv = (UV - 0.5) * 2.0;
    rotate_vec2(centered_uv, radians(rotation + 315.0), vec2(0, 0));
}


void fragment()
{
    float dist = length(centered_uv);

    // 4. Вычисляем полярные координаты
    float angle = PI2 - atan(centered_uv.y, centered_uv.x);
    // Приводим к диапазону 0..2π
    angle = mod(angle + PI2, PI2);

    // 5. Определяем индексы ячейки
    // Сектор (0..3)
    float sector_width = PI2 / float(grid_cells_angle);
    int sector_idx = int(angle / sector_width);

    // Слой (0..6)
    float available_radius = outer_radius - inner_radius;
    float normalized_radius = (dist - inner_radius) / available_radius;
    float layer_height = 1.0 / float(grid_layers_radius);
    int layer_idx = int(normalized_radius / layer_height);

    // 7. Рассчитываем глобальный индекс ячейки (0..27)
    int cell_index = layer_idx * grid_cells_angle + sector_idx;

    // 8. Получаем цвет ячейки из массива цветов
    ivec2 sz = textureSize(sec_colors, 0);
    vec4 cell_color = texture(sec_colors, vec2((float(cell_index) + 0.5) / float(sz.x), 4));

    // Границы по углу
    float angle_in_sector = mod(angle, sector_width);
    float v0 = sector_width - 0.01;
    float v1 = sector_width + 0.0001;
    cell_color.rgb *= 1.0 - sqrt(smoothstep(v0, v1, angle_in_sector) * smoothstep(v1, v0, angle_in_sector));

    // Границы по радиусу
    float radius_in_layer = mod(normalized_radius, layer_height);
    v0 = layer_height - 0.01;
    v1 = layer_height + 0.0001;
    cell_color.rgb *= 1.0 - sqrt(smoothstep(v0, v1, radius_in_layer) * smoothstep(v1, v0, radius_in_layer));

    // Подмешивание шума для включённых
    cell_color.a = alpha + random_timed(centered_uv) * cell_color.a;

    // Индикация неисправности
    if (ant_band_m[cell_index] == ANT_BAND_FAILED)
    {
        vec2 uvr = UV;
        rotate_vec2(uvr, radians(afr), vec2(0, 0));
        cell_color.a *=  (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * uvr.x / pfr)) * ffr;
    }

   // 2. Отсекаем за пределами внешнего радиуса
    v0 = outer_radius - 0.002;
    v1 = outer_radius + 0.0001;
    cell_color.a *= smoothstep(v1, v0, dist);

    // 3. Отсекаем внутри внутреннего радиуса
    v0 = inner_radius - 0.0001;
    v1 = inner_radius + 0.002;
    cell_color.a *= smoothstep(v0, v1, dist);

    COLOR = cell_color;
}
