โ† All examples

asset contracts

Articulation loss checker for exports that drop joint information

Catch exports that keep every mesh but lose what joints need: parts joined into their parent, origins moved off the hinge, node frames rotated, hierarchies flattened, and joint records in custom properties left out by a default export.

What this component contains

  • ATTRIBUTION.md
  • LICENSE
  • README.md
  • articulation_loss_checker.py
  • asset_report.py
  • component.json
  • fixtures/bad_manifest.articulation.json
  • fixtures/door_reference.articulation.json
  • fixtures/door_reference.gltf
  • fixtures/door_reordered.gltf
  • fixtures/export_extras_mismatch.gltf
  • fixtures/export_flattened.gltf
  • fixtures/export_frame_rotated.gltf
  • fixtures/export_joined.gltf
  • fixtures/export_origin_to_geometry.gltf
  • fixtures/export_without_extras.gltf
  • gltfio.py
  • pngio.py
  • schema_lite.py
  • test_articulation_loss_checker.py
  • test_package.py
  • verification/native.json

How it works

Entry points
joint_facts, compare, check, run, main
Proves
Each joint's node exists exactly once with geometry at or below it; with a reference, its world pivot, world axis and parent are unchanged within tolerance (1 mm, 0.5 degrees by default); with extras required, its node carries a joint record equal to the manifest.
Does not prove
That the joint moves the right geometry, or that the joint values are sensible. A reference export must itself be right: the tool compares, it does not judge the reference.
Catches
asset_unreadable, reference_unreadable, manifest_invalid, joint_node_missing, joint_node_ambiguous, joint_node_without_geometry, pivot_moved, joint_axis_changed and 3 more

Recorded checks

blender_and_godot blender 5.2.1 LTS (hash 9e2066aef7ef built 2026-08-25 02:12:34); godot 4.7.2.stable.official.ed1daf0bf

  • checker_matches_contract
  • godot_sees_the_same_joint_facts
  • blender_sees_the_same_joint_facts
  • each_blender_loss_is_caught
  • godot_reads_the_carried_joint_record

Limits to consider

Nodes are found by exact name, so a renamed node reads as missing. The extras record is read from extras.joint and compared on type, axis, pivot and limits. Pivot and axis checks need a reference export. The reference and the export are compared in their own scene roots; a change of the whole asset's root transform shows as moved pivots.