diff --git a/scenes/diagram/diagram.gd b/scenes/diagram/diagram.gd index 850977de..6cd08392 100644 --- a/scenes/diagram/diagram.gd +++ b/scenes/diagram/diagram.gd @@ -7,14 +7,16 @@ const color1_default: Color = Color(0.39, 0.44, 0.50, 1.0) var color0: Color = color0_default var color1: Color = color1_default -var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС. +var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС +var image: Image @export var SecZap: PackedScene -@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО +@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО @export var inner_radius_1: = 0.855 ## Внутренний радиус диаграммы в обзора func _ready() -> void: + image = Image.create(NUM_OF_RANGE * NUM_OF_DIRECTIONS, 1, false, Image.FORMAT_RGBA8) signaller.connect('map_mode_changed', Callable(self, 'set_view_mode')) ProjectSettings.connect('settings_changed', _on_settings_changed) _on_settings_changed() @@ -23,7 +25,6 @@ func _ready() -> void: func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125 -func set_band_colors(val: PackedColorArray): material.set('shader_parameter/ant_band_c', val) func set_band_failures(val: PackedInt32Array): material.set('shader_parameter/ant_band_m', val) func set_canvas_rotation(val: float): material.set('shader_parameter/rotation', val) func set_radius_inner_frac(val: float): material.set('shader_parameter/inner_radius', val) @@ -49,6 +50,14 @@ func get_strob_visible() -> bool: return $строб.visible func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width') +## Выставляет цвета для секторов +func set_band_colors(val: PackedColorArray): + for x in val.size(): + image.set_pixel(x, 0, val[x]) + var tex = ImageTexture.create_from_image(image) + material.set('shader_parameter/sec_colors', tex) + + ## Добавляет сектор запрета[br] ## [param id] - Индекс сектора запрета.[br] ## [param szv.x] - Центральная частота (198...546).[br] diff --git a/scenes/diagram/diagram.tscn b/scenes/diagram/diagram.tscn index eb13f323..6b0ee5ea 100644 --- a/scenes/diagram/diagram.tscn +++ b/scenes/diagram/diagram.tscn @@ -18,7 +18,6 @@ shader_parameter/ffr = 0.15 shader_parameter/sfr = 0.0 shader_parameter/pfr = 0.013 shader_parameter/afr = 0.0 -shader_parameter/ant_band_c = PackedColorArray(0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647) shader_parameter/ant_band_m = PackedInt32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) [sub_resource type="ShaderMaterial" id="ShaderMaterial_lniyv"] diff --git a/shaders/antenas.gdshader b/shaders/antenas.gdshader index ef2410b2..a6327438 100644 --- a/shaders/antenas.gdshader +++ b/shaders/antenas.gdshader @@ -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; }