mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-04-25 03:21:56 +00:00
Merge remote-tracking branch 'origin/master' into next
This commit is contained in:
commit
64af7badfb
7 changed files with 241 additions and 48 deletions
|
@ -628,8 +628,12 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||||
#define ROTANGLES 24 // Needs to be a divisor of 360 (45, 60, 90, 120...)
|
#define ROTANGLES 24 // Needs to be a divisor of 360 (45, 60, 90, 120...)
|
||||||
#define ROTANGDIFF (360 / ROTANGLES)
|
#define ROTANGDIFF (360 / ROTANGLES)
|
||||||
|
|
||||||
|
/// PNG support
|
||||||
#ifndef HAVE_PNG
|
#ifndef HAVE_PNG
|
||||||
#define NO_PNG_LUMPS
|
#define NO_PNG_LUMPS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Render flats on walls
|
||||||
|
#define WALLFLATS
|
||||||
|
|
||||||
#endif // __DOOMDEF__
|
#endif // __DOOMDEF__
|
||||||
|
|
|
@ -33,10 +33,6 @@
|
||||||
#include "../r_patch.h"
|
#include "../r_patch.h"
|
||||||
#include "../p_setup.h"
|
#include "../p_setup.h"
|
||||||
|
|
||||||
//Hurdler: 25/04/2000: used for new colormap code in hardware mode
|
|
||||||
//static UINT8 *gr_colormap = NULL; // by default it must be NULL ! (because colormap tables are not initialized)
|
|
||||||
boolean firetranslucent = false;
|
|
||||||
|
|
||||||
// Values set after a call to HWR_ResizeBlock()
|
// Values set after a call to HWR_ResizeBlock()
|
||||||
static INT32 blocksize, blockwidth, blockheight;
|
static INT32 blocksize, blockwidth, blockheight;
|
||||||
|
|
||||||
|
@ -122,18 +118,16 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
|
||||||
|
|
||||||
texel = source[yfrac>>FRACBITS];
|
texel = source[yfrac>>FRACBITS];
|
||||||
|
|
||||||
if (firetranslucent && (transtables[(texel<<8)+0x40000]!=texel))
|
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||||
alpha = 0x80;
|
if (mipmap->colormap)
|
||||||
|
texel = mipmap->colormap[texel];
|
||||||
|
|
||||||
|
// transparent pixel
|
||||||
|
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
||||||
|
alpha = 0x00;
|
||||||
else
|
else
|
||||||
alpha = 0xff;
|
alpha = 0xff;
|
||||||
|
|
||||||
//Hurdler: not perfect, but better than holes
|
|
||||||
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX && (mipmap->flags & TF_CHROMAKEYED))
|
|
||||||
texel = HWR_CHROMAKEY_EQUIVALENTCOLORINDEX;
|
|
||||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
|
||||||
else if (mipmap->colormap)
|
|
||||||
texel = mipmap->colormap[texel];
|
|
||||||
|
|
||||||
// hope compiler will get this switch out of the loops (dreams...)
|
// hope compiler will get this switch out of the loops (dreams...)
|
||||||
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
|
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
|
||||||
// Alam: SRB2 uses Mingw, HUGS
|
// Alam: SRB2 uses Mingw, HUGS
|
||||||
|
@ -236,18 +230,16 @@ static void HWR_DrawFlippedColumnInCache(const column_t *patchcol, UINT8 *block,
|
||||||
|
|
||||||
texel = source[yfrac>>FRACBITS];
|
texel = source[yfrac>>FRACBITS];
|
||||||
|
|
||||||
if (firetranslucent && (transtables[(texel<<8)+0x40000]!=texel))
|
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||||
alpha = 0x80;
|
if (mipmap->colormap)
|
||||||
|
texel = mipmap->colormap[texel];
|
||||||
|
|
||||||
|
// transparent pixel
|
||||||
|
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX)
|
||||||
|
alpha = 0x00;
|
||||||
else
|
else
|
||||||
alpha = 0xff;
|
alpha = 0xff;
|
||||||
|
|
||||||
//Hurdler: not perfect, but better than holes
|
|
||||||
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX && (mipmap->flags & TF_CHROMAKEYED))
|
|
||||||
texel = HWR_CHROMAKEY_EQUIVALENTCOLORINDEX;
|
|
||||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
|
||||||
else if (mipmap->colormap)
|
|
||||||
texel = mipmap->colormap[texel];
|
|
||||||
|
|
||||||
// hope compiler will get this switch out of the loops (dreams...)
|
// hope compiler will get this switch out of the loops (dreams...)
|
||||||
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
|
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
|
||||||
// Alam: SRB2 uses Mingw, HUGS
|
// Alam: SRB2 uses Mingw, HUGS
|
||||||
|
@ -576,7 +568,7 @@ static UINT8 *MakeBlock(GLMipmap_t *grMipmap)
|
||||||
{
|
{
|
||||||
UINT8 *block;
|
UINT8 *block;
|
||||||
INT32 bpp, i;
|
INT32 bpp, i;
|
||||||
UINT16 bu16 = ((0x00 <<8) | HWR_CHROMAKEY_EQUIVALENTCOLORINDEX);
|
UINT16 bu16 = ((0x00 <<8) | HWR_PATCHES_CHROMAKEY_COLORINDEX);
|
||||||
|
|
||||||
bpp = format2bpp[grMipmap->grInfo.format];
|
bpp = format2bpp[grMipmap->grInfo.format];
|
||||||
block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(grMipmap->grInfo.data));
|
block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(grMipmap->grInfo.data));
|
||||||
|
@ -606,6 +598,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
|
||||||
texture_t *texture;
|
texture_t *texture;
|
||||||
texpatch_t *patch;
|
texpatch_t *patch;
|
||||||
patch_t *realpatch;
|
patch_t *realpatch;
|
||||||
|
UINT8 *pdata;
|
||||||
|
|
||||||
INT32 i;
|
INT32 i;
|
||||||
boolean skyspecial = false; //poor hack for Legacy large skies..
|
boolean skyspecial = false; //poor hack for Legacy large skies..
|
||||||
|
@ -638,7 +631,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
|
||||||
INT32 j;
|
INT32 j;
|
||||||
RGBA_t col;
|
RGBA_t col;
|
||||||
|
|
||||||
col = V_GetColor(HWR_CHROMAKEY_EQUIVALENTCOLORINDEX);
|
col = V_GetColor(HWR_PATCHES_CHROMAKEY_COLORINDEX);
|
||||||
for (j = 0; j < blockheight; j++)
|
for (j = 0; j < blockheight; j++)
|
||||||
{
|
{
|
||||||
for (i = 0; i < blockwidth; i++)
|
for (i = 0; i < blockwidth; i++)
|
||||||
|
@ -654,19 +647,30 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
|
||||||
// Composite the columns together.
|
// Composite the columns together.
|
||||||
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
||||||
{
|
{
|
||||||
#ifndef NO_PNG_LUMPS
|
boolean dealloc = true;
|
||||||
size_t lumplength = W_LumpLengthPwad(patch->wad, patch->lump);
|
size_t lumplength = W_LumpLengthPwad(patch->wad, patch->lump);
|
||||||
#endif
|
pdata = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE);
|
||||||
realpatch = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE);
|
realpatch = (patch_t *)pdata;
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
||||||
realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false);
|
realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false);
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
HWR_DrawTexturePatchInCache(&grtex->mipmap,
|
#ifdef WALLFLATS
|
||||||
blockwidth, blockheight,
|
if (texture->type == TEXTURETYPE_FLAT)
|
||||||
texture, patch,
|
realpatch = R_FlatToPatch(pdata, texture->width, texture->height, 0, 0, NULL, false);
|
||||||
realpatch);
|
else
|
||||||
Z_Unlock(realpatch);
|
#endif
|
||||||
|
{
|
||||||
|
(void)lumplength;
|
||||||
|
dealloc = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
HWR_DrawTexturePatchInCache(&grtex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
|
||||||
|
|
||||||
|
if (dealloc)
|
||||||
|
Z_Unlock(realpatch);
|
||||||
}
|
}
|
||||||
//Hurdler: not efficient at all but I don't remember exactly how HWR_DrawPatchInCache works :(
|
//Hurdler: not efficient at all but I don't remember exactly how HWR_DrawPatchInCache works :(
|
||||||
if (format2bpp[grtex->mipmap.grInfo.format]==4)
|
if (format2bpp[grtex->mipmap.grInfo.format]==4)
|
||||||
|
|
|
@ -42,7 +42,7 @@ typedef unsigned char FBOOLEAN;
|
||||||
|
|
||||||
// byte value for paletted graphics, which represent the transparent color
|
// byte value for paletted graphics, which represent the transparent color
|
||||||
#define HWR_PATCHES_CHROMAKEY_COLORINDEX 255
|
#define HWR_PATCHES_CHROMAKEY_COLORINDEX 255
|
||||||
#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 130
|
//#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 130
|
||||||
|
|
||||||
// the chroma key color shows on border sprites, set it to black
|
// the chroma key color shows on border sprites, set it to black
|
||||||
#define HWR_PATCHES_CHROMAKEY_COLORVALUE (0x00000000) //RGBA format as in grSstWinOpen()
|
#define HWR_PATCHES_CHROMAKEY_COLORVALUE (0x00000000) //RGBA format as in grSstWinOpen()
|
||||||
|
|
|
@ -128,6 +128,5 @@ extern consvar_t cv_grrounddown; // on/off
|
||||||
|
|
||||||
extern INT32 patchformat;
|
extern INT32 patchformat;
|
||||||
extern INT32 textureformat;
|
extern INT32 textureformat;
|
||||||
extern boolean firetranslucent;
|
|
||||||
|
|
||||||
#endif //_HW_GLOB_
|
#endif //_HW_GLOB_
|
||||||
|
|
26
src/p_spec.c
26
src/p_spec.c
|
@ -138,6 +138,13 @@ static size_t maxanims;
|
||||||
|
|
||||||
static animdef_t *animdefs = NULL;
|
static animdef_t *animdefs = NULL;
|
||||||
|
|
||||||
|
// Increase the size of animdefs to make room for a new animation definition
|
||||||
|
static void GrowAnimDefs(void)
|
||||||
|
{
|
||||||
|
maxanims++;
|
||||||
|
animdefs = (animdef_t *)Z_Realloc(animdefs, sizeof(animdef_t)*(maxanims + 1), PU_STATIC, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
// A prototype; here instead of p_spec.h, so they're "private"
|
// A prototype; here instead of p_spec.h, so they're "private"
|
||||||
void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum);
|
void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum);
|
||||||
void P_ParseAnimationDefintion(SINT8 istexture);
|
void P_ParseAnimationDefintion(SINT8 istexture);
|
||||||
|
@ -347,8 +354,7 @@ void P_ParseAnimationDefintion(SINT8 istexture)
|
||||||
if (i == maxanims)
|
if (i == maxanims)
|
||||||
{
|
{
|
||||||
// Increase the size to make room for the new animation definition
|
// Increase the size to make room for the new animation definition
|
||||||
maxanims++;
|
GrowAnimDefs();
|
||||||
animdefs = (animdef_t *)Z_Realloc(animdefs, sizeof(animdef_t)*(maxanims + 1), PU_STATIC, NULL);
|
|
||||||
strncpy(animdefs[i].startname, animdefsToken, 9);
|
strncpy(animdefs[i].startname, animdefsToken, 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,8 +440,17 @@ void P_ParseAnimationDefintion(SINT8 istexture)
|
||||||
}
|
}
|
||||||
animdefs[i].speed = animSpeed;
|
animdefs[i].speed = animSpeed;
|
||||||
Z_Free(animdefsToken);
|
Z_Free(animdefsToken);
|
||||||
}
|
|
||||||
|
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
// hehe... uhh.....
|
||||||
|
if (!istexture)
|
||||||
|
{
|
||||||
|
GrowAnimDefs();
|
||||||
|
M_Memcpy(&animdefs[maxanims-1], &animdefs[i], sizeof(animdef_t));
|
||||||
|
animdefs[maxanims-1].istexture = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/** Checks for flats in levelflats that are part of a flat animation sequence
|
/** Checks for flats in levelflats that are part of a flat animation sequence
|
||||||
* and sets them up for animation.
|
* and sets them up for animation.
|
||||||
|
@ -476,7 +491,8 @@ static inline void P_FindAnimatedFlat(INT32 animnum)
|
||||||
atoi(sizeu1(i)), foundflats->name, foundflats->animseq,
|
atoi(sizeu1(i)), foundflats->name, foundflats->animseq,
|
||||||
foundflats->numpics,foundflats->speed);
|
foundflats->numpics,foundflats->speed);
|
||||||
}
|
}
|
||||||
else if (foundflats->u.flat.lumpnum >= startflatnum && foundflats->u.flat.lumpnum <= endflatnum)
|
else if ((!anims[animnum].istexture) && (foundflats->type == LEVELFLAT_FLAT)
|
||||||
|
&& (foundflats->u.flat.lumpnum >= startflatnum && foundflats->u.flat.lumpnum <= endflatnum))
|
||||||
{
|
{
|
||||||
foundflats->u.flat.baselumpnum = startflatnum;
|
foundflats->u.flat.baselumpnum = startflatnum;
|
||||||
foundflats->animseq = foundflats->u.flat.lumpnum - startflatnum;
|
foundflats->animseq = foundflats->u.flat.lumpnum - startflatnum;
|
||||||
|
@ -5626,7 +5642,7 @@ void P_UpdateSpecials(void)
|
||||||
if (foundflats->speed) // it is an animated flat
|
if (foundflats->speed) // it is an animated flat
|
||||||
{
|
{
|
||||||
// update the levelflat texture number
|
// update the levelflat texture number
|
||||||
if (foundflats->type == LEVELFLAT_TEXTURE)
|
if ((foundflats->type == LEVELFLAT_TEXTURE) && (foundflats->u.texture.basenum != -1))
|
||||||
foundflats->u.texture.num = foundflats->u.texture.basenum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics);
|
foundflats->u.texture.num = foundflats->u.texture.basenum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics);
|
||||||
// update the levelflat lump number
|
// update the levelflat lump number
|
||||||
else if ((foundflats->type == LEVELFLAT_FLAT) && (foundflats->u.flat.baselumpnum != LUMPERROR))
|
else if ((foundflats->type == LEVELFLAT_FLAT) && (foundflats->u.flat.baselumpnum != LUMPERROR))
|
||||||
|
|
176
src/r_data.c
176
src/r_data.c
|
@ -441,7 +441,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
texture_t *texture;
|
texture_t *texture;
|
||||||
texpatch_t *patch;
|
texpatch_t *patch;
|
||||||
patch_t *realpatch;
|
patch_t *realpatch;
|
||||||
boolean dealloc = false;
|
UINT8 *pdata;
|
||||||
int x, x1, x2, i, width, height;
|
int x, x1, x2, i, width, height;
|
||||||
size_t blocksize;
|
size_t blocksize;
|
||||||
column_t *patchcol;
|
column_t *patchcol;
|
||||||
|
@ -469,12 +469,17 @@ 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); // can't use W_CachePatchNumPwad because OpenGL
|
pdata = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
|
||||||
|
realpatch = (patch_t *)pdata;
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
||||||
goto multipatch;
|
goto multipatch;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
if (texture->type == TEXTURETYPE_FLAT)
|
||||||
|
goto multipatch;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Check the patch for holes.
|
// Check the patch for holes.
|
||||||
if (texture->width > SHORT(realpatch->width) || texture->height > SHORT(realpatch->height))
|
if (texture->width > SHORT(realpatch->width) || texture->height > SHORT(realpatch->height))
|
||||||
|
@ -552,6 +557,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
// Composite the columns together.
|
// Composite the columns together.
|
||||||
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
|
||||||
{
|
{
|
||||||
|
boolean dealloc = true;
|
||||||
static void (*ColumnDrawerPointer)(column_t *, UINT8 *, texpatch_t *, INT32, INT32); // Column drawing function pointer.
|
static void (*ColumnDrawerPointer)(column_t *, UINT8 *, texpatch_t *, INT32, INT32); // Column drawing function pointer.
|
||||||
if (patch->style != AST_COPY)
|
if (patch->style != AST_COPY)
|
||||||
ColumnDrawerPointer = (patch->flip & 2) ? R_DrawBlendFlippedColumnInCache : R_DrawBlendColumnInCache;
|
ColumnDrawerPointer = (patch->flip & 2) ? R_DrawBlendFlippedColumnInCache : R_DrawBlendColumnInCache;
|
||||||
|
@ -560,17 +566,25 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
|
|
||||||
wadnum = patch->wad;
|
wadnum = patch->wad;
|
||||||
lumpnum = patch->lump;
|
lumpnum = patch->lump;
|
||||||
|
pdata = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
|
||||||
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
|
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
|
||||||
realpatch = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
|
realpatch = (patch_t *)pdata;
|
||||||
dealloc = false;
|
dealloc = true;
|
||||||
|
|
||||||
#ifndef NO_PNG_LUMPS
|
#ifndef NO_PNG_LUMPS
|
||||||
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
|
||||||
{
|
|
||||||
realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false);
|
realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false);
|
||||||
dealloc = true;
|
else
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
if (texture->type == TEXTURETYPE_FLAT)
|
||||||
|
realpatch = R_FlatToPatch(pdata, texture->width, texture->height, 0, 0, NULL, false);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
(void)lumplength;
|
||||||
|
dealloc = false;
|
||||||
|
}
|
||||||
|
|
||||||
x1 = patch->originx;
|
x1 = patch->originx;
|
||||||
width = SHORT(realpatch->width);
|
width = SHORT(realpatch->width);
|
||||||
|
@ -725,7 +739,6 @@ void R_LoadTextures(void)
|
||||||
for (w = 0, numtextures = 0; w < numwadfiles; w++)
|
for (w = 0, numtextures = 0; w < numwadfiles; w++)
|
||||||
{
|
{
|
||||||
// Count the textures from TEXTURES lumps
|
// Count the textures from TEXTURES lumps
|
||||||
|
|
||||||
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
|
||||||
while (texturesLumpPos != INT16_MAX)
|
while (texturesLumpPos != INT16_MAX)
|
||||||
{
|
{
|
||||||
|
@ -734,7 +747,6 @@ void R_LoadTextures(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count single-patch textures
|
// Count single-patch textures
|
||||||
|
|
||||||
if (wadfiles[w]->type == RET_PK3)
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
{
|
{
|
||||||
texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0);
|
texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0);
|
||||||
|
@ -747,7 +759,11 @@ void R_LoadTextures(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (texstart == INT16_MAX || texend == INT16_MAX)
|
if (texstart == INT16_MAX || texend == INT16_MAX)
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
goto countflats;
|
||||||
|
#else
|
||||||
continue;
|
continue;
|
||||||
|
#endif
|
||||||
|
|
||||||
texstart++; // Do not count the first marker
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
|
@ -764,6 +780,40 @@ void R_LoadTextures(void)
|
||||||
{
|
{
|
||||||
numtextures += (UINT32)(texend - texstart);
|
numtextures += (UINT32)(texend - texstart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
countflats:
|
||||||
|
// Count flats
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texstart == INT16_MAX || texend == INT16_MAX)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
|
// PK3s have subfolders, so we can't just make a simple sum
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
for (j = texstart; j < texend; j++)
|
||||||
|
{
|
||||||
|
if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it
|
||||||
|
numtextures++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Add all the textures between F_START and F_END
|
||||||
|
{
|
||||||
|
numtextures += (UINT32)(texend - texstart);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no textures found by this point, bomb out
|
// If no textures found by this point, bomb out
|
||||||
|
@ -813,7 +863,11 @@ void R_LoadTextures(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (texstart == INT16_MAX || texend == INT16_MAX)
|
if (texstart == INT16_MAX || texend == INT16_MAX)
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
goto checkflats;
|
||||||
|
#else
|
||||||
continue;
|
continue;
|
||||||
|
#endif
|
||||||
|
|
||||||
texstart++; // Do not count the first marker
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
|
@ -857,6 +911,8 @@ void R_LoadTextures(void)
|
||||||
texture->width = SHORT(patchlump->width);
|
texture->width = SHORT(patchlump->width);
|
||||||
texture->height = SHORT(patchlump->height);
|
texture->height = SHORT(patchlump->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
texture->type = TEXTURETYPE_SINGLEPATCH;
|
||||||
texture->patchcount = 1;
|
texture->patchcount = 1;
|
||||||
texture->holes = false;
|
texture->holes = false;
|
||||||
texture->flip = 0;
|
texture->flip = 0;
|
||||||
|
@ -875,6 +931,107 @@ void R_LoadTextures(void)
|
||||||
textureheight[i] = texture->height << FRACBITS;
|
textureheight[i] = texture->height << FRACBITS;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
checkflats:
|
||||||
|
// Yes
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
|
||||||
|
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texstart == INT16_MAX || texend == INT16_MAX)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
texstart++; // Do not count the first marker
|
||||||
|
|
||||||
|
// Work through each lump between the markers in the WAD.
|
||||||
|
for (j = 0; j < (texend - texstart); j++)
|
||||||
|
{
|
||||||
|
UINT8 *flatlump;
|
||||||
|
UINT16 wadnum = (UINT16)w;
|
||||||
|
lumpnum_t lumpnum = texstart + j;
|
||||||
|
size_t lumplength;
|
||||||
|
size_t flatsize = 0;
|
||||||
|
|
||||||
|
if (wadfiles[w]->type == RET_PK3)
|
||||||
|
{
|
||||||
|
if (W_IsLumpFolder(wadnum, lumpnum)) // Check if lump is a folder
|
||||||
|
continue; // If it is then SKIP IT
|
||||||
|
}
|
||||||
|
|
||||||
|
flatlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
|
||||||
|
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
|
||||||
|
|
||||||
|
switch (lumplength)
|
||||||
|
{
|
||||||
|
case 4194304: // 2048x2048 lump
|
||||||
|
flatsize = 2048;
|
||||||
|
break;
|
||||||
|
case 1048576: // 1024x1024 lump
|
||||||
|
flatsize = 1024;
|
||||||
|
break;
|
||||||
|
case 262144:// 512x512 lump
|
||||||
|
flatsize = 512;
|
||||||
|
break;
|
||||||
|
case 65536: // 256x256 lump
|
||||||
|
flatsize = 256;
|
||||||
|
break;
|
||||||
|
case 16384: // 128x128 lump
|
||||||
|
flatsize = 128;
|
||||||
|
break;
|
||||||
|
case 1024: // 32x32 lump
|
||||||
|
flatsize = 32;
|
||||||
|
break;
|
||||||
|
default: // 64x64 lump
|
||||||
|
flatsize = 64;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//CONS_Printf("\n\"%s\" is a flat, dimensions %d x %d",W_CheckNameForNumPwad((UINT16)w,texstart+j),flatsize,flatsize);
|
||||||
|
texture = textures[i] = Z_Calloc(sizeof(texture_t) + sizeof(texpatch_t), PU_STATIC, NULL);
|
||||||
|
|
||||||
|
// Set texture properties.
|
||||||
|
M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
|
||||||
|
|
||||||
|
#ifndef NO_PNG_LUMPS
|
||||||
|
if (R_IsLumpPNG((UINT8 *)flatlump, lumplength))
|
||||||
|
{
|
||||||
|
INT16 width, height;
|
||||||
|
R_PNGDimensions((UINT8 *)flatlump, &width, &height, lumplength);
|
||||||
|
texture->width = width;
|
||||||
|
texture->height = height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
texture->width = texture->height = flatsize;
|
||||||
|
|
||||||
|
texture->type = TEXTURETYPE_FLAT;
|
||||||
|
texture->patchcount = 1;
|
||||||
|
texture->holes = false;
|
||||||
|
texture->flip = 0;
|
||||||
|
|
||||||
|
// Allocate information for the texture's patches.
|
||||||
|
patch = &texture->patches[0];
|
||||||
|
|
||||||
|
patch->originx = patch->originy = 0;
|
||||||
|
patch->wad = (UINT16)w;
|
||||||
|
patch->lump = texstart + j;
|
||||||
|
patch->flip = 0;
|
||||||
|
|
||||||
|
Z_Unlock(flatlump);
|
||||||
|
|
||||||
|
texturewidth[i] = texture->width;
|
||||||
|
textureheight[i] = texture->height << FRACBITS;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
|
@ -1191,6 +1348,7 @@ static texture_t *R_ParseTexture(boolean actuallyLoadTexture)
|
||||||
M_Memcpy(resultTexture->name, newTextureName, 8);
|
M_Memcpy(resultTexture->name, newTextureName, 8);
|
||||||
resultTexture->width = newTextureWidth;
|
resultTexture->width = newTextureWidth;
|
||||||
resultTexture->height = newTextureHeight;
|
resultTexture->height = newTextureHeight;
|
||||||
|
resultTexture->type = TEXTURETYPE_COMPOSITE;
|
||||||
}
|
}
|
||||||
Z_Free(texturesToken);
|
Z_Free(texturesToken);
|
||||||
texturesToken = M_GetToken(NULL);
|
texturesToken = M_GetToken(NULL);
|
||||||
|
|
12
src/r_data.h
12
src/r_data.h
|
@ -45,6 +45,17 @@ typedef struct
|
||||||
enum patchalphastyle style;
|
enum patchalphastyle style;
|
||||||
} texpatch_t;
|
} texpatch_t;
|
||||||
|
|
||||||
|
// texture type
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
TEXTURETYPE_UNKNOWN,
|
||||||
|
TEXTURETYPE_SINGLEPATCH,
|
||||||
|
TEXTURETYPE_COMPOSITE,
|
||||||
|
#ifdef WALLFLATS
|
||||||
|
TEXTURETYPE_FLAT,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
// A maptexturedef_t describes a rectangular texture,
|
// A maptexturedef_t describes a rectangular texture,
|
||||||
// which is composed of one or more mappatch_t structures
|
// which is composed of one or more mappatch_t structures
|
||||||
// that arrange graphic patches.
|
// that arrange graphic patches.
|
||||||
|
@ -52,6 +63,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
// Keep name for switch changing, etc.
|
// Keep name for switch changing, etc.
|
||||||
char name[8];
|
char name[8];
|
||||||
|
UINT8 type; // TEXTURETYPE_
|
||||||
INT16 width, height;
|
INT16 width, height;
|
||||||
boolean holes;
|
boolean holes;
|
||||||
UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both
|
UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both
|
||||||
|
|
Loading…
Reference in a new issue