Releases: pandoraoyun/InputForge
Release list
v0.2.3
Add LICENSE.md inside addons/input_forge/ so the license ships with the installed addon, matching the Asset Store listing type. Rename demo folder to addons/input_forge_demo/ for naming consistency. No functional/code changes to the addon.
v0.2.2 - InputFoge
v0.2.1 InputForge
InputForge 0.2.1
Multiple callbacks can now bind to the same action — a drop-in,
backwards-compatible change with no public API differences.
Added
- Multiple subscribers per action.
InputMappingContextstores
per-type subscriber lists (bool/float/Vector2/Vector3/
ContextualInputEvent), keyed case-insensitively by action name.
Several callbacks canBindActionto one action and all fire on
dispatch;UnbindActionremoves a single callback. Lists are
allocated lazily on first bind of each type.
Internal
SubscriberListExtensions.Invoke<T>— null/empty-safe indexed-loop
dispatch helper (no enumerator allocation, no per-event type switch).
internal, not part of the public API.
Design note
The per-type split trades a recurring per-event cost (scanning one mixed
list + switching on each delegate's Action<> type + boxing the value)
for at most five one-time lazy list allocations, then dispatches each
typed list directly with the pre-computed value.
Compatibility
No public signature changes. Existing single-subscriber code behaves
identically. Requires Godot 4.7+ (.NET build).
Install
npx degit pandoraoyun/InputForge/addons/input_forge addons/input_forge
Full changelog: see CHANGELOG.md
InputForge 0.2.0
InputForge 0.2.0
Pointer input, two real bug fixes, and a test/CI foundation. Boolean input now picks its physical device explicitly, and InputKey can report the live mouse position straight from the viewport.
Highlights
Mouse position is now a first-class input. The new InputType.Pointer makes an InputKey report the absolute cursor position, read live from the active Viewport — not reconstructed from motion deltas. It's a different question from Delta ("where is the cursor" vs. "how much did it move"), so it's its own type. Falls back to the event's own position when used outside the normal dispatch path.
Boolean input got a DeviceType. Boolean InputKeys now explicitly select Keyboard, JoyButton, or MouseButton, so one binding model cleanly covers keys, gamepad buttons, and mouse buttons. The Inspector hides whatever doesn't apply to the current selection.
Added
InputType.Pointer — absolute mouse position from the live Viewport, with a graceful fallback when no EnhancedInputSystem instance is present.
DeviceType for Boolean keys (Keyboard / JoyButton / MouseButton).
Smarter Inspector — _ValidateProperty shows only the fields relevant to the selected InputType / DeviceType / AxisDimension.
~84% test coverage of the addon, running against a real headless Godot runtime via 2dog: modifiers (Invert, Scale, Swizzle, Normalize), triggers (TriggerOnKeyUp, TriggerContinuous), full InputKey (HandleInput routing, Equals/GetHashCode/== identity, _ValidateProperty matrix), plus InputAction and ContextualInputEvent.
CI — tests + coverage now run on every pull request to main.
Fixed
PriorityChanged(bool) could not be emitted. The bool was being marshalled as Nullable, throwing InvalidOperationException: type not supported for conversion to/from Variant. Now wrapped with Variant.From(...) so it marshals as a plain bool.
Dangling singleton reference. EnhancedInputSystem._instance was set in _Ready but never cleared, leaving a freed node referenced after teardown. Added _ExitTree cleanup, guarded against nulling a newer instance during a reload.
Notes
Coverage is measured with generated Godot marshalling code excluded (see InputForge.Tests/README.md) — an unfiltered run reports a misleadingly lower number because every partial class emits large amounts of auto-generated glue.
Full changelog: v0.1.1...v0.2.0
InputForge v0.1.1
InputForge v0.1.1
A quick follow-up release, one day after the initial Asset Library submission — a few real bugs were caught by the new unit tests, and some practical features came out of building a demo scene.
New
-
Context equality — compare contexts by name with
==/!=, so you can checkEnhancedInputSystem.GetInstance().GetCurrentContext() == GameplayContextwithout holding a reference to the exact same resource. -
PreventFallbackContext— when enabled, only the topmost context handles input; nothing falls through to lower contexts even if it doesn't match. Useful for modal states like a pause menu or mouse-look mode that should fully take over input. -
DuplicateContextBehavior— controls what happens if you push a context that's already active. Defaults to Replace, which moves it to the top instead of leaving a stale duplicate behind. -
Stack & context signals —
EnhancedInputSystemnow emitsActiveContextChanged,ContextPushed,ContextPopped. EachInputMappingContextalso emits its ownPushed,Popped, andPriorityChanged. -
Throughput benchmarks — added stability/throughput tests comparing InputForge's dispatch against N classes each overriding
_Input()independently. InputForge comes out ~1.5x cheaper at 10 handlers and ~6.8x cheaper at 500 handlers. Full write-up in SMOKE_BENCH.md.
Fixed
DeadzoneModifiernow correctly zeroes a value exactly equal to the deadzone threshold (was <, now <=) — caught by the new unit tests.- Fixed a signal bug where
ActiveContextChangedcould fire incorrectly when popping a non-topmost context, or when re-pushing an already-topmost one.
Other
- Fixed .gitattributes so Asset Library installs only pull addons/input_forge, not any other locally-installed addons.