MIT License NuGet

Home / Roadmap

Roadmap

Audited against the source rather than against prior documentation. The absent rows are here for the same reason as the shipped ones: you should be able to decide against this engine using its own documentation, and find out on day one rather than in week three.

The full working document lives in the repository as Roadmap.md, with the dependency reasoning behind every ordering decision. This page is the public summary of it.

Shipped

Implemented and exercised by a running application.

Partial

Exists but incomplete, or implemented on some backends only.

Absent

No code exists. Not "planned soon" — nothing there today.

Baseline: rendering

CapabilityStatusEvidence
Fixed pass schedule, FrameStart Compute through OverlayShippedRendering/RenderPass.cs
Compute effect registration with graceful backend degradationShippedRendering/Compute.cs
Four backends, each with its own shader implementationShippedthree shader compilers plus WGSL
Bloom, GTAO, TAA, depth viewShippedRendering/Effects/, four backends
DDGI: SDF volume, probe irradiance atlas, Chebyshev occlusionShippedEffects/Ddgi.cs
Sky atmosphere, day/night cycle, procedural cloud noiseShippedEffects/SkyAtmosphere.cs, DayNightCycle.cs
Cascaded shadow maps, 3 cascades + 1 punctual in 4 atlas slotsShippedRendering/CascadedShadow.cs
Velocity bufferShippedRenderPass.cs, consumed by TAA
CPU frustum culling, per-instance broad phase, shadow cullingShippedRendering/Frustum.cs, on by default
GPU instancing with per-instance skinning and morph targetsShippedControls/InstancedModel.cs
Per-instance surface picking and highlight modesShippedPanels/ObjectPicker.cs, Rendering/Highlight.cs
glTF loading and animation playbackShippedModels/GltfAsset.cs, GLTFAnimationPlayer.cs
MSDF text renderingShippedSeason/Fonts/, all backends
Scene normal bufferAbsentGTAO derives normals from depth
Indirect draw and dispatchAbsentno indirect path on any backend
Texture compression: BC, ASTC, ETC2, KTX2Absentno compressed-format path
Occlusion culling, Hi-ZAbsent
GPU particlesAbsent
Screen-space reflectionsAbsentDDGI covers indirect diffuse only
DecalsAbsent
Volumetric fog, light shaftsAbsentatmospheric scattering exists, local volumetrics do not
Water systemAbsentthe sample's sea is scene content, not an engine system
Terrain, heightmaps, tessellationAbsent
Mesh or terrain LOD, impostorsAbsent
Motion blurAbsentvelocity buffer exists, only the resolve is missing
VR / XR of any kindAbsentno OpenXR, no stereo, no HMD tracking
glTF exportAbsentimport only
Mesh processing: decimation, UV repair, normal repairAbsent
Material instances and variants, batch merging by materialAbsentmaterials come from glTF import

One fact that sets the cost of several items above. The pipeline is forward rendering — pipeline states are organised as Opaque / Transparent / Fade with cull variants, with a storable depth target and a velocity target. There is no G-buffer. That is why reflections and decals are gated on adding a normal target, and why deferred decals are not simply "next up".

Baseline: host and world editing

CapabilityStatusEvidence
Show / Play / Edit / Debug modesShippedApps/Engine/App.cs
Object selection, per-instance picking, highlightShippedPanels/ObjectPicker.cs
Drag versus click discrimination, object draggingShipped20 px threshold in ObjectPicker.cs
Player collision, occluder fadeShippedManagement/PlayerCollider.cs, OcclusionFade.cs
Debug views for intermediate buffersShippeddepth, velocity, SDF, GI probes
Island scene with dynamic behaviourShippedhardcoded in App.Create()
Property editing: position, sizePartialfixed fields, no generic property grid
Scene serialization, save, loadAbsentno serializer, no scene format, no world file
Empty, sceneless startupAbsentCreate() builds the island unconditionally
Scene hierarchy inspectionAbsent
Asset library or catalogueAbsentmodel paths are hardcoded per scene class
Undo / redoAbsent

Baseline: AI and foundations

