Доработка. Устраненение пикселизации для сетки диаграммы, внешней и внутренней границы
This commit is contained in:
@@ -7,14 +7,16 @@ const color1_default: Color = Color(0.39, 0.44, 0.50, 1.0)
|
|||||||
var color0: Color = color0_default
|
var color0: Color = color0_default
|
||||||
var color1: Color = color1_default
|
var color1: Color = color1_default
|
||||||
|
|
||||||
var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС.
|
var fs_default_colors: PackedColorArray ## Цвета по умолчанию для блоков ФС
|
||||||
|
var image: Image
|
||||||
|
|
||||||
@export var SecZap: PackedScene
|
@export var SecZap: PackedScene
|
||||||
@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО
|
@export var inner_radius_0: = 0.36 ## Внутренний радиус диаграммы в режиме РТО
|
||||||
@export var inner_radius_1: = 0.855 ## Внутренний радиус диаграммы в обзора
|
@export var inner_radius_1: = 0.855 ## Внутренний радиус диаграммы в обзора
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
image = Image.create(NUM_OF_RANGE * NUM_OF_DIRECTIONS, 1, false, Image.FORMAT_RGBA8)
|
||||||
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
|
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
|
||||||
ProjectSettings.connect('settings_changed', _on_settings_changed)
|
ProjectSettings.connect('settings_changed', _on_settings_changed)
|
||||||
_on_settings_changed()
|
_on_settings_changed()
|
||||||
@@ -23,7 +25,6 @@ func _ready() -> void:
|
|||||||
|
|
||||||
func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125
|
func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125
|
||||||
|
|
||||||
func set_band_colors(val: PackedColorArray): material.set('shader_parameter/ant_band_c', val)
|
|
||||||
func set_band_failures(val: PackedInt32Array): material.set('shader_parameter/ant_band_m', val)
|
func set_band_failures(val: PackedInt32Array): material.set('shader_parameter/ant_band_m', val)
|
||||||
func set_canvas_rotation(val: float): material.set('shader_parameter/rotation', val)
|
func set_canvas_rotation(val: float): material.set('shader_parameter/rotation', val)
|
||||||
func set_radius_inner_frac(val: float): material.set('shader_parameter/inner_radius', val)
|
func set_radius_inner_frac(val: float): material.set('shader_parameter/inner_radius', val)
|
||||||
@@ -49,6 +50,14 @@ func get_strob_visible() -> bool: return $строб.visible
|
|||||||
func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width')
|
func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width')
|
||||||
|
|
||||||
|
|
||||||
|
## Выставляет цвета для секторов
|
||||||
|
func set_band_colors(val: PackedColorArray):
|
||||||
|
for x in val.size():
|
||||||
|
image.set_pixel(x, 0, val[x])
|
||||||
|
var tex = ImageTexture.create_from_image(image)
|
||||||
|
material.set('shader_parameter/sec_colors', tex)
|
||||||
|
|
||||||
|
|
||||||
## Добавляет сектор запрета[br]
|
## Добавляет сектор запрета[br]
|
||||||
## [param id] - Индекс сектора запрета.[br]
|
## [param id] - Индекс сектора запрета.[br]
|
||||||
## [param szv.x] - Центральная частота (198...546).[br]
|
## [param szv.x] - Центральная частота (198...546).[br]
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ shader_parameter/ffr = 0.15
|
|||||||
shader_parameter/sfr = 0.0
|
shader_parameter/sfr = 0.0
|
||||||
shader_parameter/pfr = 0.013
|
shader_parameter/pfr = 0.013
|
||||||
shader_parameter/afr = 0.0
|
shader_parameter/afr = 0.0
|
||||||
shader_parameter/ant_band_c = PackedColorArray(0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647, 0.784314, 0.784314, 0.784314, 0.784314, 0.917647, 0.917647, 0.917647, 0.917647)
|
|
||||||
shader_parameter/ant_band_m = PackedInt32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
shader_parameter/ant_band_m = PackedInt32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lniyv"]
|
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lniyv"]
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ shader_type canvas_item;
|
|||||||
#define ANT_BAND_ASSIGNED 2U /* Антенна (модуль ФС) назначена на излучение */
|
#define ANT_BAND_ASSIGNED 2U /* Антенна (модуль ФС) назначена на излучение */
|
||||||
#define ANT_BAND_SELECTED 4U /* Антенна (модуль ФС) выбрана оператором */
|
#define ANT_BAND_SELECTED 4U /* Антенна (модуль ФС) выбрана оператором */
|
||||||
#define ANT_BAND_ACTIVE 8U /* Антенна (модуль ФС) излучает */
|
#define ANT_BAND_ACTIVE 8U /* Антенна (модуль ФС) излучает */
|
||||||
#define ANT_BAND_DENIED 16U /* Антенна (модуль ФС) излучает */
|
#define ANT_BAND_DENIED 16U /* Антенна (модуль ФС) запрет работы */
|
||||||
|
|
||||||
|
#define PI2 (PI * 2.0)
|
||||||
|
|
||||||
// Конфигурация сетки
|
// Конфигурация сетки
|
||||||
uniform int grid_cells_angle = 4; /* Количество секторов (90° каждый) */
|
uniform int grid_cells_angle = 4; /* Количество секторов (90° каждый) */
|
||||||
@@ -22,8 +24,7 @@ uniform float sfr: hint_range(0.0, 10.0) = 0.0; /* Индикация неис
|
|||||||
uniform float pfr: hint_range(0.01, 1.0) = 0.025; /* Индикация неисправности модулей ФС. Частота штриховки */
|
uniform float pfr: hint_range(0.01, 1.0) = 0.025; /* Индикация неисправности модулей ФС. Частота штриховки */
|
||||||
uniform float afr: hint_range(0.0, 180.0) = 0.0; /* Индикация неисправности модулей ФС. Угол наклона штриховки */
|
uniform float afr: hint_range(0.0, 180.0) = 0.0; /* Индикация неисправности модулей ФС. Угол наклона штриховки */
|
||||||
|
|
||||||
// Вариант 1: Массив цветов для каждой ячейки (4×7 = 28)
|
uniform sampler2D sec_colors; /* Цвета для секторов */
|
||||||
uniform vec4 ant_band_c[28]: source_color;
|
|
||||||
uniform uint ant_band_m[28];
|
uniform uint ant_band_m[28];
|
||||||
varying vec2 centered_uv;
|
varying vec2 centered_uv;
|
||||||
|
|
||||||
@@ -40,26 +41,14 @@ void fragment()
|
|||||||
{
|
{
|
||||||
float dist = length(centered_uv);
|
float dist = length(centered_uv);
|
||||||
|
|
||||||
// 2. Отсекаем за пределами внешнего радиуса
|
|
||||||
if (dist > outer_radius) {
|
|
||||||
COLOR = vec4(0.0);
|
|
||||||
discard;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Отсекаем внутри внутреннего радиуса
|
|
||||||
if (dist < inner_radius) {
|
|
||||||
COLOR = vec4(0.0);
|
|
||||||
discard;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. Вычисляем полярные координаты
|
// 4. Вычисляем полярные координаты
|
||||||
float angle = 6.28318530718 - atan(centered_uv.y, centered_uv.x);
|
float angle = PI2 - atan(centered_uv.y, centered_uv.x);
|
||||||
// Приводим к диапазону 0..2π
|
// Приводим к диапазону 0..2π
|
||||||
angle = mod(angle + 6.28318530718, 6.28318530718);
|
angle = mod(angle + PI2, PI2);
|
||||||
|
|
||||||
// 5. Определяем индексы ячейки
|
// 5. Определяем индексы ячейки
|
||||||
// Сектор (0..3)
|
// Сектор (0..3)
|
||||||
float sector_width = 6.28318530718 / float(grid_cells_angle);
|
float sector_width = PI2 / float(grid_cells_angle);
|
||||||
int sector_idx = int(angle / sector_width);
|
int sector_idx = int(angle / sector_width);
|
||||||
|
|
||||||
// Слой (0..6)
|
// Слой (0..6)
|
||||||
@@ -68,17 +57,12 @@ void fragment()
|
|||||||
float layer_height = 1.0 / float(grid_layers_radius);
|
float layer_height = 1.0 / float(grid_layers_radius);
|
||||||
int layer_idx = int(normalized_radius / layer_height);
|
int layer_idx = int(normalized_radius / layer_height);
|
||||||
|
|
||||||
// 6. Проверяем границы (чтобы не выйти за пределы)
|
|
||||||
if (layer_idx >= grid_layers_radius) {
|
|
||||||
COLOR = vec4(0.0);
|
|
||||||
discard;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 7. Рассчитываем глобальный индекс ячейки (0..27)
|
// 7. Рассчитываем глобальный индекс ячейки (0..27)
|
||||||
int cell_index = layer_idx * grid_cells_angle + sector_idx;
|
int cell_index = layer_idx * grid_cells_angle + sector_idx;
|
||||||
|
|
||||||
// 8. Получаем цвет ячейки (два варианта) из массива цветов
|
// 8. Получаем цвет ячейки из массива цветов
|
||||||
vec4 cell_color = ant_band_c[cell_index];
|
ivec2 sz = textureSize(sec_colors, 0);
|
||||||
|
vec4 cell_color = texture(sec_colors, vec2((float(cell_index) + 0.5) / float(sz.x), 4));
|
||||||
|
|
||||||
// Границы по углу
|
// Границы по углу
|
||||||
float angle_in_sector = mod(angle, sector_width);
|
float angle_in_sector = mod(angle, sector_width);
|
||||||
@@ -102,5 +86,16 @@ void fragment()
|
|||||||
rotate_vec2(uvr, radians(afr), vec2(0, 0));
|
rotate_vec2(uvr, radians(afr), vec2(0, 0));
|
||||||
cell_color.a *= (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * uvr.x / pfr)) * ffr;
|
cell_color.a *= (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * uvr.x / pfr)) * ffr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2. Отсекаем за пределами внешнего радиуса
|
||||||
|
v0 = outer_radius - 0.002;
|
||||||
|
v1 = outer_radius + 0.0001;
|
||||||
|
cell_color.a *= smoothstep(v1, v0, dist);
|
||||||
|
|
||||||
|
// 3. Отсекаем внутри внутреннего радиуса
|
||||||
|
v0 = inner_radius - 0.0001;
|
||||||
|
v1 = inner_radius + 0.002;
|
||||||
|
cell_color.a *= smoothstep(v0, v1, dist);
|
||||||
|
|
||||||
COLOR = cell_color;
|
COLOR = cell_color;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user