re: MCOL's 0x5C block is bounding spheres at stride 16 -- the 0.75 was 12/16

The unexplained ~0.75 ratio left at the end of the last iteration was my own
stride.  I had read the block as 12-byte points because REGN's vertex section
is 12 bytes, and never checked it: len(0x5C) is not a multiple of 12 in 5 of
the 11 objects, so that stride was never arithmetically possible.

At stride 16 the relation is exact in 11/11 -- max u16 == len(0x5C)/16 - 1 --
and the record reads as {centre f32[3], radius f32}.  Powered test, since a
u16 is reached through a specific grid cell: the sphere it names reaches that
cell in 18 559/18 577 = 99.90%, against a 12.02% random-sphere control.  Both
fields carry signal (centre alone 26.75%, radius shuffled 70.19%).

The converse -- is the list *exactly* the intersecting set? -- is 0.38%, which
is the expected direction: a bounding sphere is conservative, so membership
implies overlap but not the reverse.  The tighter geometry is in 0x54/0x58,
still undecoded.  18 entries (0.10%) go the wrong way and are recorded as open.

tools/re-capture/regn_decode.py is copied unchanged from auto/regn-reader so
the probe's POF0 reader is the known-good one rather than a second copy.
This commit is contained in:
Sylpheed RE agent
2026-08-26 09:04:30 +00:00
parent 3274ee6d8e
commit 4f0d21f50d
4 changed files with 584 additions and 2 deletions

View File

@@ -381,6 +381,22 @@ search cannot find a *schedule*.
See [`structures/regn-map-grid.md`](structures/regn-map-grid.md).
❔ Still open there: the **runtime consumer** (not reached; a `float4`-aligned
header read with VMX loads leaves no displacement signature to search for).
✅ **`MCOL` is the collision sibling, and its broad phase is decoded
(2026-08-26).** Same container, same 11 maps, same cell size. Chain:
`position → cell → A record → B record {count, u16[n]} → 16-byte bounding
sphere`. The `0x5C` block is **stride 16 `{centre f32[3], radius f32}`**, not
the 12-byte points I had assumed — `len(0x5C)` is not even a multiple of 12 in
5 of 11 objects, and `max u16 == len/16 − 1` in **11/11**. Powered check: the
referenced sphere reaches the cell that reached it, **18 559/18 577 = 99.90 %**
against a 12.02 % random-sphere control, and ablating either the centre or the
radius costs most of the signal. Reproduce with
`tools/re-capture/mcol_probe.py verify`.
⚠️ The stale ≈**0.75×** ratio I had recorded as "too consistent to be
coincidence" was **12/16** — my own wrong stride, not a fact about the data.
❔ Still open: the `0x54` and `0x58` blocks (the geometry these spheres bound;
neither has a constant stride against the sphere count), and 18 cell entries
(0.10 %) whose sphere misses its cell by 0.4–13 %.
See [`structures/mcol-collision.md`](structures/mcol-collision.md).
* 🔴 **`hidden/DefTables.pak` is NOT it** (checked 2026-08-24). The three
unnamed schemas are more **model/render** tables in the same vocabulary as the
named ones — `7e66225f` (283 objects) carries `RenderFrameModel`,