5 @onready var animation_tree: AnimationTree = $AnimationTree
6 @onready var skeleton: Skeleton3D = $base/rig/Skeleton3D
9 # get tracking bones from skeleton
10 var _eye_left_index := -1
11 var _eye_right_index := -1
12 var _eye_track_target: Vector3 = Vector3.ZERO
15 var _head_track_target: Vector3 = Vector3.ZERO
18 func _ready() -> void:
19 _eye_left_index = skeleton.find_bone("DEF-eye.L")
20 _eye_right_index = skeleton.find_bone("DEF-eye.R")
21 _head_index = skeleton.find_bone("DEF-spine.006")
24 func _process(_delta: float) -> void:
25 if _eye_track_target != Vector3.ZERO:
26 _process_eyes_tracking()
27 if _head_track_target != Vector3.ZERO:
28 _process_head_tracking()
32 func set_eyes_target(target: Vector3) -> void:
33 _eye_track_target = target
36 func _process_eyes_tracking() -> void:
37 # TODO: this is broken!
38 for i in [_eye_left_index, _eye_right_index]:
39 var bone_pose: Transform3D = skeleton.global_transform * skeleton.get_bone_global_pose(i)
40 bone_pose = bone_pose.looking_at(_eye_track_target)
41 var axis: Vector3 = bone_pose.basis.x
42 bone_pose = bone_pose.rotated_local(axis, -PI/2)
43 #skeleton.set_bone_global_pose_override(i, skeleton.global_transform.affine_inverse() * bone_pose, 1, true)
44 # ^^^ this sets the bone position relative to its rest position, not after animation!
47 # TODO: manage head tracking
48 func set_head_target(target: Vector3) -> void:
49 _head_track_target = target
52 func _process_head_tracking() -> void:
56 # manage talking and expressions
58 animation_tree.set("parameters/motion/transition_request", "talk")
61 # manage vectored movement
62 func current_state() -> String:
63 return animation_tree.get("parameters/motion/current_state")
66 func set_hips_direction(direction: float) -> void:
67 animation_tree.set("parameters/hips_direction/blend_position", clamp(direction, -PI / 2, PI / 2))
70 func get_hips_direction() -> float:
71 return animation_tree.get("parameters/hips_direction/blend_position")
75 animation_tree.set("parameters/motion/transition_request", "pose")
79 animation_tree.set("parameters/motion/transition_request", "idle")
82 func move_forward() -> void:
83 animation_tree.set("parameters/motion/transition_request", "forward")
86 func move_backward() -> void:
87 animation_tree.set("parameters/motion/transition_request", "backward")
90 func movement_speed(speed: float) -> void:
91 animation_tree.set("parameters/forward/blend_position", speed)
92 animation_tree.set("parameters/backward/blend_position", speed)
96 animation_tree.set("parameters/motion/transition_request", "fall")
100 animation_tree.set("parameters/motion/transition_request", "fall")
103 func landing() -> void:
104 animation_tree.set("parameters/motion/transition_request", "landing")