diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index ac77ec46b..aef67fc2d 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -701,6 +701,7 @@ EXTERN int16_t numshades; EXTERN char *palookup[MAXPALOOKUPS]; extern uint8_t *basepaltable[MAXBASEPALS]; EXTERN uint8_t paletteloaded; +EXTERN char *blendtable[MAXBLENDTABS]; enum { PALETTE_MAIN = 1<<0, @@ -1046,6 +1047,8 @@ void copytilepiece(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, void makepalookup(int32_t palnum, const char *remapbuf, uint8_t r, uint8_t g, uint8_t b, char noFloorPal); //void setvgapalette(void); void setbasepal(int32_t id, uint8_t const *table); +void setblendtab(int32_t blend, const char *tab); +int32_t setpalookup(int32_t palnum, const uint8_t *shtab); void setbrightness(char dabrightness, uint8_t dapalid, uint8_t flags); void setpalettefade(uint8_t r, uint8_t g, uint8_t b, uint8_t offset); void squarerotatetile(int16_t tilenume); diff --git a/polymer/eduke32/build/include/cache1d.h b/polymer/eduke32/build/include/cache1d.h index 1123efa3c..8cd89910b 100644 --- a/polymer/eduke32/build/include/cache1d.h +++ b/polymer/eduke32/build/include/cache1d.h @@ -39,6 +39,7 @@ int32_t kopen4load(const char *filename, char searchfirst); // searchfirst: 0 = int32_t kread(int32_t handle, void *buffer, int32_t leng); #define kread_and_test(handle, buffer, leng) EDUKE32_PREDICT_FALSE(kread((handle), (buffer), (leng)) != (leng)) int32_t klseek(int32_t handle, int32_t offset, int32_t whence); +#define klseek_and_test(handle, offset, whence) EDUKE32_PREDICT_FALSE(klseek((handle), (offset), (whence)) < 0) int32_t kfilelength(int32_t handle); int32_t ktell(int32_t handle); void kclose(int32_t handle); diff --git a/polymer/eduke32/build/include/editor.h b/polymer/eduke32/build/include/editor.h index 9aef685c1..bee87262a 100644 --- a/polymer/eduke32/build/include/editor.h +++ b/polymer/eduke32/build/include/editor.h @@ -448,7 +448,6 @@ FORCE_INLINE void inpclamp(int32_t *x, int32_t mi, int32_t ma) if (*x < mi) *x = mi; } -extern char *blendtable[MAXBLENDTABS]; #define drawtranspixel(p, col) drawpixel(p, blendtable[0][(readpixel(p) * 256) + col]) #define M32_THROB klabs(sintable[((totalclock << 4) & 2047)] >> 10) diff --git a/polymer/eduke32/build/src/defs.c b/polymer/eduke32/build/src/defs.c index aeff7f756..d06e2238a 100644 --- a/polymer/eduke32/build/src/defs.c +++ b/polymer/eduke32/build/src/defs.c @@ -73,7 +73,7 @@ enum scripttoken_t T_HIGHPALOOKUP, T_TINT, T_MAKEPALOOKUP, T_REMAPPAL, T_REMAPSELF, - T_NOFLOORPAL, + T_NOFLOORPAL, T_FLOORPAL, T_RED,T_GREEN,T_BLUE, T_TEXTURE,T_ALPHACUT,T_XSCALE,T_YSCALE,T_SPECPOWER,T_SPECFACTOR,T_NOCOMPRESS,T_NODOWNSIZE, T_FORCEFILTER, @@ -105,6 +105,8 @@ enum scripttoken_t T_COPYTILE, T_GLOBALGAMEFLAGS, T_MULTIPSKY, T_HORIZFRAC, T_LOGNUMTILES, + T_BASEPALETTE, T_PALOOKUP, T_BLENDTABLE, + T_RAW, T_OFFSET, T_SHIFTLEFT, T_NOSHADES, T_COPY, }; static int32_t lastmodelid = -1, lastvoxid = -1, modelskin = -1, lastmodelskin = -1, seenframe = 0; @@ -383,6 +385,9 @@ static int32_t defsparser(scriptfile *script) { "copytile", T_COPYTILE }, { "globalgameflags", T_GLOBALGAMEFLAGS }, // dummy { "multipsky", T_MULTIPSKY }, + { "basepalette", T_BASEPALETTE }, + { "palookup", T_PALOOKUP }, + { "blendtable", T_BLENDTABLE }, }; while (1) @@ -2669,6 +2674,628 @@ static int32_t defsparser(scriptfile *script) } } break; + case T_BASEPALETTE: + { + char *blockend; + int32_t id; + + static const tokenlist subtokens[] = + { + { "raw", T_RAW }, + { "copy", T_COPY }, + }; + + if (scriptfile_getsymbol(script,&id)) + break; + if (scriptfile_getbraces(script,&blockend)) + break; + + if (EDUKE32_PREDICT_FALSE((unsigned)id >= MAXBASEPALS)) + { + initprintf("Error: basepalette: Invalid basepal number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + script->textptr = blockend; + break; + } + + int didLoadPal = 0; + + while (script->textptr < blockend) + { + int32_t token = getatoken(script,subtokens,ARRAY_SIZE(subtokens)); + switch (token) + { + case T_RAW: + { + char *rawblockend; + + static const tokenlist rawsubtokens[] = + { + { "file", T_FILE }, + { "offset", T_OFFSET }, + { "shiftleft", T_SHIFTLEFT }, + }; + + if (scriptfile_getbraces(script,&rawblockend)) + break; + + char * fn = NULL; + int32_t offset = 0; + int32_t shiftleft = 0; + + while (script->textptr < rawblockend) + { + int32_t token = getatoken(script,rawsubtokens,ARRAY_SIZE(rawsubtokens)); + switch (token) + { + case T_FILE: + { + scriptfile_getstring(script,&fn); + break; + } + case T_OFFSET: + { + scriptfile_getnumber(script,&offset); + break; + } + case T_SHIFTLEFT: + { + scriptfile_getnumber(script,&shiftleft); + break; + } + default: + break; + } + } + + if (EDUKE32_PREDICT_FALSE(fn == NULL)) + { + initprintf("Error: basepalette: No filename provided on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (EDUKE32_PREDICT_FALSE(offset < 0)) + { + initprintf("Error: basepalette: Invalid file offset on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (EDUKE32_PREDICT_FALSE((unsigned)shiftleft >= 8)) + { + initprintf("Error: basepalette: Invalid left shift provided on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + int32_t const fil = kopen4load(fn, 0); + if (EDUKE32_PREDICT_FALSE(fil == -1)) + { + initprintf("Error: basepalette: Failed opening \"%s\" on line %s:%d\n", fn, + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (klseek_and_test(fil, offset, BSEEK_SET)) + { + initprintf("Error: basepalette: Seek failed on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + kclose(fil); + break; + } + + uint8_t * const palbuf = (uint8_t *)Xmalloc(768); + if (kread_and_test(fil,palbuf,768)) + { + initprintf("Error: basepalette: Read failed on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + Bfree(palbuf); + kclose(fil); + break; + } + + if (shiftleft != 0) + { + for (int k = 0; k < 768; k++) + palbuf[k] <<= shiftleft; + } + + setbasepal(id, palbuf); + didLoadPal = 1; + + Bfree(palbuf); + kclose(fil); + break; + } + case T_COPY: + { + int32_t source; + scriptfile_getsymbol(script,&source); + + if (EDUKE32_PREDICT_FALSE((unsigned)source >= MAXBASEPALS || source == id)) + { + initprintf("Error: basepalette: Invalid source basepal number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + uint8_t const * const sourcetable = basepaltable[source]; + if (EDUKE32_PREDICT_FALSE(sourcetable == NULL)) + { + initprintf("Error: basepalette: Source basepal does not exist on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + setbasepal(id, sourcetable); + didLoadPal = 1; + break; + } + default: + break; + } + } + + if (didLoadPal && id == 0) + { + initfastcolorlookup_palette(); + + paletteloaded |= PALETTE_MAIN; + } + } + break; + case T_PALOOKUP: + { + char *blockend; + int32_t id; + + static const tokenlist subtokens[] = + { + { "raw", T_RAW }, + { "copy", T_COPY }, + + { "fogpal", T_FOGPAL }, + { "makepalookup", T_MAKEPALOOKUP }, + + { "floorpal", T_FLOORPAL }, + { "nofloorpal", T_NOFLOORPAL }, + }; + + if (scriptfile_getsymbol(script,&id)) + break; + if (scriptfile_getbraces(script,&blockend)) + break; + + if (EDUKE32_PREDICT_FALSE((unsigned)id >= MAXPALOOKUPS)) + { + initprintf("Error: palookup: Invalid pal number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + script->textptr = blockend; + break; + } + + int didLoadShade = 0; + + while (script->textptr < blockend) + { + int32_t token = getatoken(script,subtokens,ARRAY_SIZE(subtokens)); + switch (token) + { + case T_RAW: + { + char *subblockend; + + static const tokenlist rawsubtokens[] = + { + { "file", T_FILE }, + { "offset", T_OFFSET }, + { "noshades", T_NOSHADES }, + }; + + if (scriptfile_getbraces(script,&subblockend)) + break; + + char * fn = NULL; + int32_t offset = 0; + int32_t length = 256*32; // hardcoding 32 instead of numshades + + while (script->textptr < subblockend) + { + int32_t token = getatoken(script,rawsubtokens,ARRAY_SIZE(rawsubtokens)); + switch (token) + { + case T_FILE: + { + scriptfile_getstring(script,&fn); + break; + } + case T_OFFSET: + { + scriptfile_getnumber(script,&offset); + break; + } + case T_NOSHADES: + { + length = 256; + break; + } + default: + break; + } + } + + if (EDUKE32_PREDICT_FALSE(fn == NULL)) + { + initprintf("Error: palookup: No filename provided on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (EDUKE32_PREDICT_FALSE(offset < 0)) + { + initprintf("Error: palookup: Invalid file offset on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + int32_t const fil = kopen4load(fn, 0); + if (EDUKE32_PREDICT_FALSE(fil == -1)) + { + initprintf("Error: palookup: Failed opening \"%s\" on line %s:%d\n", fn, + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (klseek_and_test(fil, offset, BSEEK_SET)) + { + initprintf("Error: palookup: Seek failed on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + kclose(fil); + break; + } + + char * const palookupbuf = (char *)Xmalloc(length); + int32_t bytesread = kread(fil, palookupbuf, length); + if (bytesread < 256) + { + initprintf("Error: palookup: Read failed on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + Bfree(palookupbuf); + kclose(fil); + break; + } + + if (bytesread == 256*32) + { + didLoadShade = 1; + numshades = 32; + setpalookup(id, (uint8_t *)palookupbuf); + } + else + { + if (EDUKE32_PREDICT_FALSE(!(paletteloaded & PALETTE_SHADE))) + { + initprintf("Error: palookup: Shade tables not loaded on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + makepalookup(id, palookupbuf, 0,0,0, 0); + } + + Bfree(palookupbuf); + kclose(fil); + break; + } + case T_COPY: + { + int32_t source; + scriptfile_getsymbol(script,&source); + + if (EDUKE32_PREDICT_FALSE((unsigned)source >= MAXPALOOKUPS || source == id)) + { + initprintf("Error: palookup: Invalid source pal number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (EDUKE32_PREDICT_FALSE(source == 0 && !(paletteloaded & PALETTE_SHADE))) + { + initprintf("Error: palookup: Shade tables not loaded on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + uint8_t const * const sourcepal = (uint8_t *)palookup[source]; + if (EDUKE32_PREDICT_FALSE(sourcepal == NULL)) + { + initprintf("Error: palookup: Source palookup does not exist on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + setpalookup(id, sourcepal); + didLoadShade = 1; + break; + } + case T_FOGPAL: + { + char *subblockend; + + static const tokenlist fogpaltokens[] = + { + { "red", T_RED }, { "r", T_RED }, + { "green", T_GREEN }, { "g", T_GREEN }, + { "blue", T_BLUE }, { "b", T_BLUE }, + }; + + int32_t red = 0, green = 0, blue = 0; + + if (scriptfile_getbraces(script,&subblockend)) + break; + + while (script->textptr < subblockend) + { + switch (getatoken(script, fogpaltokens, ARRAY_SIZE(fogpaltokens))) + { + case T_RED: + scriptfile_getnumber(script,&red); + red = clamp(red, 0, 63); + break; + case T_GREEN: + scriptfile_getnumber(script,&green); + green = clamp(green, 0, 63); + break; + case T_BLUE: + scriptfile_getnumber(script,&blue); + blue = clamp(blue, 0, 63); + break; + } + } + + if (EDUKE32_PREDICT_FALSE(!(paletteloaded & PALETTE_SHADE))) + { + initprintf("Error: palookup: Shade tables not loaded on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + makepalookup(id, NULL, red, green, blue, 1); + break; + } + case T_MAKEPALOOKUP: + { + char *subblockend; + + static const tokenlist makepalookuptokens[] = + { + { "red", T_RED }, { "r", T_RED }, + { "green", T_GREEN }, { "g", T_GREEN }, + { "blue", T_BLUE }, { "b", T_BLUE }, + { "remappal", T_REMAPPAL }, + { "remapself", T_REMAPSELF }, + }; + + int32_t red = 0, green = 0, blue = 0; + int32_t remappal = -1; + + if (scriptfile_getbraces(script,&subblockend)) + break; + + while (script->textptr < subblockend) + { + switch (getatoken(script, makepalookuptokens, ARRAY_SIZE(makepalookuptokens))) + { + case T_RED: + scriptfile_getnumber(script,&red); + red = clamp(red, 0, 63); + break; + case T_GREEN: + scriptfile_getnumber(script,&green); + green = clamp(green, 0, 63); + break; + case T_BLUE: + scriptfile_getnumber(script,&blue); + blue = clamp(blue, 0, 63); + break; + case T_REMAPPAL: + scriptfile_getsymbol(script,&remappal); + break; + case T_REMAPSELF: + remappal = id; + break; + } + } + + if (EDUKE32_PREDICT_FALSE((unsigned)remappal >= MAXPALOOKUPS)) + { + initprintf("Error: palookup: Invalid remappal on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (EDUKE32_PREDICT_FALSE(!(paletteloaded & PALETTE_SHADE))) + { + initprintf("Error: palookup: Shade tables not loaded on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + makepalookup(id, NULL, red, green, blue, 1); + + break; + } + case T_NOFLOORPAL: + { + g_noFloorPal[id] = 1; + break; + } + case T_FLOORPAL: + { + g_noFloorPal[id] = 0; + break; + } + default: + break; + } + } + + if (didLoadShade && id == 0) + { + paletteloaded |= PALETTE_SHADE; + } + } + break; + case T_BLENDTABLE: + { + char *blockend; + int32_t id; + + static const tokenlist subtokens[] = + { + { "raw", T_RAW }, + { "copy", T_COPY }, + }; + + if (scriptfile_getsymbol(script,&id)) + break; + if (scriptfile_getbraces(script,&blockend)) + break; + + if (EDUKE32_PREDICT_FALSE((unsigned)id >= MAXBLENDTABS)) + { + initprintf("Error: blendtable: Invalid blendtable number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + script->textptr = blockend; + break; + } + + int didLoadTransluc = 0; + + while (script->textptr < blockend) + { + int32_t token = getatoken(script,subtokens,ARRAY_SIZE(subtokens)); + switch (token) + { + case T_RAW: + { + char *rawblockend; + + static const tokenlist rawsubtokens[] = + { + { "file", T_FILE }, + { "offset", T_OFFSET }, + }; + + if (scriptfile_getbraces(script,&rawblockend)) + break; + + char * fn = NULL; + int32_t offset = 0; + + while (script->textptr < rawblockend) + { + int32_t token = getatoken(script,rawsubtokens,ARRAY_SIZE(rawsubtokens)); + switch (token) + { + case T_FILE: + { + scriptfile_getstring(script,&fn); + break; + } + case T_OFFSET: + { + scriptfile_getnumber(script,&offset); + break; + } + default: + break; + } + } + + if (EDUKE32_PREDICT_FALSE(fn == NULL)) + { + initprintf("Error: blendtable: No filename provided on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (EDUKE32_PREDICT_FALSE(offset < 0)) + { + initprintf("Error: blendtable: Invalid file offset on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + int32_t const fil = kopen4load(fn, 0); + if (EDUKE32_PREDICT_FALSE(fil == -1)) + { + initprintf("Error: blendtable: Failed opening \"%s\" on line %s:%d\n", fn, + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + if (klseek_and_test(fil, offset, BSEEK_SET)) + { + initprintf("Error: blendtable: Seek failed on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + kclose(fil); + break; + } + + char * const blendbuf = (char *)Xmalloc(256*256); + if (kread_and_test(fil,blendbuf,256*256)) + { + initprintf("Error: blendtable: Read failed on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + Bfree(blendbuf); + kclose(fil); + break; + } + + setblendtab(id, blendbuf); + didLoadTransluc = 1; + + Bfree(blendbuf); + kclose(fil); + break; + } + case T_COPY: + { + int32_t source; + scriptfile_getsymbol(script,&source); + + if (EDUKE32_PREDICT_FALSE((unsigned)source >= MAXBLENDTABS || source == id)) + { + initprintf("Error: blendtable: Invalid source blendtable number on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + char const * const sourcetable = blendtable[source]; + if (EDUKE32_PREDICT_FALSE(sourcetable == NULL)) + { + initprintf("Error: blendtable: Source blendtable does not exist on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + break; + } + + setblendtab(id, sourcetable); + didLoadTransluc = 1; + break; + } + default: + break; + } + } + + if (didLoadTransluc && id == 0) + { + paletteloaded |= PALETTE_TRANSLUC; + } + } + break; default: initprintf("Unknown token.\n"); break; diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index dab9dee16..da843e59c 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -284,10 +284,8 @@ static int16_t maphacklight[PR_MAXLIGHTS]; #ifdef __cplusplus extern "C" { #endif -void setblendtab(int32_t blend, const char *tab); #ifdef LUNATIC extern const char *(getblendtab)(int32_t blend); -int32_t setpalookup(int32_t palnum, const uint8_t *shtab); #endif void setup_sideview_sincos(void); int32_t getscreenvdisp(int32_t bz, int32_t zoome); @@ -2434,7 +2432,6 @@ char palfadedelta = 0; // // Internal Engine Functions // -char *blendtable[MAXBLENDTABS]; #define getblendtab(blend) (blendtable[blend]) static void setpalettefade_calc(uint8_t offset); @@ -15568,6 +15565,7 @@ const char *(getblendtab)(int32_t blend) { return blendtable[blend]; } +#endif int32_t setpalookup(int32_t palnum, const uint8_t *shtab) { @@ -15582,7 +15580,6 @@ int32_t setpalookup(int32_t palnum, const uint8_t *shtab) return 0; } -#endif // // makepalookup