- fixed handling of SW's shadows.

An out of range shade will only work without fog.
This commit is contained in:
Christoph Oelckers 2021-04-01 19:09:08 +02:00
parent 88695ef554
commit e1df17964e
4 changed files with 15 additions and 3 deletions

View file

@ -114,6 +114,15 @@ void HWSprite::DrawSprite(HWDrawInfo* di, FRenderState& state, bool translucent)
bool foggy = (GlobalMapFog || (fade & 0xffffff)); bool foggy = (GlobalMapFog || (fade & 0xffffff));
auto ShadeDiv = lookups.tables[palette].ShadeFactor; auto ShadeDiv = lookups.tables[palette].ShadeFactor;
// Disable brightmaps if non-black fog is used. // Disable brightmaps if non-black fog is used.
int shade = this->shade;
PalEntry color(255, globalr, globalg, globalb);
if (this->shade > numshades) // handling of SW's shadow hack using a shade of 127.
{
shade = sector[sprite->sectnum].floorshade;
color = 0xff000000;
}
shade = clamp(shade, 0, numshades - 1);
if (ShadeDiv >= 1 / 1000.f && foggy && !foglayer) if (ShadeDiv >= 1 / 1000.f && foggy && !foglayer)
{ {
state.EnableFog(1); state.EnableFog(1);
@ -131,7 +140,7 @@ void HWSprite::DrawSprite(HWDrawInfo* di, FRenderState& state, bool translucent)
} }
// The shade rgb from the tint is ignored here. // The shade rgb from the tint is ignored here.
state.SetColorAlpha(PalEntry(255, globalr, globalg, globalb), alpha); state.SetColorAlpha(color, alpha);
state.SetMaterial(texture, UF_Texture, 0, CLAMP_XY, TRANSLATION(Translation_Remap + curbasepal, palette), -1); state.SetMaterial(texture, UF_Texture, 0, CLAMP_XY, TRANSLATION(Translation_Remap + curbasepal, palette), -1);
@ -320,7 +329,7 @@ void HWSprite::Process(HWDrawInfo* di, spritetype* spr, sectortype* sector, int
modelframe = 0; modelframe = 0;
dynlightindex = -1; dynlightindex = -1;
shade = clamp(spr->shade, 0, numshades-1); shade = spr->shade;
palette = spr->pal; palette = spr->pal;
fade = lookups.getFade(sector->floorpal); // fog is per sector. fade = lookups.getFade(sector->floorpal); // fog is per sector.
visibility = sectorVisibility(sector); visibility = sectorVisibility(sector);

View file

@ -206,7 +206,8 @@ bool PolymostRenderState::Apply(FRenderState& state, GLState& oldState)
state.SetMaterial(mMaterial.mTexture, mMaterial.uFlags, mMaterial.mScaleFlags, mMaterial.mClampMode, mMaterial.mTranslation, mMaterial.mOverrideShader); state.SetMaterial(mMaterial.mTexture, mMaterial.uFlags, mMaterial.mScaleFlags, mMaterial.mClampMode, mMaterial.mTranslation, mMaterial.mOverrideShader);
} }
state.SetColor(Color[0], Color[1], Color[2], Color[3]); if (!drawblack) state.SetColor(Color[0], Color[1], Color[2], Color[3]);
else state.SetColor(0, 0, 0, Color[3]);
if (StateFlags != oldState.Flags) if (StateFlags != oldState.Flags)
{ {
state.EnableDepthTest(StateFlags & STF_DEPTHTEST); state.EnableDepthTest(StateFlags & STF_DEPTHTEST);

View file

@ -138,6 +138,7 @@ public:
void SetShade(int32_t shade, int numshades) void SetShade(int32_t shade, int numshades)
{ {
renderState.drawblack = shade > numshades;
renderState.Shade = std::min(shade, numshades-1); renderState.Shade = std::min(shade, numshades-1);
} }

View file

@ -69,6 +69,7 @@ struct PolymostRenderState
{ {
int vindex, vcount, primtype; int vindex, vcount, primtype;
int Shade; int Shade;
int drawblack = false;
float ShadeDiv = 62.f; float ShadeDiv = 62.f;
float VisFactor = 128.f; float VisFactor = 128.f;
int Flags = 0; int Flags = 0;