Added: Initial world generation tool

This commit is contained in:
Rainer Leit
2026-09-17 17:55:48 +03:00
parent d64748f76f
commit cc43ed8dc8
2065 changed files with 23664 additions and 1011 deletions
+30 -4
View File
@@ -38,10 +38,36 @@ The editor serves the engine's MCP plugin on `127.0.0.1:8000/mcp` while it is op
Claude Code at it. Reconnect with `/mcp` once the editor is up. Close the editor and its Live Coding console
before a shell build.
Off the ladder: `Content/Maps/L_World`, a ~200 km² world-partitioned landscape built by
`Scripts/Authoring/create_world.py` from PNGs in `RawContent/World/Heightmaps/` (seeded by `generate_heightmap.py`)
through `ULandscapeAuthoringLibrary` in the `SaltyEditor` module. It uses Elite_RockyMeadows' landscape material.
No gameplay code references it; the gym is still the test level.
Off the ladder: `Content/Maps/L_World`, a ~200 km² world-partitioned landscape, is a product of three inputs and
nothing else: the manifest `RawContent/World/World.json` (size, what a heightmap value means in metres, the
height source, the paint-layer rules), the PNGs `Scripts/Authoring/generate_heightmap.py` writes from it into
`RawContent/World/Heightmaps/`, and `Scripts/Authoring/create_world.py`, which imports them through
`ULandscapeAuthoringLibrary` in the `SaltyEditor` module and dresses the level as Elite_RockyMeadows dresses its
demo maps (landscape material and layers, sun with cloud shadows, skybox, fog, grade; numbers read with
`dump_level.py`). The height source is seeded noise today, weathered and carved by `heightmap_erosion.py`
(hydraulic droplets, thermal weathering, strata; D-46); a real heightmap is a manifest edit and a rerun
(`RawContent/World/README.md`). Run `create_world.py` detached, never under a tool timeout, and never while the
editor has `L_World` open. No gameplay code references the world; the gym is still the test level. Where the
generator is going is settled in [`Docs/Terrain.md`](Docs/Terrain.md) (D-47, D-48): a Go core in
`Tools/Terrain/`, stream-power fluvial erosion instead of droplets as the thing that shapes the land, a canvas
of 7141 vertices at 200 cm over −512…1536 m, and a `Generated` edit layer so sculpting survives a rerun. Read
it before touching the generator, and the numpy pipeline is not to be extended.
The Go core now exists and works: `Tools/Terrain/` builds an uplift *rate* field and lets a Braun-Willett
stream-power solve produce the terrain from it, with a Roering nonlinear hillslope law and per-uplift-class
statistics. The coast is a pass of its own now (D-51, `internal/coast`), running after the solve: a continental
shelf whose width follows the relief behind the shore, a surf that planes a shore platform and leaves a cliff
where its reach ends, and a sediment budget carried along the shore into the bays and out of the river mouths.
It stops at the geology grid, so the detail passes are unbuilt and `L_World` still comes from the numpy
pipeline. **[`Docs/Terrain-Next.md`](Docs/Terrain-Next.md) is the working brief** — how to run it, what
each output map is for, what still looks wrong, and what has already been measured and rejected. Start there.
Where it is going: finish the detail passes so there is a full-resolution output at all, then make the source
a **painted map** — an author paints the uplift, the mask and the erodibility, never the height, and the solve
turns that intent into terrain with real drainage. Worlds are far larger than today's 14 km canvas, so the
geology solve stays whole (it cannot be tiled: drainage area is global) and only the detail passes tile. That
makes two rules binding on anything written now: index every noise and hash by **absolute world coordinates**
rather than grid index, and give every tiled pass an overlap margin. Composition tuning is parked.
Next: step 3, the body, the camera, the input map and the gym. Step 1's PIE proof (two clients, dedicated
server, two pawns in the gym) is still a person's to tick. Update this section when a step closes.