mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-10 19:01:50 +00:00
Merge branch 'TEXTURES-additions' into 'master'
TEXTURES additions
Some new features and fixes for textures and the TEXTURES lump:
* Flipping of individual patches used by textures is now supported, both horizontally and vertically. The formatting for doing so in TEXTURES should match that of ZDoom's:
```
WallTexture EXAMPLE, 128, 128
{
Patch TEST, 0, 0
Patch TEST, 64, 0
{
FlipX
}
Patch TEST, 0, 64
{
FlipY
}
Patch TEST, 64, 64
{
FlipX
FlipY
}
}
```
(in other words you need { and } below the Patch you want to flip, containing FlipX if you want horizontal flipping or FlipY if you want vertical flipping... or both, if you want both!)
* Negative patch y-offsets should now work properly for multi-patch textures or single-patch textures with no holes.
See merge request !58
This commit is contained in:
commit
29764c574d
8 changed files with 163 additions and 11 deletions
|
|
@ -2778,7 +2778,7 @@ static void readpatch(MYFILE *f, const char *name, UINT16 wad)
|
||||||
char *word2;
|
char *word2;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
INT32 i = 0, j = 0, value;
|
INT32 i = 0, j = 0, value;
|
||||||
texpatch_t patch = {0, 0, UINT16_MAX, UINT16_MAX};
|
texpatch_t patch = {0, 0, UINT16_MAX, UINT16_MAX, 0};
|
||||||
|
|
||||||
// Jump to the texture this patch belongs to, which,
|
// Jump to the texture this patch belongs to, which,
|
||||||
// coincidentally, is always the last one on the buffer cache.
|
// coincidentally, is always the last one on the buffer cache.
|
||||||
|
|
|
||||||
|
|
@ -407,6 +407,7 @@ void M_StartupLocale(void);
|
||||||
extern void *(*M_Memcpy)(void* dest, const void* src, size_t n) FUNCNONNULL;
|
extern void *(*M_Memcpy)(void* dest, const void* src, size_t n) FUNCNONNULL;
|
||||||
char *va(const char *format, ...) FUNCPRINTF;
|
char *va(const char *format, ...) FUNCPRINTF;
|
||||||
char *M_GetToken(const char *inputString);
|
char *M_GetToken(const char *inputString);
|
||||||
|
void M_UnGetToken(void);
|
||||||
char *sizeu1(size_t num);
|
char *sizeu1(size_t num);
|
||||||
char *sizeu2(size_t num);
|
char *sizeu2(size_t num);
|
||||||
char *sizeu3(size_t num);
|
char *sizeu3(size_t num);
|
||||||
|
|
|
||||||
21
src/m_misc.c
21
src/m_misc.c
|
|
@ -1617,6 +1617,11 @@ INT32 axtoi(const char *hexStg)
|
||||||
return intValue;
|
return intValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Token parser variables
|
||||||
|
|
||||||
|
static UINT32 oldendPos = 0; // old value of endPos, used by M_UnGetToken
|
||||||
|
static UINT32 endPos = 0; // now external to M_GetToken, but still static
|
||||||
|
|
||||||
/** Token parser for TEXTURES, ANIMDEFS, and potentially other lumps later down the line.
|
/** Token parser for TEXTURES, ANIMDEFS, and potentially other lumps later down the line.
|
||||||
* Was originally R_GetTexturesToken when I was coding up the TEXTURES parser, until I realized I needed it for ANIMDEFS too.
|
* Was originally R_GetTexturesToken when I was coding up the TEXTURES parser, until I realized I needed it for ANIMDEFS too.
|
||||||
* Parses up to the next whitespace character or comma. When finding the start of the next token, whitespace is skipped.
|
* Parses up to the next whitespace character or comma. When finding the start of the next token, whitespace is skipped.
|
||||||
|
|
@ -1631,7 +1636,7 @@ char *M_GetToken(const char *inputString)
|
||||||
{
|
{
|
||||||
static const char *stringToUse = NULL; // Populated if inputString != NULL; used otherwise
|
static const char *stringToUse = NULL; // Populated if inputString != NULL; used otherwise
|
||||||
static UINT32 startPos = 0;
|
static UINT32 startPos = 0;
|
||||||
static UINT32 endPos = 0;
|
// static UINT32 endPos = 0;
|
||||||
static UINT32 stringLength = 0;
|
static UINT32 stringLength = 0;
|
||||||
static UINT8 inComment = 0; // 0 = not in comment, 1 = // Single-line, 2 = /* Multi-line */
|
static UINT8 inComment = 0; // 0 = not in comment, 1 = // Single-line, 2 = /* Multi-line */
|
||||||
char *texturesToken = NULL;
|
char *texturesToken = NULL;
|
||||||
|
|
@ -1641,12 +1646,12 @@ char *M_GetToken(const char *inputString)
|
||||||
{
|
{
|
||||||
stringToUse = inputString;
|
stringToUse = inputString;
|
||||||
startPos = 0;
|
startPos = 0;
|
||||||
endPos = 0;
|
oldendPos = endPos = 0;
|
||||||
stringLength = strlen(inputString);
|
stringLength = strlen(inputString);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
startPos = endPos;
|
startPos = oldendPos = endPos;
|
||||||
}
|
}
|
||||||
if (stringToUse == NULL)
|
if (stringToUse == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -1777,6 +1782,16 @@ char *M_GetToken(const char *inputString)
|
||||||
return texturesToken;
|
return texturesToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Undoes the last M_GetToken call
|
||||||
|
* The current position along the string being parsed is reset to the last saved position.
|
||||||
|
* This exists mostly because of R_ParseTexture/R_ParsePatch honestly, but could be useful elsewhere?
|
||||||
|
* -Monster Iestyn (22/10/16)
|
||||||
|
*/
|
||||||
|
void M_UnGetToken(void)
|
||||||
|
{
|
||||||
|
endPos = oldendPos;
|
||||||
|
}
|
||||||
|
|
||||||
/** Count bits in a number.
|
/** Count bits in a number.
|
||||||
*/
|
*/
|
||||||
UINT8 M_CountBits(UINT32 num, UINT8 size)
|
UINT8 M_CountBits(UINT32 num, UINT8 size)
|
||||||
|
|
|
||||||
110
src/r_data.c
110
src/r_data.c
|
|
@ -160,6 +160,7 @@ static inline void R_DrawColumnInCache(column_t *patch, UINT8 *cache, INT32 orig
|
||||||
if (position < 0)
|
if (position < 0)
|
||||||
{
|
{
|
||||||
count += position;
|
count += position;
|
||||||
|
source -= position; // start further down the column
|
||||||
position = 0;
|
position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -173,6 +174,44 @@ static inline void R_DrawColumnInCache(column_t *patch, UINT8 *cache, INT32 orig
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void R_DrawFlippedColumnInCache(column_t *patch, UINT8 *cache, INT32 originy, INT32 cacheheight, INT32 patchheight)
|
||||||
|
{
|
||||||
|
INT32 count, position;
|
||||||
|
UINT8 *source, *dest;
|
||||||
|
INT32 topdelta, prevdelta = -1;
|
||||||
|
|
||||||
|
while (patch->topdelta != 0xff)
|
||||||
|
{
|
||||||
|
topdelta = patch->topdelta;
|
||||||
|
if (topdelta <= prevdelta)
|
||||||
|
topdelta += prevdelta;
|
||||||
|
prevdelta = topdelta;
|
||||||
|
topdelta = patchheight-patch->length-topdelta;
|
||||||
|
source = (UINT8 *)patch + 2 + patch->length; // patch + 3 + (patch->length-1)
|
||||||
|
count = patch->length;
|
||||||
|
position = originy + topdelta;
|
||||||
|
|
||||||
|
if (position < 0)
|
||||||
|
{
|
||||||
|
count += position;
|
||||||
|
source += position; // start further UP the column
|
||||||
|
position = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (position + count > cacheheight)
|
||||||
|
count = cacheheight - position;
|
||||||
|
|
||||||
|
dest = cache + position;
|
||||||
|
if (count > 0)
|
||||||
|
{
|
||||||
|
for (; dest < cache + position + count; --source)
|
||||||
|
*dest++ = *source;
|
||||||
|
}
|
||||||
|
|
||||||
|
patch = (column_t *)((UINT8 *)patch + patch->length + 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// R_GenerateTexture
|
// R_GenerateTexture
|
||||||
//
|
//
|
||||||
|
|
@ -191,7 +230,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;
|
||||||
int x, x1, x2, i;
|
int x, x1, x2, i, width, height;
|
||||||
size_t blocksize;
|
size_t blocksize;
|
||||||
column_t *patchcol;
|
column_t *patchcol;
|
||||||
UINT32 *colofs;
|
UINT32 *colofs;
|
||||||
|
|
@ -239,6 +278,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
if (holey)
|
if (holey)
|
||||||
{
|
{
|
||||||
texture->holes = true;
|
texture->holes = true;
|
||||||
|
texture->flip = patch->flip;
|
||||||
blocksize = W_LumpLengthPwad(patch->wad, patch->lump);
|
blocksize = W_LumpLengthPwad(patch->wad, patch->lump);
|
||||||
block = Z_Calloc(blocksize, PU_STATIC, // will change tag at end of this function
|
block = Z_Calloc(blocksize, PU_STATIC, // will change tag at end of this function
|
||||||
&texturecache[texnum]);
|
&texturecache[texnum]);
|
||||||
|
|
@ -249,6 +289,14 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
colofs = (UINT32 *)(void *)(block + 8);
|
colofs = (UINT32 *)(void *)(block + 8);
|
||||||
texturecolumnofs[texnum] = colofs;
|
texturecolumnofs[texnum] = colofs;
|
||||||
blocktex = block;
|
blocktex = block;
|
||||||
|
if (patch->flip & 1) // flip the patch horizontally
|
||||||
|
{
|
||||||
|
UINT32 *realcolofs = (UINT32 *)realpatch->columnofs;
|
||||||
|
for (x = 0; x < texture->width; x++)
|
||||||
|
colofs[x] = realcolofs[texture->width-1-x]; // swap with the offset of the other side of the texture
|
||||||
|
}
|
||||||
|
// we can't as easily flip the patch vertically sadly though,
|
||||||
|
// we have wait until the texture itself is drawn to do that
|
||||||
for (x = 0; x < texture->width; x++)
|
for (x = 0; x < texture->width; x++)
|
||||||
colofs[x] = LONG(LONG(colofs[x]) + 3);
|
colofs[x] = LONG(LONG(colofs[x]) + 3);
|
||||||
goto done;
|
goto done;
|
||||||
|
|
@ -259,6 +307,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
|
|
||||||
// multi-patch textures (or 'composite')
|
// multi-patch textures (or 'composite')
|
||||||
texture->holes = false;
|
texture->holes = false;
|
||||||
|
texture->flip = 0;
|
||||||
blocksize = (texture->width * 4) + (texture->width * texture->height);
|
blocksize = (texture->width * 4) + (texture->width * texture->height);
|
||||||
texturememory += blocksize;
|
texturememory += blocksize;
|
||||||
block = Z_Malloc(blocksize+1, PU_STATIC, &texturecache[texnum]);
|
block = Z_Malloc(blocksize+1, PU_STATIC, &texturecache[texnum]);
|
||||||
|
|
@ -277,7 +326,9 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
{
|
{
|
||||||
realpatch = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE);
|
realpatch = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE);
|
||||||
x1 = patch->originx;
|
x1 = patch->originx;
|
||||||
x2 = x1 + SHORT(realpatch->width);
|
width = SHORT(realpatch->width);
|
||||||
|
height = SHORT(realpatch->height);
|
||||||
|
x2 = x1 + width;
|
||||||
|
|
||||||
if (x1 < 0)
|
if (x1 < 0)
|
||||||
x = 0;
|
x = 0;
|
||||||
|
|
@ -289,11 +340,17 @@ static UINT8 *R_GenerateTexture(size_t texnum)
|
||||||
|
|
||||||
for (; x < x2; x++)
|
for (; x < x2; x++)
|
||||||
{
|
{
|
||||||
patchcol = (column_t *)((UINT8 *)realpatch + LONG(realpatch->columnofs[x-x1]));
|
if (patch->flip & 1)
|
||||||
|
patchcol = (column_t *)((UINT8 *)realpatch + LONG(realpatch->columnofs[(x1+width-1)-x]));
|
||||||
|
else
|
||||||
|
patchcol = (column_t *)((UINT8 *)realpatch + LONG(realpatch->columnofs[x-x1]));
|
||||||
|
|
||||||
// generate column ofset lookup
|
// generate column ofset lookup
|
||||||
colofs[x] = LONG((x * texture->height) + (texture->width*4));
|
colofs[x] = LONG((x * texture->height) + (texture->width*4));
|
||||||
R_DrawColumnInCache(patchcol, block + LONG(colofs[x]), patch->originy, texture->height);
|
if (patch->flip & 2)
|
||||||
|
R_DrawFlippedColumnInCache(patchcol, block + LONG(colofs[x]), patch->originy, texture->height, height);
|
||||||
|
else
|
||||||
|
R_DrawColumnInCache(patchcol, block + LONG(colofs[x]), patch->originy, texture->height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -469,6 +526,7 @@ void R_LoadTextures(void)
|
||||||
texture->height = SHORT(patchlump->height)*patchcount;
|
texture->height = SHORT(patchlump->height)*patchcount;
|
||||||
texture->patchcount = patchcount;
|
texture->patchcount = patchcount;
|
||||||
texture->holes = false;
|
texture->holes = false;
|
||||||
|
texture->flip = 0;
|
||||||
|
|
||||||
// Allocate information for the texture's patches.
|
// Allocate information for the texture's patches.
|
||||||
for (k = 0; k < patchcount; k++)
|
for (k = 0; k < patchcount; k++)
|
||||||
|
|
@ -479,6 +537,7 @@ void R_LoadTextures(void)
|
||||||
patch->originy = (INT16)(k*patchlump->height);
|
patch->originy = (INT16)(k*patchlump->height);
|
||||||
patch->wad = (UINT16)w;
|
patch->wad = (UINT16)w;
|
||||||
patch->lump = texstart + j;
|
patch->lump = texstart + j;
|
||||||
|
patch->flip = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_Unlock(patchlump);
|
Z_Unlock(patchlump);
|
||||||
|
|
@ -502,6 +561,7 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
||||||
char *patchName = NULL;
|
char *patchName = NULL;
|
||||||
INT16 patchXPos;
|
INT16 patchXPos;
|
||||||
INT16 patchYPos;
|
INT16 patchYPos;
|
||||||
|
UINT8 flip = 0;
|
||||||
texpatch_t *resultPatch = NULL;
|
texpatch_t *resultPatch = NULL;
|
||||||
lumpnum_t patchLumpNum;
|
lumpnum_t patchLumpNum;
|
||||||
|
|
||||||
|
|
@ -598,6 +658,47 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
||||||
}
|
}
|
||||||
Z_Free(texturesToken);
|
Z_Free(texturesToken);
|
||||||
|
|
||||||
|
// Patch parameters block (OPTIONAL)
|
||||||
|
// added by Monster Iestyn (22/10/16)
|
||||||
|
|
||||||
|
// Left Curly Brace
|
||||||
|
texturesToken = M_GetToken(NULL);
|
||||||
|
if (texturesToken == NULL)
|
||||||
|
; // move on and ignore, R_ParseTextures will deal with this
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (strcmp(texturesToken,"{")==0)
|
||||||
|
{
|
||||||
|
Z_Free(texturesToken);
|
||||||
|
texturesToken = M_GetToken(NULL);
|
||||||
|
if (texturesToken == NULL)
|
||||||
|
{
|
||||||
|
I_Error("Error parsing TEXTURES lump: Unexpected end of file where patch \"%s\"'s parameters should be",patchName);
|
||||||
|
}
|
||||||
|
while (strcmp(texturesToken,"}")!=0)
|
||||||
|
{
|
||||||
|
if (stricmp(texturesToken, "FLIPX")==0)
|
||||||
|
flip |= 1;
|
||||||
|
else if (stricmp(texturesToken, "FLIPY")==0)
|
||||||
|
flip |= 2;
|
||||||
|
Z_Free(texturesToken);
|
||||||
|
|
||||||
|
texturesToken = M_GetToken(NULL);
|
||||||
|
if (texturesToken == NULL)
|
||||||
|
{
|
||||||
|
I_Error("Error parsing TEXTURES lump: Unexpected end of file where patch \"%s\"'s parameters or right curly brace should be",patchName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// this is not what we wanted...
|
||||||
|
// undo last read so R_ParseTextures can re-get the token for its own purposes
|
||||||
|
M_UnGetToken();
|
||||||
|
}
|
||||||
|
Z_Free(texturesToken);
|
||||||
|
}
|
||||||
|
|
||||||
if (actuallyLoadPatch == true)
|
if (actuallyLoadPatch == true)
|
||||||
{
|
{
|
||||||
// Check lump exists
|
// Check lump exists
|
||||||
|
|
@ -608,6 +709,7 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
||||||
resultPatch->originy = patchYPos;
|
resultPatch->originy = patchYPos;
|
||||||
resultPatch->lump = patchLumpNum & 65535;
|
resultPatch->lump = patchLumpNum & 65535;
|
||||||
resultPatch->wad = patchLumpNum>>16;
|
resultPatch->wad = patchLumpNum>>16;
|
||||||
|
resultPatch->flip = flip;
|
||||||
// Clean up a little after ourselves
|
// Clean up a little after ourselves
|
||||||
Z_Free(patchName);
|
Z_Free(patchName);
|
||||||
// Then return it
|
// Then return it
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ typedef struct
|
||||||
// Block origin (always UL), which has already accounted for the internal origin of the patch.
|
// Block origin (always UL), which has already accounted for the internal origin of the patch.
|
||||||
INT16 originx, originy;
|
INT16 originx, originy;
|
||||||
UINT16 wad, lump;
|
UINT16 wad, lump;
|
||||||
|
UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both
|
||||||
} texpatch_t;
|
} texpatch_t;
|
||||||
|
|
||||||
// A maptexturedef_t describes a rectangular texture,
|
// A maptexturedef_t describes a rectangular texture,
|
||||||
|
|
@ -42,6 +43,7 @@ typedef struct
|
||||||
char name[8];
|
char name[8];
|
||||||
INT16 width, height;
|
INT16 width, height;
|
||||||
boolean holes;
|
boolean holes;
|
||||||
|
UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both
|
||||||
|
|
||||||
// All the patches[patchcount] are drawn back to front into the cached texture.
|
// All the patches[patchcount] are drawn back to front into the cached texture.
|
||||||
INT16 patchcount;
|
INT16 patchcount;
|
||||||
|
|
|
||||||
35
src/r_segs.c
35
src/r_segs.c
|
|
@ -276,6 +276,13 @@ static void R_Render2sidedMultiPatchColumn(column_t *column)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// quick wrapper for R_DrawFlippedMaskedColumn so it can be set as a colfunc_2s value
|
||||||
|
// uses column2s_length for texture->height as above
|
||||||
|
static void R_DrawFlippedMaskedSegColumn(column_t *column)
|
||||||
|
{
|
||||||
|
R_DrawFlippedMaskedColumn(column, column2s_length);
|
||||||
|
}
|
||||||
|
|
||||||
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
{
|
{
|
||||||
size_t pindex;
|
size_t pindex;
|
||||||
|
|
@ -347,7 +354,15 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
// handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
// handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
||||||
// are not stored per-column with post info in SRB2
|
// are not stored per-column with post info in SRB2
|
||||||
if (textures[texnum]->holes)
|
if (textures[texnum]->holes)
|
||||||
colfunc_2s = R_DrawMaskedColumn; // render the usual 2sided single-patch packed texture
|
{
|
||||||
|
if (textures[texnum]->flip & 2) // vertically flipped?
|
||||||
|
{
|
||||||
|
colfunc_2s = R_DrawFlippedMaskedSegColumn;
|
||||||
|
column2s_length = textures[texnum]->height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
colfunc_2s = R_DrawMaskedColumn; // render the usual 2sided single-patch packed texture
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
colfunc_2s = R_Render2sidedMultiPatchColumn; // render multipatch with no holes (no post_t info)
|
colfunc_2s = R_Render2sidedMultiPatchColumn; // render multipatch with no holes (no post_t info)
|
||||||
|
|
@ -700,6 +715,14 @@ static void R_DrawRepeatMaskedColumn(column_t *col)
|
||||||
} while (sprtopscreen < sprbotscreen);
|
} while (sprtopscreen < sprbotscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void R_DrawRepeatFlippedMaskedColumn(column_t *col)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
R_DrawFlippedMaskedColumn(col, column2s_length);
|
||||||
|
sprtopscreen += dc_texheight*spryscale;
|
||||||
|
} while (sprtopscreen < sprbotscreen);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// R_RenderThickSideRange
|
// R_RenderThickSideRange
|
||||||
// Renders all the thick sides in the given range.
|
// Renders all the thick sides in the given range.
|
||||||
|
|
@ -1027,7 +1050,15 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
//faB: handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
//faB: handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures
|
||||||
// are not stored per-column with post info anymore in Doom Legacy
|
// are not stored per-column with post info anymore in Doom Legacy
|
||||||
if (textures[texnum]->holes)
|
if (textures[texnum]->holes)
|
||||||
colfunc_2s = R_DrawRepeatMaskedColumn; //render the usual 2sided single-patch packed texture
|
{
|
||||||
|
if (textures[texnum]->flip & 2) // vertically flipped?
|
||||||
|
{
|
||||||
|
colfunc_2s = R_DrawRepeatFlippedMaskedColumn;
|
||||||
|
column2s_length = textures[texnum]->height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
colfunc_2s = R_DrawRepeatMaskedColumn; // render the usual 2sided single-patch packed texture
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
colfunc_2s = R_Render2sidedMultiPatchColumn; //render multipatch with no holes (no post_t info)
|
colfunc_2s = R_Render2sidedMultiPatchColumn; //render multipatch with no holes (no post_t info)
|
||||||
|
|
|
||||||
|
|
@ -712,7 +712,7 @@ void R_DrawMaskedColumn(column_t *column)
|
||||||
dc_texturemid = basetexturemid;
|
dc_texturemid = basetexturemid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight)
|
void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight)
|
||||||
{
|
{
|
||||||
INT32 topscreen;
|
INT32 topscreen;
|
||||||
INT32 bottomscreen;
|
INT32 bottomscreen;
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ extern fixed_t windowtop;
|
||||||
extern fixed_t windowbottom;
|
extern fixed_t windowbottom;
|
||||||
|
|
||||||
void R_DrawMaskedColumn(column_t *column);
|
void R_DrawMaskedColumn(column_t *column);
|
||||||
|
void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight);
|
||||||
void R_SortVisSprites(void);
|
void R_SortVisSprites(void);
|
||||||
|
|
||||||
//faB: find sprites in wadfile, replace existing, add new ones
|
//faB: find sprites in wadfile, replace existing, add new ones
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue