mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
Merge branch 'shader-skywalls' into 'sal-oglshaderport'
Fix outdated sky wall code in shader branch See merge request STJr/SRB2!906
This commit is contained in:
commit
176361de1e
1 changed files with 62 additions and 83 deletions
|
@ -1079,7 +1079,7 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum,
|
||||||
|
|
||||||
// HWR_DrawSkyWall
|
// HWR_DrawSkyWall
|
||||||
// Draw walls into the depth buffer so that anything behind is culled properly
|
// Draw walls into the depth buffer so that anything behind is culled properly
|
||||||
static void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf, fixed_t bottom, fixed_t top)
|
static void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf)
|
||||||
{
|
{
|
||||||
HWD.pfnSetTexture(NULL);
|
HWD.pfnSetTexture(NULL);
|
||||||
// no texture
|
// no texture
|
||||||
|
@ -1087,9 +1087,7 @@ static void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf, fixed_t b
|
||||||
wallVerts[0].t = wallVerts[1].t = 0;
|
wallVerts[0].t = wallVerts[1].t = 0;
|
||||||
wallVerts[0].s = wallVerts[3].s = 0;
|
wallVerts[0].s = wallVerts[3].s = 0;
|
||||||
wallVerts[2].s = wallVerts[1].s = 0;
|
wallVerts[2].s = wallVerts[1].s = 0;
|
||||||
// set top/bottom coords
|
// this no longer sets top/bottom coords, this should be done before caling the function
|
||||||
wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(top); // No real way to find the correct height of this
|
|
||||||
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(bottom); // worldlow/bottom because it needs to cover up the lower thok barrier wall
|
|
||||||
HWR_ProjectWall(wallVerts, Surf, PF_Invisible|PF_NoTexture, 255, NULL);
|
HWR_ProjectWall(wallVerts, Surf, PF_Invisible|PF_NoTexture, 255, NULL);
|
||||||
// PF_Invisible so it's not drawn into the colour buffer
|
// PF_Invisible so it's not drawn into the colour buffer
|
||||||
// PF_NoTexture for no texture
|
// PF_NoTexture for no texture
|
||||||
|
@ -1185,8 +1183,10 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||||
|
|
||||||
if (gr_backsector)
|
if (gr_backsector)
|
||||||
{
|
{
|
||||||
INT32 gr_toptexture, gr_bottomtexture;
|
INT32 gr_toptexture = 0, gr_bottomtexture = 0;
|
||||||
// two sided line
|
// two sided line
|
||||||
|
boolean bothceilingssky = false; // turned on if both back and front ceilings are sky
|
||||||
|
boolean bothfloorssky = false; // likewise, but for floors
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
SLOPEPARAMS(gr_backsector->c_slope, worldhigh, worldhighslope, gr_backsector->ceilingheight)
|
SLOPEPARAMS(gr_backsector->c_slope, worldhigh, worldhighslope, gr_backsector->ceilingheight)
|
||||||
|
@ -1199,16 +1199,22 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||||
|
|
||||||
// hack to allow height changes in outdoor areas
|
// hack to allow height changes in outdoor areas
|
||||||
// This is what gets rid of the upper textures if there should be sky
|
// This is what gets rid of the upper textures if there should be sky
|
||||||
if (gr_frontsector->ceilingpic == skyflatnum &&
|
if (gr_frontsector->ceilingpic == skyflatnum
|
||||||
gr_backsector->ceilingpic == skyflatnum)
|
&& gr_backsector->ceilingpic == skyflatnum)
|
||||||
{
|
{
|
||||||
worldtop = worldhigh;
|
bothceilingssky = true;
|
||||||
#ifdef ESLOPE
|
|
||||||
worldtopslope = worldhighslope;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// likewise, but for floors and upper textures
|
||||||
|
if (gr_frontsector->floorpic == skyflatnum
|
||||||
|
&& gr_backsector->floorpic == skyflatnum)
|
||||||
|
{
|
||||||
|
bothfloorssky = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bothceilingssky)
|
||||||
gr_toptexture = R_GetTextureNum(gr_sidedef->toptexture);
|
gr_toptexture = R_GetTextureNum(gr_sidedef->toptexture);
|
||||||
|
if (!bothfloorssky)
|
||||||
gr_bottomtexture = R_GetTextureNum(gr_sidedef->bottomtexture);
|
gr_bottomtexture = R_GetTextureNum(gr_sidedef->bottomtexture);
|
||||||
|
|
||||||
// check TOP TEXTURE
|
// check TOP TEXTURE
|
||||||
|
@ -1643,82 +1649,37 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||||
HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap);
|
HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Isn't this just the most lovely mess
|
// Sky culling
|
||||||
|
// No longer so much a mess as before!
|
||||||
if (!gr_curline->polyseg) // Don't do it for polyobjects
|
if (!gr_curline->polyseg) // Don't do it for polyobjects
|
||||||
{
|
{
|
||||||
if (gr_frontsector->ceilingpic == skyflatnum || gr_backsector->ceilingpic == skyflatnum)
|
if (gr_frontsector->ceilingpic == skyflatnum)
|
||||||
{
|
{
|
||||||
fixed_t depthwallheight;
|
if (gr_backsector->ceilingpic != skyflatnum) // don't cull if back sector is also sky
|
||||||
|
{
|
||||||
|
wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(INT32_MAX); // draw to top of map space
|
||||||
|
#ifdef ESLOPE
|
||||||
|
wallVerts[0].y = FIXED_TO_FLOAT(worldtop);
|
||||||
|
wallVerts[1].y = FIXED_TO_FLOAT(worldtopslope);
|
||||||
|
#else
|
||||||
|
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldtop);
|
||||||
|
#endif
|
||||||
|
HWR_DrawSkyWall(wallVerts, &Surf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!gr_sidedef->toptexture || (gr_frontsector->ceilingpic == skyflatnum && gr_backsector->ceilingpic == skyflatnum)) // when both sectors are sky, the top texture isn't drawn
|
if (gr_frontsector->floorpic == skyflatnum)
|
||||||
depthwallheight = gr_frontsector->ceilingheight < gr_backsector->ceilingheight ? gr_frontsector->ceilingheight : gr_backsector->ceilingheight;
|
|
||||||
else
|
|
||||||
depthwallheight = gr_frontsector->ceilingheight > gr_backsector->ceilingheight ? gr_frontsector->ceilingheight : gr_backsector->ceilingheight;
|
|
||||||
|
|
||||||
if (gr_frontsector->ceilingheight-gr_frontsector->floorheight <= 0) // current sector is a thok barrier
|
|
||||||
{
|
{
|
||||||
if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is also a thok barrier
|
if (gr_backsector->floorpic != skyflatnum) // don't cull if back sector is also sky
|
||||||
{
|
{
|
||||||
if (!gr_sidedef->bottomtexture) // Only extend further down if there's no texture
|
#ifdef ESLOPE
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, worldbottom < worldlow ? worldbottom : worldlow, INT32_MAX);
|
wallVerts[3].y = FIXED_TO_FLOAT(worldbottom);
|
||||||
else
|
wallVerts[2].y = FIXED_TO_FLOAT(worldbottomslope);
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, worldbottom > worldlow ? worldbottom : worldlow, INT32_MAX);
|
#else
|
||||||
}
|
wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(worldbottom);
|
||||||
// behind sector is not a thok barrier
|
#endif
|
||||||
else if (gr_backsector->ceilingheight <= gr_frontsector->ceilingheight) // behind sector ceiling is lower or equal to current sector
|
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(INT32_MIN); // draw to bottom of map space
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, depthwallheight, INT32_MAX);
|
HWR_DrawSkyWall(wallVerts, &Surf);
|
||||||
// gr_front/backsector heights need to be used here because of the worldtop being set to worldhigh earlier on
|
|
||||||
}
|
|
||||||
else if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is a thok barrier, current sector is not
|
|
||||||
{
|
|
||||||
if (gr_backsector->ceilingheight >= gr_frontsector->ceilingheight // thok barrier ceiling height is equal to or greater than current sector ceiling height
|
|
||||||
|| gr_backsector->floorheight <= gr_frontsector->floorheight // thok barrier ceiling height is equal to or less than current sector floor height
|
|
||||||
|| gr_backsector->ceilingpic != skyflatnum) // thok barrier is not a sky
|
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, depthwallheight, INT32_MAX);
|
|
||||||
}
|
|
||||||
else // neither sectors are thok barriers
|
|
||||||
{
|
|
||||||
if ((gr_backsector->ceilingheight < gr_frontsector->ceilingheight && !gr_sidedef->toptexture) // no top texture and sector behind is lower
|
|
||||||
|| gr_backsector->ceilingpic != skyflatnum) // behind sector is not a sky
|
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, depthwallheight, INT32_MAX);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// And now for sky floors!
|
|
||||||
if (gr_frontsector->floorpic == skyflatnum || gr_backsector->floorpic == skyflatnum)
|
|
||||||
{
|
|
||||||
fixed_t depthwallheight;
|
|
||||||
|
|
||||||
if (!gr_sidedef->bottomtexture)
|
|
||||||
depthwallheight = worldbottom > worldlow ? worldbottom : worldlow;
|
|
||||||
else
|
|
||||||
depthwallheight = worldbottom < worldlow ? worldbottom : worldlow;
|
|
||||||
|
|
||||||
if (gr_frontsector->ceilingheight-gr_frontsector->floorheight <= 0) // current sector is a thok barrier
|
|
||||||
{
|
|
||||||
if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is also a thok barrier
|
|
||||||
{
|
|
||||||
if (!gr_sidedef->toptexture) // Only extend up if there's no texture
|
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, worldtop > worldhigh ? worldtop : worldhigh);
|
|
||||||
else
|
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, worldtop < worldhigh ? worldtop : worldhigh);
|
|
||||||
}
|
|
||||||
// behind sector is not a thok barrier
|
|
||||||
else if (gr_backsector->floorheight >= gr_frontsector->floorheight) // behind sector floor is greater or equal to current sector
|
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, depthwallheight);
|
|
||||||
}
|
|
||||||
else if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is a thok barrier, current sector is not
|
|
||||||
{
|
|
||||||
if (gr_backsector->floorheight <= gr_frontsector->floorheight // thok barrier floor height is equal to or less than current sector floor height
|
|
||||||
|| gr_backsector->ceilingheight >= gr_frontsector->ceilingheight // thok barrier floor height is equal to or greater than current sector ceiling height
|
|
||||||
|| gr_backsector->floorpic != skyflatnum) // thok barrier is not a sky
|
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, depthwallheight);
|
|
||||||
}
|
|
||||||
else // neither sectors are thok barriers
|
|
||||||
{
|
|
||||||
if (((gr_backsector->floorheight > gr_frontsector->floorheight && !gr_sidedef->bottomtexture) // no bottom texture and sector behind is higher
|
|
||||||
|| gr_backsector->floorpic != skyflatnum) // behind sector is not a sky
|
|
||||||
&& ABS(gr_backsector->floorheight - gr_frontsector->floorheight) > FRACUNIT*3/2) // don't draw sky walls for VERY thin differences, this makes for horrible looking slopes sometimes!
|
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, depthwallheight);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1793,9 +1754,27 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
|
||||||
if (!gr_curline->polyseg)
|
if (!gr_curline->polyseg)
|
||||||
{
|
{
|
||||||
if (gr_frontsector->ceilingpic == skyflatnum) // It's a single-sided line with sky for its sector
|
if (gr_frontsector->ceilingpic == skyflatnum) // It's a single-sided line with sky for its sector
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, worldtop, INT32_MAX);
|
{
|
||||||
|
wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(INT32_MAX); // draw to top of map space
|
||||||
|
#ifdef ESLOPE
|
||||||
|
wallVerts[0].y = FIXED_TO_FLOAT(worldtop);
|
||||||
|
wallVerts[1].y = FIXED_TO_FLOAT(worldtopslope);
|
||||||
|
#else
|
||||||
|
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldtop);
|
||||||
|
#endif
|
||||||
|
HWR_DrawSkyWall(wallVerts, &Surf);
|
||||||
|
}
|
||||||
if (gr_frontsector->floorpic == skyflatnum)
|
if (gr_frontsector->floorpic == skyflatnum)
|
||||||
HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, worldbottom);
|
{
|
||||||
|
#ifdef ESLOPE
|
||||||
|
wallVerts[3].y = FIXED_TO_FLOAT(worldbottom);
|
||||||
|
wallVerts[2].y = FIXED_TO_FLOAT(worldbottomslope);
|
||||||
|
#else
|
||||||
|
wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(worldbottom);
|
||||||
|
#endif
|
||||||
|
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(INT32_MIN); // draw to bottom of map space
|
||||||
|
HWR_DrawSkyWall(wallVerts, &Surf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue