- Blood: Cut q16ang/q16look_ang/q16rotscrnang over to PlayerAngle struct.

This commit is contained in:
Mitchell Richters 2020-10-08 07:55:54 +11:00
parent 40cb64cdcf
commit bd68f67460
10 changed files with 84 additions and 75 deletions

View file

@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "misc.h"
#include "printf.h"
#include "v_text.h"
#include "binaryangle.h"
BEGIN_BLD_NS
@ -586,6 +587,16 @@ inline fixed_t interpolateangfix16(fixed_t a, fixed_t b, int c)
return a+mulscale16(((b-a+0x4000000)&0x7ffffff)-0x4000000, c);
}
inline binangle interpolateangbin(uint32_t a, uint32_t b, double c)
{
return bamang(xs_CRoundToUInt(a + fmulscale16(b - a, c)));
}
inline lookangle interpolateanglook(int32_t a, int32_t b, double c)
{
return bamlook(xs_CRoundToUInt(a + fmulscale16(b - a, c)));
}
inline char Chance(int a1)
{
return wrand() < (a1>>1);

View file

@ -55,11 +55,11 @@ void GameInterface::GetInput(InputPacket* packet, ControlInfo* const hidInput)
// Perform unsynchronised angle/horizon if not dead.
if (gView->pXSprite->health != 0)
{
applylook2(&pPlayer->q16ang, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, input.q16avel, &pPlayer->input.actions, scaleAdjust, pPlayer->posture != 0);
applylook(&pPlayer->angle, input.q16avel, &pPlayer->input.actions, scaleAdjust, pPlayer->posture != 0);
sethorizon(&pPlayer->horizon.horiz, input.horz, &pPlayer->input.actions, scaleAdjust);
}
playerProcessHelpers(&pPlayer->q16ang, &pPlayer->angAdjust, &pPlayer->angTarget, scaleAdjust);
pPlayer->angle.processhelpers(scaleAdjust);
pPlayer->horizon.processhelpers(scaleAdjust);
UpdatePlayerSpriteAngle(pPlayer);
}

View file

@ -98,7 +98,7 @@ static void viewBurnTime(int gScale)
void hudDraw(PLAYER *gView, VIEW *pView, int nSectnum, double bobx, double boby, double zDelta, int basepal, double smoothratio)
{
double look_anghalf = getHalfLookAng(pView->q16look_ang, gView->q16look_ang, cl_syncinput, smoothratio);
double look_anghalf = getHalfLookAng(pView->look_ang.asq16(), gView->angle.look_ang.asq16(), cl_syncinput, smoothratio);
DrawCrosshair(kCrosshairTile, gView->pXSprite->health >> 4, -look_anghalf, 0, 2);

View file

@ -2113,7 +2113,7 @@ void useTeleportTarget(XSPRITE* pXSource, spritetype* pSprite) {
if (pXSource->data2 == 1) {
if (pPlayer) pPlayer->q16ang = IntToFixed(pSource->ang);
if (pPlayer) pPlayer->angle.ang = buildang(pSource->ang);
else if (isDude) xsprite[pSprite->extra].goalAng = pSprite->ang = pSource->ang;
else pSprite->ang = pSource->ang;
}
@ -3965,8 +3965,8 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
case 9: // 73 (set player's sprite angle, TO-DO: if tx > 0, take a look on TX ID sprite)
//data4 is reserved
if (pXSprite->data4 != 0) break;
else if (pSprite->flags & kModernTypeFlag1) pPlayer->q16ang = IntToFixed(pSprite->ang);
else if (valueIsBetween(pXSprite->data2, -kAng360, kAng360)) pPlayer->q16ang = IntToFixed(pXSprite->data2);
else if (pSprite->flags & kModernTypeFlag1) pPlayer->angle.ang = buildang(pSprite->ang);
else if (valueIsBetween(pXSprite->data2, -kAng360, kAng360)) pPlayer->angle.ang = buildang(pXSprite->data2);
break;
}
}

View file

@ -51,7 +51,7 @@ static int osdcmd_warptocoords(CCmdFuncPtr parm)
if (parm->numparms >= 4)
{
pPlayer->q16ang = gView->q16ang = IntToFixed(atoi(parm->parms[3]));
pPlayer->angle.oang = gView->angle.ang = buildang(atoi(parm->parms[3]));
}
if (parm->numparms == 5)

