- added extended translucency support and did a bit of code consolidation.

This commit is contained in:
Christoph Oelckers 2021-04-08 19:45:18 +02:00
parent 794cab2d54
commit 1362a7ebc5
5 changed files with 25 additions and 50 deletions

View file

@ -95,7 +95,7 @@ void HWDrawInfo::AddFlat(HWFlat *flat)
{ {
int list;; int list;;
if (flat->RenderStyle != LegacyRenderStyles[STYLE_Translucent] || flat->alpha < 1.f - FLT_EPSILON) // flat->texture->GetTranslucency() - fixme if (flat->RenderStyle != LegacyRenderStyles[STYLE_Translucent] || flat->alpha < 1.f - FLT_EPSILON || checkTranslucentReplacement(flat->texture->GetID(), flat->palette))
{ {
// translucent portals go into the translucent border list. // translucent portals go into the translucent border list.
list = flat->sprite? GLDL_TRANSLUCENT : GLDL_TRANSLUCENTBORDER; list = flat->sprite? GLDL_TRANSLUCENT : GLDL_TRANSLUCENTBORDER;

View file

@ -375,3 +375,18 @@ inline bool spriteHasTranslucency(const spritetype* tspr)
return checkTranslucentReplacement(tileGetTexture(tspr->picnum)->GetID(), tspr->pal); return checkTranslucentReplacement(tileGetTexture(tspr->picnum)->GetID(), tspr->pal);
} }
inline void SetSpriteTranslucency(const spritetype* sprite, float& alpha, FRenderStyle& RenderStyle)
{
bool trans = (sprite->cstat & CSTAT_SPRITE_TRANSLUCENT);
if (trans)
{
RenderStyle = GetRenderStyle(0, !!(sprite->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT));
alpha = GetAlphaFromBlend((sprite->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT) ? DAMETH_TRANS2 : DAMETH_TRANS1, 0);
}
else
{
RenderStyle = LegacyRenderStyles[STYLE_Translucent];
alpha = 1.f;
}
alpha *= 1.f - spriteext[sprite->owner].alpha;
}

View file

@ -380,17 +380,8 @@ void HWFlat::ProcessFlatSprite(HWDrawInfo* di, spritetype* sprite, sectortype* s
palette = sprite->pal; palette = sprite->pal;
fade = lookups.getFade(sector[sprite->sectnum].floorpal); // fog is per sector. fade = lookups.getFade(sector[sprite->sectnum].floorpal); // fog is per sector.
bool trans = (sprite->cstat & CSTAT_SPRITE_TRANSLUCENT); SetSpriteTranslucency(sprite, alpha, RenderStyle);
if (trans)
{
RenderStyle = GetRenderStyle(0, !!(sprite->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT));
alpha = GetAlphaFromBlend((sprite->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT) ? DAMETH_TRANS2 : DAMETH_TRANS1, 0);
}
else
{
RenderStyle = LegacyRenderStyles[STYLE_Translucent];
alpha = 1.f;
}
PutFlat(di, 0); PutFlat(di, 0);
} }
} }

View file

