INSODIMENSIONStudios
BiomesReference

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.AgenticBiomeToolset and AgenticBiomesToolsets.AgenticCaptureToolset. A tool is addressed as ToolsetName.ToolName, split at the last dot, for example AgenticBiomesToolsets.AgenticBiomeToolset.InspectBiome. Through the call_tool meta tool the two parts go in separate arguments, toolset_name and tool_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 BiomePath is sent as biomePath and speciesId comes back for SpeciesId. A name that already starts in lowercase, such as bDryRun, is unchanged. describe_toolset returns the exact schema for your engine build; treat it as the authority.
  • Asset references inside objects. A species row stores its Mesh and Generator as 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 as BiomePath, 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) and FoldMeshTerrainSibling.bSplitOnConflict (default false) have defaults.
  • Path forms. BiomePath accepts a package path such as /AgenticBiomes/Biomes/Showcase/Biome_Desert or 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). Subject for 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 first CaptureShot) can take a while.
  • What is saved. SetSpecies, live runs of MigrateEnumValues and FoldMeshTerrainSibling, SetRuntimeAssetScale and the four graph-parameter tools save the asset they edit. PaintBiomeLayers saves any layer-info assets it creates, and BuildBiomesFromPaint writes 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. BuildMeshTerrain is 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, FingerprintBiome and HashBiomes do not: they return an empty list.

AgenticBiomeToolset

Registered name AgenticBiomesToolsets.AgenticBiomeToolset. 25 tools. "Blocking" means the result describes finished work when the call returns.

ToolArgumentsReturnsWhat it does, blocking behaviour, refusals
InspectBiomeBiomePath (string)Array of species viewsRead-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.
SetSpeciesBiomePath (string), Row (species row object), bDryRun (bool)Edit resultAdds 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.
ValidateBiomeBiomePath (string)Array of issuesRead-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.
MigrateEnumValuesBiomePath (string), ReferencePath (string), bDryRun (bool)Migration reportRepairs 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.
AddGraphSoftObjectParameterGraphPath (string), ParamName (string), ObjectClassPath (string), DefaultObjectPath (string)Text: OK or the reasonAdds 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.
WireGraphParameterToPinGraphPath (string), ParamName (string), TargetNodeIndex (integer), TargetPinLabel (string)Text: OK or the reasonCreates 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).
SetGraphParameterValueGraphPath (string), ParamName (string), Value (string)Text: OK or the reasonSets 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.
AddGraphParameterGraphPath (string), ParamName (string), Type (string), Value (string)Text: OK or the reasonAdds 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.
FoldMeshTerrainSiblingBiomePath (string), SiblingPath (string), bDryRun (bool), bSplitOnConflict (bool, default false)Fold reportMerges 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.
ResolveTerrainBackendnoneTerrain resolutionRead-only. Reports whether the open level has a Landscape, MeshTerrain, both or neither. bCanBuild is false for both and for neither. Blocking.
BuildLevelnoneBuild resultRebuilds 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.
BuildLevelAsBuilder (string)Build resultBuilds 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.
VerifyLevelnoneGateRead-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.
FingerprintBiomeBiomePath (string)Array of fingerprintsRead-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.
HashBiomesSearchPath (string)Array of biome hashesRead-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.
AddLandscapeTargetLayerLayerName (string), LayerInfoPath (string)Text: empty on successAssigns 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.
ProveUnreferencedSubject (string)Death certificateRead-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.
ProveUnreferencedManySubjects (array of strings)Array of death certificatesThe 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.
PaintBiomeLayersbDryRun (bool)Text reportLandscape 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.
BuildBiomesFromPaintbRebuild (bool)Text reportLandscape 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.
PaintLayerRectLayerName (string), WorldMinX (number), WorldMinY (number), WorldMaxX (number), WorldMaxY (number), Weight (integer)Text reportLandscape 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.
DrawSplineBiomeBiomePath (string), WorldPoints (array of vectors), bLinear (bool, default true)Text reportSpawns 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.
SetRuntimeAssetScaleAssetPath (string), ScaleX (number), ScaleY (number), ScaleZ (number)Text reportSets 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.
ImportHeightmapTerrainHeightmapPng (string), MeshResX (integer), MeshResY (integer), SizeX (number), SizeY (number), SizeZ (number), SectionsX (integer), SectionsY (integer), ZOffset (number)Text reportImports 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.
BuildMeshTerrainnoneText: a JSON reportBuilds 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

