CNA-GAP-041: A glTF mesh placed by several nodes takes its morph-weight animation from the first of them only
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.
ExtractMorphWeightTrack resolves a mesh to the first node in file order that instances it, so every placement plays that node's weights channel and channels on the other nodes are ignored.
- Identifier
CNA-GAP-041- 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 morph weights of a multiply-instanced mesh
Expected behaviour
glTF animates morph weights per node; two nodes instancing one mesh can play different expressions.
Actual behaviour at TARGET
ExtractMorphWeightTrack in GltfImportCore.cpp scans data->nodes for the first node whose mesh matches and reads only channels targeting that node. GltfImportCore.hpp documents this as “a documented simplification for a rare edge case”. Default weights, by contrast, are read per instancing node (GetMeshDefaultWeights).
Source locations
modules/content/src/GltfImport/GltfImportCore.cpp— ExtractMorphWeightTrack: first matching node onlymodules/content/include/CNA/Internal/GltfImport/GltfImportCore.hpp— ExtractMorphWeightTrack documentation
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
GltfMorphBlendingTests.cpp covers per-node default weights for a mesh instanced by several nodes; no test was found that animates such a mesh's weights per node.
Regression test
A fixture with one morphed mesh under two nodes with different weight channels, expecting two tracks.
Blast radius
Files that reuse a morphed mesh with independently animated expressions.
Workaround
Duplicate the mesh per placement in the source file.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Deep dives
- Skinning and animation: morph targets
- Known issues
- Functional gap index