From e972818db5b7590e43b9d4cf7b02ed7928803231 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Fri, 2 Dec 2022 18:16:04 +1100 Subject: [PATCH] - Tidy up modern crosshair/weapon offset drawers. --- source/core/gameinput.h | 33 +++++++++++++++------------ source/games/blood/src/hudsprites.cpp | 2 +- source/games/blood/src/view.cpp | 4 ++-- source/games/duke/src/game_misc.cpp | 4 ++-- source/games/duke/src/hudweapon_d.cpp | 5 ++-- source/games/exhumed/src/gameloop.cpp | 4 ++-- source/games/sw/src/draw.cpp | 4 ++-- source/games/sw/src/panel.cpp | 5 ++-- 8 files changed, 34 insertions(+), 27 deletions(-) diff --git a/source/core/gameinput.h b/source/core/gameinput.h index 0c44010a0..f540ac1bd 100644 --- a/source/core/gameinput.h +++ b/source/core/gameinput.h @@ -45,6 +45,25 @@ struct PlayerAngles return (!SyncInput() ? pActor->spr.Angles : pActor->interpolatedangles(interpfrac)) + lerpViewAngles(interpfrac); } + // Draw code helpers. + auto getCrosshairOffsets(const double interpfrac) + { + // Set up angles. + const auto viewAngles = lerpViewAngles(interpfrac); + const auto rotTangent = viewAngles.Roll.Tan(); + const auto yawTangent = clamp(viewAngles.Yaw, -DAngle90, DAngle90).Tan(); + const auto fovTangent = tan(r_fov * pi::pi() / 360.); + + // Return as pair with roll as the 2nd object since all callers inevitably need it. + return std::make_pair(DVector2(160, 120 * -rotTangent) * -yawTangent / fovTangent, viewAngles.Roll); + } + auto getWeaponOffsets(const double interpfrac) + { + // Push the Y down a bit since the weapon is at the edge of the screen. + auto offsets = getCrosshairOffsets(interpfrac); offsets.first.Y *= 4.; + return offsets; + } + // Pitch methods. void lockPitch() { AngleLocks.Set(PITCH); } void unlockPitch() { AngleLocks.Clear(PITCH); } @@ -96,19 +115,6 @@ struct PlayerAngles double angLOOKANGHALF(double const interpfrac) { return angLERPLOOKANG(interpfrac).Normalized180().Degrees() * (128. / 45.); } double angLOOKINGARC(double const interpfrac) { return fabs(angLERPLOOKANG(interpfrac).Normalized180().Degrees() * (1024. / 1620.)); } - // Crosshair x/y offsets based on look_ang's tangent. - DVector2 angCROSSHAIROFFSETS(const double interpfrac) - { - return DVector2(159.72, 145.5 * -angLERPROTSCRN(interpfrac).Sin()) * -angLERPLOOKANG(interpfrac).Tan() * (1. / tan(r_fov * pi::pi() / 360.)); - } - - // Weapon x/y offsets based on the above. - DVector2 angWEAPONOFFSETS(const double interpfrac) - { - auto offsets = angCROSSHAIROFFSETS(interpfrac); offsets.Y = abs(offsets.Y) * 4.; - return offsets; - } - // Legacy, to be removed. DAngle horizSUM(const double interpfrac = 1) { return ZzHORIZON() + interpolatedvalue(PrevViewAngles.Pitch, ViewAngles.Pitch, interpfrac); } @@ -117,7 +123,6 @@ struct PlayerAngles DAngle angLERPSUM(double const interpfrac) { return interpolatedvalue(ZzOLDANGLE() + PrevViewAngles.Yaw, ZzANGLE() + ViewAngles.Yaw, interpfrac); } DAngle angLERPANG(double const interpfrac) { return interpolatedvalue(ZzOLDANGLE(), ZzANGLE(), interpfrac); } DAngle angLERPLOOKANG(double const interpfrac) { return interpolatedvalue(PrevViewAngles.Yaw, ViewAngles.Yaw, interpfrac); } - DAngle angLERPROTSCRN(double const interpfrac) { return interpolatedvalue(PrevViewAngles.Roll, ViewAngles.Roll, interpfrac); } private: // DRotator indices. diff --git a/source/games/blood/src/hudsprites.cpp b/source/games/blood/src/hudsprites.cpp index 83a2cd796..68e68d97a 100644 --- a/source/games/blood/src/hudsprites.cpp +++ b/source/games/blood/src/hudsprites.cpp @@ -108,7 +108,7 @@ void hudDraw(PLAYER* pPlayer, sectortype* pSector, double bobx, double boby, dou { if (gViewPos == 0) { - auto cXY = DVector2(160, 220) + pPlayer->Angles.angWEAPONOFFSETS(interpfrac); + auto cXY = DVector2(160, 220) + pPlayer->Angles.getWeaponOffsets(interpfrac).first; if (cl_weaponsway) { diff --git a/source/games/blood/src/view.cpp b/source/games/blood/src/view.cpp index fede4cf42..85332be4f 100644 --- a/source/games/blood/src/view.cpp +++ b/source/games/blood/src/view.cpp @@ -731,8 +731,8 @@ void viewDrawScreen(bool sceneonly) bDeliriumOld = bDelirium && gDeliriumBlur; if (sceneonly) return; - auto offsets = pPlayer->Angles.angCROSSHAIROFFSETS(interpfrac); - DrawCrosshair(kCrosshairTile, pPlayer->actor->xspr.health >> 4, offsets.X, offsets.Y, 2, pPlayer->Angles.angLERPROTSCRN(interpfrac)); + auto offsets = pPlayer->Angles.getCrosshairOffsets(interpfrac); + DrawCrosshair(kCrosshairTile, pPlayer->actor->xspr.health >> 4, offsets.first.X, offsets.first.Y, 2, offsets.second); #if 0 // This currently does not work. May have to be redone as a hardware effect. if (v4 && gNetPlayers > 1) { diff --git a/source/games/duke/src/game_misc.cpp b/source/games/duke/src/game_misc.cpp index e6977547b..224b6f476 100644 --- a/source/games/duke/src/game_misc.cpp +++ b/source/games/duke/src/game_misc.cpp @@ -291,8 +291,8 @@ void drawoverlays(double interpfrac) if (ps[myconnectindex].newOwner == nullptr && ud.cameraactor == nullptr) { - auto offsets = pp->Angles.angCROSSHAIROFFSETS(interpfrac); - DrawCrosshair(TILE_CROSSHAIR, ps[screenpeek].last_extra, offsets.X, offsets.Y + (pp->over_shoulder_on ? 2.5 : 0), isRR() ? 0.5 : 1, pp->Angles.angLERPROTSCRN(interpfrac)); + auto offsets = pp->Angles.getCrosshairOffsets(interpfrac); + DrawCrosshair(TILE_CROSSHAIR, ps[screenpeek].last_extra, offsets.first.X, offsets.first.Y + (pp->over_shoulder_on ? 2.5 : 0), isRR() ? 0.5 : 1, offsets.second); } if (paused == 2) diff --git a/source/games/duke/src/hudweapon_d.cpp b/source/games/duke/src/hudweapon_d.cpp index 1088f5fcd..0083f4018 100644 --- a/source/games/duke/src/hudweapon_d.cpp +++ b/source/games/duke/src/hudweapon_d.cpp @@ -228,11 +228,12 @@ void displayweapon_d(int snum, double interpfrac) hard_landing *= 8.; gun_pos -= fabs(p->GetActor()->spr.scale.X < 0.5 ? BobVal(weapon_sway * 4.) * 32 : BobVal(weapon_sway * 0.5) * 16) + hard_landing; - auto offsets = p->Angles.angWEAPONOFFSETS(interpfrac); + auto offpair = p->Angles.getWeaponOffsets(interpfrac); + auto offsets = offpair.first; auto horiz = !SyncInput() ? p->Angles.horizSUM(interpfrac) : p->Angles.horizLERPSUM(interpfrac); auto pitchoffset = interpolatedvalue(0., 16., horiz / DAngle90); auto yawinput = getavel(snum) * (1. / 16.); - auto angle = -p->Angles.angLERPROTSCRN(interpfrac); + auto angle = -offpair.second; auto weapon_xoffset = 160 - 90 - (BobVal(512 + weapon_sway * 0.5) * (16384. / 1536.)) - 58 - p->weapon_ang; auto shade = min(p->GetActor()->spr.shade, (int8_t)24); diff --git a/source/games/exhumed/src/gameloop.cpp b/source/games/exhumed/src/gameloop.cpp index 197e61fcc..86c917f1c 100644 --- a/source/games/exhumed/src/gameloop.cpp +++ b/source/games/exhumed/src/gameloop.cpp @@ -87,8 +87,8 @@ void GameInterface::Render() if (nFreeze != 2) // Hide when Ramses is talking. { DrawStatusBar(); - auto offsets = PlayerList[nLocalPlayer].Angles.angCROSSHAIROFFSETS(interpfrac); - DrawCrosshair(kCrosshairTile, PlayerList[nLocalPlayer].nHealth >> 3, offsets.X, offsets.Y, 1, PlayerList[nLocalPlayer].Angles.angLERPROTSCRN(interpfrac)); + auto offsets = PlayerList[nLocalPlayer].Angles.getCrosshairOffsets(interpfrac); + DrawCrosshair(kCrosshairTile, PlayerList[nLocalPlayer].nHealth >> 3, offsets.first.X, offsets.first.Y, 1, offsets.second); if (paused && !M_Active()) { diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp index 4c7a7ba5a..31514777b 100644 --- a/source/games/sw/src/draw.cpp +++ b/source/games/sw/src/draw.cpp @@ -1021,8 +1021,8 @@ void PrintSpriteInfo(PLAYER* pp) static void DrawCrosshair(PLAYER* pp, const double interpfrac) { - auto offsets = pp->Angles.angCROSSHAIROFFSETS(interpfrac); - ::DrawCrosshair(2326, pp->actor->user.Health, offsets.X, offsets.Y + ((pp->Flags & PF_VIEW_FROM_OUTSIDE) ? 5 : 0), 2, pp->Angles.angLERPROTSCRN(interpfrac), shadeToLight(10)); + auto offsets = pp->Angles.getCrosshairOffsets(interpfrac); + ::DrawCrosshair(2326, pp->actor->user.Health, offsets.first.X, offsets.first.Y + ((pp->Flags & PF_VIEW_FROM_OUTSIDE) ? 5 : 0), 2, offsets.second, shadeToLight(10)); } //--------------------------------------------------------------------------- diff --git a/source/games/sw/src/panel.cpp b/source/games/sw/src/panel.cpp index 078fb83c4..5fbe5288c 100644 --- a/source/games/sw/src/panel.cpp +++ b/source/games/sw/src/panel.cpp @@ -7428,8 +7428,9 @@ void pDisplaySprites(PLAYER* pp, double interpfrac) double ang; int flags; - const auto offsets = pp->Angles.angWEAPONOFFSETS(interpfrac); - const auto angle = -pp->Angles.angLERPROTSCRN(interpfrac).Buildfang(); + const auto offpair = pp->Angles.getWeaponOffsets(interpfrac); + const auto offsets = offpair.first; + const auto angle = -offpair.second.Buildfang(); auto list = pp->GetPanelSpriteList(); for (auto psp = list->Next; next = psp->Next, psp != list; psp = next)