"""Blender recon: dump skeleton/mesh facts for a Sidekick FBX and our armature. Usage: tooling/blender --background --python recon_dump.py -- """ import sys import bpy argv = sys.argv[sys.argv.index("--") + 1:] fbx_path, glb_path = argv[0], argv[1] bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.fbx(filepath=fbx_path) print("=== SIDEKICK FBX:", fbx_path.split("/")[-1]) sk_bones = [] for obj in bpy.data.objects: if obj.type == "ARMATURE": sk_bones = sorted(b.name for b in obj.data.bones) print("ARMATURE:", obj.name, "bones:", len(sk_bones)) elif obj.type == "MESH": keys = obj.data.shape_keys print( "MESH:", obj.name, "verts:", len(obj.data.vertices), "dim:", [round(d, 3) for d in obj.dimensions], "shapekeys:", [k.name for k in keys.key_blocks] if keys else [], "vgroups:", len(obj.vertex_groups), ) print("SK_BONES:", ",".join(sk_bones)) bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.gltf(filepath=glb_path) print("=== OURS:", glb_path.split("/")[-1]) our_bones = [] for obj in bpy.data.objects: if obj.type == "ARMATURE": our_bones = sorted(b.name for b in obj.data.bones) print("ARMATURE:", obj.name, "bones:", len(our_bones)) print("OUR_BONES:", ",".join(our_bones)) overlap = set(sk_bones) & set(our_bones) print("OVERLAP:", len(overlap), "of", len(sk_bones), "sidekick /", len(our_bones), "ours")