mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Add patch support from a virtual lump
This commit is contained in:
parent
e1ad0bef7c
commit
556aa1c4c0
2 changed files with 60 additions and 11 deletions
69
src/w_wad.c
69
src/w_wad.c
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue