Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.4.0-milestone4 - 2026-01-29
Added
helios.engine.ecsmodule with base classes (Component,GameObject,System,Updatable)helios.engine.ecs.querysubmodule withGameObjectFilterandGameObjectViewhelios.engine.runtimeaggregate module for runtime infrastructurehelios.engine.runtime.worldsubmodule withGameWorld,Level,UpdateContext,SystemRegistry,Managerhelios.engine.runtime.poolingsubmodule withGameObjectPool,GameObjectPoolManager,GameObjectPoolRegistry,GameObjectPoolConfig,GameObjectPoolSnapshothelios.engine.runtime.gameloopsubmodule withGameLoop,Phase,Passhelios.engine.runtime.messagingfor commands and eventshelios.engine.runtime.spawnsubmodule for spawn infrastructure:SpawnManagerfor processing spawn/despawn commandsSpawnProfilefor spawn configuration (pool, placer, initializer)SpawnSchedulerabstract base for rule-based spawn schedulingDefaultSpawnSchedulerfor evaluating all rules each frameCyclicSpawnScheduler<N>for round-robin rule evaluationRuleProcessorandDefaultRuleProcessorfor spawn rule processingSpawnRule,SpawnCondition,SpawnRuleStatefor policy layerSpawnConditionAllfor composite AND conditionsTimerSpawnConditionfor interval-based spawningRequestedAmountIsAvailableConditionfor pool availability checksSpawnAmountProvider,FixedSpawnAmount,SpawnAmountByCallbackfor amount configurationSpawnPlacer,SpawnInitializerinterfaces for spawn behaviorsRandomSpawnPlacer,EmitterSpawnPlacer,AxisSpawnPlacer,DistributedSpawnPlacer<N>for positioningEmitterInitializer,MoveInitializer,DelayedComponentEnablerInitializerfor entity initializationSpawnCommand,DespawnCommand,ScheduledSpawnPlanCommandfor command pipelineSpawnCommandDispatcher,DespawnCommandDispatcher,ScheduledSpawnPlanCommandDispatcherSpawnContext,EmitterContextfor spawn stateSpawnPlanCommandExecutedEventfor frame eventsSpawnCommandHandler,SpawnCommandHandlerRegistryfor handler management
helios.engine.mechanics.lifecyclefor entity lifecycle management:DelayedComponentEnablercomponent for deferred activationDelayedComponentEnablerSystemfor processing activation timers
helios.engine.builder.gameObject.builders.LifecycleBuilderfor lifecycle configurationhelios.engine.builder.gameObject.builders.configs.LifecycleConfigfor deferred enablementGridCollisionDetectionSystemwith uniform 3D spatial partitioningHitPolicyenum (OneHit,All) for collision count controlhelios.engine.mechanicsfor gameplay-specific systems (bounds, combat, spawn, input)helios.engine.modulesfor domain-agnostic subsystems (physics, spatial, scene, rendering, pool)SpawnedByProfileComponentfor tracking entity spawn originProjectileSpawnSystemfor combat projectile spawningSpawnProfileId,SpawnRuleId,GameObjectPoolIdtype-safe identifiers with FNV-1a string hashinghelios.core.algorithmsmodule withfnv1a_hashcompile-time hash functioncollision_detectionexample demonstrating grid collision and spawn patternsenemy_spawnexample demonstrating spawn system- Core concepts documentation for spawn system, collision detection, and lifecycle management
Changed
- BREAKING: Reorganized
helios.engineinto distinct submodules:core,ecs,runtime,modules,mechanics,tooling - BREAKING: Systems are now registered with
GameLoopphases/passes instead ofGameWorld - BREAKING:
GameWorldno longer manages System instances - useGameLoop::phase().addPass().addSystem<T>() - BREAKING: Spawn infrastructure moved from
mechanics/spawntoruntime/spawn - BREAKING: Removed
GameObjectFactory,GameObjectPoolFacade,PoolRequestHandler,PoolRequestHandlerRegistry - Moved ECS base classes from
helios.engine.gametohelios.engine.ecs - Moved world management classes to
helios.engine.runtime.world - Moved pooling infrastructure to
helios.engine.runtime.pooling - Moved messaging infrastructure to
helios.engine.runtime.messaging helios.engine.gameis now a facade module re-exporting common game development typeshelios.engine._module.ixxupdated to exportcore,ecs,game,runtime,toolingmodules- All aggregate
_module.ixxfiles now only export their direct submodules (clean hierarchy) SystemRegistryis now internal to theGameLooppass structure- Updated core concepts documentation with spawn system references
0.3.0-milestone3 - 2025-12-25
Added
ComposeTransformComponentfor independent transform management (local/world)ScaleStateComponentfor unit-based sizing with dirty flag trackingAabbColliderComponentfor world-space bounding boxesModelAabbComponentfor original model AABB storageLevelBoundsBehaviorComponentfor configurable boundary reactions (bounce, restitution)- Automatic AABB capture from SceneNode meshes via
onAttach() Move2DSystemfor 2D physics with rotation, velocity integration, and dampeningScaleSystemfor applying unit-based scaling fromScaleStateComponentBoundsUpdateSystemfor updating AABB colliders from world transformsLevelBoundsBehaviorSystemfor boundary collisions with bounce behaviorSceneSyncSystemfor synchronizing gameplay transforms with scene graphTransformClearSystemfor clearing dirty flags at end of frameLevelclass with configurable world bounds and AABB-based arena boundariesAim2DComponentfor direction tracking and firing frequencyShootComponentfor projectile firing with configurable cooldown and speedEllipse2D shape primitive for projectile and particle renderingColorsstruct with comprehensive color palette asvec4f(RGBA)LogWidget: "None" scope option to completely disable logging (default)GamepadWidget: Settings panel with side-by-side stick configurationspaceship_shootingdemo showcasing twin-stick shooter mechanics
Changed
- BREAKING:
SceneNodeComponent::setSize()removed - useScaleStateComponentinstead - BREAKING:
GameWorldconstructor no longer requiresScene*parameter - BREAKING:
Move2DComponent::position()removed (transforms managed byComposeTransformComponent) - BREAKING:
Move2DComponent::rotationAngle()renamed tocurrentRotationAngle() SceneNodeComponent::onAttach()now automatically captures AABB from SceneNode mesh- Systems must be explicitly registered for game logic
Fixed
- Forward declaration conflicts between Component and GameObject modules
- Circular dependency in module imports resolved via shared headers
0.2.0-milestone2 - 2025-12-16
Added
FramePacerclass for frame rate control with configurable target FPS (#111)FrameStatsstructure for frame timing information (frame time, idle time, work time)FpsMetricsclass for frame rate analysis and statisticsStopwatchhigh-resolution timer utilityCameraSceneNodefor camera integration into scene hierarchyTransformTypeenum for selective transform inheritance (Translation, Rotation, Scale)mat4::decompose()member function for extracting transform componentsmat4::transpose()member function for matrix transpositionlookAt()andlookAtLocal()methods for camera orientationonWorldTransformUpdate()virtual callback for transform change notifications- Camera-follows-object pattern via scene graph parenting
GameObjectbase class for game entities with GUID identificationGameWorldcontainer for game object management and updatesCommandBufferfor deferred command execution patternInputSnapshotfor capturing input state per frameUnitenum (Meter, Centimeter, Seconds, MilliSeconds)GamepadSettingsclass for per-controller configurationDeadzoneStrategyabstract interface for input normalizationRadialDeadzoneStrategyimplementation for circular deadzone handlingImGuiBackendabstraction for platform backendsImGuiGlfwOpenGLBackendconcrete implementation for GLFW/OpenGLImGuiOverlaysingleton manager with DockSpace supportFpsWidgetfor frame rate display and target FPS controlGamepadWidgetfor real-time gamepad state visualization (#114)LogWidgetfor scrollable log console with advanced filteringCameraWidgetfor camera parameter controlMainMenuWidgetfor application settingsLogSinkabstract interface with self-registering type identifiersConsoleSinkfor stdout outputImGuiLogSinkforLogWidgetintegration
Changed
- BREAKING: Cameras are now managed via
CameraSceneNodeinstead of standaloneCameraobjects - BREAKING:
Viewportnow holdsCameraSceneNode*instead ofCamera* - BREAKING: Enum counter entries renamed to
size_(#34) - BREAKING:
MeshDatamerged withMesh(#22) - View matrix computed from inverse of
CameraSceneNode::worldTransform() - Logging system refactored to use self-registering sinks
UniformValueMap::float_valreturn type refactored (#33)Materialownership structure improved (#13)
Fixed
- Potential nullptr dereference in
MaterialData(#16)
0.1.0-milestone1 - 2025-10-21
Added
- Application layer with event system
- Input manager for keyboard, mouse, and gamepad
- Low-level API subsystems integration (GLFW, GLAD)
- Basic rendering pipeline
- Scene graph with transform hierarchy
- Camera system with projection management
- Material and shader system
- Mesh and geometry handling
- Math library (vectors, matrices, transforms)
- Scoped logger implementation (#8)
- CMake build system with C++23 modules support
- Cross-platform support (Windows, Linux, macOS)
- Unit testing framework with Google Test
- Example applications (simple cube rendering, game controller input)