INSODIMENSIONStudios
BiomesGuides

Biome Assets

Create and author an Agentic Biome data asset in Unreal Engine 5.8, with species rows, runtime ground cover, per-backend rules and validation, using the shipped showcase biomes as examples

Biome Assets

A biome asset (UAgenticBiome, shown as Agentic Biome) is one Data Asset that says what grows in a biome: its name, map colour and priority, the trees, rocks and props placed into the level, the GPU ground cover generated around the camera, and the Landscape paint layer it follows. The same asset serves a Landscape and a MeshTerrain; rows can be limited to one backend.

Every property is listed in the biome asset reference. Duplicate a shipped biome into your own project content before you edit it, so a plugin update does not overwrite your changes.


What a biome asset holds

PartPropertyWhat it does
DefinitionDefinitionThe biome's name, the colour it claims in a biome map, and its priority.
Species rowsSpeciesOffline species: each row is a mesh, the generator whose points it lands on, a weight, filters and per-backend rules. They are generated into the level when you build.
Runtime entriesRuntimeAssetEntriesRT_* ground-cover templates, each with a per-backend mask. They generate on the GPU around the camera.
Landscape layerLandscapeLayerNameThe Landscape paint layer the biome follows.
LabelsDisplayName, DescriptionMetadata for people. DisplayName appears in the sector build log lines; Description is a free-text note that nothing reads. Neither changes how the biome behaves.

The shipped showcase biomes

Seven biomes ship in /AgenticBiomes/Biomes/Showcase. If you do not see the plugin's folders, enable Show Plugin Content in the Content Browser settings. The showcase levels place them; each level uses some of the seven.

Biome assetMap colourPrioritySpecies rowsRuntime entriesWhat is enabled
Biome_Beachwhite (the default)620 (9 Landscape, 11 MeshTerrain)noneOnly the boulder row Rock_PCG_Boulder_01_1 and its _MT twin. The other 18 rows are present and disabled.
Biome_BroadleafForestgreen (0, 1, 0)312 (5 Landscape, 7 MeshTerrain)4Broadleaf trees PCG_Tree_01 and PCG_Tree_02, a spruce row and sapling clutter; runtime grass and understory.
Biome_ConiferousForestblue (0, 0, 1)210 (4 Landscape, 6 MeshTerrain)5Spruce, pine and broadleaf tree rows; runtime coniferous grass, understory and broadleaf grass.
Biome_Desertred (1, 0, 0)420 (9 Landscape, 11 MeshTerrain), 16 enabled2Cactus rows (young, old, field) and boulder rows; runtime desert rocks.
Biome_Landslideorange (1, 0.5, 0)016 (5 Landscape, 11 MeshTerrain)4Boulder and rubble rows in several sizes, a cactus row on Landscape, seedling clutter on MeshTerrain; runtime desert rocks and dry grass.
Biome_MountainForestyellow (1, 1, 0)111 (4 Landscape, 6 MeshTerrain, 1 both)5Spruce, pine and boulder rows; runtime mountain-forest grass and understory.
Biome_Snowcyan (0, 1, 1)511 (4 Landscape, 6 MeshTerrain, 1 both), 9 enablednoneSpruce, pine and boulder rows. The two ground-clutter rows are disabled.

Each biome's Landscape Layer Name equals its Biome Name (Desert, Snow and so on), and /AgenticBiomes/Landscape holds a matching layer-info asset for each (LLI_Desert, LLI_Snow, ...). The species use the meshes in /AgenticBiomes/Sample/Meshes and materials from /AgenticBiomes/Materials and /AgenticBiomes/Sample/Materials.


Create a biome asset

  1. In the Content Browser, open a folder in your project. Use Add → Miscellaneous → Data Asset, and in the class picker choose Agentic Biome. The plugin does not add a dedicated New Asset entry for biomes.
  2. Name it. The shipped assets use Biome_<Name>.
  3. Open it. The Details panel shows a Validation list at the top, then the categories Identity, Species, Ground cover, Landscape and Provenance.
  4. Fill in the definition, add species rows, optionally add runtime entries, then set the layer name. The sections below follow that order.

