Repository navigation
Releases: Shmellyorc/Void
Release list
VOID Engine 2.2.1
VOID Engine 2.2.1 is a maintenance release focused on improving asset caching, input consistency, and resource cleanup during game shutdown.
What's Changed
Hashing and Asset Management
- Added
Cache32IgnoreCase()andCache64IgnoreCase()for deterministic case-insensitive hashing. - Fixed asset caching to prevent duplicate loads caused by filename capitalization.
- Preserved first-load-wins behavior and existing asset settings.
Input Actions
- Made action registration, lookup, removal, and state queries case-insensitive.
- Updated string and enum-based actions while preserving existing input behavior.
Audio
- Fixed
SoundInstancePoolbackground worker tracking. - Improved shutdown to wait for the audio worker before releasing sound resources.
- Prevented audio resources from being disposed while still in use.
Rendering and Shutdown
- Added automatic cleanup of pooled render targets during shutdown.
- Preserved custom render-target ownership and normal gameplay pooling.
- Integrated audio and rendering cleanup into
Game.Dispose(). - Preserved existing game-loop and window-close behavior.
Compatibility
- Targets .NET 10.
- No breaking public API changes.
- No changes required for existing games.
Installation
dotnet add package Void.Engine --version 2.2.1VOID Engine 2.2.0
VOID Engine 2.2.0
VOID Engine 2.2.0 adds new Beacon subscription features, improves InputAction and hashing performance, and includes several rendering, LDtk, and collision fixes.
Beacons
- Added timed Beacon subscriptions.
- Added
TimeSpanlifetime overloads. - Added
SubscribeOncefor string and enum topics. - Added timed one-shot subscriptions.
- Timed subscriptions use
Game.Instance.FrameTime.TotalTime. - Expired subscriptions are cleaned up lazily without requiring a per-frame Beacon update.
- Existing multicast Beacon dispatch behavior remains unchanged.
Input Actions
- InputAction now uses cached 64-bit action identifiers internally.
- InputActionState snapshots now use
ulongaction identifiers. - Reduced repeated string lookup and comparison work.
- Public string and enum APIs remain unchanged.
- Retained snapshot and input transition behavior remain unchanged.
Hashing
- Optimized
HashHelper.Cache32andCache64to avoid creating unusedLazyvalues on cache hits. - Preserved existing FNV-1a hashing and thread-safe cached initialization.
- Reduced unnecessary allocations during repeated cached lookups.
Spritesheets
- Fixed Aseprite nine-patch center data being interpreted as border sizes.
- Nine-patch borders are now calculated correctly from the Aseprite center rectangle.
- Fixed incorrect corner sizing with smaller nine-patch sprites.
LDtk
- Fixed IntGrid world positions using layer grid dimensions instead of tile size.
- IntGrid positions now correctly use grid location and tile size.
Collision
- Fixed
MoveAndSlideCirclecorner jitter and touching behavior. - Improved circle-vs-rectangle and circle-vs-circle penetration handling.
- Improved radial push-out behavior.
- Limited circle collision resolution to four passes for more stable corner handling.
Install
dotnet add package Void.Engine --version 2.2.0VOID Engine 2.1.1
VOID Engine 2.1.1 adds renderer-neutral scissor clipping and improves InputAction snapshot performance.
Rendering
- Added renderer-neutral scissor clipping support for batch rendering
- Added
BaseBatcher.SetScissor(Rect2)andClearScissor() - Scissor changes flush queued geometry before changing clipping state
- Scissor rectangles use VOID logical viewport coordinates and scale correctly to active render targets
- Scissor clipping works with supersampling and custom render targets
- Added scissor state to renderer-neutral
RenderCommandsubmissions for custom renderer support - Added OpenGL scissor support with correct top-left to OpenGL coordinate conversion
- Scissor rectangles are clamped to the active render target
- Render target clears are protected from stale scissor state
- Scissor state is automatically cleared when a batch ends
SpriteBatcherandPrimitiveBatcherinherit scissor support automatically
Input Actions
- Removed unnecessary per-frame
InputActionStatedictionary allocations - Reuse unchanged input snapshots instead of cloning state every update
- Added a fast path when no input actions are registered
- Default
InputActionStateremains allocation-free and treats missing actions as released - Preserved stable retained snapshots across subsequent updates
- Preserved
JustPressed,Pressed,JustReleased, andUptransition behavior
Documentation
- Updated rendering documentation with scissor usage and behavior
- Updated custom renderer documentation for
RenderCommand.ScissorRectangle - Updated core systems documentation for the InputAction snapshot changes
- Updated the wiki for VOID 2.1.1
VOID Engine 2.1.0
VOID Engine 2.1.0
This release improves camera behavior, frame timing, coroutines, and the Beacon event system while keeping VOID's existing renderer and game-loop architecture intact.
Camera
- Cameras attached to batchers now update automatically during rendering.
- Added
BaseCamera.OnUpdate(FrameTime)for custom camera behavior. - Shared cameras update at most once per rendered frame.
- Manual camera updates are no longer required for attached cameras.
Frame Timing
- Reworked
FrameTimeto manage VOID's game-loop timing state. - Fixed timestep updates now receive the configured fixed update interval.
- Rendering receives actual frame elapsed time even when fixed timestep mode is enabled.
- Variable timestep mode continues to use actual elapsed time.
DeltaTimeremains time-scale aware.ElapsedTime,UnscaledDeltaTime,TotalTime, interpolation alpha, FPS, and slow-frame tracking remain available throughFrameTime.
Coroutines
- Replaced the previous coroutine implementation with a VOID-native
IEnumeratorrunner. - Added nested coroutine chaining through
yield return IEnumerator. - Parent routines resume after child routines complete.
- Nested coroutine chains can run to arbitrary practical depth.
- Root handles remain valid while child routines are active.
- Stopping a root coroutine safely stops and cleans up the entire child chain.
- Coroutine cleanup now safely handles stopping during an active coroutine update.
CoroutineManagernow usesFrameTime.- Numeric
float,double, andintyields continue to represent scaled-time delays. CoroutineHandleremains an immutablereadonly struct.
Beacons
BeaconHandlepayload data is now exposed as a read-only view.- Default-initialized handles are safe.
- Added payload
Count. - Improved
GetandTryGethandling. - Subscription mutation is synchronized while publishing keeps the existing fast multicast
Action<BeaconHandle>path. - Publishing remains synchronous.
Beacon Extensions
- Added
BeaconManager.PublishDelayfor delayed string and enum topic publishing. - Delayed publishing uses VOID's coroutine system and scaled game time.
PublishDelayreturns aCoroutineHandleand can be cancelled.- Added typed payload helpers for one through five values.
- Added
Get,GetOr,TryGet,Has,IsTopic,HasData, andIsEmpty.
Game Loop
- Separated fixed-update timing from rendered-frame timing.
- Added render-frame tracking for automatic camera updates.
- Preserved graceful shutdown checks so update and rendering stop immediately after the window closes.
Fixes
- Fixed coroutine state mutation when a coroutine stops itself or is stopped during
MoveNext(). - Deferred coroutine cleanup until it is safe to dispose the active chain.
- Preserved deepest-first nested coroutine disposal.
NuGet: Void.Engine 2.1.0
VOID Engine 2.0.1
VOID Engine 2.0.0
VOID 2.0 is here.
This release is a major architectural update that replaces VOID's old SFML-based foundation with a platform and rendering stack owned by VOID and designed around extensibility.
Packages
Void.Engine 2.0.1Void.Packer 1.0.1Void.Packer.CLI 1.0.1Void.Templates 1.0.1
What's New
New Platform and Rendering Foundation
VOID is no longer built around SFML.
VOID 2.0 now uses:
- SDL3-CS for windows, displays, events, keyboard, mouse, gamepads, fullscreen, and platform integration
- Silk.NET.OpenGL for the built-in OpenGL renderer
- Silk.NET.OpenAL with NAudio.SoundFile for audio
Pluggable Rendering
The renderer is no longer tied to OpenGL or an internal platform implementation.
VOID now exposes renderer-neutral APIs including:
IRendererBackendIGraphicsDeviceIRendererContext- renderer-neutral textures, shaders, buffers, pipelines, samplers, render targets, and graphics resources
Developers can build their own backends for APIs such as Vulkan, Direct3D, Metal, OpenGL, or other custom renderers without forking VOID.
Camera and Math
VOID now includes its own matrix implementation and an extensible camera foundation.
Highlights include:
BaseCamera- VOID-owned
Matrix - camera rotation
- matrix-based
WorldToScreen/ScreenToWorld - rotated camera bounds and culling
- support for custom camera implementations
Rendering Performance
The 2.0 renderer received a large internal cleanup and optimization pass.
Changes include:
- indexed sprite rendering using four vertices per sprite
- reusable index buffers
- reduced redundant OpenGL state changes
- improved GPU buffer uploads
- reduced unnecessary CPU-side copies
- improved camera and atlas hot paths
- rendering and batching correctness fixes
Texture Atlas Reliability
The atlas system received extensive correctness work, including:
- fixes for overlapping Skyline regions
- stronger Skyline and Guillotine validation
- transactional defragmentation
- safer custom
IAtlasPackersupport - synchronized CPU metadata and GPU uploads
- improved LRU eviction and recovery
- more accurate atlas metrics
Input, Audio, Logging, Pathfinding, and Core Fixes
VOID 2.0 also includes a large collection of improvements across the rest of the framework, including:
- SDL3 keyboard, mouse, and gamepad input
- improved
InputActionhandling - OpenAL-based audio
- pathfinding correctness fixes
- hardened logging and shutdown behavior
FastRandom,Vect2,FrameTime,DisplayMode, andMatrixfixes- improved LDtk setting lookups without exception-driven
TryGetpaths - extensive public API documentation cleanup
Asset Packer
The VOID asset packing tools have also been refreshed.
Void.Packer and Void.Packer.CLI provide:
- AES-GCM authenticated encryption
- compression
- integrity verification
- configurable chunked encryption
- streaming reads
- incremental updates
The installed CLI command is now:
void-packerMigration
VOID 2.0 contains breaking changes for projects that directly relied on the old SFML-based graphics APIs.
Existing high-level VOID workflows remain familiar, but renderer integrations, graphics resources, camera extensions, and platform-specific code may require migration.
Install
dotnet add package Void.EngineOr start with the project template:
dotnet new install Void.Templates
dotnet new voidgame -n MyGameVOID 2.0 establishes the new foundation for the engine: renderer-neutral, platform-independent, extensible, and fully owned by VOID.
Void Engine v1.2.1: DiscoverableHelper Hotfix
Hotfix Release
This release fixes a critical stack overflow in DiscoverableHelper that could crash the engine during startup or mod loading.
Fixed
- Fixed infinite recursion in
IsGameAssemblycausing stack overflow during assembly scanning - Fixed
DiscoverableHelpernot respectingAssemblyScanMode.ExcludeFramework - Fixed assembly metadata inspection inside
AssemblyLoadevents triggering recursive loading
Added
- Added
TryFindManyByNamewith string and enum overloads - Added
TryFindManyByCategorywith string and enum overloads - Added
TryFindManyByNameAndCategorywith string and enum overloads - Added
TryFindAllfor bool-based collection queries
Changed
- Replaced
IsGameAssemblywithShouldScanAssemblyandIsDefaultAllowed - Updated
OnAssemblyLoadto only increment version counter - Wrapped assembly scanning in try/catch for graceful failure
Impact
Recommended for all users on 1.0.0, 1.1.0, and 1.2.0.
NuGet Package
Void Engine 1.2.0
What's New in 1.2.0
This release focuses on API consistency, collision improvements, math utilities, and performance optimizations.
Added
- Rect2.Lerp and Rect2.SmoothStep with static/instance variants
- LineRect with hit point/normal output
- Angle utilities to MathHelper (WrapAngle, WrapAngleDegrees, AngleDifference, MoveTowardsAngle)
- Damp for exponential decay smoothing
- Repeat for value wrapping in range
- SmootherStep for 5th order interpolation
- Frac for fractional part extraction
- Epsilon guard in RaycastRect to prevent division by zero
- Missing Ninepatch and DrawText overloads for API consistency
- Additional datatypes for JsonHelper GetPropertyOrDefault and GetElementOrDefault
Fixed
- MoveAndSlideRect corner sticking by separating X and Y axis collision resolution
- MoveAndSlideCircle X axis position being overwritten
- LineLine edge cases (collinear lines, shared endpoints, point-on-line)
- Swept collision hitPoint/hitNormal assignment
- ClosestPointCircle center-point edge case
- LDtk Array FilePath settings returning incorrect type
- BeaconHandle TryGet returning true for value types on type mismatch
- DrawCommandComparer texture validity checks
- Visibility checks accounting for scale and origin
Changed
- SpriteBatcher public API parameter ordering is now consistent
- EnumExtensions now supports all common enum underlying types via Convert.ToInt64
- Collision resolution replaced with direct position snapping based on movement direction
- Deterministic 2-pass collision checks (X axis, then Y axis)
- Ninepatch drawing extracted to EngineDrawNinePatch to eliminate duplication
- Implementation details moved to private regions
Removed
- Pre-scaling of dstRect in EngineDraw and EngineDrawBypassAtlas
- Per-frame List allocations in MoveAndSlide methods
- Iteration parameter from collision resolution
NuGet Package
Breaking Changes
- DrawText parameter order changed:
alignment, scaleis nowscale, alignment - DrawText parameter order changed:
scale, depthis nowscale, depth(depth always last)
Void Templates 1.0.0
Added
- Void.Templates NuGet package
- New project template: dotnet new voidgame
- Template generates complete runnable game project
- Supports --appCompany and --appTitle parameters
- Includes Content/ folder for assets
- Pre-configured .csproj with Void.Engine reference
NuGet Packages
Void Engine 1.1.0
[1.1.0] - 2026-09-01
Added
- CollisionHelper class with full collision detection and resolution:
- Primitives: IsWithinRadius, IsCircleOverlap, ClosestPointRect, ClosestPointCircle, LineLine
- Shape to Shape: RectRect, CircleCircle, RectCircle
- Point to Shape: PointRect, PointCircle
- Line to Shape: LineLine, LineRect, LineCircle
- Distance Between Shapes: DistanceRectRect, DistanceCircleCircle, DistanceRectCircle
- Raycasting: RaycastRect, RaycastCircle, RaycastAny
- Swept Collision (prevents tunneling): SweptRectRect, SweptCircleRect, SweptCircleCircle
- Collision Normals: GetCollisionNormal (Rect, Circle, Circle-Circle)
- Reflection: Reflect velocity off surfaces
- Containment: RectContainsRect, RectContainsCircle, CircleContainsCircle, CircleContainsRect
- Pushback: PushRectRect, PushCircleRect, PushCircleCircle
- Move and Slide: MoveAndSlideRect, MoveAndSlideCircle
- Bounds Conversion: GetCircleBounds (for broadphase optimization)
Changed
- Rect2 now delegates all collision logic to CollisionHelper
- Easier to maintain and extend