diff --git a/include/Engine/Core/InputManager.h b/include/Engine/Core/InputManager.h index b8fe7f7a..5ba331f4 100644 --- a/include/Engine/Core/InputManager.h +++ b/include/Engine/Core/InputManager.h @@ -33,7 +33,6 @@ public: void Initialize(); - static const short MAX_GAMEPADS = 4; void Update(double dt); @@ -50,12 +49,6 @@ private: std::array m_LastKeyState; std::array m_CurrentMouseState; std::array m_LastMouseState; - typedef std::array(Gamepad::Axis::LAST) + 1> GamepadAxisState; - std::array m_CurrentGamepadAxisState; - std::array m_LastGamepadAxisState; - typedef std::array(Gamepad::Button::LAST) + 1> GamepadButtonState; - std::array m_CurrentGamepadButtonState; - std::array m_LastGamepadButtonState; double m_CurrentMouseX, m_CurrentMouseY; double m_LastMouseX, m_LastMouseY; @@ -64,6 +57,11 @@ private: void PublishGamepadAxisIfChanged(int gamepadID, Gamepad::Axis axis); void PublishGamepadButtonIfChanged(int gamepadID, Gamepad::Button button); + + static void GLFWMouseButtonCallback(GLFWwindow* window, int button, int action, int mods) + { + LOG_DEBUG("Click! %i %i %i", button, action, mods); + } }; #endif diff --git a/include/Engine/Input/XboxControllerInputHandler.h b/include/Engine/Input/XboxControllerInputHandler.h new file mode 100644 index 00000000..a9a464d1 --- /dev/null +++ b/include/Engine/Input/XboxControllerInputHandler.h @@ -0,0 +1,40 @@ +#ifndef XboxControllerInputHandler_h__ +#define XboxControllerInputHandler_h__ + +#include "InputHandler.h" +#include "Core/EKeyDown.h" +#include "Core/EKeyUp.h" + +struct _XINPUT_STATE; +typedef _XINPUT_STATE XINPUT_STATE; + +class XboxControllerInputHandler : public InputHandler +{ +public: + XboxControllerInputHandler(EventBroker* eventBroker, InputProxy* inputProxy); + + + bool BindOrigin(std::string origin, std::string command, float value) override; + + void Update(double dt) override; + + virtual float GetCommandValue(std::string command) override; +private: + std::unordered_map m_OriginButtons; + std::unordered_map m_OriginAxes; + std::unordered_map> m_ButtonBindings; // GLFW_KEY... -> command string & value + std::unordered_map> m_AxisBindings; // GLFW_KEY... -> command string & value + std::unordered_map m_CommandValues; + + static const short MAX_GAMEPADS = 4; + + float getAxisValue(XINPUT_STATE& state, int axis); + //typedef std::array(Gamepad::Axis::LAST) + 1> GamepadAxisState; + //std::array m_CurrentGamepadAxisState; + //std::array m_LastGamepadAxisState; + //typedef std::array(Gamepad::Button::LAST) + 1> GamepadButtonState; + //std::array m_CurrentGamepadButtonState; + //std::array m_LastGamepadButtonState; +}; + +#endif diff --git a/include/Engine/Rendering/DebugCameraInputController.h b/include/Engine/Rendering/DebugCameraInputController.h index 551ae0f2..3c825dfa 100644 --- a/include/Engine/Rendering/DebugCameraInputController.h +++ b/include/Engine/Rendering/DebugCameraInputController.h @@ -25,6 +25,7 @@ public: if (e.Command == "Right") { float value = std::max(-1.f, std::min(e.Value, 1.f)); m_Velocity.x = value; + LOG_INFO("%f", value); } if (e.Command == "Forward") { float value = std::max(-1.f, std::min(e.Value, 1.f)); @@ -37,12 +38,12 @@ public: void Update(double dt) { if (glm::length2(m_Velocity) > 0) { - m_Position += m_Orientation * (glm::normalize(m_Velocity) * m_BaseSpeed); + m_Position += (m_Orientation * (m_Velocity * m_BaseSpeed)) * (float)dt; } } protected: glm::vec3 m_Position = glm::vec3(0, 0, 0); glm::vec3 m_Velocity = glm::vec3(0, 0, 0); - float m_BaseSpeed = 0.1f; + float m_BaseSpeed = 2.0f; }; \ No newline at end of file diff --git a/include/Game/Game.h b/include/Game/Game.h index 57941e55..b33f235b 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -12,6 +12,7 @@ #include "Input/InputProxy.h" #include "Input/KeyboardInputHandler.h" #include "Input/MouseInputHandler.h" +#include "Input/XboxControllerInputHandler.h" #include "Core/EKeyDown.h" #include "Core/EntityXMLFile.h" #include "Core/SystemPipeline.h" diff --git a/resources/DefaultInput.ini b/resources/DefaultInput.ini index 3be67287..96027626 100644 --- a/resources/DefaultInput.ini +++ b/resources/DefaultInput.ini @@ -14,3 +14,11 @@ R=Reload Space=Jump LeftControl=Crouch LeftShift=Sprint + +GamepadRightTrigger=PrimaryFire +GamepadRightX=Yaw +GamepadRightY=-Pitch +GamepadA=TestGamepadA +GamepadX=TestGamepadX +GamepadLeftX=Right +GamepadLeftY=Forward \ No newline at end of file diff --git a/src/Engine/Core/InputManager.cpp b/src/Engine/Core/InputManager.cpp index 597fd7f6..a4a8ecca 100644 --- a/src/Engine/Core/InputManager.cpp +++ b/src/Engine/Core/InputManager.cpp @@ -8,6 +8,8 @@ void InputManager::Initialize() EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &InputManager::OnLockMouse); EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &InputManager::OnUnlockMouse); + + //glfwSetMouseButtonCallback(m_GLFWWindow, &InputManager::GLFWMouseButtonCallback); } void InputManager::Update(double dt) @@ -73,6 +75,21 @@ void InputManager::Update(double dt) m_EventBroker->Publish(e); } + // Joysticks + //for (int i = 0; i < GLFW_JOYSTICK_LAST; i++) { + // if (glfwJoystickPresent(i) == GL_FALSE) { + // continue; + // } + + // int count; + // const float* axes = glfwGetJoystickAxes(i, &count); + // LOG_DEBUG("Controller %i NumAxes: %i", i, count); + // m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftX)] = axes[0]; + // m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftY)] = axes[1]; + // m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightX)] = axes[2]; + // m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightY)] = axes[3]; + //} + // // Lock mouse while holding LMB // if (m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT]) // { @@ -91,109 +108,46 @@ void InputManager::Update(double dt) // } // TODO: Xbox360 controller - /*DWORD dwResult; - for (int i = 0; i < MAX_GAMEPADS; i++) - { - XINPUT_STATE state = { 0 }; - // Simply get the state of the controller from XInput. - dwResult = XInputGetState(i, &state); - if (dwResult == 0) - { - if(std::abs(state.Gamepad.sThumbLX) <= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) - state.Gamepad.sThumbLX = 0; - if(std::abs(state.Gamepad.sThumbLY) <= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) - state.Gamepad.sThumbLY = 0; - if(std::abs(state.Gamepad.sThumbRX) <= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) - state.Gamepad.sThumbRX = 0; - if(std::abs(state.Gamepad.sThumbRY) <= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) - state.Gamepad.sThumbRY = 0; - if(std::abs(state.Gamepad.bLeftTrigger) <= XINPUT_GAMEPAD_TRIGGER_THRESHOLD) - state.Gamepad.bLeftTrigger = 0; - if(std::abs(state.Gamepad.bRightTrigger) <= XINPUT_GAMEPAD_TRIGGER_THRESHOLD) - state.Gamepad.bRightTrigger = 0; - - m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftX)] = state.Gamepad.sThumbLX / 32767.f; - m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftY)] = state.Gamepad.sThumbLY / 32767.f; - m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightX)] = state.Gamepad.sThumbRX / 32767.f; - m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightY)] = state.Gamepad.sThumbRY / 32767.f; - m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftTrigger)] = state.Gamepad.bLeftTrigger / 255.f; - m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightTrigger)] = state.Gamepad.bRightTrigger / 255.f; - PublishGamepadAxisIfChanged(i, Gamepad::Axis::LeftX); - PublishGamepadAxisIfChanged(i, Gamepad::Axis::LeftY); - PublishGamepadAxisIfChanged(i, Gamepad::Axis::RightX); - PublishGamepadAxisIfChanged(i, Gamepad::Axis::RightY); - PublishGamepadAxisIfChanged(i, Gamepad::Axis::LeftTrigger); - PublishGamepadAxisIfChanged(i, Gamepad::Axis::RightTrigger); - - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Up)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Down)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Left)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Right)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Start)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_START); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Back)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::LeftThumb)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::RightThumb)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::LeftShoulder)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::RightShoulder)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::A)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_A); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::B)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_B); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::X)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_X); - m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Y)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_Y); - PublishGamepadButtonIfChanged(i, Gamepad::Button::Up); - PublishGamepadButtonIfChanged(i, Gamepad::Button::Down); - PublishGamepadButtonIfChanged(i, Gamepad::Button::Left); - PublishGamepadButtonIfChanged(i, Gamepad::Button::Right); - PublishGamepadButtonIfChanged(i, Gamepad::Button::Start); - PublishGamepadButtonIfChanged(i, Gamepad::Button::Back); - PublishGamepadButtonIfChanged(i, Gamepad::Button::LeftThumb); - PublishGamepadButtonIfChanged(i, Gamepad::Button::RightThumb); - PublishGamepadButtonIfChanged(i, Gamepad::Button::LeftShoulder); - PublishGamepadButtonIfChanged(i, Gamepad::Button::RightShoulder); - PublishGamepadButtonIfChanged(i, Gamepad::Button::A); - PublishGamepadButtonIfChanged(i, Gamepad::Button::B); - PublishGamepadButtonIfChanged(i, Gamepad::Button::X); - PublishGamepadButtonIfChanged(i, Gamepad::Button::Y); - } - }*/ + /**/ m_LastKeyState = m_CurrentKeyState; m_LastMouseState = m_CurrentMouseState; m_LastMouseX = m_CurrentMouseX; m_LastMouseY = m_CurrentMouseY; - m_LastGamepadAxisState = m_CurrentGamepadAxisState; - m_LastGamepadButtonState = m_CurrentGamepadButtonState; + //m_LastGamepadAxisState = m_CurrentGamepadAxisState; + //m_LastGamepadButtonState = m_CurrentGamepadButtonState; } void InputManager::PublishGamepadAxisIfChanged(int gamepadID, Gamepad::Axis axis) { - float currentValue = m_CurrentGamepadAxisState[gamepadID][static_cast(axis)]; - float lastValue = m_LastGamepadAxisState[gamepadID][static_cast(axis)]; - if (currentValue != lastValue) { - Events::GamepadAxis e; - e.GamepadID = gamepadID; - e.Axis = axis; - e.Value = currentValue; - m_EventBroker->Publish(e); - } + //float currentValue = m_CurrentGamepadAxisState[gamepadID][static_cast(axis)]; + //float lastValue = m_LastGamepadAxisState[gamepadID][static_cast(axis)]; + //if (currentValue != lastValue) { + // Events::GamepadAxis e; + // e.GamepadID = gamepadID; + // e.Axis = axis; + // e.Value = currentValue; + // m_EventBroker->Publish(e); + //} } void InputManager::PublishGamepadButtonIfChanged(int gamepadID, Gamepad::Button button) { - bool currentState = m_CurrentGamepadButtonState[gamepadID][static_cast(button)]; - float lastState = m_LastGamepadButtonState[gamepadID][static_cast(button)]; - if (currentState != lastState) { - if (currentState == true) { - Events::GamepadButtonDown e; - e.GamepadID = gamepadID; - e.Button = button; - m_EventBroker->Publish(e); - } else { - Events::GamepadButtonUp e; - e.GamepadID = gamepadID; - e.Button = button; - m_EventBroker->Publish(e); - } - } + //bool currentState = m_CurrentGamepadButtonState[gamepadID][static_cast(button)]; + //float lastState = m_LastGamepadButtonState[gamepadID][static_cast(button)]; + //if (currentState != lastState) { + // if (currentState == true) { + // Events::GamepadButtonDown e; + // e.GamepadID = gamepadID; + // e.Button = button; + // m_EventBroker->Publish(e); + // } else { + // Events::GamepadButtonUp e; + // e.GamepadID = gamepadID; + // e.Button = button; + // m_EventBroker->Publish(e); + // } + //} } bool InputManager::OnLockMouse(const Events::LockMouse &event) diff --git a/src/Engine/Input/MouseInputHandler.cpp b/src/Engine/Input/MouseInputHandler.cpp index 5996b43d..8fed3124 100644 --- a/src/Engine/Input/MouseInputHandler.cpp +++ b/src/Engine/Input/MouseInputHandler.cpp @@ -25,11 +25,13 @@ MouseInputHandler::MouseInputHandler(EventBroker* eventBroker, InputProxy* input bool MouseInputHandler::BindOrigin(std::string origin, std::string command, float value) { + bool result = false; + auto originCode = m_OriginCodes.find(origin); if (originCode != m_OriginCodes.end()) { int code = originCode->second; m_Bindings[code] = std::make_tuple(command, value); - return true; + result = true; } auto originAxis = m_OriginAxes.find(origin); @@ -44,10 +46,10 @@ bool MouseInputHandler::BindOrigin(std::string origin, std::string command, floa } } m_Axes[axis] = std::make_tuple(command, value * multiplier); - return true; + result = true; } - return false; + return result; } float MouseInputHandler::GetCommandValue(std::string command) diff --git a/src/Engine/Input/XboxControllerInputHandler.cpp b/src/Engine/Input/XboxControllerInputHandler.cpp new file mode 100644 index 00000000..898f5910 --- /dev/null +++ b/src/Engine/Input/XboxControllerInputHandler.cpp @@ -0,0 +1,187 @@ +#define WIN32_LEAN_AND_MEAN +#include +#include +#pragma comment(lib, "Xinput.lib") +#pragma comment(lib, "Xinput9_1_0.lib") +#include "Input/XboxControllerInputHandler.h" + +XboxControllerInputHandler::XboxControllerInputHandler(EventBroker* eventBroker, InputProxy* inputProxy) + : InputHandler(eventBroker, inputProxy) +{ + m_OriginButtons["GamepadUp"] = XINPUT_GAMEPAD_DPAD_UP; + m_OriginButtons["GamepadDown"] = XINPUT_GAMEPAD_DPAD_DOWN; + m_OriginButtons["GamepadLeft"] = XINPUT_GAMEPAD_DPAD_LEFT; + m_OriginButtons["GamepadRight"] = XINPUT_GAMEPAD_DPAD_RIGHT; + m_OriginButtons["GamepadStart"] = XINPUT_GAMEPAD_START; + m_OriginButtons["GamepadBack"] = XINPUT_GAMEPAD_BACK; + m_OriginButtons["GamepadLeftStick"] = XINPUT_GAMEPAD_LEFT_THUMB; + m_OriginButtons["GamepadRightStick"] = XINPUT_GAMEPAD_RIGHT_THUMB; + m_OriginButtons["GamepadLeftBumper"] = XINPUT_GAMEPAD_LEFT_SHOULDER; + m_OriginButtons["GamepadRightBumper"] = XINPUT_GAMEPAD_RIGHT_SHOULDER; + m_OriginButtons["GamepadA"] = XINPUT_GAMEPAD_A; + m_OriginButtons["GamepadB"] = XINPUT_GAMEPAD_B; + m_OriginButtons["GamepadX"] = XINPUT_GAMEPAD_X; + m_OriginButtons["GamepadY"] = XINPUT_GAMEPAD_Y; + m_OriginAxes["GamepadLeftX"] = 0; + m_OriginAxes["GamepadLeftY"] = 1; + m_OriginAxes["GamepadRightX"] = 2; + m_OriginAxes["GamepadRightY"] = 3; + m_OriginAxes["GamepadLeftTrigger"] = 4; + m_OriginAxes["GamepadRightTrigger"] = 5; +} + +bool XboxControllerInputHandler::BindOrigin(std::string origin, std::string command, float value) +{ + bool result = false; + + auto originIt = m_OriginButtons.find(origin); + if (originIt != m_OriginButtons.end()) { + int button = originIt->second; + m_ButtonBindings[button] = std::make_tuple(command, value); + result = true; + } + + auto originAxis = m_OriginAxes.find(origin); + if (originAxis != m_OriginAxes.end()) { + char axis = originAxis->second; + float multiplier = 0.5f; + //// Sensitivity + //multiplier *= ResourceManager::Load("Input.ini")->Get("Mouse.Sensitivity", 1.f); + //if (axis == 'Y') { + // if (ResourceManager::Load("Input.ini")->Get("Mouse.InvertPitch", false)) { + // multiplier *= -1.f; + // } + //} + m_AxisBindings[axis] = std::make_tuple(command, value * multiplier); + result = true; + } + + return result; +} + +void XboxControllerInputHandler::Update(double dt) +{ + DWORD dwResult; + for (int i = 0; i < MAX_GAMEPADS; i++) { + XINPUT_STATE state = { 0 }; + // Simply get the state of the controller from XInput. + dwResult = XInputGetState(i, &state); + if (dwResult == 0) { + if (std::abs(state.Gamepad.sThumbLX) <= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) + state.Gamepad.sThumbLX = 0; + if (std::abs(state.Gamepad.sThumbLY) <= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) + state.Gamepad.sThumbLY = 0; + if (std::abs(state.Gamepad.sThumbRX) <= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) + state.Gamepad.sThumbRX = 0; + if (std::abs(state.Gamepad.sThumbRY) <= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) + state.Gamepad.sThumbRY = 0; + if (std::abs(state.Gamepad.bLeftTrigger) <= XINPUT_GAMEPAD_TRIGGER_THRESHOLD) + state.Gamepad.bLeftTrigger = 0; + if (std::abs(state.Gamepad.bRightTrigger) <= XINPUT_GAMEPAD_TRIGGER_THRESHOLD) + state.Gamepad.bRightTrigger = 0; + + //m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftX)] = state.Gamepad.sThumbLX / 32767.f; + //m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftY)] = state.Gamepad.sThumbLY / 32767.f; + //m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightX)] = state.Gamepad.sThumbRX / 32767.f; + //m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightY)] = state.Gamepad.sThumbRY / 32767.f; + //m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::LeftTrigger)] = state.Gamepad.bLeftTrigger / 255.f; + //m_CurrentGamepadAxisState[i][static_cast(Gamepad::Axis::RightTrigger)] = state.Gamepad.bRightTrigger / 255.f; + //PublishGamepadAxisIfChanged(i, Gamepad::Axis::LeftX); + //PublishGamepadAxisIfChanged(i, Gamepad::Axis::LeftY); + //PublishGamepadAxisIfChanged(i, Gamepad::Axis::RightX); + //PublishGamepadAxisIfChanged(i, Gamepad::Axis::RightY); + //PublishGamepadAxisIfChanged(i, Gamepad::Axis::LeftTrigger); + //PublishGamepadAxisIfChanged(i, Gamepad::Axis::RightTrigger); + + for (auto& pair : m_OriginAxes) { + const std::string& origin = pair.first; + int axis = pair.second; + auto& binding = m_AxisBindings.find(axis); + if (binding == m_AxisBindings.end()) { + continue; + } + + std::string command; + float value; + std::tie(command, value) = binding->second; + + Events::InputCommand e; + e.PlayerID = -1; + e.Command = command; + e.Value = value * getAxisValue(state, axis); + m_InputProxy->Publish(e); + } + + for (auto& pair : m_OriginButtons) { + auto& binding = m_ButtonBindings.find(pair.second); + if (binding == m_ButtonBindings.end()) { + continue; + } + + std::string command; + float value; + std::tie(command, value) = binding->second; + bool pressed = static_cast(state.Gamepad.wButtons & binding->first); + m_CommandValues[command] = (pressed) ? value : 0.f; + } + + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Up)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Down)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Left)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Right)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Start)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_START); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Back)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::LeftThumb)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::RightThumb)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::LeftShoulder)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::RightShoulder)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::A)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_A); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::B)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_B); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::X)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_X); + //m_CurrentGamepadButtonState[i][static_cast(Gamepad::Button::Y)] = static_cast(state.Gamepad.wButtons & XINPUT_GAMEPAD_Y); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::Up); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::Down); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::Left); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::Right); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::Start); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::Back); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::LeftThumb); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::RightThumb); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::LeftShoulder); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::RightShoulder); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::A); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::B); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::X); + //PublishGamepadButtonIfChanged(i, Gamepad::Button::Y); + } + } +} + +float XboxControllerInputHandler::GetCommandValue(std::string command) +{ + auto it = m_CommandValues.find(command); + if (it != m_CommandValues.end()) { + return m_CommandValues[command]; + } else { + return 0.f; + } +} + +float XboxControllerInputHandler::getAxisValue(XINPUT_STATE& state, int axis) +{ + switch (axis) { + case 0: + return state.Gamepad.sThumbLX / 32767.f; + case 1: + return state.Gamepad.sThumbLY / 32767.f; + case 2: + return state.Gamepad.sThumbRX / 32767.f; + case 3: + return state.Gamepad.sThumbRY / 32767.f; + case 4: + return state.Gamepad.bLeftTrigger / 255.f; + case 5: + return state.Gamepad.bRightTrigger / 255.f; + } +} + diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 026857d2..e9e64d30 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -32,6 +32,7 @@ Game::Game(int argc, char* argv[]) m_InputProxy = new InputProxy(m_EventBroker); m_InputProxy->AddHandler(); m_InputProxy->AddHandler(); + m_InputProxy->AddHandler(); m_InputProxy->LoadBindings("Input.ini"); // Create the root level GUI frame