diff --git a/polymer/eduke32/build/src/polymost.c b/polymer/eduke32/build/src/polymost.c index 4c6e5e20e..5b94b08db 100644 --- a/polymer/eduke32/build/src/polymost.c +++ b/polymer/eduke32/build/src/polymost.c @@ -1392,7 +1392,7 @@ static inline pthtyp *our_texcache_fetch(int32_t dameth) return texcache_fetch(globalpicnum, globalpal, getpalookup((r_usetileshades == 1) ? globvis>>3 : 0, globalshade), dameth); } -static void drawpoly(float *dpx, float *dpy, int32_t n, int32_t method) +static void drawpoly(vec2f_t *dpxy, int32_t n, int32_t method) { const int32_t method_ = method; int32_t i, j, k; @@ -1407,12 +1407,14 @@ static void drawpoly(float *dpx, float *dpy, int32_t n, int32_t method) if (n == 3) { - if ((dpx[0]-dpx[1])*(dpy[2]-dpy[1]) >= (dpx[2]-dpx[1])*(dpy[0]-dpy[1])) return; //for triangle + if ((dpxy[0].x-dpxy[1].x) * (dpxy[2].y-dpxy[1].y) >= + (dpxy[2].x-dpxy[1].x) * (dpxy[0].y-dpxy[1].y)) return; //for triangle } else { f = 0; //f is area of polygon / 2 - for (i=n-2,j=n-1,k=0; k if ((x0 > nx0) && (x0 < nx1)) { - t = (x0-nx0)*cv[dir] - (y0-cy[dir])*dx; + const float t = (x0-nx0)*cv[dir] - (y0-cy[dir])*dx; if (((!dir) && (t < 0.f)) || ((dir) && (t > 0.f))) { spx[scnt] = x0; /*spy[scnt] = y0;*/ spt[scnt] = -1; scnt++; } } @@ -1897,12 +1899,14 @@ void domost(float x0, float y0, float x1, float y1) //Test for intersection on umost (j == 0) and dmost (j == 1) for (j=0; j<2; j++) { - d = (y0-y1)*dx - (x0-x1)*cv[j]; - n = (y0-cy[j])*dx - (x0-nx0)*cv[j]; + const float d = (y0-y1) * dx - (x0-x1) * cv[j]; + const float n = (y0-cy[j])* dx - (x0-nx0) * cv[j]; if ((fabsf(d) > fabsf(n)) && (d * n >= 0.f)) { - t = n/d; nx = (x1-x0)*t + x0; + const float t = n/d; + const float nx = (x1-x0) * t + x0; + if ((nx > nx0) && (nx < nx1)) { spx[scnt] = nx; /* spy[scnt] = (y1-y0)*t + y0; */ @@ -1922,18 +1926,24 @@ void domost(float x0, float y0, float x1, float y1) //Test if right edge requires split if ((x1 > nx0) && (x1 < nx1)) { - t = (x1-nx0)*cv[dir] - (y1-cy[dir])*dx; + const float 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++; } } vsp[i].tag = vsp[newi].tag = -1; + + dx = 1.f/dx; + for (z=0; z<=scnt; z++,i=vcnt) { + float dx0, dx1; + int32_t ni; + if (z < scnt) { + const float t = (spx[z]-nx0)*dx; 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]; vsp[vcnt].x = spx[z]; @@ -1967,43 +1977,43 @@ void domost(float x0, float y0, float x1, float y1) if ((vsp[ni].tag == 0) || (ny1 <= vsp[i].cy[1]+.01f)) k -= 3; if ((vsp[ni].tag == 1) || (ny1 >= vsp[i].fy[1]-.01f)) k += 3; - dpx[0] = dx0; - dpx[1] = dx1; + dpxy[0].x = dx0; + dpxy[1].x = dx1; if (!dir) { - dpy[0] = vsp[i].cy[0]; - dpy[1] = vsp[i].cy[1]; + dpxy[0].y = vsp[i].cy[0]; + dpxy[1].y = vsp[i].cy[1]; switch (k) { case 1: case 2: - dpx[2] = dx0; - dpy[2] = ny0; + dpxy[2].x = dx0; + dpxy[2].y = ny0; vsp[i].cy[0] = ny0; vsp[i].ctag = gtag; - drawpoly(dpx,dpy,3,domostpolymethod); + drawpoly(dpxy, 3, domostpolymethod); break; case 3: case 6: - dpx[2] = dx1; - dpy[2] = ny1; + dpxy[2].x = dx1; + dpxy[2].y = ny1; vsp[i].cy[1] = ny1; vsp[i].ctag = gtag; - drawpoly(dpx, dpy, 3, domostpolymethod); + drawpoly(dpxy, 3, domostpolymethod); break; case 4: case 5: case 7: - dpx[2] = dx1; dpx[3] = dx0; - dpy[2] = ny1; dpy[3] = ny0; + dpxy[2].x = dx1; dpxy[3].x = dx0; + dpxy[2].y = ny1; dpxy[3].y = ny0; vsp[i].cy[0] = ny0; vsp[i].cy[1] = ny1; vsp[i].ctag = gtag; - drawpoly(dpx, dpy, 4, domostpolymethod); + drawpoly(dpxy, 4, domostpolymethod); break; case 8: - dpx[2] = dx1; dpy[2] = vsp[i].fy[1]; - dpx[3] = dx0; dpy[3] = vsp[i].fy[0]; + dpxy[2].x = dx1; dpxy[2].y = vsp[i].fy[1]; + dpxy[3].x = dx0; dpxy[3].y = vsp[i].fy[0]; vsp[i].ctag = vsp[i].ftag = -1; - drawpoly(dpx,dpy,4,domostpolymethod); + drawpoly(dpxy, 4, domostpolymethod); default: break; } @@ -2014,31 +2024,31 @@ void domost(float x0, float y0, float x1, float y1) { case 7: case 6: - dpx[2] = dx0; - dpy[0] = ny0; dpy[1] = vsp[i].fy[1]; dpy[2] = vsp[i].fy[0]; + dpxy[2].x = dx0; + dpxy[0].y = ny0; dpxy[1].y = vsp[i].fy[1]; dpxy[2].y = vsp[i].fy[0]; vsp[i].fy[0] = ny0; vsp[i].ftag = gtag; - drawpoly(dpx,dpy,3,domostpolymethod); + drawpoly(dpxy, 3, domostpolymethod); break; case 5: case 2: - dpx[2] = dx1; - dpy[0] = vsp[i].fy[0]; dpy[1] = ny1; dpy[2] = vsp[i].fy[1]; + dpxy[2].x = dx1; + dpxy[0].y = vsp[i].fy[0]; dpxy[1].y = ny1; dpxy[2].y = vsp[i].fy[1]; vsp[i].fy[1] = ny1; vsp[i].ftag = gtag; - drawpoly(dpx,dpy,3,domostpolymethod); + drawpoly(dpxy, 3, domostpolymethod); break; case 4: case 3: case 1: - dpx[2] = dx1; dpx[3] = dx0; - dpy[0] = ny0; dpy[1] = ny1; dpy[2] = vsp[i].fy[1]; dpy[3] = vsp[i].fy[0]; + dpxy[2].x = dx1; dpxy[3].x = dx0; + dpxy[0].y = ny0; dpxy[1].y = ny1; dpxy[2].y = vsp[i].fy[1]; dpxy[3].y = vsp[i].fy[0]; vsp[i].fy[0] = ny0; vsp[i].fy[1] = ny1; vsp[i].ftag = gtag; - drawpoly(dpx,dpy,4,domostpolymethod); + drawpoly(dpxy, 4, domostpolymethod); break; case 0: - dpx[2] = dx1; dpx[3] = dx0; - dpy[0] = vsp[i].cy[0]; dpy[1] = vsp[i].cy[1]; dpy[2] = vsp[i].fy[1]; dpy[3] = vsp[i].fy[0]; + dpxy[2].x = dx1; dpxy[3].x = dx0; + dpxy[0].y = vsp[i].cy[0]; dpxy[1].y = vsp[i].cy[1]; dpxy[2].y = vsp[i].fy[1]; dpxy[3].y = vsp[i].fy[0]; vsp[i].ctag = vsp[i].ftag = -1; - drawpoly(dpx,dpy,4,domostpolymethod); + drawpoly(dpxy, 4, domostpolymethod); default: break; } @@ -2054,7 +2064,7 @@ void domost(float x0, float y0, float x1, float y1) while (i) { - ni = vsp[i].n; + int32_t 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; @@ -3592,7 +3602,8 @@ void polymost_drawrooms() void polymost_drawmaskwall(int32_t damaskwallcnt) { - float dpx[8], dpy[8], dpx2[8], dpy2[8]; + vec2f_t dpxy[8]; + float dpx2[8], dpy2[8]; float x0, x1, sx0, sy0, sx1, sy1, xp0, yp0, xp1, yp1, oxp0, oyp0, ryp0, ryp1; float r, t, t0, t1, csy[4], fsy[4]; int32_t i, j, n, n2, z, sectnum, z1, z2, cz[4], fz[4], method; @@ -3708,25 +3719,25 @@ void polymost_drawmaskwall(int32_t damaskwallcnt) // | / // fsy1/ - dpx[0] = x0; dpy[0] = csy[1]; - dpx[1] = x1; dpy[1] = csy[3]; - dpx[2] = x1; dpy[2] = fsy[3]; - dpx[3] = x0; dpy[3] = fsy[1]; + dpxy[0].x = x0; dpxy[0].y = csy[1]; + dpxy[1].x = x1; dpxy[1].y = csy[3]; + dpxy[2].x = x1; dpxy[2].y = fsy[3]; + dpxy[3].x = x0; dpxy[3].y = fsy[1]; n = 4; //Clip to (x0,csy[0])-(x1,csy[2]) - n2 = 0; t1 = -((dpx[0]-x0)*(csy[2]-csy[0]) - (dpy[0]-csy[0])*(x1-x0)); + n2 = 0; t1 = -((dpxy[0].x-x0)*(csy[2]-csy[0]) - (dpxy[0].y-csy[0])*(x1-x0)); for (i=0; i= n) j = 0; - t0 = t1; t1 = -((dpx[j]-x0)*(csy[2]-csy[0]) - (dpy[j]-csy[0])*(x1-x0)); - if (t0 >= 0) { dpx2[n2] = dpx[i]; dpy2[n2] = dpy[i]; n2++; } + t0 = t1; t1 = -((dpxy[j].x-x0)*(csy[2]-csy[0]) - (dpxy[j].y-csy[0])*(x1-x0)); + if (t0 >= 0) { dpx2[n2] = dpxy[i].x; dpy2[n2] = dpxy[i].y; n2++; } if ((t0 >= 0) != (t1 >= 0)) { r = t0/(t0-t1); - dpx2[n2] = (dpx[j]-dpx[i])*r + dpx[i]; - dpy2[n2] = (dpy[j]-dpy[i])*r + dpy[i]; + dpx2[n2] = (dpxy[j].x-dpxy[i].x)*r + dpxy[i].x; + dpy2[n2] = (dpxy[j].y-dpxy[i].y)*r + dpxy[i].y; n2++; } } @@ -3739,12 +3750,12 @@ void polymost_drawmaskwall(int32_t damaskwallcnt) j = i+1; if (j >= n2) j = 0; t0 = t1; t1 = -((dpx2[j]-x1)*(fsy[0]-fsy[2]) - (dpy2[j]-fsy[2])*(x0-x1)); - if (t0 >= 0) { dpx[n] = dpx2[i]; dpy[n] = dpy2[i]; n++; } + if (t0 >= 0) { dpxy[n].x = dpx2[i]; dpxy[n].y = dpy2[i]; n++; } if ((t0 >= 0) != (t1 >= 0)) { r = t0/(t0-t1); - dpx[n] = (dpx2[j]-dpx2[i])*r + dpx2[i]; - dpy[n] = (dpy2[j]-dpy2[i])*r + dpy2[i]; + dpxy[n].x = (dpx2[j]-dpx2[i])*r + dpx2[i]; + dpxy[n].y = (dpy2[j]-dpy2[i])*r + dpy2[i]; n++; } } @@ -3753,12 +3764,12 @@ void polymost_drawmaskwall(int32_t damaskwallcnt) pow2xsplit = 0; skyclamphack = 0; alpha = 0.f; - drawpoly(dpx,dpy,n,method); + drawpoly(dpxy, n, method); } void polymost_drawsprite(int32_t snum) { - float px[6], py[6]; + vec2f_t pxy[6]; float f, c, s, fx, fy, sx0, sy0, sx1, xp0, yp0, xp1, yp1, oxp0, oyp0, ryp0, ryp1, ft[4]; float x0, y0, x1, y1, sc0, sf0, sc1, sf1, px2[6], py2[6], xv, yv, t0, t1; int32_t i, j, spritenum, xoff=0, yoff=0, method, npoints; @@ -3892,17 +3903,17 @@ void polymost_drawsprite(int32_t snum) fx *= ((float)tsizx); fy *= ((float)tsizy); - px[0] = px[3] = sx0-fx*0.5f; px[1] = px[2] = sx0+fx*0.5f; - if (!(globalorientation&128)) { py[0] = py[1] = sy0-fy; py[2] = py[3] = sy0; } - else { py[0] = py[1] = sy0-fy*0.5f; py[2] = py[3] = sy0+fy*0.5f; } + pxy[0].x = pxy[3].x = sx0-fx*0.5f; pxy[1].x = pxy[2].x = sx0+fx*0.5f; + if (!(globalorientation&128)) { pxy[0].y = pxy[1].y = sy0-fy; pxy[2].y = pxy[3].y = sy0; } + else { pxy[0].y = pxy[1].y = sy0-fy*0.5f; pxy[2].y = pxy[3].y = sy0+fy*0.5f; } gdx = gdy = guy = gvx = 0; gdo = ryp0*gviewxrange; if (!(globalorientation&4)) - { gux = (float)tsizx*gdo/(px[1]-px[0]+.002f); guo = -gux*(px[0]-.001f); } - else { gux = (float)tsizx*gdo/(px[0]-px[1]-.002f); guo = -gux*(px[1]+.001f); } + { gux = (float)tsizx*gdo/(pxy[1].x-pxy[0].x+.002f); guo = -gux*(pxy[0].x-.001f); } + else { gux = (float)tsizx*gdo/(pxy[0].x-pxy[1].x-.002f); guo = -gux*(pxy[1].x+.001f); } if (!(globalorientation&8)) - { gvy = (float)tsizy*gdo/(py[3]-py[0]+.002f); gvo = -gvy*(py[0]-.001f); } - else { gvy = (float)tsizy*gdo/(py[0]-py[3]-.002f); gvo = -gvy*(py[3]+.001f); } + { gvy = (float)tsizy*gdo/(pxy[3].y-pxy[0].y+.002f); gvo = -gvy*(pxy[0].y-.001f); } + else { gvy = (float)tsizy*gdo/(pxy[0].y-pxy[3].y-.002f); gvo = -gvy*(pxy[3].y+.001f); } // sprite panning #ifdef USE_OPENGL @@ -3925,17 +3936,17 @@ void polymost_drawsprite(int32_t snum) if (!(sector[tspr->sectnum].ceilingstat&3)) { sy0 = ((float)(sector[tspr->sectnum].ceilingz-globalposz))*gyxscale*ryp0 + ghoriz; - if (py[0] < sy0) py[0] = py[1] = sy0; + if (pxy[0].y < sy0) pxy[0].y = pxy[1].y = sy0; } if (!(sector[tspr->sectnum].floorstat&3)) { sy0 = ((float)(sector[tspr->sectnum].floorz-globalposz))*gyxscale*ryp0 + ghoriz; - if (py[2] > sy0) py[2] = py[3] = sy0; + if (pxy[2].y > sy0) pxy[2].y = pxy[3].y = sy0; } tilesiz[globalpicnum].x = tsizx; tilesiz[globalpicnum].y = tsizy; - pow2xsplit = 0; drawpoly(px,py,4,method); + pow2xsplit = 0; drawpoly(pxy, 4, method); #ifdef USE_OPENGL srepeat = 0; @@ -4075,14 +4086,14 @@ void polymost_drawsprite(int32_t snum) swapfloat(&sf0, &sf1); } - px[0] = sx0; py[0] = sc0; - px[1] = sx1; py[1] = sc1; - px[2] = sx1; py[2] = sf1; - px[3] = sx0; py[3] = sf0; + pxy[0].x = sx0; pxy[0].y = sc0; + pxy[1].x = sx1; pxy[1].y = sc1; + pxy[2].x = sx1; pxy[2].y = sf1; + pxy[3].x = sx0; pxy[3].y = sf0; tilesiz[globalpicnum].x = tsizx; tilesiz[globalpicnum].y = tsizy; - pow2xsplit = 0; drawpoly(px,py,4,method); + pow2xsplit = 0; drawpoly(pxy, 4,method); #ifdef USE_OPENGL srepeat = 0; @@ -4115,8 +4126,8 @@ void polymost_drawsprite(int32_t snum) else { sy0 += s*y1; sx0 += c*y1; } if ((j+1)&2) { sx0 -= s*x0; sy0 += c*x0; } else { sx0 += s*x1; sy0 -= c*x1; } - px[j] = sy0*gcosang - sx0*gsinang; - py[j] = sx0*gcosang2 + sy0*gsinang2; + pxy[j].x = sy0*gcosang - sx0*gsinang; + pxy[j].y = sx0*gcosang2 + sy0*gsinang2; } if (tspr->z == sec->ceilingz) tspr->z++; @@ -4124,10 +4135,10 @@ void polymost_drawsprite(int32_t snum) if (tspr->z < globalposz) //if floor sprite is above you, reverse order of points { - swapfloat(&px[0], &px[1]); - swapfloat(&px[2], &px[3]); - swapfloat(&py[0], &py[1]); - swapfloat(&py[2], &py[3]); + swapfloat(&pxy[0].x, &pxy[1].x); + swapfloat(&pxy[2].x, &pxy[3].x); + swapfloat(&pxy[0].y, &pxy[1].y); + swapfloat(&pxy[2].y, &pxy[3].y); } //Clip to SCISDIST plane @@ -4135,12 +4146,12 @@ void polymost_drawsprite(int32_t snum) for (i=0; i<4; i++) { j = ((i+1)&3); - if (py[i] >= SCISDIST) { px2[npoints] = px[i]; py2[npoints] = py[i]; npoints++; } - if ((py[i] >= SCISDIST) != (py[j] >= SCISDIST)) + if (pxy[i].y >= SCISDIST) { px2[npoints] = pxy[i].x; py2[npoints] = pxy[i].y; npoints++; } + if ((pxy[i].y >= SCISDIST) != (pxy[j].y >= SCISDIST)) { - f = (SCISDIST-py[i])/(py[j]-py[i]); - px2[npoints] = (px[j]-px[i])*f + px[i]; - py2[npoints] = (py[j]-py[i])*f + py[i]; npoints++; + f = (SCISDIST-pxy[i].y)/(pxy[j].y-pxy[i].y); + px2[npoints] = (pxy[j].x-pxy[i].x)*f + pxy[i].x; + py2[npoints] = (pxy[j].y-pxy[i].y)*f + pxy[i].y; npoints++; } } if (npoints < 3) return; @@ -4150,8 +4161,8 @@ void polymost_drawsprite(int32_t snum) for (j=0; j