mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-10 23:02:03 +00:00
Prepare polymost.c for proper umost/dmost clipping of TROR passes. No real functional changes.
git-svn-id: https://svn.eduke32.com/eduke32@2002 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
962910ce32
commit
a23504822d
3 changed files with 53 additions and 38 deletions
|
@ -258,7 +258,7 @@ void yax_updategrays(int32_t posze)
|
|||
// all references to floor/ceiling bunchnums should be through the
|
||||
// get/set functions!
|
||||
|
||||
static int32_t g_nodraw = 0;
|
||||
int32_t g_nodraw = 0;
|
||||
int32_t scansector_retfast = 0;
|
||||
static int32_t scansector_collectsprites = 1;
|
||||
static int32_t yax_globalcf = -1;
|
||||
|
@ -526,7 +526,7 @@ static int16_t bunchsec[YAX_MAXBUNCHES], bunchdist[YAX_MAXBUNCHES];
|
|||
|
||||
static int32_t ymostallocsize = 0; // numyaxbunches*xdimen (no sizeof(int16_t) here!)
|
||||
static int16_t *yumost=NULL, *ydmost=NULL; // used as if [numyaxbunches][xdimen]
|
||||
static uint8_t haveymost[YAX_MAXBUNCHES>>3];
|
||||
uint8_t haveymost[YAX_MAXBUNCHES>>3];
|
||||
|
||||
// adapted from build.c
|
||||
static void yax_getclosestpointonwall(int32_t dawall, int32_t *closestx, int32_t *closesty)
|
||||
|
@ -722,7 +722,7 @@ void yax_preparedrawrooms(void)
|
|||
Bmemset(yax_spritesortcnt, 0, sizeof(yax_spritesortcnt));
|
||||
Bmemset(haveymost, 0, (numyaxbunches+7)>>3);
|
||||
|
||||
if (ymostallocsize < xdimen*numyaxbunches)
|
||||
if (getrendermode()==0 && ymostallocsize < xdimen*numyaxbunches)
|
||||
{
|
||||
ymostallocsize = xdimen*numyaxbunches;
|
||||
yumost = Brealloc(yumost, ymostallocsize*sizeof(int16_t));
|
||||
|
|
|
@ -76,7 +76,10 @@ int32_t animateoffs(int16_t tilenum, int16_t fakevar);
|
|||
extern void polymost_scansector(int32_t sectnum);
|
||||
#endif
|
||||
int32_t engine_addtsprite(int16_t z, int16_t sectnum);
|
||||
int32_t scansector_retfast;
|
||||
extern int32_t g_nodraw, scansector_retfast;
|
||||
#ifdef YAX_ENABLE
|
||||
extern uint8_t haveymost[YAX_MAXBUNCHES>>3];
|
||||
#endif
|
||||
|
||||
#ifdef YAX_DEBUG
|
||||
extern char m32_debugstr[64][128];
|
||||
|
|
|
@ -99,10 +99,10 @@ int32_t rendmode=0;
|
|||
int32_t usemodels=1, usehightile=1;
|
||||
|
||||
#include <math.h> //<-important!
|
||||
typedef struct { float x, cy[2], fy[2]; int32_t n, p, tag, ctag, ftag; } vsptyp;
|
||||
typedef struct { float x, cy[2], fy[2]; int32_t tag; int16_t n, p, ctag, ftag; } vsptyp;
|
||||
#define VSPMAX 4096 //<- careful!
|
||||
static vsptyp vsp[VSPMAX];
|
||||
static int32_t vcnt, gtag;
|
||||
static int32_t gtag;
|
||||
|
||||
static double dxb1[MAXWALLSB], dxb2[MAXWALLSB];
|
||||
|
||||
|
@ -1993,7 +1993,7 @@ void drawpoly(double *dpx, double *dpy, int32_t n, int32_t method)
|
|||
// backup of the n for possible redrawing of fullbright
|
||||
int32_t n_ = n, method_ = method;
|
||||
|
||||
if (method == -1) return;
|
||||
if (method == -1 || g_nodraw) return;
|
||||
|
||||
if (n == 3)
|
||||
{
|
||||
|
@ -2788,15 +2788,36 @@ void drawpoly(double *dpx, double *dpy, int32_t n, int32_t method)
|
|||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void vsp_finalize_init(vsptyp *vsp, int32_t vcnt)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
for (i=0; i<vcnt; i++)
|
||||
{
|
||||
vsp[i].cy[1] = vsp[i+1].cy[0]; vsp[i].ctag = i;
|
||||
vsp[i].fy[1] = vsp[i+1].fy[0]; vsp[i].ftag = i;
|
||||
vsp[i].n = i+1; vsp[i].p = i-1;
|
||||
// vsp[i].tag = -1;
|
||||
}
|
||||
vsp[vcnt-1].n = 0; vsp[0].p = vcnt-1;
|
||||
|
||||
//VSPMAX-1 is dummy empty node
|
||||
for (i=vcnt; i<VSPMAX; i++) { vsp[i].n = i+1; vsp[i].p = i-1; }
|
||||
vsp[VSPMAX-1].n = vcnt; vsp[vcnt].p = VSPMAX-1;
|
||||
}
|
||||
|
||||
/*Init viewport boundary (must be 4 point convex loop):
|
||||
// (px[0],py[0]).----.(px[1],py[1])
|
||||
// / \
|
||||
// / \
|
||||
// (px[3],py[3]).--------------.(px[2],py[2])
|
||||
*/
|
||||
static inline int32_t vsinsaft(vsptyp *vsp, int32_t i);
|
||||
|
||||
void initmosts(double *px, double *py, int32_t n)
|
||||
{
|
||||
int32_t i, j, k, imin;
|
||||
int32_t i, j, k, imin, vcnt;
|
||||
|
||||
vcnt = 1; //0 is dummy solid node
|
||||
|
||||
|
@ -2857,22 +2878,11 @@ void initmosts(double *px, double *py, int32_t n)
|
|||
vcnt++;
|
||||
}
|
||||
|
||||
|
||||
for (i=0; i<vcnt; i++)
|
||||
{
|
||||
vsp[i].cy[1] = vsp[i+1].cy[0]; vsp[i].ctag = i;
|
||||
vsp[i].fy[1] = vsp[i+1].fy[0]; vsp[i].ftag = i;
|
||||
vsp[i].n = i+1; vsp[i].p = i-1;
|
||||
}
|
||||
vsp[vcnt-1].n = 0; vsp[0].p = vcnt-1;
|
||||
vsp_finalize_init(vsp, vcnt);
|
||||
gtag = vcnt;
|
||||
|
||||
//VSPMAX-1 is dummy empty node
|
||||
for (i=vcnt; i<VSPMAX; i++) { vsp[i].n = i+1; vsp[i].p = i-1; }
|
||||
vsp[VSPMAX-1].n = vcnt; vsp[vcnt].p = VSPMAX-1;
|
||||
}
|
||||
|
||||
static inline void vsdel(int32_t i)
|
||||
static inline void vsdel(vsptyp *vsp, int32_t i)
|
||||
{
|
||||
int32_t pi, ni;
|
||||
//Delete i
|
||||
|
@ -2888,7 +2898,7 @@ static inline void vsdel(int32_t i)
|
|||
vsp[VSPMAX-1].n = i;
|
||||
}
|
||||
|
||||
static inline int32_t vsinsaft(int32_t i)
|
||||
static inline int32_t vsinsaft(vsptyp *vsp, int32_t i)
|
||||
{
|
||||
int32_t r;
|
||||
//i = next element from empty list
|
||||
|
@ -2923,7 +2933,7 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
{
|
||||
double dpx[4], dpy[4];
|
||||
float d, f, n, t, slop, dx, dx0, dx1, nx, nx0, ny0, nx1, ny1;
|
||||
float spx[4], spy[4], cy[2], cv[2];
|
||||
float spx[4], /*spy[4],*/ cy[2], cv[2];
|
||||
int32_t i, j, k, z, ni, vcnt = 0, scnt, newi, dir, spt[4];
|
||||
|
||||
if (x0 < x1)
|
||||
|
@ -2956,7 +2966,7 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
{
|
||||
t = (x0-nx0)*cv[dir] - (y0-cy[dir])*dx;
|
||||
if (((!dir) && (t < 0)) || ((dir) && (t > 0)))
|
||||
{ spx[scnt] = x0; spy[scnt] = y0; spt[scnt] = -1; scnt++; }
|
||||
{ spx[scnt] = x0; /*spy[scnt] = y0;*/ spt[scnt] = -1; scnt++; }
|
||||
}
|
||||
|
||||
//Test for intersection on umost (j == 0) and dmost (j == 1)
|
||||
|
@ -2969,7 +2979,7 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
t = n/d; nx = (x1-x0)*t + x0;
|
||||
if ((nx > nx0) && (nx < nx1))
|
||||
{
|
||||
spx[scnt] = nx; spy[scnt] = (y1-y0)*t + y0;
|
||||
spx[scnt] = nx; /* spy[scnt] = (y1-y0)*t + y0; */
|
||||
spt[scnt] = j; scnt++;
|
||||
}
|
||||
}
|
||||
|
@ -2979,7 +2989,7 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
if ((scnt >= 2) && (spx[scnt-1] < spx[scnt-2]))
|
||||
{
|
||||
f = spx[scnt-1]; spx[scnt-1] = spx[scnt-2]; spx[scnt-2] = f;
|
||||
f = spy[scnt-1]; spy[scnt-1] = spy[scnt-2]; spy[scnt-2] = f;
|
||||
/* f = spy[scnt-1]; spy[scnt-1] = spy[scnt-2]; spy[scnt-2] = f; */
|
||||
j = spt[scnt-1]; spt[scnt-1] = spt[scnt-2]; spt[scnt-2] = j;
|
||||
}
|
||||
|
||||
|
@ -2988,7 +2998,7 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
{
|
||||
t = (x1-nx0)*cv[dir] - (y1-cy[dir])*dx;
|
||||
if (((!dir) && (t < 0)) || ((dir) && (t > 0)))
|
||||
{ spx[scnt] = x1; spy[scnt] = y1; spt[scnt] = -1; scnt++; }
|
||||
{ spx[scnt] = x1; /* spy[scnt] = y1; */ spt[scnt] = -1; scnt++; }
|
||||
}
|
||||
|
||||
vsp[i].tag = vsp[newi].tag = -1;
|
||||
|
@ -2996,7 +3006,7 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
{
|
||||
if (z < scnt)
|
||||
{
|
||||
vcnt = vsinsaft(i);
|
||||
vcnt = vsinsaft(vsp, i);
|
||||
t = (spx[z]-nx0)/dx;
|
||||
vsp[i].cy[1] = t*cv[0] + cy[0];
|
||||
vsp[i].fy[1] = t*cv[1] + cy[1];
|
||||
|
@ -3033,31 +3043,26 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
|
||||
if (!dir)
|
||||
{
|
||||
dpx[0] = dx0; dpy[0] = vsp[i].cy[0];
|
||||
dpx[1] = dx1; dpy[1] = vsp[i].cy[1];
|
||||
|
||||
switch (k)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
dpx[0] = dx0; dpy[0] = vsp[i].cy[0];
|
||||
dpx[1] = dx1; dpy[1] = vsp[i].cy[1];
|
||||
dpx[2] = dx0; dpy[2] = ny0; drawpoly(dpx,dpy,3,domostpolymethod);
|
||||
vsp[i].cy[0] = ny0; vsp[i].ctag = gtag; break;
|
||||
case 3:
|
||||
case 6:
|
||||
dpx[0] = dx0; dpy[0] = vsp[i].cy[0];
|
||||
dpx[1] = dx1; dpy[1] = vsp[i].cy[1];
|
||||
dpx[2] = dx1; dpy[2] = ny1; drawpoly(dpx,dpy,3,domostpolymethod);
|
||||
vsp[i].cy[1] = ny1; vsp[i].ctag = gtag; break;
|
||||
case 4:
|
||||
case 5:
|
||||
case 7:
|
||||
dpx[0] = dx0; dpy[0] = vsp[i].cy[0];
|
||||
dpx[1] = dx1; dpy[1] = vsp[i].cy[1];
|
||||
dpx[2] = dx1; dpy[2] = ny1;
|
||||
dpx[3] = dx0; dpy[3] = ny0; drawpoly(dpx,dpy,4,domostpolymethod);
|
||||
vsp[i].cy[0] = ny0; vsp[i].cy[1] = ny1; vsp[i].ctag = gtag; break;
|
||||
case 8:
|
||||
dpx[0] = dx0; dpy[0] = vsp[i].cy[0];
|
||||
dpx[1] = dx1; dpy[1] = vsp[i].cy[1];
|
||||
dpx[2] = dx1; dpy[2] = vsp[i].fy[1];
|
||||
dpx[3] = dx0; dpy[3] = vsp[i].fy[0]; drawpoly(dpx,dpy,4,domostpolymethod);
|
||||
vsp[i].ctag = vsp[i].ftag = -1; break;
|
||||
|
@ -3110,9 +3115,16 @@ void domost(float x0, float y0, float x1, float y1)
|
|||
while (i)
|
||||
{
|
||||
ni = vsp[i].n;
|
||||
if ((vsp[i].cy[0] >= vsp[i].fy[0]) && (vsp[i].cy[1] >= vsp[i].fy[1])) { vsp[i].ctag = vsp[i].ftag = -1; }
|
||||
|
||||
if ((vsp[i].cy[0] >= vsp[i].fy[0]) && (vsp[i].cy[1] >= vsp[i].fy[1]))
|
||||
vsp[i].ctag = vsp[i].ftag = -1;
|
||||
|
||||
if ((vsp[i].ctag == vsp[ni].ctag) && (vsp[i].ftag == vsp[ni].ftag))
|
||||
{ vsp[i].cy[1] = vsp[ni].cy[1]; vsp[i].fy[1] = vsp[ni].fy[1]; vsdel(ni); }
|
||||
{
|
||||
vsp[i].cy[1] = vsp[ni].cy[1];
|
||||
vsp[i].fy[1] = vsp[ni].fy[1];
|
||||
vsdel(vsp, ni);
|
||||
}
|
||||
else i = ni;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue