Skip to content

Commit

Permalink
- Initial cleanup of render draw code to use new angle getter.
Browse files Browse the repository at this point in the history
  • Loading branch information
mjr4077au committed Nov 26, 2022
1 parent 3ff23d6 commit 3bf0176
Show file tree
Hide file tree
Showing 9 changed files with 84 additions and 115 deletions.
10 changes: 10 additions & 0 deletions source/common/utility/vectors.h
Expand Up @@ -1548,6 +1548,16 @@ inline TAngle<T> interpolatedvalue(const TAngle<T> &oang, const TAngle<T> &ang,
return oang + (deltaangle(oang, ang) * interpfrac);
}

template<class T>
inline TRotator<T> interpolatedvalue(const TRotator<T> &oang, const TRotator<T> &ang, const double interpfrac)
{
return TRotator<T>(
interpolatedvalue(oang.Pitch, ang.Pitch, interpfrac),
interpolatedvalue(oang.Yaw, ang.Yaw, interpfrac),
interpolatedvalue(oang.Roll, ang.Roll, interpfrac)
);
}

template <class T>
inline T interpolatedvalue(const T& oval, const T& val, const double interpfrac)
{
Expand Down
5 changes: 5 additions & 0 deletions source/core/coreactor.h
Expand Up @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions source/core/gamefuncs.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion source/core/gamefuncs.h
Expand Up @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions source/core/gameinput.h
Expand Up @@ -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); }
Expand Down
57 changes: 23 additions & 34 deletions source/games/blood/src/view.cpp
Expand Up @@ -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;
Expand All @@ -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);
}


Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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)
{
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down
47 changes: 16 additions & 31 deletions source/games/duke/src/render.cpp
Expand Up @@ -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];

Expand Down Expand Up @@ -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
Expand All @@ -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();

Expand All @@ -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;
}
Expand All @@ -329,10 +314,10 @@ void displayrooms(int snum, double interpfrac, bool sceneonly)
auto adjustment = isRR() ? 15 : 12;
cpos.Z -= adjustment;

if (!calcChaseCamPos(cpos, viewer, &sect, cang, choriz, interpfrac, 64.))
if (!calcChaseCamPos(cpos, viewer, &sect, cangles, interpfrac, 64.))
{
cpos.Z += adjustment;
calcChaseCamPos(cpos, viewer, &sect, cang, choriz, interpfrac, 64.);
calcChaseCamPos(cpos, viewer, &sect, cangles, interpfrac, 64.);
}
}

Expand All @@ -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;
Expand All @@ -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);
Expand Down

0 comments on commit 3bf0176

Please sign in to comment.