View file

@ -712,7 +712,7 @@ void playerStart(int nPlayer, int bNewLevel)
pSprite->z -= bottom - pSprite->z;
pSprite->pal = 11+(pPlayer->teamId&3);
pPlayer->angold = pSprite->ang = pStartZone->ang;
pPlayer->q16ang = IntToFixed(pSprite->ang);
pPlayer->angle.ang = buildang(pSprite->ang);
pSprite->type = kDudePlayer1+nPlayer;
pSprite->clipdist = pDudeInfo->clipdist;
pSprite->flags = 15;
@ -733,7 +733,7 @@ void playerStart(int nPlayer, int bNewLevel)
pPlayer->restTime = 0;
pPlayer->kickPower = 0;
pPlayer->laughCount = 0;
pPlayer->spin = 0;
pPlayer->angle.spin = buildlook(0);
pPlayer->posture = 0;
pPlayer->voodooTarget = -1;
pPlayer->voodooTargets = 0;
@ -1312,8 +1312,8 @@ void UpdatePlayerSpriteAngle(PLAYER *pPlayer)
{
spritetype *pSprite = pPlayer->pSprite;
pPlayer->q16ang = (pPlayer->q16ang + IntToFixed(pSprite->ang - pPlayer->angold)) & 0x7FFFFFF;
pPlayer->angold = pSprite->ang = FixedToInt(pPlayer->q16ang);
pPlayer->angle.ang += buildang(pSprite->ang - pPlayer->angold);
pPlayer->angold = pSprite->ang = pPlayer->angle.ang.asbuild();
}
//---------------------------------------------------------------------------
@ -1325,7 +1325,7 @@ void UpdatePlayerSpriteAngle(PLAYER *pPlayer)
static void resetinputhelpers(PLAYER* pPlayer)
{
pPlayer->horizon.resetadjustment();
pPlayer->angAdjust = 0;
pPlayer->angle.resetadjustment();
}
void ProcessInput(PLAYER *pPlayer)
@ -1359,7 +1359,7 @@ void ProcessInput(PLAYER *pPlayer)
{
fixed_t fraggerAng = gethiq16angle(sprite[pPlayer->fraggerId].x - pSprite->x, sprite[pPlayer->fraggerId].y - pSprite->y);
pPlayer->angold = pSprite->ang = FixedToInt(fraggerAng);
playerAddAngle2(&pPlayer->q16ang, &pPlayer->angAdjust, FixedToFloat(getincangleq16(pPlayer->q16ang, fraggerAng)));
pPlayer->angle.addadjustment(FixedToFloat(getincangleq16(pPlayer->angle.ang.asq16(), fraggerAng)));
}
pPlayer->deathTime += 4;
if (!bSeqStat)
@ -1445,7 +1445,7 @@ void ProcessInput(PLAYER *pPlayer)
if (cl_syncinput)
{
applylook2(&pPlayer->q16ang, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, pInput->q16avel, &pInput->actions, 1, pPlayer->posture != 0);
applylook(&pPlayer->angle, pInput->q16avel, &pInput->actions, 1, pPlayer->posture != 0);
UpdatePlayerSpriteAngle(pPlayer);
}

View file

@ -86,6 +86,7 @@ struct PLAYER
DUDEINFO* pDudeInfo;
InputPacket input;
PlayerHorizon horizon;
PlayerAngle angle;
uint8_t newWeapon;
int used1; // something related to game checksum
int weaponQav;
@ -153,7 +154,6 @@ struct PLAYER
int restTime;
int kickPower;
int laughCount;
fixed_t spin; // turning around
bool godMode;
bool fallScream;
bool cantJump;
@ -178,17 +178,10 @@ struct PLAYER
int pickupEffect;
bool flashEffect; // if true, reduce pPlayer->visibility counter
int quakeEffect;
fixed_t q16ang;
int angold;
int player_par;
int nWaterPal;
POSTURE pPosture[kModeMax][kPostureMax];
fixed_t q16look_ang;
fixed_t q16rotscrnang;
// Input helper variables.
double angAdjust;
fixed_t angTarget;
};
struct PROFILE

