Added 'virtual resource' mechanism for temporary memory loaded lump lists. If you can come up with a better name then I'm all ears.
This commit is contained in:
parent
9ab00049dc
commit
854d50f479
95
src/w_wad.c
95
src/w_wad.c
|
@ -1888,3 +1888,98 @@ int W_VerifyNMUSlumps(const char *filename)
|
||||||
};
|
};
|
||||||
return W_VerifyFile(filename, NMUSlist, false);
|
return W_VerifyFile(filename, NMUSlist, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** \brief Generates a virtual resource used for level data loading.
|
||||||
|
*
|
||||||
|
* \param lumpnum_t reference
|
||||||
|
* \return Virtual resource
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtres_t* vres_GetMap (lumpnum_t lumpnum)
|
||||||
|
{
|
||||||
|
UINT32 i;
|
||||||
|
virtres_t* vres = NULL;
|
||||||
|
virtlump_t* vlumps = NULL;
|
||||||
|
size_t numlumps = 0;
|
||||||
|
|
||||||
|
if (W_IsLumpWad(lumpnum))
|
||||||
|
{
|
||||||
|
// Remember that we're assuming that the WAD will have a specific set of lumps in a specific order.
|
||||||
|
UINT8 *wadData = W_CacheLumpNum(lumpnum, PU_LEVEL);
|
||||||
|
filelump_t *fileinfo = (filelump_t *)(wadData + ((wadinfo_t *)wadData)->infotableofs);
|
||||||
|
numlumps = ((wadinfo_t *)wadData)->numlumps;
|
||||||
|
vlumps = Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL);
|
||||||
|
|
||||||
|
// Build the lumps.
|
||||||
|
for (i = 0; i < numlumps; i++)
|
||||||
|
{
|
||||||
|
vlumps[i].size = (size_t)(((filelump_t *)(fileinfo + i))->size);
|
||||||
|
// Play it safe with the name in this case.
|
||||||
|
memcpy(vlumps[i].name, (fileinfo + i)->name, 8);
|
||||||
|
vlumps[i].name[8] = '\0';
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
Z_Free(wadData);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Count number of lumps until the end of resource OR up until next "MAPXX" lump.
|
||||||
|
lumpnum_t lumppos = lumpnum + 1;
|
||||||
|
for (i = LUMPNUM(lumppos); i < wadfiles[WADFILENUM(lumpnum)]->numlumps; i++, lumppos++, numlumps++)
|
||||||
|
if (memcmp(W_CheckNameForNum(lumppos), "MAP", 3) == 0)
|
||||||
|
break;
|
||||||
|
numlumps++;
|
||||||
|
|
||||||
|
vlumps = Z_Malloc(sizeof(virtlump_t)*numlumps, PU_LEVEL, NULL);
|
||||||
|
for (i = 0; i < numlumps; i++, lumpnum++)
|
||||||
|
{
|
||||||
|
vlumps[i].size = W_LumpLength(lumpnum);
|
||||||
|
memcpy(vlumps[i].name, W_CheckNameForNum(lumpnum), 8);
|
||||||
|
vlumps[i].name[8] = '\0';
|
||||||
|
vlumps[i].data = W_CacheLumpNum(lumpnum, PU_LEVEL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vres = Z_Malloc(sizeof(virtres_t), PU_LEVEL, NULL);
|
||||||
|
vres->vlumps = vlumps;
|
||||||
|
vres->numlumps = numlumps;
|
||||||
|
return vres;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Frees zone memory for a given virtual resource.
|
||||||
|
*
|
||||||
|
* \param Virtual resource
|
||||||
|
*/
|
||||||
|
void vres_Free (virtres_t* vres)
|
||||||
|
{
|
||||||
|
while (vres->numlumps--)
|
||||||
|
Z_Free(vres->vlumps[vres->numlumps].data);
|
||||||
|
Z_Free(vres->vlumps);
|
||||||
|
Z_Free(vres);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** (Debug) Prints lumps from a virtual resource into console.
|
||||||
|
*/
|
||||||
|
static void vres_Diag (const virtres_t* vres)
|
||||||
|
{
|
||||||
|
UINT32 i;
|
||||||
|
for (i = 0; i < vres->numlumps; i++)
|
||||||
|
CONS_Printf("%s\n", vres->vlumps[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Finds a lump in a given virtual resource.
|
||||||
|
*
|
||||||
|
* \param Virtual resource
|
||||||
|
* \param Lump name to look for
|
||||||
|
* \return Virtual lump if found, NULL otherwise
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
virtlump_t* vres_Find(const virtres_t* vres, const char* name)
|
||||||
|
{
|
||||||
|
UINT32 i;
|
||||||
|
for (i = 0; i < vres->numlumps; i++)
|
||||||
|
if (fastcmp(name, vres->vlumps[i].name))
|
||||||
|
return &vres->vlumps[i];
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
19
src/w_wad.h
19
src/w_wad.h
|
@ -72,6 +72,25 @@ typedef struct
|
||||||
compmethod compression; // lump compression method
|
compmethod compression; // lump compression method
|
||||||
} lumpinfo_t;
|
} lumpinfo_t;
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// 'VIRTUAL' RESOURCES
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char name[9];
|
||||||
|
UINT8* data;
|
||||||
|
size_t size;
|
||||||
|
} virtlump_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
size_t numlumps;
|
||||||
|
virtlump_t* vlumps;
|
||||||
|
} virtres_t;
|
||||||
|
|
||||||
|
virtres_t* vres_GetMap (lumpnum_t);
|
||||||
|
void vres_Free (virtres_t*);
|
||||||
|
virtlump_t* vres_Find (const virtres_t*, const char*);
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
// DYNAMIC WAD LOADING
|
// DYNAMIC WAD LOADING
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
Loading…
Reference in New Issue