Skip to content

Releases: Shmellyorc/Void

VOID Engine 2.2.1

Choose a tag to compare

@Shmellyorc Shmellyorc released this 09 Oct 09:20

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() and Cache64IgnoreCase() 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 SoundInstancePool background 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.1

NuGet: https://www.nuget.org/packages/Void.Engine/2.2.1

VOID Engine 2.2.0

Choose a tag to compare

@Shmellyorc Shmellyorc released this 23 Sep 20:19

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 TimeSpan lifetime overloads.
  • Added SubscribeOnce for 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 ulong action 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.Cache32 and Cache64 to avoid creating unused Lazy values 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 MoveAndSlideCircle corner 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.0

VOID Engine 2.1.1

Choose a tag to compare

@Shmellyorc Shmellyorc released this 18 Sep 11:11

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) and ClearScissor()
  • 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 RenderCommand submissions 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
  • SpriteBatcher and PrimitiveBatcher inherit scissor support automatically

Input Actions

  • Removed unnecessary per-frame InputActionState dictionary allocations
  • Reuse unchanged input snapshots instead of cloning state every update
  • Added a fast path when no input actions are registered
  • Default InputActionState remains allocation-free and treats missing actions as released
  • Preserved stable retained snapshots across subsequent updates
  • Preserved JustPressed, Pressed, JustReleased, and Up transition 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

Choose a tag to compare

@Shmellyorc Shmellyorc released this 14 Sep 18:50

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 FrameTime to 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.
  • DeltaTime remains time-scale aware.
  • ElapsedTime, UnscaledDeltaTime, TotalTime, interpolation alpha, FPS, and slow-frame tracking remain available through FrameTime.

Coroutines

  • Replaced the previous coroutine implementation with a VOID-native IEnumerator runner.
  • 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.
  • CoroutineManager now uses FrameTime.
  • Numeric float, double, and int yields continue to represent scaled-time delays.
  • CoroutineHandle remains an immutable readonly struct.

Beacons

  • BeaconHandle payload data is now exposed as a read-only view.
  • Default-initialized handles are safe.
  • Added payload Count.
  • Improved Get and TryGet handling.
  • Subscription mutation is synchronized while publishing keeps the existing fast multicast Action<BeaconHandle> path.
  • Publishing remains synchronous.

Beacon Extensions

  • Added BeaconManager.PublishDelay for delayed string and enum topic publishing.
  • Delayed publishing uses VOID's coroutine system and scaled game time.
  • PublishDelay returns a CoroutineHandle and can be cancelled.
  • Added typed payload helpers for one through five values.
  • Added Get, GetOr, TryGet, Has, IsTopic, HasData, and IsEmpty.

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

Choose a tag to compare

@Shmellyorc Shmellyorc released this 13 Sep 15:54

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.1
  • Void.Packer 1.0.1
  • Void.Packer.CLI 1.0.1
  • Void.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:

  • IRendererBackend
  • IGraphicsDevice
  • IRendererContext
  • 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 IAtlasPacker support
  • 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 InputAction handling
  • OpenAL-based audio
  • pathfinding correctness fixes
  • hardened logging and shutdown behavior
  • FastRandom, Vect2, FrameTime, DisplayMode, and Matrix fixes
  • improved LDtk setting lookups without exception-driven TryGet paths
  • 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-packer

Migration

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.Engine

Or start with the project template:

dotnet new install Void.Templates
dotnet new voidgame -n MyGame

VOID 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

Choose a tag to compare

@Shmellyorc Shmellyorc released this 08 Sep 07:57

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 IsGameAssembly causing stack overflow during assembly scanning
  • Fixed DiscoverableHelper not respecting AssemblyScanMode.ExcludeFramework
  • Fixed assembly metadata inspection inside AssemblyLoad events triggering recursive loading

Added

  • Added TryFindManyByName with string and enum overloads
  • Added TryFindManyByCategory with string and enum overloads
  • Added TryFindManyByNameAndCategory with string and enum overloads
  • Added TryFindAll for bool-based collection queries

Changed

  • Replaced IsGameAssembly with ShouldScanAssembly and IsDefaultAllowed
  • Updated OnAssemblyLoad to 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

Choose a tag to compare

@Shmellyorc Shmellyorc released this 07 Sep 16:50

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, scale is now scale, alignment
  • DrawText parameter order changed: scale, depth is now scale, depth (depth always last)

Void Templates 1.0.0

Choose a tag to compare

@Shmellyorc Shmellyorc released this 02 Sep 02:46

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

Choose a tag to compare

@Shmellyorc Shmellyorc released this 01 Sep 10:44

[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

NuGet Packages