diff --git a/.gitignore b/.gitignore index ed81164..75dd351 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,9 @@ mono_crash.*.json /commit.gd .fuse_hidden* -/.godot/ /bin/ + +# Godot 4+ specific ignores +.godot/ + +addons/ diff --git a/Control.tscn b/Control.tscn index 4ec8511..e69de29 100644 --- a/Control.tscn +++ b/Control.tscn @@ -1,41 +0,0 @@ -[gd_scene load_steps=4 format=2] - -[ext_resource path="res://data/мп550-работа-эскиз.png" type="Texture" id=2] - -[sub_resource type="DynamicFont" id=2] - -[sub_resource type="Theme" id=3] -resource_local_to_scene = true -default_font = SubResource( 2 ) - -[node name="TabContainer" type="TabContainer"] -anchor_right = 1.0 -anchor_bottom = 1.0 -rect_pivot_offset = Vector2( 800, 600 ) -tab_align = 0 -__meta__ = { -"_edit_use_anchors_": true -} - -[node name="Работа" type="Panel" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 42.0 -margin_right = -4.0 -margin_bottom = -4.0 -theme = SubResource( 3 ) - -[node name="canvas" type="Sprite" parent="Работа"] -position = Vector2( 796, 576 ) -scale = Vector2( 1.00375, 0.973333 ) -texture = ExtResource( 2 ) - -[node name="Контроль" type="Panel" parent="."] -visible = false -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 42.0 -margin_right = -4.0 -margin_bottom = -4.0 diff --git a/build-godot-engine.sh b/build-godot-engine.sh new file mode 100644 index 0000000..823a131 --- /dev/null +++ b/build-godot-engine.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +scons target=template_release production=yes use_lto=yes -j4 diff --git a/data/1.png b/data/1.png new file mode 100644 index 0000000..6ce776d Binary files /dev/null and b/data/1.png differ diff --git a/data/1.png.import b/data/1.png.import new file mode 100644 index 0000000..d89025d --- /dev/null +++ b/data/1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tfju4shlxd7g" +path="res://.godot/imported/1.png-6bf9df3b5784be454cdcca02772345da.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/1.png" +dest_files=["res://.godot/imported/1.png-6bf9df3b5784be454cdcca02772345da.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/2.png b/data/2.png new file mode 100644 index 0000000..983bfa5 Binary files /dev/null and b/data/2.png differ diff --git a/data/2.png.import b/data/2.png.import new file mode 100644 index 0000000..0f647ae --- /dev/null +++ b/data/2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bhvo4qe45sof6" +path="res://.godot/imported/2.png-f832e620d4742cf09ec9ecd6c434c4e9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/2.png" +dest_files=["res://.godot/imported/2.png-f832e620d4742cf09ec9ecd6c434c4e9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/3.png b/data/3.png new file mode 100644 index 0000000..3361334 Binary files /dev/null and b/data/3.png differ diff --git a/data/3.png.import b/data/3.png.import new file mode 100644 index 0000000..a28c3bb --- /dev/null +++ b/data/3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://eixrw0k33lan" +path="res://.godot/imported/3.png-5f9d74ed62231a20808fccee76c16da0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/3.png" +dest_files=["res://.godot/imported/3.png-5f9d74ed62231a20808fccee76c16da0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/4.png b/data/4.png new file mode 100644 index 0000000..df6512a Binary files /dev/null and b/data/4.png differ diff --git a/data/4.png.import b/data/4.png.import new file mode 100644 index 0000000..096788a --- /dev/null +++ b/data/4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c52qoo3dp877e" +path="res://.godot/imported/4.png-9e346a031bdb09978e30a70d1475d319.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/4.png" +dest_files=["res://.godot/imported/4.png-9e346a031bdb09978e30a70d1475d319.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/5.png b/data/5.png new file mode 100644 index 0000000..411b966 Binary files /dev/null and b/data/5.png differ diff --git a/data/5.png.import b/data/5.png.import new file mode 100644 index 0000000..26588cb --- /dev/null +++ b/data/5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kx8tn03k5ips" +path="res://.godot/imported/5.png-194068b5d149fc934409204ece4aff3d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/5.png" +dest_files=["res://.godot/imported/5.png-194068b5d149fc934409204ece4aff3d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/6.png b/data/6.png new file mode 100644 index 0000000..aea9aa4 Binary files /dev/null and b/data/6.png differ diff --git a/data/6.png.import b/data/6.png.import new file mode 100644 index 0000000..b10c2d8 --- /dev/null +++ b/data/6.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cv2cj5ffmcked" +path="res://.godot/imported/6.png-f13a6aaec6641e7f5b1081ae76462908.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/6.png" +dest_files=["res://.godot/imported/6.png-f13a6aaec6641e7f5b1081ae76462908.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/7.png b/data/7.png new file mode 100644 index 0000000..09db293 Binary files /dev/null and b/data/7.png differ diff --git a/data/7.png.import b/data/7.png.import new file mode 100644 index 0000000..112a337 --- /dev/null +++ b/data/7.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6jjplsdvxmh2" +path="res://.godot/imported/7.png-baf7ed489583500d0eba1f5f609e9b35.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/7.png" +dest_files=["res://.godot/imported/7.png-baf7ed489583500d0eba1f5f609e9b35.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/DejaVuSans.ttf.import b/data/DejaVuSans.ttf.import new file mode 100644 index 0000000..3e412bc --- /dev/null +++ b/data/DejaVuSans.ttf.import @@ -0,0 +1,33 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://c6p8thias0vuy" +path="res://.godot/imported/DejaVuSans.ttf-b4085dde282b5d503d6a56e258b526b7.fontdata" + +[deps] + +source_file="res://data/DejaVuSans.ttf" +dest_files=["res://.godot/imported/DejaVuSans.ttf-b4085dde282b5d503d6a56e258b526b7.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=1 +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/data/DejaVuSansCondensed.ttf.import b/data/DejaVuSansCondensed.ttf.import new file mode 100644 index 0000000..42c3c52 --- /dev/null +++ b/data/DejaVuSansCondensed.ttf.import @@ -0,0 +1,33 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://c7hvei2ks7jp6" +path="res://.godot/imported/DejaVuSansCondensed.ttf-7a8251b7291db131ffa4eaba367ef066.fontdata" + +[deps] + +source_file="res://data/DejaVuSansCondensed.ttf" +dest_files=["res://.godot/imported/DejaVuSansCondensed.ttf-7a8251b7291db131ffa4eaba367ef066.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=1 +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/data/arrow-ninepatch-0.png b/data/arrow-ninepatch-0.png new file mode 100644 index 0000000..3a5b1ac Binary files /dev/null and b/data/arrow-ninepatch-0.png differ diff --git a/data/arrow-ninepatch-0.png.import b/data/arrow-ninepatch-0.png.import new file mode 100644 index 0000000..81a3371 --- /dev/null +++ b/data/arrow-ninepatch-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4erjbms6c1em" +path="res://.godot/imported/arrow-ninepatch-0.png-dfdc5d78f833b20c0b46412eab73b9fe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/arrow-ninepatch-0.png" +dest_files=["res://.godot/imported/arrow-ninepatch-0.png-dfdc5d78f833b20c0b46412eab73b9fe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/dji-mini-2.mkv.ogv b/data/dji-mini-2.mkv.ogv new file mode 100644 index 0000000..0dcc246 Binary files /dev/null and b/data/dji-mini-2.mkv.ogv differ diff --git a/data/free-drone-icon-58.png.import b/data/free-drone-icon-58.png.import index 2c0d261..ae48bb7 100644 --- a/data/free-drone-icon-58.png.import +++ b/data/free-drone-icon-58.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/free-drone-icon-58.png-5b694998d3a27f8f0eac6f506f299266.stex" +type="CompressedTexture2D" +uid="uid://buod8b700wu4h" +path="res://.godot/imported/free-drone-icon-58.png-5b694998d3a27f8f0eac6f506f299266.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/free-drone-icon-58.png" -dest_files=[ "res://.import/free-drone-icon-58.png-5b694998d3a27f8f0eac6f506f299266.stex" ] +dest_files=["res://.godot/imported/free-drone-icon-58.png-5b694998d3a27f8f0eac6f506f299266.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/icon.png.import b/data/icon.png.import index 4fdfd86..44e90e6 100644 --- a/data/icon.png.import +++ b/data/icon.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/icon.png-881386d1eb9605176a20d6b8bb875b0d.stex" +type="CompressedTexture2D" +uid="uid://5hegds324wsy" +path="res://.godot/imported/icon.png-881386d1eb9605176a20d6b8bb875b0d.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/icon.png" -dest_files=[ "res://.import/icon.png-881386d1eb9605176a20d6b8bb875b0d.stex" ] +dest_files=["res://.godot/imported/icon.png-881386d1eb9605176a20d6b8bb875b0d.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/main-font.tres b/data/main-font.tres index b68e8df..f75961c 100644 --- a/data/main-font.tres +++ b/data/main-font.tres @@ -1,11 +1,9 @@ -[gd_resource type="DynamicFont" load_steps=2 format=2] +[gd_resource type="FontFile" load_steps=2 format=2] -[ext_resource path="res://data/DejaVuSansCondensed.ttf" type="DynamicFontData" id=1] +[ext_resource path="res://data/DejaVuSansCondensed.ttf" type="FontFile" id=1] [resource] size = 20 -outline_size = 1 -outline_color = Color( 0, 0, 0, 1 ) use_mipmaps = true use_filter = true font_data = ExtResource( 1 ) diff --git a/data/ofont.ru_Franklin Gothic Book.ttf b/data/ofont.ru_Franklin Gothic Book.ttf new file mode 100644 index 0000000..21c4ecf Binary files /dev/null and b/data/ofont.ru_Franklin Gothic Book.ttf differ diff --git a/data/ofont.ru_Franklin Gothic Book.ttf.import b/data/ofont.ru_Franklin Gothic Book.ttf.import new file mode 100644 index 0000000..be3abc0 --- /dev/null +++ b/data/ofont.ru_Franklin Gothic Book.ttf.import @@ -0,0 +1,33 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://b8xqbrj2ontxe" +path="res://.godot/imported/ofont.ru_Franklin Gothic Book.ttf-52f1dac05bf20c0c7af86c6e9cfad8fc.fontdata" + +[deps] + +source_file="res://data/ofont.ru_Franklin Gothic Book.ttf" +dest_files=["res://.godot/imported/ofont.ru_Franklin Gothic Book.ttf-52f1dac05bf20c0c7af86c6e9cfad8fc.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=1 +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/data/secondary-font.tres b/data/secondary-font.tres new file mode 100644 index 0000000..5f7ba84 --- /dev/null +++ b/data/secondary-font.tres @@ -0,0 +1,93 @@ +[gd_resource type="FontFile" load_steps=2 format=3 uid="uid://cmrnd7ijyjwon"] + +[ext_resource type="FontFile" uid="uid://b8xqbrj2ontxe" path="res://data/ofont.ru_Franklin Gothic Book.ttf" id="1_cxid7"] + +[resource] +fallbacks = Array[Font]([ExtResource("1_cxid7")]) +face_index = null +embolden = null +transform = null +cache/0/17/0/ascent = 0.0 +cache/0/17/0/descent = 0.0 +cache/0/17/0/underline_position = 0.0 +cache/0/17/0/underline_thickness = 0.0 +cache/0/17/0/scale = 1.0 +cache/0/17/0/kerning_overrides/17/0 = Vector2(0, 0) +cache/0/17/0/kerning_overrides/16/0 = Vector2(0, 0) +cache/0/17/0/kerning_overrides/18/0 = Vector2(0, 0) +cache/0/17/0/kerning_overrides/14/0 = Vector2(0, 0) +cache/0/17/0/kerning_overrides/8/0 = Vector2(0, 0) +cache/0/17/0/kerning_overrides/15/0 = Vector2(0, 0) +cache/0/17/0/kerning_overrides/13/0 = Vector2(0, 0) +cache/0/16/0/ascent = 0.0 +cache/0/16/0/descent = 0.0 +cache/0/16/0/underline_position = 0.0 +cache/0/16/0/underline_thickness = 0.0 +cache/0/16/0/scale = 1.0 +cache/0/16/0/kerning_overrides/17/0 = Vector2(0, 0) +cache/0/16/0/kerning_overrides/16/0 = Vector2(0, 0) +cache/0/16/0/kerning_overrides/18/0 = Vector2(0, 0) +cache/0/16/0/kerning_overrides/14/0 = Vector2(0, 0) +cache/0/16/0/kerning_overrides/8/0 = Vector2(0, 0) +cache/0/16/0/kerning_overrides/15/0 = Vector2(0, 0) +cache/0/16/0/kerning_overrides/13/0 = Vector2(0, 0) +cache/0/18/0/ascent = 0.0 +cache/0/18/0/descent = 0.0 +cache/0/18/0/underline_position = 0.0 +cache/0/18/0/underline_thickness = 0.0 +cache/0/18/0/scale = 1.0 +cache/0/18/0/kerning_overrides/17/0 = Vector2(0, 0) +cache/0/18/0/kerning_overrides/16/0 = Vector2(0, 0) +cache/0/18/0/kerning_overrides/18/0 = Vector2(0, 0) +cache/0/18/0/kerning_overrides/14/0 = Vector2(0, 0) +cache/0/18/0/kerning_overrides/8/0 = Vector2(0, 0) +cache/0/18/0/kerning_overrides/15/0 = Vector2(0, 0) +cache/0/18/0/kerning_overrides/13/0 = Vector2(0, 0) +cache/0/14/0/ascent = 0.0 +cache/0/14/0/descent = 0.0 +cache/0/14/0/underline_position = 0.0 +cache/0/14/0/underline_thickness = 0.0 +cache/0/14/0/scale = 1.0 +cache/0/14/0/kerning_overrides/17/0 = Vector2(0, 0) +cache/0/14/0/kerning_overrides/16/0 = Vector2(0, 0) +cache/0/14/0/kerning_overrides/18/0 = Vector2(0, 0) +cache/0/14/0/kerning_overrides/14/0 = Vector2(0, 0) +cache/0/14/0/kerning_overrides/8/0 = Vector2(0, 0) +cache/0/14/0/kerning_overrides/15/0 = Vector2(0, 0) +cache/0/14/0/kerning_overrides/13/0 = Vector2(0, 0) +cache/0/8/0/ascent = 0.0 +cache/0/8/0/descent = 0.0 +cache/0/8/0/underline_position = 0.0 +cache/0/8/0/underline_thickness = 0.0 +cache/0/8/0/scale = 1.0 +cache/0/8/0/kerning_overrides/17/0 = Vector2(0, 0) +cache/0/8/0/kerning_overrides/16/0 = Vector2(0, 0) +cache/0/8/0/kerning_overrides/18/0 = Vector2(0, 0) +cache/0/8/0/kerning_overrides/14/0 = Vector2(0, 0) +cache/0/8/0/kerning_overrides/8/0 = Vector2(0, 0) +cache/0/8/0/kerning_overrides/15/0 = Vector2(0, 0) +cache/0/8/0/kerning_overrides/13/0 = Vector2(0, 0) +cache/0/15/0/ascent = 0.0 +cache/0/15/0/descent = 0.0 +cache/0/15/0/underline_position = 0.0 +cache/0/15/0/underline_thickness = 0.0 +cache/0/15/0/scale = 1.0 +cache/0/15/0/kerning_overrides/17/0 = Vector2(0, 0) +cache/0/15/0/kerning_overrides/16/0 = Vector2(0, 0) +cache/0/15/0/kerning_overrides/18/0 = Vector2(0, 0) +cache/0/15/0/kerning_overrides/14/0 = Vector2(0, 0) +cache/0/15/0/kerning_overrides/8/0 = Vector2(0, 0) +cache/0/15/0/kerning_overrides/15/0 = Vector2(0, 0) +cache/0/15/0/kerning_overrides/13/0 = Vector2(0, 0) +cache/0/13/0/ascent = 0.0 +cache/0/13/0/descent = 0.0 +cache/0/13/0/underline_position = 0.0 +cache/0/13/0/underline_thickness = 0.0 +cache/0/13/0/scale = 1.0 +cache/0/13/0/kerning_overrides/17/0 = Vector2(0, 0) +cache/0/13/0/kerning_overrides/16/0 = Vector2(0, 0) +cache/0/13/0/kerning_overrides/18/0 = Vector2(0, 0) +cache/0/13/0/kerning_overrides/14/0 = Vector2(0, 0) +cache/0/13/0/kerning_overrides/8/0 = Vector2(0, 0) +cache/0/13/0/kerning_overrides/15/0 = Vector2(0, 0) +cache/0/13/0/kerning_overrides/13/0 = Vector2(0, 0) diff --git a/data/Грани22.png b/data/Грани22.png index c0ab1da..b8a31c1 100644 Binary files a/data/Грани22.png and b/data/Грани22.png differ diff --git a/data/Грани22.png.import b/data/Грани22.png.import index 9549709..2724d75 100644 --- a/data/Грани22.png.import +++ b/data/Грани22.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/Грани22.png-493da837cf4c5e4bcc358b597e0bef6b.stex" +type="CompressedTexture2D" +uid="uid://b4isaggma6q3" +path="res://.godot/imported/Грани22.png-493da837cf4c5e4bcc358b597e0bef6b.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/Грани22.png" -dest_files=[ "res://.import/Грани22.png-493da837cf4c5e4bcc358b597e0bef6b.stex" ] +dest_files=["res://.godot/imported/Грани22.png-493da837cf4c5e4bcc358b597e0bef6b.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/Изделие МП-550.png b/data/Изделие МП-550.png index 01fe239..69caf08 100644 Binary files a/data/Изделие МП-550.png and b/data/Изделие МП-550.png differ diff --git a/data/Изделие МП-550.png.import b/data/Изделие МП-550.png.import index 60c3eea..f2eef54 100644 --- a/data/Изделие МП-550.png.import +++ b/data/Изделие МП-550.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/Изделие МП-550.png-aa08827e688aa0a8c85fe1ebf96c39ec.stex" +type="CompressedTexture2D" +uid="uid://62d43kud05ru" +path="res://.godot/imported/Изделие МП-550.png-aa08827e688aa0a8c85fe1ebf96c39ec.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/Изделие МП-550.png" -dest_files=[ "res://.import/Изделие МП-550.png-aa08827e688aa0a8c85fe1ebf96c39ec.stex" ] +dest_files=["res://.godot/imported/Изделие МП-550.png-aa08827e688aa0a8c85fe1ebf96c39ec.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/П16.png.import b/data/П16.png.import index 648a1fc..8d55f4d 100644 --- a/data/П16.png.import +++ b/data/П16.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/П16.png-bf31d24368470afda2405017885d019f.stex" +type="CompressedTexture2D" +uid="uid://dbok5t6buxb6q" +path="res://.godot/imported/П16.png-bf31d24368470afda2405017885d019f.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/П16.png" -dest_files=[ "res://.import/П16.png-bf31d24368470afda2405017885d019f.stex" ] +dest_files=["res://.godot/imported/П16.png-bf31d24368470afda2405017885d019f.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/ПРД.png b/data/ПРД.png index fd8d6b5..d3ee562 100644 Binary files a/data/ПРД.png and b/data/ПРД.png differ diff --git a/data/ПРД.png.import b/data/ПРД.png.import index 329bf5d..3bb89a3 100644 --- a/data/ПРД.png.import +++ b/data/ПРД.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/ПРД.png-0583ee2ff33bda5b96809f18eb4b6d3c.stex" +type="CompressedTexture2D" +uid="uid://bos68thpqqvn" +path="res://.godot/imported/ПРД.png-0583ee2ff33bda5b96809f18eb4b6d3c.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/ПРД.png" -dest_files=[ "res://.import/ПРД.png-0583ee2ff33bda5b96809f18eb4b6d3c.stex" ] +dest_files=["res://.godot/imported/ПРД.png-0583ee2ff33bda5b96809f18eb4b6d3c.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/СПТ.png b/data/СПТ.png index 44d0e1a..eb44414 100644 Binary files a/data/СПТ.png and b/data/СПТ.png differ diff --git a/data/СПТ.png.import b/data/СПТ.png.import index cecdc5f..22b96ca 100644 --- a/data/СПТ.png.import +++ b/data/СПТ.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/СПТ.png-8f936ad6e2c2488a3dc88469226a44c7.stex" +type="CompressedTexture2D" +uid="uid://dkqlvd750pplc" +path="res://.godot/imported/СПТ.png-8f936ad6e2c2488a3dc88469226a44c7.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/СПТ.png" -dest_files=[ "res://.import/СПТ.png-8f936ad6e2c2488a3dc88469226a44c7.stex" ] +dest_files=["res://.godot/imported/СПТ.png-8f936ad6e2c2488a3dc88469226a44c7.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/УФ.png b/data/УФ.png index 798d2b6..96afac6 100644 Binary files a/data/УФ.png and b/data/УФ.png differ diff --git a/data/УФ.png.import b/data/УФ.png.import index fc8d21f..e40f96a 100644 --- a/data/УФ.png.import +++ b/data/УФ.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/УФ.png-1921501d9e9f088f15714b06ceba80a7.stex" +type="CompressedTexture2D" +uid="uid://bar8k5qef7kch" +path="res://.godot/imported/УФ.png-1921501d9e9f088f15714b06ceba80a7.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/УФ.png" -dest_files=[ "res://.import/УФ.png-1921501d9e9f088f15714b06ceba80a7.stex" ] +dest_files=["res://.godot/imported/УФ.png-1921501d9e9f088f15714b06ceba80a7.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/Щ3.png b/data/Щ3.png index dd860db..2806d36 100644 Binary files a/data/Щ3.png and b/data/Щ3.png differ diff --git a/data/Щ3.png.import b/data/Щ3.png.import index 62021f1..3dbd717 100644 --- a/data/Щ3.png.import +++ b/data/Щ3.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/Щ3.png-0dddb7358beb598783af26f75da91b9a.stex" +type="CompressedTexture2D" +uid="uid://d2jxmtd6n5jd1" +path="res://.godot/imported/Щ3.png-0dddb7358beb598783af26f75da91b9a.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/Щ3.png" -dest_files=[ "res://.import/Щ3.png-0dddb7358beb598783af26f75da91b9a.stex" ] +dest_files=["res://.godot/imported/Щ3.png-0dddb7358beb598783af26f75da91b9a.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-квадрат-0.png b/data/кнопка-квадрат-0.png new file mode 100644 index 0000000..72b6a4c Binary files /dev/null and b/data/кнопка-квадрат-0.png differ diff --git a/data/кнопка-квадрат-0.png.import b/data/кнопка-квадрат-0.png.import new file mode 100644 index 0000000..4d4ef37 --- /dev/null +++ b/data/кнопка-квадрат-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ct0ajcwno03h7" +path="res://.godot/imported/кнопка-квадрат-0.png-c65fd339b861c421e0ef0290d2b279fa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-квадрат-0.png" +dest_files=["res://.godot/imported/кнопка-квадрат-0.png-c65fd339b861c421e0ef0290d2b279fa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-квадрат-1.png b/data/кнопка-квадрат-1.png new file mode 100644 index 0000000..38fa9ab Binary files /dev/null and b/data/кнопка-квадрат-1.png differ diff --git a/data/кнопка-квадрат-1.png.import b/data/кнопка-квадрат-1.png.import new file mode 100644 index 0000000..2fa36e9 --- /dev/null +++ b/data/кнопка-квадрат-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6p0ndxcng02k" +path="res://.godot/imported/кнопка-квадрат-1.png-3e8f354c4e789ff37e9c072bb90aa353.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-квадрат-1.png" +dest_files=["res://.godot/imported/кнопка-квадрат-1.png-3e8f354c4e789ff37e9c072bb90aa353.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-квадрат-стрелка-0.png b/data/кнопка-квадрат-стрелка-0.png new file mode 100644 index 0000000..f789991 Binary files /dev/null and b/data/кнопка-квадрат-стрелка-0.png differ diff --git a/data/кнопка-квадрат-стрелка-0.png.import b/data/кнопка-квадрат-стрелка-0.png.import new file mode 100644 index 0000000..60c39ac --- /dev/null +++ b/data/кнопка-квадрат-стрелка-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjrrbxsl0q04l" +path="res://.godot/imported/кнопка-квадрат-стрелка-0.png-f0214a1b3baef2f20594b400bf4c6830.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-квадрат-стрелка-0.png" +dest_files=["res://.godot/imported/кнопка-квадрат-стрелка-0.png-f0214a1b3baef2f20594b400bf4c6830.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-квадрат-стрелка-1.png b/data/кнопка-квадрат-стрелка-1.png new file mode 100644 index 0000000..9e5b7dc Binary files /dev/null and b/data/кнопка-квадрат-стрелка-1.png differ diff --git a/data/кнопка-квадрат-стрелка-1.png.import b/data/кнопка-квадрат-стрелка-1.png.import new file mode 100644 index 0000000..54e384b --- /dev/null +++ b/data/кнопка-квадрат-стрелка-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bumxa5h32s83r" +path="res://.godot/imported/кнопка-квадрат-стрелка-1.png-acf024e1c24193180358955700255901.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-квадрат-стрелка-1.png" +dest_files=["res://.godot/imported/кнопка-квадрат-стрелка-1.png-acf024e1c24193180358955700255901.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-тс-авиа-0.png b/data/кнопка-тс-авиа-0.png new file mode 100644 index 0000000..5390b84 Binary files /dev/null and b/data/кнопка-тс-авиа-0.png differ diff --git a/data/кнопка-тс-авиа-0.png.import b/data/кнопка-тс-авиа-0.png.import new file mode 100644 index 0000000..8156a71 --- /dev/null +++ b/data/кнопка-тс-авиа-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6j8n8tk4tlns" +path="res://.godot/imported/кнопка-тс-авиа-0.png-c29bcb7703fa5529c341ba411f1f99c1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-тс-авиа-0.png" +dest_files=["res://.godot/imported/кнопка-тс-авиа-0.png-c29bcb7703fa5529c341ba411f1f99c1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-тс-авиа-1.png b/data/кнопка-тс-авиа-1.png new file mode 100644 index 0000000..5560e10 Binary files /dev/null and b/data/кнопка-тс-авиа-1.png differ diff --git a/data/кнопка-тс-авиа-1.png.import b/data/кнопка-тс-авиа-1.png.import new file mode 100644 index 0000000..5239812 --- /dev/null +++ b/data/кнопка-тс-авиа-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crkkkr55en03i" +path="res://.godot/imported/кнопка-тс-авиа-1.png-b7301c6375ea2ca6f1cc0b3a279d72ee.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-тс-авиа-1.png" +dest_files=["res://.godot/imported/кнопка-тс-авиа-1.png-b7301c6375ea2ca6f1cc0b3a279d72ee.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-флаг-0-9патч.png b/data/кнопка-флаг-0-9патч.png new file mode 100644 index 0000000..8c086fe Binary files /dev/null and b/data/кнопка-флаг-0-9патч.png differ diff --git a/data/кнопка-флаг-0-9патч.png.import b/data/кнопка-флаг-0-9патч.png.import new file mode 100644 index 0000000..7af78ab --- /dev/null +++ b/data/кнопка-флаг-0-9патч.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dh31axwlodnxm" +path="res://.godot/imported/кнопка-флаг-0-9патч.png-eb58b5c0624d69e24db83dad6287debd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-флаг-0-9патч.png" +dest_files=["res://.godot/imported/кнопка-флаг-0-9патч.png-eb58b5c0624d69e24db83dad6287debd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кнопка-флаг-1-9патч.png b/data/кнопка-флаг-1-9патч.png new file mode 100644 index 0000000..8db800e Binary files /dev/null and b/data/кнопка-флаг-1-9патч.png differ diff --git a/data/кнопка-флаг-1-9патч.png.import b/data/кнопка-флаг-1-9патч.png.import new file mode 100644 index 0000000..658ac15 --- /dev/null +++ b/data/кнопка-флаг-1-9патч.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b567pxd14287x" +path="res://.godot/imported/кнопка-флаг-1-9патч.png-95726d30c512e2b68120eaafb1e464c1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-флаг-1-9патч.png" +dest_files=["res://.godot/imported/кнопка-флаг-1-9патч.png-95726d30c512e2b68120eaafb1e464c1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/кораблик-22800.png b/data/кораблик-22800.png new file mode 100644 index 0000000..887add7 Binary files /dev/null and b/data/кораблик-22800.png differ diff --git a/data/кораблик-22800.png.import b/data/кораблик-22800.png.import new file mode 100644 index 0000000..11afc35 --- /dev/null +++ b/data/кораблик-22800.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8ern67qnb5ky" +path="res://.godot/imported/кораблик-22800.png-c26a4147584330e7056042bc3924fb5c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кораблик-22800.png" +dest_files=["res://.godot/imported/кораблик-22800.png-c26a4147584330e7056042bc3924fb5c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/мп550-работа-эскиз.png b/data/мп550-работа-эскиз.png index 18e1fae..3b3cb10 100644 Binary files a/data/мп550-работа-эскиз.png and b/data/мп550-работа-эскиз.png differ diff --git a/data/мп550-работа-эскиз.png.import b/data/мп550-работа-эскиз.png.import index 477752b..f89954d 100644 --- a/data/мп550-работа-эскиз.png.import +++ b/data/мп550-работа-эскиз.png.import @@ -1,8 +1,9 @@ [remap] importer="texture" -type="StreamTexture" -path="res://.import/мп550-работа-эскиз.png-7af57230feae7557e482f8923843a550.stex" +type="CompressedTexture2D" +uid="uid://bq67yytxgoopq" +path="res://.godot/imported/мп550-работа-эскиз.png-7af57230feae7557e482f8923843a550.ctex" metadata={ "vram_texture": false } @@ -10,26 +11,24 @@ metadata={ [deps] source_file="res://data/мп550-работа-эскиз.png" -dest_files=[ "res://.import/мп550-работа-эскиз.png-7af57230feae7557e482f8923843a550.stex" ] +dest_files=["res://.godot/imported/мп550-работа-эскиз.png-7af57230feae7557e482f8923843a550.ctex"] [params] compress/mode=0 +compress/high_quality=false compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 +compress/hdr_compression=1 compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" process/fix_alpha_border=true process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false process/normal_map_invert_y=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/направление-0.png b/data/направление-0.png new file mode 100644 index 0000000..9eddab4 Binary files /dev/null and b/data/направление-0.png differ diff --git a/data/направление-0.png.import b/data/направление-0.png.import new file mode 100644 index 0000000..80266d2 --- /dev/null +++ b/data/направление-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmty3bpego2pi" +path="res://.godot/imported/направление-0.png-fc849e899c0233dae81bedbe745f6709.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/направление-0.png" +dest_files=["res://.godot/imported/направление-0.png-fc849e899c0233dae81bedbe745f6709.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/отметка-бпла.png b/data/отметка-бпла.png new file mode 100644 index 0000000..cbcdc38 Binary files /dev/null and b/data/отметка-бпла.png differ diff --git a/data/отметка-бпла.png.import b/data/отметка-бпла.png.import new file mode 100644 index 0000000..ed5095f --- /dev/null +++ b/data/отметка-бпла.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6qqcqds5majk" +path="res://.godot/imported/отметка-бпла.png-f427e9fbab3f5a420858348511c37ede.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/отметка-бпла.png" +dest_files=["res://.godot/imported/отметка-бпла.png-f427e9fbab3f5a420858348511c37ede.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/отметка-вертолёт.png b/data/отметка-вертолёт.png new file mode 100644 index 0000000..5dd0cdc Binary files /dev/null and b/data/отметка-вертолёт.png differ diff --git a/data/отметка-вертолёт.png.import b/data/отметка-вертолёт.png.import new file mode 100644 index 0000000..4dcd877 --- /dev/null +++ b/data/отметка-вертолёт.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5wb4r4ddy2ue" +path="res://.godot/imported/отметка-вертолёт.png-70c0f7134fea9f60a7f149d6211a93ea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/отметка-вертолёт.png" +dest_files=["res://.godot/imported/отметка-вертолёт.png-70c0f7134fea9f60a7f149d6211a93ea.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/отметка-корабль.png b/data/отметка-корабль.png new file mode 100644 index 0000000..07d1b2d Binary files /dev/null and b/data/отметка-корабль.png differ diff --git a/data/отметка-корабль.png.import b/data/отметка-корабль.png.import new file mode 100644 index 0000000..cf2b676 --- /dev/null +++ b/data/отметка-корабль.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bibsq2uejlm0s" +path="res://.godot/imported/отметка-корабль.png-788ae1d130d77af9647185f4b20df803.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/отметка-корабль.png" +dest_files=["res://.godot/imported/отметка-корабль.png-788ae1d130d77af9647185f4b20df803.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/отметка-неопред.png b/data/отметка-неопред.png new file mode 100644 index 0000000..433a8cc Binary files /dev/null and b/data/отметка-неопред.png differ diff --git a/data/отметка-неопред.png.import b/data/отметка-неопред.png.import new file mode 100644 index 0000000..c200dfd --- /dev/null +++ b/data/отметка-неопред.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3woliae871je" +path="res://.godot/imported/отметка-неопред.png-216ae0df3e301757f00f63073ee00230.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/отметка-неопред.png" +dest_files=["res://.godot/imported/отметка-неопред.png-216ae0df3e301757f00f63073ee00230.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/отметка-ракета.png b/data/отметка-ракета.png new file mode 100644 index 0000000..1bb2a6b Binary files /dev/null and b/data/отметка-ракета.png differ diff --git a/data/отметка-ракета.png.import b/data/отметка-ракета.png.import new file mode 100644 index 0000000..ffb8f59 --- /dev/null +++ b/data/отметка-ракета.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://biy3dmtuefrqe" +path="res://.godot/imported/отметка-ракета.png-799c981a194eafd7de9974d81716b4e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/отметка-ракета.png" +dest_files=["res://.godot/imported/отметка-ракета.png-799c981a194eafd7de9974d81716b4e0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/отметка-рто.png b/data/отметка-рто.png new file mode 100644 index 0000000..199b0fa Binary files /dev/null and b/data/отметка-рто.png differ diff --git a/data/отметка-рто.png.import b/data/отметка-рто.png.import new file mode 100644 index 0000000..2a2d0e0 --- /dev/null +++ b/data/отметка-рто.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b72pm17loed3t" +path="res://.godot/imported/отметка-рто.png-75f847d52b9baa2669fdab4ffaea153f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/отметка-рто.png" +dest_files=["res://.godot/imported/отметка-рто.png-75f847d52b9baa2669fdab4ffaea153f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/отметка-самолёт.png b/data/отметка-самолёт.png new file mode 100644 index 0000000..0358f99 Binary files /dev/null and b/data/отметка-самолёт.png differ diff --git a/data/отметка-самолёт.png.import b/data/отметка-самолёт.png.import new file mode 100644 index 0000000..2fd5cb6 --- /dev/null +++ b/data/отметка-самолёт.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://83m8t7nj4a60" +path="res://.godot/imported/отметка-самолёт.png-bb46afb23fe946fe2230cd3d30c66dca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/отметка-самолёт.png" +dest_files=["res://.godot/imported/отметка-самолёт.png-bb46afb23fe946fe2230cd3d30c66dca.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/прицел-сопровождение.png b/data/прицел-сопровождение.png new file mode 100644 index 0000000..7380b0f Binary files /dev/null and b/data/прицел-сопровождение.png differ diff --git a/data/прицел-сопровождение.png.import b/data/прицел-сопровождение.png.import new file mode 100644 index 0000000..13fd45a --- /dev/null +++ b/data/прицел-сопровождение.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccgavrtpkd56i" +path="res://.godot/imported/прицел-сопровождение.png-c9d19addfccd8f78fb08a176ca62316e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/прицел-сопровождение.png" +dest_files=["res://.godot/imported/прицел-сопровождение.png-c9d19addfccd8f78fb08a176ca62316e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/прицел-табличка.png b/data/прицел-табличка.png new file mode 100644 index 0000000..ecee16e Binary files /dev/null and b/data/прицел-табличка.png differ diff --git a/data/прицел-табличка.png.import b/data/прицел-табличка.png.import new file mode 100644 index 0000000..e637fdc --- /dev/null +++ b/data/прицел-табличка.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqu18m05sdl5w" +path="res://.godot/imported/прицел-табличка.png-45ba36412555fb1cbc42d6445071f6cd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/прицел-табличка.png" +dest_files=["res://.godot/imported/прицел-табличка.png-45ba36412555fb1cbc42d6445071f6cd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/рамка-панели.png b/data/рамка-панели.png new file mode 100644 index 0000000..69f4c14 Binary files /dev/null and b/data/рамка-панели.png differ diff --git a/data/рамка-панели.png.import b/data/рамка-панели.png.import new file mode 100644 index 0000000..a108984 --- /dev/null +++ b/data/рамка-панели.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cs6i1xwx0pmdk" +path="res://.godot/imported/рамка-панели.png-efb6e075afd66ec5ca5df8be21c3c59a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/рамка-панели.png" +dest_files=["res://.godot/imported/рамка-панели.png-efb6e075afd66ec5ca5df8be21c3c59a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/data/решётка-антенная-0.png b/data/решётка-антенная-0.png new file mode 100644 index 0000000..bc40712 Binary files /dev/null and b/data/решётка-антенная-0.png differ diff --git a/data/решётка-антенная-0.png.import b/data/решётка-антенная-0.png.import new file mode 100644 index 0000000..6b1f0c9 --- /dev/null +++ b/data/решётка-антенная-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crenptexlkub0" +path="res://.godot/imported/решётка-антенная-0.png-ed5c9e425cc5f08883f3e7ed022f01dd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/решётка-антенная-0.png" +dest_files=["res://.godot/imported/решётка-антенная-0.png-ed5c9e425cc5f08883f3e7ed022f01dd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/default_env.tres b/default_env.tres index 20207a4..11a5935 100644 --- a/default_env.tres +++ b/default_env.tres @@ -1,7 +1,7 @@ -[gd_resource type="Environment" load_steps=2 format=2] +[gd_resource type="Environment" load_steps=2 format=3 uid="uid://bxd3ftmqis2y1"] -[sub_resource type="ProceduralSky" id=1] +[sub_resource type="Sky" id="1"] [resource] background_mode = 2 -background_sky = SubResource( 1 ) +sky = SubResource("1") diff --git a/main.tscn b/main.tscn new file mode 100644 index 0000000..3ad2738 --- /dev/null +++ b/main.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://cu3e03by7d61j"] + +[ext_resource type="PackedScene" uid="uid://3slb0i3pvowc" path="res://scenes/tab_switch.tscn" id="1_uwy4p"] +[ext_resource type="PackedScene" uid="uid://w6ta0ck1bedl" path="res://scenes/wnd_stc.tscn" id="2_jab5i"] + +[node name="main" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 1600.0 +offset_bottom = 1200.0 + +[node name="tab_switch" parent="." instance=ExtResource("1_uwy4p")] +layout_mode = 0 +offset_top = 0.0 +offset_bottom = 1200.0 +all_tabs_in_front = true +metadata/_edit_lock_ = true + +[node name="wnd_stc" parent="." instance=ExtResource("2_jab5i")] +visible = false diff --git a/project.godot b/project.godot index 3b58133..41a4f91 100644 --- a/project.godot +++ b/project.godot @@ -6,34 +6,80 @@ ; [section] ; section goes between [] ; param=value ; assign values to parameters -config_version=4 +config_version=5 [application] config/name="uarep-ctl" -run/main_scene="res://Control.tscn" +run/main_scene="res://main.tscn" +config/features=PackedStringArray("4.1") +run/delta_smoothing=false +boot_splash/show_image=false +boot_splash/fullsize=false +boot_splash/use_filter=false config/icon="res://data/icon.png" +[autoload] + +Tools="*res://scenes/tools.gd" +REPSettings="*res://scenes/repsettings.gd" +REPNetwork="*res://scenes/repnetwork.gd" +yau07="*res://scenes/yau07.gd" +Log="*res://addons/godot-logger/scripts/logger.gd" +Table="*res://table/table.gd" +Bip="*res://scenes/bip.tscn" + +[debug] + +file_logging/enable_file_logging=true + [display] -window/size/width=1600 -window/size/height=1200 -window/size/fullscreen=true -window/size/test_width=1600 -window/size/test_height=1100 -window/vsync/use_vsync=false +window/size/viewport_width=1600 +window/size/viewport_height=1200 +window/size/mode=3 +window/subwindows/embed_subwindows=false window/stretch/mode="viewport" -window/stretch/aspect="keep" +window/vsync/vsync_mode=false + +[editor] + +version_control/autoload_on_startup=true + +[editor_plugins] + +enabled=PackedStringArray("res://addons/godot-logger/plugin.cfg") [gui] +common/text_edit_undo_stack_max_size=10 +theme/custom_font="res://data/secondary-font.tres" +theme/default_font_antialiasing=0 +theme/default_font_hinting=2 +theme/default_font_subpixel_positioning=0 +theme/lcd_subpixel_layout=0 common/drop_mouse_on_gui_input_disabled=true -theme/custom_font="res://data/main-font.tres" + +[input_devices] + +buffering/agile_event_flushing=true + +[logging] + +file_logging/enable_file_logging=true [physics] -common/enable_pause_aware_picking=true +2d/run_on_separate_thread=true +common/physics_ticks_per_second=1 +common/max_physics_steps_per_frame=1 +common/enable_object_picking=false [rendering] -environment/default_environment="res://default_env.tres" +gl_compatibility/item_buffer_size=8192 +shader_compiler/shader_cache/strip_debug=true +textures/default_filters/anisotropic_filtering_level=0 +anti_aliasing/screen_space_roughness_limiter/enabled=false +environment/defaults/default_environment="res://default_env.tres" +quality/driver/fallback_to_gles2=true diff --git a/scenes/Sector.tscn b/scenes/Sector.tscn new file mode 100644 index 0000000..6e7d6b9 --- /dev/null +++ b/scenes/Sector.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://c73ahpv8uiuc7"] + +[ext_resource type="Shader" path="res://shaders/sector.gdshader" id="1_aikdh"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_xo5or"] +resource_local_to_scene = true +shader = ExtResource("1_aikdh") +shader_parameter/color = Color(1, 1, 1, 0.168627) +shader_parameter/clip_color = Color(1, 0.5, 0.5, 1) +shader_parameter/width = 45.0 +shader_parameter/band = 0.02 +shader_parameter/radius = 0.08 +shader_parameter/dir = 0.0 +shader_parameter/inner_clip = 0.045 + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2lkm8"] + +[node name="строб" type="Sprite2D"] +material = SubResource("ShaderMaterial_xo5or") +position = Vector2(610, 600) +scale = Vector2(1108, 1108) +texture = SubResource("PlaceholderTexture2D_2lkm8") diff --git a/scenes/bip.tscn b/scenes/bip.tscn new file mode 100644 index 0000000..ec38fa0 --- /dev/null +++ b/scenes/bip.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=5 format=3 uid="uid://cfk41dnfbr0wx"] + +[ext_resource type="Shader" path="res://shaders/bip.gdshader" id="1_k6vue"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2dulj"] +shader = ExtResource("1_k6vue") +shader_parameter/color = Color(0.666667, 0.690196, 0.807843, 1) + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_tgf76"] + +[sub_resource type="GDScript" id="GDScript_4xy3s"] +script/source = "extends Sprite2D + +func set_bip_color(col: Color): material.set('shader_parameter/color', col) +func get_bip_color() -> Color: return material.get('shader_parameter/color') +" + +[node name="bip" type="Sprite2D"] +material = SubResource("ShaderMaterial_2dulj") +scale = Vector2(10, 10) +texture = SubResource("PlaceholderTexture2D_tgf76") +script = SubResource("GDScript_4xy3s") diff --git a/scenes/button_flat.tscn b/scenes/button_flat.tscn new file mode 100644 index 0000000..29f05f6 --- /dev/null +++ b/scenes/button_flat.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=9 format=3 uid="uid://da7w3vkhadfwe"] + +[ext_resource type="Script" path="res://scenes/nine-patch-button.gd" id="1_wpbps"] +[ext_resource type="Texture2D" uid="uid://ct0ajcwno03h7" path="res://data/кнопка-квадрат-0.png" id="2_1xr6o"] + +[sub_resource type="StyleBoxEmpty" id="1"] + +[sub_resource type="StyleBoxEmpty" id="6"] + +[sub_resource type="StyleBoxEmpty" id="2"] + +[sub_resource type="StyleBoxEmpty" id="3"] + +[sub_resource type="StyleBoxEmpty" id="5"] + +[sub_resource type="StyleBoxEmpty" id="4"] + +[node name="container" type="PanelContainer"] +offset_right = 30.0 +offset_bottom = 30.0 +theme_override_styles/panel = SubResource("1") +script = ExtResource("1_wpbps") +toggle_mode = true + +[node name="state" type="NinePatchRect" parent="."] +show_behind_parent = true +layout_mode = 2 +texture = ExtResource("2_1xr6o") +patch_margin_left = 10 +patch_margin_top = 10 +patch_margin_right = 10 +patch_margin_bottom = 10 +axis_stretch_horizontal = 1 +axis_stretch_vertical = 1 + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/normal = SubResource("6") +theme_override_styles/hover = SubResource("2") +theme_override_styles/pressed = SubResource("3") +theme_override_styles/disabled = SubResource("5") +theme_override_styles/focus = SubResource("4") +toggle_mode = true +clip_text = true + +[node name="label" type="Label" parent="."] +layout_mode = 2 + +[connection signal="toggled" from="button" to="." method="_on_button_toggled"] diff --git a/scenes/canvas.gd b/scenes/canvas.gd new file mode 100644 index 0000000..6ad2118 --- /dev/null +++ b/scenes/canvas.gd @@ -0,0 +1,18 @@ +extends Sprite2D + +func set_strob_visible(val: bool): $строб.visible = val +func set_strob_dir(val: float): $строб.material.set('shader_parameter/dir', val) +func set_strob_color(val: Color): $строб.material.set('shader_parameter/color', val) +func set_strob_width(val: float): $строб.material.set('shader_parameter/width', val) +func set_strob_band(val: float): $строб.material.set('shader_parameter/band', val / 125.0) +func set_strob_radius(val: float): $строб.material.set('shader_parameter/radius', sv(val)) +func set_strob_center(val: Vector2): $строб.position = val + +func get_strob_center() -> Vector2: return $строб.position +func get_strob_visible() -> bool: return $строб.visible +func get_strob_width() -> float: return $строб.material.get('shader_parameter/width') +func get_strob_band() -> float: return $строб.material.get('shader_parameter/band') * 125.0 +func get_strob_radius(val: float): return $строб.material.set('shader_parameter/radius', sv(val)) +func get_radius_max(): return $строб.scale.x / 2.0 + +func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125 diff --git a/scenes/canvas.tscn b/scenes/canvas.tscn new file mode 100644 index 0000000..ab82700 --- /dev/null +++ b/scenes/canvas.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=7 format=3 uid="uid://b5kjdyxuwsot5"] + +[ext_resource type="Material" uid="uid://s6xe8igevnv2" path="res://shaders/shader_edu.tres" id="1_uxbga"] +[ext_resource type="Script" path="res://scenes/canvas.gd" id="2_vkwmy"] +[ext_resource type="PackedScene" uid="uid://c73ahpv8uiuc7" path="res://scenes/Sector.tscn" id="3_uhdvc"] +[ext_resource type="Shader" path="res://shaders/sector.gdshader" id="4_gb4a1"] + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2bft1"] +size = Vector2(1600, 1200) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_hwrhs"] +resource_local_to_scene = true +shader = ExtResource("4_gb4a1") +shader_parameter/color = Color(1, 1, 1, 0.168627) +shader_parameter/clip_color = Color(1, 0.5, 0.5, 1) +shader_parameter/width = 45.0 +shader_parameter/band = 0.02 +shader_parameter/radius = 0.08 +shader_parameter/dir = 0.08 +shader_parameter/inner_clip = 0.045 + +[node name="canvas" type="Sprite2D"] +material = ExtResource("1_uxbga") +texture = SubResource("PlaceholderTexture2D_2bft1") +centered = false +script = ExtResource("2_vkwmy") + +[node name="строб" parent="." instance=ExtResource("3_uhdvc")] +material = SubResource("ShaderMaterial_hwrhs") +position = Vector2(560, 560) +scale = Vector2(1100, 1100) diff --git a/scenes/file_table.gd b/scenes/file_table.gd new file mode 100644 index 0000000..c6c2536 --- /dev/null +++ b/scenes/file_table.gd @@ -0,0 +1,38 @@ +extends Table + + +var FILES_EXCLUDE_NAMES = ['.', '..'] +var FILES_HEADERS_TEXT = ['Имя файла', 'Размер', 'Дата' ] +var FILES_COLUMN_WIDTHS = [ 400, 150, 250 ] +var FILES_HEADERS_ALIGNMENT = [ HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER ] +var FILES_ROWS_ALIGNMENT = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_RIGHT, HORIZONTAL_ALIGNMENT_CENTER ] + + +func fill_files_table(tbl: Table, folder: String, rows_types: Array): + var dir: = DirAccess.open(folder) + if dir == null: + return + var files: = [] + var exclude_names: = ['.', '..'] + dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547 + while true: + var file: = dir.get_next() + if file == '': + break + if file in exclude_names: + continue + var file_name = folder + '/' + file + var fd = FileAccess.open(file_name, FileAccess.READ) + if not fd: + continue + var glob_path = ProjectSettings.globalize_path(file_name) + var sz = fd.get_length() + var ut = fd.get_modified_time(file_name) + fd.close() + var mt = Time.get_datetime_dict_from_unix_time(ut) + var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]] + tbl.add_row(rows_types) + var i_row = tbl.get_rows_count() - 1 + tbl.set_row_text(i_row, file_row) + tbl.set_node_meta(0, i_row, 'file_path', glob_path) + dir.list_dir_end() diff --git a/scenes/frame.tscn b/scenes/frame.tscn new file mode 100644 index 0000000..0c12613 --- /dev/null +++ b/scenes/frame.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=3 format=3 uid="uid://bq7haw1ypiv48"] + +[ext_resource type="Texture2D" uid="uid://cs6i1xwx0pmdk" path="res://data/рамка-панели.png" id="1_o7lya"] +[ext_resource type="Script" path="res://scenes/рамка.gd" id="2_7mns1"] + +[node name="ramka" type="NinePatchRect"] +offset_right = 150.0 +offset_bottom = 100.0 +texture = ExtResource("1_o7lya") +patch_margin_left = 15 +patch_margin_top = 30 +patch_margin_right = 15 +patch_margin_bottom = 10 +script = ExtResource("2_7mns1") + +[node name="header" type="Label" parent="."] +clip_contents = true +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 22.0 +grow_horizontal = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "caption text" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/scenes/header.tscn b/scenes/header.tscn new file mode 100644 index 0000000..0762438 --- /dev/null +++ b/scenes/header.tscn @@ -0,0 +1,8 @@ +[gd_scene format=2] + +[node name="Label" type="Label"] +margin_right = 122.0 +margin_bottom = 34.0 +custom_colors/font_color = Color( 1, 0.596078, 0.4, 1 ) +valign = 1 +clip_text = true diff --git a/scenes/nine-patch-button.gd b/scenes/nine-patch-button.gd new file mode 100644 index 0000000..f810563 --- /dev/null +++ b/scenes/nine-patch-button.gd @@ -0,0 +1,51 @@ +@tool + +extends PanelContainer + + +@export var texture_state0: Texture2D = preload('res://data/кнопка-квадрат-0.png'): + set(val): $state.set_texture(val) + + +@export var texture_state1: Texture2D = preload('res://data/кнопка-квадрат-1.png'): + set(val): $state.set_texture(val) + + +@export var text: String = '': + set(val): $button.set_text(val) + get: return $button.get_text() + + +@export var pressed: bool = false: + set(val): $button.set_pressed(val) + get: return $button.is_pressed() + + +@export var toggle_mode: bool = false: + set(val): + if is_inside_tree(): + $button.set_toggle_mode(val) + get: return $button.is_toggle_mode() + + +func set_text (val: String): $button.set_text(val) +func set_pressed (val: bool): $button.set_pressed(val) + + +func set_toggle_mode (val: bool): + if is_inside_tree(): + $button.set_toggle_mode(val) + + +func get_text(): return $button.get_text() +func is_pressed(): return $button.is_pressed() +func is_toggle_mode(): return $button.is_toggle_mode() + + +func _on_button_toggled(val: bool): + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) + + +func button_connect(button_signal: String, proc: Callable): + $button.connect(button_signal, proc) diff --git a/scenes/pribor_afsp_l.tscn b/scenes/pribor_afsp_l.tscn new file mode 100644 index 0000000..4b8962c --- /dev/null +++ b/scenes/pribor_afsp_l.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://cpsbybk4r6t8d"] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +text = "Здесь будет схема прибора АФСП Левый" diff --git a/scenes/pribor_afsp_r.tscn b/scenes/pribor_afsp_r.tscn new file mode 100644 index 0000000..b3559ea --- /dev/null +++ b/scenes/pribor_afsp_r.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора АФСП Правый" diff --git a/scenes/pribor_afsp_sch3.tscn b/scenes/pribor_afsp_sch3.tscn new file mode 100644 index 0000000..4a16ab1 --- /dev/null +++ b/scenes/pribor_afsp_sch3.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора Щ3" diff --git a/scenes/pribor_prd_k_1.tscn b/scenes/pribor_prd_k_1.tscn new file mode 100644 index 0000000..7c8ec53 --- /dev/null +++ b/scenes/pribor_prd_k_1.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-К 1" diff --git a/scenes/pribor_prd_k_2.tscn b/scenes/pribor_prd_k_2.tscn new file mode 100644 index 0000000..825a950 --- /dev/null +++ b/scenes/pribor_prd_k_2.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-К 2" diff --git a/scenes/pribor_prd_k_3.tscn b/scenes/pribor_prd_k_3.tscn new file mode 100644 index 0000000..69566e1 --- /dev/null +++ b/scenes/pribor_prd_k_3.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-К 3" diff --git a/scenes/pribor_prd_k_4.tscn b/scenes/pribor_prd_k_4.tscn new file mode 100644 index 0000000..c9e3c4c --- /dev/null +++ b/scenes/pribor_prd_k_4.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-К 4" diff --git a/scenes/pribor_prd_n_1.tscn b/scenes/pribor_prd_n_1.tscn new file mode 100644 index 0000000..cc68167 --- /dev/null +++ b/scenes/pribor_prd_n_1.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-Н 1" diff --git a/scenes/pribor_prd_n_2.tscn b/scenes/pribor_prd_n_2.tscn new file mode 100644 index 0000000..4f8efdc --- /dev/null +++ b/scenes/pribor_prd_n_2.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-Н 2" diff --git a/scenes/pribor_prd_n_3.tscn b/scenes/pribor_prd_n_3.tscn new file mode 100644 index 0000000..157f5c9 --- /dev/null +++ b/scenes/pribor_prd_n_3.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-Н 3" diff --git a/scenes/pribor_prd_n_4.tscn b/scenes/pribor_prd_n_4.tscn new file mode 100644 index 0000000..3896f0a --- /dev/null +++ b/scenes/pribor_prd_n_4.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-Н 4" diff --git a/scenes/pribor_prd_v_1.tscn b/scenes/pribor_prd_v_1.tscn new file mode 100644 index 0000000..6f6c53b --- /dev/null +++ b/scenes/pribor_prd_v_1.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-В 1" diff --git a/scenes/pribor_prd_v_2.tscn b/scenes/pribor_prd_v_2.tscn new file mode 100644 index 0000000..50ec6b9 --- /dev/null +++ b/scenes/pribor_prd_v_2.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-В 2" diff --git a/scenes/pribor_prd_v_3.tscn b/scenes/pribor_prd_v_3.tscn new file mode 100644 index 0000000..54cf5a8 --- /dev/null +++ b/scenes/pribor_prd_v_3.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-В 3" diff --git a/scenes/pribor_prd_v_4.tscn b/scenes/pribor_prd_v_4.tscn new file mode 100644 index 0000000..6f6c53b --- /dev/null +++ b/scenes/pribor_prd_v_4.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора ПРД-В 1" diff --git a/scenes/pribor_rtr.tscn b/scenes/pribor_rtr.tscn new file mode 100644 index 0000000..368aea3 --- /dev/null +++ b/scenes/pribor_rtr.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора РТР" diff --git a/scenes/pribor_sch3.tscn b/scenes/pribor_sch3.tscn new file mode 100644 index 0000000..4a16ab1 --- /dev/null +++ b/scenes/pribor_sch3.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора Щ3" diff --git a/scenes/pribor_spt_l.tscn b/scenes/pribor_spt_l.tscn new file mode 100644 index 0000000..0c9066f --- /dev/null +++ b/scenes/pribor_spt_l.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора СПТ Левый" diff --git a/scenes/pribor_spt_r.tscn b/scenes/pribor_spt_r.tscn new file mode 100644 index 0000000..62c0337 --- /dev/null +++ b/scenes/pribor_spt_r.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора СПТ Правый" diff --git a/scenes/pribor_uf.tscn b/scenes/pribor_uf.tscn new file mode 100644 index 0000000..a00ecf8 --- /dev/null +++ b/scenes/pribor_uf.tscn @@ -0,0 +1,10 @@ +[gd_scene format=2] + +[node name="pribor_UF" type="Node2D"] + +[node name="test_label" type="Label" parent="."] +margin_left = 12.0 +margin_top = 8.0 +margin_right = 154.0 +margin_bottom = 22.0 +text = "Здесь будет схема прибора УФ" diff --git a/scenes/repnetwork.gd b/scenes/repnetwork.gd new file mode 100644 index 0000000..ab1ecb7 --- /dev/null +++ b/scenes/repnetwork.gd @@ -0,0 +1,36 @@ +extends Node + + +var sock: PacketPeerUDP +var units: Dictionary + + +func _ready() -> void: + var addr = REPSettings.addr['уареп-пульт'][1] + var port = REPSettings.addr['уареп-пульт'][2] + sock = PacketPeerUDP.new() + sock.bind(port, addr) + for key in REPSettings.addr: + var prof = REPSettings.addr[key] + if prof[0] == 'yau07': + addr = REPSettings.addr[key][1] + port = REPSettings.addr[key][2] + var unit = yau07.YaU07.new([addr, port]) + var addr_port: String = '%s:%d' % [addr, port] + units[addr_port] = unit + Log.info('ЯУ-07: %s' % unit) + + +func _process(delta: float) -> void: + for unit in units.values() as Array[yau07.YaU07]: + unit.process(delta, sock) + + while sock.get_available_packet_count() > 0: + var data = sock.get_packet() + var addr = sock.get_packet_ip() + var port = sock.get_packet_port() + var addr_port: String = '%s:%d' % [addr, port] + if addr_port in units: + var unit: yau07.YaU07 = units[addr_port] + unit.parse(data) + return diff --git a/scenes/repsettings.gd b/scenes/repsettings.gd new file mode 100644 index 0000000..fe1d208 --- /dev/null +++ b/scenes/repsettings.gd @@ -0,0 +1,18 @@ +extends Node + +@export var addr: Dictionary = { \ + 'уареп-пульт': ['udp', '10.1.1.160', 50160, 'IP-адрес ЯУ-07 прибора УФ'], + 'уареп-эмс': ['udp', '10.1.1.27', 50027, 'IP-адрес ЯУ-07 прибора УФ'], + 'уареп-яу07-2в': ['yau07', '10.1.1.34', 50034, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уареп-яу07-2н': ['yau07', '10.1.1.33', 50033, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уареп-яу07-2к': ['yau07', '10.1.1.35', 50035, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уареп-яу07-4в': ['yau07', '10.1.1.66', 50066, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уареп-яу07-4н': ['yau07', '10.1.1.65', 50065, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уареп-яу07-4к': ['yau07', '10.1.1.67', 50067, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уареп-яу07-1в': ['yau07', '10.1.1.18', 50018, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уареп-яу07-1н': ['yau07', '10.1.1.17', 50017, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уареп-яу07-1к': ['yau07', '10.1.1.19', 50019, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уареп-яу07-3в': ['yau07', '10.1.1.50', 50050, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уареп-яу07-3н': ['yau07', '10.1.1.49', 50049, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уареп-яу07-3к': ['yau07', '10.1.1.51', 50051, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уареп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 10, 'Прибор Щ3 (скорость, стартовых, стоповых, чётность, таймаут)'] } diff --git a/scenes/tab_switch.tscn b/scenes/tab_switch.tscn new file mode 100644 index 0000000..02dad40 --- /dev/null +++ b/scenes/tab_switch.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=3 uid="uid://3slb0i3pvowc"] + +[ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="1_uow82"] +[ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="2_83m7a"] +[ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="3_hgnup"] + +[node name="tab_switch" type="TabContainer"] +offset_top = -25.0 +offset_right = 1600.0 +offset_bottom = 1175.0 + +[node name="работа" parent="." instance=ExtResource("1_uow82")] +layout_mode = 2 + +[node name="контроль" parent="." instance=ExtResource("2_83m7a")] +visible = false +layout_mode = 2 + +[node name="журнал" parent="." instance=ExtResource("3_hgnup")] +visible = false +layout_mode = 2 diff --git a/scenes/threats.gd b/scenes/threats.gd new file mode 100644 index 0000000..b0c3873 --- /dev/null +++ b/scenes/threats.gd @@ -0,0 +1,27 @@ +extends Node + + +class Threat: + + enum FFlags { # Допустимые значения для Threat.fflags + NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4, + SLON = 8, SLAT = 16, SALT = 32, LAT = 64, + LON = 128, ALT = 256 } + + var id: int # Идентификатор цели + var aoa: float # Курсовой угол на источник сигнала, градусы. + var freq: float # Частота несущей или центральная частота, МГц + var width: float # Ширина занимаемого диапазона частот, МГц + var pow: float # Уровень принимаемого сигнала, дБм + var tick: int # Уровень принимаемого сигнала, дБм + var freqm: String # Режим смены частоты + var tmod: String # Тип модуляции + var baud: float # Модуляционная скорость + var proto: String # Тип протокола источника сигнала + var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags + var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags + var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags + var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags + var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags + var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags + var fflags: FFlags # Флаги полей достоверности полей diff --git a/scenes/tools.gd b/scenes/tools.gd new file mode 100644 index 0000000..bf9720a --- /dev/null +++ b/scenes/tools.gd @@ -0,0 +1,60 @@ +extends Node + + +func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: + """ Преобразует декартовые координаты в полярные """ + var x1: float = pos.x - pos0.x + var y1: float = pos.y - pos0.y + var ang: float = (atan2(y1, x1) * 180.0) / PI + ang += 360.0 * float(ang < 0.0) + var radius: float = hypot(x1, y1) + return Vector2(ang, radius) + + +func hypot(x: float, y: float) -> float: + return sqrt(x * x + y * y) + + +func is_overlap(x1, x2, y1, y2): + """ Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """ + return max(x1, y1) <= min(x2, y2) + + +func ibytes_to_word(buf: PackedByteArray, i: int) -> int: + return buf[i] + (buf[i + 1] * 256) + + +func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float: + """ Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """ + return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 + + +func type_is_num(val) -> bool: + """ Возвращает true, если val число, false - если иначе """ + return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) + + +func sort_ascending_0(a, b) -> bool: + return a[0] < b[0] + + +func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool: + var j: int = len(p) - 1 + var odd_nodes: int = 0 + for i in range(len(p)): + if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)): + odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x)) + j = i + return odd_nodes > 0 + + +func set_wordi(buf: Array, index, val): + """ + Устанавливает слово в байтовом массиве + :param buf: Байтовый массив + :param index: Индекс младшего байта слова в массиве + :param val: Значение слова для записи в батовый массив + :return: None """ + buf[index] = val & 0xff + buf[index + 1] = (val >> 8) & 0xff + diff --git a/scenes/wnd_stc.tscn b/scenes/wnd_stc.tscn new file mode 100644 index 0000000..f32cc3d --- /dev/null +++ b/scenes/wnd_stc.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=3 uid="uid://w6ta0ck1bedl"] + +[ext_resource type="PackedScene" uid="uid://cbfp6bylx8g4i" path="res://tab_container_stc.tscn" id="1_ty26o"] + +[node name="wnd_stc" type="Window"] +sdf_oversize = 0 +initial_position = 3 +size = Vector2i(1600, 1200) +mode = 3 +current_screen = 1 + +[node name="TabContainer" parent="." instance=ExtResource("1_ty26o")] diff --git a/scenes/yau07.gd b/scenes/yau07.gd new file mode 100644 index 0000000..4ca571b --- /dev/null +++ b/scenes/yau07.gd @@ -0,0 +1,199 @@ +extends Node + +const ONLINE_TIMEOUT = 5.0 # Время ожидания пакета от ячейки, секунды +const RESEND_TIMEOUT = 0.3 # Задержка для повторной отправки команды, секунды +const RETRY_COUNT = 5 # Количество повторных отправок +const DEFAULT_ADDR = ['localhost', 50000] +const BUFFER_SIZE = 2048 + +# Ячейка ЯУ-07 +class YaU07: + + enum CmdCode { + READ_ISA = 0, # Код команды "читать порт ISA" ячейки ЯУ-07 + WRITE_ISA = 1 } # Код команды "записать порт ISA" ячейки ЯУ-07 + + enum CmdState { + UNCK, # Номер команды не ининцирован + SEND, # Буфер готов для отправки + WAIT, # Ожидание выполнения + DONE, # Команда выполнена + FAIL } # Команда не выполнена + + signal online_changed(yau07: YaU07) + signal command_done(yau07: YaU07) + signal command_fail(yau07: YaU07) + + var src_addr: = DEFAULT_ADDR # Адрес источника + var cmd_num_rx: = 0 # Номер команды принятый + var cmd_num_tx: = 0 # Номер команды переданный + var cmd_state = CmdState.UNCK # Состояние выполнения команды + var cmd_result: = 1 # Результат выполнения команды. Устанавливается в ЯУ-07 + var cmd_data: = PackedByteArray() # Данные команды. Устанавливается в ЯУ-07 + var cmd_code = null # Код команды + var cmd_retry = 0 + var tick = 0.0 + var cmd_tick_tx = 0.0 + var cmd_tick_rx = 0.0 + var status: = PackedByteArray() # Поле "состояние прибора" + var tx_data: = [] # Буфер отправленный + var tx_len = 0 + var isa_ports = {} # Результат выполнения команды "читать порт" + var online = false + + func _to_string() -> String: + return '%s %s:%d cmd_num:%d' % [['отключен', 'на связи'][int(online)], src_addr[0], src_addr[1], cmd_num_rx] + + + func _init(addr: Array): + src_addr = addr + tx_data.resize(BUFFER_SIZE) + tx_data.fill(0) + + + func process(delta: float, sock: PacketPeerUDP): + tick += delta + if cmd_state == CmdState.SEND: + sock.set_dest_address(src_addr[0], src_addr[1]) + if sock.put_packet(tx_data.slice(0, tx_len)) == OK: + cmd_tick_tx = tick + cmd_state = CmdState.WAIT + cmd_retry = RETRY_COUNT + elif cmd_state == CmdState.WAIT: + if cmd_retry: + if (tick - cmd_tick_tx) > RESEND_TIMEOUT: + sock.set_dest_address(src_addr[0], src_addr[1]) + if sock.put_packet(tx_data.slice(0, tx_len)) == OK: + cmd_tick_tx = tick + else: + print_debug('ошибка: пакет не отправлен на: ', src_addr) + cmd_retry -= 1 + else: + cmd_state = CmdState.FAIL + emit_signal('command_fail', self) + if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT): + online = false + emit_signal('online_changed', self) + + + func send_isa(cmd_code: int, ports_data: Array) -> bool: + if (cmd_state == CmdState.WAIT) or (cmd_state == CmdState.SEND): + return false + if not ((cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA)): + return false + if cmd_state == CmdState.UNCK: + return false + + cmd_num_tx = (cmd_num_rx + 1) % 0xffff + + var ports_count = ports_data.size() + tx_len = ports_count * 2 + 8 + Tools.set_wordi(tx_data, 2, cmd_num_tx) + + if cmd_code == CmdCode.WRITE_ISA: + ports_count /= 2 + tx_data[6] = cmd_code + tx_data[7] = ports_count + + var i: = 0 + for word in ports_data: + Tools.set_wordi(tx_data, 8 + i, word) + i += 2 + cmd_state = CmdState.SEND + return true + + + func get_cmd_code(rx_data): + """ Возвращает код команды ЯУ-07 + :param rx_data: Принятые данные + :return: None - Код команды не найден, 0...255 - код команды """ + + var rx_data_len = rx_data.size() + if rx_data_len < 7: + return null + var status_len = Tools.ibytes_to_word(rx_data, 6) # Длина массива байтового "состояние прибора" + if rx_data_len <= (status_len + 6): # Нет поля "ответ на команду", разбор пакета завершить + return null + var cmd_code_pos = status_len + 8 # Положение в приёмном буфере "кода команды" + if rx_data_len <= cmd_code_pos: + return null + return rx_data[cmd_code_pos] # "код команды" + + + func parse_isa(rx_data, status_len) -> bool: + var ports_count_pos = status_len + 10 # Положение в приёмном буфере количества портов + if rx_data.size() < ports_count_pos: + return false + var ports_count = rx_data[ports_count_pos] # Количество портов + var counted_len = status_len + (ports_count * 4) + 11 # Вычисленная длина пакета + if rx_data.size() < counted_len: + return false + var addr_pos = status_len + 11 # Смещение положения адреса в приёмном буфере + var data_pos = status_len + 13 # Смещение положения данных в приёмном буфере + var i: = 0 + while i < ports_count: + var shift: = i * 4 + var isa_addr = Tools.ibytes_to_word(rx_data, addr_pos + shift) # Адрес порта ISA яу-07 + var isa_data = Tools.ibytes_to_word(rx_data, data_pos + shift) # Данные порта ISA яу-07 + isa_ports[isa_addr] = isa_data + i += 1 + cmd_data = rx_data.subarray(addr_pos, (addr_pos + ports_count * 4) - 1) + return i > 0 + + + func parse(rx_data: PackedByteArray) -> bool: + """ + Заполняет состояние прибора данными прочитанными из портов ЯУ-07 + для команд "читать порты" или "записать порты" + :param rx_data: Принятые данные + :return: True - Данные обработаны успешно, + False - Данные не обработаны из за ошибки """ + + if not online: + online = true + emit_signal('online_changed', self) + + var rx_data_len = rx_data.size() + if rx_data_len < 11: + return false + + cmd_num_rx = Tools.ibytes_to_word(rx_data, 2) + if cmd_state == CmdState.UNCK: + cmd_state = CmdState.DONE + + var status_len = Tools.ibytes_to_word(rx_data, 6) # Длина массива байтового "состояние прибора" + if rx_data_len < (status_len + 6): + return false + var i: = 0 + var len_rx_data = rx_data.size() + status.resize(status_len) + while i < status_len: + var byte_i = i + 8 + if byte_i < len_rx_data: + status[i] = rx_data[byte_i] # Массив байтовый "состояние прибора" + i += 1 + + if rx_data_len == (status_len + 6): + cmd_code = null + return true # Нет поля "ответ на команду", разбор пакета завершить + + var cmd_code_pos = status_len + 8 # Положение в приёмном буфере "код команды" + if rx_data_len <= cmd_code_pos: + return false + cmd_code = rx_data[cmd_code_pos] # "код команды" + + var cmd_status_pos = status_len + 9 # Положение в приёмном буфере "состояния выполнения команды" + if rx_data_len <= cmd_status_pos: + return false + cmd_result = rx_data[cmd_status_pos] + if cmd_result != 1: # Команда не выполнена + return false + + if (cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA): + parse_isa(rx_data, status_len) + + if (cmd_state == CmdState.WAIT) and (cmd_num_rx == cmd_num_tx): + cmd_state = CmdState.DONE + emit_signal('command_done', self) + + return true diff --git a/scenes/журнал.gd b/scenes/журнал.gd new file mode 100644 index 0000000..d6cb83d --- /dev/null +++ b/scenes/журнал.gd @@ -0,0 +1,20 @@ +extends Control + + +func _on_clear_button_down() -> void: + $content.clear() + Log.info('содержание журнала очищено оператором') + + +func _on_btn_save_button_down() -> void: + $content.hide() + $btn_clear.hide() + $btn_save.hide() + $dlg_file.show() + + +func _on_dlg_file_confirmed() -> void: + $content.show() + $btn_clear.show() + $btn_save.show() + $dlg_file.hide() diff --git a/scenes/журнал.tscn b/scenes/журнал.tscn new file mode 100644 index 0000000..cfd4ac8 --- /dev/null +++ b/scenes/журнал.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=3 format=3 uid="uid://trt0q8th3bn2"] + +[ext_resource type="Script" path="res://scenes/журнал.gd" id="1_3f1mv"] +[ext_resource type="Script" path="res://addons/godot-logger/scripts/logger_output.gd" id="1_t5g4h"] + +[node name="журнал" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_3f1mv") + +[node name="content" type="RichTextLabel" parent="."] +layout_mode = 0 +offset_left = 16.0 +offset_top = 57.0 +offset_right = 1584.0 +offset_bottom = 999.0 +focus_mode = 2 +threaded = true +selection_enabled = true +deselect_on_focus_loss_enabled = false +script = ExtResource("1_t5g4h") + +[node name="btn_save" type="Button" parent="."] +layout_mode = 0 +offset_left = 1344.0 +offset_top = 1044.0 +offset_right = 1440.0 +offset_bottom = 1080.0 +text = "Сохранить" + +[node name="btn_clear" type="Button" parent="."] +layout_mode = 0 +offset_left = 1200.0 +offset_top = 1044.0 +offset_right = 1296.0 +offset_bottom = 1080.0 +text = "Очистить" + +[node name="dlg_file" type="FileDialog" parent="."] +gui_embed_subwindows = true +title = "Сохранить журнал работы в файл" +initial_position = 2 +size = Vector2i(900, 900) +borderless = true +ok_button_text = "Да" +cancel_button_text = "Отмена" + +[connection signal="button_down" from="btn_save" to="." method="_on_btn_save_button_down"] +[connection signal="button_down" from="btn_clear" to="." method="_on_clear_button_down" flags=3] +[connection signal="canceled" from="dlg_file" to="." method="_on_dlg_file_confirmed"] +[connection signal="confirmed" from="dlg_file" to="." method="_on_dlg_file_confirmed"] diff --git a/scenes/контроль.gd b/scenes/контроль.gd new file mode 100644 index 0000000..776bcb1 --- /dev/null +++ b/scenes/контроль.gd @@ -0,0 +1,42 @@ +extends Panel + +const PRIBORS_RES = \ + [['pribor_uf', 'res://scenes/pribor_uf.tscn'], + ['pribor_rtr', 'res://scenes/pribor_rtr.tscn'], + ['pribor_afsp_l', 'res://scenes/pribor_afsp_l.tscn'], + ['pribor_afsp_r', 'res://scenes/pribor_afsp_r.tscn'], + ['pribor_sch3', 'res://scenes/pribor_sch3.tscn'], + ['pribor_spt_l', 'res://scenes/pribor_spt_l.tscn'], + ['pribor_spt_r', 'res://scenes/pribor_spt_r.tscn'], + ['pribor_prd_v_1', 'res://scenes/pribor_prd_v_1.tscn'], + ['pribor_prd_n_1', 'res://scenes/pribor_prd_n_1.tscn'], + ['pribor_prd_k_1', 'res://scenes/pribor_prd_k_1.tscn'], + ['pribor_prd_v_2', 'res://scenes/pribor_prd_v_2.tscn'], + ['pribor_prd_n_2', 'res://scenes/pribor_prd_n_2.tscn'], + ['pribor_prd_k_2', 'res://scenes/pribor_prd_k_2.tscn'], + ['pribor_prd_v_3', 'res://scenes/pribor_prd_v_3.tscn'], + ['pribor_prd_n_3', 'res://scenes/pribor_prd_n_3.tscn'], + ['pribor_prd_k_3', 'res://scenes/pribor_prd_k_3.tscn'], + ['pribor_prd_v_4', 'res://scenes/pribor_prd_v_4.tscn'], + ['pribor_prd_n_4', 'res://scenes/pribor_prd_n_4.tscn'], + ['pribor_prd_k_4', 'res://scenes/pribor_prd_k_4.tscn']] + + +func _ready(): + for item in PRIBORS_RES: + var pribor_node = get_node(item[0]) + var pribor_sch_path = item[1] + pribor_node.connect('button_up', Callable(self, 'on_pribor_press').bind(pribor_sch_path)) + + +func on_pribor_press(pribor_sch_path): + clear_obj($pribor_sch) + var pribor_sch = load(pribor_sch_path).instantiate() + $pribor_sch.add_child(pribor_sch) + + +func clear_obj(obj: Object): + var items = obj.get_children() + for item in items: + obj.remove_child(item) + item.free() diff --git a/scenes/контроль.tscn b/scenes/контроль.tscn new file mode 100644 index 0000000..629fa1a --- /dev/null +++ b/scenes/контроль.tscn @@ -0,0 +1,237 @@ +[gd_scene load_steps=7 format=3 uid="uid://lwmw4egynmd1"] + +[ext_resource type="Script" path="res://scenes/контроль.gd" id="1_i5eo5"] +[ext_resource type="Texture2D" uid="uid://bar8k5qef7kch" path="res://data/УФ.png" id="2_drana"] +[ext_resource type="Texture2D" uid="uid://dkqlvd750pplc" path="res://data/СПТ.png" id="3_v54hc"] +[ext_resource type="Texture2D" uid="uid://b4isaggma6q3" path="res://data/Грани22.png" id="4_kwlmx"] +[ext_resource type="Texture2D" uid="uid://d2jxmtd6n5jd1" path="res://data/Щ3.png" id="5_8abdt"] +[ext_resource type="Texture2D" uid="uid://bos68thpqqvn" path="res://data/ПРД.png" id="6_sgnkf"] + +[node name="Контроль" type="Panel"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_i5eo5") +metadata/_edit_lock_ = true + +[node name="pribor_uf" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1110.0 +offset_top = 477.0 +offset_right = 1191.0 +offset_bottom = 657.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("2_drana") +stretch_mode = 4 + +[node name="pribor_rtr" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1105.0 +offset_top = 205.0 +offset_right = 1198.0 +offset_bottom = 361.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("3_v54hc") +stretch_mode = 4 + +[node name="pribor_afsp_l" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 910.0 +offset_top = 220.0 +offset_right = 1743.0 +offset_bottom = 860.0 +scale = Vector2(0.2, 0.2) +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("4_kwlmx") +stretch_mode = 4 + +[node name="pribor_afsp_r" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1240.0 +offset_top = 225.0 +offset_right = 2073.0 +offset_bottom = 865.0 +scale = Vector2(0.2, 0.2) +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("4_kwlmx") +stretch_mode = 4 + +[node name="pribor_sch3" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1115.0 +offset_top = 765.0 +offset_right = 1208.0 +offset_bottom = 951.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("5_8abdt") +stretch_mode = 4 + +[node name="pribor_spt_l" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 960.0 +offset_top = 795.0 +offset_right = 1053.0 +offset_bottom = 951.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("3_v54hc") +stretch_mode = 4 + +[node name="pribor_spt_r" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1260.0 +offset_top = 795.0 +offset_right = 1353.0 +offset_bottom = 951.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("3_v54hc") +stretch_mode = 4 + +[node name="pribor_prd_v_2" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 795.0 +offset_top = 261.0 +offset_right = 872.0 +offset_bottom = 377.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 + +[node name="pribor_prd_n_2" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 750.0 +offset_top = 437.0 +offset_right = 827.0 +offset_bottom = 553.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 + +[node name="pribor_prd_k_2" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 875.0 +offset_top = 439.0 +offset_right = 952.0 +offset_bottom = 555.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 + +[node name="pribor_prd_v_3" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1417.0 +offset_top = 780.0 +offset_right = 1494.0 +offset_bottom = 896.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 +flip_h = true + +[node name="pribor_prd_n_3" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1340.0 +offset_top = 605.0 +offset_right = 1417.0 +offset_bottom = 721.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 +flip_h = true + +[node name="pribor_prd_k_3" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1460.0 +offset_top = 605.0 +offset_right = 1537.0 +offset_bottom = 721.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 +flip_h = true + +[node name="pribor_prd_v_1" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1445.0 +offset_top = 275.0 +offset_right = 1522.0 +offset_bottom = 391.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 +flip_h = true + +[node name="pribor_prd_n_1" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1335.0 +offset_top = 437.0 +offset_right = 1412.0 +offset_bottom = 553.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 +flip_h = true + +[node name="pribor_prd_k_1" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 1460.0 +offset_top = 446.0 +offset_right = 1537.0 +offset_bottom = 562.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 +flip_h = true + +[node name="pribor_prd_v_4" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 805.0 +offset_top = 780.0 +offset_right = 882.0 +offset_bottom = 896.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 + +[node name="pribor_prd_n_4" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 750.0 +offset_top = 607.0 +offset_right = 827.0 +offset_bottom = 723.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 + +[node name="pribor_prd_k_4" type="TextureButton" parent="."] +layout_mode = 0 +offset_left = 885.0 +offset_top = 607.0 +offset_right = 962.0 +offset_bottom = 723.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture_normal = ExtResource("6_sgnkf") +stretch_mode = 4 + +[node name="pribor_sch" type="Panel" parent="."] +layout_mode = 0 diff --git a/scenes/работа.gd b/scenes/работа.gd new file mode 100644 index 0000000..844ab94 --- /dev/null +++ b/scenes/работа.gd @@ -0,0 +1,164 @@ +extends Panel + +@export var col_red: Color +@export var col_grey: Color +@export var strob_min_width: float +@export var strob_max_width: float +@export var strob_min_band: float +@export var strob_max_band: float +@export var drag_scale_width: float +@export var drag_scale_band: float +@export var window_0_id: int +@export var window_1_id: int + +signal add_imit_threat (signal_name: String) +signal del_imit_threat (signal_name: String) + +enum DRAG_FSM { IDLE, DRAG, OFF } +""" Состояние перетаскивания """ + +var drag_pos_begin: Vector2 +""" Точка начала перетаскивания """ + +var drag_fsm: DRAG_FSM = DRAG_FSM.IDLE +""" Текущее состояние перетаскивания """ + +var drag_button: MouseButton +""" Кнопка мыши нажатая при перетаскивании """ + +var strob_width_begin: float +""" Ширина строба по углу в момент начала перетаскивания """ + +var strob_dir_begin: float +""" Направление антенны в момент начала перетаскивания """ + +var strob_band_begin: float +""" Ширина строба в момент начала перетаскивания """ + +var strob_center: Vector2 +""" Центр антенн """ + +var shift_pressed: bool +""" Кнопка SHIFT нажата """ + +signal drag_begin +""" Вызывается в момент начала перетаскивания """ + +signal drag_continue +""" Вызывается во время продолжения перетаскивания """ + +signal drag_end +""" Вызывается в момент завершения перетаскивания """ + +signal full_screen +""" Вызывается при смене режима окна полный экран - оконный """ + + +func _ready(): + $btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) + $btn_off.set_pressed(true) + strob_center = $canvas.get_strob_center() + on_button_strobe_pressed() + drag_fsm = DRAG_FSM.OFF + var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи') + for btn in nodes: + btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)) + + +func on_button_strobe_pressed(): + if $btn_strobe.is_pressed(): + $canvas.set_strob_visible(true) + drag_fsm = DRAG_FSM.IDLE + else: + $canvas.set_strob_visible(false) + drag_fsm = DRAG_FSM.OFF + + +func on_button_pressed(btn_this, btn_others): + # поведение радиокнопок в группе + for btn_other in btn_others: + btn_other.set_pressed(btn_this == btn_other) + + +func clip_value(val, val_min, val_max): + if val < val_min: val = val_min + if val > val_max: val = val_max + return val + + +func get_strob_width(pos: Vector2, prev: float) -> float: + var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width + strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width) + return strob_dir_width + + +func get_strob_band(pos: Vector2, prev: float) -> float: + var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band + strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band) + return strob_dir_band + + +func set_strob(pos: Vector2): + var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos) + if radp.y < $canvas.get_radius_max(): + $canvas.set_strob_dir(radp.x) + $canvas.set_strob_radius(radp.y) + + +func _on_drag_continue(event): + if drag_button == MOUSE_BUTTON_RIGHT: + if shift_pressed: + var strob_width: float = get_strob_width(event.position, strob_width_begin) + $canvas.set_strob_width(strob_width) + else: + var strob_band: float = get_strob_band(event.position, strob_band_begin) + $canvas.set_strob_band(strob_band) + elif drag_button == MOUSE_BUTTON_LEFT: + set_strob(event.position) + + +func _on_drag_begin(event): + drag_pos_begin = event.position + if drag_button == MOUSE_BUTTON_LEFT: + set_strob(event.position) + elif drag_button == MOUSE_BUTTON_RIGHT: + strob_width_begin = $canvas.get_strob_width() + strob_band_begin = $canvas.get_strob_band() + + +func _input(event): + if event is InputEventMouseMotion: + if drag_fsm == DRAG_FSM.DRAG: + emit_signal('drag_continue', event) + elif event is InputEventMouseButton: + drag_button = event.button_index + if event.pressed: + if drag_fsm == DRAG_FSM.IDLE: + drag_fsm = DRAG_FSM.DRAG + emit_signal('drag_begin', event) + else: + drag_fsm = DRAG_FSM.IDLE + emit_signal('drag_end', event) + elif event is InputEventKey: + if event.pressed and event.physical_keycode == KEY_F11: + emit_signal('full_screen') + elif event.physical_keycode == KEY_SHIFT: + shift_pressed = event.pressed + + +func toggle_full_screen(id: int): + var mode = DisplayServer.window_get_mode(id) + if mode == DisplayServer.WINDOW_MODE_FULLSCREEN: + mode = DisplayServer.WINDOW_MODE_WINDOWED + else: + mode = DisplayServer.WINDOW_MODE_FULLSCREEN + DisplayServer.window_set_mode(mode, id) + + +func _on_full_screen(): + toggle_full_screen(window_1_id) + toggle_full_screen(window_0_id) + + +func _on_btn_down(signal_name: String) -> void: + emit_signal(signal_name) diff --git a/scenes/работа.tscn b/scenes/работа.tscn new file mode 100644 index 0000000..3b353e5 --- /dev/null +++ b/scenes/работа.tscn @@ -0,0 +1,644 @@ +[gd_scene load_steps=6 format=3 uid="uid://b276iygic5itk"] + +[ext_resource type="Script" path="res://scenes/работа.gd" id="1_qjoce"] +[ext_resource type="PackedScene" uid="uid://b5kjdyxuwsot5" path="res://scenes/canvas.tscn" id="2_bl0yt"] +[ext_resource type="PackedScene" uid="uid://bq7haw1ypiv48" path="res://scenes/frame.tscn" id="3_l1omj"] +[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button_flat.tscn" id="4_5es2r"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5ugj8"] + +[node name="Работа" type="Panel"] +script = ExtResource("1_qjoce") +col_red = Color(1, 0.568627, 0.431373, 0.239216) +col_grey = Color(0.34902, 0.643137, 0.772549, 0.168627) +strob_min_width = 5.0 +strob_max_width = 90.0 +strob_min_band = 0.1 +strob_max_band = 15.538 +drag_scale_width = 0.5 +drag_scale_band = 0.05 +window_1_id = 1 +metadata/_edit_vertical_guides_ = [] +metadata/_edit_lock_ = true + +[node name="canvas" parent="." instance=ExtResource("2_bl0yt")] +metadata/_edit_lock_ = true + +[node name="рамка-список-целей" parent="." instance=ExtResource("3_l1omj")] +layout_mode = 0 +offset_left = 1121.0 +offset_top = 6.0 +offset_right = 1594.0 +offset_bottom = 642.0 +text = "Список целей" + +[node name="рамка-параметры-цели" parent="рамка-список-целей" instance=ExtResource("3_l1omj")] +layout_mode = 0 +offset_left = 5.0 +offset_top = 313.0 +offset_right = 467.0 +offset_bottom = 632.0 +text = "Параметры цели" + +[node name="tbl_celi" type="GridContainer" parent="рамка-список-целей/рамка-параметры-цели"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.012 +anchor_top = 0.065 +anchor_right = 0.99 +anchor_bottom = 0.985 +offset_left = 0.212 +offset_top = 5.265 +offset_right = -0.0100098 +offset_bottom = -0.214996 +columns = 2 + +[node name="hdr_col0" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_5ugj8") +text = "Параметр" +horizontal_alignment = 1 + +[node name="hdr_col1" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_5ugj8") +text = "Значение" +horizontal_alignment = 1 + +[node name="node_02_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Тип модуляции" + +[node name="node_02_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "qam256" +horizontal_alignment = 1 + +[node name="node_03_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Ширина диапазона, МГц" + +[node name="node_03_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "2.5" +horizontal_alignment = 1 + +[node name="node_04_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Мощность, дБ" + +[node name="node_04_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "43" +horizontal_alignment = 1 + +[node name="node_05_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Время обновления" + +[node name="node_05_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "20:23:04" +horizontal_alignment = 1 + +[node name="node_06_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Режим перестройки" + +[node name="node_06_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "ЛЧМ" +horizontal_alignment = 1 + +[node name="node_07_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Скорость данных, бит/с" + +[node name="node_07_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "1.8М" +horizontal_alignment = 1 + +[node name="node_08_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Протокол" + +[node name="node_08_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "solo7" +horizontal_alignment = 1 + +[node name="node_09_00" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Высота, м" + +[node name="node_09_01" type="Label" parent="рамка-список-целей/рамка-параметры-цели/tbl_celi"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "128" +horizontal_alignment = 1 + +[node name="btn_add_thr" type="Button" parent="рамка-список-целей"] +layout_mode = 0 +offset_left = 6.0 +offset_top = 4.0 +offset_right = 24.0 +offset_bottom = 31.0 +scale = Vector2(1, 0.6) +tooltip_text = "Добавить имитационную цель" +text = "+" + +[node name="btn_del_thr" type="Button" parent="рамка-список-целей"] +layout_mode = 0 +offset_left = 28.0 +offset_top = 4.0 +offset_right = 46.0 +offset_bottom = 31.0 +scale = Vector2(1, 0.6) +tooltip_text = "Удалить цель" +text = "-" + +[node name="рамка-сеансы-помех" parent="." instance=ExtResource("3_l1omj")] +layout_mode = 0 +offset_left = 1121.0 +offset_top = 648.0 +offset_right = 1594.0 +offset_bottom = 1168.0 +text = "Сеансы помех" + +[node name="tbl_seansy" type="GridContainer" parent="рамка-сеансы-помех"] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.115 +anchor_bottom = 0.115 +offset_left = 5.0 +offset_top = -34.8 +offset_right = 453.0 +offset_bottom = 185.2 +columns = 3 + +[node name="hdr_col0" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_5ugj8") +text = "Индекс сеанса" +horizontal_alignment = 1 + +[node name="hdr_col1" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_5ugj8") +text = "Номер цели" +horizontal_alignment = 1 + +[node name="hdr_col2" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_5ugj8") +text = "Режим помехи" +horizontal_alignment = 1 + +[node name="node_00_00" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "1" +horizontal_alignment = 1 + +[node name="node_00_01" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "3" +horizontal_alignment = 1 + +[node name="node_00_02" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "СРН-И1" +horizontal_alignment = 1 + +[node name="node_01_00" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "2" +horizontal_alignment = 1 + +[node name="node_01_01" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "1" +horizontal_alignment = 1 + +[node name="node_01_02" type="Label" parent="рамка-сеансы-помех/tbl_seansy"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "ПД-М4С" +horizontal_alignment = 1 + +[node name="рамка-помеха" parent="рамка-сеансы-помех" instance=ExtResource("3_l1omj")] +layout_mode = 0 +offset_left = 5.0 +offset_top = 250.0 +offset_right = 467.0 +offset_bottom = 514.0 +text = "Параметры помехи" + +[node name="tbl_pomeha" type="GridContainer" parent="рамка-сеансы-помех/рамка-помеха"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.012 +anchor_top = 0.065 +anchor_right = 0.99 +anchor_bottom = 0.985 +offset_left = 0.212 +offset_top = 7.775 +offset_right = -0.0100098 +offset_bottom = -0.0249939 +columns = 2 + +[node name="hdr_col0" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_5ugj8") +text = "Параметр" +horizontal_alignment = 1 + +[node name="hdr_col1" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_5ugj8") +text = "Значение" +horizontal_alignment = 1 + +[node name="node_00_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Индекс сеанса" + +[node name="node_00_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "1" +horizontal_alignment = 1 + +[node name="node_01_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Курсовой угол" + +[node name="node_01_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "43" +horizontal_alignment = 1 + +[node name="node_02_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Частота, МГЦ" + +[node name="node_02_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "2600" +horizontal_alignment = 1 + +[node name="node_03_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Диапазон, МГЦ" + +[node name="node_03_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "80" +horizontal_alignment = 1 + +[node name="node_04_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Режим" + +[node name="node_04_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "СРН-М2" +horizontal_alignment = 1 + +[node name="node_05_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Мощность" + +[node name="node_05_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "2.5" +horizontal_alignment = 1 + +[node name="node_06_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Угол места" + +[node name="node_06_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "5" +horizontal_alignment = 1 + +[node name="node_07_00" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "Режим перестройки" + +[node name="node_07_01" type="Label" parent="рамка-сеансы-помех/рамка-помеха/tbl_pomeha"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(0.729412, 0.729412, 0.729412, 1) +text = "ЛЧМ" +horizontal_alignment = 1 + +[node name="btn_auto_threat" parent="." instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 912.0 +offset_top = 67.0 +offset_right = 1102.0 +offset_bottom = 117.0 +text = "Автоматически" + +[node name="btn_strobe" parent="." instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 912.0 +offset_top = 6.0 +offset_right = 1102.0 +offset_bottom = 56.0 +text = "Строб" + +[node name="btn_p5" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 1 +anchors_preset = -1 +offset_left = 980.0 +offset_top = 1118.0 +offset_right = 1045.0 +offset_bottom = 1168.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "ОЗП-1" +metadata/rfi_name = "ozp1" + +[node name="btn_p4" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 1 +anchors_preset = -1 +offset_left = 1052.0 +offset_top = 1118.0 +offset_right = 1117.0 +offset_bottom = 1168.0 +grow_horizontal = 2 +grow_vertical = 2 +tooltip_text = "Выбор цели или сектора" +text = "<-" +metadata/rfi_name = "" + +[node name="btn_p6" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 840.0 +offset_top = 1118.0 +offset_right = 905.0 +offset_bottom = 1168.0 +text = "СВ-М2" +metadata/rfi_name = "svm2" + +[node name="btn_p7" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 910.0 +offset_top = 1118.0 +offset_right = 975.0 +offset_bottom = 1168.0 +text = "K1" +metadata/rfi_name = "k1" + +[node name="btn_p8" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 770.0 +offset_top = 1118.0 +offset_right = 835.0 +offset_bottom = 1168.0 +text = "СВ-И1" +metadata/rfi_name = "svi1" + +[node name="btn_p9" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 700.0 +offset_top = 1118.0 +offset_right = 765.0 +offset_bottom = 1168.0 +text = "ПД-ЧМ" +metadata/rfi_name = "pdchm" + +[node name="btn_p10" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 1 +anchors_preset = -1 +offset_left = 630.0 +offset_top = 1118.0 +offset_right = 695.0 +offset_bottom = 1168.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "ПД-М4С" +metadata/rfi_name = "pdm4s" + +[node name="btn_p11" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 350.0 +offset_top = 1118.0 +offset_right = 415.0 +offset_bottom = 1168.0 +text = "ЛЧМ-1" +metadata/rfi_name = "lchm1" + +[node name="btn_p12" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 1 +anchors_preset = -1 +offset_left = 420.0 +offset_top = 1118.0 +offset_right = 485.0 +offset_bottom = 1168.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "МЧМ-1" +metadata/rfi_name = "mchm1" + +[node name="btn_p13" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 1 +anchors_preset = -1 +offset_left = 490.0 +offset_top = 1118.0 +offset_right = 555.0 +offset_bottom = 1168.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "ПД-М2" +metadata/rfi_name = "pdm2" + +[node name="btn_p14" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 1 +anchors_preset = -1 +offset_left = 560.0 +offset_top = 1118.0 +offset_right = 625.0 +offset_bottom = 1168.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "ПД-М4" +metadata/rfi_name = "pdm4" + +[node name="btn_p15" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 1 +anchors_preset = -1 +offset_left = 280.0 +offset_top = 1118.0 +offset_right = 345.0 +offset_bottom = 1168.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "СРН-М2" +metadata/rfi_name = "srnm2" + +[node name="btn_p16" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 210.0 +offset_top = 1118.0 +offset_right = 275.0 +offset_bottom = 1168.0 +text = "СРН-И1" +metadata/rfi_name = "srni1" + +[node name="btn_off" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 140.0 +offset_top = 1118.0 +offset_right = 205.0 +offset_bottom = 1168.0 +text = "Откл." +metadata/rfi_name = "" + +[node name="btn_auto_rfi" parent="." groups=["группа-режим-помехи"] instance=ExtResource("4_5es2r")] +layout_mode = 0 +offset_left = 10.0 +offset_top = 1118.0 +offset_right = 135.0 +offset_bottom = 1168.0 +text = "Автоматически" +metadata/rfi_name = "" + +[connection signal="drag_begin" from="." to="." method="_on_drag_begin"] +[connection signal="drag_continue" from="." to="." method="_on_drag_continue"] +[connection signal="full_screen" from="." to="." method="_on_full_screen" flags=3] +[connection signal="button_down" from="рамка-список-целей/btn_add_thr" to="." method="_on_btn_down" binds= ["add_imit_threat"]] +[connection signal="button_down" from="рамка-список-целей/btn_del_thr" to="." method="_on_btn_down" binds= ["del_imit_threat"]] diff --git a/scenes/рамка.gd b/scenes/рамка.gd new file mode 100644 index 0000000..0bb06c2 --- /dev/null +++ b/scenes/рамка.gd @@ -0,0 +1,18 @@ +@tool + +extends NinePatchRect + + +@export var horizontal_alignment: HorizontalAlignment = HorizontalAlignment.HORIZONTAL_ALIGNMENT_CENTER: + get: return $header.horizontal_alignment + set(val): $header.horizontal_alignment = val + + +@export var vertical_alignment: VerticalAlignment = VerticalAlignment.VERTICAL_ALIGNMENT_CENTER: + get: return $header.vertical_alignment + set(val): $header.vertical_alignment = val + + +@export var text: String = 'caption text': + get: return $header.text + set(val): $header.text = val diff --git a/shaders/bip.gdshader b/shaders/bip.gdshader new file mode 100644 index 0000000..0e7ce0d --- /dev/null +++ b/shaders/bip.gdshader @@ -0,0 +1,20 @@ +shader_type canvas_item; + +/* Закрашенная окружность */ + +uniform vec4 color: source_color = vec4(1, 1, 1, 1); +const float ds = 0.005; /* Относительное расстояние на котором выполняется сглаживание краёв */ +const vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */ +const float radius = 0.125 - ds * 2.0; /* Радиус должен быть 0.5, но это не так */ + + +float smooth_px(float r, float R) +{ + return 1.0 - smoothstep(R - ds, R + ds, r); +} + + +void fragment() +{ + COLOR = color * smooth_px(length(UV - center), radius); +} diff --git a/shaders/sector.gdshader b/shaders/sector.gdshader new file mode 100644 index 0000000..6597b4d --- /dev/null +++ b/shaders/sector.gdshader @@ -0,0 +1,70 @@ +shader_type canvas_item; + +/* Закрашенный сектор окружности ограниченный угловым сектором и радиусами */ + +uniform vec4 color: source_color = vec4(1, 1, 1, 1); +uniform vec4 clip_color: source_color = vec4(1.0, 0.5, 0.5, 1.0); +uniform float width: hint_range(0.0, 360.0, 0.1) = 45.0; +uniform float band: hint_range(0.0, 0.125) = 0.02; +uniform float radius: hint_range(0.0, 0.125) = 0.08; +uniform float dir: hint_range(0.0, 360.0) = 0.0; +uniform float inner_clip: hint_range(0.0, 0.125) = 0.045; + + +const vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */ +const float dsa = 0.0025; /* Относительное расстояние на котором выполняется сглаживание краёв по радиальным линиям */ +const float dsr = 0.00025; /* Относительное расстояние на котором выполняется сглаживание краёв по круговым линиям */ + + +float smooth_px(float r, float R, float ds) +{ + return 1.0 - smoothstep(R - ds, R + ds, r); +} + + +vec4 sector(vec4 c, vec2 uv_pos, float r0, float r1, float w) +{ + bool rc = false; + if (r1 > center.x) + { + rc = true; + r1 = center.x; + } + if (r0 < inner_clip) + { + rc = true; + r0 = inner_clip; + } + vec2 d = uv_pos - center; + float theta = atan(d.x, d.y); + w = radians(w / 2.0); + float l = distance(center, uv_pos); + float vr = smooth_px(r0, l, dsr) - smooth_px(r1, l, dsr); + float va = smooth_px(-w, theta, dsa) - smooth_px(w, theta, dsa); + if (rc) + { + c *= clip_color; + } + return c * sqrt(va * vr); +} + + +void rotate_vec2(inout vec2 vert, float a) +{ + float sin_a = sin(a); + float cos_a = cos(a); + vert *= mat2(vec2(cos_a, sin_a), vec2(-sin_a, cos_a)); +} + + +void vertex() +{ + rotate_vec2(VERTEX, radians(90.0 - dir)); +} + + +void fragment() +{ + float dr = band / 2.0; + COLOR = sector(color, UV, radius - dr, radius + dr, width); +} diff --git a/shaders/shader_edu.tres b/shaders/shader_edu.tres index 888725a..62508d8 100644 --- a/shaders/shader_edu.tres +++ b/shaders/shader_edu.tres @@ -3,94 +3,45 @@ [sub_resource type="Shader" id="1"] code = "shader_type canvas_item; -const float M_PI = 3.141592653589793; -/*const vec3 blue1 = vec3(0.42, 0.51, 0.55); -const vec3 blue2 = vec3(0.11, 0.21, 0.25); -const vec3 blue3 = vec3(0.35, 0.76, 0.83); -const vec3 blue4 = vec3(0.953, 0.969, 0.89); -const vec3 red = vec3(1.00, 0.38, 0.227); +uniform vec2 pc0; /* Центр сетки антенн */ +uniform float rotation: hint_range(0.0, 360.0) = 0.0; /* */ +uniform vec4 color0: source_color = vec4(0.38, 0.47, 0.51, 0.4); +uniform vec4 color1: source_color = vec4(0.39, 0.44, 0.50, 0.4); -uniform vec4 blue1: source_color = vec4(0.4, 0.3, 0.3, 1.0); -uniform vec4 blue2: source_color = vec4(0.6, 0.5, 0.5, 1.0); -uniform vec4 blue3: source_color = vec4(0.8, 0.7, 0.7, 1.0); -uniform vec4 blue4: source_color = vec4(1.0, 0.9, 0.9, 1.0); -uniform vec4 red: source_color = vec4(1.0, 0.5, 0.3, 1.0); */ +const float ant_band_count_0 = 2.0; +const float ant_band_count_1 = 2.0; +const float ant_band_count_2 = 2.0; +const float ant_band_count_3 = 2.0; +const float ant_band_count_4 = 2.0; +const float ant_band_count_5 = 2.0; +const float ant_band_count_6 = 2.0; -uniform vec4 blue0: source_color = vec4(0.38, 0.47, 0.51, 1.0); -uniform vec4 blue1: source_color = vec4(0.39, 0.44, 0.50, 1.0); -uniform vec4 blue2: source_color = vec4(0.11, 0.21, 0.25, 1.0); -uniform vec4 blue3: source_color = vec4(0.35, 0.76, 0.83, 1.0); -uniform vec4 blue4: source_color = vec4(0.953, 0.969, 0.89, 1.0); -uniform vec4 red: source_color = vec4(1.00, 0.38, 0.227, 1.0); +const float ant_band_r0_0 = 200.0; +const float ant_band_r0_1 = 250.0; +const float ant_band_r0_2 = 300.0; +const float ant_band_r0_3 = 350.0; +const float ant_band_r0_4 = 400.0; +const float ant_band_r0_5 = 450.0; +const float ant_band_r0_6 = 500.0; -uniform float line_width = 2.0; -uniform float sec_forward = 180.0; -uniform float sec_back = 0.0; -uniform float sec_left = 90.0; -uniform float sec_right = 300.0; -uniform float d0 = 520.0; -uniform float d1 = 1120.0; -uniform float d2 = 1160.0; -uniform float d3 = 100.0; -uniform float d4 = 180.0; -uniform float d5 = 650.0; -uniform float d6 = 800.0; -uniform float d7 = 950.0; -uniform vec2 pc0 = vec2(0, 0); -uniform vec2 pc1 = vec2(0, 0); -uniform vec2 pc2 = vec2(0, 0); -uniform float ap_ant_w = 12.0; -uniform vec2 tr0 = vec2(0, 0); -uniform vec2 tr1 = vec2(0, 0); -uniform vec2 tr2 = vec2(0, 0); +const float ant_band_r1_0 = 250.0; +const float ant_band_r1_1 = 300.0; +const float ant_band_r1_2 = 350.0; +const float ant_band_r1_3 = 400.0; +const float ant_band_r1_4 = 450.0; +const float ant_band_r1_5 = 500.0; +const float ant_band_r1_6 = 550.0; +const float d4 = 90.0; +const float ds = 1.0; -// Массивы не работают -// uniform int band_ants[3]; // количество антенн, радиус внутренний, радиус внешний, подстройка по углу -float SMOOTH(float r, float R) +float SMOOTH(float r, float R, float d) { - return 1.0 - smoothstep(R - 1.0, R + 1.0, r); + return 1.0 - smoothstep(R - d, R + d, r); } -float RANGE(float a, float b, float x) -{ - return step(a, x) * (1.0 - step(b, x)); -} - - -float RS(float a, float b, float x) -{ - return smoothstep(a - 1.0, a + 1.0, x) * (1.0 - smoothstep(b - 1.0, b + 1.0, x)); -} - - -vec2 modulate_move(float a, float b, float c, float d, float time) -{ - return vec2(a * cos(time) + b * cos(2.0 * time), c * sin(time) + d * sin(2.0 * time)); -} - - -vec3 radar_scan_line(vec2 uv, vec2 center, float time, float radius, vec3 color) -{ - //angle of the line - float theta0 = time * 90.0; - vec2 d = uv - center; - float r = sqrt(dot(d, d)); - if (r < radius) - { - //compute the distance to the line theta=theta0 - vec2 p = radius * vec2(cos(theta0 * M_PI / 180.0), - sin(theta0 * M_PI / 180.0)); - float l = length(d - p * clamp(dot(d, p) / dot(p, p), 0.0, 1.0)); - //compute gradient based on angle difference to theta0 - float theta = mod(180.0 * atan(d.y, d.x) / M_PI + theta0, 360.0); - float gradient = clamp(1.0 - theta / 90.0, 0.0, 1.0); - return color * SMOOTH(l, 1.0) + 0.5 * gradient * color; - } - else return vec3(0, 0, 0); -} - -void sector(inout vec3 c, vec2 uv, vec2 center, float a, float da, float r0, float r1, vec3 color) +void sector(inout vec4 c, vec2 uv, vec2 center, float a, float da, float r0, float r1, vec4 color) { float l = distance(center, uv); vec2 d = uv - center; @@ -99,123 +50,22 @@ void sector(inout vec3 c, vec2 uv, vec2 center, float a, float da, float r0, flo da /= 2.0; float a0 = radians(a - da); float a1 = radians(a + da); - float va = SMOOTH(a0 * sf, theta) - SMOOTH(a1 * sf, theta); - float vr = SMOOTH(r0, l) - SMOOTH(r1, l); - c += color * sqrt(va * vr); + float va = SMOOTH(a0 * sf, theta, ds) - SMOOTH(a1 * sf, theta, ds); + float vr = SMOOTH(r0, l, ds) - SMOOTH(r1, l, ds); + float rgb = sqrt(va * vr); + c.rgb += color.rgb * rgb * color.a; + c.a += rgb * color.a; } -void circle(inout vec3 c, vec2 uv, vec2 p0, float radius, float width, vec3 color) -{ - float r = length(uv - p0); - c += (SMOOTH(r - width / 2.0, radius) - SMOOTH(r + width / 2.0, radius)) * color; -} - - -float circle2(vec2 uv, vec2 center, float radius, float width, float opening) -{ - vec2 d = uv - center; - float r = sqrt(dot(d, d)); - d = normalize(d); - if (abs(d.y) > opening) - return SMOOTH(r - width / 2.0, radius) - SMOOTH(r + width / 2.0, radius); - else - return 0.0; -} - -float circle3(vec2 uv, vec2 center, float radius, float width) -{ - vec2 d = uv - center; - float r = sqrt(dot(d, d)); - d = normalize(d); - float theta = 180.0 * (atan(d.y, d.x) / M_PI); - return smoothstep(2.0, 2.1, abs(mod(theta + 2.0, 45.0) - 2.0)) - * mix(0.5, 1.0, step(45.0, abs(mod(theta, 180.0) - 90.0))) - * (SMOOTH(r - width / 2.0, radius) - SMOOTH(r + width / 2.0, radius)); -} - - -float triangles(vec2 uv, vec2 center, float radius) -{ - vec2 d = uv - center; - return RS(-8.0, 0.0, d.x - radius) * (1.0 - smoothstep(7.0 + d.x - radius, 9.0 + d.x - radius, abs(d.y))) - + RS( 0.0, 8.0, d.x + radius) * (1.0 - smoothstep(7.0 - d.x - radius, 9.0 - d.x - radius, abs(d.y))) - + RS(-8.0, 0.0, d.y - radius) * (1.0 - smoothstep(7.0 + d.y - radius, 9.0 + d.y - radius, abs(d.x))) - + RS( 0.0, 8.0, d.y + radius) * (1.0 - smoothstep(7.0 - d.y - radius, 9.0 - d.y - radius, abs(d.x))); -} - - -float _cross(vec2 uv, vec2 center, float radius) -{ - vec2 d = uv - center; - int x = int(d.x); - int y = int(d.y); - float r = sqrt(dot(d, d)); - if ((r < radius) && ((x == y) || (x == -y))) - return 1.0; - else return 0.0; -} - - -void cross_lines(inout vec3 color, vec2 uv, vec2 pc, float r0, float w, vec3 c) -{ - vec2 d = uv - pc; - int x = int(d.x); - int y = int(d.y); - float r = sqrt(dot(d, d)); - if ((r < r0) && ((x == y) || (x == -y))) - color += c; - color += vec3(0, 0, 0); -} - - -float dots(vec2 uv, vec2 center, float radius) -{ - vec2 d = uv - center; - float r = sqrt(dot(d, d)); - if (r <= 2.5) - return 1.0; - if ((r <= radius) && ((abs(d.y + 0.5) <= 1.0) && (mod(d.x + 1.0, 50.0) < 2.0))) - return 1.0; - else if ((abs(d.y + 0.5) <= 1.0) && (r >= 50.0) && (r < 115.0)) - return 0.5; - else - return 0.0; -} - - -void bip1(inout vec3 color, vec2 uv, vec2 center, float r, vec3 c, float a) -{ - color += c * SMOOTH(length(uv - center), r) * a; -} - - -float bip2(vec2 uv, float time, vec2 center) -{ - float r = length(uv - center); - float R = 8.0 + mod(87.0 * time, 80.0); - return (0.5 - 0.5 * cos(30.0 * time)) * SMOOTH(r, 5.0) - + SMOOTH(6.0, r) - SMOOTH(8.0, r) - + smoothstep(max(8.0, R - 20.0), R, r) - SMOOTH(R,r); -} - - -vec3 circle_h(inout vec3 c, vec2 uv, vec2 c0, float r, vec3 color) -{ - return 1.0 * color; -} - - -void antenas(inout vec3 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, vec3 c0, vec3 c1, float a, float adj) +void antenas(inout vec4 c, vec2 uv, vec2 p0, float cnt, float r0, float r1, vec4 c0, vec4 c1) { float da = 180.0f / float(cnt); - c0 *= a; - c1 *= a; - for (int i = -cnt; i <= cnt; i ++) + for (int i = int(-cnt); i <= int(cnt); i ++) { float v = float(i & 1); - vec3 col = v * c0 + (1.0f - v) * c1; - sector(c, uv, p0, float(i) * da + adj, da, r0, r1, col); + vec4 col = v * c0 + (1.0f - v) * c1; + sector(c, uv, p0, float(i) * da, da, r0, r1, col); } } @@ -229,110 +79,51 @@ void circle_thin(inout vec3 color, vec2 uv, vec2 p, float r, float w, vec3 c, fl } -void line(inout vec3 color, vec2 uv, vec2 p0, vec2 p1, vec3 c, float a) +void line_r(inout vec4 color, vec2 uv, vec2 center, float theta0, float radius, vec4 c) { - vec2 d = uv - p0; - float radius = distance(p0, p1); - float r = sqrt(dot(d, d)); - float theta0 = acos(dot(normalize(p0), normalize(p1))); - vec2 p = radius * vec2(cos(theta0), -sin(theta0)); + vec2 d = uv - center; + vec2 p = radius * vec2(cos(theta0 * PI / 180.0), - sin(theta0 * PI / 180.0)); float l = length(d - p * clamp(dot(d, p) / dot(p, p), 0.0, 1.0)); - color += c * SMOOTH(l, 1.0); + color.rgb += c.rgb * SMOOTH(l, 1.0, ds) * c.a; } -void line_r(inout vec3 color, vec2 uv, vec2 center, float theta0, float radius, vec3 c, float a) +void rotate_vec2(inout vec2 vert, float a) { - vec2 d = uv - center; - float r = sqrt(dot(d, d)); - vec2 p = radius * vec2(cos(theta0 * M_PI / 180.0), - sin(theta0 * M_PI / 180.0)); - float l = length(d - p * clamp(dot(d, p) / dot(p, p), 0.0, 1.0)); - color += c * SMOOTH(l, 1.0); + float sin_a = sin(a); + float cos_a = cos(a); + vert *= mat2(vec2(cos_a, sin_a), vec2(-sin_a, cos_a)); +} + + +void vertex() +{ + VERTEX -= pc0; + rotate_vec2(VERTEX, radians(rotation)); + VERTEX += pc0; } void fragment() { ivec2 isz = textureSize(TEXTURE, 0); - vec2 uv = UV * vec2(float(isz.x), float(isz.y)); - vec3 rs = vec3(d2, d1, d0) / 2.0f; - COLOR = texture(TEXTURE, UV); + vec2 uv = UV * vec2(float(isz.x), float(isz.y)); // координаты текущей точки в пикселях + COLOR = vec4(0, 0, 0, 0.0); //texture(TEXTURE, UV); // Цвет текущей точки - // РТО - //circle_thin(COLOR.rgb, uv, pc0, d0 / 2.0, line_width, blue1.rgb, 1.0); - //circle_thin(COLOR.rgb, uv, pc0, d1 / 2.0, line_width, blue1.rgb, 1.0); - //circle_thin(COLOR.rgb, uv, pc0, d2 / 2.0, line_width, blue1.rgb, 1.0); - //circle_thin(COLOR.rgb, uv, pc0, d5 / 2.0, line_width, blue1.rgb, 0.5); - //circle_thin(COLOR.rgb, uv, pc0, d6 / 2.0, line_width, blue1.rgb, 0.5); - //circle_thin(COLOR.rgb, uv, pc0, d7 / 2.0, line_width, blue1.rgb, 0.5); - - //line_r(COLOR.rgb, uv, pc0, 45, 580, blue1.rgb, 1.0); - //line_r(COLOR.rgb, uv, pc0, 135, 580, blue1.rgb, 1.0); - //line_r(COLOR.rgb, uv, pc0, 225, 580, blue1.rgb, 1.0); - //line_r(COLOR.rgb, uv, pc0, 315, 580, blue1.rgb, 1.0); - - //sector(COLOR.rgb, uv, pc0, sec_forward, ap_ant_w, 280, 580, red.rgb); - //sector(COLOR.rgb, uv, pc0, sec_back, ap_ant_w, 280, 580, red.rgb); - //sector(COLOR.rgb, uv, pc0, sec_left, ap_ant_w, 280, 580, red.rgb); - //sector(COLOR.rgb, uv, pc0, sec_right, ap_ant_w, 280, 580, red.rgb); - - //antenas(COLOR.rgb, uv, pc0, ants_count, d6 / 2.0, d7 / 2.0, blue0.rgb, blue1.rgb, 0.3, 7.5); - antenas(COLOR.rgb, uv, pc0, 2, 220, 280, blue1.rgb, blue0.rgb, 0.4, 0); - antenas(COLOR.rgb, uv, pc0, 2, 280, 340, blue0.rgb, blue1.rgb, 0.4, 0); - antenas(COLOR.rgb, uv, pc0, 2, 340, 400, blue1.rgb, blue0.rgb, 0.4, 0); - antenas(COLOR.rgb, uv, pc0, 2, 400, 460, blue0.rgb, blue1.rgb, 0.4, 0); - antenas(COLOR.rgb, uv, pc0, 2, 460, 520, blue1.rgb, blue0.rgb, 0.4, 0); - antenas(COLOR.rgb, uv, pc0, 2, 520, 580, blue0.rgb, blue1.rgb, 0.4, 0); - - bip1(COLOR.rgb, uv, tr0, 13.0, blue1.rgb, 1.0); - bip1(COLOR.rgb, uv, tr1, 13.0, blue1.rgb, 1.0); - bip1(COLOR.rgb, uv, tr2, 13.0, blue1.rgb, 1.0); - - // Массивы не работают - //for (int i = 0; i < 3; i ++) - //{ - // int cnt = int(band_ants[i].x); - // float r0 = band_ants[i].y; - // float r1 = band_ants[i].z; - // float adj = band_ants[i].w; - // antenas(COLOR.rgb, uv, pc0, cnt, r0, r1, blue0.rgb, blue1.rgb, 0.3, adj); - //} - - // Качка - circle_thin(COLOR.rgb, uv, pc1, d4 / 2.0, line_width, blue1.rgb, 1.0); - line_r(COLOR.rgb, uv, pc1, 0, d4 / 2.0, blue1.rgb, 1.0); - line_r(COLOR.rgb, uv, pc1, 90, d4 / 2.0, blue1.rgb, 1.0); - line_r(COLOR.rgb, uv, pc1, 180, d4 / 2.0, blue1.rgb, 1.0); - line_r(COLOR.rgb, uv, pc1, 270, d4 / 2.0, blue1.rgb, 1.0); - bip1(COLOR.rgb, uv, pc2, 13.0, blue1.rgb, 1.0); + // Сетка антенн + antenas(COLOR, uv, pc0, ant_band_count_0, ant_band_r0_0, ant_band_r1_0, color1, color0); + antenas(COLOR, uv, pc0, ant_band_count_1, ant_band_r0_1, ant_band_r1_1, color0, color1); + antenas(COLOR, uv, pc0, ant_band_count_2, ant_band_r0_2, ant_band_r1_2, color1, color0); + antenas(COLOR, uv, pc0, ant_band_count_3, ant_band_r0_3, ant_band_r1_3, color0, color1); + antenas(COLOR, uv, pc0, ant_band_count_4, ant_band_r0_4, ant_band_r1_4, color1, color0); + antenas(COLOR, uv, pc0, ant_band_count_5, ant_band_r0_5, ant_band_r1_5, color0, color1); + antenas(COLOR, uv, pc0, ant_band_count_6, ant_band_r0_6, ant_band_r1_6, color1, color0); } " [resource] shader = SubResource("1") -shader_parameter/blue0 = Color(0.378, 0.4272, 0.45, 1) -shader_parameter/blue1 = Color(0.336, 0.3808, 0.4, 1) -shader_parameter/blue2 = Color(0.11, 0.21, 0.25, 1) -shader_parameter/blue3 = Color(0.35, 0.76, 0.83, 1) -shader_parameter/blue4 = Color(0.953, 0.969, 0.89, 1) -shader_parameter/red = Color(1, 0.38, 0.227, 1) -shader_parameter/line_width = 2.0 -shader_parameter/sec_forward = 0.0 -shader_parameter/sec_back = 90.0 -shader_parameter/sec_left = 180.0 -shader_parameter/sec_right = 270.0 -shader_parameter/d0 = 520.0 -shader_parameter/d1 = 1110.0 -shader_parameter/d2 = 1150.0 -shader_parameter/d3 = 100.0 -shader_parameter/d4 = 180.0 -shader_parameter/d5 = 650.0 -shader_parameter/d6 = 800.0 -shader_parameter/d7 = 950.0 -shader_parameter/pc0 = Vector2(600, 600) -shader_parameter/pc1 = Vector2(120, 1090) -shader_parameter/pc2 = Vector2(90, 1110) -shader_parameter/ap_ant_w = 12.0 -shader_parameter/tr0 = Vector2(300, 400) -shader_parameter/tr1 = Vector2(500, 1000) -shader_parameter/tr2 = Vector2(1020, 240) +shader_parameter/pc0 = Vector2(560, 560) +shader_parameter/rotation = 0.0 +shader_parameter/color0 = Color(0.380392, 0.470588, 0.509804, 0.537255) +shader_parameter/color1 = Color(0.3315, 0.45645, 0.51, 0.537255) diff --git a/tab_container_stc.gd b/tab_container_stc.gd new file mode 100644 index 0000000..5acbb5a --- /dev/null +++ b/tab_container_stc.gd @@ -0,0 +1,22 @@ +extends TabContainer + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta): + pass + + +func _on_tab_changed(tab): + if tab == 7: + $Panel8/VideoStreamPlayer.play() + else: + $Panel8/VideoStreamPlayer.stop() + + +func _on_video_stream_player_finished(): + $Panel8/VideoStreamPlayer.play() diff --git a/tab_container_stc.tscn b/tab_container_stc.tscn new file mode 100644 index 0000000..2199b9e --- /dev/null +++ b/tab_container_stc.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://cbfp6bylx8g4i"] + +[ext_resource type="Script" path="res://tab_container_stc.gd" id="1_rk3q4"] + +[node name="TabContainer" type="TabContainer"] +offset_right = 1595.0 +offset_bottom = 1200.0 +script = ExtResource("1_rk3q4") + +[connection signal="tab_changed" from="." to="." method="_on_tab_changed"] diff --git a/table/header.tscn b/table/header.tscn new file mode 100644 index 0000000..b65e7dc --- /dev/null +++ b/table/header.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://ch14g46swx74h"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2thpi"] +bg_color = Color(0.8, 0.533333, 0.27451, 1) + +[node name="heder" type="Label"] +offset_right = 128.0 +offset_bottom = 23.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_2thpi") diff --git a/table/nine-patch.png b/table/nine-patch.png new file mode 100644 index 0000000..1649a7f Binary files /dev/null and b/table/nine-patch.png differ diff --git a/table/nine-patch.png.import b/table/nine-patch.png.import new file mode 100644 index 0000000..2d8c80a --- /dev/null +++ b/table/nine-patch.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bw3yv3smvaxqn" +path="res://.godot/imported/nine-patch.png-798f7950fb3126b4e1ed0c39d9e4beba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://table/nine-patch.png" +dest_files=["res://.godot/imported/nine-patch.png-798f7950fb3126b4e1ed0c39d9e4beba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/table/node.tscn b/table/node.tscn new file mode 100644 index 0000000..96c26f5 --- /dev/null +++ b/table/node.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://c1i4rwaajq7d5"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7jiwk"] + +[node name="Label" type="Label"] +offset_right = 121.0 +offset_bottom = 23.0 +theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1) +theme_override_styles/normal = SubResource("StyleBoxFlat_7jiwk") +clip_text = true diff --git a/table/selector.tscn b/table/selector.tscn new file mode 100644 index 0000000..47a6c74 --- /dev/null +++ b/table/selector.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=2 format=3 uid="uid://pd3fcx55duj2"] + +[ext_resource type="Texture2D" uid="uid://bw3yv3smvaxqn" path="res://table/nine-patch.png" id="1_ik10p"] + +[node name="NinePatchRect" type="NinePatchRect"] +offset_right = 17.0 +offset_bottom = 16.0 +texture = ExtResource("1_ik10p") +draw_center = false +patch_margin_left = 8 +patch_margin_top = 8 +patch_margin_right = 8 +patch_margin_bottom = 8 +axis_stretch_horizontal = 1 +axis_stretch_vertical = 1 diff --git a/table/table.gd b/table/table.gd new file mode 100644 index 0000000..8805e5c --- /dev/null +++ b/table/table.gd @@ -0,0 +1,539 @@ +extends GridContainer + +@export var selector_color: = Color(1.0, 1.0, 1.0, 1.0) +@export var node_gap: = Vector2(0.0, 0.0) # +@export_file var node_type_file: = 'res://table/node.tscn': get = get_node_scene, set = load_node_scene +@export_file var selector_type_file: = 'res://table/selector.tscn': set = load_selector_scene +@export var selector_key_up: Key = KEY_UP # Клавиша уменьшения индекса выбранного ряда +@export var selector_key_down: Key = KEY_DOWN # Клавиша увеличения индекса выбранного ряда + +const MAX_INDEX = 99 # Максимальное значение индекса для колонки и строки. Связано с форматом индекса ключа +const INDEX_FORMAT = '%02d_%02d' # Формат индекса ключа +const NODE_PREFIX = 'NODE_' # Префикс ключа ячейки таблицы +const HEAD_PREFIX = 'HEAD_' # Префикс ключа заголовка таблицы +const DATA_PREFIX = 'DATA_' # Префикс ключа данных ячейки таблицы +const CONN_PREFIX = 'CONN_' # Префикс ключа обработчиков событий ячейки таблицы +const SLCT_PREFIX = 'SLCT_' # Префикс ключа индикатора выбранного ряда таблицы + +const NODE_KEY_FORMAT = NODE_PREFIX + INDEX_FORMAT +const HEAD_KEY_FORMAT = HEAD_PREFIX + INDEX_FORMAT +const DATA_KEY_FORMAT = DATA_PREFIX + INDEX_FORMAT +const CONNECTED_KEY_FORMAT = CONN_PREFIX + INDEX_FORMAT +const ROW_SELECTOR_KEY_FORMAT = SLCT_PREFIX + INDEX_FORMAT + +var nodes: = {} # Все ячейки таблицы и дополнительные элементы +var selector_color_proc: Callable # Ссылка на процедуру генератора цвета индикатора выбранного ряда +var selector_size_proc: Callable # Ссылка на процедуру генератора размера индикатора выбранного ряда +var ScnSelector: PackedScene # Прототип индикатора выбранного ряда +var ScnNode: PackedScene # Прототип ячейки таблицы +var in_focus: = false # Фокус пользовательского ввода +var header: GridContainer # Заголовок таблицы + +signal row_pressed(i_row: int) # Вызывается при нажатии кнопкой мыши на строку +signal selected_changed(i_row: int) # Вызывается при изменении выбранного ряда. i_row - текущий выбранный ряд + + +func selector_up(): + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row -= 1 + if i_row < 0: + i_row = rows_count - 1 + set_row_selected(i_row, true) + emit_signal('selected_changed', i_row) + + +func selector_down(): + var i_rows: = [] + get_selected_rows(i_rows) + for i in i_rows: + set_row_selected(i, false) + var rows_count: = get_rows_count() + if not (i_rows.size() and (rows_count > 1)): + return + var i_row = i_rows[0] + i_row += 1 + i_row %= rows_count + set_row_selected(i_row, true) + emit_signal('selected_changed', i_row) + + +func set_columns_alignments(alignments): + assert(columns == alignments.size()) + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) + + +func load_selector_scene(file_name: String): + selector_type_file = file_name + ScnSelector = load(file_name) + + +func load_node_scene(file_name: String): + node_type_file = file_name + ScnNode = load(file_name) + + +func get_node_scene(): + return node_type_file + + +func _ready(): + ScnSelector = load(selector_type_file) + ScnNode = load(node_type_file) + assert(ScnSelector) + assert(ScnNode) + + +func align_to_left_bottom(header, gap: = Vector2(0, 0)): + """ Выравнивает по нижнему левому углу. + Используется для выравнивания по заголовку """ + position.x = header.position.x + gap.x + position.y = header.position.y + header.size.y + gap.y + + +func _assert_meta(i_col: int, i_row: int, pname: String, node): + assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, i_row]) + + +func set_node_meta(i_col: int, i_row: int, pname: String, val) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set_meta(pname, val) + + +func get_node_meta(i_col: int, i_row: int, pname: String): + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + _assert_meta(i_col, i_row, pname, node) + return node.get_meta(pname) + + +func set_node_property(i_col: int, i_row: int, pname: String, val) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.set(pname, val) + + +func get_node_property(i_col: int, i_row: int, pname: String): + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + return node.get(pname) + + +func get_node_key(format: String, i_col: int, i_row: int) -> String: + var key: String = format % [i_row, i_col] + assert(nodes.has(key), 'ошибка: нет такой ячейки: колонка:%d ряд:%d' % [i_col, i_row]) + return key + + +func get_key_indexes(key: String) -> Array: + var tokens: = key.split('_') + assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key) + return [int(tokens[2]), int(tokens[1])] + + +func set_columns_min_size(sizes: Array) -> void: + var rows_count: = get_rows_count() + for i_row in rows_count: + set_nodes_min_size(i_row, sizes) + set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) + + +func set_columns_aligment(alignments: Array) -> void: + var rows_count: = get_rows_count() + for i_row in rows_count: + for i_col in alignments.size(): + set_node_alligment(i_col, i_row, alignments[i_col]) + + +func _input(event) -> void: + if event is InputEventKey: + if in_focus and event.pressed: + if event.keycode == selector_key_up: + selector_up() + elif event.keycode == selector_key_down: + selector_down() + elif event is InputEventMouseButton: + if not event.pressed: + return + if (event.position.x < position.x) \ + or (event.position.x > (position.x + size.x)) \ + or (event.position.y < position.y) \ + or (event.position.y > (position.y + size.y)): + in_focus = false + emit_signal('focus_exited') + return + var rows_count: = get_rows_count() + in_focus = true + emit_signal('focus_entered') + for i_row in rows_count: + var rect = [0, 0, 0, 0] + get_node_rect(0, i_row, rect) + var y = rect[1] + position.y + if event.position.y < y: + continue + if event.position.y > (y + rect[3]): + continue + emit_signal('row_pressed', i_row) + break + + +func _init() -> void: + selector_color_proc = Callable(self, 'defaultselector_color_proc') + assert(selector_color_proc.is_valid()) + selector_size_proc = Callable(self, 'default_selector_size_proc') + assert(selector_size_proc.is_valid()) + + +func defaultselector_color_proc(i_row: int): + return selector_color + + +func setselector_color_proc(instance: Object, function: String) -> void: + selector_color_proc = Callable(instance, function) + assert(selector_color_proc.is_valid()) + + +func set_selector_size_proc(instance: Object, function: String) -> void: + selector_size_proc = Callable(instance, function) + assert(selector_size_proc.is_valid()) + + +func default_selector_size_proc(i_row: int, rect: Array) -> void: + get_row_rect(i_row, rect) + rect[0] = rect[0] + position.x - node_gap.x / 2.0 + rect[1] = rect[1] + position.y - node_gap.y / 2.0 + rect[2] = rect[2] + node_gap.x + rect[3] = rect[3] + node_gap.y + + +func clear_rows_selected(): + var rows_count: = get_rows_count() + for i_row in rows_count: + set_row_selected(i_row, false) + + +func set_row_selected(i_row: int, selected: bool = true) -> void: + var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + var parent = get_parent() + if nodes.has(key) and (not selected): + var selector = nodes[key] + parent.remove_child(selector) + selector.queue_free() + nodes.erase(key) + elif (not nodes.has(key)) and selected: + var selector = ScnSelector.instantiate() + var rect: = [0, 0, 0, 0] + selector_size_proc.call(i_row, rect) + selector.position.x = rect[0] + selector.position.y = rect[1] + selector.size.x = rect[2] + selector.size.y = rect[3] + selector.modulate = selector_color_proc.call(i_row) + nodes[key] = selector + parent.add_child(selector) + + +func is_row_selected(i_row: int) -> bool: + var key: = get_node_key(ROW_SELECTOR_KEY_FORMAT, 0, i_row) + return nodes.has(key) + + +func get_selected_rows(rows: Array) -> void: + for key in nodes.keys(): + if SLCT_PREFIX in key: + var indexes = get_key_indexes(key) + rows.append(indexes[1]) + + +func get_rows_count() -> int: + var rows_count: int = 0 + for key in nodes: + rows_count += int(NODE_PREFIX in key) + return rows_count / columns + + +func get_node2(i_col: int, i_row: int) -> Node: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + return nodes[key] + + +func set_node_user_data(i_col: int, i_row: int, user_data: Object) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key] = user_data + + +func add_row(row_types: Array) -> void: + assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(row_types.size()) + else: + assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()]) + var rows_count: int = get_rows_count() + assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) + for i_col in columns: + var node = row_types[i_col].instantiate() + var key: String = NODE_KEY_FORMAT % [rows_count, i_col] + node.name = key + add_child(node) + nodes[key] = node + + +func set_header(header_types: Array): + assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1)) + if columns == 1: + set_columns(header_types.size()) + else: + assert(columns == header_types.size()) + var do_adj: = false + if not header: + header = GridContainer.new() + header.position = position + header.columns = header_types.size() + header.size.x = size.x + var parent = get_parent() + parent.add_child(header) + do_adj = true + else: + var childrens = header.get_children() + for node in childrens: + childrens.erase(node.name) + childrens.remove_child(node) + node.queue_free() + for i_col in columns: + var node = header_types[i_col].instantiate() + var key: String = HEAD_KEY_FORMAT % [0, i_col] + node.name = key + nodes[key] = node + header.add_child(node) + if do_adj: + var rect = [0, 0, 0, 0] + get_node_rect(0, 0, rect, HEAD_KEY_FORMAT) + position.y += rect[3] + + +func set_header_text(headers: Array): + assert(columns == headers.size()) + set_row_text(0, headers, 0, HEAD_KEY_FORMAT) + + +func get_node_user_data(i_col: int, i_row: int) -> Object: + var key: = get_node_key(DATA_KEY_FORMAT, i_col, i_row) + return nodes[key] + + +func remove_row(i_row: int): + var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] + if nodes.has(sel_key): + var selector = nodes[sel_key] + get_parent().remove_child(selector) + selector.queue_free() + nodes.erase(sel_key) + for i_col in columns: + var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + nodes.erase(node_key) + remove_child(node) + node.queue_free() + + if nodes.has(data_key): + nodes.erase(data_key) + if nodes.has(conn_key): + var conn = nodes[conn_key] + var callback = conn[0] + var dest_node = conn[1] + node.disconnect('pressed', Callable(dest_node, callback)) + nodes.erase(conn_key) + + +func rehash(swaps: Array): + """ Переназначает ключи в соответствии с размерами таблицы. + После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """ + assert(not swaps.size(), 'ошибка: swaps не пустой') + var nodes_copy: = {} + var i_col: = 0 + var i_row: = 0 + for key0 in nodes: + if NODE_PREFIX in key0: + var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col] + nodes_copy[node_key1] = nodes[key0] + swaps.append([key0, node_key1]) + + var indxs = get_key_indexes(key0) + + var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(slct_key0): + var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col] + nodes_copy[slct_key1] = nodes[slct_key0] + swaps.append([slct_key0, slct_key1]) + + var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(conn_key0): + var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + nodes_copy[conn_key1] = nodes[conn_key0] + swaps.append([conn_key0, conn_key1]) + + var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]] + if nodes.has(data_key0): + var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col] + nodes_copy[data_key1] = nodes[data_key0] + swaps.append([data_key0, data_key1]) + + i_col += 1 + if i_col == columns: + i_col = 0 + i_row += 1 + nodes.clear() + nodes.merge(nodes_copy) + + +func clear_rows() -> void: + """ Удаляет все строки таблицы """ + var rows_count: int = get_rows_count() + for i_row in rows_count: + remove_row(i_row) + + +func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void: + """ Настраивает обратные вызовы для колонок. + :dest_node: Получатель события + :event_name: Имя события + :callback: Имя функции получателя события + :clmns: Индексы колонок + :user_data: Аргументы функции получателя события """ + var rows_count = get_rows_count() + for i_row in rows_count: + for i_col in clmns: + assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col) + var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] + var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col] + var node = nodes[node_key] + if nodes.has(conn_key): + var conn = nodes[conn_key] + var prev_callback = conn[0] + var prev_dest_node = conn[1] + node.disconnect(event_name, Callable(prev_dest_node, prev_callback)) + assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data))) + nodes[conn_key] = [callback, dest_node] + + +func set_rows_text(rows: Array) -> void: + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + node.text = rows[i_row][i_col] + + +func set_nodes_min_size(i_row: int, sizes: Array, key_format: String = NODE_KEY_FORMAT) -> void: + for i_col in columns: + var key: = get_node_key(key_format, i_col, i_row) + var node = nodes[key] + node.custom_minimum_size.x = sizes[i_col] + node.size.x = sizes[i_col] + + +func set_node_text(i_col: int, i_row: int, val: String) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].text = val + + +func set_rows_state(rows: Array) -> void: + for i_row in rows.size(): + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = rows[i_row][i_col] + + +func set_node_state(i_col: int, i_row: int, val: bool) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].button_pressed = val + + +func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + var node = nodes[key] + var sprite = node.get_node(node_name) + sprite.frame = val + + +func set_node_editable(i_col: int, i_row: int, val: bool) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].editable = val + + +func set_node_alligment(i_col: int, i_row: int, val: int) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + if 'horizontal_alignment' in nodes[key]: + nodes[key].horizontal_alignment = val + elif 'alignment' in nodes[key]: + nodes[key].alignment = val + + +func set_row_alligments(i_row: int, aligns: Array) -> void: + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].align = aligns[i_col] + + +func get_row_text(i_row: int) -> Array: + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key].text) + return row + + +func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void: + assert((i_begin + row.size()) < columns) + for i_col in columns - i_begin: + var key: = get_node_key(key_format, i_col + i_begin, i_row) + nodes[key].text = row[i_col] + + +func get_rows_text() -> Array: + var rows_count: = get_rows_count() + var rows: = [] + for i_row in rows_count: + var row = get_row_text(i_row) + rows.append(row) + return rows + + +func get_row(i_row: int) -> Array: + var row: = [] + for i_col in columns: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + row.append(nodes[key]) + return row + + +func get_node_rect(i_col: int, i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var key: = get_node_key(key_format, i_col, i_row) + var cell = nodes[key] + rect[0] = cell.position.x + rect[1] = cell.position.y + rect[2] = cell.size.x + rect[3] = cell.size.y + + +func get_row_rect(i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void: + assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата') + var cell0 = nodes[get_node_key(key_format, 0, i_row)] + var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)] + rect[0] = cell0.position.x + rect[1] = cell0.position.y + rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x + rect[3] = cell0.size.y