Misc Polymost crap. Improves detection of sprite/wall collisions for z-fighting avoidance

git-svn-id: https://svn.eduke32.com/eduke32@5725 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2016-05-13 22:15:28 +00:00
parent e33d010e1a
commit 0de66c3411

View file

@ -2653,9 +2653,9 @@ static void polymost_internal_nonparallaxed(vec2f_t n0, vec2f_t n1, float ryp0,
//Texture flipping //Texture flipping
if (globalorientation&4) if (globalorientation&4)
{ {
swap64bit(&xtex.u, &xtex.v); swapdouble(&xtex.u, &xtex.v);
swap64bit(&ytex.u, &ytex.v); swapdouble(&ytex.u, &ytex.v);
swap64bit(&otex.u, &otex.v); swapdouble(&otex.u, &otex.v);
} }
if (globalorientation&16) { xtex.u = -xtex.u; ytex.u = -ytex.u; otex.u = -otex.u; } if (globalorientation&16) { xtex.u = -xtex.u; ytex.u = -ytex.u; otex.u = -otex.u; }
@ -3650,11 +3650,11 @@ static int32_t polymost_bunchfront(const int32_t b1, const int32_t b2)
if (x1b1 >= x1b2) if (x1b1 >= x1b2)
{ {
for (; dxb2[b2f]<=x1b1; b2f=bunchp2[b2f]) { } while (dxb2[b2f]<=x1b1) b2f=bunchp2[b2f];
return wallfront(b1f, b2f); return wallfront(b1f, b2f);
} }
for (; dxb2[b1f]<=x1b2; b1f=bunchp2[b1f]) { } while (dxb2[b1f]<=x1b2) b1f=bunchp2[b1f];
return wallfront(b1f, b2f); return wallfront(b1f, b2f);
} }
@ -3672,16 +3672,16 @@ void polymost_scansector(int32_t sectnum)
{ {
tspritetype const * const spr = (tspritetype *)&sprite[z]; tspritetype const * const spr = (tspritetype *)&sprite[z];
if ((spr->cstat & 0x8000 && !showinvisibility) || spr->xrepeat == 0 || spr->yrepeat == 0) if ((((spr->cstat&0x8000) == 0) || (showinvisibility)) && (spr->xrepeat > 0) && (spr->yrepeat > 0))
continue;
vec2_t const s = { spr->x-globalposx, spr->y-globalposy };
if ((spr->cstat&48) || (usemodels && tile2model[spr->picnum].modelid>=0) || ((s.x * gcosang) + (s.y * gsinang) > 0))
{ {
if ((spr->cstat&(64+48))!=(64+16) || dmulscale6(sintable[(spr->ang+512)&2047],-s.x, sintable[spr->ang&2047],-s.y) > 0) vec2_t const s = { spr->x-globalposx, spr->y-globalposy };
if (engine_addtsprite(z, sectnum))
break; if ((spr->cstat&48) || (usemodels && tile2model[spr->picnum].modelid>=0) || ((s.x * gcosang) + (s.y * gsinang) > 0))
{
if ((spr->cstat&(64+48))!=(64+16) || dmulscale6(sintable[(spr->ang+512)&2047],-s.x, sintable[spr->ang&2047],-s.y) > 0)
if (engine_addtsprite(z, sectnum))
break;
}
} }
} }
@ -3735,34 +3735,40 @@ void polymost_scansector(int32_t sectnum)
p2.x = ((fp2.y * fcosglobalang) - (fp2.x * fsinglobalang)) * (1.0f/64.f); p2.x = ((fp2.y * fcosglobalang) - (fp2.x * fsinglobalang)) * (1.0f/64.f);
p2.y = ((fp2.x * (float) cosviewingrangeglobalang) + (fp2.y * (float) sinviewingrangeglobalang)) * (1.0f/64.f); p2.y = ((fp2.x * (float) cosviewingrangeglobalang) + (fp2.y * (float) sinviewingrangeglobalang)) * (1.0f/64.f);
if ((p1.y >= SCISDIST) || (p2.y >= SCISDIST)) //if wall is facing you...
if (p1.x*p2.y < p2.x*p1.y) //if wall is facing you... if ((p1.y >= SCISDIST || p2.y >= SCISDIST) && (p1.x*p2.y < p2.x*p1.y))
{
dxb1[numscans] = (p1.y >= SCISDIST) ? (p1.x*ghalfx/p1.y + ghalfx) : -1e32f;
dxb2[numscans] = (p2.y >= SCISDIST) ? (p2.x*ghalfx/p2.y + ghalfx) : 1e32f;
if (dxb1[numscans] < dxb2[numscans])
{ {
if (p1.y >= SCISDIST) thesector[numscans] = sectnum;
dxb1[numscans] = p1.x*ghalfx/p1.y + ghalfx; thewall[numscans] = z;
else dxb1[numscans] = -1e32f; bunchp2[numscans] = numscans + 1;
numscans++;
if (p2.y >= SCISDIST)
dxb2[numscans] = p2.x*ghalfx/p2.y + ghalfx;
else dxb2[numscans] = 1e32f;
if (dxb1[numscans] < dxb2[numscans])
{ thesector[numscans] = sectnum; thewall[numscans] = z; bunchp2[numscans] = numscans+1; numscans++; }
} }
}
if ((wall[z].point2 < z) && (scanfirst < numscans)) if ((wall[z].point2 < z) && (scanfirst < numscans))
{ bunchp2[numscans-1] = scanfirst; scanfirst = numscans; } {
bunchp2[numscans-1] = scanfirst;
scanfirst = numscans;
}
} }
for (int z=numscansbefore; z<numscans; z++) for (int z=numscansbefore; z<numscans; z++)
{
if ((wall[thewall[z]].point2 != thewall[bunchp2[z]]) || (dxb2[z] > dxb1[bunchp2[z]])) if ((wall[thewall[z]].point2 != thewall[bunchp2[z]]) || (dxb2[z] > dxb1[bunchp2[z]]))
{ {
bunchfirst[numbunches++] = bunchp2[z]; bunchp2[z] = -1; bunchfirst[numbunches++] = bunchp2[z];
bunchp2[z] = -1;
#ifdef YAX_ENABLE #ifdef YAX_ENABLE
if (scansector_retfast) if (scansector_retfast)
return; return;
#endif #endif
} }
}
for (int z=bunchfrst; z<numbunches; z++) for (int z=bunchfrst; z<numbunches; z++)
{ {
@ -3787,7 +3793,8 @@ static void polymost_initmosts(const float * px, const float * py, int const n)
int32_t imin = (px[1] < px[0]); int32_t imin = (px[1] < px[0]);
for (int i=n-1; i>=2; i--) if (px[i] < px[imin]) imin = i; for (int i=n-1; i>=2; i--)
if (px[i] < px[imin]) imin = i;
int32_t vcnt = 1; //0 is dummy solid node int32_t vcnt = 1; //0 is dummy solid node
@ -4149,12 +4156,7 @@ void polymost_drawmaskwall(int32_t damaskwallcnt)
int method = DAMETH_MASK | DAMETH_WALL; int method = DAMETH_MASK | DAMETH_WALL;
if (wal->cstat & 128) if (wal->cstat & 128)
{ method = DAMETH_WALL | ((wal->cstat & 512)) ? DAMETH_TRANS2 : DAMETH_TRANS1;
if (!(wal->cstat & 512))
method = DAMETH_TRANS1 | DAMETH_WALL;
else
method = DAMETH_TRANS2 | DAMETH_WALL;
}
calc_and_apply_fog(wal->picnum, fogpal_shade(sec, wal->shade), sec->visibility, get_floor_fogpal(sec)); calc_and_apply_fog(wal->picnum, fogpal_shade(sec, wal->shade), sec->visibility, get_floor_fogpal(sec));
@ -4260,7 +4262,7 @@ typedef struct
wallspriteinfo_t wsprinfo[MAXSPRITES]; wallspriteinfo_t wsprinfo[MAXSPRITES];
static inline int32_t polymost_findwall(tspritetype const * const tspr, int32_t * rd) static inline int32_t polymost_findwall(tspritetype const * const tspr, vec2_t const * const tsiz, int32_t * rd)
{ {
int32_t dist = 4, closest = -1; int32_t dist = 4, closest = -1;
tsectortype const * const sect = (tsectortype * )&sector[tspr->sectnum]; tsectortype const * const sect = (tsectortype * )&sector[tspr->sectnum];
@ -4268,7 +4270,8 @@ static inline int32_t polymost_findwall(tspritetype const * const tspr, int32_t
for (int i=sect->wallptr; i<sect->wallptr + sect->wallnum; i++) for (int i=sect->wallptr; i<sect->wallptr + sect->wallnum; i++)
{ {
if (!polymost_getclosestpointonwall((const vec2_t *)tspr, i, &n)) if ((wall[i].nextsector == -1 || ((sector[wall[i].nextsector].ceilingz > (tspr->z - ((tsiz->y * tspr->yrepeat) << 2))) ||
sector[wall[i].nextsector].floorz < tspr->z)) && !polymost_getclosestpointonwall((const vec2_t *) tspr, i, &n))
{ {
int const dst = klabs(tspr->x - n.x) + klabs(tspr->y - n.y); int const dst = klabs(tspr->x - n.x) + klabs(tspr->y - n.y);
@ -4363,12 +4366,7 @@ void polymost_drawsprite(int32_t snum)
int32_t method = DAMETH_MASK | DAMETH_CLAMPED; int32_t method = DAMETH_MASK | DAMETH_CLAMPED;
if (tspr->cstat & 2) if (tspr->cstat & 2)
{ method = DAMETH_CLAMPED | ((tspr->cstat & 512) ? DAMETH_TRANS2 : DAMETH_TRANS1);
if (!(tspr->cstat & 512))
method = DAMETH_TRANS1 | DAMETH_CLAMPED;
else
method = DAMETH_TRANS2 | DAMETH_CLAMPED;
}
drawpoly_alpha = spriteext[spritenum].alpha; drawpoly_alpha = spriteext[spritenum].alpha;
@ -4381,16 +4379,13 @@ void polymost_drawsprite(int32_t snum)
if (usemodels && tile2model[Ptile2tile(tspr->picnum, tspr->pal)].modelid >= 0 && if (usemodels && tile2model[Ptile2tile(tspr->picnum, tspr->pal)].modelid >= 0 &&
tile2model[Ptile2tile(tspr->picnum, tspr->pal)].framenum >= 0) tile2model[Ptile2tile(tspr->picnum, tspr->pal)].framenum >= 0)
{ {
if (polymost_mddraw(tspr)) if (polymost_mddraw(tspr)) return;
return;
break; // else, render as flat sprite break; // else, render as flat sprite
} }
if (usevoxels && (tspr->cstat & 48) != 48 && tiletovox[tspr->picnum] >= 0 && voxmodels[tiletovox[tspr->picnum]]) if (usevoxels && (tspr->cstat & 48) != 48 && tiletovox[tspr->picnum] >= 0 && voxmodels[tiletovox[tspr->picnum]])
{ {
if (polymost_voxdraw(voxmodels[tiletovox[tspr->picnum]], tspr)) if (polymost_voxdraw(voxmodels[tiletovox[tspr->picnum]], tspr)) return;
return;
break; // else, render as flat sprite break; // else, render as flat sprite
} }
@ -4579,7 +4574,7 @@ void polymost_drawsprite(int32_t snum)
if (s == -1 || !wsprinfo[s].wall || (spritechanged[s] != wsprinfo[s].srev) || if (s == -1 || !wsprinfo[s].wall || (spritechanged[s] != wsprinfo[s].srev) ||
(w != -1 && wallchanged[w] != wsprinfo[s].wrev)) (w != -1 && wallchanged[w] != wsprinfo[s].wrev))
{ {
w = polymost_findwall(tspr, &walldist); w = polymost_findwall(tspr, &tsiz, &walldist);
if (s != -1 && w != -1) if (s != -1 && w != -1)
{ {
@ -4770,8 +4765,6 @@ void polymost_drawsprite(int32_t snum)
if ((globalorientation & 8) > 0) if ((globalorientation & 8) > 0)
off.y = -off.y; off.y = -off.y;
vec2f_t pxy[6];
vec2f_t const p0 = { (float)((tsiz.x >> 1) - off.x) * tspr->xrepeat, vec2f_t const p0 = { (float)((tsiz.x >> 1) - off.x) * tspr->xrepeat,
(float)((tsiz.y >> 1) - off.y) * tspr->yrepeat }, (float)((tsiz.y >> 1) - off.y) * tspr->yrepeat },
p1 = { (float)((tsiz.x >> 1) + off.x) * tspr->xrepeat, p1 = { (float)((tsiz.x >> 1) + off.x) * tspr->xrepeat,
@ -4780,6 +4773,8 @@ void polymost_drawsprite(int32_t snum)
float const c = sintable[(tspr->ang + 512) & 2047] * (1.0f / 65536.f); float const c = sintable[(tspr->ang + 512) & 2047] * (1.0f / 65536.f);
float const s = sintable[tspr->ang & 2047] * (1.0f / 65536.f); float const s = sintable[tspr->ang & 2047] * (1.0f / 65536.f);
vec2f_t pxy[6];
// Project 3D to 2D // Project 3D to 2D
for (int j = 0; j < 4; j++) for (int j = 0; j < 4; j++)
{ {
@ -5650,14 +5645,12 @@ int32_t polymost_drawtilescreen(int32_t tilex, int32_t tiley, int32_t wallnum, i
scy *= ydime/xdime; scy *= ydime/xdime;
} }
{ int32_t const ousehightile = usehightile;
int32_t ousehightile = usehightile; usehightile = usehitile && usehightile;
usehightile = usehitile && usehightile; pth = texcache_fetch(wallnum, 0, 0, DAMETH_CLAMPED);
pth = texcache_fetch(wallnum, 0, 0, DAMETH_CLAMPED); if (usehightile)
if (usehightile) loadedhitile[wallnum>>3] |= (1<<(wallnum&7));
loadedhitile[wallnum>>3] |= (1<<(wallnum&7)); usehightile = ousehightile;
usehightile = ousehightile;
}
bglBindTexture(GL_TEXTURE_2D, pth ? pth->glpic : 0); bglBindTexture(GL_TEXTURE_2D, pth ? pth->glpic : 0);