Merge remote-tracking branch 'MaD_CaT/master'

# Conflicts:
#	project.godot
This commit is contained in:
sasha80
2024-02-19 14:55:57 +03:00
17 changed files with 446 additions and 129 deletions

View File

@@ -26,6 +26,11 @@ config/map_maximum_zoom=19
config/map_server_addr="https://b.tile.openstreetmap.org"
config/map_image_size_rto=Vector2i(512, 512)
config/map_image_size_rls=Vector2i(1024, 1024)
interfer/center_offset=Vector2(0, 25)
interfer/default_color0=Vector3(0.38, 0.47, 0.51)
interfer/default_color1=Vector3(0.39, 0.44, 0.5)
interfer/select_color=Vector3(1, 1, 1)
interfer/interfer_color=Vector3(0.58, 0.47, 0.51)
config/mod_bus_driver="client-tcp.py"
config/mod_bus_driver_port="48000"
config/mod_bus_driver_address="localhost"
@@ -87,6 +92,7 @@ enabled=PackedStringArray()
[global]
map_server_addr=false
center_offset=Vector2(0, 0)
[gui]

View File

@@ -18,7 +18,7 @@ func _on_bip_gui_input(event):
if event is InputEventMouseButton and event.pressed:
match event.button_index:
MOUSE_BUTTON_LEFT:
signaller.emit_signal('rto_threat_sel', name.to_int())
signaller.emit_signal('bip_pressed', name.to_int())
MOUSE_BUTTON_RIGHT:
if selected:
signaller.emit_signal('rto_threat_unsel', name.to_int())

View File

@@ -31,10 +31,9 @@ func is_toggle_mode(): return $button.is_toggle_mode()
$button.set_disabled(val)
$back.disabled = val
if val:
save_modulate = $state.modulate
$state.modulate *= Color(1.0, 1.0, 1.0, 0.5)
$state.modulate.a = 0.5
else:
$state.modulate = save_modulate
$state.modulate.a = 1.0
get: return $button.disabled

View File

@@ -23,3 +23,4 @@ func get_radius_inner_0() -> float: return material.get('shader_parameter/radiu
func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1')
func set_view_mode(val: int): material.set('shader_parameter/mode', val);
func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)

View File

@@ -63,7 +63,7 @@ editor_description = "Кнопка для принудительного вкл
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
text = "JTIDS"
text = "СПРС"
metadata/rfi_name = "ozp1"
[node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]

View File

@@ -53,6 +53,8 @@ func on_row_pressed(i_row: int):
if interfer.thrs.has(ecm.ispp):
signaller.emit_signal('rto_threat_sel', interfer.thrs[ecm.ispp])
else:
if interfer.fs.has(ecm.ispp):
signaller.emit_signal('fs_selected', ecm)
signaller.emit_signal('interfer_selected', ecm)

View File

@@ -70,7 +70,7 @@ func on_interfer_selected(ecm):
func on_ecm_update():
for item in range(len(TABLE_PARAMS)):
for item in len(TABLE_PARAMS):
$table.set_node_text(1, item, '')
$table.set_node_editable(1, item, false)
if $table.has_meta('ecm') == false: return

View File

@@ -1,17 +0,0 @@
extends NinePatchRect
# Called when the node enters the scene tree for the first time.
func _ready():
$grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel))
func on_btn_cancel_pressed(btn):
signaller.emit_signal('interfer_off_all')
await get_tree().create_timer(0.1).timeout
btn.pressed = false
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

View File

@@ -17,6 +17,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_block_la1" type="NinePatchRect" parent="ref_A1_lpa"]
layout_mode = 0
offset_left = 32.0
offset_top = 70.0
offset_right = 332.0
@@ -28,6 +29,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_mshu1" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 211.0
offset_right = 280.0
@@ -36,6 +38,7 @@ fname = "МШУ"
rname = "А5"
[node name="ref_mshu2" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 89.0
offset_right = 280.0
@@ -44,6 +47,7 @@ fname = "МШУ"
rname = "А2"
[node name="ref_mshu3" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 130.0
offset_right = 280.0
@@ -52,6 +56,7 @@ fname = "МШУ"
rname = "А3"
[node name="ref_mshu4" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 171.0
offset_right = 280.0
@@ -60,6 +65,7 @@ fname = "МШУ"
rname = "А4"
[node name="ref_mshu5" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 252.0
offset_right = 280.0
@@ -68,6 +74,7 @@ fname = "МШУ"
rname = "А6"
[node name="ref_mshu6" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 48.0
offset_right = 280.0
@@ -76,6 +83,7 @@ fname = "МШУ"
rname = "А1"
[node name="ref_mshu7" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 291.0
offset_right = 280.0
@@ -84,6 +92,7 @@ fname = "МШУ"
rname = "А7"
[node name="ref_mshu8" parent="ref_A1_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 334.0
offset_right = 280.0
@@ -100,6 +109,7 @@ offset_bottom = 41.0
text = "Модули ЛА6А45"
[node name="ref_bpch" type="NinePatchRect" parent="ref_A1_lpa"]
layout_mode = 0
offset_left = 32.0
offset_top = 458.0
offset_right = 332.0
@@ -111,6 +121,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="lbl_bpch" type="Label" parent="ref_A1_lpa/ref_bpch"]
layout_mode = 0
offset_left = 135.0
offset_top = 16.0
offset_right = 167.0
@@ -127,6 +138,7 @@ fname = "Модуль ОГ"
rname = "А23"
[node name="ref_geterodin" parent="ref_A1_lpa/ref_bpch" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 85.0
offset_right = 280.0
@@ -135,6 +147,7 @@ fname = "Гетеродин"
rname = "А10"
[node name="ref_block_la2" type="NinePatchRect" parent="ref_A1_lpa"]
layout_mode = 0
offset_left = 33.0
offset_top = 605.0
offset_right = 333.0
@@ -146,6 +159,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_mshu9" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 48.0
offset_right = 280.0
@@ -154,6 +168,7 @@ fname = "МШУ"
rname = "А9"
[node name="ref_mshu10" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 89.0
offset_right = 280.0
@@ -162,6 +177,7 @@ fname = "МШУ"
rname = "А10"
[node name="ref_mshu11" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 130.0
offset_right = 280.0
@@ -170,6 +186,7 @@ fname = "МШУ"
rname = "А11"
[node name="ref_mshu12" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 171.0
offset_right = 280.0
@@ -178,6 +195,7 @@ fname = "МШУ"
rname = "А12"
[node name="ref_mshu13" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 211.0
offset_right = 280.0
@@ -186,6 +204,7 @@ fname = "МШУ"
rname = "А13"
[node name="ref_mshu14" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 252.0
offset_right = 280.0
@@ -194,6 +213,7 @@ fname = "МШУ"
rname = "А14"
[node name="ref_mshu15" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 291.0
offset_right = 280.0
@@ -202,6 +222,7 @@ fname = "МШУ"
rname = "А15"
[node name="ref_mshu16" parent="ref_A1_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 334.0
offset_right = 280.0
@@ -218,6 +239,7 @@ offset_bottom = 41.0
text = "Модули ЛА6А45"
[node name="lbl_lpa" type="Label" parent="ref_A1_lpa"]
layout_mode = 0
offset_left = 169.0
offset_top = 28.0
offset_right = 197.0
@@ -225,6 +247,7 @@ offset_bottom = 52.0
text = "ЛПА"
[node name="lbl_A" type="Label" parent="ref_A1_lpa"]
layout_mode = 0
offset_left = 302.0
offset_top = 16.0
offset_right = 330.0
@@ -243,6 +266,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_block_la1" type="NinePatchRect" parent="ref_A2_lpa"]
layout_mode = 0
offset_left = 32.0
offset_top = 70.0
offset_right = 332.0
@@ -254,6 +278,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_mshu1" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 211.0
offset_right = 280.0
@@ -262,6 +287,7 @@ fname = "МШУ"
rname = "А5"
[node name="ref_mshu2" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 89.0
offset_right = 280.0
@@ -270,6 +296,7 @@ fname = "МШУ"
rname = "А2"
[node name="ref_mshu3" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 130.0
offset_right = 280.0
@@ -278,6 +305,7 @@ fname = "МШУ"
rname = "А3"
[node name="ref_mshu4" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 171.0
offset_right = 280.0
@@ -286,6 +314,7 @@ fname = "МШУ"
rname = "А4"
[node name="ref_mshu5" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 252.0
offset_right = 280.0
@@ -294,6 +323,7 @@ fname = "МШУ"
rname = "А6"
[node name="ref_mshu6" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 48.0
offset_right = 280.0
@@ -302,6 +332,7 @@ fname = "МШУ"
rname = "А1"
[node name="ref_mshu7" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 291.0
offset_right = 280.0
@@ -310,6 +341,7 @@ fname = "МШУ"
rname = "А7"
[node name="ref_mshu8" parent="ref_A2_lpa/ref_block_la1" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 334.0
offset_right = 280.0
@@ -326,6 +358,7 @@ offset_bottom = 41.0
text = "Модули ЛА6А45"
[node name="ref_bpch" type="NinePatchRect" parent="ref_A2_lpa"]
layout_mode = 0
offset_left = 32.0
offset_top = 458.0
offset_right = 332.0
@@ -337,6 +370,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="lbl_bpch" type="Label" parent="ref_A2_lpa/ref_bpch"]
layout_mode = 0
offset_left = 135.0
offset_top = 16.0
offset_right = 167.0
@@ -353,6 +387,7 @@ fname = "Модуль ОГ"
rname = "А23"
[node name="ref_geterodin" parent="ref_A2_lpa/ref_bpch" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 85.0
offset_right = 280.0
@@ -361,6 +396,7 @@ fname = "Гетеродин"
rname = "А10"
[node name="ref_block_la2" type="NinePatchRect" parent="ref_A2_lpa"]
layout_mode = 0
offset_left = 33.0
offset_top = 605.0
offset_right = 333.0
@@ -372,6 +408,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_mshu9" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 48.0
offset_right = 280.0
@@ -380,6 +417,7 @@ fname = "МШУ"
rname = "А9"
[node name="ref_mshu10" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 89.0
offset_right = 280.0
@@ -388,6 +426,7 @@ fname = "МШУ"
rname = "А10"
[node name="ref_mshu11" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 130.0
offset_right = 280.0
@@ -396,6 +435,7 @@ fname = "МШУ"
rname = "А11"
[node name="ref_mshu12" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 171.0
offset_right = 280.0
@@ -404,6 +444,7 @@ fname = "МШУ"
rname = "А12"
[node name="ref_mshu13" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 211.0
offset_right = 280.0
@@ -412,6 +453,7 @@ fname = "МШУ"
rname = "А13"
[node name="ref_mshu14" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 252.0
offset_right = 280.0
@@ -420,6 +462,7 @@ fname = "МШУ"
rname = "А14"
[node name="ref_mshu15" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 291.0
offset_right = 280.0
@@ -428,6 +471,7 @@ fname = "МШУ"
rname = "А15"
[node name="ref_mshu16" parent="ref_A2_lpa/ref_block_la2" instance=ExtResource("2_wgsuv")]
layout_mode = 0
offset_left = 20.0
offset_top = 334.0
offset_right = 280.0
@@ -444,6 +488,7 @@ offset_bottom = 41.0
text = "Модули ЛА6А45"
[node name="lbl_lpa" type="Label" parent="ref_A2_lpa"]
layout_mode = 0
offset_left = 169.0
offset_top = 28.0
offset_right = 197.0
@@ -451,6 +496,7 @@ offset_bottom = 52.0
text = "ЛПА"
[node name="lbl_A" type="Label" parent="ref_A2_lpa"]
layout_mode = 0
offset_left = 302.0
offset_top = 16.0
offset_right = 330.0

View File

@@ -17,6 +17,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_A23" parent="ref_G1" instance=ExtResource("2_e75yj")]
layout_mode = 0
offset_left = 105.0
offset_top = 28.0
offset_right = 265.0
@@ -37,6 +38,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_A24" parent="ref_A1" instance=ExtResource("2_e75yj")]
layout_mode = 0
offset_left = 334.0
offset_top = 74.0
offset_right = 644.0
@@ -46,6 +48,7 @@ rname = "A24"
state = 1
[node name="ref_A25" parent="ref_A1" instance=ExtResource("2_e75yj")]
layout_mode = 0
offset_left = 70.0
offset_top = 115.0
offset_right = 275.0
@@ -66,6 +69,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_A26" parent="ref_A2" instance=ExtResource("2_e75yj")]
layout_mode = 0
offset_left = 336.0
offset_top = 68.0
offset_right = 646.0
@@ -75,6 +79,7 @@ rname = "A27"
state = 1
[node name="ref_A27" parent="ref_A2" instance=ExtResource("2_e75yj")]
layout_mode = 0
offset_left = 68.0
offset_top = 112.0
offset_right = 273.0

View File

@@ -17,6 +17,7 @@ patch_margin_right = 16
patch_margin_bottom = 16
[node name="ref_bu1" type="NinePatchRect" parent="ref_uf"]
layout_mode = 0
offset_left = 281.0
offset_top = 138.0
offset_right = 591.0
@@ -47,6 +48,7 @@ fname = "ВК-110"
state = 1
[node name="А8" type="Label" parent="ref_uf/ref_bu1"]
layout_mode = 0
offset_left = 21.0
offset_top = 12.0
offset_right = 39.0
@@ -54,6 +56,7 @@ offset_bottom = 31.0
text = "А8"
[node name="А1" type="Label" parent="ref_uf/ref_bu1"]
layout_mode = 0
offset_left = 140.0
offset_top = 13.0
offset_right = 174.0
@@ -61,6 +64,7 @@ offset_bottom = 32.0
text = "БУ-1"
[node name="ref_kassetav13" type="NinePatchRect" parent="ref_uf"]
layout_mode = 0
offset_left = 8.0
offset_top = 517.0
offset_right = 597.0
@@ -152,6 +156,7 @@ rname = "A12"
state = 1
[node name="А1" type="Label" parent="ref_uf/ref_kassetav13"]
layout_mode = 0
offset_left = 21.0
offset_top = 15.0
offset_right = 55.0
@@ -159,6 +164,7 @@ offset_bottom = 34.0
text = "А1"
[node name="А2" type="Label" parent="ref_uf/ref_kassetav13"]
layout_mode = 0
offset_left = 244.0
offset_top = 16.0
offset_right = 337.0

View File

@@ -21,22 +21,63 @@ extends Panel
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания
var drag_pos_begin: Vector2 ## Точка начала перетаскивания
var max_zoom: int ## Максимальный уровень детализации
var min_zoom: int ## Минимальный уровень детализации
var shift_pressed: bool ## Кнопка SHIFT нажата
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели
var drag_pos_begin: Vector2 ## Точка начала перетаскивания
var max_zoom: int ## Максимальный уровень детализации
var min_zoom: int ## Минимальный уровень детализации
var shift_pressed: bool ## Кнопка SHIFT нажата
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания
signal drag_begin ## Вызывается в момент начала перетаскивания
signal drag_continue ## Вызывается во время продолжения перетаскивания
signal drag_end ## Вызывается в момент завершения перетаскивания
## Границы секторов блоков ФС по частоте в режиме РТО
const fs_band_rto: Dictionary = {
0: [200.0, 250.0],
1: [250.0, 300.0],
2: [300.0, 350.0],
3: [350.0, 400.0],
4: [400.0, 450.0],
5: [450.0, 500.0],
6: [500.0, 550.0] }
## Границы секторов блоков ФС по частоте в режиме РЛС
const fs_band_rls: Dictionary = {
0: [480.0, 490.0],
1: [490.0, 500.0],
2: [500.0, 510.0],
3: [510.0, 520.0],
4: [520.0, 530.0],
5: [530.0, 540.0],
6: [540.0, 550.0] }
## Границы секторов блоков ФС по пеленгу
const fs_sectors: Dictionary = {
0: [0.0, 90.0],
3: [90.0, 180.0],
2: [180.0, 270.0],
1: [270.0, 360.0] }
const fs_freq: Dictionary = {
0: [400.0, 1200.0],
1: [1200.0, 2000.0],
2: [2000.0, 2800.0],
3: [2800.0, 3600.0],
4: [3600.0, 4400.0],
5: [4400.0, 5200.0],
6: [5200.0, 6000.0] }
var fs_band = fs_band_rto # Текущий режим блоков ФС по частоте
var fs_default_colors: Array # Цвета по умолчанию для блоков ФС
var fs_selected: Dictionary # Словарь выбранных секторов
var fs_active: Dictionary # Словарь секторов назначенных на подавление
## Состояние перетаскивания
enum DragFSM {
DRAG, ## В процессе
@@ -44,15 +85,28 @@ enum DragFSM {
OFF ## Выключено
}
## Состояние перетаскивания
enum BtnSel {
SECTOR, ## В процессе
THREAT, ## Не активно, ожидание
FS ## Выключено
}
## Обработчик сигнала изменения списка целей
func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size()
## Обработчик выбора цели
func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
func on_button_view_toggled(toggled: bool): signaller.emit_signal('map_mode_changed', int(toggled))
## Обработчик нажатия на кнопку вид
func on_button_view_toggled(toggled: bool):
signaller.emit_signal('map_mode_changed', int(toggled))
if toggled:
fs_band = fs_band_rls
else:
fs_band = fs_band_rto
##
@@ -77,23 +131,28 @@ func _ready():
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
drag_fsm = DragFSM.OFF
$btn_zoom.set_meta('zoom', min_zoom - 1)
$btn_strob.button_connect('pressed', Callable(self, 'on_button_strobe_pressed'))
var btns_select: Array = $btns_select.get_children()
btns_select.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_select').bind(btn, btns_select)))
$btn_view.button_connect('toggled', Callable(self, 'on_button_view_toggled'))
var nodes: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)))
set_def_colors()
threats.connect('threat_new', Callable(self, 'on_threat_new'))
threats.connect('threat_lost', Callable(self, 'on_threat_lost'))
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
threats.connect('threat_update', Callable(self, 'on_threat_update'))
signaller.connect('zoom_complete', Callable(self, '_on_zoom_complete'))
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(nodes))
signaller.connect('bip_pressed', Callable(self, 'on_bip_pressed').bind(nodes))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(nodes))
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_off_all', Callable(self, 'interfer_off_all'))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
func on_enter_tree() -> void:
call_deferred('_on_btn_scale_pressed')
call_deferred('on_button_strobe_pressed')
@@ -109,7 +168,7 @@ func map_threat_to_bip(th: threats.Threat, bip: Control):
radius_internal,
radius_outter,
freq_low,
freq_high)
freq_high) - bip.size / 2
## Обработчик сигнала обновления цели
@@ -121,24 +180,28 @@ func on_threat_update(th):
## Обработчик выбора помехи для цели
func on_interfer_new(ecm):
if interfer.thrs.has(ecm.ispp):
var th_id = interfer.thrs[ecm.ispp]
var bip = get_node('%d' % th_id)
if ecm.krp != interfer.INTERFER_OFF:
bip.set_track_visible(true)
if ecm.svk == 1:
bip.set_ecm_visible(true)
else: bip.set_ecm_visible(false)
else:
print_debug()
bip.set_ecm_visible(false)
bip.set_track_visible(false)
if interfer.thrs.has(ecm.ispp):
var th_id = interfer.thrs[ecm.ispp]
var bip = get_node('%d' % th_id)
if ecm.krp != interfer.INTERFER_OFF:
bip.set_track_visible(true)
if ecm.svk == 1:
bip.set_ecm_visible(true)
else: bip.set_ecm_visible(false)
else:
bip.set_ecm_visible(false)
bip.set_track_visible(false)
set_fs_color(ecm)
func interfer_off_all():
## Обработчик выключения всех помех
func on_interfer_off_all():
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for bip in bips:
bip.set_ecm_visible(false)
bip.set_track_visible(false)
fs_active.clear()
update_fs_colors()
## Обработчик сигнала обнаружения цели
@@ -156,12 +219,19 @@ func on_threat_lost(th) -> void:
bip.free()
## обработчик нажатия на цель на экране
func on_bip_pressed(th_id, _ecm_btns):
if btn_select == BtnSel.THREAT:
signaller.emit_signal('rto_threat_sel', th_id)
## Обработчик выбора РТО цели
func on_rto_threat_sel(th_id, ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips:
if th_id == item.name.to_int():
item.set_sel_visible(true)
unsel_fs_all(false)
else:
item.set_sel_visible(false)
for btn in ecm_btns:
@@ -169,27 +239,38 @@ func on_rto_threat_sel(th_id, ecm_btns):
## Обработчик снятия выбора РТО цели
func on_rto_threat_unsel(th_id, ecm_btns):
func on_rto_threat_unsel(th_id, _ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips:
if th_id == item.name.to_int():
item.set_sel_visible(false)
break
for btn in ecm_btns:
btn.set_pressed(false)
btn.set_disabled(true)
set_ecm_btns_state(true)
## Обработчик нажатия кнопки "Строб". Управляет отображением строба
func on_button_strobe_pressed() -> void:
drag_fsm = DragFSM.IDLE if $btn_strob.is_pressed() else DragFSM.OFF
drag_fsm = DragFSM.IDLE if $btns_select/btn_strob.is_pressed() else DragFSM.OFF
$canvas.set_strob_visible(drag_fsm == DragFSM.IDLE)
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей
func on_button_select(btn_this, btn_others) -> void:
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
btn_select = btn_this.get_meta('state')
on_button_strobe_pressed()
signaller.emit_signal('rto_threat_unsel_all')
unsel_fs_all(true)
set_ecm_btns_state(true)
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе
func on_button_pressed(btn_this, btn_others) -> void:
var fs_arr: Array = []
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
signaller.emit_signal('interfer_init', btn_this)
for key in fs_selected.keys():
fs_arr.append(get_fs_param(key))
signaller.emit_signal('interfer_init', btn_this, fs_arr)
## Управляет состоянием кнопок в радиогруппе при выборе помехи
@@ -266,8 +347,11 @@ func _input(event) -> void:
drag_fsm = DragFSM.DRAG
emit_signal('drag_begin', event)
else:
if btn_select == BtnSel.FS:
sel_fs_sector(event)
drag_fsm = DragFSM.IDLE
emit_signal('drag_end', event)
elif event is InputEventKey:
if event.physical_keycode == KEY_SHIFT:
shift_pressed = event.pressed
@@ -285,3 +369,116 @@ func _on_zoom_complete(zoom: int) -> void:
var prefix = $btn_zoom.get_meta('prefix')
$btn_zoom/lbl.text = '%s %d' % [prefix, zoom]
$btn_zoom.set_meta('zoom', zoom)
## Закрашивание по умолчанию блоков ФС цветами из настроек
func set_def_colors():
var color0: Vector3 = ProjectSettings.get_setting('application/interfer/default_color0', Vector3(0.38, 0.47, 0.51))
var color1: Vector3 = ProjectSettings.get_setting('application/interfer/default_color1', Vector3(0.39, 0.44, 0.50))
var col_arr: Array = [color0, color1]
var col = false
for i in range(7):
for j in range (4):
fs_default_colors.append(col_arr[int(col)])
col = not col
col = not col
$canvas.set_band_colors(fs_default_colors)
# Обработчик нажатия по сектору формирователя сигналов
func sel_fs_sector(event):
if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT):
var center: Vector2 = $tilemap.position
var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25))
var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0
if angle < 0:
angle +=360
var distance: float = event.position.distance_to(center + center_offset)
var sector: int
var band: int
var has_band: bool = false
for sec in fs_sectors.values():
if angle >= sec[0] and angle <= sec[1]:
sector = fs_sectors.find_key(sec)
for diap in fs_band.values():
if distance >= diap[0] and distance <= diap[1]:
band = fs_band.find_key(diap)
has_band = true
if not has_band:
return
var fs_index = band * 4 + sector
if event.button_index == MOUSE_BUTTON_LEFT:
fs_selected[fs_index] = null
else:
fs_selected.erase(fs_index)
update_fs_colors()
signaller.emit_signal('rto_threat_unsel_all')
var btn_state = len(fs_selected) == 0
set_ecm_btns_state(btn_state)
func set_fs_color(ecm):
var fs_index = get_fs_index(ecm)
if ecm.krp != interfer.INTERFER_OFF:
fs_active[fs_index] = null
else:
fs_active.erase(fs_index)
update_fs_colors()
func update_fs_colors():
var fs_colors = fs_default_colors.duplicate()
var color_ecm: Vector3 = ProjectSettings.get_setting('application/interfer/interfer_color', Vector3(0.58, 0.47, 0.51))
var color_select: Vector3 = ProjectSettings.get_setting('application/interfer/select_color', Vector3(1.0, 1.0, 1.0))
for key in fs_active.keys():
fs_colors[key] = color_ecm
for key in fs_selected.keys():
fs_colors[key] = color_select
$canvas.set_band_colors(fs_colors)
func unsel_fs_all(need_btns_off: bool):
fs_selected.clear()
update_fs_colors()
if need_btns_off:
set_ecm_btns_state(true)
func set_ecm_btns_state(value: bool):
var btns: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
for btn in btns:
btn.set_pressed(false)
btn.set_disabled(value)
func get_fs_param(index: int) -> Array:
var freq = (fs_freq[index / 4][0] + fs_freq[index / 4][1])/2
var sector = (fs_sectors[index % 4][0] + fs_sectors[index % 4][1])/2 - 45.0
if sector < 0:
sector += 360.0
var width = fs_freq[index / 4][1] - fs_freq[index / 4][0]
return [sector, freq, width, index]
func on_fs_selected(ecm):
var fs_index = get_fs_index(ecm)
fs_selected.clear()
fs_selected[fs_index] = null
update_fs_colors()
func get_fs_index(ecm):
var sector: int
var band: int
var angle: float = ecm.kni + 45.0
if angle > 360.0:
angle -= 360.0
for sec in fs_sectors.values():
if float(angle) >= sec[0] and float(angle) <= sec[1]:
sector = fs_sectors.find_key(sec)
for diap in fs_freq.values():
if ecm.params.has('freq'):
if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]:
band = fs_freq.find_key(diap)
var fs_index = band * 4 + sector
return fs_index

View File

@@ -25,10 +25,10 @@ col_red = Color(1, 0.568627, 0.431373, 0.239216)
drag_scale_band = 0.05
drag_scale_width = 0.5
freq_high = 6000.0
freq_low = 200.0
freq_low = 400.0
radius_center = Vector2(560, 560)
radius_internal = 200.0
radius_outter = 400.0
radius_outter = 350.0
strob_max_band = 15.538
strob_max_width = 90.0
strob_min_band = 0.1
@@ -104,17 +104,6 @@ size_flags_horizontal = 3
size_flags_vertical = 3
text = "Автомат"
[node name="btn_strob" parent="." instance=ExtResource("8_k0iv2")]
layout_mode = 2
offset_left = 1034.0
offset_top = 67.0
offset_right = 1108.0
offset_bottom = 121.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
text = "Строб"
[node name="btn_view" parent="." instance=ExtResource("8_k0iv2")]
layout_mode = 2
offset_left = 874.0
@@ -135,6 +124,38 @@ metadata/zoom = 4
[node name="canvas" parent="." instance=ExtResource("11_b6su4")]
[node name="btns_select" type="GridContainer" parent="."]
layout_mode = 0
offset_left = 1034.0
offset_top = 65.0
offset_right = 1108.0
offset_bottom = 181.0
[node name="btn_strob" parent="btns_select" instance=ExtResource("8_k0iv2")]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
text = "Строб"
metadata/state = 0
[node name="btn_threats" parent="btns_select" instance=ExtResource("8_k0iv2")]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
text = "Цель"
pressed = true
metadata/state = 1
[node name="btn_fs_sector" parent="btns_select" instance=ExtResource("8_k0iv2")]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
text = "Сектор"
metadata/state = 2
[connection signal="drag_begin" from="." to="." method="_on_drag_begin"]
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
[connection signal="pressed" from="btn_zoom" to="." method="_on_btn_scale_pressed"]

View File

@@ -2,7 +2,6 @@ extends Node
## Представление помехи
## Режимы помехи
const ITERFER_MODE = {
'off': ['Откл', ['freq', 'width']],
@@ -20,26 +19,29 @@ const ITERFER_MODE = {
'k1': ['K1', ['freq', 'width', 'dur', 'period']],
'ozp1': ['ОЗП-1', ['freq', 'width']] }
const TYPE_TH = ['th','fs']
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей
const INTERFER_OFF = 'off'
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен
var msg_ss: int = 0 ## счётчик сообщений
var id_array: Array ## Массив id воздействий
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия
## Сеанс помехи
class Interfer:
var ss: int = 0 ## Счётчик сообщений.
var ispp: int = 0 ## Индекс сеанса.
var svk: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE].
var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE].
var powp: float = 0.0 ## Мощность излучения выраженная в процентах.
var kni: = 0.0 ## Курсовой угол направления излучения.
var params: = {} ## Параметры помехи.
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс.
var ss: int = 0 ## Счётчик сообщений.
var ispp: int = 0 ## Индекс сеанса.
var svk: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE].
var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE].
var powp: float = 0.0 ## Мощность излучения выраженная в процентах.
var kni: = 0.0 ## Курсовой угол направления излучения.
var params: = {} ## Параметры помехи.
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс.
var type_th: String = '' ## Тип объекта по которой поставлена помеха
func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
@@ -100,6 +102,7 @@ func _ready():
signaller.connect('interfer_new', Callable(self, 'send_ecm').bind(unit))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit, ecms))
# Проверяет состояние отправки пакета и если не доставлен, повторяет отправку
func on_timer_check_state(unit, ecms, resend_timeout):
var tick = Time.get_ticks_msec()
@@ -137,46 +140,60 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
## Вызыватся, когда пользователь выбрал помеху и выбраны цели
func on_interfer_create(btn, sel_threats, unit, ecms):
func on_interfer_create(btn, sel_threats, fs_arr, _unit, ecms):
for item in sel_threats:
var ispp: int = 0
var interfer_name: String = btn.get_meta('rfi_name')
var param: Dictionary = {}
var kni: float = item.aoa
var id = item.id
param['freq'] = item.freq
param['width'] = item.width
if interfer_name == 'k1':
param['dur'] = 1.0 # Необходимо добавить параметры управления
param['period'] = 1.0 # Необходимо добавить параметры управления
var key = thrs.find_key(item.id)
if key != null:
ispp = key
else:
if interfer_name == 'off':
return
ispp = pop_id()
if ispp == 0: return
msg_ss += 1
var ecm: Interfer
if ecms.has(ispp):
ecm = ecms[ispp]
else:
ecm = Interfer.new()
ecm.ispp = ispp
ecms[ispp] = ecm
ecm.svk = STATE_TSMT # Подготовка к передаче сообщения
ecm.ss = msg_ss
ecm.kni = kni
ecm.krp = interfer_name
ecm.params = param
ecm.powp = 100.0 # Необходимо добавить управление мощностью
thrs[ispp] = item.id
signaller.emit_signal('interfer_new', ecm)
interfer_create(btn, ecms, param, kni, id, thrs, item, TYPE_TH[0])
for item in fs_arr:
var param: Dictionary = {}
var kni: float = item[0]
var id = item[3]
param['freq'] = item[1]
param['width'] = item[2]
interfer_create(btn, ecms, param, kni, id, fs, item, TYPE_TH[1])
func interfer_create(btn, ecms, param, kni, id, dict, item, type_th):
var ispp: int = 0
var interfer_name: String = btn.get_meta('rfi_name')
if interfer_name == 'k1':
param['dur'] = 1.0 # Необходимо добавить параметры управления
param['period'] = 1.0 # Необходимо добавить параметры управления
var key = dict.find_key(id)
if key != null:
ispp = key
else:
if interfer_name == 'off':
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
push_id(ecm.ispp)
thrs.erase(ispp)
ecm.tick_tx = Time.get_ticks_msec()
return
ispp = pop_id()
if ispp == 0: return
dict[ispp] = id
msg_ss += 1
var ecm: Interfer
if ecms.has(ispp):
ecm = ecms[ispp]
else:
ecm = Interfer.new()
ecm.ispp = ispp
ecms[ispp] = ecm
ecm.svk = STATE_TSMT # Подготовка к передаче сообщения
ecm.ss = msg_ss
ecm.kni = kni
ecm.krp = interfer_name
ecm.params = param
ecm.powp = 100.0 # Необходимо добавить управление мощностью
ecm.type_th = type_th
signaller.emit_signal('interfer_new', ecm)
if interfer_name == 'off':
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
push_id(ecm.ispp)
thrs.erase(ispp)
ecm.tick_tx = Time.get_ticks_msec()
func send_ecm(ecm, unit):

View File

@@ -27,20 +27,29 @@ signal full_screen(id: int)
signal rto_threat_sel (th_id: int)
## Вызывается, когда пользователь нажимает на значёк цели
## [param th_id] - Отметка цели на экране
signal bip_pressed (th_id: int)
## Вызывается, когда пользователь снимает выделение с цели
## [param th_id] - Отметка цели на экране
signal rto_threat_unsel (th_id: int)
## Вызывается, когда пользователь снимает выделение со всех целей
signal rto_threat_unsel_all ()
## Вызывается, когда пользователь выбирает помеху
## [param btn] - Нажатая кнопка помехи.
signal interfer_init (btn: PanelContainer)
signal interfer_init (btn: PanelContainer, fs_arr: Array)
## Вызывается, когда выбраны цели для постановки помех
## [param btn] - Нажатая кнопка помехи.[br]
## [param sel_threats] - Cписок целей.
signal interfer_create (btn: PanelContainer, sel_threats: Array)
signal interfer_create (btn: PanelContainer, sel_threats: Array, fs_arr: Array)
## Вызывается, когда создалась новая помеха
@@ -63,6 +72,11 @@ signal interfer_off_all ()
signal interfer_selected (ecm: interfer.Interfer)
## Вызывается, когда отключается выбираем помеху по сектору в таблице
## [param ecm] - Выбранная помеха
signal fs_selected(ecm: interfer.Interfer)
## Вызывается при запросе изменения уровня детализации карты
## [param zoom] - Вновь установленный уровень детализации
signal zoom_changed(zoom: int)

View File

@@ -55,6 +55,7 @@ func _ready() -> void:
timer_check_lost.start(repsettings.ThreatParams.time_lost / 1000.0)
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(threats))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(threats))
signaller.connect('rto_threat_unsel_all', Callable(self, 'on_rto_threat_unsel_all').bind(threats))
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats))
signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats))
@@ -74,6 +75,12 @@ func on_timer_check_lost(time_lost: int, threats: Dictionary):
func on_rto_threat_unsel(th_id, threats): threats[th_id].selected = false
## Снимает выделение со всех целей
func on_rto_threat_unsel_all(threats):
for th in threats.values():
signaller.emit_signal('rto_threat_unsel', th.id)
## Выбирает цель, если нажать по отметке цели.
func on_rto_threat_sel(th_id, threats): on_threat_selected(threats[th_id], threats)
@@ -86,14 +93,13 @@ func on_threat_selected(th, threats):
## Формирует список выбранных целей для включения помехи
func on_interfer_init(btn, threats):
func on_interfer_init(btn, fs_arr, threats):
var sel_threats: Array = []
for threat in threats.values():
if threat.selected:
sel_threats.append(threat)
if len(sel_threats):
signaller.emit_signal('interfer_create', btn, sel_threats)
if len(sel_threats) or (len(fs_arr)):
signaller.emit_signal('interfer_create', btn, sel_threats, fs_arr)
## Производит приём целей

View File

@@ -41,6 +41,7 @@ const float ant_band_r1_4[] = {450.0, 530.0};
const float ant_band_r1_5[] = {500.0, 540.0};
const float ant_band_r1_6[] = {550.0, 550.0};
uniform vec3 ant_band_c[28];
const float d4 = 90.0;
const float ds = 1.0;
@@ -63,14 +64,26 @@ void sector(inout vec4 c, vec2 uv, vec2 center, float a, float da, float r0, flo
}
void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, vec4 c0, vec4 c1)
void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, inout int index)
{
float da = 180.0 / float(cnt);
for (int i = -cnt; i <= cnt; i ++)
{
vec4 col;
int j = index;
if (i == 2)
{
index--;
j = index - 3;
}
col.x = ant_band_c[j].x;
col.y = ant_band_c[j].y;
col.z = ant_band_c[j].z;
index++;
col.a = 0.5;
float v = float(i & 1);
vec4 col = v * c0 + (1.0f - v) * c1;
sector(c, uv, p0, float(i) * da, da, r0, r1, col);
vec4 color = v * col + (1.0f - v) * col;
sector(c, uv, p0, float(i) * da, da, r0, r1, color);
}
}
@@ -86,15 +99,15 @@ void fragment()
ivec2 isz = textureSize(TEXTURE, 0);
vec2 uv = UV * vec2(float(isz.x), float(isz.y)); // координаты текущей точки в пикселях
COLOR = vec4(0, 0, 0, 0); //texture(TEXTURE, UV); // Цвет текущей точки
int index = 0;
// Сетка антенн
antenas(COLOR, uv, pc0, ant_band_count_0, ant_band_r0_0[mode], ant_band_r1_0[mode], color1, color0);
antenas(COLOR, uv, pc0, ant_band_count_1, ant_band_r0_1[mode], ant_band_r1_1[mode], color0, color1);
antenas(COLOR, uv, pc0, ant_band_count_2, ant_band_r0_2[mode], ant_band_r1_2[mode], color1, color0);
antenas(COLOR, uv, pc0, ant_band_count_3, ant_band_r0_3[mode], ant_band_r1_3[mode], color0, color1);
antenas(COLOR, uv, pc0, ant_band_count_4, ant_band_r0_4[mode], ant_band_r1_4[mode], color1, color0);
antenas(COLOR, uv, pc0, ant_band_count_5, ant_band_r0_5[mode], ant_band_r1_5[mode], color0, color1);
antenas(COLOR, uv, pc0, ant_band_count_6, ant_band_r0_6[mode], ant_band_r1_6[mode], color1, color0);
antenas(COLOR, uv, pc0, ant_band_count_0, ant_band_r0_0[mode], ant_band_r1_0[mode], index);
antenas(COLOR, uv, pc0, ant_band_count_1, ant_band_r0_1[mode], ant_band_r1_1[mode], index);
antenas(COLOR, uv, pc0, ant_band_count_2, ant_band_r0_2[mode], ant_band_r1_2[mode], index);
antenas(COLOR, uv, pc0, ant_band_count_3, ant_band_r0_3[mode], ant_band_r1_3[mode], index);
antenas(COLOR, uv, pc0, ant_band_count_4, ant_band_r0_4[mode], ant_band_r1_4[mode], index);
antenas(COLOR, uv, pc0, ant_band_count_5, ant_band_r0_5[mode], ant_band_r1_5[mode], index);
antenas(COLOR, uv, pc0, ant_band_count_6, ant_band_r0_6[mode], ant_band_r1_6[mode], index);
}
"
@@ -108,3 +121,4 @@ shader_parameter/radius_inner_0 = 200.0
shader_parameter/radius_inner_1 = 480.0
shader_parameter/radius_outter = 550.0
shader_parameter/mode = 0
shader_parameter/ant_band_c = PackedVector3Array(0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5, 0.38, 0.47, 0.51, 0.39, 0.44, 0.5)