OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / test / dump_skeleton.gd

58 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)

	# 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("Skeleton: %s  bones: %d" % [skel.get_name(), skel.get_bone_count()])

	for i in skel.get_bone_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
		print("Bone %d: '%s' parent=%d pos=(%.4f, %.4f, %.4f)" % [
			i, bname, parent, pos.x, pos.y, pos.z
		])

	# Mesh info
	print("")
	var meshes = inst.find_children("*", "MeshInstance3D", true, false)
	for m in meshes:
		var mi: MeshInstance3D = m
		var spath = mi.get_skeleton_path()
		print("Mesh: %s  skel_path=%s" % [mi.get_name(), str(spath)])
		if mi.get_mesh():
			var msh = mi.get_mesh()
			print("  surfaces: %d" % msh.get_surface_count())
			for s in msh.get_surface_count():
				var arrays = msh.surface_get_arrays(s)
				var vc: int = 0
				if arrays[Mesh.ARRAY_VERTEX] != null:
					vc = (arrays[Mesh.ARRAY_VERTEX] as PackedVector3Array).size()
				var has_bones: bool = arrays.size() > Mesh.ARRAY_BONES and arrays[Mesh.ARRAY_BONES] != null
				var has_weights: bool = arrays.size() > Mesh.ARRAY_WEIGHTS and arrays[Mesh.ARRAY_WEIGHTS] != null
				var ic: int = 0
				if arrays.size() > Mesh.ARRAY_INDEX and arrays[Mesh.ARRAY_INDEX] != null:
					ic = (arrays[Mesh.ARRAY_INDEX] as PackedInt32Array).size()
				print("  Surface %d: verts=%d indices=%d has_bones=%s has_weights=%s" % [
					s, vc, ic, has_bones, has_weights
				])

	inst.queue_free()
	quit()