Skip to content

Releases: lmriccardo/a-simple-game-engine

Release v0.8.8e1.5

Choose a tag to compare

@github-actions github-actions released this 27 Oct 18:38

Release Notes — v0.8.8e1.5 [2026-10-27]

Animation grows up. Clips can now be named, sped up or slowed down, timed frame by frame, and cut from any range of a spritesheet, and gameplay code is told when a one-shot animation finishes. The level editor gets a full clip-authoring workflow and a visual crop picker for sprites.

Engine Highlights

  • Animation finished event: non-looping animations emit events::OnAnimationFinished(Entity) exactly once, so an attack or hit animation no longer has to be polled for its end.
  • Timing control: an optional per-frame frame_durations array and a serialized Animation::m_PlaybackSpeed multiplier give you uneven frame timing and slow-mo or fast-forward without editing clips.
  • Named clips: Animation supports named clips and PlayClip. Its loop and start-playing state now serialize with the scene.
  • Spritesheet ranges via GridSpec: FrameTable::Save and MakeGridFrames describe a contiguous clip on a sheet by rows, first frame, spacing and row- or column-major order. Existing clip files still load.
  • Sprite crop ownership: an Animation owns Sprite::m_SourceRect only while it plays. When playback stops, or the clip or Animation is cleared or removed, the Sprite gets its own crop back.
  • merge_spritesheets.py: a new script that stacks same-width spritesheets into one and prints each input's first cell index.

Editor Highlights

  • Create Clip modal: define the whole grid, preview the highlighted and numbered frames, and save several named clips per texture (<sprite>_clip_<name>.toml).
  • Visual crop picker: the Sprite inspector's new Crop toggle and Pick... modal select a source rect by dragging on the texture, snapped to the cell grid or pixel-exact.
  • Animation inspector: a Playback Speed field, and clip dropdowns that show clip names instead of raw paths.
  • Delete Scene: a new button in the Scene panel.

Testing

  • Animation coverage: new unit cases for the finished event, per-frame durations, playback speed and source-rect restore.
  • Serialization coverage: Animation loop, playing and speed round-trips, and GridSpec frame-table load and validation.
  • Render system coverage: new RenderSystem cases.

What's Changed

  • feat(ecs): Serialize Animation loop and start-playing state by @lmriccardo in #135
  • feat(editor): Add a Delete Scene button to the Scene panel by @lmriccardo in #136
  • feat(ecs): Add named clips and PlayClip to Animation by @lmriccardo in #137
  • feat(ecs): Emit OnAnimationFinished when a non-looping animation ends by @lmriccardo in #138
  • feat(ecs): Add per-frame durations and a playback speed to Animation by @lmriccardo in #139
  • docs(ecs): Document that Animation owns Sprite::m_SourceRect by @lmriccardo in #140
  • feat(assets): ✨ Select contiguous frame ranges from a spritesheet via GridSpec by @lmriccardo in #142
  • feat(ecs): ✨ Restore the Sprite's own source rect when an Animation stops by @lmriccardo in #143
  • feat(editor): ✨ Pick a Sprite's source rect visually and finish the Animation ownership rule by @lmriccardo in #144

Full Changelog: v0.8.7e1.4...v0.8.8e1.5

Release v0.8.7e1.4

Choose a tag to compare

@github-actions github-actions released this 09 Oct 15:30
289cc62

Release Notes — v0.8.7e1.4 [2026-10-09]

This release brings engine v0.8.7 and asge-editor 1.4. The editor gets a more organized workflow: entity groups, a folder-tree Assets panel and multi-line label editing. The engine gets tweening, multi-line UI text and several rendering and physics improvements.

