]> Untitled Git - william-skin.git/blob - william.gd
Basic player functionality
[william-skin.git] / william.gd
1 class_name WilliamSkin 
2 extends Node3D
3
4
5 @onready var animation_tree: AnimationTree = $AnimationTree
6 @onready var skeleton: Skeleton3D = $base/rig/Skeleton3D
7
8
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
13
14 var _head_index := -1
15 var _head_track_target: Vector3 = Vector3.ZERO
16
17
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")
22
23
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()
29
30
31 # manage eye tracking
32 func set_eyes_target(target: Vector3) -> void:
33         _eye_track_target = target
34
35
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!
45
46
47 # TODO: manage head tracking
48 func set_head_target(target: Vector3) -> void:
49         _head_track_target = target
50
51
52 func _process_head_tracking() -> void:
53         pass
54
55
56 # manage talking and expressions
57 func talk() -> void:
58         animation_tree.set("parameters/motion/transition_request", "talk")
59
60
61 # manage vectored movement
62 func current_state() -> String:
63         return animation_tree.get("parameters/motion/current_state")
64
65
66 func set_hips_direction(direction: float) -> void:
67         animation_tree.set("parameters/hips_direction/blend_position", clamp(direction, -PI / 2, PI / 2))
68
69
70 func get_hips_direction() -> float:
71         return animation_tree.get("parameters/hips_direction/blend_position")
72
73
74 func pose() -> void:
75         animation_tree.set("parameters/motion/transition_request", "pose")
76
77
78 func idle() -> void:
79         animation_tree.set("parameters/motion/transition_request", "idle")
80
81
82 func move_forward() -> void:
83         animation_tree.set("parameters/motion/transition_request", "forward")
84
85
86 func move_backward() -> void:
87         animation_tree.set("parameters/motion/transition_request", "backward")
88
89
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)
93
94
95 func jump() -> void:
96         animation_tree.set("parameters/motion/transition_request", "fall")
97
98
99 func fall() -> void:
100         animation_tree.set("parameters/motion/transition_request", "fall")
101
102
103 func landing() -> void:
104         animation_tree.set("parameters/motion/transition_request", "landing")