1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #include "input/Buttons.h"
- Buttons::Axis::Axis() : less(0.0f), greater(0.0f), lessIndex(-1), greaterIndex(-1) {
- }
- Buttons::Buttons(const Window& window) : window(window), dummy(0, "Dummy"), activeController(-1), gamepadToButton(-1) {
- }
- Button& Buttons::add(int key, const char* name) {
- if(buttons.add(key, name)) {
- return dummy;
- }
- return buttons[buttons.getLength() - 1];
- }
- void Buttons::mapGamepadButton(const Button& button, int mapping) {
- gamepadToButton[mapping] = searchButton(button);
- }
- void Buttons::mapGamepadAxis(const Button& button, float value, int index) {
- if(value > 0.0f) {
- gamepadAxisToButton[index].greater = value;
- gamepadAxisToButton[index].greaterIndex = searchButton(button);
- } else {
- gamepadAxisToButton[index].less = value;
- gamepadAxisToButton[index].lessIndex = searchButton(button);
- }
- }
- void Buttons::tick() {
- DownArray down(false);
- if(searchForGamepad()) {
- checkGamepad(down);
- }
- for(int i = 0; i < buttons.getLength(); i++) {
- buttons[i].tick(window.isKeyDown(buttons[i].key) || down[i]);
- }
- }
- const ButtonList& Buttons::get() const {
- return buttons;
- }
- bool Buttons::searchForGamepad() {
- if(activeController != -1) {
- return true;
- }
- for(int i = GLFW_JOYSTICK_1; i <= GLFW_JOYSTICK_LAST; i++) {
- if(glfwJoystickIsGamepad(i)) {
- activeController = i;
- return true;
- }
- }
- return false;
- }
- void Buttons::checkGamepad(DownArray& down) {
- GLFWgamepadstate state;
- if(!glfwGetGamepadState(activeController, &state)) {
- return;
- }
- for(int i = 0; i <= GLFW_GAMEPAD_BUTTON_LAST; i++) {
- if(gamepadToButton[i] != -1 && state.buttons[i]) {
- down[gamepadToButton[i]] = true;
- }
- }
- for(int i = 0; i <= GLFW_GAMEPAD_AXIS_LAST; i++) {
- if(gamepadAxisToButton[i].greaterIndex != -1 && state.axes[i] > gamepadAxisToButton[i].greater) {
- down[gamepadAxisToButton[i].greaterIndex] = true;
- } else if(gamepadAxisToButton[i].lessIndex != -1 && state.axes[i] < gamepadAxisToButton[i].less) {
- down[gamepadAxisToButton[i].lessIndex] = true;
- }
- }
- }
- int Buttons::searchButton(const Button& button) const {
- for(int i = 0; i < buttons.getLength(); i++) {
- if(&button == &(buttons[i])) {
- return i;
- }
- }
- return -1;
- }
|