Cogs.Core
InputDeviceState.h
1#pragma once
2
3#include "Base.h"
4
5#include <array>
6#include <unordered_map>
7#include <string>
8#include <vector>
9
10namespace Cogs
11{
12 namespace Core
13 {
14 constexpr size_t kMaxAxes = 128;
15 constexpr size_t kMaxActions = 128;
16
17 constexpr float kDefaultDeadZone = 0.1f;
18 constexpr size_t kNoDeadZoneLink = static_cast<size_t>(-1);
19 constexpr float kDefaultSensitivity = 1.0f;
20
22 {
23 InputDeviceState() = default;
24
25 InputDeviceState(const InputDeviceState &) = default;
26
27 void setButton(size_t index, bool state)
28 {
29 if (state != buttons[index]) {
30 buttonDeltas[index] = true;
31 buttons[index] = state;
32 }
33 }
34
35 bool pressed(size_t index) const
36 {
37 return buttons[index] && buttonDeltas[index];
38 }
39
40 bool released(size_t index) const
41 {
42 return !buttons[index] && buttonDeltas[index];
43 }
44
45 void setAxis(size_t index, float value)
46 {
47 if (value != axes[index]) {
48 axisDeltas[index] = value - axes[index];
49 axes[index] = value;
50 }
51 }
52
53 size_t countBits(uint64_t flags)
54 {
55 size_t count = 0;
56 for (uint64_t i = 0; i < 64; i++) {
57 uint64_t bit = 1;
58 uint64_t mask = bit << i;
59 if ((flags & mask) > 0) count++;
60 }
61 return count;
62 }
63
64 int8_t highestBit(uint64_t flags)
65 {
66 for (int8_t i = 63; i >= 0; i--) {
67 uint64_t bit = 1;
68 uint64_t mask = bit << i;
69 if ((flags & mask) > 0) return i;
70 }
71 return -1;
72 }
73
74 size_t deviceId = static_cast<size_t>(-1);
75 std::string id;
76 std::string alias;
77
78 size_t axisMask = 0;
79 size_t buttonMask = 0;
80
81 std::array<float, kMaxAxes> axes = { 0.f };
82 std::array<float, kMaxAxes> axisDeltas = { 0.f };
83
84 // Used to derive final axis values.
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 };
89
90 std::array<bool, kMaxActions> buttons = { false };
91 std::array<bool, kMaxActions> buttonDeltas = { false };
92
93 bool isConnected = false;
94 bool isValid = false;
95
96 std::unordered_map<std::string, size_t> axisMap;
97 std::unordered_map<std::string, size_t> actionMap;
98
99 std::vector<std::string> axisNames;
100 std::vector<std::string> actionNames;
101
102 class IInputDevice * device = nullptr;
103 };
104 }
105}
Contains all Cogs related functionality.
Definition: FieldSetter.h:23