mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-01-13 21:31:32 +00:00
Better fog block colouring
They still aren't perfect, but now they are at least not quite so obviously just translucent polygons over the level. A mixture between partially modulating the background colours and adding the fog colour. Notably white fog blocks look like they're brightening what's behind them. Additive was also setting noalphatest before, can probably decide that depending on what it needs anyway. I don't think it's currently used anyway.
This commit is contained in:
parent
e4ed3a793b
commit
5a4ea9fab3
3 changed files with 30 additions and 23 deletions
|
@ -133,12 +133,13 @@ enum EPolyFlags
|
||||||
|
|
||||||
PF_Masked = 0x00000001, // Poly is alpha scaled and 0 alpha pels are discarded (holes in texture)
|
PF_Masked = 0x00000001, // Poly is alpha scaled and 0 alpha pels are discarded (holes in texture)
|
||||||
PF_Translucent = 0x00000002, // Poly is transparent, alpha = level of transparency
|
PF_Translucent = 0x00000002, // Poly is transparent, alpha = level of transparency
|
||||||
PF_Additive = 0x00000024, // Poly is added to the frame buffer
|
PF_Additive = 0x00000004, // Poly is added to the frame buffer
|
||||||
PF_Environment = 0x00000008, // Poly should be drawn environment mapped.
|
PF_Environment = 0x00000008, // Poly should be drawn environment mapped.
|
||||||
// Hurdler: used for text drawing
|
// Hurdler: used for text drawing
|
||||||
PF_Substractive = 0x00000010, // for splat
|
PF_Substractive = 0x00000010, // for splat
|
||||||
PF_NoAlphaTest = 0x00000020, // hiden param
|
PF_NoAlphaTest = 0x00000020, // hiden param
|
||||||
PF_Blending = (PF_Environment|PF_Additive|PF_Translucent|PF_Masked|PF_Substractive)&~PF_NoAlphaTest,
|
PF_Fog = 0x00000040, // Fog blocks
|
||||||
|
PF_Blending = (PF_Environment|PF_Additive|PF_Translucent|PF_Masked|PF_Substractive|PF_Fog)&~PF_NoAlphaTest,
|
||||||
|
|
||||||
// other flag bits
|
// other flag bits
|
||||||
|
|
||||||
|
|
|
@ -489,10 +489,10 @@ UINT32 HWR_Lighting(INT32 light, UINT32 color, UINT32 fadecolor, boolean fogbloc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color, UINT32 fadecolor) // Let's see if this can work
|
static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this can work
|
||||||
{
|
{
|
||||||
RGBA_t realcolor, fogcolor, surfcolor;
|
RGBA_t realcolor, surfcolor;
|
||||||
INT32 alpha, fogalpha;
|
INT32 alpha;
|
||||||
|
|
||||||
// Don't go out of bounds
|
// Don't go out of bounds
|
||||||
if (light < 0)
|
if (light < 0)
|
||||||
|
@ -501,13 +501,11 @@ static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color, UINT32 fadecolor) // L
|
||||||
light = 255;
|
light = 255;
|
||||||
|
|
||||||
realcolor.rgba = color;
|
realcolor.rgba = color;
|
||||||
fogcolor.rgba = fadecolor;
|
|
||||||
|
|
||||||
alpha = (realcolor.s.alpha*255)/25;
|
alpha = (realcolor.s.alpha*255)/25;
|
||||||
fogalpha = (fogcolor.s.alpha*255)/25;
|
|
||||||
|
|
||||||
// Fog blocks seem to get slightly more opaque with more opaque colourmap opacity, and much more opaque with darker brightness
|
// at 255 brightness, alpha is between 0 and 127, at 0 brightness alpha will always be 255
|
||||||
surfcolor.s.alpha = (UINT8)(CALCLIGHT(light, ((0xFF-light)+alpha)/2)+CALCLIGHT(0xFF-light, ((light)+fogalpha)/2));
|
surfcolor.s.alpha = (alpha*light)/(2*256)+255-light;
|
||||||
|
|
||||||
return surfcolor.s.alpha;
|
return surfcolor.s.alpha;
|
||||||
}
|
}
|
||||||
|
@ -773,7 +771,7 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is
|
||||||
Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, true);
|
Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PolyFlags & PF_Translucent)
|
if (PolyFlags & (PF_Translucent|PF_Fog))
|
||||||
{
|
{
|
||||||
Surf.FlatColor.s.alpha = (UINT8)alpha;
|
Surf.FlatColor.s.alpha = (UINT8)alpha;
|
||||||
PolyFlags |= PF_Modulated|PF_Occlude|PF_Clip;
|
PolyFlags |= PF_Modulated|PF_Occlude|PF_Clip;
|
||||||
|
@ -1380,7 +1378,7 @@ static void HWR_SplitFog(sector_t *sector, wallVert3D *wallVerts, FSurfaceInfo*
|
||||||
wallVerts[0].y = wallVerts[1].y = bot;
|
wallVerts[0].y = wallVerts[1].y = bot;
|
||||||
|
|
||||||
if (!solid) // Don't draw it if there's more fog behind it
|
if (!solid) // Don't draw it if there's more fog behind it
|
||||||
HWR_AddTransparentWall(wallVerts, Surf, 0, PF_Translucent|PF_NoTexture, true, lightnum, colormap);
|
HWR_AddTransparentWall(wallVerts, Surf, 0, PF_Fog|PF_NoTexture, true, lightnum, colormap);
|
||||||
|
|
||||||
top = height;
|
top = height;
|
||||||
}
|
}
|
||||||
|
@ -2306,7 +2304,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
{
|
{
|
||||||
FBITFIELD blendmode;
|
FBITFIELD blendmode;
|
||||||
|
|
||||||
blendmode = PF_Translucent|PF_NoTexture;
|
blendmode = PF_Fog|PF_NoTexture;
|
||||||
|
|
||||||
lightnum = rover->master->frontsector->lightlevel;
|
lightnum = rover->master->frontsector->lightlevel;
|
||||||
colormap = rover->master->frontsector->extra_colormap;
|
colormap = rover->master->frontsector->extra_colormap;
|
||||||
|
@ -2314,11 +2312,11 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
if (rover->master->frontsector->extra_colormap)
|
if (rover->master->frontsector->extra_colormap)
|
||||||
{
|
{
|
||||||
|
|
||||||
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba,rover->master->frontsector->extra_colormap->fadergba);
|
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG,FADEFOG);
|
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gr_frontsector->numlights)
|
if (gr_frontsector->numlights)
|
||||||
|
@ -2426,18 +2424,18 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
|
||||||
{
|
{
|
||||||
FBITFIELD blendmode;
|
FBITFIELD blendmode;
|
||||||
|
|
||||||
blendmode = PF_Translucent|PF_NoTexture;
|
blendmode = PF_Fog|PF_NoTexture;
|
||||||
|
|
||||||
lightnum = rover->master->frontsector->lightlevel;
|
lightnum = rover->master->frontsector->lightlevel;
|
||||||
colormap = rover->master->frontsector->extra_colormap;
|
colormap = rover->master->frontsector->extra_colormap;
|
||||||
|
|
||||||
if (rover->master->frontsector->extra_colormap)
|
if (rover->master->frontsector->extra_colormap)
|
||||||
{
|
{
|
||||||
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba,rover->master->frontsector->extra_colormap->fadergba);
|
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG,FADEFOG);
|
Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gr_backsector->numlights)
|
if (gr_backsector->numlights)
|
||||||
|
@ -3547,16 +3545,16 @@ static void HWR_Subsector(size_t num)
|
||||||
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||||
|
|
||||||
if (rover->master->frontsector->extra_colormap)
|
if (rover->master->frontsector->extra_colormap)
|
||||||
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba);
|
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba);
|
||||||
else
|
else
|
||||||
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG, FADEFOG);
|
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG);
|
||||||
|
|
||||||
HWR_AddTransparentFloor(0,
|
HWR_AddTransparentFloor(0,
|
||||||
&extrasubsectors[num],
|
&extrasubsectors[num],
|
||||||
false,
|
false,
|
||||||
*rover->bottomheight,
|
*rover->bottomheight,
|
||||||
*gr_frontsector->lightlist[light].lightlevel,
|
*gr_frontsector->lightlist[light].lightlevel,
|
||||||
alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture,
|
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||||
true, rover->master->frontsector->extra_colormap);
|
true, rover->master->frontsector->extra_colormap);
|
||||||
}
|
}
|
||||||
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient
|
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient
|
||||||
|
@ -3610,16 +3608,16 @@ static void HWR_Subsector(size_t num)
|
||||||
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
|
||||||
|
|
||||||
if (rover->master->frontsector->extra_colormap)
|
if (rover->master->frontsector->extra_colormap)
|
||||||
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba);
|
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba);
|
||||||
else
|
else
|
||||||
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG, FADEFOG);
|
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG);
|
||||||
|
|
||||||
HWR_AddTransparentFloor(0,
|
HWR_AddTransparentFloor(0,
|
||||||
&extrasubsectors[num],
|
&extrasubsectors[num],
|
||||||
true,
|
true,
|
||||||
*rover->topheight,
|
*rover->topheight,
|
||||||
*gr_frontsector->lightlist[light].lightlevel,
|
*gr_frontsector->lightlist[light].lightlevel,
|
||||||
alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture,
|
alpha, rover->master->frontsector, PF_Fog|PF_NoTexture,
|
||||||
true, rover->master->frontsector->extra_colormap);
|
true, rover->master->frontsector->extra_colormap);
|
||||||
}
|
}
|
||||||
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
|
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
|
||||||
|
|
|
@ -1187,6 +1187,14 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags)
|
||||||
pglBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
|
pglBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
|
||||||
#ifndef KOS_GL_COMPATIBILITY
|
#ifndef KOS_GL_COMPATIBILITY
|
||||||
pglAlphaFunc(GL_NOTEQUAL, 0.0f);
|
pglAlphaFunc(GL_NOTEQUAL, 0.0f);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case PF_Fog & PF_Fog:
|
||||||
|
// Sryder: Fog
|
||||||
|
// multiplies input colour by input alpha, and destination colour by input colour, then adds them
|
||||||
|
pglBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR);
|
||||||
|
#ifndef KOS_GL_COMPATIBILITY
|
||||||
|
pglAlphaFunc(GL_NOTEQUAL, 0.0f);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
default : // must be 0, otherwise it's an error
|
default : // must be 0, otherwise it's an error
|
||||||
|
|
Loading…
Reference in a new issue