1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-13 01:20:34 +02:00

Allow input configuration via config file

This commit is contained in:
Ivan Savenko
2024-04-30 20:11:09 +03:00
parent 3749439702
commit 89d6ddd916
8 changed files with 155 additions and 38 deletions

View File

@ -19,6 +19,8 @@
#include "../gui/EventDispatcher.h"
#include "../gui/ShortcutHandler.h"
#include "../../lib/CConfigHandler.h"
void InputSourceGameController::gameControllerDeleter(SDL_GameController * gameController)
{
if(gameController)
@ -26,6 +28,13 @@ void InputSourceGameController::gameControllerDeleter(SDL_GameController * gameC
}
InputSourceGameController::InputSourceGameController():
configTriggerTreshold(settings["input"]["controllerTriggerTreshold"].Float()),
configAxisDeadZone(settings["input"]["controllerAxisDeadZone"].Float()),
configAxisFullZone(settings["input"]["controllerAxisFullZone"].Float()),
configPointerSpeed(settings["input"]["controllerPointerSpeed"].Float()),
configPointerScale(settings["input"]["controllerPointerScale"].Float()),
configPanningSpeed(settings["input"]["controllerPanningSpeed"].Float()),
configPanningScale(settings["input"]["controllerPanningScale"].Float()),
cursorAxisValueX(0),
cursorAxisValueY(0),
cursorPlanDisX(0.0),
@ -120,21 +129,22 @@ void InputSourceGameController::handleEventDeviceRemapped(const SDL_ControllerDe
openGameController(device.which);
}
int InputSourceGameController::getRealAxisValue(int value)
double InputSourceGameController::getRealAxisValue(int value)
{
if(value < AXIS_DEAD_ZOOM && value > -AXIS_DEAD_ZOOM)
double ratio = static_cast<double>(value) / SDL_JOYSTICK_AXIS_MAX;
double greenZone = configAxisFullZone - configAxisDeadZone;
if (std::abs(ratio) < configAxisDeadZone)
return 0;
if(value > AXIS_MAX_ZOOM)
return AXIS_MAX_ZOOM;
if(value < -AXIS_MAX_ZOOM)
return -AXIS_MAX_ZOOM;
int base = value > 0 ? AXIS_DEAD_ZOOM : -AXIS_DEAD_ZOOM;
return (value - base) * AXIS_MAX_ZOOM / (AXIS_MAX_ZOOM - AXIS_DEAD_ZOOM);
double scaledValue = (ratio - configAxisDeadZone) / greenZone;
double clampedValue = std::clamp(scaledValue, -1.0, +1.0);
return clampedValue;
}
void InputSourceGameController::dispatchAxisShortcuts(const std::vector<EShortcut> & shortcutsVector, SDL_GameControllerAxis axisID, int axisValue)
{
if(axisValue >= TRIGGER_PRESS_THRESHOLD)
if(getRealAxisValue(axisValue) > configTriggerTreshold)
{
if(!pressedAxes.count(axisID))
{
@ -256,12 +266,12 @@ void InputSourceGameController::handleCursorUpdate(int32_t deltaTimeMs)
if(cursorAxisValueX == 0)
cursorPlanDisX = 0;
else
cursorPlanDisX += deltaTimeSeconds * AXIS_MOVE_SPEED * cursorAxisValueX / AXIS_MAX_ZOOM;
cursorPlanDisX += deltaTimeSeconds * configPointerSpeed * std::pow(cursorAxisValueX, configPointerScale);
if(cursorAxisValueY == 0)
cursorPlanDisY = 0;
else
cursorPlanDisY += deltaTimeSeconds * AXIS_MOVE_SPEED * cursorAxisValueY / AXIS_MAX_ZOOM;
cursorPlanDisY += deltaTimeSeconds * configPointerSpeed * std::pow(cursorAxisValueY, configPointerScale);
int moveDisX = getMoveDis(cursorPlanDisX);
int moveDisY = getMoveDis(cursorPlanDisY);
@ -290,8 +300,8 @@ void InputSourceGameController::handleScrollUpdate(int32_t deltaTimeMs)
return;
}
float deltaTimeSeconds = static_cast<float>(deltaTimeMs) / 1000;
scrollPlanDisX += deltaTimeSeconds * AXIS_MOVE_SPEED * scrollAxisValueX / AXIS_MAX_ZOOM;
scrollPlanDisY += deltaTimeSeconds * AXIS_MOVE_SPEED * scrollAxisValueY / AXIS_MAX_ZOOM;
scrollPlanDisX += deltaTimeSeconds * configPanningSpeed * std::pow(scrollAxisValueX, configPanningScale);
scrollPlanDisY += deltaTimeSeconds * configPanningSpeed * std::pow(scrollAxisValueY, configPanningScale);
int moveDisX = getMoveDis(scrollPlanDisX);
int moveDisY = getMoveDis(scrollPlanDisY);
if(moveDisX != 0 || moveDisY != 0)