Repository navigation
Releases: lmriccardo/a-simple-game-engine
Release list
Release v0.8.8e1.5
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_durationsarray and a serializedAnimation::m_PlaybackSpeedmultiplier give you uneven frame timing and slow-mo or fast-forward without editing clips. - Named clips:
Animationsupports named clips andPlayClip. Its loop and start-playing state now serialize with the scene. - Spritesheet ranges via
GridSpec:FrameTable::SaveandMakeGridFramesdescribe 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
AnimationownsSprite::m_SourceRectonly while it plays. When playback stops, or the clip orAnimationis 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:
Animationloop, playing and speed round-trips, andGridSpecframe-table load and validation. - Render system coverage: new
RenderSystemcases.
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
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 —
Transformhas a newLockedflag, and the editor respects it, so a placed entity can't be dragged by accident. - Multi-line
UILabel—UILabelsupports multi-line and word-wrapped text. The editor edits it in a multi-line, uncapped field. TweenandEasing— New math primitives for animating values over time.CatmullRomSplinenow lives inMath/Interpolationalongside them.- Sprite
Tintwith fade — ATintcolor on sprites, whose alpha fades the sprite. - Y-sort offset —
RenderInfohas a per-entity y-sort offset for finer control over draw order. The editor grays outLayerand explains why when an entity inherits its parent'sRenderInfo. - Target FPS from the project — The game reads its target FPS from the project's
Viewtable, 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
ENTERkeycode, sprite geometry helpers for local-space scaling, resource helpers on generated scene states, and generatedFindByNamenow 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
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 > Newwrites a CMake project (main.cpp,CMakeLists.txt, aGamesubclass, one generated state per scene) into<project>/code, loading the.asgeprojectviaGame::LoadProjectand starting on its main scene;Update C++ Projectkeeps 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.asgeprojectat runtime: mounts its VFS entries, loads itsMainScene(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.jsonpointing CMake Tools at the generatedcode/folder.
Fixes
- UI buttons/labels now actually receive hover and click events in every
Game— the requiredUIHitListresource wasn't being set up. - Switching scenes no longer corrupts entity
Hierarchylinks (or silently detaches children) when the outgoing scene is suspended and restored.
Testing
- New
ASGE_EditorTeststarget covering the C++ project generator, process runner, toolchain scan, and build output. GameTestscovering 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
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, andUIPaneljoin the ECS as first-class, serializable components, driven by a sharedInteractable/UIRecthit-testing base and rendered throughRenderSystemalongside 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) andRegistry::DisableEntitynow live inCore/, with view filtering that skips disabled subtrees automatically. - Editor: build UI without touching a TOML file — a
Create UI Elementflow (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::GetAtlasSizeand 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,DestroyEntityhierarchy unlinking, andHierarchy's TOML round trip. - Editor coverage:
UILabelalignment (fixed-size and auto-size),CameraSystemcentering 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
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
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 —
.asgeprojectfiles manage mounts, known assets, and a scene list;.asgescenefiles hold individual scenes; a lightweightasge.sessionauto-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
PathFollowwaypoint authoring with a live Catmull-Rom curve preview. - Supporting engine additions —
VideoSystemgained opt-in resizable windows,Loggergained anOnLogsignal for live log consoles, and a realCameraSystembug was fixed along the way: cameras now center on a sprite's visual middle instead of itsTransformcorner.
Testing
- Editor-driven engine coverage — new unit tests for
PathFollow::RebuildPath,FrameTable::Save, andCameraSystem's sprite-centered framing, all added to back editor-authored data paths. - Scene lifecycle coverage —
SceneManagertests 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
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>andResolver<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 uncachedCreateTextureis removed in favor of it, alongside a newUnloadTexture.AssetRefs<T>/CollectAssetRefs— a read-only counterpart toResolver<T>that reports which asset paths a component references, backed by a newRegistry::View<Ts...>() constoverload for read-only iteration.- Asset classification helpers —
Image::IsSupportedFileandFrameTable::IsFrameTablelet callers tell a supported image or a real animation-clip file apart from other files, without duplicating the engine's own loader logic. VirtualFileSystempath helpers —SplitRoot,IsMountedandToVirtualPath(the inverse ofResolve) cover virtual-path operations callers previously had to reimplement.SceneManager::CreateEntity/DuplicateEntity— entities are automatically tagged with the active scene'sSceneId, so they can no longer be silently dropped from the nextSaveScenefor 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,
AssetManagertexture caching,Image/FrameTableclassification,Registryconst views,VirtualFileSystempath helpers, andSceneManager/SceneSerializercreation, 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
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 —
SDLRenderernow setsSDL_BLENDMODE_BLENDon its draw color at construction. SDL's own default isNONE, which ignores alpha entirely, soDrawRect/DrawLine/DrawCirclealways 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
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::PathFollowholds an entity's authored waypoints, speed and loop flag;systems::PathFollowingSystemwalks itsTransformalong the resolved spline every frame, looping back or finishing at the end and orientingTransform::m_Rotationto face the travel direction.- Generalized
ResolveAssets—AssetManager::ResolveAssetsfolds overcomponents::SerializableComponentsand dispatches per type through aResolver<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 —RenderSystempreviously ignored a sprite's rotation entirely; it now routes a non-zerom_RotationthroughIRenderer::DrawTextureAffinevia the newcomponents::SpriteGetDrawCorners, rotating around the sprite's own center. Newrotation_demoexample 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 viaPointAtDistance(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) andPathFollowingSystemTestsuites, 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
SpriteTestsforSpriteGetDrawCorners, plus extendedRenderSystemTests/GraphicsInterfaceTests/SDLRendererTextureTestsfor theDrawTextureAffinerouting. - 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
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 —
IRenderergainsSetCamera/GetCameraandSetViewport/GetViewport;SDLRendererapplies the camera transform to every draw call and clips to the viewport. Newcamera_demopans/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::CameraSystemdrive the renderer's camera from a followed entity'sTransform, with configurable smoothing and zoom;RenderSystemnow culls sprites outside the visible world rect instead of submitting every draw call regardless. Newcamera_follow_demofollows 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 (whatActiveCameraabove 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.
Rectfield rename —math::Rect's fields are nowm_X/m_Y/m_Width/m_Height(previouslyx/y/w/h), matching every other math struct in the engine. Breaking for any code touchingRect'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 alongsideRenderSystem's culling. - Registry resource coverage — set/get round-trip, overwrite semantics, and isolation between separate
Registryinstances. - 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