@ -353,17 +353,7 @@ void HWSprite::Process(HWDrawInfo* di, spritetype* spr, sectortype* sector, int
fade = lookups.getFade(sector->floorpal); // fog is per sector. fade = lookups.getFade(sector->floorpal); // fog is per sector.
visibility = sectorVisibility(sector); visibility = sectorVisibility(sector);
bool trans = (spr->cstat & CSTAT_SPRITE_TRANSLUCENT); SetSpriteTranslucency(spr, alpha, RenderStyle);
if (trans)
{
RenderStyle = GetRenderStyle(0, !!(spr->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT));
alpha = GetAlphaFromBlend((spr->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT) ? DAMETH_TRANS2 : DAMETH_TRANS1, 0);
}
else
{
RenderStyle = LegacyRenderStyles[STYLE_Translucent];
alpha = 1.f;
}
x = spr->x * (1 / 16.f); x = spr->x * (1 / 16.f);
z = spr->z * (1 / -256.f); z = spr->z * (1 / -256.f);
@ -466,7 +456,7 @@ void HWSprite::Process(HWDrawInfo* di, spritetype* spr, sectortype* sector, int
} }
#endif #endif
PutSprite(di, alpha < 1.f-FLT_EPSILON || modelframe == 0); PutSprite(di, true);
rendered_sprites++; rendered_sprites++;
} }
@ -500,17 +490,7 @@ bool HWSprite::ProcessVoxel(HWDrawInfo* di, voxmodel_t* vox, spritetype* spr, se
if (!vox || (spr->cstat & CSTAT_SPRITE_ALIGNMENT) == CSTAT_SPRITE_ALIGNMENT_FLOOR) return false; if (!vox || (spr->cstat & CSTAT_SPRITE_ALIGNMENT) == CSTAT_SPRITE_ALIGNMENT_FLOOR) return false;
bool trans = (spr->cstat & CSTAT_SPRITE_TRANSLUCENT); SetSpriteTranslucency(spr, alpha, RenderStyle);
if (trans)
{
RenderStyle = GetRenderStyle(0, !!(spr->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT));
alpha = GetAlphaFromBlend((spr->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT) ? DAMETH_TRANS2 : DAMETH_TRANS1, 0);
}
else
{
RenderStyle = LegacyRenderStyles[STYLE_Translucent];
alpha = 1.f;
}
auto sprext = &spriteext[spr->owner]; auto sprext = &spriteext[spr->owner];
@ -575,7 +555,7 @@ bool HWSprite::ProcessVoxel(HWDrawInfo* di, voxmodel_t* vox, spritetype* spr, se
auto vp = di->Viewpoint; auto vp = di->Viewpoint;
depth = (float)((x - vp.Pos.X) * vp.TanCos + (y - vp.Pos.Y) * vp.TanSin); depth = (float)((x - vp.Pos.X) * vp.TanCos + (y - vp.Pos.Y) * vp.TanSin);
PutSprite(di, alpha < 1.f - FLT_EPSILON); PutSprite(di, spriteHasTranslucency(sprite));
rendered_sprites++; rendered_sprites++;
return true; return true;
} }

View file

@ -749,7 +749,7 @@ void HWWall::DoTexture(HWDrawInfo* di, walltype* wal, walltype* refwall, float r
tcs[UPRGT].v = setv(topleft, topright, glseg.fracright); tcs[UPRGT].v = setv(topleft, topright, glseg.fracright);
tcs[LORGT].v = setv(bottomleft, bottomright, glseg.fracright); tcs[LORGT].v = setv(bottomleft, bottomright, glseg.fracright);
if (th == pow2size) CheckTexturePosition(); // for NPOT textures this adjustment can break things. if (th == pow2size) CheckTexturePosition(); // for NPOT textures this adjustment can break things.
bool trans = type == RENDERWALL_M2S && (wal->cstat & CSTAT_WALL_TRANSLUCENT); bool trans = type == RENDERWALL_M2S && maskWallHasTranslucency(wal);
if (trans) if (trans)
{ {
RenderStyle = GetRenderStyle(0, !!(wal->cstat & CSTAT_WALL_TRANS_FLIP)); RenderStyle = GetRenderStyle(0, !!(wal->cstat & CSTAT_WALL_TRANS_FLIP));
@ -1086,18 +1086,7 @@ void HWWall::ProcessWallSprite(HWDrawInfo* di, spritetype* spr, sectortype* sect
fade = lookups.getFade(sector->floorpal); // fog is per sector. fade = lookups.getFade(sector->floorpal); // fog is per sector.
visibility = sectorVisibility(sector); visibility = sectorVisibility(sector);
bool trans = (sprite->cstat & CSTAT_SPRITE_TRANSLUCENT); SetSpriteTranslucency(sprite, alpha, RenderStyle);
if (trans)
{
RenderStyle = GetRenderStyle(0, !!(sprite->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT));
alpha = GetAlphaFromBlend((sprite->cstat & CSTAT_SPRITE_TRANSLUCENT_INVERT) ? DAMETH_TRANS2 : DAMETH_TRANS1, 0);
}
else
{
RenderStyle = LegacyRenderStyles[STYLE_Translucent];
alpha = 1.f;
}
int height, topofs; int height, topofs;
if (hw_hightile && TileFiles.tiledata[spr->picnum].hiofs.xsize) if (hw_hightile && TileFiles.tiledata[spr->picnum].hiofs.xsize)
@ -1156,5 +1145,5 @@ void HWWall::ProcessWallSprite(HWDrawInfo* di, spritetype* spr, sectortype* sect
zbottom[0] = zbottom[1] = floorz; zbottom[0] = zbottom[1] = floorz;
} }
} }
PutWall(di, trans); PutWall(di, spriteHasTranslucency(sprite));
} }