CapabilityStatusEvidence
Text generation and translationShippedllama.cpp / GGUF
Image generation and editingShippedSD1.5, SDXL, SD3.5, Qwen-Image-Edit, Flux.2-Klein and more
Video generationShipped
Music generationShippedStableAudio
Speech to textShippedWhisper / GGUF
Text to speech, dual ONNX and GGML backendsShippedincluding voice cloning
Vision and OCRShipped
Model acquisitionPartialpanels link to the source repository; the app does not download weights
Generated output flowing back in as an engine assetAbsentresults stop inside the AI panels
Any network clientAbsenteverything runs locally today
3D generation, auto-rigging, animation synthesisAbsent
Unit testsAbsent
Benchmark scenes with recorded numbersAbsentthe central performance claim is unmeasured
Screenshot / image-diff regressionAbsent
Frame allocation budget or GC measurementAbsent
Feature-by-backend support matrix in docsAbsentplanned as generated, not hand-maintained
Asset import cachingAbsentglTF is re-parsed on every run

The foundations block is deliberately unflattering. The project's central claim is that architectural minimalism recovers what a managed runtime costs — and that claim currently has no measurement behind it. Fixing that is Track D, and it is not scheduled late.

How the work is grouped

Work is grouped into tracks that map to the questions the project actually faces. Ordering inside each track is by dependency, not by appeal — several attractive features sit late because their prerequisites are infrastructure work across four backends.

TrackQuestion it answers
A. RenderingIs the renderer genuinely next-gen?
B. Host & worldsCan someone see what the engine does without reading the source?
C. AIIs the paid layer worth money, and does it help make games?
D. FoundationsCan any of the above be proven, maintained, or shipped?
E. VR / XRCan the renderer reach platforms where single-view assumptions stop applying?

Track A — Rendering

Three of the items are not features at all but infrastructure the others sit on. They are unglamorous and none of them produce a screenshot, which is exactly why they are named explicitly instead of being discovered halfway through building particles.

#ItemBlocked byCostVisible?
1A1 Motion blurLowYes
2A0.3 Texture compressionMediumNo
3A0.2 Scene normal targetLow–MediumNo
4A0.4 Per-view matrix splitMedium, four backendsNo
5A2 Screen-space reflectionsA0.2MediumYes
6A3 Volumetric fog and light shaftsMediumYes
7A0.1 Indirect draw and dispatchHighNo
8A6 GPU particlesA0.1MediumYes
9A7 GPU-driven cullingA0.1, D1HighNo
10A4 Dynamic waterA2MediumYes
11A5 DecalsA0.2MediumYes
12A8 Mesh LODmesh processingMediumNo
13A9 Terrain and terrain LODA0.1, A7, A8Very highYes

Why the order looks like that.

  • Motion blur is first because it is nearly free: the velocity buffer already exists and TAA already consumes it. What is missing is one resolve kernel.
  • Texture compression is not a visual feature. It is package size, web viability and the largest single frame-time win available on the integrated GPUs most evaluators will run this on. Runtime decode to uncompressed is an explicit anti-goal.
  • SSR waits for the normal target because marching against depth-derived normals and adding the buffer afterwards means writing the resolve twice. On miss, SSR will fall back to the DDGI irradiance atlas — engines without a GI volume have to ship a separate reflection probe system to avoid black misses.
  • GPU culling waits for a benchmark, not just for indirect draw. CPU frustum culling already ships and is on by default; without a recorded baseline there is no way to show the GPU path is faster. At ten thousand entities in a managed engine, the bottleneck is more likely per-entity Update cost than draw submission — and if so, A7 is the wrong fix.

Track B — Host and shareable worlds

An editor is a demonstration surface, not the workflow. It exists so the renderer can be seen. It does not exist to become the way the engine is used.

  • B0 — decouple the shell from the scene. Today Create() builds the whole island unconditionally. "Run with no world loaded" and "create a new world" are the same capability, and everything else in this track needs it first.
  • B1 — world serialization. The design rule comes before the format.
  • B2 — editing affordances. Placement, then gizmos, then a property editor over construction parameters only, then hierarchy inspection, then undo.
  • B3 — asset catalogue, with licence attribution as a required column, because bundled assets travel with shared worlds.
  • B4 — a second reference world: mass unit scheduling. Tens of thousands of independently updated, individually animated units, instrumented from the start. It doubles as the benchmark A7 requires.

