Forge Valley · art school · 2026-07-28

Why the Near and Mid-Field Terrain Fails, and What Ground Is Actually Like

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.

1 — Diagnosis: the land has no history

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.

Orbit-right mid-field: a row of smooth bell-shaped domes
Receipt 1 — orbit-right, mid-field. The Lookout hill (right) is a bell curve: radially symmetric, monotone slope, no drainage, no slope break, and the grass texture visibly streaks down its face because a top-down splat projection is being stretched over a ~50° slope. The mound cluster (left) is the same function at other radii. Nature does not produce three instances of the same equation side by side.

The specific fundamentals being violated, each with its receipt:

#ViolationTellReceiptStage
D1All-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-11Third reading, all 3 judges, all views: “the sculpt primitive vocabulary itself is the ceiling.”4
D2Dead 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-13Receipt 2 below; every slope in the mid-field has the same character (T-13 uniform slope).4
D3Grass 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
D4Tangent 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
D5No 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-11All four readings name it; fourth: “no through-going drainage network” (all 3).4
D6Placed, 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
Hero knoll: smooth turf dome with the old log
Receipt 2 — hero, central knoll. One continuous C∞-smooth surface from crest to base. No 1–10 m relief of any kind; the only interruptions are props. Note the base easing tangentially into the foreground — the Gaussian tail (D4).

Is it material (stage 3), macro form (stage 4), or the interaction?

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.

Why do the far mountains pass while 10–150 m fails?

Three reasons, and they are teachable:

Silhouette reduction: render vs napkin side by side
Receipt 3 — the reduction. At small size the render's mid-field collapses to two smooth ovoids; the napkin's mid-field is dense with broken, textured mass — and note that the napkin contains no dome at all. Split Rock rises out of forested, cluttered ground; the Lookout sits on a wooded ridge. We invented the pedestals. If the 32-px version already fails, full-resolution polish is irrelevant.

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.

2 — Fundamentals: what near-field montane ground is actually like

This is the section to internalize. Everything in the prescription follows from it.

2.1 Two processes make every hillslope

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.

2.2 The numbers a montane meadow/knoll landscape obeys

PropertyNature (montane meadow & knolls)Our terrain today
Slope distributionMulti-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 fractionsRoughly: 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 showsConvex 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 flatsColluvial 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 scaleEven 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.

2.3 So: too lumpy or too smooth?

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.

3 — Why summing Gaussian blobs can never get there

This is worth understanding precisely, because the team has spent ~30 napkin iterations inside this ceiling.

Knoll flank close-up: projection stretch striations Napkin mid-field: dense textured ground
Receipt 4. Left: the knoll flank at 100% — top-down splat stretch striations on a slope turf could not hold. Right: the same picture region in the napkin contract — stumps, cattails, tufted ground, a pool with a rim, no bare dome anywhere. The napkin never asked for pedestals; it asked for cluttered forest-meadow ground with landmarks embedded in it.

4 — The programmatic path that can get there

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.

Step 1 — Re-base the heightfield: intent layer + full spectrum

// 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.

Step 2 — Thermal erosion: repose slopes and free colluvial wedges

// 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.

Step 3 — Hydraulic droplet erosion: the history maker

// 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.

Step 4 — Curvature- and slope-driven splat rules (the 3×4 interaction)

// 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.

Step 5 — Detail density, breakup, and grounding

// 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.

5 — Worker curriculum: five exercises that build the eye

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.

  1. The knoll study (form only). One real photograph of a soil-mantled montane knoll. Rebuild its heightfield in the kit — grey material, matched light, nothing else.
    Pass: at 64 px the two silhouettes are not tellable apart, and the render's slope histogram lands in the photo's bands (floor <8°, flank 10–25°, break 25–35°). Auto-fail: any silhouette segment that fits an analytic curve by eye.
  2. The marble map (drainage). Run steps 1–3 on a scratch terrain and script the droplet test.
    Pass: ≥90% of 1000 droplets exit or reach the basin; zero closed pits >0.5 m; the resulting channel network, drawn as a mask, branches (at least 3 confluences on 260 m).
  3. The base-of-slope study. Photograph of a grassy hill base beside the render's mound base, cropped alike.
    Pass: the render shows a concave wedge with monotonically decaying slope over 5–15 m and embedded coarse debris; 2 of 3 blind judges stop naming the base. Auto-fail: tangent easing anywhere in the crop.
  4. The splat-response study. Final heightfield, curvature-driven splats, four 90° orbit crops.
    Pass: rock appears only convex+steep; tiling-probe finds no second-peak repeat period on the meadow floor; zero visible projection stretch at 100% on any >30° face.
  5. The metre study (overcast). A 10×10 m flat patch, eye-height camera, overcast sky — no sun to hide behind — against a matching photo.
    Pass: empty-cell fraction ≈0% at 8 px and exposure-normalised local contrast within 30% of the photograph. This is the exercise that teaches what “ground” costs; every earlier one is form.
Orbit-right foreground: flat plane with stretched texture
The floor is next after the knolls. Orbit-right's foreground reads as a plane with a photo draped on it — exercise 5's territory. Fix form first; this crop is the stage-3 follow-up, not the lead.

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