Skip to main content

SA PCG metadata reference

Attribute names are case-sensitive. Use Data-domain filters for whole paths/lots and element filters after sampling for individual points. PCG data tags are separate from metadata attributes; use Filter Data By Tag for them.

Streets and lots​

AttributeTypeMeaning
SA_SourceActorStringOwning source actor name.
SA_LotIndexIntLot order in the current source/result.
SA_LotEmptyBoolEffective lot config suppresses surfaces/spawns.
SA_LotAreaFloatXY polygon area in cm².
SA_LotSeedIntStable per-lot seed token.
SA_LotSurfaceMaterialSoft Object PathResolved visible/top lot material.
SA_LotZoneNameLot Zone actor, per-lot override, or default lot zone tag.
SA_IsExteriorBoolSubdivided lot touches its source boundary.
SA_IntersectionNodeIntGraph node index owning an intersection.
SA_CorridorIndexIntResolved road corridor index.
SA_RoadSideNameLeft or Right.
SA_CrossingIndexIntRoad-mouth crossing order.
SA_RoadWidthFloatFull width at the crossing.
SA_ConfigIndexIntStreets Street Config index.
SA_DistanceAlongSplineFloatCumulative world distance on centerlines or effective splines.
SA_StreetConfigIndexIntStreet Config that built the road a lot edge follows.
SA_LotPerimeterFloatBoundary length in cm.
SA_LotWidthFloatFrontage width of the lot, in cm.
SA_LotDepthFloatDepth back from the frontage, in cm.
SA_LotForwardVectorDirection the lot faces, away from its street.
SA_LotFrontageCountIntHow many streets the lot fronts onto.
SA_IsCornerLotBoolLot fronts two or more streets that meet at a corner.
SA_StreetFacingBoolPer boundary point: this edge runs along a street.
SA_AtIntersectionBoolPer boundary point: this point sits at an intersection.
SA_TouchesBoundaryBoolPer point: the edge starting here lies on the source boundary. On Gap Outlines this marks an alley mouth; on alley sides it is false.
SA_CutGapFloatAlley width on Cut Lines and Gap Outlines. 0 when there is no gap.
SA_CutPassIntWhich subdivision pass produced this cut line.
SA_JunctionDegreeIntHow many cut lines meet at a Cut Junction point.
SA_JunctionOnBoundaryBoolThe Cut Junction sits on the lot edge rather than inside it.
SA_IslandAreaDoublePlan-view area of a boundary island, after facet thinning.

Lot shape metrics - SA_LotWidth, SA_LotDepth, SA_LotForward, SA_LotFrontageCount, SA_IsCornerLot - are what make "put shops on corner lots and houses elsewhere" a one-node filter.

Effective spline attributes​

SA Get Spline can write:

AttributeTypeMeaning
SA_ActorTypeNameWall, Building, Curve, or supported source kind.
SA_PresetNameEffective DataTable row/preset name when available.
SA_SeedIntResolved actor seed.
SA_BakedBoolSource actor bake state.
SA_SplineClosedBoolEffective path is closed.
SA_MirrorModeNameResolved mirror/bisect mode.
SA_StackIndexIntWall depth: root 0, child 1, and so on.
SA_StackOffsetVectorEffective cumulative connected-layer offset.
SA_WallHeightFloatEffective wall/profile height.
SA_NumFloorsIntEffective floor count.
SA_SegmentIndexIntSegment index for per-control-point/segment semantics.
SA_SegmentLengthFloatSegment world length.
SA_SegmentDirectionVectorWorld direction.
SA_CornerAngleFloatTurn angle at the point.
SA_NormalizedDistanceFloatDistance along path normalized 0–1.

Facade frames​

AttributeTypeMeaning
SA_SourceActor / SA_SourceType / SA_PresetString/Name/NameSource identity and resolved type/preset.
SA_WallId / SA_ParentWallIdNameBuilding hierarchy IDs.
SA_PathIndex / SA_StackIndexIntEffective path and connected-layer depth.
SA_StackOffsetVectorLayer offset.
SA_WallSide / SA_FacadeFaceNameSpline-relative side and semantic exterior/interior face.
SA_SegmentIndexIntOwning wall segment.
SA_FloorIndex / SA_LocalFloorIndexIntGlobal stack floor and floor within the current preset.
SA_DistanceAlongWallDoubleCell position along the wall run.
SA_NormalizedU / SA_NormalizedVDoubleNormalized position over the resolved face.
SA_NormalizedFloorVDoubleNormalized vertical position within the current floor.
SA_CellSizeVectorFitted cell size in centimeters.

