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
126 lines
8.1 KiB
Markdown
126 lines
8.1 KiB
Markdown
# 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 into
|
||
`assembler/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.
|