extends SceneTree
func _init() -> void:
var scene = load("res://assets/models/tumble/tumble.glb")
if scene == null:
print("Failed to load tumble.glb")
quit()
return
var inst = scene.instantiate()
root.add_child(inst)
# Print scene hierarchy to understand node tree
print("=== SCENE HIERARCHY ===")
_print_tree(inst, 0)
# Find Skeleton3D
var skeletons = inst.find_children("*", "Skeleton3D", true, false)
if skeletons.is_empty():
print("No Skeleton3D found")
quit()
return
var skel: Skeleton3D = skeletons[0]
print("\n=== SKELETON DATA ===")
print("Skeleton: %s bones: %d" % [skel.get_name(), skel.get_bone_count()])
print("Skeleton global_transform: %s" % str(skel.get_global_transform()))
print("Skeleton local_transform: %s" % str(skel.get_transform()))
# Dump parent hierarchy
var parent_node = skel.get_parent()
while parent_node != null:
var n3d = parent_node as Node3D
if n3d:
print(" Parent '%s': local=%s global=%s" % [
n3d.get_name(), str(n3d.get_transform()), str(n3d.get_global_transform())
])
parent_node = parent_node.get_parent()
# Dump first 10 bones with full rest data (JSON-parseable format)
print("\n=== BONE REST DATA (first 10) ===")
var count = min(skel.get_bone_count(), 10)
for i in count:
var bname = skel.get_bone_name(i)
var parent = skel.get_bone_parent(i)
var rest: Transform3D = skel.get_bone_rest(i)
var pos = rest.origin
var rot: Quaternion = Quaternion(rest.basis)
var scl = rest.basis.get_scale()
var gpose = skel.get_bone_global_pose(i)
var gpos = gpose.origin
var grot: Quaternion = Quaternion(gpose.basis)
print("BONE|%d|%s|%d|%.6f,%.6f,%.6f|%.6f,%.6f,%.6f,%.6f|%.6f,%.6f,%.6f|%.6f,%.6f,%.6f|%.6f,%.6f,%.6f,%.6f" % [
i, bname, parent,
pos.x, pos.y, pos.z,
rot.x, rot.y, rot.z, rot.w,
scl.x, scl.y, scl.z,
gpos.x, gpos.y, gpos.z,
grot.x, grot.y, grot.z, grot.w
])
# Dump ALL bones (compact)
print("\n=== ALL BONES (name, parent, rest_pos) ===")
for i in skel.get_bone_count():
var bname = skel.get_bone_name(i)
var parent = skel.get_bone_parent(i)
var rest = skel.get_bone_rest(i)
var pos = rest.origin
print("B|%d|%s|%d|%.4f,%.4f,%.4f" % [i, bname, parent, pos.x, pos.y, pos.z])
inst.queue_free()
quit()
func _print_tree(node: Node, depth: int) -> void:
var indent = " ".repeat(depth)
var n3d = node as Node3D
if n3d:
var t = n3d.get_transform()
print("%s%s [%s] pos=(%.3f,%.3f,%.3f) scale=(%.3f,%.3f,%.3f)" % [
indent, node.get_name(), node.get_class(),
t.origin.x, t.origin.y, t.origin.z,
t.basis.get_scale().x, t.basis.get_scale().y, t.basis.get_scale().z
])
else:
print("%s%s [%s]" % [indent, node.get_name(), node.get_class()])
for child in node.get_children():
_print_tree(child, depth + 1)