Merge branch 'flats-fixes-13102019' into 'master'
Transparent flat fixes (Resolves #249) Closes #249 See merge request STJr/SRB2Internal!384
This commit is contained in:
commit
41dd9c4f0a
358
src/r_data.c
358
src/r_data.c
|
@ -483,7 +483,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
wadnum = patch->wad;
|
wadnum = patch->wad;
|
||||||
lumpnum = patch->lump;
|
lumpnum = patch->lump;
|
||||||
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
|
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
|
||||||
realpatch = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
|
realpatch = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); // can't use W_CachePatchNumPwad because OpenGL
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
||||||
|
@ -557,7 +557,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
texturememory += blocksize;
|
texturememory += blocksize;
|
||||||
block = Z_Malloc(blocksize+1, PU_STATIC, &texturecache[texnum]);
|
block = Z_Malloc(blocksize+1, PU_STATIC, &texturecache[texnum]);
|
||||||
|
|
||||||
memset(block, 0xFF, blocksize+1); // Transparency hack
|
memset(block, TRANSPARENTPIXEL, blocksize+1); // Transparency hack
|
||||||
|
|
||||||
// columns lookup table
|
// columns lookup table
|
||||||
colofs = (UINT32 *)(void *)block;
|
colofs = (UINT32 *)(void *)block;
|
||||||
|
@ -2520,7 +2520,11 @@ void R_PrecacheLevel(void)
|
||||||
"spritememory: %s k\n", sizeu1(flatmemory>>10), sizeu2(texturememory>>10), sizeu3(spritememory>>10));
|
"spritememory: %s k\n", sizeu1(flatmemory>>10), sizeu2(texturememory>>10), sizeu3(spritememory>>10));
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/coelckers/prboom-plus/blob/master/prboom2/src/r_patch.c#L350
|
//
|
||||||
|
// R_CheckIfPatch
|
||||||
|
//
|
||||||
|
// Returns true if the lump is a valid patch.
|
||||||
|
//
|
||||||
boolean R_CheckIfPatch(lumpnum_t lump)
|
boolean R_CheckIfPatch(lumpnum_t lump)
|
||||||
{
|
{
|
||||||
size_t size;
|
size_t size;
|
||||||
|
@ -2565,6 +2569,71 @@ boolean R_CheckIfPatch(lumpnum_t lump)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_TextureToFlat
|
||||||
|
//
|
||||||
|
// Convert a texture to a flat.
|
||||||
|
//
|
||||||
|
void R_TextureToFlat(size_t tex, UINT8 *flat)
|
||||||
|
{
|
||||||
|
texture_t *texture = textures[tex];
|
||||||
|
|
||||||
|
fixed_t col, ofs;
|
||||||
|
column_t *column;
|
||||||
|
UINT8 *desttop, *dest, *deststop;
|
||||||
|
UINT8 *source;
|
||||||
|
|
||||||
|
// yea
|
||||||
|
R_CheckTextureCache(tex);
|
||||||
|
|
||||||
|
desttop = flat;
|
||||||
|
deststop = desttop + (texture->width * texture->height);
|
||||||
|
|
||||||
|
for (col = 0; col < texture->width; col++, desttop++)
|
||||||
|
{
|
||||||
|
// no post_t info
|
||||||
|
if (!texture->holes)
|
||||||
|
{
|
||||||
|
column = (column_t *)(R_GetColumn(tex, col));
|
||||||
|
source = (UINT8 *)(column);
|
||||||
|
dest = desttop;
|
||||||
|
for (ofs = 0; dest < deststop && ofs < texture->height; ofs++)
|
||||||
|
{
|
||||||
|
if (source[ofs] != TRANSPARENTPIXEL)
|
||||||
|
*dest = source[ofs];
|
||||||
|
dest += texture->width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INT32 topdelta, prevdelta = -1;
|
||||||
|
column = (column_t *)((UINT8 *)R_GetColumn(tex, col) - 3);
|
||||||
|
while (column->topdelta != 0xff)
|
||||||
|
{
|
||||||
|
topdelta = column->topdelta;
|
||||||
|
if (topdelta <= prevdelta)
|
||||||
|
topdelta += prevdelta;
|
||||||
|
prevdelta = topdelta;
|
||||||
|
|
||||||
|
dest = desttop + (topdelta * texture->width);
|
||||||
|
source = (UINT8 *)column + 3;
|
||||||
|
for (ofs = 0; dest < deststop && ofs < column->length; ofs++)
|
||||||
|
{
|
||||||
|
if (source[ofs] != TRANSPARENTPIXEL)
|
||||||
|
*dest = source[ofs];
|
||||||
|
dest += texture->width;
|
||||||
|
}
|
||||||
|
column = (column_t *)((UINT8 *)column + column->length + 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_PatchToFlat
|
||||||
|
//
|
||||||
|
// Convert a patch to a flat.
|
||||||
|
//
|
||||||
void R_PatchToFlat(patch_t *patch, UINT8 *flat)
|
void R_PatchToFlat(patch_t *patch, UINT8 *flat)
|
||||||
{
|
{
|
||||||
fixed_t col, ofs;
|
fixed_t col, ofs;
|
||||||
|
@ -2599,7 +2668,124 @@ void R_PatchToFlat(patch_t *patch, UINT8 *flat)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_FlatToPatch
|
||||||
|
//
|
||||||
|
// Convert a flat to a patch.
|
||||||
|
//
|
||||||
|
static unsigned char imgbuf[1<<26];
|
||||||
|
patch_t *R_FlatToPatch(UINT8 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize, boolean transparency)
|
||||||
|
{
|
||||||
|
UINT32 x, y;
|
||||||
|
UINT8 *img;
|
||||||
|
UINT8 *imgptr = imgbuf;
|
||||||
|
UINT8 *colpointers, *startofspan;
|
||||||
|
size_t size = 0;
|
||||||
|
|
||||||
|
// Write image size and offset
|
||||||
|
WRITEINT16(imgptr, width);
|
||||||
|
WRITEINT16(imgptr, height);
|
||||||
|
WRITEINT16(imgptr, leftoffset);
|
||||||
|
WRITEINT16(imgptr, topoffset);
|
||||||
|
|
||||||
|
// Leave placeholder to column pointers
|
||||||
|
colpointers = imgptr;
|
||||||
|
imgptr += width*4;
|
||||||
|
|
||||||
|
// Write columns
|
||||||
|
for (x = 0; x < width; x++)
|
||||||
|
{
|
||||||
|
int lastStartY = 0;
|
||||||
|
int spanSize = 0;
|
||||||
|
startofspan = NULL;
|
||||||
|
|
||||||
|
// Write column pointer
|
||||||
|
WRITEINT32(colpointers, imgptr - imgbuf);
|
||||||
|
|
||||||
|
// Write pixels
|
||||||
|
for (y = 0; y < height; y++)
|
||||||
|
{
|
||||||
|
UINT8 paletteIndex = raw[((y * width) + x)];
|
||||||
|
boolean opaque = transparency ? (paletteIndex != TRANSPARENTPIXEL) : true;
|
||||||
|
|
||||||
|
// End span if we have a transparent pixel
|
||||||
|
if (!opaque)
|
||||||
|
{
|
||||||
|
if (startofspan)
|
||||||
|
WRITEUINT8(imgptr, 0);
|
||||||
|
startofspan = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start new column if we need to
|
||||||
|
if (!startofspan || spanSize == 255)
|
||||||
|
{
|
||||||
|
int writeY = y;
|
||||||
|
|
||||||
|
// If we reached the span size limit, finish the previous span
|
||||||
|
if (startofspan)
|
||||||
|
WRITEUINT8(imgptr, 0);
|
||||||
|
|
||||||
|
if (y > 254)
|
||||||
|
{
|
||||||
|
// Make sure we're aligned to 254
|
||||||
|
if (lastStartY < 254)
|
||||||
|
{
|
||||||
|
WRITEUINT8(imgptr, 254);
|
||||||
|
WRITEUINT8(imgptr, 0);
|
||||||
|
imgptr += 2;
|
||||||
|
lastStartY = 254;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write stopgap empty spans if needed
|
||||||
|
writeY = y - lastStartY;
|
||||||
|
|
||||||
|
while (writeY > 254)
|
||||||
|
{
|
||||||
|
WRITEUINT8(imgptr, 254);
|
||||||
|
WRITEUINT8(imgptr, 0);
|
||||||
|
imgptr += 2;
|
||||||
|
writeY -= 254;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
startofspan = imgptr;
|
||||||
|
WRITEUINT8(imgptr, writeY);
|
||||||
|
imgptr += 2;
|
||||||
|
spanSize = 0;
|
||||||
|
|
||||||
|
lastStartY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the pixel
|
||||||
|
WRITEUINT8(imgptr, paletteIndex);
|
||||||
|
spanSize++;
|
||||||
|
startofspan[1] = spanSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startofspan)
|
||||||
|
WRITEUINT8(imgptr, 0);
|
||||||
|
|
||||||
|
WRITEUINT8(imgptr, 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
size = imgptr-imgbuf;
|
||||||
|
img = Z_Malloc(size, PU_STATIC, NULL);
|
||||||
|
memcpy(img, imgbuf, size);
|
||||||
|
|
||||||
|
Z_Free(raw);
|
||||||
|
|
||||||
|
if (destsize != NULL)
|
||||||
|
*destsize = size;
|
||||||
|
return (patch_t *)img;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
|
//
|
||||||
|
// R_IsLumpPNG
|
||||||
|
//
|
||||||
|
// Returns true if the lump is a valid PNG.
|
||||||
|
//
|
||||||
boolean R_IsLumpPNG(const UINT8 *d, size_t s)
|
boolean R_IsLumpPNG(const UINT8 *d, size_t s)
|
||||||
{
|
{
|
||||||
if (s < 67) // http://garethrees.org/2007/11/14/pngcrush/
|
if (s < 67) // http://garethrees.org/2007/11/14/pngcrush/
|
||||||
|
@ -2812,125 +2998,31 @@ static UINT8 *PNG_RawConvert(const UINT8 *png, UINT16 *w, UINT16 *h, INT16 *topo
|
||||||
return flat;
|
return flat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_PNGToFlat
|
||||||
|
//
|
||||||
// Convert a PNG to a flat.
|
// Convert a PNG to a flat.
|
||||||
UINT8 *R_PNGToFlat(levelflat_t *levelflat, UINT8 *png, size_t size)
|
//
|
||||||
|
UINT8 *R_PNGToFlat(UINT16 *width, UINT16 *height, UINT8 *png, size_t size)
|
||||||
{
|
{
|
||||||
return PNG_RawConvert(png, &levelflat->width, &levelflat->height, NULL, NULL, size);
|
return PNG_RawConvert(png, width, height, NULL, NULL, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_PNGToPatch
|
||||||
|
//
|
||||||
// Convert a PNG to a patch.
|
// Convert a PNG to a patch.
|
||||||
static unsigned char imgbuf[1<<26];
|
//
|
||||||
patch_t *R_PNGToPatch(const UINT8 *png, size_t size, size_t *destsize, boolean transparency)
|
patch_t *R_PNGToPatch(const UINT8 *png, size_t size, size_t *destsize, boolean transparency)
|
||||||
{
|
{
|
||||||
UINT16 width, height;
|
UINT16 width, height;
|
||||||
INT16 topoffset = 0, leftoffset = 0;
|
INT16 topoffset = 0, leftoffset = 0;
|
||||||
UINT8 *raw = PNG_RawConvert(png, &width, &height, &topoffset, &leftoffset, size);
|
UINT8 *raw = PNG_RawConvert(png, &width, &height, &topoffset, &leftoffset, size);
|
||||||
|
|
||||||
UINT32 x, y;
|
|
||||||
UINT8 *img;
|
|
||||||
UINT8 *imgptr = imgbuf;
|
|
||||||
UINT8 *colpointers, *startofspan;
|
|
||||||
|
|
||||||
if (!raw)
|
if (!raw)
|
||||||
I_Error("R_PNGToPatch: conversion failed");
|
I_Error("R_PNGToPatch: conversion failed");
|
||||||
|
|
||||||
// Write image size and offset
|
return R_FlatToPatch(raw, width, height, leftoffset, topoffset, destsize, transparency);
|
||||||
WRITEINT16(imgptr, width);
|
|
||||||
WRITEINT16(imgptr, height);
|
|
||||||
WRITEINT16(imgptr, leftoffset);
|
|
||||||
WRITEINT16(imgptr, topoffset);
|
|
||||||
|
|
||||||
// Leave placeholder to column pointers
|
|
||||||
colpointers = imgptr;
|
|
||||||
imgptr += width*4;
|
|
||||||
|
|
||||||
// Write columns
|
|
||||||
for (x = 0; x < width; x++)
|
|
||||||
{
|
|
||||||
int lastStartY = 0;
|
|
||||||
int spanSize = 0;
|
|
||||||
startofspan = NULL;
|
|
||||||
|
|
||||||
//printf("%d ", x);
|
|
||||||
// Write column pointer (@TODO may be wrong)
|
|
||||||
WRITEINT32(colpointers, imgptr - imgbuf);
|
|
||||||
|
|
||||||
// Write pixels
|
|
||||||
for (y = 0; y < height; y++)
|
|
||||||
{
|
|
||||||
UINT8 paletteIndex = raw[((y * width) + x)];
|
|
||||||
boolean opaque = transparency ? (paletteIndex != TRANSPARENTPIXEL) : true;
|
|
||||||
|
|
||||||
// End span if we have a transparent pixel
|
|
||||||
if (!opaque)
|
|
||||||
{
|
|
||||||
if (startofspan)
|
|
||||||
WRITEUINT8(imgptr, 0);
|
|
||||||
startofspan = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start new column if we need to
|
|
||||||
if (!startofspan || spanSize == 255)
|
|
||||||
{
|
|
||||||
int writeY = y;
|
|
||||||
|
|
||||||
// If we reached the span size limit, finish the previous span
|
|
||||||
if (startofspan)
|
|
||||||
WRITEUINT8(imgptr, 0);
|
|
||||||
|
|
||||||
if (y > 254)
|
|
||||||
{
|
|
||||||
// Make sure we're aligned to 254
|
|
||||||
if (lastStartY < 254)
|
|
||||||
{
|
|
||||||
WRITEUINT8(imgptr, 254);
|
|
||||||
WRITEUINT8(imgptr, 0);
|
|
||||||
imgptr += 2;
|
|
||||||
lastStartY = 254;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write stopgap empty spans if needed
|
|
||||||
writeY = y - lastStartY;
|
|
||||||
|
|
||||||
while (writeY > 254)
|
|
||||||
{
|
|
||||||
WRITEUINT8(imgptr, 254);
|
|
||||||
WRITEUINT8(imgptr, 0);
|
|
||||||
imgptr += 2;
|
|
||||||
writeY -= 254;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
startofspan = imgptr;
|
|
||||||
WRITEUINT8(imgptr, writeY);///@TODO calculate starting y pos
|
|
||||||
imgptr += 2;
|
|
||||||
spanSize = 0;
|
|
||||||
|
|
||||||
lastStartY = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the pixel
|
|
||||||
WRITEUINT8(imgptr, paletteIndex);
|
|
||||||
spanSize++;
|
|
||||||
startofspan[1] = spanSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startofspan)
|
|
||||||
WRITEUINT8(imgptr, 0);
|
|
||||||
|
|
||||||
WRITEUINT8(imgptr, 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
size = imgptr-imgbuf;
|
|
||||||
img = Z_Malloc(size, PU_STATIC, NULL);
|
|
||||||
memcpy(img, imgbuf, size);
|
|
||||||
|
|
||||||
Z_Free(raw);
|
|
||||||
|
|
||||||
if (destsize != NULL)
|
|
||||||
*destsize = size;
|
|
||||||
return (patch_t *)img;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean R_PNGDimensions(UINT8 *png, INT16 *width, INT16 *height, size_t size)
|
boolean R_PNGDimensions(UINT8 *png, INT16 *width, INT16 *height, size_t size)
|
||||||
|
@ -3001,53 +3093,3 @@ boolean R_PNGDimensions(UINT8 *png, INT16 *width, INT16 *height, size_t size)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void R_TextureToFlat(size_t tex, UINT8 *flat)
|
|
||||||
{
|
|
||||||
texture_t *texture = textures[tex];
|
|
||||||
|
|
||||||
fixed_t col, ofs;
|
|
||||||
column_t *column;
|
|
||||||
UINT8 *desttop, *dest, *deststop;
|
|
||||||
UINT8 *source;
|
|
||||||
|
|
||||||
desttop = flat;
|
|
||||||
deststop = desttop + (texture->width * texture->height);
|
|
||||||
|
|
||||||
for (col = 0; col < texture->width; col++, desttop++)
|
|
||||||
{
|
|
||||||
column = (column_t *)R_GetColumn(tex, col);
|
|
||||||
if (!texture->holes)
|
|
||||||
{
|
|
||||||
dest = desttop;
|
|
||||||
source = (UINT8 *)(column);
|
|
||||||
for (ofs = 0; dest < deststop && ofs < texture->height; ofs++)
|
|
||||||
{
|
|
||||||
if (source[ofs] != TRANSPARENTPIXEL)
|
|
||||||
*dest = source[ofs];
|
|
||||||
dest += texture->width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
INT32 topdelta, prevdelta = -1;
|
|
||||||
while (column->topdelta != 0xff)
|
|
||||||
{
|
|
||||||
topdelta = column->topdelta;
|
|
||||||
if (topdelta <= prevdelta)
|
|
||||||
topdelta += prevdelta;
|
|
||||||
prevdelta = topdelta;
|
|
||||||
|
|
||||||
dest = desttop + (topdelta * texture->width);
|
|
||||||
source = (UINT8 *)(column) + 3;
|
|
||||||
for (ofs = 0; dest < deststop && ofs < column->length; ofs++)
|
|
||||||
{
|
|
||||||
if (source[ofs] != TRANSPARENTPIXEL)
|
|
||||||
*dest = source[ofs];
|
|
||||||
dest += texture->width;
|
|
||||||
}
|
|
||||||
column = (column_t *)((UINT8 *)column + column->length + 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -159,15 +159,14 @@ const char *R_NameForColormap(extracolormap_t *extra_colormap);
|
||||||
#define R_PutRgbaRGBA(r, g, b, a) (R_PutRgbaRGB(r, g, b) + R_PutRgbaA(a))
|
#define R_PutRgbaRGBA(r, g, b, a) (R_PutRgbaRGB(r, g, b) + R_PutRgbaA(a))
|
||||||
|
|
||||||
boolean R_CheckIfPatch(lumpnum_t lump);
|
boolean R_CheckIfPatch(lumpnum_t lump);
|
||||||
UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b);
|
|
||||||
|
|
||||||
void R_PatchToFlat(patch_t *patch, UINT8 *flat);
|
|
||||||
void R_TextureToFlat(size_t tex, UINT8 *flat);
|
void R_TextureToFlat(size_t tex, UINT8 *flat);
|
||||||
|
void R_PatchToFlat(patch_t *patch, UINT8 *flat);
|
||||||
|
patch_t *R_FlatToPatch(UINT8 *raw, UINT16 width, UINT16 height, UINT16 leftoffset, UINT16 topoffset, size_t *destsize, boolean transparency);
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
boolean R_IsLumpPNG(const UINT8 *d, size_t s);
|
boolean R_IsLumpPNG(const UINT8 *d, size_t s);
|
||||||
|
|
||||||
UINT8 *R_PNGToFlat(levelflat_t *levelflat, UINT8 *png, size_t size);
|
UINT8 *R_PNGToFlat(UINT16 *width, UINT16 *height, UINT8 *png, size_t size);
|
||||||
patch_t *R_PNGToPatch(const UINT8 *png, size_t size, size_t *destsize, boolean transparency);
|
patch_t *R_PNGToPatch(const UINT8 *png, size_t size, size_t *destsize, boolean transparency);
|
||||||
boolean R_PNGDimensions(UINT8 *png, INT16 *width, INT16 *height, size_t size);
|
boolean R_PNGDimensions(UINT8 *png, INT16 *width, INT16 *height, size_t size);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -650,6 +650,11 @@ static void R_DrawSkyPlane(visplane_t *pl)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_CheckPowersOfTwo
|
||||||
|
//
|
||||||
|
// Self-explanatory?
|
||||||
|
//
|
||||||
boolean R_CheckPowersOfTwo(void)
|
boolean R_CheckPowersOfTwo(void)
|
||||||
{
|
{
|
||||||
boolean wpow2 = (!(ds_flatwidth & (ds_flatwidth - 1)));
|
boolean wpow2 = (!(ds_flatwidth & (ds_flatwidth - 1)));
|
||||||
|
@ -667,6 +672,11 @@ boolean R_CheckPowersOfTwo(void)
|
||||||
return ds_powersoftwo;
|
return ds_powersoftwo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_CheckFlatLength
|
||||||
|
//
|
||||||
|
// Determine the flat's dimensions from the lump length.
|
||||||
|
//
|
||||||
void R_CheckFlatLength(size_t size)
|
void R_CheckFlatLength(size_t size)
|
||||||
{
|
{
|
||||||
switch (size)
|
switch (size)
|
||||||
|
@ -723,7 +733,24 @@ void R_CheckFlatLength(size_t size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT8 *R_GetPatchFlat(levelflat_t *levelflat, boolean leveltexture, boolean ispng)
|
//
|
||||||
|
// R_GenerateFlat
|
||||||
|
//
|
||||||
|
// Generate a flat from specified width and height.
|
||||||
|
//
|
||||||
|
static UINT8 *R_GenerateFlat(UINT16 width, UINT16 height)
|
||||||
|
{
|
||||||
|
UINT8 *flat = Z_Malloc(width * height, PU_LEVEL, NULL);
|
||||||
|
memset(flat, TRANSPARENTPIXEL, width * height);
|
||||||
|
return flat;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// R_GetTextureFlat
|
||||||
|
//
|
||||||
|
// Convert a texture or patch to a flat.
|
||||||
|
//
|
||||||
|
static UINT8 *R_GetTextureFlat(levelflat_t *levelflat, boolean leveltexture, boolean ispng)
|
||||||
{
|
{
|
||||||
UINT8 *flat;
|
UINT8 *flat;
|
||||||
textureflat_t *texflat = &texflats[levelflat->texturenum];
|
textureflat_t *texflat = &texflats[levelflat->texturenum];
|
||||||
|
@ -747,14 +774,14 @@ static UINT8 *R_GetPatchFlat(levelflat_t *levelflat, boolean leveltexture, boole
|
||||||
// If the texture changed, or the patch doesn't exist, convert either of them to a flat.
|
// If the texture changed, or the patch doesn't exist, convert either of them to a flat.
|
||||||
if (levelflat->flatpatch == NULL || texturechanged)
|
if (levelflat->flatpatch == NULL || texturechanged)
|
||||||
{
|
{
|
||||||
|
// Level texture
|
||||||
if (leveltexture)
|
if (leveltexture)
|
||||||
{
|
{
|
||||||
texture_t *texture = textures[levelflat->texturenum];
|
texture_t *texture = textures[levelflat->texturenum];
|
||||||
texflat->width = ds_flatwidth = texture->width;
|
texflat->width = ds_flatwidth = texture->width;
|
||||||
texflat->height = ds_flatheight = texture->height;
|
texflat->height = ds_flatheight = texture->height;
|
||||||
|
|
||||||
texflat->flat = Z_Malloc(ds_flatwidth * ds_flatheight, PU_LEVEL, NULL);
|
texflat->flat = R_GenerateFlat(ds_flatwidth, ds_flatheight);
|
||||||
memset(texflat->flat, TRANSPARENTPIXEL, ds_flatwidth * ds_flatheight);
|
|
||||||
R_TextureToFlat(levelflat->texturenum, texflat->flat);
|
R_TextureToFlat(levelflat->texturenum, texflat->flat);
|
||||||
flat = texflat->flat;
|
flat = texflat->flat;
|
||||||
|
|
||||||
|
@ -762,13 +789,14 @@ static UINT8 *R_GetPatchFlat(levelflat_t *levelflat, boolean leveltexture, boole
|
||||||
levelflat->width = ds_flatwidth;
|
levelflat->width = ds_flatwidth;
|
||||||
levelflat->height = ds_flatheight;
|
levelflat->height = ds_flatheight;
|
||||||
}
|
}
|
||||||
|
// Patch (never happens yet)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
patch = (patch_t *)ds_source;
|
patch = (patch_t *)ds_source;
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
if (ispng)
|
if (ispng)
|
||||||
{
|
{
|
||||||
levelflat->flatpatch = R_PNGToFlat(levelflat, ds_source, W_LumpLength(levelflat->lumpnum));
|
levelflat->flatpatch = R_PNGToFlat(&levelflat->width, &levelflat->height, ds_source, W_LumpLength(levelflat->lumpnum));
|
||||||
levelflat->topoffset = levelflat->leftoffset = 0;
|
levelflat->topoffset = levelflat->leftoffset = 0;
|
||||||
ds_flatwidth = levelflat->width;
|
ds_flatwidth = levelflat->width;
|
||||||
ds_flatheight = levelflat->height;
|
ds_flatheight = levelflat->height;
|
||||||
|
@ -782,8 +810,7 @@ static UINT8 *R_GetPatchFlat(levelflat_t *levelflat, boolean leveltexture, boole
|
||||||
levelflat->topoffset = patch->topoffset * FRACUNIT;
|
levelflat->topoffset = patch->topoffset * FRACUNIT;
|
||||||
levelflat->leftoffset = patch->leftoffset * FRACUNIT;
|
levelflat->leftoffset = patch->leftoffset * FRACUNIT;
|
||||||
|
|
||||||
levelflat->flatpatch = Z_Malloc(ds_flatwidth * ds_flatheight, PU_LEVEL, NULL);
|
levelflat->flatpatch = R_GenerateFlat(ds_flatwidth, ds_flatheight);
|
||||||
memset(levelflat->flatpatch, TRANSPARENTPIXEL, ds_flatwidth * ds_flatheight);
|
|
||||||
R_PatchToFlat(patch, levelflat->flatpatch);
|
R_PatchToFlat(patch, levelflat->flatpatch);
|
||||||
}
|
}
|
||||||
flat = levelflat->flatpatch;
|
flat = levelflat->flatpatch;
|
||||||
|
@ -794,11 +821,11 @@ static UINT8 *R_GetPatchFlat(levelflat_t *levelflat, boolean leveltexture, boole
|
||||||
flat = levelflat->flatpatch;
|
flat = levelflat->flatpatch;
|
||||||
ds_flatwidth = levelflat->width;
|
ds_flatwidth = levelflat->width;
|
||||||
ds_flatheight = levelflat->height;
|
ds_flatheight = levelflat->height;
|
||||||
|
|
||||||
xoffs += levelflat->leftoffset;
|
|
||||||
yoffs += levelflat->topoffset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xoffs += levelflat->leftoffset;
|
||||||
|
yoffs += levelflat->topoffset;
|
||||||
|
|
||||||
levelflat->lasttexturenum = levelflat->texturenum;
|
levelflat->lasttexturenum = levelflat->texturenum;
|
||||||
return flat;
|
return flat;
|
||||||
}
|
}
|
||||||
|
@ -963,15 +990,15 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
|
|
||||||
// Check if the flat is actually a wall texture.
|
// Check if the flat is actually a wall texture.
|
||||||
if (levelflat->texturenum != 0 && levelflat->texturenum != -1)
|
if (levelflat->texturenum != 0 && levelflat->texturenum != -1)
|
||||||
flat = R_GetPatchFlat(levelflat, true, false);
|
flat = R_GetTextureFlat(levelflat, true, false);
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
// Maybe it's a PNG?!
|
// Maybe it's a PNG?!
|
||||||
else if (R_IsLumpPNG(ds_source, size))
|
else if (R_IsLumpPNG(ds_source, size))
|
||||||
flat = R_GetPatchFlat(levelflat, false, true);
|
flat = R_GetTextureFlat(levelflat, false, true);
|
||||||
#endif
|
#endif
|
||||||
// Maybe it's just a patch, then?
|
// Maybe it's just a patch, then?
|
||||||
else if (R_CheckIfPatch(levelflat->lumpnum))
|
else if (R_CheckIfPatch(levelflat->lumpnum))
|
||||||
flat = R_GetPatchFlat(levelflat, false, false);
|
flat = R_GetTextureFlat(levelflat, false, false);
|
||||||
// It's a raw flat.
|
// It's a raw flat.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue