VAT MVP — bake animated meshes to GPU-ready vertex animation textures
The headline of 3.3.0 is the Vertex Animation Texture (VAT) pipeline. Encode any skeletal animation into a position+normal texture the GPU can play back per-vertex, with zero CPU skinning, in any engine.
qtmesh vat CLI subcommand
qtmesh vat character.fbx --anim "Dance" -o bakes/dance/
qtmesh vat character.fbx --anim "Run" --fps 24 --include-shaders all
qtmesh vat character.fbx --anim "Walk" --emit-uv2 -o bakes/walk/- OpenVAT format (compatible with sharpen3d/openvat) — 16-bit RGB PNG (positions in the top half, normals in the bottom half) plus a JSON sidecar with the bake bounds.
--emit-uv2writes the per-vertex bake-column index asTEXCOORD_1into the source glTF — the column rides with each vertex through any engine importer's vertex reorder.--include-shaders {godot,unity,unreal,all}drops drop-in shader templates next to the bake.
Live web demo
editor.qtmesh.dev/#vat-demo — the Rumba dancer baked by qtmesh vat running in your browser via Godot WebGL, with a 1000× VAT vs 1000× skeletal perf comparison.
Engine sample projects
- Godot 4.2+ —
tools/godot-vat-demo/— three scenes (web, perf-VAT, perf-skeletal). VAT path consistently hits the refresh rate; skeletal path tops out at 45-60 fps for 1000 instances. - Unreal 5.3+ —
tools/unreal-vat-demo/— Python-driven asset bootstrap auto-builds the demo on first project open. - Unity 2022.3 LTS / 6 —
tools/unity-vat-demo/— experimental (rendering not fully working on Apple Silicon Metal — see README's Status section for what's confirmed + suggested next steps).
Inspector panel + MCP tool
- New VAT subgroup in the Inspector with a one-click "Bake VAT…" button, animation picker, fps, output dir, and an "Include shaders" multi-select.
- New
bake_vatMCP tool (and matching HTTP REST endpoint) so AI assistants can drive the bake.
Turntable PNG export
qtmesh turntable model.fbx -o turntable.png # 12-frame PNG sprite sheet
qtmesh turntable model.fbx -o frame_%02d.png --frames 24 --axis y --camera-height 25Renders an orbit-camera spin around a mesh and writes either a single sprite-sheet PNG or per-frame PNGs. The same OffscreenRenderer that the GUI viewport uses, so framing/lighting matches what the editor shows.
Pose Library
New .poselib sidecar format for storing reusable poses across sessions.
- Apply / mirror / undo —
qtmesh pose mesh.fbx --library apply --apply <name> -o out.fbx - Save / load via CLI, Inspector, and MCP (
save_pose_library,load_pose_library,mirror_pose,apply_pose_masked). - _l ↔ _r heuristic for one-click mirror across the body.
- Selection-masked apply so you can stamp a hand pose without disturbing the legs.
Node animation (transform tracks)
Animate any SceneNode's TRS — not just bones. Useful for prop animation, camera moves, anything driven by a transform.
- New
NodeAnimationManagersingleton with full undo/redo. - CLI:
qtmesh nodeanim model.fbx --listto inspect tracks. - MCP tools for adding/removing/listing node-animation tracks programmatically.
Morph targets in the dope sheet
Morph-target tracks now show up as read-only rows in the dope sheet alongside bone tracks, with their own collapsible band capped to a sensible height + clipping diamonds that don't overflow the row.
PlayStation 1 runtime ripping (Phase 2+)
Major progress on the experimental PS1 mesh ripper (still gated by -DENABLE_PS1_RIP=ON and OFF by default):
- libretro host — load + play real ISOs via the bundled libretro core (
scripts/install-ps1-libretro-core.sh). - Live GP0 capture — FIFO bridge with per-source capture stats. CLUT-aware texture decoding.
- GTE matrix capture — real GTE math + orthonormal-matrix gate + matrix-tag diagnostics so per-draw transforms reconstruct correctly.
- Golden capture acceptance suite — regression tests pinned to a known-good capture set.
- Coordinate normalization + affine-UV handling, model-space TMD/HMD RAM scanner.
Design doc: src/PS1/PS1_RIP_DESIGN.md. CI enables the flag on Linux test builds only.
Other improvements
- VAT exporter no longer flips left-handed on glTF/GLB output — fixes mesh-mirror artifacts in baked outputs.
- Windows distribution now ships
OgreMeshLodGenerator.dll(LOD generation no longer crashes the .exe at startup). - Website — deep-linking to any section (
/#vat-demo,/#install,/#cli) works on initial load and during in-session hash changes. Section titles get a hover-visible#anchor. - Code review hardening — path-traversal guard on the custom glTF importer, fail-fast missing-asset checks in the Unity build pipeline, accessor-layout validation in glTF readers.
Install
- Homebrew (macOS):
brew install --cask fernandotonon/qtmesh/qtmesheditor— auto-updates on this release. - WinGet (Windows):
winget install FernandoTonon.QtMeshEditor— manifest auto-submitted to microsoft/winget-pkgs by this release's CI. - Snap (Linux):
snap install qtmesheditor— auto-publishes from this release. - Docker:
ghcr.io/fernandotonon/qtmesh:3.3.0(and:latest) — auto-built by this release. - GitHub Action:
uses: fernandotonon/QtMeshEditor@3.3.0— for CI pipelines that need theqtmeshCLI.
Preview
