GenerateMesh scopes passage queries to the tile's sample bounds with a feature AABB BVH plus per-passage segment BVHs; L9 proof boxes use a passage-bound BVH. Whole view vs L24: FI ~0%, SW +3.7% (reviewer interleaved). All hashes equal L27; all passage/route/proof audits pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSFYgsdW8ejZSyiMf4qRSX
8.1 KiB
Linux L28 — tile-bounded columns and passages
Branch: wip/l25-helix, based on L27. No commit. No Unreal files changed.
Cost and culling
The plain interleaved baseline puts the L27 overhead in tile streaming/meshing, not shape compilation: mean whole-view time was 2.058 s versus L24's 1.527 s for SurfaceWorld (+34.8%), and 19.961 s versus 16.699 s for FloatingIslands (+19.5%). Shape time stayed near 0.46 s (SurfaceWorld) and 0.97 s (FloatingIslands). The initial extra work was passage composition inside the map-wide density sampling loop.
GenerateMesh now enters a passage-query scope using the exact inclusive tile sample bounds, including the normal halo. A conservative feature AABB BVH supplies candidate route segments, columns and mouth support. Long route nearest-distance searches use a per-passage segment BVH. L9 proof boxes use a separate passage-bound BVH; disjoint roots reject far boxes without scanning segments. If a native-only negative-control shape has no proof index, its box check falls back to a conservative linear test.
Instrumented full-view counts (diagnostic build; 2,370 desired tiles):
| Recipe | Composition samples | Column guard: calls / tiles | Exact column SDF: calls / tiles | Route band samples / tiles | Route SDF unions / tiles | Route samples skipped / tiles | Feature candidates: tiles / total |
|---|---|---|---|---|---|---|---|
| SurfaceWorld | 12,039,941 | 1,885,887 / 692 | 3,017 / 4 | 1,380,907 / 870 | 164,337 / 543 | 7,470,572 / 1,792 | 8 / 1,222 |
| FloatingIslands | 58,019,623 | 7,619,575 / 689 | 7,213 / 6 | 1,902,086 / 708 | 62,507 / 89 | 54,848,675 / 2,212 | 14 / 1,331 |
The exact column SDF is spatially culled. The cheaper radial guard remains in tiles sharing the column's Z slab because positive SDF values can lower positive base density; a broader tile skip would need an exact bound on that field. This is part of the remaining SurfaceWorld cost. Per composition sample, the profile counted 0.125 carve-segment tests, 0.036 support-segment tests and 0.0136 route SDF unions in SurfaceWorld; FloatingIslands counted 0.0125, 0.0028 and 0.00108. Column guards ran on 15.7% / 13.1% of samples, while the complex column SDF ran on 0.025% / 0.012%.
Interleaved whole-view cost
Five W12 quartets ran in order L24, L28a, fresh L27-source build, L28b. Hashing was off. Values below are means of the five samples; raw samples are in Saved/Linux/linux28-r28-finalfix-cost5-{recipe}-{l24,l27,r28a,r28b}-p1..p5.log. L24 used Saved/Linux/l24-source/bin/linux/VoxelForgeCoreHeadless-linux24-clang19; L27 was rebuilt from the current L27 source for this comparison.
| Recipe | L24 | L27 | L28a | L28b | L28a / L28b vs L24 |
|---|---|---|---|---|---|
| SurfaceWorld | 1.527 s | 2.058 s | 1.592 s | 1.605 s | +4.30% / +5.12% |
| FloatingIslands | 16.699 s | 19.961 s | 16.651 s | 16.787 s | -0.29% / +0.53% |
FloatingIslands returned to L24 cost. SurfaceWorld misses the ~3% target by 1.3–2.1 percentage points. Its remaining excess is about 69–80 ms in streaming wall time and 13–15 ms in shape time; the density-aware radial guard and per-tile query setup/traversal remain. The guard cannot be removed bit-exactly without a proven upper bound on the incoming positive density.
Bit parity and audits
Final Clang and GCC binaries match L27 for both recipes at W1, W8 and W12: all 12 hash records per run match (full detail, whole view, LOD0–8, exact query). This is 12 compiler/recipe/worker combinations with zero mismatches. Logs: Saved/Linux/linux28-r28-hash-finalfix-{clang,gcc}-{surface-world,floating-islands}-w{1,8,12}.log.
Representative hashes, equal to L27:
| Recipe | Full detail: density / mesh / payload / topology | Whole view: density / mesh / payload / topology | Exact query: density / detail / collision |
|---|---|---|---|
| SurfaceWorld | ace56c8f205238ad / a9c603a1248de6b8 / ea55f1f4fcc6a894 / 5ea7bc78a1b678ae | 117547e5e18c6847 / db5fa276315ff2d4 / b4e9d01d70413fea / 03caf881fa047f1c | c949c4df2ce6f9d9 / 114c501e2d830d94 / e6011d3a248d4849 |
| FloatingIslands | ed550e0c8b182695 / 0e410a8e80a3e7f7 / 0751926f0c67d8a4 / f01208bc2f7841ec | 70ab5bc87dd174d2 / 6f357f9085a496f0 / 08ce7d4e036da65a / eb5eef04a5cb85d9 | 7b7c50ac24ccadcc / efcba20c0c70c415 / e604823a249029bf |
The 24 m crossing matches fresh L27-source builds on both compilers and recipes: SurfaceWorld, 314 tiles: density 3561ea23485e359f, mesh e8331620fb0fb908, payload 765f7dad67c852aa, topology 3ccc09ac81c05d71. FloatingIslands: density e3d0ea833bca4215, mesh 6b3d0f148ed83d93, payload d6ed85f16acd895e, topology 9745683036522461.
Across 4 styles × 2 recipes, capsule walkability, open air, naturalness, no-long-bridge, strict-validator controls, route bindings and passage audits pass on final Clang/GCC binaries. Final passage logs are Saved/Linux/linux28-r28-finalpassage-{clang,gcc}-{surface-world,floating-islands}-style{0..3}.log.
The final route/proof/readiness matrix also passes in all 16 compiler/style/recipe runs: L13 route parity verifies 8/8 page pairs and 14 higher-LOD exact pairs with zero mismatches; the readiness guard catches its negative control; L9 reports zero proof violations. SurfaceWorld has 0 unknown blocks; FloatingIslands has 21,504 fallback/unknown blocks for each style. The diagnostic full-view profile queried 26,946 FI proof boxes with only 40 path-bound and 1 column-bound tests, so far boxes reject at the BVH root. These unknowns are not evidence of a fat passage bound. A fresh rerun of the saved L27 binary with the default owner input also reports 21,504; older L27 logs showing 17,408 did not reproduce. Final matrix logs are Saved/Linux/linux28-r28-finalmatrix-{clang,gcc}-{surface-world,floating-islands}-style{0..3}.log.
Two inherited SurfaceWorld FloorProfileBlend checks remain over the 2-voxel threshold in styles 1 and 3: 2.544 and 3.645 voxels. The same failures and values are in L27 logs for both compilers; other styles pass.
Invariants, edits and run history
Changed Core files: Standalone/Core/src/ShapeWorldInternal.h and Standalone/Core/src/VoxelForgeCore.cpp. Navigation/design docs and this report were updated. No Unreal edits or Unreal compile. L3 FP-contract preamble/self-test, L4 FLazy, L7 shared cache, L9/L12 proof rules, L11 readiness, L13 route binding, L18/L19 shared ceiling, L21/L22 layout and bands, L23–L27 passage behavior, ARCHITECTURE §8.10 and CLAUDE.md async rules remain intact.
Failed or retried runs:
- First parity/readiness command omitted --stream-benchmark and --stream-pipeline; rerun with both.
- Initial readiness negative-control crashed on an empty proof BVH in a temporary native-only shape. Added the conservative no-index fallback; final readiness checks pass.
- The first final W1 hash command omitted the explicit owner data path and failed to open data under Saved/Linux. Preserved as linux28-r28-hash-finalfix-clang-surface-world-w1-attempt1-failed.log; rerun with Standalone/data/owner_world.json and all final W1/W8 hashes passed.
- Initial moving-crossing comparison used stale L27 logs. Rebuilt L27 from source and reran; all four compiler/recipe hashes then matched.
- Older saved L27 proof logs reported 17,408 FloatingIslands unknown blocks. Reran the saved L27 binaries and compared with final L28: both report 21,504, zero violations.
- An exploratory composed-bound FloatingIslands W12 hash differed; the density-threshold variant restored equality and is the version measured here. An interrupted/empty Clang R15 build was rerun successfully.
No run exceeded 30 minutes or remained stuck for 15 minutes. Builds were Clang 19 and GCC 14, W12 CPU affinity 0–11, with the 6 GiB address-space cap. No commit, push or stash was performed.
Orchestrator review (Claude)
- Re-run by me (W12, no hashing, interleaved): SW L24 1.455/1.485/1.484 s vs L28 1.502/1.539/1.555 s (median +3.7%). Accepted as the cost of the passage/column feature. FI is back to L24 cost.
- Bit-identical to L27 (12/12 configs + crossing). With this,
wip/l25-helix(L25–L28) is merged intoassembler/world. - Note for later: the pre-existing SW FloorProfileBlend check over threshold in styles 1/3 (2.544/3.645 voxels) is unchanged since L27.