mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-18 07:22:28 +00:00
Provide some cleaner method to generate textures as flats.
R_GenerateTextureAsFlat
This commit is contained in:
parent
b8625d9efb
commit
79116ae471
2 changed files with 47 additions and 39 deletions
|
@ -39,7 +39,7 @@
|
|||
#include <errno.h>
|
||||
|
||||
//
|
||||
// MAPTEXTURE_T CACHING
|
||||
// TEXTURE_T CACHING
|
||||
// When a texture is first needed, it counts the number of composite columns
|
||||
// required in the texture and allocates space for a column directory and
|
||||
// any new columns.
|
||||
|
@ -52,7 +52,6 @@ INT32 numtextures = 0; // total number of textures found,
|
|||
// size of following tables
|
||||
|
||||
texture_t **textures = NULL;
|
||||
textureflat_t *texflats = NULL;
|
||||
UINT32 **texturecolumnofs; // column offset lookup table for each texture
|
||||
UINT8 **texturecache; // graphics data for each generated full-size texture
|
||||
|
||||
|
@ -451,6 +450,32 @@ done:
|
|||
return blocktex;
|
||||
}
|
||||
|
||||
//
|
||||
// R_GenerateTextureAsFlat
|
||||
//
|
||||
// Generates a flat picture for a texture.
|
||||
//
|
||||
UINT8 *R_GenerateTextureAsFlat(size_t texnum)
|
||||
{
|
||||
texture_t *texture = textures[texnum];
|
||||
UINT8 *converted = NULL;
|
||||
size_t size = (texture->width * texture->height);
|
||||
|
||||
// The flat picture for this texture was not generated yet.
|
||||
if (!texture->flat)
|
||||
{
|
||||
// Well, let's do it now, then.
|
||||
texture->flat = Z_Malloc(size, PU_STATIC, NULL);
|
||||
|
||||
// Picture_TextureToFlat handles everything for us.
|
||||
converted = (UINT8 *)Picture_TextureToFlat(texnum);
|
||||
M_Memcpy(texture->flat, converted, size);
|
||||
Z_Free(converted);
|
||||
}
|
||||
|
||||
return texture->flat;
|
||||
}
|
||||
|
||||
//
|
||||
// R_GetTextureNum
|
||||
//
|
||||
|
@ -509,46 +534,34 @@ void *R_GetFlat(lumpnum_t flatlumpnum)
|
|||
//
|
||||
void *R_GetLevelFlat(levelflat_t *levelflat)
|
||||
{
|
||||
boolean isleveltexture = (levelflat->type == LEVELFLAT_TEXTURE);
|
||||
texture_t *texture = (isleveltexture ? textures[levelflat->u.texture.num] : NULL);
|
||||
boolean texturechanged = (isleveltexture ? (levelflat->u.texture.num != levelflat->u.texture.lastnum) : false);
|
||||
UINT8 *flatdata = NULL;
|
||||
boolean leveltexture = (levelflat->type == LEVELFLAT_TEXTURE);
|
||||
textureflat_t *texflat = &texflats[levelflat->u.texture.num];
|
||||
boolean texturechanged = (leveltexture ? (levelflat->u.texture.num != levelflat->u.texture.lastnum) : false);
|
||||
|
||||
// Check if the texture changed.
|
||||
if (leveltexture && (!texturechanged))
|
||||
if (isleveltexture && (!texturechanged))
|
||||
{
|
||||
if (texflat != NULL && texflat->flat)
|
||||
if (texture->flat)
|
||||
{
|
||||
flatdata = texflat->flat;
|
||||
ds_flatwidth = texflat->width;
|
||||
ds_flatheight = texflat->height;
|
||||
flatdata = texture->flat;
|
||||
ds_flatwidth = texture->width;
|
||||
ds_flatheight = texture->height;
|
||||
texturechanged = false;
|
||||
}
|
||||
else
|
||||
texturechanged = true;
|
||||
}
|
||||
|
||||
// If the texture changed, or the patch doesn't exist, convert either of them to a flat.
|
||||
// If the texture changed, or the flat wasn't generated, convert.
|
||||
if (levelflat->picture == NULL || texturechanged)
|
||||
{
|
||||
// Level texture
|
||||
if (leveltexture)
|
||||
if (isleveltexture)
|
||||
{
|
||||
UINT8 *converted;
|
||||
size_t size;
|
||||
texture_t *texture = textures[levelflat->u.texture.num];
|
||||
texflat->width = ds_flatwidth = texture->width;
|
||||
texflat->height = ds_flatheight = texture->height;
|
||||
|
||||
size = (texflat->width * texflat->height);
|
||||
texflat->flat = Z_Malloc(size, PU_LEVEL, NULL);
|
||||
converted = (UINT8 *)Picture_TextureToFlat(levelflat->u.texture.num);
|
||||
M_Memcpy(texflat->flat, converted, size);
|
||||
Z_Free(converted);
|
||||
|
||||
levelflat->picture = texflat->flat;
|
||||
levelflat->width = ds_flatwidth;
|
||||
levelflat->height = ds_flatheight;
|
||||
levelflat->picture = R_GenerateTextureAsFlat(levelflat->u.texture.num);
|
||||
ds_flatwidth = levelflat->width = texture->width;
|
||||
ds_flatheight = levelflat->height = texture->height;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -714,12 +727,13 @@ void R_LoadTextures(void)
|
|||
{
|
||||
for (i = 0; i < numtextures; i++)
|
||||
{
|
||||
if (textures[i]->flat)
|
||||
Z_Free(textures[i]->flat);
|
||||
Z_Free(textures[i]);
|
||||
Z_Free(texturecache[i]);
|
||||
}
|
||||
Z_Free(texturetranslation);
|
||||
Z_Free(textures);
|
||||
Z_Free(texflats);
|
||||
}
|
||||
|
||||
// Load patches and textures.
|
||||
|
@ -816,7 +830,6 @@ countflats:
|
|||
// Allocate memory and initialize to 0 for all the textures we are initialising.
|
||||
// There are actually 5 buffers allocated in one for convenience.
|
||||
textures = Z_Calloc((numtextures * sizeof(void *)) * 5, PU_STATIC, NULL);
|
||||
texflats = Z_Calloc((numtextures * sizeof(*texflats)), PU_STATIC, NULL);
|
||||
|
||||
// Allocate texture column offset table.
|
||||
texturecolumnofs = (void *)((UINT8 *)textures + (numtextures * sizeof(void *)));
|
||||
|
|
|
@ -47,8 +47,8 @@ enum
|
|||
#endif
|
||||
};
|
||||
|
||||
// A maptexturedef_t describes a rectangular texture,
|
||||
// which is composed of one or more mappatch_t structures
|
||||
// A texture_t describes a rectangular texture,
|
||||
// which is composed of one or more texpatch_t structures
|
||||
// that arrange graphic patches.
|
||||
typedef struct
|
||||
{
|
||||
|
@ -58,21 +58,15 @@ typedef struct
|
|||
INT16 width, height;
|
||||
boolean holes;
|
||||
UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both
|
||||
void *flat; // The texture, as a flat.
|
||||
|
||||
// All the patches[patchcount] are drawn back to front into the cached texture.
|
||||
INT16 patchcount;
|
||||
texpatch_t patches[0];
|
||||
} texture_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 *flat;
|
||||
INT16 width, height;
|
||||
} textureflat_t;
|
||||
|
||||
// all loaded and prepared textures from the start of the game
|
||||
extern texture_t **textures;
|
||||
extern textureflat_t *texflats;
|
||||
|
||||
extern INT32 *texturewidth;
|
||||
extern fixed_t *textureheight; // needed for texture pegging
|
||||
|
@ -86,14 +80,15 @@ void R_FlushTextureCache(void);
|
|||
|
||||
// Texture generation
|
||||
UINT8 *R_GenerateTexture(size_t texnum);
|
||||
UINT8 *R_GenerateTextureAsFlat(size_t texnum);
|
||||
INT32 R_GetTextureNum(INT32 texnum);
|
||||
void R_CheckTextureCache(INT32 tex);
|
||||
void R_ClearTextureNumCache(boolean btell);
|
||||
|
||||
// Retrieve texture data.
|
||||
void *R_GetLevelFlat(levelflat_t *levelflat);
|
||||
UINT8 *R_GetColumn(fixed_t tex, INT32 col);
|
||||
void *R_GetFlat(lumpnum_t flatnum);
|
||||
void *R_GetLevelFlat(levelflat_t *levelflat);
|
||||
|
||||
boolean R_CheckPowersOfTwo(void);
|
||||
void R_CheckFlatLength(size_t size);
|
||||
|
|
Loading…
Reference in a new issue