- Tidy up modern crosshair/weapon offset drawers.

This commit is contained in:
Mitchell Richters 2022-12-02 18:16:04 +11:00 committed by Christoph Oelckers
parent 25de63ffb5
commit e972818db5
8 changed files with 34 additions and 27 deletions

View file

@ -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.

View file

@ -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)
{

View file

@ -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)
{

View file

@ -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)

View file

@ -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);

View file

@ -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())
{

View file

@ -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));
}
//---------------------------------------------------------------------------

View file

@ -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)