common: add q2 structs to bspfile.hh

This commit is contained in:
Eric Wasylishen 2017-09-24 21:56:49 -06:00
parent 69f502f7a3
commit 55f2c3c47e
2 changed files with 203 additions and 0 deletions

View File

@ -975,6 +975,28 @@ const lumpspec_t lumpspec_bsp2[] = {
{ "models", sizeof(dmodel_t) },
};
const lumpspec_t lumpspec_q2bsp[] = {
{ "entities", sizeof(char) },
{ "planes", sizeof(dplane_t) },
{ "vertexes", sizeof(dvertex_t) },
{ "visibility", sizeof(byte) },
{ "nodes", sizeof(q2_dnode_t) },
{ "texinfos", sizeof(q2_texinfo_t) },
{ "faces", sizeof(q2_dface_t) },
{ "lighting", sizeof(byte) },
{ "leafs", sizeof(q2_dleaf_t) },
{ "leaffaces", sizeof(uint16_t) },
{ "leafbrushes", sizeof(uint16_t) },
{ "edges", sizeof(bsp29_dedge_t) },
{ "surfedges", sizeof(int32_t) },
{ "models", sizeof(q2_dmodel_t) },
{ "brushes", sizeof(dbrush_t) },
{ "brushsides", sizeof(dbrushside_t) },
{ "pop", sizeof(byte) },
{ "areas", sizeof(darea_t) },
{ "areaportals", sizeof(dareaportal_t) },
};
static int
CopyLump(const dheader_t *header, int lumpnum, void *destptr)
{

View File

@ -55,6 +55,8 @@
#define BSPVERSION 29
#define BSP2RMQVERSION (('B' << 24) | ('S' << 16) | ('P' << 8) | '2')
#define BSP2VERSION ('B' | ('S' << 8) | ('P' << 16) | ('2' << 24))
#define Q2_BSPIDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I')
#define Q2_BSPVERSION 38
typedef struct {
int32_t fileofs;
@ -79,6 +81,34 @@ typedef struct {
#define BSP_LUMPS 15
#define Q2_LUMP_ENTITIES 0
#define Q2_LUMP_PLANES 1
#define Q2_LUMP_VERTEXES 2
#define Q2_LUMP_VISIBILITY 3
#define Q2_LUMP_NODES 4
#define Q2_LUMP_TEXINFO 5
#define Q2_LUMP_FACES 6
#define Q2_LUMP_LIGHTING 7
#define Q2_LUMP_LEAFS 8
#define Q2_LUMP_LEAFFACES 9
#define Q2_LUMP_LEAFBRUSHES 10
#define Q2_LUMP_EDGES 11
#define Q2_LUMP_SURFEDGES 12
#define Q2_LUMP_MODELS 13
#define Q2_LUMP_BRUSHES 14
#define Q2_LUMP_BRUSHSIDES 15
#define Q2_LUMP_POP 16
#define Q2_LUMP_AREAS 17
#define Q2_LUMP_AREAPORTALS 18
#define Q2_HEADER_LUMPS 19
typedef struct
{
int ident;
int version;
lump_t lumps[Q2_HEADER_LUMPS];
} q2_dheader_t;
typedef struct {
char id[4]; //'BSPX'
uint32_t numlumps;
@ -97,6 +127,7 @@ typedef struct {
extern const lumpspec_t lumpspec_bsp29[BSP_LUMPS];
extern const lumpspec_t lumpspec_bsp2rmq[BSP_LUMPS];
extern const lumpspec_t lumpspec_bsp2[BSP_LUMPS];
extern const lumpspec_t lumpspec_q2bsp[Q2_HEADER_LUMPS];
typedef struct {
float mins[3];
@ -107,6 +138,7 @@ typedef struct {
int32_t firstface;
int32_t numfaces;
} dmodelq1_t;
typedef struct {
float mins[3];
float maxs[3];
@ -116,6 +148,17 @@ typedef struct {
int32_t firstface;
int32_t numfaces;
} dmodelh2_t;
typedef struct {
float mins[3];
float maxs[3];
float origin[3]; // for sounds or lights
int32_t headnode;
int32_t firstface;
int32_t numfaces; // submodels just draw faces
// without walking the bsp tree
} q2_dmodel_t;
typedef dmodelh2_t dmodel_t;
typedef struct {
@ -186,6 +229,15 @@ typedef struct {
uint32_t numfaces; /* counting both sides */
} bsp2_dnode_t;
typedef struct {
int32_t planenum;
int32_t children[2]; // negative numbers are -(leafs+1), not nodes
int16_t mins[3]; // for frustom culling
int16_t maxs[3];
uint16_t firstface;
uint16_t numfaces; // counting both sides
} q2_dnode_t;
/*
* Note that children are interpreted as unsigned values now, so that we can
* handle > 32k clipnodes. Values > 0xFFF0 can be assumed to be CONTENTS
@ -208,6 +260,14 @@ typedef struct texinfo_s {
int32_t flags;
} texinfo_t;
typedef struct {
float vecs[2][4]; // [s/t][xyz offset]
int32_t flags; // miptex flags + overrides
int32_t value; // light emission, etc
char texture[32]; // texture name (textures/*.wal)
int32_t nexttexinfo; // for animations, -1 = end of chain
} q2_texinfo_t;
// Texture flags. Only TEX_SPECIAL is written to the .bsp.
#define TEX_SPECIAL 1 /* sky or slime, no lightmap or 256 subdivision */
#define TEX_SKIP (1U << 1) /* an invisible surface */
@ -262,6 +322,18 @@ typedef struct {
int32_t lightofs; /* start of [numstyles*surfsize] samples */
} bsp2_dface_t;
typedef struct {
uint16_t planenum; // NOTE: only difference from bsp29_dface_t
int16_t side;
int32_t firstedge; // we must support > 64k edges
int16_t numedges;
int16_t texinfo;
// lighting info
uint8_t styles[MAXLIGHTMAPS];
int32_t lightofs; // start of [numstyles*surfsize] samples
} q2_dface_t;
/* Ambient Sounds */
#define AMBIENT_WATER 0
#define AMBIENT_SKY 1
@ -303,11 +375,61 @@ typedef struct {
uint8_t ambient_level[NUM_AMBIENTS];
} bsp2_dleaf_t;
typedef struct {
int32_t contents; // OR of all brushes (not needed?)
int16_t cluster;
int16_t area;
int16_t mins[3]; // for frustum culling
int16_t maxs[3];
uint16_t firstleafface;
uint16_t numleaffaces;
uint16_t firstleafbrush;
uint16_t numleafbrushes;
} q2_dleaf_t;
typedef union {
byte *base;
dmiptexlump_t *header;
} dtexdata_t;
typedef struct {
uint16_t planenum; // facing out of the leaf
int16_t texinfo;
} dbrushside_t;
typedef struct {
int32_t firstside;
int32_t numsides;
int32_t contents;
} dbrush_t;
// the visibility lump consists of a header with a count, then
// byte offsets for the PVS and PHS of each cluster, then the raw
// compressed bit vectors
#define DVIS_PVS 0
#define DVIS_PHS 1
typedef struct {
int32_t numclusters;
int32_t bitofs[8][2]; // bitofs[numclusters][2]
} dvis_t;
// each area has a list of portals that lead into other areas
// when portals are closed, other areas may not be visible or
// hearable even if the vis info says that it should be
typedef struct {
int32_t portalnum;
int32_t otherarea;
} dareaportal_t;
typedef struct {
int32_t numareaportals;
int32_t firstareaportal;
} darea_t;
/* ========================================================================= */
typedef struct bspxentry_s
@ -460,6 +582,65 @@ typedef struct {
int32_t *dsurfedges;
} bsp2_t;
typedef struct {
int nummodels;
q2_dmodel_t *dmodels;
int visdatasize;
byte *dvisdata;
dvis_t *dvis;
int lightdatasize;
byte *dlightdata;
int entdatasize;
char *dentdata;
int numleafs;
q2_dleaf_t *dleafs;
int numplanes;
dplane_t *dplanes;
int numvertexes;
dvertex_t *dvertexes;
int numnodes;
q2_dnode_t *dnodes;
int numtexinfo;
q2_texinfo_t *texinfo;
int numfaces;
q2_dface_t *dfaces;
int numedges;
bsp29_dedge_t *dedges;
int numleaffaces;
uint16_t *dleaffaces;
int numleafbrushes;
uint16_t *dleafbrushes;
int numsurfedges;
int32_t *dsurfedges;
int numareas;
darea_t *dareas;
int numareaportals;
dareaportal_t *dareaportals;
int numbrushes;
dbrush_t *dbrushes;
int numbrushsides;
dbrushside_t *dbrushsides;
byte dpop[256];
} q2bsp_t;
typedef struct {
int32_t version;
lump_t lumps[BSP_LUMPS];