SLOT_TO_BONE expanded to 12 slots (earring_l/r, necklace, wrist_l/r). _clear() outline teardown ordering fixed. toon_masked.gdshader: removed cull_disabled, added ALPHA output. _attach_to_bone() returns node instead of bool. skin_tone clamped in from_dict(). D-160 segment count 15→17. Blender scripts: docstrings + __main__ guards. Reload test tightened. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
"""
|
|
blender_list_bones.py
|
|
Usage: tooling/blender --background --python tooling/blender_list_bones.py -- <input.glb>
|
|
|
|
Lists all bone names in a GLB/GLTF armature, sorted alphabetically.
|
|
Used to verify bone naming after the January 2026 Quaternius naming update.
|
|
"""
|
|
|
|
import sys
|
|
import bpy
|
|
|
|
|
|
if __name__ == "__main__":
|
|
argv = sys.argv
|
|
if "--" not in argv:
|
|
print("Usage: tooling/blender --background --python tooling/blender_list_bones.py -- <input.glb>")
|
|
sys.exit(1)
|
|
|
|
args = argv[argv.index("--") + 1:]
|
|
if len(args) < 1:
|
|
print("ERROR: Provide a GLB/GLTF path.")
|
|
sys.exit(1)
|
|
|
|
input_path = args[0]
|
|
|
|
bpy.ops.wm.read_factory_settings(use_empty=True)
|
|
bpy.ops.import_scene.gltf(filepath=input_path)
|
|
|
|
for obj in bpy.context.scene.objects:
|
|
if obj.type == 'ARMATURE':
|
|
print(f"ARMATURE: {obj.name} — {len(obj.data.bones)} bones")
|
|
for b in sorted(obj.data.bones, key=lambda x: x.name):
|
|
print("BONE: " + b.name)
|
|
break
|
|
else:
|
|
print("ERROR: No armature found in the imported file.")
|
|
sys.exit(1)
|