Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • custom-map-names
  • draw2d-functions
  • dynabsp
  • escape-chars-in-tokenizer
  • fading-callback-thread-fix-master
  • fix-slope-plane-distortion
  • fixes-for-2190
  • flat1
  • floorsprite-clipping
  • gamepad-refactor
  • hub-gametype
  • hwportals
  • hwr-refactor-shaders
  • i_video-refactor-port
  • joystick-changes
  • legacy-drawmasked-port
  • levelstruct
  • lua-colormap-lib
  • master
  • multithread
  • next
  • polybsp
  • r-draw8-cpp-squashed
  • remap-fixes
  • renderer-refactor
  • rotation
  • rotation2
  • sdl-vsync
  • secondcolor-merged
  • sprite-portals
  • tc
  • text-prompt-features
  • why-does-it-look-like-that-tho
  • wipeloop-merged
  • wipeloop-rebased
  • yscr
  • zip-dir-refactor
37 results

Target

Select target project
  • STJr/SRB2
  • Sryder/SRB2
  • wolfy852/SRB2
  • Alpha2244/SRB2
  • Inuyasha/SRB2
  • yoshibot/SRB2
  • TehRealSalt/SRB2
  • PrisimaTF/SRB2
  • Hatninja/SRB2
  • SteelT/SRB2
  • james/SRB2
  • ShaderWraith/SRB2
  • SinnamonLat/SRB2
  • mazmazz_/SRB2
  • filpAM/SRB2
  • chaoloveicemdboy/SRB2
  • Whooa21/SRB2
  • Machturne/SRB2
  • Golden/SRB2
  • Tatsuru/SRB2
  • Snu/SRB2
  • Zwip-Zwap_Zapony/SRB2
  • fickleheart/SRB2
  • alphaRexJames/SRB2
  • JJK/SRB2
  • diskpoppy/SRB2
  • Hannu_Hanhi/SRB2
  • ZipperQR/SRB2
  • kays/SRB2
  • spherallic/SRB2
  • Zippy_Zolton/SRB2
  • namiishere/SRB2
  • Ors/SRB2
  • SMS_Alfredo/SRB2
  • sonic_edge/SRB2
  • lavla/SRB2
  • ashi/SRB2
  • X.organic/SRB2
  • Fafabis/SRB2
  • Meziu/SRB2
  • v-rob/SRB2
  • tertu/SRB2
  • bitten2up/SRB2
  • flarn2006/SRB2
  • Krabs/SRB2
  • clairebun/SRB2
  • Lactozilla/SRB2
  • thehackstack/SRB2
  • Spice/SRB2
  • win8linux/SRB2
  • JohnFrostFox/SRB2
  • talktoneon726/SRB2
  • Wane/SRB2
  • Lamibe/SRB2
  • spectrumuk2/srb-2
  • nerdyminer18/srb-2
  • 256nil/SRB2
  • ARJr/SRB2
  • Alam/SRB2
  • Zenya/srb-2-marathon-demos
  • Acelite/srb-2-archivedmodifications
  • MIDIMan/SRB2
  • Lach/SRB2
  • Frostiikin/bounce-tweaks
  • Jaden/SRB2
  • Tyron/SRB2
  • Astronight/SRB2
  • Mari0shi06/SRB2
  • aiire/SRB2
  • Galactice/SRB2
  • srb2-ports/srb2-dreamcast
  • sdasdas/SRB2
  • chreas/srb-2-vr
  • StarManiaKG/the-story-of-sinically-rocketing-and-botching-the-2nd
  • LoganAir/SRB2
  • NepDisk/srb-2
  • alufolie91/SRB2
  • Felicia.iso/SRB2
  • twi/SRB2
  • BarrelsOFun/SRB2
  • Speed2411/SRB2
  • Leather_Realms/SRB2
  • Ayemar/SRB2
  • Acelite/SRB2
  • VladDoc/SRB2
  • kaldrum/model-features
  • strawberryfox417/SRB2
  • Lugent/SRB2
  • Jisk/SRB2
  • Rem/SRB2
  • Refrag/SRB2
  • Henry_3230/srb-3230
  • TehPuertoRicanSpartan2/tprs-srb2
  • Leminn/srb-2-marathon-stuff
  • chromaticpipe2/SRB2
  • MiguelGustavo15/SRB2
  • Maru/srb-2-tests
  • SilicDev/SRB2
  • UnmatchedBracket/SRB2
  • HybridDog/SRB2
  • xordspar0/SRB2
  • jsjhbewfhh/SRB2
  • Fancy2209/SRB2
  • Lorsoen/SRB2
  • shindoukin/SRB2
  • GamerOfDays/SRB2
  • Craftyawesome/SRB2
  • tenshi-tensai-tennoji/SRB2
  • Scarfdudebalder/SRB2
  • luigi-budd/srb-2-fix-interplag-lockon
  • mskluesner/SRB2
  • johnpetersa19/SRB2
  • Pheazant/SRB2
  • chromaticpipe2/srb2classic
  • romoney5/SRB2
  • PAS/SRB2Classic
  • BlueStaggo/SRB2
