CNA-GAP-043: glTF skins with more than 72 joints are refused at import
Evidence basis: source-verified at the pinned commit; tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit 009d40f5; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.
BuildSkeleton throws for a skin above the 72-matrix GPU palette (SkinnedEffect::MaxBones), naming the joint count, instead of truncating it.
- Identifier
CNA-GAP-043- Category
- Functional gap
- Subsystem
- Models & glTF
- Status
- Open
- Verified against
- CNA
009d40f5(009d40f5dd085c4e674d3479675fac84b12b3e0a) - Evidence basis
- Source-verified: read at TARGET, not executed
- Tests touching this area
- Yes: see Current tests
- Affected contract
- ContentManager::Load<Model> and the offline converters on glTF skins with more than 72 joints
Expected behaviour
Many current glTF rigs exceed 72 joints (facial and finger bones); a glTF importer is expected to load them.
Actual behaviour at TARGET
BuildSkeleton in GltfImportCore.cpp (GLTF-261) throws when a skin has more than kMaxPaletteBones (72) joints. The limit is XNA's own SkinnedEffect.MaxBones, which sizes every renderer's bone uniform array, and refusing is a deliberate choice over truncation, which would collapse the extra joints toward the origin.
Source locations
modules/content/src/GltfImport/GltfImportCore.cpp— BuildSkeleton: GLTF-261 refusal above 72 joints
Evidence
Checked by reading at 009d40f5; not executed. The limit matches XNA 4.0's SkinnedEffect.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
The refusal lives in BuildSkeleton; the extraction probe in GltfContainerValidationTests.cpp builds every skin so that such a refusal is observed rather than reported as a clean import.
Regression test
If the palette grows or skins are split per mesh, an over-72-joint fixture expecting a correct pose.
Blast radius
glTF characters with large rigs; they cannot be loaded at all.
Workaround
Reduce the rig to at most 72 joints, or split the mesh so each part is skinned by at most 72 joints.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Deep dives
- Skinning and animation: the palette
- Known issues
- Functional gap index