common: create a lumpspec structure with lump data names/sizes
Copylump now doesn't need the size passed in, just the type. Also, pass the file header into CopyLump while we're at it. Signed-off-by: Kevin Shanahan <kmshanah@disenchant.net>
This commit is contained in:
parent
9580d04f45
commit
df0aa44310
|
|
@ -190,31 +190,50 @@ SwapBSPFile(qboolean todisk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const lumpspec_t lumpspec[] = {
|
||||||
|
{ "entity", sizeof(char) },
|
||||||
|
{ "plane", sizeof(dplane_t) },
|
||||||
|
{ "texture", sizeof(byte) },
|
||||||
|
{ "vertex", sizeof(dvertex_t) },
|
||||||
|
{ "visibility", sizeof(byte) },
|
||||||
|
{ "node", sizeof(dnode_t) },
|
||||||
|
{ "texinfo", sizeof(texinfo_t) },
|
||||||
|
{ "face", sizeof(dface_t) },
|
||||||
|
{ "lighting", sizeof(byte) },
|
||||||
|
{ "clipnode", sizeof(dclipnode_t) },
|
||||||
|
{ "leaf", sizeof(dleaf_t) },
|
||||||
|
{ "marksurface", sizeof(unsigned short) },
|
||||||
|
{ "edge", sizeof(dedge_t) },
|
||||||
|
{ "surfedge", sizeof(int) },
|
||||||
|
{ "model", sizeof(dmodel_t) },
|
||||||
|
};
|
||||||
|
|
||||||
static dheader_t *header;
|
static dheader_t *header;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
CopyLump(int lump, void *dest, int size)
|
CopyLump(const dheader_t *header, int lumpnum, void *destptr)
|
||||||
{
|
{
|
||||||
|
const size_t size = lumpspec[lumpnum].size;
|
||||||
|
byte **bufferptr = destptr;
|
||||||
|
byte *buffer = *bufferptr;
|
||||||
int length;
|
int length;
|
||||||
int ofs;
|
int ofs;
|
||||||
byte **buf = dest;
|
|
||||||
|
|
||||||
length = header->lumps[lump].filelen;
|
length = header->lumps[lumpnum].filelen;
|
||||||
ofs = header->lumps[lump].fileofs;
|
ofs = header->lumps[lumpnum].fileofs;
|
||||||
|
|
||||||
if (length % size)
|
if (length % size)
|
||||||
Error("%s: odd lump size", __func__);
|
Error("%s: odd %s lump size", __func__, lumpspec[lumpnum].name);
|
||||||
|
|
||||||
if (*buf)
|
if (buffer)
|
||||||
free(*buf);
|
free(buffer);
|
||||||
|
|
||||||
*buf = malloc(length + 1);
|
buffer = *bufferptr = malloc(length + 1);
|
||||||
if (!*buf)
|
if (!buffer)
|
||||||
Error("%s: allocation of %i bytes failed.", __func__, length);
|
Error("%s: allocation of %i bytes failed.", __func__, length);
|
||||||
|
|
||||||
memcpy(*buf, (byte *)header + ofs, length);
|
memcpy(buffer, (const byte *)header + ofs, length);
|
||||||
*(*buf + length) = 0; /* Required for entity lump? */
|
buffer[length] = 0; /* In case of corrupt entity lump */
|
||||||
|
|
||||||
return length / size;
|
return length / size;
|
||||||
}
|
}
|
||||||
|
|
@ -242,24 +261,22 @@ LoadBSPFile(const char *filename)
|
||||||
if (bsp_version != 29)
|
if (bsp_version != 29)
|
||||||
Error("Sorry, only bsp version 29 supported.");
|
Error("Sorry, only bsp version 29 supported.");
|
||||||
|
|
||||||
nummodels = CopyLump(LUMP_MODELS, &dmodels, sizeof(dmodel_t));
|
nummodels = CopyLump(header, LUMP_MODELS, &dmodels);
|
||||||
numvertexes = CopyLump(LUMP_VERTEXES, &dvertexes, sizeof(dvertex_t));
|
numvertexes = CopyLump(header, LUMP_VERTEXES, &dvertexes);
|
||||||
numplanes = CopyLump(LUMP_PLANES, &dplanes, sizeof(dplane_t));
|
numplanes = CopyLump(header, LUMP_PLANES, &dplanes);
|
||||||
numleafs = CopyLump(LUMP_LEAFS, &dleafs, sizeof(dleaf_t));
|
numleafs = CopyLump(header, LUMP_LEAFS, &dleafs);
|
||||||
numnodes = CopyLump(LUMP_NODES, &dnodes, sizeof(dnode_t));
|
numnodes = CopyLump(header, LUMP_NODES, &dnodes);
|
||||||
numtexinfo = CopyLump(LUMP_TEXINFO, &texinfo, sizeof(texinfo_t));
|
numtexinfo = CopyLump(header, LUMP_TEXINFO, &texinfo);
|
||||||
numclipnodes = CopyLump(LUMP_CLIPNODES, &dclipnodes, sizeof(dclipnode_t));
|
numclipnodes = CopyLump(header, LUMP_CLIPNODES, &dclipnodes);
|
||||||
numfaces = CopyLump(LUMP_FACES, &dfaces, sizeof(dface_t));
|
numfaces = CopyLump(header, LUMP_FACES, &dfaces);
|
||||||
nummarksurfaces = CopyLump(LUMP_MARKSURFACES, &dmarksurfaces,
|
nummarksurfaces = CopyLump(header, LUMP_MARKSURFACES, &dmarksurfaces);
|
||||||
sizeof(dmarksurfaces[0]));
|
numsurfedges = CopyLump(header, LUMP_SURFEDGES, &dsurfedges);
|
||||||
numsurfedges = CopyLump(LUMP_SURFEDGES, &dsurfedges,
|
numedges = CopyLump(header, LUMP_EDGES, &dedges);
|
||||||
sizeof(dsurfedges[0]));
|
|
||||||
numedges = CopyLump(LUMP_EDGES, &dedges, sizeof(dedge_t));
|
|
||||||
|
|
||||||
texdatasize = CopyLump(LUMP_TEXTURES, &dtexdata, 1);
|
texdatasize = CopyLump(header, LUMP_TEXTURES, &dtexdata);
|
||||||
visdatasize = CopyLump(LUMP_VISIBILITY, &dvisdata, 1);
|
visdatasize = CopyLump(header, LUMP_VISIBILITY, &dvisdata);
|
||||||
lightdatasize = CopyLump(LUMP_LIGHTING, &dlightdata, 1);
|
lightdatasize = CopyLump(header, LUMP_LIGHTING, &dlightdata);
|
||||||
entdatasize = CopyLump(LUMP_ENTITIES, &dentdata, 1);
|
entdatasize = CopyLump(header, LUMP_ENTITIES, &dentdata);
|
||||||
|
|
||||||
free(header); /* everything has been copied out */
|
free(header); /* everything has been copied out */
|
||||||
|
|
||||||
|
|
@ -273,7 +290,6 @@ LoadBSPFile(const char *filename)
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
static FILE *wadfile;
|
static FILE *wadfile;
|
||||||
static dheader_t outheader;
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
AddLump(int lumpnum, const void *data, int len)
|
AddLump(int lumpnum, const void *data, int len)
|
||||||
|
|
@ -299,6 +315,8 @@ AddLump(int lumpnum, const void *data, int len)
|
||||||
void
|
void
|
||||||
WriteBSPFile(const char *filename, int version)
|
WriteBSPFile(const char *filename, int version)
|
||||||
{
|
{
|
||||||
|
dheader_t outheader;
|
||||||
|
|
||||||
header = &outheader;
|
header = &outheader;
|
||||||
memset(header, 0, sizeof(dheader_t));
|
memset(header, 0, sizeof(dheader_t));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,13 @@ typedef struct {
|
||||||
|
|
||||||
#define HEADER_LUMPS 15
|
#define HEADER_LUMPS 15
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *name;
|
||||||
|
size_t size;
|
||||||
|
} lumpspec_t;
|
||||||
|
|
||||||
|
extern const lumpspec_t lumpspec[HEADER_LUMPS];
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float mins[3];
|
float mins[3];
|
||||||
float maxs[3];
|
float maxs[3];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue