Skip to content
Brass Orrery

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 with VersionMismatch. 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), GetBakeWait and EOrreryTerrainBakeWait, 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 ExactOnly and Coarse are corrected: ExactOnly is the answer for server gameplay. Coarse is 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 Reason None, a new first value of EOrreryTerrainAsyncFailure. 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 whose Reason text says why when the terrain gave one.
    • Save Terrain To Slot (Async): FOrreryTerrainSaveDelegate (Ref, Result, LostCodes, Message) on both outputs, replacing FOrreryTerrainSavedDelegate and FOrreryTerrainSaveFailedDelegate.
    • Load Terrain From Slot (Async): FOrreryTerrainLoadDelegate (Result) on both outputs; On Completed passes Ok.
  • 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 Location and Save Terrain To Slot (Async)’s Options take 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::FarDetail now 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, FOrreryTerrainStampDoneDelegate and FOrreryTerrainStampRefusedDelegate, replaced by the per-node types above. UOrreryTerrainAsyncBase no longer declares OnFailed; 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, Min and Blend, 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, UploadTimedOut and UnknownMask. 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.