Or right-click a shipped biome, choose Duplicate, and edit the copy. See Variants.

Put a biome in a Terraformer's Biome Map Biomes array, a sector's Biomes array, or a region's Biome property to use it. See Placement.


Set the definition

Definition has three fields.

FieldRule
Biome NameThe biome's identity. Give each biome in a palette its own name; the Terraformer's palette check warns when two share one.
Biome ColorThe colour the biome claims in a biome map. It must not be black, which a map reads as "no biome". It must differ from every other palette colour by more than the Terraformer's Biome Color Tolerance (default 0.01) in at least one of R, G or B.
Biome PriorityHigher wins where two biomes claim the same ground.

This is the only place a biome's colour is stored. Display Name and Description under Identity are metadata only: Display Name appears in the sector build log lines, and nothing reads Description. Neither changes how the biome places anything.


Add species rows

Under Species, press + to add a row. Each row has a header showing its Enabled checkbox, Species Id (or the mesh name while the id is empty), mesh, weight, generator with sub-type, the backends it serves as [L|M] (a dot replaces a backend it does not serve), and SOLO or ISO when set. Expand it to see the groups Placement, Filters, Mesh rendering, Backends, Runtime scatter, Children & assemblies and Debug.

A working row needs three things:

  1. Species Id: a name unique within the biome. Tools address the row by it.
  2. Mesh: the static mesh to spawn.
  3. Generator: the generator asset whose points the species lands on.

Weight defaults to 1 and the row serves both backends by default. The shipped Biome_Desert row Tree_PCG_Cactus_01_Young shows a full example: mesh PCG_Cactus_01, generator Shared_Trees_Landscape, weight 2.5, scale 0.45, orient upward 0.7, height 100 to 2500, material MIC_Cactus_Sage, child asset Child_Desert_Seedlings, backend Landscape.

Generators

A generator is an Agentic Biome Generator asset (UAgenticBiomeGenerator). It points at the PCG graph that produces the points. Several rows can share one generator; each row's Weight is its share among the rows on that generator. The shipped generators are in /AgenticBiomes/PCG/Generators:

GeneratorGraphNotes
Shared_Trees_LandscapeSG_Sampler_Trees_LandscapePriority 1.
Shared_Trees_MeshTerrainSG_AT_Sampler_Trees_MeshTerrainPriority 1.
Shared_Rocks_LandscapeSG_Sampler_Rocks_Landscape
Shared_Rocks_MeshTerrainSG_AT_Sampler_Rocks_MeshTerrain
Shared_Rocks_Subtyped_LandscapeSG_Sampler_Rocks_Subtyped_LandscapeBiome_Landslide selects its sub-types RockA and RockB through the row's Generator Sub Type.
Shared_GroundCover_LandscapeSG_AT_Sampler_GroundCover_LandscapeAllows overlap with other generators' points.
Shared_GroundCover_MeshTerrainSG_AT_Sampler_GroundCover_MeshTerrainAllows overlap with other generators' points.
Shared_Cliffs_LandscapeSG_Sampler_Cliffs_Landscape
Shared_CliffWalls_LandscapeSG_Sampler_CliffWalls_LS
ElevationLines_LandscapeSG_Sampler_ElevationLines_LandscapePriority -1.

Generator priority runs the opposite way to biome priority: a smaller GeneratorPriority means a higher priority, and BiomeCore's authored range is -1 to 1. The validator reports a value outside it on an Agentic Biome Generator.

Points per square metre is a parameter of the generator's graph, not of the row. The shipped tree and rock sampler graphs declare a parameter named PointsPerSquaredMeter. To change how many species points a generator makes, edit its graph, which changes every row that uses it. To change one species' share, change its Weight.

Height, density and other filters

Filter Options culls generated points before the species is placed on them.

