- cleanup of 'gotpic' handling.

This commit is contained in:
Christoph Oelckers 2021-05-09 09:05:42 +02:00
parent e74aca291c
commit e40ed2262e
13 changed files with 40 additions and 117 deletions

View file

@ -718,7 +718,11 @@ set( NOT_COMPILED_SOURCE_FILES
zcc-parse.c zcc-parse.c
zcc-parse.h zcc-parse.h
common/platform/win32/zutil.natvis common/platform/win32/zutil.natvis
games/blood/src/_polymost.cpp
games/duke/src/_polymost.cpp
games/sw/src/_polymost.cpp
# Blood # Blood
games/blood/src/actor.cpp games/blood/src/actor.cpp
games/blood/src/ai.cpp games/blood/src/ai.cpp

View file

@ -729,6 +729,17 @@ inline void setgotpic(int32_t tilenume)
gotpic[tilenume >> 3] |= 1 << (tilenume & 7); gotpic[tilenume >> 3] |= 1 << (tilenume & 7);
} }
inline void cleargotpic(int32_t tilenume)
{
gotpic[tilenume >> 3] &= ~(1 << (tilenume & 7));
}
inline bool testgotpic(int32_t tilenume, bool reset = false)
{
bool res = gotpic[tilenume >> 3] & (1 << (tilenume & 7));
if (reset) gotpic[tilenume >> 3] &= ~(1 << (tilenume & 7));
return res;
}
#include "iterators.h" #include "iterators.h"

View file

