From 020dc85fd0879704b1b6646411f363e33b79391f Mon Sep 17 00:00:00 2001 From: terminx Date: Sat, 25 Oct 2014 03:27:35 +0000 Subject: [PATCH] Additional Polymost cleanup, attempt to fix enemy shadows (they are still not right) git-svn-id: https://svn.eduke32.com/eduke32@4656 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/polymost.h | 2 + polymer/eduke32/build/src/engine.c | 13 +- polymer/eduke32/build/src/mdsprite.c | 197 ++++++++++++----------- polymer/eduke32/build/src/polymost.c | 94 ++++++----- 4 files changed, 171 insertions(+), 135 deletions(-) diff --git a/polymer/eduke32/build/include/polymost.h b/polymer/eduke32/build/include/polymost.h index bbb9308f0..716f11072 100644 --- a/polymer/eduke32/build/include/polymost.h +++ b/polymer/eduke32/build/include/polymost.h @@ -187,6 +187,8 @@ extern int32_t globalnoeffect; extern int32_t drawingskybox; extern int32_t hicprecaching; extern float gyxscale, gxyaspect, ghalfx, grhalfxdown10; +extern float fcosglobalang, fsinglobalang, fglobalposx, fglobalposy, fglobalposz; +extern float fxdim, fydim, fxdimen, fydimen, fviewingrange; extern char ptempbuf[MAXWALLSB<<1]; diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index 4f3df05f0..56f42e465 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -6607,6 +6607,7 @@ static void drawsprite(int32_t snum) #ifdef USE_OPENGL case REND_POLYMOST: polymost_drawsprite(snum); + bglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); bglDepthFunc(GL_LESS); //NEVER,LESS,(,L)EQUAL,GREATER,(NOT,G)EQUAL,ALWAYS bglDepthRange(0.0, 1.0); //<- this is more widely supported than glPolygonOffset return; @@ -9542,8 +9543,8 @@ killsprite: { _point2d pos; - pos.x = (float)globalposx; - pos.y = (float)globalposy; + pos.x = fglobalposx; + pos.y = fglobalposy; // CAUTION: maskwallcnt and spritesortcnt may be zero! // Writing e.g. "while (maskwallcnt--)" is wrong! @@ -11288,6 +11289,10 @@ int32_t setgamemode(char davidoption, int32_t daxdim, int32_t daydim, int32_t da xdim = daxdim; ydim = daydim; +#ifdef USE_OPENGL + fxdim = (float) xdim; + fydim = (float) ydim; +#endif if (lookups != NULL) Bfree(lookups); @@ -14688,6 +14693,10 @@ void setview(int32_t x1, int32_t y1, int32_t x2, int32_t y2) xdimenrecip = divscale32(1L,xdimen); ydimen = (y2-y1)+1; +#ifdef USE_OPENGL + fxdimen = (float) xdimen; + fydimen = (float) ydimen; +#endif setaspect_new(); for (i=0; i +#include static int32_t curextra=MAXTILES; -// nedpool *model_data_pool; -// #define MODEL_POOL_SIZE 20971520 -#define model_data_pool (nedpool *) 0 // take it out of the system pool #define MIN_CACHETIME_PRINT 10 @@ -1678,7 +1677,7 @@ static int32_t mdtrig_init = 0; static void init_mdtrig_arrays(void) { int32_t i; - static const float acc = ((2.f * PI) * (1.f/255.f)); + static const float acc = ((2.f * (float)PI) * (1.f/255.f)); float ang = 0.f; for (i=0; i<256; i++) @@ -1969,11 +1968,11 @@ static int32_t polymost_md3draw(md3model_t *m, const spritetype *tspr) //create current&next frame's vertex list from whole list - f = m->interpol; g = 1-f; + f = m->interpol; g = 1.f - f; - if (m->interpol < 0 || m->interpol > 1 || - m->cframe < 0 || m->cframe >= m->numframes || - m->nframe < 0 || m->nframe >= m->numframes) + if (m->interpol < 0.f || m->interpol > 1.f || + (unsigned)m->cframe >= (unsigned)m->numframes || + (unsigned)m->nframe >= (unsigned)m->numframes) { #ifdef DEBUGGINGAIDS OSD_Printf("%s: mdframe oob: c:%d n:%d total:%d interpol:%.02f\n", @@ -1985,13 +1984,11 @@ static int32_t polymost_md3draw(md3model_t *m, const spritetype *tspr) m->nframe = clamp(m->nframe, 0, m->numframes-1); } - g = m->scale * g * (1.f/64.f); - f = m->scale * f * (1.f/64.f); + m0.z = m0.y = m0.x = g = m->scale * g * (1.f/64.f); + m1.z = m1.y = m1.x = f = m->scale * f * (1.f/64.f); - m0.x = g; m0.y = g; m0.z = g; - m1.x = f; m1.y = f; m1.z = f; - - a0.x = a0.y = 0; a0.z = m->zadd*m->scale; + a0.x = a0.y = 0; + a0.z = m->zadd * m->scale; // Parkar: Moved up to be able to use k0 for the y-flipping code k0 = (float)tspr->z; @@ -2028,11 +2025,11 @@ static int32_t polymost_md3draw(md3model_t *m, const spritetype *tspr) // Note: These SCREEN_FACTORS will be neutralized in axes offset // calculations below again, but are needed for the base offsets. - f = (65536.f*512.f)/((float)xdimen*viewingrange); - g = 32.f/((float)xdimen*gxyaspect); + f = (65536.f*512.f)/(fxdimen*fviewingrange); + g = 32.f/(fxdimen*gxyaspect); m0.y *= f; m1.y *= f; a0.y = (((float)(tspr->x-globalposx))* (1.f/1024.f) + a0.y)*f; - m0.x *=-f; m1.x *=-f; a0.x = (((float)(k1 -globalposy))* -(1.f/1024.f) + a0.x)*-f; - m0.z *= g; m1.z *= g; a0.z = (((float)(k0 -globalposz))* -(1.f/16384.f) + a0.z)*g; + m0.x *=-f; m1.x *=-f; a0.x = ((k1 -fglobalposy) * -(1.f/1024.f) + a0.x)*-f; + m0.z *= g; m1.z *= g; a0.z = ((k0 -fglobalposz) * -(1.f/16384.f) + a0.z)*g; md3_vox_calcmat_common(tspr, &a0, f, mat); @@ -2052,11 +2049,23 @@ static int32_t polymost_md3draw(md3model_t *m, const spritetype *tspr) // to use Z-buffer hacks to hide overdraw problems with the // flat-tsprite-on-floor shadows. // is this still needed? + if (tspr->cstat&CSTAT_SPRITE_MDHACK) { - bglDepthFunc(GL_LESS); - bglDepthRange(-.0001, .9999); +#ifdef __arm__ // GL ES has a glDepthRangef and the loss of precision is OK there + float f = (float) (tspr->owner + 1) * (FLT_EPSILON * 8.0); + if (f != 0.0) f *= 1.f/(float) (sepldist(globalposx - tspr->x, globalposy - tspr->y)>>5); + bglDepthFunc(GL_LEQUAL); + glDepthRangef(0.f - f, 1.f - f); +#else + double f = (double) (tspr->owner + 1) * (FLT_EPSILON * 8.0); + if (f != 0.0) f *= 1.0/(double) (sepldist(globalposx - tspr->x, globalposy - tspr->y)>>5); + bglBlendFunc(GL_SRC_ALPHA, GL_DST_COLOR); + bglDepthFunc(GL_LEQUAL); + bglDepthRange(0.0 - f, 1.0 - f); +#endif } + bglPushAttrib(GL_POLYGON_BIT); if ((grhalfxdown10x >= 0) ^((globalorientation&8) != 0) ^((globalorientation&4) != 0)) bglFrontFace(GL_CW); else bglFrontFace(GL_CCW); bglEnable(GL_CULL_FACE); @@ -2105,7 +2114,7 @@ static int32_t polymost_md3draw(md3model_t *m, const spritetype *tspr) // PLAG: Cleaner model rotation code if (sext->pitch || sext->roll) { - float f = 1.f/((float)(xdimen*viewingrange)*(m0.x+m1.x)*(2560.f*(1.f/(65536.f*1280.f)))); + float f = 1.f/(fxdimen * fviewingrange) * (m0.x+m1.x) * (2560.f * (1.f/(65536.f*1280.f))); Bmemset(&a0, 0, sizeof(a0)); if (sext->xoff) @@ -2115,7 +2124,7 @@ static int32_t polymost_md3draw(md3model_t *m, const spritetype *tspr) a0.y = (float) sext->yoff * f; if ((sext->zoff) && !(tspr->cstat&CSTAT_SPRITE_MDHACK)) // Compare with SCREEN_FACTORS above - a0.z = (float)sext->zoff / (655360.f * (m0.z+m1.z) * (gxyaspect*xdimen*(1.f/1280.f))); + a0.z = (float)sext->zoff / (655360.f * (m0.z+m1.z) * (gxyaspect*fxdimen*(1.f/1280.f))); k0 = (float)sintable[(sext->pitch+512)&2047] * (1.f/16384.f); k1 = (float)sintable[sext->pitch&2047] * (1.f/16384.f); @@ -2208,87 +2217,95 @@ static int32_t polymost_md3draw(md3model_t *m, const spritetype *tspr) //i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,lpal)].skinnum,surfi); //hack for testing multiple surfaces per MD3 bglBindTexture(GL_TEXTURE_2D, i); - if (r_detailmapping && !(tspr->cstat&CSTAT_SPRITE_MDHACK)) - i = mdloadskin((md2model_t *)m,tile2model[Ptile2tile(tspr->picnum,lpal)].skinnum,DETAILPAL,surfi); - else - i = 0; - - if (i) + if (!(tspr->cstat&CSTAT_SPRITE_MDHACK)) { - mdskinmap_t *sk; + i = r_detailmapping ? mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, DETAILPAL, surfi) : 0; - polymost_setupdetailtexture(++texunits, i); - - for (sk = m->skinmap; sk; sk = sk->next) - if ((int32_t)sk->palette == DETAILPAL && sk->skinnum == tile2model[Ptile2tile(tspr->picnum,lpal)].skinnum && sk->surfnum == surfi) - f = sk->param; - - bglMatrixMode(GL_TEXTURE); - bglLoadIdentity(); - bglScalef(f, f, 1.0f); - bglMatrixMode(GL_MODELVIEW); - } - - if (r_glowmapping && !(tspr->cstat&CSTAT_SPRITE_MDHACK)) - { - i = mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, GLOWPAL, surfi); if (i) - polymost_setupglowtexture(++texunits, i); - } - - if (r_vertexarrays && r_vbos) - { - bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexvbos[curvbo]); - vbotemp = bglMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); - indexhandle = (uint16_t *)vbotemp; - } - else - indexhandle = m->vindexes; - - //PLAG: delayed polygon-level sorted rendering - if (m->usesalpha && !(tspr->cstat & CSTAT_SPRITE_MDHACK)) - { - vec3f_t fp, fp1, fp2, vlt0, vlt1, vlt2; - - for (i=s->numtris-1; i>=0; i--) { - vlt0 = vertlist[s->tris[i].i[0]]; - vlt1 = vertlist[s->tris[i].i[1]]; - vlt2 = vertlist[s->tris[i].i[2]]; + mdskinmap_t *sk; - // Matrix multiplication - ugly but clear - fp.x = (vlt0.x * mat[0]) + (vlt0.y * mat[4]) + (vlt0.z * mat[8]) + mat[12]; - fp.y = (vlt0.x * mat[1]) + (vlt0.y * mat[5]) + (vlt0.z * mat[9]) + mat[13]; - fp.z = (vlt0.x * mat[2]) + (vlt0.y * mat[6]) + (vlt0.z * mat[10]) + mat[14]; + polymost_setupdetailtexture(++texunits, i); - fp1.x = (vlt1.x * mat[0]) + (vlt1.y * mat[4]) + (vlt1.z * mat[8]) + mat[12]; - fp1.y = (vlt1.x * mat[1]) + (vlt1.y * mat[5]) + (vlt1.z * mat[9]) + mat[13]; - fp1.z = (vlt1.x * mat[2]) + (vlt1.y * mat[6]) + (vlt1.z * mat[10]) + mat[14]; + for (sk = m->skinmap; sk; sk = sk->next) + if ((int32_t) sk->palette == DETAILPAL && sk->skinnum == tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum && sk->surfnum == surfi) + f = sk->param; - fp2.x = (vlt2.x * mat[0]) + (vlt2.y * mat[4]) + (vlt2.z * mat[8]) + mat[12]; - fp2.y = (vlt2.x * mat[1]) + (vlt2.y * mat[5]) + (vlt2.z * mat[9]) + mat[13]; - fp2.z = (vlt2.x * mat[2]) + (vlt2.y * mat[6]) + (vlt2.z * mat[10]) + mat[14]; - - f = (fp.x * fp.x) + (fp.y * fp.y) + (fp.z * fp.z); - - g = (fp1.x * fp1.x) + (fp1.y * fp1.y) + (fp1.z * fp1.z); - if (f > g) - f = g; - g = (fp2.x * fp2.x) + (fp2.y * fp2.y) + (fp2.z * fp2.z); - if (f > g) - f = g; - - m->maxdepths[i] = f; - m->indexes[i] = i; + bglMatrixMode(GL_TEXTURE); + bglLoadIdentity(); + bglScalef(f, f, 1.0f); + bglMatrixMode(GL_MODELVIEW); } - // dichotomic recursive sorting - about 100x less iterations than bubblesort - quicksort(m->indexes, m->maxdepths, 0, s->numtris - 1); + i = r_glowmapping ? mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, GLOWPAL, surfi) : 0; - md3draw_handle_triangles(s, indexhandle, texunits, m); + if (i) + polymost_setupglowtexture(++texunits, i); + + if (r_vertexarrays && r_vbos) + { + bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexvbos[curvbo]); + vbotemp = bglMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + indexhandle = (uint16_t *) vbotemp; + } + else + indexhandle = m->vindexes; + + //PLAG: delayed polygon-level sorted rendering + + if (m->usesalpha) + { + vec3f_t fp, fp1, fp2, vlt0, vlt1, vlt2; + + for (i=s->numtris-1; i>=0; i--) + { + vlt0 = vertlist[s->tris[i].i[0]]; + vlt1 = vertlist[s->tris[i].i[1]]; + vlt2 = vertlist[s->tris[i].i[2]]; + + // Matrix multiplication - ugly but clear + fp.x = (vlt0.x * mat[0]) + (vlt0.y * mat[4]) + (vlt0.z * mat[8]) + mat[12]; + fp.y = (vlt0.x * mat[1]) + (vlt0.y * mat[5]) + (vlt0.z * mat[9]) + mat[13]; + fp.z = (vlt0.x * mat[2]) + (vlt0.y * mat[6]) + (vlt0.z * mat[10]) + mat[14]; + + fp1.x = (vlt1.x * mat[0]) + (vlt1.y * mat[4]) + (vlt1.z * mat[8]) + mat[12]; + fp1.y = (vlt1.x * mat[1]) + (vlt1.y * mat[5]) + (vlt1.z * mat[9]) + mat[13]; + fp1.z = (vlt1.x * mat[2]) + (vlt1.y * mat[6]) + (vlt1.z * mat[10]) + mat[14]; + + fp2.x = (vlt2.x * mat[0]) + (vlt2.y * mat[4]) + (vlt2.z * mat[8]) + mat[12]; + fp2.y = (vlt2.x * mat[1]) + (vlt2.y * mat[5]) + (vlt2.z * mat[9]) + mat[13]; + fp2.z = (vlt2.x * mat[2]) + (vlt2.y * mat[6]) + (vlt2.z * mat[10]) + mat[14]; + + f = (fp.x * fp.x) + (fp.y * fp.y) + (fp.z * fp.z); + + g = (fp1.x * fp1.x) + (fp1.y * fp1.y) + (fp1.z * fp1.z); + if (f > g) + f = g; + g = (fp2.x * fp2.x) + (fp2.y * fp2.y) + (fp2.z * fp2.z); + if (f > g) + f = g; + + m->maxdepths[i] = f; + m->indexes[i] = i; + } + + // dichotomic recursive sorting - about 100x less iterations than bubblesort + quicksort(m->indexes, m->maxdepths, 0, s->numtris - 1); + } + + md3draw_handle_triangles(s, indexhandle, texunits, m->usesalpha ? m : NULL); } else { + if (r_vertexarrays && r_vbos) + { + bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexvbos[curvbo]); + vbotemp = bglMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + indexhandle = (uint16_t *) vbotemp; + } + else + indexhandle = m->vindexes; + md3draw_handle_triangles(s, indexhandle, texunits, NULL); } diff --git a/polymer/eduke32/build/src/polymost.c b/polymer/eduke32/build/src/polymost.c index f250835c8..5a8a43540 100644 --- a/polymer/eduke32/build/src/polymost.c +++ b/polymer/eduke32/build/src/polymost.c @@ -128,7 +128,8 @@ float gtang = 0.f; static double guo, gux, guy; //Screen-based texture mapping parameters static double gvo, gvx, gvy; static double gdo, gdx, gdy; -static float fcosglobalang, fsinglobalang, fglobalposx, fglobalposy; +float fcosglobalang, fsinglobalang, fglobalposx, fglobalposy, fglobalposz; +float fxdim, fydim, fxdimen, fydimen, fviewingrange; static int32_t preview_mouseaim=0; // when 1, displays a CROSSHAIR tsprite at the _real_ aimed position #ifdef USE_OPENGL @@ -197,7 +198,7 @@ void drawline2d(float x0, float y0, float x1, float y1, char col) uint32_t up16; dx = x1-x0; dy = y1-y0; if ((dx == 0) && (dy == 0)) return; - fxres = (float)xdimen; fyres = (float)ydimen; + fxres = fxdimen; fyres = fydimen; if (x0 >= fxres) { if (x1 >= fxres) return; y0 += (fxres-x0)*dy/dx; x0 = fxres; } else if (x0 < 0) { if (x1 < 0) return; y0 += (0-x0)*dy/dx; x0 = 0; } if (x1 >= fxres) { y1 += (fxres-x1)*dy/dx; x1 = fxres; } @@ -674,9 +675,9 @@ static void resizeglcheck(void) bglMatrixMode(GL_PROJECTION); memset(m,0,sizeof(m)); - m[0][0] = (float)ydimen / ratio; m[0][2] = 1.f; - m[1][1] = (float)xdimen; m[1][2] = 1.f; - m[2][2] = 1.f; m[2][3] = (float)ydimen / ratio; + m[0][0] = fydimen / ratio; m[0][2] = 1.f; + m[1][1] = fxdimen; m[1][2] = 1.f; + m[2][2] = 1.f; m[2][3] = fydimen / ratio; m[3][2] =-1.f; bglLoadMatrixf(&m[0][0]); @@ -2068,7 +2069,8 @@ void domost(float x0, float y0, float x1, float y1) void polymost_editorfunc(void) { - vec3_t v, o, o2; + vec3_t v; + vec3f_t o, o2; int32_t cz, fz; hitdata_t hit; vec3_t vect; @@ -2089,9 +2091,9 @@ void polymost_editorfunc(void) o2.z = o.y*gchang + o.z*gshang; //Standard Left/right rotation - v.x = (int32_t) (o2.x*fcosglobalang - o2.y*fsinglobalang); - v.y = (int32_t) (o2.x*fsinglobalang + o2.y*fcosglobalang); - v.z = (int32_t) (o2.z*16384.f); + v.x = Blrintf (o2.x*fcosglobalang - o2.y*fsinglobalang); + v.y = Blrintf (o2.x*fsinglobalang + o2.y*fcosglobalang); + v.z = Blrintf (o2.z*16384.f); vect.x = globalposx; vect.y = globalposy; @@ -2515,9 +2517,9 @@ static void polymost_drawalls(int32_t bunch) { // g_nodraw = 1; - dd[0] = (float)xdimen*.0000001f; //Adjust sky depth based on screen size! + dd[0] = fxdimen*.0000001f; //Adjust sky depth based on screen size! t = (float)((1<<(picsiz[globalpicnum]&15))<>1)/*+g_psky.yoffs*/)) - vv[1]*ghoriz; i = (1<<(picsiz[globalpicnum]>>4)); if (i != tilesiz[globalpicnum].y) i += i; @@ -2550,7 +2552,7 @@ static void polymost_drawalls(int32_t bunch) gvx = 0; gvy = vv[1]; gvo = vv[0]; i = globalpicnum; r = (fy1-fy0)/(x1-x0); //slope of line - oy = ((float)viewingrange)/(ghalfx*256.f); oz = 1.f/oy; + oy = fviewingrange/(ghalfx*256.f); oz = 1.f/oy; y = ((((int32_t)((x0-ghalfx)*oy))+globalang)>>(11-dapskybits)); fx = x0; @@ -2657,8 +2659,8 @@ static void polymost_drawalls(int32_t bunch) gdx = 0; gdy = gxyaspect*(1.f/4194304.f); gdo = -ghoriz*gdy; - gux = (double)ft[3]*((float)viewingrange)*(-1.0/65536.0); - gvx = (double)ft[2]*((float)viewingrange)*(-1.0/65536.0); + gux = (double)ft[3]*fviewingrange*(-1.0/65536.0); + gvx = (double)ft[2]*fviewingrange*(-1.0/65536.0); guy = ft[0]*gdy; gvy = ft[1]*gdy; guo = ft[0]*gdo; gvo = ft[1]*gdo; guo += (ft[2]-gux)*ghalfx; @@ -2789,9 +2791,9 @@ static void polymost_drawalls(int32_t bunch) // g_nodraw = 1; //Render for parallaxtype == 0 / paper-sky - dd[0] = (float)xdimen*.0000001f; //Adjust sky depth based on screen size! + dd[0] = fxdimen*.0000001f; //Adjust sky depth based on screen size! t = (float)((1<<(picsiz[globalpicnum]&15))<>1)/*+g_psky.yoffs*/)) - vv[1]*ghoriz; i = (1<<(picsiz[globalpicnum]>>4)); if (i != tilesiz[globalpicnum].y) i += i; @@ -2826,7 +2828,7 @@ static void polymost_drawalls(int32_t bunch) gvx = 0; gvy = vv[1]; gvo = vv[0]; i = globalpicnum; r = (cy1-cy0)/(x1-x0); //slope of line - oy = ((float)viewingrange)/(ghalfx*256.f); oz = 1.f/oy; + oy = fviewingrange/(ghalfx*256.f); oz = 1.f/oy; y = ((((int32_t)((x0-ghalfx)*oy))+globalang)>>(11-dapskybits)); fx = x0; @@ -2935,8 +2937,8 @@ static void polymost_drawalls(int32_t bunch) gdx = 0; gdy = gxyaspect*(-1.f/4194304.f); gdo = -ghoriz*gdy; - gux = ft[3]*((float)viewingrange)*(-1.0/65536.0); - gvx = ft[2]*((float)viewingrange)*(-1.0/65536.0); + gux = ft[3]*fviewingrange*(-1.0/65536.0); + gvx = ft[2]*fviewingrange*(-1.0/65536.0); guy = ft[0]*gdy; gvy = ft[1]*gdy; guo = ft[0]*gdo; gvo = ft[1]*gdo; guo += (ft[2]-gux)*ghalfx; @@ -3000,8 +3002,8 @@ static void polymost_drawalls(int32_t bunch) gdx = 0; gdy = gxyaspect*(1.f/4194304.f); gdo = -ghoriz*gdy; - gux = ft[3]*((float)viewingrange)*(-1.0/65536.0); - gvx = ft[2]*((float)viewingrange)*(-1.0/65536.0); + gux = ft[3]*fviewingrange*(-1.0/65536.0); + gvx = ft[2]*fviewingrange*(-1.0/65536.0); guy = ft[0]*gdy; gvy = ft[1]*gdy; guo = ft[0]*gdo; gvo = ft[1]*gdo; guo += (ft[2]-gux)*ghalfx; @@ -3436,28 +3438,34 @@ void polymost_drawrooms() //Polymost supports true look up/down :) Here, we convert horizon to angle. //gchang&gshang are cos&sin of this angle (respectively) + fxdim = (float) xdim; + fydim = (float) ydim; + fxdimen = (float) xdimen; + fydimen = (float) ydimen; fglobalposx = (float) globalposx; fglobalposy = (float) globalposy; + fglobalposz = (float) globalposz; + fviewingrange = (float) viewingrange; gyxscale = ((float)xdimenscale)*(1.0f/131072.f); - gxyaspect = ((float)xyaspect*(float)viewingrange)*(5.f/(65536.f*262144.f)); - gviewxrange = ((float)viewingrange)*((float)xdimen)/(32768.f*1024.f); + gxyaspect = ((float)xyaspect*fviewingrange)*(5.f/(65536.f*262144.f)); + gviewxrange = fviewingrange * fxdimen * (1.f/(32768.f*1024.f)); fcosglobalang = (float) cosglobalang; gcosang = fcosglobalang*(1.0f/262144.f); fsinglobalang = (float) singlobalang; gsinang = fsinglobalang*(1.0f/262144.f); - gcosang2 = gcosang*((float)viewingrange)*(1.0f/65536.f); - gsinang2 = gsinang*((float)viewingrange)*(1.0f/65536.f); - ghalfx = (float)halfxdimen; + gcosang2 = gcosang * (fviewingrange * (1.0f/65536.f)); + gsinang2 = gsinang * (fviewingrange * (1.0f/65536.f)); + ghalfx = fxdimen * .5f; grhalfxdown10 = 1.f/(ghalfx*1024.f); ghoriz = (float)globalhoriz; gvisibility = ((float)globalvisibility)*FOGSCALE; //global cos/sin height angle - r = ((float)(ydimen>>1)-ghoriz); + r = fydimen * .5f - ghoriz; gshang = r/Bsqrtf(r*r+ghalfx*ghalfx); gchang = Bsqrtf(1.f-gshang*gshang); - ghoriz = (float)(ydimen>>1); + ghoriz = fydimen * .5f; //global cos/sin tilt angle gctang = cos(gtang); @@ -3879,7 +3887,7 @@ void polymost_drawsprite(int32_t snum) sx0 = ghalfx*xp0*ryp0 + ghalfx; sy0 = ((float)(tspr->z-globalposz))*gyxscale*ryp0 + ghoriz; - f = ryp0*(float)xdimen*(1.0f/160.f); + f = ryp0*fxdimen*(1.0f/160.f); fx = ((float)tspr->xrepeat)*f; fy = ((float)tspr->yrepeat)*f*((float)yxaspect*(1.0f/65536.f)); sx0 -= fx*(float)xoff; if (tsizx&1) sx0 += fx*0.5f; @@ -4161,8 +4169,8 @@ void polymost_drawsprite(int32_t snum) ft[3] = singlobalang*fx - cosglobalang*fy; ft[0] = ((float)(globalposy-yv))*fy + ((float)(globalposx-xv))*fx; ft[1] = ((float)(globalposx-xv))*fy - ((float)(globalposy-yv))*fx; - gux = (float)ft[3]*((float)viewingrange)/(-65536.f*262144.f); - gvx = (float)ft[2]*((float)viewingrange)/(-65536.f*262144.f); + gux = (float)ft[3]*fviewingrange/(-65536.f*262144.f); + gvx = (float)ft[2]*fviewingrange/(-65536.f*262144.f); guy = (double)ft[0]*gdy; gvy = (double)ft[1]*gdy; guo = (double)ft[0]*gdo; gvo = (double)ft[1]*gdo; guo += (double)(ft[2]*(1.0f/262144.f)-gux)*ghalfx; @@ -4328,9 +4336,9 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a, tspr.xrepeat = tspr.yrepeat = 5; - vec2.x = (float)globalposx + (gcosang*vec1.z - gsinang*vec1.x)*2560.f; - vec2.y = (float)globalposy + (gsinang*vec1.z + gcosang*vec1.x)*2560.f; - vec2.z = (float)globalposz + (vec1.y*(2560.f*0.8f)); + vec2.x = fglobalposx + (gcosang*vec1.z - gsinang*vec1.x)*2560.f; + vec2.y = fglobalposy + (gsinang*vec1.z + gcosang*vec1.x)*2560.f; + vec2.z = fglobalposz + (vec1.y*(2560.f*0.8f)); Bmemcpy(&tspr.x, &vec2, sizeof(vec3f_t)); } @@ -4367,15 +4375,15 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a, if (fov != -1) f = 1.f/tanf(((float)fov * 2.56f) * ((.5f * PI) * (1.0f/2048.f))); - m[0][0] = f*(float) ydimen; m[0][2] = 1.f; - m[1][1] = f*(float) xdimen; m[1][2] = 1.f; - m[2][2] = 1.f; m[2][3] = (float) ydimen; + m[0][0] = f*fydimen; m[0][2] = 1.f; + m[1][1] = f*fxdimen; m[1][2] = 1.f; + m[2][2] = 1.f; m[2][3] = fydimen; m[3][2] =-1.f; } else { m[0][0] = m[2][3] = 1.f; - m[1][1] = ((float) xdim)/((float) ydim); + m[1][1] = fxdim/fydim; m[2][2] = 1.0001f; m[3][2] = 1-m[2][2]; } @@ -4492,10 +4500,10 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 ogpicnum = globalpicnum; globalpicnum = picnum; ogshade = globalshade; globalshade = dashade; ogpal = globalpal; globalpal = (int32_t)((uint8_t)dapalnum); - oghalfx = ghalfx; ghalfx = (float)(xdim>>1); + oghalfx = ghalfx; ghalfx = fxdim * .5f; ogrhalfxdown10 = grhalfxdown10; grhalfxdown10 = 1.f/(ghalfx*1024.f); ogrhalfxdown10x = grhalfxdown10x; grhalfxdown10x = grhalfxdown10; - oghoriz = ghoriz; ghoriz = (float)(ydim>>1); + oghoriz = ghoriz; ghoriz = fydim * .5f; ofoffset = frameoffset; frameoffset = frameplace; ogchang = gchang; gchang = 1.f; ogshang = gshang; gshang = 0.f; @@ -4508,7 +4516,7 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 bglViewport(0,0,xdim,ydim); glox1 = -1; //Force fullscreen (glox1=-1 forces it to restore) bglMatrixMode(GL_PROJECTION); memset(m,0,sizeof(m)); - m[0][0] = m[2][3] = 1.0f; m[1][1] = ((float)xdim)/((float)ydim); m[2][2] = 1.0001f; m[3][2] = 1-m[2][2]; + m[0][0] = m[2][3] = 1.0f; m[1][1] = fxdim/fydim; m[2][2] = 1.0001f; m[3][2] = 1-m[2][2]; bglPushMatrix(); bglLoadMatrixf(&m[0][0]); bglMatrixMode(GL_MODELVIEW); bglPushMatrix(); @@ -4855,8 +4863,8 @@ void polymost_fillpolygon(int32_t npoints) gvx = ((float)asm2)*(1.f/4294967296.f); guy = ((float)globalx1)*(1.f/4294967296.f); gvy = ((float)globaly2)*(-1.f/4294967296.f); - guo = (((float) xdim)*gux + ((float) ydim)*guy)*-0.5f + (fglobalposx)*(1.f/4294967296.f); - gvo = (((float) xdim)*gvx + ((float) ydim)*gvy)*-0.5f - (fglobalposy)*(1.f/4294967296.f); + guo = (fxdim*gux + fydim*guy)*-0.5f + fglobalposx * (1.f/4294967296.f); + gvo = (fxdim*gvx + fydim*gvy)*-0.5f - fglobalposy * (1.f/4294967296.f); //Convert int32_t to float (in-place) for (i=npoints-1; i>=0; i--) {