S3's far cap sat up to 8.2 m above the near roof and read as floating pieces. The far render cap now projects onto the owning strate's upper boundary (density unchanged), on a global XY lattice, LOD4 16-voxel grid + LOD5-8 128-voxel. Cap agreement 0.05 cm (100 cm control detected), 2520/2520 upward rays hit roof on the owner walk. Far recipe v2; LOD0-3 hashes equal S2/S3. Tile p95 flat; cold clipmap +4.4%. Far-cliff fluting left open (coarse MC step). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
8.8 KiB
World assembler S4 / M3 Round 8
Date: 2026-10-19. Base: S3 / d0f97bf. No commit, push or stash.
Result
SurfaceWorld now has a continuous far ceiling at LOD5–8, projected from the same declared planar heightfield and closed at the owning strate's upper boundary. The staged owner's real plan and walk view pass cap census, root agreement and upward-ray coverage. LOD0–LOD3 hashes still match S3 and S2. The far recipe is version 2. FloatingIslands still shows open sky overhead; it has no declared planar cap, and that is expected for an open-air island strate.
Count first: why S3 looked detached
The pre-fix owner-camera audit found 361 far XY tiles and 786,153 profile samples; all profile samples had a roof. Of 401 cap bands requested, 401 emitted triangles, with 0 requested bands empty and 0 clipmap culls. So the proposed ground-height gate was not leaving requested cap bands unmeshed on this walk view. The 128-point cap-to-near-root check did fail: maximum vertical error was 823.8525 cm (one sample was -447.0469 voxels at the far cap versus -480.001 at the near root). The failure was the cap datum sitting above its owning boundary, which made the roof read as detached pieces. The 128-voxel lattice itself was not leaving empty bands.
The fix is a render-surface projection to (topChunkZ + 1) * 32 voxels, the owning strate's upper
boundary. Heightfield2D::point() and density values remain unchanged. The far cap and its bounds use
the shared projected height; the tile selector adds only non-overlapping cap bands. All samples use a
global XY lattice so neighboring cap tiles share edges. LOD4 uses a 16-voxel grid step; LOD5–8 use
128 voxels.
Post-fix audit: 385/385 requested cap bands emitted positive-area triangles (LOD4 88/88, LOD5 48/48, LOD6 48/48, LOD7 48/48, LOD8 153/153); 0 empty and 0 culled. Across 128 shared XY points, far cap to near-root error is at most 0.0504 cm (2 cm tolerance). A 100 cm datum-offset negative control measured 100.0015 cm and was detected. The S3 ground agreement still passes: max LOD7/8 to near-root error 0.0427 cm, cross-LOD error 0, and its 100 cm control is detected.
Coverage uses emitted cap triangles, not the height profile alone. At each of 33 owner route points and two camera points, 72 upward rays span elevations 5, 10, 12, 15, 30, 45, 60, 75 and 90 degrees over eight azimuths. Result: 2,520/2,520 hit the cap before the far clip or clipmap edge (100%); 0 profile-roof, mesh or clip-edge misses. All 35 points individually reached 100%. This verifies the owner route and camera samples, not every possible point in the full strate volume.
Visuals and fluting
Matched captures use the Round 7 views, the same staged plan and camera positions, 60 fps/VSync, and the viewer closed after capture. Each S4 JPEG is 640x400 and under 19 KB.
| View | S3 | S4 | Readout |
|---|---|---|---|
| Owner walk horizon | S3 | S4 | Walk horizon view after cap repair. |
| Cap at distance | S3 | S4 | The isolated-looking pieces are gone. |
| Far view, y=-1800 m | S3 | S4 | Far-cliff fluting remains. |
| Looking straight up, far distance | — | S4 | Dark and low contrast; geometry/ray audit establishes the roof, pixels alone do not distinguish roof from dark sky. |
Fluting is coarse marching-cubes sampling on steep ground faces. Each far tile spans 16 coarse cells per side: at 25 cm, LOD7's step is 256 voxels (64 m), LOD8's is 512 voxels (128 m). The strips cross tile faces rather than appearing only at LOD seams; they predate S4 in S2/S3. Certified SurfaceWorld tiles skip shell repair, native replacement affects upward-facing ground only, and this is not a normal or backface-culling artifact. Refining all steep faces would multiply far 3D mesh work by roughly eight; that is not a cheap shared fix, so S4 leaves it open.
Timing, determinism and regression checks
SurfaceWorld timings are warmed p95s over the same eight staged 25 cm owner keys per LOD as S3. Runs were serial at normal priority with no overlapping build or Unreal process. These are tile times, not frame times.
| LOD | S3 full p95 | S4 full p95 | Delta |
|---|---|---|---|
| 7 | 19.801 ms | 19.8069 ms | +0.0059 ms (+0.03%) |
| 8 | 58.346 ms | 58.4113 ms | +0.0653 ms (+0.11%) |
The standalone cold full-clipmap benchmark took 3.107 s versus S3's 2.975 s on the same 2,553-tile, 12-worker workload: +132 ms (+4.4%). Far closure is therefore effectively flat in warmed owner tile p95, with a small whole-clipmap cost. LOD8 cap refinement covered 385 tiles / 757,540 grid cells and generated 1,515,082 cap triangles.
- SurfaceWorld BuildHost at 25 cm: PASS; W1/W8/W16 stable at density
0cd2a1a4152ee4aa, mesh80a5b054b904b1a2, payloadbf2f1b40dff38acc, topology56074198682d5e18. - FloatingIslands BuildHost at 25 cm: PASS; W1/W8/W16 stable and standalone hashes match. Its plan contains 4 islands, 3 connectors and 28 route segments; water remains fixed.
- Core off / legacy at 12.5 cm: PASS.
- M2 HybridV1 and HybridV2 fixtures at 25 cm: PASS; each reports five analytic fixtures and one border fixture.
- Standalone W1/W8/W16 determinism: PASS. Owner clipmap density hash remains
c10697a8f48380c7. - LOD0–LOD3 hashes match S3 and S2 exactly:
| LOD | Density | Mesh | Payload | Topology |
|---|---|---|---|---|
| 0 | 769f2a706d585a72 |
33eeeb39fa443816 |
645621a1d968983f |
c2457ed905036c9d |
| 1 | 69cc5a5c0a2c60af |
b48335f5410c57d5 |
d15c5480162ab8ba |
feca1bd025823604 |
| 2 | 85deed5683a77202 |
53469895987aeea2 |
e55f8ae7e1532033 |
d5feb12a0e85c09b |
| 3 | 6518caefb3be7e7f |
ec513c90b853a614 |
f62fa1137ff17f82 |
ccf1dcf681965816 |
Far output changes are salted by far recipe v2 in mesh, payload and topology hashes from LOD4 upward.
The final Standalone build and BuildHost Core compile/link-safety check pass. The editor commandlet
uses explicit RealtimeMesh section ranges for cap-only and ground/cap tiles. Final reruns had no
ensure. No new UECC-* folder appeared; the only crash directory is the pre-existing 2026-09-17
folder. No run hit
0xC0000142; all commandlets stayed below 4 GiB peak private memory. The surface commandlet was the
longest run at about 10 minutes, within the 15-minute limit.
The Standalone build also printed nonfatal environment/compiler warnings: vswhere.exe was not
recognized by the build script, and C4838 remains at VoxelStrateManager.cpp:3974–3975.
Failed and retried runs
- The first post-fix coverage pass used a camera above the roof and reported 97.143% (72 rays, all misses from that invalid origin). Re-running from the staged owner walk height passed 100%.
- The first clamp used the wrong chunk boundary and altered point density, changing the LOD3 density hash. It was corrected to the upper boundary and render-only API; final LOD0–LOD3 hashes match S3.
- One hash invocation omitted
--stream-benchmarkand entered the interactive viewer; it was stopped after 146 s and rerun with the correct mode. An absolute capture output path was split at the workspace spaces byStart-Process; relative paths worked. A JPEG helper syntax error was corrected. - An early BuildHost mesh apply raised an ensure when a cap material section did not yet exist.
Explicit
CreateSectionranges fixed it; final SurfaceWorld and fixture runs pass without a new crash or ensure. No0xC0000142retry was needed.
Source and compile spots
No new source file was added. Modified sources:
Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h,Standalone/Core/src/WorldAssemblerInternal.h,Standalone/Core/src/VoxelForgeCore.cpp— shared cap declaration API, clipped render surface, conservative bounds, cap tile selection/emission, and far recipe version; compile through the Standalone Core build and BuildHost Core.Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp— owner cap census, agreement and ray coverage audit; compile through the editor module / BuildHost commandlet.Source/VoxelForge/Private/VoxelWorld.cpp— explicit realtime mesh section ranges; compile through the VoxelForge runtime module.Standalone/Source/StandaloneViewer.cpp— standalone audit and matched capture support; compile throughStandalone/Build.ps1 -Target All.
CODEMAP.md section 3 and ARCHITECTURE.md section 8.25 are updated. The API leaves the roof family
choice in the declared plan, so future cave-in-mountain families can get a far roof by declaring one;
no SurfaceWorld-only geometry rule is required. The owner need not change assets or settings: keep
Core enabled at 25 cm. Sprint streaming order and the 1.57 s cold-view target were not changed or
re-measured.