Skip to content
Brass Orrery

Orrery Terrain · plugin for Unreal Engine 5.8

Terrain that players dig, build on and save, in a shipping game

A heightfield terrain you sculpt, paint and build on while the game runs. Plates and corridors cut and fill the ground, every edit can be undone and saved, and a multiplayer session replicates the edits to everyone who joins.

  • Unreal Engine 5.8
  • Windows 64-bit
  • C++ source included
  • Blueprint and C++
  • Listen-server multiplayer
The Alpine_Hero sample map from above
Alpine_Hero sample map. Elevation from swissALTI3D, © swisstopo.

See it work

The plugin at work, captured in Unreal Engine on the Alpine_Hero sample map.

The trailer is captioned in the video and has no sound. It plays only when you press play; nothing of it loads before. Open the trailer file

What you can build with it

Four ways studios use a ground that changes while the game runs. Each links to the part of the guide that shows it.

Games that dig and build

Players raise, lower, smooth and flatten the ground, and undo it stroke by stroke.

City builders and colony sims

Level a site for each building with a plate, and keep the changed ground in the player's save.

Transport and infrastructure

Cut and fill roads, rail beds and canal banks along a spline, with the cut and fill volumes before you commit.

Real-world terrain from elevation data

Import GeoTIFF elevation models and heightmaps once in the editor. The Alpine_Hero sample is 64 by 64 km of Switzerland.

Version 1.0 has no caves or overhangs, because the ground is a heightfield, and no Nanite terrain. What 1.0 does not do

Features

Each part links to the chapter of the guide that teaches it. Every picture is from the samples project.

Sculpt at runtime

Players shape the ground while the game runs

Raise, lower, smooth, flatten and paint, stroke by stroke, with the ready-made brush tool or from your own Blueprint or C++. Every stroke can be undone and redone, and 32 strokes are kept by default. Texture brushes and height stamps are Experimental.

Sculpt at runtime

A grassy hillside above a lake, with pale patches of bare rock where the brush has worked.
The brush raising and lowering a ridge above the lake, stroke by stroke, while the game runs. Alpine_Hero, © swisstopo.

Plates and corridors

Yards, roads and rail beds that cut and fill the hill

A plate is a flat area, a corridor a road, rail bed or canal bank along a spline. The terrain cuts the hill, fills the valley and slopes the sides back to the natural ground. Evaluate gives the cut and fill volumes before you commit, and a committed feature can be undone or removed later.

Plates and corridors

A road bench cut into a steep grassy slope, the cut and fill either side of it in bare earth.
A switchback road climbing a grassy, forested slope below a mountain.
A road cut into a steep slope (left), and switchback roads cut and filled into the hillside (right). Alpine_Hero, © swisstopo.

Large worlds

Worlds tested at 64 by 64 km, with the far ground always drawn

Tested at 64 by 64 km with a 1 m cell. Full-resolution tiles stream in around the cameras and the invokers you register (2000 m by default), and a far field draws the rest from an always-loaded coarse copy.

Concepts

A valley floor of meadow and forest, a road running down it between steep mountain walls.
A fly-over of the Alpine_Hero world, the ground drawn from the foreground to the far ranges. Alpine_Hero, © swisstopo.

Paint layers

Paint ballast, gravel, grass and rock onto the ground

Up to four paint layers per ground point, from 256 layer ids, painted with the brush tool, from Blueprint or from C++. Use the default material with its automatic rules, or your own material with the plugin's layer blend.

Materials and layers

An alpine meadow with a long dark strip of rock painted across it, a gravel road below it and two soil patches.
A gravel track beside a ballast bed through a forested valley, with gravel verges and the meadow beside.
Rock, gravel and soil painted onto the meadow (left), and ballast, gravel verges and batters painted along the works (right). Alpine_Hero, © swisstopo.

Real elevation data

Start from real ground

Import 16-bit PNG and RAW heightmaps, GeoTIFF elevation models, or a Landscape once, in the editor. The Alpine_Hero sample is 64 by 64 km of the Jungfrau region at 1 m, from swisstopo's swissALTI3D.

Import a heightmap

A rocky massif risen from a forested plain between two lakes, with mountains behind.
A height stamp cut from the real Finsteraarhorn, stamped into the plain at Interlaken while the game runs; the loop shows it rising. Stamps are Experimental. Alpine_Hero, © swisstopo.

Multiplayer

One ground for every player, with no network code of yours

