diff --git a/source/common/utility/vectors.h b/source/common/utility/vectors.h index 5388ab45b9e..a3c04f32a47 100644 --- a/source/common/utility/vectors.h +++ b/source/common/utility/vectors.h @@ -1548,6 +1548,16 @@ inline TAngle interpolatedvalue(const TAngle &oang, const TAngle &ang, return oang + (deltaangle(oang, ang) * interpfrac); } +template +inline TRotator interpolatedvalue(const TRotator &oang, const TRotator &ang, const double interpfrac) +{ + return TRotator( + interpolatedvalue(oang.Pitch, ang.Pitch, interpfrac), + interpolatedvalue(oang.Yaw, ang.Yaw, interpfrac), + interpolatedvalue(oang.Roll, ang.Roll, interpfrac) + ); +} + template inline T interpolatedvalue(const T& oval, const T& val, const double interpfrac) { diff --git a/source/core/coreactor.h b/source/core/coreactor.h index 3a787cdb5b2..9ee63c4f379 100644 --- a/source/core/coreactor.h +++ b/source/core/coreactor.h @@ -101,6 +101,11 @@ class DCoreActor : public DObject return interpolatedvalue(PrevAngles.Yaw, spr.Angles.Yaw, interpfrac); } + DRotator interpolatedangles(double const interpfrac) + { + return interpolatedvalue(PrevAngles, spr.Angles, interpfrac); + } + void backupz() { opos.Z = spr.pos.Z; diff --git a/source/core/gamefuncs.cpp b/source/core/gamefuncs.cpp index 9c7eaeee7a7..d8c39f37f4e 100644 --- a/source/core/gamefuncs.cpp +++ b/source/core/gamefuncs.cpp @@ -39,12 +39,12 @@ CVARD(Bool, strict_compatibility, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "Enab double cameradist, cameraclock; -bool calcChaseCamPos(DVector3& ppos, DCoreActor* act, sectortype** psect, DAngle ang, DAngle horiz, double const interpfrac, double const backamp) +bool calcChaseCamPos(DVector3& ppos, DCoreActor* act, sectortype** psect, const DRotator& pangles, double const interpfrac, double const backamp) { if (!*psect) return false; // Calculate new pos to shoot backwards - DVector3 npos = -DVector3(ang.ToVector() * horiz.Cos(), horiz.Sin()) * backamp; + DVector3 npos = -DVector3(pangles.Yaw.ToVector() * pangles.Pitch.Cos(), pangles.Pitch.Sin()) * backamp; HitInfoBase hitinfo; auto bakcstat = act->spr.cstat; @@ -80,7 +80,7 @@ bool calcChaseCamPos(DVector3& ppos, DCoreActor* act, sectortype** psect, DAngle { bakcstat = hitinfo.hitActor->spr.cstat; hitinfo.hitActor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN); - calcChaseCamPos(ppos, act, psect, ang, horiz, interpfrac, backamp); + calcChaseCamPos(ppos, act, psect, pangles, interpfrac, backamp); hitinfo.hitActor->spr.cstat = bakcstat; return false; } diff --git a/source/core/gamefuncs.h b/source/core/gamefuncs.h index 47db29e56b1..2062d7de6bd 100644 --- a/source/core/gamefuncs.h +++ b/source/core/gamefuncs.h @@ -245,7 +245,7 @@ extern double cameradist, cameraclock; void loaddefinitionsfile(const char* fn, bool cumulative = false, bool maingrp = false); -bool calcChaseCamPos(DVector3& ppos, DCoreActor* pspr, sectortype** psectnum, DAngle ang, DAngle horiz, double const interpfrac, double const backamp); +bool calcChaseCamPos(DVector3& ppos, DCoreActor* pspr, sectortype** psectnum, const DRotator& pangles, double const interpfrac, double const backamp); int getslopeval(sectortype* sect, const DVector3& pos, double bazez); bool cansee(const DVector3& start, sectortype* sect1, const DVector3& end, sectortype* sect2); double intersectSprite(DCoreActor* actor, const DVector3& start, const DVector3& direction, DVector3& result, double maxfactor); diff --git a/source/core/gameinput.h b/source/core/gameinput.h index bc73b799800..c3273c88e96 100644 --- a/source/core/gameinput.h +++ b/source/core/gameinput.h @@ -37,6 +37,12 @@ struct PlayerAngles void resetAdjustments() { Adjustments = {}; } void backupViewAngles() { PrevViewAngles = ViewAngles; } + // Angle getters. + DRotator getRenderAngles(const double interpfrac) + { + return (!SyncInput() ? pActor->spr.Angles : pActor->interpolatedangles(interpfrac)) + interpolatedvalue(PrevViewAngles, ViewAngles, interpfrac); + } + // Pitch methods. void lockPitch() { AngleLocks.Set(PITCH); } void unlockPitch() { AngleLocks.Clear(PITCH); } diff --git a/source/games/blood/src/view.cpp b/source/games/blood/src/view.cpp index 59f291a9eb3..b41f987393f 100644 --- a/source/games/blood/src/view.cpp +++ b/source/games/blood/src/view.cpp @@ -404,15 +404,15 @@ void viewUpdateDelirium(PLAYER* pPlayer) // //--------------------------------------------------------------------------- -void viewUpdateShake(PLAYER* pPlayer, DVector3& cPos, DAngle& cA, DAngle& cH, double& pshakeX, double& pshakeY) +void viewUpdateShake(PLAYER* pPlayer, DVector3& cPos, DRotator& cAngles, double& pshakeX, double& pshakeY) { auto doEffect = [&](const int& effectType) { if (effectType) { int nValue = ClipHigh(effectType * 8, 2000); - cH -= maphoriz(QRandom2F(nValue * (1. / 256.))); - cA += DAngle::fromDeg(QRandom2F(nValue * (360. / 524288.))); + cAngles.Pitch -= maphoriz(QRandom2F(nValue * (1. / 256.))); + cAngles.Yaw += DAngle::fromDeg(QRandom2F(nValue * (360. / 524288.))); cPos.X += QRandom2F(nValue * maptoworld) * maptoworld; cPos.Y += QRandom2F(nValue * maptoworld) * maptoworld; cPos.Z += QRandom2F(nValue) * zmaptoworld; @@ -423,7 +423,7 @@ void viewUpdateShake(PLAYER* pPlayer, DVector3& cPos, DAngle& cA, DAngle& cH, do doEffect(pPlayer->flickerEffect); doEffect(pPlayer->quakeEffect); - cH -= DAngle::fromDeg((1 - BobVal((pPlayer->tiltEffect << 2) + 512)) * 13.2); + cAngles.Pitch -= DAngle::fromDeg((1 - BobVal((pPlayer->tiltEffect << 2) + 512)) * 13.2); } @@ -457,7 +457,7 @@ static void DrawMap(PLAYER* pPlayer, const double interpfrac) // //--------------------------------------------------------------------------- -static void SetupView(PLAYER* pPlayer, DVector3& cPos, DAngle& cA, DAngle& cH, sectortype*& pSector, double& zDelta, double& shakeX, double& shakeY, DAngle& rotscrnang, const double interpfrac) +static void SetupView(PLAYER* pPlayer, DVector3& cPos, DRotator& cAngles, sectortype*& pSector, double& zDelta, double& shakeX, double& shakeY, const double interpfrac) { double bobWidth, bobHeight; @@ -477,57 +477,46 @@ static void SetupView(PLAYER* pPlayer, DVector3& cPos, DAngle& cA, DAngle& cH, s if (!SyncInput()) { - cA = bamang(predict.angle.asbam() + predict.look_ang.asbam()); - cH = predict.horiz + predict.horizoff; - rotscrnang = predict.rotscrnang; + cAngles.Yaw = bamang(predict.angle.asbam() + predict.look_ang.asbam()); + cAngles.Pitch = predict.horiz + predict.horizoff; + cAngles.Roll = predict.cAngles.Roll; } else { - cA = interpolatedvalue(predictOld.angle + predictOld.look_ang, predict.angle + predict.look_ang, interpfrac); - cH = interpolatedvalue(predictOld.horiz + predictOld.horizoff, predict.horiz + predict.horizoff, interpfrac); - rotscrnang = interpolatedvalue(predictOld.rotscrnang, predict.rotscrnang, interpfrac); + cAngles.Yaw = interpolatedvalue(predictOld.angle + predictOld.look_ang, predict.angle + predict.look_ang, interpfrac); + cAngles.Pitch = interpolatedvalue(predictOld.horiz + predictOld.horizoff, predict.horiz + predict.horizoff, interpfrac); + cAngles.Roll = interpolatedvalue(predictOld.rotscrnang, predict.rotscrnang, interpfrac); } } else #endif { cPos = pPlayer->actor->getRenderPos(interpfrac); + cAngles = pPlayer->Angles.getRenderAngles(interpfrac); zDelta = interpolatedvalue(pPlayer->ozWeapon, pPlayer->zWeapon - pPlayer->zView - 12, interpfrac); bobWidth = interpolatedvalue(pPlayer->obobWidth, pPlayer->bobWidth, interpfrac); bobHeight = interpolatedvalue(pPlayer->obobHeight, pPlayer->bobHeight, interpfrac); shakeX = interpolatedvalue(pPlayer->oswayWidth, pPlayer->swayWidth, interpfrac); shakeY = interpolatedvalue(pPlayer->oswayHeight, pPlayer->swayHeight, interpfrac); - - if (!SyncInput()) - { - cA = pPlayer->Angles.angSUM(interpfrac); - cH = pPlayer->Angles.horizSUM(interpfrac); - } - else - { - cA = pPlayer->Angles.angLERPSUM(interpfrac); - cH = pPlayer->Angles.horizLERPSUM(interpfrac); - } - rotscrnang = pPlayer->Angles.angLERPROTSCRN(interpfrac); } - viewUpdateShake(pPlayer, cPos, cA, cH, shakeX, shakeY); + viewUpdateShake(pPlayer, cPos, cAngles, shakeX, shakeY); if (gViewPos == 0) { if (cl_viewhbob) { - cPos.XY() -= cA.ToVector().Rotated90CW() * bobWidth; + cPos.XY() -= cAngles.Yaw.ToVector().Rotated90CW() * bobWidth; } if (cl_viewvbob) { cPos.Z += bobHeight; } - cPos.Z -= interpolatedvalue(0., 10., cH / DAngle90); + cPos.Z -= interpolatedvalue(0., 10., cAngles.Pitch / DAngle90); } else { - calcChaseCamPos(cPos, pPlayer->actor, &pSector, cA, cH, interpfrac, 80.); + calcChaseCamPos(cPos, pPlayer->actor, &pSector, cAngles, interpfrac, 80.); } if (pSector != nullptr) CheckLink(cPos, &pSector); @@ -648,11 +637,11 @@ void viewDrawScreen(bool sceneonly) UpdateBlend(pPlayer); DVector3 cPos; - DAngle cA, rotscrnang, cH; + DRotator cAngles; sectortype* pSector; double zDelta; double shakeX, shakeY; - SetupView(pPlayer, cPos, cA, cH, pSector, zDelta, shakeX, shakeY, rotscrnang, interpfrac); + SetupView(pPlayer, cPos, cAngles, pSector, zDelta, shakeX, shakeY, interpfrac); DAngle tilt = interpolatedvalue(gScreenTiltO, gScreenTilt, interpfrac); bool bDelirium = powerupCheck(pPlayer, kPwUpDeliriumShroom) > 0; @@ -661,7 +650,7 @@ void viewDrawScreen(bool sceneonly) uint8_t otherview = powerupCheck(pPlayer, kPwUpCrystalBall) > 0; if (tilt.Degrees() || bDelirium) { - rotscrnang = tilt; + cAngles.Roll = tilt; } else if (otherview && gNetPlayers > 1) { @@ -703,7 +692,7 @@ void viewDrawScreen(bool sceneonly) } } g_relvisibility = (int32_t)(ClipLow(gVisibility - 32 * pPlayer->visibility - brightness, 0)) - g_visibility; - cA += interpolatedvalue(deliriumTurnO, deliriumTurn, interpfrac); + cAngles.Yaw += interpolatedvalue(deliriumTurnO, deliriumTurn, interpfrac); if (pSector != nullptr) { @@ -731,11 +720,11 @@ void viewDrawScreen(bool sceneonly) } } - if (!sceneonly) hudDraw(pPlayer, pSector, shakeX, shakeY, zDelta, rotscrnang, basepal, interpfrac); + if (!sceneonly) hudDraw(pPlayer, pSector, shakeX, shakeY, zDelta, cAngles.Roll, basepal, interpfrac); DAngle deliriumPitchI = interpolatedvalue(maphoriz(deliriumPitchO), maphoriz(deliriumPitch), interpfrac); auto bakCstat = pPlayer->actor->spr.cstat; pPlayer->actor->spr.cstat |= (gViewPos == 0) ? CSTAT_SPRITE_INVISIBLE : CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_TRANS_FLIP; - render_drawrooms(pPlayer->actor, cPos, pSector, cA, cH - deliriumPitchI, rotscrnang, interpfrac); + render_drawrooms(pPlayer->actor, cPos, pSector, cAngles.Yaw, cAngles.Pitch - deliriumPitchI, cAngles.Roll, interpfrac); pPlayer->actor->spr.cstat = bakCstat; bDeliriumOld = bDelirium && gDeliriumBlur; @@ -760,7 +749,7 @@ void viewDrawScreen(bool sceneonly) int v8 = byte_1CE5C2 > 0 && (sector[tmpSect].ceilingstat & CSTAT_SECTOR_SKY); if (gWeather.at12d8 > 0 || v8) { - gWeather.Draw(cX, cY, cZ, cA.Tan() * (1 << 23), cH.Tan() * (1 << 23) + deliriumPitch, gWeather.at12d8); + gWeather.Draw(cX, cY, cZ, cAngles.Yaw.Tan() * (1 << 23), cAngles.Pitch.Tan() * (1 << 23) + deliriumPitch, gWeather.at12d8); if (v8) { gWeather.at12d8 = ClipRange(delta * 8 + gWeather.at12d8, 0, 4095); diff --git a/source/games/duke/src/render.cpp b/source/games/duke/src/render.cpp index 6f03ebe65b4..474cccffc0e 100644 --- a/source/games/duke/src/render.cpp +++ b/source/games/duke/src/render.cpp @@ -217,7 +217,7 @@ static int getdrugmode(player_struct *p, int oyrepeat) void displayrooms(int snum, double interpfrac, bool sceneonly) { DVector3 cpos; - DAngle cang, rotscrnang, choriz; + DRotator cangles; player_struct* p = &ps[snum]; @@ -253,9 +253,9 @@ void displayrooms(int snum, double interpfrac, bool sceneonly) else if (viewer->spr.yint > 199) viewer->spr.yint = 300; cpos = viewer->spr.pos.plusZ(-4); - cang = viewer->interpolatedyaw(interpfrac); - choriz = maphoriz(-viewer->spr.yint); - rotscrnang = nullAngle; + cangles.Yaw = viewer->interpolatedyaw(interpfrac); + cangles.Pitch = maphoriz(-viewer->spr.yint); + cangles.Roll = nullAngle; sect = viewer->sector(); } else @@ -270,9 +270,6 @@ void displayrooms(int snum, double interpfrac, bool sceneonly) // The setting here will be carried over to the rendering of the weapon sprites, but other 2D content will always default to the main palette. setgamepalette(setpal(p)); - // set screen rotation. - rotscrnang = p->Angles.angLERPROTSCRN(interpfrac); - // use player's actor initially. viewer = p->GetActor(); @@ -282,41 +279,29 @@ void displayrooms(int snum, double interpfrac, bool sceneonly) if (SyncInput()) { - choriz = interpolatedvalue(omyhoriz + omyhorizoff, myhoriz + myhorizoff, interpfrac); - cang = interpolatedvalue(omyang, myang, interpfrac); + cangles.Pitch = interpolatedvalue(omyhoriz + omyhorizoff, myhoriz + myhorizoff, interpfrac); + cangles.Yaw = interpolatedvalue(omyang, myang, interpfrac); } else { - cang = myang; - choriz = myhoriz + myhorizoff; + cangles.Yaw = myang; + cangles.Pitch = myhoriz + myhorizoff; } } else { cpos = viewer->getRenderPos(interpfrac); - - if (SyncInput()) - { - // Original code for when the values are passed through the sync struct - cang = p->Angles.angLERPSUM(interpfrac); - choriz = p->Angles.horizLERPSUM(interpfrac); - } - else - { - // This is for real time updating of the view direction. - cang = p->Angles.angSUM(interpfrac); - choriz = p->Angles.horizSUM(interpfrac); - } + cangles = p->Angles.getRenderAngles(interpfrac); } if (p->newOwner != nullptr) { viewer = p->newOwner; - cang = viewer->interpolatedyaw(interpfrac); - choriz = maphoriz(-viewer->spr.shade); + cangles.Yaw = viewer->interpolatedyaw(interpfrac); + cangles.Pitch = maphoriz(-viewer->spr.shade); cpos = viewer->spr.pos; sect = viewer->sector(); - rotscrnang = nullAngle; + cangles.Roll = nullAngle; interpfrac = 1.; camview = true; } @@ -329,10 +314,10 @@ void displayrooms(int snum, double interpfrac, bool sceneonly) auto adjustment = isRR() ? 15 : 12; cpos.Z -= adjustment; - if (!calcChaseCamPos(cpos, viewer, §, cang, choriz, interpfrac, 64.)) + if (!calcChaseCamPos(cpos, viewer, §, cangles, interpfrac, 64.)) { cpos.Z += adjustment; - calcChaseCamPos(cpos, viewer, §, cang, choriz, interpfrac, 64.); + calcChaseCamPos(cpos, viewer, §, cangles, interpfrac, 64.); } } @@ -342,7 +327,7 @@ void displayrooms(int snum, double interpfrac, bool sceneonly) if (earthquaketime > 0 && p->on_ground == 1) { cpos.Z += 1 - (((earthquaketime) & 1) * 2.); - cang += DAngle::fromBuild((2 - ((earthquaketime) & 2)) << 2); + cangles.Yaw += DAngle::fromBuild((2 - ((earthquaketime) & 2)) << 2); } if (p->GetActor()->spr.pal == 1) cpos.Z -= 18; @@ -362,7 +347,7 @@ void displayrooms(int snum, double interpfrac, bool sceneonly) auto cstat = viewer->spr.cstat; if (camview) viewer->spr.cstat = CSTAT_SPRITE_INVISIBLE; if (!sceneonly) drawweapon(interpfrac); - render_drawrooms(viewer, cpos, sect, cang, choriz, rotscrnang, interpfrac, fov); + render_drawrooms(viewer, cpos, sect, cangles.Yaw, cangles.Pitch, cangles.Roll, interpfrac, fov); viewer->spr.cstat = cstat; //GLInterface.SetMapFog(false); diff --git a/source/games/exhumed/src/view.cpp b/source/games/exhumed/src/view.cpp index 7f2ec71b756..a7ed5bf8605 100644 --- a/source/games/exhumed/src/view.cpp +++ b/source/games/exhumed/src/view.cpp @@ -191,8 +191,7 @@ void DrawView(double interpfrac, bool sceneonly) DExhumedActor* pEnemy = nullptr; int nEnemyPal = -1; sectortype* pSector = nullptr; - DAngle nCameraang, rotscrnang; - DAngle nCamerapan = nullAngle; + DRotator nCameraangles{}; DoInterpolations(interpfrac); @@ -207,8 +206,7 @@ void DrawView(double interpfrac, bool sceneonly) nCamerapos = pActor->spr.pos; pSector = pActor->sector(); - nCameraang = pActor->spr.Angles.Yaw; - rotscrnang = nullAngle; + nCameraangles.Yaw = pActor->spr.Angles.Yaw; SetGreenPal(); @@ -232,18 +230,7 @@ void DrawView(double interpfrac, bool sceneonly) updatesector(nCamerapos, &pSector); if (pSector == nullptr) pSector = PlayerList[nLocalPlayer].pPlayerViewSect; - if (!SyncInput()) - { - nCamerapan = PlayerList[nLocalPlayer].Angles.horizSUM(interpfrac); - nCameraang = PlayerList[nLocalPlayer].Angles.angSUM(interpfrac); - } - else - { - nCamerapan = PlayerList[nLocalPlayer].Angles.horizLERPSUM(interpfrac); - nCameraang = PlayerList[nLocalPlayer].Angles.angLERPSUM(interpfrac); - - } - rotscrnang = PlayerList[nLocalPlayer].Angles.angLERPROTSCRN(interpfrac); + nCameraangles = PlayerList[nLocalPlayer].Angles.getRenderAngles(interpfrac); if (!bCamera) { @@ -259,20 +246,20 @@ void DrawView(double interpfrac, bool sceneonly) if (nSnakeCam >= 0 && !sceneonly) { - nCamerapan = nullAngle; + nCameraangles.Pitch = nullAngle; } else { nCamerapos.Z = min(nCamerapos.Z + nQuake[nLocalPlayer], pPlayerActor->sector()->floorz); - nCameraang += DAngle::fromDeg(fmod(nQuake[nLocalPlayer], 16.) * (45. / 128.)); + nCameraangles.Yaw += DAngle::fromDeg(fmod(nQuake[nLocalPlayer], 16.) * (45. / 128.)); if (bCamera) { nCamerapos.Z -= 10; - if (!calcChaseCamPos(nCamerapos, pPlayerActor, &pSector, nCameraang, nCamerapan, interpfrac, 96.)) + if (!calcChaseCamPos(nCamerapos, pPlayerActor, &pSector, nCameraangles, interpfrac, 96.)) { nCamerapos.Z += 10; - calcChaseCamPos(nCamerapos, pPlayerActor, &pSector, nCameraang, nCamerapan, interpfrac, 96.); + calcChaseCamPos(nCamerapos, pPlayerActor, &pSector, nCameraangles, interpfrac, 96.); } } } @@ -315,7 +302,7 @@ void DrawView(double interpfrac, bool sceneonly) if (!nFreeze && !sceneonly) DrawWeapons(interpfrac); - render_drawrooms(nullptr, nCamerapos, pSector, nCameraang, nCamerapan, rotscrnang, interpfrac); + render_drawrooms(nullptr, nCamerapos, pSector, nCameraangles.Yaw, nCameraangles.Pitch, nCameraangles.Roll, interpfrac); if (HavePLURemap()) { @@ -343,7 +330,7 @@ void DrawView(double interpfrac, bool sceneonly) pPlayerActor->spr.cstat |= CSTAT_SPRITE_INVISIBLE; - auto ang2 = nCameraang - pPlayerActor->spr.Angles.Yaw; + auto ang2 = nCameraangles.Yaw - pPlayerActor->spr.Angles.Yaw; if (ang2.Degrees() < 0) ang2 = -ang2; diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp index 8c138e9838b..557a66e172c 100644 --- a/source/games/sw/src/draw.cpp +++ b/source/games/sw/src/draw.cpp @@ -1224,9 +1224,6 @@ void RestorePortalState() void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) { - DAngle tang, trotscrnang, thoriz; - sectortype* tsect; - // prediction player if prediction is on, else regular player PLAYER* camerapp = (PredictionOn && CommEnabled && pp == Player+myconnectindex) ? ppp : pp; @@ -1242,18 +1239,8 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) // Get initial player position, interpolating if required. DVector3 tpos = camerapp->actor->getRenderPos(interpfrac); - if (SyncInput() || pp != Player+myconnectindex) - { - tang = camerapp->Angles.angLERPSUM(interpfrac); - thoriz = camerapp->Angles.horizLERPSUM(interpfrac); - } - else - { - tang = pp->Angles.angSUM(interpfrac); - thoriz = pp->Angles.horizSUM(interpfrac); - } - trotscrnang = camerapp->Angles.angLERPROTSCRN(interpfrac); - tsect = camerapp->cursector; + DRotator tangles = camerapp->Angles.getRenderAngles(interpfrac); + sectortype* tsect = camerapp->cursector; updatesector(tpos, &tsect); @@ -1262,16 +1249,16 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) if (pp->sop_control && (!cl_sointerpolation || (CommEnabled && !pp->sop_remote))) { tpos = pp->actor->getPosWithOffsetZ(); - tang = pp->Angles.ZzANGLE(); + tangles.Yaw = pp->actor->spr.Angles.Yaw; } tsect = pp->cursector; updatesectorz(tpos, &tsect); } pp->si = tpos.plusZ(-pp->actor->getOffsetZ()); - pp->siang = tang; + pp->siang = tangles.Yaw; - QuakeViewChange(camerapp, tpos, tang); + QuakeViewChange(camerapp, tpos, tangles.Yaw); int vis = g_visibility; VisViewChange(camerapp, &vis); g_relvisibility = vis - g_visibility; @@ -1279,17 +1266,17 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) if (pp->sop_remote) { DSWActor* ractor = pp->remoteActor; - tang = TEST_BOOL1(ractor) ? ractor->spr.Angles.Yaw : (pp->sop_remote->pmid.XY() - tpos.XY()).Angle(); + tangles.Yaw = TEST_BOOL1(ractor) ? ractor->spr.Angles.Yaw : (pp->sop_remote->pmid.XY() - tpos.XY()).Angle(); } if (pp->Flags & (PF_VIEW_FROM_OUTSIDE)) { tpos.Z -= 33; - if (!calcChaseCamPos(tpos, pp->actor, &tsect, tang, thoriz, interpfrac, 128.)) + if (!calcChaseCamPos(tpos, pp->actor, &tsect, tangles, interpfrac, 128.)) { tpos.Z += 33; - calcChaseCamPos(tpos, pp->actor, &tsect, tang, thoriz, interpfrac, 128.); + calcChaseCamPos(tpos, pp->actor, &tsect, tangles, interpfrac, 128.); } } @@ -1301,7 +1288,7 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) } // recoil only when not in camera - thoriz -= interpolatedvalue(pp->recoil_ohorizoff, pp->recoil_horizoff, interpfrac); + tangles.Pitch -= interpolatedvalue(pp->recoil_ohorizoff, pp->recoil_horizoff, interpfrac); } if (automapMode != am_full) @@ -1314,7 +1301,7 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) UpdatePanel(interpfrac); UpdateWallPortalState(); - render_drawrooms(pp->actor, tpos, tsect, tang, thoriz, trotscrnang, interpfrac); + render_drawrooms(pp->actor, tpos, tsect, tangles.Yaw, tangles.Pitch, tangles.Roll, interpfrac); RestorePortalState(); if (sceneonly) @@ -1340,7 +1327,7 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) } } } - DrawOverheadMap(tpos.XY(), tang, interpfrac); + DrawOverheadMap(tpos.XY(), tangles.Yaw, interpfrac); } SWSpriteIterator it;