Files
Fr0zkaandClaude Opus 5.5 9898e057fd wip(assembler): rounds L5+L6 -- Linux far-terrain captures and screen-space gate (world unchanged)
Linux offscreen capture (EGL/GLES pbuffer; llvmpipe in the sandbox) and an opt-in screen-space gate
for LOD>=3 (normal distance projected at each LOD's closest display distance, 1 px at 1440p =
0.61 mrad). The gate rejects the S13 octave-drop and stride-2 controls, fault injections, and a
vertical-vs-screen control. Finding: today's far meshes differ from the field by up to 92 px, and
LOD swaps snap mesa rims by tens of px (p50 0 px), a silhouette effect of plain LOD switching. The
octave cutoff was dropped: nothing qualified, and octaves are a small share of far time. Off-path
cost: reviewer interleaved W12 within noise vs L4 (+0.6% median). Hashes = L4.
Largest far lever measured: column work outside noise, 34% of far worker time (duplicate XY across tiles).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ED33VnqepD4YY6gDAAA832
2026-10-19 21:10:08 +02:00

8.7 KiB
Raw Permalink Blame History

Linux6 report

Result

The screen-space gate rejects today’s far meshes at every sampled LOD3–8: the largest measured same-field error is 92.0 px, and the largest sampled swap pop is 70.3 px at LOD6→5. Same-LOD regeneration is exact, the reported swaps have no cracks or floaters, and no display mesh changed in this round.

Source base: wip/l5-far-cutoff at b21a19d; L4 reference: 7770074.

Screen-space method

For one surface tile nearest the L1 camera at each LOD, the gate rasterizes triangles on a 65×65 XY grid, excluding skirts. It compares the mesh hit to direct Heightfield2D ground/cap roots; slopes use ±1-voxel finite differences. For vertical residual Δz and slopes sx,sy, it computes normal distance |Δz|/sqrt(1+sx²+sy²), projects that normal onto the camera’s screen plane, then divides by the one-pixel world distance at that LOD’s closest display distance. The view uses 90° horizontal FOV, 2560 px, yaw 0°, pitch −22°; one pixel is 0.000613592 rad. Same-LOD regeneration is the mesh reference for swaps; direct field roots are the reference for true surface error.

The known failure control is a 1 m cell on an 89.427° plane, shifted sideways by 5 mm (0.005 cell): its vertical metric says 8.488 px, while its true normal distance is 5 mm and projected screen error is 0.0849 px. This confirms that vertical height can badly overstate visible displacement.

LOD Closest distance (m) Field error p50 / p99 / max (px) Max normal distance (m)
3 96 0.81 / 4.16 / 6.00 0.423
4 192 1.01 / 5.12 / 7.93 0.952
5 384 0.79 / 16.37 / 92.02 25.122
6 768 0.51 / 9.75 / 70.34 37.644
7 1,536 0.29 / 9.04 / 42.36 42.714
8 3,072 0.83 / 18.03 / 47.18 93.175
Swap Distance (m) Pop p50 / p99 / max (px) Max normal distance (m)
3→2 96 0.61 / 3.77 / 6.05 0.367
4→3 192 0.75 / 4.63 / 7.51 0.896
5→4 384 0.00 / 9.58 / 31.78 8.139
6→5 768 0.00 / 9.75 / 70.34 37.644
7→6 1,536 0.00 / 9.04 / 42.36 42.714
8→7 3,072 0.83 / 18.03 / 47.18 93.175

The tails are not confined to cliffs. The field maximum slopes at LOD5–8 are 8.34°, 14.09°, 6.76°, and 9.33°; LOD5’s p99 is 19.8 px below 30° and 21.1 px at 45–60°. The sampled LOD6→5 maximum is at (-472, -1432, -463.151) m; the marked offscreen capture shows that location at the 768 m swap distance. This is a sampled-tile result, not a whole-world supremum.

All same-LOD mesh comparisons at LOD3–8 pass with zero error. The S13 octave-drop and corrected stride-2 column-interpolation controls are rejected at every LOD3–8, as are missing displayed surface, 2 m floating surface, and missing fine-ring injections. The measured swap rows have zero cracks and floaters; they reject solely on displacement.

Far worker time, W12

The L1 view has 2553 tiles. Clean-run phase totals for LOD3–8 are shown below. A separate temporary timer measured complete FractalNoiseQ16 calls; “column outside” is clean column time minus that subtotal. The timer added 3–6% to worker time, so the split between those two column subphases is approximate; it has been removed from the final tree.

LOD Worker (s) Column outside noise (ms) Fractal/noise calls (ms) MC (ms) Ground refine (ms) Cap refine (ms) Skirts (ms) Assembly (ms)
3 1.084 171 276 473 0 0 118 33
4 2.581 1,000 534 440 0 304 196 102
5 1.829 658 358 100 464 22 161 70
6 2.761 1,608 284 59 385 58 162 70
7 1.192 234 198 32 275 202 153 96
8 2.224 264 469 256 424 299 333 177
Total 11.671 3,934 2,119 1,360 1,548 885 1,123 548