Highlights

  • Entity groups in the editor — The Entities panel can now hold groups, and a group can hold a parent's children. Scenes with many entities are easier to organize.
  • Assets panel as a folder tree — Project assets now show as a folder hierarchy instead of a flat list.
  • Locked transforms — Transform has a new Locked flag, and the editor respects it, so a placed entity can't be dragged by accident.
  • Multi-line UILabel — UILabel supports multi-line and word-wrapped text. The editor edits it in a multi-line, uncapped field.
  • Tween and Easing — New math primitives for animating values over time. CatmullRomSpline now lives in Math/Interpolation alongside them.
  • Sprite Tint with fade — A Tint color on sprites, whose alpha fades the sprite.
  • Y-sort offset — RenderInfo has a per-entity y-sort offset for finer control over draw order. The editor grays out Layer and explains why when an entity inherits its parent's RenderInfo.
  • Target FPS from the project — The game reads its target FPS from the project's View table, and the editor lets you pick it.
  • Physics collision resolution — Collisions are now resolved through the owning body.
  • Scene save/load reporting — Save and load report entity ids, and restore reports entity remaps.
  • Smaller additions — The ENTER keycode, sprite geometry helpers for local-space scaling, resource helpers on generated scene states, and generated FindByName now includes disabled entities.
  • Fixes — Animation playback resets when the clip changes. Empty TOML strings are accepted. Small integers load correctly, so transparent colors load.

Testing

  • Unit coverage — Added for the new math (Tween/Easing), transform, scene and configuration changes.
  • CI — The Pages deploy is hardened against stale artifacts. Claude Code Review runs only on same-repo PRs.

What's Changed

  • feat(rendering): Add a per-entity y-sort offset to RenderInfo by @lmriccardo in #130
  • fix(rendering): reset animation playback when the clip changes by @lmriccardo in #131
  • fix(configuration): 🐛 Accept empty TOML strings by @Boulea7 in #133
  • build(versioning): 🔖 Release v0.8.7e1.4 by @lmriccardo in #134

New Contributors

Full Changelog: v0.8.6e1.3...v0.8.7e1.4

Release v0.8.6e1.3

Choose a tag to compare

@github-actions github-actions released this 01 Oct 22:15
3886bfd

Release Notes — v0.8.6e1.3 [2026-10-01]

This release turns an ASGE project into a buildable, standalone game. The editor can now scaffold a real C++/CMake project around a .asgeproject and compile/run it in place, while Game::LoadProject lets the generated project (or any game) load that same project file at runtime — no hand-written scene wiring required.

Highlights

  • Generate a game project from the editor — C++ Project > New writes a CMake project (main.cpp, CMakeLists.txt, a Game subclass, one generated state per scene) into <project>/code, loading the .asgeproject via Game::LoadProject and starting on its main scene; Update C++ Project keeps generated state files in sync as scenes are added.
  • Compile, Run, and Compile and Run from the editor (F7 / Ctrl+F5 / F5) — builds on a background thread with toolchain auto-detection (Visual Studio via vswhere, or g++/clang++), streamed to a dedicated Build Output window.
  • Game::LoadProject — loads an editor-authored .asgeproject at runtime: mounts its VFS entries, loads its MainScene (or first listed scene), and sizes the game window from the project's [View] table.
  • Fixed per-frame system pipeline — Game<TStateId> now owns system execution order (UI, movement, transforms, collisions, triggers, audio, rendering) instead of leaving it to each state; IGameState::ClearColor()/RenderBackground() let a state customize the frame without owning it.
  • Open in VSCode now opens the project root and writes .vscode/settings.json pointing CMake Tools at the generated code/ folder.

Fixes

  • UI buttons/labels now actually receive hover and click events in every Game — the required UIHitList resource wasn't being set up.
  • Switching scenes no longer corrupts entity Hierarchy links (or silently detaches children) when the outgoing scene is suspended and restored.

Testing

  • New ASGE_EditorTests target covering the C++ project generator, process runner, toolchain scan, and build output.
  • GameTests covering the fixed system execution order and the clear/background/render sequence.

Contributors

  • lmriccardo

What's Changed

  • chore: update CHANGELOG.md for v0.8.6e1.2 by @github-actions[bot] in #118
  • feat(game): ✨ Runtime project loading and C++ project generation from the editor by @lmriccardo in #119

