wip(L28): passage columns/routes culled per tile (BVH); cost back near L24, bit-identical to L27

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
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-21 07:42:16 +02:00
1 parent 07b3fe2852
commit f23ab7b9fa
5 files changed
+976 -87

No files matched your search

+17
View File
@@ -2034,6 +2034,23 @@ adapter edit is required. The L26 report contains the eight-style table, hashes,
[`Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md) [`Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md)
records the final evidence. records the final evidence.
### 8.45 Tile-bounded passage evaluation — World Assembler M3 Linux L28
Each mesh tile scopes passage composition to the inclusive density-sample AABB, including the
mesher's normal halo. A conservative feature AABB BVH selects route segments, columns and mouth
support for that tile. A per-passage nearest-segment BVH bounds the long helix search; a separate
passage-bound BVH rejects far L9 proof boxes. An unindexed native-only proof object uses a conservative
linear fallback. No field, union order, serialized layout or recipe version changes.
The column's exact complex SDF is evaluated only in XY/Z feature candidates. A cheap density-aware
radial guard remains for samples sharing the column's Z slab: a positive column distance can still
lower positive base density, so skipping that guard needs an exact bound on the base field. This is
the remaining SurfaceWorld cost noted in the Linux L28 report. The passage candidate lists and
proof bounds preserve the L27 output.
[Linux28 report](Standalone/Research/WorldAssemblerM3/Linux28/REPORT.md)
records counts, parity, costs and audit caveats.
## 9. Multiplayer model (listen-server first, dedicated-friendly) ## 9. Multiplayer model (listen-server first, dedicated-friendly)
> **Status: transport is DESIGN ONLY — nothing is networked in-tree yet** (no `Replicated`/`HasAuthority`/RPCs; a > **Status: transport is DESIGN ONLY — nothing is networked in-tree yet** (no `Replicated`/`HasAuthority`/RPCs; a
+9
View File
@@ -1208,6 +1208,15 @@ The shared evaluator is version 13; FloatingIslands geometry remains version 7 a
schema V3 is unchanged. See ARCHITECTURE §8.44 and schema V3 is unchanged. See ARCHITECTURE §8.44 and
[`Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md). [`Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md`](Standalone/Research/WorldAssemblerM3/Linux26/REPORT.md).
### 3.28 Tile-bounded passage evaluation — World Assembler M3 Linux L28
| Symbol | Canonical file | Role |
|---|---|---|
| FScopedPassageTileQueries / BuildPassageFeatureTileList / ResolvedPassageIntersectsBox | Standalone/Core/src/ShapeWorldInternal.h; scope entered by GenerateMesh in Standalone/Core/src/VoxelForgeCore.cpp | Builds conservative per-tile route, column and mouth-support candidates from an AABB BVH; long paths use a nearest-segment BVH and L9 box checks use a separate passage-bound BVH. Empty native-only proof indexes fall back conservatively. The density arithmetic and serialized versions stay unchanged. |
See ARCHITECTURE §8.45 and
[Linux28 report](Standalone/Research/WorldAssemblerM3/Linux28/REPORT.md).
## 4. The density pipeline (most-edited hot path) ## 4. The density pipeline (most-edited hot path)
### 4.1 `GetDensityWithParams` (TunnelNetwork) — VoxelGenerator.cpp:3749 ### 4.1 `GetDensityWithParams` (TunnelNetwork) — VoxelGenerator.cpp:3749
File diff suppressed because it is too large. Load diff
+6
View File
@@ -2137,6 +2137,12 @@ namespace VoxelForgeCore
out.diagnostics.featureListMilliseconds=std::chrono::duration<double,std::milli>( out.diagnostics.featureListMilliseconds=std::chrono::duration<double,std::milli>(
std::chrono::steady_clock::now()-FeatureListStart).count(); std::chrono::steady_clock::now()-FeatureListStart).count();
const ScopedWorldAssemblyFeatureQueriesV1 featureScope(featureQueries); const ScopedWorldAssemblyFeatureQueriesV1 featureScope(featureQueries);
// GenerateMesh samples only origin..origin+extent plus the one-step normal halo;
// queryMinimum/queryMaximum above are exactly that inclusive domain.
// GenerateMesh n'échantillonne que origin..origin+extent et la marge de normale d'un pas ;
// queryMinimum/queryMaximum ci-dessus couvrent exactement ce domaine inclusif.
const FStandaloneShapeWorld::FScopedPassageTileQueries passageFeatureScope(
tileShape,queryMinimum,queryMaximum);
const bool bDiagnosticColumnSampling=options.diagnosticGlobalOctaveDrop!=0 const bool bDiagnosticColumnSampling=options.diagnosticGlobalOctaveDrop!=0
||options.diagnosticColumnInterpolationStride>1; ||options.diagnosticColumnInterpolationStride>1;
const std::uint32_t PreviousOctaveDrop=bDiagnosticColumnSampling const std::uint32_t PreviousOctaveDrop=bDiagnosticColumnSampling
@@ -0,0 +1,125 @@
# 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.