---
name: input_unified
kind: function
lang: cpp
domain: gamedev
version: "0.1.0"
purity: impure
signature: "input_begin_frame(InputState&); input_process_event(InputState&, const SDL_Event*)"
description: "Snapshot unificado de input por frame para SDL3. Mapea keyboard (WASD+arrows), mouse, gamepad (SDL_Gamepad) y touch a botones logicos (left/right/up/down/action_a..y/start/back) y ejes analogicos. Expone flags *_pressed con rising edge limpio cada frame. Issue 0072b — runtime gamedev PC + WASM."
tags: [gamedev-engine, input, sdl3, touch, gamepad]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
example: |
  fn::input::InputState input{};
  // per frame:
  fn::input::input_begin_frame(input);
  SDL_Event e;
  while (SDL_PollEvent(&e)) {
      fn::input::input_process_event(input, &e);
  }
  if (input.a_pressed) jump();
  player.x += input.lx * speed * dt;
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/gamedev/input_unified.cpp"
params:
  - name: state
    desc: "InputState mantenido por la app entre frames (bools held + analog axes + touch slots)."
  - name: event
    desc: "Puntero al SDL_Event devuelto por SDL_PollEvent en el loop principal."
output: "Mutaciones in-place sobre InputState. Sin retorno. Sin asignaciones dinamicas."
---

# input_unified

Capa fina sobre SDL3 que normaliza todas las fuentes de input a un struct plano consultable cada frame. Sirve como fundacion para apps gamedev del registry (issue 0072b) y para tests headless.

Reglas de uso:
- `input_begin_frame` se llama UNA vez por frame antes de bombear eventos. Limpia los flags `*_pressed` (rising edge), no los `*` held.
- `input_process_event` se llama por cada `SDL_Event` recibido. Acumula state hasta que el siguiente `begin_frame` resetee edges.
- Stick deadzone fijo a 0.15 — si la app necesita custom, reescribir snapshot tras la lectura.
- Touch ids estables mientras el dedo este pressed; al soltar se compacta el array.
- Gamepads conectados se abren automaticamente en `SDL_EVENT_GAMEPAD_ADDED`.
