-
-func _process(_delta: float) -> void:
- if _eye_track_target != Vector3.ZERO:
- _process_eyes_tracking()
- if _head_track_target != Vector3.ZERO:
- _process_head_tracking()
-
-
-# manage eye tracking
-func set_eyes_target(target: Vector3) -> void:
- _eye_track_target = target
-
-
-func _process_eyes_tracking() -> void:
- # TODO: this is broken!
- for i in [_eye_left_index, _eye_right_index]:
- var bone_pose: Transform3D = skeleton.global_transform * skeleton.get_bone_global_pose(i)
- bone_pose = bone_pose.looking_at(_eye_track_target)
- var axis: Vector3 = bone_pose.basis.x
- bone_pose = bone_pose.rotated_local(axis, -PI/2)
- #skeleton.set_bone_global_pose_override(i, skeleton.global_transform.affine_inverse() * bone_pose, 1, true)
- # ^^^ this sets the bone position relative to its rest position, not after animation!
-
-
-# TODO: manage head tracking
-func set_head_target(target: Vector3) -> void:
- _head_track_target = target
-
-
-func _process_head_tracking() -> void:
- pass
+func set_head_target(target: Node3D) -> void:
+ _head.target = target if target != null else _default_target
+ _head.active = 1
+ _head.tween_influence(0.0 if target == null else head_influence)