From 87b71fd3da87f0b78efe6e3d28c42bc6c3709072 Mon Sep 17 00:00:00 2001 From: plagman Date: Thu, 27 Jan 2011 07:05:12 +0000 Subject: [PATCH] Hook basepal up to highpal. git-svn-id: https://svn.eduke32.com/eduke32@1782 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/build.h | 1 + polymer/eduke32/build/include/polymer.h | 2 +- polymer/eduke32/build/src/defs.c | 16 +++- polymer/eduke32/build/src/engine.c | 3 + polymer/eduke32/build/src/polymer.c | 101 +++++++++++++----------- polymer/eduke32/source/game.h | 1 + 6 files changed, 77 insertions(+), 47 deletions(-) diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index b500b1c6a..83369abe3 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -35,6 +35,7 @@ extern "C" { #define MAXPLAYERS 16 #define MAXXDIM 3072 #define MAXYDIM 2304 +#define MAXBASEPALS 8 #define MAXPALOOKUPS 256 #define MAXPSKYTILES 256 #define MAXSPRITESONSCREEN 4096 diff --git a/polymer/eduke32/build/include/polymer.h b/polymer/eduke32/build/include/polymer.h index a099e0e51..ae35d58fe 100644 --- a/polymer/eduke32/build/include/polymer.h +++ b/polymer/eduke32/build/include/polymer.h @@ -294,7 +294,7 @@ int16_t polymer_addlight(_prlight* light); void polymer_deletelight(int16_t lighti); void polymer_invalidatelights(void); void polymer_texinvalidate(void); -void polymer_definehighpalookup(char palnum, char *fn); +void polymer_definehighpalookup(char basepalnum, char palnum, char *fn); # ifdef POLYMER_C diff --git a/polymer/eduke32/build/src/defs.c b/polymer/eduke32/build/src/defs.c index 1037df1e9..74d882b70 100644 --- a/polymer/eduke32/build/src/defs.c +++ b/polymer/eduke32/build/src/defs.c @@ -7,6 +7,7 @@ #include "build.h" #include "compat.h" +#include "engine_priv.h" #include "baselayer.h" #include "scriptfile.h" #include "cache1d.h" @@ -46,6 +47,7 @@ enum scripttoken_t T_FPS, T_FLAGS, T_PAL, + T_BASEPAL, T_DETAIL, T_GLOW, T_SPECULAR, @@ -1432,7 +1434,7 @@ static int32_t defsparser(scriptfile *script) case T_HIGHPALOOKUP: { char *highpaltokptr = script->ltextptr; - int32_t pal=-1, oldpathsearchmode; + int32_t basepal=-1, pal=-1, oldpathsearchmode; char *fn = NULL, *tfn = NULL; char *highpalend; #ifdef POLYMER @@ -1441,6 +1443,7 @@ static int32_t defsparser(scriptfile *script) #endif static const tokenlist highpaltokens[] = { + { "basepal", T_BASEPAL }, { "pal", T_PAL }, { "file", T_FILE } }; @@ -1450,12 +1453,20 @@ static int32_t defsparser(scriptfile *script) { switch (getatoken(script,highpaltokens,sizeof(highpaltokens)/sizeof(tokenlist))) { + case T_BASEPAL: + scriptfile_getsymbol(script,&basepal); break; case T_PAL: scriptfile_getsymbol(script,&pal); break; case T_FILE: scriptfile_getstring(script,&fn); break; } } + if ((unsigned)basepal >= ((unsigned)basepalcount)) + { + initprintf("Error: missing or invalid 'base palette number' for highpalookup definition " + "near line %s:%d\n", script->filename, scriptfile_getlinum(script,highpaltokptr)); + break; + } if ((unsigned)pal >= ((unsigned)MAXPALOOKUPS - RESERVEDPALS)) { @@ -1463,6 +1474,7 @@ static int32_t defsparser(scriptfile *script) "line %s:%d\n", script->filename, scriptfile_getlinum(script,highpaltokptr)); break; } + if (!fn) { initprintf("Error: missing 'file name' for highpalookup definition near line %s:%d\n", @@ -1524,7 +1536,7 @@ static int32_t defsparser(scriptfile *script) { Bfree(highpaldata); initprintf("Error: failed rendering '%s'.\n", fn); break; } } - polymer_definehighpalookup(pal, highpaldata); + polymer_definehighpalookup(basepal, pal, highpaldata); Bfree(highpaldata); #endif diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index 57343affa..a9bf81d56 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -11129,6 +11129,9 @@ void setvgapalette(void) // void setbasepaltable(uint8_t **thebasepaltable, uint8_t thebasepalcount) { + if (thebasepalcount >= MAXBASEPALS) + thebasepalcount = MAXBASEPALS - 1; + basepaltableptr = thebasepaltable; basepalcount = thebasepalcount; } diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index fb7613167..d1234716d 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -44,7 +44,7 @@ _prsector *prsectors[MAXSECTORS]; _prwall *prwalls[MAXWALLS]; _prsprite *prsprites[MAXSPRITES]; _prmaterial mdspritematerial; -_prhighpalookup prhighpalookups[MAXPALOOKUPS]; +_prhighpalookup prhighpalookups[MAXBASEPALS][MAXPALOOKUPS]; static const GLfloat vertsprite[4 * 5] = { @@ -614,7 +614,7 @@ int32_t polymersearching; // EXTERNAL FUNCTIONS int32_t polymer_init(void) { - int32_t i; + int32_t i, j; if (pr_verbosity >= 1) OSD_Printf("Initializing Polymer subsystem...\n"); @@ -676,28 +676,33 @@ int32_t polymer_init(void) // Prime highpalookup maps i = 0; - while (i < MAXPALOOKUPS) + while (i < MAXBASEPALS) { - if (prhighpalookups[i].data) + j = 0; + while (j < MAXPALOOKUPS) { - bglGenTextures(1, &prhighpalookups[i].map); - bglBindTexture(GL_TEXTURE_3D, prhighpalookups[i].map); - bglTexImage3D(GL_TEXTURE_3D, // target - 0, // mip level - GL_RGBA, // internalFormat - PR_HIGHPALOOKUP_DIM, // width - PR_HIGHPALOOKUP_DIM, // height - PR_HIGHPALOOKUP_DIM, // depth - 0, // border - GL_BGRA, // upload format - GL_UNSIGNED_BYTE, // upload component type - prhighpalookups[i].data); // data pointer - bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP); - bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP); - bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP); - bglBindTexture(GL_TEXTURE_3D, 0); + if (prhighpalookups[i][j].data) + { + bglGenTextures(1, &prhighpalookups[i][j].map); + bglBindTexture(GL_TEXTURE_3D, prhighpalookups[i][j].map); + bglTexImage3D(GL_TEXTURE_3D, // target + 0, // mip level + GL_RGBA, // internalFormat + PR_HIGHPALOOKUP_DIM, // width + PR_HIGHPALOOKUP_DIM, // height + PR_HIGHPALOOKUP_DIM, // depth + 0, // border + GL_BGRA, // upload format + GL_UNSIGNED_BYTE, // upload component type + prhighpalookups[i][j].data); // data pointer + bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP); + bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP); + bglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP); + bglBindTexture(GL_TEXTURE_3D, 0); + } + j++; } i++; } @@ -709,21 +714,26 @@ int32_t polymer_init(void) void polymer_uninit(void) { - int32_t i; + int32_t i, j; polymer_freeboard(); i = 0; - while (i < MAXPALOOKUPS) + while (i < MAXBASEPALS) { - if (prhighpalookups[i].data) { - Bfree(prhighpalookups[i].data); - prhighpalookups[i].data = NULL; - } - if (prhighpalookups[i].map) { - bglDeleteTextures(1, &prhighpalookups[i].map); - prhighpalookups[i].map = 0; - } + j = 0; + while (j < MAXPALOOKUPS) + { + if (prhighpalookups[i][j].data) { + Bfree(prhighpalookups[i][j].data); + prhighpalookups[i][j].data = NULL; + } + if (prhighpalookups[i][j].map) { + bglDeleteTextures(1, &prhighpalookups[i][j].map); + prhighpalookups[i][j].map = 0; + } + j++; + } i++; } } @@ -1661,11 +1671,11 @@ void polymer_texinvalidate(void) while (i >= 0); } -void polymer_definehighpalookup(char palnum, char *data) +void polymer_definehighpalookup(char basepalnum, char palnum, char *data) { - prhighpalookups[palnum].data = Bmalloc(PR_HIGHPALOOKUP_DATA_SIZE); + prhighpalookups[basepalnum][palnum].data = Bmalloc(PR_HIGHPALOOKUP_DATA_SIZE); - Bmemcpy(prhighpalookups[palnum].data, data, PR_HIGHPALOOKUP_DATA_SIZE); + Bmemcpy(prhighpalookups[basepalnum][palnum].data, data, PR_HIGHPALOOKUP_DATA_SIZE); } // CORE @@ -3825,8 +3835,8 @@ static void polymer_drawmdsprite(spritetype *tspr) color[0] = color[1] = color[2] = ((float)(numpalookups-min(max((tspr->shade * shadescale)+m->shadeoff,0),numpalookups)))/((float)numpalookups) * 0xFF; - usinghighpal = (tspr->pal > 0 && pr_highpalookups && - prhighpalookups[tspr->pal].map); + usinghighpal = (pr_highpalookups && + prhighpalookups[curbasepal][tspr->pal].map); // If that palette has a highpalookup, we'll never use tinting. We might use // alternate skins if they exist later, though. @@ -3842,9 +3852,10 @@ static void polymer_drawmdsprite(spritetype *tspr) } // fullscreen tint on global palette change - if (hictinting[MAXPALOOKUPS-1].r != 255 || - hictinting[MAXPALOOKUPS-1].g != 255 || - hictinting[MAXPALOOKUPS-1].b != 255) + if (!usinghighpal && + (hictinting[MAXPALOOKUPS-1].r != 255 || + hictinting[MAXPALOOKUPS-1].g != 255 || + hictinting[MAXPALOOKUPS-1].b != 255)) { color[0] *= hictinting[MAXPALOOKUPS-1].r / 255.0; color[1] *= hictinting[MAXPALOOKUPS-1].g / 255.0; @@ -3981,7 +3992,7 @@ static void polymer_drawmdsprite(spritetype *tspr) // We don't have a specific skin defined for this palette // Use the base skin instead and plug in our highpalookup map targetpal = 0; - mdspritematerial.highpalookupmap = prhighpalookups[tspr->pal].map; + mdspritematerial.highpalookupmap = prhighpalookups[curbasepal][tspr->pal].map; } mdspritematerial.diffusemap = @@ -4160,6 +4171,7 @@ static void polymer_getscratchmaterial(_prmaterial* material) static void polymer_getbuildmaterial(_prmaterial* material, int16_t tilenum, char pal, int8_t shade, int32_t cmeth) { pthtyp* pth; + int32_t usinghighpal = 0; polymer_getscratchmaterial(material); @@ -4168,11 +4180,12 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile loadtile(tilenum); // PR_BIT_HIGHPALOOKUP_MAP - if (pal > 0 && pr_highpalookups && prhighpalookups[pal].map && + if (pr_highpalookups && prhighpalookups[curbasepal][pal].map && hicfindsubst(tilenum, 0, 0) && (hicfindsubst(tilenum, pal, 0)->palnum != pal)) { - material->highpalookupmap = prhighpalookups[pal].map; + material->highpalookupmap = prhighpalookups[curbasepal][pal].map; pal = 0; + usinghighpal = 1; } if ((pth = gltexcache(tilenum, pal, cmeth))) @@ -4207,7 +4220,7 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile // fullscreen tint on global palette change... this is used for nightvision and underwater tinting // if ((hictinting[MAXPALOOKUPS-1].r + hictinting[MAXPALOOKUPS-1].g + hictinting[MAXPALOOKUPS-1].b) != 0x2FD) - if (((uint32_t)hictinting[MAXPALOOKUPS-1].r & 0xFFFFFF00) != 0xFFFFFF00) + if (!usinghighpal && ((uint32_t)hictinting[MAXPALOOKUPS-1].r & 0xFFFFFF00) != 0xFFFFFF00) { material->diffusemodulation[0] *= hictinting[MAXPALOOKUPS-1].r / 255.0; material->diffusemodulation[1] *= hictinting[MAXPALOOKUPS-1].g / 255.0; diff --git a/polymer/eduke32/source/game.h b/polymer/eduke32/source/game.h index 65e341a43..85c3d7247 100644 --- a/polymer/eduke32/source/game.h +++ b/polymer/eduke32/source/game.h @@ -227,6 +227,7 @@ extern palette_t DefaultCrosshairColors; extern uint32_t g_frameDelay; +// Watch out for MAXBASEPALS in the engine before increasing this #define BASEPALCOUNT 7 extern uint8_t water_pal[768],slime_pal[768],title_pal[768],dre_alms[768],ending_pal[768],*anim_pal;