80 lines
9.8 KiB
JSON
80 lines
9.8 KiB
JSON
{
|
|
"_comment": "The whole Orogen planet export, scaled so it holds about 900 km2 of land, cut into Unreal landscapes. Read by Scripts/Authoring/generate_region_tiles.py and create_region_world.py through region_manifest.py, which is where every key is explained. World.json beside this file is the square 14.28 km canvas the numpy pipeline builds and shares nothing with this but the height contract.",
|
|
|
|
"_comment_level": "L_World: there is one world level and this builds it. The square 14.28 km canvas that used to own this name is the numpy pipeline's and is legacy (World.json beside this file now points at L_Canvas_Proto). The tiles are named after the level's last segment, so they are L_World_x0_y0_Height.png and the like.",
|
|
"level": "/Game/Maps/L_World",
|
|
|
|
"_comment_tiles": "14 x 7 landscapes of 2551 vertices. 2550 quads is 10 x 255, so the engine gives each tile 10 x 10 components of 255 quads: 100 a tile, 9800 over the window. Neighbours share their edge vertices, so the grid is 35701 x 17851 vertices, 71.40 x 35.70 km, 2549 km2 of map holding about 925 km2 of land. 14:7 is exactly the export's own 2:1, so the ground is not stretched. 637 M vertices is not an import any single Landscape actor will take; ninety-eight of 6.5 M each is the same work in ninety-eight resumable pieces.",
|
|
"tiles": { "columns": 14, "rows": 7, "vertices": 2551 },
|
|
|
|
"quad_cm": 200,
|
|
"sea_level_m": 0,
|
|
"spawn_pad_m": 150,
|
|
|
|
"_comment_streaming": "Components per world-partition streaming proxy, per side. 5 over a tile's 10 x 10 gives four proxies a tile, 2.55 km each.",
|
|
"streaming_grid_components": 5,
|
|
|
|
"_comment_elevation": "The whole export spans -5000..5988 m on Orogen's fixed ramp; after sea_scale that is -850..5988. -1024..6144 spans 7168 m, an exact Z scale of 1400, and 10.9 cm a step over 16 bits. Nothing clips at either end.",
|
|
"elevation_m": { "min": -1024, "max": 6144 },
|
|
|
|
"source": {
|
|
"_comment": "A cylindrical (2:1 equirectangular) planet heightmap, read flat. Orogen writes 16-bit greyscale on a fixed ramp: 0 is -5000 m and 65535 is +6000 m, whatever the planet, because the ramp is absolute so the same shade always means the same height. Its land is normalised before that, scaled so the 99.5th percentile stands at the import page's peak setting, so these metres are Orogen's and not the Go generator's: the same painting baked by `terrain bake` makes its largest continent a plain about 116 m tall. Treat the heights as art.",
|
|
"kind": "planet_map",
|
|
"path": "RawContent/World/Orogen Gens/orogen-heightmap-7945.png",
|
|
"elevation_m": { "min": -5000, "max": 6000 },
|
|
|
|
"_comment_scale": "What one source pixel is worth on the ground. The file carries no scale of its own, so this is a choice, and it is the choice that decides how much land the world holds. 8.7158 m a pixel puts the whole 8192 x 4096 export on 71.40 x 35.70 km: 2549 km2 of map and, at the export's 36.3% land, about 925 km2 of land. Both axes come out at the same metres per pixel, which is what `--scout` checks: the export is 2:1 and so is a 14 x 7 grid of square tiles, so nothing is stretched.",
|
|
"metres_per_pixel": 8.7158203125,
|
|
|
|
"_comment_window": "The rectangle of source pixels the world is cut from. This is the whole export - every pixel of the planet is imported, not a crop of it.",
|
|
"window": { "x": 0, "y": 0, "width": 8192, "height": 4096 },
|
|
|
|
"_comment_sea_scale": "Multiplies everything below sea level. Orogen's abyss is 5 km down on a ramp built for a whole planet, and 64% of this map is ocean; 0.17 brings the deepest water to -850 m, which fits the elevation range with nothing clipped and leaves the shore a slope instead of the cliff a clamp would cut. Land is untouched.",
|
|
"sea_scale": 0.17
|
|
},
|
|
|
|
"_comment_overlay": "Reserved for the annotation layer (D-57) and NOT IMPLEMENTED. There is a place for a per-tile mark map in region_manifest.py and nothing writes one; no pass here reads a mark, and no forest, road or settlement is placed from one. That is deliberate - the overlay is a feature this pipeline keeps a slot for, not an input to any outcome in it - and it is left unbuilt rather than written blind because there is no overlay to run it against yet. The README next to this file says the shape it should take when there is one.",
|
|
|
|
"_comment_layers": "The paint-layer rules. Three of them read the height alone - rock by slope (rise over run), high rock by altitude in metres, and a noise break-up so no boundary is a contour line - because there is no erosion pass on this route and therefore no wear, flow or deposit map to read (D-74). The rest read the *biome*, which is a different kind of input and is described under `biomes` below.",
|
|
"layers": {
|
|
"rock_slope_start": 0.55,
|
|
"rock_slope_full": 1.05,
|
|
"high_altitude_start_m": 1400,
|
|
"high_altitude_full_m": 2000,
|
|
"breakup_m": 18,
|
|
"breakup_cells": 24,
|
|
"breakup_seed": 7,
|
|
|
|
"_comment_beach": "The shore layer, from height and slope alone. `above_sea_m` is full strength up to that height, fading out by `fade_m`, and only where the ground is flatter than `max_slope` so a cliff foot is rock and not sand. This is the one biome that is an approximation rather than a reading: the bake's coast pass knows where beaches actually are (it reports beach_km2 and planed_km2) and this route does not carry that, which D-74 accepted as the price of dressing Route A now.",
|
|
"beach": { "above_sea_m": 12, "fade_m": 25, "max_slope": 0.18 },
|
|
|
|
"_comment_biomes": "Where the biome layers come from. Two categorical maps of the whole planet, both read by identity in normalised u,v - the same coordinates the height is sampled at, so a biome and the ground under it cannot drift apart. That identity is measured, not assumed: the painting is 7738x3761 and the heightmap 8192x4096, and the two candidate registrations were tested against each other on land/sea agreement, where identity scored 98.09% against 96.14% and won in every latitude band including the polar ones.",
|
|
"_comment_class_source": "The *painting*, not Orogen's class render. A painted map is made of its legend's own colours and nothing else - measured, worst nearest-colour distance 0.0 - whereas the render is those colours double-encoded to sRGB, which puts exported `desert` nearer to legend `ice` than to legend `desert`. One is data; the other is a picture of data.",
|
|
"_comment_climate_source": "Koppen classes, read from Orogen's climate export against the palette in Tools/Orogen/js/koppen.js. The palette is parsed out of the JavaScript rather than copied beside it, because that is where it is used and two copies is how one goes stale. Encoding the table's linear colours to sRGB reproduces every observed colour to within 1.4/255.",
|
|
"biomes": {
|
|
"class_image": "RawContent/World/Templates/Map5.png",
|
|
"class_legend": "RawContent/World/Templates/Map5.legend.json",
|
|
"climate_image": "RawContent/World/Orogen Gens/orogen-climate-7945.png",
|
|
"koppen_js": "Tools/Orogen/js/koppen.js",
|
|
"masks_dir": "RawContent/World/Biomes",
|
|
"_comment_blend_m": "How wide a biome boundary is on the ground. Blurred once, globally, in the source's own pixels by `mapart biomes`, so a tile reads an already-smooth field and two tiles agree at a shared vertex without either carrying a margin the width of the blend.",
|
|
"blend_m": 400
|
|
},
|
|
|
|
"_comment_paint": "The landscape's paint layers, in order. `name` is what the material blends and what the weightmap file is called. Eight is the budget and the budget is the design (D-74): Unreal packs four layers per weightmap texture per component and there are 9800 components, so the fourth layer is free and the fifth doubles the weightmap memory. `enabled` false is written by no one and imported by no one - the five biome layers stay off until Phase 2 lands a substance and a layer info for each, so today's build is unchanged. `mapart biomes` still writes their masks either way, which is what makes them inspectable before anything is imported.",
|
|
"_comment_rules": "slope: rock, by gradient. altitude: high rock, by metres. beach: the shore rule above. class: the painted classes named. climate: the Koppen codes named. remainder: whatever is left, which exactly one layer must claim.",
|
|
"paint": [
|
|
{ "name": "Base_Layer", "rule": "slope", "enabled": true, "note": "the rock. The pack's name; it is not a base." },
|
|
{ "name": "Layer_03", "rule": "altitude", "enabled": true, "note": "high rock." },
|
|
{ "name": "Layer_02", "rule": "remainder", "enabled": true, "note": "the meadow grass, and whatever no other layer claimed." },
|
|
|
|
{ "name": "Beach", "rule": "beach", "enabled": true, "note": "Thai_Beach_Sand. The one biome that is an approximation rather than a reading; see _comment_beach." },
|
|
{ "name": "Sand", "rule": "class", "enabled": true, "classes": ["desert"] },
|
|
{ "name": "Ice", "rule": "class", "enabled": true, "classes": ["ice"], "note": "Snow, not blue ice: an ice cap's surface is snow. Its scan is 0.30 m where every other substance is 2 m, so it tiles nearly seven times more densely and the material must not use one tiling number for every layer." },
|
|
{ "name": "Regolith", "rule": "class", "enabled": true, "classes": ["crater"] }
|
|
],
|
|
|
|
"_comment_no_jungle": "There was a Jungle layer here reading Koppen Af+Am+Aw, and it was dropped rather than dressed wrongly (D-76): the nearest substance available is a mossy rocky ground, which is temperate and damp where a tropical forest floor is leaf litter, and the wrong green over the whole equator is more misleading than no biome at all. The equator wears the remainder layer - meadow grass - which is generic but not wrong. Everything needed to bring it back is still here: `mapart biomes` still knows the rule, layers.biomes still names the climate source and the Koppen table, and reinstating it is this entry restored plus a substance."
|
|
}
|
|
}
|