]> Untitled Git - william-skin.git/blob - jigglebone_setup.gd
Added jigglebones
[william-skin.git] / jigglebone_setup.gd
1 extends Skeleton3D
2
3 const JIGGLEBONE_SCENE = preload("res://addons/jigglebones/jigglebone.gd")
4
5
6 @export var reparent_face := true
7 @export var enable_jigglebones := true
8 @export var jigglebone_configs: Array[JiggleboneConfig]
9
10
11 # Called when the node enters the scene tree for the first time.
12 func _ready() -> void:
13         if enable_jigglebones:
14                 print("Adding jigglebones to skeleton: " + name)
15                 _add_jigglebones()
16
17         # if ORG-face is not a child of DEF-spine.006, parent it
18         # TODO: this ought to be done on import!
19         if reparent_face:
20                 print("Reparenting face bone to head bone")
21                 _reparent_face()
22
23
24 func _reparent_face() -> void:
25         var face_idx = find_bone("ORG-face")
26         var head_idx = find_bone("DEF-spine.005")
27         if face_idx > -1 and head_idx > -1:
28                 set_bone_enabled(face_idx, false)
29                 set_bone_parent(face_idx, head_idx)
30                 set_bone_rest(face_idx, get_bone_rest(head_idx))
31                 set_bone_pose(face_idx, get_bone_pose(head_idx))
32         else:
33                 printerr("Couldn't find face and head bones")
34
35
36 func _add_jigglebones() -> void:
37         for i in get_bone_count():
38                 var bone_name = get_bone_name(i)
39                 for cfg in jigglebone_configs:
40                         if bone_name.contains(cfg.name_pattern):
41                                 var jigglebone = JIGGLEBONE_SCENE.new()
42                                 jigglebone.name = "Jigglebone_" + bone_name
43                                 jigglebone.bone_name = bone_name
44                                 jigglebone.stiffness = cfg.stiffness
45                                 jigglebone.damping = cfg.damping
46                                 jigglebone.forward_axis = cfg.forward_axis
47                                 jigglebone.use_gravity = cfg.use_gravity
48                                 add_child(jigglebone)
49                                 print("Jigglebone added: \"" + jigglebone.name + "\" -> \"" + bone_name + "\"")