Доработка. Устраненение пикселизации для сетки диаграммы, внешней и внутренней границы

This commit is contained in:
sasha80
2025-12-30 11:28:27 +03:00
parent 1e0d10761a
commit 44275fe92d
3 changed files with 33 additions and 30 deletions

View File

@@ -7,7 +7,9 @@ shader_type canvas_item;
#define ANT_BAND_ASSIGNED 2U /* Антенна (модуль ФС) назначена на излучение */
#define ANT_BAND_SELECTED 4U /* Антенна (модуль ФС) выбрана оператором */
#define ANT_BAND_ACTIVE 8U /* Антенна (модуль ФС) излучает */
#define ANT_BAND_DENIED 16U /* Антенна (модуль ФС) излучает */
#define ANT_BAND_DENIED 16U /* Антенна (модуль ФС) запрет работы */
#define PI2 (PI * 2.0)
// Конфигурация сетки
uniform int grid_cells_angle = 4; /* Количество секторов (90° каждый) */
@@ -22,8 +24,7 @@ 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; /* Индикация неисправности модулей ФС. Угол наклона штриховки */
// Вариант 1: Массив цветов для каждой ячейки (4×7 = 28)
uniform vec4 ant_band_c[28]: source_color;
uniform sampler2D sec_colors; /* Цвета для секторов */
uniform uint ant_band_m[28];
varying vec2 centered_uv;
@@ -40,26 +41,14 @@ void fragment()
{
float dist = length(centered_uv);
// 2. Отсекаем за пределами внешнего радиуса
if (dist > outer_radius) {
COLOR = vec4(0.0);
discard;
}
// 3. Отсекаем внутри внутреннего радиуса
if (dist < inner_radius) {
COLOR = vec4(0.0);
discard;
}
// 4. Вычисляем полярные координаты
float angle = 6.28318530718 - atan(centered_uv.y, centered_uv.x);
float angle = PI2 - atan(centered_uv.y, centered_uv.x);
// Приводим к диапазону 0..2π
angle = mod(angle + 6.28318530718, 6.28318530718);
angle = mod(angle + PI2, PI2);
// 5. Определяем индексы ячейки
// Сектор (0..3)
float sector_width = 6.28318530718 / float(grid_cells_angle);
float sector_width = PI2 / float(grid_cells_angle);
int sector_idx = int(angle / sector_width);
// Слой (0..6)
@@ -68,17 +57,12 @@ void fragment()
float layer_height = 1.0 / float(grid_layers_radius);
int layer_idx = int(normalized_radius / layer_height);
// 6. Проверяем границы (чтобы не выйти за пределы)
if (layer_idx >= grid_layers_radius) {
COLOR = vec4(0.0);
discard;
}
// 7. Рассчитываем глобальный индекс ячейки (0..27)
int cell_index = layer_idx * grid_cells_angle + sector_idx;
// 8. Получаем цвет ячейки (два варианта) из массива цветов
vec4 cell_color = ant_band_c[cell_index];
// 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);
@@ -102,5 +86,16 @@ void fragment()
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;
}