← Ground look and levels · all tasks

A flank texture for mountains — the faces are wearing floor tiles

ready priority 2 estimate M

ground-look-and-levels/007 · created 2026-08-19 · updated 2026-08-20

Why

Mountains became landform on 2026-08-19 (deliverable 16): a contiguous group of one flavour is now one continuous massif in the floor mesh, with steep faces and a sheer foot. Those faces currently wear the flavour’s own ground tile — the same texture the flat floor of that cell uses. It is honest and it reads as stone, but it is a top-down floor texture standing upright, and on the steeper part of a face it smears.

The one texture in the game drawn for a vertical surface is client/ground/special/cliff-face.png, and it is deliberately not used here: it is authored as exactly one level tall and seamless left-to-right, so on a mountain flank three or four cells high it bands horizontally. The shader suppresses it on mountain cells for that reason (ground.gdshader, the mountain_w term).

What to do

Definition of done

The flank art is in the repo, the shader uses it on mountain faces only, LOR_SHOTS_PERF=1 shows no regression against the numbers above, the Godot suite is green, and the brief has moved to docs/design/historic/ per docs/design/README.md.

Where the work lands

land-of-lor/docs/design/briefs/, land-of-lor/game/world/client/ground.gdshader, client/ground/, docs/handoff/ground-look-and-levels.md.


Experiment log — 2026-08-20 (tried on the phone, then rolled back)

The art came back from Claude Design and was wired in end-to-end as a local experiment, run on Kris’s phone, and then rolled back. Nothing shipped: no push, no APK upload, no /play change. The three PNGs are still only in the handback package (~/Downloads/mountain-back-from-cd/ground/flank/), not in the repo.

Verdict (Kris, on the phone): not bad, but not better enough, and it came with a performance cost. Back to the drawing board.

What was built

What was learned

The slope gate has no good setting, and that is the finding. A landform massif is a shallow dome about a cell tall, so almost none of its surface is truly sheer:

Cost was small but real: 0.53-0.62 ms on the 60x60 Badlands (laptop iGPU) against a 0.69-0.89 ms baseline, i.e. inside the noise, plus one texture read per mountain fragment. Small is not free, and the rule Kris applied is the right one: a cost has to buy a visible win.

Root cause, and the recommendation

The mesh carries no UVs. ground_mesh.gd emits position only; every texture in the ground — floor tiles, the cliff face, and this flank — is projected from world position in the shader. On flat ground and on a sheer wall that projection is exact. On a curved mountain face it is not: the texture is projected through the curve rather than laid along it, which is exactly what the undulations are.

So the fix is in the mesh, not in the landform’s shape. Kris’s instinct here was right and the first analysis written in-session (that the mountain needed real flat faces to clad) was the weaker answer — worth noting because it would have sent the next session at the wrong problem. Unwrapping the massif’s surface and giving those vertices real UVs lets a single texture be laid along the surface, stretching with it, no projection error and no gate to tune: the whole flank/floor question stops being a slope threshold and becomes “where does the UV shell start”. That is a bigger change than this task assumed, and it touches the mesh builder that 002 made pure and tested.

Still worth exploring, and NOT closed off by the above: different textures for different results. Only these three were tried, all in the same painted-strata family. A flank with less directional bedding, or one authored to tolerate curvature, may well read fine even under the current world-position projection — that is a cheap thing to test and should be tried before committing to UV work.

Where to pick this up

Nothing to undo — the repo is at 9f67b74 and the phone was rebuilt back to clean v18. The brief stays in land-of-lor/docs/design/briefs/ (it has NOT moved to historic/, because it has not been satisfied). The Claude Design session is unchanged and still holds the flank work if the art is wanted again.

View source in repository · also available as raw markdown.