Skip to content

feat: AI asset pipeline track, Phase 2 (engine export presets) - #133

Merged
TMHSDigital merged 3 commits into
mainfrom
feat/ai-asset-pipeline-phase-2
Sep 12, 2026
Merged

feat: AI asset pipeline track, Phase 2 (engine export presets)#133
TMHSDigital merged 3 commits into
mainfrom
feat/ai-asset-pipeline-phase-2

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Summary

Phase 2 of the AI asset pipeline track: the engine export layer that Phase 3's templates/ai-asset-pipeline-template/ will call. One skill, three snippets, one rule plus harness extension, one example.

  • Skill engine-export-presets composes ai-mesh-cleanup and depsgraph-and-evaluated-data. Unity is Y-up glTF (export_yup=True). Godot in this repo is Z-up glTF (export_yup=False). Unreal is centimeter scale on both exporters, and the RNA split is the contract: glTF has no global_scale / axis_forward / axis_up; FBX has those and has no export_yup.
  • Snippets export_preset_unity.py, export_preset_godot.py, export_preset_unreal.py apply selected-mesh transforms via temp_override, pass use_selection, and treat Draco as opt-in (they do not duplicate gltf_draco_export.py).
  • Rule use-correct-axis-rna-per-exporter plus a per-call extension of tests/check_import_export_rules.py (not a parallel harness). A mixed Unreal snippet that correctly calls both exporters still passes.
  • Example export-preset-axis exports the same beacon under Unity and Godot, reads disk POSITION, re-imports, and asserts Unity stands while Godot lies along -Y. --same-axis exits 9.

Out of scope (untouched): templates/ai-asset-pipeline-template/, live-session agent bridge, LICENSE, issue #131, the 53 existing examples, generation-vendor integrations.

VERSION / CHANGELOG.md / CLAUDE **Version:** / ROADMAP **Current:** / plugin "version" are not hand-edited. Same convention as Phase 1 (#132); the release workflow owns those.

ROADMAP: cleanup sub-track marked Shipped (v0.54.0); engine export presets marked Shipped; template and agent bridge left unpinned. The Blender 5.2 LTS sweep line is already SHIPPED (PR smoke 5.2+4.5, weekly 5.1). There is no "July 2026" planned-sweep line to correct.

Axis RNA (docs + live binaries)

Official current docs (inspection-only as HTML; confirmed live on the three local binaries below):

Live-run-proven RNA dump (bpy.ops.export_scene.{gltf,fbx}.get_rna_type().properties) on all three local builds. Identical on 4.5.11, 5.1.2, and 5.2.1:

Property glTF FBX
export_yup yes no
axis_forward no yes
axis_up no yes
global_scale no yes
apply_unit_scale no yes
export_apply yes no
use_mesh_modifiers no yes
use_selection yes yes
export_draco_mesh_compression_enable yes no

No version branch for the axis kwargs. The example guards by requiring every passed glTF kwarg to exist on operator RNA.

Task 3 canary (verbatim)

Fixture: .scratch/canary_axis_rna.py (gitignored, deleted after the run) with one export_scene.gltf(..., axis_forward="-Z", axis_up="Y") call and one export_scene.fbx(..., export_yup=True) call.

ERROR: .scratch/canary_axis_rna.py: export_scene.gltf call passes axis_forward or axis_up (FBX RNA; glTF uses export_yup)
ERROR: .scratch/canary_axis_rna.py: export_scene.fbx call passes export_yup (glTF RNA; FBX uses axis_forward / axis_up)

Harness exit 1. Clean scan (python tests/check_import_export_rules.py with no extra paths) then printed import/export anti-pattern checks passed. and exit 0, including the Unreal snippet that legally contains both export_yup (glTF) and axis_forward (FBX).

Example: live-run-proven

Probed and rendered on all three local binaries:

Binary Reports
.scratch/blender-4.5.11-windows-x64/blender.exe Blender 4.5.11 LTS (4db51e9d1e1e)
.scratch/blender-5.1.2-windows-x64/blender.exe Blender 5.1.2 (ec6e62d40fa9)
.scratch/blender-5.2.1-windows-x64/blender.exe Blender 5.2.1 LTS (9e2066aef7ef)

Check-only AABBs were byte-identical across the three:

source_aabb x=-0.4500..0.8400 y=-0.5700..0.4500 z=0.0000..2.1600
unity_reimport x=-0.4500..0.8400 y=-0.5700..0.4500 z=0.0000..2.1600
godot_reimport x=-0.4500..0.8400 y=-2.1600..0.0000 z=-0.5700..0.4500
unity_tip_err=0.000e+00 godot_tip_err=0.000e+00

--same-axis on 5.2.1: both reimports stand, stderr ERROR: orientations did not differ, exit 9.

Render path framing (all three): fill x=0.809 (band 0.70..0.90), margins >= 0.088, exit 0. No cross-version visual shim needed. Gallery hero/preview encoded with Pillow from the 5.2.1 PNG (1280x720 webp quality 85 / 1200x675); hero 8272 bytes, preview 7780 bytes.

Contact sheet: docs/gallery/contact-sheets/export-preset-axis-contact-sheet.webp vs pinned set armature-bend / damped-track-aim / bmesh-gear.

Image Mean luma
armature-bend 71.08
damped-track-aim 43.89
bmesh-gear 77.71
export-preset-axis 46.84

Verdict: stage darkness in family with damped-track-aim (the dark member of the pinned set); warm wedge on the back wall; subject fill 0.809; olive + cyan beacon reads at thumbnail size; standing vs lying is the orientation contract. Not an asset-type example; no asset sheet.

Generated gallery HTML inspected: index card alt is the full teaches string (no dotted-path truncation); detail witnesses callout matches gallery.json.

Inspection-only

  • Skill/snippet/rule prose and README wording.
  • Official docs pages listed above (RNA also live-proven).
  • Phase 3 template shape (not shipped).
  • Godot engine is Y-up; this repo's Godot preset is Z-up glTF so the Unity/Godot pair is a measurable axis split. That naming is a product choice, documented in the skill.

Test plan

  • python tests/check_import_export_rules.py exits 0
  • Validate job (counts, manifest, harness)
  • blender-smoke 5.2 LTS check-only export-preset-axis
  • blender-smoke 4.5 LTS check-only export-preset-axis
  • Drift-check
  • Do not merge until both smoke legs are green

TMHSDigital and others added 3 commits September 11, 2026 19:45
glTF axis is export_yup; FBX is axis_forward/axis_up plus centimeter scale.
The presets compose ai-mesh-cleanup and depsgraph-and-evaluated-data instead of restating them.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
export_scene.gltf does not take axis_forward/axis_up; export_scene.fbx does not take export_yup.
The check is per-call so a file that correctly uses both exporters still passes.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The same beacon under export_yup True vs False produces different disk POSITION and different reimported orientation.
Inventory, gallery, catalog, and the engine-export-presets roadmap row ship with the example.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions github-actions Bot added skills rules snippets documentation Improvements or additions to documentation labels Sep 11, 2026
@TMHSDigital
TMHSDigital merged commit 41a82f2 into main Sep 12, 2026
10 checks passed
@TMHSDigital
TMHSDigital deleted the feat/ai-asset-pipeline-phase-2 branch September 12, 2026 01:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation rules skills snippets

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant