mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-21 03:11:03 +00:00
Fully clip drawing to roll-used screen bounds
This commit is contained in:
parent
8868fc4d8a
commit
af4479924a
1 changed files with 51 additions and 1 deletions
52
src/r_main.c
52
src/r_main.c
|
@ -561,17 +561,24 @@ static struct {
|
|||
fixed_t zoomneeded;
|
||||
INT32 *scrmap;
|
||||
INT32 scrmapsize;
|
||||
|
||||
INT32 x1; // clip rendering horizontally for efficiency
|
||||
INT16 ceilingclip[MAXVIDWIDTH], floorclip[MAXVIDWIDTH];
|
||||
|
||||
boolean use;
|
||||
} viewmorph = {
|
||||
0,
|
||||
#ifdef WOUGHMP_WOUGHMP
|
||||
0,
|
||||
#endif
|
||||
|
||||
FRACUNIT,
|
||||
NULL,
|
||||
0,
|
||||
|
||||
0,
|
||||
{}, {},
|
||||
|
||||
false
|
||||
};
|
||||
|
||||
|
@ -693,6 +700,47 @@ void R_CheckViewMorph(void)
|
|||
viewmorph.x1 = (INT32)(halfwidth - (halfwidth * fabsf(rollcos) + halfheight * fabsf(rollsin)));
|
||||
//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);
|
||||
|
||||
#ifdef WOUGHMP_WOUGHMP
|
||||
|
@ -1327,11 +1375,14 @@ void R_RenderPlayerView(player_t *player)
|
|||
validcount++;
|
||||
|
||||
// Clear buffers.
|
||||
R_ClearPlanes();
|
||||
if (viewmorph.use)
|
||||
{
|
||||
portalclipstart = viewmorph.x1;
|
||||
portalclipend = viewwidth-viewmorph.x1-1;
|
||||
R_PortalClearClipSegs(portalclipstart, portalclipend);
|
||||
memcpy(ceilingclip, viewmorph.ceilingclip, sizeof(INT16)*vid.width);
|
||||
memcpy(floorclip, viewmorph.floorclip, sizeof(INT16)*vid.width);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1340,7 +1391,6 @@ void R_RenderPlayerView(player_t *player)
|
|||
R_ClearClipSegs();
|
||||
}
|
||||
R_ClearDrawSegs();
|
||||
R_ClearPlanes();
|
||||
R_ClearSprites();
|
||||
#ifdef FLOORSPLATS
|
||||
R_ClearVisibleFloorSplats();
|
||||
|
|
Loading…
Reference in a new issue