novolis-governance / imports-todo/gameengine-input.md
Import: `Frank.GameEngine.Input` → Novolis
Policies that keep the org coherent
dotnetgovernancenovolis
Source: D:\frankrepos\Frank.GameEngine\src\Frank.GameEngine.Input
What
| Type | Role |
|---|---|
| `IInputSource` | Abstract input (keyboard/mouse) |
| `InputManager` | Global hook-backed implementation (SharpHook) |
| `NullInputSource` | No global hook — window API polls instead |
| `KeyboardKey`, converters | Engine-agnostic key enum + SharpHook mapping |
Used by GameEngine.Initialize(IRenderer) to start background input unless NullInputSource is passed (FPS samples with Raylib polling).
Why
- `novolis-raylib` exposes per-frame
RayGameContextpolling; no shared abstraction for desktop games that want global hooks (borderless fullscreen, overlays) vs null for Raylib-native FPS. - Dogfood (
DoomLite3D,XFighter) duplicate input wiring patterns. - Orthogonal to Simulation (no clocks) — fits Raylib host lane, not
Novolis.Simulation.*.
How
Target
`novolis-raylib` — e.g. Novolis.Raylib.Input:
- Depends on BCL + SharpHook (same as Frank).
- Must not reference
Novolis.Simulation.
Port steps
- Strip
Frank.GameEngine.*namespaces →Novolis.Raylib.Input. - Keep
IInputSource+NullInputSourceas public surface; hide SharpHook in implementation assembly if desired. - Document pairing with
Novolis.Raylib.Game: default null for Raylib-polling games; opt-inInputManagerfor global hook. - TUnit:
NullInputSourceno-op; converter round-trip tests (no hook in CI). - Update one sample in
novolis-dogfoodingto demonstrate both modes.
Boundaries
- Do not pull
Frank.GameEngine.Core— input only. - Raylib bindings stay in
Novolis.Raylib.Bindings; this is policy layer above.
Acceptance
- Package published; README shows Raylib-poll vs global-hook choice.
- Zero Simulation package references.