Fully clip drawing to roll-used screen bounds
This commit is contained in:
parent
8868fc4d8a
commit
af4479924a
52
src/r_main.c
52
src/r_main.c
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue