blob: 5a65d198ae7b6c1b235e550a3a389d6addd4fb59 [file]
#ifndef _RIVE_GAMEPAD_SNAPSHOT_HPP_
#define _RIVE_GAMEPAD_SNAPSHOT_HPP_
#include <cstddef>
#include <cstdint>
#include <vector>
namespace rive
{
/// A single field change in a gamepad "update" wire message or event.
enum class GamepadInputChangeKind : uint8_t
{
button = 0,
axis = 1,
};
struct GamepadInputChange
{
GamepadInputChangeKind kind = GamepadInputChangeKind::button;
/// W3C button or axis index (0-based).
uint8_t index = 0;
/// `GamepadButton.value` (0-1) or axis analog value.
float value = 0.f;
};
/// How closely the embedder could map hardware to the W3C Standard Gamepad
/// layout.
enum class GamepadMappingKind : uint8_t
{
/// Buttons and axes follow https://w3c.github.io/gamepad/#remapping
standard = 0,
/// Non-standard device or unmapped — semantic filters may be unreliable.
unknown = 1,
};
/// Neutral gamepad snapshot in `ListenerInvocation` and embedder state.
///
/// - `deviceId`: embedder-defined stable id for the logical device session
/// (hot-plug may allocate a new id; document embedder policy alongside the
/// integration).
/// - `buttonMask`: bit \e i set when W3C standard gamepad button \e i is
/// pressed
/// (see https://w3c.github.io/gamepad/#remapping ).
/// - `buttonValues`: parallel to W3C `buttons[]` order, each entry is
/// `GamepadButton.value` (0–1), including analog triggers and pressure.
/// - `axes`: ordered analog values; length is embedder-defined (W3C standard
/// layout uses at least six: left stick, right stick, then left/right
/// triggers). Typical ranges: sticks [-1,1], triggers [0,1].
/// - `mapping`: whether the embedder normalized to the standard layout; when
/// `unknown`, semantic helpers that map names to indices may not apply.
struct GamepadSnapshot
{
int deviceId = 0;
uint64_t buttonMask = 0;
std::vector<float> buttonValues;
std::vector<float> axes;
GamepadMappingKind mapping = GamepadMappingKind::standard;
};
} // namespace rive
#endif