Orrery Terrain · changelog
Changelog
All notable changes to Orrery Terrain. Format after Keep a Changelog. Versions follow the versioning policy.
Each entry marks API changes with the stability level: stable, experimental, internal.
Unreleased
Added
- A join cache for reconnects: a client keeps a copy of the edited ground on disk, and when the player comes back the server sends only what that copy does not hold. Every byte taken from the copy is checked against the server’s hashes, and a copy that cannot be used falls back to the full stream, saying why in the log. New: the network settings Join Cache (on) and Join Cache Megabytes (2048), the stat Join Cache Bytes and
ITerrainNetToServer::SendJoinHeld(a custom transport must implement it). Net version 6 and join version 6: a client and a server on another build refuse each other withVersionMismatch. experimental
Changed
- An edit now asks for the whole ground its bake needs, up to about 720 m away, so the residency radius no longer decides whether ground near a plate or corridor bakes. A held plate or corridor request loads its own ground, and ground waiting for its bake asks for what is missing and lets it go afterwards. New: the terrain setting Max Bake Request Tiles (200), the network setting Max Edit Ground Tiles (200),
GetBakeWaitandEOrreryTerrainBakeWait, and three stats. experimental - A server now keeps the ground resident around each player’s reported view and pawn, out to the new network setting Server Residency Radius (1000 m; 0 turns it off). A dedicated server no longer streams around player cameras. experimental
- The docs of
ExactOnlyandCoarseare corrected:ExactOnlyis the answer for server gameplay.Coarseis not the same on every machine: it omits plates and corridors on a dedicated server, on the mesh tier and with the far field off. The code did not change. stable - Every async node now gives its failure output the same pins as its success output, so On Failed shows why in Blueprint (a latent node only shows the pins of its first output). On Ready passes
ReasonNone, a new first value ofEOrreryTerrainAsyncFailure. Bind C++ handlers with the new signatures, one delegate type per node: stable- Wait For Terrain Ground, Wait For Terrain Editable:
FOrreryTerrainWaitDelegate (Reason)on On Ready and On Failed. - Sample Ground Exact and Sample Ground Batch (Async):
(Sample, Reason)and(Samples, Reason); On Failed passes a NoData sample or no samples. - Commit Plate, Commit Corridor and Undo Construction (Async):
(Result, Reason); On Failed passes a refused result whoseReasontext says why when the terrain gave one. - Save Terrain To Slot (Async):
FOrreryTerrainSaveDelegate (Ref, Result, LostCodes, Message)on both outputs, replacingFOrreryTerrainSavedDelegateandFOrreryTerrainSaveFailedDelegate. - Load Terrain From Slot (Async):
FOrreryTerrainLoadDelegate (Result)on both outputs; On Completed passesOk.
- Wait For Terrain Ground, Wait For Terrain Editable:
- Rebuild Spline Feature (Async):
(Result, Reason)on both outputs, as Commit. Stamp Terrain (Async):FOrreryTerrainStampDelegate (Result, Reason, Message)on On Completed, On Refused and On Failed; On Failed repeats On Refused’s words. experimental - Get Ground Height Accurate’s
Locationand Save Terrain To Slot (Async)’sOptionstake a default in Blueprint: type the location on the node, and leave Options unwired for the default options (every feature kept). stable - More Blueprint pins take a default when left unwired, so a node compiles without a helper node: the location and direction pins of Sample Ground, Get Ground Height, Raycast Ground, Get Ground Height Range, Get Grade Along, Get Edit Access At, Wait For Terrain Editable and Sample Ground Exact (Async); the location lists of Sample Ground Batch and Wait For Terrain Ground and Sample Ground Batch (Async); the sample of Get Paint Weight and Get Dominant Paint Layer; the splat of Set Splat; the options of Save Terrain To Bytes With Options. Pins that carry a shape, a brush, a payload or a handle (plates, corridors, brushes, undo tokens, save refs, record bytes) still need a wire, because an unwired default there would be an empty shape or a silent edit. The async nodes’ delegate outputs now have a Category in the details panel. No C++ signature changed. stable
- Under Quality=Manual,
FOrreryTerrainRenderSettings::FarDetailnow defaults to Balanced (Low’s far ring), not Low (no ring). Unreal does not save a property equal to its default, so on maps saved before this change a terrain whose far detail was explicitly Low now reads as untouched and draws the ring. Set Low again to remove it. stable - Grass: the per-frame cost no longer grows with the number of grass varieties and resident chunks when no grass is in range.
Removed
- The delegate types
FOrreryTerrainReadyDelegate,FOrreryTerrainFailedDelegate,FOrreryTerrainSavedDelegate,FOrreryTerrainSaveFailedDelegate,FOrreryTerrainLoadFailedDelegate,FOrreryTerrainStampDoneDelegateandFOrreryTerrainStampRefusedDelegate, replaced by the per-node types above.UOrreryTerrainAsyncBaseno longer declaresOnFailed; each node class does. stable
1.0.0 Coming to Fab
First release. Engine: Unreal Engine 5.8. Platforms: Win64 (multiplayer tested on a listen server with four players). The runtime modules build for Linux, but no Linux server has been run, so Linux is not supported yet.
Added
- Texture brushes. A Terrain Brush data asset bakes a texture or a single-band TIFF into a brush mask (8 to 2048 samples a side, 8 or 16 bits). A mask scales a brush’s strength per post, with angle, mirror, a square footprint and an aspect ratio. A terrain holds up to 64 MiB of masks, registered with Register Brush, Register Brush Set or Register Brush Mask From Pixels, and not saved. experimental
- Height stamps. A Stamp brush places a mask as ground, with the blends
Add,Max,MinandBlend, as Stamp Terrain (Async) and Stamp At, under their own sculpt limits (Max Stamp Radius, Max Stamp Height, Max Stamp Tiles, Stamps). experimental - Splat paint. A Terrain Splat data asset paints up to four paint layers from one picture, in one stroke, also along a drag. experimental
- Bicubic mask sampling for native callers, and non-square masks (aspect). Both sample with integer arithmetic only, the same on every machine. experimental
- Brush masks, stamps and splats in multiplayer (net version 5, join version 5). The server sends a mask once, before the first step that uses it, and to late joiners. A game can let players upload masks: off by default, enabled by Can Add Brush Mask on the edit policy, with a per-player quota, a size cap, a paced upload and the refusals
UploadsDisabled,UploadQuota,UploadTooLarge,UploadCorrupt,UploadTimedOutandUnknownMask. New network settings: Max Stamp Tiles Per Second, Max Upload Masks Per Author, Max Upload Kilobytes Per Author, Max Upload Mask Kilobytes, Mask Upload Kilobytes Per Second. experimental - The editor’s brush palette, Brush Mask settings, texture import and Stamp tool. The Stamp tool previews the ground it would make as a lit surface of up to 65,536 points with a 65 x 65 wire grid, and shows what it would cut through the ground. The plugin ships a starter set, TerrainStarterBrushes: six strength masks and six height stamps, generated by a script.
- The brush-target extension V2 (
IOrreryTerrainBrushTargetV2,OrreryTerrainEdExtensionV2.h), beside the unchanged V1. It hands your brush target the mask with every dab. The editor tools list registered targets in an Extension Targets section. experimental - Live spline features. The Terrain Spline Feature component ties a corridor (open spline) or a plate (closed spline) to a spline and replaces it in place: Rebuild, Rebuild Spline Feature (Async), Remove Feature, Evaluate, Is Stale, Get State. In the editor it follows your drag, with one undo. In multiplayer only the server builds, a client’s request goes through the edit policy, and every machine, late joiners included, answers Is Stale for its own spline. experimental
Save format
- Sculpt record version 5 (72 bytes), which still reads versions 2 to 4. Net version 5 and join version 5: a client and a server on another build refuse each other with
VersionMismatch. Saves are unchanged; masks are never saved.
Determinism
- A stroke with no mask writes the same ground, and gives the same state hashes, as before record version 5.