diff --git a/src/r_bsp.c b/src/r_bsp.c index 58d69ddf4..1e3c94a03 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -31,6 +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 *drawsegs = NULL; drawseg_t *ds_p = NULL; @@ -1377,13 +1378,5 @@ void R_RenderBSPNode(INT32 bspnum) bspnum = bsp->children[side^1]; } - // PORTAL CULLING - if (portalcullsector) { - sector_t *sect = subsectors[bspnum & ~NF_SUBSECTOR].sector; - if (sect != portalcullsector) - return; - portalcullsector = NULL; - } - R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); } diff --git a/src/r_bsp.h b/src/r_bsp.h index 50fea6681..825be6064 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -29,6 +29,7 @@ extern boolean portalline; // is curline a portal seg? extern INT32 checkcoord[12][4]; +extern drawseg_t *curdrawsegs; extern drawseg_t *drawsegs; extern drawseg_t *ds_p; extern INT32 doorclosed; diff --git a/src/r_main.c b/src/r_main.c index b1a14fe0b..244b96cae 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1056,7 +1056,11 @@ void R_RenderPlayerView(player_t *player) 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; @@ -1103,7 +1107,12 @@ void R_RenderPlayerView(player_t *player) 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; + curdrawsegs = ds_p; + R_RenderBSPNode((INT32)numnodes - 1); masks[nummasks - 1].drawsegs[1] = ds_p - drawsegs; masks[nummasks - 1].vissprites[1] = visspritecount; diff --git a/src/r_segs.c b/src/r_segs.c index 36ed029ee..f5f314e6f 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1738,6 +1738,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) if (ds_p == drawsegs+maxdrawsegs) { + size_t curpos = curdrawsegs - drawsegs; size_t pos = ds_p - drawsegs; size_t newmax = maxdrawsegs ? maxdrawsegs*2 : 128; if (firstseg) @@ -1745,6 +1746,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) drawsegs = Z_Realloc(drawsegs, newmax*sizeof (*drawsegs), PU_STATIC, NULL); ds_p = drawsegs + pos; maxdrawsegs = newmax; + curdrawsegs = drawsegs + curpos; if (firstseg) firstseg = drawsegs + (size_t)firstseg; } @@ -1794,7 +1796,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) // borrowed fix from *cough* zdoom *cough* // [RH] We also need to adjust the openings pointers that // were already stored in drawsegs. - for (ds = drawsegs; ds < ds_p; ds++) + for (ds = curdrawsegs; ds < ds_p; ds++) { #define ADJUST(p) if (ds->p + ds->x1 >= oldopenings && ds->p + ds->x1 <= oldlast) ds->p = ds->p - oldopenings + openings; ADJUST(maskedtexturecol); diff --git a/src/r_things.c b/src/r_things.c index e0cf34dba..27b4f15c1 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2454,7 +2454,12 @@ void R_DrawMasked(maskcount_t* masks, UINT8 nummasks) for (i = 0; i < nummasks; i++) { heads[i].next = heads[i].prev = &heads[i]; + + viewx = masks[i].viewx; + viewy = masks[i].viewy; viewz = masks[i].viewz; + viewsector = masks[i].viewsector; + R_CreateDrawNodes(&masks[i], &heads[i], false); } @@ -2463,7 +2468,10 @@ void R_DrawMasked(maskcount_t* masks, UINT8 nummasks) for (; nummasks > 0; nummasks--) { + viewx = masks[nummasks - 1].viewx; + viewy = masks[nummasks - 1].viewy; viewz = masks[nummasks - 1].viewz; + viewsector = masks[nummasks - 1].viewsector; R_DrawMaskedList(&heads[nummasks - 1]); R_ClearDrawNodes(&heads[nummasks - 1]); diff --git a/src/r_things.h b/src/r_things.h index 27c45def4..d287df832 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -65,7 +65,8 @@ typedef struct { size_t drawsegs[2]; size_t vissprites[2]; - fixed_t viewz; /**< View z stored at the time of the BSP traversal for the view/portal. Masked sorting/drawing needs it. */ + fixed_t viewx, viewy, viewz; /**< View z stored at the time of the BSP traversal for the view/portal. Masked sorting/drawing needs it. */ + sector_t* viewsector; } maskcount_t; void R_DrawMasked(maskcount_t* masks, UINT8 nummasks);