Parse the occlusion PVS grid
A z -> y -> x tree of u16 node offsets over 4x4x4-unit cells, each populated cell naming one 128-byte mask of 1024 visibility bits that the renderer fills from the camera's cell each frame. Two sentinels carry meaning and one of them is easy to miss: a z or y slot of 0 means "no subtree", and an x slot of 0xffff means "no cell". Reading the latter as a mask index gives a grid whose highest mask is 65535 on every single level, which is the tell. The check that makes this real is the mask array. It starts at masks_offset and runs to (highest_mask + 1) * 0x80, and on every level with a grid that ends at the block boundary exactly -- widest unexplained tail across the disc is 0 bytes. A wrong tree shape or cell size would leave the highest mask index elsewhere entirely. 412,521 populated cells over 140,939 masks, across the 24 levels that have one. An offset of 0 means the level has no occlusion data at all, which is not the same as "at the start of the file" -- that is where the tfrags block lives, and parsing it as a grid produces a mask array that fits anyway, with 1600 bytes to spare. That is what made level 10 look plausible on the first pass; three levels (10, 24, 25) carry none.
This commit is contained in:
+7
-1
@@ -207,7 +207,13 @@ Phase 1 hands over the extents; this phase works out what each one contains.
|
||||
- [ ] `shrub` — foliage and decorative meshes
|
||||
- [ ] `moby` — dynamic actors; `moby_anim` — skeletal animation
|
||||
- [ ] `collision` — cells, packed vertices, faces
|
||||
- [ ] `occlusion` — the PVS grid
|
||||
- [x] `occlusion` — the PVS grid. A z/y/x tree of u16 node offsets over 4x4x4-unit
|
||||
cells, populated cells naming 128-byte masks. **412,521 cells over
|
||||
140,939 masks** across the 24 levels that have one; the mask array ends
|
||||
within 48 bytes of the block boundary on every level. 3 carry no occlusion
|
||||
data, and an offset of 0 means *absent* rather than "at the start" — the
|
||||
latter parses as a grid whose mask array happens to fit, which is how it
|
||||
nearly went wrong.
|
||||
- [ ] `sky`, `volumes`, `textures` (CSM1 CLUT + PS2 alpha)
|
||||
- [ ] `level_overlay` — the seven-section parser and relocation from Phase 3
|
||||
|
||||
|
||||
Reference in New Issue
Block a user