On a listen server the server keeps one ordered log of edits and sends it to every client, and every machine ends with the same ground. A player who joins late receives the edited ground, then follows live. Listen servers only in 1.0, and the net layer is Experimental.

Multiplayer

The listen server's window: two ridges painted with rock on a meadow, and the brush ring.
The client's window: the same two painted ridges.
The Multiplayer sample, the same painted ridges in the listen server's window and in the client's.

If the ground never changes during play, use Landscape. What this plugin is good at, what it is not for, and how it compares with Landscape, row by row. When it fits

The samples project

Opened as its own Unreal project. The Samples zip holds six maps, each with a chapter of the guide, and is a few megabytes. The Orrery Alpine Hero Pack is a second, optional download that adds the Alpine_Hero map, 64 by 64 km of the Swiss Alps; unzip it onto the project.

DownloadSizeSHA-256Link
Samples (OrreryTerrainSamples.zip)
The project with six maps: QuickStart, Terraforming, Earthmoving, RealWorldDEM, World64 and Multiplayer. Open it in Unreal Engine 5.8 with the plugin installed.
about 4 MBPublished with the fileNot yet published
Orrery Alpine Hero Pack (OrreryAlpineHeroPack.zip)
Optional. The Alpine_Hero map, with its 64 km elevation store, foliage, far terrain and media sequences. It unzips onto the Samples project and needs it.
about 5.75 GBPublished with the fileNot yet published

Let a player dig

One brush step under the sculpt limits, from C++. The same calls exist as Blueprint nodes.

Digger.cpp
#include "OrreryTerrainSubsystem.h"
void ADigger::Dig(const FVector& Where)
{
UOrreryTerrainSubsystem* Terrain = GetWorld()->GetSubsystem<UOrreryTerrainSubsystem>();
if (!Terrain || Terrain->GetEditAccessAt(Where, 500.0) != EOrreryTerrainEditAccess::Allowed) return;
FOrreryTerrainBrushBP Brush;
Brush.Kind = EOrreryTerrainBrushKind::Lower;
Brush.Centre = Where;
Brush.Radius = 500.0;
Brush.Strength = 30.0;
const int64 Stroke = Terrain->BeginStroke();
if (Stroke == 0) return;
Terrain->ApplyBrush(Stroke, Brush);
Terrain->EndStroke(Stroke);
}
A dig, its undo and its redo restore the ground exactly.

This example in the guide, with the answers each call can give

Measured figures

What the plugin itself costs, part by part, in milliseconds and megabytes. Every figure comes with its machine, build and date. There is no frame rate here, because it would mostly measure the rest of your project.

MeasurementResultConditions
Load a 64 km world with edits, and verify it1.54 sSave file 2.061 GB. Measured on the machine below with nothing else running. 2026-10-21.
A player joins during another player's stroke0.47–0.58 sListen server and clients on one machine. 2026-10-20.
Network use per sculpting player136 B/sFour players sculpting at once, against a budget of 2,048 B/s per sculptor. Same session, 2026-10-20.
Grass instances built at the reference view117,951173 components at 1422 × 800 and 135 % screen percentage. Grass is Experimental. 2026-10-18.

Machine for every row unless the row names another, Intel Core i7-12700H, NVIDIA GeForce RTX 3060 Laptop GPU (6 GB), 32 GB RAM, Windows 11.

Graphics card time the terrain adds

Over the same view with no terrain, in a Development build with Shader Model 6, on the 64 km example world with a plain sky and the default material, 2026-10-31.

PartCostConditions
Low, 1920 × 10802.00 msCamera 2 m above a meadow. Base pass 1.61 ms, depth prepass 0.50 ms.
Epic, 1920 × 10806.10 msSame view. The terrain's own drawing is 2.04 ms. The rest is shadows and Lumen on the pixels of ground, 2.66 ms of it in lighting, so the terrain pass alone is not the total.
Epic, 2560 × 14408.18 msSame view, with 1.78 times the pixels.
Epic, 1920 × 1080, from the air4.81 msCamera 300 m above a valley.
Cinematic, 1920 × 108022.03 msSame view as Low. 17.62 ms of it is lighting. On the high side, because the card slowed from 1702 to 1582 MHz at 87 C.

Thread time

In the same build and world at Epic, with nothing else running, 2026-10-31. The plugin starts no threads of its own. Its background work runs on Unreal's task system, with limits you can change.

