From 93edeac791886a844da2171d5941328f4f69318b Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Wed, 21 Apr 2021 20:41:04 +1000 Subject: [PATCH] - Clean-up of input functions. * Remove unused `getincanglef()`. * Remove unused `getincangleq16()`. * In `PlayerHorizon` struct, clamp value when setting target in `__settarget()`, not each public `settarget()` overload. * Rename `PlayerAngle` method `applylook()` to `applyinput()`. * Rename `PlayerHorizon` method `sethorizon()` to `applyinput()`. * In `PlayerHorizon::applylook()`, slightly clean return to centre code so it doesn't do math if already at 0. * In `PlayerAngle::applylook()`, slightly clean rotscrnang/look_ang code so it doesn't do math if already at 0 and reposition where mouse input is applied so that if input is applied, the player never enters a spin. * In `Duke3d::player_struct::apply_seasick()`, use `buildfang()` method instead of scaling float to BAM within function. --- source/core/gameinput.cpp | 75 ++++++++++------------------- source/core/gameinput.h | 12 ++--- source/games/blood/src/controls.cpp | 4 +- source/games/blood/src/player.cpp | 4 +- source/games/duke/src/input.cpp | 4 +- source/games/duke/src/player.cpp | 10 ++-- source/games/duke/src/player_d.cpp | 7 ++- source/games/duke/src/player_r.cpp | 7 ++- source/games/exhumed/src/input.cpp | 4 +- source/games/exhumed/src/player.cpp | 4 +- source/games/sw/src/player.cpp | 4 +- 11 files changed, 54 insertions(+), 81 deletions(-) diff --git a/source/core/gameinput.cpp b/source/core/gameinput.cpp index a5449c511..85fbee721 100644 --- a/source/core/gameinput.cpp +++ b/source/core/gameinput.cpp @@ -50,34 +50,6 @@ int getincangle(int a, int na) return na-a; } -double getincanglef(double a, double na) -{ - a = fmod(a, 2048.); - na = fmod(na, 2048.); - - if(fabs(a-na) >= 1024) - { - if(na > 1024) na -= 2048; - if(a > 1024) a -= 2048; - } - - return na-a; -} - -fixed_t getincangleq16(fixed_t a, fixed_t na) -{ - a &= 0x7FFFFFF; - na &= 0x7FFFFFF; - - if(abs(a-na) >= IntToFixed(1024)) - { - if(na > IntToFixed(1024)) na -= IntToFixed(2048); - if(a > IntToFixed(1024)) a -= IntToFixed(2048); - } - - return na-a; -} - binangle getincanglebam(binangle a, binangle na) { int64_t cura = a.asbam(); @@ -272,7 +244,7 @@ void processMovement(InputPacket* currInput, InputPacket* inputBuffer, ControlIn // //--------------------------------------------------------------------------- -void PlayerHorizon::sethorizon(float const horz, ESyncBits* actions, double const scaleAdjust) +void PlayerHorizon::applyinput(float const horz, ESyncBits* actions, double const scaleAdjust) { // Process only if no targeted horizon set. if (!targetset()) @@ -316,14 +288,11 @@ void PlayerHorizon::sethorizon(float const horz, ESyncBits* actions, double cons horiz = q16horiz(clamp(PitchToHoriz(pitch), gi->playerHorizMin(), gi->playerHorizMax())); // return to center if conditions met. - if ((*actions & SB_CENTERVIEW) && !(*actions & (SB_LOOK_UP|SB_LOOK_DOWN))) + if ((*actions & SB_CENTERVIEW) && !(*actions & (SB_LOOK_UP|SB_LOOK_DOWN)) && horiz.asq16()) { - if (abs(horiz.asq16()) > (FRACUNIT >> 2)) - { - // move horiz back to 0 - horiz -= buildfhoriz(scaleAdjust * horiz.asbuildf() * (10. / GameTicRate)); - } - else + // move horiz back to 0 + horiz -= buildfhoriz(scaleAdjust * horiz.asbuildf() * (10. / GameTicRate)); + if (abs(horiz.asq16()) < (FRACUNIT >> 2)) { // not looking anymore because horiz is back at 0 horiz = q16horiz(0); @@ -343,15 +312,21 @@ void PlayerHorizon::sethorizon(float const horz, ESyncBits* actions, double cons // //--------------------------------------------------------------------------- -void PlayerAngle::applylook(float const avel, ESyncBits* actions, double const scaleAdjust) +void PlayerAngle::applyinput(float const avel, ESyncBits* actions, double const scaleAdjust) { - // return q16rotscrnang to 0 and set to 0 if less than a quarter of a unit - rotscrnang -= buildfang(scaleAdjust * rotscrnang.signedbuildf() * (15. / GameTicRate)); - if (abs(rotscrnang.signedbam()) < (BAMUNIT >> 2)) rotscrnang = bamang(0); + if (rotscrnang.asbam()) + { + // return rotscrnang to 0 + rotscrnang -= buildfang(scaleAdjust * rotscrnang.signedbuildf() * (15. / GameTicRate)); + if (abs(rotscrnang.signedbam()) < (BAMUNIT >> 2)) rotscrnang = bamang(0); + } - // return q16look_ang to 0 and set to 0 if less than a quarter of a unit - look_ang -= buildfang(scaleAdjust * look_ang.signedbuildf() * (7.5 / GameTicRate)); - if (abs(look_ang.signedbam()) < (BAMUNIT >> 2)) look_ang = bamang(0); + if (look_ang.asbam()) + { + // return look_ang to 0 + look_ang -= buildfang(scaleAdjust * look_ang.signedbuildf() * (7.5 / GameTicRate)); + if (abs(look_ang.signedbam()) < (BAMUNIT >> 2)) look_ang = bamang(0); + } if (*actions & SB_LOOK_LEFT) { @@ -379,6 +354,13 @@ void PlayerAngle::applylook(float const avel, ESyncBits* actions, double const s *actions &= ~SB_TURNAROUND; } + if (avel) + { + // add player's input + ang += degang(avel); + spin = 0; + } + if (spin < 0) { // return spin to 0 @@ -392,13 +374,6 @@ void PlayerAngle::applylook(float const avel, ESyncBits* actions, double const s } ang += buildfang(add); } - - if (avel) - { - // add player's input - ang += degang(avel); - spin = 0; - } } else { diff --git a/source/core/gameinput.h b/source/core/gameinput.h index 1e2b4ea11..4939d826b 100644 --- a/source/core/gameinput.h +++ b/source/core/gameinput.h @@ -7,8 +7,6 @@ #include "packet.h" int getincangle(int a, int na); -double getincanglef(double a, double na); -fixed_t getincangleq16(fixed_t a, fixed_t na); binangle getincanglebam(binangle a, binangle na); struct PlayerHorizon @@ -44,12 +42,12 @@ struct PlayerHorizon void settarget(double value, bool backup = false) { - __settarget(buildfhoriz(clamp(value, FixedToFloat(gi->playerHorizMin()), FixedToFloat(gi->playerHorizMax()))), backup); + __settarget(buildfhoriz(value), backup); } void settarget(fixedhoriz value, bool backup = false) { - __settarget(q16horiz(clamp(value.asq16(), gi->playerHorizMin(), gi->playerHorizMax())), backup); + __settarget(value, backup); } bool targetset() @@ -99,7 +97,7 @@ struct PlayerHorizon return (!SyncInput() ? sum() : interpolatedsum(smoothratio)).asbuildf() * (1. / 16.); // Used within draw code for Duke. } - void sethorizon(float const horz, ESyncBits* actions, double const scaleAdjust = 1); + void applyinput(float const horz, ESyncBits* actions, double const scaleAdjust = 1); void calcviewpitch(vec2_t const pos, binangle const ang, bool const aimmode, bool const canslopetilt, int const cursectnum, double const scaleAdjust = 1, bool const climbing = false); private: @@ -120,6 +118,8 @@ private: void __settarget(fixedhoriz value, bool backup) { + value = q16horiz(clamp(value.asq16(), gi->playerHorizMin(), gi->playerHorizMax())); + if (!SyncInput() && !backup) { target = value; @@ -239,7 +239,7 @@ struct PlayerAngle return fabs((!SyncInput() ? look_ang : interpolatedlookang(smoothratio)).signedbuildf()) * (1. / 9.); // Used within draw code for weapon and crosshair when looking left/right. } - void applylook(float const avel, ESyncBits* actions, double const scaleAdjust = 1); + void applyinput(float const avel, ESyncBits* actions, double const scaleAdjust = 1); private: binangle target; diff --git a/source/games/blood/src/controls.cpp b/source/games/blood/src/controls.cpp index a4c92d2a8..9b9c09a7c 100644 --- a/source/games/blood/src/controls.cpp +++ b/source/games/blood/src/controls.cpp @@ -58,8 +58,8 @@ void GameInterface::GetInput(InputPacket* packet, ControlInfo* const hidInput) // Perform unsynchronised angle/horizon if not dead. if (gView->pXSprite->health != 0) { - pPlayer->angle.applylook(input.avel, &pPlayer->input.actions, scaleAdjust); - pPlayer->horizon.sethorizon(input.horz, &pPlayer->input.actions, scaleAdjust); + pPlayer->angle.applyinput(input.avel, &pPlayer->input.actions, scaleAdjust); + pPlayer->horizon.applyinput(input.horz, &pPlayer->input.actions, scaleAdjust); doslopetilting(pPlayer, scaleAdjust); } diff --git a/source/games/blood/src/player.cpp b/source/games/blood/src/player.cpp index 66dcc4ff3..03336c3ac 100644 --- a/source/games/blood/src/player.cpp +++ b/source/games/blood/src/player.cpp @@ -1422,7 +1422,7 @@ void ProcessInput(PLAYER *pPlayer) if (SyncInput()) { - pPlayer->angle.applylook(pInput->avel, &pInput->actions); + pPlayer->angle.applyinput(pInput->avel, &pInput->actions); } // unconditionally update the player's sprite angle @@ -1549,7 +1549,7 @@ void ProcessInput(PLAYER *pPlayer) if (SyncInput()) { - pPlayer->horizon.sethorizon(pInput->horz, &pInput->actions); + pPlayer->horizon.applyinput(pInput->horz, &pInput->actions); doslopetilting(pPlayer); } diff --git a/source/games/duke/src/input.cpp b/source/games/duke/src/input.cpp index d857f232b..913312268 100644 --- a/source/games/duke/src/input.cpp +++ b/source/games/duke/src/input.cpp @@ -834,9 +834,9 @@ void GameInterface::GetInput(InputPacket* packet, ControlInfo* const hidInput) { // Do these in the same order as the old code. doslopetilting(p, scaleAdjust); - p->angle.applylook(p->adjustavel(input.avel), &p->sync.actions, scaleAdjust); + p->angle.applyinput(p->adjustavel(input.avel), &p->sync.actions, scaleAdjust); p->apply_seasick(scaleAdjust); - p->horizon.sethorizon(input.horz, &p->sync.actions, scaleAdjust); + p->horizon.applyinput(input.horz, &p->sync.actions, scaleAdjust); } p->angle.processhelpers(scaleAdjust); diff --git a/source/games/duke/src/player.cpp b/source/games/duke/src/player.cpp index fbe1c245e..bcbc0b057 100644 --- a/source/games/duke/src/player.cpp +++ b/source/games/duke/src/player.cpp @@ -741,16 +741,16 @@ void player_struct::apply_seasick(double factor) if (SeaSick < 250) { if (SeaSick >= 180) - angle.rotscrnang += bamang(xs_CRoundToUInt(24 * factor * BAMUNIT)); + angle.rotscrnang += buildfang(24 * factor); else if (SeaSick >= 130) - angle.rotscrnang -= bamang(xs_CRoundToUInt(24 * factor * BAMUNIT)); + angle.rotscrnang -= buildfang(24 * factor); else if (SeaSick >= 70) - angle.rotscrnang += bamang(xs_CRoundToUInt(24 * factor * BAMUNIT)); + angle.rotscrnang += buildfang(24 * factor); else if (SeaSick >= 20) - angle.rotscrnang -= bamang(xs_CRoundToUInt(24 * factor * BAMUNIT)); + angle.rotscrnang -= buildfang(24 * factor); } if (SeaSick < 250) - angle.look_ang = bamang(xs_CRoundToUInt(((krand() & 255) - 128) * factor * BAMUNIT)); + angle.look_ang = buildfang(((krand() & 255) - 128) * factor); } } diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index bcb32f03f..37b61dfad 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -2729,7 +2729,6 @@ void processinput_d(int snum) int j, k, doubvel, fz, cz, truefdist; Collision chz, clz; bool shrunk; - ESyncBits actions; short psect, psectlotag; struct player_struct* p; spritetype* s; @@ -2741,7 +2740,7 @@ void processinput_d(int snum) p->horizon.resetadjustment(); p->angle.resetadjustment(); - actions = PlayerInputBits(snum, SB_ALL); + ESyncBits& actions = p->sync.actions; auto sb_fvel = PlayerInputForwardVel(snum); auto sb_svel = PlayerInputSideVel(snum); @@ -2906,7 +2905,7 @@ void processinput_d(int snum) // may still be needed later for demo recording sb_avel = p->adjustavel(sb_avel); - p->angle.applylook(sb_avel, &p->sync.actions); + p->angle.applyinput(sb_avel, &actions); } if (p->spritebridge == 0) @@ -3139,7 +3138,7 @@ HORIZONLY: if (SyncInput()) { - p->horizon.sethorizon(PlayerHorizon(snum), &p->sync.actions); + p->horizon.applyinput(PlayerHorizon(snum), &actions); } p->checkhardlanding(); diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index 682fb497d..2e7b11ec8 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -3353,7 +3353,6 @@ void processinput_r(int snum) int i, k, doubvel, fz, cz, truefdist; Collision chz, clz; char shrunk; - ESyncBits actions; short psect, psectlotag; auto p = &ps[snum]; @@ -3363,7 +3362,7 @@ void processinput_r(int snum) p->horizon.resetadjustment(); p->angle.resetadjustment(); - actions = PlayerInputBits(snum, SB_ALL); + ESyncBits& actions = p->sync.actions; auto sb_fvel = PlayerInputForwardVel(snum); auto sb_svel = PlayerInputSideVel(snum); @@ -3639,7 +3638,7 @@ void processinput_r(int snum) // may still be needed later for demo recording sb_avel = p->adjustavel(sb_avel); - p->angle.applylook(sb_avel, &p->sync.actions); + p->angle.applyinput(sb_avel, &actions); } if (p->spritebridge == 0) @@ -4001,7 +4000,7 @@ HORIZONLY: if (SyncInput()) { - p->horizon.sethorizon(PlayerHorizon(snum), &p->sync.actions); + p->horizon.applyinput(PlayerHorizon(snum), &actions); } p->checkhardlanding(); diff --git a/source/games/exhumed/src/input.cpp b/source/games/exhumed/src/input.cpp index ad3488920..83e5abc6f 100644 --- a/source/games/exhumed/src/input.cpp +++ b/source/games/exhumed/src/input.cpp @@ -124,8 +124,8 @@ void GameInterface::GetInput(InputPacket* packet, ControlInfo* const hidInput) { if (!nFreeze) { - pPlayer->angle.applylook(input.avel, &sPlayerInput[nLocalPlayer].actions, scaleAdjust); - pPlayer->horizon.sethorizon(input.horz, &sPlayerInput[nLocalPlayer].actions, scaleAdjust); + pPlayer->angle.applyinput(input.avel, &sPlayerInput[nLocalPlayer].actions, scaleAdjust); + pPlayer->horizon.applyinput(input.horz, &sPlayerInput[nLocalPlayer].actions, scaleAdjust); if (input.horz) { diff --git a/source/games/exhumed/src/player.cpp b/source/games/exhumed/src/player.cpp index c4be2371b..23976c9de 100644 --- a/source/games/exhumed/src/player.cpp +++ b/source/games/exhumed/src/player.cpp @@ -915,7 +915,7 @@ void FuncPlayer(int a, int nDamage, int nRun) if (SyncInput()) { Player* pPlayer = &PlayerList[nPlayer]; - pPlayer->angle.applylook(sPlayerInput[nPlayer].nAngle, &sPlayerInput[nLocalPlayer].actions); + pPlayer->angle.applyinput(sPlayerInput[nPlayer].nAngle, &sPlayerInput[nLocalPlayer].actions); UpdatePlayerSpriteAngle(pPlayer); } @@ -2640,7 +2640,7 @@ loc_1BD2E: if (SyncInput()) { - pPlayer->horizon.sethorizon(sPlayerInput[nPlayer].pan, &sPlayerInput[nLocalPlayer].actions); + pPlayer->horizon.applyinput(sPlayerInput[nPlayer].pan, &sPlayerInput[nLocalPlayer].actions); } if (actions & (SB_LOOK_UP | SB_LOOK_DOWN) || sPlayerInput[nPlayer].pan) diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index 147fb0f7d..84197edfe 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -1516,7 +1516,7 @@ UpdatePlayerSpriteAngle(PLAYERp pp) void DoPlayerTurn(PLAYERp pp, float const avel, double const scaleAdjust) { - pp->angle.applylook(avel, &pp->input.actions, scaleAdjust); + pp->angle.applyinput(avel, &pp->input.actions, scaleAdjust); UpdatePlayerSpriteAngle(pp); } @@ -1668,7 +1668,7 @@ DoPlayerHorizon(PLAYERp pp, float const horz, double const scaleAdjust) { bool const canslopetilt = !TEST(pp->Flags, PF_FLYING|PF_SWIMMING|PF_DIVING|PF_CLIMBING|PF_JUMPING|PF_FALLING) && TEST(sector[pp->cursectnum].floorstat, FLOOR_STAT_SLOPE); pp->horizon.calcviewpitch(pp->pos.vec2, pp->angle.ang, pp->input.actions & SB_AIMMODE, canslopetilt, pp->cursectnum, scaleAdjust, TEST(pp->Flags, PF_CLIMBING)); - pp->horizon.sethorizon(horz, &pp->input.actions, scaleAdjust); + pp->horizon.applyinput(horz, &pp->input.actions, scaleAdjust); } void