Overview
Once meshoptimizer lands as a dependency (via the parent AI-Assist epic #397, first consumer in #398 LOD generation), it unlocks a whole class of mesh-quality rules that qtmesh scan and qtmesh fix can apply without any ML — using the same battle-tested algorithms that glTF tooling, Godot, and Unity rely on for asset-import validation.
Today's scan rules (max_texture_resolution, require_uv_channels, detect_zero_weight_bones, detect_overlapping_uvs_pct, detect_non_manifold_edges_pct, redundant-keyframe analysis) cover textures, UVs, skeletons, animations, and topology. Mesh-buffer quality is the missing dimension — that's what this epic adds.
Why a separate epic
#397 is about AI-assisted authoring features (the user opts in per-task: "give me a LOD", "auto-unwrap UVs"). This epic is about automated quality validation — silent rules the scan pipeline applies to every asset, with corresponding --fix paths that are safe by default.
Different consumer (CI / qtmesh scan users in a pre-commit pipeline) and different cadence (rules ship together as one config-driven feature set), so a separate epic keeps the design pressure clean.
Child Issues (proposed)
Scan rules
Fix actions
Reports
Acceptance Criteria
Dependencies
Out of scope
Overview
Once meshoptimizer lands as a dependency (via the parent AI-Assist epic #397, first consumer in #398 LOD generation), it unlocks a whole class of mesh-quality rules that
qtmesh scanandqtmesh fixcan apply without any ML — using the same battle-tested algorithms that glTF tooling, Godot, and Unity rely on for asset-import validation.Today's scan rules (
max_texture_resolution,require_uv_channels,detect_zero_weight_bones,detect_overlapping_uvs_pct,detect_non_manifold_edges_pct, redundant-keyframe analysis) cover textures, UVs, skeletons, animations, and topology. Mesh-buffer quality is the missing dimension — that's what this epic adds.Why a separate epic
#397 is about AI-assisted authoring features (the user opts in per-task: "give me a LOD", "auto-unwrap UVs"). This epic is about automated quality validation — silent rules the scan pipeline applies to every asset, with corresponding
--fixpaths that are safe by default.Different consumer (CI /
qtmesh scanusers in a pre-commit pipeline) and different cadence (rules ship together as one config-driven feature set), so a separate epic keeps the design pressure clean.Child Issues (proposed)
Scan rules
analyzeVertexCachegives ACMR; >2.0 flags a vertex buffer that doesn't reuse cached transforms efficiently. Common in meshes that came out of a sculpting tool without an export-time reorder pass.analyzeOverdrawratio threshold. Triangles drawn in an order that maximizes pixel overdraw waste fragment shader work.analyzeVertexFetchratio threshold. Bytes fetched per vertex × overhead; identifies meshes with bad spatial locality.weldVertices-then-diff pass.qtmesh fixbut currently uses Ogre's heuristic; meshoptimizer's analysis is more precise.Fix actions
optimizeVertexCache+optimizeVertexFetchon every submesh, write back. Lossless.optimizeOverdrawwith a configurable threshold (default 1.05). Lossless reorder.generateVertexRemap+remapVertexBuffer+remapIndexBuffer. Lossless dedupe.simplifyWithAttributesto a configured target tri count (simplify_target_trisper submesh). Same meshoptimizer code path as the AI: meshoptimizer-backed LOD generation #398 LOD generator.Reports
scan --jsonoutput, comparable across runs (CI gating, asset-budget tracking).scan.fix.*) so usage analytics show which fixes users actually apply.Acceptance Criteria
qtmesh.ymlconfig schema (opt-in via numeric threshold, 0 = disabled).--dry-runpreview that lists what would change without writing.qtmesh scan ./assets --jsonshape extends to include the new metrics under amesh_qualityblock.Dependencies
Out of scope
pack-textures/atlassubcommands already exist).