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
No unreleased changes yet.
0.6.0-milestone6 - 2026-03-30
Added
Documentation
heliosengine document (docs/latex/helios_ascending/)- Academic documentation covering the evolution from OOP prototype to ECS-based engine (Trier University of Applied Sciences, WS 2025/26)
- Iterative evolution chapters for milestones 1–5 with architectural rationale
- Architecture analysis: System Layering, ECS (Sparse Sets, EntityHandle, Components, GameObject, Systems), Runtime (GameLoop, Messaging, Managers, State Management, GameWorld)
- Benchmark comparison of AoS (Milestone 3) vs SoA (Milestone 5) on Desktop (AMD Ryzen 9 9950X3D) and Laptop (Intel Core i7-8750H)
- Performance validation results for the Scoring Demo (FPS vs. object count)
- AI usage documentation (GitHub Copilot in development workflow)
- Notation and terminology conventions
- Glossary of engine-specific terms (Appendix)
- Benchmark source code listings (Appendix)
0.5.0-milestone5 - 2026-03-30
Added
ECS Architecture (Sparse-Set Refactor)
EntityHandlestruct for versioned entity references, replacingGUID-based identificationEntityIdandVersionIdstrongly-typed identifiers for entity managementEntityRegistryas the single source of truth for entity lifecycle (create, destroy, validate)EntityTombstonesentinel for marking invalid sparse array indicesSparseSet<T>generic container with paged sparse arrays, swap-and-pop removal, and dense iterationEntityManagerfor centralized entity and component management with validationComponentReflectorandComponentOpsRegistryfor runtime component lifecycle managementActive/Inactivetag components for entity activation state- Compile-time traits for ECS component lifecycle hooks (clone, reset, enable/disable)
HierarchyComponentfor parent-child entity relationshipsHierarchyPropagationSystemfor propagating transforms through entity hierarchieshelios.engine.bootstrapmodule with per-module component registry files for centralized type registrationGameObject::remove<T>()method for component removalView::whereEnabled()filter for iterating only over entities withActivecomponent
Resource Registry (#217)
ResourceRegistrytype-indexed service locator for Managers, CommandBuffers, and CommandHandlers with O(1) lookup viaResourceTypeIdResourceTypeIdcompile-time type identifier for engine resources (Managers, CommandBuffers, CommandHandlers)ErasedUniquetype-erased unique ownership wrapper (16 bytes:void*+ deleter) inhelios.core.memoryhelios.core.memorymodule for low-level memory utilitiesGameWorld::resourceRegistry()accessor for direct resource registration and lookupGameWorld::registerResource<T>()convenience method replacingaddManager<T>()GameWorld::registerCommandHandler<T>()for non-owning handler registrationGameWorld::manager<T>()accessor replacinggetManager<T>()GameWorld::entityManager()public accessor
Compile-Time Typed Command System (#217)
TypedCommandBuffer<...CommandTypes>compile-time typed buffer with per-type queues stored instd::tuple<std::vector<CommandType>...>TypedCommandHandler<T>type-safe handler interface for receiving commands of a specific typeCommandHandlerabstract base for type-erased handler storage in ResourceRegistryCommandBufferrefactored to abstract base class withflush(UpdateContext&)andclear()interfaceEngineCommandBufferconcrete facade pre-configured with all engine command types (Aim2D, Shoot, Move2D, Steering, UpdateScore, ScheduledSpawnPlan, Spawn, Despawn, StateCommand, StateCommand , UiAction, TimerControl, WorldLifecycle) ExecutableCommandconcept for commands that can self-execute viaexecute(UpdateContext&)methodCommandTypeIdcompile-time type identifier for command typesDelayedStateCommandfor timer-deferred state transitions with configurable delay and discard conditionsWorldLifecycleCommandandWorldLifecycleManagerfor deferred world reset operationsCommandBufferRegistryfor type-indexed storage ofCommandBufferinstancesCommandHandlerRegistryfor type-indexed storage of command handlersCommandBufferTypeIdcompile-time type identifier for command buffer types
Entity Resolution (#224)
EntityResolvercallable struct for resolvingEntityHandletoGameObjectviaEntityManagerUpdateContext::find(EntityHandle)for entity lookup without directGameWorldaccessUpdateContext::view()for querying entities directly from update context
Bootstrap Factory (#217)
helios::engine::bootstrap::makeGameWorld()factory returning pre-configuredGameWorld+GameLooppair withEngineCommandBuffer,WorldLifecycleManager,GameStateManager,MatchStateManager, and tracked states
State Management (#222)
helios.engine.statemodule with generic, template-based state management- Generic
StateManager<TState>template base class eliminating code duplication betweenGameStateManagerandMatchStateManager StateTransitionId<T>trait specialization mechanism viahelios.engine.state.BindingsStateTransitionContext<T>for type-safe state transitionsStateToIdMap<State, Id>andStateToIdMapPair<Lft, Rgt, Id>for state-to-typed-ID mapping (#225)CombinedStateToIdMapPair<Lft, Rgt, Id>for mapping state pairs to IDsGameStatebitmask enum withUndefined,Booted,MatchReady,Title,Running,Paused,GameOver,AnystatesMatchStatebitmask enum withUndefined,WaitingForPlayers,Countdown,Playing,GameOver,AnystatesGameStateManagerandMatchStateManagerfor hierarchical state machine managementGameFlowSystemfor managing game state transitionsMatchFlowSystemfor managing match state transitions with previous-state trackingDefaultGameStateTransitionGuardsandDefaultMatchStateTransitionGuardsfor state rulesLambdaGameStateListenerandLambdaMatchStateListenerfor callback-based state observation with enter-only and transition-only variantsMatchStateComponentfor tracking per-entity match state and transition contextStateComponent::stateFrom()for retrieving the source state of the last transitionGameStateTransitionIdandMatchStateTransitionIdfor named transitionsSessionclass for managing game/match state, player entity, and active viewport IDsSession::trackState<T>()for explicit state registration
Rendering and Text
TextRendererabstract class for text rendering operationsOpenGLGlyphTextRendererfor FreeType-based text rendering with OpenGLTextRenderablefor high-level text integration in scenesTextRenderPrototypefor shared, immutable text rendering configurationTextRenderCommandfor low-level text render queue operationsTextMeshfor text layout and vertex data managementTypeSetterfor glyph positioning and line layoutFontResourceProviderabstract interface for font managementFreeTypeFontResourceManagerfor font loading and glyph cachingMeshRenderableclass separating mesh rendering from generic renderablesOpenGLMeshRendererfor dedicated mesh geometry rendering with OpenGLOpenGLEnumMapperfor mappingPrimitiveTypeto OpenGL enumsGlyph,DrawProperties,TextShaderProperties,TextShaderPropertiesOverridedata structuresFontIdstrongly-typed identifier for font families- Orthographic projection support in
Camera(ortho()) render_text_demoexample demonstrating text rendering pipeline
Health and Damage System
helios.engine.mechanics.healthmodule for entity health managementHealthComponentwith health depletion behavior and dirty flag trackingHealthManagerfor processingApplyDamageCommandand emitting health eventsHealthUpdateClearSystemfor clearing health dirty flags each frameHealthChangeContextfor health modification dataHealthDepletedBehaviorenum for configurable depletion responsesHealthChangedEventfor health modification notificationsHealthDepletedEventfor entity health depletion signalshelios.engine.mechanics.damagemodule for damage handlingApplyDamageCommandfor damage command pipelineDamageOnCollisionSystemfor applying damage on solid collisions via commandsDamageDealerComponentfor defining layer-based damage valuesLastDamageComponentfor tracking the last damage sourceCollisionLayermodule for defining collision layer identifiersDamageContextandInteractionContextfor damage interaction data
Lives and Player System
LivesComponentfor tracking remaining lives with default initialization and resetLivesBindingComponentfor binding UI toLivesComponentmutationsLivesRevisiontype alias for trackingLivesComponentmutationsLives2UiTextUpdateSystemfor synchronizing UI text withLivesComponentPlayerComponentfor identifying the player entity in a matchPlayerDiedEventfor player death event signalingDeadTagComponentfor marking dead entities
Timer System
helios.engine.mechanics.timingmodule for game timingGameTimerwith configurable states (Undefined,Running,Paused,Finished) and reset supportTimerManagerfor processingTimerControlCommandcommandsTimerControlCommandandTimerControlContextfor timer command pipelineGameTimerUpdateSystemfor updating timers and handlingFinishedstate transitionsGameTimerClearSystemfor resetting finished timers each frameGameTimerBindingComponentfor binding entities to game timersGameTimer2UiTextUpdateSystemfor binding timer values to UI text componentsTimeFormatterComponentfor formatting time values with elapsed label and visibility optionsTimeDisplayModeenum for UI time layout configurationTimerRevisiontype alias for tracking timer state changesGameTimerIdstrongly-typed identifier for timer instances
Scoring System
helios.engine.mechanics.scoringmodule for score managementScorePoolandScorePoolSnapshotfor score state managementMaxScorePoolSnapshotfor running max score trackingScorePoolManagerfor managing score pools with reset functionalityUpdateScoreCommandfor score command pipelineScorePoolComponent,ScoreValueComponent,ScoreObserverComponent,MaxScoreObserverComponentCombatScoringSystemfor scoring onHealthDepletedEventScoreObserverSystem,MaxScoreObserverSystem,ScoreObserverClearSystem,MaxScoreObserverClearSystemScore2UiTextUpdateSystemandMaxScore2UiTextUpdateSystemfor UI bindingScorePoolId,ScoreTypeId,ScorePoolRevisiontyped identifiersKillReward,Score,ScoreContextdata structures
Scene and Viewport
SceneIdstrongly-typed identifier for scenesSceneToViewportMapfor associating scenes with viewportsSceneRenderingSystemfor automated viewport-based scene renderingStateToViewportPolicyUpdateSystem<Lft, Rgt>for state-driven viewport activationViewportIdstrongly-typed identifier (replacing raw viewport pointers)ViewportSnapshotfor capturing viewport state per frameActiveViewportIdsStateComponentfor tracking active viewport IDs
UI System
helios.engine.modules.uimodule for UI components and systemsMenuComponent,MenuFocusComponent,UiStyleComponentfor menu stateMenuConfig,MenuItemConfig,MenuBuilderfor fluent menu configurationMenuDisplaySystemfor state-driven menu visibility management (generalized for flexible state types)MenuNavigationSystemfor gamepad-based menu navigationUiTransformSystemwith hierarchy support and anchor positioning (TopLeft,BottomLeft)UiTextComponentwithrenderable()accessorsActionIdandMenuIdstrongly-typed identifiersUiActionCommand,UiActionCommandHandler,UiActionCommandManagerfor UI interactionsUiTextFormatSystemfor batched text formatting, extracted fromUiTextComponent::update()(#230)NumberFormatterComponentfor numeric value formatting in UIUiStyleUpdateSystemandUiTextBoundsUpdateSystemfor UI state management
Builder DSL
SpawnSystemFactoryfluent builder API for spawn pool, profile, and scheduler configuration.pool().profile().scheduledBy().commit()chain for declarative spawn setup.commitCyclic<N>()for cyclic scheduler registration.placer(),.initializer(),.axisPlacement(),.moveInitializer(),.randomDirectionInitializer()profile helpers.emitterPlacement()for emitter-relative spawn positioning.timerCondition(),.timerWithAvailabilityCondition(),.fixedAmount()rule helpersMenuBuilderfor fluent menu and menu item configurationHealthBuilder,ObserverBuilder,ScoringBuilder,UiTransformBuilderfor fluentGameObjectFactoryconfigurationCombatConfig,HealthConfig,ObserverConfig,ScorePoolConfig,ScoreValueConfig,TextRenderableConfig,UiTransformConfigbuilder config types
Typed Identifiers
StrongId<Tag>generic module for strongly-typed identifiers with FNV-1a hashingPrefabIdfor prefab identity management in object poolingPrefabIdComponentfor tagging GameObjects as prefab instancesViewportId,SceneId,FontId,ActionId,MenuIdasStrongIdspecializationsStateTypeIdfor unique state type identification at runtimeGameTimerIdfor timer identificationSystemTypeIdfor unique system type identificationManagerTypeIdfor unique manager type identification
Compile-Time Concepts and Tags
helios.engine.commonmodule for shared engine infrastructureHasSubmit,HasClear,HasReset,HasInit,HasUpdate,HasTagcompile-time conceptsIsCommandBufferLike,IsCommandHandlerLike,IsManagerLike,IsSystemLikerole conceptsCommandBufferRole,ManagerRole,SystemRolecompile-time tag types for role classificationConceptModelRegistryfor type-indexed storage of type-erased wrappers (Concept/Model pattern)ManagerRegistryfor type-erased manager registration and lookup
Type Erasure Architecture
Systemas a type-erased wrapper (replacing inheritance-basedUpdatable)ConceptModelRegistryused forManagerRegistryandSystemRegistry- Type-erased
Managerregistration via Concept/Model pattern
Lifecycle System
WorldLifecycleCommandandWorldLifecycleManagerfor deferred world reset operationsWorldLifecycleActionenum for lifecycle operation typesGameObjectLifecycleSystemfor processing entity lifecycle transitions
Other
GamepadStatebutton state tracking and input checksManager::reset()interface for state initializationSpawnInitializer::reset()/SpawnScheduler::reset()for resetting internal statesGameObjectPoolspan accessors for active and inactive GameObjectsRandominitial seed storage andreset()functionalityvec2uitype for unsigned integer 2D vectorsortho()function for orthographic projection matrices- FreeType library integration for text rendering
EmittedByComponentfor tracking the source entity of spawned objectsSpaceshipWidgetfor real-time physics parameter tuning via ImGuiStateOverlayWidgetfor displayingGameStateandMatchStatetransitions via ImGuitotalTimetracking inGameLoopandUpdateContextTILDEkey mapping for keyboard inputisKeyReleased()method onInputAdapterandGLFWInputAdapterscoring_demoexample demonstrating full scoring, health, timer, and state management pipeline
Documentation
docs/core-concepts/resource-registry.md— comprehensive documentation for ResourceRegistry including custom Managers, custom CommandBuffers, and plain resourcesdocs/core-concepts/state-management.md— state management architecture with HSM overviewdocs/core-concepts/sparse-set.md— SparseSet data structure documentationdocs/core-concepts/object-pooling.md— object pooling and prefab managementdocs/core-concepts/text-rendering.md— text rendering pipeline documentationdocs/core-concepts/component-lifecycle.md— component lifecycle and traitsdocs/core-concepts/component-registry.md— component registration and bootstrapdocs/core-concepts/ecs/— comprehensive ECS documentation (EntityHandle, EntityManager, EntityRegistry, GameObject, System, View, Traits, ComponentOps, component structure)- Updated
docs/core-concepts/command-system.mdto reflect compile-time typed architecture - Updated
docs/core-concepts/gameloop-architecture.mdfor ResourceRegistry integration and typed pass filtering
Changed
- BREAKING: Replaced
GUID-based entity identification withEntityHandle(index + version) - BREAKING:
GameObjectis now a lightweight facade (~16 bytes, safe to copy by value) - BREAKING:
Componentis no longer a superclass; components use compile-time traits instead - BREAKING: All component
explicitcopy constructors removed (aggregate-style components) - BREAKING:
Updatablebase class removed — systems use type-erasedSystemwrapper viaConceptModelRegistry - BREAKING:
GameObjectSpawnSystemnow takesSpawnManager&instead ofvector<unique_ptr<SpawnScheduler>> - BREAKING:
GameLoop::Phase::addPass()now requires state template parameter:.addPass<GameState>(GameState::Any) - BREAKING:
Viewportconstructor requiresViewportIdparameter - BREAKING:
Sceneconstructor requiresSceneIdparameter - BREAKING:
SceneSyncSystemtakesSceneToViewportMap&instead ofScene* - BREAKING:
Renderablerefactored;RenderableComponentnow usesMeshRenderable*(raw pointer) - BREAKING:
SnapshotItemuses raw pointer forRenderableinstead ofweak_ptr - BREAKING:
RenderPassuses non-owning pointers; manual rendering loop replaced bySceneRenderingSystem - BREAKING:
helios.rendering.modelmodule renamed tohelios.rendering.material - BREAKING:
helios.rendering.meshmodule restructured - BREAKING:
makeRenderCommandemits directly to render queue (no intermediateRenderCommand) - BREAKING:
ViewportIdreplaces raw viewport references in state-to-viewport policy - BREAKING:
GameObjectPoolConfignow usesPrefabIdinstead ofEntityHandlefor prefab identification - BREAKING:
CommandBufferis now an abstract base class; the concrete implementation isEngineCommandBuffer(#217) - BREAKING: Removed
TargetedCommand,WorldCommand, and all command base classes — commands are now plain structs (value types) (#217) - BREAKING: Removed all command dispatchers (
WorldCommandDispatcher,TargetedCommandDispatcher,TypedWorldCommandDispatcher,TypedTargetedCommandDispatcher,SpawnCommandDispatcher,DespawnCommandDispatcher,ScheduledSpawnPlanCommandDispatcher,UiActionCommandDispatcher,ScoreCommandDispatcher,StateCommandDispatcher,TimerCommandDispatcher) — replaced byTypedCommandHandler<T>registered viaResourceRegistry(#217) - BREAKING:
GameWorld::addManager<T>()replaced byGameWorld::registerResource<T>()(#217) - BREAKING:
GameWorld::getManager<T>()(returning pointer) replaced byGameWorld::manager<T>()(returning reference) (#217) - BREAKING:
Manager::flush()no longer takesGameWorld¶meter — usesUpdateContext&only (#224) - BREAKING:
Manager::onAdd()removed — initialization logic moved toManager::init()(#217) - BREAKING:
Manager::gameWorld_protected member removed (#217, #224) - BREAKING:
UpdateContextno longer exposes fullGameWorldreference — providessession(),find(),commandBuffer(),view(), andlevel()instead (#224) - BREAKING:
UpdateContext::commandBuffer()now returnsEngineCommandBuffer&from ResourceRegistry instead ofCommandBuffer&from GameLoop (#217) - BREAKING:
ResourceRegistryhidden behind commit points — not directly accessible fromUpdateContext - BREAKING:
GameLoopno longer ownsCommandBuffer— it is owned byGameWorld::ResourceRegistry(#217) - BREAKING:
GameLoop::commandBuffer()accessor removed (#217) - BREAKING:
GameLoop::update()signature changed toupdate(GameWorld&, float, InputSnapshot&, span<ViewportSnapshot>)(#224) - BREAKING:
GameWorldremoved all domain-specific handler registrations — all replaced by genericregisterCommandHandler<T>()+ ResourceRegistry (#217) - BREAKING:
Aim2DCommandandShootCommandno longer inherit fromTargetedCommand— they are self-executing commands carrying anEntityHandleand resolving entities viaUpdateContext::find()(#217, #224) - BREAKING:
GameStateManagerandMatchStateManagernow derive from genericStateManager<TState>template (#222) - BREAKING:
CollisionBehavior::Despawnrenamed toCollisionBehavior::PassEvent - BREAKING:
helios.engine.core.datamodule dissolved — types moved to domain-specific modules (common.types,scoring.types,spawn.types,ui.widgets.types) - BREAKING:
helios.core.buffermoved tohelios.core.container.buffer - BREAKING:
DeathEventrenamed toHealthDepletedEvent - BREAKING:
LastAttackerComponentrenamed toLastDamageComponentand moved tomechanics.damage - BREAKING:
GameTimerObserverComponentrenamed toGameTimerBindingComponent - BREAKING:
TimerState::Startedrenamed toTimerState::Running - BREAKING:
PushEventrenamed toPhaseEventfor clarity - BREAKING:
GameState::Startsplit intoBooted,MatchReady,Titlestates GameWorld::level()returns pointer instead of referenceChaseSystemnow only considers active entities (respectsDeadTagComponent)- UI offsets replace margins in
UiTransformSystem TextRenderableusesTextMeshfor text managementOpenGLGlyphTextRendererusesFontResourceProviderfor glyph renderingGLFWFactoryusesFreeTypeFontResourceManagerGameStateManagerandMatchStateManagerare now auto-registered bybootstrap::makeGameWorld()with default transition rulesSpawnManager::init()registersTypedCommandHandler<SpawnCommand>,TypedCommandHandler<DespawnCommand>, andTypedCommandHandler<ScheduledSpawnPlanCommand>viaGameWorld::registerCommandHandler<T>()ScorePoolManager,TimerManager,UiActionCommandManagerregister theirTypedCommandHandlerspecializations duringinit()ScoreObserverComponent/MaxScoreObserverComponentstore revision only; UI-binding systems read values from pool directly (#229)UiTextComponentsetters (setDouble(),setText()) no longer callupdate()— formatting is handled byUiTextFormatSystem(#230)- Commands are flushed in deterministic template parameter order (combat → motion → scoring → spawn → state → UI → timing → lifecycle)
- All examples updated to use
bootstrap::makeGameWorld()factory andregisterResource<T>()API helios.engine.Bootstrapmodule renamed tohelios.engine.bootstrap(lowercase)NumberFormatComponent::format()now requires explicit template parameter:format<double>()scoring_demorefactored into separate module files (IdConfig,ArenaConfig,SpawnConfiguration,EnemyPrefabs,MenuConfiguration)MenuDisplaySystemgeneralized to support flexible state typesLambdaStateListenerenhanced to support enter-only and transition-only callbacksDamageOnCollisionSystemnow emitsApplyDamageCommandinstead of mutating health directlyCombatScoringSystemlistens forHealthDepletedEventinstead ofDeathEventTimerStateextended withFinishedstateTimeFormatterComponentenhanced with elapsed label and hide-when-zero optionsTextRenderableConfigenhanced with number and timestamp formatting supportSystemRegistryandManagerRegistrynow useConceptModelRegistryfor type-erased storage
Removed
TargetedCommandbase class andWorldCommandbase class (#217)TargetedCommandDispatcher,WorldCommandDispatcher,TypedTargetedCommandDispatcher,TypedWorldCommandDispatcher(#217)SpawnCommandDispatcher,DespawnCommandDispatcher,ScheduledSpawnPlanCommandDispatcher(#217)UiActionCommandDispatcher,ScoreCommandDispatcher,StateCommandDispatcher,TimerCommandDispatcher(#217)helios.engine.runtime.spawn.dispatchermodule (#217)SpawnCommandHandlerinterface andSpawnCommandHandlerRegistry(#217)ScoreCommandHandler,TimerCommandHandler,StateCommandHandler,TypedStateCommandHandlerinterfaces (#217)Manager::gameWorld_protected member (#224)Manager::onAdd()virtual method (#217)GameWorld::gameObjects_legacyunordered_mapstorage (#217)Componentbase class — replaced by compile-time traitsUpdatablebase class — replaced by type-erasedSystemSystem(inheritance-based) base class fromhelios.engine.ecsCloneableComponentbase classGameObjectFilterandhelios.engine.ecs.querymoduleRenderCommandintermediate class (replaced by direct queue emission)helios.engine.core.datamodule (dissolved into domain modules)GameTimerObserverClearSystem(replaced byGameTimerClearSystem)FocusMenuListener(replaced by directMenuDisplaySystemhandling)AttackContext(replaced byDamageContext/InteractionContext)DeathEvent(replaced byHealthDepletedEvent)
Fixed
- Camera height parameter in resize calculation
zFarassertion in camera setup- Move operation incorrectly applied to pointer
- Font cache lookup assertion message
- VAO reset timing issue in OpenGL rendering
- Duplicate import of
RotationStateComponentinLevelBoundsBehaviorSystem GameObjectPoolRegistry::has()now usescontains()instead offind() != end()- Collision layer IDs not properly associated in multi-layer configurations
GameWorldreset now properly resets pending state transitionsGameObjectSpawnSystemproperly initializesgameWorld_tonullptr- Delayed command execution condition check in
TypedCommandBuffer - Timer reset now uses
setStatefor properTimerStateassignment passEventBus_.swapBuffers()called before command execution for correct event ordering
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)