The anti-fragmentation contract. A serialized world record is a C# type name plus construction parameters. It is never a bag of properties with attached behaviour fragments. Layout is data; behaviour is code; the boundary is the type name. That single constraint is what keeps this from becoming an inspector-assembled component model.

World tierContentsShareable as a file?Who can open it
Static worldBuilt-in types only, plus bundled assetsYesAnyone with the app
Code-bearing worldReferences project-defined typesNo — share the C# projectAnyone with the source

That distinction has to be explicit in the format and visible in the UI, or the project inherits the exact dependency problem it is trying to avoid: a shared world that silently fails to load because a type is missing.

Track C — AI

  • C1 — generated output into the engine. Eight generation capabilities ship and none of their output can become an engine asset. Generated image to material texture, to 2D sprite, generated audio to a playable source, a stable generated-assets folder — and the reverse direction: pick an object, send its current texture to image-to-image as the reference. Small work, and the highest return on effort in the whole roadmap.
  • C2 — cloud models plus runtime C# generation, desktop only. An HTTP client with streaming and user-supplied keys, plus Roslyn compiling C# at runtime. The architecture is already shaped to receive the result: a behaviour is a Panel or Control subclass, so a generated class only has to be instantiated and added — no serialization format to satisfy, no component model to register with.
  • C3 — 3D asset generation, static props only. The generation model is the small part; mesh decimation, UV unwrapping, normal repair and a glTF exporter are the work, and none of that exists today.
  • C4 — automatic rigging. Research, not a commitment. It will not appear on a store listing before output quality is verified against real characters.

C2 comes before C3, which inverts the intuitive order. C2 is an HTTP client plus a Roslyn host; C3 is a mesh pipeline plus an exporter plus a model. C2's quality is supplied by frontier models and improves for free; C3's is capped by what local 3D models produce today, which is not yet drop-it-in-a-game quality. And C2 exploits something this engine has and its competitors do not — behaviour as a single compilable C# class.

Runtime C# compilation is unavailable under full AOT, which rules out iOS and WebAssembly. That constraint is stated rather than worked around: the feature is desktop-only by nature.

Track D — Foundations

Every item here is either a prerequisite for proving a claim in another track, or a prerequisite for the project surviving contact with contributors.

  • D1 — benchmarks and image-diff regression. Fixed camera paths, fixed frame counts, recorded frame time, draw count and allocation. Plus headless reference-image comparison per backend: for a project whose pitch is the renderer is real, a silent visual regression is the most expensive possible bug, and the failures this codebase actually accumulates — per-frame buffer cross-talk, uncleared atlas memory, struct layout drift, shader divergence between four APIs — are exactly the kind a compile check never catches.
  • D2 — frame allocation budget. Pure C# engines are dismissed on exactly one axis, GC pauses, and that will appear in the first community thread. The answer cannot be prose. "Zero bytes allocated per frame at ten thousand animated instances" ends the argument in one line; nothing else does.
  • D3 — asset pipeline, absorbing texture compression, LOD generation, mesh decimation and import caching. The runtime must keep loading plain glTF and plain PNG directly: the pipeline is an optimisation, never an entry requirement.
  • D4 — documentation and a sample ladder. A minimal BaseApp under 50 lines, one-concept samples, and a written walkthrough for adding a compute effect — currently the most contributor-friendly extension point in the engine, and discoverable only by reading Ddgi.cs.
  • D5 — platform honesty. No fallback paths. Features declare requirements, unsupported features are visibly disabled with a stated reason, and the backend matrix is generated from the same source.

Track E — VR / XR

