1 // "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
2 // Ken Silverman's official web site: "http://www.advsys.net/ken"
3 // See the included license file "BUILDLIC.TXT" for license info.
4 //
5 // This file has been modified from Ken Silverman's original release
6 // by Jonathon Fowler (jf@jonof.id.au)
7 // by the EDuke32 team (development@voidpoint.com)
8
9 #pragma once
10
11 #ifndef palette_h_
12 #define palette_h_
13
14 #include "cache1d.h"
15 #include "vfs.h"
16 #include "xxhash.h"
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21
22 #define MAXBASEPALS 256
23 #define MAXPALOOKUPS 256
24 #define MAXBLENDTABS 256
25
26 #define RESERVEDPALS 4 // don't forget to increment this when adding reserved pals
27 #define DETAILPAL (MAXPALOOKUPS - 1)
28 #define GLOWPAL (MAXPALOOKUPS - 2)
29 #define SPECULARPAL (MAXPALOOKUPS - 3)
30 #define NORMALPAL (MAXPALOOKUPS - 4)
31
32 extern uint8_t curbasepal;
33
34 #define paletteGetBlendTable(blend) (blendtable[blend])
35
36 extern uint8_t PaletteIndexFullbrights[32];
37 #define IsPaletteIndexFullbright(col) (PaletteIndexFullbrights[(col)>>3] & (1u<<((col)&7)))
38 #define SetPaletteIndexFullbright(col) (PaletteIndexFullbrights[(col)>>3] |= (1u<<((col)&7)))
39
40 typedef struct {
41 char r, g, b, f;
42 } palette_t;
43 typedef struct {
44 uint8_t r, g, b;
45 } rgb24_t;
46 extern palette_t curpalette[256], curpalettefaded[256], palfadergb;
47
48 extern char palfadedelta;
49 #ifdef USE_OPENGL
50 extern void fullscreen_tint_gl(uint8_t r, uint8_t g, uint8_t b, uint8_t f);
51 extern void fullscreen_tint_gl_blood(void);
52 #endif
53 extern void videoFadeToBlack(int32_t moreopaquep);
54 void paletteMakeLookupTable(int32_t palnum, const char *remapbuf, uint8_t r, uint8_t g, uint8_t b, char noFloorPal);
55 void paletteSetColorTable(int32_t id, uint8_t const *table);
56 void paletteFreeColorTable(int32_t id);
57 void paletteSetBlendTable(int32_t blend, const char *tab);
58 void paletteFreeBlendTable(int32_t blend);
59 int32_t paletteSetLookupTable(int32_t palnum, const uint8_t *shtab);
60 void paletteFreeLookupTable(int32_t palnum);
61 void videoSetPalette(char dabrightness, uint8_t dapalid, uint8_t flags);
62 void videoFadePalette(uint8_t r, uint8_t g, uint8_t b, uint8_t offset);
63 #ifdef USE_OPENGL
64 void videoTintBlood(int32_t r, int32_t g, int32_t b);
65 #endif
66
67 extern int32_t realmaxshade;
68 extern float frealmaxshade;
69
70 extern int32_t globalpal;
71 extern int32_t globalblend;
72 extern XXH64_hash_t g_lastpalettesum;
73 extern palette_t paletteGetColor(int32_t col);
74 extern void paletteLoadFromDisk(void);
75 extern void palettePostLoadTables(void);
76 extern void setup_blend(int32_t blend, int32_t doreverse);
77 extern uint8_t basepalreset;
78 extern int32_t curbrightness, gammabrightness;
79
80 extern int32_t paletteLoadLookupTable(buildvfs_kfd fp);
81 extern void paletteSetupDefaultFog(void);
82 extern void palettePostLoadLookups(void);
83 extern void paletteFixTranslucencyMask(void);
84
85 extern int8_t g_noFloorPal[MAXPALOOKUPS];
86
87 extern char britable[16][256];
88
89 #ifdef USE_OPENGL
90 extern palette_t palookupfog[MAXPALOOKUPS];
91 extern float palookupfogfactor[MAXPALOOKUPS];
92
bricolor(palette_t * wpptr,int32_t dacol)93 static inline void bricolor(palette_t *wpptr, int32_t dacol)
94 {
95 if (gammabrightness)
96 {
97 wpptr->r = curpalette[dacol].r;
98 wpptr->g = curpalette[dacol].g;
99 wpptr->b = curpalette[dacol].b;
100 }
101 else
102 {
103 wpptr->r = britable[curbrightness][curpalette[dacol].r];
104 wpptr->g = britable[curbrightness][curpalette[dacol].g];
105 wpptr->b = britable[curbrightness][curpalette[dacol].b];
106 }
107 }
108
109 enum
110 {
111 BLENDFACTOR_ZERO = 0,
112 BLENDFACTOR_ONE,
113 BLENDFACTOR_SRC_COLOR,
114 BLENDFACTOR_ONE_MINUS_SRC_COLOR,
115 BLENDFACTOR_SRC_ALPHA,
116 BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
117 BLENDFACTOR_DST_ALPHA,
118 BLENDFACTOR_ONE_MINUS_DST_ALPHA,
119 BLENDFACTOR_DST_COLOR,
120 BLENDFACTOR_ONE_MINUS_DST_COLOR,
121 NUMBLENDFACTORS,
122 };
123
124 typedef struct glblenddef_
125 {
126 float alpha;
127 uint8_t src, dst, flags;
128 } glblenddef_t;
129
130 typedef struct glblend_
131 {
132 glblenddef_t def[2];
133 } glblend_t;
134
135 extern glblend_t const nullglblend, defaultglblend;
136 extern glblend_t glblend[MAXBLENDTABS];
137
138 extern void handle_blend(uint8_t enable, uint8_t blend, uint8_t def);
139 #endif
140
141 #ifdef __cplusplus
142 }
143 #endif
144
145 #endif
146