FieldsWhat they filterBackends
Density Min, Density MaxPoint density, 0 to 1.Both.
Height Min, Height MaxWorld Z in centimetres. Defaults span plus or minus 100000.Both.
Flow Min, Flow MaxDrainage accumulation, 0 to 1.Landscape only.
Sun Exposure Min, Sun Exposure MaxSun exposure, 0 to 1.Landscape only.
Water Distance Min, Water Distance MaxDistance to water, in centimetres.No effect: no water-distance filter ships.

A species row has no slope setting. Slope limits live in the PCG graph a generator points at, not on the row. The row's Asset Options → Orient Upward (0 to 1) only controls how far the instance is tilted from the surface normal toward world up.

On Landscape, flow and sun exposure come from two textures that ship with the plugin, T_AT_Flow_Terraformer and T_AT_SunExposure_Terraformer, which were baked for the showcase levels' terrain. Treat those four fields as tuned for the showcase terrain unless you have checked the effect on yours.

Placement transform

Asset Options holds a per-instance offset and pruning policy: Translation, Rotation, Scale, Orient Upward and the Self Prune toggle, plus fields for overlap, forced scale and bounds. Shipped rows use Scale to make size variants from one mesh: Biome_Desert places PCG_Cactus_01 at scale 0.45 (young), 1 (default) and 1.85 (old), with different weights.

Material override

Mesh Options → Material overrides the mesh's material for that row. The shipped rows use materials from /AgenticBiomes/Materials, for example M_AT_Rock on boulders and MIC_Sage_Conifer on spruce. Mesh Options carries 20 settings in all (shadows, culling, navigation, HLOD, tags). Setting Mesh Options Preset (a BiomeCore preset asset) replaces all 20, and Details then hides Mesh Options and says so.

Child assets

Child Assets points at a BiomeCore biome-asset Blueprint asset that spawns further assets on the row's points. The shipped Child_* assets in /AgenticBiomes/Biomes/Showcase/Children place seedlings and small boulders around trees and rocks, with _MT variants for MeshTerrain.

Turn rows off, solo and isolate

  • Untick Enabled in the row header to drop the row before BiomeCore sees it. Biome_Beach ships 18 disabled rows this way.
  • Solo is an authoring filter. When any enabled row has it, only soloed enabled rows are emitted. It costs no generation time because the list is filtered first.
  • Debug Options → Isolate is BiomeCore's own isolation: it changes what BiomeCore renders, not which rows are emitted.

Runtime entries

A runtime entry points at an RT_* template. These are BiomeCore runtime asset templates (Blueprint assets of the type BiomeRuntimeAssetTemplate). Each holds a Generator Graph and a Biome Assets list of meshes with weight, scale and material. They drive the GPU ground cover (grass, ferns, stones) generated around the camera at runtime; see Runtime Ground Cover.

Add one element to Runtime Asset Entries per template. Each element has an Asset and a Backends mask (both ticked by default), so a biome carries one template per backend. The templates that ship:

BackendFolderTemplates
Landscape/AgenticBiomes/Runtime/ShowcaseRT_Showcase_Broadleaf_Grass, RT_Showcase_Coniferous_Grass, RT_Showcase_Desert_Rocks, RT_Showcase_DryGrass, RT_Showcase_MountainForest_Grass, RT_Showcase_Understory
MeshTerrain/AgenticBiomes/Runtime/ShowcaseMTBroadleafForestGroundScatter_RuntimeGrass_MT, DesertGroundScatter_RuntimeRocks_MT, RT_Showcase_Coniferous_Grass_MT, RT_Showcase_DryGrass_MT, RT_Showcase_MountainForest_Grass_MT, RT_Showcase_Understory_MT
Landscape/AgenticBiomes/Sample/BiomeAssets/Runtime/GroundScatterBroadleafForestGroundScatter_RuntimeGrass, DesertGroundScatter_RuntimeRocks (used by Biome_MountainForest and Biome_Landslide)

To make your own, duplicate a shipped template, change its meshes and graph, and add it to a biome. If an entry's asset fails to load, the build logs "runtime asset ... failed to load; skipped" and carries on without it.

