1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-31 13:36:44 +00:00

Enable controller gyro and capture the values

This commit is contained in:
uramer 2022-01-18 20:07:02 +01:00
parent 9d0e427ec1
commit 55f95f1ea3
2 changed files with 36 additions and 0 deletions

View file

@ -4,6 +4,8 @@
#include <MyGUI_InputManager.h> #include <MyGUI_InputManager.h>
#include <MyGUI_Widget.h> #include <MyGUI_Widget.h>
#include <SDL.h>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/sdlutil/sdlmappings.hpp> #include <components/sdlutil/sdlmappings.hpp>
@ -31,6 +33,7 @@ namespace MWInput
: mBindingsManager(bindingsManager) : mBindingsManager(bindingsManager)
, mActionManager(actionManager) , mActionManager(actionManager)
, mMouseManager(mouseManager) , mMouseManager(mouseManager)
, mGyroAvailable(false)
, mJoystickEnabled (Settings::Manager::getBool("enable controller", "Input")) , mJoystickEnabled (Settings::Manager::getBool("enable controller", "Input"))
, mGamepadCursorSpeed(Settings::Manager::getFloat("gamepad cursor speed", "Input")) , mGamepadCursorSpeed(Settings::Manager::getFloat("gamepad cursor speed", "Input"))
, mSneakToggleShortcutTimer(0.f) , mSneakToggleShortcutTimer(0.f)
@ -287,6 +290,7 @@ namespace MWInput
void ControllerManager::controllerAdded(int deviceID, const SDL_ControllerDeviceEvent &arg) void ControllerManager::controllerAdded(int deviceID, const SDL_ControllerDeviceEvent &arg)
{ {
mBindingsManager->controllerAdded(deviceID, arg); mBindingsManager->controllerAdded(deviceID, arg);
enableGyroSensor();
} }
void ControllerManager::controllerRemoved(const SDL_ControllerDeviceEvent &arg) void ControllerManager::controllerRemoved(const SDL_ControllerDeviceEvent &arg)
@ -399,4 +403,30 @@ namespace MWInput
return false; return false;
} }
void ControllerManager::enableGyroSensor()
{
mGyroAvailable = false;
SDL_GameController* cntrl = mBindingsManager->getControllerOrNull();
if (!cntrl)
return;
if (!SDL_GameControllerHasSensor(cntrl, SDL_SENSOR_GYRO))
return;
if (SDL_GameControllerSetSensorEnabled(cntrl, SDL_SENSOR_GYRO, SDL_TRUE) < 0)
return;
mGyroAvailable = true;
}
bool ControllerManager::isGyroAvailable() const
{
return mGyroAvailable;
}
std::array<float, 3> ControllerManager::getGyroValues() const
{
float gyro[3] = { 0.f };
SDL_GameController* cntrl = mBindingsManager->getControllerOrNull();
if (cntrl && mGyroAvailable)
SDL_GameControllerGetSensorData(cntrl, SDL_SENSOR_GYRO, gyro, 3);
return std::array<float, 3>({gyro[0], gyro[1], gyro[2]});
}
} }

View file

@ -44,16 +44,22 @@ namespace MWInput
float getAxisValue(SDL_GameControllerAxis axis) const; // returns value in range [-1, 1] float getAxisValue(SDL_GameControllerAxis axis) const; // returns value in range [-1, 1]
bool isButtonPressed(SDL_GameControllerButton button) const; bool isButtonPressed(SDL_GameControllerButton button) const;
bool isGyroAvailable() const;
std::array<float, 3> getGyroValues() const;
private: private:
// Return true if GUI consumes input. // Return true if GUI consumes input.
bool gamepadToGuiControl(const SDL_ControllerButtonEvent &arg); bool gamepadToGuiControl(const SDL_ControllerButtonEvent &arg);
bool gamepadToGuiControl(const SDL_ControllerAxisEvent &arg); bool gamepadToGuiControl(const SDL_ControllerAxisEvent &arg);
void enableGyroSensor();
BindingsManager* mBindingsManager; BindingsManager* mBindingsManager;
ActionManager* mActionManager; ActionManager* mActionManager;
MouseManager* mMouseManager; MouseManager* mMouseManager;
bool mJoystickEnabled; bool mJoystickEnabled;
bool mGyroAvailable;
float mGamepadCursorSpeed; float mGamepadCursorSpeed;
float mSneakToggleShortcutTimer; float mSneakToggleShortcutTimer;
bool mGamepadGuiCursorEnabled; bool mGamepadGuiCursorEnabled;