Skip to content

Releases: Hekbas/Luth

v2.9.9 — Editor Rework

04 May 23:39

Choose a tag to compare

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 via JobSystem::Execute. ImGui submission stays on main and reads frozen per-panel snapshots.
  • v2.9.1 editor-signal-bus. Typed EditorSignal events on EventBus::MainThread (Selection, Hierarchy, Asset, Project, PlayState, LogEntry). Replaces hierarchy-version polling.
  • v2.9.2 editor-console-errors. New ConsolePanel with level filter, search, and clipper. Per-panel error boundary dumps a Win32 stack trace on first throw.
  • v2.9.3 editor-job-pump. MainThreadPump::Post and Drain for 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. New ThumbnailCache with 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. Added widgets/ButtonGroup, ScenePanel toolbar reorg, HierarchyPanel eye toggle, Edit > Preferences, Window menu with per-panel visibility, ProjectPanel BeginTable plus ImGuiListClipper.
  • v2.9.8 editor-inspector-polish. Component header right-click menu (Reset, Copy, Paste, Remove) backed by EditorClipboard. New widgets/InspectorHeader and Splitter. Live orbit-cam preview for Material and Model.
  • v2.9.9 editor-workspaces. Multi-named workspaces (ImGui dock plus per-panel visibility sidecar). New Window > Workspaces submenu (Save As, Rename, Delete, Reset to Built-in). Built-in Default ships under engine assets. Last-active workspace survives restart.

v2.9.0 — editor-foundation

02 May 00:42

Choose a tag to compare

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.

  • Panel base lifecycle: OnInit, OnGather, OnDraw, OnEvent, OnShutdown. Per-panel LinearAllocator(64*1024) snapshot scratch.
  • New EditorSnapshot and EditorSnapshotBuilder. Type-keyed read-only view assembled on main after gather workers finish. Header-only, no locks.
  • Editor::Render dispatches one JobSystem::Execute gather job per visible panel (V2-isolated busy-spin on counter), then runs OnDraw sequentially.
  • Panel::BeginWindow updates m_Visible, m_Focused, m_Docked from ImGui state. Invisible panels skip gather.
  • All 9 panels migrated. Legacy OnRender and UsesNewLifecycle sentinel removed.
  • Most OnGather bodies are placeholders. Work-shifting (ECS, AssetDB pre-walks) lands in follow-on efforts.

v2.8.1 — game-panel

24 Apr 19:34

Choose a tag to compare

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_SRC on depth images, GTAO sampling without an explicit graph read declaration, picking barrier with the wrong source layout.

v2.8.0 — play-mode

23 Apr 12:51

Choose a tag to compare

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.
  • AnimationSystem only 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

18 Apr 15:50

Choose a tag to compare

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 found startup error — gone.
  • Second launch reuses cached SPIR-V; first launch generates .meta files for compute shaders.
  • Removed the dead RecompileUtilityShaders runtime fallback.

v2.0.0 — arch-target-split

18 Apr 13:03

Choose a tag to compare

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.

  • IEditorHooks interface in the engine: 18 nullptr-safe virtual methods. A standalone runtime that doesn't link Luthien.lib cleanly no-ops every hook.
  • EditorViewportState — single POD fill per frame replaces ten editor getters in App::Run.
  • ~12 000 LOC of editor code physically extracted to luthien/source/luthien/. Engine has zero luthien/ 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

18 Apr 03:38

Choose a tag to compare

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.

  • FrameTargets owns the persistent scene textures (color, depth, LDR, entity ID, selection).
  • DrawListBuilder walks the ECS once and partitions entities into opaque / cutout / transparent buckets.
  • LightGatherer and CascadeBuilder extract directional-light + CSM math from the scene system.
  • RenderPipeline owns graph assembly and every graphics resource (pipelines, descriptors, IBL, bloom, GPU timers).
  • animation/ module created for AnimationClip, Skeleton, BoneMatrixBuffer, AnimationController.
  • Drive-by fix: skybox now reloads correctly when switching projects.

v1.5.0 — gtao

17 Apr 21:46

Choose a tag to compare

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

17 Apr 12:45

Choose a tag to compare

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

16 Apr 22:02

Choose a tag to compare

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.