mirror of
https://github.com/ZDoom/Raze.git
synced 2025-03-13 20:42:11 +00:00
- Tidy up modern crosshair/weapon offset drawers.
This commit is contained in:
parent
25de63ffb5
commit
e972818db5
8 changed files with 34 additions and 27 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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())
|
||||
{
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue