Files
uarep-ctl/scenes/diagram/diagram.gd
2026-01-14 14:00:35 +03:00

125 lines
5.7 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class_name Diagram extends ColorRect
const ANTS_COUNT: = 28
const ANT_COLOR: = Color(0.38, 0.47, 0.51, 1.0)
@export var ant_color: Color = ANT_COLOR
@export var SecZap: PackedScene
@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО
@export var inner_radius_1: = 0.855 ## Внутренний радиус диаграммы в обзора
var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС
func _ready() -> void:
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
ProjectSettings.connect('settings_changed', _on_settings_changed)
_on_settings_changed()
_init_def_colors()
set_band_colors(fs_default_colors)
func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125
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)
func set_strob_band(val: float): $строб.set_instance_shader_parameter('band', val / 125.0)
func set_strob_center(val: Vector2): $строб.position = val
func set_strob_color(val: Color): $строб.set_instance_shader_parameter('color', val)
func set_strob_dir(val: float): $строб.set_instance_shader_parameter('dir', val)
func set_strob_radius(val: float): $строб.set_instance_shader_parameter('radius', sv(val))
func set_strob_visible(val: bool): $строб.visible = val
func set_strob_width(val: float): $строб.set_instance_shader_parameter('width', val)
func get_band_colors(_val: Array): return material.get('shader_parameter/ant_band_c')
func get_band_failures(_val: Array): return material.get('shader_parameter/ant_band_m')
func get_canvas_rotation() -> float: return material.get('shader_parameter/rotation')
func get_radius_outter() -> float: return size.x / scale.x
func get_radius_inner_frac() -> float: return material.get('shader_parameter/inner_radius')
func get_strob_band() -> float: return $строб.get_instance_shader_parameter('band') * 125.0
func get_strob_center() -> Vector2: return $строб.position
func get_strob_color() -> float: return $строб.get_instance_shader_parameter('color')
func get_strob_dir() -> float: return $строб.get_instance_shader_parameter('dir')
func get_strob_radius() -> float: return $строб.get_instance_shader_parameter('radius') * 125.0
func get_strob_visible() -> bool: return $строб.visible
func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width')
## Выставляет цвета для секторов
func set_band_colors(val: PackedColorArray):
var image: = Image.create(val.size(), 1, false, Image.FORMAT_RGBA8)
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]
## [param szv.w] - Ширина диапазона (198...546).[br]
## [param szv.y] - Угол центра (0...360).[br]
## [param szv.z] - Ширина по углу (0...360).[br]
func add_seczap(id: int, szv: Vector4):
var seczap: = SecZap.instantiate()
seczap.name = StringName('SECZAP%d' % id)
seczap.position = $строб.position
seczap.set_instance_shader_parameter('dir', szv.y - 90.0)
seczap.set_instance_shader_parameter('width', szv.z)
seczap.set_instance_shader_parameter('band', sv(szv.w))
seczap.set_instance_shader_parameter('radius', sv(szv.x))
add_child(seczap)
## Удаляет сектор запрета[br]
## [param id] - Индекс сектора запрета[br]
func remove_seczap(id: int):
var seczap: = get_node_or_null('SECZAP%d' % id)
if not seczap: return
remove_child(seczap)
seczap.queue_free()
## Изменяет сектор запрета[br]
## [param id] - Индекс сектора запрета[br]
## [param szv.x] - Центральная частота[br]
## [param szv.w] - Ширина диапазона[br]
## [param szv.y] - Угол центра[br]
## [param szv.z] - Ширина по углу[br]
func set_seczap(id: int, szv: Vector4):
var seczap: = get_node('SECZAP%d' % id)
seczap.set_instance_shader_parameter('dir', szv.y)
seczap.set_instance_shader_parameter('width', szv.z)
seczap.set_instance_shader_parameter('band', sv(szv.w))
seczap.set_instance_shader_parameter('radius', sv(szv.x))
func clear_all_seczap():
for child in get_children():
if child.name.begins_with('SECZAP'):
remove_child(child)
child.queue_free()
func set_seczap_color(id: int, c: Color):
var seczap: = get_node('SECZAP%d' % id)
seczap.set_instance_shader_parameter('color', c)
func set_view_mode(val: int):
var inner_radius = inner_radius_1 if val == 1 else inner_radius_0
material.set('shader_parameter/inner_radius', inner_radius)
func _on_settings_changed():
ant_color = ProjectSettings.get_setting('application/interfer/ant_color', ANT_COLOR)
ant_color *= Color(1.0, 1.0, 1.0, 0.0)
## Закрашивание по умолчанию блоков ФС цветами из настроек.
func _init_def_colors():
fs_default_colors.clear()
for i in ANTS_COUNT:
fs_default_colors.append(ant_color)