6#include <unordered_map>
14 constexpr size_t kMaxAxes = 128;
15 constexpr size_t kMaxActions = 128;
17 constexpr float kDefaultDeadZone = 0.1f;
18 constexpr size_t kNoDeadZoneLink =
static_cast<size_t>(-1);
19 constexpr float kDefaultSensitivity = 1.0f;
27 void setButton(
size_t index,
bool state)
29 if (state != buttons[index]) {
30 buttonDeltas[index] =
true;
31 buttons[index] = state;
35 bool pressed(
size_t index)
const
37 return buttons[index] && buttonDeltas[index];
40 bool released(
size_t index)
const
42 return !buttons[index] && buttonDeltas[index];
45 void setAxis(
size_t index,
float value)
47 if (value != axes[index]) {
48 axisDeltas[index] = value - axes[index];
53 size_t countBits(uint64_t flags)
56 for (uint64_t i = 0; i < 64; i++) {
58 uint64_t mask = bit << i;
59 if ((flags & mask) > 0) count++;
64 int8_t highestBit(uint64_t flags)
66 for (int8_t i = 63; i >= 0; i--) {
68 uint64_t mask = bit << i;
69 if ((flags & mask) > 0)
return i;
74 size_t deviceId =
static_cast<size_t>(-1);
79 size_t buttonMask = 0;
81 std::array<float, kMaxAxes> axes = { 0.f };
82 std::array<float, kMaxAxes> axisDeltas = { 0.f };
85 std::array<float, kMaxAxes> deadZones = { kDefaultDeadZone };
86 std::array<size_t, kMaxAxes> linkedDeadZones = { kNoDeadZoneLink };
87 std::array<float, kMaxAxes> sensitivity = { kDefaultSensitivity };
88 std::array<bool, kMaxAxes> invert = {
false };
90 std::array<bool, kMaxActions> buttons = {
false };
91 std::array<bool, kMaxActions> buttonDeltas = {
false };
93 bool isConnected =
false;
96 std::unordered_map<std::string, size_t> axisMap;
97 std::unordered_map<std::string, size_t> actionMap;
99 std::vector<std::string> axisNames;
100 std::vector<std::string> actionNames;
Contains all Cogs related functionality.