diff --git a/src/r_bsp.c b/src/r_bsp.c index 58d69ddf45e09cc2cc7e27ef70dce00cda45bbee..1e3c94a03d81a1bcec52b16b5051b595009eeb22 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 50fea6681ab86ae51b6d295ad1b19fabba87146a..825be6064b078ba0f5c0966b1d726c72e2546c07 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 b1a14fe0b82be075648edda88e0f1763f8e145cb..244b96caec4420528b4710e48c0d398061d2f9bf 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 36ed029ee2e5c697fc26106f9a160644e4b2c6e0..f5f314e6f9af22a97219236ba232f8c9c5f285bd 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 e0cf34dba577221bbc2d84b827d2be385028319b..27b4f15c1c458a22cf880aaf5578b811c67108aa 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 27c45def456ee953212a098f6de58377f5c37abc..d287df8328293374265873a9d5e1602a3181f60f 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);