Ratatoskr/harness/scene
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Nibu 19c1f21610 scene: terrainNormal reads the world-z slope from .y, not .z
The noise is evaluated at vec3(xz * f, c), so .z is the slope along the held
constant axis. Confirmed numerically (harness/scene/gradAxis.cjs): analytic
.xy matches central differences for fbm and phacelle, .z does not. Only the
ray-march scene's normals were affected; the grid tier already used .xy.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 20:43:34 +00:00
..
bundle.cjs scene: ridge scene as the default background, no WebGL 2026-11-06 18:34:13 +00:00
demo.ts scene: half-float prepass start target where EXT_color_buffer_float is missing; say why createScene is null 2026-11-04 20:39:22 +00:00
drive.cjs harness: trace and diff modes, standalone demo page with steps/pixel readout 2026-11-04 18:26:23 +00:00
entry.ts Background scene: two-pass WebGL2 terrain and world tree with login pull-back 2026-10-31 21:43:40 +00:00
gradAxis.cjs scene: terrainNormal reads the world-z slope from .y, not .z 2026-11-07 20:43:34 +00:00
README.md scene: terrainNormal reads the world-z slope from .y, not .z 2026-11-07 20:43:34 +00:00
ridgeDemo.ts scene: ridge scene as the default background, no WebGL 2026-11-06 18:34:13 +00:00

Scene harness

Compiles, renders and times the background scene (src/app/features/scene/) in headless Chromium. Not shipped, not run by CI.

node bundle.cjs <outdir>                  # esbuild bundle of entry.ts plus an index.html
node drive.cjs <outdir> compile           # compile and link each stage, JSON report
node drive.cjs <outdir> shots <pngdir>    # rest, mid pull-back and pulled-back screenshots
node gradAxis.cjs <shaders dir>           # numeric check that noise gradients are (d/dx, d/dz-as-.y, ...): terrainNormal axis
node drive.cjs <outdir> measure           # GPU time per pass by timer query, two viewports, two levels
node drive.cjs <outdir> variants          # the same with source patches (no erosion, no tree, value-only fbm)
node drive.cjs <outdir> trace             # mean trace steps per pixel and pass ms at three camera poses, PREPASS=0,1 arms
node drive.cjs <outdir> diff <pngdir>     # one frozen frame with and without the prepass, pixel diff and both PNGs
node drive.cjs <outdir> phacelle          # the Phacelle gradient probe behind world.ts `phacelleGradBound`

Needs esbuild and playwright@1.48.2 on NODE_PATH and a Chromium. The first run was done on a host with no GPU, so drive.cjs launches with --use-angle=swiftshader (software Vulkan). On a machine with a GPU, remove those flags to measure the real device. bundle.cjs must run from a directory whose ancestors hold no empty package.json (esbuild reads them).

Timings from SwiftShader are CPU time: use them for the split between passes and for before and after of one change, never as a phone frame time.