Restructure the basepaltable subsystem to support up to 256 palettes and use dynamic allocation like palookup and blendtable.

git-svn-id: https://svn.eduke32.com/eduke32@5348 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2015-09-23 17:55:02 +00:00
parent 2a237a3d72
commit c0e7dba4c1
16 changed files with 36 additions and 53 deletions

View file

@ -77,7 +77,7 @@ enum rendmode_t {
#define MAXVOXELS 4096 #define MAXVOXELS 4096
#define MAXSTATUS 1024 #define MAXSTATUS 1024
#define MAXPLAYERS 16 #define MAXPLAYERS 16
#define MAXBASEPALS 8 #define MAXBASEPALS 256
#define MAXPALOOKUPS 256 #define MAXPALOOKUPS 256
#define MAXBLENDTABS 256 #define MAXBLENDTABS 256
// Maximum number of component tiles in a multi-psky: // Maximum number of component tiles in a multi-psky:
@ -699,7 +699,7 @@ EXTERN int16_t sintable[2048];
EXTERN uint8_t palette[768]; EXTERN uint8_t palette[768];
EXTERN int16_t numshades; EXTERN int16_t numshades;
EXTERN char *palookup[MAXPALOOKUPS]; EXTERN char *palookup[MAXPALOOKUPS];
EXTERN uint8_t **basepaltableptr; extern uint8_t *basepaltable[MAXBASEPALS];
EXTERN uint8_t paletteloaded; EXTERN uint8_t paletteloaded;
enum { enum {
@ -1045,7 +1045,7 @@ intptr_t allocatepermanenttile(int16_t tilenume, int32_t xsiz, int32_t ysiz);
void copytilepiece(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, int32_t ysiz, int32_t tilenume2, int32_t sx2, int32_t sy2); void copytilepiece(int32_t tilenume1, int32_t sx1, int32_t sy1, int32_t xsiz, int32_t ysiz, int32_t tilenume2, int32_t sx2, int32_t sy2);
void makepalookup(int32_t palnum, const char *remapbuf, int8_t r, int8_t g, int8_t b, char noFloorPal); void makepalookup(int32_t palnum, const char *remapbuf, int8_t r, int8_t g, int8_t b, char noFloorPal);
//void setvgapalette(void); //void setvgapalette(void);
void setbasepaltable(uint8_t **basepaltable, uint8_t basepalcount); void setbasepal(int32_t id, uint8_t const *table);
void setbrightness(char dabrightness, uint8_t dapalid, uint8_t flags); void setbrightness(char dabrightness, uint8_t dapalid, uint8_t flags);
void setpalettefade(char r, char g, char b, char offset); void setpalettefade(char r, char g, char b, char offset);
void squarerotatetile(int16_t tilenume); void squarerotatetile(int16_t tilenume);

View file

@ -1937,7 +1937,7 @@ static int32_t defsparser(scriptfile *script)
scriptfile_getstring(script,&fn); break; scriptfile_getstring(script,&fn); break;
} }
} }
if (EDUKE32_PREDICT_FALSE((unsigned)basepal >= ((unsigned)basepalcount))) if (EDUKE32_PREDICT_FALSE((unsigned)basepal >= MAXBASEPALS))
{ {
initprintf("Error: missing or invalid 'base palette number' for highpalookup definition " initprintf("Error: missing or invalid 'base palette number' for highpalookup definition "
"near line %s:%d\n", script->filename, scriptfile_getlinum(script,highpaltokptr)); "near line %s:%d\n", script->filename, scriptfile_getlinum(script,highpaltokptr));

View file

@ -2414,8 +2414,8 @@ static int32_t baktile;
char apptitle[256] = "Build Engine"; char apptitle[256] = "Build Engine";
uint8_t *basepaltable[MAXBASEPALS] = { palette };
static uint8_t basepalreset=1; static uint8_t basepalreset=1;
uint8_t basepalcount;
uint8_t curbasepal; uint8_t curbasepal;
static uint32_t g_lastpalettesum = 0; static uint32_t g_lastpalettesum = 0;
@ -9369,6 +9369,12 @@ void uninitengine(void)
Bfree(blendtable[i]); Bfree(blendtable[i]);
Bmemset(blendtable, 0, sizeof(blendtable)); Bmemset(blendtable, 0, sizeof(blendtable));
for (int i=1; i<MAXBASEPALS; i++)
if (basepaltable[i] != NULL)
Bfree(basepaltable[i]);
Bmemset(basepaltable, 0, sizeof(basepaltable));
basepaltable[0] = palette;
#ifdef DYNALLOC_ARRAYS #ifdef DYNALLOC_ARRAYS
DO_FREE_AND_NULL(blockptr); DO_FREE_AND_NULL(blockptr);
#endif #endif
@ -15638,15 +15644,14 @@ void makepalookup(int32_t palnum, const char *remapbuf, int8_t r, int8_t g, int8
} }
// //
// setbasepaltable // setbasepal
// //
void setbasepaltable(uint8_t **thebasepaltable, uint8_t thebasepalcount) void setbasepal(int32_t id, uint8_t const * const table)
{ {
if (thebasepalcount >= MAXBASEPALS) if (basepaltable[id] == NULL)
thebasepalcount = MAXBASEPALS - 1; basepaltable[id] = (uint8_t *)Xmalloc(768);
basepaltableptr = thebasepaltable; Bmemcpy(basepaltable[id], table, 768);
basepalcount = thebasepalcount;
} }
// //
@ -15671,7 +15676,7 @@ void setbrightness(char dabrightness, uint8_t dapalid, uint8_t flags)
Bassert((flags&4)==0); Bassert((flags&4)==0);
if (dapalid >= basepalcount) if (/*(unsigned)dapalid >= MAXBASEPALS ||*/ basepaltable[dapalid] == NULL)
dapalid = 0; dapalid = 0;
#ifdef USE_OPENGL #ifdef USE_OPENGL
paldidchange = (curbasepal != dapalid || basepalreset); paldidchange = (curbasepal != dapalid || basepalreset);
@ -15679,7 +15684,7 @@ void setbrightness(char dabrightness, uint8_t dapalid, uint8_t flags)
curbasepal = dapalid; curbasepal = dapalid;
basepalreset = 0; basepalreset = 0;
dapal = basepaltableptr[curbasepal]; dapal = basepaltable[curbasepal];
if (!(flags&4)) if (!(flags&4))
{ {

View file

@ -28,7 +28,6 @@ extern "C" {
extern "C" { extern "C" {
#endif #endif
extern uint8_t basepalcount;
extern uint8_t curbasepal; extern uint8_t curbasepal;
extern int16_t thesector[MAXWALLSB], thewall[MAXWALLSB]; extern int16_t thesector[MAXWALLSB], thewall[MAXWALLSB];

View file

@ -4917,7 +4917,7 @@ static _prbucket* polymer_getbuildmaterial(_prmaterial* material, int16_t tile
0, 0,
GL_RGB, GL_RGB,
GL_UNSIGNED_BYTE, GL_UNSIGNED_BYTE,
basepaltableptr[curbasepal]); basepaltable[curbasepal]);
bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP); bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP);

View file

@ -241,7 +241,7 @@ int32_t G_PlayAnim(const char *fn)
goto end_anim; goto end_anim;
} }
basepaltable[ANIMPAL] = ANIM_GetPalette(); setbasepal(ANIMPAL, ANIM_GetPalette());
// setpalette(0L,256L,tempbuf); // setpalette(0L,256L,tempbuf);
// setbrightness(ud.brightness>>2,tempbuf,2); // setbrightness(ud.brightness>>2,tempbuf,2);

View file

@ -9864,11 +9864,6 @@ int32_t ExtInit(void)
Bsprintf(apptitle, "Mapster32 %s %s", VERSION, s_buildRev); Bsprintf(apptitle, "Mapster32 %s %s", VERSION, s_buildRev);
autosavetimer = totalclock+120*autosave; autosavetimer = totalclock+120*autosave;
// This must run before the following OSD_Exec() as the cfg may
// e.g. contain a vid_gamma setting, resulting in a crash in
// setbrightness() which expects basepaltableptr to be initialized.
setbasepaltable(basepaltable, BASEPALCOUNT);
registerosdcommands(); registerosdcommands();
{ {

View file

@ -1001,14 +1001,6 @@ void G_DoAutoload(const char *dirname)
uint32_t PaletteIndexFullbrights[8] = { 0, 0, 0, 0, 0, 0, 0, 2147418112 }; uint32_t PaletteIndexFullbrights[8] = { 0, 0, 0, 0, 0, 0, 0, 2147418112 };
static uint8_t water_pal[768], slime_pal[768], title_pal[768], dre_alms[768], ending_pal[768];
uint8_t *basepaltable[BASEPALCOUNT] = {
palette, water_pal, slime_pal,
dre_alms, title_pal, ending_pal,
NULL /*anim_pal*/
};
void G_LoadLookups(void) void G_LoadLookups(void)
{ {
int32_t fp, j; int32_t fp, j;
@ -1027,13 +1019,17 @@ void G_LoadLookups(void)
return kclose(fp); return kclose(fp);
} }
uint8_t paldata[768];
for (j=1; j<=5; j++) for (j=1; j<=5; j++)
{ {
// Account for TITLE and REALMS swap between basepal number and on-disk order. // Account for TITLE and REALMS swap between basepal number and on-disk order.
int32_t basepalnum = (j == 3 || j == 4) ? 4+3-j : j; int32_t basepalnum = (j == 3 || j == 4) ? 4+3-j : j;
if (kread_and_test(fp, basepaltable[basepalnum], 768)) if (kread_and_test(fp, paldata, 768))
return kclose(fp); return kclose(fp);
setbasepal(basepalnum, paldata);
} }
kclose(fp); kclose(fp);

View file

@ -124,8 +124,6 @@ void G_DoAutoload(const char *dirname);
////////// //////////
extern uint8_t *basepaltable[BASEPALCOUNT];
extern void G_LoadLookups(void); extern void G_LoadLookups(void);
////////// //////////

View file

@ -305,10 +305,10 @@ static void G_PatchStatusBar(int32_t x1, int32_t y1, int32_t x2, int32_t y2)
rotatesprite(tx,ty,scl,0,BOTTOMSTATUSBAR,4,0,10+16+64,clx1+clofx,cly1+clofy,clx2+clofx-1,cly2+clofy-1); rotatesprite(tx,ty,scl,0,BOTTOMSTATUSBAR,4,0,10+16+64,clx1+clofx,cly1+clofy,clx2+clofx-1,cly2+clofy-1);
} }
void P_SetGamePalette(DukePlayer_t *player, uint8_t palid, int32_t set) void P_SetGamePalette(DukePlayer_t *player, uint32_t palid, int32_t set)
{ {
if (palid >= BASEPALCOUNT) if (palid >= MAXBASEPALS)
palid = BASEPAL; palid = 0;
player->palette = palid; player->palette = palid;
@ -10982,9 +10982,12 @@ static inline void G_CheckGametype(void)
static void G_PostLoadPalette(void) static void G_PostLoadPalette(void)
{ {
// Make color index 255 of default/water/slime palette black. // Make color index 255 of default/water/slime palette black.
Bmemset(&basepaltable[BASEPAL][255*3], 0, 3); if (basepaltable[BASEPAL] != NULL)
Bmemset(&basepaltable[WATERPAL][255*3], 0, 3); Bmemset(&basepaltable[BASEPAL][255*3], 0, 3);
Bmemset(&basepaltable[SLIMEPAL][255*3], 0, 3); if (basepaltable[WATERPAL] != NULL)
Bmemset(&basepaltable[WATERPAL][255*3], 0, 3);
if (basepaltable[SLIMEPAL] != NULL)
Bmemset(&basepaltable[SLIMEPAL][255*3], 0, 3);
generatefogpals(); generatefogpals();
@ -11113,8 +11116,6 @@ static void G_Startup(void)
if (initengine()) if (initengine())
G_FatalEngineError(); G_FatalEngineError();
setbasepaltable(basepaltable, BASEPALCOUNT);
#ifdef LUNATIC #ifdef LUNATIC
El_CreateGameState(); El_CreateGameState();
C_InitQuotes(); C_InitQuotes();

View file

@ -378,7 +378,7 @@ void G_UpdatePlayerFromMenu(void);
void M32RunScript(const char *s); void M32RunScript(const char *s);
void P_DoQuote(int32_t q,DukePlayer_t *p); void P_DoQuote(int32_t q,DukePlayer_t *p);
extern int32_t textsc(int32_t sc); extern int32_t textsc(int32_t sc);
void P_SetGamePalette(DukePlayer_t *player,uint8_t palid,int32_t set); void P_SetGamePalette(DukePlayer_t *player, uint32_t palid, int32_t set);
extern int32_t G_GetStringLineLength(const char *text, const char *end, const int32_t iter); extern int32_t G_GetStringLineLength(const char *text, const char *end, const int32_t iter);
extern int32_t G_GetStringNumLines(const char *text, const char *end, const int32_t iter); extern int32_t G_GetStringNumLines(const char *text, const char *end, const int32_t iter);

View file

@ -681,7 +681,7 @@ int32_t G_CheckActivatorMotion(int32_t lotag);
int32_t A_Dodge(spritetype *s); int32_t A_Dodge(spritetype *s);
int32_t A_MoveSpriteClipdist(int32_t spritenum, const vec3_t *change, uint32_t cliptype, int32_t clipdist); int32_t A_MoveSpriteClipdist(int32_t spritenum, const vec3_t *change, uint32_t cliptype, int32_t clipdist);
void P_DoQuote(int32_t q, DukePlayer_t *p); void P_DoQuote(int32_t q, DukePlayer_t *p);
void P_SetGamePalette(DukePlayer_t *player, uint8_t palid, int32_t set); void P_SetGamePalette(DukePlayer_t *player, uint32_t palid, int32_t set);
void G_AddUserQuote(const char *daquote); void G_AddUserQuote(const char *daquote);
void G_ClearCameraView(DukePlayer_t *ps); void G_ClearCameraView(DukePlayer_t *ps);
void G_DrawTileGeneric(int32_t x, int32_t y, int32_t zoom, int32_t tilenum, void G_DrawTileGeneric(int32_t x, int32_t y, int32_t zoom, int32_t tilenum,

View file

@ -145,8 +145,6 @@ int32_t ExtPostStartupWindow(void)
return -1; return -1;
} }
setbasepaltable(basepaltable, 1);
Ken_InitMultiPsky(); Ken_InitMultiPsky();
tiletovox[PLAYER] = nextvoxid++; tiletovox[PLAYER] = nextvoxid++;

View file

@ -26,11 +26,6 @@ const char *G_DefFile(void)
return defaultdeffilename; return defaultdeffilename;
} }
uint8_t *basepaltable[1] =
{
palette
};
uint32_t PaletteIndexFullbrights[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; uint32_t PaletteIndexFullbrights[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
void Ken_InitMultiPsky(void) void Ken_InitMultiPsky(void)

View file

@ -4,6 +4,4 @@
extern const char *G_DefaultGrpFile(void); extern const char *G_DefaultGrpFile(void);
extern const char *G_GrpFile(void); extern const char *G_GrpFile(void);
extern uint8_t *basepaltable[1];
extern void Ken_InitMultiPsky(void); extern void Ken_InitMultiPsky(void);

View file

@ -526,8 +526,6 @@ int32_t app_main(int32_t argc, const char **argv)
return -1; return -1;
} }
setbasepaltable(basepaltable, 1);
Ken_InitMultiPsky(); Ken_InitMultiPsky();
initinput(); initinput();