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:
1 parent
07b3fe2852
commit
f23ab7b9fa
5 files changed
+976
-87
No files matched your search
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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.
|
||||||
Reference in new issue
Block a user