QtMeshEditor is a free 3D asset tool designed for indie game developers to streamline their 3D asset pipeline. It offers robust capabilities for scanning, validating, converting, fixing, and merging 3D assets, supporting both GUI and CLI workflows.
Key Features:
Merge animations from multiple files into a single output.
Convert between over 40 file formats, including FBX, glTF, OBJ, Collada, STL, and Ogre Mesh.
Edit materials with AI assistance for enhanced visual design.
Inspect skeletons, bone weights, and animation data for precise control.
Audience & Benefit:
Ideal for indie game developers and 3D artists to optimize their workflow, reduce manual tasks, and maintain high-quality assets. QtMeshEditor supports automation in CI/CD pipelines, enabling teams to validate and process assets at scale. It can be installed via winget for easy setup on Windows systems.
README
QtMeshEditor
Automate your 3D asset pipeline โ scan, validate, convert, fix, and merge 3D assets with GUI + CLI + CI/CD support.
Always follow the latest GitHub release โ use the Marketplace floating tag fernandotonon/QtMeshEditor@v1 (same pattern as the Marketplace example). The composite action defaults to image-tag: latest, so the Docker CLI tracks the newest published ghcr.io/fernandotonon/qtmesh image.
Reproducible builds โ pin the action and the container to the same semver as this repositoryโs project(QtMeshEditor VERSION โฆ) in CMakeLists.txt (currently 3.1.0). After bumping the version in CMake, run ./scripts/sync-doc-versions-from-cmake.sh to refresh the pinned refs in README.md and the docs site fallback; CI enforces the match with ./scripts/sync-doc-versions-from-cmake.sh --check.
Floating ref (auto-updates when the v1 tag moves on release):
- name: Run QtMesh scan
uses: fernandotonon/QtMeshEditor@v1
with:
command: scan
QTMESH_CLOUD_TOKEN is forwarded into the container and used by scan upload. GitHub Actions metadata (GITHUB_*) is also forwarded so uploads include meta fields (branch/commit/run and context used by QtMesh Cloud).
To fail CI when upload fails, add qtmesh-strict-upload: true (or pass --strict-upload in options).
Release tags are listed on the releases page (also referenced in QtMesh Cloud onboarding).
More CI examples
# Validate a specific mesh
- uses: fernandotonon/QtMeshEditor@3.2.0
with:
command: validate
input-file: ./models/character.fbx
image-tag: "3.1.0"
# Convert FBX โ glTF
- uses: fernandotonon/QtMeshEditor@3.2.0
with:
command: convert
input-file: ./models/character.fbx
output-file: ./output/character.gltf2
image-tag: "3.1.0"
# Resample Mixamo animations (200+ keyframes โ 30)
- uses: fernandotonon/QtMeshEditor@3.2.0
with:
command: anim
input-file: ./animations/dance.fbx
output-file: ./output/dance_optimized.fbx
options: --resample 30
image-tag: "3.1.0"
# Get mesh info as JSON
- uses: fernandotonon/QtMeshEditor@3.2.0
id: info
with:
command: info
input-file: ./models/character.fbx
options: --json
image-tag: "3.1.0"
# Docker (alternative โ :latest tracks newest image; pin :3.1.0 to match semver action ref)
docker run --rm -v $(pwd):/workspace ghcr.io/fernandotonon/qtmesh:latest scan ./assets --fail-on error
ZBrush-style polypaint and BaseColor texture painting, with a 2D preview
panel, multiple brush tools (paint, erase, fill, color picker, smudge),
texture-slot picker per submesh, and a one-click bake that turns vertex
colors into a UV-space texture.
Quick start (texture paint, GUI):
Switch to Material Mode (mode bar at the top).
Select a mesh entity. The Inspector's Texture Paint section
shows a slot picker (every paintable TUS across submeshes) and a 256ร256
live preview of the active texture.
Click the paint brush button in the toolbar to enable painting. The
first click on the mesh auto-creates a paint session against the active
slot (or you can pre-create with Create / Attach Texture).
Pick a tool from the row at the top of the panel: โ Paint, โซ Erase, โง Fill,
โฐ Pick (eyedropper), โฟ Smudge. Brush color/radius/strength/falloff comes
from the shared Paint Brush section above the toolbar's brush popup.
Left-click-drag on either the 3D mesh or the 2D preview panel. Both
drive the same paint buffer; the 2D preview updates in real time and a
brush ring shows where the cursor maps on the 3D surface (and vice versa).
Saveโฆ / Loadโฆ round-trips the buffer to disk as PNG (or any format
QImage can write).
Vertex paint (GUI):
Same flow, but vertex paint operates in Edit Mode instead. Press Tab
on a selected mesh to enter Edit Mode, then tick Vertex Color Preview in
the Edit Mode Tools section to see vertex colors live.
Bake Vertex Colors โ Texture rasterizes the active mesh's vertex colors
into a UV-space PNG via barycentric interpolation, then dilates the result
outward by N pixels to mask UV-seam bleed at MIP-map time.
Export. Vertex colors are preserved on export to formats that support
them (glTF preferred โ verified round-trip).
Notes / limitations.
Brush size is in local mesh units (shared with vertex paint). For texture
paint we divide by mesh bounding-box extent and clamp to a UV-friendly
range, so 0.25 produces a sensible stamp on both a unit cube and a
100-unit character.
Painting auto-rebinds every TUS named albedo or diffuse_map on the
active material โ imported PBR materials alias the diffuse texture under
both, and rebinding only one would leave the other pointing at the
original.
Bake uses fan triangulation of n-gon faces; concave faces should be
pre-triangulated.
โจ Merge Mixamo Animations in Seconds
Download animations from Mixamo, drop them into QtMeshEditor, and merge into a single file โ export as glTF, FBX, Collada, OBJ, or Ogre Mesh.
๐ฌ More in Action
Split View
Skeleton Animation Controls
MCP tools (AI Agent Control)
Bone Weight Visualization
๐ค AI-enhanced Material Editor
๐ฎ Features
Asset scanning โ ESLint for 3D assets: check naming, complexity, skeletons, formats
40+ format support โ FBX, glTF, OBJ, Collada, STL, Ogre Mesh, and more
Animation merge โ combine Mixamo clips into one file
Animation resampling โ reduce keyframe density for game engines