CNA-GAP-043: glTF skins with more than 72 joints are refused at import

CNA snapshot 009d40f5  ·  Known Issues › Functional gaps  ·  source links pinned to 009d40f5

✓

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

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.

The same subject is explained at several altitudes. These are the neighbouring pages at each one.