Releases: Teddy563/arnis
Arnis Meld Fork v2.9.1
A maintenance release on top of 2.9.0. Three things:
- Each Meld cell can now read its own slice of a shared OSM tile cache directly, with no per-cell merge step.
- A water rendering artifact (the "wedge") that could flood a triangle of a cell with water is fixed.
- The Overture building fetch skips work it does not need.
All changes are additive. A normal single-world run (no --osm-tile-dir, buildings on) behaves as before.
New: read OSM straight from a tile cache (--osm-tile-dir)
Meld keeps OSM on a stable web mercator grid (one JSON file per z11 tile, named osm_g1_z{Z}_{X}_{Y}.json). Before this release, Meld merged each cell's covering tiles into a single per-cell file and passed it with --file. That merge was the slow "assembling" step, and it fed Arnis a superset that had to be clipped back down.
Now:
arnis --output-dir ./world --bbox <cell-bbox> --osm-tile-dir ./cache/osm --osm-tile-z 11
Arnis computes the z11 tiles that overlap --bbox, loads each osm_g1_z11_{X}_{Y}.json, concatenates and de-duplicates the elements by (type, id), and feeds that to the normal parser. The orchestrator fills the directory once and hands the same directory to every cell, so there is no per-cell assembly at all. --osm-tile-dir is mutually exclusive with --file. A tile that is not on disk is skipped.
--prewarm-overture is the building-side companion: arnis --bbox <region-bbox> --prewarm-overture fetches and caches the Overture partitions and STAC index for the bbox and exits, so later cells read buildings from disk.
Fixed: triangle and rectangle water floods (the "wedge")
Symptom: a cell would render a large triangle or rectangle of water with a hard, dead-straight diagonal edge cutting across terrain.
Cause: a water multipolygon (a lake or river bank) is an outline made of member ways. When the water body extends beyond the tiles loaded for a cell, some member ways are missing, so the assembled outer ring is left open (a broken loop). The bbox clip then closed that open ring by connecting its two loose ends with a straight chord, and the even-odd scanline fill flooded everything on one side of the chord. That straight chord is the diagonal edge.
Fix: clip_water_ring_to_bbox now checks that its input ring is actually closed (first node matches the last by id, or the two are within one block). If it is open, the function returns nothing, so the broken outline is dropped instead of being closed with a fake straight edge. Rings that are properly closed are unaffected, so legitimate water still renders. Both water paths (element_processing/water_areas.rs and land_cover_osm_water_override.rs) call this function, so both are covered.
Verified on real 1:10 data: a wedge cell went from 135,600 to 4,555 water blocks (the triangle is gone, the real river is kept), and a clean river cell came out byte identical (no legitimate water lost).
Changed: Overture buildings are gated and cached
- The Overture Maps building fetch and render now run only when buildings are enabled. A
--no-buildingsrun no longer downloads building partitions it will not use. Measured on a roads-and-ground 1:10 cell: about 28.8 s down to about 4.2 s. - The Overture STAC index is cached locally with a 7 day TTL, and the per request byte ranges are cached under the Arnis cache root, so repeated cells over the same area read from disk with no extra network. The earlier full-partition lock that could stall a whole batch on one slow download was removed.
Files touched
src/args.rs, src/osm_parser.rs, src/main.rs, src/clipping.rs, src/land_cover_osm_water_override.rs, src/overture.rs, src/gui.rs, Cargo.toml.
Arnis Meld Fork v2.9.0
Arnis Meld Fork 2.9.0
A fork of Arnis by louis-e, tuned for large-scale parallel
generation with the Meld orchestrator. It carries the full
upstream 2.9.0 line and adds the cross-tile machinery that keeps independently built tiles lining up
block for block, so you can generate whole regions as one seamless Minecraft world.
Highlights
- Caught up to upstream Arnis 2.9.0 (in-process tile parallelism + stream-to-disk), seam verified
intact: 0 of 1024 boundary chunks differ. - Snow-capped terrain above the real-world snow line.
- Roads-and-ground-only mode (
--no-buildings) for a clean base layer. - Fully offline elevation (
--offline,--download-terrain-only,ARNIS_ELEV_ZOOM), no rate
limits, no no-data holes. - Big water, shore, and wetland rework that kills the old stepped-water and stray-sand artifacts.
- Lower memory on dense areas (one byte per cell for the common section).
New features
- Snow line. Terrain above the latitude-derived snow line gets a thin snow layer with a soft
edge. Honours--elevation-min/--elevation-max, so the cap lands at the same height across tile
seams, and it skips water and shore. - Parking like roads. Speckled asphalt (honouring
surface=*), white lane markings, and a slim
metal lamp. The lamp is gated behind buildings, so--no-buildingsdraws only the flat pavement. - Automatic flat low-scale bridges. At
--scale 0.3or lower, bridges become a flat one-block
deck instead of a collapsing arch.
Flags and options
--no-buildings(alias--no-structures): drop buildings and building-adjacent features, keep
roads, rail, water, land cover, terrain, and parking.--tile-invariant-rendering(alias--seed): a building straddling two tiles renders identically
in both.arnis ... --seed 42--road-detail max|clean|compact: trade road detail for legibility at small scale.--overpass-url: priority-ordered Overpass endpoints that replace the public mirrors.--download-only+--save-json-file: fetch a region's OSM once, then feed many runs with--file.--download-terrain-only: warm the AWS terrain cache for a bbox in one pass, then exit.--offline(alias--elevation-cache-only): serve elevation from cache only, never re-download.ARNIS_ELEV_ZOOM=13: cap the terrain zoom. z13 keeps the full ~30 m signal, dodges the z14/z15
no-data holes, and pulls far fewer tiles. (PowerShell:$env:ARNIS_ELEV_ZOOM='13')--master-origin-lat/--master-origin-lng: anchor every tile to one global ruler. Pass both.--elevation-min/--elevation-max: pin one shared real-world height range in metres. Pass both.
Water and shore rework
A multi-pass water, underwater, shore, and wetland system: flat per-component water surface,
single-cell sand shore swap, depth-tiered beds, water carving under bridges, a stoney-shore ring, and
thin-land drown. Resolves the long-running stepped-water, double-slope, air-hole, and stray-sand
artifacts. Adds 9 block IDs (256 to 265) and widens block IDs to u16.
Engine and performance
- Merged 53 upstream louis-e/arnis commits: tile parallelism, stream-to-disk eviction, mimalloc, the
large-area warning, and the GUI ETA, with the cross-tile seam kept intact. - One byte per cell for the common section. Widening to u16 had doubled every full section's
backing vector; storage now uses one byte where every id fits and the wide form only where a high
id is present. Reads, writes, and the seam hash are representation-independent (verified by a
round-trip and a Full-vs-FullWide test). - Product renamed to "Arnis Meld Fork"; GUI footer credits louis-e and Teddy563.
Fixed
- Parallel-safe terrain fetch (6 retries with backoff, per-tile jitter, atomic temp-then-rename
writes, retry-missing rounds) that kills the staircase seam under heavy concurrent fetching. - i32 corner-sum overflow panic on far-from-origin master coordinates.
- Cross-tile coordinate drift under master-origin (anchored at origin_lat; single-world output is
byte-identical). - Tree trunk apex cap, Minecraft 1.21.4 to 26.1.x datapack schema overlays, and GUI disk-probe fixes.
Downloads
Grab the build for your platform from the Assets below: Windows (arnis-windows.exe), Linux
(arnis-linux, or the arnis-linux.AppImage), and macOS (arnis-mac-intel, arnis-mac-arm64).
Try it at scale with Meld
Arnis builds one area at a time. Meld drives this fork to
build whole cities, countries, and continents as one seamless world: it tiles your selection, builds
the tiles in parallel, and melds them with no seams and no height cliffs.
Credits
Original Arnis by louis-e. Meld fork by
Teddy563. Respect the upstream Arnis license.
v2.8.6 OSM Download Only
Added
--download-only— fetch the OSM data to--save-json-fileand exit before any
world generation. Lets an external scheduler (e.g. Meld) pre-fetch a whole region's
OSM in one request and feed it to many cells via--file, instead of every
parallel cell querying Overpass and tripping the public per-IP rate limit.
Purely additive — when the flag is omitted, behaviour is identical to v2.8.5.
Usage
arnis --bbox <s,w,n,e> --save-json-file region.json --download-only
arnis --bbox --file region.json --output-dir
Arnis v2.8.5 Seamless multi-tile rendering (Meld)
Seamless multi-tile rendering for Meld. This release makes adjacent tiles
(generated as separate processes under a shared master origin / --seed) agree at
their shared borders, so the region butt-join in Meld is visually seamless.
All changes are gated to tile mode (master origin + --seed). Single-world
generation is byte-identical to upstream — no behaviour change without --seed.
The core principle
A block at world (X, Z) must be a pure function of (X, Z, seed) — independent of which
tile rendered it. Then two tiles that both cover a border block emit the identical block.
This release removes the things that broke that purity.
Fixes
Trees, parks & vegetation no longer cut at tile borders
- Scatter areas (
landuse=forest,natural=wood/tree_row,leisure=park/garden, and
alllandusevegetation) now decide each tile with a position-seeded RNG instead of
a shared per-element stream. The old stream was drawn inside a terrain gate, so a
single border tile differing between two tiles desynced the stream and relocated the
whole area's scatter on one side. (landuse.rs,leisure.rs,natural.rs) - Scatter ways and multipolygon-relation members render unclipped in tile mode
(cap-guarded) so both tiles flood-fill the identical interior. (osm_parser.rs)
Buildings
- Multipolygon (relation) buildings no longer split at a tile border.
- Buildings whose footprint is ≥60% water are skipped (no more houses standing in open
water). (buildings.rs)
Terrain / elevation
- Elevation and land-cover grids are sized with the same origin-anchored metric the
world uses — terrain and land cover no longer slide 1–3 blocks off OSM features or
disagree across tiles. (elevation/mod.rs,ground.rs) - Robust parallel elevation fetch: more retries, retry-missing-tiles rounds, atomic tile
cache writes, de-synced retry jitter — fixes whole tiles rendering flat (and the
staircase cliff against a neighbour) when many tiles fetch at once. (aws_terrain.rs) - The global elevation outlier filter is skipped in tile mode (its per-tile statistic
caused a vertical step at the border, worst over coastal bathymetry); the bounded local
repair already covers real spikes. (elevation/mod.rs)
Biome tint
- Per-chunk biome lookup uses cell-local coordinates and a globally-continuous latitude,
removing the vertical grass/leaf-colour seam at tile borders. (biome.rs,
world_editor/java.rs)
Merge accuracy
≈ 97% of rendered surface melds seamlessly across tile borders (terrain, roads,
buildings, forests/woods, parks, land-cover ground, biome tint). The remaining ~3% are
known, documented residuals (see below) — not regressions.
Known residuals (deferred, documented in FORK-AUDIT.md)
natural=scrub/heath/grassland/wetlandstill use a shared-stream RNG (they pass the RNG
into helper functions) and are kept clipped — a localized seam is possible if your area
is one of these. Conversion to position-seeded RNG is the next step.- Water bodies larger than one tile + buffer can show a ≤1–2 block surface/underwater-floor
seam (the water-leveling/depth code is upstream and intentionally untouched). - Features whose bounding box exceeds ~12.5M blocks (≈3500×3500) stay clipped (a safety cap
that prevents them from vanishing).
Not changed
Roads, bridges, water carving/leveling, and highways are untouched. A coastal road that
renders as a raised bridge is OSM-tag-driven (bridge=* / layer=*), not a fork change.
Compatibility
--seed(alias--tile-invariant-rendering) opts into all of the above. Without it,
output is unchanged from upstream.
Arnis v2.8.4 - Coordinate Seam Fix
Tag: v2.8.4 · base: louis-e/arnis v2.8.0 (6172ffb) · previous Meld: v2.8.3 (9fadb03)
TL;DR
Quickfix over the Meld Water Update. Fixes cross-tile coordinate drift under --master-origin-lat/lng: the longitude->block-X factor was computed from avg_lat = (point_lat + origin_lat) / 2, so the same longitude mapped to a different block-X depending on the point's latitude — shearing each tile off the shared 512-block region grid by an amount that grows with distance from the origin, leaving flat-grass "unrendered" strips at tile seams that widen toward the far corners. Now anchored at origin_lat -> a longitude maps to one block-X project-wide -> tiles line up exactly on region boundaries -> seams gone. No water/render changes from v2.8.3.
Changed
transform_point(master-origin path):mpd_lonanchored atorigin_latinstead ofavg_lat. Adds a latitude-invariance regression test.
Compatibility
- Single-world generation (no
--master-origin): byte-identical to v2.8.3. - Meld / multi-tile: far-from-origin tile seams fixed.
Arnis v2.8.3 - Meld Water Update
Tag: v2.8.3 · base: louis-e/arnis v2.8.0 (6172ffb) · previous Meld: v2.8.1 (c77c582)
TL;DR
Comprehensive underwater + shore + wetland rewrite. Vanilla-MC-style ocean floor
with mostly GRAVEL background, rare CLAY/SAND/DIRT/COARSE_DIRT patches, super-rare
5–13 cell MAGMA + SOUL_SAND vents (bubble columns), domain-warped organic shapes.
Tied to --seed for reproducible noise. Bigger prominent dunes, sand→grass shore
fade, wetland MOSS rings, tiered cattail with state-stacked candles, sweep-pass
killing floating veg over water + roads.
Headline features
Underwater bed (vanilla-MC look)
- Patch shapes: independent per-block value-noise fields with domain warping
→ organic flowing patches (long-rounded + bubble shapes), not concentric blobs. - Bed composition (lagoon measure): GRAVEL 64% · CLAY 13% · SAND 11% · DIRT 7% · COARSE 1% · MAGMA 0.3% · SOUL_SAND 0.3%.
- MAGMA + SOUL_SAND rare 5–13 cell clusters at depth ≥ 5 → in-game bubble columns.
- Slope = sqrt curve
depth = local_max × √(dist/span). Steep near shore, plateau far out. - Dunes max 4 blocks, domain-warped, prominent waves, 72% coverage gate, sharper bump curve.
- STONE under all sea bed (no SANDSTONE underwater).
- Under-bed STONE fill 12 cells below
bed_y-1→ no AIR pockets in neighbour columns.
Underwater fauna (vanilla mix)
- SEAGRASS meadow mix: 50% short · 35% TALL_SEAGRASS · 15% SEA_PICKLE (waterlogged).
- KELP min 3 cells, variable column height 30–100%, KELP tip block on top.
- Veg placed ABOVE dune top (not at
bed_y+1) → never carves holes into bed. - AIR-only paint whitelist (fixed
Some(&[])empty-list always-replace bug).
Shore palette (vanilla-MC fade)
- Static-fade SAND → COARSE_DIRT → GRASS_BLOCK over 5-cell band via smooth
value_noise(no pepper). - Stoney shore variant (STONE_BRICKS/COBBLE/ANDESITE etc neighbour): COBBLE 50% · MOSSY_COBBLE 30% · COARSE_DIRT 20%.
- Shore-land cattail/sugar_cane 2%/1% on SAND/DIRT/COARSE_DIRT/GRASS at water-edge.
Wetland (source-water style)
- Per-subtype branch (reedbed/swamp/mangrove/bog/tidalflat/generic).
- MOSS_BLOCK 8-neighbour ring + COARSE_DIRT Chebyshev-2 ring around water puddles (post-pass, no MOSSY_COBBLESTONE noise).
- Tiered cattail: 1 or 2 stalks (max 2) + ONE BROWN_CANDLE block with
candles=1/2/3/4NBT state. - Less grass (50–80% bare MUD per subtype).
Plumbing
- Veg sweep post-pass (
sweep_floating_veg) removes floating cattail/grass/candles/sugar_cane/flowers over water cells + roads. Trees (LOG/LEAVES) explicitly excluded from sweep set. --seedties noise: globalNOISE_SEEDOnceLock set fromargs.tile_invariant_rendering. Same seed → same bed/dune/shore patterns; different seed → shuffled.- 9 new Block IDs (u16 widening): 256 MAGMA_BLOCK · 257 SUGAR_CANE · 258 KELP · 259 TALL_SEAGRASS_BOTTOM · 260 TALL_SEAGRASS_TOP · 261 SEA_PICKLE · 262/263/264 BROWN_CANDLE_{2,3,4} · 265 SOUL_SAND. NBT side-table arms supply correct
half/pickles/candles/waterloggedstates.
CLI / GUI
--seed Nalias for--tile-invariant-rendering N(carried over from prior Meld v2.8.0 work).- GUI: Road-detail dropdown, Ground-height numeric, Seed numeric (carried over).
Files modified (vs Teddy563/arnis main c77c582)
7 new files · 13 modified · ~6,000 LOC delta (incl. wikidata + 3DMR work already in c77c582).
The water-update-specific diff (filtering out unrelated 3DMR pieces) is:
| file | LOC delta | purpose |
|---|---|---|
Cargo.toml |
bump 2.8.1 → 2.8.3 | Meld release version |
src/block_definitions.rs |
+120 / −10 | u16 widening, 9 new IDs + NBT arms |
src/luanti_block_map.rs |
+13 | Luanti mappings for new IDs |
src/water_depth.rs |
+1100 / −10 | full water carve + bed picker + dunes + veg + sweep + STONE under-fill + --seed integration |
src/element_processing/water_areas.rs |
+30 | body_max plumbing + 5×5 bridge ring |
src/element_processing/natural.rs |
+200 / −80 | wetland rewrite + MOSS rings post-pass + sugar_cane + tiered cattail |
src/ground_generation.rs |
+180 / −30 | shore static-fade + stoney variant + shore-land cattail + set_noise_seed + seeded value_noise_01 |
src/data_processing.rs |
+6 | call set_noise_seed + sweep_floating_veg |
Files modified (vs louis-e/arnis main 36f5579)
Larger delta (Meld base is louis-e v2.8.0). Same per-file table as above plus the
11 Teddy commits (Meld scheduler · tile-invariant rendering · road-detail
clean/compact/max · GUI controls · --seed alias) already in Teddy main.
Water Update (v2.8.1)
Continuation of the louis-e Arnis v2.8.0 ("Landmark Update"). Adds underwater depth, smooth-slope shorelines, a SAND to GRAVEL gradient bed, wobbly value-noise palette mixing, road and bridge-safe carving, GUI controls, and a --seed CLI alias for deterministic building palettes across tiles.
What's New Since v2.7.0-meld.1
CLI
--seed N: Alias for--tile-invariant-rendering N. Renders the same building palette across runs and adjacent tiles.--road-detail {max | clean | compact}: Three-tier road rendering.max: Upstream byte-identical.clean: Visual cleanup at scale ≥ 0.7.compact: Pedestrian skip and lanes capped to 2 for low scales.
--master-origin-lat / --master-origin-lng: Global coordinate anchor for multi-tile renders.--elevation-min / --elevation-max: Global elevation floor and ceiling for cross-tile Y normalization to eliminate height seams.
GUI
- Road Detail dropdown (Default auto / Max / Clean / Compact)
- Ground Height (Y) numeric input (Default: -62)
- Seed (tile-invariant) numeric input (Leave blank for non-deterministic palette)
Water Depth & Shore
- BigWaterField chamfer-3-4 distance transform over every
LC_WATERcomponent. - Universal depth carve (every ESA water cell gets depth, not just OSM polygons).
- Smooth slope wobble via
value_noise_01to eliminate jaggy bed Y coordinates. - Tiered slopes by body size: 1/3 (tiny pond), 1/4 (small), 1/6 (medium), 1/8 (big sea or river). Depth = 6 is reached at approximately 48 blocks from the shore for big bodies.
- 3-block flat shoal band at every shoreline.
- Depth-tiered SAND → SANDSTONE → STONE bed with wobbly
value_noisemixing:- d 0, 1: SAND / SANDSTONE
- d 2: 70% SAND / 30% GRAVEL, wobbly blobs
- d 3: 50% / 50% split, wobbly blobs
- d 4: 30% SAND / 70% GRAVEL, wobbly blobs
- d ≥ 5: GRAVEL / STONE
- Land-mass guard: Hillsides over-claimed by OSM polygons no longer get carved.
- Road and bridge cells skipped: Causeways and bridge decks render correctly over water.
Wetlands
- G3 noise-driven puddles in
natural=wetland. This replaces upstream'srandom_bool(0.3)per-cell drops with spatially coherent, ~28-block patches. MOSS_BLOCKring around puddles using a 4-cardinal scan.COARSE_DIRTpatches via separate noise (whitelists[MUD]so the moss ring stays intact).
Building Rendering
- Real tile-invariant fix: The same building straddling two adjacent tiles picks a byte-identical block palette.
- Seeded RNG streams via
element_rng_salted_with_globalmix the--seed Nmodifier into derivation. - Per
building:material/roof:materialpalette restored from the v2.8.0 base.
Arnis v2.7.0-meld.1
Arnis Meld Fork
A fork of louis-e/arnis v2.7.0 that unlocks country-scale Minecraft world generation. Without any of the new flags, the binary behaves identically to upstream — every addition is opt-in.
What this patch adds
Five new flags that let you stitch many Arnis runs into one giant Minecraft world:
--master-origin-lat / --master-origin-lng
Pin every tile to a shared global origin point. Without this, two adjacent runs both write to r.0.0.mca and overwrite each other. With it, every tile lands at its correct globally-aligned region file, so you can render Romania (or any country) one chunk at a time and have it all line up.
--elevation-min / --elevation-max
Lock the elevation-to-Y mapping to a fixed range. Upstream auto-fits each tile to its local terrain, which means the same hill ends up at different Y heights in adjacent tiles → visible seams. Survey your whole region's elevation once, pass the same min/max to every run, and heights match across borders.
--tile-invariant-rendering [SEED]
Makes every stochastic decision in building rendering deterministic across runs and across adjacent tiles.
--tile-invariant-rendering(no value) → seed = 1--tile-invariant-rendering 1/42/ etc. → explicit seed (any non-zerou64)- omitted → upstream behaviour (process-local thread RNG)
What gets seeded:
- 10 building decisions per element: wall, floor, window, accent, vertical-window, accent-roof, accent-lines, vertical-accent, gabled, chimney
- 3 wall-block selectors that previously called
rand::rng()directly:get_building_wall_block_for_color,get_fallback_building_block,get_castle_wall_block(now have_seededvariants taking&mut impl Rng) - Pre-clip building metrics (
unclipped_bounds,unclipped_polygon_areaonProcessedWay) drive every dimension/diagonality/skyscraper decision so a building straddling two tiles renders identically in both
Two runs passing the same SEED produce byte-identical building palettes regardless of which tile rendered which OSM element first. Two runs with different seeds produce different (but each internally deterministic) palettes.
--overpass-url
Point Arnis at a self-hosted Overpass mirror (or a comma-separated failover chain). Public mirrors throttle hard at ~2 connections per IP — running 12+ parallel workers for a country-scale job hits 90% failure rate. With a local Docker Overpass, that goes to zero.
--road-detail max | clean | compact
Controls how road detail is rendered to fight visual noise from OSM road features stacking onto the same blocks. Three modes, each tuned for a different render scale:
max(default) — upstream byte-identical. Full multi-lane width, denselanes-1dashed dividers, all footways/crossings rendered. Best at scale ≥ 1.0 with sparse OSM data; visual escape hatch whencleanproduces a look you don't like.clean— for scale ≥ 0.7. Caps lane dividers to {1, 2}:lanes ≤ 4gets one centre stripe,lanes ≥ 5gets twin centre stripes 1 block apart (reads as a divided highway). Suppresses dividers onservice/service=parking_aisle/ pedestrian-grade highways and on roads narrower than 4 blocks. Same OSM coverage asmax, just the divider geometry is cleaner.compact— for scale < 0.7. Single centre stripe regardless of OSMlanes, dash period floored at 4-on/4-off (was halved with scale → checker noise), drops pedestrian highway types entirely AND trims them from the Overpass query (~30–50% smaller payload).
Multi-tile schedulers (Meld) auto-resolve based on project scale: compact below 0.7, clean above. Pin per-project to override.
The earlier none value was removed in favour of these three; for terrain-only worlds, omit --road-detail and pre-filter OSM input.
Visual cleanup
Independent of the multi-tile flags, this release fixes rendering issues at lower scales:
- Crosswalks now use a 2-on/2-off stripe pattern (was 1/1, which collapsed into a solid white bar from any distance) and stay inside the footway bounding box instead of bleeding onto adjacent sidewalks.
- Lane dividers are gated by lane count and road type — narrow service roads, parking aisles, and pedestrian highways no longer get painted dividers, and wide boulevards get a clean twin-stripe instead of 4–7 evenly-spread lines.
- Lane dividers width-gate — roads narrower than 4 blocks total (most service streets, narrow turn lanes, one-way alleys) skip the centre stripe entirely in
cleanandcompact. A 3-block road has only 1 cell either side of centre, so a dashed centre stripe leaves no visible asphalt — looks like a single-block dashed path, not a road. - Parking lots use black concrete for driving lanes and gray for parking spaces; the parking renderer's overwrite whitelist now includes
WHITE_CONCRETE, so road dividers painted on cells before the parking flood-fill pass get correctly erased. Render order: highways atdata_processing.rs:172→ amenities at:197. - Building tile invariance — the 3 wall-block helpers (
get_building_wall_block_for_color,get_fallback_building_block,get_castle_wall_block) no longer callrand::rng()directly, so buildings straddling tile boundaries pick the same blocks in both tiles.
Combined example: country-scale Romania run
arnis \
--bbox 44.40,26.05,44.45,26.10 \
--output-dir /path/to/master_world \
--scale 0.5 \
--master-origin-lat 45.9432 --master-origin-lng 24.9668 \
--elevation-min -440 --elevation-max 2157 \
--tile-invariant-rendering 1 \
--overpass-url http://localhost:12345/api/interpreter \
--road-detail compactEvery tile lands at a globally-correct .mca index, terrain heights align across boundaries, building palettes match across tile seams via the seeded RNG streams, OSM data fetches from a self-hosted Overpass mirror at zero rate-limit, and pedestrian-grade road noise is suppressed at the chosen scale.
Compatibility
- Drops in as a binary swap (
arnis-windows.exe) — no scheduler-side config needed. - Single-tile users who don't pass any new flags get upstream-byte-identical output.
- World save format unchanged (same Java / Bedrock writers as upstream).
- All changes are additive — any patch in this fork should land cleanly on
louis-e/arnis mainif accepted upstream.
Companion: Meld scheduler
This binary is designed to drop into Teddy563/meld, a Python scheduler that automates country-scale generation by computing per-tile bboxes, surveying global elevation once, holding the master-origin invariant, and emitting all the new flags automatically. Standalone CLI use works fine too.
Build provenance
- Source: Teddy563/arnis @ d07412e
- Toolchain: Rust stable
- Profile:
cargo build --release - Binary size: 37,291,008 bytes
- Platform: Windows x64
Verifying the binary
arnis --help | grep -E "master-origin|elevation-min|elevation-max|tile-invariant-rendering|overpass-url|road-detail"Expect seven flags in the output.
License: Apache-2.0 (inherited from upstream).
Credits: Upstream Arnis by @louis-e and contributors. Meld fork patches by @Teddy563.