From e3393d63234a8f1a88cb0512293b4fffcbdc4a1a Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Mon, 9 Sep 2019 20:20:40 +0200 Subject: [PATCH] let mfe_drawonlyfor flags stack --- src/hardware/hw_main.c | 59 +++++++++++++++++++++++++++++------------- src/r_things.c | 58 ++++++++++++++++++++++++++++------------- 2 files changed, 81 insertions(+), 36 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 6a08b1c7..6e9d98a6 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5436,6 +5436,9 @@ static void HWR_AddSprites(sector_t *sec) #endif fixed_t approx_dist, limit_dist; + INT32 splitflags; + boolean split_drawsprite; // drawing with splitscreen flags + // BSP is traversed by subsector. // A sector might have been split into several // subsectors during BSP building. @@ -5455,27 +5458,37 @@ static void HWR_AddSprites(sector_t *sec) { for (thing = sec->thinglist; thing; thing = thing->snext) { + + split_drawsprite = false; + if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) continue; - if (splitscreen) + splitflags = thing->eflags & (MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); + + if (splitscreen && splitflags) { if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; + if (viewssnum == 0) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; + if (viewssnum == 1) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; + if (viewssnum == 2) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; + if (viewssnum == 3) + split_drawsprite = true; } + else + split_drawsprite = true; + + if (!split_drawsprite) + continue; approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); @@ -5490,27 +5503,37 @@ static void HWR_AddSprites(sector_t *sec) // Draw everything in sector, no checks for (thing = sec->thinglist; thing; thing = thing->snext) { + + split_drawsprite = false; + if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) continue; - if (splitscreen) + splitflags = thing->eflags & (MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); + + if (splitscreen && splitflags) { if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; + if (viewssnum == 0) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; + if (viewssnum == 1) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; + if (viewssnum == 2) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; + if (viewssnum == 3) + split_drawsprite = true; } + else + split_drawsprite = true; + + if (!split_drawsprite) + continue; HWR_ProjectSprite(thing); } diff --git a/src/r_things.c b/src/r_things.c index b2170924..fe07fded 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1711,6 +1711,9 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) INT32 lightnum; fixed_t approx_dist, limit_dist; + INT32 splitflags; // check if a mobj has spliscreen flags + boolean split_drawsprite; // used for splitscreen flags + if (rendermode != render_soft) return; @@ -1744,27 +1747,36 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) { for (thing = sec->thinglist; thing; thing = thing->snext) { + split_drawsprite = false; + if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) continue; - if (splitscreen) + splitflags = thing->eflags & (MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); + + if (splitscreen && splitflags) { if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; + if (viewssnum == 0) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; + if (viewssnum == 1) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; + if (viewssnum == 2) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; + if (viewssnum == 3) + split_drawsprite = true; } + else + split_drawsprite = true; + + if (!split_drawsprite) + continue; approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); @@ -1779,27 +1791,37 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) // Draw everything in sector, no checks for (thing = sec->thinglist; thing; thing = thing->snext) { + + split_drawsprite = false; + if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) continue; - if (splitscreen) + splitflags = thing->eflags & (MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); + + if (splitscreen && splitflags) { if (thing->eflags & MFE_DRAWONLYFORP1) - if (viewssnum != 0) - continue; + if (viewssnum == 0) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP2) - if (viewssnum != 1) - continue; + if (viewssnum == 1) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) - if (viewssnum != 2) - continue; + if (viewssnum == 2) + split_drawsprite = true; if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) - if (viewssnum != 3) - continue; + if (viewssnum == 3) + split_drawsprite = true; } + else + split_drawsprite = true; + + if (!split_drawsprite) + continue; R_ProjectSprite(thing); }