Floor and roof samples​

AttributeTypeMeaning
SA_SourceActorStringSource Wall, Building, or Curve.
SA_SurfaceTypeNameFloor or Roof.
SA_SurfaceFloor / SA_SurfaceRoofBoolConvenient type flags.
SA_FloorIndexIntSampled floor index.
SA_IsTopFloorBoolSample belongs to the uppermost resolved floor.
SA_PresetNameSource preset.
SA_MaterialSoft Object PathSampled surface material.
SA_SlopeFloatSurface slope in degrees.

Polygon, prop, and spawn output​

AttributeTypeMeaning
SA_OffsetFloatSigned polygon offset applied.
SA_IslandIndexIntPolygon Merge island order.
SA_MeshSoft Object PathMesh selected/generated for Static Mesh Spawner By Attribute.
SA_ActorSoft Object PathActor class selected for Spawn Actor By Attribute.
SA_SpawnedActorSoft Object PathPCG-managed actor reference emitted in Components/Actors modes.
SA_PresetTagsName ArrayExact applicable Building/Wall Preset tags on generated piece, Dynamic Mesh, or actor-reference output.
SA_DistanceToSplineDoubleHorizontal or 3D distance computed by SA Orient To Spline.
SA_IsHoleBoolThis closed shape is the hole of a larger shape, not a shape of its own. Written on every output of the nodes that can emit holes, false on outlines, so a filter always finds it.
SA_PointCountIntHow many input points belong to a shape traced by SA Polygon From Points.
SA_PresetRowNameCustom Piece Preset row chosen by SA Set Custom Piece.
SA_PresetTableSoft Object PathThe DataTable that row lives in.
SA_ApplyToAllBoolThis piece point spreads to every run in reach instead of only the nearest.
SA_ActorClassSoft Object PathActor class resolved for a spawned piece.
SA_PCGManagedTagActor tag on everything PCG spawns for SA. Present so SA's own getters can ignore their output and never feed it back in - do not filter on it by hand.

Attribute inheritance through transforms​

Nodes that reshape lots pass attributes along rather than starting fresh, so a filter written against SA Get Lots still works after a subdivision.

SA Subdivide Lots emits its own SA_LotIndex, SA_LotArea, SA_LotSeed, and SA_IsExterior describing each sub-lot, and these override the parent's values of the same name. Every other Data-domain attribute of the parent lot rides through untouched - SA_LotZone, SA_StreetConfigIndex, SA_RoadWidth, SA_LotSurfaceMaterial, SA_SourceActor, and anything an upstream Add Attribute put there.

One consequence to keep in mind: inherited shape metrics still describe the parent lot. After a subdivision, SA_LotWidth, SA_LotDepth, SA_LotForward, SA_LotFrontageCount, and SA_IsCornerLot are the block's, not the sub-lot's.

SA Polygon Merge and SA Polygon Offset keep an attribute only when every input agrees on its value. Merging lots from two different Streets Networks drops SA_SourceActor; merging lots at all drops SA_LotIndex and SA_LotArea, because the island has no single answer.

Preset tags and filtering​

SA_PresetTags preserves the authored Name values and their component-level precision:

  • a standalone Wall piece carries its Wall Preset tags;
  • a Building piece carries the Building Preset tags plus only the Wall Preset tags that produced that component;
  • a Building actor-reference point carries only the Building Preset tags;
  • a Wall actor-reference point carries only the Wall Preset tags;
  • Curve output carries an empty array because Curve presets do not define Preset Tags.

In Data output, static-piece points store the array on each point. Each Dynamic Mesh stores it on the Data domain. Components/Actors reference points also expose the top-level array.

To keep individual pieces with a tag such as BaseFloor, use stock Array Contains on SA_PresetTags, then feed its result to Attribute Filter. To keep or branch a complete generated output by a top-level tag such as Small, use Filter Data By Tag. Dynamic Mesh outputs also carry their precise component tags as PCG data tags.

Do not rename these attributes in the middle of a shared graph without updating every filter and stock spawner. For a stable studio graph, wrap common SA branches in PCG subgraphs and expose only high-level parameters.