117 results
Select Git revision
  • 1392-2-2-15-attempting-to-draw-a-hud-graphic-with-the-same-lump-name-as-a-lua-script-crashes-the
  • 21-installer-nodd
  • 2210-pre1
  • 2210-pre2
  • 2210-rc1
  • 2210-rc2
  • 2210-rc3
  • 2211-pre1
  • 2211-pre2
  • 2211-rc1
  • 2212-pre1
  • 2212-pre2
  • 2212-pre3
  • 2212-rc1
  • 2213
  • 2214-pre1
  • 2214-pre2
  • 2214-pre3
  • 2214-pre4
  • 2_2_12
  • 64-gl-log
  • COM_ImmedExecute-lua
  • DJGPP
  • accel-momentum
  • acs
  • action-args
  • alpha-fixes
  • any-resolution
  • appveyor
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • bustablesoundz
  • cleanup-opengl
  • cleanupmusic
  • clipmidtex
  • cmake-valgrind
  • crawlacommander-sprites
  • custom-map-names
  • custom-teams
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • delfile2
  • deprecate-lua-dedicated-server
  • dpl-2
  • dropshadows-spawning
  • dynabsp
  • emblem-drawing
  • exchndl-xp-fix
  • extra-textures
  • few-kart-lua-changes
  • ffloorclip
  • fix-167
  • fix-cvar-conflicts
  • fix-opengl-parameter-crash
  • fix-opengl-shear-roll
  • flipfuncpointers
  • fof-lightlist-fixes
  • font-FUCK
  • frictionrefactor
  • fuck-macros-1
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • gametype-refactor
  • gametype-refactor-1
  • gametype-refactor-player-spawns
  • ghost-networking
  • gif-splitting
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-maxconditionsets
  • increase-packet-tics
  • input-display
  • input-display-translucency
  • io
  • joystick-juggling-maz
  • just-in-case
  • keycodes-only
  • ksf-wadfiles
  • ld413-mp-fix
  • levelstruct
  • libpng-version-support
  • linedef-actions
  • lj-test
  • lol-states
  • loopedsounds
  • lower-unpegged-fix
  • lua-change-gametype
  • lua-command-netids
  • lua-gfx-2
  • lua-gfx-sprites
  • lua-local
  • makefile-auto-mingw-gcc
  • makefile-tinkering
  • SRB2_release_2.1
  • SRB2_release_2.1.1
  • SRB2_release_2.1.10
  • SRB2_release_2.1.11
  • SRB2_release_2.1.12
  • SRB2_release_2.1.14
  • SRB2_release_2.1.15
  • SRB2_release_2.1.16
  • SRB2_release_2.1.16a
  • SRB2_release_2.1.17
  • SRB2_release_2.1.18
  • SRB2_release_2.1.19
  • SRB2_release_2.1.2
  • SRB2_release_2.1.20
  • SRB2_release_2.1.21
  • SRB2_release_2.1.22
  • SRB2_release_2.1.23
  • SRB2_release_2.1.24
  • SRB2_release_2.1.25
  • SRB2_release_2.1.3
  • SRB2_release_2.1.4
  • SRB2_release_2.1.5
  • SRB2_release_2.1.6
  • SRB2_release_2.1.7
  • SRB2_release_2.1.8
  • SRB2_release_2.1.9
  • SRB2_release_2.2.0
  • SRB2_release_2.2.1
  • SRB2_release_2.2.10
  • SRB2_release_2.2.11
  • SRB2_release_2.2.12
  • SRB2_release_2.2.13
  • SRB2_release_2.2.15
  • SRB2_release_2.2.2
  • SRB2_release_2.2.3
  • SRB2_release_2.2.4
  • SRB2_release_2.2.5
  • SRB2_release_2.2.6
  • SRB2_release_2.2.7
  • SRB2_release_2.2.8
  • SRB2_release_2.2.9
  • td-release-v1.0.0
