Skip to content

Choose a tag to compare

@fernandotonon fernandotonon released this 27 May 00:23
616d558

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-uv2 writes the per-vertex bake-column index as TEXCOORD_1 into 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 / 6tools/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_vat MCP 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 25

Renders 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 / undoqtmesh 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 NodeAnimationManager singleton with full undo/redo.
  • CLI: qtmesh nodeanim model.fbx --list to 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 the qtmesh CLI.

Preview

image