Important
The active copy now lives at codeberg.org/Heathen-Engineering/Unreal-DataLens-Foundation — please point your git remote, UPM manifest, or Gem reference there going forward. That's where new commits, releases, and issues actually happen now.
This GitHub copy is preserved as-is and still works for anyone already pointing at it, but it isn't receiving new updates. It will be archived (read-only) once every downstream package that depends on it has finished migrating too, not immediately.
Questions? Discord.
A cache-aware, column-oriented in-memory simulation store for Unreal Engine. Entities are rows, attributes are bit-packed columns, and updates run as branchless passes over native memory — a UGameInstanceSubsystem binding straight onto the DataLens Core C ABI, no P/Invoke marshalling layer in the way.
This plugin is the Unreal binding over the engine-agnostic native DataLens Core (C++17, Linux/Windows), vendored as a git submodule at Archive/extern/DataLens. The Core is where portability lives; each engine ships its own thin Foundation over it. Same substrate powers DataLens Foundation (Unity) and HATE on top.
Prefer a one-time purchase? Heathen's own storefront is live, direct source access at heathen.group/pricing, no sponsorship required.
Support Heathen by becoming a GitHub Sponsor. Sponsorship directly funds the development and maintenance of free tools like this, as well as our game development Knowledge Base and community on Discord.
Sponsors also get access to our private SourceRepo, which includes developer tools for O3DE, Unreal, Unity, and Godot.
Learn more or explore other ways to support @ heathen.group/kb
DataLens is a data-oriented simulation database. Instead of one UObject per entity, state lives in column-major native tables (GameplayTag-addressed), and a consumer works entirely through UDataLensSubsystem — a UGameInstanceSubsystem wrapping the Core's dl_store/dl_lens C ABI directly, no vendored prebuilt binary. The public surface:
| Member | Purpose |
|---|---|
CreateStore(Columns, PreallocRows) |
Declare the database — a set of typed columns (FDataLensColumn, built via OfFloat/OfInt32). |
AllocRow / FreeRow / SetValid / IsValid |
Row lifecycle within the store. |
SetFloat / GetFloat / SetInt32 / GetInt32 |
Per-cell reads/writes, by raw uint64 column id or by FGameplayTag convenience overload. |
CreateView(ColumnIds) |
Opens a read-only multi-column FDataLensView snapshot. |
RunSystemFloat(If) / RunSystemInt32(If) / RunSystemColumnFloat(If) / RunSystemCurvedFloat(If) |
Parallel column-wide Set/Add/Sub/Mul/Min/Max ops, unconditional, predicated, cross-column, or curve-transformed. |
GetRevision / SetRevision / BumpRevision / MarkColumnDirty |
Per-store replication revision tracking. |
Snapshot / CollectDelta(SinceRevision) / ApplyPayload |
Replication provider: a full baseline, a since-revision delta, and applying either as an authoritative commit — the wire primitives a netcode stack consumes; this plugin opens no socket and dictates no topology. |
No wrapper tag type — raw
uint64is the one true column/tag identity throughout the API.FGameplayTagstays the only real tag concept in Unreal (hierarchy, picker, authoring); every tag-taking method also has a canonicaluint64overload, withHashDataLensTag(FGameplayTag) -> uint64as the one-line stateless derivation (XXH3_64bits_withSeed(..., 0)overFGameplayTag::ToString()— bit-identical to Unreal's own nativeFXxHash64, and to every other engine's GameplayTags/Lexicon hash).
UDataLensBlueprintLibrary mirrors nearly all of the above as UFUNCTION(BlueprintCallable) static wrappers, taking FGameplayTag directly (already Blueprint-native) and reinterpreting every uint64 as int64 at the boundary (UHT can't reflect uint64 in a function signature at all). UDataLensSubsystem itself carries UCLASS(BlueprintType) so Blueprint can hold a reference obtained from "Get Game Instance Subsystem," but has no UFUNCTIONs of its own — all Blueprint-callable boundary conversion lives in the library, not the subsystem class. Not wrapped: CreateView/FDataLensView — move-only with a template GetRows<TRow>() zero-copy accessor, no Blueprint equivalent without a separate copying/marshalling design; SetFloat/GetFloat already cover single-cell Blueprint access.
- Unreal Engine 5.8 or compatible
- Linux or Win64, x86_64
- No plugin dependencies — links directly against the vendored
Archive/extern/DataLenssubmodule
- Clone with submodules (the Core is vendored as a git submodule, not a prebuilt binary):
Already cloned without
git clone --recurse-submodules https://github.com/heathen-engineering/Unreal-DataLens-Foundation.git--recurse-submodules? Rungit submodule update --initfrom the repo root. - Copy (or symlink) the repo into your project's
Plugins/folder, or reference it as an engine plugin. - Enable DataLens Foundation in
Edit > Plugins, restart the editor. - Get
UDataLensSubsystemviaGetGameInstance()->GetSubsystem<UDataLensSubsystem>()(C++) or "Get Game Instance Subsystem" (Blueprint).
| Type | Values |
|---|---|
EDataLensSystemOp |
Set, Add, Sub, Mul, Min, Max |
EDataLensCompareOp |
matches Core's comparison set for predicated Systems |
EDataLensCurveType |
Linear, Power, Smoothstep, Threshold |
EDataLensColumnType |
the typed column kinds FDataLensColumn can declare |
Each has a ...BP (UENUM(BlueprintType)) twin in DataLensBlueprintLibrary.h, positionally mirroring the core enum via static_cast at the boundary — the same convention the Core's own c_api.h uses.
Apache 2.0 — see LICENSE. Heathen Engineering Limited, Irish Registered Company #556277.