diff --git a/src/r_bsp.c b/src/r_bsp.c index 1e3c94a03..d521d9f4d 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -31,7 +31,7 @@ sector_t *backsector; // very ugly realloc() of drawsegs at run-time, I upped it to 512 // instead of 256.. and someone managed to send me a level with // 896 drawsegs! So too bad here's a limit removal a-la-Boom -drawseg_t *curdrawsegs = NULL; +drawseg_t *curdrawsegs = NULL; /**< This is used to handle multiple lists for masked drawsegs. */ drawseg_t *drawsegs = NULL; drawseg_t *ds_p = NULL; diff --git a/src/r_main.c b/src/r_main.c index b2eb1890c..273d13a56 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -997,15 +997,31 @@ static void R_PortalFrame(portal_t *portal) if (portal->clipline != -1) { portalclipline = &lines[portal->clipline]; - viewsector = portalcullsector = portalclipline->frontsector; + viewsector = portalclipline->frontsector; } else { portalclipline = NULL; - viewsector = portalcullsector = R_PointInSubsector(viewx, viewy)->sector; + viewsector = R_PointInSubsector(viewx, viewy)->sector; } } +static void Mask_Pre (maskcount_t* m) +{ + m->drawsegs[0] = ds_p - drawsegs; + m->vissprites[0] = visspritecount; + m->viewx = viewx; + m->viewy = viewy; + m->viewz = viewz; + m->viewsector = viewsector; +} + +static void Mask_Post (maskcount_t* m) +{ + m->drawsegs[1] = ds_p - drawsegs; + m->vissprites[1] = visspritecount; +} + // ================ // R_RenderView // ================ @@ -1048,24 +1064,14 @@ void R_RenderPlayerView(player_t *player) // The head node is the last node output. + Mask_Pre(&masks[nummasks - 1]); + curdrawsegs = ds_p; //profile stuff --------------------------------------------------------- #ifdef TIMING mytotal = 0; ProfZeroTimer(); #endif - - masks[nummasks - 1].drawsegs[0] = 0; - masks[nummasks - 1].vissprites[0] = 0; - masks[nummasks - 1].viewx = viewx; - masks[nummasks - 1].viewy = viewy; - masks[nummasks - 1].viewz = viewz; - masks[nummasks - 1].viewsector = viewsector; - curdrawsegs = ds_p; R_RenderBSPNode((INT32)numnodes - 1); - masks[nummasks - 1].drawsegs[1] = ds_p - drawsegs; - masks[nummasks - 1].vissprites[1] = visspritecount; - - R_ClipSprites(drawsegs, NULL); #ifdef TIMING RDMSR(0x10, &mycount); mytotal += mycount; // 64bit add @@ -1073,6 +1079,10 @@ void R_RenderPlayerView(player_t *player) CONS_Debug(DBG_RENDER, "RenderBSPNode: 0x%d %d\n", *((INT32 *)&mytotal + 1), (INT32)mytotal); #endif //profile stuff --------------------------------------------------------- + Mask_Post(&masks[nummasks - 1]); + + R_ClipSprites(drawsegs, NULL); + // Add skybox portals caused by sky visplanes. if (cv_skybox.value && skyboxmo[0]) @@ -1081,13 +1091,14 @@ void R_RenderPlayerView(player_t *player) // Portal rendering. Hijacks the BSP traversal. if (portal_base) { - INT32 i, p; portal_t *portal; for(portal = portal_base; portal; portal = portal_base) { portalrender = portal->pass; // Recursiveness depth. + R_ClearFFloorClips(); + // Apply the viewpoint stored for the portal. R_PortalFrame(portal); @@ -1102,30 +1113,20 @@ void R_RenderPlayerView(player_t *player) validcount++; - // Render the BSP from the new viewpoint, and clip - // any sprites with the new clipsegs and window. masks = realloc(masks, (++nummasks)*sizeof(maskcount_t)); - masks[nummasks - 1].drawsegs[0] = ds_p - drawsegs; - masks[nummasks - 1].vissprites[0] = visspritecount; - masks[nummasks - 1].viewx = viewx; - masks[nummasks - 1].viewy = viewy; - masks[nummasks - 1].viewz = viewz; - masks[nummasks - 1].viewsector = viewsector; + Mask_Pre(&masks[nummasks - 1]); curdrawsegs = ds_p; - R_ClearFFloorClips(); - + // Render the BSP from the new viewpoint, and clip + // any sprites with the new clipsegs and window. R_RenderBSPNode((INT32)numnodes - 1); - masks[nummasks - 1].drawsegs[1] = ds_p - drawsegs; - masks[nummasks - 1].vissprites[1] = visspritecount; + Mask_Post(&masks[nummasks - 1]); R_ClipSprites(ds_p - (masks[nummasks - 1].drawsegs[1] - masks[nummasks - 1].drawsegs[0]), portal); Portal_Remove(portal); } - - portalcullsector = NULL; // Just in case... } R_DrawPlanes(); diff --git a/src/r_portal.c b/src/r_portal.c index a1dcfe335..8456a50b5 100644 --- a/src/r_portal.c +++ b/src/r_portal.c @@ -21,7 +21,6 @@ #include "r_sky.h" UINT8 portalrender; /**< When rendering a portal, it establishes the depth of the current BSP traversal. */ -sector_t *portalcullsector; // Linked list for portals. portal_t *portal_base, *portal_cap; diff --git a/src/r_portal.h b/src/r_portal.h index e5ff0fb9f..e8f9119e8 100644 --- a/src/r_portal.h +++ b/src/r_portal.h @@ -44,7 +44,6 @@ extern portal_t* portal_base; extern portal_t* portal_cap; extern UINT8 portalrender; -extern sector_t *portalcullsector; extern line_t *portalclipline; extern INT32 portalclipstart, portalclipend;