CNA-GAP-040: A skinned glTF model cannot also carry rigid scene-node animation: tracks not driven by its skins are dropped
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.
Model::Tag holds SkinningData for a skinned model, so scene-node clips whose tracks are not carried by a skin palette are dropped with the rigid-animation-dropped-on-skinned-model diagnostic.
- Identifier
CNA-GAP-040- 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> on glTF files that animate non-joint nodes of a skinned model
Expected behaviour
A glTF file may animate both a skin's joints and ordinary nodes; both kinds of track should reach the application.
Actual behaviour at TARGET
ContentManager.cpp attaches rigid clips (ModelAnimationsEXT) only to an unskinned model. For a skinned one it counts the scene-node tracks not carried by the skins, logs a GLTF-295 warning and calls AppendGltfRigidAnimationDropEXT (GltfImportCore.cpp), which records rigid-animation-dropped-on-skinned-model: “cannot be retained because Model::Tag already contains SkinningData”. Tracks on nodes that belong to a skin palette are kept through the skin.
Source locations
modules/content/src/Xna/ContentManager.cpp— ReadGltfModel: GLTF-294/GLTF-295 branchesmodules/content/src/GltfImport/GltfImportCore.cpp— AppendGltfRigidAnimationDropEXT
Evidence
Checked by reading at 009d40f5; not executed.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
GltfImportReportTests.cpp covers the diagnostic; no test expects the rigid tracks to survive.
Regression test
If a second carrier is added (a property rather than Tag), a fixture with a skinned mesh and an animated prop node expecting both clips.
Blast radius
Skinned characters whose files also animate props, cameras or other rigid nodes.
Workaround
Split the rigid parts into a separate unskinned file.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- User guide
- Model loading: runtime glTF
- Deep dives
- Skinning and animation: clips
- Known issues
- Functional gap index