Add patch support from a virtual lump

This commit is contained in:
SteelT 2022-09-12 12:51:31 -04:00
parent e1ad0bef7c
commit 556aa1c4c0
2 changed files with 60 additions and 11 deletions

View file

@ -1771,6 +1771,26 @@ void *W_CacheLumpName(const char *name, INT32 tag)
// Cache a patch into heap memory, convert the patch format as necessary // Cache a patch into heap memory, convert the patch format as necessary
// //
static void MakePatch(void *lumpdata, size_t size, INT32 tag, void *cache)
{
void *ptr, *dest;
size_t len = size;
ptr = lumpdata;
#ifndef NO_PNG_LUMPS
if (Picture_IsLumpPNG((UINT8 *)lumpdata, len))
{
ptr = Picture_PNGConvert((UINT8 *)lumpdata, PICFMT_DOOMPATCH, NULL, NULL, NULL, NULL, len, &len, 0);
}
#endif
dest = Z_Calloc(sizeof(patch_t), tag, cache);
Patch_Create(ptr, len, dest);
Z_Free(ptr);
}
void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag) void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
{ {
lumpcache_t *lumpcache = NULL; lumpcache_t *lumpcache = NULL;
@ -1783,21 +1803,12 @@ void *W_CacheSoftwarePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
if (!lumpcache[lump]) if (!lumpcache[lump])
{ {
size_t len = W_LumpLengthPwad(wad, lump); size_t len = W_LumpLengthPwad(wad, lump);
void *ptr, *dest, *lumpdata = Z_Malloc(len, PU_STATIC, NULL); void *lumpdata = Z_Malloc(len, PU_STATIC, NULL);
// read the lump in full // read the lump in full
W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0); W_ReadLumpHeaderPwad(wad, lump, lumpdata, 0, 0);
ptr = lumpdata;
#ifndef NO_PNG_LUMPS MakePatch(lumpdata, len, tag, &lumpcache[lump]);
if (Picture_IsLumpPNG((UINT8 *)lumpdata, len))
ptr = Picture_PNGConvert((UINT8 *)lumpdata, PICFMT_DOOMPATCH, NULL, NULL, NULL, NULL, len, &len, 0);
#endif
dest = Z_Calloc(sizeof(patch_t), tag, &lumpcache[lump]);
Patch_Create(ptr, len, dest);
Z_Free(ptr);
} }
else else
Z_ChangeTag(lumpcache[lump], tag); Z_ChangeTag(lumpcache[lump], tag);
@ -2278,6 +2289,7 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
vlumps[i].name[8] = '\0'; vlumps[i].name[8] = '\0';
vlumps[i].data = Z_Malloc(vlumps[i].size, PU_LEVEL, NULL); // This is memory inefficient, sorry about that. vlumps[i].data = Z_Malloc(vlumps[i].size, PU_LEVEL, NULL); // This is memory inefficient, sorry about that.
memcpy(vlumps[i].data, wadData + (fileinfo + i)->filepos, vlumps[i].size); memcpy(vlumps[i].data, wadData + (fileinfo + i)->filepos, vlumps[i].size);
vlumps[i].cache = NULL;
} }
Z_Free(wadData); Z_Free(wadData);
@ -2298,6 +2310,7 @@ virtres_t* vres_GetMap(lumpnum_t lumpnum)
memcpy(vlumps[i].name, W_CheckNameForNum(lumpnum), 8); memcpy(vlumps[i].name, W_CheckNameForNum(lumpnum), 8);
vlumps[i].name[8] = '\0'; vlumps[i].name[8] = '\0';
vlumps[i].data = W_CacheLumpNum(lumpnum, PU_LEVEL); vlumps[i].data = W_CacheLumpNum(lumpnum, PU_LEVEL);
vlumps[i].cache = NULL;
} }
} }
vres = Z_Malloc(sizeof(virtres_t), PU_LEVEL, NULL); vres = Z_Malloc(sizeof(virtres_t), PU_LEVEL, NULL);
@ -2345,3 +2358,37 @@ virtlump_t* vres_Find(const virtres_t* vres, const char* name)
return &vres->vlumps[i]; return &vres->vlumps[i];
return NULL; return NULL;
} }
/** \brief Gets patch from given virtual lump
*
* \param Virtual lump
* \return Patch data
*
*/
void *vres_GetPatch(virtlump_t *vlump, INT32 tag)
{
patch_t *patch;
if (!vlump)
return NULL;
if (!vlump->cache)
{
MakePatch(vlump->data, vlump->size, tag, &vlump->cache);
}
else
Z_ChangeTag(vlump->cache, tag);
patch = vlump->cache;
#ifdef HWRENDER
// Software-only compile cache the data without conversion
if (rendermode == render_soft || rendermode == render_none)
#endif
return (void *)patch;
#ifdef HWRENDER
Patch_CreateGL(patch);
return (void *)patch;
#endif
}

View file

@ -82,6 +82,7 @@ typedef struct {
char name[9]; char name[9];
UINT8* data; UINT8* data;
size_t size; size_t size;
void *cache;
} virtlump_t; } virtlump_t;
typedef struct { typedef struct {
@ -92,6 +93,7 @@ typedef struct {
virtres_t* vres_GetMap(lumpnum_t); virtres_t* vres_GetMap(lumpnum_t);
void vres_Free(virtres_t*); void vres_Free(virtres_t*);
virtlump_t* vres_Find(const virtres_t*, const char*); virtlump_t* vres_Find(const virtres_t*, const char*);
void* vres_GetPatch(virtlump_t *vlump, INT32 tag);
// ========================================================================= // =========================================================================
// DYNAMIC WAD LOADING // DYNAMIC WAD LOADING