extends SceneTree
## Rig probe (tool): prints a model's skeleton (bone, parent, rest position) and, for every animation track, the
## rotation swing (degrees, max angle from the first key) and the position travel - finds bones a clip moves wrongly.
##   godot --headless --path game -s res://scripts/tools/rig_probe.gd -- res://assets/models/<id>/anim_idle.glb


func _init() -> void:
	var path := ""
	for a in OS.get_cmdline_user_args():
		path = a
	var ps = load(path)
	if ps == null:
		print("RIG no file ", path)
		quit()
		return
	var root: Node = ps.instantiate()
	var sks := root.find_children("*", "Skeleton3D", true, false)
	for skn in sks:
		var sk := skn as Skeleton3D
		print("RIG skeleton ", sk.name, " bones ", sk.get_bone_count())
		for i in sk.get_bone_count():
			var gp := sk.get_bone_global_rest(i).origin
			print("RIG bone %d %s parent=%s rest=(%.2f, %.2f, %.2f)" % [i, sk.get_bone_name(i),
				sk.get_bone_name(sk.get_bone_parent(i)) if sk.get_bone_parent(i) >= 0 else "-", gp.x, gp.y, gp.z])
	for apn in root.find_children("*", "AnimationPlayer", true, false):
		var ap := apn as AnimationPlayer
		for an in ap.get_animation_list():
			var anim := ap.get_animation(an)
			print("RIG anim ", an, " len ", anim.length, " tracks ", anim.get_track_count())
			for t in anim.get_track_count():
				var tp := anim.track_get_type(t)
				var n := anim.track_get_key_count(t)
				if n == 0:
					continue
				var p := str(anim.track_get_path(t))
				if tp == Animation.TYPE_ROTATION_3D:
					var q0: Quaternion = anim.track_get_key_value(t, 0)
					var mx := 0.0
					for k in n:
						var q: Quaternion = anim.track_get_key_value(t, k)
						mx = maxf(mx, rad_to_deg(q0.angle_to(q)))
					print("RIG rot %-40s keys %3d swing %6.1f" % [p, n, mx])
				elif tp == Animation.TYPE_POSITION_3D:
					var v0: Vector3 = anim.track_get_key_value(t, 0)
					var mv := 0.0
					for k in n:
						mv = maxf(mv, v0.distance_to(anim.track_get_key_value(t, k)))
					print("RIG pos %-40s keys %3d travel %6.3f" % [p, n, mv])
	quit()
