From 0c9f73535724c721ca4e0e399e5506b68d34599b Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Sat, 7 Feb 2009 03:01:38 +0000 Subject: [PATCH] - Restored the old drawseg/sprite distance check from 2.0.63. The code that replaced it did the check at the center of the area intersected by the sprite and the drawseg, whereas 2.0.63 only did the check at the location of the sprite on the map. SVN r1411 (trunk) --- docs/rh-log.txt | 4 ++++ src/r_bsp.h | 1 + src/r_defs.h | 1 + src/r_segs.cpp | 4 ++++ src/r_things.cpp | 17 +++++++++-------- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 437fbec8e..088f207c7 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,8 @@ February 6, 2009 +- Restored the old drawseg/sprite distance check from 2.0.63. The code that + replaced it did the check at the center of the area intersected by the + sprite and the drawseg, whereas 2.0.63 only did the check at the location + of the sprite on the map. - Commented out the CALL_ACTION(A_Look, actor) for targetless friendly monsters in A_DoChase(). They can still find new targets without this, and with it, they got stuck on the first frame of their see state. diff --git a/src/r_bsp.h b/src/r_bsp.h index 2a7469706..d82117cd0 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -35,6 +35,7 @@ struct drawseg_t short sx1, sx2; // left, right of parent seg on screen fixed_t sz1, sz2; // z for left, right of parent seg on screen fixed_t siz1, siz2; // 1/z for left, right of parent seg on screen + fixed_t cx, cy, cdx, cdy; BYTE silhouette; // 0=none, 1=bottom, 2=top, 3=both BYTE bFogBoundary; int shade; diff --git a/src/r_defs.h b/src/r_defs.h index 14bd40eca..5b70cdc31 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -915,6 +915,7 @@ struct vissprite_t fixed_t startfrac; // horizontal position of x1 fixed_t xscale, yscale; fixed_t xiscale; // negative if flipped + fixed_t depth; fixed_t idepth; // 1/z fixed_t texturemid; DWORD FillColor; diff --git a/src/r_segs.cpp b/src/r_segs.cpp index 673a585a4..d2c7accdf 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -1533,6 +1533,10 @@ void R_StoreWallRange (int start, int stop) ds_p->sx2 = WallSX2; ds_p->sz1 = WallSZ1; ds_p->sz2 = WallSZ2; + ds_p->cx = WallTX1; + ds_p->cy = WallTY1; + ds_p->cdx = WallTX2 - WallTX1; + ds_p->cdy = WallTY2 - WallTY1; ds_p->siz1 = (DWORD)DivScale32 (1, WallSZ1) >> 1; ds_p->siz2 = (DWORD)DivScale32 (1, WallSZ2) >> 1; ds_p->x1 = rw_x = start; diff --git a/src/r_things.cpp b/src/r_things.cpp index 9c3279e79..52d721f60 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -1403,6 +1403,7 @@ void R_ProjectSprite (AActor *thing, int fakeside) vis->FillColor = thing->fillcolor; vis->xscale = xscale; vis->yscale = Scale (InvZtoScale, yscale, tz)>>4; + vis->depth = tz; vis->idepth = (DWORD)DivScale32 (1, tz) >> 1; // tz is 20.12, so idepth ought to be 12.20, but vis->cx = tx2; // signed math makes it 13.19 vis->gx = fx; @@ -2115,20 +2116,19 @@ void R_DrawSprite (vissprite_t *spr) r1 = MAX (ds->x1, spr->x1); r2 = MIN (ds->x2, spr->x2); - fixed_t nearidepth, faridepth; - if (ds->siz1 > ds->siz2) + fixed_t neardepth, fardepth; + if (ds->sz1 < ds->sz2) { - nearidepth = ds->siz1, faridepth = ds->siz2; + neardepth = ds->sz1, fardepth = ds->sz2; } else { - nearidepth = ds->siz2, faridepth = ds->siz1; + neardepth = ds->sz2, fardepth = ds->sz1; } - // (siz2 - siz1)*(rx - sx1)/(sx2 - sx1) - // Lower values are further away - if (nearidepth < spr->idepth || (faridepth < spr->idepth && + if (neardepth > spr->depth || (fardepth > spr->depth && // Check if sprite is in front of draw seg: - Scale (ds->siz2 - ds->siz1, (r1+r2)/2 - ds->sx1, ds->sx2 - ds->sx1) + ds->siz1 < spr->idepth)) + DMulScale24 (spr->depth - ds->cy, ds->cdx, ds->cdy, ds->cx - spr->cx) < 0)) + { // seg is behind sprite, so draw the mid texture if it has one if (ds->maskedtexturecol != -1 || ds->bFogBoundary) @@ -2430,6 +2430,7 @@ void R_ProjectParticle (particle_t *particle, const sector_t *sector, int shade, vis->xscale = xscale; // vis->yscale = FixedMul (xscale, InvZtoScale); vis->yscale = xscale; + vis->depth = tz; vis->idepth = (DWORD)DivScale32 (1, tz) >> 1; vis->cx = tx; vis->gx = particle->x;