Added: Initial world generation tool
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user