Fully clip drawing to roll-used screen bounds

This commit is contained in:
fickleheart 2020-01-18 10:53:00 -06:00
parent 8868fc4d8a
commit af4479924a

View file

@ -561,17 +561,24 @@ static struct {
fixed_t zoomneeded; fixed_t zoomneeded;
INT32 *scrmap; INT32 *scrmap;
INT32 scrmapsize; INT32 scrmapsize;
INT32 x1; // clip rendering horizontally for efficiency INT32 x1; // clip rendering horizontally for efficiency
INT16 ceilingclip[MAXVIDWIDTH], floorclip[MAXVIDWIDTH];
boolean use; boolean use;
} viewmorph = { } viewmorph = {
0, 0,
#ifdef WOUGHMP_WOUGHMP #ifdef WOUGHMP_WOUGHMP
0, 0,
#endif #endif
FRACUNIT, FRACUNIT,
NULL, NULL,
0, 0,
0, 0,
{}, {},
false false
}; };
@ -693,6 +700,47 @@ void R_CheckViewMorph(void)
viewmorph.x1 = (INT32)(halfwidth - (halfwidth * fabsf(rollcos) + halfheight * fabsf(rollsin))); viewmorph.x1 = (INT32)(halfwidth - (halfwidth * fabsf(rollcos) + halfheight * fabsf(rollsin)));
//CONS_Printf("saving %d cols\n", viewmorph.x1); //CONS_Printf("saving %d cols\n", viewmorph.x1);
// Set ceilingclip and floorclip
for (vx = 0; vx < vid.width; vx++)
{
viewmorph.ceilingclip[vx] = vid.height;
viewmorph.floorclip[vx] = -1;
}
x2 = x1;
y2 = y1;
for (vx = 0; vx < vid.width; vx++)
{
INT16 xa, ya, xb, yb;
xa = x2+halfwidth;
ya = y2+halfheight;
xb = vid.width-1-xa;
yb = vid.height-1-ya;
viewmorph.ceilingclip[xa] = min(viewmorph.ceilingclip[xa], ya);
viewmorph.floorclip[xa] = max(viewmorph.floorclip[xa], ya);
viewmorph.ceilingclip[xb] = min(viewmorph.ceilingclip[xb], yb);
viewmorph.floorclip[xb] = max(viewmorph.floorclip[xb], yb);
x2 += rollcos;
y2 += rollsin;
}
x2 = x1;
y2 = y1;
for (vy = 0; vy < vid.height; vy++)
{
INT16 xa, ya, xb, yb;
xa = x2+halfwidth;
ya = y2+halfheight;
xb = vid.width-1-xa;
yb = vid.height-1-ya;
viewmorph.ceilingclip[xa] = min(viewmorph.ceilingclip[xa], ya);
viewmorph.floorclip[xa] = max(viewmorph.floorclip[xa], ya);
viewmorph.ceilingclip[xb] = min(viewmorph.ceilingclip[xb], yb);
viewmorph.floorclip[xb] = max(viewmorph.floorclip[xb], yb);
x2 -= rollsin;
y2 += rollcos;
}
//CONS_Printf("Top left corner is %f %f\n", x1, y1); //CONS_Printf("Top left corner is %f %f\n", x1, y1);
#ifdef WOUGHMP_WOUGHMP #ifdef WOUGHMP_WOUGHMP
@ -1327,11 +1375,14 @@ void R_RenderPlayerView(player_t *player)
validcount++; validcount++;
// Clear buffers. // Clear buffers.
R_ClearPlanes();
if (viewmorph.use) if (viewmorph.use)
{ {
portalclipstart = viewmorph.x1; portalclipstart = viewmorph.x1;
portalclipend = viewwidth-viewmorph.x1-1; portalclipend = viewwidth-viewmorph.x1-1;
R_PortalClearClipSegs(portalclipstart, portalclipend); R_PortalClearClipSegs(portalclipstart, portalclipend);
memcpy(ceilingclip, viewmorph.ceilingclip, sizeof(INT16)*vid.width);
memcpy(floorclip, viewmorph.floorclip, sizeof(INT16)*vid.width);
} }
else else
{ {
@ -1340,7 +1391,6 @@ void R_RenderPlayerView(player_t *player)
R_ClearClipSegs(); R_ClearClipSegs();
} }
R_ClearDrawSegs(); R_ClearDrawSegs();
R_ClearPlanes();
R_ClearSprites(); R_ClearSprites();
#ifdef FLOORSPLATS #ifdef FLOORSPLATS
R_ClearVisibleFloorSplats(); R_ClearVisibleFloorSplats();