make keyboard and keys tool scripts and add editor keys generation

This commit is contained in:
Teatov 2025-08-03 03:03:42 +10:00
parent f2be1197d6
commit aa44311c1f
8 changed files with 108 additions and 41 deletions

View File

@ -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

View File

@ -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")

View File

@ -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")

View File

@ -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,6 +177,7 @@ func _unhandled_input(event: InputEvent) -> void:
func _exit_tree() -> void:
if _keyboard:
_erase_keyboard_pressed_position()
@ -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()

View File

@ -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():

View File

@ -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:

View File

@ -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:

View File

@ -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 ""