OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / test / dump_skeleton_full.gd

88 lines · gd ref:
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)