FieldMeaning
speciesIdThe row's key.
assetTypeThe row's asset-type label.
bEnabledFalse when the row is present but skipped.
bSoloThe row's solo flag.
bSuppressedBySoloTrue when the row is not emitted: it is disabled, or another enabled row is soloed and this one is not.
weightThe authored weight.
normalizedWeightThe 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, generatorPathThe row's mesh and generator as paths in text. Empty when unset.
generatorSubTypeThe generator sub-type filter.
bMeshMissingTrue when a mesh is set but does not resolve to an asset.
meshOptionsSourceRow, or the name of the mesh-options preset that replaces the row's own options.

Edit result, SetSpecies

FieldMeaning
bSuccessTrue when the dry run passed, or when the row was written and saved.
actionAdded, Updated, Rejected or DryRun. It says what was attempted. After a failed save it can still read Added or Updated, so check bSuccess.
speciesIdThe row key you sent.
problemsEvery reason the write was refused, and the save error if saving failed. Empty on success.
speciesCountNumber 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.

CodeSeverityMeaning
BiomeNotFoundErrorNo biome asset at the path.
EmptyBiomeWarningNo species and no runtime cover: the biome claims ground and places nothing.
MissingSpeciesIdErrorA row has no SpeciesId, so no tool can address it.
DuplicateSpeciesIdErrorTwo rows share an id; an upsert would hit only the first.
NonPositiveWeightErrorA row's weight is 0 or less, so it can never be picked.
MissingGeneratorErrorA row has no generator, so it has no points to land on.
UnresolvableMeshErrorA row's mesh does not resolve to an asset.
GeneratorPriorityOutOfRangeErrorA generator holder's priority is outside Epic's authored range. A smaller number means a higher priority.
SampleFilterOnMeshTerrainErrorA 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.
BlackBiomeColourErrorThe biome colour is black, which a biome map reads as "no biome".
ColourCollisionErrorThe 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

FieldMeaning
rowsExamined, rowsChangedCounts of rows looked at and rows changed (or that would change in a dry run).
rowsRefusedRows the rules cannot decide, each with its evidence. Never written. Also carries the load or save failure text.
changesOne before and after line per change.
bDryRunEchoes the argument.
bSuccessFalse when the biome failed to load or the save failed.

Fold report, FoldMeshTerrainSibling

FieldMeaning
bSuccess, bDryRunOutcome and echo of the argument.
landscape, meshTerrainThe two input assets, as reference objects.
rowsMergedRows matched by SpeciesId on both sides and merged.
rowsLandscapeOnly, rowsMeshTerrainOnlyRows present on one side only. Each is folded with a single-backend mask.
overridesWrittenReference fields that differed and became MeshTerrain overrides.
landscapeHashBefore, meshTerrainHashBeforePer-backend hashes of the two inputs, taken before any write.
landscapeHashAfter, meshTerrainHashAfterThe folded asset expanded once per backend. Each must equal its "before" hash.
bFingerprintGatePassedTrue when both hashes match. A failed gate writes nothing.
valueConflictsMatched rows whose other values disagree. They are never merged automatically.
rowsSplitOnConflictConflicted pairs folded as two rows because bSplitOnConflict was true.
problemsLoad failures, the conflict refusal, a failed gate, or a failed save.

Terrain resolution, ResolveTerrainBackend

FieldMeaning
backendLandscape, MeshTerrain, Both or None.
bHasLandscape, bHasMeshTerrainWhat the level contains.
bCanBuildFalse for Both and None, the two cases a build will not guess through.
detailThe reason for Both or None. For Both, set the Terraformer's Terrain Backend explicitly.

Build result, BuildLevel and BuildLevelAs

FieldMeaning
builderRunGrid, BiomeMap, Volume or Refused. For BuildLevelAs, naming BiomeVolumes reports Volume.
bRanTrue when a builder was started.
regionsSpawnedNumber of regions the Terraformer tracks after the call. This is not a completion signal; generation continues afterwards.
refusalEmpty when the builder ran. Otherwise the reason and the remedy.

Gate, VerifyLevel

FieldMeaning
statusPass, Stale, Pending, Fail or Refused.
regionCountRegions the Terraformer tracks.
pendingRegionsRegions whose PCG component has not finished generating.
cachePoints, distinctCellsCache points over the cells they fall on. Spline regions are overlays and are excluded from both.
overlayPointsCache points of spline (overlay) regions.
placedInstancesInstances actually spawned by the level's tagged biome PCG components.
staleRegionsRegions whose stamped provenance no longer matches their source biome, or that carry no stamp at all.
degradationsQuality losses that still give a buildable level, such as a region's recorded cache fallback, or a source biome that will not load.
bSoloActiveTrue when a source biome has an enabled row with solo left on.
failuresMachine codes such as SoloLeftOn: Biome.Row. Any entry forces Fail.
renderedA 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:

OrderConditionStatus
1failures is not empty (solo left on)Fail
2pendingRegions is above 0Pending
3degradations is not emptyFail
4staleRegions is not emptyStale
5No regions, no cache or overlay points, cachePoints differs from distinctCells, or placedInstances is 0Fail
6None of the abovePass

Refused is returned instead when the level does not contain exactly one Terraformer; rendered carries the reason.

Fingerprints and hashes

ToolFieldMeaning
FingerprintBiomespeciesId, valueCount, hashOne entry per row: the number of values folded and their hash.
HashBiomesbiomePathThe biome asset's object path.
HashBiomeshashHash of the emitted rows. Empty when nothing is emitted.
HashBiomesleafFieldsPerRowValues folded per row. If this does not equal the plugin's expected field count, the hash is not an equivalence proof.
HashBiomesemittedRows, authoredRowsRows that survive the Enabled and solo filters, and rows authored on the asset.

Death certificate, ProveUnreferenced and ProveUnreferencedMany

FieldMeaning
subjectThe path or class name you gave.
bSafeToDeleteTrue only when every channel below is empty (or every referencer is itself a dead subject of the same batch) and the subject resolved.
registryReferencersPackages the Asset Registry lists as referencing the subject, hard and soft.
stringReferrersFiles 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.
classUsersFor a class name, the PCG graphs and graph instances under /AgenticBiomes that mention it.
deadSubjectReferencersReferencers that are themselves certified-dead subjects of the same batch.
problemsNon-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.

ToolArgumentsReturnsWhat it does, blocking behaviour, refusals
DescribeShotSetLevelPath (string), ShotSetPath (string)Shot set infoReads 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.
CaptureShotLevelPath (string), ShotSetPath (string), ShotId (string), PhaseTag (string)Shot resultCaptures 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.
DeriveCamerasLevelPath (string), ShotSetPath (string)Array of camera derivationsComputes 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}
        }
      ]
    }
  ]
}
KeyTypeMeaning
levelsarrayOne entry per level.
levelstringThe level's package path. It must equal the LevelPath argument you pass. CaptureShot and DeriveCameras also require that level to be the open one.
shotsarrayThe shots declared for that level.
idstringThe ShotId you pass to CaptureShot. It becomes the PNG's file name, so it must be a plain name: letters, digits, -, _ and single dots.
kindstringwide, eye, ground or silhouette.
purposestringWhat the camera is for. Returned unchanged.
fovnumberField of view in degrees. Defaults to 70.
locationarray 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.
rotationobjectNamed 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

FieldMeaning
levelPathThe level you asked about.
shotsDeclaredNumber of shots parsed.
bDerivedTrue only when every shot's location has moved off the origin. One placeholder makes the whole set not derived.
shotsEach shot with shotId, kind, location, rotation, fov and purpose.
problemEmpty when the set parsed. Otherwise why it did not; for an unreadable or unusable file, the expected file format is appended.

Shot result, CaptureShot

