Skip to content

Commit

Permalink
- Tidy up modern crosshair/weapon offset drawers.
Browse files Browse the repository at this point in the history
  • Loading branch information
mjr4077au committed Nov 26, 2022
1 parent 3bf0176 commit d2761d3
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 28 deletions.
39 changes: 24 additions & 15 deletions source/core/gameinput.h
Expand Up @@ -38,9 +38,32 @@ struct PlayerAngles
void backupViewAngles() { PrevViewAngles = ViewAngles; }

// Angle getters.
DRotator lerpViewAngles(const double interpfrac)
{
return interpolatedvalue(PrevViewAngles, ViewAngles, interpfrac);
}
DRotator getRenderAngles(const double interpfrac)
{
return (!SyncInput() ? pActor->spr.Angles : pActor->interpolatedangles(interpfrac)) + interpolatedvalue(PrevViewAngles, ViewAngles, interpfrac);
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 = tan(clamp(viewAngles.Yaw, -DAngle90, DAngle90).Radians());
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, 100 * 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 = abs(offsets.first.Y) * 3.75;
return offsets;
}

// Pitch methods.
Expand Down Expand Up @@ -87,19 +110,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); }
Expand All @@ -108,7 +118,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.
Expand Down
2 changes: 1 addition & 1 deletion source/games/blood/src/hudsprites.cpp
Expand Up @@ -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)
{
Expand Down
4 changes: 2 additions & 2 deletions source/games/blood/src/view.cpp
Expand Up @@ -729,8 +729,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)
{
Expand Down
4 changes: 2 additions & 2 deletions source/games/duke/src/game_misc.cpp
Expand Up @@ -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)
Expand Down
5 changes: 3 additions & 2 deletions source/games/duke/src/hudweapon_d.cpp
Expand Up @@ -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);

Expand Down
4 changes: 2 additions & 2 deletions source/games/exhumed/src/gameloop.cpp
Expand Up @@ -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())
{
Expand Down
4 changes: 2 additions & 2 deletions source/games/sw/src/draw.cpp
Expand Up @@ -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));
}

//---------------------------------------------------------------------------
Expand Down
5 changes: 3 additions & 2 deletions source/games/sw/src/panel.cpp
Expand Up @@ -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)
Expand Down

0 comments on commit d2761d3

Please sign in to comment.