1#include "BufferedRaylib.hpp"
15 if (type != o.type)
return type < o.type;
16 if (type == Type::Gamepad && gamepad.id == o.gamepad.id)
17 return gamepad.button < o.gamepad.button;
18 return keyboard < o.keyboard;
23 break;
case Button::Type::Keyboard:
24 return IsKeyDown(button.keyboard);
25 break;
case Button::Type::Mouse:
26 return IsMouseButtonDown(button.mouse);
27 break;
case Button::Type::Gamepad: {
28 return IsGamepadButtonDown(button.gamepad.id, button.gamepad.button);
30 break;
default: assert(button.type != Button::Type::Invalid);
37 for(
auto& button: buttons)
44 data = std::move(o.data);
45 callback = std::move(o.callback);
46 if(o.type == Type::Button) data.button.buttons = std::exchange(o.data.button.buttons,
nullptr);
47 else if(o.type == Type::MultiButton) data.multi.quadButtons = std::exchange(o.data.multi.quadButtons,
nullptr);
51 void Action::PumpButton(std::string_view name) {
52 assert(data.button.buttons);
54 if (state != data.button.last_state) {
55 if(data.button.combo) {
56 if(
bool comboState = state == data.button.buttons->size(), lastComboState = data.button.last_state == data.button.buttons->size(); comboState != lastComboState)
57 callback(name, {(float)comboState}, {(float)lastComboState});
58 }
else callback(name, {(float)state}, {(float)data.button.last_state});
59 data.button.last_state = state;
63 void Action::PumpAxis(std::string_view name) {
64 float state = data.axis.last_state;
65 switch(data.axis.type) {
66 break;
case Data::Axis::Type::Gamepad: {
67 float movement = GetGamepadAxisMovement(data.axis.gamepad.id, data.axis.gamepad.axis);
68 if(movement != 0) state += movement;
70 break;
case Data::Axis::Type::MouseWheel: {
71 float movement = GetMouseWheelMove();
72 if(movement != 0) state += movement;
74 break;
default: assert(data.axis.type != Data::Axis::Type::Invalid);
76 if (state != data.axis.last_state) {
77 callback(name, {state}, {state - data.axis.last_state});
78 data.axis.last_state = state;
82 void Action::PumpVector(std::string_view name) {
83 Vector2 state = data.vector.last_state;
84 switch(data.vector.type) {
85 break;
case Data::Vector::Type::MouseWheel:
86 state = GetMouseWheelMoveV();
87 break;
case Data::Vector::Type::MousePosition:
88 state = GetMousePosition();
91 break;
case Data::Vector::Type::GamepadAxes: {
92 state.x += GetGamepadAxisMovement(data.vector.gamepad.horizontal.id, data.vector.gamepad.horizontal.axis);
93 state.y += GetGamepadAxisMovement(data.vector.gamepad.vertical.id, data.vector.gamepad.vertical.axis);
95 break;
default: assert(data.vector.type != Data::Vector::Type::Invalid);
97 if (!Vector2Equals(state, data.vector.last_state)) {
98 callback(name, state, Vector2Subtract(state, data.vector.last_state));
99 data.vector.last_state = state;
104 if(gamepadVertical < 0) gamepadVertical = gamepadHorizontal;
106 Action out = {Action::Type::Vector, {.vector = { Data::Vector::Type::GamepadAxes}}};
107 out.data.vector.gamepad = {{gamepadHorizontal, horizontal}, {gamepadVertical, vertical}};
111 void Action::PumpMultiButton(std::string_view name) {
112 Vector2 state = data.multi.last_state;
114 auto type = data.multi.type;
115 std::array<uint8_t, 4> buttonState;
116 for(uint8_t i = 0; i < (type == Data::MultiButton::Type::QuadButtons ? 4 : 2); i++) {
118 if(data.multi.quadButtons->normalize && buttonState[i] > 0)
121 if(type == Data::MultiButton::Type::QuadButtons)
122 state.x = buttonState[MultiButtonData<4>::Direction::Left] - buttonState[MultiButtonData<4>::Direction::Right];
123 state.y = buttonState[MultiButtonData<4>::Direction::Up] - buttonState[MultiButtonData<4>::Direction::Down];
125 if(type == Data::MultiButton::Type::ButtonPair)
128 if (!Vector2Equals(state, data.multi.last_state)) {
129 callback(name, state, Vector2Subtract(state, data.multi.last_state));
130 data.multi.last_state = state;
136 break;
case Action::Type::Button:
138 break;
case Action::Type::Axis:
140 break;
case Action::Type::Vector:
142 break;
case Action::Type::MultiButton:
143 PumpMultiButton(name);
144 break;
default: assert(type != Action::Type::Invalid);
148 void BufferedInput::PollEvents(
bool whileUnfocused ) {
149 if(!whileUnfocused && !IsWindowFocused())
return;
150 for(
auto& [name, action]: actions)
151 action.PollEvents(name);
All raylib-cpp classes and functions appear in the raylib namespace.
Represents various input action types, such as buttons, axes (controller trigger, mouse wheel),...
void PollEvents(std::string_view name)
Function which updates the state of the action and invokes the callback if a change occured.
static Action gamepad_axes(GamepadAxis horizontal=GAMEPAD_AXIS_LEFT_X, GamepadAxis vertical=GAMEPAD_AXIS_LEFT_Y, int gamepadHorizontal=0, int gamepadVertical=-1)
Action that merges two seperate gamepad axis into a single vector.