From db414b3d5fce709f4a051290308385ff5bd0b6a1 Mon Sep 17 00:00:00 2001 From: ReaperOfVeriod Date: Sun, 11 Oct 2026 03:05:07 +0200 Subject: [PATCH] Correct: the gap between collision and moby is texture data The previous commit claimed ~6.2 MB of unidentified data sat between the collision header and the first moby class, and speculated it might be moby_anim. That was wrong, and it came from quoting a size before bounding the thing it measured. Looking at the bytes rather than only the offsets: the range is dominated by 8-bit indexed texture data. Byte-value concentration distinguishes them cleanly -- a texture block draws on a small palette, code and collision data does not. 18 of 21 sampled 4 KB blocks fall under 200 distinct byte values, against 249 for tfrags and 209 for collision. The real layout on level 0: collision 2615232 .. 3518544 (header plus its declared 903,248 payload) textures 3518848 .. ~8832192 moby 8832192 .. The texture table's data_offset values stop at 5326208, which is what made the gap look genuine. Mip chains extend well past the last entry's offset, so sizing a region from a table of first-level offsets understates the data it points at. Three of the 21 blocks are not texture-like, so something is mixed in that is still unidentified. It is not 6.2 MB of moby_anim. This is the third number this session that looked load-bearing and turned out to rest on an unbounded measurement. The pattern is consistent enough to be worth stating plainly: sizes derived from tables or offsets are not evidence until the bytes underneath have been looked at. --- docs/formats/core-data-regions.md | 35 ++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/docs/formats/core-data-regions.md b/docs/formats/core-data-regions.md index e246b2c..1b19f26 100644 --- a/docs/formats/core-data-regions.md +++ b/docs/formats/core-data-regions.md @@ -49,7 +49,7 @@ that nothing yet accounts for. the disc test asserts it, so the gap stays visible rather than being papered over by clamping to the end of the lump. -## Found by printing it: an unnamed region between collision and moby +## Correction: it is mostly texture data, not an unnamed region Adding the region table to `gc-extract probe` made the gap visible immediately, which is the point of printing it. @@ -64,16 +64,27 @@ but collision's own header declares a payload of 903,248 bytes. So the range between the collision header and the first moby class is **6.2 MB**, and almost none of it is collision. -The successor rule is right -- a region does end where the next begins -- but -"the next" is not yet known here. `collision..moby` is really -`collision + .. moby`. The name is wrong, not the bound. +The first conclusion drawn from this -- that ~6.2 MB of unidentified data sat +between collision and moby, possibly `moby_anim` -- **was wrong**, and it was +wrong because of the same failure that produced the other two bad numbers this +session: quoting a figure before bounding it. -Candidate homes for those 6.2 MB, in rough order of likelihood: the moby and -tie model *animation* data that `moby_anim` would need, volume data, or -per-class runtime structures. The tfrag texture texels are already accounted -for and sit earlier in the lump. +Checking the bytes rather than just the sizes: the range is dominated by 8-bit +indexed texture data. Byte-value concentration (a texture block uses a small +palette; code and collision data does not) puts 18 of 21 sampled 4 KB blocks +under 200 distinct byte values, against 249 for tfrags and 209 for collision. -Until that region is named, any per-format probe reading between the collision -header and the first moby class is reading something this table does not -describe. Worth resolving before starting `moby_anim`, since that format is the -most likely tenant of the space. +So the real layout is: + +| region | start | end | +|------------|----------|------------------| +| collision | 2615232 | 3518544 | +| textures | 3518848 | ~8832192 | +| moby | 8832192 | first tie class | + +The texture table's `data_offset` values only reach 5326208, which is why the +gap looked real: mip chains extend well past the last entry's offset. A region +sized from a table of first-level offsets understates the data it points at. + +Three of the 21 sampled blocks are not texture-like, so something is mixed in +and is not yet identified, but it is not 6.2 MB of `moby_anim`.