Appendix H glTF Importer, Runtime, and Test-Evidence Matrix
This matrix keeps three questions separate: what the shared import core accepts or transforms, what the alpha.1 runtime represents, and how far the tag’s evidence reaches. “Reported” means GltfImportReportEXT makes a loss visible; it does not mean the missing feature was implemented. Chapters 39–43 explain the contracts.
H.1 Containers, scenes, and geometry
| glTF feature | Importer / offline route | Runtime representation | Focused evidence |
|---|---|---|---|
| .gltf/.glb | Shared cgltf core; paired generated containers. | Direct Load<Model> and offline CNJ. | Manifest, L0/L1, 148 container pairs. |
| External/data resources | Data URI, buffer view, and contained percent-decoded external paths; absolute/traversal/symlink escapes refused. | In-memory decode and owned textures/buffers. | Structural/URI rejection tests and corpus cases. |
| Version/extensions | Version 2.0 check, overflow/alignment guards, cgltf_validate; unsupported required extensions rejected, optional losses warned. | Ordered diagnostics on the model. | Validator audit, extension-registry and rejection fixtures. |
| Scene graph/instancing | Default scene, parent-before-child graph, node matrix/TRS, shared-mesh placements. | Synthetic root plus one ModelBone per reachable node. | L1–L4 and D1–D3 regressions. |
| Multiple skins/groups | Every group extracted; converter emits separate outputs. | Direct route retains all groups in one model; SkinsEXT maps palettes to meshes. | Multi-skin, mixed static/skinned, direct/CNJ parity tests. |
| Accessors | Offsets, strides, normalization, sparse base/override, safe bounds and index range. | Dense semantic streams and packed buffers. | L2, fuzz/robustness locks, D4 regression. |
| Vertex layouts | Selection table emits ten glTF strides; source attribute losses counted. | Canonical stride/declaration table reaches renderers. | L5 byte goldens and table validators. |
| All seven topologies | Points/lines retained; loop closed; strips/fans converted; incomplete tails counted. | Per-part CNAEXT PrimitiveType. | Topology corpus; D5 fixed. |
| Mirrored placement | Negative determinant detected per instance. | Fact reported; application owns cull-state response. | L3/L4 fixtures and diagnostic lock. |
H.2 Materials, scenes, and animation
| glTF feature | Importer / offline route | Runtime representation | Focused evidence |
|---|---|---|---|
| Core metallic–roughness | Factors and seven texture slots, alpha/cull state, samplers, colour space, independent transforms and two UV selectors retained. | Rigid/skinned PBR parameter contract; factor-only materials remain PBR. | L3/L5/L6 and L7 material fixtures; D7 fixed. |
| Vertex colour | COLOR_0 multiplied through unlit/basic and PBR layouts. | Strides 24/56/60/80, with renderer capability policy. | Byte and pixel fixtures. |
| Material variants | Source-order names and sparse primitive mappings retained direct/offline. | Model-wide CNAEXT selection restores full part state or default. | Variant L3–L7 cases. |
| Extension textures | Specular factors transported; optional maps have named renderer gaps. KTX2/WebP require a PNG/JPEG fallback. | Registry qualifies each claim. | Registry validator, renderer inventories, selected pixels. |
| Texture transforms/samplers | Independent state per sampled map; up to two source UV sets packed. | Effect parameters plus renderer sampler slots. | L3/L5/L6 and multi-map L7 fixtures. |
| Skins | Joint order remapped; ancestry and mesh-node cancellation kept as root prefixes. | All ModelSkinEXT mappings plus first-skin Tag alias. | Reversed order, multi-skin, D8. |
| Animation | Skeletal clips use palette indices; rigid clips use scene-node indices. | SkinningData or ModelAnimationsEXT; mixed-carrier drops reported. | LINEAR/STEP/CUBICSPLINE, D6 fixed. |
| Morphs | Position/normal/tangent targets and weights imported; invalid omissions reported. | CPU blend and buffer re-upload using canonical layout offsets. | Semantic, CNJ parity, runtime tests. |
| Cameras | Perspective/orthographic projection data and node placement imported. | Model::CamerasEXT. | Camera corpus and model tests. |
| Punctual lights | Up to three mapped to directional slots; point/spot/range/cone losses counted. | XNA IEffectLights approximation. | L3/L6/L7 plus report tests. |
| Draco | Supported only in builds with the decoder; required use otherwise refused. | Ordinary model buffers after decode. | Compressed/uncompressed parity fixtures. |
H.3 Route and oracle boundaries
The direct reader and cna_tool_gltf_to_cnj share semantic extraction but package the result differently. Direct loading creates one model containing every represented group and fixes unit scale at 1. The converter can apply an explicit scale and emits one named CNJ output per group. A CNJ reload proves the serialized boundary for the fields it carries; it is not a claim that JSON bytes and a live object are identical.
| Layer | State | Observation |
|---|---|---|
| L0 | implemented | corpus, manifest, helper integrity, and suite/rung partition |
| L1 | implemented | container structure, scene and declared relationships |
| L2 | implemented | decoded accessor values |
| L3 | implemented | semantic mesh/material/scene/diagnostic state |
| L4 | implemented | composed scene and skin coordinate spaces |
| L5 | implemented | packed vertex/index bytes; 140 goldens, 8 explicit absences |
| L6 | implemented | bound matrices, materials, maps, samplers, lights, palettes |
| L7 | recorded | four 148-disposition renderer campaigns (140 PNGs + 8 rejections each) |
All original D1–D8 records are fixed at alpha.1 and remain in the append-only ledger as regression history. The broader GLTF ROBUST milestone remains 9/12: two renderer specular-map bindings, native point/spot lighting, and a fourth renderer on the bounded external retake matrix remain the three open rows. The tag therefore supports strong layer-qualified claims, not an unqualified promise about every file and renderer combination.