Skymist is a third sky layer with transparency, and adopts the fade color and skyfog density. Size not connected to SKY1 or SKY2. Works with 6-sided skyboxes. Three template pngs (skymist1, 2, & 3) all 1x544 pixels, 8-bit grayscale with transparency are part of gzdoom.pk3 for general usage. Can supply custom lump through mapinfo. Console command 'skymisttoggle' shows the effect (make sure fade has a non-zero color in mapinfo and skyfog has non-zero density). Oh, and skyfog now works with 6-sided skyboxes.

This commit is contained in:
Dileep V. Reddy 2025-04-26 09:11:58 -06:00 committed by Ricardo Luís Vaz Silva
commit e9a067dd65
14 changed files with 80 additions and 12 deletions

View file

@ -13,9 +13,9 @@ class FSkyBox;
struct HWSkyInfo
{
float x_offset[2];
float x_offset[3];
float y_offset; // doubleskies don't have a y-offset
FGameTexture * texture[2];
FGameTexture * texture[3];
FTextureID skytexno1;
bool mirrored;
bool doublesky;
@ -351,7 +351,6 @@ public:
};
struct HWSkyPortal : public HWPortal
{
HWSkyInfo * origin;

View file

@ -118,6 +118,9 @@ void HWSkyInfo::init(HWDrawInfo *di, sector_t* sec, int skypos, int sky1, PalEnt
}
else fadecolor = 0;
texture[2] = TexMan.GetGameTexture(di->Level->skymisttexture);
x_offset[2] = di->Level->hw_skymistpos;
}

View file

@ -74,19 +74,26 @@ void HWSkyPortal::DrawContents(HWDrawInfo *di, FRenderState &state)
vertexBuffer->RenderDome(state, origin->texture[0], origin->x_offset[0], origin->y_offset, origin->mirrored, FSkyVertexBuffer::SKYMODE_MAINLAYER, !!(di->Level->flags & LEVEL_FORCETILEDSKY));
state.SetTextureMode(TM_NORMAL);
}
state.AlphaFunc(Alpha_Greater, 0.f);
if (origin->doublesky && origin->texture[1])
{
vertexBuffer->RenderDome(state, origin->texture[1], origin->x_offset[1], origin->y_offset, false, FSkyVertexBuffer::SKYMODE_SECONDLAYER, !!(di->Level->flags & LEVEL_FORCETILEDSKY));
}
}
if (di->Level->skyfog>0 && !di->isFullbrightScene() && (origin->fadecolor & 0xffffff) != 0)
if (di->Level->skyfog>0 && (origin->fadecolor & 0xffffff) != 0)
{
PalEntry FadeColor = origin->fadecolor;
FadeColor.a = clamp<int>(di->Level->skyfog, 0, 255);
if (di->Level->flags3 & LEVEL3_SKYMIST && origin->texture[2])
{
vertexBuffer->RenderDome(state, origin->texture[2], origin->x_offset[2], 0.f, false, FSkyVertexBuffer::SKYMODE_FOGLAYER, !!(di->Level->flags & LEVEL_FORCETILEDSKY), 0, 0, FadeColor);
}
else if (!di->isFullbrightScene())
{
PalEntry FadeColor = origin->fadecolor;
FadeColor.a = clamp<int>(di->Level->skyfog, 0, 255);
state.EnableTexture(false);
state.SetObjectColor(FadeColor);
state.Draw(DT_Triangles, 0, 12);

View file

@ -79,6 +79,10 @@ void InitSkyMap(FLevelLocals *Level)
{
Level->skytexture1 = TexMan.GetFrontSkyLayer(Level->skytexture1);
}
if (Level->skymisttexture.isNull())
{
Level->skymisttexture = TexMan.CheckForTexture("skymist1", ETextureType::Any);
}
skytex1 = TexMan.GetGameTexture(Level->skytexture1, false);
skytex2 = TexMan.GetGameTexture(Level->skytexture2, false);
@ -143,6 +147,7 @@ void R_UpdateSky (uint64_t mstime)
// The hardware renderer uses a different value range and clamps it to a single rotation
Level->hw_sky1pos = (float)(fmod((double(mstime) * Level->skyspeed1), 1024.) * (90. / 256.));
Level->hw_sky2pos = (float)(fmod((double(mstime) * Level->skyspeed2), 1024.) * (90. / 256.));
Level->hw_skymistpos = (float)(fmod((double(mstime) * Level->skymistspeed), 1024.) * (90. / 256.));
}
}