142 results
Show changes
...@@ -438,6 +438,10 @@ boolean PIT_PushableMoved(mobj_t *thing); ...@@ -438,6 +438,10 @@ boolean PIT_PushableMoved(mobj_t *thing);
boolean P_DoSpring(mobj_t *spring, mobj_t *object); boolean P_DoSpring(mobj_t *spring, mobj_t *object);
INT32 P_GetSectorLightAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z);
extracolormap_t *P_GetColormapFromSectorAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z);
extracolormap_t *P_GetSectorColormapAt(fixed_t x, fixed_t y, fixed_t z);
// //
// P_SETUP // P_SETUP
// //
......
...@@ -5142,3 +5142,35 @@ fixed_t P_CeilingzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height) ...@@ -5142,3 +5142,35 @@ fixed_t P_CeilingzAtPos(fixed_t x, fixed_t y, fixed_t z, fixed_t height)
return ceilingz; return ceilingz;
} }
INT32 P_GetSectorLightAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z)
{
if (!sector->numlights)
return -1;
INT32 light = sector->numlights - 1;
// R_GetPlaneLight won't work on sloped lights!
for (INT32 lightnum = 1; lightnum < sector->numlights; lightnum++) {
fixed_t h = P_GetLightZAt(&sector->lightlist[lightnum], x, y);
if (h <= z) {
light = lightnum - 1;
break;
}
}
return light;
}
extracolormap_t *P_GetColormapFromSectorAt(sector_t *sector, fixed_t x, fixed_t y, fixed_t z)
{
if (sector->numlights)
return *sector->lightlist[P_GetSectorLightAt(sector, x, y, z)].extra_colormap;
else
return sector->extra_colormap;
}
extracolormap_t *P_GetSectorColormapAt(fixed_t x, fixed_t y, fixed_t z)
{
return P_GetColormapFromSectorAt(R_PointInSubsector(x, y)->sector, x, y, z);
}
...@@ -692,9 +692,26 @@ extracolormap_t *R_ColormapForName(char *name) ...@@ -692,9 +692,26 @@ extracolormap_t *R_ColormapForName(char *name)
// //
static double deltas[256][3], map[256][3]; static double deltas[256][3], map[256][3];
static int RoundUp(double number); static colorlookup_t lighttable_lut;
static UINT8 LightTableNearest(UINT8 r, UINT8 g, UINT8 b)
{
return NearestColor(r, g, b);
}
static UINT8 LightTableNearest_LUT(UINT8 r, UINT8 g, UINT8 b)
{
return GetColorLUT(&lighttable_lut, r, g, b);
}
lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap) lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
{
extra_colormap->colormap = Z_MallocAlign((256 * 34) + 10, PU_LEVEL, NULL, 8);
R_GenerateLightTable(extra_colormap, false);
return extra_colormap->colormap;
}
void R_GenerateLightTable(extracolormap_t *extra_colormap, boolean uselookup)
{ {
double cmaskr, cmaskg, cmaskb, cdestr, cdestg, cdestb; double cmaskr, cmaskg, cmaskb, cdestr, cdestg, cdestb;
double maskamt = 0, othermask = 0; double maskamt = 0, othermask = 0;
...@@ -711,7 +728,6 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap) ...@@ -711,7 +728,6 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
UINT8 fadestart = extra_colormap->fadestart, UINT8 fadestart = extra_colormap->fadestart,
fadedist = extra_colormap->fadeend - extra_colormap->fadestart; fadedist = extra_colormap->fadeend - extra_colormap->fadestart;
lighttable_t *lighttable = NULL;
size_t i; size_t i;
///////////////////// /////////////////////
...@@ -753,6 +769,16 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap) ...@@ -753,6 +769,16 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
int p; int p;
char *colormap_p; char *colormap_p;
UINT8 (*NearestColorFunc)(UINT8, UINT8, UINT8);
if (uselookup)
{
InitColorLUT(&lighttable_lut, pMasterPalette, false);
NearestColorFunc = LightTableNearest_LUT;
}
else
NearestColorFunc = LightTableNearest;
// Initialise the map and delta arrays // Initialise the map and delta arrays
// map[i] stores an RGB color (as double) for index i, // map[i] stores an RGB color (as double) for index i,
// which is then converted to SRB2's palette later // which is then converted to SRB2's palette later
...@@ -783,8 +809,7 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap) ...@@ -783,8 +809,7 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
// Now allocate memory for the actual colormap array itself! // Now allocate memory for the actual colormap array itself!
// aligned on 8 bit for asm code // aligned on 8 bit for asm code
colormap_p = Z_MallocAlign((256 * 34) + 10, PU_LEVEL, NULL, 8); colormap_p = (char *)extra_colormap->colormap;
lighttable = (UINT8 *)colormap_p;
// Calculate the palette index for each palette index, for each light level // Calculate the palette index for each palette index, for each light level
// (as well as the two unused colormap lines we inherited from Doom) // (as well as the two unused colormap lines we inherited from Doom)
...@@ -792,9 +817,9 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap) ...@@ -792,9 +817,9 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
{ {
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
*colormap_p = NearestColor((UINT8)RoundUp(map[i][0]), *colormap_p = NearestColorFunc((UINT8)M_RoundUp(map[i][0]),
(UINT8)RoundUp(map[i][1]), (UINT8)M_RoundUp(map[i][1]),
(UINT8)RoundUp(map[i][2])); (UINT8)M_RoundUp(map[i][2]));
colormap_p++; colormap_p++;
if ((UINT32)p < fadestart) if ((UINT32)p < fadestart)
...@@ -818,8 +843,6 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap) ...@@ -818,8 +843,6 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
} }
} }
} }
return lighttable;
} }
extracolormap_t *R_CreateColormapFromLinedef(char *p1, char *p2, char *p3) extracolormap_t *R_CreateColormapFromLinedef(char *p1, char *p2, char *p3)
...@@ -1133,20 +1156,6 @@ UINT8 NearestPaletteColor(UINT8 r, UINT8 g, UINT8 b, RGBA_t *palette) ...@@ -1133,20 +1156,6 @@ UINT8 NearestPaletteColor(UINT8 r, UINT8 g, UINT8 b, RGBA_t *palette)
return (UINT8)bestcolor; return (UINT8)bestcolor;
} }
// Rounds off floating numbers and checks for 0 - 255 bounds
static int RoundUp(double number)
{
if (number > 255.0l)
return 255;
if (number < 0.0l)
return 0;
if ((int)number <= (int)(number - 0.5f))
return (int)number + 1;
return (int)number;
}
#ifdef EXTRACOLORMAPLUMPS #ifdef EXTRACOLORMAPLUMPS
const char *R_NameForColormap(extracolormap_t *extra_colormap) const char *R_NameForColormap(extracolormap_t *extra_colormap)
{ {
......
...@@ -92,6 +92,7 @@ typedef enum ...@@ -92,6 +92,7 @@ typedef enum
TMCF_OVERRIDE = 1<<13, TMCF_OVERRIDE = 1<<13,
} textmapcolormapflags_t; } textmapcolormapflags_t;
void R_GenerateLightTable(extracolormap_t *extra_colormap, boolean uselookup);
lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap); lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap);
extracolormap_t * R_CreateColormapFromLinedef(char *p1, char *p2, char *p3); extracolormap_t * R_CreateColormapFromLinedef(char *p1, char *p2, char *p3);
extracolormap_t* R_CreateColormap(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags); extracolormap_t* R_CreateColormap(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags);
......
...@@ -53,6 +53,14 @@ typedef struct ...@@ -53,6 +53,14 @@ typedef struct
// Could even use more than 32 levels. // Could even use more than 32 levels.
typedef UINT8 lighttable_t; typedef UINT8 lighttable_t;
#define NUM_PALETTE_ENTRIES 256
#define DEFAULT_STARTTRANSCOLOR 96
typedef struct colormap_s
{
UINT8 map[NUM_PALETTE_ENTRIES];
} colormap_t;
#define CMF_FADEFULLBRIGHTSPRITES 1 #define CMF_FADEFULLBRIGHTSPRITES 1
#define CMF_FOG 4 #define CMF_FOG 4
...@@ -63,7 +71,7 @@ typedef struct extracolormap_s ...@@ -63,7 +71,7 @@ typedef struct extracolormap_s
UINT8 flags; UINT8 flags;
// store rgba values in combined bitwise // store rgba values in combined bitwise
// also used in OpenGL instead lighttables // also used in OpenGL instead of lighttables
INT32 rgba; // similar to maskcolor in sw mode INT32 rgba; // similar to maskcolor in sw mode
INT32 fadergba; // The colour the colourmaps fade to INT32 fadergba; // The colour the colourmaps fade to
......
...@@ -132,8 +132,6 @@ UINT32 nflatxshift, nflatyshift, nflatshiftup, nflatmask; ...@@ -132,8 +132,6 @@ UINT32 nflatxshift, nflatyshift, nflatshiftup, nflatmask;
#define RAINBOW_TT_CACHE_INDEX (MAXSKINS + 4) #define RAINBOW_TT_CACHE_INDEX (MAXSKINS + 4)
#define BLINK_TT_CACHE_INDEX (MAXSKINS + 5) #define BLINK_TT_CACHE_INDEX (MAXSKINS + 5)
#define DASHMODE_TT_CACHE_INDEX (MAXSKINS + 6) #define DASHMODE_TT_CACHE_INDEX (MAXSKINS + 6)
#define DEFAULT_STARTTRANSCOLOR 96
#define NUM_PALETTE_ENTRIES 256
static UINT8 **translationtablecache[MAXSKINS + 7] = {NULL}; static UINT8 **translationtablecache[MAXSKINS + 7] = {NULL};
UINT8 skincolor_modified[MAXSKINCOLORS]; UINT8 skincolor_modified[MAXSKINCOLORS];
...@@ -445,9 +443,9 @@ static void R_RainbowColormap(UINT8 *dest_colormap, UINT16 skincolor) ...@@ -445,9 +443,9 @@ static void R_RainbowColormap(UINT8 *dest_colormap, UINT16 skincolor)
\return void \return void
*/ */
static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, UINT16 color) void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, INT32 starttranscolor, UINT16 color)
{ {
INT32 i, starttranscolor, skinramplength; INT32 i, skinramplength;
// Handle a couple of simple special cases // Handle a couple of simple special cases
if (skinnum < TC_DEFAULT) if (skinnum < TC_DEFAULT)
...@@ -485,10 +483,10 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U ...@@ -485,10 +483,10 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
// White! // White!
if (skinnum == TC_BOSS) if (skinnum == TC_BOSS)
{ {
UINT8 *originalColormap = R_GetTranslationColormap(TC_DEFAULT, (skincolornum_t)color, GTC_CACHE); UINT8 *originalColormap = R_GetCachedTranslation(TC_DEFAULT, (skincolornum_t)color);
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
dest_colormap[DEFAULT_STARTTRANSCOLOR + i] = originalColormap[DEFAULT_STARTTRANSCOLOR + i]; dest_colormap[starttranscolor + i] = originalColormap[starttranscolor + i];
dest_colormap[31-i] = i; dest_colormap[31-i] = i;
} }
} }
...@@ -551,8 +549,6 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U ...@@ -551,8 +549,6 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
if (skinnum < 0 && skinnum > TC_DEFAULT) if (skinnum < 0 && skinnum > TC_DEFAULT)
I_Error("Invalid translation colormap index %d.", skinnum); I_Error("Invalid translation colormap index %d.", skinnum);
starttranscolor = (skinnum != TC_DEFAULT) ? skins[skinnum].starttranscolor : DEFAULT_STARTTRANSCOLOR;
if (starttranscolor >= NUM_PALETTE_ENTRIES) if (starttranscolor >= NUM_PALETTE_ENTRIES)
I_Error("Invalid startcolor #%d.", starttranscolor); I_Error("Invalid startcolor #%d.", starttranscolor);
...@@ -588,7 +584,7 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags ...@@ -588,7 +584,7 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags
{ {
UINT8* ret; UINT8* ret;
INT32 skintableindex = SkinToCacheIndex(skinnum); // Adjust if we want the default colormap INT32 skintableindex = SkinToCacheIndex(skinnum); // Adjust if we want the default colormap
INT32 i; INT32 starttranscolor, i;
if (flags & GTC_CACHE) if (flags & GTC_CACHE)
{ {
...@@ -604,7 +600,11 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags ...@@ -604,7 +600,11 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags
{ {
for (i = 0; i < (INT32)(sizeof(translationtablecache) / sizeof(translationtablecache[0])); i++) for (i = 0; i < (INT32)(sizeof(translationtablecache) / sizeof(translationtablecache[0])); i++)
if (translationtablecache[i] && translationtablecache[i][color]) if (translationtablecache[i] && translationtablecache[i][color])
R_GenerateTranslationColormap(translationtablecache[i][color], CacheIndexToSkin(i), color); {
INT32 skin = CacheIndexToSkin(i);
starttranscolor = (skin >= 0) ? skins[skin].starttranscolor : DEFAULT_STARTTRANSCOLOR;
R_GenerateTranslationColormap(translationtablecache[i][color], skin, starttranscolor, color);
}
skincolor_modified[color] = false; skincolor_modified[color] = false;
} }
...@@ -615,7 +615,9 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags ...@@ -615,7 +615,9 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags
if (!ret) if (!ret)
{ {
ret = Z_MallocAlign(NUM_PALETTE_ENTRIES, (flags & GTC_CACHE) ? PU_LEVEL : PU_STATIC, NULL, 8); ret = Z_MallocAlign(NUM_PALETTE_ENTRIES, (flags & GTC_CACHE) ? PU_LEVEL : PU_STATIC, NULL, 8);
R_GenerateTranslationColormap(ret, skinnum, color);
starttranscolor = (skinnum >= 0) ? skins[skinnum].starttranscolor : DEFAULT_STARTTRANSCOLOR;
R_GenerateTranslationColormap(ret, skinnum, starttranscolor, color);
// Cache the colormap if desired // Cache the colormap if desired
if (flags & GTC_CACHE) if (flags & GTC_CACHE)
...@@ -625,6 +627,11 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags ...@@ -625,6 +627,11 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags
return ret; return ret;
} }
UINT8* R_GetCachedTranslation(INT32 skinnum, skincolornum_t color)
{
return R_GetTranslationColormap(skinnum, color, GTC_CACHE);
}
/** \brief Flushes cache of translation colormaps. /** \brief Flushes cache of translation colormaps.
Flushes cache of translation colormaps, but doesn't actually free the Flushes cache of translation colormaps, but doesn't actually free the
......
...@@ -121,7 +121,9 @@ enum ...@@ -121,7 +121,9 @@ enum
// Custom player skin translation // Custom player skin translation
// Initialize color translation tables, for player rendering etc. // Initialize color translation tables, for player rendering etc.
UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags); UINT8* R_GetTranslationColormap(INT32 skinnum, skincolornum_t color, UINT8 flags);
UINT8* R_GetCachedTranslation(INT32 skinnum, skincolornum_t color);
void R_FlushTranslationColormapCache(void); void R_FlushTranslationColormapCache(void);
void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, INT32 starttranscolor, UINT16 color);
UINT16 R_GetColorByName(const char *name); UINT16 R_GetColorByName(const char *name);
UINT16 R_GetSuperColorByName(const char *name); UINT16 R_GetSuperColorByName(const char *name);
......
...@@ -71,7 +71,7 @@ static void Patch_FreeData(patch_t *patch) ...@@ -71,7 +71,7 @@ static void Patch_FreeData(patch_t *patch)
#ifdef HWRENDER #ifdef HWRENDER
if (patch->hardware) if (patch->hardware)
HWR_FreeTexture(patch); HWR_FreeTextureFromPatch(patch);
#endif #endif
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
...@@ -112,8 +112,9 @@ void Patch_Free(patch_t *patch) ...@@ -112,8 +112,9 @@ void Patch_Free(patch_t *patch)
// Frees patches with a tag range. // Frees patches with a tag range.
// //
static boolean Patch_FreeTagsCallback(void *mem) static boolean Patch_FreeTagsCallback(void *mem, const void *data)
{ {
(void)data;
patch_t *patch = (patch_t *)mem; patch_t *patch = (patch_t *)mem;
Patch_FreeData(patch); Patch_FreeData(patch);
return true; return true;
...@@ -121,7 +122,7 @@ static boolean Patch_FreeTagsCallback(void *mem) ...@@ -121,7 +122,7 @@ static boolean Patch_FreeTagsCallback(void *mem)
void Patch_FreeTags(INT32 lowtag, INT32 hightag) void Patch_FreeTags(INT32 lowtag, INT32 hightag)
{ {
Z_IterateTags(lowtag, hightag, Patch_FreeTagsCallback); Z_IterateTags(lowtag, hightag, Patch_FreeTagsCallback, NULL);
} }
void Patch_GenerateFlat(patch_t *patch, pictureflags_t flags) void Patch_GenerateFlat(patch_t *patch, pictureflags_t flags)
......
...@@ -751,37 +751,37 @@ UINT8 *R_GetSpriteTranslation(vissprite_t *vis) ...@@ -751,37 +751,37 @@ UINT8 *R_GetSpriteTranslation(vissprite_t *vis)
if (R_SpriteIsFlashing(vis)) // Bosses "flash" if (R_SpriteIsFlashing(vis)) // Bosses "flash"
{ {
if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized) if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized)
return R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE); return R_GetCachedTranslation(TC_ALLWHITE, 0);
else if (vis->mobj->type == MT_METALSONIC_BATTLE) else if (vis->mobj->type == MT_METALSONIC_BATTLE)
return R_GetTranslationColormap(TC_METALSONIC, 0, GTC_CACHE); return R_GetCachedTranslation(TC_METALSONIC, 0);
else else
return R_GetTranslationColormap(TC_BOSS, vis->color, GTC_CACHE); return R_GetCachedTranslation(TC_BOSS, vis->color);
} }
else if (vis->color) else if (vis->color)
{ {
// New colormap stuff for skins Tails 06-07-2002 // New colormap stuff for skins Tails 06-07-2002
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
return R_GetTranslationColormap(TC_RAINBOW, vis->color, GTC_CACHE); return R_GetCachedTranslation(TC_RAINBOW, vis->color);
else if (!(vis->cut & SC_PRECIP) else if (!(vis->cut & SC_PRECIP)
&& vis->mobj->player && vis->mobj->player->dashmode >= DASHMODE_THRESHOLD && vis->mobj->player && vis->mobj->player->dashmode >= DASHMODE_THRESHOLD
&& (vis->mobj->player->charflags & SF_DASHMODE) && (vis->mobj->player->charflags & SF_DASHMODE)
&& ((leveltime/2) & 1)) && ((leveltime/2) & 1))
{ {
if (vis->mobj->player->charflags & SF_MACHINE) if (vis->mobj->player->charflags & SF_MACHINE)
return R_GetTranslationColormap(TC_DASHMODE, 0, GTC_CACHE); return R_GetCachedTranslation(TC_DASHMODE, 0);
else else
return R_GetTranslationColormap(TC_RAINBOW, vis->color, GTC_CACHE); return R_GetCachedTranslation(TC_RAINBOW, vis->color);
} }
else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player! else if (!(vis->cut & SC_PRECIP) && vis->mobj->skin && vis->mobj->sprite == SPR_PLAY) // This thing is a player!
{ {
size_t skinnum = (skin_t*)vis->mobj->skin-skins; size_t skinnum = (skin_t*)vis->mobj->skin-skins;
return R_GetTranslationColormap((INT32)skinnum, vis->color, GTC_CACHE); return R_GetCachedTranslation((INT32)skinnum, vis->color);
} }
else // Use the defaults else // Use the defaults
return R_GetTranslationColormap(TC_DEFAULT, vis->color, GTC_CACHE); return R_GetCachedTranslation(TC_DEFAULT, vis->color);
} }
else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome. else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome.
return R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLUE, GTC_CACHE); return R_GetCachedTranslation(TC_DEFAULT, SKINCOLOR_BLUE);
return NULL; return NULL;
} }
...@@ -1279,8 +1279,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, ...@@ -1279,8 +1279,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale,
patch_t *patch; patch_t *patch;
fixed_t xscale, yscale, shadowxscale, shadowyscale, shadowskew, x1, x2; fixed_t xscale, yscale, shadowxscale, shadowyscale, shadowskew, x1, x2;
INT32 heightsec, phs; INT32 heightsec, phs;
INT32 light = 0; fixed_t scalemul;
fixed_t scalemul; UINT8 trans;
fixed_t floordiff; fixed_t floordiff;
fixed_t groundz; fixed_t groundz;
pslope_t *groundslope; pslope_t *groundslope;
...@@ -1320,7 +1319,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, ...@@ -1320,7 +1319,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale,
floordiff = abs((isflipped ? thing->height : 0) + interp.z - groundz); floordiff = abs((isflipped ? thing->height : 0) + interp.z - groundz);
trans = floordiff / (100*FRACUNIT) + 3; UINT8 trans = floordiff / (100*FRACUNIT) + 3;
if (trans >= 9) return; if (trans >= 9) return;
scalemul = FixedMul(FRACUNIT - floordiff/640, scale); scalemul = FixedMul(FRACUNIT - floordiff/640, scale);
...@@ -1396,27 +1395,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, ...@@ -1396,27 +1395,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale,
if (thing->renderflags & RF_NOCOLORMAPS) if (thing->renderflags & RF_NOCOLORMAPS)
shadow->extra_colormap = NULL; shadow->extra_colormap = NULL;
else else
{ shadow->extra_colormap = P_GetColormapFromSectorAt(thing->subsector->sector, interp.x, interp.y, shadow->gzt);
if (thing->subsector->sector->numlights)
{
INT32 lightnum;
light = thing->subsector->sector->numlights - 1;
// R_GetPlaneLight won't work on sloped lights!
for (lightnum = 1; lightnum < thing->subsector->sector->numlights; lightnum++) {
fixed_t h = P_GetLightZAt(&thing->subsector->sector->lightlist[lightnum], interp.x, interp.y);
if (h <= shadow->gzt) {
light = lightnum - 1;
break;
}
}
}
if (thing->subsector->sector->numlights)
shadow->extra_colormap = *thing->subsector->sector->lightlist[light].extra_colormap;
else
shadow->extra_colormap = thing->subsector->sector->extra_colormap;
}
shadow->transmap = R_GetTranslucencyTable(trans + 1); shadow->transmap = R_GetTranslucencyTable(trans + 1);
shadow->colormap = scalelight[0][0]; // full dark! shadow->colormap = scalelight[0][0]; // full dark!
...@@ -1482,7 +1461,6 @@ static void R_ProjectSprite(mobj_t *thing) ...@@ -1482,7 +1461,6 @@ static void R_ProjectSprite(mobj_t *thing)
//SoM: 3/17/2000 //SoM: 3/17/2000
fixed_t gz = 0, gzt = 0; fixed_t gz = 0, gzt = 0;
INT32 heightsec, phs; INT32 heightsec, phs;
INT32 light = 0;
fixed_t this_scale; fixed_t this_scale;
fixed_t spritexscale, spriteyscale; fixed_t spritexscale, spriteyscale;
...@@ -1999,23 +1977,13 @@ static void R_ProjectSprite(mobj_t *thing) ...@@ -1999,23 +1977,13 @@ static void R_ProjectSprite(mobj_t *thing)
return; return;
} }
INT32 light = 0;
if (thing->subsector->sector->numlights) if (thing->subsector->sector->numlights)
{ {
INT32 lightnum; light = P_GetSectorLightAt(thing->subsector->sector, interp.x, interp.y, splat ? gz : gzt);
fixed_t top = (splat) ? gz : gzt;
light = thing->subsector->sector->numlights - 1;
// R_GetPlaneLight won't work on sloped lights!
for (lightnum = 1; lightnum < thing->subsector->sector->numlights; lightnum++) {
fixed_t h = P_GetLightZAt(&thing->subsector->sector->lightlist[lightnum], interp.x, interp.y);
if (h <= top) {
light = lightnum - 1;
break;
}
}
//light = R_GetPlaneLight(thing->subsector->sector, gzt, false);
lightnum = (*thing->subsector->sector->lightlist[light].lightlevel >> LIGHTSEGSHIFT);
INT32 lightnum = (*thing->subsector->sector->lightlist[light].lightlevel >> LIGHTSEGSHIFT);
if (lightnum < 0) if (lightnum < 0)
spritelights = scalelight[0]; spritelights = scalelight[0];
else if (lightnum >= LIGHTLEVELS) else if (lightnum >= LIGHTLEVELS)
......
...@@ -469,7 +469,7 @@ static void ST_DrawNightsOverlayNum(fixed_t x /* right border */, fixed_t y, fix ...@@ -469,7 +469,7 @@ static void ST_DrawNightsOverlayNum(fixed_t x /* right border */, fixed_t y, fix
if (colornum == 0) if (colornum == 0)
colormap = colormaps; colormap = colormaps;
else // Uses the player colors. else // Uses the player colors.
colormap = R_GetTranslationColormap(TC_DEFAULT, colornum, GTC_CACHE); colormap = R_GetCachedTranslation(TC_DEFAULT, colornum);
//I_Assert(num >= 0); // this function does not draw negative numbers //I_Assert(num >= 0); // this function does not draw negative numbers
...@@ -814,14 +814,14 @@ static void ST_drawLivesArea(void) ...@@ -814,14 +814,14 @@ static void ST_drawLivesArea(void)
if (stplyr->spectator) if (stplyr->spectator)
{ {
// spectator face // spectator face
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, SKINCOLOR_CLOUDY, GTC_CACHE); UINT8 *colormap = R_GetCachedTranslation(stplyr->skin, SKINCOLOR_CLOUDY);
V_DrawSmallMappedPatch(hudinfo[HUD_LIVES].x, hudinfo[HUD_LIVES].y, V_DrawSmallMappedPatch(hudinfo[HUD_LIVES].x, hudinfo[HUD_LIVES].y,
hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANSHALF, faceprefix[stplyr->skin], colormap); hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANSHALF, faceprefix[stplyr->skin], colormap);
} }
else if (stplyr->mo && stplyr->mo->color) else if (stplyr->mo && stplyr->mo->color)
{ {
// skincolor face/super // skincolor face/super
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->mo->color, GTC_CACHE); UINT8 *colormap = R_GetCachedTranslation(stplyr->skin, stplyr->mo->color);
patch_t *face = faceprefix[stplyr->skin]; patch_t *face = faceprefix[stplyr->skin];
if (stplyr->powers[pw_super] && !(stplyr->charflags & SF_NOSUPERSPRITES)) if (stplyr->powers[pw_super] && !(stplyr->charflags & SF_NOSUPERSPRITES))
face = superprefix[stplyr->skin]; face = superprefix[stplyr->skin];
...@@ -833,7 +833,7 @@ static void ST_drawLivesArea(void) ...@@ -833,7 +833,7 @@ static void ST_drawLivesArea(void)
if (v_supertrans < 10) if (v_supertrans < 10)
{ {
v_supertrans <<= V_ALPHASHIFT; v_supertrans <<= V_ALPHASHIFT;
colormap = R_GetTranslationColormap(stplyr->skin, stplyr->mo->tracer->color, GTC_CACHE); colormap = R_GetCachedTranslation(stplyr->skin, stplyr->mo->tracer->color);
V_DrawSmallMappedPatch(hudinfo[HUD_LIVES].x, hudinfo[HUD_LIVES].y, V_DrawSmallMappedPatch(hudinfo[HUD_LIVES].x, hudinfo[HUD_LIVES].y,
hudinfo[HUD_LIVES].f|V_PERPLAYER|v_supertrans, face, colormap); hudinfo[HUD_LIVES].f|V_PERPLAYER|v_supertrans, face, colormap);
} }
...@@ -842,7 +842,7 @@ static void ST_drawLivesArea(void) ...@@ -842,7 +842,7 @@ static void ST_drawLivesArea(void)
else if (stplyr->skincolor) else if (stplyr->skincolor)
{ {
// skincolor face // skincolor face
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE); UINT8 *colormap = R_GetCachedTranslation(stplyr->skin, stplyr->skincolor);
V_DrawSmallMappedPatch(hudinfo[HUD_LIVES].x, hudinfo[HUD_LIVES].y, V_DrawSmallMappedPatch(hudinfo[HUD_LIVES].x, hudinfo[HUD_LIVES].y,
hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANS, faceprefix[stplyr->skin], colormap); hudinfo[HUD_LIVES].f|V_PERPLAYER|V_HUDTRANS, faceprefix[stplyr->skin], colormap);
} }
...@@ -1351,7 +1351,7 @@ void ST_drawTitleCard(void) ...@@ -1351,7 +1351,7 @@ void ST_drawTitleCard(void)
else else
colornum = cv_playercolor.value; colornum = cv_playercolor.value;
colormap = R_GetTranslationColormap(TC_DEFAULT, colornum, GTC_CACHE); colormap = R_GetCachedTranslation(TC_DEFAULT, colornum);
if (!G_IsTitleCardAvailable()) if (!G_IsTitleCardAvailable())
return; return;
...@@ -1787,7 +1787,7 @@ static void ST_drawNiGHTSLink(void) ...@@ -1787,7 +1787,7 @@ static void ST_drawNiGHTSLink(void)
ST_DrawNightsOverlayNum(x-(4*scale), y, scale, aflag, (stplyr->linkcount-1), nightsnum, colornum); ST_DrawNightsOverlayNum(x-(4*scale), y, scale, aflag, (stplyr->linkcount-1), nightsnum, colornum);
V_DrawFixedPatch(x+(4*scale), y, scale, aflag, nightslink, V_DrawFixedPatch(x+(4*scale), y, scale, aflag, nightslink,
colornum == 0 ? colormaps : R_GetTranslationColormap(TC_DEFAULT, colornum, GTC_CACHE)); colornum == 0 ? colormaps : R_GetCachedTranslation(TC_DEFAULT, colornum));
// Show remaining link time left in debug // Show remaining link time left in debug
if (cv_debug & DBG_NIGHTSBASIC) if (cv_debug & DBG_NIGHTSBASIC)
......
...@@ -1089,7 +1089,7 @@ void V_DrawContinueIcon(INT32 x, INT32 y, INT32 flags, INT32 skinnum, UINT16 ski ...@@ -1089,7 +1089,7 @@ void V_DrawContinueIcon(INT32 x, INT32 y, INT32 flags, INT32 skinnum, UINT16 ski
spritedef_t *sprdef = &skins[skinnum].sprites[SPR2_XTRA]; spritedef_t *sprdef = &skins[skinnum].sprites[SPR2_XTRA];
spriteframe_t *sprframe = &sprdef->spriteframes[XTRA_CONTINUE]; spriteframe_t *sprframe = &sprdef->spriteframes[XTRA_CONTINUE];
patch_t *patch = W_CachePatchNum(sprframe->lumppat[0], PU_PATCH); patch_t *patch = W_CachePatchNum(sprframe->lumppat[0], PU_PATCH);
const UINT8 *colormap = R_GetTranslationColormap(skinnum, skincolor, GTC_CACHE); const UINT8 *colormap = R_GetCachedTranslation(skinnum, skincolor);
V_DrawMappedPatch(x, y, flags, patch, colormap); V_DrawMappedPatch(x, y, flags, patch, colormap);
} }
......
...@@ -751,7 +751,7 @@ void Y_IntermissionDrawer(void) ...@@ -751,7 +751,7 @@ void Y_IntermissionDrawer(void)
V_DrawSmallScaledPatch(x+16, y-4, 0,faceprefix[*data.match.character[i]]); V_DrawSmallScaledPatch(x+16, y-4, 0,faceprefix[*data.match.character[i]]);
else else
{ {
UINT8 *colormap = R_GetTranslationColormap(*data.match.character[i], *data.match.color[i], GTC_CACHE); UINT8 *colormap = R_GetCachedTranslation(*data.match.character[i], *data.match.color[i]);
V_DrawSmallMappedPatch(x+16, y-4, 0,faceprefix[*data.match.character[i]], colormap); V_DrawSmallMappedPatch(x+16, y-4, 0,faceprefix[*data.match.character[i]], colormap);
} }
...@@ -847,7 +847,7 @@ void Y_IntermissionDrawer(void) ...@@ -847,7 +847,7 @@ void Y_IntermissionDrawer(void)
{ {
if (playeringame[data.match.num[i]] && !(data.match.spectator[i])) if (playeringame[data.match.num[i]] && !(data.match.spectator[i]))
{ {
UINT8 *colormap = R_GetTranslationColormap(*data.match.character[i], *data.match.color[i], GTC_CACHE); UINT8 *colormap = R_GetCachedTranslation(*data.match.character[i], *data.match.color[i]);
if (*data.match.color[i] == SKINCOLOR_RED) //red if (*data.match.color[i] == SKINCOLOR_RED) //red
{ {
...@@ -934,7 +934,7 @@ void Y_IntermissionDrawer(void) ...@@ -934,7 +934,7 @@ void Y_IntermissionDrawer(void)
V_DrawSmallScaledPatch(x+16, y-4, 0,faceprefix[*data.competition.character[i]]); V_DrawSmallScaledPatch(x+16, y-4, 0,faceprefix[*data.competition.character[i]]);
else else
{ {
UINT8 *colormap = R_GetTranslationColormap(*data.competition.character[i], *data.competition.color[i], GTC_CACHE); UINT8 *colormap = R_GetCachedTranslation(*data.competition.character[i], *data.competition.color[i]);
V_DrawSmallMappedPatch(x+16, y-4, 0,faceprefix[*data.competition.character[i]], colormap); V_DrawSmallMappedPatch(x+16, y-4, 0,faceprefix[*data.competition.character[i]], colormap);
} }
......
...@@ -502,7 +502,7 @@ void Z_FreeTags(INT32 lowtag, INT32 hightag) ...@@ -502,7 +502,7 @@ void Z_FreeTags(INT32 lowtag, INT32 hightag)
* \param hightag The highest tag to consider. * \param hightag The highest tag to consider.
* \param iterfunc The iterator function. * \param iterfunc The iterator function.
*/ */
void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *)) void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *, const void *), const void *data)
{ {
memblock_t *block, *next; memblock_t *block, *next;
...@@ -516,7 +516,7 @@ void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *)) ...@@ -516,7 +516,7 @@ void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *))
if (block->tag >= lowtag && block->tag <= hightag) if (block->tag >= lowtag && block->tag <= hightag)
{ {
void *mem = (UINT8 *)block->hdr + sizeof *block->hdr; void *mem = (UINT8 *)block->hdr + sizeof *block->hdr;
boolean free = iterfunc(mem); boolean free = iterfunc(mem, data);
if (free) if (free)
Z_Free(mem); Z_Free(mem);
} }
......
...@@ -113,8 +113,8 @@ void *Z_ReallocAlign(void *ptr, size_t size, INT32 tag, void *user, INT32 alignb ...@@ -113,8 +113,8 @@ void *Z_ReallocAlign(void *ptr, size_t size, INT32 tag, void *user, INT32 alignb
void Z_FreeTags(INT32 lowtag, INT32 hightag); void Z_FreeTags(INT32 lowtag, INT32 hightag);
// Iterate memory by tag // Iterate memory by tag
#define Z_IterateTag(tagnum, func) Z_IterateTags(tagnum, tagnum, func) #define Z_IterateTag(tagnum, func, data) Z_IterateTags(tagnum, tagnum, func, data)
void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *)); void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *, const void *), const void *data);
// //
// Utility functions // Utility functions
......