- change mouse input from int to float and adjust games accordingly.

* Calculate game-side mousex/mousey divisions into the calculations performed in `InputState::GetMouseDelta()`.
* Fix mouse speed when `in_mousesmoothing` is true (wasn't factoring in / 3.f division used in non-true vector.
* Standard mouse forward/side movement speeds in Exhumed & SW with that of other games.
* Remove `strafeyaw` code from Duke/Exhumed/RR as it's not necessary and was leading to situations where the player would continually keep moving sideways even without input.
* Change mouse forward/side velocities to -= current value as is done with controller input and the player's angle/aim velocities.
This commit is contained in:
Mitchell Richters 2020-07-05 12:02:33 +10:00 committed by Christoph Oelckers
parent bb57590d34
commit c70cc474a0
7 changed files with 42 additions and 60 deletions

View file

@ -366,16 +366,12 @@ void ctrlGetInput(void)
if (buttonMap.ButtonDown(gamefunc_Strafe))
{
static int strafeyaw;
input.strafe = -(info.mousex + strafeyaw) >> 3;
strafeyaw = (info.mousex + strafeyaw) % 8;
input.strafe -= info.mousex * 32.f;
input.strafe -= scaleAdjustmentToInterval(info.dyaw * keyMove);
}
else
{
input.q16turn = fix16_sadd(input.q16turn, fix16_sdiv(fix16_from_int(info.mousex), fix16_from_int(32)));
input.q16turn = fix16_sadd(input.q16turn, fix16_from_float(info.mousex));
input.q16turn = fix16_sadd(input.q16turn, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw)));
}
@ -383,9 +379,9 @@ void ctrlGetInput(void)
input.forward -= scaleAdjustmentToInterval(info.dz * keyMove);
if (mouseaim)
input.q16mlook = fix16_sadd(input.q16mlook, fix16_sdiv(fix16_from_int(info.mousey), fix16_from_float(mlookScale * 64.f)));
input.q16mlook = fix16_sadd(input.q16mlook, fix16_from_float(info.mousey / mlookScale));
else
input.forward -= info.mousey;
input.forward -= info.mousey * 64.f;
if (!in_mouseflip)
input.q16mlook = -input.q16mlook;

View file

@ -46,22 +46,24 @@
void InputState::GetMouseDelta(ControlInfo * info)
{
vec2_t input;
vec2f_t input, finput;
input = g_mousePos;
g_mousePos = {};
vec2f_t finput = { float(input.x) / 3.0f, float(input.y) };
if (in_mousesmoothing)
{
static vec2_t last;
finput = { float(input.x + last.x) * 0.5f, float(input.y + last.y) * 0.5f };
static vec2f_t last;
finput = { (input.x + last.x) * 0.5f, (input.y + last.y) * 0.5f };
last = input;
}
else
{
finput = { input.x, input.y };
}
info->mousex = int(finput.x * (16.f) * in_mousesensitivity * in_mousescalex);
info->mousey = int(finput.y * (16.f) * in_mousesensitivity * in_mousescaley);
info->mousex = finput.x * (16.f / 32.f) * in_mousesensitivity * in_mousescalex / 3.f;
info->mousey = finput.y * (16.f / 64.f) * in_mousesensitivity * in_mousescaley;
// todo: Use these when the mouse is used for moving instead of turning.
//info->mousex = int(finput.x * (4.f) * in_mousesensitivity * in_mouseside);
@ -69,7 +71,7 @@ void InputState::GetMouseDelta(ControlInfo * info)
if (in_mousebias)
{
if (abs(info->mousex) > abs(info->mousey))
if (fabs(info->mousex) > fabs(info->mousey))
info->mousey /= in_mousebias;
else
info->mousex /= in_mousebias;

View file

@ -21,8 +21,8 @@ struct ControlInfo
float dyaw;
float dpitch;
float droll;
int32_t mousex;
int32_t mousey;
float mousex;
float mousey;
};
@ -42,7 +42,7 @@ class InputState
uint8_t g_keyAsciiPos;
uint8_t g_keyAsciiEnd;
vec2_t g_mousePos;
vec2f_t g_mousePos;
void keySetState(int32_t key, int32_t state);
@ -140,11 +140,11 @@ public:
void AddEvent(const event_t* ev);
void MouseSetPos(int x, int y)
void MouseSetPos(float x, float y)
{
g_mousePos = { x, y };
}
void MouseAddToPos(int x, int y)
void MouseAddToPos(float x, float y)
{
g_mousePos.x += x;
g_mousePos.y += y;

View file

@ -3090,23 +3090,19 @@ void P_GetInput(int const playerNum)
if (buttonMap.ButtonDown(gamefunc_Strafe))
{
static int strafeyaw;
input.svel = -(info.mousex + strafeyaw) >> 3;
strafeyaw = (info.mousex + strafeyaw) % 8;
input.svel -= info.mousex * 4.f;
input.svel -= scaleAdjustmentToInterval(info.dyaw * keyMove);
}
else
{
input.q16avel = fix16_sadd(input.q16avel, fix16_sdiv(fix16_from_int(info.mousex), F16(32)));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_float(info.mousex));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw)));
}
if (mouseaim)
input.q16horz = fix16_sadd(input.q16horz, fix16_sdiv(fix16_from_int(info.mousey), F16(64)));
input.q16horz = fix16_sadd(input.q16horz, fix16_from_float(info.mousey));
else
input.fvel = -(info.mousey >> 3);
input.fvel -= info.mousey * 8.f;
if (!in_mouseflip) input.q16horz = -input.q16horz;

