From aa44311c1f7019fe22d1c1ac34f8ad64517598c0 Mon Sep 17 00:00:00 2001 From: teatov Date: Sun, 3 Aug 2025 03:03:42 +1000 Subject: [PATCH] make keyboard and keys tool scripts and add editor keys generation --- scenes/game_key.tscn | 2 +- scenes/game_keyboard.tscn | 2 +- scenes/player.tscn | 1 + scripts/game_key.gd | 39 ++++++++++++++++++++---- scripts/game_keyboard.gd | 48 +++++++++++++++++++++++++----- scripts/globals/layout_config.gd | 8 +---- scripts/key_props.gd | 39 ++++++++++++------------ scripts/layouts/abstract_layout.gd | 10 +++++++ 8 files changed, 108 insertions(+), 41 deletions(-) diff --git a/scenes/game_key.tscn b/scenes/game_key.tscn index 187eb37..43db1d1 100644 --- a/scenes/game_key.tscn +++ b/scenes/game_key.tscn @@ -171,13 +171,13 @@ omni_range = 2.0 [node name="AdjacencyLight" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.45, 0) +visible = false light_color = Color(0.8325, 1, 0.33, 1) omni_range = 0.6 [node name="SFXPlayer" type="AudioStreamPlayer3D" parent="."] stream = SubResource("AudioStreamPolyphonic_6rsff") volume_db = -15.0 -autoplay = true bus = &"SFX" attenuation_filter_cutoff_hz = 20500.0 diff --git a/scenes/game_keyboard.tscn b/scenes/game_keyboard.tscn index 73315e8..39a35c7 100644 --- a/scenes/game_keyboard.tscn +++ b/scenes/game_keyboard.tscn @@ -39,6 +39,6 @@ visible = false mesh = SubResource("BoxMesh_j5t22") [node name="RectMesh" type="MeshInstance3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.968737, 0) +transform = Transform3D(16.4, 0, 0, 0, 1, 0, 0, 0, 5.4, 0, -0.968737, 0) visible = false mesh = SubResource("QuadMesh_j5t22") diff --git a/scenes/player.tscn b/scenes/player.tscn index 3115720..3da0cbf 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" uid="uid://dmfdlb4ae57qv" path="res://scripts/player.gd" id="1_3vyb7"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3vyb7"] +metallic_specular = 0.0 [sub_resource type="BoxMesh" id="BoxMesh_u8vuu"] material = SubResource("StandardMaterial3D_3vyb7") diff --git a/scripts/game_key.gd b/scripts/game_key.gd index 603015f..24030d6 100644 --- a/scripts/game_key.gd +++ b/scripts/game_key.gd @@ -1,6 +1,9 @@ +@tool class_name GameKey extends Node3D #region variables +@export var props: KeyProps + @export_group("References") @export var player_pos_marker: Node3D @@ -42,7 +45,6 @@ class_name GameKey extends Node3D @export var _press_sfx: AudioStream @export var _release_sfx: AudioStream -var props: KeyProps var player_transform: Transform3D var _keyboard: GameKeyboard @@ -54,8 +56,7 @@ var _default_position: Vector3 var _default_rotation: Vector3 var _pos_sod: SecondOrderDynamics -@onready -var _polyphonic := _sfx_player.get_stream_playback() as AudioStreamPlaybackPolyphonic +@onready var _polyphonic: AudioStreamPlaybackPolyphonic @onready var _light_energy := _press_light.light_energy #endregion @@ -96,6 +97,16 @@ static func sort_func(a: GameKey, b: GameKey) -> bool: #region builtins func _ready() -> void: + if ( + Engine.is_editor_hint() + and not _keyboard + and get_tree().edited_scene_root is GameKeyboard + ): + _keyboard = get_tree().edited_scene_root + load_props(props, position, rotation.y) + elif not _keyboard: + return + _adjacency_light.visible = false _keyboard.layout_size_changed.connect(_on_keyboard_layout_size_changed) _keyboard.keys_requested.connect(_on_keyboard_keys_requested) @@ -104,13 +115,22 @@ func _ready() -> void: _keyboard.player_finished_move.connect(_on_keyboard_player_finished_move) _set_labels() + if Engine.is_editor_hint(): + return + _sfx_player.play() + _polyphonic = _sfx_player.get_stream_playback() + func _process(delta: float) -> void: + if Engine.is_editor_hint(): + return _animate(delta) _animate_light(delta) func _unhandled_input(event: InputEvent) -> void: + if Engine.is_editor_hint(): + return if event.is_action_pressed("reset_animations"): _reset_animations() return @@ -157,7 +177,8 @@ func _unhandled_input(event: InputEvent) -> void: func _exit_tree() -> void: - _erase_keyboard_pressed_position() + if _keyboard: + _erase_keyboard_pressed_position() #endregion @@ -231,7 +252,11 @@ func _set_labels(chars_dict: Dictionary[KeyProps.Char, String] = {}) -> void: func _set_labels_text(chars_dict: Dictionary[KeyProps.Char, String]) -> void: - if props.physical_keycode == KEY_SPACE or not props.is_unicode(): + if ( + Engine.is_editor_hint() + or props.physical_keycode == KEY_SPACE + or not props.is_unicode() + ): _center_label.text = OS.get_keycode_string(props.physical_keycode) return @@ -398,6 +423,10 @@ func _on_keyboard_layout_size_changed(rect: Rect2) -> void: _default_position.z -= center.y _set_keyboard_pressed_position(_is_pressed) + if Engine.is_editor_hint(): + position = _default_position + return + if not _pos_sod: _reset_animations() diff --git a/scripts/game_keyboard.gd b/scripts/game_keyboard.gd index 93f1c6b..ad3de64 100644 --- a/scripts/game_keyboard.gd +++ b/scripts/game_keyboard.gd @@ -1,3 +1,4 @@ +@tool class_name GameKeyboard extends Node3D #region variables @@ -9,6 +10,11 @@ signal is_configuring_changed(value: bool) signal player_key_changed(game_key: GameKey) signal player_finished_move(game_key: GameKey) +@export_tool_button("Generate keys") +var generate_editor_keys_btn := _generate_editor_keys +@export_tool_button("Delete keys") var delete_editor_keys_btn := _delete_editor_keys +@export_tool_button("Request keys") var request_keys_btn := _request_keys + @export_group("References") @export var _keys_holder: Node3D @export var _sfx_player: AudioStreamPlayer3D @@ -46,8 +52,7 @@ var _requested_keys_limit: int = 0 deg_to_rad(_pressing_lean_deg.x), deg_to_rad(_pressing_lean_deg.y) ) @onready var _default_rotation: Vector3 = _keys_holder.rotation -@onready -var _polyphonic := _sfx_player.get_stream_playback() as AudioStreamPlaybackPolyphonic +@onready var _polyphonic: AudioStreamPlaybackPolyphonic #endregion @@ -65,16 +70,24 @@ static func get_rotated_key_pos( #region builtins func _ready() -> void: + if Engine.is_editor_hint(): + _generate_editor_keys() + return + _polyphonic = _sfx_player.get_stream_playback() prompt_pages_total = ceili(LayoutConfig.layouts.size() / 9.0) - _generate_keys(LayoutConfig.layout_rows) + _generate_keys() _reset_animations() func _process(delta: float) -> void: + if Engine.is_editor_hint(): + return _animate(delta) func _unhandled_input(event: InputEvent) -> void: + if Engine.is_editor_hint(): + return if event.is_action_pressed("reset_animations"): _reset_animations() return @@ -162,9 +175,9 @@ func key_request_respond(game_key: GameKey) -> void: #region key generation -func _generate_keys(layout_rows: Array[Array]) -> void: - print("generating keys... '%s'" % LayoutConfig.current_layout.get_name()) - _iterate_keys(_generate_key, layout_rows, {}) +func _generate_keys() -> void: + print("generating keys...") + _iterate_keys(_generate_key, LayoutConfig.layout_rows) func _generate_key( @@ -182,7 +195,7 @@ func _generate_key( func _iterate_keys( iter_function: Callable, layout_rows: Array[Array], - current_keys: Dictionary[Vector2i, Array] + current_keys: Dictionary[Vector2i, Array] = {} ) -> void: _gap_to_size_ratio = key_gap / key_size for row: Array[KeyProps] in layout_rows: @@ -280,6 +293,25 @@ func _get_scale_with_gaps(key_scale: float) -> float: return key_scale + _gap_to_size_ratio * (key_scale - 1) +func _generate_editor_keys() -> void: + _delete_editor_keys() + _iterate_keys(_generate_key, AbstractLayout.get_layout_rows(LayoutANSI.new())) + + +func _delete_editor_keys() -> void: + pressed_positions = {} + var nodes := _keys_holder.get_children() + if not nodes: + return + print("deleting keys...") + for node in nodes: + node.queue_free() + + +func _request_keys() -> void: + print(request_key_by_keycode(KEY_SHIFT)) + + #endregion @@ -307,7 +339,7 @@ func _swap_layout(kp_key: Key) -> void: func _regenerate_keys(layout_rows: Array[Array]) -> void: - print("REgenerating keys... '%s'" % LayoutConfig.current_layout.get_name()) + print("REgenerating keys...") var current_keys: Dictionary[Vector2i, Array] for node in _keys_holder.get_children(): diff --git a/scripts/globals/layout_config.gd b/scripts/globals/layout_config.gd index 1a7768a..1e9df30 100644 --- a/scripts/globals/layout_config.gd +++ b/scripts/globals/layout_config.gd @@ -65,13 +65,7 @@ func _set_defaults() -> void: func _set_layout(layout: AbstractLayout) -> void: print("SETTING LAYOUT: '%s'" % layout.get_name()) current_layout = layout - - layout_rows = [] - for dict_row: Array[Dictionary] in current_layout.get_rows(): - var row: Array[KeyProps] = [] - for props_dict: Dictionary in dict_row: - row.append(KeyProps.new().props_from_dict(props_dict)) - layout_rows.append(row) + layout_rows = AbstractLayout.get_layout_rows(current_layout) func _load_config() -> Error: diff --git a/scripts/key_props.gd b/scripts/key_props.gd index 097c249..488b231 100644 --- a/scripts/key_props.gd +++ b/scripts/key_props.gd @@ -1,4 +1,5 @@ -class_name KeyProps +@tool +class_name KeyProps extends Resource enum Char { MAIN = 0, @@ -24,29 +25,29 @@ enum { NUB, } -var physical_keycode: Key = KEY_NONE -var location: KeyLocation = KEY_LOCATION_UNSPECIFIED +@export var physical_keycode: Key = KEY_NONE +@export var location: KeyLocation = KEY_LOCATION_UNSPECIFIED -var width: float = 1 -var height: float = 1 -var x: float = 0 -var y: float = 0 +@export var width: float = 1 +@export var height: float = 1 +@export var x: float = 0 +@export var y: float = 0 -var width2: float = 1 -var height2: float = 1 -var x2: float = 0 -var y2: float = 0 +@export var width2: float = 1 +@export var height2: float = 1 +@export var x2: float = 0 +@export var y2: float = 0 -var angle: float = -INF -var pivot_x: float = -INF -var pivot_y: float = -INF +@export var angle: float = -INF +@export var pivot_x: float = -INF +@export var pivot_y: float = -INF -var homing_nub: bool = false +@export var homing_nub: bool = false -var main_char: String -var shift_char: String -var alt_char: String -var alt_shift_char: String +@export var main_char: String +@export var shift_char: String +@export var alt_char: String +@export var alt_shift_char: String func is_unicode() -> bool: diff --git a/scripts/layouts/abstract_layout.gd b/scripts/layouts/abstract_layout.gd index 7ce4401..9240568 100644 --- a/scripts/layouts/abstract_layout.gd +++ b/scripts/layouts/abstract_layout.gd @@ -1,6 +1,16 @@ class_name AbstractLayout +static func get_layout_rows(layout: AbstractLayout) -> Array[Array]: + var rows: Array[Array] = [] + for dict_row: Array[Dictionary] in layout.get_rows(): + var row: Array[KeyProps] = [] + for props_dict: Dictionary in dict_row: + row.append(KeyProps.new().props_from_dict(props_dict)) + rows.append(row) + return rows + + func get_name() -> String: return ""