From 39c818d05339a1a6bfe86164dfc568d4065d1936 Mon Sep 17 00:00:00 2001 From: Plagman Date: Thu, 15 Feb 2007 22:26:50 +0000 Subject: [PATCH] Avoid loading textures two times. git-svn-id: https://svn.eduke32.com/eduke32@499 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/build/src/defs.c | 2 +- polymer/build/src/hightile.c | 7 +++++-- polymer/build/src/mdsprite.c | 21 ++++++++++++++++----- polymer/build/src/polymost.c | 22 +++++++++++++++++++--- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/polymer/build/src/defs.c b/polymer/build/src/defs.c index d348bf763..f95418da7 100644 --- a/polymer/build/src/defs.c +++ b/polymer/build/src/defs.c @@ -1205,7 +1205,7 @@ static int defsparser(scriptfile *script) break; } else kclose(i); - hicsetsubsttex(tile,DETAILPAL,fn,detailscale,flags); + hicsetsubsttex(tile,DETAILPAL,fn,(1.0f / detailscale),flags); } break; case T_GLOW: { char *glowtokptr = script->ltextptr, *glowend; diff --git a/polymer/build/src/hightile.c b/polymer/build/src/hightile.c index f1ae5caa4..a377b6495 100644 --- a/polymer/build/src/hightile.c +++ b/polymer/build/src/hightile.c @@ -46,7 +46,7 @@ static hicreplctyp * hicfindsubst(long picnum, long palnum, long skybox) } } - if (!palnum || palnum == DETAILPAL) break; + if (!palnum || palnum >= (MAXPALOOKUPS - RESERVEDPALS)) break; palnum = 0; } while (1); @@ -145,7 +145,10 @@ int hicsetsubsttex(long picnum, long palnum, char *filen, float alphacut, char f return -1; } hrn->ignore = 0; - hrn->alphacut = min(alphacut,1.0); + if (palnum < (MAXPALOOKUPS - RESERVEDPALS)) + hrn->alphacut = min(alphacut,1.0); + else + hrn->alphacut = alphacut; hrn->flags = flags; if (hr == NULL) { hrn->next = hicreplc[picnum]; diff --git a/polymer/build/src/mdsprite.c b/polymer/build/src/mdsprite.c index 6a780bf6e..89052aa8f 100644 --- a/polymer/build/src/mdsprite.c +++ b/polymer/build/src/mdsprite.c @@ -661,7 +661,7 @@ failure: // --------------------------------------------------- JONOF'S COMPRESSED TEXTURE CACHE STUFF //Note: even though it says md2model, it works for both md2model&md3model -static long mdloadskin (md2model *m, int number, int pal, int surf, int exact) +static long mdloadskin (md2model *m, int number, int pal, int surf) { long i,j, fptr=0, bpl, xsiz=0, ysiz=0, osizx, osizy, texfmt = GL_RGBA, intexfmt = GL_RGBA; char *skinfile, hasalpha, fn[BMAX_PATH+65]; @@ -696,7 +696,7 @@ static long mdloadskin (md2model *m, int number, int pal, int surf, int exact) } if (!sk) { - if (exact) + if (pal >= (MAXPALOOKUPS - RESERVEDPALS)) return (0); if (skzero) { @@ -717,6 +717,17 @@ static long mdloadskin (md2model *m, int number, int pal, int surf, int exact) if (!skinfile[0]) return 0; if (*texidx) return *texidx; + + // possibly fetch an already loaded multitexture :_) + if (pal >= (MAXPALOOKUPS - RESERVEDPALS)) + for (i=0;iskinmap; skzero; skzero = skzero->next) + if (!Bstrcasecmp(skzero->fn, sk->fn) && skzero->texid[hictinting[pal].f]) + { + sk->texid[hictinting[pal].f] = skzero->texid[hictinting[pal].f]; + return sk->texid[hictinting[pal].f]; + } + *texidx = 0; if ((filh = kopen4load(fn, 0)) < 0) { @@ -1488,12 +1499,12 @@ if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; } mat[3] = mat[7] = mat[11] = 0.f; mat[15] = 1.f; bglLoadMatrixf(mat); // PLAG: End - i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,globalpal,surfi,0); if (!i) continue; + i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,globalpal,surfi); if (!i) continue; //i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,surfi); //hack for testing multiple surfaces per MD3 bglBindTexture(GL_TEXTURE_2D, i); /*if (r_detailmapping && !r_depthpeeling && indrawroomsandmasks) - i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,DETAILPAL,surfi,1); + i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,DETAILPAL,surfi); else i = 0; @@ -1532,7 +1543,7 @@ if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; } }*/ if (r_glowmapping && !r_depthpeeling && indrawroomsandmasks) - i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,GLOWPAL,surfi,1); + i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,GLOWPAL,surfi); else i = 0; diff --git a/polymer/build/src/polymost.c b/polymer/build/src/polymost.c index 3b7a792a8..b8b329f60 100644 --- a/polymer/build/src/polymost.c +++ b/polymer/build/src/polymost.c @@ -357,7 +357,7 @@ pthtyp * gltexcache (long dapicnum, long dapalnum, long dameth) { long i, j; hicreplctyp *si; - pthtyp *pth; + pthtyp *pth, *pth2; j = (dapicnum&(GLTEXCACHEADSIZ-1)); @@ -396,9 +396,25 @@ pthtyp * gltexcache (long dapicnum, long dapalnum, long dameth) } } + pth = (pthtyp *)calloc(1,sizeof(pthtyp)); if (!pth) return NULL; + // possibly fetch an already loaded multitexture :_) + if (dapalnum >= (MAXPALOOKUPS - RESERVEDPALS)) + for (i = (GLTEXCACHEADSIZ - 1); i >= 0; i--) + for (pth2=gltexcachead[i]; pth2; pth2=pth2->next) { + if ((pth2->hicr) && (pth2->hicr->filename) && (Bstrcasecmp(pth2->hicr->filename, si->filename) == 0)) + { + memcpy(pth, pth2, sizeof(pthtyp)); + pth->picnum = dapicnum; + pth->hicr = si; + pth->next = gltexcachead[j]; + gltexcachead[j] = pth; + return(pth); + } + } + if (gloadtile_hi(dapicnum,drawingskybox,si,dameth,pth,1, (si->palnum>0) ? 0 : hictinting[dapalnum].f)) { free(pth); if (drawingskybox) return NULL; @@ -1664,7 +1680,7 @@ void drawpoly (double *dpx, double *dpy, long n, long method) bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); - f = detailpth ? (1.0f / detailpth->hicr->alphacut) : 1.0; + f = detailpth ? detailpth->hicr->alphacut : 1.0; bglMatrixMode(GL_TEXTURE); bglLoadIdentity(); @@ -5424,7 +5440,7 @@ void polymost_precache(long dapicnum, long dapalnum, long datype) j = ((md3model *)models[mid])->head.numsurfs; for (i=0;i<=j;i++) - mdloadskin((md2model*)models[mid], 0, dapalnum, i, 0); + mdloadskin((md2model*)models[mid], 0, dapalnum, i); } #endif }