The renderer is single-view by construction: one camera per frame, matrices bundled per object, static render-target singletons, window-vsync frame pacing, pointer-only input and screen-space UI. Every one of those is an assumption VR breaks. So this track is deliberately last — it is a new platform claim, not a feature on the existing one.

ItemContentDepends on
E0OpenXR runtime binding: session lifecycle, swapchain import sharing the existing device and queue, action sets, xrWaitFrame pacingdesktop maturity
E1Dual-view rendering: two eye passes or a multiview broadcast, per-eye matrix constantsA0.4
E2Per-eye render state. DDGI and cascaded shadows stay shared — they are world and light space, which is this architecture's VR advantageE1
E3XR input: 6DoF poses, action-based buttons, haptics, ray picking on top of the existing unprojectionE0
E4VR UI: world-anchored panel quads or composition layersE0
E5Quest: OpenXR loader under the Android host, plus an XR quality preset through the existing RenderQuality ladderE2, E3

A0.4 — the per-view matrix split — sits early in Track A precisely so the hardest refactor is paid for long before this track starts, and while the scene pass is already open for the normal target.

Phase view

Dates are intent, not commitment.

Phase 0 — Ship something 2026 H2

  • Release engineering in full
  • A1 motion blur — the one cheap visual win
  • C1 generated output into the engine
  • D1 benchmark harness, even minimally

Outcome: the funnel exists, and the paid tier has a reason to be bought.

Phase 1 — Demonstrability 2027 H1

  • B0 shell/scene decoupling, then B1 world serialization
  • A0.2 normal target and A0.4 per-view split, then A2 SSR
  • A0.3 texture compression
  • D4 sample ladder, D2 allocation budget as a measured contract

Outcome: someone can create and save a world, and the performance claim has a number attached.

Phase 2 — Scale 2027 H2

  • A0.1 indirect draw on the desktop backends
  • A6 GPU particles, A7 GPU-driven culling
  • B4 mass-unit reference world
  • A3 volumetrics

Outcome: the strategy-scale claim is demonstrated rather than asserted.

Phase 3 — Creation 2028 H1

  • C2 cloud models plus Roslyn runtime C#, desktop only
  • B2 editing affordances, B3 asset catalogue
  • A4 water, A5 decals
  • D3 asset pipeline consolidated

Outcome: natural-language world creation, on a world format designed for it.

Phase 4 and beyond. A8 mesh LOD and A9 terrain; C3 static prop generation; C4 auto-rigging if quality justifies it; Track E starting as a Windows and Direct3D 12 pilot, then Quest; Mac and mobile store presence. Console technical adaptation is acknowledged and scheduled nowhere — it is gated on SDK access, which is gated on the engine's standing rather than on engineering effort.

Non-goals

A roadmap without these is a wish list. Each of the following is a decision, not an omission.

  • Competing on feature count with editor-centric engines.
  • Visual scripting, node graphs, or inspector-assembled behaviour, in any form.
  • A generalised frame graph before the fixed schedule is genuinely limiting.
  • Runtime texture compression, or any decode-to-uncompressed path.
  • A centralised template or asset marketplace.
  • Rebuilding around ECS for trend alignment. If bulk entity updates prove to be the bottleneck, the answer is a targeted data-oriented path for bulk entities, not a paradigm change across the engine.
  • Fallback rendering paths. Capability reporting instead.
  • Any XR runtime besides OpenXR — the same rule that killed OpenGL fallbacks.
  • Console certification or store policy as engine work. Porting the engine is the vendor's side of the line; certifying a shipped game is the developer's.

How to tell whether this is working

  • The renderer claim is provable: benchmark numbers and reference images are published, not described.
  • The GC objection is answerable in one number.
  • Someone can evaluate the engine in ten minutes without reading engine source.
  • Generated assets end up in scenes, not in a folder.
  • Adding a world type does not require writing editor code.
  • Season/ stays smaller and clearer than the feature list would suggest.
  • One implementation per domain still holds — no OpenGL fallback appears, no second animation format, no second text renderer.

Disagreements about ordering are welcome and useful. Open an issue — the reasoning in Roadmap.md is written down so it can be argued with.