FieldMeaning
shotIdThe shot you asked for.
imagePathWhere the PNG is written: Saved/AgenticBiomes/Captures/<PhaseTag>/<ShotId>.png under your project folder.
imageBytesFile size on disk, read after the write settles. 0 means no pixels landed.
bSettledFalse 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.
bGameViewTrue when the frame was rendered in Game View, without gizmos or viewport overlays. A plate with this false is not usable evidence.
bInsideRuntimeRadiusTrue when the camera is inside a region's runtime generation radius. Read it together with runtimeRadiusSource.
runtimeRadiusSourceextent (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.
buildStampThe Terraformer's LastBuildMethod at capture time. A result whose stamp does not match the build you meant to judge is void.
problemEmpty on a clean, settled capture. When several notes apply they are joined into one string with a vertical bar between them.

Camera derivation, DeriveCameras

FieldMeaning
shotIdThe shot this camera is for.
locationThe derived position.
rotationThe 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.
groundZThe ground height used: the higher of a downward trace and the tallest placed instance within 500 cm.
groundSourcetrace, 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.
problemThe 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.

ToolTextMeaning
Graph toolsOKDone and saved.
Graph toolsNo UPCGGraph at '<path>'.The path does not load as a PCG graph.
Graph toolsGraph '<path>' has no parameter '<name>'.SetGraphParameterValue or WireGraphParameterToPin needs an existing parameter.
Graph toolsNode index <n> out of range (<count> nodes).TargetNodeIndex is outside the graph's node list.
Graph toolsEdge <param> -> pin '<label>' was refused - check the pin label.The graph rejected the connection. The call returns before saving.
Graph toolsUnsupported type '<type>' (Double|Int|Bool|Vector).AddGraphParameter accepts only those four types.
Graph toolsParameter 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.
AddLandscapeTargetLayerempty stringSuccess.
AddLandscapeTargetLayerCould not load a LandscapeLayerInfoObject at '<path>'.Give the full object path of a layer-info asset.
AddLandscapeTargetLayerNo ALandscapeProxy found in the editor world.The open level has no landscape.
PaintBiomeLayersDryRun: <n> biomes (<names>), landscape <w>x<h> verts, ownership=<source>.What a real run would do. <source> is resolved biome map or region bounds.
PaintBiomeLayersPainted <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.
PaintBiomeLayersNo resolved biome map and no AgenticBiomeRegion actors - nothing to derive paint from.The level has nothing to derive ownership from.
BuildBiomesFromPaintComposed <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.
BuildBiomesFromPaintNo biome in BiomeMapBiomes declares a LandscapeLayerName the landscape carries - nothing to compose.Set LandscapeLayerName on the biomes, and paint those layers first.
PaintLayerRectPainted '<layer>'=<weight> over verts [..]..[..] (<n> verts); final-map readback: <a>/<b> match.<a> of <b> vertices read back as expected.
PaintLayerRectLandscape has no layer '<name>'.Add the layer first with AddLandscapeTargetLayer or PaintBiomeLayers.
PaintLayerRectRectangle does not overlap the landscape.The world rectangle misses the landscape.
Landscape toolsNo landscape in this level.Landscape-only tools do nothing on a MeshTerrain level.
DrawSplineBiomeDrawSplineBiome: '<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).
DrawSplineBiomeDrawSplineBiome: REFUSED - <reason>No or several Terraformers, a biome that does not load, or fewer than 3 points or unresolved terrain.
DrawSplineBiomeDrawSplineBiome: '<region>' spawned but cannot generate: <reason>.The region was created but its spline is unusable. The region stays in the level.
SetRuntimeAssetScaleSet Scale=(x, y, z) on <n> rows of '<asset>'; saved=<true or false>; row0 readback=(x, y, z).Check saved.
ImportHeightmapTerrainImported '<file>' as MegaMesh '<label>' (<w>x<h> quads over <x>x<y>x<z>, <n> attached actors, z-offset <z>).Success.
ImportHeightmapTerrainImport FAILED: <importer error>Epic's importer rejected the file or the sizes.
ImportHeightmapTerrainImportHeightmapTerrain unavailable: this editor was built without the optional MeshPartition importer. ...The plugin was compiled without Mesh Partition.
BuildMeshTerrainA JSON object success, world, compiledSectionsBefore, compiledSectionsAfter, errorsuccess 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.
BuildMeshTerrainRefusing: not an editor world (PIE/game world active).Stop Play In Editor first.
BuildMeshTerrainRefusing: '<world>' is not a World Partition world; ...The Mesh Partition builder works only on World Partition levels.
BuildMeshTerrainRefusing: '<world>' has no MeshPartition actors to build.Nothing to build.
BuildMeshTerrainRefusing: <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.
BuildMeshTerrainRefusing: a MeshTerrain build is already in flight.Wait for the running build.
BuildMeshTerrainMesh Partition build FAILED, ... did not reach completion, ... reported failures or ... produced no compiled sectionsThe 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: SetRuntimeAssetScale rescales a runtime template, the PCG graph-parameter tools reach graph parameters, and SetSpecies writes 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.
  • InspectBiome returns a summary view of each row, not every field. Read a full row in the Details panel before replacing it with SetSpecies.
  • BuildLevel repeats the builder the Terraformer last recorded, so it cannot start a level that has never been built. Use BuildLevelAs with the builder you want for the first build. BuildLevelAs does 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 is Unknown but the level already has regions or placed instances. To change a built level's builder, clear the level deliberately first.
  • VerifyLevel counts 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.