diff --git a/scenes/Sector.tscn b/scenes/Sector.tscn index f107e307..04c7f2dc 100644 --- a/scenes/Sector.tscn +++ b/scenes/Sector.tscn @@ -7,8 +7,9 @@ resource_local_to_scene = true shader = ExtResource("1_7cn72") shader_parameter/color = Color(1, 1, 1, 0.168627) shader_parameter/width = 45.0 -shader_parameter/inner_radius = 0.1 -shader_parameter/outer_radius = 0.125 +shader_parameter/band = 0.04 +shader_parameter/radius = 0.06 +shader_parameter/inner_clip = 0.02 [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2lkm8"] diff --git a/scenes/canvas.gd b/scenes/canvas.gd index 0c5de9f1..3808c07d 100644 --- a/scenes/canvas.gd +++ b/scenes/canvas.gd @@ -1,12 +1,17 @@ extends Sprite2D -func set_strob_color(color: Color): $строб.material.set('shader_parameter/color', color); -func set_strob_dir(dir: float): $строб.rotation_degrees = dir - 90.0 -func set_strob_width(width: float): $строб.material.set('shader_parameter/width', width) -func set_strob_band(val: float): $строб.material.set('shader_parameter/inner_radius', val) func set_strob_visible(val: bool): $строб.visible = val +func set_strob_dir(val: float): $строб.rotation_degrees = val - 90.0 +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 get_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/inner_radius') +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 index cbed991b..9a43a025 100644 --- a/scenes/canvas.tscn +++ b/scenes/canvas.tscn @@ -13,9 +13,10 @@ size = Vector2(1600, 1200) resource_local_to_scene = true shader = ExtResource("5_210ft") shader_parameter/color = Color(1, 1, 1, 0.168627) -shader_parameter/width = 97.2 -shader_parameter/inner_radius = 0.0742 -shader_parameter/outer_radius = 0.1099 +shader_parameter/width = 69.7 +shader_parameter/band = 0.019 +shader_parameter/radius = 0.085 +shader_parameter/inner_clip = 0.045 [node name="canvas" type="Sprite2D"] material = ExtResource("1_uio4c") @@ -28,5 +29,6 @@ position = Vector2(610, 600) scale = Vector2(0.2, 0.2) texture = ExtResource("3_bw5j0") -[node name="строб" parent="." instance=ExtResource("4_4hefb")] -material = SubResource("ShaderMaterial_qrcbl") +[node name="строб" parent="." instance=ExtResource("4_ev5xv")] +material = SubResource("ShaderMaterial_c08th") +scale = Vector2(1100, 1100) diff --git a/scenes/работа.gd b/scenes/работа.gd index ab75b6e9..fc3091cb 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -1,12 +1,15 @@ 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: float +@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 enum DRAG_FSM { IDLE, DRAG, DISABLE } @@ -33,6 +36,9 @@ var strob_band_begin: float var strob_center: Vector2 """ Центр антенн """ +var shift_pressed: bool +""" Кнопка SHIFT нажата """ + signal drag_begin """ Вызывается в момент начала перетаскивания """ @@ -93,37 +99,40 @@ func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: func get_strob_width(pos: Vector2, prev: float) -> float: - var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) / drag_scale + 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.x - pos.x) / drag_scale + 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_dir(pos: Vector2): +func set_strob(pos: Vector2): var radp: Vector2 = map_dec_to_rad(strob_center, pos) - if radp.y < 600.0: + 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: - var strob_width: float = get_strob_width(event.position, strob_width_begin) - $canvas.set_strob_width(strob_width) - #var strob_band: float = get_strob_band(event.position, strob_band_begin) - #$canvas.set_strob_band(strob_band) + 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_dir(event.position) + set_strob(event.position) func _on_drag_begin(event): drag_pos_begin = event.position if drag_button == MOUSE_BUTTON_LEFT: - set_strob_dir(event.position) + set_strob(event.position) elif drag_button == MOUSE_BUTTON_RIGHT: strob_width_begin = $canvas.get_strob_width() strob_band_begin = $canvas.get_strob_band() @@ -145,6 +154,8 @@ func _input(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): @@ -157,5 +168,5 @@ func toggle_full_screen(id: int): func _on_full_screen(): - toggle_full_screen(1) - toggle_full_screen(0) + toggle_full_screen(window_1_id) + toggle_full_screen(window_0_id) diff --git a/scenes/работа.tscn b/scenes/работа.tscn index 6e5a1053..d833d7b7 100644 --- a/scenes/работа.tscn +++ b/scenes/работа.tscn @@ -13,9 +13,11 @@ 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 = 200.0 -strob_max_band = 600.0 -drag_scale = 5.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_ = [] [node name="canvas" parent="." instance=ExtResource("2_pmw7s")] diff --git a/shaders/sector.gdshader b/shaders/sector.gdshader index 72f5b14e..d5c00f5d 100644 --- a/shaders/sector.gdshader +++ b/shaders/sector.gdshader @@ -2,12 +2,14 @@ shader_type canvas_item; /* Закрашенный сектор окружности ограниченный угловым сектором и радиусами */ -uniform vec4 color: source_color = vec4(1, 1, 1, 1); -uniform float width: hint_range(0.0, 360.0, 0.1) = 45.0; -uniform float inner_radius: hint_range(0.0, 0.125) = 0.1; -uniform float outer_radius: hint_range(0.0, 0.125) = 0.125; +uniform vec4 color: source_color = vec4(1, 1, 1, 1); +uniform float width: hint_range(0.0, 360.0, 0.1) = 45.0; +uniform float band: hint_range(0.0, 0.125) = 0.04; +uniform float radius: hint_range(0.0, 0.125) = 0.06; +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 vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */ const float dsa = 0.0025; /* Относительное расстояние на котором выполняется сглаживание краёв по радиальным линиям */ const float dsr = 0.00025; /* Относительное расстояние на котором выполняется сглаживание краёв по круговым линиям */ @@ -20,12 +22,27 @@ float smooth_px(float r, float R, float ds) vec4 sector(vec4 c, vec2 uv_pos, float r0, float r1, float w) { - vec2 d = uv_pos - center; + 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 *= vec4(1.0, 0.5, 0.5, 1.0); + } return c * sqrt(va * vr); } @@ -40,5 +57,6 @@ void rotate_vec2(inout vec2 vert, float a) void fragment() { - COLOR = sector(color, UV, inner_radius, outer_radius, width); + float dr = band / 2.0; + COLOR = sector(color, UV, radius - dr, radius + dr, width); }