125 lines
5.7 KiB
GDScript
125 lines
5.7 KiB
GDScript
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)
|