Full Changelog: v0.8.6e1.2...v0.8.6e1.3

Release v0.8.6e1.2

Choose a tag to compare

@github-actions github-actions released this 29 Sep 22:31
397b9e0

Release Notes — v0.8.6e1.2 [2026-09-30]

This release lands ASGE's UI framework end to end: a full retained-mode widget set in the engine, and Level Editor Phases 13–17 giving them a visual authoring workflow. It builds on the ECS Hierarchy/entity-disabling work merged alongside it, so widgets can nest, disable, and reparent using the same machinery as any other entity.

Highlights

  • UI widget set — UIButton, UILabel, UICheckbox, UISlider, and UIPanel join the ECS as first-class, serializable components, driven by a shared Interactable/UIRect hit-testing base and rendered through RenderSystem alongside sprites.
  • UILayoutSystem / UILayoutItem — panels arrange their children automatically via Grid, VStack, HStack, or Absolute layouts, with per-child fill/alignment overrides.
  • Entity hierarchy and disabling promoted to ECS core — Hierarchy (parent/child linking) and Registry::DisableEntity now live in Core/, with view filtering that skips disabled subtrees automatically.
  • Editor: build UI without touching a TOML file — a Create UI Element flow (UI::CreateButton/CreateLabel/CreateCheckbox/CreateSlider/CreatePanel) walks through type, layout parent, and per-widget creation fields, and the Entities panel is now a hierarchy-aware tree with drag-to-reparent, new-child, detach, and disable/enable controls (with inherited-disable indicators).
  • Editor: assets flow both ways — right-clicking a texture/animation/audio/font asset can create or attach it to an entity directly, RenderInfo (Y-sort, screen space, draw order) is now inspectable, and fonts are tracked as first-class, dropdown-selectable assets.
  • Font::GetAtlasSize and a binary-search max pixel height helper make it practical to fit label text to a target box.

Testing

  • Unit coverage for UILayoutSystem/UILayoutItem, UISlider, UICheckbox, UIPanel (serialization + render), UIButton/Interactable, DestroyEntity hierarchy unlinking, and Hierarchy's TOML round trip.
  • Editor coverage: UILabel alignment (fixed-size and auto-size), CameraSystem centering post-fix.

Contributors

  • lmriccardo

What's Changed

  • UI framework (0.9.0): buttons, labels, checkboxes, sliders, panels and layout, plus Level Editor Phases 13-17 by @lmriccardo in #117

Full Changelog: v0.8.5e1.1...v0.8.6e1.2

Release v0.8.5e1.1

Choose a tag to compare

@github-actions github-actions released this 27 Sep 17:07
8abf258

Release Notes — v0.8.5e1.1 [2026-09-27]

Full native installer for Windows, MacOs and Linux platform (.deb) is now added to the artifacts produced by the release workflow.

What's Changed

  • chore: update CHANGELOG.md for v0.8.5e1.0 by @github-actions[bot] in #113
  • Add CI badge to README by @lmriccardo in #114
  • Package asge-editor as native installers (CPack) + docsite Editor Releases page by @lmriccardo in #115
  • ci(workflows): Install NSIS before packaging the Windows release installer by @lmriccardo in #116

Full Changelog: v0.8.5e1.0...v0.8.5e1.1

Release v0.8.5e1.0

Choose a tag to compare

@github-actions github-actions released this 27 Sep 09:34
41b9804

Release Notes — v0.8.5e1.0 [2026-09-27]

The ASGE Level Editor has arrived. This release closes out the entire 13-phase Level Editor roadmap in one merge: asge-editor is now a real, standalone editor for authoring ASGE scenes, projects, and assets — no mock data, no parallel schema, no shortcuts. It loads and saves through the exact same Registry and Serializer<T> path the game itself uses, so what you see in the editor is what ships in the game.

