make keyboard and keys tool scripts and add editor keys generation
This commit is contained in:
parent
f2be1197d6
commit
aa44311c1f
@ -171,13 +171,13 @@ omni_range = 2.0
|
|||||||
|
|
||||||
[node name="AdjacencyLight" type="OmniLight3D" parent="."]
|
[node name="AdjacencyLight" type="OmniLight3D" parent="."]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.45, 0)
|
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)
|
light_color = Color(0.8325, 1, 0.33, 1)
|
||||||
omni_range = 0.6
|
omni_range = 0.6
|
||||||
|
|
||||||
[node name="SFXPlayer" type="AudioStreamPlayer3D" parent="."]
|
[node name="SFXPlayer" type="AudioStreamPlayer3D" parent="."]
|
||||||
stream = SubResource("AudioStreamPolyphonic_6rsff")
|
stream = SubResource("AudioStreamPolyphonic_6rsff")
|
||||||
volume_db = -15.0
|
volume_db = -15.0
|
||||||
autoplay = true
|
|
||||||
bus = &"SFX"
|
bus = &"SFX"
|
||||||
attenuation_filter_cutoff_hz = 20500.0
|
attenuation_filter_cutoff_hz = 20500.0
|
||||||
|
|
||||||
|
|||||||
@ -39,6 +39,6 @@ visible = false
|
|||||||
mesh = SubResource("BoxMesh_j5t22")
|
mesh = SubResource("BoxMesh_j5t22")
|
||||||
|
|
||||||
[node name="RectMesh" type="MeshInstance3D" parent="."]
|
[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
|
visible = false
|
||||||
mesh = SubResource("QuadMesh_j5t22")
|
mesh = SubResource("QuadMesh_j5t22")
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
[ext_resource type="Script" uid="uid://dmfdlb4ae57qv" path="res://scripts/player.gd" id="1_3vyb7"]
|
[ext_resource type="Script" uid="uid://dmfdlb4ae57qv" path="res://scripts/player.gd" id="1_3vyb7"]
|
||||||
|
|
||||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3vyb7"]
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3vyb7"]
|
||||||
|
metallic_specular = 0.0
|
||||||
|
|
||||||
[sub_resource type="BoxMesh" id="BoxMesh_u8vuu"]
|
[sub_resource type="BoxMesh" id="BoxMesh_u8vuu"]
|
||||||
material = SubResource("StandardMaterial3D_3vyb7")
|
material = SubResource("StandardMaterial3D_3vyb7")
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
|
@tool
|
||||||
class_name GameKey extends Node3D
|
class_name GameKey extends Node3D
|
||||||
|
|
||||||
#region variables
|
#region variables
|
||||||
|
@export var props: KeyProps
|
||||||
|
|
||||||
@export_group("References")
|
@export_group("References")
|
||||||
@export var player_pos_marker: Node3D
|
@export var player_pos_marker: Node3D
|
||||||
|
|
||||||
@ -42,7 +45,6 @@ class_name GameKey extends Node3D
|
|||||||
@export var _press_sfx: AudioStream
|
@export var _press_sfx: AudioStream
|
||||||
@export var _release_sfx: AudioStream
|
@export var _release_sfx: AudioStream
|
||||||
|
|
||||||
var props: KeyProps
|
|
||||||
var player_transform: Transform3D
|
var player_transform: Transform3D
|
||||||
|
|
||||||
var _keyboard: GameKeyboard
|
var _keyboard: GameKeyboard
|
||||||
@ -54,8 +56,7 @@ var _default_position: Vector3
|
|||||||
var _default_rotation: Vector3
|
var _default_rotation: Vector3
|
||||||
var _pos_sod: SecondOrderDynamics
|
var _pos_sod: SecondOrderDynamics
|
||||||
|
|
||||||
@onready
|
@onready var _polyphonic: AudioStreamPlaybackPolyphonic
|
||||||
var _polyphonic := _sfx_player.get_stream_playback() as AudioStreamPlaybackPolyphonic
|
|
||||||
@onready var _light_energy := _press_light.light_energy
|
@onready var _light_energy := _press_light.light_energy
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -96,6 +97,16 @@ static func sort_func(a: GameKey, b: GameKey) -> bool:
|
|||||||
|
|
||||||
#region builtins
|
#region builtins
|
||||||
func _ready() -> void:
|
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
|
_adjacency_light.visible = false
|
||||||
_keyboard.layout_size_changed.connect(_on_keyboard_layout_size_changed)
|
_keyboard.layout_size_changed.connect(_on_keyboard_layout_size_changed)
|
||||||
_keyboard.keys_requested.connect(_on_keyboard_keys_requested)
|
_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)
|
_keyboard.player_finished_move.connect(_on_keyboard_player_finished_move)
|
||||||
_set_labels()
|
_set_labels()
|
||||||
|
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
return
|
||||||
|
_sfx_player.play()
|
||||||
|
_polyphonic = _sfx_player.get_stream_playback()
|
||||||
|
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
return
|
||||||
_animate(delta)
|
_animate(delta)
|
||||||
_animate_light(delta)
|
_animate_light(delta)
|
||||||
|
|
||||||
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
return
|
||||||
if event.is_action_pressed("reset_animations"):
|
if event.is_action_pressed("reset_animations"):
|
||||||
_reset_animations()
|
_reset_animations()
|
||||||
return
|
return
|
||||||
@ -157,7 +177,8 @@ func _unhandled_input(event: InputEvent) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _exit_tree() -> void:
|
func _exit_tree() -> void:
|
||||||
_erase_keyboard_pressed_position()
|
if _keyboard:
|
||||||
|
_erase_keyboard_pressed_position()
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#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:
|
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)
|
_center_label.text = OS.get_keycode_string(props.physical_keycode)
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -398,6 +423,10 @@ func _on_keyboard_layout_size_changed(rect: Rect2) -> void:
|
|||||||
_default_position.z -= center.y
|
_default_position.z -= center.y
|
||||||
_set_keyboard_pressed_position(_is_pressed)
|
_set_keyboard_pressed_position(_is_pressed)
|
||||||
|
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
position = _default_position
|
||||||
|
return
|
||||||
|
|
||||||
if not _pos_sod:
|
if not _pos_sod:
|
||||||
_reset_animations()
|
_reset_animations()
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
@tool
|
||||||
class_name GameKeyboard extends Node3D
|
class_name GameKeyboard extends Node3D
|
||||||
|
|
||||||
#region variables
|
#region variables
|
||||||
@ -9,6 +10,11 @@ signal is_configuring_changed(value: bool)
|
|||||||
signal player_key_changed(game_key: GameKey)
|
signal player_key_changed(game_key: GameKey)
|
||||||
signal player_finished_move(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_group("References")
|
||||||
@export var _keys_holder: Node3D
|
@export var _keys_holder: Node3D
|
||||||
@export var _sfx_player: AudioStreamPlayer3D
|
@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)
|
deg_to_rad(_pressing_lean_deg.x), deg_to_rad(_pressing_lean_deg.y)
|
||||||
)
|
)
|
||||||
@onready var _default_rotation: Vector3 = _keys_holder.rotation
|
@onready var _default_rotation: Vector3 = _keys_holder.rotation
|
||||||
@onready
|
@onready var _polyphonic: AudioStreamPlaybackPolyphonic
|
||||||
var _polyphonic := _sfx_player.get_stream_playback() as AudioStreamPlaybackPolyphonic
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -65,16 +70,24 @@ static func get_rotated_key_pos(
|
|||||||
|
|
||||||
#region builtins
|
#region builtins
|
||||||
func _ready() -> void:
|
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)
|
prompt_pages_total = ceili(LayoutConfig.layouts.size() / 9.0)
|
||||||
_generate_keys(LayoutConfig.layout_rows)
|
_generate_keys()
|
||||||
_reset_animations()
|
_reset_animations()
|
||||||
|
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
return
|
||||||
_animate(delta)
|
_animate(delta)
|
||||||
|
|
||||||
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
if Engine.is_editor_hint():
|
||||||
|
return
|
||||||
if event.is_action_pressed("reset_animations"):
|
if event.is_action_pressed("reset_animations"):
|
||||||
_reset_animations()
|
_reset_animations()
|
||||||
return
|
return
|
||||||
@ -162,9 +175,9 @@ func key_request_respond(game_key: GameKey) -> void:
|
|||||||
|
|
||||||
|
|
||||||
#region key generation
|
#region key generation
|
||||||
func _generate_keys(layout_rows: Array[Array]) -> void:
|
func _generate_keys() -> void:
|
||||||
print("generating keys... '%s'" % LayoutConfig.current_layout.get_name())
|
print("generating keys...")
|
||||||
_iterate_keys(_generate_key, layout_rows, {})
|
_iterate_keys(_generate_key, LayoutConfig.layout_rows)
|
||||||
|
|
||||||
|
|
||||||
func _generate_key(
|
func _generate_key(
|
||||||
@ -182,7 +195,7 @@ func _generate_key(
|
|||||||
func _iterate_keys(
|
func _iterate_keys(
|
||||||
iter_function: Callable,
|
iter_function: Callable,
|
||||||
layout_rows: Array[Array],
|
layout_rows: Array[Array],
|
||||||
current_keys: Dictionary[Vector2i, Array]
|
current_keys: Dictionary[Vector2i, Array] = {}
|
||||||
) -> void:
|
) -> void:
|
||||||
_gap_to_size_ratio = key_gap / key_size
|
_gap_to_size_ratio = key_gap / key_size
|
||||||
for row: Array[KeyProps] in layout_rows:
|
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)
|
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
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
@ -307,7 +339,7 @@ func _swap_layout(kp_key: Key) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _regenerate_keys(layout_rows: Array[Array]) -> 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]
|
var current_keys: Dictionary[Vector2i, Array]
|
||||||
for node in _keys_holder.get_children():
|
for node in _keys_holder.get_children():
|
||||||
|
|||||||
@ -65,13 +65,7 @@ func _set_defaults() -> void:
|
|||||||
func _set_layout(layout: AbstractLayout) -> void:
|
func _set_layout(layout: AbstractLayout) -> void:
|
||||||
print("SETTING LAYOUT: '%s'" % layout.get_name())
|
print("SETTING LAYOUT: '%s'" % layout.get_name())
|
||||||
current_layout = layout
|
current_layout = layout
|
||||||
|
layout_rows = AbstractLayout.get_layout_rows(current_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)
|
|
||||||
|
|
||||||
|
|
||||||
func _load_config() -> Error:
|
func _load_config() -> Error:
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
class_name KeyProps
|
@tool
|
||||||
|
class_name KeyProps extends Resource
|
||||||
|
|
||||||
enum Char {
|
enum Char {
|
||||||
MAIN = 0,
|
MAIN = 0,
|
||||||
@ -24,29 +25,29 @@ enum {
|
|||||||
NUB,
|
NUB,
|
||||||
}
|
}
|
||||||
|
|
||||||
var physical_keycode: Key = KEY_NONE
|
@export var physical_keycode: Key = KEY_NONE
|
||||||
var location: KeyLocation = KEY_LOCATION_UNSPECIFIED
|
@export var location: KeyLocation = KEY_LOCATION_UNSPECIFIED
|
||||||
|
|
||||||
var width: float = 1
|
@export var width: float = 1
|
||||||
var height: float = 1
|
@export var height: float = 1
|
||||||
var x: float = 0
|
@export var x: float = 0
|
||||||
var y: float = 0
|
@export var y: float = 0
|
||||||
|
|
||||||
var width2: float = 1
|
@export var width2: float = 1
|
||||||
var height2: float = 1
|
@export var height2: float = 1
|
||||||
var x2: float = 0
|
@export var x2: float = 0
|
||||||
var y2: float = 0
|
@export var y2: float = 0
|
||||||
|
|
||||||
var angle: float = -INF
|
@export var angle: float = -INF
|
||||||
var pivot_x: float = -INF
|
@export var pivot_x: float = -INF
|
||||||
var pivot_y: float = -INF
|
@export var pivot_y: float = -INF
|
||||||
|
|
||||||
var homing_nub: bool = false
|
@export var homing_nub: bool = false
|
||||||
|
|
||||||
var main_char: String
|
@export var main_char: String
|
||||||
var shift_char: String
|
@export var shift_char: String
|
||||||
var alt_char: String
|
@export var alt_char: String
|
||||||
var alt_shift_char: String
|
@export var alt_shift_char: String
|
||||||
|
|
||||||
|
|
||||||
func is_unicode() -> bool:
|
func is_unicode() -> bool:
|
||||||
|
|||||||
@ -1,6 +1,16 @@
|
|||||||
class_name AbstractLayout
|
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:
|
func get_name() -> String:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user