diff options
| author | godosa <godosa@godosa.eu> | 2026-10-07 00:14:38 +0200 |
|---|---|---|
| committer | godosa <godosa@godosa.eu> | 2026-10-07 00:14:38 +0200 |
| commit | 3443c1c65e9f1753e1e656b35d08416c1fa298f2 (patch) | |
| tree | 4e43236f460145a4d75d1b4616dcb7aa6ef08f51 /mapview.py | |
| download | worldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.tar.gz worldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.zip | |
worldmap-viewer: initial public history
Diffstat (limited to 'mapview.py')
| -rw-r--r-- | mapview.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/mapview.py b/mapview.py new file mode 100644 index 0000000..56e926e --- /dev/null +++ b/mapview.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +"""Map-viewer tools over a built world (see README.md): refine drawn regions, preview a region's sea floor, export +terrain for games. The server itself is serve.py.""" +import argparse +import os +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +import worldgen_path # noqa: E402,F401 (mapgen on sys.path) +from mapgen import config as C # noqa: E402 +from mapgen import pipeline as P # noqa: E402 + + +def main(argv=None, root: Path | None = None) -> int: + ap = argparse.ArgumentParser(prog="mapview.py") + ap.add_argument("--world", help="the world's folder (its config/, out/, places/); default: the current folder") + ap.add_argument("--low-memory", action="store_true", + help="slower, lower memory peak; same results (or set WORLDGEN_LOW_MEMORY=1)") + sub = ap.add_subparsers(dest="cmd", required=True) + for name in ("refine", "seafloor-preview", "export"): + s = sub.add_parser(name) + s.add_argument("--res", type=int) + s.add_argument("--final", action="store_true") + if name == "seafloor-preview": + s.add_argument("--region", required=True, help="a region id from places/regions.json") + if name == "export": + s.add_argument("--lat", type=float, required=True) + s.add_argument("--lon", type=float, required=True) + s.add_argument("--size-km", type=float, default=40.0) + s.add_argument("--res-m", type=float, default=10.0) + s.add_argument("--pixels", type=int, help="samples per side (default: the smallest 2^n + 1 covering the size)") + s.add_argument("--name") + s.add_argument("--out", help="folder for exports (default <world>/exports)") + s.add_argument("--workers", type=int, default=max(0, min(6, (os.cpu_count() or 2) - 2))) + s.add_argument("--era", help="an era from config/eras.toml (default: [eras] default)") + a = ap.parse_args(argv) + if a.low_memory: + os.environ["WORLDGEN_LOW_MEMORY"] = "1" + root = Path(a.world).resolve() if a.world else (root or Path.cwd()) + try: + cfg, _ = C.load(root) + res = a.res if a.res is not None else int(cfg["build"]["res_final" if a.final else "res_dev"]) + if a.cmd == "seafloor-preview": # the refined sea floor of a region, per era + import seafloor + print(f"preview: {seafloor.preview_region(root, res, a.region)}") + return 0 + if a.cmd == "refine": # regional refinement of places/regions.json + import refine + refine.build_areas(root, res, root / "places" / "regions.json") + return 0 + import export + if a.res is None: + import serve + res = serve.pick_res(root, cfg) # the map the viewer shows + d = export.export(root, res, a.lat, a.lon, a.size_km, a.res_m, out_dir=Path(a.out) if a.out else None, + name=a.name, pixels=a.pixels, workers=a.workers, era=a.era, + progress=lambda k, n: print(f"\rexport: tile {k}/{n}", end="", flush=True)) + print(f"\nexport: {d}") + return 0 + except (C.ConfigError, P.StageError) as e: + print(f"error: {e}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + sys.exit(main()) |
