# Unreal Engine 5.7 — PCG (Procedural Content Generation)

**Last verified:** 2026-02-13
**Status:** Production-Ready (as of UE 5.7)
**Plugin:** `PCG` (built-in, enable in Plugins)

---

## Overview

**Procedural Content Generation (PCG)** is Unreal's node-based framework for generating
procedural content at massive scale. It's designed for populating large open worlds with
foliage, rocks, props, buildings, and other environmental detail.

**Use PCG for:**
- Procedural foliage placement (trees, grass, rocks)
- Biome-based environment generation
- Road/path generation
- Building/structure placement
- World detail population (props, clutter)

**DON'T use PCG for:**
- Gameplay logic (use Blueprints/C++)
- One-off manual placement (use editor tools)

**⚠️ Note:** PCG was experimental in UE 5.0-5.6, became production-ready in UE 5.7.

---

## Core Concepts

### 1. **PCG Graph**
- Node-based graph (similar to Material Editor)
- Defines generation rules

### 2. **PCG Component**
- Placed in level, executes PCG Graph
- Generates content in defined volume

### 3. **PCG Data**
- Point data (positions, rotations, scales)
- Spline data (paths, roads, rivers)
- Volume data (density, biome masks)

### 4. **Nodes**
- **Samplers**: Generate points (Grid, Poisson, Surface)
- **Filters**: Remove points based on rules (Density, Tag, Bounds)
- **Modifiers**: Transform points (Offset, Rotate, Scale)
- **Spawners**: Instantiate meshes/actors at points

---

## Setup

### 1. Enable Plugin

`Edit > Plugins > PCG > Enabled > Restart`

### 2. Create PCG Volume

1. Place Actors > Volumes > PCG Volume
2. Scale volume to desired generation area

### 3. Create PCG Graph

1. Content Browser > PCG > PCG Graph
2. Open PCG Graph Editor

---

## Basic Workflow

### Example: Forest Generation

#### 1. Create PCG Graph

**Node Setup:**
```
Input (Volume)
  ↓
Surface Sampler (sample volume surface, points per m²: 0.5)
  ↓
Density Filter (use texture mask or noise)
  ↓
Static Mesh Spawner (tree meshes)
  ↓
Output
```

#### 2. Assign Graph to Volume

1. Select PCG Volume
2. Details Panel > PCG Component > Graph = Your PCG Graph
3. Click "Generate" button

---

## Key Node Types

### Samplers (Point Generation)

#### Grid Sampler
- Regular grid of points
- Configure:
  - **Grid Size**: Distance between points
  - **Offset**: Random offset per point

#### Poisson Disk Sampler
- Random points with minimum distance
- Configure:
  - **Points Per m²**: Density
  - **Min Distance**: Spacing between points

#### Surface Sampler
- Points on mesh surfaces or landscape
- Configure:
  - **Points Per m²**: Density
  - **Surface Only**: Only surface, not volume

---

### Filters (Point Removal)

#### Density Filter
- Remove points based on density value
- Input: Texture or noise
- Use for: Biome masks, clearings, paths

#### Tag Filter
- Filter points by tag
- Use for: Conditional spawning

#### Bounds Filter
- Keep only points within bounds
- Use for: Limiting generation to specific areas

---

### Modifiers (Point Transformation)

#### Rotate
- Randomize point rotation
- Configure:
  - **Min/Max Rotation**: Rotation range per axis

#### Scale
- Randomize point scale
- Configure:
  - **Min/Max Scale**: Scale range

#### Project to Ground
- Snap points to landscape surface

---

### Spawners (Mesh/Actor Instantiation)

#### Static Mesh Spawner
- Spawn static meshes at points
- Configure:
  - **Mesh List**: Array of meshes (random selection)
  - **Culling Distance**: LOD/culling settings

#### Actor Spawner
- Spawn Blueprint actors at points
- Use for: Gameplay actors, interactive objects

---

## Data Sources

### Landscape
- Use landscape as input for sampling
- Automatically projects to landscape height

### Splines
- Generate content along splines (roads, rivers, paths)
- Example: Trees along path

### Textures
- Use textures as density masks
- Paint biomes, clearings, areas

---

## Biome Example (Mixed Forest)

### Graph Setup

```
Input (Landscape)
  ↓
Surface Sampler (density: 1.0)
  ↓
┌─────────────────┬─────────────────┐
│ Tree Biome      │ Rock Biome      │
│ (density > 0.5) │ (density < 0.5) │
├─────────────────┼─────────────────┤
│ Tree Spawner    │ Rock Spawner    │
└─────────────────┴─────────────────┘
  ↓
Merge
  ↓
Output
```

---

## Spline-Based Generation (Road with Trees)

### 1. Create PCG Graph

```
Spline Input
  ↓
Spline Sampler (sample along spline)
  ↓
Offset (offset from spline path)
  ↓
Tree Spawner
  ↓
Output
```

### 2. Add Spline Component to PCG Volume

1. PCG Volume > Add Component > Spline
2. Draw spline path
3. PCG Graph reads spline data

---

## Runtime Generation

### Trigger Generation from C++

```cpp
#include "PCGComponent.h"

UPCGComponent* PCGComp = /* Get PCG Component */;
PCGComp->Generate(); // Execute PCG graph
```

### Stream Generation (Large Worlds)

- PCG automatically streams with World Partition
- Only generates content in loaded cells

---

## Performance

### Optimization Tips

- Use **culling distance** on spawned meshes (LOD)
- Limit **density** (fewer points = better performance)
- Use **Hierarchical Instanced Static Meshes (HISM)** for repeated meshes
- Enable **streaming** for large worlds

### Debug Performance

```cpp
// Console commands:
// pcg.graph.debug 1 - Show PCG debug info
// stat pcg - Show PCG performance stats
```

---

## Common Patterns

### Forest with Clearings

```
Surface Sampler
  ↓
Density Filter (noise texture with clearings)
  ↓
Tree Spawner (pine, oak, birch)
```

---

### Rocks on Steep Slopes

```
Landscape Input
  ↓
Surface Sampler
  ↓
Slope Filter (angle > 30°)
  ↓
Rock Spawner
```

---

### Props Along Road

```
Spline Input (road spline)
  ↓
Spline Sampler
  ↓
Offset (side of road)
  ↓
Street Light Spawner
```

---

## Debugging

### PCG Debug Visualization

```cpp
// Console commands:
// pcg.debug.display 1 - Show points and generation bounds
// pcg.debug.colormode points - Color-code points
```

### Graph Debugging

- PCG Graph Editor > Debug > Show Debug Points
- Visualize points at each node in the graph

---

## Migration from UE 5.6 (Experimental) to 5.7 (Production)

### API Changes

```cpp
// ❌ OLD (5.6 experimental API):
// Some nodes renamed, API unstable

// ✅ NEW (5.7 production API):
// Stable node types, documented API
```

**Migration:** Rebuild PCG graphs using stable 5.7 nodes. Test thoroughly.

---

## Limitations

- **Not for gameplay logic**: Use Blueprints/C++ for game rules
- **Large graphs can be slow**: Optimize with filters and density reduction
- **Runtime generation overhead**: Pre-generate when possible

---

## Sources
- https://docs.unrealengine.com/5.7/en-US/procedural-content-generation-in-unreal-engine/
- https://docs.unrealengine.com/5.7/en-US/pcg-quick-start-in-unreal-engine/
- UE 5.7 Release Notes (PCG Production-Ready announcement)