Highlights

  • The ASGE Level Editor (asge-editor) — a full Dear ImGui–based editor: click-to-select entities in the viewport, edit any serializable component live in the Inspector, and create/delete/duplicate entities — every change round-trips through the game's own scene format.
  • Projects, scenes, and sessions — .asgeproject files manage mounts, known assets, and a scene list; .asgescene files hold individual scenes; a lightweight asge.session auto-saves every 30s and resumes your last project/scene on launch. Switch, create, and rename scenes without cross-scene bleed.
  • Asset-aware authoring — an Assets/VFS panel tracks every known texture, animation, and audio path; component fields pick assets from dropdowns instead of hand-typed strings; the Asset Inspector previews textures, plays audio with transport controls, and can slice a spritesheet into a new animation clip directly from a thumbnail grid.
  • Viewport authoring tools — pan/zoom camera navigation, a translate gizmo, collider overlays with a click-and-drag "Draw Collider" tool (Rect/Circle), and PathFollow waypoint authoring with a live Catmull-Rom curve preview.
  • Supporting engine additions — VideoSystem gained opt-in resizable windows, Logger gained an OnLog signal for live log consoles, and a real CameraSystem bug was fixed along the way: cameras now center on a sprite's visual middle instead of its Transform corner.

Testing

  • Editor-driven engine coverage — new unit tests for PathFollow::RebuildPath, FrameTable::Save, and CameraSystem's sprite-centered framing, all added to back editor-authored data paths.
  • Scene lifecycle coverage — SceneManager tests updated for its suspend/resume model, so switching scenes in the editor no longer leaves stale entities resident.
  • Manual round-trip verification — project/scene save-load, session auto-resume, and asset dropdown resolution were each verified end-to-end against the real editor and game.

Contributors

  • lmriccardo

What's Changed

  • chore: update CHANGELOG.md for v0.8.4 by @github-actions[bot] in #108
  • fix(scene): Suspend inactive scenes instead of keeping them live in SceneManager's Registry by @lmriccardo in #110
  • Add Claude Code GitHub Workflow by @lmriccardo in #111
  • Level Editor: asge-editor (Phases 0-12) + docsite section by @lmriccardo in #112

Full Changelog: v0.8.4...v0.8.5e1.0

Release v0.8.4

Choose a tag to compare

@github-actions github-actions released this 24 Sep 18:12
d49b261

Release Notes — v0.8.4 [2026-09-24]

This release rounds out the asset and scene APIs the in-progress level editor needs, plus a real bug fix for asset re-resolution. AssetManager, VirtualFileSystem, SceneManager and the ECS Registry all gain small, editor-motivated additions, while Resolver<Sprite/Animation/AudioSource> is fixed to actually pick up a changed or cleared asset path instead of silently keeping the stale one.

Highlights

  • Asset resolvers now re-resolve — Resolver<Sprite>, Resolver<Animation> and Resolver<AudioSource> previously resolved once and ignored any later change to the path; changing or clearing a component's virtual path now correctly re-resolves or releases the handle.
  • AssetManager::GetTexture — a path-cached counterpart to texture creation, so multiple sprites sharing a texture path share one GPU texture instead of each allocating their own; the uncached CreateTexture is removed in favor of it, alongside a new UnloadTexture.
  • AssetRefs<T> / CollectAssetRefs — a read-only counterpart to Resolver<T> that reports which asset paths a component references, backed by a new Registry::View<Ts...>() const overload for read-only iteration.
  • Asset classification helpers — Image::IsSupportedFile and FrameTable::IsFrameTable let callers tell a supported image or a real animation-clip file apart from other files, without duplicating the engine's own loader logic.
  • VirtualFileSystem path helpers — SplitRoot, IsMounted and ToVirtualPath (the inverse of Resolve) cover virtual-path operations callers previously had to reimplement.
  • SceneManager::CreateEntity/DuplicateEntity — entities are automatically tagged with the active scene's SceneId, so they can no longer be silently dropped from the next SaveScene for lack of tagging.
  • SceneManager::LoadSceneFromFile — SaveScene's counterpart, loading a scene directly from a real filesystem path (e.g. one picked from a native file dialog).

