Skip to content

Commit

Permalink
- precache switch textures from ANIMATED lump
Browse files Browse the repository at this point in the history
For example, SW1SKULL and SW2SKULL switches are animated in TNT: Evilution
Their frames are defined in ANIMATED lump which is old BOOM binary format
Textures other than base were not cached because the corresponding switch definitions (in ANIMDEFS lump) have one frame only and BOOM style animations were not taken into account

https://forum.zdoom.org/viewtopic.php?t=66652
  • Loading branch information
alexey-lysiuk authored and coelckers committed Dec 23, 2019
1 parent af18c78 commit e9a7dcd
Showing 1 changed file with 24 additions and 8 deletions.
32 changes: 24 additions & 8 deletions src/p_setup.cpp
Expand Up @@ -96,27 +96,43 @@ static void AddToList(uint8_t *hitlist, FTextureID texid, int bitmask)
if (hitlist[texid.GetIndex()] & bitmask) return; // already done, no need to process everything again.
hitlist[texid.GetIndex()] |= (uint8_t)bitmask;

for (auto anim : TexMan.mAnimations)
const auto addAnimations = [hitlist, bitmask](const FTextureID texid)
{
if (texid == anim->BasePic || (!anim->bDiscrete && anim->BasePic < texid && texid < anim->BasePic + anim->NumFrames))
for (auto anim : TexMan.mAnimations)
{
for (int i = anim->BasePic.GetIndex(); i < anim->BasePic.GetIndex() + anim->NumFrames; i++)
if (texid == anim->BasePic || (!anim->bDiscrete && anim->BasePic < texid && texid < anim->BasePic + anim->NumFrames))
{
hitlist[i] |= (uint8_t)bitmask;
for (int i = anim->BasePic.GetIndex(); i < anim->BasePic.GetIndex() + anim->NumFrames; i++)
{
hitlist[i] |= (uint8_t)bitmask;
}
}
}
}
};

addAnimations(texid);

auto switchdef = TexMan.FindSwitch(texid);
if (switchdef)
{
for (int i = 0; i < switchdef->NumFrames; i++)
const FSwitchDef *const pair = switchdef->PairDef;
const uint16_t numFrames = switchdef->NumFrames;
const uint16_t pairNumFrames = pair->NumFrames;

for (int i = 0; i < numFrames; i++)
{
hitlist[switchdef->frames[i].Texture.GetIndex()] |= (uint8_t)bitmask;
}
for (int i = 0; i < switchdef->PairDef->NumFrames; i++)
for (int i = 0; i < pairNumFrames; i++)
{
hitlist[pair->frames[i].Texture.GetIndex()] |= (uint8_t)bitmask;
}

if (numFrames == 1 && pairNumFrames == 1)
{
hitlist[switchdef->PairDef->frames[i].Texture.GetIndex()] |= (uint8_t)bitmask;
// Switch can still be animated via BOOM binary definition from ANIMATED lump
addAnimations(switchdef->frames[0].Texture);
addAnimations(pair->frames[0].Texture);
}
}

Expand Down

0 comments on commit e9a7dcd

Please sign in to comment.