Forge Valley · art school · 2026-07-28
A fundamentals document for the workers building Forge Valley. The far mountains, sky, and light pass. Everything from 10 m to 150 m does not, four blind panels in a row (A6 landform coherence: 36 → 38 → 39 → 45). This explains the failure at the level of principle, so the next hundred small decisions come out right without being individually specified.
Every landform in the near and mid-field is built by summing one shape:
exp(-4r²) × smoothstep — an analytic Gaussian bell, raised or cut
(TerrainSculptKit.cs, line 179; that is the entire sculpt vocabulary,
SculptOp has radius, amplitude, flatness, and nothing else). The judges never saw
that line of code, and all of them described its output exactly: “mathematically
smooth cone,” “extruded primitives,” “all-convex terrain … zero concave hollows.”
The human eye is an extremely good detector of analytic smoothness. It cannot name
the function, but it always knows.
The specific fundamentals being violated, each with its receipt:
| # | Violation | Tell | Receipt | Stage |
|---|---|---|---|---|
| D1 | All-convex terrain. A sum of positive bells is convex everywhere that matters. Real soil-mantled land is convex only at crests; mid-slopes are planar; foot-slopes and hollows are concave. Our concave fraction is ~0% outside three hand-cut valleys. | T-11 | Third reading, all 3 judges, all views: “the sculpt primitive vocabulary itself is the ceiling.” | 4 |
| D2 | Dead spectrum between 0.5 m and 10 m. The blobs put all their energy at 20–40 m wavelength; grass cards live at 0.3 m. In between — the band the eye reads hardest at 10–150 m viewing distance — there is nothing: no swales, tussock mounds, terracettes, animal paths, deadfall pits. | T-11/T-13 | Receipt 2 below; every slope in the mid-field has the same character (T-13 uniform slope). | 4 |
| D3 | Grass on impossible slopes, stretched. Continuous turf holds to roughly 30–35°. The knoll flanks run steeper, still fully turfed, with top-down projection stretch striations. | T-06/T-18 | Receipt 1 and Receipt 2 flank close-ups. | 3×4 |
| D4 | Tangent bases, no colluvial wedge. A Gaussian eases into the plain asymptotically — a curve nature never draws. Hill bases are met by a concave debris ramp, then a legible break to the flat. | — | Fourth reading, 2 of 3: “mound bases meet the plain … no colluvial wedge.” | 4 |
| D5 | No drainage network. Drop a marble anywhere in the mid-field: it stalls in an inter-blob dip. The pool has no catchment, the creek no continuation. | T-11 | All four readings name it; fourth: “no through-going drainage network” (all 3). | 4 |
| D6 | Placed, not deposited. The cap slab perched on a mound crest with no source cliff; boulders resting on the surface. | T-15 | All 3 judges, three readings running. | 4/7 |
Primarily stage 4, with a stage 3×4 interaction, and stage 3 second. The dominant defect is the landform itself — the judges' language is entirely morphological (cones, concavity, talus, drainage). But the two stages compound: the splat rules cannot respond to slope and curvature because the form has no curvature structure to respond to. A curvature-driven material on a Gaussian dome paints one ring. Fix the form first; the material rules then have something real to read.
Three reasons, and they are teachable:
Measured, not felt: content-density on the hero ground region reports 5.9% empty cells at 8 px vs the napkin's 2.1%, and normalised local contrast concentrated in the near band only — the mid band (the knolls) runs detail-poor. The napkin is an ink sketch, so treat its photometric numbers as a floor, not a target: a real photograph of this biome would make the mid-field gap wider, not narrower.
This is the section to internalize. Everything in the prescription follows from it.
Since G. K. Gilbert (1909) this has been the working model, and it holds: diffusion (soil creep, rain-splash, burrowing — moves soil slowly downhill everywhere) makes broad convexity at crests; advection (running water — concentrates, cuts, carries) makes concavity everywhere water collects. A real landform is the equilibrium of the two. Our terrain has diffusion's shape with none of advection's, which is why it reads as inflated rather than carved.
| Property | Nature (montane meadow & knolls) | Our terrain today |
|---|---|---|
| Slope distribution | Multi-modal: meadow floor 0–8°, knoll flanks 10–25°, short shoulder breaks 25–35°, >35° only where rock outcrops. Turf is continuous only below ~30–35°. | One mode per blob; flanks run 40–55° and are fully turfed. |
| Curvature fractions | Roughly: convex ~25–30% (crests, noses), planar ~40–50% (mid-slopes — the fraction everyone underestimates), concave ~25–30% (hollows, foot-slopes, swales). | Convex + flat ≈ 100%; concave ≈ 0% outside three hand cuts. |
| Micro-relief @ 1 m wavelength | ±3–8 cm: tussocks, gopher mounds, hoof prints, stones. Turf slopes genuinely are smooth at this scale — the sin is being smooth at all scales. | ≈0 (below heightmap Nyquist; also absent from the material). |
| Micro-relief @ 10 m | ±15–40 cm: swales, old channel scars, log-fall mounds, terracettes on 20–30° grass slopes. | ≈0. |
| Relief @ 100 m | ±1–3 m rolling structure plus the knolls themselves; knoll height : footprint radius rarely exceeds ~1:3. | Blobs only; Lookout dome runs ~1:1.5 — too tall for its footprint. |
| Where rock shows | Convex AND steep: shoulder breaks, noses, anywhere slope exceeds what soil can hold (~30–35°). Sediment, organics, lusher grass collect in concave + gentle. | Rock is a hand-painted band; uncorrelated with form. |
| How bases meet flats | Colluvial wedge: a concave ramp of fallen/crept debris, slope decaying over 5–15 m from ~20° to the meadow floor, coarse fragments embedded in it. Then a legible break. | Gaussian tail: tangent easing, no debris, no break. |
| Drainage at 260 m scale | Even a meadow drains: shallow vegetated swales 0.3–1 m deep, 3–8 m wide, one every ~30–60 m of hillslope, connected — every drop of water has a continuous path to the pool or the creek. | Closed inter-blob pits; pool without catchment. |
Both, at the wrong wavelengths. The terrain is over-lumpy at 20–40 m (single-lobe bells too tall and too symmetric for their footprints) and dead-smooth at 0.5–10 m (no content at all). The fix is not “more smoothing” or “more bumps” — it is redistributing the spectrum: flatten and asymmetrize the bells, then put real energy into the 1–10 m band, then carve the whole thing so the energy is organized by flow rather than random.
This is worth understanding precisely, because the team has spent ~30 napkin iterations inside this ceiling.
exp(-4r²) is infinitely differentiable
— there is no radius at which a slope breaks. Nature is full of breaks: turf to
rock, wedge to floor, channel bank to bed. The eye reads their absence as
“extruded,” the judges' exact word.Everything below runs in the existing stack: Unity HDRP terrain, the C# kits we own, terrain layers, detail scatter, prop placement. The blobs are not deleted — they are demoted. A blob becomes intent (“a knoll of height h near x,z”), and geomorphic passes turn intent into land. Order is load-bearing; run it as five kit steps, one napkin iteration each, gates checked every step.
// Layer A: existing SculptOps, but reshaped as intent
// - clamp peak slope: amplitude/radius so max slope <= ~25 deg on soil forms
// - flatness exponent > 1 to widen crests (kills the pure bell)
// - per-op asymmetry: radiusX != radiusZ, rotation set, +/-20% noise on amplitude
// Layer B: domain-warped fBm added over the whole 260 m tile
// octaves 6
// baseWavelength ~80 m, lacunarity 2.0 (80,40,20,10,5,2.5 m)
// persistence 0.45-0.50
// amplitude +/-1.8 m at 80 m falling to +/-6 cm at 2.5 m
// domainWarp fBm-warp the sample coords by 8-15 m (kills Perlin grid look)
// mask amplitude x (0.5 + slope): more relief on slopes, calmer meadow floor
// Layer C: ridged multifractal (1 - |fbm|) masked to zones already > 27 deg only
Heightmap arithmetic: 513 px over 260 m = 0.51 m/cell. Wavelengths under ~1.5 m cannot live in the heightfield — they belong to the ground material's detail normal (step 4). Do not chase them with cells.
// Talus-angle relaxation over the whole heightfield
// iterations 60-100
// talusAngle 33 deg where rock splat will win, 26 deg on soil
// carryFraction 0.5 of the over-steep excess per pass
// Effect: over-steep Gaussian flanks collapse into straight repose slopes,
// and the collapsed material DEPOSITS at the base -- the colluvial wedge (D4)
// appears for free, with the correct concave profile.
// After thermal, before any authored carving. Then smooth. (erode -> carve -> smooth)
// droplets 150k-400k over 513x513
// inertia 0.05-0.15 // THE load-bearing param: carries droplets across
// // small bumps -> continuous channels, not pits
// sedimentCapacity 4 erodeRate 0.3 depositRate 0.3
// evaporate 0.01-0.02 gravity 4 radius 2-3 cells
// maxLifetime 30-50 steps
// Post: gaussian smooth sigma ~1 cell (erosion at heightmap res reads
// crystalline up close otherwise), re-run the landmark position gates.
// GATE (marble test, scripted): drop 1000 virtual droplets uniformly;
// >= 90% must exit the tile or reach the pool/creek basin. Closed pits
// deeper than 0.5 m, other than the pool: zero.
The valley already owns HydraulicErosion and
ThermalErosion implementations in
NatureLandscapeBuilder.cs (lines 878, 1073) — the machinery exists and is
simply not being run over the napkin terrain. Port, don't rewrite.
// Compute per-alphamap-cell: slope, profile curvature, flow accumulation
// (one D8 pass over the final heightfield gives accumulation cheaply)
// rock layer : slope > 30-35 deg OR strongly convex shoulder cells
// dry grass : planar mid-slopes, high sun aspect
// lush grass/sedge: concave cells, high flow accumulation, pool/creek margin
// bare soil/duff : under canopy density, disturbed zones (trail, log drag)
// Kill the stretch: on cells > 30 deg switch the rock layer to triplanar
// (HDRP TerrainLit supports per-layer triplanar) or boost tiling by 1/cos(slope).
// Keep the existing macro-variation mask at 30-50 m (T-06) multiplying albedo.
// Drive DetailPrototype density & height by the SAME fields:
// moisture proxy = concavity + flow accumulation + pool distance
// -> grass height x1.4, greener tint in swales; sparse + dry on noses
// density -> 0 where rock layer wins (T-16: let it thin and DISAPPEAR)
// Terracettes: on 20-30 deg turf, add contour-aligned micro-benches
// (10-20 cm amplitude, 1-2 m spacing) -- heightfield if resolvable, else normal
// Props: embed 40-60%, debris + grass tufts at every contact line (T-15);
// the perched cap slab gets a source outcrop uphill or gets deleted.
Discipline unchanged: one variable per napkin, commit named for it, position gates (7/7, worst ≤ 2.83%) after every step, A6 re-read only after steps 1–3 land — that is the structural change; grading each micro-step re-runs the 36→39 plateau at panel prices.
Prediction to hold me to: steps 1–3 alone (form only, materials untouched) should clear A6 60 on the worst view, because every consensus impossibility except the perched slab is a form complaint. If it does not move, the diagnosis is wrong and we stop and re-read, rather than stacking more passes.
Photo-match style, one axis each, objective pass bars. Order matters. Reference photographs, not the napkin — the napkin is the composition contract; it cannot answer photometric or morphological questions.
tiling-probe finds no second-peak repeat period on the meadow floor; zero visible
projection stretch at 100% on any >30° face.Receipts: renders current-hero.png,
current-orbit-left/right.png; contract napkin.jpg; reductions in
artschool/study/; panels
a6-first…fourth-reading-2026-07-28.json; kit
crons/routines/forge-valley-maintenance/demo-base/TerrainSculptKit.cs.
Doctrine: Gilbert 1909 (convexity of hilltops), the diffusion–advection hillslope model,
and the skill's build-order.md stage 4: “terrain is not shaped, it is
carved.” — Arthur