diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 35c1265ca..2707f6376 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -718,7 +718,11 @@ set( NOT_COMPILED_SOURCE_FILES zcc-parse.c zcc-parse.h common/platform/win32/zutil.natvis - + + games/blood/src/_polymost.cpp + games/duke/src/_polymost.cpp + games/sw/src/_polymost.cpp + # Blood games/blood/src/actor.cpp games/blood/src/ai.cpp diff --git a/source/build/include/build.h b/source/build/include/build.h index 1a57b1efb..9645964a6 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -729,6 +729,17 @@ inline void setgotpic(int32_t tilenume) 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" diff --git a/source/games/blood/src/_polymost.cpp b/source/games/blood/src/_polymost.cpp index 417da88b0..64b755d73 100644 --- a/source/games/blood/src/_polymost.cpp +++ b/source/games/blood/src/_polymost.cpp @@ -110,7 +110,7 @@ void processSpritesOnOtherSideOfPortal(int x, int y, int interpolation) for (int i = mirrorcnt-1; i >= 0; i--) { int nTile = 4080+i; - if (TestBitString(gotpic, nTile)) + if (testgotpic(nTile)) { 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())); RORHACK: - int ror_status[16]; + bool ror_status[16]; 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); DrawMirrors(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, gInterpolate, gViewIndex); int bakCstat = gView->pSprite->cstat; @@ -163,7 +163,7 @@ RORHACK: viewProcessSprites(pm_tsprite, pm_spritesortcnt, 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)) + if (ror_status[i] != testgotpic(4080 + i)) do_ror_hack = true; if (do_ror_hack) { @@ -188,7 +188,7 @@ void setPortalFlags(char mode) for (int i = mirrorcnt - 1; i >= 0; i--) { int nTile = 4080 + i; - if (TestBitString(gotpic, nTile)) + if (testgotpic(nTile)) { 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--) { int nTile = 4080 + i; - if (TestBitString(gotpic, nTile)) + if (testgotpic(nTile, true)) { - ClearBitString(gotpic, nTile); switch (mirror[i].type) { case 0: @@ -287,7 +286,7 @@ void DrawMirrors(int x, int y, int z, fixed_t a, fixed_t horiz, int smooth, int renderDrawMasks(); sector[nSector].floorstat = fstat; for (int i = 0; i < 16; i++) - ClearBitString(gotpic, 4080 + i); + cleargotpic(4080 + i); if (viewPlayer >= 0) { 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(); sector[nSector].ceilingstat = cstat; for (int i = 0; i < 16; i++) - ClearBitString(gotpic, 4080 + i); + cleargotpic(4080 + i); if (viewPlayer >= 0) { gPlayer[viewPlayer].pSprite->cstat = bakCstat; diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index 03e9743d4..60bbf823b 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -4969,11 +4969,11 @@ void MoveDude(spritetype *pSprite) switch (nLink) { case kMarkerLowStack: if (pPlayer == gView) - SetBitString(gotpic, sector[pSprite->sectnum].floorpicnum); + setgotpic(sector[pSprite->sectnum].floorpicnum); break; case kMarkerUpStack: if (pPlayer == gView) - SetBitString(gotpic, sector[pSprite->sectnum].ceilingpicnum); + setgotpic(sector[pSprite->sectnum].ceilingpicnum); break; case kMarkerLowWater: case kMarkerLowGoo: diff --git a/source/games/blood/src/view.cpp b/source/games/blood/src/view.cpp index 13c661af0..fa3498741 100644 --- a/source/games/blood/src/view.cpp +++ b/source/games/blood/src/view.cpp @@ -340,8 +340,6 @@ void UpdateBlend() videoTintBlood(nRed, nGreen, nBlue); } -uint8_t otherMirrorGotpic[2]; -uint8_t bakMirrorGotpic[2]; // int gVisibility; int deliriumTilt, deliriumTurn, deliriumPitch; @@ -542,7 +540,6 @@ void SetupView(int &cX, int& cY, int& cZ, binangle& cA, fixedhoriz& cH, int& nSe void renderCrystalBall() { #if 0 - // needs to be redone for pure hardware rendering when MP is working again. int tmp = (PlayClock / 240) % (gNetPlayers - 1); int i = connecthead; while (1) @@ -593,37 +590,7 @@ void renderCrystalBall() { 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); - 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); renderDrawMasks(); renderRestoreTarget(); @@ -636,10 +603,9 @@ void viewDrawScreen(bool sceneonly) { int nPalette = 0; - if (TestBitString(gotpic, 2342)) + if (testgotpic(2342, true)) { FireProcess(); - ClearBitString(gotpic, 2342); } if (!paused && (!M_Active() || gGameOptions.nGameType != 0)) diff --git a/source/games/duke/src/_polymost.cpp b/source/games/duke/src/_polymost.cpp index bb3d544ad..6aca17699 100644 --- a/source/games/duke/src/_polymost.cpp +++ b/source/games/duke/src/_polymost.cpp @@ -15,8 +15,7 @@ void SE40_Draw(int tag, spritetype *spr, int x, int y, int z, binangle a, fixedh i = FOF; //Effect TILE tileDelete(FOF); - if (!(gotpic[i >> 3] & (1 << (i & 7)))) return; - gotpic[i >> 3] &= ~(1 << (i & 7)); + if (!testgotpic(FOF, true)) return; 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) { - if ((gotpic[TILE_MIRROR >> 3] & (1 << (TILE_MIRROR & 7))) > 0) + if (testgotpic(TILE_MIRROR, true)) { int dst = 0x7fffffff, i = 0; 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 g_visibility = j; } - gotpic[TILE_MIRROR >> 3] &= ~(1 << (TILE_MIRROR & 7)); } } diff --git a/source/games/duke/src/actors_lava.cpp b/source/games/duke/src/actors_lava.cpp index ddebf025e..290b1932f 100644 --- a/source/games/duke/src/actors_lava.cpp +++ b/source/games/duke/src/actors_lava.cpp @@ -563,9 +563,8 @@ void thunder(void) 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 if (krand() > 65000) { @@ -593,9 +592,8 @@ void thunder(void) } if (!winderflash) { - if ((gotpic[RRTILE2562 >> 3] & (1 << (RRTILE2562 & 7))) > 0) + if (testgotpic(RRTILE2562, true)) { - gotpic[RRTILE2562 >> 3] &= ~(1 << (RRTILE2562 & 7)); if (krand() > 65000) { winderflash = 1; diff --git a/source/games/sw/src/_polymost.cpp b/source/games/sw/src/_polymost.cpp index 903fb96f2..ae6e80d5f 100644 --- a/source/games/sw/src/_polymost.cpp +++ b/source/games/sw/src/_polymost.cpp @@ -29,9 +29,8 @@ ViewSectorInScene(short cursectnum, short level) // found a potential match match = sp->lotag; - if (!PicInView(FAF_MIRROR_PIC, true)) + if (!testgotpic(FAF_MIRROR_PIC, true)) return -1; - 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 if (gotsector[sprite[i].sectnum]) { - SET_GOTPIC(FAF_MIRROR_PIC); + setgotpic(FAF_MIRROR_PIC); } 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! 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--) - //if (TEST_GOTPIC(cnt + MIRRORLABEL) || TEST_GOTPIC(cnt + CAMSPRITE)) - if (TEST_GOTPIC(cnt + MIRRORLABEL) || ((unsigned)mirror[cnt].campic < MAXTILES && TEST_GOTPIC(mirror[cnt].campic))) + //if (testgotpic(cnt + MIRRORLABEL) || testgotpic(cnt + CAMSPRITE)) + if (testgotpic(cnt + MIRRORLABEL) || ((unsigned)mirror[cnt].campic < MAXTILES && testgotpic(mirror[cnt].campic))) { bIsWallMirror = false; - if (TEST_GOTPIC(cnt + MIRRORLABEL)) + if (testgotpic(cnt + MIRRORLABEL, true)) { bIsWallMirror = true; - RESET_GOTPIC(cnt + MIRRORLABEL); } - //else if (TEST_GOTPIC(cnt + CAMSPRITE)) - else if ((unsigned)mirror[cnt].campic < MAXTILES && TEST_GOTPIC(mirror[cnt].campic)) + else if ((unsigned)mirror[cnt].campic < MAXTILES && testgotpic(mirror[cnt].campic)) { - //RESET_GOTPIC(cnt + CAMSPRITE); - RESET_GOTPIC(mirror[cnt].campic); + cleargotpic(mirror[cnt].campic); } mirrorinview = true; diff --git a/source/games/sw/src/break.cpp b/source/games/sw/src/break.cpp index b8403d267..5fd3e09b2 100644 --- a/source/games/sw/src/break.cpp +++ b/source/games/sw/src/break.cpp @@ -478,10 +478,6 @@ BREAK_INFOp SetupWallForBreak(WALLp wallp) { wallp->lotag = TAG_WALL_BREAK; 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)) @@ -528,10 +524,6 @@ BREAK_INFOp SetupSpriteForBreak(SPRITEp sp) sp->clipdist = SPRITEp_SIZE_X(sp); SET(sp->cstat, CSTAT_SPRITE_BREAKABLE); - - // set for cacheing - if (break_info->breaknum >= 0) - SET_GOTPIC(break_info->breaknum); } return break_info; diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp index c8305ebde..7bb9dc414 100644 --- a/source/games/sw/src/draw.cpp +++ b/source/games/sw/src/draw.cpp @@ -1365,7 +1365,6 @@ void PreDrawStackedWater(void) short ScreenSavePic = false; -bool PicInView(short, bool); void DoPlayerDiveMeter(PLAYERp pp); 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); -#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 (ScreenSavePic) { diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index da6f93897..f2c7d24ad 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -354,10 +354,6 @@ inline int SPRITEp_SIZE_BOS(const spritetype* sp) // just determine if the player is moving #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 HIGH_TAG(sectnum) ( sector[sectnum].hitag ) diff --git a/source/games/sw/src/jsector.cpp b/source/games/sw/src/jsector.cpp index aefe4c442..0f81b8245 100644 --- a/source/games/sw/src/jsector.cpp +++ b/source/games/sw/src/jsector.cpp @@ -559,9 +559,6 @@ void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz, double smoothratio) } 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; 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 (TEST_GOTPIC(cnt + MIRRORLABEL) || TEST_GOTPIC(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))) { // Do not change any global state here! - bIsWallMirror = !!(TEST_GOTPIC(cnt + MIRRORLABEL)); + bIsWallMirror = testgotpic(cnt + MIRRORLABEL); dist = 0x7fffffff; if (bIsWallMirror) diff --git a/source/games/sw/src/rooms.cpp b/source/games/sw/src/rooms.cpp index f08b972a0..cf561f10b 100644 --- a/source/games/sw/src/rooms.cpp +++ b/source/games/sw/src/rooms.cpp @@ -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 SetupMirrorTiles(void) {