From 2ff430c3815dae1d5d56882001ff8a52e6a9666b Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 7 Feb 2025 08:32:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PRD_MP550.tscn | 45 ++++++- load.gdshader => Shaders/load.gdshader | 0 Shaders/loadead.gdshader | 118 +++++++++++++++++++ opt_btn.gdshader => Shaders/opt_btn.gdshader | 0 ray_2.gdshader => Shaders/ray_2.gdshader | 0 light_ind.tscn | 2 +- scripts/constants.gd | 23 ++-- table/элемент-в.tscn | 2 +- 8 files changed, 172 insertions(+), 18 deletions(-) rename load.gdshader => Shaders/load.gdshader (100%) create mode 100644 Shaders/loadead.gdshader rename opt_btn.gdshader => Shaders/opt_btn.gdshader (100%) rename ray_2.gdshader => Shaders/ray_2.gdshader (100%) diff --git a/PRD_MP550.tscn b/PRD_MP550.tscn index 3860e19..3c6c464 100644 --- a/PRD_MP550.tscn +++ b/PRD_MP550.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=49 format=3 uid="uid://cvor2jm4xk3ha"] +[gd_scene load_steps=53 format=3 uid="uid://cvor2jm4xk3ha"] [ext_resource type="Script" path="res://scripts/PRD.gd" id="1_v273n"] [ext_resource type="Texture2D" uid="uid://cdxdluvyb5uei" path="res://table/on.png" id="2_dv7xx"] @@ -7,14 +7,15 @@ [ext_resource type="Texture2D" uid="uid://cfktmk2rowmul" path="res://table/off.png" id="3_qvuyu"] [ext_resource type="Shader" path="res://Shaders/ray.gdshader" id="4_uy5o2"] [ext_resource type="Texture2D" uid="uid://co8dxcd8eckjs" path="res://Web.png" id="5_i3nvb"] -[ext_resource type="Shader" path="res://ray_2.gdshader" id="8_12mng"] +[ext_resource type="Shader" path="res://Shaders/ray_2.gdshader" id="8_12mng"] [ext_resource type="Texture2D" uid="uid://cgtg4gbqnuxrc" path="res://nine-patch-round.png" id="9_0r2qk"] [ext_resource type="Script" path="res://scripts/control_panel.gd" id="9_akagi"] [ext_resource type="Script" path="res://scripts/ems_g.gd" id="9_g1wia"] -[ext_resource type="Shader" path="res://load.gdshader" id="10_lf1xh"] +[ext_resource type="Shader" path="res://Shaders/load.gdshader" id="10_lf1xh"] [ext_resource type="PackedScene" uid="uid://bdb0bhfu7366l" path="res://kasseta-fs-kd.tscn" id="10_tdh2s"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://table/элемент-в.tscn" id="11_fg7ul"] [ext_resource type="Script" path="res://scripts/modul_fs.gd" id="15_b4pr1"] +[ext_resource type="Shader" path="res://Shaders/loadead.gdshader" id="16_4osrw"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_eib3t"] bg_color = Color(0.223529, 0.168627, 0.223529, 1) @@ -129,6 +130,35 @@ shader_parameter/inner_radius = 0.32 [sub_resource type="StyleBoxTexture" id="StyleBoxTexture_ooo4i"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_cm644"] +shader = ExtResource("16_4osrw") +shader_parameter/dot_scale = 0.5 +shader_parameter/ring_radius = 0.2 +shader_parameter/num_points = 8 +shader_parameter/gap_ratio = 0.102 +shader_parameter/all_dots_same_size = false +shader_parameter/dot_color_start = Color(0.5, 0, 0.5, 1) +shader_parameter/dot_color_end = Color(0.8, 0.5, 1, 1) +shader_parameter/enable_shadow = true +shader_parameter/shadow_color = Color(0, 0, 0, 0.35) +shader_parameter/shadow_offset = Vector2(0.03, 0.01) +shader_parameter/rotation_speed = 1.5 +shader_parameter/icon_size = 0.15 +shader_parameter/enable_icon_rotation = false +shader_parameter/reverse_icon_rotation = false +shader_parameter/icon_rotation_speed = 1.0 +shader_parameter/show_icon = false + +[sub_resource type="Gradient" id="Gradient_kvhy4"] +colors = PackedColorArray(1, 1, 1, 1, 0, 0, 0, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_2sr0p"] +gradient = SubResource("Gradient_kvhy4") +width = 100 +height = 150 +fill = 1 +fill_from = Vector2(0.521368, 0.512821) + [sub_resource type="ShaderMaterial" id="ShaderMaterial_slcfo"] shader = ExtResource("10_lf1xh") shader_parameter/frequency = 5.0 @@ -738,6 +768,14 @@ offset_bottom = 782.0 color = Color(0, 0, 0, 0.596078) metadata/_edit_lock_ = true +[node name="win_load" type="TextureButton" parent="TabContainer/EMS_G/load_boadr"] +material = SubResource("ShaderMaterial_cm644") +offset_left = 730.0 +offset_top = 311.0 +offset_right = 830.0 +offset_bottom = 461.0 +texture_normal = SubResource("GradientTexture2D_2sr0p") + [node name="load" type="Sprite2D" parent="TabContainer/EMS_G/load_boadr"] material = SubResource("ShaderMaterial_slcfo") position = Vector2(785.001, 361.5) @@ -746,6 +784,7 @@ texture = SubResource("GradientTexture2D_0pk2o") metadata/_edit_lock_ = true [node name="Load_text" type="Label" parent="TabContainer/EMS_G/load_boadr"] +visible = false layout_mode = 0 offset_left = 693.0 offset_top = 341.0 diff --git a/load.gdshader b/Shaders/load.gdshader similarity index 100% rename from load.gdshader rename to Shaders/load.gdshader diff --git a/Shaders/loadead.gdshader b/Shaders/loadead.gdshader new file mode 100644 index 0000000..0dc4058 --- /dev/null +++ b/Shaders/loadead.gdshader @@ -0,0 +1,118 @@ +shader_type canvas_item; + +// Конфигурационные униформы для кольца. +uniform float dot_scale : hint_range(0.1, 9.1) = 0.5; // Масштаб точек кольца. +uniform float ring_radius : hint_range(0.1, 1.0) = 0.2; // Радиус кольца. +uniform int num_points : hint_range(3, 10) = 8; // Количество точек на кольце. +uniform float gap_ratio : hint_range(0.0, 0.9) = 0.22; // Отношение пробелов между точками. +uniform bool all_dots_same_size = false; // Флаг, указывающий, должны ли все точки быть одинакового размера. + +// Визуальные свойства точек кольца. +uniform vec4 dot_color_start : source_color = vec4(0.5, 0.0, 0.5, 1.0); // Начальный цвет точек. +uniform vec4 dot_color_end : source_color = vec4(0.8, 0.5, 1.0, 1.0); // Конечный цвет точек. +uniform bool enable_shadow = true; // Флаг для включения/выключения теней. +uniform vec4 shadow_color : source_color = vec4(0.0, 0.0, 0.0, 0.35); // Цвет теней. +uniform vec2 shadow_offset = vec2(0.03, 0.01); // Смещение теней от точек. + +// Контроль анимации кольца. +uniform float rotation_speed : hint_range(0.0, 10.0) = 1.5; // Скорость вращения кольца. + + // Новые униформы для текстуры иконки и её внешнего вида. +uniform sampler2D icon_texture; // Текстура иконки. +uniform float icon_size : hint_range(0.0, 1.0) = 0.15; // Контроль радиуса иконки. + +// Новые униформы для контроля вращения иконки. +uniform bool enable_icon_rotation = false; // Флаг для включения вращения иконки. +uniform bool reverse_icon_rotation = false; // Флаг для инверсии вращения иконки. +uniform float icon_rotation_speed : hint_range(-10.0, 10.0) = 1.0; // Скорость вращения иконки. + +// Униформ для контроля отрисовки иконки. +uniform bool show_icon = false; // Если false, текстура иконки игнорируется. + +void fragment() { + // Преобразование UV-координат для центрирования начала координат и корректировки в зависимости от аспекта экрана. + float aspect_ratio = SCREEN_PIXEL_SIZE.x / SCREEN_PIXEL_SIZE.y; + vec2 uv = (UV * 2.0 - 1.0) * vec2(0.3, aspect_ratio); // Нормализация UV координат. + + // Подсчет кольца (точек и опциональной тени). + vec4 ring_color = vec4(0.0); // Начальный цвет кольца. + float dot_accum = 0.0; // Накапливаемый вклад от точек. + float shadow_accum = 0.0; // Накапливаемый вклад от теней. + + float total_angle = 6.283185307; // Полный круг в радианах (2π). + float gap = total_angle * gap_ratio; // Вычисление ширины пробела между точками. + float spacing = (total_angle - gap) / float(num_points); // Вычисление интервала между точками. + + // Определение направления вращения кольца. + float direction = 1.0; // Вращение по часовой стрелке или против. + float rotation = TIME * rotation_speed * direction; // Вычисление текущего угла поворота. + + for (int i = 0; i < num_points; i++) { // Проход по каждой точке кольца. + float angle = rotation + spacing * float(i); // Вычисление угла для данной точки. + + vec2 pos = vec2(cos(angle), sin(angle)) * ring_radius; // Вычисление позиции точки по окружности. + + // Вычисление размера точки: + float size_factor = 0.5 + (float(i) / float(num_points)); // Фактор уменьшения размера. + float radius = all_dots_same_size ? 0.1 * dot_scale : 0.1 * size_factor * dot_scale; // Радиус точки. + + // Интерполяция цвета точки вдоль кольца от начала к концу. + float gradient_factor = float(i) / float(num_points - 1); // Фактор градиента для цветовой интерполяции. + vec4 dot_color = mix(dot_color_start, dot_color_end, gradient_factor); // Цвет точки. + + // Вычисление вклада точки на основе расстояния. + float distance = length(uv - pos); // Расстояние до текущей точки. + float contribution = smoothstep(radius + 0.01, radius, distance); // Плавный вклад на основе расстояния. + + if (contribution > 0.0) { // Если вклад точки больше нуля, + ring_color = mix(ring_color, dot_color, contribution); // Смешивание с цветом кольца. + dot_accum += contribution; // Накопление вклада от точки. + } + + // Опциональная тень за каждой точкой. + if (enable_shadow) { + vec2 shadow_pos = pos + shadow_offset; // Позиция для тени. + float shadow_dist = length(uv - shadow_pos); // Расстояние до тени. + float shadow_contrib = smoothstep(radius * 1.2 + 0.005, radius * 1.2, shadow_dist); // Вклад от тени. + shadow_accum += shadow_contrib; // Накопление вклада от теней. + } + } + + // Определение базового цвета для кольца или тени. + vec4 base_color = vec4(0.0); // Начальный цвет. + if (dot_accum > 0.0) { // Если есть вклад от точек, + base_color = ring_color; // Установка базового цвета на цвет кольца. + } else if (enable_shadow && shadow_accum > 0.0) { // Если тени включены и есть вклад от теней, + base_color = shadow_color; // Установка базового цвета на цвет тени. + } + + // Отрисовка иконки - приступаем только если show_icon истинно. + if (show_icon) { + // Создание радиальной маски, чтобы иконка была видимой внутри радиуса icon_size. + float icon_mask = smoothstep(icon_size, icon_size - 0.005, length(uv)); // Маска для иконки. + + // Нормализация UV-координат для иконки. + vec2 icon_uv = (uv / icon_size + vec2(1.0)) / 2.0; // Превращение из диапазона (-icon_size ... +icon_size) в (0 ... 1). + + // Применение вращения иконки, если оно включено. + if (enable_icon_rotation) { + float icon_angle = TIME * icon_rotation_speed; // Угол вращения на основе времени и скорости вращения. + if (reverse_icon_rotation) { + icon_angle = -icon_angle; // Инверсия угла, если требуется. + } + // Вращение вокруг центра (0.5, 0.5) текстуры иконки. + vec2 centered_uv = icon_uv - vec2(0.5); // Смещение UV координат. + float s = sin(icon_angle); // Синус угла. + float c = cos(icon_angle); // Косинус угла. + centered_uv = vec2(centered_uv.x * c - centered_uv.y * s, + centered_uv.x * s + centered_uv.y * c); // Применение матрицы вращения. + icon_uv = centered_uv + vec2(0.5); // Смещение обратно к нормализованным координатам. + } + + vec4 icon_sample = texture(icon_texture, icon_uv); // Получение цвета из текстуры иконки. + // Смешивание текстуры иконки с базовым цветом кольца с учетом маски и альфа-канала текстуры. + base_color = mix(base_color, icon_sample, icon_mask * icon_sample.a); + } + + COLOR = base_color; // Установка финального цвета для текущего пикселя. +} \ No newline at end of file diff --git a/opt_btn.gdshader b/Shaders/opt_btn.gdshader similarity index 100% rename from opt_btn.gdshader rename to Shaders/opt_btn.gdshader diff --git a/ray_2.gdshader b/Shaders/ray_2.gdshader similarity index 100% rename from ray_2.gdshader rename to Shaders/ray_2.gdshader diff --git a/light_ind.tscn b/light_ind.tscn index 3b31873..6ab1605 100644 --- a/light_ind.tscn +++ b/light_ind.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=11 format=3 uid="uid://c7ft3pxeufffh"] -[ext_resource type="Shader" path="res://opt_btn.gdshader" id="1_sq6hl"] +[ext_resource type="Shader" path="res://Shaders/opt_btn.gdshader" id="1_sq6hl"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0dcn8"] bg_color = Color(0, 0, 0, 1) diff --git a/scripts/constants.gd b/scripts/constants.gd index f6d4d2f..bd33954 100644 --- a/scripts/constants.gd +++ b/scripts/constants.gd @@ -100,9 +100,9 @@ const OUT_x128: Array = [ 'Р', 'К', 'Откл.', - '1',] + '1' + ] const RAY_DICT: Array = [ - ' Контроль', ' -5°', ' 5°', ' 15°', @@ -110,7 +110,7 @@ const RAY_DICT: Array = [ ' 35°', ' 45°', ' Контроль', -] + ] const ATT_DICT: Array = [ ' 0 dB', ' 0.5 dB', @@ -120,20 +120,18 @@ const ATT_DICT: Array = [ ' 8.5 dB', ' 10 dB', ' 10.5 dB', -] - + ] enum BASE_PORTS { UG = 0x100, EMS_G = 0x120, UKP_1 = 0x130, UKP_2 = 0x140, } - enum MODE { PRD_K, PRD_B, PRD_H, -} + } enum Frame { WORK, ## В работе CONSTANT, ## Постоянный сигнал @@ -152,7 +150,7 @@ enum DataIndices { TEMPERATURE_UKP_1 = 47, POWER_UKP_2 = 63, TEMPERATURE_UKP_2 = 79, -} + } enum STATE { WAIT, READ_ISA, @@ -160,13 +158,12 @@ enum STATE { DONE, IDLE, SEND, -} - + } enum STATE_VAL { NONE = 0, GOOD = 1, - ERROR = 2 } - + ERROR = 2 + } var EMS_G_PORT_DATA_HOLDER: Array = [] const PORT_FS = 1201 @@ -175,7 +172,7 @@ enum GROUP { BASE = 0x00, GENERATOR = 0x03, RF = 0x06, -} + } enum CMD { START_SESSION = 0x0, diff --git a/table/элемент-в.tscn b/table/элемент-в.tscn index b2ea5f0..2c88d2b 100644 --- a/table/элемент-в.tscn +++ b/table/элемент-в.tscn @@ -3,7 +3,7 @@ [ext_resource type="Texture2D" uid="uid://ce3qpf070wgd2" path="res://состояние-исправности-0.png" id="1_2n7he"] [ext_resource type="Texture2D" uid="uid://cgtg4gbqnuxrc" path="res://nine-patch-round.png" id="2_4b43i"] [ext_resource type="Texture2D" uid="uid://byweg7pgt8o4h" path="res://состояние-исправности-1.png" id="2_38t58"] -[ext_resource type="Shader" path="res://opt_btn.gdshader" id="2_ecsml"] +[ext_resource type="Shader" path="res://Shaders/opt_btn.gdshader" id="2_ecsml"] [ext_resource type="Texture2D" uid="uid://dkef6xwxwdxi8" path="res://эмс-бланк.png" id="3_4kmgr"] [ext_resource type="Texture2D" uid="uid://bvikuv0lbvou8" path="res://состояние-исправности-2.png" id="3_i2t3v"] [ext_resource type="Texture2D" uid="uid://b15flrfytxkop" path="res://эмс-бланк-пост.png" id="4_omove"]