CNA-BUG-243: docs/gltf-limitations.md says CNA reverses the winding of mirrored glTF placements; the importer leaves it unchanged
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.
The limitations table's mirrored-transform row says 'CNA reverses it and marks the placement', while ContentManager.cpp, the import report (mirrored-winding-unapplied) and GltfMirroringTests.cpp all establish that the winding is not reversed.
- Identifier
CNA-BUG-243- Category
- Bug
- Subsystem
- Documentation & release tooling
- Status
- Open
- Verified against
- CNA
009d40f5(009d40f5dd085c4e674d3479675fac84b12b3e0a) - Severity
- Low (a triage suggestion, not a project priority)
- Evidence basis
- Source-verified: read at TARGET, not executed
- Tests touching this area
- Yes: see Current tests
- Affected contract
- docs/gltf-limitations.md (section 2, the 'A mirrored node transform' row)
Expected behaviour
CNA's limitations document is the authority an asset author reads to learn what the importer does.
Actual behaviour at TARGET
The row in gltf-limitations.md reads: “… §3.7.4 requires the winding to be reversed for front faces to stay front-facing. CNA reverses it and marks the placement, rather than leaving the model inside-out.” The code does the opposite: ContentManager.cpp warns that “CNA does not reverse the triangle winding for it”, GltfImportCore.cpp reports mirrored-winding-unapplied, and GltfMirroringTests.cpp states that CNA “carries the fact rather than applying it”. The same document's material-state table and docs/gltf-conventions.md correctly leave the reversal to the application.
Source locations
docs/gltf-limitations.md— section 2: 'A mirrored node transform' rowmodules/content/src/Xna/ContentManager.cpp— ReadGltfModel: GLTF-116 warningmodules/content/src/GltfImport/GltfImportCore.cpp— AppendGltfInstanceReportEXT: mirrored-winding-unappliedmodules/content/tests/CNA/Internal/GltfImport/GltfMirroringTests.cpp— header comment: the fact is carried, not applied
Evidence
Checked by reading at 009d40f5; not executed.
Independent re-verification: Checked by reading at 009d40f5; not executed. Only detection and reporting consume mirroredEXT; no draw path reverses culling. gltf-limitations.md is under a partial mechanical gate: GltfLimitationsDoc.EveryReportFieldNamedHereExistsInTheHeader checks that the row's report field (mirroredEXT) is declared, and GltfMirroringTests pins detection through hierarchies and untouched shared buffers, but nothing checks the row's prose, so the false claim that CNA reverses the winding is not caught. CNA-GAP-038 tracks the missing reversal itself.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
None; documentation is not tested.
Regression test
Correct the row to say the placement is reported (mirrored-winding-unapplied) and the cull reversal is left to the application.
Blast radius
Readers of the limitations document, who are told mirrored meshes render correctly when they render back-facing (CNA-GAP-038).
Workaround
No workaround is known.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Known issues
- Bug index