Move the heightmap PNGs out of Content into RawContent/World

The editor offered to import them as textures on every start; source files for authoring scripts do not belong
under Content. create_world.py and generate_heightmap.py read them from RawContent/World/Heightmaps.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Rainer Leit
2026-09-16 21:19:30 +03:00
co-authored by Claude Fable 5.1
parent 1945ef033b
commit 4025b04941
8 changed files with 6 additions and 6 deletions
+1 -1
View File
@@ -39,7 +39,7 @@ Claude Code at it. Reconnect with `/mcp` once the editor is up. Close the editor
before a shell build. before a shell build.
Off the ladder: `Content/Maps/L_World`, a ~200 km² world-partitioned landscape built by Off the ladder: `Content/Maps/L_World`, a ~200 km² world-partitioned landscape built by
`Scripts/Authoring/create_world.py` from PNGs in `Content/World/Heightmaps/` (seeded by `generate_heightmap.py`) `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. through `ULandscapeAuthoringLibrary` in the `SaltyEditor` module. It uses Elite_RockyMeadows' landscape material.
No gameplay code references it; the gym is still the test level. No gameplay code references it; the gym is still the test level.
+1 -1
View File
@@ -7,7 +7,7 @@ the reasoning lives in the specs, this is the memory.
- 2026-09-16 — Off the ladder, at the user's request: `L_World`, a world-partitioned ~200 km² landscape from a - 2026-09-16 — Off the ladder, at the user's request: `L_World`, a world-partitioned ~200 km² landscape from a
seeded heightmap. `Scripts/Authoring/generate_heightmap.py` (numpy, in `Scripts/Authoring/.pylib` via seeded heightmap. `Scripts/Authoring/generate_heightmap.py` (numpy, in `Scripts/Authoring/.pylib` via
`bootstrap-pylib.sh`) writes 16-bit height and 8-bit weight PNGs to `Content/World/Heightmaps/`; `bootstrap-pylib.sh`) writes 16-bit height and 8-bit weight PNGs to `RawContent/World/Heightmaps/`;
`create_world.py` rebuilds the level from them through `ULandscapeAuthoringLibrary` in the new `SaltyEditor` `create_world.py` rebuilds the level from them through `ULandscapeAuthoringLibrary` in the new `SaltyEditor`
module, because the engine exposes no landscape creation to Python. Elite_RockyMeadows' landscape material and module, because the engine exposes no landscape creation to Python. Elite_RockyMeadows' landscape material and
three layer infos. Swap the terrain by replacing the PNGs and rerunning. Nothing in gameplay references it. three layer infos. Swap the terrain by replacing the PNGs and rerunning. Nothing in gameplay references it.
+2 -2
View File
@@ -1,5 +1,5 @@
"""Builds /Game/Maps/L_World: a world-partitioned level with a ~200 km2 landscape from the heightmap PNGs in """Builds /Game/Maps/L_World: a world-partitioned level with a ~200 km2 landscape from the heightmap PNGs in
Content/World/Heightmaps/, the Elite_RockyMeadows landscape material, daylight and a player start. Rebuilds RawContent/World/Heightmaps/, the Elite_RockyMeadows landscape material, daylight and a player start. Rebuilds
from scratch every run; the level is a product of this script and the PNGs, never hand-edited. from scratch every run; the level is a product of this script and the PNGs, never hand-edited.
UnrealEditor-Cmd.exe Salty.uproject -run=pythonscript -script=Scripts/Authoring/create_world.py UnrealEditor-Cmd.exe Salty.uproject -run=pythonscript -script=Scripts/Authoring/create_world.py
@@ -21,7 +21,7 @@ sys.path.insert(0, HERE)
sys.path.insert(0, os.path.join(HERE, ".pylib")) sys.path.insert(0, os.path.join(HERE, ".pylib"))
LEVEL_PATH = "/Game/Maps/L_World" LEVEL_PATH = "/Game/Maps/L_World"
HEIGHTMAP_DIR = os.path.normpath(os.path.join(HERE, "..", "..", "Content", "World", "Heightmaps")) HEIGHTMAP_DIR = os.path.normpath(os.path.join(HERE, "..", "..", "RawContent", "World", "Heightmaps"))
HEIGHTMAP = os.path.join(HEIGHTMAP_DIR, "L_World_Height.png") HEIGHTMAP = os.path.join(HEIGHTMAP_DIR, "L_World_Height.png")
PACK = "/Game/Elite_RockyMeadows" PACK = "/Game/Elite_RockyMeadows"
LANDSCAPE_MATERIAL = f"{PACK}/Materials/M_Landscape_Main_Inst_RockyMeadows02" LANDSCAPE_MATERIAL = f"{PACK}/Materials/M_Landscape_Main_Inst_RockyMeadows02"
+2 -2
View File
@@ -1,7 +1,7 @@
"""Generates a seeded heightmap and three weightmaps for L_World, as 16-bit and 8-bit greyscale PNGs. """Generates a seeded heightmap and three weightmaps for L_World, as 16-bit and 8-bit greyscale PNGs.
Pure numpy, no engine: run it with any Python that has numpy, or let create_world.py call it. The output is Pure numpy, no engine: run it with any Python that has numpy, or let create_world.py call it. The output is
plain files under Content/World/Heightmaps/, so swapping the terrain later is dropping in a different PNG of plain files under RawContent/World/Heightmaps/, so swapping the terrain later is dropping in a different PNG of
any resolution and rerunning create_world.py; nothing else in the project knows how the terrain was made. any resolution and rerunning create_world.py; nothing else in the project knows how the terrain was made.
UE_5.8/Engine/Binaries/ThirdParty/Python3/Win64/python.exe Scripts/Authoring/generate_heightmap.py [--seed N] [--size 4033] UE_5.8/Engine/Binaries/ThirdParty/Python3/Win64/python.exe Scripts/Authoring/generate_heightmap.py [--seed N] [--size 4033]
@@ -21,7 +21,7 @@ HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(HERE, ".pylib")) sys.path.insert(0, os.path.join(HERE, ".pylib"))
import numpy as np # noqa: E402 import numpy as np # noqa: E402
OUT_DIR = os.path.normpath(os.path.join(HERE, "..", "..", "Content", "World", "Heightmaps")) OUT_DIR = os.path.normpath(os.path.join(HERE, "..", "..", "RawContent", "World", "Heightmaps"))
SEA_LEVEL = 0.18 # fraction of the 16-bit range that is sea; create_world.py places the water plane here SEA_LEVEL = 0.18 # fraction of the 16-bit range that is sea; create_world.py places the water plane here
PAD_RADIUS_FRACTION = 0.01 # flat spawn pad, as a fraction of the map width PAD_RADIUS_FRACTION = 0.01 # flat spawn pad, as a fraction of the map width