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