@ -110,7 +110,7 @@ void processSpritesOnOtherSideOfPortal(int x, int y, int interpolation)
for (int i = mirrorcnt-1; i >= 0; i--) for (int i = mirrorcnt-1; i >= 0; i--)
{ {
int nTile = 4080+i; int nTile = 4080+i;
if (TestBitString(gotpic, nTile)) if (testgotpic(nTile))
{ {
if (mirror[i].type == 1 || mirror[i].type == 2) if (mirror[i].type == 1 || mirror[i].type == 2)
{ {
@ -144,9 +144,9 @@ void render3DViewPolymost(int nSectnum, int cX, int cY, int cZ, binangle cA, fix
} }
cH = q16horiz(ClipRange(cH.asq16(), gi->playerHorizMin(), gi->playerHorizMax())); cH = q16horiz(ClipRange(cH.asq16(), gi->playerHorizMin(), gi->playerHorizMax()));
RORHACK: RORHACK:
int ror_status[16]; bool ror_status[16];
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
ror_status[i] = TestBitString(gotpic, 4080 + i); ror_status[i] = testgotpic(4080 + i);
fixed_t deliriumPitchI = interpolatedvalue(IntToFixed(deliriumPitchO), IntToFixed(deliriumPitch), gInterpolate); fixed_t deliriumPitchI = interpolatedvalue(IntToFixed(deliriumPitchO), IntToFixed(deliriumPitch), gInterpolate);
DrawMirrors(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, gInterpolate, gViewIndex); DrawMirrors(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, gInterpolate, gViewIndex);
int bakCstat = gView->pSprite->cstat; int bakCstat = gView->pSprite->cstat;
@ -163,7 +163,7 @@ RORHACK:
viewProcessSprites(pm_tsprite, pm_spritesortcnt, cX, cY, cZ, cA.asbuild(), gInterpolate); viewProcessSprites(pm_tsprite, pm_spritesortcnt, cX, cY, cZ, cA.asbuild(), gInterpolate);
bool do_ror_hack = false; bool do_ror_hack = false;
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
if (ror_status[i] != TestBitString(gotpic, 4080 + i)) if (ror_status[i] != testgotpic(4080 + i))
do_ror_hack = true; do_ror_hack = true;
if (do_ror_hack) if (do_ror_hack)
{ {
@ -188,7 +188,7 @@ void setPortalFlags(char mode)
for (int i = mirrorcnt - 1; i >= 0; i--) for (int i = mirrorcnt - 1; i >= 0; i--)
{ {
int nTile = 4080 + i; int nTile = 4080 + i;
if (TestBitString(gotpic, nTile)) if (testgotpic(nTile))
{ {
switch (mirror[i].type) switch (mirror[i].type)
{ {
@ -215,9 +215,8 @@ void DrawMirrors(int x, int y, int z, fixed_t a, fixed_t horiz, int smooth, int
for (int i = mirrorcnt - 1; i >= 0; i--) for (int i = mirrorcnt - 1; i >= 0; i--)
{ {
int nTile = 4080 + i; int nTile = 4080 + i;
if (TestBitString(gotpic, nTile)) if (testgotpic(nTile, true))
{ {
ClearBitString(gotpic, nTile);
switch (mirror[i].type) switch (mirror[i].type)
{ {
case 0: case 0:
@ -287,7 +286,7 @@ void DrawMirrors(int x, int y, int z, fixed_t a, fixed_t horiz, int smooth, int
renderDrawMasks(); renderDrawMasks();
sector[nSector].floorstat = fstat; sector[nSector].floorstat = fstat;
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
ClearBitString(gotpic, 4080 + i); cleargotpic(4080 + i);
if (viewPlayer >= 0) if (viewPlayer >= 0)
{ {
gPlayer[viewPlayer].pSprite->cstat = bakCstat; gPlayer[viewPlayer].pSprite->cstat = bakCstat;
@ -319,7 +318,7 @@ void DrawMirrors(int x, int y, int z, fixed_t a, fixed_t horiz, int smooth, int
renderDrawMasks(); renderDrawMasks();
sector[nSector].ceilingstat = cstat; sector[nSector].ceilingstat = cstat;
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
ClearBitString(gotpic, 4080 + i); cleargotpic(4080 + i);
if (viewPlayer >= 0) if (viewPlayer >= 0)
{ {
gPlayer[viewPlayer].pSprite->cstat = bakCstat; gPlayer[viewPlayer].pSprite->cstat = bakCstat;

View file

@ -4969,11 +4969,11 @@ void MoveDude(spritetype *pSprite)
switch (nLink) { switch (nLink) {
case kMarkerLowStack: case kMarkerLowStack:
if (pPlayer == gView) if (pPlayer == gView)
SetBitString(gotpic, sector[pSprite->sectnum].floorpicnum); setgotpic(sector[pSprite->sectnum].floorpicnum);
break; break;
case kMarkerUpStack: case kMarkerUpStack:
if (pPlayer == gView) if (pPlayer == gView)
SetBitString(gotpic, sector[pSprite->sectnum].ceilingpicnum); setgotpic(sector[pSprite->sectnum].ceilingpicnum);
break; break;
case kMarkerLowWater: case kMarkerLowWater:
case kMarkerLowGoo: case kMarkerLowGoo:

View file

@ -340,8 +340,6 @@ void UpdateBlend()
videoTintBlood(nRed, nGreen, nBlue); videoTintBlood(nRed, nGreen, nBlue);
} }
uint8_t otherMirrorGotpic[2];
uint8_t bakMirrorGotpic[2];
// int gVisibility; // int gVisibility;
int deliriumTilt, deliriumTurn, deliriumPitch; int deliriumTilt, deliriumTurn, deliriumPitch;
@ -542,7 +540,6 @@ void SetupView(int &cX, int& cY, int& cZ, binangle& cA, fixedhoriz& cH, int& nSe
void renderCrystalBall() void renderCrystalBall()
{ {
#if 0 #if 0
// needs to be redone for pure hardware rendering when MP is working again.
int tmp = (PlayClock / 240) % (gNetPlayers - 1); int tmp = (PlayClock / 240) % (gNetPlayers - 1);
int i = connecthead; int i = connecthead;
while (1) while (1)
@ -593,37 +590,7 @@ void renderCrystalBall()
{ {
v14 = 10; v14 = 10;
} }
memcpy(bakMirrorGotpic, gotpic + 510, 2);
memcpy(gotpic + 510, otherMirrorGotpic, 2);
g_visibility = (int32_t)(ClipLow(gVisibility - 32 * pOther->visibility, 0));
int vc4, vc8;
getzsofslope(vcc, vd8, vd4, &vc8, &vc4);
if (vd0 >= vc4)
{
vd0 = vc4 - (gUpperLink[vcc] >= 0 ? 0 : (8 << 8));
}
if (vd0 <= vc8)
{
vd0 = vc8 + (gLowerLink[vcc] >= 0 ? 0 : (8 << 8));
}
v54 = ClipRange(v54, -200, 200);
RORHACKOTHER:
int ror_status[16];
for (int i = 0; i < 16; i++)
ror_status[i] = TestBitString(gotpic, 4080 + i);
DrawMirrors(vd8, vd4, vd0, IntToFixed(v50), IntToFixed(v54), gInterpolate, -1);
drawrooms(vd8, vd4, vd0, v50, v54, vcc); drawrooms(vd8, vd4, vd0, v50, v54, vcc);
bool do_ror_hack = false;
for (int i = 0; i < 16; i++)
if (ror_status[i] != TestBitString(gotpic, 4080 + i))
do_ror_hack = true;
if (do_ror_hack)
{
spritesortcnt = 0;
goto RORHACKOTHER;
}
memcpy(otherMirrorGotpic, gotpic + 510, 2);
memcpy(gotpic + 510, bakMirrorGotpic, 2);
viewProcessSprites(vd8, vd4, vd0, v50, gInterpolate); viewProcessSprites(vd8, vd4, vd0, v50, gInterpolate);
renderDrawMasks(); renderDrawMasks();
renderRestoreTarget(); renderRestoreTarget();
@ -636,10 +603,9 @@ void viewDrawScreen(bool sceneonly)
{ {
int nPalette = 0; int nPalette = 0;
if (TestBitString(gotpic, 2342)) if (testgotpic(2342, true))
{ {
FireProcess(); FireProcess();
ClearBitString(gotpic, 2342);
} }
if (!paused && (!M_Active() || gGameOptions.nGameType != 0)) if (!paused && (!M_Active() || gGameOptions.nGameType != 0))

View file

@ -15,8 +15,7 @@ void SE40_Draw(int tag, spritetype *spr, int x, int y, int z, binangle a, fixedh
i = FOF; //Effect TILE i = FOF; //Effect TILE
tileDelete(FOF); tileDelete(FOF);
if (!(gotpic[i >> 3] & (1 << (i & 7)))) return; if (!testgotpic(FOF, true)) return;
gotpic[i >> 3] &= ~(1 << (i & 7));
floor1 = spr; floor1 = spr;
@ -165,7 +164,7 @@ void se40code(int x, int y, int z, binangle a, fixedhoriz h, int smoothratio)
void renderMirror(int cposx, int cposy, int cposz, binangle cang, fixedhoriz choriz, int smoothratio) void renderMirror(int cposx, int cposy, int cposz, binangle cang, fixedhoriz choriz, int smoothratio)
{ {
if ((gotpic[TILE_MIRROR >> 3] & (1 << (TILE_MIRROR & 7))) > 0) if (testgotpic(TILE_MIRROR, true))
{ {
int dst = 0x7fffffff, i = 0; int dst = 0x7fffffff, i = 0;
for (int k = 0; k < mirrorcnt; k++) for (int k = 0; k < mirrorcnt; k++)
@ -194,7 +193,6 @@ void renderMirror(int cposx, int cposy, int cposz, binangle cang, fixedhoriz cho
renderCompleteMirror(); //Reverse screen x-wise in this function renderCompleteMirror(); //Reverse screen x-wise in this function
g_visibility = j; g_visibility = j;
} }
gotpic[TILE_MIRROR >> 3] &= ~(1 << (TILE_MIRROR & 7));
} }
} }

View file

@ -563,9 +563,8 @@ void thunder(void)
if (!thunderflash) if (!thunderflash)
{ {
if ((gotpic[RRTILE2577 >> 3] & (1 << (RRTILE2577 & 7))) > 0) if (testgotpic(RRTILE2577, true))
{ {
gotpic[RRTILE2577 >> 3] &= ~(1 << (RRTILE2577 & 7));
g_visibility = 256; // this is an engine variable g_visibility = 256; // this is an engine variable
if (krand() > 65000) if (krand() > 65000)
{ {
@ -593,9 +592,8 @@ void thunder(void)
} }
if (!winderflash) if (!winderflash)
{ {
if ((gotpic[RRTILE2562 >> 3] & (1 << (RRTILE2562 & 7))) > 0) if (testgotpic(RRTILE2562, true))
{ {
gotpic[RRTILE2562 >> 3] &= ~(1 << (RRTILE2562 & 7));
if (krand() > 65000) if (krand() > 65000)
{ {
winderflash = 1; winderflash = 1;

View file

@ -29,9 +29,8 @@ ViewSectorInScene(short cursectnum, short level)
// found a potential match // found a potential match
match = sp->lotag; match = sp->lotag;
if (!PicInView(FAF_MIRROR_PIC, true)) if (!testgotpic(FAF_MIRROR_PIC, true))
return -1; return -1;
return match; return match;
} }
} }
@ -136,7 +135,7 @@ void FAF_DrawRooms(int x, int y, int z, fixed_t q16ang, fixed_t q16horiz, short
// manually set gotpic // manually set gotpic
if (gotsector[sprite[i].sectnum]) if (gotsector[sprite[i].sectnum])
{ {
SET_GOTPIC(FAF_MIRROR_PIC); setgotpic(FAF_MIRROR_PIC);
} }
if (SPRITE_TAG3(i) == 0) if (SPRITE_TAG3(i) == 0)
@ -195,25 +194,19 @@ void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, fixed_t tpq16ang, fixed
// drift! // drift!
bool bIsWallMirror = false; bool bIsWallMirror = false;
// WARNING! Assuming (MIRRORLABEL&31) = 0 and MAXMIRRORS = 64 <-- JBF: wrong
longptr = (int *)&gotpic[MIRRORLABEL >> 3];
if (longptr && (longptr[0] || longptr[1]))
{ {
for (cnt = MAXMIRRORS - 1; cnt >= 0; cnt--) for (cnt = MAXMIRRORS - 1; cnt >= 0; cnt--)
//if (TEST_GOTPIC(cnt + MIRRORLABEL) || TEST_GOTPIC(cnt + CAMSPRITE)) //if (testgotpic(cnt + MIRRORLABEL) || testgotpic(cnt + CAMSPRITE))
if (TEST_GOTPIC(cnt + MIRRORLABEL) || ((unsigned)mirror[cnt].campic < MAXTILES && TEST_GOTPIC(mirror[cnt].campic))) if (testgotpic(cnt + MIRRORLABEL) || ((unsigned)mirror[cnt].campic < MAXTILES && testgotpic(mirror[cnt].campic)))
{ {
bIsWallMirror = false; bIsWallMirror = false;
if (TEST_GOTPIC(cnt + MIRRORLABEL)) if (testgotpic(cnt + MIRRORLABEL, true))
{ {
bIsWallMirror = true; bIsWallMirror = true;
RESET_GOTPIC(cnt + MIRRORLABEL);
} }
//else if (TEST_GOTPIC(cnt + CAMSPRITE)) else if ((unsigned)mirror[cnt].campic < MAXTILES && testgotpic(mirror[cnt].campic))
else if ((unsigned)mirror[cnt].campic < MAXTILES && TEST_GOTPIC(mirror[cnt].campic))
{ {
//RESET_GOTPIC(cnt + CAMSPRITE); cleargotpic(mirror[cnt].campic);
RESET_GOTPIC(mirror[cnt].campic);
} }
mirrorinview = true; mirrorinview = true;

View file

@ -478,10 +478,6 @@ BREAK_INFOp SetupWallForBreak(WALLp wallp)
{ {
wallp->lotag = TAG_WALL_BREAK; wallp->lotag = TAG_WALL_BREAK;
SET(wallp->extra, WALLFX_DONT_STICK); SET(wallp->extra, WALLFX_DONT_STICK);
// set for cacheing
if (break_info->breaknum >= 0)
SET_GOTPIC(break_info->breaknum);
} }
if (wallp->overpicnum > 0 && TEST(wallp->cstat, CSTAT_WALL_MASKED)) if (wallp->overpicnum > 0 && TEST(wallp->cstat, CSTAT_WALL_MASKED))
@ -528,10 +524,6 @@ BREAK_INFOp SetupSpriteForBreak(SPRITEp sp)
sp->clipdist = SPRITEp_SIZE_X(sp); sp->clipdist = SPRITEp_SIZE_X(sp);
SET(sp->cstat, CSTAT_SPRITE_BREAKABLE); SET(sp->cstat, CSTAT_SPRITE_BREAKABLE);
// set for cacheing
if (break_info->breaknum >= 0)
SET_GOTPIC(break_info->breaknum);
} }
return break_info; return break_info;

View file

@ -1365,7 +1365,6 @@ void PreDrawStackedWater(void)
short ScreenSavePic = false; short ScreenSavePic = false;
bool PicInView(short, bool);
void DoPlayerDiveMeter(PLAYERp pp); void DoPlayerDiveMeter(PLAYERp pp);
void polymost_drawscreen(PLAYERp pp, int tx, int ty, int tz, binangle tang, fixedhoriz thoriz, int tsectnum); void polymost_drawscreen(PLAYERp pp, int tx, int ty, int tz, binangle tang, fixedhoriz thoriz, int tsectnum);
@ -1611,20 +1610,6 @@ drawscreen(PLAYERp pp, double smoothratio)
if (!ScreenSavePic) UpdatePanel(smoothratio); if (!ScreenSavePic) UpdatePanel(smoothratio);
#define SLIME 2305
// Only animate lava if its picnum is on screen
// gotpic is a bit array where the tile number's bit is set
// whenever it is drawn (ceilings, walls, sprites, etc.)
#if 0 // This needs a different implementation.
if ((gotpic[SLIME >> 3] & (1 << (SLIME & 7))) > 0)
{
gotpic[SLIME >> 3] &= ~(1 << (SLIME & 7));
if (waloff[SLIME])
movelava((char *) waloff[SLIME]);
}
#endif
// if doing a screen save don't need to process the rest // if doing a screen save don't need to process the rest
if (ScreenSavePic) if (ScreenSavePic)
{ {

View file

@ -354,10 +354,6 @@ inline int SPRITEp_SIZE_BOS(const spritetype* sp)
// just determine if the player is moving // just determine if the player is moving
#define PLAYER_MOVING(pp) ((pp)->xvect|(pp)->yvect) #define PLAYER_MOVING(pp) ((pp)->xvect|(pp)->yvect)
#define TEST_GOTPIC(tile_num) (TEST(gotpic[(tile_num) >> 3], 1 << ((tile_num) & 7)))
#define RESET_GOTPIC(tile_num) (RESET(gotpic[(tile_num) >> 3], 1 << ((tile_num) & 7)))
#define SET_GOTPIC(tile_num) (SET(gotpic[(tile_num) >> 3], 1 << ((tile_num) & 7)))
#define LOW_TAG(sectnum) ( sector[sectnum].lotag ) #define LOW_TAG(sectnum) ( sector[sectnum].lotag )
#define HIGH_TAG(sectnum) ( sector[sectnum].hitag ) #define HIGH_TAG(sectnum) ( sector[sectnum].hitag )

View file

@ -559,9 +559,6 @@ void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz, double smoothratio)
} }
lastcamclock = camclock; lastcamclock = camclock;
// WARNING! Assuming (MIRRORLABEL&31) = 0 and MAXMIRRORS = 64 <-- JBF: wrong
longptr = (int*)&gotpic[MIRRORLABEL >> 3];
if (longptr && (longptr[0] || longptr[1]))
{ {
uint32_t oscilation_delta = camclock - oscilationclock; uint32_t oscilation_delta = camclock - oscilationclock;
oscilation_delta -= oscilation_delta % 4; oscilation_delta -= oscilation_delta % 4;
@ -571,11 +568,10 @@ void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz, double smoothratio)
{ {
if (!mirror[cnt].ismagic) continue; // these are definitely not camera textures. if (!mirror[cnt].ismagic) continue; // these are definitely not camera textures.
//if (TEST_GOTPIC(cnt + MIRRORLABEL) || TEST_GOTPIC(cnt + CAMSPRITE)) if (testgotpic(cnt + MIRRORLABEL) || ((unsigned)mirror[cnt].campic < MAXTILES && testgotpic(mirror[cnt].campic)))
if (TEST_GOTPIC(cnt + MIRRORLABEL) || ((unsigned)mirror[cnt].campic < MAXTILES && TEST_GOTPIC(mirror[cnt].campic)))
{ {
// Do not change any global state here! // Do not change any global state here!
bIsWallMirror = !!(TEST_GOTPIC(cnt + MIRRORLABEL)); bIsWallMirror = testgotpic(cnt + MIRRORLABEL);
dist = 0x7fffffff; dist = 0x7fffffff;
if (bIsWallMirror) if (bIsWallMirror)

View file

@ -633,21 +633,6 @@ void FAFgetzrangepoint(int32_t x, int32_t y, int32_t z, int16_t sectnum,
} }
} }
// doesn't work for blank pics
bool
PicInView(short tile_num, bool reset)
{
if (TEST(gotpic[tile_num >> 3], 1 << (tile_num & 7)))
{
if (reset)
RESET(gotpic[tile_num >> 3], 1 << (tile_num & 7));
return true;
}
return false;
}
void void
SetupMirrorTiles(void) SetupMirrorTiles(void)
{ {