Column work outside the fractal calls is the largest single phase (33.7% of far worker time); all column work is 51.9%. Ground and cap refinement total 2.43 worker-s, skirts 1.12 worker-s, MC 1.36 worker-s, and assembly 0.55 worker-s. The earlier 7–13% profile timed individual Perlin calls; the L6 subtotal times complete fractal calls, including their octave accumulation.

The listed subphases total 11.52 worker-s; about 0.15 worker-s remains in timer and per-tile residuals.

The overlap scan counted about 411,000 cross-worker neighboring duplicate XY evaluations at LOD3–8 (about 166,000 at LOD4 alone). Exact column reuse is the largest plausible lever because it targets the largest phase. I did not build it: no candidate has yet shown a screen-gated, greater-than-3% whole-view win. Stride-2 interpolation is not a safe substitute; its control fails at every far LOD.

Cost with the feature off

Three interleaved W12 runs per binary, same L1 camera and forced generation. whole_view_ready is the comparison metric; the six whole-view hashes matched exactly.

Binary Runs (s) Median
L4 reference 2.082, 2.180, 2.183 2.180 s
L6 cleaned tree 2.127, 2.185, 2.223 2.185 s (+0.2%)

Run-to-run spread was about 0.10 s, so the 5 ms median difference is within noise. The no-op visual cutoff contract, plan, and CLI flag were removed. The opt-in research gate retains its negative controls; skirt timing uses the existing optional stage-timing pointer, which is null on the default path. Governor stayed powersave; runs used CPUs 0–11, W12, 6 GiB address-space limits, and normal priority. Peak runtime RSS was 403 MiB; peak build process RSS was 874 MiB (GCC).

Determinism and hashes

Clang 19 -ffp-contract=off W1/W12 and GCC default W1/W12 produced the same hashes. LOD0–2, exact queries, and all whole-view hashes equal L4; no recipe bump is needed.

  • Recipe / plan / manifest: 83b616a3f4fe781d / 1ca84619c8600ee5 / e55991385bf0ca29 (recipe version 1).
  • Whole view (density / mesh / payload / topology): c10697a8f48380c7 / e75c9119a1498cd5 / 49a9a8d1835a6c8c / edcb23288b5e8724.
  • Full detail (density / mesh / payload / topology): 0ee0579bd15cbbe4 / 32e5d4964d610fee / 1932b96ee4b1d910 / 69743c6bad3447dc.
  • Exact queries (density / unclamped / detail / collision): e4d4a8eb95b35933 / e4d4a8eb95b35933 / efcba20c0c70c415 / e604823a249029bf.
  • SHA-256 L4 binary / Clang L6 binary / GCC L6 binary: 6efb8f19a41ca3cd23aca9294ceee1e9cdd1d3dc8da23b3ee61ef8ae943aa763 / 3f5a4f88b0d911e8e66af9ef72e294926a5507a73d44fcfe868df27c666bf01e / de872e8fdaa9f40e8a6c096700fd998bcf35f232b06f2b4e35a374b4b0e9fa07.
  • Capture JPEG SHA-256: 483b434f3ad752dd09b82cd1c78fe81ee8cd31803ecf4dcd3c2918a8ae5d66b1 (156 KiB).

Failed or retried runs

  • First Clang build failed on a missing view argument in LinuxScreenSpaceGate.h; fixed and rebuilt successfully.
  • First gate pass paired extra mesh hits incorrectly and reported same-LOD floaters at LOD5–8. The reference pairing was corrected; the final gate reports zero same-LOD displacement and no floaters.
  • A /usr/bin/time -v wrapper attempt exited 127 because that binary is unavailable; the runs were retried with /proc RSS monitoring.
  • The final quality gates exit 6 by design because measured displacement exceeds the 1 px rule. Builds, captures, determinism runs, and cost runs completed successfully. EGL could not write ~/.cache in this environment, disabled shader caching, and rendered successfully on llvmpipe.

Note for the owner

Today’s assembler/world remains at L4; this sampled view measures up to 92.0 px from the field and a 70.3 px LOD6→5 pop at the tested display distances, with the largest point marked in the capture. This round changes no default mesh or recipe output, removes the no-op cutoff, and leaves W12 cost within run-to-run noise.

Orchestrator review (Claude)

  • Cost re-run by me (interleaved W12, L1 view): L4 2.098/2.138/2.171 s vs L6 2.116/2.150/2.197 s (median +0.6%, within noise), density c10697a8f48380c7; the L6 binary SHA matches the report. Merged into assembler/world with L5 squashed in.
  • The marked LOD6→5 maximum sits on the rim of a flat-topped hill (mesa edge), not on open gentle ground: the "8–14° slope" is the field slope at the sample, on the plateau top beside the drop. The coarse mesh rounds the rim by about a cell (16–32 m at LOD5–6), so the pop is a real silhouette snap at sharp rims (tens of px at 768 m), while p50 stays at 0 px. That is ordinary LOD-switch behaviour without geomorphing or cross-fade, so a fix belongs in rendering (Unreal), not in generation. The owner decides whether it is visible enough to matter.
  • Next speed lever, per the far breakdown: exact cross-tile column reuse (column work outside noise is 34% of far worker time; ~411k duplicate XY evaluations at LOD3–8).