diff --git a/source/exhumed/src/gameloop.cpp b/source/exhumed/src/gameloop.cpp index 8d6c8d08c..3fe0a6bfa 100644 --- a/source/exhumed/src/gameloop.cpp +++ b/source/exhumed/src/gameloop.cpp @@ -89,7 +89,7 @@ void GameInterface::Render() } double const smoothratio = calc_smoothratio(); - double const look_anghalf = getHalfLookAng(PlayerList[nLocalPlayer].oq16look_ang, PlayerList[nLocalPlayer].q16look_ang, cl_syncinput, smoothratio); + double const look_anghalf = getHalfLookAng(PlayerList[nLocalPlayer].angle.olook_ang.asq16(), PlayerList[nLocalPlayer].angle.look_ang.asq16(), cl_syncinput, smoothratio); DrawView(smoothratio); DrawStatusBar(); diff --git a/source/exhumed/src/gun.cpp b/source/exhumed/src/gun.cpp index db4ecd8c8..afaa74b56 100644 --- a/source/exhumed/src/gun.cpp +++ b/source/exhumed/src/gun.cpp @@ -985,7 +985,7 @@ void DrawWeapons(double smooth) nShade = sprite[PlayerList[nLocalPlayer].nSprite].shade; } - double const look_anghalf = getHalfLookAng(PlayerList[nLocalPlayer].oq16look_ang, PlayerList[nLocalPlayer].q16look_ang, cl_syncinput, smooth); + double const look_anghalf = getHalfLookAng(PlayerList[nLocalPlayer].angle.olook_ang.asq16(), PlayerList[nLocalPlayer].angle.look_ang.asq16(), cl_syncinput, smooth); double const looking_arc = fabs(look_anghalf) / 4.5; xOffset -= look_anghalf; diff --git a/source/exhumed/src/input.cpp b/source/exhumed/src/input.cpp index 0cba7df73..5baa44f9b 100644 --- a/source/exhumed/src/input.cpp +++ b/source/exhumed/src/input.cpp @@ -128,11 +128,11 @@ void GameInterface::GetInput(InputPacket* packet, ControlInfo* const hidInput) if (!nFreeze) { - applylook2(&pPlayer->q16angle, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, input.q16avel, &sPlayerInput[nLocalPlayer].actions, scaleAdjust, eyelevel[nLocalPlayer] > -14080); + applylook(&pPlayer->angle, input.q16avel, &sPlayerInput[nLocalPlayer].actions, scaleAdjust, eyelevel[nLocalPlayer] > -14080); sethorizon(&pPlayer->horizon.horiz, input.horz, &sPlayerInput[nLocalPlayer].actions, scaleAdjust); } - playerProcessHelpers(&pPlayer->q16angle, &pPlayer->angAdjust, &pPlayer->angTarget, scaleAdjust); + pPlayer->angle.processhelpers(scaleAdjust); pPlayer->horizon.processhelpers(scaleAdjust); UpdatePlayerSpriteAngle(pPlayer); } diff --git a/source/exhumed/src/osdcmds.cpp b/source/exhumed/src/osdcmds.cpp index d44ea289d..eef22a001 100644 --- a/source/exhumed/src/osdcmds.cpp +++ b/source/exhumed/src/osdcmds.cpp @@ -50,7 +50,7 @@ static int osdcmd_warptocoords(CCmdFuncPtr parm) if (parm->numparms >= 4) { - nPlayer->oq16angle = nPlayer->q16angle = IntToFixed(atoi(parm->parms[3])); + nPlayer->angle.oang = nPlayer->angle.ang = buildang(atoi(parm->parms[3])); } if (parm->numparms == 5) diff --git a/source/exhumed/src/player.cpp b/source/exhumed/src/player.cpp index 134582817..bb91eb086 100644 --- a/source/exhumed/src/player.cpp +++ b/source/exhumed/src/player.cpp @@ -309,8 +309,8 @@ void RestartPlayer(short nPlayer) sprite[nSprite].y = sprite[nNStartSprite].y; sprite[nSprite].z = sprite[nNStartSprite].z; mychangespritesect(nSprite, sprite[nNStartSprite].sectnum); - PlayerList[nPlayer].q16angle = IntToFixed(sprite[nNStartSprite].ang&kAngleMask); - sprite[nSprite].ang = FixedToInt(PlayerList[nPlayer].q16angle); + PlayerList[nPlayer].angle.ang = buildang(sprite[nNStartSprite].ang&kAngleMask); + sprite[nSprite].ang = PlayerList[nPlayer].angle.ang.asbuild(); floorspr = insertsprite(sprite[nSprite].sectnum, 0); assert(floorspr >= 0 && floorspr < kMaxSprites); @@ -328,16 +328,14 @@ void RestartPlayer(short nPlayer) sprite[nSprite].x = sPlayerSave[nPlayer].x; sprite[nSprite].y = sPlayerSave[nPlayer].y; sprite[nSprite].z = sector[sPlayerSave[nPlayer].nSector].floorz; - PlayerList[nPlayer].q16angle = IntToFixed(sPlayerSave[nPlayer].nAngle&kAngleMask); - sprite[nSprite].ang = FixedToInt(PlayerList[nPlayer].q16angle); + PlayerList[nPlayer].angle.ang = buildang(sPlayerSave[nPlayer].nAngle&kAngleMask); + sprite[nSprite].ang = PlayerList[nPlayer].angle.ang.asbuild(); floorspr = -1; } PlayerList[nPlayer].opos = sprite[nSprite].pos; - PlayerList[nPlayer].oq16angle = PlayerList[nPlayer].q16angle; - PlayerList[nPlayer].oq16look_ang = PlayerList[nPlayer].q16look_ang = 0; - PlayerList[nPlayer].oq16rotscrnang = PlayerList[nPlayer].q16rotscrnang = 0; + PlayerList[nPlayer].angle.backup(); PlayerList[nPlayer].horizon.backup(); nPlayerFloorSprite[nPlayer] = floorspr; @@ -702,7 +700,7 @@ static void pickupMessage(int no) void UpdatePlayerSpriteAngle(Player* pPlayer) { - sprite[pPlayer->nSprite].ang = FixedToInt(pPlayer->q16angle); + sprite[pPlayer->nSprite].ang = pPlayer->angle.ang.asbuild(); } void FuncPlayer(int a, int nDamage, int nRun) @@ -725,12 +723,10 @@ void FuncPlayer(int a, int nDamage, int nRun) short nSprite2; - PlayerList[nPlayer].angAdjust = 0; PlayerList[nPlayer].opos = sprite[nPlayerSprite].pos; - PlayerList[nPlayer].oq16angle = PlayerList[nPlayer].q16angle; - PlayerList[nPlayer].oq16look_ang = PlayerList[nPlayer].q16look_ang; - PlayerList[nPlayer].oq16rotscrnang = PlayerList[nPlayer].q16rotscrnang; + PlayerList[nPlayer].angle.backup(); PlayerList[nPlayer].horizon.backup(); + PlayerList[nPlayer].angle.resetadjustment(); PlayerList[nPlayer].horizon.resetadjustment(); oeyelevel[nPlayer] = eyelevel[nPlayer]; @@ -948,7 +944,7 @@ void FuncPlayer(int a, int nDamage, int nRun) if (cl_syncinput) { Player* pPlayer = &PlayerList[nPlayer]; - applylook2(&pPlayer->q16angle, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, sPlayerInput[nPlayer].nAngle, &sPlayerInput[nLocalPlayer].actions, 1, eyelevel[nLocalPlayer] > -14080); + applylook(&pPlayer->angle, sPlayerInput[nPlayer].nAngle, &sPlayerInput[nLocalPlayer].actions, 1, eyelevel[nLocalPlayer] > -14080); UpdatePlayerSpriteAngle(pPlayer); } @@ -1046,8 +1042,7 @@ void FuncPlayer(int a, int nDamage, int nRun) if (nTotalPlayers <= 1) { auto ang = GetAngleToSprite(nPlayerSprite, nSpiritSprite) & kAngleMask; - playerSetAngle2(&PlayerList[nPlayer].q16angle, &PlayerList[nPlayer].angTarget, ang); - PlayerList[nPlayer].oq16angle = PlayerList[nPlayer].q16angle; + PlayerList[nPlayer].angle.settarget(ang, true); sprite[nPlayerSprite].ang = ang; PlayerList[nPlayer].horizon.settarget(0, true); diff --git a/source/exhumed/src/player.h b/source/exhumed/src/player.h index 242009b54..46ac72a92 100644 --- a/source/exhumed/src/player.h +++ b/source/exhumed/src/player.h @@ -71,12 +71,7 @@ struct Player short nRun; PlayerHorizon horizon; - fixed_t oq16angle, q16angle; - fixed_t oq16look_ang, q16look_ang; - fixed_t oq16rotscrnang, q16rotscrnang; - fixed_t spin; - fixed_t angTarget; - double angAdjust; + PlayerAngle angle; vec3_t opos; }; diff --git a/source/exhumed/src/sequence.cpp b/source/exhumed/src/sequence.cpp index 5c795ed23..69da7e88f 100644 --- a/source/exhumed/src/sequence.cpp +++ b/source/exhumed/src/sequence.cpp @@ -376,7 +376,7 @@ void seq_DrawPilotLightSeq(double xOffset, double yOffset) double x = ChunkXpos[nFrameBase] + (160 + xOffset); double y = ChunkYpos[nFrameBase] + (100 + yOffset); - hud_drawsprite(x, y, 65536, fmod(-2 * FixedToFloat(PlayerList[nLocalPlayer].q16angle), kAngleMask + 1), nTile, 0, 0, 1); + hud_drawsprite(x, y, 65536, fmod(-2 * (PlayerList[nLocalPlayer].angle.ang.asbam() / (double)BAMUNIT), kAngleMask + 1), nTile, 0, 0, 1); nFrameBase++; } } diff --git a/source/exhumed/src/view.cpp b/source/exhumed/src/view.cpp index 3f526a297..80406edec 100644 --- a/source/exhumed/src/view.cpp +++ b/source/exhumed/src/view.cpp @@ -48,7 +48,7 @@ short nQuake[kMaxPlayers] = { 0 }; short nChunkTotal = 0; -fixed_t nCameraa; +binangle nCameraa; fixedhoriz nCamerapan; short nViewTop; bool bCamera = false; @@ -235,9 +235,9 @@ void DrawView(double smoothRatio, bool sceneonly) int playerY; int playerZ; short nSector; - fixed_t nAngle; + binangle nAngle; fixedhoriz pan; - fixed_t q16rotscrnang; + lookangle rotscrnang; fixed_t dang = IntToFixed(1024); @@ -255,7 +255,7 @@ void DrawView(double smoothRatio, bool sceneonly) playerY = sprite[nSprite].y; playerZ = sprite[nSprite].z; nSector = sprite[nSprite].sectnum; - nAngle = IntToFixed(sprite[nSprite].ang); + nAngle = buildang(sprite[nSprite].ang); SetGreenPal(); @@ -282,20 +282,13 @@ void DrawView(double smoothRatio, bool sceneonly) if (!cl_syncinput) { - nAngle = PlayerList[nLocalPlayer].q16angle + PlayerList[nLocalPlayer].q16look_ang; - q16rotscrnang = PlayerList[nLocalPlayer].q16rotscrnang; + nAngle = PlayerList[nLocalPlayer].angle.sum(); + rotscrnang = PlayerList[nLocalPlayer].angle.rotscrnang; } else { - fixed_t oang, ang; - - oang = PlayerList[nLocalPlayer].oq16angle + PlayerList[nLocalPlayer].oq16look_ang; - ang = PlayerList[nLocalPlayer].q16angle + PlayerList[nLocalPlayer].q16look_ang; - nAngle = oang + xs_CRoundToInt(fmulscale16(((ang + dang - oang) & 0x7FFFFFF) - dang, smoothRatio)); - - oang = PlayerList[nLocalPlayer].oq16rotscrnang + PlayerList[nLocalPlayer].oq16rotscrnang; - ang = PlayerList[nLocalPlayer].q16rotscrnang + PlayerList[nLocalPlayer].q16rotscrnang; - q16rotscrnang = oang + xs_CRoundToInt(fmulscale16(((ang + dang - oang) & 0x7FFFFFF) - dang, smoothRatio)); + nAngle = PlayerList[nLocalPlayer].angle.interpolatedsum(smoothRatio); + rotscrnang = PlayerList[nLocalPlayer].angle.interpolatedrotscrn(smoothRatio); } if (!bCamera) @@ -304,7 +297,7 @@ void DrawView(double smoothRatio, bool sceneonly) sprite[nDoppleSprite[nLocalPlayer]].cstat |= CSTAT_SPRITE_INVISIBLE; } - renderSetRollAngle(FixedToFloat(q16rotscrnang)); + renderSetRollAngle(rotscrnang.asbam() / (double)BAMUNIT); } nCameraa = nAngle; @@ -333,8 +326,7 @@ void DrawView(double smoothRatio, bool sceneonly) if (viewz > floorZ) viewz = floorZ; - nCameraa += IntToFixed((nQuake[nLocalPlayer] >> 7) % 31); - nCameraa &= 0x7FFFFFF; + nCameraa += buildang((nQuake[nLocalPlayer] >> 7) % 31); } } else @@ -404,7 +396,7 @@ void DrawView(double smoothRatio, bool sceneonly) } } - renderDrawRoomsQ16(nCamerax, nCameray, viewz, nCameraa, nCamerapan.asq16(), nSector); + renderDrawRoomsQ16(nCamerax, nCameray, viewz, nCameraa.asq16(), nCamerapan.asq16(), nSector); analyzesprites(); renderDrawMasks(); @@ -436,7 +428,7 @@ void DrawView(double smoothRatio, bool sceneonly) sprite[nPlayerSprite].cstat |= 0x8000; - int ang2 = FixedToInt(nCameraa) - sprite[nPlayerSprite].ang; + int ang2 = nCameraa.asbuild() - sprite[nPlayerSprite].ang; if (ang2 < 0) ang2 = -ang2;