Files
Fr0zkaandClaude Opus 5.5 9d3c50ca95 wip(assembler): round S4 -- continuous far ceiling at the strate's upper boundary
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
2026-10-19 00:41:13 +02:00

8.8 KiB
Raw Permalink Blame History

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, mesh 80a5b054b904b1a2, payload bf2f1b40dff38acc, topology 56074198682d5e18.
  • 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-benchmark and 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 by Start-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 CreateSection ranges fixed it; final SurfaceWorld and fixture runs pass without a new crash or ensure. No 0xC0000142 retry 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 through Standalone/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.