remove manual mirrored animations and make flipping automatic

This commit is contained in:
2025-07-02 22:24:30 +10:00
parent ea4e772151
commit 999848ae36
23 changed files with 82 additions and 1910 deletions

View File

@@ -15,5 +15,4 @@ func _ready() -> void:
func play_footstep() -> void:
_polyphonic.play_stream(_footsteps.streams[_footsteps_shuffle.take()])

View File

@@ -13,7 +13,7 @@ var _skeleton: Skeleton3D
func _validate_property(property: Dictionary) -> void:
if property.name == "_bones_to_flip" or property.name == "_bones_to_exclude":
if property.name in ["_bones_to_flip", "_bones_to_exclude"]:
if _skeleton:
property.hint = PROPERTY_HINT_TYPE_STRING
property.hint_string = (
@@ -90,7 +90,9 @@ func _flip_bone(bone_idx: int, bone_name: String) -> void:
func _mirror_bone_transform(bone_idx: int, pose: Transform3D) -> void:
pose.origin.x = -pose.origin.x
var pose_rot := pose.basis.get_euler()
pose_rot.z = -pose_rot.z
var pose_scale := pose.basis.get_scale()
pose_rot.y = -pose_rot.y
pose_rot.z = -pose_rot.z
pose.basis = Basis.from_euler(pose_rot)
pose.basis = pose.basis.scaled(pose_scale)
_skeleton.set_bone_pose(bone_idx, pose)

View File

@@ -1,32 +1,26 @@
extends AnimationTree
@export_group("Animation names")
@export var _suffix_left := "_L"
@export var _suffix_right := "_R"
@export var _idle_name := "+idle"
var _speed: float
var _has_input: bool
@onready var _player: Player = $"../" as Player
@onready var _attack: PlayerAttack = $"../Attack" as PlayerAttack
@onready var _locomotion_playback: AnimationNodeStateMachinePlayback = get(
"parameters/locomotion/playback"
)
@onready var _bone_flipper: BoneFlipper = $"../Model/Armature/Skeleton3D/BoneFlipper"
func _ready() -> void:
assert(_player, "_player missing!")
Music.track_started.connect(_on_music_track_started)
_attack.attacked.connect(_on_player_attacked)
_set_bpm()
_set_side()
func _process(_delta: float) -> void:
_bone_flipper.flip = _is_left()
_speed = _player.velocity.length() / _player.movement.move_speed
_has_input = _player.movement.move_input.length() > 0
_has_input = (
_player.movement.move_input.length() > 0 and not _player.attack.is_hitting()
)
var velocity_relative := _player.to_local(
_player.global_position + _player.velocity
@@ -34,31 +28,21 @@ func _process(_delta: float) -> void:
var velocity_blend := (
Vector2(-velocity_relative.x, velocity_relative.z) / _player.movement.move_speed
)
if _is_left():
velocity_blend.x = -velocity_blend.x
Debugger.text("velocity_blend", velocity_blend, 2)
set(&"parameters/locomotion/run_R/blend_position", velocity_blend)
set(&"parameters/locomotion/run/blend_position", velocity_blend)
func _is_left() -> bool:
return _attack.side == PlayerAttack.Side.LEFT
func _suffix(invert: bool = false) -> String:
if not invert:
return _suffix_left if _is_left() else _suffix_right
return _suffix_left if not _is_left() else _suffix_right
func _set_bpm() -> void:
set(&"parameters/main_time_scale/scale", Music.bpm_factor)
func _set_side() -> void:
_locomotion_playback.travel(_idle_name + _suffix())
func _on_music_track_started() -> void:
_set_bpm()
func _on_player_attacked() -> void:
_set_side()