feat(physics): add differential flat BSP traversal
Port every current containment, overlap, walkable, and six-path moving-collision query to immutable integer-indexed assets behind a graph-authoritative referee. Exact synthetic, installed-DAT, complete-resolver, and zero-allocation gates prove bit-identical behavior before connected dual publication. Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
9cd42417a8
commit
f7ff9f4eea
13 changed files with 3907 additions and 46 deletions
|
|
@ -1654,13 +1654,20 @@ port in any phase — no separate listing here.
|
|||
> defines deterministic immutable collision records and validates exact
|
||||
> source identity over synthetic corruption cases and representative installed
|
||||
> DATs; production traversal remains on the graph oracle until the later
|
||||
> differential gate.
|
||||
> differential gate. Slice I3 appends the complete prepared collision package
|
||||
> to the existing single mmap. Slice I4 now ports every current containment,
|
||||
> overlap, walkable, and six-path moving-collision entry point to the immutable
|
||||
> integer-indexed assets. Its exact referee passes 13 focused tests, 7,500
|
||||
> installed-DAT comparisons, 1,200 complete resolver frames, and 10,000 warmed
|
||||
> iterations at zero managed bytes with no mismatch. Production remains
|
||||
> graph-authoritative while I5 dual publication and the connected shadow gate
|
||||
> are active. Release build and 8,384 solution tests / 5 skips pass.
|
||||
> The historical exact cutover
|
||||
> rollback remains
|
||||
> `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete:
|
||||
> retained UI/frame work, exact bounded light selection, and
|
||||
> pooled/borrowed/direct network I/O pass 8,292 Release tests / 5 skips and the
|
||||
> connected lifecycle/reconnect gate. Slice I is active at I4 from
|
||||
> connected lifecycle/reconnect gate. Slice I is active at I5 from
|
||||
> [its detailed plan](2026-07-25-modern-runtime-slice-i.md).
|
||||
|
||||
**Spec:** `docs/superpowers/specs/2026-07-05-modern-pipeline-design.md` (the
|
||||
|
|
@ -1685,11 +1692,11 @@ hitch and follows.
|
|||
| MP1a | `AcDream.Content` extraction (GL-free MeshExtractor + boundary records out of App) | ✅ SHIPPED 2026-07-05 — user-gated (renders identical, zero tripwires, perf-neutral); 8 commits `651d041e`..`b0758d77` |
|
||||
| MP1b | Pak format + `acdream-bake` CLI + mmap `PakReader` + equivalence/full-scale gate | ✅ **SHIPPED 2026-07-24** — 729,888 EnvCell keys → 17,117 unique geometries + 712,771 aliases (42.6×), 751,141 total keys / 38,370 physical blobs, zero failures, 28,192.4 MiB, 81.4 s validated atomic publish; full-DAT gate also corrected a real collision in WB's legacy geometry hash. [Report](../research/2026-07-24-slice-b-full-bake-report.md) |
|
||||
| **MP-Alloc (safe batch)** | Reuse per-frame buffers: anim pose, particle draw-list, interior partition, animatedIds/drawableCells sets | ✅ SHIPPED + USER-GATED 2026-07-05 — dense-town frame-time spikes 20–87ms → 6–10ms, alloc spikes (30–75MB single-frame) eliminated, gen2 GC 5–11/window → ~0; user confirms FPS steady. 4 commits `b8c05e2b`..`91afea24` |
|
||||
| MP-Alloc (hard sites) | EnvCell settled-camera rebuild gate + physics `Transition` reuse | 🟡 Physics half SHIPPED 2026-07-25 — retail-shaped reset-complete transition/query scratch is bit-identical and 0 B/resolve across five profiles; immutable flat collision storage and its complete deterministic prepared package are shipped; traversal differential work continues in Slice I4. |
|
||||
| MP-Alloc (hard sites) | EnvCell settled-camera rebuild gate + physics `Transition` reuse | 🟡 Physics half SHIPPED 2026-07-25 — retail-shaped reset-complete transition/query scratch is bit-identical and 0 B/resolve across five profiles; immutable flat collision storage, its deterministic prepared package, and the zero-mismatch/zero-allocation flat traversal referee are shipped; connected dual publication continues in Slice I5. |
|
||||
| MP1c | Streaming cutover to pak + hitch gate | ✅ **SHIPPED 2026-07-24** — typed package-only production source, explicit Setup probes, non-allocating Portal-first lookup, exact translucency metadata, and ordered teardown; capped/uncapped/dense physical routes + user visual gate pass. Uncapped CPU p99 7.825→6.496 ms, GPU p99 3.406→2.706 ms, portal frame max 202.9→39.9 MiB, process allocation −41.8%, zero invalid Setup probes. [Report](../research/2026-07-24-slice-c-prepared-asset-cutover-report.md) |
|
||||
| MP2 | Retail particle distance/cell-view degradation: DAT-authored range, exact infinite/finite off-view update branches, emitter-first render scan, user-requested 2× default range | ✅ SHIPPED 2026-07-17 — Aerlinthe hotspot `0x32000223` resolves to retail 64m and defaults to 128m; landscape/entity streaming distance unchanged |
|
||||
| MP3 | Arch ECS render world + delta submission (the 300-FPS lever) | ⚪ — note: does NOT fix the steady-state GC churn (that's MP-Alloc); MP3 is the draw-submission throughput lever |
|
||||
| MP4 | Zero-alloc frame loop + flat physics data (residual, post-MP-Alloc) | 🟡 ACTIVE — Slice I1 zero-allocation transition scratch, I2 immutable schema, and I3 complete deterministic collision package shipped; I4 flat traversal shadow implementation is active. |
|
||||
| MP4 | Zero-alloc frame loop + flat physics data (residual, post-MP-Alloc) | 🟡 ACTIVE — Slice I1 zero-allocation transition scratch, I2 immutable schema, I3 deterministic collision package, and I4 exact flat traversal referee shipped; I5 dual publication and connected shadow verification are active. |
|
||||
| MP5 | Job-system parallelism | ⚪ stretch, evidence-gated |
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -128,8 +128,14 @@ prepared-collision interface over the existing single mmap. Two complete
|
|||
29,908,271,024-byte bakes contain 2,232,170 keys with zero failures and the
|
||||
same SHA-256 across different worker counts; cancellation/corruption gates and
|
||||
8,371 solution tests / 5 skips pass.
|
||||
Slice I4 ports every current collision entry point to integer-indexed flat
|
||||
assets behind a graph-authoritative referee. Thirteen focused tests, 10,000
|
||||
randomized static/swept comparisons, 5,000 walkable comparisons, 7,500
|
||||
installed-DAT comparisons, and 1,200 complete resolver frames have exact
|
||||
state/float-bit equality; 10,000 warmed flat iterations allocate zero managed
|
||||
bytes. Release build and 8,384 solution tests / 5 skips pass.
|
||||
Slice H is complete: retained UI/frame work, exact bounded light selection,
|
||||
and pooled/borrowed/direct network I/O pass. Slice I is active at I4 under
|
||||
and pooled/borrowed/direct network I/O pass. Slice I is active at I5 under
|
||||
[`2026-07-25-modern-runtime-slice-i.md`](2026-07-25-modern-runtime-slice-i.md).
|
||||
The historical exact G4 visual rollback remains
|
||||
`git revert ef1d263337997bb030eadb7b8e71d73dc659907a`.
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# Modern runtime Slice I — flat collision assets and zero-allocation physics
|
||||
|
||||
**Status:** I0–I3 COMPLETE — retail oracle, zero-allocation transition
|
||||
scratch, deterministic immutable collision records, and complete prepared
|
||||
package fixed; I4 active
|
||||
**Status:** I0-I4 COMPLETE - retail oracle, zero-allocation transition
|
||||
scratch, deterministic immutable collision records, complete prepared
|
||||
package, and exact flat-traversal differential gate fixed; I5 active
|
||||
**Parent:** `2026-07-24-modern-runtime-architecture.md`, Slice I
|
||||
**Purpose:** remove parsed DAT object graphs and steady collision allocations
|
||||
without changing one retail collision decision, float, comparison, or traversal
|
||||
|
|
@ -213,6 +213,16 @@ tests / 5 skips pass. Production traversal remains graph-only. Evidence:
|
|||
Gate: zero differential mismatch. Any mismatch blocks cutover; no tolerance
|
||||
band is permitted for deterministic scalar results.
|
||||
|
||||
**PASSED 2026-07-25:** the integer-indexed shadow ports every current
|
||||
containment, overlap, walkable, and six-path moving-collision entry point.
|
||||
The 13-test referee completed 10,000 randomized static/swept comparisons,
|
||||
5,000 walkable comparisons, 7,500 installed-DAT comparisons across three
|
||||
representative cells, all six dispatcher paths, and 1,200 complete resolver
|
||||
frames with exact state and float-bit equality. Ten thousand warmed flat
|
||||
iterations allocated zero managed bytes. Production remains graph-authoritative
|
||||
until I5/I6. Release build and 8,384 solution tests / 5 skips pass. Evidence:
|
||||
[`../research/2026-07-25-slice-i4-flat-bsp-differential.md`](../research/2026-07-25-slice-i4-flat-bsp-differential.md).
|
||||
|
||||
### I5 — dual publication and connected shadow gate
|
||||
|
||||
1. Extend collision preparation so a `LandblockBuild` carries immutable flat
|
||||
|
|
|
|||
87
docs/research/2026-07-25-slice-i4-flat-bsp-differential.md
Normal file
87
docs/research/2026-07-25-slice-i4-flat-bsp-differential.md
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
# Slice I4 - differential flat BSP traversal
|
||||
|
||||
**Date:** 2026-07-25
|
||||
|
||||
**Scope:** Modern Runtime Slice I4 only
|
||||
|
||||
**Behavioral boundary:** the new integer-indexed traversal is a shadow
|
||||
implementation. The parsed-DAT graph remains production-authoritative until
|
||||
the Slice I5 connected shadow gate and Slice I6 cutover.
|
||||
|
||||
## Result
|
||||
|
||||
`FlatBspQuery` now ports every collision entry point used by the current
|
||||
runtime over immutable, integer-indexed nodes and polygon ranges:
|
||||
|
||||
- point-in-cell;
|
||||
- sphere/cell overlap;
|
||||
- static sphere/polygon overlap;
|
||||
- swept sphere/polygon time-of-impact;
|
||||
- walkable polygon selection;
|
||||
- solid and solid-polygon traversal;
|
||||
- the complete six-path moving-collision dispatcher.
|
||||
|
||||
The port preserves retail's traversal order, strict comparisons, early
|
||||
returns, and mutable query state. The positive child remains first where
|
||||
retail visits it first; the negative child observes every valid-sphere,
|
||||
contact, path, slide, and candidate mutation made by the positive child.
|
||||
Only `BSPQuery.PolygonHitsSpherePrecise`, which is independent of graph
|
||||
storage, is shared with the existing graph oracle.
|
||||
|
||||
`CollisionTraversal` is the narrow temporary referee seam. Production starts
|
||||
in `Graph` mode. Tests can run a cloned complete resolver in `Flat` mode, and
|
||||
a missing flat asset fails explicitly instead of falling back to the graph.
|
||||
Slice I6 removes this representation switch after connected acceptance.
|
||||
|
||||
## Retail oracle
|
||||
|
||||
The implementation follows the consolidated pseudocode and boundary table in
|
||||
[`2026-07-25-slice-i-collision-layout-oracle.md`](2026-07-25-slice-i-collision-layout-oracle.md),
|
||||
including:
|
||||
|
||||
- `BSPTREE::find_collisions` at `0x0053A440`;
|
||||
- `BSPNODE::point_inside_cell_bsp` at `0x0053C1F0`;
|
||||
- `BSPNODE::sphere_intersects_cell_bsp` at `0x0053C260`;
|
||||
- `BSPNODE::sphere_intersects_poly` at `0x0053CA30`;
|
||||
- `BSPNODE::sphere_intersects_solid` at `0x0053CAF0`;
|
||||
- `BSPNODE::find_walkable` at `0x0053CC80`;
|
||||
- `BSPNODE::sphere_intersects_solid_poly` at `0x0053CD50`;
|
||||
- `BSPLEAF::find_walkable` at `0x0053D6F0`.
|
||||
|
||||
The same oracle records the cross-checks against ACE master
|
||||
`65f092...` and Chorizite DatReaderWriter `c535987...`. Retail remains the
|
||||
authority where those references differ.
|
||||
|
||||
## Differential evidence
|
||||
|
||||
The referee compares scalar results and all stateful outputs by exact float
|
||||
bits. It covers selected polygons, vectors, planes, path state, collision and
|
||||
object flags, contact-plane writes, final `ResolveResult`, persistent body
|
||||
state, and full cell membership.
|
||||
|
||||
| Gate | Executions | Result |
|
||||
|---|---:|---:|
|
||||
| Null, on-plane, radius-equality, equal-candidate, multi-polygon, and deep-tree fixtures | 4 focused fixtures | 0 mismatches |
|
||||
| Static and swept overlap randomized sweep | 10,000 paired cases | 0 mismatches |
|
||||
| Walkable randomized sweep | 5,000 paired cases | 0 mismatches |
|
||||
| Six dispatcher paths | 6 complete transition fixtures | 0 mismatches |
|
||||
| Installed-DAT sweep across `0x8A02016E`, `0x8A02017A`, and `0xA9B4013F` | 7,500 randomized cases | 0 mismatches |
|
||||
| Complete graph/flat resolver sequences | 1,200 frames | 0 mismatches |
|
||||
| Warmed flat traversal | 10,000 iterations | 0 managed bytes |
|
||||
|
||||
The installed-DAT gate randomizes points, spheres, movement, insert paths,
|
||||
orientations, scale, and boundary values. No tolerance band is used.
|
||||
|
||||
## Verification
|
||||
|
||||
- focused differential tests: 13 passed;
|
||||
- complete Core suite: 3,276 passed / 2 skipped;
|
||||
- `git diff --check`: no whitespace errors;
|
||||
- full Release build: passed;
|
||||
- complete Release suite: 8,384 passed / 5 skipped.
|
||||
|
||||
No divergence-register row changes are required. This slice changes the
|
||||
storage representation exercised by the referee, not production gameplay
|
||||
behavior. Slice I5 next publishes the prepared flat assets alongside the
|
||||
current graph under one landblock generation and runs the connected shadow
|
||||
gate.
|
||||
Loading…
Add table
Add a link
Reference in a new issue