Testing

  • Unit coverage added for asset resolution and re-resolution, AssetManager texture caching, Image/FrameTable classification, Registry const views, VirtualFileSystem path helpers, and SceneManager/SceneSerializer creation, duplication and file loading.

What's Changed

  • chore: update CHANGELOG.md for v0.8.3 by @github-actions[bot] in #93
  • fix(scene): Add SceneManager::LoadSceneFromFile, a real-path counterpart to SaveScene by @lmriccardo in #101
  • feat(scene): Add SceneManager::CreateEntity/DuplicateEntity for the active scene by @lmriccardo in #102
  • feat(assets): Add AssetManager::GetTexture, a path-cached CreateTexture by @lmriccardo in #103
  • feat(filesystem): Add SplitRoot/IsMounted/ToVirtualPath to VirtualFileSystem by @lmriccardo in #104
  • feat(assets): Add Image::IsSupportedFile and FrameTable::IsFrameTable by @lmriccardo in #105
  • feat(assets): Add AssetRefs/CollectAssetRefs, plus a const Registry::View() by @lmriccardo in #106
  • fix(assets): Make asset resolvers re-resolve on path change or clear by @lmriccardo in #107

Full Changelog: v0.8.3...v0.8.4

Release v0.8.3

Choose a tag to compare

@github-actions github-actions released this 20 Sep 15:22
f25416c

Release Notes — v0.8.3 [2026-09-18]

A one-line fix, but a visible one: colored shapes now actually respect alpha.

Highlights

  • Fixed alpha blending on draw-color primitives — SDLRenderer now sets SDL_BLENDMODE_BLEND on its draw color at construction. SDL's own default is NONE, which ignores alpha entirely, so DrawRect/DrawLine/DrawCircle always rendered fully opaque regardless of the color's alpha channel — semi-transparent shapes silently became solid.

What's Changed

  • chore: update CHANGELOG.md for v0.8.2 by @github-actions[bot] in #88
  • fix(rendering): 🐛 Enable alpha blending for draw-color primitives by @lmriccardo in #92

Full Changelog: v0.8.2...v0.8.3

Release v0.8.2

Choose a tag to compare

@github-actions github-actions released this 17 Sep 14:51
8fdd24b

Release Notes — v0.8.2 [2026-09-17]

v0.8.2 gives ASGE its first curve primitive — a Catmull-Rom spline — and a waypoint-based path-following gameplay component built on top of it, alongside the sprite-rotation fix that makes both (and every other rotated sprite) actually render rotated. Asset resolution is also generalized: instead of a hardcoded Sprite/Animation loop, ResolveAssets now dispatches per component type through a Resolver<T> customization point, which is what let the new path-following component slot in without special-casing.

Highlights

  • math::CatmullRomSpline — ASGE's first curve primitive: a piecewise Catmull-Rom spline through a list of waypoints, with each segment pre-sampled into an arc-length table so points and tangents can be looked up either by a normalized [0, 1] parameter (PointAt/TangentAt) or by actual distance travelled along the curve (PointAtDistance/TimeAtDistance).
  • PathFollow + PathFollowingSystem — components::PathFollow holds an entity's authored waypoints, speed and loop flag; systems::PathFollowingSystem walks its Transform along the resolved spline every frame, looping back or finishing at the end and orienting Transform::m_Rotation to face the travel direction.
  • Generalized ResolveAssets — AssetManager::ResolveAssets folds over components::SerializableComponents and dispatches per type through a Resolver<T> customization point instead of a hardcoded Sprite/Animation loop; Resolver<PathFollow> is added alongside the existing Sprite/Animation/AudioSource resolvers.
  • Transform::m_Rotation, actually applied — RenderSystem previously ignored a sprite's rotation entirely; it now routes a non-zero m_Rotation through IRenderer::DrawTextureAffine via the new components::SpriteGetDrawCorners, rotating around the sprite's own center. New rotation_demo example shows both a plain and an animated sprite spinning.
  • New path_following_demo — a car drives a closed, curved street loop end to end: waypoints resolved once at spawn (not every frame), the road drawn straight from the car's own resolved path via PointAtDistance (no separate road asset needed), with speed/pause/reset controls.

