diff --git a/polymer/eduke32/build/include/editor.h b/polymer/eduke32/build/include/editor.h index dda97f606..cf21b44cf 100644 --- a/polymer/eduke32/build/include/editor.h +++ b/polymer/eduke32/build/include/editor.h @@ -97,6 +97,7 @@ extern const char *g_namesFileName; extern const char *defsfilename; // set in bstub.c +extern int32_t g_lazy_tileselector; extern int32_t m32_osd_tryscript; extern int32_t showheightindicators; extern int32_t showambiencesounds; @@ -105,6 +106,7 @@ extern uint8_t graysectbitmap[MAXSECTORS>>3]; extern uint8_t graywallbitmap[MAXWALLS>>3]; #ifdef YAX_ENABLE +extern int32_t autogray; int32_t yax_is121(int16_t bunchnum, int16_t getfloor); #endif diff --git a/polymer/eduke32/build/src/build.c b/polymer/eduke32/build/src/build.c index ecfdf4f5c..82050d566 100644 --- a/polymer/eduke32/build/src/build.c +++ b/polymer/eduke32/build/src/build.c @@ -1595,17 +1595,7 @@ static void duplicate_selected_sectors(void) int32_t i, j, startwall, endwall, newnumsectors, newwalls = 0; int32_t minx=INT32_MAX, maxx=INT32_MIN, miny=INT32_MAX, maxy=INT32_MIN, dx, dy; #ifdef YAX_ENABLE - int16_t cb, fb; - - for (i=0; i=0 || fb>=0) - { - printmessage16("Cannot duplicate extended sectors!"); - return; - } - } + int16_t cb, fb, hadextended=0; #endif for (i=0; i=0 || fb>=0) + { + hadextended = 1; + yax_setbunches(newnumsectors, -1, -1); + for (WALLS_OF_SECTOR(newnumsectors, j)) + { + yax_setnextwall(j, 0, -1); + yax_setnextwall(j, 1, -1); + } + } +#endif newnumsectors++; newnumwalls += sector[highlightsector[i]].wallnum; } @@ -1695,7 +1698,12 @@ static void duplicate_selected_sectors(void) newnumsectors = -1; updatenumsprites(); - printmessage16("Sectors duplicated and stamped."); +#ifdef YAX_ENABLE + if (hadextended) + printmessage16("Sectors duplicated and stamped, clearing extensions."); + else +#endif + printmessage16("Sectors duplicated and stamped."); asksave = 1; } else diff --git a/polymer/eduke32/build/src/config.c b/polymer/eduke32/build/src/config.c index 4a34b233c..c8cf70d84 100644 --- a/polymer/eduke32/build/src/config.c +++ b/polymer/eduke32/build/src/config.c @@ -169,6 +169,7 @@ int32_t loadsetup(const char *fn) #ifdef USE_OPENGL if (readconfig(fp, "usemodels", val, VL) > 0) usemodels = !!atoi_safe(val); if (readconfig(fp, "usehightile", val, VL) > 0) usehightile = !!atoi_safe(val); + if (readconfig(fp, "lazytileselector", val, VL) > 0) g_lazy_tileselector = !!atoi_safe(val); glusetexcache = -1; if (readconfig(fp, "glusetexcache", val, VL) > 0) @@ -364,6 +365,7 @@ int32_t writesetup(const char *fn) "; OpenGL mode options\n" "usemodels = %d\n" "usehightile = %d\n" + "lazytileselector = %d\n" "; glusetexcache: 0:no, 1:yes, 2:compressed\n" "glusetexcache = %d\n" "gltexfiltermode = %d\n" @@ -523,7 +525,7 @@ int32_t writesetup(const char *fn) #endif editorgridextent, clamp(default_grid, 0, 9), #ifdef USE_OPENGL - usemodels, usehightile, + usemodels, usehightile, g_lazy_tileselector, glusetexcache, gltexfiltermode, glanisotropy,r_downsize,glusetexcompr, shadescale, #endif diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index a56ba06fe..8fbde1a7a 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -200,6 +200,7 @@ extern int32_t m32_numdebuglines; uint8_t graysectbitmap[MAXSECTORS>>3]; uint8_t graywallbitmap[MAXWALLS>>3]; +int32_t autogray = 0; #ifdef ENGINE_SCREENSHOT_DEBUG int32_t engine_screenshot = 0; @@ -208,9 +209,12 @@ int32_t engine_screenshot = 0; void yax_updategrays(int32_t posze) { int32_t i, j, k=1; -#ifndef YAX_ENABLE +#ifdef YAX_ENABLE + int32_t mingoodz=INT32_MAX, maxgoodz=INT32_MIN; +#else UNREFERENCED_PARAMETER(posze); #endif + Bmemset(graysectbitmap, 0, sizeof(graysectbitmap)); Bmemset(graywallbitmap, 0, sizeof(graywallbitmap)); @@ -220,18 +224,36 @@ void yax_updategrays(int32_t posze) int16_t cb, fb; yax_getbunches(i, &cb, &fb); - // update grayouts due to yax + // update grayouts due to yax --v-- has to be half-open --v-- + // because only one level should v be ever active v k = ((cb<0 || sector[i].ceilingz < posze) && (fb<0 || posze <= sector[i].floorz)); + if (autogray && (cb>=0 || fb>=0) && (sector[i].ceilingz <= posze && posze <= sector[i].floorz)) + { + mingoodz = min(mingoodz, sector[i].ceilingz); + maxgoodz = max(maxgoodz, sector[i].floorz); + } #endif // update grayouts due to editorzrange k &= (sector[i].ceilingz >= editorzrange[0] && sector[i].floorz <= editorzrange[1]); if (!k) // outside bounds, gray out! - { graysectbitmap[i>>3] |= (1<<(i&7)); + } + +#ifdef YAX_ENABLE + if (autogray && mingoodz<=maxgoodz) + { + for (i=0; i>3] |= (1<<(i&7)); + } +#endif + + for (i=0; i>3]&(1<<(i&7))) for (j=sector[i].wallptr; j>3] |= (1<<(j&7)); - } } } @@ -611,17 +633,19 @@ static int yax_cmpbunches(const int16_t *b1, const int16_t *b2) static void yax_tweakpicnums(int32_t bunchnum, int32_t cf, int32_t restore) { static int16_t opicnum[2][MAXSECTORS]; - int32_t i; + int32_t i, stat; for (SECTORS_OF_BUNCH(bunchnum, cf, i)) - if ((SECTORFLD(i,stat, cf)&(128+256))==0) + { + stat = (SECTORFLD(i,stat, cf)&(128+256+4096)); + if ((stat&4096) || stat==0) { if (!restore) { opicnum[cf][i] = SECTORFLD(i,picnum, cf); if (editstatus && showinvisibility) - SECTORFLD(i,picnum, cf) = MAXTILES-1-((SECTORFLD(i,stat, cf)&4096)>>12); - else + SECTORFLD(i,picnum, cf) = MAXTILES-1-((stat&4096)>>12); + else if ((stat&(128+256))==0) SECTORFLD(i,picnum, cf) = 13; //FOF; } else @@ -629,6 +653,7 @@ static void yax_tweakpicnums(int32_t bunchnum, int32_t cf, int32_t restore) SECTORFLD(i,picnum, cf) = opicnum[cf][i]; } } + } } static void yax_copytsprite(int32_t curbunchnum, int32_t resetsortcnt) @@ -682,7 +707,7 @@ static void yax_copytsprite(int32_t curbunchnum, int32_t resetsortcnt) void yax_preparedrawrooms(void) { - if (rendmode!=0 || numyaxbunches==0) + if (getrendermode()!=0 || numyaxbunches==0) return; g_nodraw = 1; @@ -720,7 +745,7 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn int32_t t; #endif - if (rendmode!=0 || numyaxbunches==0) + if (getrendermode()!=0 || numyaxbunches==0) { #ifdef ENGINE_SCREENSHOT_DEBUG engine_screenshot = 0; @@ -762,7 +787,7 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn j = yax_getbunch(i, cf); if (j >= 0 && !(havebunch[j>>3]&(1<<(j&7)))) { - if ((haveymost[j>>3]&(1<<(j&7)))==0) + if (getrendermode()==0 && (haveymost[j>>3]&(1<<(j&7)))==0) { yaxdebug("%s, l %d: skipped bunch %d (no *most)", cf?"v":"^", lev, j); continue; @@ -847,10 +872,13 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn scansector_collectsprites = 0; #ifdef ENGINE_CLEAR_SCREEN - begindrawing(); - for (i=0; i>3]&(1<= 0 && yumost[x] < ydim) - *((char *)frameplace + yumost[x]*bytesperline + x-x1) = purple; + int32_t x, x1; + char purple = getclosestcol(63, 0, 63); + char yellow = getclosestcol(63, 63, 0); - if (ydmost[x]-1 >= 0 && ydmost[x]-1 < ydim) - *((char *)frameplace + (ydmost[x]-1)*bytesperline + x-x1) = yellow; + if ((haveymost[i>>3]&(1<= 0 && yumost[x] < ydim) + *((char *)frameplace + yumost[x]*bytesperline + x-x1) = purple; + + if (ydmost[x]-1 >= 0 && ydmost[x]-1 < ydim) + *((char *)frameplace + (ydmost[x]-1)*bytesperline + x-x1) = yellow; + } } + enddrawing(); } - enddrawing(); #endif } @@ -7588,7 +7619,7 @@ void drawrooms(int32_t daposx, int32_t daposy, int32_t daposz, i = mulscale16(xdimenscale,viewingrangerecip); globalpisibility = mulscale16(parallaxvisibility,i); - globalvisibility = rendmode==0 ? mulscale16(visibility,i) : scale(visibility<<2,4,3); + globalvisibility = getrendermode()==0 ? mulscale16(visibility,i) : scale(visibility<<2,4,3); globalhisibility = mulscale16(globalvisibility,xyaspect); globalcisibility = mulscale8(globalhisibility,320); @@ -14437,12 +14468,12 @@ void draw2dscreen(const vec3_t *pos, int16_t cursectnum, int16_t ange, int32_t z { for (i=numwalls-1; i>=0; i--) #ifdef YAX_ENABLE - if (graywallbitmap[(i)>>3]&(1<<((i)&7))) + if (graywallbitmap[i>>3]&(1<<(i&7))) drawscreen_drawwall(i,posxe,posye,posze,zoome); for (i=numwalls-1; i>=0; i--) - if ((graywallbitmap[(i)>>3]&(1<<((i)&7)))==0) + if ((graywallbitmap[i>>3]&(1<<(i&7)))==0) #endif - drawscreen_drawwall(i,posxe,posye,posze,zoome); + drawscreen_drawwall(i,posxe,posye,posze,zoome); } else { @@ -14918,11 +14949,13 @@ int32_t screencapture_png(const char *filename, char inverseit, const char *vers buf = (png_bytep)png_malloc(png_ptr, xdim*ydim); Bmemcpy(buf, (char *)frameplace, xdim*ydim); } +#ifdef USE_OPENGL else { buf = (png_bytep)png_malloc(png_ptr, xdim*ydim*3); bglReadPixels(0,0,xdim,ydim,GL_RGB,GL_UNSIGNED_BYTE,buf); } +#endif enddrawing(); //}}} rowptrs = (png_bytepp)png_malloc(png_ptr, ydim*sizeof(png_bytep)); diff --git a/polymer/eduke32/build/src/polymost.c b/polymer/eduke32/build/src/polymost.c index ee0404a3d..fb63a68ea 100644 --- a/polymer/eduke32/build/src/polymost.c +++ b/polymer/eduke32/build/src/polymost.c @@ -2186,7 +2186,7 @@ void drawpoly(double *dpx, double *dpy, int32_t n, int32_t method) { float pc[4]; - int32_t shadebound = (shadescale_unbounded || globalshade>31) ? numpalookups : 31; + int32_t shadebound = (shadescale_unbounded || globalshade>=numpalookups) ? numpalookups : numpalookups-1; f = ((float)(numpalookups-min(max((globalshade * shadescale),0),shadebound)))/((float)numpalookups); pc[0] = pc[1] = pc[2] = f; switch (method&3) @@ -4177,9 +4177,11 @@ void polymost_drawrooms() if (rendmode >= 3) { resizeglcheck(); - - if (editstatus) - bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); +#ifdef YAX_ENABLE + if (numyaxbunches==0) +#endif + if (editstatus) + bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); bglDisable(GL_BLEND); bglEnable(GL_TEXTURE_2D); @@ -5795,7 +5797,7 @@ void polymost_fillpolygon(int32_t npoints) pthtyp *pth; float f,a=0.0; int32_t i; - int32_t shadebound = (shadescale_unbounded || globalshade>31) ? numpalookups : 31; + int32_t shadebound = (shadescale_unbounded || globalshade>=numpalookups) ? numpalookups : numpalookups-1; globalx1 = mulscale16(globalx1,xyaspect); globaly2 = mulscale16(globaly2,xyaspect); diff --git a/polymer/eduke32/build/src/sdlayer.c b/polymer/eduke32/build/src/sdlayer.c index 20ca01951..67631e80e 100644 --- a/polymer/eduke32/build/src/sdlayer.c +++ b/polymer/eduke32/build/src/sdlayer.c @@ -939,11 +939,12 @@ int32_t checkvideomode(int32_t *x, int32_t *y, int32_t c, int32_t fs, int32_t fo int32_t setvideomode(int32_t x, int32_t y, int32_t c, int32_t fs) { int32_t regrab = 0; +#ifdef USE_OPENGL static int32_t warnonce = 0; #if (SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION < 3) static int32_t ovsync = 1; #endif - +#endif if ((fs == fullscreen) && (x == xres) && (y == yres) && (c == bpp) && !videomodereset) { diff --git a/polymer/eduke32/source/astub.c b/polymer/eduke32/source/astub.c index 422fe6772..80d7e49e2 100644 --- a/polymer/eduke32/source/astub.c +++ b/polymer/eduke32/source/astub.c @@ -97,6 +97,7 @@ static struct strllist const char *scripthist[SCRIPTHISTSIZ]; int32_t scripthistend = 0; +int32_t g_lazy_tileselector = 1; int32_t showambiencesounds=2; int32_t autocorruptcheck = 0; @@ -3945,8 +3946,9 @@ static int32_t OnSelectTile(int32_t iTile) bflushchars(); setpolymost2dview(); +#ifdef USE_OPENGL bglEnable(GL_TEXTURE_2D); - +#endif clearview(0); // @@ -4072,7 +4074,6 @@ static void tilescreen_drawbox(int32_t iTopLeft, int32_t iSelected, int32_t nXTi char markedcol = editorcolors[14]; setpolymost2dview(); - bglEnable(GL_TEXTURE_2D); y1=max(y1, 0); y2=min(y2, ydim-1); @@ -4157,8 +4158,9 @@ static int32_t DrawTiles(int32_t iTopLeft, int32_t iSelected, int32_t nXTiles, i static uint8_t loadedhitile[(MAXTILES+7)>>3]; setpolymost2dview(); +#ifdef USE_OPENGL bglEnable(GL_TEXTURE_2D); - +#endif clearview(0); begindrawing(); @@ -4172,8 +4174,7 @@ restart: if (iTile < 0 || iTile >= localartlookupnum) continue; - - usehitile = runi; + usehitile = (runi || !g_lazy_tileselector); idTile = localartlookup[ iTile ]; if (loadedhitile[idTile>>3]&(1<<(idTile&7))) @@ -4205,7 +4206,7 @@ restart: tilescreen_drawbox(iTopLeft, iSelected, nXTiles, TileDim, offset, iTile, idTile); - if (runi==1) + if (runi==1 && g_lazy_tileselector) { int32_t k; @@ -4238,7 +4239,7 @@ restart: tilescreen_drawrest(iSelected, showmsg); - if (rendmode>=3 && qsetmode==200) + if (getrendermode()>=3 && qsetmode==200 && g_lazy_tileselector) { if (runi==0) { @@ -7585,6 +7586,13 @@ static void Keys2d(void) updatesectorz(pos.x, pos.y, pos.z, &cursectnum); } } + + if (eitherCTRL && PRESSED_KEYSC(A)) + { + autogray = !autogray; + printmessage16("Automatic grayout of plain sectors %s", ONOFF(autogray)); + yax_updategrays(pos.z); + } #endif // Ctrl-R set editor z range to hightlightsectors' c/f bounds