# Biomecraft Biomes from your own meshes. Outline an area on the landscape, pick a biome, and Biomecraft places trees, shrubs, rocks, ground cover and grass by slope, height, moisture, sunlight, paint layer and water: reeds on the banks, lily pads only where the water is still, stones where it runs fast. Layers grow around each other the way plants do: saplings near their parent trees, ferns in the shade of the crowns, flowers in the clearings, shrubs along the forest's edge. Or point one area at an **ecosystem** and it covers the whole landscape, forest in the valleys, rock on the steep slopes, meadow on the high flats, with no outline to draw. The ground follows too: forest floor under the forest, rock under the scree, sand on the banks, blended at the same borders. No art is included and none is needed: a biome is a list of layers with rules, and you drop your meshes into it. Built on Unreal's PCG framework (production, not the experimental Biome Core), C++ throughout, open to Blueprint. Generation in the editor on a Ryzen 9 3900X and an RTX 2070 Super: a forest of 6 layers at the temperate forest preset's densities, engine shapes as meshes (Tools/test_perf.py in the demo project, measured 24/10/2026): | Case | Spots tested | Instances | Time | |---|---|---|---| | 1 km² as one area | 703,000 | 140,000 | 1.1 s | | 1 km² split into 256 m cells (the same instances, spot for spot) | 703,000 plus each cell's margin | 140,000 | 1.2 s (about 75 ms per cell) | | Runtime grass, one 32 m cell, 1 per m² | 1,444 | about 320 | 0.35 to 0.45 ms | | 4 x 4 km World Partition map, one ecosystem area, 256 m cells | 29.9 million | 864,000 | 70 s (about 100 ms of placing per cell, the rest is PCG spawning the instances) | | GPU grass, one 32 m cell, 20 per m² | 262,144 on the GPU | about 18,000 | on the GPU | Live editing regenerates every area that grows the edited biome. On the demo map (1 km, one ecosystem over all of it, a meadow clearing and a trail), editing the meadow biome regenerates the whole kilometer and shows in about 10 s; the runtime layers around the camera place again right after. A biome used by a small area regenerates only that area. ## Contents - [Quick start](#quick-start) - [Areas](#areas) - [Biomes and layers](#biomes-and-layers) - [Rules](#rules) - [Layers that grow together](#layers-that-grow-together) - [Ecosystems](#ecosystems) - [Water](#water) - [Paths](#paths) - [Ground](#ground) - [Meshes as ground](#meshes-as-ground) - [Runtime layers](#runtime-layers) - [GPU layers](#gpu-layers) - [Big worlds and World Partition](#big-worlds-and-world-partition) - [Setup check](#setup-check) - [Blueprint](#blueprint) - [Your own graph](#your-own-graph) - [Why nothing grew here](#why-nothing-grew-here) - [Troubleshooting](#troubleshooting) - [Limits](#limits) ## Quick start 1. Enable the plugin. It turns on PCG with it. 2. In the Content Browser, turn on **Settings > Show Plugin Content** and open **Biomecraft Content > Presets**. Duplicate the preset closest to what you want (temperate forest, conifer forest, meadow, riverbank, rocky slope, desert) into your project. 3. Open the copy. Each layer is named for what goes in it ("Broadleaf Trees", "Ferns"...). Add your meshes to each layer's **Meshes**. A layer with no mesh is skipped, so you can fill them one at a time. 4. Drag a **Biomecraft Area** into the level (Place Actors, search "Biomecraft"). Put it over the landscape, scale its box and set **Biome** to your copy. That's it: the area places everything and saves it with the level. Change anything in the biome or the area and it places again. If something is missing, the editor tells you when the level opens (see [Setup check](#setup-check)). ## Areas A **Biomecraft Area** grows one biome inside its outline. | Setting | What it does | |---|---| | Biome | The biome asset it grows. | | Ecosystem | Instead of one biome, a set of biomes that share the area by climate. See [Ecosystems](#ecosystems). | | Shape Type | **Box**: the box, seen from above (its height does not matter). **Spline**: a closed spline you shape point by point; the box follows it by itself. | | Priority (override) | Where areas overlap, the higher priority wins. By default the biome's own priority, or the ecosystem's when the area grows one. Ties go by actor name. | | Edge Blend Meters | How far the area fades into whatever is around it. The two sides share the border spot by spot, so there is no gap and no double row. Default 8 m. | | Edge Noise Meters | How far the border wanders in and out, so it never reads as a straight line. Default 4 m. | | Seed | A different arrangement with the same rules. | | Partition Saved Layers | Splits the area into PCG partition cells. See [Big worlds](#big-worlds-and-world-partition). | | Ground Mesh Tag | Also places on static meshes whose actor has this tag, BiomecraftGround for instance. See [Meshes as ground](#meshes-as-ground). None by default: landscapes only. | | Runtime Radius Meters | How far from the player the runtime layers are placed. Default 80 m. | Nest areas to paint biomes inside biomes: a meadow (priority 1) inside a forest (priority 0) clears the forest out of the meadow and blends the two at the edge. A riverbank area along a river (priority 2) wins over both. Buttons on the area: **Regenerate**, **Clear Generated**, **Check Setup**. ## Biomes and layers A **Biome** asset (Biomecraft Biome Asset, a Data Asset) has a priority, climate settings and a list of layers. Layers are placed top to bottom: put big things first, so their clearance keeps the small ones away from trunks and rocks. | Layer setting | What it does | |---|---| | Meshes | Picked at random by weight. | | Density Per 100 Square Meters | Instances per 100 m² where every rule passes fully. Trees 2 to 5, shrubs 5 to 15, ground cover 20 to 60. | | Jitter | 0 lines them up on a grid, 1 lets each land anywhere in its cell. Below 1 it also keeps a minimum gap between instances of the layer. | | Min / Max Scale | Random uniform scale. | | Align To Slope | 0 keeps the mesh upright (trees), 1 tilts it with the ground (rocks, debris). | | Random Yaw | Random turn around the vertical. | | Sink Depth | Pushes the mesh into the ground (cm at scale 1), so trunks and rocks never show their base on slopes. | | Clearance | Meters around each instance where the layers below place nothing. | | Canopy Radius Meters | Crown radius at scale 1, for the canopy relations of the layers below. 0 takes it from the meshes' bounds. | | Rules | See [Rules](#rules). | | Generate At Runtime | Placed around the player while the game runs instead of saved in the level. See [Runtime layers](#runtime-layers). | | Generate On GPU | With Generate At Runtime: placed by the GPU, up to 64 per m². See [GPU layers](#gpu-layers). | | Cull Start / End Meters | Fade-out distance. 0 = never. | | Cast Shadow, Collision | Per layer. Collision uses the mesh's own collision; leave it off for grass and debris. | | Wind Stop Meters | Distance where World Position Offset (wind) stops. 0 = always on. | Placement is decided by the spot's position in the world, not by a running random number. Generating twice gives the same result, two areas agree on their shared border, and partition cells meet without seams. ## Rules Every rule has a range and a **Fade**: inside the range the chance is 1, past it the chance falls to 0 over the fade, so the rule's edge is soft. A rule that is off always passes. The chances multiply. | Rule | Unit | Example | |---|---|---| | Slope Degrees | 0 flat, 90 a wall | trees 0 to 30, boulders 25 to 90 | | Height Meters | world Z / 100 | snow line, valley floor | | Moisture | 0 to 1 | ferns 0.4 to 1, wet grass 0.6 to 1 | | Water Distance Meters | to the water's edge, negative in the water | reeds -1 to 3, willows 0 to 15 | | Water Speed | m/s of the nearest water | lily pads 0 to 0.15, river stones 0.8 and up | | Allow In Water | on/off | lily pads, reeds. Off, a layer never grows in the water | | Sunlight | 0 to 1, how much the ground faces the sun | dry grass on the sunny side, moss on the shaded one | | Biome Depth | 0 at the biome's border, 1 well inside | edge shrubs 0 to 0.3, deep forest 0.6 to 1 | | Relations | see [Layers that grow together](#layers-that-grow-together) | saplings near trees, ferns under the crowns | | Landscape Layer | a paint layer's name and the weight it needs | grows only where you painted "Grass" | | Patch Size / Coverage | meters, 0 to 1 | flowers in patches 8 m wide covering 40% of the ground | **Moisture** is 1 at the water's edge and on valley floors, and falls to 0 on dry high ground. Set how in the biome's **Climate** settings: **Water Reach Meters** (default 40: moisture from water fades to 0 that far from it), **Valley Radius Meters** (25: how far around a spot the ground is compared) and **Valley Depth Meters** (4: a spot this much lower than its surroundings counts as fully moist). **Sunlight** compares the ground's slope with the sun set in **Climate** (**Sun Yaw Degrees**, the compass direction it shines from, 0 = from +X, default 225; **Sun Elevation Degrees**, its height, default 45). Flat ground gets the sun's height, a slope facing the sun gets more, one facing away gets less. It is fixed, not your level's sun: set it once so the sunny hillsides are the ones you see lit. **Biome Depth** is how far a spot is inside its area, measured over the area's Edge Blend plus 10 m: 0 on the border, 1 past it. In an ecosystem it is how clearly the spot belongs to its biome: 0 where two biomes meet, 1 where nothing else competes. **Landscape Layer** replaces the landscape's Grass output for that layer: paint "Moss" on the landscape and the moss layer follows the brush. ## Layers that grow together A layer can depend on a layer placed before it in the same biome, through its **Relations**. Each relation names the layer above and a kind: | Kind | Grows | Radius means | Example | |---|---|---|---| | Near | within the radius of that layer's instances | meters from each instance | saplings within 4 m of trees, mushrooms by stumps | | Away From | past the radius | meters from each instance | grass kept 3 m from rocks | | Under Canopy | under the crowns | meters added to each crown | ferns and moss in the shade, radius 0 | | Outside Canopy | out from under the crowns | meters added to each crown | flowers in the clearings, radius 1 | **Fade** softens the radius over that many meters, and **Strength** sets how much the relation decides: 1 fully, 0.5 only leans the chance, so a few ferns still show up in the open. A crown is the layer's **Canopy Radius Meters** times each instance's scale, or the mesh's bounds when that is 0. The layer named must be above in the list (layers are placed top to bottom). Relations look past the area's edge too, so a tree just outside still shades the ferns inside. Check Setup warns about a relation to a layer that is missing or below. ## Ecosystems A **Biomecraft Ecosystem** asset (Data Asset) lists biomes and the climate each one takes over. Set it as the **Ecosystem** of one area over the whole landscape, and every spot goes to the biome that suits it best. The preset **BC_Ecosystem_TemperateValley** (riverbank, rocky slope, temperate forest and meadow) is a good start: duplicate it and point its entries at your own biomes. | Entry setting | What it does | |---|---| | Biome | A biome asset, the same kind you use on an area. | | Weight | How hard it claims ground that suits it. 2 claims twice as hard as 1. | | Height Meters, Slope Degrees, Moisture, Water Distance Meters, Sunlight | Ranges with fade, as in [Rules](#rules). Off means any. | | Landscape Layer | Takes over where this paint layer is painted: paint "Forest" and the forest follows the brush. | | Ecosystem setting | What it does | |---|---| | Border Sharpness | 1 gives wide mixed borders, 8 sharp ones. Default 4. | | Border Noise Meters | Size of the irregularity that keeps borders off the contour lines. Default 40 m, 0 = none. | | Climate | Water, valleys and sun as the ecosystem reads them to share the land. Each biome's own Climate still drives its layer rules. | | Priority | Against other areas it overlaps, like a biome's priority. | Each 3 m of ground belongs to one biome, so two biomes never stack on the same spot, and the border is a mix that thins out on both sides. The biomes keep everything they do in an area of their own: relations, edges (from Biome Depth), water rules, runtime layers. Areas with a single biome still work on top: a village clearing at priority 5 over the ecosystem clears it out the same way. ## Water Water rules read water marked for Biomecraft, so any water works, whoever made it: - On an actor that already has a spline (an Epic Water Body, a river tool's actor), add a **Biomecraft Water** component. It uses the actor's first spline (or the one named in **Spline Name**). - Without one, place a **Biomecraft Water** actor and shape its spline. | Water setting | What it does | |---|---| | Kind | **River**: the spline is the center line, the water spans the width around it. **Lake**: the closed spline is the shore. | | River Width Meters | Full width, centered on the spline. Default 10 m. | | Speed Meters Per Second | How fast the water runs where no flow map covers it. Rivers 0.5 to 2, lakes 0. Default 1. | | Flow Map | Optional speed and depth cell by cell, from a water simulation. | A **Biomecraft Water Flow Map** (Data Asset) holds speed and depth per cell over a rectangle of the world. Fill it with **Import From Texture** (editor, a float texture: red and green are the velocity in m/s along world X and Y, blue the depth in m, plus the world corners it covers) or with **Set Data** from Blueprint. Any simulation that can write a float EXR in that layout works. With a flow map, the river's own bends and pools decide where the still-water plants go, instead of one speed for the whole river. Edit a water's spline or settings and the areas it reaches regenerate by themselves. Switch a water's Kind to Lake while its speed is still the default 1 m/s and the speed goes to 0. On dry ground a spot takes the speed of the nearest water within **Speed Search Meters** (the biome's Climate settings, default 15 m), so bank plants follow the water next to them. ## Paths A **Biomecraft Path** keeps the vegetation off a trail and lays its own ground under it. Place a **Biomecraft Path** actor and shape its spline, or add a **Biomecraft Path** component to an actor that already has one (a road tool's actor, your own Blueprint). Every area it crosses keeps its layers off the path and thins them toward it, and trees and rocks keep their Clearance off its edge, so no trunk stands on the trail. Edit the spline, move it, change a setting, undo or delete it, and the areas it reaches regenerate by themselves. | Path setting | What it does | |---|---| | Width Meters | Full width kept clear, centered on the spline. 2.5 by default. | | Edge Meters | How far past each side the layers thin out, from none at the path to all of them. 3 by default. | | Ground | What the ground under the path is made of, with the same four grounds as the biomes. Ground 1 (forest floor) by default; all zero leaves the ground alone. | | Ground Edge Meters | How far past each side the path's ground fades into the biome's. 2 by default; the ground is drawn in 2 m texels, so keep it at 2 m or more. | | Flatten Terrain | Levels the terrain under the path. Off by default. See below. | | Flatten Falloff Meters | How far past each side the leveled path blends back into the terrain. 3 by default. | | Flatten Smoothing Meters | How far along the path its height is averaged: bumps shorter than this go, the slope stays. 10 by default. | | Road Mesh | A mesh laid along the path as a road, a track or a boardwalk. None by default. See below. | | Road Piece Meters | Meters of path per piece of the road mesh. 0, the default, uses the mesh's own length. | | Road Match Width | Stretches the mesh across to the path's width. On by default. | | Road Height Offset Cm | How far the road sits above the ground; negative sinks its edges in. 2 by default. | | Road Material | Replaces the mesh's material. None keeps it. | | Road Collision | The road blocks like the mesh's own collision. On by default. | | Spline Name | Which spline on the actor to use. Empty uses the first one. | A layer with **Allow On Paths** on grows on paths anyway: pebbles on a trail, grass down the middle of a forest track. **Flatten Terrain.** Turn it on and the terrain under the path turns flat from side to side, at the height it had in its middle, and smooth along it, so a trail across a hillside reads as cut into it and a trail up a slope still climbs. The change goes on its own landscape edit layer, **Biomecraft Paths**, which Biomecraft adds on top with one **Biomecraft Path Terrain** brush per landscape: your sculpted layers stay as they were, and turning the option off or deleting the path gives the terrain back. Edit the spline and the terrain follows, then the areas regenerate on the new ground. It needs a landscape with edit layers (every landscape on 5.7 and later; on 5.6 turn on Edit Layers), and the setup check warns when one has none. Where two flattening paths cross, the junction blends their heights by how strongly each one pulls. **Road Mesh.** Set a mesh and the path lays it along its spline, one piece every Road Piece Meters, each one bent along the spline (spline mesh components on the path's actor, tagged BiomecraftRoad). The pieces sit on the ground under the path, the leveled ground when Flatten Terrain is on, and follow it up and down hills. Build the mesh along +X, centered on Y, with its top at Z 0: a strip of road, a plank walkway, a cart track. Edit the spline or a setting and the road is laid again; Rebuild Road does it from Blueprint. On meshes as ground the road follows the spline's own height. ## Ground A biome's **Ground** setting says what the ground under it is made of, as four weights. The presets use ground 1 for forest floor, 2 for rock, 3 for grass and 4 for sand and mud; use them for whatever your landscape has. Each area draws its ground into a Runtime Virtual Texture (**VT_BiomecraftGround**, in Biomecraft Content > Ground), faded over its blended border like the instances. With an ecosystem, each spot gets the biomes' grounds by their share of it, so the ground blends where the biomes do. Higher priority areas draw over lower ones, in the same order that decides the instances. Your landscape material reads it back with one of two functions from Biomecraft Content > Ground: - **MF_BiomecraftGround** outputs Ground 1 to 4 and **Coverage** (their sum: 1 where an area lays ground, 0 where none does). Multiply each of your four ground textures by its weight, add them up, and add your painted result times 1 minus Coverage. Do the same for normals. - **MF_BiomecraftGroundBlend** does that for a material with Use Material Attributes: plug in your painted result and four ground materials, get the blend. Where no area lays ground, Coverage is 0 and your painted layers show as before. To keep roads and paths as painted, multiply the four weights and Coverage by 1 minus a road paint layer of your own. | Area setting | What it does | |---|---| | Paint Ground | Off, the area leaves the ground alone. | | Ground Texel Meters | One ground texel every 2 m by default. An area never gets more than 2048 texels per side: 1 km at 2 m is about 500 x 500, 1 MB saved with the area. | The ground is saved with the area and drawn from it when the level loads, so a packaged game shows it with no extra step. The first area that lays ground adds a **Runtime Virtual Texture Volume** (BiomecraftGroundVolume) over the landscapes and grows it when an area needs more room. Save the level afterwards. ## Meshes as ground Terrain made of static meshes, cliffs, big rocks: give their actors a tag and set the same tag as the area's **Ground Mesh Tag** (BiomecraftGround, for instance). The area then places on those meshes too, with the same rules: slope and height come from the mesh's surface, and where a tagged mesh and the landscape overlap, the higher one is the ground, so plants grow on top of a cliff and around its foot. An area with a Ground Mesh Tag needs no landscape at all. - The meshes need collision (simple or complex) that blocks the Visibility channel. Only static mesh components count, so a trigger box on a tagged rock is not ground, and untagged meshes never are, so a house or a fence stays clear. - A road on a path follows the landscape (or the spline's own height where there is no landscape), not the tagged meshes. - Paint layer rules read 0 on a mesh, since meshes have no paint layers. - GPU layers and Flatten Terrain work on landscapes only. The ground virtual texture reaches a mesh only if its material reads it, as a landscape material does ([Ground](#ground)). - Move a tagged mesh and regenerate the area (Regenerate), since the area does not watch the meshes. ## Runtime layers A layer with **Generate At Runtime** is not saved in the level. While the game runs, PCG places it in 32 m cells around the player (up to **Runtime Radius Meters**) and removes it a little past that. Use it for grass and small ground cover that would make a big level heavy to save and load. Runtime layers keep out of the saved layers' clearance like any other layer. Runtime layers read the ground from PCG's landscape cache, which PCG leaves set to **Never Serialize**. The area turns it to **Serialize Only At Cook** on the level's **PCG World Actor** by itself when its biome has runtime layers, and says so in the log. Save the level afterwards. Without it nothing grows in play. ## GPU layers Turn on **Generate On GPU** (with Generate At Runtime) for grass and ground cover at real density: up to 64 instances per m², placed by the GPU in 32 m cells around the player. A full 32 m cell at 20 per m² is about 18,000 instances. The CPU still decides where it may grow. When the area generates, it bakes a **grass map** over itself, one texel per **Grass Texel Meters** (1 m by default, on the area): for each GPU layer, the chance at that texel after every rule. That is the area's share against the areas above it, the biome's share in an ecosystem, patches, biome depth, the clearance of every saved layer, water, paths, relations to the layers above, slope, height, moisture, sunlight and paint. In play, the GPU scatters candidates over each cell, keeps each one by the layer's density times the map, and sets it on the landscape with its own jitter, scale and yaw. What changes against a CPU runtime layer: - Rules are read at the map's texel, not at the instance. At 1 m that is fine for grass; a sharp edge (a path one meter wide) wants a finer Grass Texel Meters. - Up to 4 GPU layers per area, one per channel of the map. The custom rule does not apply, no layer can have a relation to a GPU layer (the setup check says so), and GPU layers have no collision and no shadows. Cull End and Wind Stop come from the spawner in PCG_BiomecraftAreaRuntimeGPU, not from the layer: set them on a copy of that graph ([Your own graph](#your-own-graph)). - The map is saved with the area (1 km at 1 m is 1000 x 1000 texels, 4 MB) and redrawn when the area generates. Areas with GPU layers run **PCG_BiomecraftAreaRuntimeGPU** for their runtime layers, the others **PCG_BiomecraftAreaRuntime**; the area switches between the two by itself, unless you set a graph of your own. The GPU branch is Biomecraft Grass Setup and Get Landscape Data into a Custom HLSL node (the kernel), then a GPU Static Mesh Spawner picking the mesh by the BCMesh attribute. ## Big worlds and World Partition An area generates as one piece by default, which is right for areas up to about 500 m. Turn on **Partition Saved Layers** for bigger areas and in World Partition levels: the area is split into PCG partition actors (cell size on the PCG World Actor, 256 m by default), each saved and streamed with its part of the world. 1 km² of temperate forest takes about 75 ms per cell. Measured on a 4 x 4 km World Partition map (Tools/make_load_map.py in the demo project): one ecosystem area with four biomes over the whole landscape, 256 m cells. The editor generates it in 70 s (289 partition actors, 864,000 instances, about 300 MB on disk with the landscape). A packaged Shipping game flying across it at 38 m/s, 25 m above the ground, with Lumen at 1080p on an RTX 2070 Super, averages 17 ms per frame (median 14.5 ms, 99th percentile 44 ms); 0.7% of frames pass 50 ms while cells stream in. **HLOD.** The partition actors are ordinary actors with instanced meshes, so World Partition's HLOD builder takes them in. For vegetation use an instanced HLOD layer: a merged layer bakes a material for every cell, which at this density takes minutes per cell. ## Setup check When a level opens, Biomecraft checks every area and, if something is wrong, says how many problems it found, with **Show** (opens the Message Log, page Biomecraft) and **Fix what can be fixed**. The same check is in the **Tools** menu (**Check Biomecraft Setup**, and **Fix Biomecraft Setup**, which fixes what it can and checks again) and on each area (**Check Setup**). It finds: an area without a biome or without a landscape under it; layers without meshes; a mesh that does not load; a paint layer the landscape does not have (with the names it does have, to catch spelling); a relation to a layer that is missing or not above; an ecosystem with no biome; a mesh whose base sits above its pivot (it floats) or far below it (pivoted at its center); Collision on a mesh with no simple collision; a heavy mesh without Nanite in a dense layer; water rules with no water marked in the level; a mesh slot left empty; a biome with no enabled layer that has a mesh and a density; a biome listed twice in an ecosystem; a relation to a GPU layer; a GPU layer denser than 64 per m²; runtime layers with the PCG landscape cache off; an area whose PCG component lost its graph. The last two it fixes by itself. ## Blueprint Every class can be extended in Blueprint, and the settings above can be read and set from it. A flow map's data is read-only: fill it with Set Data. | Class | Calls and events | |---|---| | Biomecraft Area | Regenerate, Clear Generated, Set Biome, Is Generating, Has Something To Grow, Has Runtime Layers, Get Priority, Get Edge Distance (cm, positive inside), Get Biome Depth, Get All Biomes, Find Area At (which area owns a spot), Refresh Shape (after moving spline points from script), Refresh Runtime Generation, Check Setup. Events **On Generated** and **On Cleared**. | | Biomecraft Area (ground) | Get Ground At (ground 1 to 4 at a spot, faded by the border), Get Ground Texture, Paints Ground, Get Edge Weight. | | Biomecraft Area (GPU layers) | Get Grass Slots (the GPU layers, in the map's channel order), Get Grass At (each GPU layer's chance at a spot), Get Grass Texture. | | Biome Asset | **Get Custom Rule Chance** (override it, see below), Has Runtime Layers, Find Layer Index. | | Ecosystem | Has Runtime Layers. | | Water component / Flow Map | Find Spline, Regenerate Areas, Set Data, Import From Texture, Sample. | | Path component | Find Spline, Regenerate Areas (after moving its spline points from script; it levels the terrain first when Flatten Terrain is on). | | Biomecraft Setup Check | Check Area, Check Level, Fix Issue, Fix Level. | **Your own rule.** Make a Blueprint child of the Biome Asset, turn on **Use Custom Rule** and override **Get Custom Rule Chance**. It gets the spot (location, normal, slope, height, moisture, water distance and speed, biome depth, sunlight) and the layer, and returns a chance: 1 keeps the spot, 0 removes it. Use it for what only your game knows: keep a road clear, thin the forest around a base, grow mushrooms only in a quest area. It runs once per spot that passed the other rules, so keep it light. ## Your own graph Each area runs PCG graphs from Biomecraft Content > Graphs: **PCG_BiomecraftArea** (saved layers) and **PCG_BiomecraftAreaRuntime** (runtime layers), which the area swaps for **PCG_BiomecraftAreaRuntimeGPU** when the biome has GPU layers ([GPU layers](#gpu-layers)): Get Landscape Data → **Biomecraft Points** → Static Mesh Spawner Copy a graph, add your own nodes between the two (filters, extra spawners) and set the copy on the area's PCG component (select it in the area's component list). For the runtime layers, set the copy as the area's **Runtime Graph** (under Advanced). The **Biomecraft Points** node can also run on any PCG component: set **Biome Override** on it. **Layer Selection** picks all layers, saved layers or runtime layers. Each point it outputs carries these attributes: | Attribute | Type | Content | |---|---|---| | BCMesh | soft object path | the mesh | | BCLayer | int | layer index in the biome | | BCBiome | name | the biome asset's name, useful with an ecosystem | | BCCullStart, BCCullEnd | int | cull distances in cm | | BCCastShadow, BCCollision | bool | the layer's settings | | BCWindStop | int | World Position Offset disable distance in cm | ## Why nothing grew here Start the editor with `-LogCmds="LogBiomecraft Verbose"` (or type `Log LogBiomecraft Verbose` in the console) and regenerate. Every run logs its time and, per layer, how many spots were tested and why the others were turned down: ``` Biomecraft Points Forest: 709051 spots tested, 139863 placed, 778.43 ms over 1008 x 1008 m (placing 483, ground map 0, grass map 0 ms) Forest / Grass: 1444 tested, 325 placed. Turned down by: OtherArea 0, OtherBiome 0, Patches 0, Clearance 1119, Water 0, Path 0, NoGround 0, Rules 0 ``` "OtherBiome" means an ecosystem gave the spot to another biome. "NoGround" means the landscape could not be read there (outside it, or the PCG landscape cache is off in play). "Clearance" means a bigger layer is in the way. "Path" means a Biomecraft Path keeps the layer off. "Rules" covers slope, height, moisture, sunlight, biome depth, relations, paint layer and your custom rule. To see it on the map instead: open the area's graph (a copy, see [Your own graph](#your-own-graph)), turn on **Output Rejected** on the Biomecraft Points node and wire its **Rejected** pin to a PCG Debug node. Every turned-down spot shows up where it was tested, colored by reason through its density, with the reason's name in the **BCReason** attribute and the layer in **BCLayer**. ## Troubleshooting **Nothing appears.** Run Check Setup on the area. The usual causes: no biome, layers without meshes, no landscape under the area (or, on meshes, a Ground Mesh Tag the meshes' actors don't have). **Things float or sink.** The mesh's pivot is not at its base. Fix the pivot, or use Sink Depth for a small offset. Check Setup reports both cases. **Grass grows inside rocks or trunks.** Put the big layer above the small one and give it a Clearance of 0.5 to 3 m. **Nothing grows in play (runtime layers).** The PCG landscape cache is off: Check Setup fixes it. Save the level. **Ferns grow in the open even with Under Canopy.** The trees' layer must be above the ferns'. If the crowns are wider than the mesh bounds suggest, set the trees' Canopy Radius Meters. **An ecosystem biome takes too much or too little.** Narrow its ranges, or change its Weight. Border Sharpness at 8 and Border Noise at 0 show where each climate range really ends. **The ground does not change.** The landscape material has to read it: see [Ground](#ground). Check that the biome has a Ground set and the area has Paint Ground on, and that the level has the BiomecraftGroundVolume. **The border between two areas is a straight line.** Raise Edge Noise Meters on the higher priority area. Raise Edge Blend Meters for a wider mix. **Low frame rate in a dense forest.** With Nanite foliage keep Virtual Shadow Maps on (Project Settings > Shadow Map Method, the default of a new 5.x project). With cascaded shadow maps every leaf is drawn again into each cascade every frame. On the demo map (Shipping, 1080p, Lumen, RTX 2070 Super) switching to virtual shadow maps took the views from 41-66 ms to 23-33 ms per frame. Below that, the engine's scalability does most of the work (the demo's G key steps through it): on the same nine views Epic and High take 16-25 ms, Medium 10-18 ms and Low 6-13 ms. `r.Nanite.MaxPixelsPerEdge=2` saves another 1 to 3 ms, with a bit less detail on far trees. **The road is a checker in the packaged game.** Its material is not marked Used with Spline Meshes. The editor turns it on by itself while you work, but only saves it when you save the material. Tick it in the material's details and save; Check Setup warns about it. **Too slow to regenerate a huge area.** Turn on Partition Saved Layers, or lower the density of the smallest layers and make them runtime layers. ## Limits - Unreal Engine 5.6, 5.7 and 5.8, on Windows and Linux. - Places on landscapes, and on static meshes tagged for it ([Meshes as ground](#meshes-as-ground)). GPU layers and Flatten Terrain need a landscape. - One run tests at most 4 million spots, so a mistyped density cannot freeze the editor. Past that it stops with an error: turn on Partition Saved Layers, or raise **Max Candidates** (under Advanced on the Biomecraft Points node, in a copy of the graph). - Generation runs on the game thread, timed above. Runtime cells are small (32 m) to keep each one under a millisecond. - GPU layers on 5.6 and 5.7: PCG's GPU spawner there reserves room for every candidate of a cell (262,144, the same for 1 to 4 GPU layers) times the GPU layers' meshes, before it knows how many it keeps; 5.8 counts first. Fewer meshes on the GPU layers keep that reservation down; the density does not. - No art or terrain sculpting. Paths clear the vegetation, set the ground, level the terrain and lay a road mesh, with no junction pieces where roads meet. Biomecraft decides where your meshes go. Support: contato@tessaroapps.com