View file

@ -57,7 +57,7 @@ static VIEW predictFifo[256];
void viewInitializePrediction(void)
{
predict.at30 = gMe->q16ang;
predict.at30 = gMe->angle.ang;
predict.at24 = gMe->horizon.horiz;
predict.at28 = gMe->horizon.horizoff;
predict.at2c = gMe->slope;
@ -75,7 +75,7 @@ void viewInitializePrediction(void)
predict.at64 = zvel[gMe->pSprite->index];
predict.at6a = gMe->pXSprite->height;
predict.at48 = gMe->posture;
predict.at4c = gMe->spin;
predict.at4c = gMe->angle.spin;
predict.at6e = !!(gMe->input.actions & SB_CENTERVIEW);
memcpy(&predict.at75,&gSpriteHit[gMe->pSprite->extra],sizeof(SPRITEHIT));
predict.TotalKills = gMe->bobPhase;
@ -120,8 +120,8 @@ static void fakeProcessInput(PLAYER *pPlayer, InputPacket *pInput)
predict.at71 = !!(gMe->input.actions & SB_JUMP);
if (predict.at48 == 1)
{
int x = Cos(FixedToInt(predict.at30));
int y = Sin(FixedToInt(predict.at30));
int x = Cos(predict.at30.asbuild());
int y = Sin(predict.at30.asbuild());
if (pInput->fvel)
{
int forward = pInput->fvel;
@ -145,8 +145,8 @@ static void fakeProcessInput(PLAYER *pPlayer, InputPacket *pInput)
int speed = 0x10000;
if (predict.at6a > 0)
speed -= divscale16(predict.at6a, 0x100);
int x = Cos(FixedToInt(predict.at30));
int y = Sin(FixedToInt(predict.at30));
int x = Cos(predict.at30.asbuild());
int y = Sin(predict.at30.asbuild());
if (pInput->fvel)
{
int forward = pInput->fvel;
@ -170,11 +170,11 @@ static void fakeProcessInput(PLAYER *pPlayer, InputPacket *pInput)
}
}
if (pInput->q16avel)
predict.at30 = (predict.at30+pInput->q16avel)&0x7ffffff;
predict.at30 = degang(FixedToFloat(pInput->q16avel));
if (pInput->actions & SB_TURNAROUND)
if (!predict.at4c)
predict.at4c = -1024;
if (predict.at4c < 0)
if (!predict.at4c.asbuild())
predict.at4c = buildlook(-1024);
if (predict.at4c.asbuild() < 0)
{
int speed;
if (predict.at48 == 1)
@ -182,8 +182,8 @@ static void fakeProcessInput(PLAYER *pPlayer, InputPacket *pInput)
else
speed = 128;
predict.at4c = min(predict.at4c+speed, 0);
predict.at30 += IntToFixed(speed);
predict.at4c = buildlook(min(predict.at4c.asbuild()+speed, 0));
predict.at30 += buildang(speed);
}
if (!predict.at71)
@ -249,8 +249,8 @@ static void fakeProcessInput(PLAYER *pPlayer, InputPacket *pInput)
if (va && (sector[nSector].floorstat&2) != 0)
{
int z1 = getflorzofslope(nSector, predict.at50, predict.at54);
int x2 = predict.at50+mulscale30(64, Cos(FixedToInt(predict.at30)));
int y2 = predict.at54+mulscale30(64, Sin(FixedToInt(predict.at30)));
int x2 = predict.at50+mulscale30(64, Cos(predict.at30.asbuild()));
int y2 = predict.at54+mulscale30(64, Sin(predict.at30.asbuild()));
short nSector2 = nSector;
updatesector(x2, y2, &nSector2);
if (nSector2 == nSector)
@ -656,7 +656,7 @@ void viewCorrectPrediction(void)
#if 0
spritetype *pSprite = gMe->pSprite;
VIEW *pView = &predictFifo[(gNetFifoTail-1)&255];
if (gMe->q16ang != pView->at30 || pView->at24 != gMe->horizon.horiz || pView->at50 != pSprite->x || pView->at54 != pSprite->y || pView->at58 != pSprite->z)
if (gMe->angle.ang != pView->at30 || pView->at24 != gMe->horizon.horiz || pView->at50 != pSprite->x || pView->at54 != pSprite->y || pView->at58 != pSprite->z)
{
viewInitializePrediction();
predictOld = gPrevView[myconnectindex];

View file

@ -104,7 +104,7 @@ void viewBackupView(int nPlayer)
{
PLAYER *pPlayer = &gPlayer[nPlayer];
VIEW *pView = &gPrevView[nPlayer];
pView->at30 = pPlayer->q16ang;
pView->at30 = pPlayer->angle.ang;
pView->at50 = pPlayer->pSprite->x;
pView->at54 = pPlayer->pSprite->y;
pView->at38 = pPlayer->zView;
@ -116,8 +116,8 @@ void viewBackupView(int nPlayer)
pView->atc = pPlayer->bobWidth;
pView->at18 = pPlayer->swayHeight;
pView->at1c = pPlayer->swayWidth;
pView->q16look_ang = pPlayer->q16look_ang;
pView->q16rotscrnang = pPlayer->q16rotscrnang;
pView->look_ang = pPlayer->angle.look_ang;
pView->rotscrnang = pPlayer->angle.rotscrnang;
}
void viewCorrectViewOffsets(int nPlayer, vec3_t const *oldpos)
@ -633,8 +633,9 @@ void viewDrawScreen(bool sceneonly)
renderSetAspect(v1, yxaspect);
int cX, cY, cZ, v74, v8c;
fixed_t cA, q16rotscrnang;
fixedhoriz q16horizon, q16horizoff;
lookangle rotscrnang;
binangle cA;
fixedhoriz cH, cOff;
double zDelta, v4c, v48;
int nSectnum = gView->pSprite->sectnum;
if (numplayers > 1 && gView == gMe && gPrediction && gMe->pXSprite->health > 0)
@ -644,7 +645,7 @@ void viewDrawScreen(bool sceneonly)
cY = interpolate(predictOld.at54, predict.at54, gInterpolate);
cZ = interpolate(predictOld.at38, predict.at38, gInterpolate);
zDelta = finterpolate(predictOld.at34, predict.at34, gInterpolate);
q16horizoff = q16horiz(interpolate(predictOld.at28.asq16(), predict.at28.asq16(), gInterpolate));
cOff = q16horiz(interpolate(predictOld.at28.asq16(), predict.at28.asq16(), gInterpolate));
v74 = interpolate(predictOld.atc, predict.atc, gInterpolate);
v8c = interpolate(predictOld.at8, predict.at8, gInterpolate);
v4c = finterpolate(predictOld.at1c, predict.at1c, gInterpolate);
@ -652,15 +653,17 @@ void viewDrawScreen(bool sceneonly)
if (!cl_syncinput)
{
cA = predict.at30 + predict.q16look_ang;
q16horizon = predict.at24;
q16rotscrnang = predict.q16rotscrnang;
cA = bamang(predict.at30.asbam() + predict.look_ang.asbam());
cH = predict.at24;
rotscrnang = predict.rotscrnang;
}
else
{
cA = interpolateangfix16(predictOld.at30 + predictOld.q16look_ang, predict.at30 + predict.q16look_ang, gInterpolate);
q16horizon = q16horiz(interpolate(predictOld.at24.asq16(), predict.at24.asq16(), gInterpolate));
q16rotscrnang = interpolateangfix16(predictOld.q16rotscrnang, predict.q16rotscrnang, gInterpolate);
uint32_t oang = predictOld.at30.asbam() + predictOld.look_ang.asbam();
uint32_t ang = predict.at30.asbam() + predict.look_ang.asbam();
cA = interpolateangbin(oang, ang, gInterpolate);
cH = q16horiz(interpolate(predictOld.at24.asq16(), predict.at24.asq16(), gInterpolate));
rotscrnang = interpolateanglook(predictOld.rotscrnang.asbam(), predict.rotscrnang.asbam(), gInterpolate);
}
}
else
@ -670,7 +673,7 @@ void viewDrawScreen(bool sceneonly)
cY = interpolate(pView->at54, gView->pSprite->y, gInterpolate);
cZ = interpolate(pView->at38, gView->zView, gInterpolate);
zDelta = finterpolate(pView->at34, gView->zWeapon - gView->zView - (12 << 8), gInterpolate);
q16horizoff = q16horiz(interpolate(pView->at28.asq16(), gView->horizon.horizoff.asq16(), gInterpolate));
cOff = q16horiz(interpolate(pView->at28.asq16(), gView->horizon.horizoff.asq16(), gInterpolate));
v74 = interpolate(pView->atc, gView->bobWidth, gInterpolate);
v8c = interpolate(pView->at8, gView->bobHeight, gInterpolate);
v4c = finterpolate(pView->at1c, gView->swayWidth, gInterpolate);
@ -678,35 +681,37 @@ void viewDrawScreen(bool sceneonly)
if (!cl_syncinput)
{
cA = gView->q16ang + gView->q16look_ang;
q16horizon = gView->horizon.horiz;
q16rotscrnang = gView->q16rotscrnang;
cA = bamang(gView->angle.ang.asbam() + gView->angle.look_ang.asbam());
cH = gView->horizon.horiz;
rotscrnang = gView->angle.rotscrnang;
}
else
{
cA = interpolateangfix16(pView->at30 + pView->q16look_ang, gView->q16ang + gView->q16look_ang, gInterpolate);
q16horizon = q16horiz(interpolate(pView->at24.asq16(), gView->horizon.horiz.asq16(), gInterpolate));
q16rotscrnang = interpolateangfix16(pView->q16rotscrnang, gView->q16rotscrnang, gInterpolate);
uint32_t oang = pView->at30.asbam() + pView->look_ang.asbam();
uint32_t ang = gView->angle.ang.asbam() + gView->angle.look_ang.asbam();
cA = interpolateangbin(oang, ang, gInterpolate);
cH = q16horiz(interpolate(pView->at24.asq16(), gView->horizon.horiz.asq16(), gInterpolate));
rotscrnang = interpolateanglook(pView->rotscrnang.asbam(), gView->angle.rotscrnang.asbam(), gInterpolate);
}
}
viewUpdateShake();
q16horizon += buildhoriz(shakeHoriz);
cA += IntToFixed(shakeAngle);
cH += buildhoriz(shakeHoriz);
cA += buildang(shakeAngle);
cX += shakeX;
cY += shakeY;
cZ += shakeZ;
v4c += shakeBobX;
v48 += shakeBobY;
q16horizon += buildhoriz(mulscale30(0x40000000 - Cos(gView->tiltEffect << 2), 30));
cH += buildhoriz(mulscale30(0x40000000 - Cos(gView->tiltEffect << 2), 30));
if (gViewPos == 0)
{
if (cl_viewbob)
{
if (cl_viewhbob)
{
cX -= mulscale30(v74, Sin(FixedToInt(cA))) >> 4;
cY += mulscale30(v74, Cos(FixedToInt(cA))) >> 4;
cX -= mulscale30(v74, Sin(cA.asbuild())) >> 4;
cY += mulscale30(v74, Cos(cA.asbuild())) >> 4;
}
if (cl_viewvbob)
{
@ -715,15 +720,15 @@ void viewDrawScreen(bool sceneonly)
}
if (cl_slopetilting)
{
q16horizon += q16horizoff;
cH += cOff;
}
cZ += xs_CRoundToInt(q16horizon.asq16() / 6553.6);
cZ += xs_CRoundToInt(cH.asq16() / 6553.6);
cameradist = -1;
cameraclock = gFrameClock +mulscale16(4, (int)gInterpolate);
}
else
{
CalcPosition(gView->pSprite, (int*)&cX, (int*)&cY, (int*)&cZ, &nSectnum, FixedToInt(cA), q16horizon.asq16(), (int)gInterpolate);
CalcPosition(gView->pSprite, (int*)&cX, (int*)&cY, (int*)&cZ, &nSectnum, cA.asbuild(), cH.asq16(), (int)gInterpolate);
}
CheckLink((int*)&cX, (int*)&cY, (int*)&cZ, &nSectnum);
int v78 = interpolateang(gScreenTiltO, gScreenTilt, gInterpolate);
@ -734,7 +739,7 @@ void viewDrawScreen(bool sceneonly)
//int tiltcs, tiltdim;
uint8_t v4 = powerupCheck(gView, kPwUpCrystalBall) > 0;
#ifdef USE_OPENGL
renderSetRollAngle(FixedToFloat(q16rotscrnang));
renderSetRollAngle(rotscrnang.asbam() / (double)(BAMUNIT));
#endif
if (v78 || bDelirium)
{
@ -869,7 +874,7 @@ void viewDrawScreen(bool sceneonly)
nSprite = nextspritestat[nSprite];
}
g_visibility = (int32_t)(ClipLow(gVisibility - 32 * gView->visibility - unk, 0));
cA = (cA + interpolateangfix16(IntToFixed(deliriumTurnO), IntToFixed(deliriumTurn), gInterpolate)) & 0x7ffffff;
cA += q16ang(interpolateangfix16(IntToFixed(deliriumTurnO), IntToFixed(deliriumTurn), gInterpolate));
int vfc, vf8;
getzsofslope(nSectnum, cX, cY, &vfc, &vf8);
if (cZ >= vf8)
@ -880,13 +885,13 @@ void viewDrawScreen(bool sceneonly)
{
cZ = vfc + (gLowerLink[nSectnum] >= 0 ? 0 : (8 << 8));
}
q16horizon = q16horiz(ClipRange(q16horizon.asq16(), gi->playerHorizMin(), gi->playerHorizMax()));
cH = q16horiz(ClipRange(cH.asq16(), gi->playerHorizMin(), gi->playerHorizMax()));
RORHACK:
int ror_status[16];
for (int i = 0; i < 16; i++)
ror_status[i] = TestBitString(gotpic, 4080 + i);
fixed_t deliriumPitchI = interpolate(IntToFixed(deliriumPitchO), IntToFixed(deliriumPitch), gInterpolate);
DrawMirrors(cX, cY, cZ, cA, q16horizon.asq16() + deliriumPitchI, gInterpolate, gViewIndex);
DrawMirrors(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, gInterpolate, gViewIndex);
int bakCstat = gView->pSprite->cstat;
if (gViewPos == 0)
{
@ -897,8 +902,8 @@ void viewDrawScreen(bool sceneonly)
gView->pSprite->cstat |= 514;
}
renderDrawRoomsQ16(cX, cY, cZ, cA, q16horizon.asq16() + deliriumPitchI, nSectnum);
viewProcessSprites(cX, cY, cZ, FixedToInt(cA), gInterpolate);
renderDrawRoomsQ16(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, nSectnum);
viewProcessSprites(cX, cY, cZ, cA.asbuild(), gInterpolate);
bool do_ror_hack = false;
for (int i = 0; i < 16; i++)
if (ror_status[i] != TestBitString(gotpic, 4080 + i))
@ -955,7 +960,7 @@ void viewDrawScreen(bool sceneonly)
int v8 = byte_1CE5C2 > 0 && (sector[tmpSect].ceilingstat & 1);
if (gWeather.at12d8 > 0 || v8)
{
gWeather.Draw(cX, cY, cZ, cA, q16horizon.asq16() + deliriumPitch, gWeather.at12d8);
gWeather.Draw(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitch, gWeather.at12d8);
if (v8)
{
gWeather.at12d8 = ClipRange(delta * 8 + gWeather.at12d8, 0, 4095);

View file

@ -42,14 +42,14 @@ struct VIEW {
fixedhoriz at24; // horiz
fixedhoriz at28; // horizoff
int at2c;
fixed_t at30; // angle
binangle at30; // angle
int at34; // weapon z
int at38; // view z
int at3c;
int at40;
int at44;
int at48; // posture
int at4c; // spin
lookangle at4c; // spin
int at50; // x
int at54; // y
int at58; // z
@ -65,8 +65,8 @@ struct VIEW {
char at72; // underwater
short at73; // sprite flags
SPRITEHIT at75;
fixed_t q16look_ang;
fixed_t q16rotscrnang;
lookangle look_ang;
lookangle rotscrnang;
};
extern VIEW gPrevView[kMaxPlayers];