From 193b940eef34ed29d75b06c9e47e56cc16bc62f7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 27 May 2020 22:19:02 +0200 Subject: [PATCH] - palette code cleanup. --- source/blood/src/screen.cpp | 7 +- source/build/include/palette.h | 84 ++++++++++------ source/build/src/defs.cpp | 30 +++--- source/build/src/engine.cpp | 24 +---- source/build/src/palette.cpp | 139 +++++++++++++++------------ source/build/src/polymost.cpp | 4 +- source/core/rendering/v_video.cpp | 2 +- source/core/textures/buildtiles.cpp | 2 +- source/duke3d/src/common.cpp | 2 +- source/duke3d/src/game.cpp | 7 +- source/duke3d/src/gamestructures.cpp | 2 +- source/duke3d/src/player.cpp | 2 +- source/duke3d/src/sounds.cpp | 2 - source/exhumed/src/light.cpp | 2 +- source/glbackend/gl_palmanager.cpp | 18 +++- source/rr/src/common.cpp | 24 ++--- source/rr/src/game.cpp | 5 +- source/rr/src/player.cpp | 2 +- source/rr/src/rrdh.cpp | 2 +- source/rr/src/sounds.cpp | 2 - source/sw/src/colormap.cpp | 32 +++--- source/sw/src/game.cpp | 1 - 22 files changed, 204 insertions(+), 191 deletions(-) diff --git a/source/blood/src/screen.cpp b/source/blood/src/screen.cpp index 8cec4cf7b..c89d4242c 100644 --- a/source/blood/src/screen.cpp +++ b/source/blood/src/screen.cpp @@ -80,13 +80,10 @@ void scrLoadPLUs(void) auto data = fileSystem.GetFileData(lump); if (data.Size() != 64 * 256) I_FatalError("Incorrect PLU size"); - paletteSetLookupTable(i, data.Data()); + lookups.setTable(i, data.Data()); } - palookupfog[1].r = 255; - palookupfog[1].g = 255; - palookupfog[1].b = 255; - palookupfog[1].f = 1; + lookups.setFadeColor(1, 255, 255, 255); } glblend_t const bloodglblend = diff --git a/source/build/include/palette.h b/source/build/include/palette.h index 8c0827167..d9579150b 100644 --- a/source/build/include/palette.h +++ b/source/build/include/palette.h @@ -28,24 +28,65 @@ #define NORMALPAL (MAXPALOOKUPS - 4) #define BRIGHTPAL (MAXPALOOKUPS) -extern FString LookupTables[MAXPALOOKUPS]; -inline const uint8_t *paletteGetLookupTable(int num) +struct LookupTable { - return (const uint8_t*)LookupTables[num].GetChars(); -} + FString Shades; + PalEntry FadeColor = 0; + float Visibility = 0; + bool hasBrightmap = false; + bool noFloorPal = false; +}; -inline void paletteCopyLookupTable(int dest, int src) +struct LookupTableInfo { - LookupTables[dest] = LookupTables[src]; -} -inline bool paletteCheckLookupTable(int num) -{ - return LookupTables[num].Len() > 0; -} -inline void paletteClearLookupTable(int num) -{ - LookupTables[num] = ""; -} + LookupTable tables[MAXPALOOKUPS]; + + const uint8_t* getTable(int num) + { + if (tables[num].Shades.Len() == 0) num = 0; + return (const uint8_t*)tables[num].Shades.GetChars(); + } + + bool checkTable(int num) + { + return tables[num].Shades.IsNotEmpty(); + } + + void copyTable(int dest, int src) + { + tables[dest].Shades = tables[src].Shades; + } + + void clearTable(int dest) + { + tables[dest].Shades = ""; + } + + void makeTable(int palnum, const uint8_t* remapbuf, int r, int g, int b, bool noFloorPal); + int setTable(int palnum, const uint8_t* remap); + void postLoadTables(); + int loadTable(FileReader& fp); + void postLoadLookups(); + void setupDefaultFog(); + + void setFadeColor(int num, int r, int g, int b) + { + tables[num].FadeColor = PalEntry(1, r, g, b); + } + + PalEntry getFade(int num) + { + return tables[num].FadeColor; + } + + bool noFloorPal(int num) const + { + return tables[num].noFloorPal; + } + +}; + +extern LookupTableInfo lookups; enum { @@ -63,9 +104,7 @@ struct palette_t extern PalEntry palfadergb; -void paletteMakeLookupTable(int32_t palnum, const uint8_t *remapbuf, uint8_t r, uint8_t g, uint8_t b, char noFloorPal); void paletteSetColorTable(int32_t id, uint8_t const* table, bool notransparency, bool twodonly); -int32_t paletteSetLookupTable(int32_t palnum, const uint8_t *shtab); #include "tflags.h" enum ESetPalFlag @@ -98,20 +137,9 @@ void videoTintBlood(int32_t r, int32_t g, int32_t b); extern int32_t globalpal; extern int32_t globalblend; extern void paletteLoadFromDisk(void); -extern void palettePostLoadTables(void); -extern int32_t paletteLoadLookupTable(FileReader &fp); -extern void paletteSetupDefaultFog(void); -void paletteFreeLookups(); -extern void palettePostLoadLookups(void); -extern void paletteFixTranslucencyMask(void); - -extern int8_t g_noFloorPal[MAXPALOOKUPS]; - -extern char britable[16][256]; #ifdef USE_OPENGL -extern palette_t palookupfog[MAXPALOOKUPS]; typedef struct glblenddef_ { diff --git a/source/build/src/defs.cpp b/source/build/src/defs.cpp index d660511e2..295c048c2 100644 --- a/source/build/src/defs.cpp +++ b/source/build/src/defs.cpp @@ -469,7 +469,7 @@ static int32_t defsparser(scriptfile *script) g = clamp(g, 0, 63); b = clamp(b, 0, 63); - paletteMakeLookupTable(p, NULL, r<<2, g<<2, b<<2, 1); + lookups.makeTable(p, NULL, r<<2, g<<2, b<<2, 1); } break; case T_NOFLOORPALRANGE: @@ -482,8 +482,8 @@ static int32_t defsparser(scriptfile *script) b = max(b, 1); e = min(e, MAXPALOOKUPS-1); - for (i=b; i<=e; i++) - g_noFloorPal[i] = 1; + for (i = b; i <= e; i++) + lookups.tables[i].noFloorPal = true; } break; case T_LOADGRP: @@ -2059,8 +2059,8 @@ static int32_t defsparser(scriptfile *script) // NOTE: all palookups are initialized, i.e. non-NULL! // NOTE2: aliasing (pal==remappal) is OK - paletteMakeLookupTable(pal, paletteGetLookupTable(remappal), red<<2, green<<2, blue<<2, - remappal==0 ? 1 : (nofloorpal == -1 ? g_noFloorPal[remappal] : nofloorpal)); + lookups.makeTable(pal, lookups.getTable(remappal), red<<2, green<<2, blue<<2, + remappal==0 ? 1 : (nofloorpal == -1 ? lookups.tables[remappal].noFloorPal : nofloorpal)); } break; case T_TEXTURE: @@ -2847,7 +2847,7 @@ static int32_t defsparser(scriptfile *script) { didLoadShade = 1; numshades = 32; - paletteSetLookupTable(id, palookupbuf.Data()); + lookups.setTable(id, palookupbuf.Data()); } else { @@ -2858,7 +2858,7 @@ static int32_t defsparser(scriptfile *script) break; } - paletteMakeLookupTable(id, palookupbuf.Data(), 0,0,0, g_noFloorPal[id]); + lookups.makeTable(id, palookupbuf.Data(), 0,0,0, lookups.tables[id].noFloorPal); } break; } @@ -2881,8 +2881,8 @@ static int32_t defsparser(scriptfile *script) break; } - if (paletteCheckLookupTable(source) || id > 0) // do not overwrite the base with an empty table. - paletteCopyLookupTable(id, source); + if (lookups.checkTable(source) || id > 0) // do not overwrite the base with an empty table. + lookups.copyTable(id, source); didLoadShade = 1; break; } @@ -2928,7 +2928,7 @@ static int32_t defsparser(scriptfile *script) break; } - paletteMakeLookupTable(id, NULL, red, green, blue, 1); + lookups.makeTable(id, NULL, red, green, blue, 1); break; } case T_MAKEPALOOKUP: @@ -2989,23 +2989,23 @@ static int32_t defsparser(scriptfile *script) break; } - paletteMakeLookupTable(id, NULL, red, green, blue, g_noFloorPal[id]); + lookups.makeTable(id, NULL, red, green, blue, lookups.tables[id].noFloorPal); break; } case T_NOFLOORPAL: { - g_noFloorPal[id] = 1; + lookups.tables[id].noFloorPal = 1; break; } case T_FLOORPAL: { - g_noFloorPal[id] = 0; + lookups.tables[id].noFloorPal = 0; break; } case T_UNDEF: { - paletteClearLookupTable(id); + lookups.clearTable(id); didLoadShade = 0; if (id == 0) paletteloaded &= ~PALETTE_SHADE; @@ -3360,7 +3360,7 @@ static int32_t defsparser(scriptfile *script) } for (bssize_t i = id0; i <= id1; i++) - paletteClearLookupTable(i); + lookups.clearTable(i); if (id0 == 0) paletteloaded &= ~PALETTE_SHADE; diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index f0fad7063..70083069d 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -128,8 +128,6 @@ static int32_t qradarang[10240]; uint16_t ATTRIBUTE((used)) sqrtable[4096], ATTRIBUTE((used)) shlookup[4096+256], ATTRIBUTE((used)) sqrtable_old[2048]; -char britable[16][256]; // JBF 20040207: full 8bit precision - static char kensmessage[128]; const char *engineerrstr = "No error"; @@ -1570,24 +1568,6 @@ static void dosetaspect(void) } -// -// loadtables (internal) -// -static inline void calcbritable(void) -{ - int32_t i, j; - float a, b; - - for (i=0; i<16; i++) - { - a = 8.f / ((float)i+8.f); - b = 255.f / powf(255.f, a); - - for (j=0; j<256; j++) // JBF 20040207: full 8bit precision - britable[i][j] = (uint8_t) (powf((float)j, a) * b); - } -} - static int32_t engineLoadTables(void) { static char tablesloaded = 0; @@ -1618,8 +1598,6 @@ static int32_t engineLoadTables(void) for (i=0; i<5120; i++) qradarang[10239-i] = -qradarang[i]; - calcbritable(); - tablesloaded = 1; } @@ -2126,7 +2104,7 @@ int32_t enginePostInit(void) I_FatalError("No translucency table found."); V_LoadTranslations(); // loading the translations must be delayed until the palettes have been fully set up. - palettePostLoadTables(); + lookups.postLoadTables(); TileFiles.SetupReverseTileMap(); return 0; } diff --git a/source/build/src/palette.cpp b/source/build/src/palette.cpp index 0ec0287da..dab300769 100644 --- a/source/build/src/palette.cpp +++ b/source/build/src/palette.cpp @@ -24,24 +24,12 @@ #include "v_font.h" #include "../../glbackend/glbackend.h" -// FString is a nice and convenient way to have automatically managed shared storage. -FString LookupTables[MAXPALOOKUPS]; +LookupTableInfo lookups; uint8_t curbasepal; int32_t globalblend; - PalEntry palfadergb; -#if defined(USE_OPENGL) -palette_t palookupfog[MAXPALOOKUPS]; -#endif - -// For every pal number, whether tsprite pal should not be taken over from -// floor pal. -// NOTE: g_noFloorPal[0] is irrelevant as it's never checked. -int8_t g_noFloorPal[MAXPALOOKUPS]; - - //========================================================================== // // Adds a palette to the global list of base palettes @@ -136,7 +124,7 @@ void paletteLoadFromDisk(void) int length = numshades * 256; auto buffer = fil.Read(length); if (buffer.Size() != length) return; - LookupTables[0] = FString((char*)buffer.Data(), length); + lookups.setTable(0, buffer.Data()); paletteloaded |= PALETTE_SHADE; paletteloaded |= PALETTE_TRANSLUC; @@ -148,30 +136,53 @@ void paletteLoadFromDisk(void) // //========================================================================== -void palettePostLoadTables(void) +void LookupTableInfo::postLoadTables(void) { globalpal = 0; - GPalette.GenerateGlobalBrightmapFromColormap(paletteGetLookupTable(0), numshades); -} + GPalette.GenerateGlobalBrightmapFromColormap(getTable(0), numshades); -//========================================================================== -// -// Ensure that all lookups map 255 to itself to preserve transparency. -// -//========================================================================== - -void paletteFixTranslucencyMask(void) -{ - for (auto &thispalookup : LookupTables) + // Try to detect fullbright translations. Unfortunately this cannot be used to detect fade strength because of loss of color precision in the palette map. + for (int j = 0; j < MAXPALOOKUPS; j++) { - if (thispalookup.IsEmpty()) - continue; - - for (int j = 0; j < numshades; j++) + auto lookup = tables[j].Shades; + if (lookup.Len() > 0) { - auto p = thispalookup.LockBuffer(); - p[(j << 8) + 255] = 255; - thispalookup.UnlockBuffer(); + auto basetable = (uint8_t*)lookup.GetChars(); + auto midtable = basetable + ((numshades / 2) - 1) * 256; + int lumibase = 0, lumimid = 0; + for (int i = 1; i < 255; i++) // intentionally leave out 0 and 255, because the table here is not translucency adjusted to the palette. + { + lumibase += GPalette.BaseColors[basetable[i]].Amplitude(); + lumimid += GPalette.BaseColors[midtable[i]].Amplitude(); + } + float divider = float(lumimid) / float(lumibase); + bool isbright = false; + if (divider > 0.9) + { + shadediv[j] = 1 / 10000.f; // this translation is fullbright. + } + else + { + // Fullbright lookups do not need brightmaps. + auto fog = tables[j].FadeColor; + if (GPalette.HasGlobalBrightmap && fog.r == 0 && fog.g == 0 && fog.b == 0) + { + isbright = true; + // A translation is fullbright only if all fullbright colors in the base table are mapped to another fullbright color. + auto brightmap = GPalette.GlobalBrightmap.Remap; + for (int i = 1; i < 255; i++) // This also ignores entries 0 and 255 for the same reason as above. + { + int map = basetable[i]; + if (brightmap[i] == GPalette.WhiteIndex && brightmap[map] != GPalette.WhiteIndex) + { + isbright = false; + break; + } + } + } + } + tables[j].hasBrightmap = isbright; + DPrintf(DMSG_NOTIFY, "Lookup %d is %sbright\n", j, isbright ? "" : "not "); } } } @@ -182,7 +193,7 @@ void paletteFixTranslucencyMask(void) // //========================================================================== -int32_t paletteLoadLookupTable(FileReader &fp) +int32_t LookupTableInfo::loadTable(FileReader &fp) { uint8_t remapbuf[256]; int numlookups = fp.ReadUInt8(); @@ -201,7 +212,7 @@ int32_t paletteLoadLookupTable(FileReader &fp) Printf("ERROR: attempt to load lookup at reserved pal %d\n", palnum); } else - paletteMakeLookupTable(palnum, remapbuf, 0, 0, 0, 0); + makeTable(palnum, remapbuf, 0, 0, 0, 0); } return 0; @@ -213,17 +224,16 @@ int32_t paletteLoadLookupTable(FileReader &fp) // //========================================================================== -void paletteSetupDefaultFog(void) +void LookupTableInfo::setupDefaultFog(void) { for (int j = 1; j <= 255 - 3; j++) { - if (LookupTables[j].IsEmpty() && LookupTables[j + 1].IsEmpty() && LookupTables[j + 2].IsEmpty() && LookupTables[j + 3].IsEmpty()) + if (tables[j].Shades.IsEmpty() && tables[j+1].Shades.IsEmpty() && tables[j + 2].Shades.IsEmpty() && tables[j + 3].Shades.IsEmpty()) { - paletteMakeLookupTable(j, NULL, 60, 60, 60, 1); - paletteMakeLookupTable(j + 1, NULL, 60, 0, 0, 1); - paletteMakeLookupTable(j + 2, NULL, 0, 60, 0, 1); - paletteMakeLookupTable(j + 3, NULL, 0, 0, 60, 1); - + makeTable(j, NULL, 60, 60, 60, 1); + makeTable(j + 1, NULL, 60, 0, 0, 1); + makeTable(j + 2, NULL, 0, 60, 0, 1); + makeTable(j + 3, NULL, 0, 0, 60, 1); break; } } @@ -235,7 +245,7 @@ void paletteSetupDefaultFog(void) // //========================================================================== -void palettePostLoadLookups(void) +void LookupTableInfo::postLoadLookups() { int numpalettes = GPalette.NumTranslations(Translation_BasePalettes); if (numpalettes == 0) return; @@ -255,9 +265,9 @@ void palettePostLoadLookups(void) { for (int l = 0; l < MAXPALOOKUPS; l++) { - if (!LookupTables[l].IsEmpty()) + if (!tables[l].Shades.IsEmpty()) { - const uint8_t* lookup = (uint8_t*)LookupTables[l].GetChars(); + const uint8_t* lookup = (uint8_t*)tables[l].Shades.GetChars(); FRemapTable remap; if (i == 0 || (palette != basepalette && !palette->Inactive)) { @@ -274,20 +284,23 @@ void palettePostLoadLookups(void) } } } - // Swap colors 0 and 255 in all tables so that all paletted images have their transparent color at index 0. - // This means: - // - Swap palette and remap entries in all stored remap tables - // - change all remap entries of 255 to 0 and vice versa + // Assuming that color 255 is always transparent, do the following: + // Copy color 0 to color 255 + // Set color 0 to transparent black + // Swap all remap entries from 0 to 255 and vice versa + // Always map 0 to 0. auto colorswap = [](FRemapTable* remap) { - std::swap(remap->Palette[0], remap->Palette[255]); - std::swap(remap->Remap[0], remap->Remap[255]); + remap->Palette[255] = remap->Palette[0]; + remap->Palette[0] = 0; + remap->Remap[255] = remap->Remap[0]; for (auto& c : remap->Remap) { if (c == 0) c = 255; else if (c == 255) c = 0; } + remap->Remap[0] = 0; }; for (auto remap : GPalette.uniqueRemaps) @@ -304,12 +317,12 @@ void palettePostLoadLookups(void) // //========================================================================== -int32_t paletteSetLookupTable(int32_t palnum, const uint8_t *shtab) +int32_t LookupTableInfo::setTable(int palnum, const uint8_t *shtab) { if (shtab != NULL) { int length = numshades * 256; - LookupTables[palnum] = FString((const char*)shtab, length); + tables[palnum].Shades = FString((const char*)shtab, length); } return 0; @@ -321,7 +334,7 @@ int32_t paletteSetLookupTable(int32_t palnum, const uint8_t *shtab) // //========================================================================== -void paletteMakeLookupTable(int32_t palnum, const uint8_t *remapbuf, uint8_t r, uint8_t g, uint8_t b, char noFloorPal) +void LookupTableInfo::makeTable(int palnum, const uint8_t *remapbuf, int r, int g, int b, bool noFloorPal) { uint8_t idmap[256]; @@ -329,13 +342,13 @@ void paletteMakeLookupTable(int32_t palnum, const uint8_t *remapbuf, uint8_t r, if (paletteloaded == 0 || (unsigned)palnum >= MAXPALOOKUPS) return; - g_noFloorPal[palnum] = noFloorPal; + tables[palnum].noFloorPal = noFloorPal; if (remapbuf == nullptr) { if (r == 0 || g == 0 || b == 0) { - paletteClearLookupTable(palnum); + clearTable(palnum); return; } @@ -344,12 +357,12 @@ void paletteMakeLookupTable(int32_t palnum, const uint8_t *remapbuf, uint8_t r, } int length = numshades * 256; - auto p = LookupTables[palnum].LockNewBuffer(length); + auto p = tables[palnum].Shades.LockNewBuffer(length); if (r == 0 || g == 0 || b == 0) { // "black fog"/visibility case -- only remap color indices - auto src = paletteGetLookupTable(0); + auto src = getTable(0); for (int j = 0; j < numshades; j++) for (int i = 0; i < 256; i++) @@ -374,12 +387,10 @@ void paletteMakeLookupTable(int32_t palnum, const uint8_t *remapbuf, uint8_t r, } } -#if defined(USE_OPENGL) - palookupfog[palnum].r = r; - palookupfog[palnum].g = g; - palookupfog[palnum].b = b; - palookupfog[palnum].f = 1; -#endif + tables[palnum].FadeColor.r = r; + tables[palnum].FadeColor.g = g; + tables[palnum].FadeColor.b = b; + tables[palnum].FadeColor.a = 1; } diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp index c97ff5643..8a7d2ed96 100644 --- a/source/build/src/polymost.cpp +++ b/source/build/src/polymost.cpp @@ -373,7 +373,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32 return; } - if (!paletteCheckLookupTable(globalpal)) + if (!lookups.checkTable(globalpal)) globalpal = 0; //Load texture (globalpicnum) @@ -4568,7 +4568,7 @@ static void polymost_precache(int32_t dapicnum, int32_t dapalnum, int32_t datype // while sprites are clamped if (videoGetRenderMode() < REND_POLYMOST) return; - if ((dapalnum < (MAXPALOOKUPS - RESERVEDPALS)) && (!paletteCheckLookupTable(dapalnum))) return;//dapalnum = 0; + if ((dapalnum < (MAXPALOOKUPS - RESERVEDPALS)) && (!lookups.checkTable(dapalnum))) return;//dapalnum = 0; //Printf("precached %d %d type %d\n", dapicnum, dapalnum, datype); hicprecaching = 1; diff --git a/source/core/rendering/v_video.cpp b/source/core/rendering/v_video.cpp index 85c0d799f..65821f0a8 100644 --- a/source/core/rendering/v_video.cpp +++ b/source/core/rendering/v_video.cpp @@ -361,7 +361,7 @@ void V_InitScreen() void V_Init2() { - palettePostLoadLookups(); + lookups.postLoadLookups(); twod = &twodgen; float gamma = static_cast(screen)->Gamma; diff --git a/source/core/textures/buildtiles.cpp b/source/core/textures/buildtiles.cpp index 29d92ca73..ad4217257 100644 --- a/source/core/textures/buildtiles.cpp +++ b/source/core/textures/buildtiles.cpp @@ -600,7 +600,7 @@ void tileCopy(int tile, int source, int pal, int xoffset, int yoffset, int flags if (pal != -1) { - auto remap = paletteGetLookupTable(pal); + auto remap = lookups.getTable(pal); for (auto& pixel : buffer) { pixel = remap[pixel]; diff --git a/source/duke3d/src/common.cpp b/source/duke3d/src/common.cpp index 14406a643..2ecbfe879 100644 --- a/source/duke3d/src/common.cpp +++ b/source/duke3d/src/common.cpp @@ -110,7 +110,7 @@ void G_LoadLookups(void) if (!fr.isOpen()) return; - j = paletteLoadLookupTable(fr); + j = lookups.loadTable(fr); if (j < 0) { diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index 372e713cd..ed3ee558c 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -3252,7 +3252,7 @@ static int G_MaybeTakeOnFloorPal(tspriteptr_t pSprite, int sectNum) { int const floorPal = sector[sectNum].floorpal; - if (floorPal && !g_noFloorPal[floorPal] && !A_CheckSpriteFlags(pSprite->owner, SFLAG_NOPAL)) + if (floorPal && !lookups.noFloorPal(floorPal) && !A_CheckSpriteFlags(pSprite->owner, SFLAG_NOPAL)) { pSprite->pal = floorPal; return 1; @@ -5258,10 +5258,7 @@ static inline void G_CheckGametype(void) static void G_PostLoadPalette(void) { if (!(duke3d_globalflags & DUKE3D_NO_HARDCODED_FOGPALS)) - paletteSetupDefaultFog(); - - if (!(duke3d_globalflags & DUKE3D_NO_PALETTE_CHANGES)) - paletteFixTranslucencyMask(); + lookups.setupDefaultFog(); } #define SETFLAG(Tilenum, Flag) g_tile[Tilenum].flags |= Flag diff --git a/source/duke3d/src/gamestructures.cpp b/source/duke3d/src/gamestructures.cpp index 2e6650614..201089904 100644 --- a/source/duke3d/src/gamestructures.cpp +++ b/source/duke3d/src/gamestructures.cpp @@ -1917,7 +1917,7 @@ int32_t __fastcall VM_GetPalData(int const palNum, int32_t labelNum) switch (labelNum) { - case PALDATA_NOFLOORPAL: labelNum = g_noFloorPal[palNum]; break; + case PALDATA_NOFLOORPAL: labelNum = lookups.noFloorPal(palNum); break; default: EDUKE32_UNREACHABLE_SECTION(labelNum = -1; break); } diff --git a/source/duke3d/src/player.cpp b/source/duke3d/src/player.cpp index 43bcf0f5c..552c5b41b 100644 --- a/source/duke3d/src/player.cpp +++ b/source/duke3d/src/player.cpp @@ -1803,7 +1803,7 @@ int P_GetHudPal(const DukePlayer_t *p) if (p->cursectnum >= 0) { int const hudPal = sector[p->cursectnum].floorpal; - if (!g_noFloorPal[hudPal]) + if (!lookups.noFloorPal(hudPal)) return hudPal; } diff --git a/source/duke3d/src/sounds.cpp b/source/duke3d/src/sounds.cpp index c436f7e47..d2b703c58 100644 --- a/source/duke3d/src/sounds.cpp +++ b/source/duke3d/src/sounds.cpp @@ -98,8 +98,6 @@ void cacheAllSounds(void) for(auto &snd : sfx) { soundEngine->CacheSound(&snd); - if (((++i)&31) == 0) - gameHandleEvents(); } } diff --git a/source/exhumed/src/light.cpp b/source/exhumed/src/light.cpp index 7a5034e3f..f04f91fc6 100644 --- a/source/exhumed/src/light.cpp +++ b/source/exhumed/src/light.cpp @@ -93,7 +93,7 @@ int LoadPaletteLookups() } hFile.Read(buffer, 256*64); - paletteSetLookupTable(i, buffer); + lookups.setTable(i, buffer); bGreenPal = 0; diff --git a/source/glbackend/gl_palmanager.cpp b/source/glbackend/gl_palmanager.cpp index 514f90bc8..a37f56499 100644 --- a/source/glbackend/gl_palmanager.cpp +++ b/source/glbackend/gl_palmanager.cpp @@ -120,8 +120,8 @@ void PaletteManager::BindPalette(int index) void PaletteManager::BindPalswap(int index) { - if (LookupTables[index].Len() == 0) index = 0; - if (LookupTables[index].Len() > 0) + if (!lookups.checkTable(index)) index = 0; + if (lookups.checkTable(index)) { if (index != lastsindex) { @@ -130,12 +130,22 @@ void PaletteManager::BindPalswap(int index) { auto p = GLInterface.NewTexture(); p->CreateTexture(256, numshades, FHardwareTexture::Indexed, false); - p->LoadTexture((uint8_t*)LookupTables[index].GetChars()); + + // Perform a 0<->255 index swap. The lookup tables are still the original data. + TArray lookup(numshades * 256, true); + memcpy(lookup.Data(), lookups.getTable(index), lookup.Size()); + for (int i = 0; i < numshades; i++) + { + auto p = &lookup[i * 256]; + p[255] = p[0]; + p[0] = 0; + } + p->LoadTexture(lookup.Data()); p->SetSampler(SamplerNoFilterClampXY); palswaptextures[index] = p; } inst->BindTexture(1, palswaptextures[index]); - inst->SetFadeColor(PalEntry(palookupfog[index].r, palookupfog[index].g, palookupfog[index].b)); + inst->SetFadeColor(lookups.getFade(index)); } } diff --git a/source/rr/src/common.cpp b/source/rr/src/common.cpp index 667021a4f..1f3ad3127 100644 --- a/source/rr/src/common.cpp +++ b/source/rr/src/common.cpp @@ -109,7 +109,7 @@ void G_LoadLookups(void) if (!fr.isOpen()) return; - j = paletteLoadLookupTable(fr); + j = lookups.loadTable(fr); if (j < 0) { @@ -152,16 +152,16 @@ void G_LoadLookups(void) for (bssize_t i = 0; i < 32; i++) table[i] = i+32; - paletteMakeLookupTable(7, table, 0, 0, 0, 0); + lookups.makeTable(7, table, 0, 0, 0, 0); for (bssize_t i = 0; i < 256; i++) table[i] = i; - paletteMakeLookupTable(30, table, 0, 0, 0, 0); - paletteMakeLookupTable(31, table, 0, 0, 0, 0); - paletteMakeLookupTable(32, table, 0, 0, 0, 0); - paletteMakeLookupTable(33, table, 0, 0, 0, 0); + lookups.makeTable(30, table, 0, 0, 0, 0); + lookups.makeTable(31, table, 0, 0, 0, 0); + lookups.makeTable(32, table, 0, 0, 0, 0); + lookups.makeTable(33, table, 0, 0, 0, 0); if (RRRA) - paletteMakeLookupTable(105, table, 0, 0, 0, 0); + lookups.makeTable(105, table, 0, 0, 0, 0); j = 63; for (bssize_t i = 64; i < 80; i++) @@ -174,19 +174,19 @@ void G_LoadLookups(void) table[81] = 81; for (bssize_t i = 0; i < 32; i++) table[i] = i+32; - paletteMakeLookupTable(34, table, 0, 0, 0, 0); + lookups.makeTable(34, table, 0, 0, 0, 0); for (bssize_t i = 0; i < 256; i++) table[i] = i; for (bssize_t i = 0; i < 16; i++) table[i] = i+129; for (bssize_t i = 16; i < 32; i++) table[i] = i+192; - paletteMakeLookupTable(35, table, 0, 0, 0, 0); + lookups.makeTable(35, table, 0, 0, 0, 0); if (RRRA) { - paletteMakeLookupTable(50, NULL, 12 * 4, 12 * 4, 12 * 4, 0); - paletteMakeLookupTable(51, NULL, 12 * 4, 12 * 4, 12 * 4, 0); - paletteMakeLookupTable(54, paletteGetLookupTable(8), 32 * 4, 32 * 4, 32 * 4, 0); + lookups.makeTable(50, NULL, 12 * 4, 12 * 4, 12 * 4, 0); + lookups.makeTable(51, NULL, 12 * 4, 12 * 4, 12 * 4, 0); + lookups.makeTable(54, lookups.getTable(8), 32 * 4, 32 * 4, 32 * 4, 0); } } } diff --git a/source/rr/src/game.cpp b/source/rr/src/game.cpp index aba0efbf7..7eb8130b8 100644 --- a/source/rr/src/game.cpp +++ b/source/rr/src/game.cpp @@ -4357,7 +4357,7 @@ static int G_MaybeTakeOnFloorPal(tspritetype *pSprite, int sectNum) { int const floorPal = sector[sectNum].floorpal; - if (floorPal && !g_noFloorPal[floorPal] && !A_CheckSpriteFlags(pSprite->owner, SFLAG_NOPAL)) + if (floorPal && !lookups.noFloorPal(floorPal) && !A_CheckSpriteFlags(pSprite->owner, SFLAG_NOPAL)) { pSprite->pal = floorPal; return 1; @@ -6603,9 +6603,6 @@ static void G_PostLoadPalette(void) { //if (!(duke3d_globalflags & DUKE3D_NO_HARDCODED_FOGPALS)) // paletteSetupDefaultFog(); - - if (!(duke3d_globalflags & DUKE3D_NO_PALETTE_CHANGES)) - paletteFixTranslucencyMask(); } #define SETFLAG(Tilenum, Flag) g_tile[Tilenum].flags |= Flag diff --git a/source/rr/src/player.cpp b/source/rr/src/player.cpp index 6194e7989..007418fa7 100644 --- a/source/rr/src/player.cpp +++ b/source/rr/src/player.cpp @@ -1423,7 +1423,7 @@ int P_GetHudPal(const DukePlayer_t *p) if (p->cursectnum >= 0) { int const hudPal = sector[p->cursectnum].floorpal; - if (!g_noFloorPal[hudPal]) + if (!lookups.noFloorPal(hudPal)) return hudPal; } diff --git a/source/rr/src/rrdh.cpp b/source/rr/src/rrdh.cpp index 62706aaf6..51606eecc 100644 --- a/source/rr/src/rrdh.cpp +++ b/source/rr/src/rrdh.cpp @@ -4335,7 +4335,7 @@ void sub_59C20(void) } for (i = 0; i < 256; i++) table[i] = i; - paletteMakeLookupTable(2, table, 10*4, 10*4, 24*4, 0); + lookups.makeTable(2, table, 10*4, 10*4, 24*4, 0); } int dword_2BEA20, dword_2BEA24; diff --git a/source/rr/src/sounds.cpp b/source/rr/src/sounds.cpp index 562e18f3a..e02b56d96 100644 --- a/source/rr/src/sounds.cpp +++ b/source/rr/src/sounds.cpp @@ -97,8 +97,6 @@ void cacheAllSounds(void) for(auto &snd : sfx) { soundEngine->CacheSound(&snd); - if (((++i)&31) == 0) - G_HandleAsync(); } } diff --git a/source/sw/src/colormap.cpp b/source/sw/src/colormap.cpp index b5018608a..4913cb59f 100644 --- a/source/sw/src/colormap.cpp +++ b/source/sw/src/colormap.cpp @@ -228,31 +228,31 @@ InitPalette(void) for (i = 0; i < 256; i++) tempbuf[i] = i; // palette for underwater - paletteMakeLookupTable(PALETTE_DIVE, tempbuf, 0, 0, FOG_AMT, TRUE); + lookups.makeTable(PALETTE_DIVE, tempbuf, 0, 0, FOG_AMT, TRUE); for (i = 0; i < 256; i++) tempbuf[i] = i; - paletteMakeLookupTable(PALETTE_FOG, tempbuf, FOG_AMT, FOG_AMT, FOG_AMT, TRUE); + lookups.makeTable(PALETTE_FOG, tempbuf, FOG_AMT, FOG_AMT, FOG_AMT, TRUE); for (i = 0; i < 256; i++) tempbuf[i] = i; - paletteMakeLookupTable(PALETTE_DIVE_LAVA, tempbuf, LAVA_AMT, 0, 0, TRUE); + lookups.makeTable(PALETTE_DIVE_LAVA, tempbuf, LAVA_AMT, 0, 0, TRUE); // // 1 Range changes // MapColors(PALETTE_BROWN_RIPPER, BrownRipper, TRUE, tempbuf); - paletteMakeLookupTable(PALETTE_BROWN_RIPPER, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_BROWN_RIPPER, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_SKEL_GORE, SkelGore, TRUE, tempbuf); - paletteMakeLookupTable(PALETTE_SKEL_GORE, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_SKEL_GORE, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_ELECTRO_GORE, ElectroGore, TRUE, tempbuf); - paletteMakeLookupTable(PALETTE_ELECTRO_GORE, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_ELECTRO_GORE, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_MENU_HIGHLIGHT, MenuHighlight, TRUE, tempbuf); - paletteMakeLookupTable(PALETTE_MENU_HIGHLIGHT, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_MENU_HIGHLIGHT, tempbuf, 0, 0, 0, TRUE); // // Multiple range changes @@ -261,44 +261,44 @@ InitPalette(void) MapColors(PALETTE_BASIC_NINJA, NinjaBasic[0], TRUE, tempbuf); for (i = 1; i < SIZ(NinjaBasic); i++) MapColors(PALETTE_BASIC_NINJA, NinjaBasic[i], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_BASIC_NINJA, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_BASIC_NINJA, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_RED_NINJA, NinjaRed[0], TRUE, tempbuf); for (i = 1; i < SIZ(NinjaRed); i++) MapColors(PALETTE_RED_NINJA, NinjaRed[i], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_RED_NINJA, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_RED_NINJA, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_GREEN_NINJA, NinjaGreen[0], TRUE, tempbuf); for (i = 1; i < SIZ(NinjaGreen); i++) MapColors(PALETTE_GREEN_NINJA, NinjaGreen[i], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_GREEN_NINJA, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_GREEN_NINJA, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_GREEN_LIGHTING, AllToGreen[0], TRUE, tempbuf); for (i = 1; i < SIZ(AllToGreen); i++) MapColors(PALETTE_GREEN_LIGHTING, AllToGreen[i], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_GREEN_LIGHTING, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_GREEN_LIGHTING, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_RED_LIGHTING, AllToRed[0], TRUE, tempbuf); for (i = 1; i < SIZ(AllToRed); i++) MapColors(PALETTE_RED_LIGHTING, AllToRed[i], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_RED_LIGHTING, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_RED_LIGHTING, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_BLUE_LIGHTING, AllToBlue[0], TRUE, tempbuf); for (i = 1; i < SIZ(AllToBlue); i++) MapColors(PALETTE_BLUE_LIGHTING, AllToBlue[i], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_BLUE_LIGHTING, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_BLUE_LIGHTING, tempbuf, 0, 0, 0, TRUE); MapColors(PALETTE_ILLUMINATE, Illuminate[0], TRUE, tempbuf); for (i = 1; i < SIZ(Illuminate); i++) MapColors(PALETTE_ILLUMINATE, Illuminate[i], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_ILLUMINATE, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_ILLUMINATE, tempbuf, 0, 0, 0, TRUE); // PLAYER COLORS - ALSO USED FOR OTHER THINGS for (play = 0; play < PLAYER_COLOR_MAPS; play++) { MapColors(PALETTE_PLAYER0 + play, PlayerColorMap[play][0], TRUE, tempbuf); MapColors(PALETTE_PLAYER0 + play, PlayerColorMap[play][0], FALSE, tempbuf); - paletteMakeLookupTable(PALETTE_PLAYER0 + play, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_PLAYER0 + play, tempbuf, 0, 0, 0, TRUE); } // @@ -310,7 +310,7 @@ InitPalette(void) // invert the brown palette for (i = 0; i < 32; i++) tempbuf[LT_BROWN + i] = (LT_BROWN + 32) - i; - paletteMakeLookupTable(PALETTE_SLUDGE, tempbuf, 0, 0, 0, TRUE); + lookups.makeTable(PALETTE_SLUDGE, tempbuf, 0, 0, 0, TRUE); } diff --git a/source/sw/src/game.cpp b/source/sw/src/game.cpp index 7ceea649b..b7a192a0b 100644 --- a/source/sw/src/game.cpp +++ b/source/sw/src/game.cpp @@ -816,7 +816,6 @@ bool InitGame() enginePostInit(); - paletteFixTranslucencyMask(); V_Init2(); DemoModeMenuInit = TRUE;