CNA-GAP-041: A glTF mesh placed by several nodes takes its morph-weight animation from the first of them only

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.

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

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.

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