summaryrefslogtreecommitdiffstats
path: root/src/game/client/gamepad.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/client/gamepad.cc')
-rw-r--r--src/game/client/gamepad.cc168
1 files changed, 0 insertions, 168 deletions
diff --git a/src/game/client/gamepad.cc b/src/game/client/gamepad.cc
deleted file mode 100644
index 6cbcb3f..0000000
--- a/src/game/client/gamepad.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-#include "client/pch.hh"
-
-#include "client/gamepad.hh"
-
-#include "core/cmdline.hh"
-#include "core/config.hh"
-#include "core/constexpr.hh"
-
-#include "client/glfw.hh"
-#include "client/globals.hh"
-#include "client/settings.hh"
-#include "client/toggles.hh"
-
-constexpr static int INVALID_GAMEPAD_ID = INT_MAX;
-constexpr static std::size_t NUM_AXES = static_cast<std::size_t>(GLFW_GAMEPAD_AXIS_LAST + 1);
-constexpr static std::size_t NUM_BUTTONS = static_cast<std::size_t>(GLFW_GAMEPAD_BUTTON_LAST + 1);
-constexpr static float GAMEPAD_AXIS_EVENT_THRESHOLD = 0.5f;
-
-static int active_gamepad_id;
-
-bool gamepad::available = false;
-ConfigFloat gamepad::deadzone(0.00f, 0.00f, 0.66f);
-ConfigBoolean gamepad::active(false);
-GLFWgamepadstate gamepad::state;
-GLFWgamepadstate gamepad::last_state;
-
-static void on_toggle_enable(const ToggleEnabledEvent& event)
-{
- if(event.type == TOGGLE_USE_GAMEPAD) {
- gamepad::active.set_value(true);
- return;
- }
-}
-
-static void on_toggle_disable(const ToggleDisabledEvent& event)
-{
- if(event.type == TOGGLE_USE_GAMEPAD) {
- gamepad::active.set_value(false);
- return;
- }
-}
-
-static void on_glfw_joystick_event(const GlfwJoystickEvent& event)
-{
- if((event.event_type == GLFW_CONNECTED) && glfwJoystickIsGamepad(event.joystick_id) && (active_gamepad_id == INVALID_GAMEPAD_ID)) {
- gamepad::available = true;
-
- active_gamepad_id = event.joystick_id;
-
- for(int i = 0; i < NUM_AXES; gamepad::last_state.axes[i++] = 0.0f)
- ;
- for(int i = 0; i < NUM_BUTTONS; gamepad::last_state.buttons[i++] = GLFW_RELEASE)
- ;
-
- spdlog::info("gamepad: detected gamepad: {}", glfwGetGamepadName(event.joystick_id));
-
- return;
- }
-
- if((event.event_type == GLFW_DISCONNECTED) && (active_gamepad_id == event.joystick_id)) {
- gamepad::available = false;
-
- active_gamepad_id = INVALID_GAMEPAD_ID;
-
- for(int i = 0; i < NUM_AXES; gamepad::last_state.axes[i++] = 0.0f)
- ;
- for(int i = 0; i < NUM_BUTTONS; gamepad::last_state.buttons[i++] = GLFW_RELEASE)
- ;
-
- spdlog::warn("gamepad: disconnected");
-
- return;
- }
-}
-
-void gamepad::init(void)
-{
- gamepad::available = false;
-
- active_gamepad_id = INVALID_GAMEPAD_ID;
-
- globals::client_config.add_value("gamepad.deadzone", gamepad::deadzone);
- globals::client_config.add_value("gamepad.active", gamepad::active);
-
- settings::add_checkbox(0, gamepad::active, settings_location::GAMEPAD, "gamepad.active", true);
- settings::add_slider(1, gamepad::deadzone, settings_location::GAMEPAD, "gamepad.deadzone", true, "%.03f");
-
- auto mappings_path = cmdline::get("gpmap", "misc/gamecontrollerdb.txt");
- auto mappings_file = PHYSFS_openRead(mappings_path);
-
- if(mappings_file) {
- spdlog::info("gamepad: using mappings from {}", mappings_path);
- auto mappings_string = std::string(PHYSFS_fileLength(mappings_file), char(0x00));
- PHYSFS_readBytes(mappings_file, mappings_string.data(), mappings_string.size());
- glfwUpdateGamepadMappings(mappings_string.c_str());
- PHYSFS_close(mappings_file);
- }
-
- for(int joystick = 0; joystick <= GLFW_JOYSTICK_LAST; joystick += 1) {
- if(glfwJoystickIsGamepad(joystick)) {
- gamepad::available = true;
-
- active_gamepad_id = joystick;
-
- for(int i = 0; i < NUM_AXES; gamepad::last_state.axes[i++] = 0.0f)
- ;
- for(int i = 0; i < NUM_BUTTONS; gamepad::last_state.buttons[i++] = GLFW_RELEASE)
- ;
-
- spdlog::info("gamepad: detected gamepad: {}", glfwGetGamepadName(joystick));
-
- break;
- }
- }
-
- for(int i = 0; i < NUM_AXES; gamepad::state.axes[i++] = 0.0f)
- ;
- for(int i = 0; i < NUM_BUTTONS; gamepad::state.buttons[i++] = GLFW_RELEASE)
- ;
-
- globals::dispatcher.sink<ToggleEnabledEvent>().connect<&on_toggle_enable>();
- globals::dispatcher.sink<ToggleDisabledEvent>().connect<&on_toggle_disable>();
- globals::dispatcher.sink<GlfwJoystickEvent>().connect<&on_glfw_joystick_event>();
-}
-
-void gamepad::update_late(void)
-{
- if(active_gamepad_id == INVALID_GAMEPAD_ID) {
- // No active gamepad found
- return;
- }
-
- if(glfwGetGamepadState(active_gamepad_id, &gamepad::state)) {
- for(int i = 0; i < NUM_AXES; ++i) {
- if((vx::abs(gamepad::state.axes[i]) > GAMEPAD_AXIS_EVENT_THRESHOLD)
- && (vx::abs(gamepad::last_state.axes[i]) <= GAMEPAD_AXIS_EVENT_THRESHOLD)) {
- GamepadAxisEvent event;
- event.action = GLFW_PRESS;
- event.axis = i;
- globals::dispatcher.enqueue(event);
- continue;
- }
-
- if((vx::abs(gamepad::state.axes[i]) <= GAMEPAD_AXIS_EVENT_THRESHOLD)
- && (vx::abs(gamepad::last_state.axes[i]) > GAMEPAD_AXIS_EVENT_THRESHOLD)) {
- GamepadAxisEvent event;
- event.action = GLFW_RELEASE;
- event.axis = i;
- globals::dispatcher.enqueue(event);
- continue;
- }
- }
-
- for(int i = 0; i < NUM_BUTTONS; ++i) {
- if(gamepad::state.buttons[i] == gamepad::last_state.buttons[i]) {
- // Nothing happens
- continue;
- }
-
- GamepadButtonEvent event;
- event.action = gamepad::state.buttons[i];
- event.button = i;
- globals::dispatcher.enqueue(event);
- }
- }
-
- gamepad::last_state = gamepad::state;
-}