The biome also counts as having runtime cover when an enabled species row has a Generation Method other than None under Runtime scatter. The shipped rows use RuntimeAssembly with the L_*MicroScattering_PCG assemblies from Sample/PCGAssemblies.

The Runtime Assets array under Ground cover → Advanced is a legacy list. A build ignores it; on load, its entries are moved into Runtime Asset Entries when that list is empty. Use Runtime Asset Entries.


Bind the Landscape layer

Landscape Layer Name names the Landscape paint layer a biome follows. It is a name match: the layer's Layer Name must equal this value. The shipped LLI_<Biome> assets show the pattern: each layer-info asset's layer name equals the biome name.

It is read from Landscape weightmaps in two places:

  • Grid placement: when a sector bakes runtime masks, a biome with runtime cover and a layer name gets a mask built from that layer's painted area. A biome whose layer name is None is skipped.
  • Paint to biome map: the BuildBiomesFromPaint tool builds the biome map from painted layers, using only palette biomes that declare a layer name.

The PaintBiomeLayers tool (biome map to paint) does not read this property. It names each layer from the region's name with everything up to the last Biome_ removed (Biome_Landslide becomes Landslide), and writes to the matching LLI_<Biome> layer-info asset in /AgenticBiomes/Landscape, creating it if it is missing.

On a MeshTerrain the weight layers cannot be read by this path, so a sector's mask bake finds no terrain texels and logs a warning that the layer is unreadable on this backend. Place MeshTerrain biomes with a biome map, box regions or spline regions instead. See Terrain Material for painting the layers.


One asset on Landscape and MeshTerrain

The Terraformer resolves one backend for the level (Terrain Backend is Auto unless you set it; Resolved Terrain Backend shows the result). When a region is built, the biome emits only what serves that backend:

  • A species row is emitted only if its Backends mask includes the resolved backend. The mask has two checkboxes, Landscape and Mesh Terrain, both ticked by default. With neither ticked, the row is never emitted.
  • A runtime entry is carried only if its Backends mask includes the resolved backend.
  • A region placed by hand with no Terraformer above it uses Landscape if the level contains any Landscape, otherwise MeshTerrain.

If every row is filtered out, the log warns "has N species but none survived solo/backend filtering; region ... will place nothing".

Separate rows per backend. The shipped biomes keep a Landscape row and an _MT twin where the values differ. Biome_Desert has Tree_PCG_Cactus_01_Young (Landscape, generator Shared_Trees_Landscape, height 100 to 2500) and Tree_PCG_Cactus_01_Young_MT (MeshTerrain, generator Shared_Trees_MeshTerrain, height 100 to 4500). Point a row at the generator that matches its backend; the plugin's data model treats a Landscape generator on a MeshTerrain level as a mismatch that places nothing.

One row with a backend override. When only the generator and child asset differ, keep one row ticked for both backends and set Backend Overrides (under Backends). Biome_MountainForest and Biome_Snow do this for Tree_PCG_Pine_01: the row names Shared_Trees_Landscape and Child_Seedlings, and its MeshTerrain override names Shared_Trees_MeshTerrain and Child_Seedlings_MT. An override field that is set replaces the row's value for that backend. An unset field leaves it alone.

What is Landscape only. Flow Min/Max, Sun Exposure Min/Max and Water Distance Min/Max have no source on MeshTerrain. The validator enforces this with the SampleFilterOnMeshTerrain rule (below). Keep those values on a row that serves Landscape only. Landscape Layer Name is also read from Landscape weightmaps only.

Agents can merge a Landscape biome and its MeshTerrain sibling into one asset with the FoldMeshTerrainSibling tool. It matches rows by Species Id, turns generator and child-asset differences into overrides, and refuses to merge rows whose other values differ unless asked to keep them as two single-backend rows. See Agent Toolsets.


Validate a biome

