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:
@ -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)
|
||||
|
Reference in New Issue
Block a user