โ† All examples

asset contracts

Animation export trap checker with a Blender declare and repair procedure

Catch exports that keep every mesh but lose animation: only the playing action exported, clips merged, channels without targets, clips baked to one pose or over the whole scene range. Ships the Blender scripts that declare a scene's clips and put every action on its own NLA track.

What this component contains

  • ATTRIBUTION.md
  • LICENSE
  • README.md
  • animation_export_trap_checker.py
  • asset_report.py
  • component.json
  • fixtures/bad_active_action_only.gltf
  • fixtures/bad_declaration_path.clips.json
  • fixtures/bad_merged_clips.gltf
  • fixtures/bad_no_animations.gltf
  • fixtures/bad_scene_range_bake.gltf
  • fixtures/bad_static_clip.gltf
  • fixtures/bad_unresolved_target.gltf
  • fixtures/door.clips.json
  • fixtures/door.gltf
  • gltfio.py
  • pngio.py
  • procedure/declare_clips_blender.py
  • procedure/push_actions_to_nla.py
  • schema_lite.py
  • test_animation_export_trap_checker.py
  • test_package.py
  • verification/native.json

How it works

Entry points
export_clips, read_declaration, compare, check, run, main, procedure/declare_clips_blender.py, procedure/push_actions_to_nla.py
Proves
The export carries a clip of each declared name, each declared target (node and path) has a resolved channel in it, at least one channel of it changes value, its play length is within tolerance of the declaration, and no channel of any clip points at a missing node.
Does not prove
That the motion is the intended motion (only that something moves), that interpolation matches the source curves, or that an engine plays the clip on the right node at run time.
Catches
asset_unreadable, declaration_invalid, animations_missing, clip_missing, clips_merged, clip_target_missing, channel_target_unresolved, clip_static and 1 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_plays_the_same_clips
  • blender_plays_the_same_clips
  • comparator_rejects_altered_engine_facts
  • trap_reproduced_by_blender_default_export
  • procedure_fix_exports_every_declared_clip
  • godot_plays_the_repaired_export

Limits to consider

Clips are matched by exact name; a renamed clip is reported missing with similar names as a hint. Motion is detected as any output value changing by more than 1e-5, so a quaternion that flips sign without turning counts as motion. The Blender scripts read actions through slots and channel bags (Blender 4.4 and later) and fall back to plain F-curves; they handle object, bone and shape key channels, not drivers, constraints or geometry nodes animation. The declared play length is the last frame of the action range divided by the scene frame rate.