Editor toolsets
Every tool in the two Agentic Biomes editor toolsets, with argument names, defaults, return values, blocking behaviour and refusals
Editor toolsets
Agentic Biomes registers 28 editor tools with Epic's experimental ToolsetRegistry plugin: 25 in AgenticBiomeToolset and 3 in AgenticCaptureToolset. Each tool is listed once below under its C++ name. For how to connect an MCP client and a safe order of calls, see Agent toolsets.
The tools exist only in the editor. They are not part of a packaged game, and no AI model or agent ships with the plugin: you bring your own MCP client. The tools do not ask for confirmation. Several of them save assets to disk as soon as they succeed, so work on copies of any asset you care about.
Conventions
- Toolset names. The registry names a toolset after the module that owns it plus the class name, so the two toolsets are
AgenticBiomesToolsets.AgenticBiomeToolsetandAgenticBiomesToolsets.AgenticCaptureToolset. A tool is addressed asToolsetName.ToolName, split at the last dot, for exampleAgenticBiomesToolsets.AgenticBiomeToolset.InspectBiome. Through thecall_toolmeta tool the two parts go in separate arguments,toolset_nameandtool_name. - Argument and field names on the wire. The tables use the C++ names. Over MCP the first letter of every argument and every result field is lowercased, so
BiomePathis sent asbiomePathandspeciesIdcomes back forSpeciesId. A name that already starts in lowercase, such asbDryRun, is unchanged.describe_toolsetreturns the exact schema for your engine build; treat it as the authority. - Asset references inside objects. A species row stores its
MeshandGeneratoras asset references. In JSON a reference is an object with one key,{"refPath": "/Path/Asset.Asset"}, and a plain string with the same content is also accepted. The path must be an object path with the dot and asset name; a bare package path is refused. Arguments typed as plain strings, such asBiomePath, are not reference objects. - Results. The editor wraps every result as an object with the value under
returnValue. Enumerations come back as their names. A call with a missing argument or a value of the wrong shape fails before the tool runs, with an error from the registry. - Required arguments. Every argument is required unless its row gives a default. Only
DrawSplineBiome.bLinear(default true) andFoldMeshTerrainSibling.bSplitOnConflict(default false) have defaults. - Path forms.
BiomePathaccepts a package path such as/AgenticBiomes/Biomes/Showcase/Biome_Desertor the full object path with the dot. Graph, layer-info and reference arguments are loaded as objects, so give them the full object path (/Path/Asset.Asset).Subjectfor the proof tools is a package path without the dot. - Threading. Tools run on the editor's game thread. The editor is busy until a call returns, and the long calls (
BuildMeshTerrain,HashBiomes,ProveUnreferencedMany, a firstCaptureShot) can take a while. - What is saved.
SetSpecies, live runs ofMigrateEnumValuesandFoldMeshTerrainSibling,SetRuntimeAssetScaleand the four graph-parameter tools save the asset they edit.PaintBiomeLayerssaves any layer-info assets it creates, andBuildBiomesFromPaintwrites its biome-map texture. Tools that act on the open level (BuildLevel,BuildLevelAs,DrawSplineBiome,PaintLayerRect,PaintBiomeLayers,BuildBiomesFromPaint,AddLandscapeTargetLayer,ImportHeightmapTerrain) change the level in memory and do not save it: save the level yourself.BuildMeshTerrainis the exception in the other direction. It refuses to start while the editor holds unsaved world packages. - Missing assets. Most tools report a path that does not load as text or in a problem list.
InspectBiome,FingerprintBiomeandHashBiomesdo not: they return an empty list.
AgenticBiomeToolset
Registered name AgenticBiomesToolsets.AgenticBiomeToolset. 25 tools. "Blocking" means the result describes finished work when the call returns.
| Tool | Arguments | Returns | What it does, blocking behaviour, refusals |
|---|---|---|---|
InspectBiome | BiomePath (string) | Array of species views | Read-only. Lists every authored row as it will actually spawn, after solo filtering and after a mesh-options preset replaces the row's own options. Blocking. Returns an empty array, with no error text, when the asset does not load. |
SetSpecies | BiomePath (string), Row (species row object), bDryRun (bool) | Edit result | Adds a row, or replaces the row with the same SpeciesId. The whole row is replaced, not merged, so any field you leave out goes back to its default. All checks run first and every failure is reported together; one failure refuses the whole row. A real run saves the biome asset, and bSuccess is true only if the save worked. Blocking. Refuses: no biome at the path, missing SpeciesId, weight not above zero, missing or unresolvable Generator, unresolvable Mesh, or a row that sets none of Mesh, SkeletalMesh, Assembly and Actor. |
ValidateBiome | BiomePath (string) | Array of issues | Read-only. An empty array means no findings. A missing asset is reported as an Error issue with code BiomeNotFound. Colour collisions are checked against the other biome assets in the same content folder (not its subfolders). Blocking. |
MigrateEnumValues | BiomePath (string), ReferencePath (string), bDryRun (bool) | Migration report | Repairs rows imported from Epic's BiomeCore content. Rules, in order: a row asking for OutputPoints generation becomes RuntimeAssembly if it carries a runtime assembly and None otherwise; an inert WaterDistanceMin of 2500 becomes 0. If ReferencePath names an Epic-authored asset, rows whose Mesh has the same asset name take its exact generation method and influence type instead of the first rule. It refuses to guess: a row with influence type None and a radius other than 100, or with a non-default WaterDistanceMax, is listed in rowsRefused and that rule is not applied to it (other rules can still change the same row). Pass an empty string for no reference. A live run that changes rows saves. Blocking. |
AddGraphSoftObjectParameter | GraphPath (string), ParamName (string), ObjectClassPath (string), DefaultObjectPath (string) | Text: OK or the reason | Adds a soft-object user parameter to a PCG graph, optionally with a default asset, and saves the graph. If the parameter already exists the call only sets its default. Blocking. Refuses: no graph at the path, or a value class that does not load. |
WireGraphParameterToPin | GraphPath (string), ParamName (string), TargetNodeIndex (integer), TargetPinLabel (string) | Text: OK or the reason | Creates a getter node for an existing graph parameter and connects it to a pin on the node at TargetNodeIndex (a zero-based index into the graph's node list), then saves. Blocking. Refuses: no graph, no such parameter, index out of range, or an edge the graph rejects (usually a wrong pin label). |
SetGraphParameterValue | GraphPath (string), ParamName (string), Value (string) | Text: OK or the reason | Sets the default value of an existing graph parameter and saves. The value is text; it is read as a number or a bool according to the parameter's type. Supported types are Double, Float, Int32, Int64 and Bool. Blocking. Refuses any other type, and a missing graph or parameter. |
AddGraphParameter | GraphPath (string), ParamName (string), Type (string), Value (string) | Text: OK or the reason | Adds a typed user parameter without rebuilding the graph's parameter list, and sets its value. Type is Double, Int, Bool or Vector. A Vector value is the text form X=0 Y=0 Z=0. If the name exists, the call sets its value. Saves. Blocking. Refuses any other type. |
FoldMeshTerrainSibling | BiomePath (string), SiblingPath (string), bDryRun (bool), bSplitOnConflict (bool, default false) | Fold report | Merges a MeshTerrain copy of a biome (SiblingPath) into the Landscape-named biome (BiomePath) so one asset serves both backends. Rows match by SpeciesId. A differing Generator or ChildAssets becomes a MeshTerrain override. Any other difference is a value conflict and the fold refuses, unless bSplitOnConflict folds that pair as two single-backend rows (the MeshTerrain copy's id gains an _MT suffix). The folded asset is expanded once per backend and must hash identically to each input, or nothing is written. Only BiomePath is written; the sibling is never deleted. Blocking. |
ResolveTerrainBackend | none | Terrain resolution | Read-only. Reports whether the open level has a Landscape, MeshTerrain, both or neither. bCanBuild is false for both and for neither. Blocking. |
BuildLevel | none | Build result | Rebuilds the open level with the builder the Terraformer recorded in LastBuildMethod (Grid, BiomeMap or Volume). It does not verify. Dispatches PCG generation and returns before generation finishes; poll VerifyLevel. Refuses: no Terraformer, more than one Terraformer, or a recorded method of Unknown, which is what a level that has never been built has. Nothing is built when it refuses. To build a level for the first time, use BuildLevelAs. |
BuildLevelAs | Builder (string) | Build result | Builds the open level with the builder you name: BiomeMap, BiomeVolumes (or Volume) or Grid, in any letter case. Grid runs Build All. It is the way to build a level that has never been built, where BuildLevel has no recorded builder to repeat. It does not verify. Dispatches PCG generation and returns before generation finishes; poll VerifyLevel. Refuses, with nothing built: no Terraformer or more than one; any other builder name; a recorded builder that differs from the one you named, because that converts the level's layout instead of rebuilding it; and a level whose recorded method is Unknown but which already has regions or placed instances. |
VerifyLevel | none | Gate | Read-only grading of the open level from counts and the provenance stamped on each region. It never builds and never waits. status is Pass, Stale, Pending, Fail or Refused. See the gate table below. Blocking. |
FingerprintBiome | BiomePath (string) | Array of fingerprints | Read-only. One stable hash per species row, for proving that a refactor or migration changed nothing. Asset references hash by asset name, so moving an asset between folders does not change a hash. Blocking. Returns an empty array when the asset does not load. |
HashBiomes | SearchPath (string) | Array of biome hashes | Read-only. Finds every biome asset under a content folder (recursively), loads each and returns one whole-asset hash of the rows that would be emitted, sorted by path. Blocking, and slow on a large folder. Returns an empty array for a folder with no biome assets. |
AddLandscapeTargetLayer | LayerName (string), LayerInfoPath (string) | Text: empty on success | Assigns a landscape layer-info asset to a named target layer on every landscape actor in the open level, adding the layer if it is missing. Blocking. Refuses: empty layer name, no editor world, layer-info asset that does not load, or no landscape in the level. |
ProveUnreferenced | Subject (string) | Death certificate | Read-only. Collects evidence on whether one asset or class is still referenced. Never deletes anything. See the certificate table below for what each channel can and cannot see. Blocking, and it reads every asset file under the plugin's Content folder. |
ProveUnreferencedMany | Subjects (array of strings) | Array of death certificates | The same check for a batch, with one shared pass over the files. A subject whose every referencer is itself a certified-dead subject of the batch counts as dead too, and is reported in deadSubjectReferencers. Blocking. |
PaintBiomeLayers | bDryRun (bool) | Text report | Landscape only. Creates one paint layer per biome from the level's resolved biome map (or, on a level without a usable map, from the regions' 2D bounds), creates and saves a LLI_ layer-info asset for each biome that lacks one (in the plugin's own Landscape content folder), writes disjoint 0 and 255 weight masks, and reads the final weightmaps back to count painted texels. A dry run creates and paints nothing. Blocking. Refuses: no Terraformer, no biome map and no regions, or no landscape. |
BuildBiomesFromPaint | bRebuild (bool) | Text report | Landscape only. The reverse of PaintBiomeLayers: composes a biome colour map from the landscape's painted layers, writes it as a texture named T_BiomeMap_<TerraformerName> in your project's AT_Generated content folder (replacing one of that name), assigns it to the Terraformer's BiomeMap, and rebuilds when bRebuild is true. The map's size is the Terraformer's BakedBiomeMapResolution. A texel goes to the biome with the highest final weight of 128 or more; ties go to the earlier entry in BiomeMapBiomes; unclaimed texels stay black, which means "no biome". Only biomes in BiomeMapBiomes with a LandscapeLayerName the landscape carries take part, and the report names each one skipped. Dispatches generation when it rebuilds; poll VerifyLevel. Refuses: no Terraformer, no landscape, or no biome with a usable layer. |
PaintLayerRect | LayerName (string), WorldMinX (number), WorldMinY (number), WorldMaxX (number), WorldMaxY (number), Weight (integer) | Text report | Landscape only. Paints one existing landscape layer to a constant weight over a world-space rectangle. Weight is clamped to 0 to 255; 255 paints and 0 erases. Other layers are not touched, so a 255 write over another biome's ground produces a tie rather than an erase. The report states how many vertices read back as expected. Blocking. Refuses: no landscape, no such layer, or a rectangle that misses the landscape. |
DrawSplineBiome | BiomePath (string), WorldPoints (array of vectors), bLinear (bool, default true) | Text report | Spawns a closed spline region of the biome from three or more corner points in world centimetres, snaps each point's Z to the terrain surface (a point with no terrain below it keeps the Z you gave), and builds BiomeCore over the new region. bLinear true keeps straight edges, false uses a smooth curve. Each successful call adds another region; it does not replace an earlier one, and generation runs again for every region the Terraformer tracks, not only the new one. Dispatches generation and returns before it finishes; poll VerifyLevel. Refuses: no or several Terraformers, a biome that does not load, fewer than 3 points, or unresolvable terrain. |
SetRuntimeAssetScale | AssetPath (string), ScaleX (number), ScaleY (number), ScaleZ (number) | Text report | Sets the asset scale on every row of a runtime asset template (an RT_ data asset such as /AgenticBiomes/Runtime/Showcase/RT_Showcase_DryGrass), saves, and reads row 0 back. One scale is applied to all rows; there is no per-row form. Blocking. Refuses: no asset at the path, or an asset that is not a template with a BiomeAssets row array whose rows carry an asset-options scale. |
ImportHeightmapTerrain | HeightmapPng (string), MeshResX (integer), MeshResY (integer), SizeX (number), SizeY (number), SizeZ (number), SectionsX (integer), SectionsY (integer), ZOffset (number) | Text report | Imports a 16-bit grayscale PNG (a file path on disk) as a new Mesh Partition terrain actor. Pixel values 0 to 65535 map onto 0 to SizeZ from z=0, centred on the world origin in XY; the actor is then moved up by ZOffset. It does not save the level. Blocking. Available only when the plugin was built with Mesh Partition enabled; otherwise it returns an "unavailable" text. |
BuildMeshTerrain | none | Text: a JSON report | Builds the Mesh Partition compiled sections for the open level, using the same builder command as Epic's Build menu entry, in a separate editor process. The call does not return until the build ends, and the editor unloads and reloads the map during it. Only one build can run at a time. See the report text below for the error values. |
Species view, InspectBiome
| Field | Meaning |
|---|---|
speciesId | The row's key. |
assetType | The row's asset-type label. |
bEnabled | False when the row is present but skipped. |
bSolo | The row's solo flag. |
bSuppressedBySolo | True when the row is not emitted: it is disabled, or another enabled row is soloed and this one is not. |
weight | The authored weight. |
normalizedWeight | The weight as a share (0 to 1) of the emitted rows that share this row's generator. 0 when the row is not emitted. |
meshPath, generatorPath | The row's mesh and generator as paths in text. Empty when unset. |
generatorSubType | The generator sub-type filter. |
bMeshMissing | True when a mesh is set but does not resolve to an asset. |
meshOptionsSource | Row, or the name of the mesh-options preset that replaces the row's own options. |
Edit result, SetSpecies
| Field | Meaning |
|---|---|
bSuccess | True when the dry run passed, or when the row was written and saved. |
action | Added, Updated, Rejected or DryRun. It says what was attempted. After a failed save it can still read Added or Updated, so check bSuccess. |
speciesId | The row key you sent. |
problems | Every reason the write was refused, and the save error if saving failed. Empty on success. |
speciesCount | Number of rows in the biome. |
Issues, ValidateBiome
Each issue has severity (Error or Warning), code, speciesId (None when the finding is about the biome as a whole) and detail.
| Code | Severity | Meaning |
|---|---|---|
BiomeNotFound | Error | No biome asset at the path. |
EmptyBiome | Warning | No species and no runtime cover: the biome claims ground and places nothing. |
MissingSpeciesId | Error | A row has no SpeciesId, so no tool can address it. |
DuplicateSpeciesId | Error | Two rows share an id; an upsert would hit only the first. |
NonPositiveWeight | Error | A row's weight is 0 or less, so it can never be picked. |
MissingGenerator | Error | A row has no generator, so it has no points to land on. |
UnresolvableMesh | Error | A row's mesh does not resolve to an asset. |
GeneratorPriorityOutOfRange | Error | A generator holder's priority is outside Epic's authored range. A smaller number means a higher priority. |
SampleFilterOnMeshTerrain | Error | A row that serves MeshTerrain sets a non-neutral Flow, Sun Exposure or Water Distance filter (neutral is 0 to 1, and 0 to 100000 for water distance). The MeshTerrain backend has no data for those filters. |
BlackBiomeColour | Error | The biome colour is black, which a biome map reads as "no biome". |
ColourCollision | Error | The biome colour is within the tolerance of another biome's on every channel, so both would claim the same texels. The tolerance is the Terraformer's BiomeColorTolerance when the level has exactly one, otherwise 0.01. |
Migration report, MigrateEnumValues
| Field | Meaning |
|---|---|
rowsExamined, rowsChanged | Counts of rows looked at and rows changed (or that would change in a dry run). |
rowsRefused | Rows the rules cannot decide, each with its evidence. Never written. Also carries the load or save failure text. |
changes | One before and after line per change. |
bDryRun | Echoes the argument. |
bSuccess | False when the biome failed to load or the save failed. |
Fold report, FoldMeshTerrainSibling
| Field | Meaning |
|---|---|
bSuccess, bDryRun | Outcome and echo of the argument. |
landscape, meshTerrain | The two input assets, as reference objects. |
rowsMerged | Rows matched by SpeciesId on both sides and merged. |
rowsLandscapeOnly, rowsMeshTerrainOnly | Rows present on one side only. Each is folded with a single-backend mask. |
overridesWritten | Reference fields that differed and became MeshTerrain overrides. |
landscapeHashBefore, meshTerrainHashBefore | Per-backend hashes of the two inputs, taken before any write. |
landscapeHashAfter, meshTerrainHashAfter | The folded asset expanded once per backend. Each must equal its "before" hash. |
bFingerprintGatePassed | True when both hashes match. A failed gate writes nothing. |
valueConflicts | Matched rows whose other values disagree. They are never merged automatically. |
rowsSplitOnConflict | Conflicted pairs folded as two rows because bSplitOnConflict was true. |
problems | Load failures, the conflict refusal, a failed gate, or a failed save. |
Terrain resolution, ResolveTerrainBackend
| Field | Meaning |
|---|---|
backend | Landscape, MeshTerrain, Both or None. |
bHasLandscape, bHasMeshTerrain | What the level contains. |
bCanBuild | False for Both and None, the two cases a build will not guess through. |
detail | The reason for Both or None. For Both, set the Terraformer's Terrain Backend explicitly. |
Build result, BuildLevel and BuildLevelAs
| Field | Meaning |
|---|---|
builderRun | Grid, BiomeMap, Volume or Refused. For BuildLevelAs, naming BiomeVolumes reports Volume. |
bRan | True when a builder was started. |
regionsSpawned | Number of regions the Terraformer tracks after the call. This is not a completion signal; generation continues afterwards. |
refusal | Empty when the builder ran. Otherwise the reason and the remedy. |
Gate, VerifyLevel
| Field | Meaning |
|---|---|
status | Pass, Stale, Pending, Fail or Refused. |
regionCount | Regions the Terraformer tracks. |
pendingRegions | Regions whose PCG component has not finished generating. |
cachePoints, distinctCells | Cache points over the cells they fall on. Spline regions are overlays and are excluded from both. |
overlayPoints | Cache points of spline (overlay) regions. |
placedInstances | Instances actually spawned by the level's tagged biome PCG components. |
staleRegions | Regions whose stamped provenance no longer matches their source biome, or that carry no stamp at all. |
degradations | Quality losses that still give a buildable level, such as a region's recorded cache fallback, or a source biome that will not load. |
bSoloActive | True when a source biome has an enabled row with solo left on. |
failures | Machine codes such as SoloLeftOn: Biome.Row. Any entry forces Fail. |
rendered | A text summary built from the fields above. It begins with the status name, except for Refused, where it is the reason. |
status is decided in this order:
| Order | Condition | Status |
|---|---|---|
| 1 | failures is not empty (solo left on) | Fail |
| 2 | pendingRegions is above 0 | Pending |
| 3 | degradations is not empty | Fail |
| 4 | staleRegions is not empty | Stale |
| 5 | No regions, no cache or overlay points, cachePoints differs from distinctCells, or placedInstances is 0 | Fail |
| 6 | None of the above | Pass |
Refused is returned instead when the level does not contain exactly one Terraformer; rendered carries the reason.
Fingerprints and hashes
| Tool | Field | Meaning |
|---|---|---|
FingerprintBiome | speciesId, valueCount, hash | One entry per row: the number of values folded and their hash. |
HashBiomes | biomePath | The biome asset's object path. |
HashBiomes | hash | Hash of the emitted rows. Empty when nothing is emitted. |
HashBiomes | leafFieldsPerRow | Values folded per row. If this does not equal the plugin's expected field count, the hash is not an equivalence proof. |
HashBiomes | emittedRows, authoredRows | Rows that survive the Enabled and solo filters, and rows authored on the asset. |
Death certificate, ProveUnreferenced and ProveUnreferencedMany
| Field | Meaning |
|---|---|
subject | The path or class name you gave. |
bSafeToDelete | True only when every channel below is empty (or every referencer is itself a dead subject of the same batch) and the subject resolved. |
registryReferencers | Packages the Asset Registry lists as referencing the subject, hard and soft. |
stringReferrers | Files whose bytes contain the subject's path, in ANSI or UTF-16 form. The scan covers .uasset and .umap files in the plugin's Content, plus the plugin's Source and Config files, the host project's __ExternalActors__ folder and its .ini files. The subject's own files are excluded. |
classUsers | For a class name, the PCG graphs and graph instances under /AgenticBiomes that mention it. |
deadSubjectReferencers | Referencers that are themselves certified-dead subjects of the same batch. |
problems | Non-empty when the subject could not be resolved. An unreadable path is never treated as "no references". |
Limits to know before trusting a certificate. The byte scan looks only for paths under /AgenticBiomes/, so for an asset outside that mount only the registry channel can find references. A name that does not start with / is treated as a class name and is not checked for existence. A path assembled from fragments at runtime, and references from other plugins or projects, are invisible to every channel. Treat bSafeToDelete as evidence, not a guarantee.
AgenticCaptureToolset
Registered name AgenticBiomesToolsets.AgenticCaptureToolset. 3 tools. They read a shot set from a JSON file that you supply and photograph the open level from fixed cameras. There is deliberately no "capture all" tool: each call handles one shot, so the editor gets real frames between shots.
| Tool | Arguments | Returns | What it does, blocking behaviour, refusals |
|---|---|---|---|
DescribeShotSet | LevelPath (string), ShotSetPath (string) | Shot set info | Reads your shot-set file and returns the shots declared for one level, and whether their cameras are real yet. Captures nothing. Blocking. Returns the reason in problem, with the expected file format, when ShotSetPath or the file cannot be read or has no entry for the level. |
CaptureShot | LevelPath (string), ShotSetPath (string), ShotId (string), PhaseTag (string) | Shot result | Captures one declared shot from the open level as a 2560 by 1440 PNG, in Game View, at Saved/AgenticBiomes/Captures/<PhaseTag>/<ShotId>.png inside your project folder. It does not load a level. Blocking: a first capture can wait up to 30 seconds for the PNG to be written. Call it twice with identical arguments; only the second result is evidence. Needs a rendering editor: a -nullrhi or commandlet session has no viewport and cannot produce pixels. Refuses: shot set unreadable, level or shot not declared, PhaseTag or ShotId that is not a plain name, a shot whose location is still the origin placeholder, or the wrong level open. |
DeriveCameras | LevelPath (string), ShotSetPath (string) | Array of camera derivations | Computes camera positions from the open level's real geometry for the shots your file declares. Writes nothing and captures nothing: you write the returned locations into the shot-set file. Blocking. Needs the level open and a Terraformer in it that has built the level. Refuses with a single entry whose problem says why: shot set unreadable, wrong level open, or no Terraformer. Refuses an individual shot when there is no biome boundary to stand a camera on. |
Shot-set file
The shot set is your file, and the plugin ships none. Every capture call takes it as ShotSetPath: a path to a .json file in your project, either absolute or relative to the project directory (the folder that holds your .uproject). The capture tools do not write it. They refuse, and report the reason in problem with the expected format appended, when ShotSetPath is empty, does not end in .json, cannot be read, is not valid JSON, has no levels array, or declares no entry for the LevelPath you passed. A level entry with no shots array, or whose shots all fail to parse, is refused with its own problem.
A minimal file with one shot looks like this:
{
"levels": [
{
"level": "/Game/Maps/MyMap",
"shots": [
{
"id": "A_wide",
"kind": "wide",
"purpose": "what this camera shows",
"fov": 70,
"location": [0, 0, 0],
"rotation": {"roll": 0, "pitch": -35, "yaw": 0}
}
]
}
]
}| Key | Type | Meaning |
|---|---|---|
levels | array | One entry per level. |
level | string | The level's package path. It must equal the LevelPath argument you pass. CaptureShot and DeriveCameras also require that level to be the open one. |
shots | array | The shots declared for that level. |
id | string | The ShotId you pass to CaptureShot. It becomes the PNG's file name, so it must be a plain name: letters, digits, -, _ and single dots. |
kind | string | wide, eye, ground or silhouette. |
purpose | string | What the camera is for. Returned unchanged. |
fov | number | Field of view in degrees. Defaults to 70. |
location | array of three numbers | [x, y, z] in centimetres. It must be an array of exactly three numbers, not an object; anything else is read as the placeholder. A location of [0, 0, 0] marks an underived placeholder, and CaptureShot refuses it. |
rotation | object | Named fields roll, pitch and yaw, in degrees. Read by name, never by position. |
Leave location at [0, 0, 0] when you do not know where the camera should stand, open the level, and call DeriveCameras. It measures real positions from the open level and returns them as literals. Write each returned location into the file (and its rotation, which carries the derived yaw), then call DescribeShotSet to confirm bDerived is true. CaptureShot refuses a shot that still has the [0, 0, 0] placeholder rather than photographing the world origin.
Shot set info, DescribeShotSet
| Field | Meaning |
|---|---|
levelPath | The level you asked about. |
shotsDeclared | Number of shots parsed. |
bDerived | True only when every shot's location has moved off the origin. One placeholder makes the whole set not derived. |
shots | Each shot with shotId, kind, location, rotation, fov and purpose. |
problem | Empty when the set parsed. Otherwise why it did not; for an unreadable or unusable file, the expected file format is appended. |
Shot result, CaptureShot
| Field | Meaning |
|---|---|
shotId | The shot you asked for. |
imagePath | Where the PNG is written: Saved/AgenticBiomes/Captures/<PhaseTag>/<ShotId>.png under your project folder. |
imageBytes | File size on disk, read after the write settles. 0 means no pixels landed. |
bSettled | False on the first capture of a ShotId under a PhaseTag in an editor session (the warm-up frame), true on a repeat with identical arguments once the previous call's PNG has landed. A PNG left over from an earlier editor session never counts: the tool deletes it and treats the call as a first capture. Only a settled result is admissible as evidence. |
bGameView | True when the frame was rendered in Game View, without gizmos or viewport overlays. A plate with this false is not usable evidence. |
bInsideRuntimeRadius | True when the camera is inside a region's runtime generation radius. Read it together with runtimeRadiusSource. |
runtimeRadiusSource | extent (measured), degenerate-bounds (the regions reported no usable size, so the radius could not be measured) or no-regions. A false bInsideRuntimeRadius is a real "outside" only when this reads extent. |
buildStamp | The Terraformer's LastBuildMethod at capture time. A result whose stamp does not match the build you meant to judge is void. |
problem | Empty on a clean, settled capture. When several notes apply they are joined into one string with a vertical bar between them. |
Camera derivation, DeriveCameras
| Field | Meaning |
|---|---|
shotId | The shot this camera is for. |
location | The derived position. |
rotation | The shot's rotation with yaw derived. A boundary camera looks along the shared edge so the transition runs down the middle of the frame. Pitch and roll come from the file. |
groundZ | The ground height used: the higher of a downward trace and the tallest placed instance within 500 cm. |
groundSource | trace, instance, NEITHER - suspect flat collision or NEITHER - no terrain. A NEITHER value is a refusal to give a confident number; do not commit that location. |
problem | The reason a camera could not be derived, or a caveat such as a colliding biome map. |
How cameras are placed: a wide shot stands off along the regions' spread so all regions fit the shot's field of view. Any other shot stands on the boundary between the two closest regions (on a texture-driven level, on a biome-map cell edge), at 40 cm for ground, 200 cm for silhouette and 170 cm for every other kind.
Report text
Tools that return text give the reason in the string. These are the strings you will see, with <...> standing for a value.
| Tool | Text | Meaning |
|---|---|---|
| Graph tools | OK | Done and saved. |
| Graph tools | No UPCGGraph at '<path>'. | The path does not load as a PCG graph. |
| Graph tools | Graph '<path>' has no parameter '<name>'. | SetGraphParameterValue or WireGraphParameterToPin needs an existing parameter. |
| Graph tools | Node index <n> out of range (<count> nodes). | TargetNodeIndex is outside the graph's node list. |
| Graph tools | Edge <param> -> pin '<label>' was refused - check the pin label. | The graph rejected the connection. The call returns before saving. |
| Graph tools | Unsupported type '<type>' (Double|Int|Bool|Vector). | AddGraphParameter accepts only those four types. |
| Graph tools | Parameter added in memory but the graph failed to save. (and the Added, Set and Wired variants) | The edit is in memory only. Make the file writable and repeat. |
AddLandscapeTargetLayer | empty string | Success. |
AddLandscapeTargetLayer | Could not load a LandscapeLayerInfoObject at '<path>'. | Give the full object path of a layer-info asset. |
AddLandscapeTargetLayer | No ALandscapeProxy found in the editor world. | The open level has no landscape. |
PaintBiomeLayers | DryRun: <n> biomes (<names>), landscape <w>x<h> verts, ownership=<source>. | What a real run would do. <source> is resolved biome map or region bounds. |
PaintBiomeLayers | Painted <n> layers over <w>x<h> (<source>). ... with unowned vertices=, <biome> intent= and <biome> readback= | intent is what was meant to be written and readback is what the final merged weightmaps hold. Trust the read-back. A large unowned vertices count means ground no biome claims, which shows as bare ground in the material. |
PaintBiomeLayers | No resolved biome map and no AgenticBiomeRegion actors - nothing to derive paint from. | The level has nothing to derive ownership from. |
BuildBiomesFromPaint | Composed <n>x<n> biome map from <k> painted layers: <claimed>/<total> texels claimed (...). | Success. The report continues with one clause per biome used or skipped. |
BuildBiomesFromPaint | No biome in BiomeMapBiomes declares a LandscapeLayerName the landscape carries - nothing to compose. | Set LandscapeLayerName on the biomes, and paint those layers first. |
PaintLayerRect | Painted '<layer>'=<weight> over verts [..]..[..] (<n> verts); final-map readback: <a>/<b> match. | <a> of <b> vertices read back as expected. |
PaintLayerRect | Landscape has no layer '<name>'. | Add the layer first with AddLandscapeTargetLayer or PaintBiomeLayers. |
PaintLayerRect | Rectangle does not overlap the landscape. | The world rectangle misses the landscape. |
| Landscape tools | No landscape in this level. | Landscape-only tools do nothing on a MeshTerrain level. |
DrawSplineBiome | DrawSplineBiome: '<region>' (<n> points, linear or curve) - BuildSplineBiomes: <k> spline region(s) adopted among <m> region(s); aggregation DISPATCHED (asynchronous). | The region exists and generation has started, not finished. If the text ends with aggregation REFUSED. generation did not start; read the Output Log (category LogAgenticBiomes). |
DrawSplineBiome | DrawSplineBiome: REFUSED - <reason> | No or several Terraformers, a biome that does not load, or fewer than 3 points or unresolved terrain. |
DrawSplineBiome | DrawSplineBiome: '<region>' spawned but cannot generate: <reason>. | The region was created but its spline is unusable. The region stays in the level. |
SetRuntimeAssetScale | Set Scale=(x, y, z) on <n> rows of '<asset>'; saved=<true or false>; row0 readback=(x, y, z). | Check saved. |
ImportHeightmapTerrain | Imported '<file>' as MegaMesh '<label>' (<w>x<h> quads over <x>x<y>x<z>, <n> attached actors, z-offset <z>). | Success. |
ImportHeightmapTerrain | Import FAILED: <importer error> | Epic's importer rejected the file or the sizes. |
ImportHeightmapTerrain | ImportHeightmapTerrain unavailable: this editor was built without the optional MeshPartition importer. ... | The plugin was compiled without Mesh Partition. |
BuildMeshTerrain | A JSON object success, world, compiledSectionsBefore, compiledSectionsAfter, error | success is true only when the build finished cleanly, the requested map came back, and at least one compiled section exists afterwards. error is empty on success. |
BuildMeshTerrain | Refusing: not an editor world (PIE/game world active). | Stop Play In Editor first. |
BuildMeshTerrain | Refusing: '<world>' is not a World Partition world; ... | The Mesh Partition builder works only on World Partition levels. |
BuildMeshTerrain | Refusing: '<world>' has no MeshPartition actors to build. | Nothing to build. |
BuildMeshTerrain | Refusing: <n> unsaved world package(s) in this editor (first: <package>). ... | Save or discard unsaved maps first. The build saves every dirty world package before it starts. |
BuildMeshTerrain | Refusing: a MeshTerrain build is already in flight. | Wait for the running build. |
BuildMeshTerrain | Mesh Partition build FAILED, ... did not reach completion, ... reported failures or ... produced no compiled sections | The build ran but did not finish cleanly, or produced nothing. Where a build log is involved the message names it; it is in the project's log folder. |
While BuildMeshTerrain runs, the Output Log (category LogAgenticBiomes) shows a BuildMeshTerrain: STARTING line and, when it ends, a BuildMeshTerrain: FINISHED success=... line. If your client times out first, read the outcome there instead of calling again.
What the toolsets do not do
- There is no tool to delete a species row, a region, an actor or an asset, to clear a level, or to save a level.
- No tool edits roads, exclusion zones, the wind bridge or the terrain material; use the Details panel. Runtime ground cover has no authoring tool of its own:
SetRuntimeAssetScalerescales a runtime template, the PCG graph-parameter tools reach graph parameters, andSetSpecieswrites a row's runtime options along with the rest of the row. Everything else about it is edited in the Details panel. - Most Terraformer buttons have no tool. Auto Grid, Validate Biome Palette, Audit Biome Map, Bake Banded Biome Map, Clear Biome Map and Regenerate Edited Area are Details-panel buttons, not tools. The tools build, paint, draw and verify; they do not set up a sector grid or a biome-map palette for you.
InspectBiomereturns a summary view of each row, not every field. Read a full row in the Details panel before replacing it withSetSpecies.BuildLevelrepeats the builder the Terraformer last recorded, so it cannot start a level that has never been built. UseBuildLevelAswith the builder you want for the first build.BuildLevelAsdoes not convert a built level to a different builder: it refuses when the recorded builder differs from the one you name, and when the record isUnknownbut the level already has regions or placed instances. To change a built level's builder, clear the level deliberately first.VerifyLevelcounts and checks provenance. It does not judge how the level looks.
See Agent toolsets for the workflow, the Terraformer reference and the biome asset reference. Support: Discord.
Console variables
The three agenticbiomes.GcGuard console variables, the engine PCG and garbage-collection variables the plugin reads, and where the plugin's other settings live.
Troubleshooting
Diagnose empty builds, missing ground cover, biome map colours that do not match, wind that does not move, and toolsets that do not appear in Agentic Biomes