PartCostConditions
Render thread the terrain adds1.05 ms4.64 ms with terrain, 3.58 ms without, at 1920 × 1080 from the meadow camera.
Game thread, camera still2.03 ms1.68 ms on the same map with no terrain, no sample pawn and no sample HUD.
A sculpt step, radius 20 m0.146 msGame thread, during a scripted drag at a 2 m cell size. 0.156 ms beside a corridor.
A height stamp, radius 1 km10.8 msGame thread, with the result ready in 14.0 ms on 20 logical cores.
A corridor commit, 1 km23.03 msGame thread, straight, at a 1 m cell size. The 300 m preview takes 1.76 ms.

Memory and disk

On the same world, with a 3 km residency radius.

PartCostConditions
Video memory the terrain holds386.2–517.1 MiB386.2 MiB at Low, 397.8 MiB at Epic, 517.1 MiB at Cinematic. About 150 KiB per loaded tile, and the rest is the detail ring, atlases and pools.
System memory the process adds547–558 MiBWorking set over the same map with no terrain, at each level. It includes the tiles, their collision and the sample map's objects.
A save with no edits312 BA 4 km square at a 1 m cell size.
A save after 1,000 brush steps18,432 BSame map, 23 tiles touched, with a 20 m radius brush lifting 15 cm a step.
A save after 10,000 brush steps174,488 BSame map, 227 tiles touched.

One scene against Landscape

Whole-frame graphics card time, 1920 × 1080 rendered, with Lumen and virtual shadow maps off, two paint layers and no painted weights, 2026-10-28. This is one comparison with these conditions, not a claim that either is faster in general.

GroundWhole frameConditions
Landscape, ground-level camera4.85–4.88 ms2.16 ms of it is the frame with no ground at all.
Orrery Terrain at Epic, same camera4.45 msAt Cinematic it costs 5.56 ms, more than Landscape.

Machines it ran on

These are what we tested, not a line between what works and what does not.

MachineLevelsConditions
Core i7-12700H, 32 GB RAM, GeForce RTX 3060 Laptop GPU 6 GBAll levels1920 × 1080 and 2560 × 1440. Lumen and virtual shadow maps at Epic and Cinematic, which need Shader Model 6.
Core i7-6700HQ, 16 GB RAM, GeForce GTX 960M 4 GBLow, Medium1920 × 1080 with Shader Model 5, so with no Lumen and no virtual shadow maps. 1.1 to 1.4 GB of video memory in use for the whole scene.

Costs by pass and by part, threads, and how to read them on your own PC with `stat terrain`, in any build Plugin costs in the guide

Prices

Sold on Fab under Fab's Standard License, per seat. You pick the tier on Fab by your own or your company's gross revenue in the last 12 months, as Fab's license defines it.

Personal$249.99Your gross revenue was $100,000 or less in the last 12 months.
Professional$799.99Your gross revenue was above $100,000 in the last 12 months.
Included in the priceThe C++ source, the samples project, the guide and the API reference, updates, and support. The licence does not expire, and you keep the source and may keep using, modifying and shipping it even if Brass Orrery stops developing the plugin. What each version number promises.

Buying and seats

Orrery Terrain is sold on Fab under Fab's Standard License. Fab sells code plugins per seat, and that is Fab's rule for every code plugin on Fab, not a term of ours.

“Code plugins ... are offered to you on a per-seat basis and may only be used by the number of users that you have purchased licenses for.”

  • Each user needs a seatEach person who uses the plugin needs their own purchase.
  • One purchase covers all your projectsOne purchase covers all your own projects.
  • Sharing the sourceYou may share the source with colleagues and contractors who also hold a seat (sections 5a and 5b of the EULA).
  • Shipping a gameThe compiled plugin ships inside your game.
  • PaymentPrices are in US dollars. You buy and pay on Fab, and Fab handles the payment and VAT.
  • Personal or ProfessionalYour own or your company's gross revenue in the last 12 months decides the tier, as Fab defines it. Both tiers grant the same rights.
Coming to Fab

Refunds go through Fab Support under Fab's refund policy. List prices in US dollars.

Support and versions

Contact

Supported

  • Engine versionsUnreal Engine 5.8. Each new engine version is supported within 30 days of its release.
  • PlatformsWindows 64-bit, built and tested, with multiplayer on a listen server. The Linux runtime modules build, but no Linux server has been run, so Linux is not supported yet. Mac, mobile and consoles are not supported.

Support, versioning and saves in full · Changelog · Limits