Testing

  • Spline & path-following coverage — new CatmullRomSplineTests (Hermite basis, arc-length tables, PointAt/PointAtDistance/TangentAt/TimeAtDistance) and PathFollowingSystemTest suites, including regression tests for a rebuild-every-call bug and a zero-length-path NaN bug, both verified red-then-green.
  • Sprite rotation coverage — new SpriteTests for SpriteGetDrawCorners, plus extended RenderSystemTests/GraphicsInterfaceTests/SDLRendererTextureTests for the DrawTextureAffine routing.
  • Full suite green — 975/975 tests passing on a clean rebuild, warning-free under -Wall -Wextra -Wpedantic.

What's Changed

  • chore: update CHANGELOG.md for v0.8.1 by @github-actions[bot] in #84
  • feat(docsite): Add camera_demo and camera_follow_demo to the Examples section by @lmriccardo in #85
  • fix(rendering): Apply Transform::m_Rotation when RenderSystem draws a Sprite by @lmriccardo in #86
  • Curve/spline path following: CatmullRomSpline, PathFollow, generalized asset resolving by @lmriccardo in #87

Full Changelog: v0.8.1...v0.8.2

Release v0.8.1

Choose a tag to compare

@github-actions github-actions released this 15 Sep 22:42
6e519a0

Release Notes — v0.8.1 [2026-09-16]

Cameras arrive, top to bottom: IRenderer gets direct camera/viewport control, and a new ECS layer drives it automatically from a followed entity, culling anything outside the visible area. Alongside it, ASGE now has a real documentation site.

Highlights

  • Camera & Viewport — IRenderer gains SetCamera/GetCamera and SetViewport/GetViewport; SDLRenderer applies the camera transform to every draw call and clips to the viewport. New camera_demo pans/zooms a world larger than the window, with a picture-in-picture minimap driven by a second camera into a second viewport.
  • ECS camera-follow & culling — components::Camera + resources::ActiveCamera + systems::CameraSystem drive the renderer's camera from a followed entity's Transform, with configurable smoothing and zoom; RenderSystem now culls sprites outside the visible world rect instead of submitting every draw call regardless. New camera_follow_demo follows a player across a world well beyond the window.
  • Registry resources — Registry::SetResource<T>/GetResource<T> add registry-wide singleton state not tied to any entity (what ActiveCamera above is built on).
  • Documentation site — a new docs site on GitHub Pages: a full API reference rendered from Doxygen's own structured output (not its default theme), a gallery page per example with real screenshots, per-platform install instructions, and a live Releases page.
  • Rect field rename — math::Rect's fields are now m_X/m_Y/m_Width/m_Height (previously x/y/w/h), matching every other math struct in the engine. Breaking for any code touching Rect's fields directly; on-disk TOML keys are unchanged, so existing scene/sprite-sheet files still load.

Testing

  • Camera coverage — pure transform-math tests, real SDL pixel-readback proving the camera and viewport actually move, scale, and clip what's drawn, and CameraSystem's snap/smoothing/zoom behavior alongside RenderSystem's culling.
  • Registry resource coverage — set/get round-trip, overwrite semantics, and isolation between separate Registry instances.
  • Full suite green — 914/914 tests passing.

What's Changed

  • chore: update CHANGELOG.md for v0.8.0 by @github-actions[bot] in #78
  • feat(docsite): Add a documentation site hosted on GitHub Pages by @lmriccardo in #79
  • fix(docsite): Pin CI's Doxygen to the version header.html was authored with by @lmriccardo in #80
  • style(docsite): Modernize the API reference theme by @lmriccardo in #81
  • feat(docsite): Replace the Doxygen HTML theme with a custom-rendered API reference by @lmriccardo in #82
  • feat(rendering): Camera/Viewport, ECS Registry resources, and camera-follow culling by @lmriccardo in #83

Full Changelog: v0.8.0...v0.8.1