How It's Made · Step 8 of 27
Where the trees, shrubs and scenery came from
assetslicencesunrealphotoreal

The rule of the look is that only the LEGO is stylised, so the world around the bricks has to come from somewhere real. Nobody on this project can model a Norway spruce from scratch, and we did not want to. This step is the honest inventory: what we use, where it came from, on what terms, and what it cost us to get it into the game.
The sources, family by family
Elevation: NASA SRTM. The tropical maps are built from public elevation data, which is public domain. The game credits it on the credits screen.
Surfaces and rocks: Poly Haven (CC0). Ground, cliffs, forest floor, snow, scree, mud tracks, and a set of rocks, trees and desert plants. Poly Haven publishes under CC0: use for any purpose, including commercial, with no credit required. We credit the authors by name on the credits screen anyway, as a courtesy. A script, scripts/fetch_polyhaven.py, downloads them straight from their public API with no account, and each import keeps its own source.json recording the id and licence.
python scripts/fetch_polyhaven.py snow_field_aerial:arctic_grass rocks_ground_02:arctic_scree
python scripts/fetch_polyhaven.py --models fir_tree_01 dead_tree_trunk stone_01
Trees, plants and cliffs: Quixel Megascans and Megaplants, through Fab. The owner's Epic account holds free library items: 32 Megaplants species (pines, birches, beech, oak, bilberry and more), a slate quarry scene, an old mine, a cliff and boulder field. They fall under Fab's standard licence for free library items, which allows use in commercial games and asks for no attribution, but does not allow redistributing the source assets themselves. 29 species folders are imported. Eight Megascans imperfection scans (dust, scratches, stains) also went into the wear on the LEGO plastic.
The bricks themselves: ours. Every unit, building, wall and ore pile is built from LDraw parts by our own scripts (CC-BY 2.0, credited in the game). We have a firm rule against brick-built vegetation: no LEGO trees or bushes. The Unreal side does all the plants. Real foliage next to bricks is the point.
Anything with a licence we cannot check is skipped. An early catch: some free Fab items are licensed only for Unreal Editor for Fortnite, which would not cover a standalone game. We skip those.
Who clicked what
Agents never sign in anywhere and never accept a licence. The Fab library is behind the owner's Epic account, so the owner added the library items there, and downloaded the imperfection scans through a browser, clicking the licence box each time. Poly Haven needs no account, so a script does that part. Everything that arrives has a source.json, and the credits screen is generated from those files and from our licence table by scripts/make_credits.py, so the screen cannot drift from the documents.

Getting it into the game
The pipeline is all scripts: fetch, then an editor commandlet that imports the files and builds materials, then a manifest that says which surfaces go into which biome. Trees and plants are instanced, so a forest is a few meshes drawn many times. We keep everything NoCollision and out of the simulation: scenery never changes a height, a cell or a path.
Two facts about our camera shaped the choices. It is a telephoto drone view at 18 degrees field of view, about 111 metres from the ground. A 250-unit tree is roughly 112 pixels tall at the default zoom, and a single leaf is a third of a pixel. Never pay for detail the camera cannot see.
The mistakes
- Straw lawns. Our first grass was sixty per cent dry thatching straw because nobody read the species list. (See the step about the ground.)
- Plants in buildings. Vegetation grew through floors and walls until a baked mask kept it out of base footprints.
- Loading the forest. Dressing the map in code on every load worked, then cost 116 seconds of a 132-second load on the big city map. The next step is about the fix.
- Heavy plants. A Megaplants species is a skinned, Nanite mesh that takes 100 to 180 MB of memory in the editor; 978 skinned compiles took 62 seconds of one load, and the forest kept about 1.5 GB of ray-tracing geometry resident against a 2 GB pool.
- Too many texture samplers. Our landscape material uses more than the sixteen samplers the older shader model allows. It renders because we require the newer one.
What we would do differently
- Write the source and the licence next to every import from the first import. We did that for Poly Haven and added it for the rest later.
- Measure the cost of one tree before placing ten thousand.
- Choose assets for the camera you have. A hero tree that is never close is wasted memory.
Try it yourself
Keep a source.json per imported asset (where from, what licence, what date) and generate your credits from those files. When someone asks where a rock came from, the answer takes ten seconds.
Next: Dress the map once - baked PCG scenery, snow and a honeycomb we did not want (28 September 2026)
Written afterwards from our project notes and commit history; dated to when the work happened.