View file

@ -191,25 +191,21 @@ void PlayerInterruptKeys()
if (buttonMap.ButtonDown(gamefunc_Strafe))
{
static int strafeyaw;
input.xVel = -(info.mousex + strafeyaw) >> 6;
strafeyaw = (info.mousex + strafeyaw) % 64;
input.xVel -= info.mousex * 4.f;
input.xVel -= info.dyaw * keyMove;
}
else
{
input.nAngle = fix16_sadd(input.nAngle, fix16_sdiv(fix16_from_int(info.mousex), fix16_from_int(32)));
input.nAngle = fix16_sadd(input.nAngle, fix16_from_float(info.mousex));
input.nAngle = fix16_sadd(input.nAngle, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw)));
}
g_MyAimMode = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming);
if (g_MyAimMode)
input.horizon = fix16_sadd(input.horizon, fix16_sdiv(fix16_from_int(info.mousey), fix16_from_int(64)));
input.horizon = fix16_sadd(input.horizon, fix16_from_float(info.mousey));
else
input.yVel = -(info.mousey >> 6);
input.yVel -= info.mousey * 8.f;
if (!in_mouseflip) input.horizon = -input.horizon;

View file

@ -3260,23 +3260,19 @@ void P_GetInput(int const playerNum)
if (buttonMap.ButtonDown(gamefunc_Strafe))
{
static int strafeyaw;
input.svel = -(info.mousex + strafeyaw) >> 3;
strafeyaw = (info.mousex + strafeyaw) % 8;
input.svel -= info.mousex * 4.f;
input.svel -= scaleAdjustmentToInterval(info.dyaw * keyMove);
}
else
{
input.q16avel = fix16_sadd(input.q16avel, fix16_sdiv(fix16_from_int(info.mousex), F16(32)));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_float(info.mousex));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw)));
}
if (mouseaim)
input.q16horz = fix16_sadd(input.q16horz, fix16_sdiv(fix16_from_int(info.mousey), F16(64)));
input.q16horz = fix16_sadd(input.q16horz, fix16_from_float(info.mousey));
else
input.fvel = -(info.mousey >> 3);
input.fvel -= info.mousey * 8.f;
if (!in_mouseflip) input.q16horz = -input.q16horz;
@ -3671,7 +3667,7 @@ void P_GetInputMotorcycle(int playerNum)
input_t input {};
input.q16avel = fix16_sadd(input.q16avel, fix16_sdiv(fix16_from_int(info.mousex), F16(32)));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_float(info.mousex));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw)));
input.svel -= scaleAdjustmentToInterval(info.dx * keyMove);
@ -3920,7 +3916,7 @@ void P_GetInputBoat(int playerNum)
input_t input {};
input.q16avel = fix16_sadd(input.q16avel, fix16_sdiv(fix16_from_int(info.mousex), F16(32)));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_float(info.mousex));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw)));
input.svel -= scaleAdjustmentToInterval(info.dx * keyMove);
@ -4162,23 +4158,19 @@ void P_DHGetInput(int const playerNum)
if (buttonMap.ButtonDown(gamefunc_Strafe))
{
static int strafeyaw;
input.svel = -(info.mousex + strafeyaw) >> 3;
strafeyaw = (info.mousex + strafeyaw) % 8;
input.svel -= info.mousex * 4.f;
input.svel -= scaleAdjustmentToInterval(info.dyaw * keyMove);
}
else
{
input.q16avel = fix16_sadd(input.q16avel, fix16_sdiv(fix16_from_int(info.mousex), F16(32)));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_float(info.mousex));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw)));
}
if (mouseaim)
input.q16horz = fix16_sadd(input.q16horz, fix16_sdiv(fix16_from_int(info.mousey), F16(64)));
input.q16horz = fix16_sadd(input.q16horz, fix16_from_float(info.mousey));
else
input.fvel = -(info.mousey >> 3);
input.fvel -= info.mousey * 8.f;
if (!in_mouseflip) input.q16horz = -input.q16horz;

View file

@ -3030,19 +3030,19 @@ getinput(SW_PACKET *loc, SWBOOL tied)
if (buttonMap.ButtonDown(gamefunc_Strafe) && !pp->sop)
{
svel = -info.mousex;
svel -= (info.mousex * ticrateScale) * 4.f;
svel -= info.dyaw * keymove;
}
else
{
q16angvel = fix16_div(fix16_from_int(info.mousex), fix16_from_float(angvelScale * 32.f));
q16angvel += fix16_from_dbl(scaleAdjustmentToInterval((info.dyaw * ticrateScale) / angvelScale));
q16angvel = fix16_sadd(q16angvel, fix16_from_float(info.mousex / angvelScale));
q16angvel = fix16_sadd(q16angvel, fix16_from_dbl(scaleAdjustmentToInterval((info.dyaw * ticrateScale) / angvelScale)));
}
if (mouseaim)
q16aimvel = -fix16_div(fix16_from_int(info.mousey), fix16_from_float(aimvelScale * 64.f));
q16aimvel = fix16_ssub(q16aimvel, fix16_from_float(info.mousey / aimvelScale));
else
vel = -(info.mousey >> 6);
vel -= (info.mousey * ticrateScale) * 8.f;
if (in_mouseflip)
q16aimvel = -q16aimvel;