From e66bec5e31cb86a6b45d8843e482b0b287e675c4 Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sun, 9 Jan 2011 18:53:06 +0000 Subject: [PATCH] Make mapster32 know r_downsize parameter. For best caching performance, this and glusetexcache should be the same as for the game. Highpalookup script can now generate maps equivalent to the current PHRP tint defs. git-svn-id: https://svn.eduke32.com/eduke32@1754 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/src/config.c | 10 +- polymer/eduke32/build/src/mdsprite.c | 38 +++++-- polymer/eduke32/build/src/polymost.c | 39 +++++-- polymer/eduke32/build/src/util/prhighpal.py | 112 ++++++++++++++------ polymer/eduke32/source/premap.c | 64 +++++------ 5 files changed, 175 insertions(+), 88 deletions(-) diff --git a/polymer/eduke32/build/src/config.c b/polymer/eduke32/build/src/config.c index 065b3f093..692dc8b10 100644 --- a/polymer/eduke32/build/src/config.c +++ b/polymer/eduke32/build/src/config.c @@ -172,6 +172,12 @@ int32_t loadsetup(const char *fn) { glanisotropy = Batoi(val); } + if (readconfig(fp, "r_downsize", val, VL) > 0) + { + r_downsize = Batoi(val); + r_downsize = clamp(r_downsize, 0, 5); + r_downsizevar = r_downsize; + } #endif if (readconfig(fp, "gameexecutable", val, VL) > 0) @@ -339,9 +345,11 @@ int32_t writesetup(const char *fn) "; OpenGL mode options\n" "usemodels = %d\n" "usehightile = %d\n" + "; glusetexcache: 0:no, 1:yes, 2:compressed\n" "glusetexcache = %d\n" "gltexfiltermode = %d\n" "glanisotropy = %d\n" + "r_downsize = %d\n" "\n" #endif @@ -500,7 +508,7 @@ int32_t writesetup(const char *fn) editorgridextent, min(max(0, default_grid), 9), #if defined(POLYMOST) && defined(USE_OPENGL) usemodels, usehightile, - glusetexcache, gltexfiltermode, glanisotropy, + glusetexcache, gltexfiltermode, glanisotropy,r_downsize, #endif #ifdef RENDERTYPEWIN maxrefreshfreq, windowpos, windowx, windowy, diff --git a/polymer/eduke32/build/src/mdsprite.c b/polymer/eduke32/build/src/mdsprite.c index fbd066817..ca5efc734 100644 --- a/polymer/eduke32/build/src/mdsprite.c +++ b/polymer/eduke32/build/src/mdsprite.c @@ -500,13 +500,14 @@ static int32_t daskinloader(int32_t filh, intptr_t *fptr, int32_t *bpl, int32_t *bpl = xsiz; *fptr = (intptr_t)pic; *hasalpha = (al != 255); + return 0; } // JONOF'S COMPRESSED TEXTURE CACHE STUFF --------------------------------------------------- int32_t mdloadskin_trytexcache(char *fn, int32_t len, int32_t pal, char effect, texcacheheader *head) { - int32_t fp; + int32_t fp, err=0; char cachefn[BMAX_PATH], *cp; uint8_t mdsum[16]; @@ -576,28 +577,29 @@ int32_t mdloadskin_trytexcache(char *fn, int32_t len, int32_t pal, char effect, if (Bread(cachefilehandle, head, sizeof(texcacheheader)) < (int32_t)sizeof(texcacheheader)) { cachepos += sizeof(texcacheheader); + err = 1; goto failure; } cachepos += sizeof(texcacheheader); } - if (memcmp(head->magic, TEXCACHEMAGIC, 4)) goto failure; + if (memcmp(head->magic, TEXCACHEMAGIC, 4)) { err=2; goto failure; } head->xdim = B_LITTLE32(head->xdim); head->ydim = B_LITTLE32(head->ydim); head->flags = B_LITTLE32(head->flags); head->quality = B_LITTLE32(head->quality); - if (head->quality != r_downsize) goto failure; - if ((head->flags & 4) && glusetexcache != 2) goto failure; - if (!(head->flags & 4) && glusetexcache == 2) goto failure; - if (gltexmaxsize && (head->xdim > (1<ydim > (1<flags & 1)) goto failure; + if (head->quality != r_downsize) { err=3; goto failure; } + if ((head->flags & 4) && glusetexcache != 2) { err=4; goto failure; } + if (!(head->flags & 4) && glusetexcache == 2) { err=5; goto failure; } + if (gltexmaxsize && (head->xdim > (1<ydim > (1<flags & 1)) { err=7; goto failure; } return cachefilehandle; failure: // kclose(fil); - initprintf("cache miss\n"); + initprintf("skin cache miss: %d\n", err); return -1; } @@ -681,6 +683,8 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf) int32_t cachefil = -1, picfillen; texcacheheader cachead; + int32_t startticks, willprint=0; + modelhead=m; // for palmaps if (m->mdnum == 2) surf = 0; @@ -754,6 +758,8 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf) picfillen = kfilelength(filh); kclose(filh); // FIXME: shouldn't have to do this. bug in cache1d.c + startticks = getticks(); + cachefil = mdloadskin_trytexcache(fn, picfillen, pal<<8, (globalnoeffect)?0:(hictinting[pal].f&HICEFFECTMASK), &cachead); if (cachefil >= 0 && !mdloadskin_cached(cachefil, &cachead, &doalloc, texidx, &xsiz, &ysiz, pal)) { @@ -779,6 +785,9 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf) return(0); } else kclose(filh); + + willprint = 1; + if (pal < (MAXPALOOKUPS - RESERVEDPALS)) m->usesalpha = hasalpha; if ((doalloc&3)==1) bglGenTextures(1,(GLuint*)texidx); bglBindTexture(GL_TEXTURE_2D,*texidx); @@ -849,10 +858,21 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf) if (ysiz == pow2long[j]) { i |= 2; } } cachead.flags = (i!=3) | (hasalpha ? 2 : 0); - OSD_Printf("Caching \"%s\"\n",fn); +/// OSD_Printf("Caching \"%s\"\n",fn); writexcache(fn, picfillen, pal<<8, (globalnoeffect)?0:(hictinting[pal].f&HICEFFECTMASK), &cachead); + + if (willprint) + { + OSD_Printf("Load skin: p%d-e%d \"%s\"... cached... %d ms\n", pal, (globalnoeffect)?0:(hictinting[pal].f&HICEFFECTMASK), fn, getticks()-startticks); + willprint = 0; + } + else + OSD_Printf("Cached skin \"%s\"\n", fn); } + if (willprint) + OSD_Printf("Load skin: p%d-e%d \"%s\"... %d ms\n", pal, (globalnoeffect)?0:(hictinting[pal].f&HICEFFECTMASK), fn, getticks()-startticks); + return(*texidx); } diff --git a/polymer/eduke32/build/src/polymost.c b/polymer/eduke32/build/src/polymost.c index 0dced298d..6eb4b727a 100644 --- a/polymer/eduke32/build/src/polymost.c +++ b/polymer/eduke32/build/src/polymost.c @@ -1307,7 +1307,7 @@ void phex(char v, char *s) int32_t trytexcache(char *fn, int32_t len, int32_t dameth, char effect, texcacheheader *head) { - int32_t fp; + int32_t fp, err=0; char cachefn[BMAX_PATH], *cp; uint8_t mdsum[16]; @@ -1366,27 +1366,28 @@ int32_t trytexcache(char *fn, int32_t len, int32_t dameth, char effect, texcache if (Bread(cachefilehandle, head, sizeof(texcacheheader)) < (int32_t)sizeof(texcacheheader)) { cachepos += sizeof(texcacheheader); + err = 1; goto failure; } cachepos += sizeof(texcacheheader); } - if (Bmemcmp(head->magic, TEXCACHEMAGIC, 4)) goto failure; + if (Bmemcmp(head->magic, TEXCACHEMAGIC, 4)) { err=2; goto failure; } head->xdim = B_LITTLE32(head->xdim); head->ydim = B_LITTLE32(head->ydim); head->flags = B_LITTLE32(head->flags); head->quality = B_LITTLE32(head->quality); - if ((head->flags & 4) && glusetexcache != 2) goto failure; - if (!(head->flags & 4) && glusetexcache == 2) goto failure; + if ((head->flags & 4) && glusetexcache != 2) { err=3; goto failure; } + if (!(head->flags & 4) && glusetexcache == 2) { err=4; goto failure; } if (!(head->flags & 8) && head->quality != r_downsize) return -1; // handle nocompress - if (gltexmaxsize && (head->xdim > (1<ydim > (1<flags & 1)) goto failure; + if (gltexmaxsize && (head->xdim > (1<ydim > (1<flags & 1)) { err=6; goto failure; } return cachefilehandle; failure: - initprintf("cache miss\n"); + initprintf("cache miss: %d\n", err); return -1; } @@ -1636,6 +1637,7 @@ failure: return -1; } // --------------------------------------------------- JONOF'S COMPRESSED TEXTURE CACHE STUFF +//static int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp *hicr, int32_t dameth, pthtyp *pth, int32_t doalloc, char effect) { coltype *pic = NULL, *rpptr; @@ -1652,6 +1654,8 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp static char *lastfn = NULL; static int32_t lastsize = 0; + int32_t startticks, didprint=0; + if (!hicr) return -1; if (facen > 0) { @@ -1716,15 +1720,19 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp } pic = (coltype *)Bcalloc(xsiz,ysiz*sizeof(coltype)); if (!pic) { Bfree(picfil); return 1; } + startticks = getticks(); + if (lastpic && lastfn && !Bstrcmp(lastfn,fn)) { -// if (hicprecaching) OSD_Printf("use %4d: p%-3d m%d e%d\n", dapic, dapalnum, dameth, effect); + OSD_Printf("Load tile %4d: p%d-m%d-e%d", dapic, dapalnum, dameth, effect); + didprint=1; Bmemcpy(pic, lastpic, xsiz*ysiz*sizeof(coltype)); } else { -// if (hicprecaching) OSD_Printf("rend %4d: p%-3d m%d e%d: `%s'\n", dapic, dapalnum, dameth, effect, fn); if (kprender(picfil,picfillen,(intptr_t)pic,xsiz*sizeof(coltype),xsiz,ysiz,0,0)) { Bfree(picfil); Bfree(pic); return -2; } + OSD_Printf("Load tile %4d: p%d-m%d-e%d \"%s\"", dapic, dapalnum, dameth, effect, fn); + didprint=1; if (hicprecaching) { @@ -1889,10 +1897,21 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp if (ysiz == pow2long[j]) { x |= 2; } } cachead.flags = (x!=3) | (hasalpha != 255 ? 2 : 0) | (hicr->flags & 16?8:0); // handle nocompress - OSD_Printf("Caching \"%s\"\n", fn); +/// OSD_Printf("Caching \"%s\"\n", fn); writexcache(fn, picfillen+(dapalnum<<8), dameth, effect, &cachead); + + if (didprint) + { + OSD_Printf("... cached... %d ms\n", getticks()-startticks); + didprint = 0; + } + else + OSD_Printf("Cached \"%s\"\n", fn); } + if (didprint) + OSD_Printf("... %d ms\n", getticks()-startticks); + return 0; } diff --git a/polymer/eduke32/build/src/util/prhighpal.py b/polymer/eduke32/build/src/util/prhighpal.py index 8c14913d2..442f815c4 100755 --- a/polymer/eduke32/build/src/util/prhighpal.py +++ b/polymer/eduke32/build/src/util/prhighpal.py @@ -2,7 +2,7 @@ import sys; -from numpy import array, zeros, ones, arange +from numpy import array, zeros, ones, arange, uint32 from numpy import vstack, hstack, hsplit, dstack, dsplit from PIL.Image import frombuffer @@ -66,7 +66,8 @@ def showpalimg(im): ## port of Octave's rbg2hsv def rgb2hsv(im): - im = imitof(im); + if (im.dtype=='uint8'): + im = imitof(im); r, g, b = im[..., 0], im[..., 1], im[..., 2]; s, v = im.min(2), im.max(2); @@ -117,11 +118,16 @@ def hsv2rgb(imh): def imftoi(im): + im = im.copy(); + if (im.dtype=='uint8'): + return im im *= CONVFACT; im[im>255] = 255; return im.astype('uint8'); def imitof(im): + if (im.dtype=='float32'): + return im.copy(); return im.astype('float32')/CONVFACT; @@ -144,13 +150,54 @@ BASEPALHSV should the precomputed HSV representation of BASEPAL." # all true mask will be used unless overridden mask = ones(h.shape, 'bool'); -# plagman: - if (pal==1): - h[:] = 0.66; - elif (pal==6): - h[:] = 0.33; - v = 1.0 - v; +## PHRP r176 defs: +# +# tint { pal 1 red 100 green 120 blue 148 flags 1 } +# tint { pal 2 red 255 green 48 blue 0 flags 0 } +# tint { pal 4 red 0 green 0 blue 0 flags 0 } +# tint { pal 6 red 224 green 255 blue 112 flags 3 } +# tint { pal 7 red 172 green 157 blue 140 flags 0 } +# tint { pal 8 red 199 green 226 blue 113 flags 1 } +# +# bit 1: greyscale (max) +# bit 2: invert (255-x) +# colorization: min(int(C*C')/64, 255) + + if (pal in [1,2,4,6,7,8]): + rgbf = { 1: [100, 120, 148, 1], + 2: [255, 48, 0, 0], + 4: [0, 0, 0, 0], + 6: [224, 255, 112, 3], + 7: [172, 157, 140, 0], + 8: [199, 226, 113, 1]} + + newrgb = basepal.astype('uint32'); + + flags = rgbf[pal][3] + + if (flags&1): # greyscale + newrgb = newrgb.max(2); + newrgb = dstack((newrgb, newrgb, newrgb)).copy(); + + if (flags&2): # invert + newrgb = 255-newrgb; + + # colorize + for i in range(3): + newrgb[:,:,i] *= rgbf[pal][i] + newrgb[:,:,i] /= 255 + newrgb[newrgb>255] = 255 + + return newrgb.astype('uint8'); + +# plagman: +# if (pal==1): +# h[:] = 0.66; + +# elif (pal==6): +# h[:] = 0.33; +# v = 1.0 - v; elif (pal==20): m1 = ((h>0.6) & (h<0.7)); @@ -171,35 +218,39 @@ BASEPALHSV should the precomputed HSV representation of BASEPAL." # helixhorned: elif (pal==11): mask = bluemask; - h[:] = green; - s += 0.1; + h[mask] = green; + s[mask] += 0.1; elif (pal==12): mask = bluemask; - h[:] = 0.0; - s[:] = 0.0; + h[mask] = 0.0; + s[mask] = 0.0; elif (pal==13): mask = bluemask; - h[:] = 0.0; - s[:] = 0.0; - v *= 0.7; + h[mask] = 0.0; + s[mask] = 0.0; + v[mask] *= 0.7; elif (pal==16): mask = bluemask; - s += 0.1; - v -= 0.1; + s[mask] += 0.1; + v[mask] -= 0.1; elif (pal==21): mask = bluemask; - h[:] = red; - s += 0.3; + h[mask] = red; + s[mask] += 0.3; elif (pal==23): mask = bluemask; - h[:] = yellow; - s += 0.12; - v *= 1.15; + h[mask] = yellow; + s[mask] += 0.12; + v[mask] *= 1.15; + + elif (pal==99): + mask = bluemask; + v[mask] = 0; # user: # ... @@ -210,9 +261,11 @@ BASEPALHSV should the precomputed HSV representation of BASEPAL." # --- newrgb = hsv2rgb(dstack((h, s, v))); - r = mask*newrgb[:,:,0] + (~mask)*basepal[:,:,0]; - g = mask*newrgb[:,:,1] + (~mask)*basepal[:,:,1]; - b = mask*newrgb[:,:,2] + (~mask)*basepal[:,:,2]; + nmask = ~mask; + + r = mask*newrgb[:,:,0] + nmask*basepal[:,:,0]; + g = mask*newrgb[:,:,1] + nmask*basepal[:,:,1]; + b = mask*newrgb[:,:,2] + nmask*basepal[:,:,2]; # PIL doesn't seem to like views/shallow copies return dstack((r, g, b)).copy(); @@ -223,21 +276,18 @@ if (__name__ == "__main__"): argc = len(sys.argv); if (argc == 1): - print "Usage: python prhighpal.py " + print "Usage: python prhighpal.py (palnums ...)" sys.exit(); - elif (argc > 2): - print "There's a weird bug when passing more than one palnum; \ -processing only the first one.\n" print "Generating base palette..." bp = genbasepal(); bph = rgb2hsv(bp); - for i in [1]: #xrange(1, argc): + for i in xrange(1, argc): palnum = int(sys.argv[i]); filename = "hipal{0}_gen.png".format(palnum); print "Generating palnum", palnum, "image ..."; - palimg = genpal(bp, bph, palnum); + palimg = genpal(bp.copy(), bph.copy(), palnum); print "Writing", filename, "..."; saveimage(palimg, filename); diff --git a/polymer/eduke32/source/premap.c b/polymer/eduke32/source/premap.c index c6dbb4041..d43154e2c 100644 --- a/polymer/eduke32/source/premap.c +++ b/polymer/eduke32/source/premap.c @@ -268,6 +268,7 @@ static void G_PrecacheSprites(void) for (i = SCRAP1; i < (SCRAP1+29); i++) tloadtile(i,1); tloadtile(FIRELASER,1); + for (i=TRANSPORTERSTAR; i