vhlt/common/bspfile.h

474 lines
14 KiB
C

#ifndef BSPFILE_H__
#define BSPFILE_H__
#include "cmdlib.h" //--vluzacn
#if _MSC_VER >= 1000
#pragma once
#endif
// upper design bounds
#define MAX_MAP_HULLS 4
// hard limit
#define MAX_MAP_MODELS 512 //400 //vluzacn
// variable, but 400 brush entities is very stressful on the engine and network code as it is
#define MAX_MAP_BRUSHES 32768
// arbitrary, but large numbers of brushes generally require more lightmap's than the compiler can handle
#define MAX_ENGINE_ENTITIES 16384 //1024 //vluzacn
#define MAX_MAP_ENTITIES 16384 //2048 //vluzacn
// hard limit, in actuallity it is too much, as temporary entities in the game plus static map entities can overflow
#define MAX_MAP_ENTSTRING (2048*1024) //(512*1024) //vluzacn
// abitrary, 512Kb of string data should be plenty even with TFC FGD's
#define MAX_MAP_PLANES 32768 // TODO: This can be larger, because although faces can only use plane 0~32767, clipnodes can use plane 0-65535. --vluzacn
#define MAX_INTERNAL_MAP_PLANES (256*1024)
// (from email): I have been building a rather complicated map, and using your latest
// tools (1.61) it seemed to compile fine. However, in game, the engine was dropping
// a lot of faces from almost every FUNC_WALL, and also caused a strange texture
// phenomenon in software mode (see attached screen shot). When I compiled with v1.41,
// I noticed that it hit the MAX_MAP_PLANES limit of 32k. After deleting some brushes
// I was able to bring the map under the limit, and all of the previous errors went away.
#define MAX_MAP_NODES 32767
// hard limit (negative short's are used as contents values)
#define MAX_MAP_CLIPNODES 32767
// hard limit (negative short's are used as contents values)
#ifdef ZHLT_MAX_MAP_LEAFS
#define MAX_MAP_LEAFS 32760
#define MAX_MAP_LEAFS_ENGINE 8192
// No problem has been observed in testmap or reported, except when viewing the map from outside (some leafs missing, no crash).
// This problem indicates that engine's MAX_MAP_LEAFS is 8192 (for reason, see: Quake - gl_model.c - Mod_Init).
// I don't know if visleafs > 8192 will cause Mod_DecompressVis overflow.
#else
#define MAX_MAP_LEAFS 8192
// hard limit (halflife depends on it to setup pvs bits correctly)
#endif
#define MAX_MAP_VERTS 65535
#define MAX_MAP_FACES 65535 // This ought to be 32768, otherwise faces(in world) can become invisible. --vluzacn
#ifdef ZHLT_WARNWORLDFACES
#define MAX_MAP_WORLDFACES 32768
#endif
#define MAX_MAP_MARKSURFACES 65535
// hard limit (data structures store them as unsigned shorts)
#define MAX_MAP_TEXTURES 4096 //512 //vluzacn
// hard limit (halflife limitation) // I used 2048 different textures in a test map and everything looks fine in both opengl and d3d mode.
#define MAX_MAP_TEXINFO 32767
// hard limit (face.texinfo is signed short)
#ifdef HLCSG_HLBSP_REDUCETEXTURE
#define MAX_INTERNAL_MAP_TEXINFO 262144
#endif
#define MAX_MAP_EDGES 256000
#define MAX_MAP_SURFEDGES 512000
// arbtirary
#define DEFAULT_MAX_MAP_MIPTEX 0x2000000 //0x400000 //vluzacn
// 4Mb of textures is enough especially considering the number of people playing the game
// still with voodoo1 and 2 class cards with limited local memory.
#define DEFAULT_MAX_MAP_LIGHTDATA 0x3000000 //0x600000 //vluzacn
// arbitrary
#define MAX_MAP_VISIBILITY 0x800000 //0x200000 //vluzacn
// arbitrary
// these are for entity key:value pairs
#define MAX_KEY 128 //32 //vluzacn
#define MAX_VAL 4096 // the name used to be MAX_VALUE //vluzacn
// quote from yahn: 'probably can raise these values if needed'
// texture size limit
#define MAX_TEXTURE_SIZE 348972 //((256 * 256 * sizeof(short) * 3) / 2) //stop compiler from warning 512*512 texture. --vluzacn
// this is arbitrary, and needs space for the largest realistic texture plus
// room for its mipmaps.' This value is primarily used to catch damanged or invalid textures
// in a wad file
#ifdef ZHLT_XASH2
#define TEXTURE_STEP 8
#define MAX_SURFACE_EXTENT 64
#else
#define TEXTURE_STEP 16 // this constant was previously defined in lightmap.cpp. --vluzacn
#define MAX_SURFACE_EXTENT 16 // if lightmap extent exceeds 16, the map will not be able to load in 'Software' renderer and HLDS. //--vluzacn
#endif
#ifdef ZHLT_LARGERANGE
#define ENGINE_ENTITY_RANGE 4096.0
#endif
//=============================================================================
#ifdef ZHLT_XASH2
#define BSPVERSION 31
#else
#define BSPVERSION 30
#endif
#define TOOLVERSION 2
//
// BSP File Structures
//
typedef struct
{
int fileofs, filelen;
}
lump_t;
#define LUMP_ENTITIES 0
#define LUMP_PLANES 1
#define LUMP_TEXTURES 2
#define LUMP_VERTEXES 3
#define LUMP_VISIBILITY 4
#define LUMP_NODES 5
#define LUMP_TEXINFO 6
#define LUMP_FACES 7
#define LUMP_LIGHTING 8
#define LUMP_CLIPNODES 9
#define LUMP_LEAFS 10
#define LUMP_MARKSURFACES 11
#define LUMP_EDGES 12
#define LUMP_SURFEDGES 13
#define LUMP_MODELS 14
#ifdef ZHLT_XASH2
#define LUMP_CLIPNODES2 15
#define LUMP_CLIPNODES3 16
#define HEADER_LUMPS 17
#else
#define HEADER_LUMPS 15
#endif
//#define LUMP_MISCPAD -1
//#define LUMP_ZEROPAD -2
typedef struct
{
float mins[3], maxs[3];
float origin[3];
int headnode[MAX_MAP_HULLS];
int visleafs; // not including the solid leaf 0
int firstface, numfaces;
}
dmodel_t;
typedef struct
{
int version;
lump_t lumps[HEADER_LUMPS];
}
dheader_t;
typedef struct
{
int nummiptex;
int dataofs[4]; // [nummiptex]
}
dmiptexlump_t;
#define MIPLEVELS 4
typedef struct miptex_s
{
char name[16];
unsigned width, height;
unsigned offsets[MIPLEVELS]; // four mip maps stored
}
miptex_t;
typedef struct
{
float point[3];
}
dvertex_t;
typedef struct
{
float normal[3];
float dist;
planetypes type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
}
dplane_t;
typedef enum
{
CONTENTS_EMPTY = -1,
CONTENTS_SOLID = -2,
CONTENTS_WATER = -3,
CONTENTS_SLIME = -4,
CONTENTS_LAVA = -5,
CONTENTS_SKY = -6,
CONTENTS_ORIGIN = -7, // removed at csg time
#ifndef HLCSG_CUSTOMHULL
CONTENTS_CLIP = -8, // changed to contents_solid
#endif
CONTENTS_CURRENT_0 = -9,
CONTENTS_CURRENT_90 = -10,
CONTENTS_CURRENT_180 = -11,
CONTENTS_CURRENT_270 = -12,
CONTENTS_CURRENT_UP = -13,
CONTENTS_CURRENT_DOWN = -14,
CONTENTS_TRANSLUCENT = -15,
CONTENTS_HINT = -16, // Filters down to CONTENTS_EMPTY by bsp, ENGINE SHOULD NEVER SEE THIS
#ifdef ZHLT_NULLTEX
CONTENTS_NULL = -17, // AJM // removed in csg and bsp, VIS or RAD shouldnt have to deal with this, only clip planes!
#endif
#ifdef ZHLT_DETAIL // AJM
CONTENTS_DETAIL = -18,
#endif
#ifdef HLCSG_HLBSP_CUSTOMBOUNDINGBOX
CONTENTS_BOUNDINGBOX = -19, // similar to CONTENTS_ORIGIN
#endif
#ifdef HLCSG_EMPTYBRUSH
CONTENTS_TOEMPTY = -32,
#endif
}
contents_t;
// !!! if this is changed, it must be changed in asm_i386.h too !!!
typedef struct
{
int planenum;
short children[2]; // negative numbers are -(leafs+1), not nodes
short mins[3]; // for sphere culling
short maxs[3];
unsigned short firstface;
unsigned short numfaces; // counting both sides
}
dnode_t;
typedef struct
{
int planenum;
short children[2]; // negative numbers are contents
}
dclipnode_t;
typedef struct texinfo_s
{
float vecs[2][4]; // [s/t][xyz offset]
int miptex;
int flags;
}
texinfo_t;
#define TEX_SPECIAL 1 // sky or slime or null, no lightmap or 256 subdivision
#ifdef ZHLT_HIDDENSOUNDTEXTURE
#define TEX_SHOULDHIDE 16384 // this flag is temporary; it might be set after CSG, but will be dropped after BSP
#endif
// note that edge 0 is never used, because negative edge nums are used for
// counterclockwise use of the edge in a face
typedef struct
{
unsigned short v[2]; // vertex numbers
}
dedge_t;
#define MAXLIGHTMAPS 4
typedef struct
{
unsigned short planenum;
short side;
int firstedge; // we must support > 64k edges
short numedges;
short texinfo;
// lighting info
byte styles[MAXLIGHTMAPS];
int lightofs; // start of [numstyles*surfsize] samples
}
dface_t;
#define AMBIENT_WATER 0
#define AMBIENT_SKY 1
#define AMBIENT_SLIME 2
#define AMBIENT_LAVA 3
#define NUM_AMBIENTS 4 // automatic ambient sounds
// leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
// all other leafs need visibility info
typedef struct
{
int contents;
int visofs; // -1 = no visibility info
short mins[3]; // for frustum culling
short maxs[3];
unsigned short firstmarksurface;
unsigned short nummarksurfaces;
byte ambient_level[NUM_AMBIENTS];
}
dleaf_t;
//============================================================================
#define ANGLE_UP -1.0 //#define ANGLE_UP -1 //--vluzacn
#define ANGLE_DOWN -2.0 //#define ANGLE_DOWN -2 //--vluzacn
//
// BSP File Data
//
extern int g_nummodels;
extern dmodel_t g_dmodels[MAX_MAP_MODELS];
extern int g_dmodels_checksum;
extern int g_visdatasize;
extern byte g_dvisdata[MAX_MAP_VISIBILITY];
extern int g_dvisdata_checksum;
extern int g_lightdatasize;
extern byte* g_dlightdata;
extern int g_dlightdata_checksum;
extern int g_texdatasize;
extern byte* g_dtexdata; // (dmiptexlump_t)
extern int g_dtexdata_checksum;
extern int g_entdatasize;
extern char g_dentdata[MAX_MAP_ENTSTRING];
extern int g_dentdata_checksum;
extern int g_numleafs;
extern dleaf_t g_dleafs[MAX_MAP_LEAFS];
extern int g_dleafs_checksum;
extern int g_numplanes;
extern dplane_t g_dplanes[MAX_INTERNAL_MAP_PLANES];
extern int g_dplanes_checksum;
extern int g_numvertexes;
extern dvertex_t g_dvertexes[MAX_MAP_VERTS];
extern int g_dvertexes_checksum;
extern int g_numnodes;
extern dnode_t g_dnodes[MAX_MAP_NODES];
extern int g_dnodes_checksum;
extern int g_numtexinfo;
#ifdef HLCSG_HLBSP_REDUCETEXTURE
extern texinfo_t g_texinfo[MAX_INTERNAL_MAP_TEXINFO];
#else
extern texinfo_t g_texinfo[MAX_MAP_TEXINFO];
#endif
extern int g_texinfo_checksum;
extern int g_numfaces;
extern dface_t g_dfaces[MAX_MAP_FACES];
extern int g_dfaces_checksum;
#ifdef ZHLT_XASH2
extern int g_numclipnodes[MAX_MAP_HULLS - 1];
extern dclipnode_t g_dclipnodes[MAX_MAP_HULLS - 1][MAX_MAP_CLIPNODES];
extern int g_dclipnodes_checksum[MAX_MAP_HULLS - 1];
#else
extern int g_numclipnodes;
extern dclipnode_t g_dclipnodes[MAX_MAP_CLIPNODES];
extern int g_dclipnodes_checksum;
#endif
extern int g_numedges;
extern dedge_t g_dedges[MAX_MAP_EDGES];
extern int g_dedges_checksum;
extern int g_nummarksurfaces;
extern unsigned short g_dmarksurfaces[MAX_MAP_MARKSURFACES];
extern int g_dmarksurfaces_checksum;
extern int g_numsurfedges;
extern int g_dsurfedges[MAX_MAP_SURFEDGES];
extern int g_dsurfedges_checksum;
extern void DecompressVis(const byte* src, byte* const dest, const unsigned int dest_length);
extern int CompressVis(const byte* const src, const unsigned int src_length, byte* dest, unsigned int dest_length);
extern void LoadBSPImage(dheader_t* header);
extern void LoadBSPFile(const char* const filename);
extern void WriteBSPFile(const char* const filename);
extern void PrintBSPFileSizes();
#ifdef ZHLT_64BIT_FIX
#ifdef PLATFORM_CAN_CALC_EXTENT
extern void WriteExtentFile (const char *const filename);
extern bool CalcFaceExtents_test ();
#else
extern void LoadExtentFile (const char *const filename);
#endif
extern void GetFaceExtents (int facenum, int mins_out[2], int maxs_out[2]);
#endif
#ifdef ZHLT_EMBEDLIGHTMAP
extern int ParseImplicitTexinfoFromTexture (int miptex);
extern int ParseTexinfoForFace (const dface_t *f);
extern void DeleteEmbeddedLightmaps ();
#endif
//
// Entity Related Stuff
//
typedef struct epair_s
{
struct epair_s* next;
char* key;
char* value;
}
epair_t;
typedef struct
{
vec3_t origin;
int firstbrush;
int numbrushes;
epair_t* epairs;
}
entity_t;
extern int g_numentities;
extern entity_t g_entities[MAX_MAP_ENTITIES];
extern void ParseEntities();
extern void UnparseEntities();
#ifdef ZHLT_DELETEKEY
extern void DeleteKey(entity_t* ent, const char* const key);
#endif
extern void SetKeyValue(entity_t* ent, const char* const key, const char* const value);
extern const char* ValueForKey(const entity_t* const ent, const char* const key);
extern int IntForKey(const entity_t* const ent, const char* const key);
extern vec_t FloatForKey(const entity_t* const ent, const char* const key);
extern void GetVectorForKey(const entity_t* const ent, const char* const key, vec3_t vec);
extern entity_t* FindTargetEntity(const char* const target);
extern epair_t* ParseEpair();
extern entity_t* EntityForModel(int modnum);
//
// Texture Related Stuff
//
extern int g_max_map_miptex;
extern int g_max_map_lightdata;
extern void dtexdata_init();
extern void CDECL dtexdata_free();
extern char* GetTextureByNumber(int texturenumber);
#endif //BSPFILE_H__