diff --git a/docs/formats/core-data-regions.md b/docs/formats/core-data-regions.md index 3f5255e..32ed38f 100644 --- a/docs/formats/core-data-regions.md +++ b/docs/formats/core-data-regions.md @@ -2500,6 +2500,53 @@ Neither of these decodes any record's *fields*. What is now settled is the shape the decoder has to handle: uniform stride per type, 4-byte aligned, with one named exception carrying three strides. +## Tie: the "vertex positions" claim does not survive a stride test (2026-10-11) + +**Range measured:** level 0, one class, one 58-quadword packet region. + +The claim from earlier reads, `i16[0..2]` of a 16-byte element are the vertex +positions, and 95,612 vertices were "measured" on that reading. A raw dump of +one packet kills it: + + 0000df20 00900000 075006c0 094000c0 + 1f736c63 00544848 00281506 0d40001b + 0d400a90 ffff00ff 00010ef0 80004253 + 4846a9e3 48a44001 47f40000 46d0b0de + 0000ee50 00c00000 08a007e0 099000f0 <- group repeats at +64 + 0f807e72 01484848 00321208 0cf00017 + 0cf00ab0 ffff00ff 00020e60 80002e46 + 4858389a 48a44001 47f40000 46d7bbe3 + +**The first 16 bytes are not a vertex at all** -- they are the packet's own +header material: `0x0000df20` is not a coordinate and the following words are +the vif/material words. The 16-byte group at +0 recurs at +64 and +128 with +identical structure (a small i16, then 0, 0, then an index) and its three +instances carry the values -8416, -4528, -784. So the stride is **not** 16 +throughout: some elements are 4 bytes, some 16, and the run length varies. + +**The period-4 marker does not generalise either.** Grouping every fourth +16-byte element by the high byte of `i16[3]` gives marker 0 (n 9,204), 0x48 +(n 4,140), 0xff (n 4,912) and 0x01 (n 1,137), and only 0x48 shows a +plausible position signature -- `i16[1]` extent 425 against `i16[0]` and +`i16[2]` at 65,535, which is the height axis of a flat object. But the same +marker 0 bucket has all three slots spanning the full `i16` range, so the +bucket does not select a layout. + +**Two candidate vertex bases were measured and neither clusters.** With +`packet + vert_ofs` the per-class extents run median 64,976 and p90 65,517; +with `class + vert_ofs` they run median 55,213 and p90 64,352. Both span the +whole `i16` range, whereas a real position triple in a level-class local frame +must span a fraction of it. `vert_ofs + vert_size + scissor_size` is the +region length, so the region bounds are right -- what is wrong is the element +layout inside it. + +**Consequence for earlier claims, stated plainly.** The 95,612-vertex +measurement and the 82.5% texcoord fixedness figure were both computed on the +16-byte reading and are not superseded by this -- they are untested against the +correct stride, which is not yet known. The LOD1/LOD2-sharing test +(96.1% same class against 0.4% different) remains the strongest evidence that +the first slots are positional, and it is insensitive to stride. + ## Most of the chunk container is level-independent Comparing every chunk record against the same record index in the other 26