Three routes run the same validator, and none of them repairs anything:

  • Details panel: the Validation list at the top refreshes a moment after you stop editing. It shows No issues. or a count such as 3 issue(s), 2 error(s), then one line per issue with the code, the species id and the detail. It validates one biome; with several selected it says "Select a single biome to validate."
  • Right-click the asset → Validate Biome: writes the result to the Output Log under LogAgenticBiomes. It accepts a multi-selection. A clean biome logs "ValidateBiome ...: no issues."; otherwise a warning line "N issue(s)" is followed by one line per issue in the form [Severity] Code (SpeciesId): detail.
  • MCP tool ValidateBiome: returns the same list. See Agent Toolsets.

Building does not run the validator, so run it yourself after editing. Disabled rows are validated too.

CodeSeverityRaised when
EmptyBiomeWarningNo species rows and no runtime cover: the biome claims ground and places nothing on it.
MissingSpeciesIdErrorA row's Species Id is None.
DuplicateSpeciesIdErrorTwo rows share a Species Id; reported on the later row.
NonPositiveWeightErrorWeight is 0 or less, so the row can never be picked.
MissingGeneratorErrorA row has no Generator.
UnresolvableMeshErrorMesh is set but does not load.
GeneratorPriorityOutOfRangeErrorThe row's generator is an Agentic Biome Generator whose GeneratorPriority is outside -1 to 1.
SampleFilterOnMeshTerrainErrorA row that serves MeshTerrain has FlowMin, FlowMax, SunExposureMin, SunExposureMax, WaterDistanceMin or WaterDistanceMax away from its default (0, 1, 0, 1, 0, 100000). One issue per field.
BlackBiomeColourErrorEvery channel of Biome Color is within the tolerance of zero.
ColourCollisionErrorAnother biome asset in the same Content folder is within the tolerance of this colour on every channel.
BiomeNotFoundErrorThe path given to the tool does not resolve to a biome asset.

The SampleFilterOnMeshTerrain message reads, for example: FlowMin is authored non-neutral on a MeshTerrain-masked row, but no MeshTerrain producer exists for it (BS-F2). Landscape-only field. The tolerance for the colour checks comes from the Terraformer in the open level when there is one, otherwise 0.01.

The validator does not check that a row has something to spawn (Mesh, Skeletal Mesh, Assembly or Actor), that a generator loads, or that two biomes use different layer names. The SetSpecies tool does refuse a row that spawns nothing or whose generator does not resolve.


Duplicate and make variants

  1. Right-click a biome and choose Duplicate (or select it and press Ctrl+D), and keep the copy in your project.
  2. Give the copy its own Biome Name, Biome Color and Biome Priority. A copied colour fails ColourCollision against the original if they sit in the same folder. The validator compares colours only against biome assets in the same Content folder, so for biomes in different folders use the Terraformer's Validate Biome Palette.
  3. Change Landscape Layer Name if the copy should follow its own paint layer. The validator does not compare layer names.
  4. Edit rows: change Weight, Scale and filters, untick Enabled on rows you do not want, or add rows that reuse a mesh at another scale.

Biome edits reach a level when its regions are applied again: rebuild from the Terraformer. A hand-placed region applies its biome when you set its Biome property. A region records the hash of the rows it was built from, and the VerifyLevel tool reports Stale when the biome has since changed.

Revision under Provenance rises with every edit, including a changed description. It is a label and is not the staleness test.


Edit through tools

An MCP client can read and edit biomes through the biome toolset: InspectBiome (what each row will place, with normalised weights), SetSpecies (add or replace one row by Species Id, validated first and refused as a whole when a check fails), ValidateBiome, FoldMeshTerrainSibling, SetRuntimeAssetScale and HashBiomes. SetSpecies refuses a row with no Species Id, a weight of 0 or less, no generator or one that does not resolve, a mesh that does not resolve, or no Mesh, Skeletal Mesh, Assembly or Actor. See Agent Toolsets and the toolset reference.


Next steps

Place the biome with Placement, set up Runtime Ground Cover, paint the surface with Terrain Material, or get support.