AVoxelWorld::CoreVoxelSizeCm (default 25, 32 voxels/tile) flows through plan, field, mesher, content, water, atmosphere, edits and collision. Staged-owner BuildHost passes at 20 cm (SurfaceWorld + islands, W1/W8/W16, anchors, BP edits, collision) with a fixed-25cm negative control; default-size hashes match round 4; Core off stays legacy 12.5 cm. Reusable BuildWorldAssemblyFeatureTileListV1; wired into FloatingIslands only so far. 256-island stress: tile p95 112.5 -> 2.0 ms, 0 mismatches, dropped-feature control fails. Content placement measured (no populated cells): island ground search 7.25 ms/cell vs legacy 0.29 ms -- open. Outside-review evaluation in Round5/REPORT.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
170 lines
22 KiB
Markdown
170 lines
22 KiB
Markdown
# World Assembler M3 Round 5 / World Assembler Round S1
|
||
|
||
**Date:** 2026-10-18
|
||
**Scope:** tile-local feature lists first, one runtime Core voxel-size source, staged-owner placement-cost measurements, and evaluation of the supplied outside review.
|
||
|
||
## Result
|
||
|
||
The generic conservative tile-feature-list API is implemented and used by Floating Islands. Its field values and aggregate probe hashes match the full-scan control at four islands and a 256-island stress count; the deliberately dropped-feature control is detected.
|
||
|
||
Core now resolves physical voxel size from AVoxelWorld::CoreVoxelSizeCm. The default is 25 cm, the supported range in this integration is 12.5–25 cm, and CoreTileVoxelCount is 32. Core-off remains on the legacy 12.5 cm path. The size is carried in Core world configuration and non-default sizes affect world identity. This is per-world for now; the boundary, edit, LOD and hashing contract required for per-strate sizes is listed below.
|
||
|
||
The staged owner SurfaceWorld and Floating Islands routes passed end-to-end BuildHost checks at 20 cm, including W1/W8/W16, field/height anchors, content/water/atmosphere, BP carve/fill, collision and movement/streaming checks. Default 25 cm SurfaceWorld and Floating Islands aggregate hashes now match Round 4 exactly. A root-aware air-side search bound was needed to keep the tile-list field bit-identical outside island geometry; the staged 2,802-tile actor plan compared candidate and full-scan density at every sampled point with zero mismatches.
|
||
|
||
## 1. One Core voxel-size source
|
||
|
||
### Contract and implementation
|
||
|
||
- AVoxelWorld::CoreVoxelSizeCm is the one world-level Core voxel-size setting. GetActiveVoxelSizeCm() resolves it at runtime. CoreTileVoxelCount is 32 voxels; physical tile width at LOD L is derived from the active size, 32 and 2^L.
|
||
- The size is represented in microns in VoxelForgeCore::WorldConfiguration alongside tileVoxelCount. Plan serialization and the season/content identity include the resolved non-default size. At the default 25 cm, the new identity suffix is omitted to preserve the old default identity.
|
||
- Core-off reads the legacy VOXEL_SIZE path and does not use the Core setting.
|
||
- Active Core physical lengths and coordinate conversions now derive from the getter for field/mesher geometry, transforms, height probes, content and tree placement, water, atmosphere, brushes and edit strength, collision bounds, streaming, clipmap and LOD. The legacy-grid manager bridge remains explicit and derives its ratio from the active size. Core tile coordinates stay in voxel units.
|
||
- The SurfaceWorld Core-to-owner chunk-coordinate mapping is computed from active size; it no longer assumes a fixed 25-to-12.5 ratio.
|
||
- The setting is a reflected AVoxelWorld field. Plain-language owner note: it changes how many centimetres one Core voxel covers; at the default of 25 cm the world keeps its old Core scale, and a value of 20 cm makes the same 32-voxel tile 640 cm wide instead of 800 cm. It does not change the legacy world when Core is off.
|
||
|
||
The staged 20 cm identity check reported SHA-1 4A62DB4F07FD958075856FA5A2F1B508937F757C; the alternate 25 cm identity was CCF5E42EC8405CDAB4065952AFFAA0DC932D3594. The default 25 cm check reported the inverse pair and distinct=1. This proves that peers using different active Core sizes do not share the same season/content identity.
|
||
|
||
### BuildHost proof
|
||
|
||
The staged-owner 20 cm SurfaceWorld and Floating Islands runs both completed in BuildHost. The SurfaceWorld run took 12m11s (731.65 seconds) and peaked at about 3.95 GiB. It reported W1/W8/W16-identical hashes:
|
||
|
||
| SurfaceWorld hash | 20 cm |
|
||
|---|---|
|
||
| Density | 0x0cd2a1a4152ee4aa |
|
||
| Mesh | 0x540f8671bb53e7c8 |
|
||
| Payload | 0x250aed7c9f875659 |
|
||
| Topology | 0xed49c64851e0ce73 |
|
||
|
||
The exact native height and content ground were both -30,126.797 cm (0 cm delta); water was -29,260.781 cm; atmosphere bounds were (-40,320, 640) cm. Content anchors, water and atmosphere all followed the same planned scale. The BP carve/fill fixture passed with a 75 cm brush radius, Core strength 6.25, exact center density changes of +6.25/-6.25, a partial value at 60 cm and zero change at 80 cm. Collision bodies, anchor motion and W1/W8/W16 passed. The Core-off content gate reported legacy 12.5 cm.
|
||
|
||
The 20 cm Floating Islands actor route also passed W1/W8/W16, native island/span content anchors, water and atmosphere, Blueprint edits, capsule contacts on the island and connector, and Core-off legacy behavior. Its assembly hash was 6bc8e57a763a6ca5; recipe hash f12c1b9c291ff311; plan hash fbf909dc4bddcf18. Island top agreement was exact; connector span delta was 0.349 cm. Water was -29,260.801 cm and atmosphere bounds were (-40,320, 640) cm. Density/mesh/payload/topology matrix: 0x9dbd7dc8f3fe872f / 0xa120324982cd49b2 / 0xf836bd7f7288a9e3 / 0xbb6402d5aa697991.
|
||
|
||
The 20 cm checks also include two falsifiable scale controls:
|
||
|
||
1. Reintroducing a fixed 25 cm tile conversion predicts 800 cm for a 32-voxel tile; the active 20 cm result is 640 cm. The expected 160 cm span error is detected by the geometry audit.
|
||
2. Reintroducing the default-size brush strength at 20 cm uses 5 instead of the required 6.25 Core density units. The BP carve/fill center-value assertion detects the stale magnitude and sign/direction checks still distinguish carve from fill.
|
||
|
||
At the default 25 cm, the fresh SurfaceWorld W1/W8/W16 hashes exactly match Round 4: 0x0cd2a1a4152ee4aa / 0x17775c835711e5a3 / 0xa27224958fc27d7b / 0x3821fea90b134ce4. Height delta was 0 cm, water was -36,575.977 cm, atmosphere bounds were (-50,400, 800) cm, and the BP edit, collision and streaming gates passed.
|
||
|
||
The default Floating Islands assembly, recipe and plan hashes remain 9c372e7bfb5b8310 / 5e0370d9f95f1c15 / dbbda4932378047a. After correcting the distant-group bound, the default W1/W8/W16 hashes are exactly the Round 4 aggregate: density 0x4dcfb37585d7d986, mesh 0x725a18374c5623de, payload 0xfb345d8cb319d18b, topology 0x76f2846be8efb5f4. The actor run used the same 2,802-key clipmap, and the temporary diagnostic compared candidate and full-scan density for every field call with no mismatches. Its height/content, water/atmosphere, capsule contact, Blueprint edit and Core-off checks passed.
|
||
|
||
At 20 cm, the corrected Floating Islands actor generated 2,850 tiles and passed W1/W8/W16: density/mesh/payload/topology 0xb4282f8a486c6e92 / 0x83a186d80937d98a / 0x92fe9b3bcfc25e44 / 0xaee5ad83fca9da82. Island ground matched terrain exactly; connector-span residual was 0.349 cm. Water was -29,260.801 cm, atmosphere bounds (-40,320, 640) cm, both capsule contacts passed, the 75 cm BP carve/fill test passed, and Core-off remained 12.5 cm legacy.
|
||
|
||
The default M2 V1/V2 analytic fixture-only validation passed exact repeats for five fixtures, same-LOD border identity, V2 marching-cubes identity and all 125 doorway phases. The full default V2 actor run also passed; the run ledger records its timing, hashes and log.
|
||
|
||
### Per-strate size decision
|
||
|
||
Per-strate resolution is deferred. It is not a safe scalar substitution: one physical query can cross a boundary where sample spacing changes. Before enabling it, define:
|
||
|
||
1. Canonical physical-space field queries and ownership rules at a strate boundary.
|
||
2. Deterministic transition meshes and common LOD ancestry so both sides agree on shared borders.
|
||
3. Edit rasterization/replay that reaches both grids with no holes or double application, including edits crossing the boundary.
|
||
4. A stable sorted strate-ID-to-size map in plan/season identity, plus worker and border hashes that include both sizes.
|
||
5. Streaming and collision policies for a tile spanning or supporting two resolutions.
|
||
|
||
## 2. Per-tile feature lists
|
||
|
||
BuildWorldAssemblyFeatureTileListV1 is the reusable API. It consumes conservative inclusive feature bounds and returns stable ordered feature indices for a tile. FloatingIslandFieldV1 builds the list once for each tile and the worker-scoped evaluation context sends densityAt through that candidate list. Bounds include the features' full influence; a feature that cannot be proven irrelevant stays in the list. This supports future caves, shafts, pits and passages without making each field family invent its own skip rule.
|
||
|
||
The Round 5 audit compares full scan and candidate-list output at exactly the same sample locations. The hash and mismatch assertions make a false skip observable.
|
||
|
||
| Plan | Features | List build | Full scan p95 / median per sampled tile | Candidate p95 / median | Candidates p95 | Equality |
|
||
|---|---:|---:|---:|---:|---:|---|
|
||
| Current | 4 islands + 3 connectors | 72 lists, 0.0396 ms total; 0.0009 ms p95/list | 0.9189 / 0.8644 ms | 0.9097 / 0.5010 ms | 6 | 60,000 samples; 0 mismatches; hashes 1ae5da3039bdcbdd / 1ae5da3039bdcbdd |
|
||
| Stress | 256 islands + 240 connectors | 3,280 lists, 95.133 ms total; 0.0461 ms p95/list | 112.458 / 111.660 ms | 1.972 / 1.326 ms | 4 | 64,000 samples; 0 mismatches; hashes 7b92fa4e8d6acf49 / 7b92fa4e8d6acf49 |
|
||
|
||
The stress plan reduced sampled tile p95 from 112.46 ms to 1.97 ms (about 57×). List construction is a one-time per-plan/per-tile preparation cost in the audit; the stress build took 95.133 ms total, with the 95th percentile list taking 0.0461 ms. The negative control drops an island and its summary bound; the field-hash assertion fails and reports negative_control_detected=1. Both audit plans have exact_mismatches=0. The staged owner plan adds a broader check: the 2,802-tile default actor run compared candidate and full scan at each queried point and reproduced the Round 4 aggregate.
|
||
|
||
## 3. Content and tree placement measurement
|
||
|
||
The BuildHost commandlet timed the staged owner settings at 64 placement-grid cells and eight columns per cell. There are six authored decoration entries. The sampled cells produced zero actual placements, so the numbers below isolate ground-search cost and steady manager update overhead. They do not include spawn, component creation, instance upload or a populated placement cell. The per-frame number is the stationary manager Update measurement; it is not a rendered frame capture.
|
||
|
||
| Route | Voxel / cell width | Density queries per cell | Planned-surface queries per cell | Cell p95 | Stationary update p95 | Placements |
|
||
|---|---:|---:|---:|---:|---:|---:|
|
||
| SurfaceWorld Core 25 cm | 25 / 800 cm | 0 | 160 | 0.1945 ms | 0.0006 ms | 0 |
|
||
| SurfaceWorld Core 20 cm | 20 / 640 cm | 0 | 160 | 0.2127 ms | 0.0005 ms | 0 |
|
||
| SurfaceWorld legacy (20 cm comparison run) | 12.5 / 400 cm | 64 | 160 | 0.3326 ms | 0.0004 ms | 0 |
|
||
| SurfaceWorld legacy (25 cm comparison run) | 12.5 / 400 cm | 64 | 160 | 0.3215 ms | 0.0004 ms | 0 |
|
||
| Floating Islands Core 25 cm | 25 / 800 cm | 7,763.38 | 0 | 7.2511 ms | 0.0005 ms | 0 |
|
||
| Floating Islands Core 20 cm | 20 / 640 cm | 7,528.38 | 0 | 7.2045 ms | 0.0007 ms | 0 |
|
||
| Floating Islands legacy | 12.5 / 400 cm | 193.25 | 0 | 0.2928 ms | 0.0004 ms | 0 |
|
||
|
||
SurfaceWorld already reads its planned Heightfield2D directly; this eliminated density-column marching in the Core measurement while keeping the actor's content/terrain height agreement exact. Keep that path.
|
||
|
||
Floating Islands' generic density march is expensive on this sampled route. I tested using the existing island GetTopAnchor path in place of the march. It preserved the tested anchor to a maximum residual of 0.027344 Core density units but increased p95 from 7.2045 ms to 7.9887 ms and density queries from 7,528.38 to 7,569.69 per cell. The candidate change was reverted. The immediate recommendation is to build an exact, cached island-top query over the tile-local feature list, measure populated cells and total active frame cost, then adopt it only if it lowers cost while preserving exact anchor hashes and no-floating-tree checks. No production shortcut was retained.
|
||
|
||
## 4. Outside review evaluation
|
||
|
||
The supplied share is generic advice; it correctly separates planning, density evaluation and mesh generation and warns that a small feature cannot survive a coarse sampling grid merely because it has an SDF.
|
||
|
||
### What VoxelForge already has
|
||
|
||
- A startup director/adapter that builds a deterministic plan from resolved owner settings and authored strate layout; the plan and season identity are hashed.
|
||
- Analytic Core field families, bounded features, conservative interval proofs and a stable construction plan for SurfaceWorld and Floating Islands.
|
||
- A clipmap for Core streaming, worker-count-stable generation, an edit diff layer, collision-support radius/policy and Blueprint carve/fill through the canonical field.
|
||
- Native SurfaceWorld heightfield sampling and a planned route with capsule support for Floating Islands.
|
||
- M2 MC, hybrid and DC fixture routes, including repeated geometry and border checks.
|
||
- Heading-aware near scheduling already promotes the current support tile and next tile along pawn heading. The supplied advice's general topology-first principle is already in the design.
|
||
|
||
The edit diff layer is an in-memory overlay in this route; this report does not claim save/load persistence or network transport. The current far LOD is not a complete macro-only representation that is proven to agree across every LOD.
|
||
|
||
### What the advice gets wrong for this game
|
||
|
||
The claim that bridges should generally be separate meshes ignores the owner's unrestricted player carve/fill rule. A terrain-connected bridge must remain in the editable canonical field, or any mesh needs a field and collision proxy with an explicit edit interaction contract. Keep rock connectors as field features. Independent meshes are suitable for self-contained dreamcore/megastructure set pieces and ordinary decorations where terrain edits need not cut through the object.
|
||
|
||
The advice also treats adaptive resolution as a mostly local sampling optimization. In this game it changes shared boundary samples, LOD transitions, collision support and how a player edit crosses resolutions. It is a useful direction but not a quick per-feature toggle. Trees can be separate instanced content because they do not need to modify the terrain field, but their roots/anchors still need exact planned ground placement.
|
||
|
||
### Ideas ranked by expected payoff
|
||
|
||
| Rank | Idea | Expected payoff | Evidence required |
|
||
|---:|---|---|---|
|
||
| 1 | Conservative per-tile feature lists | High and already implemented. The 256-island stress case cut sampled tile p95 from 112.46 ms to 1.97 ms with identical sampled values and a dropped-feature control. | Keep exhaustive/randomized bound probes, full-versus-candidate hashes, negative controls and list-build costs as each feature family is added. |
|
||
| 2 | Per-strate resolution | High potential for broad mountains with fine caves, but high seam/edit risk. Deferred until the boundary contract is designed. | Boundary and transition LOD hashes on every worker count; no visible/collision cracks; edits across both resolutions replay identically; stable size-map identity. |
|
||
| 3 | Far LOD from macro shape with cross-LOD agreement | Medium-high. It can reduce far detail and improve horizon shape. Current cap and repair work is not a proof of this full scheme. | Compare silhouette, ground profile and water datum across all LOD transitions; test camera approach and retreat for pops; verify edit regions retain the authoritative field. |
|
||
| 4 | Visibility and heading-aware scheduling | Medium. Heading prefix exists; add visibility weighting only if it improves time-to-visible geometry without starving collision/support tiles or causing turn-around stalls. | Same pawn path at fixed speeds with visible tile-ready latency, collision-ready latency, rapid 180-degree turns and occluded-but-near tests. |
|
||
| 5 | Separate structure meshes for selected set pieces | Conditional and lower payoff for this editable terrain. Use them for non-terrain-connected authored dreamcore pieces; keep bridges and traversable rock in the field. | Carve/fill through and around a structure, collision parity, seam behavior, and deterministic placement/streaming. |
|
||
|
||
## Run ledger, limits and failures
|
||
|
||
- BuildHost UBT/UHT and Core link-safety passed after the production edits. The Core link audit passed with 18 shim objects. Final production build passed on attempt 1.
|
||
- The 20 cm SurfaceWorld actor run passed in 12m11s with about 3.95 GiB peak. The default 25 cm SurfaceWorld actor run passed in 11m53s. The corrected 20 cm Floating Islands actor run passed in about 4m11s with 3.18 GiB peak; it produced 2,850 tiles and passed W1/W8/W16, island/span anchors, water/atmosphere, capsule contacts, BP carve/fill and Core-off.
|
||
- The corrected default 25 cm Floating Islands actor run passed in about 5m45s with 3.18 GiB peak. It compared each candidate density sample with the full scan and logged no mismatches. Its 2,802-tile W1/W8/W16 aggregate exactly matched Round 4 across density, mesh, payload and topology.
|
||
- After removing the temporary comparison code, the clean production 25 cm Floating Islands run passed again in 3m48s with 3.16 GiB peak. It reproduced the same Round 4 aggregate and passed the live height/content anchor, water/atmosphere, capsule, BP edit and Core-off checks.
|
||
- The hybrid fixture-only run passed at default 25 cm: V1/V2 five analytic fixtures, exact repeats, same-LOD borders, V2 MC identity and 125 doorway phases.
|
||
- The full default V2 actor check passed: 11m57s (717.31 seconds), 3,944,955,904 peak commandlet private bytes (3.67 GiB). Its W1/W8/W16 SurfaceWorld hashes matched the 25 cm Round 4 hashes; height/content delta was 0 cm, BP carve and collision passed, and the V2 five-fixture, same-LOD border and 125-phase doorway checks passed. Log: Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-owner_surface.log.
|
||
- Per-tile audit iterations: the first wrapper invocation used a PowerShell variable scope that lost the script-root path; it was corrected. A naive AABB candidate filter mismatched 493/10,565 samples and was replaced with a conservative sorted lower-bound query. A compile probe had a lambda mixed-return C3487/C2672 error and was corrected. The stress negative control initially retained the central island and its summary bounds, so it did not fail; the control was corrected to remove both. The wrapper also lost Process.ExitCode before an explicit pass-marker fallback was added. The final audit wrapper printed a missing `vswhere.exe` notice, but compiled and ran successfully on its first measured attempt.
|
||
- The first post-halo default island candidate run passed the actor harness but failed the historical-hash invariant: density/mesh/payload/topology were 0x2f18fe65d88140f9 / 0x29fa0e8876a5a839 / 0xb1098a1ab6afa4bd / 0xec859a6373a47022. A full-scan control for the same 2,802 tiles reproduced Round 4 exactly. A runtime comparison then found candidate/full density mismatches on empty-list air tiles (for example fixed subvoxels `(-18944,-16896,-180736)`: 25,801 versus 18,135). The old skip bound assumed distance-like root magnitudes; v2 root lobes use a scaled ellipsoid distance. The bound now includes the validated root slope and smooth-min budget. The 4/256 audit and owner-plan full-scan comparison then passed bit-identically, restoring the Round 4 aggregate.
|
||
- A first runtime diagnostic used `UE_LOG` in the Core shim, where logging is compiled out; the build warned C4390 and the run produced no probe markers. I replaced it with temporary stdout diagnostics, captured the mismatch above, then removed the diagnostic code. The final production build and corrected 20 cm actor run passed afterward.
|
||
- The direct island top-anchor shortcut was a measured performance regression and was reverted after the full 20 cm island actor checks passed.
|
||
- No run returned 0xC0000142; no retry for that status occurred. No process exceeded 8 GiB or its 15-minute step time box. No viewer was launched.
|
||
- Crash audit: BuildHost has only the pre-existing UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000 folder dated 2026-09-17. No new UECC-* folder appeared after these runs.
|
||
- The full SurfaceWorld and island actor tests used the staged copies of the owner's five assets and the transient owner-height layout described in Round 4. No owner asset or project file was edited. The owner's project/editor was not opened, closed or built. No .uasset, junction, symlink, commit, push or stash was created.
|
||
|
||
## Files and likely compile spots
|
||
|
||
New source files:
|
||
|
||
- Standalone/Research/WorldAssemblerM3/Round5/FloatingIslandTileListAudit.cpp
|
||
- Standalone/Research/WorldAssemblerM3/Round5/BuildFloatingIslandTileListAudit.ps1 (audit build/run script)
|
||
|
||
New report: Standalone/Research/WorldAssemblerM3/Round5/REPORT.md. Dialogue entry: Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md.
|
||
|
||
Modified production/build sources:
|
||
|
||
- Source/VoxelForge/Public/VoxelWorld.h and Private/VoxelWorld.cpp
|
||
- Source/VoxelForge/Public/VoxelContentManager.h and Private/VoxelContentManager.cpp
|
||
- Source/VoxelForge/Public/VoxelForgeCoreAssetAdapter.h and Private/VoxelForgeCoreAdapter.cpp
|
||
- Source/VoxelForge/Private/VoxelAtmosphereManager.cpp
|
||
- Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp
|
||
- Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h
|
||
- Standalone/Core/src/FarShellsInternal.h, FloatingIslandsInternal.h, ShapeWorldInternal.h, VoxelForgeCore.cpp and WorldAssemblerInternal.h
|
||
- Standalone/Source/OwnerWorldLoader.h
|
||
- Tools/BuildVoxelForgeCoreHost.ps1 and Tools/TestVoxelForgeCoreWorldHost.ps1
|
||
- CODEMAP.md and ARCHITECTURE.md
|
||
|
||
Likely compile touchpoints are UHT/reflection for VoxelWorld.h and VoxelContentManager.h; runtime compilation of VoxelWorld.cpp, VoxelContentManager.cpp, VoxelForgeCoreAdapter.cpp and VoxelAtmosphereManager.cpp; Core API and implementation shims; and the editor commandlet. The completed BuildHost UHT/build and Core link-safety audit cover these touchpoints.
|
||
|
||
## Completion ledger
|
||
|
||
Implementation and requested proof runs are complete. The standalone tile-list audit passes at current and stress counts with zero mismatches and a detected dropped-feature control. The 20 cm BuildHost SurfaceWorld and Floating Islands cross-system checks pass; Core size changes world identity; default 25 cm SurfaceWorld, Floating Islands and M2 compatibility hashes match their recorded baselines. Content placement measurement found no measured spawn cost because the sampled cells produced zero placements; the direct SurfaceWorld heightfield path is retained and the slower island shortcut was reverted. Outside-review evaluation and the per-strate boundary/edit/LOD/hash plan are recorded above.
|