Releases: Hekbas/Luth
v2.9.9 — Editor Rework
Date: 2026-05-05 · Issue: #118
Final release of the v2.9.x editor rework series. Ten patches over v2.9.0 to v2.9.9 added the parallel panel lifecycle, signal bus, console, autosave, thumbnails, undo correctness, widget kit, inspector polish, and named workspaces. This release adds the workspaces feature.
- v2.9.0
editor-foundation. Panel data collection runs on worker fibers viaJobSystem::Execute. ImGui submission stays on main and reads frozen per-panel snapshots. - v2.9.1
editor-signal-bus. TypedEditorSignalevents onEventBus::MainThread(Selection, Hierarchy, Asset, Project, PlayState, LogEntry). Replaces hierarchy-version polling. - v2.9.2
editor-console-errors. NewConsolePanelwith level filter, search, and clipper. Per-panel error boundary dumps a Win32 stack trace on first throw. - v2.9.3
editor-job-pump.MainThreadPump::PostandDrainfor any-thread to main callbacks. - v2.9.4
editor-autosave. Periodic side-channel saves to<project>/.luth/autosaves/. Crash-recovery prompt on next launch. - v2.9.5
editor-thumbnails. NewThumbnailCachewith worker-fiber CPU bake (textures) and main-thread GPU bake (mesh, material). ProjectPanel grid and Material / Model / Texture inspectors show real previews. - v2.9.6
editor-undo-fix.EditState { changed, committed }from every property widget. Slider edits no longer over-coalesce across release boundaries. - v2.9.7
editor-panels-polish. Addedwidgets/ButtonGroup, ScenePanel toolbar reorg, HierarchyPanel eye toggle,Edit > Preferences,Windowmenu with per-panel visibility, ProjectPanelBeginTableplusImGuiListClipper. - v2.9.8
editor-inspector-polish. Component header right-click menu (Reset, Copy, Paste, Remove) backed byEditorClipboard. Newwidgets/InspectorHeaderandSplitter. Live orbit-cam preview for Material and Model. - v2.9.9
editor-workspaces. Multi-named workspaces (ImGui dock plus per-panel visibility sidecar). NewWindow > Workspacessubmenu (Save As, Rename, Delete, Reset to Built-in). Built-inDefaultships under engine assets. Last-active workspace survives restart.
v2.9.0 — editor-foundation
Date: 2026-05-01 · Issue: #109
Editor panels switch from the bare OnInit / OnRender contract to a Gather → Draw lifecycle that mirrors the engine's Game(N) | Render(N-1) dispatch at smaller scale. Data collection runs on worker fibers via JobSystem::Execute. ImGui submission stays on main and reads frozen per-panel snapshots. Editor is behaviorally identical to v2.8.14.
Panelbase lifecycle:OnInit,OnGather,OnDraw,OnEvent,OnShutdown. Per-panelLinearAllocator(64*1024)snapshot scratch.- New
EditorSnapshotandEditorSnapshotBuilder. Type-keyed read-only view assembled on main after gather workers finish. Header-only, no locks. Editor::Renderdispatches oneJobSystem::Executegather job per visible panel (V2-isolated busy-spin on counter), then runsOnDrawsequentially.Panel::BeginWindowupdatesm_Visible,m_Focused,m_Dockedfrom ImGui state. Invisible panels skip gather.- All 9 panels migrated. Legacy
OnRenderandUsesNewLifecyclesentinel removed. - Most
OnGatherbodies are placeholders. Work-shifting (ECS, AssetDB pre-walks) lands in follow-on efforts.
v2.8.1 — game-panel
Date: 2026-04-24 · Issue: #91
Dedicated Game panel renders through the first Camera entity with letterbox / pillarbox respecting the camera's aspect ratio — no overlays. Scene panel keeps the editor camera and every overlay (grid, outline, gizmos, bone debug). Both views run in one frame, in one submit.
- Per-view GPU resources — each view owns its descriptor pool, global UBO, GTAO + bloom textures, and descriptor sets. No mid-frame descriptor aliasing.
- Per-view indirect-buffer regions so cull / shadow / geometry / depth draws don't stomp between views.
- Single primary command buffer per frame: both views record into it, one submit, one present.
- Per-instance resize callback replaces the single-subscriber
RenderResizeEvent. Each viewport drives its own resize. - Drive-by fixes (surfaced by stricter Vulkan validation): missing
TRANSFER_SRCon depth images, GTAO sampling without an explicit graph read declaration, picking barrier with the wrong source layout.
v2.8.0 — play-mode
Date: 2026-04-23 · Issue: #66
Editor enters play mode with a full Editing → Playing → Paused → Editing state machine, and Stop reverts cleanly via a JSON scene snapshot. Gateway for physics and any future gameplay-only system.
- Transport bar in the Scene panel: Play / Pause / Stop / Step. Viewport border tints green (Playing) or yellow (Paused).
- Stop reverts the scene to its pre-Play state; held assets survive the rewind so meshes and textures don't reload.
AnimationSystemonly ticks during simulation. Editor preview toggle keeps animations visible in Editing mode.- Inspector edits and undo/redo are blocked during Play — discarded by the snapshot rewind anyway.
- Scene view automatically switches to the first Camera entity during Play (toggle to keep the editor camera).
- Drive-by fix: pre-existing skinned-mesh freeze on scene reload (bone-offset lookup fell back to slot 0 for child mesh entities).
v2.1.0 — shader-asset-pipeline
Date: 2026-04-18 · Issue: #79
Rewrote the shader pipeline around single-stage assets — one .vert / .frag / .comp file equals one asset, one UUID, one cached SPIR-V artifact. Eliminates the implicit .vert + .frag pairing assumption that broke compute and fragment-only shaders.
- All 24 engine shaders now route through the asset system (was: runtime-compiled inline at startup, no caching).
- Hot-reload supports any stage including compute.
Fragment shader not foundstartup error — gone.- Second launch reuses cached SPIR-V; first launch generates
.metafiles for compute shaders. - Removed the dead
RecompileUtilityShadersruntime fallback.
v2.0.0 — arch-target-split
Date: 2026-04-18 · Issue: #78
Engine and editor are now separate static libraries. Luth.lib is engine-only; Luthien.lib adds the editor; Luthien.exe links both.
IEditorHooksinterface in the engine: 18 nullptr-safe virtual methods. A standalone runtime that doesn't linkLuthien.libcleanly no-ops every hook.EditorViewportState— single POD fill per frame replaces ten editor getters inApp::Run.- ~12 000 LOC of editor code physically extracted to
luthien/source/luthien/. Engine has zeroluthien/includes (enforced by a grep gate). - Three-project Visual Studio solution:
Luth,Luthien,Runtime. - Unblocks: future game-only builds that ship the engine without the editor.
v1.7.0 — arch-renderer-split
Date: 2026-04-18 · Issue: #77
Dissolved the monolithic RenderingSystem into focused renderer classes. Scene / ECS code lives in the scene layer; every graphics resource lives in the renderer; clips and skeletons get their own animation/ module. Sets up the v2.0 engine / editor library split.
FrameTargetsowns the persistent scene textures (color, depth, LDR, entity ID, selection).DrawListBuilderwalks the ECS once and partitions entities into opaque / cutout / transparent buckets.LightGathererandCascadeBuilderextract directional-light + CSM math from the scene system.RenderPipelineowns graph assembly and every graphics resource (pipelines, descriptors, IBL, bloom, GPU timers).animation/module created forAnimationClip,Skeleton,BoneMatrixBuffer,AnimationController.- Drive-by fix: skybox now reloads correctly when switching projects.
v1.5.0 — gtao
Date: 2026-04-17 · Issue: #58
Real screen-space ambient occlusion replaces the flat default ambient. Half-res compute, no temporal accumulation.
- Render panel controls: intensity, radius, falloff, power, quality.
- Visualize mode outputs raw AO as scene color.
- Depth prepass added — also unblocks the future cluster-shading pipeline.
v1.4.0 — Frame Debugger Sync Rework
Date: 2026-04-17 · Issue: #74
Reworked the Frame Debugger into a Unity-grade, GPU-true tool. The previous live-replay model re-executed the pipeline using current uniforms, never the captured ones — the displayed image rarely matched the selected step. Replaced with archived per-pass images at capture time and on-demand per-draw replay against frozen state.
- Archive sink writes a snapshot of every tracked render target after each pass.
- Hierarchical event tree: groups, passes, cascades, draws — replaces the old flat list.
- Per-draw replay re-records the pass up to draw N and previews the result.
- Frozen state auto-recaptures when the camera moves — Unity-style snapshot behaviour.
- CSM cascade nodes show per-cascade depth previews.
- Animation pauses while frozen so each replay renders the captured pose.
v1.3.0 — Cascaded Shadow Maps
Date: 2026-04-16 · Issue: #60
Cascaded shadow maps for directional lights. Replaces the single 2048² shadow with a 4-cascade PSSM setup.
- 4-layer shadow array; per-cascade orthographic fitting (Sascha Willems bounding-sphere method, shimmer-resistant).
- Per-cascade GPU culling — separate frustum cull dispatch per cascade.
- Cascade selection in the PBR shader with blend at transition zones; 3×3 PCF filter.
- Per-cascade depth and normal bias; debug visualization tints fragments by cascade.