From 4f2170655c581aa36f1e7ccebba591a1260f4008 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 5 Aug 2022 18:47:35 +0200 Subject: [PATCH] - animateoffs cleanup and consolidation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was rewritten based on specs alone - it still doesn’t look that different due to its simplicity. --- source/build/include/build.h | 11 ---- source/build/src/clip.cpp | 2 +- source/build/src/engine.cpp | 37 ------------ source/core/gamefuncs.cpp | 10 ++-- source/core/gamehud.cpp | 3 +- source/core/rendering/scene/hw_drawinfo.cpp | 2 +- source/core/rendering/scene/hw_flats.cpp | 4 +- source/core/rendering/scene/hw_sky.cpp | 2 +- source/core/rendering/scene/hw_walls.cpp | 8 +-- source/core/textures/buildtiles.cpp | 37 +++++++++++- source/core/textures/buildtiles.h | 21 ++++--- source/games/blood/all.cpp | 1 - source/games/blood/src/animatesprite.cpp | 4 +- source/games/blood/src/hudsprites.cpp | 2 +- source/games/blood/src/replace.cpp | 64 --------------------- 15 files changed, 68 insertions(+), 140 deletions(-) delete mode 100644 source/games/blood/src/replace.cpp diff --git a/source/build/include/build.h b/source/build/include/build.h index 6a4bc3072..9394f13b7 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -268,15 +268,4 @@ extern int32_t rintersect(int32_t x1, int32_t y1, int32_t z1, void updateModelInterpolation(); -inline void tileUpdatePicnum(int* const tileptr, int const obj, int stat) -{ - auto& tile = *tileptr; - - if (picanm[tile].sf & PICANM_ANIMTYPE_MASK) - tile += animateoffs(tile, obj); - - if (((obj & 16384) == 16384) && (stat & CSTAT_WALL_ROTATE_90) && RotTile(tile).newtile != -1) - tile = RotTile(tile).newtile; -} - #endif // build_h_ diff --git a/source/build/src/clip.cpp b/source/build/src/clip.cpp index 871c4edf2..a4f2335a6 100644 --- a/source/build/src/clip.cpp +++ b/source/build/src/clip.cpp @@ -1467,7 +1467,7 @@ int hitscan(const vec3_t& start, const sectortype* startsect, const vec3_t& dire { if (picanm[tilenum].sf&PICANM_TEXHITSCAN_BIT) { - tileUpdatePicnum(&tilenum, 0, 0); + tileUpdatePicnum(&tilenum); if (tileLoad(tilenum)) { diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index 20bf7e006..4ef4a96b5 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -49,43 +49,6 @@ static int16_t radarang[1280]; // Internal Engine Functions // -BEGIN_BLD_NS -int qanimateoffs(int a1, int a2); -END_BLD_NS - -// -// animateoffs (internal) -// -int32_t animateoffs(int const tilenum, int fakevar) -{ - if (isBlood()) - { - return Blood::qanimateoffs(tilenum, fakevar); - } - - int const animnum = picanm[tilenum].num; - - if (animnum <= 0) - return 0; - - int const i = (int) I_GetBuildTime() >> (picanm[tilenum].sf & PICANM_ANIMSPEED_MASK); - int offs = 0; - - switch (picanm[tilenum].sf & PICANM_ANIMTYPE_MASK) - { - case PICANM_ANIMTYPE_OSC: - { - int k = (i % (animnum << 1)); - offs = (k < animnum) ? k : (animnum << 1) - k; - } - break; - case PICANM_ANIMTYPE_FWD: offs = i % (animnum + 1); break; - case PICANM_ANIMTYPE_BACK: offs = -(i % (animnum + 1)); break; - } - - return offs; -} - void engineInit(void) { int32_t i; diff --git a/source/core/gamefuncs.cpp b/source/core/gamefuncs.cpp index 5329c9464..37e4f58ee 100644 --- a/source/core/gamefuncs.cpp +++ b/source/core/gamefuncs.cpp @@ -408,16 +408,16 @@ void checkRotatedWalls() { if (w.cstat & CSTAT_WALL_ROTATE_90) { - auto& tile = RotTile(w.picnum + animateoffs(w.picnum, 16384)); + int picnum = w.picnum; + tileUpdatePicnum(&picnum); + auto& tile = RotTile(picnum); if (tile.newtile == -1 && tile.owner == -1) { - auto owner = w.picnum + animateoffs(w.picnum, 16384); - - tile.newtile = TileFiles.tileCreateRotated(owner); + tile.newtile = TileFiles.tileCreateRotated(picnum); assert(tile.newtile != -1); - RotTile(tile.newtile).owner = w.picnum + animateoffs(w.picnum, 16384); + RotTile(tile.newtile).owner = picnum; } } diff --git a/source/core/gamehud.cpp b/source/core/gamehud.cpp index da4c55831..33b07e4f7 100644 --- a/source/core/gamehud.cpp +++ b/source/core/gamehud.cpp @@ -56,8 +56,7 @@ void hud_drawsprite(double sx, double sy, double sz, double a, int picnum, int d alpha *= (dastat & RS_TRANS1)? glblend[0].def[!!(dastat & RS_TRANS2)].alpha : 1.; int palid = TRANSLATION(Translation_Remap + curbasepal, dapalnum); - if (picanm[picnum].sf & PICANM_ANIMTYPE_MASK) - picnum += animateoffs(picnum, 0); + tileUpdatePicnum(&picnum); auto tex = tileGetTexture(picnum); diff --git a/source/core/rendering/scene/hw_drawinfo.cpp b/source/core/rendering/scene/hw_drawinfo.cpp index 19e9b8ade..ba4d9091a 100644 --- a/source/core/rendering/scene/hw_drawinfo.cpp +++ b/source/core/rendering/scene/hw_drawinfo.cpp @@ -285,7 +285,7 @@ void HWDrawInfo::DispatchSprites() actor->spr.cstat2 |= CSTAT2_SPRITE_MAPPED; if ((tspr->cstat & CSTAT_SPRITE_ALIGNMENT_MASK) != CSTAT_SPRITE_ALIGNMENT_SLAB) - tileUpdatePicnum(&tilenum, (actor->GetIndex() & 16383) + 32768, 0); + tileUpdatePicnum(&tilenum, false, (actor->GetIndex() & 16383)); tspr->picnum = tilenum; gotpic.Set(tilenum); diff --git a/source/core/rendering/scene/hw_flats.cpp b/source/core/rendering/scene/hw_flats.cpp index 2459857a5..734d9cb68 100644 --- a/source/core/rendering/scene/hw_flats.cpp +++ b/source/core/rendering/scene/hw_flats.cpp @@ -355,7 +355,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sectortype * frontsector, int section { int tilenum = frontsector->floorpicnum; gotpic.Set(tilenum); - tileUpdatePicnum(&tilenum, tilenum, 0); + tileUpdatePicnum(&tilenum); texture = tileGetTexture(tilenum); if (texture && texture->isValid()) { @@ -399,7 +399,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sectortype * frontsector, int section int tilenum = frontsector->ceilingpicnum; gotpic.Set(tilenum); - tileUpdatePicnum(&tilenum, tilenum, 0); + tileUpdatePicnum(&tilenum); texture = tileGetTexture(tilenum); if (texture && texture->isValid()) { diff --git a/source/core/rendering/scene/hw_sky.cpp b/source/core/rendering/scene/hw_sky.cpp index 949e09389..b66619a41 100644 --- a/source/core/rendering/scene/hw_sky.cpp +++ b/source/core/rendering/scene/hw_sky.cpp @@ -44,7 +44,7 @@ FGameTexture* SkyboxReplacement(FTextureID picnum, int palnum); void initSkyInfo(HWDrawInfo *di, HWSkyInfo* sky, sectortype* sector, int plane) { int picnum = plane == plane_ceiling ? sector->ceilingpicnum : sector->floorpicnum; - tileUpdatePicnum(&picnum, 0, 0); + tileUpdatePicnum(&picnum); int palette = plane == plane_ceiling ? sector->ceilingpal : sector->floorpal; FGameTexture* skytex = SkyboxReplacement(tileGetTexture(picnum)->GetID(), palette); diff --git a/source/core/rendering/scene/hw_walls.cpp b/source/core/rendering/scene/hw_walls.cpp index fc636cc80..01406f3fe 100644 --- a/source/core/rendering/scene/hw_walls.cpp +++ b/source/core/rendering/scene/hw_walls.cpp @@ -1000,7 +1000,7 @@ void HWWall::Process(HWDrawInfo* di, walltype* wal, sectortype* frontsector, sec int tilenum = ((wal->cstat & CSTAT_WALL_1WAY) && wal->nextwall != -1) ? wal->overpicnum : wal->picnum; gotpic.Set(tilenum); - tileUpdatePicnum(&tilenum, wallnum(wal) + 16384, wal->cstat); + tileUpdatePicnum(&tilenum, (wal->cstat & CSTAT_WALL_ROTATE_90)); texture = tileGetTexture(tilenum); if (texture && texture->isValid()) { @@ -1038,7 +1038,7 @@ void HWWall::Process(HWDrawInfo* di, walltype* wal, sectortype* frontsector, sec { int tilenum = wal->picnum; gotpic.Set(tilenum); - tileUpdatePicnum(&tilenum, wallnum(wal) + 16384, wal->cstat); + tileUpdatePicnum(&tilenum, (wal->cstat & CSTAT_WALL_ROTATE_90)); texture = tileGetTexture(tilenum); if (texture && texture->isValid()) { @@ -1051,7 +1051,7 @@ void HWWall::Process(HWDrawInfo* di, walltype* wal, sectortype* frontsector, sec { int tilenum = wal->overpicnum; gotpic.Set(tilenum); - tileUpdatePicnum(&tilenum, wallnum(wal) + 16384, wal->cstat); + tileUpdatePicnum(&tilenum, (wal->cstat & CSTAT_WALL_ROTATE_90)); texture = tileGetTexture(tilenum); if (texture && texture->isValid()) { @@ -1077,7 +1077,7 @@ void HWWall::Process(HWDrawInfo* di, walltype* wal, sectortype* frontsector, sec auto w = (wal->cstat & CSTAT_WALL_BOTTOM_SWAP) ? backwall : wal; int tilenum = w->picnum; gotpic.Set(tilenum); - tileUpdatePicnum(&tilenum, wallnum(wal) + 16384, w->cstat); + tileUpdatePicnum(&tilenum, (w->cstat & CSTAT_WALL_ROTATE_90)); texture = tileGetTexture(tilenum); if (texture && texture->isValid()) { diff --git a/source/core/textures/buildtiles.cpp b/source/core/textures/buildtiles.cpp index 0d2730855..245a0f123 100644 --- a/source/core/textures/buildtiles.cpp +++ b/source/core/textures/buildtiles.cpp @@ -800,6 +800,41 @@ void tileCopySection(int tilenum1, int sx1, int sy1, int xsiz, int ysiz, int til TileFiles.InvalidateTile(tilenum2); } +//========================================================================== +// +// Retrieve animation offset +// +//========================================================================== + +int tileAnimateOfs(int tilenum, int randomize) +{ + int framecount = picanm[tilenum].num; + if (framecount > 0) + { + int frametime = PlayClock; + + if (isBlood() && randomize) + { + frametime += Bcrc32(&randomize, 2, 0); + } + + int curframe = (frametime & 0x7fffffff) >> (picanm[tilenum].sf & PICANM_ANIMSPEED_MASK); + + switch (picanm[tilenum].sf & PICANM_ANIMTYPE_MASK) + { + case PICANM_ANIMTYPE_FWD: + return curframe % (framecount + 1); + case PICANM_ANIMTYPE_BACK: + return -(curframe % (framecount + 1)); + case PICANM_ANIMTYPE_OSC: + curframe = curframe % (framecount << 1); + if (curframe >= framecount) return (framecount << 1) - curframe; + else return curframe; + } + } + return 0; +} + //========================================================================== // // Check if two tiles are the same @@ -836,7 +871,7 @@ void tileUpdateAnimations() { if (TileFiles.tiledata[i].picanm.sf & PICANM_ANIMTYPE_MASK) { - int j = i + animateoffs(i, 0); + int j = i + tileAnimateOfs(i); auto id1 = TileFiles.tiledata[i].texture->GetID(); auto id2 = TileFiles.tiledata[j].texture->GetID(); diff --git a/source/core/textures/buildtiles.h b/source/core/textures/buildtiles.h index ad31514e0..e4fb55da0 100644 --- a/source/core/textures/buildtiles.h +++ b/source/core/textures/buildtiles.h @@ -461,18 +461,25 @@ inline rottile_t& RotTile(int tile) } -int32_t animateoffs(int const tilenum, int fakevar); +int tileAnimateOfs(int tilenum, int randomize = -1); + +inline void tileUpdatePicnum(int* const tileptr, bool mayrotate = false, int randomize = -1) +{ + auto& tile = *tileptr; + + if (picanm[tile].sf & PICANM_ANIMTYPE_MASK) + tile += tileAnimateOfs(tile, randomize); + + if (mayrotate && RotTile(tile).newtile != -1) + tile = RotTile(tile).newtile; +} + inline FGameTexture* tileGetTexture(int tile, bool animate = false) { assert((unsigned)tile < MAXTILES); if (tile < 0 || tile >= MAXTILES) return nullptr; - if (animate) - { - if (TileFiles.tiledata[tile].picanm.sf & PICANM_ANIMTYPE_MASK) - tile += animateoffs(tile, 0); - - } + if (animate) tileUpdatePicnum(&tile); return TileFiles.tiledata[tile].texture; } diff --git a/source/games/blood/all.cpp b/source/games/blood/all.cpp index 2c86a79a2..6435ae4ce 100644 --- a/source/games/blood/all.cpp +++ b/source/games/blood/all.cpp @@ -53,7 +53,6 @@ #include "src/prediction.cpp" #include "src/preload.cpp" #include "src/qav.cpp" -#include "src/replace.cpp" #include "src/sbar.cpp" #include "src/sectorfx.cpp" #include "src/seq.cpp" diff --git a/source/games/blood/src/animatesprite.cpp b/source/games/blood/src/animatesprite.cpp index 1e1a88766..395a39a2e 100644 --- a/source/games/blood/src/animatesprite.cpp +++ b/source/games/blood/src/animatesprite.cpp @@ -699,7 +699,7 @@ void viewProcessSprites(tspritetype* tsprite, int& spritesortcnt, int32_t cX, in if ((pTSprite->cstat & CSTAT_SPRITE_ALIGNMENT_MASK) != CSTAT_SPRITE_ALIGNMENT_SLAB && r_voxels && !(owneractor->sprext.renderflags & SPREXT_NOTMD)) { int const nRootTile = pTSprite->picnum; - int nAnimTile = pTSprite->picnum + qanimateoffs(pTSprite->picnum, 32768 + (pTSprite->ownerActor->GetIndex() & 16383)); + int nAnimTile = pTSprite->picnum + tileAnimateOfs(pTSprite->picnum, (pTSprite->ownerActor->GetIndex() & 16383)); #if 0 if (tiletovox[nAnimTile] != -1) @@ -718,7 +718,7 @@ void viewProcessSprites(tspritetype* tsprite, int& spritesortcnt, int32_t cX, in if ((pTSprite->cstat & CSTAT_SPRITE_ALIGNMENT_MASK) != CSTAT_SPRITE_ALIGNMENT_SLAB && hw_models && !(owneractor->sprext.renderflags & SPREXT_NOTMD)) { int const nRootTile = pTSprite->picnum; - int nAnimTile = pTSprite->picnum + qanimateoffs(pTSprite->picnum, 32768 + (pTSprite->ownerActor->GetIndex() & 16383)); + int nAnimTile = pTSprite->picnum + tileAnimateOfs(pTSprite->picnum, (pTSprite->ownerActor->GetIndex() & 16383)); if (tile2model[Ptile2tile(nAnimTile, pTSprite->pal)].modelid >= 0 && tile2model[Ptile2tile(nAnimTile, pTSprite->pal)].framenum >= 0) diff --git a/source/games/blood/src/hudsprites.cpp b/source/games/blood/src/hudsprites.cpp index 308503077..33ba21b13 100644 --- a/source/games/blood/src/hudsprites.cpp +++ b/source/games/blood/src/hudsprites.cpp @@ -88,7 +88,7 @@ static void viewBurnTime(int gScale) for (int i = 0; i < 9; i++) { - int nTile = burnTable[i].nTile + qanimateoffs(burnTable[i].nTile, 32768 + i); + int nTile = burnTable[i].nTile + tileAnimateOfs(burnTable[i].nTile, i); int nScale = burnTable[i].nScale; if (gScale < 600) { diff --git a/source/games/blood/src/replace.cpp b/source/games/blood/src/replace.cpp deleted file mode 100644 index bb8843da7..000000000 --- a/source/games/blood/src/replace.cpp +++ /dev/null @@ -1,64 +0,0 @@ -//------------------------------------------------------------------------- -/* -Copyright (C) 2010-2019 EDuke32 developers and contributors -Copyright (C) 2019 Nuke.YKT - -This file is part of NBlood. - -NBlood is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 2 -as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ -//------------------------------------------------------------------------- -#include "ns.h" // Must come before everything else! - -#include "blood.h" -#include "m_crc32.h" - - -BEGIN_BLD_NS - -int qanimateoffs(int a1, int a2) -{ - int offset = 0; - if (a1 >= 0 && a1 < kMaxTiles) - { - int frames = picanm[a1].num; - if (frames > 0) - { - int const frameClock = PlayClock; - int vd; - if ((a2&0xc000) == 0x8000) - vd = (Bcrc32(&a2, 2, 0)+frameClock)>>(picanm[a1].sf&PICANM_ANIMSPEED_MASK); - else - vd = frameClock>>(picanm[a1].sf&PICANM_ANIMSPEED_MASK); - switch (picanm[a1].sf&PICANM_ANIMTYPE_MASK) - { - case PICANM_ANIMTYPE_OSC: - offset = vd % (2*frames); - if (offset >= frames) - offset = 2*frames-offset; - break; - case PICANM_ANIMTYPE_FWD: - offset = vd % (frames+1); - break; - case PICANM_ANIMTYPE_BACK: - offset = -(vd % (frames+1)); - break; - } - } - } - return offset; -} - -END_BLD_NS