-mlight_t;
-
-extern rtexture_t *r_notexture;
-extern texture_t r_notexture_mip;
-
-struct model_s;
-void Mod_Q1BSP_Load(struct model_s *mod, void *buffer);
-void Mod_IBSP_Load(struct model_s *mod, void *buffer);
-void Mod_MAP_Load(struct model_s *mod, void *buffer);
-void Mod_BrushInit(void);
-
-// Q2 bsp stuff
-
-#define Q2BSPVERSION 38
-
-// leaffaces, leafbrushes, planes, and verts are still bounded by
-// 16 bit short limits
-
-//=============================================================================
-
-#define Q2LUMP_ENTITIES 0
-#define Q2LUMP_PLANES 1
-#define Q2LUMP_VERTEXES 2
-#define Q2LUMP_VISIBILITY 3
-#define Q2LUMP_NODES 4
-#define Q2LUMP_TEXINFO 5
-#define Q2LUMP_FACES 6
-#define Q2LUMP_LIGHTING 7
-#define Q2LUMP_LEAFS 8
-#define Q2LUMP_LEAFFACES 9
-#define Q2LUMP_LEAFBRUSHES 10
-#define Q2LUMP_EDGES 11
-#define Q2LUMP_SURFEDGES 12
-#define Q2LUMP_MODELS 13
-#define Q2LUMP_BRUSHES 14
-#define Q2LUMP_BRUSHSIDES 15
-#define Q2LUMP_POP 16
-#define Q2LUMP_AREAS 17
-#define Q2LUMP_AREAPORTALS 18
-#define Q2HEADER_LUMPS 19
-
-typedef struct
-{
- int ident;
- int version;
- lump_t lumps[HEADER_LUMPS];
-} q2dheader_t;
-
-typedef struct
-{
- float mins[3], maxs[3];
- float origin[3]; // for sounds or lights
- int headnode;
- int firstface, numfaces; // submodels just draw faces
- // without walking the bsp tree
-} q2dmodel_t;
-
-// planes (x&~1) and (x&~1)+1 are always opposites
-
-// contents flags are seperate bits
-// a given brush can contribute multiple content bits
-// multiple brushes can be in a single leaf
-
-// these definitions also need to be in q_shared.h!
-
-// lower bits are stronger, and will eat weaker brushes completely
-#define Q2CONTENTS_SOLID 1 // an eye is never valid in a solid
-#define Q2CONTENTS_WINDOW 2 // translucent, but not watery
-#define Q2CONTENTS_AUX 4
-#define Q2CONTENTS_LAVA 8
-#define Q2CONTENTS_SLIME 16
-#define Q2CONTENTS_WATER 32
-#define Q2CONTENTS_MIST 64
-#define Q2LAST_VISIBLE_CONTENTS 64
-
-// remaining contents are non-visible, and don't eat brushes
-
-#define Q2CONTENTS_AREAPORTAL 0x8000
-
-#define Q2CONTENTS_PLAYERCLIP 0x10000
-#define Q2CONTENTS_MONSTERCLIP 0x20000
-
-// currents can be added to any other contents, and may be mixed
-#define Q2CONTENTS_CURRENT_0 0x40000
-#define Q2CONTENTS_CURRENT_90 0x80000
-#define Q2CONTENTS_CURRENT_180 0x100000
-#define Q2CONTENTS_CURRENT_270 0x200000
-#define Q2CONTENTS_CURRENT_UP 0x400000
-#define Q2CONTENTS_CURRENT_DOWN 0x800000
-
-#define Q2CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity
-
-#define Q2CONTENTS_MONSTER 0x2000000 // should never be on a brush, only in game
-#define Q2CONTENTS_DEADMONSTER 0x4000000
-#define Q2CONTENTS_DETAIL 0x8000000 // brushes to be added after vis leafs
-#define Q2CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans
-#define Q2CONTENTS_LADDER 0x20000000
-
-
-
-#define Q2SURF_LIGHT 0x1 // value will hold the light strength
-
-#define Q2SURF_SLICK 0x2 // effects game physics
-
-#define Q2SURF_SKY 0x4 // don't draw, but add to skybox
-#define Q2SURF_WARP 0x8 // turbulent water warp
-#define Q2SURF_TRANS33 0x10
-#define Q2SURF_TRANS66 0x20
-#define Q2SURF_FLOWING 0x40 // scroll towards angle
-#define Q2SURF_NODRAW 0x80 // don't bother referencing the texture
-
-
-
-
-typedef struct
-{
- int planenum;
- int children[2]; // negative numbers are -(leafs+1), not nodes
- short mins[3]; // for frustom culling
- short maxs[3];
- unsigned short firstface;
- unsigned short numfaces; // counting both sides
-} q2dnode_t;
-
-
-typedef struct
-{
- float vecs[2][4]; // [s/t][xyz offset]
- int flags; // miptex flags + overrides
- int value; // light emission, etc
- char texture[32]; // texture name (textures/*.wal)
- int nexttexinfo; // for animations, -1 = end of chain
-} q2texinfo_t;
-
-typedef struct
-{
- int contents; // OR of all brushes (not needed?)
-
- short cluster;
- short area;
-
- short mins[3]; // for frustum culling
- short maxs[3];
-
- unsigned short firstleafface;
- unsigned short numleaffaces;
-
- unsigned short firstleafbrush;
- unsigned short numleafbrushes;
-} q2dleaf_t;
-
-typedef struct
-{
- unsigned short planenum; // facing out of the leaf
- short texinfo;
-} q2dbrushside_t;
-
-typedef struct
-{
- int firstside;
- int numsides;
- int contents;
-} q2dbrush_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 Q2DVIS_PVS 0
-#define Q2DVIS_PHS 1
-typedef struct
-{
- int numclusters;
- int bitofs[8][2]; // bitofs[numclusters][2]
-} q2dvis_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
-{
- int portalnum;
- int otherarea;
-} q2dareaportal_t;
-
-typedef struct
-{
- int numareaportals;
- int firstareaportal;
-} q2darea_t;
-
-
-//Q3 bsp stuff
-
-#define Q3BSPVERSION 46
-
-#define Q3LUMP_ENTITIES 0 // entities to spawn (used by server and client)
-#define Q3LUMP_TEXTURES 1 // textures used (used by faces)
-#define Q3LUMP_PLANES 2 // planes used (used by bsp nodes)
-#define Q3LUMP_NODES 3 // bsp nodes (used by bsp nodes, bsp leafs, rendering, collisions)
-#define Q3LUMP_LEAFS 4 // bsp leafs (used by bsp nodes)
-#define Q3LUMP_LEAFFACES 5 // array of ints indexing faces (used by leafs)
-#define Q3LUMP_LEAFBRUSHES 6 // array of ints indexing brushes (used by leafs)
-#define Q3LUMP_MODELS 7 // models (used by rendering, collisions)
-#define Q3LUMP_BRUSHES 8 // brushes (used by effects, collisions)
-#define Q3LUMP_BRUSHSIDES 9 // brush faces (used by brushes)
-#define Q3LUMP_VERTICES 10 // mesh vertices (used by faces)
-#define Q3LUMP_TRIANGLES 11 // mesh triangles (used by faces)
-#define Q3LUMP_EFFECTS 12 // fog (used by faces)
-#define Q3LUMP_FACES 13 // surfaces (used by leafs)
-#define Q3LUMP_LIGHTMAPS 14 // lightmap textures (used by faces)
-#define Q3LUMP_LIGHTGRID 15 // lighting as a voxel grid (used by rendering)
-#define Q3LUMP_PVS 16 // potentially visible set; bit[clusters][clusters] (used by rendering)
-#define Q3HEADER_LUMPS 17
-
-#define Q3PATHLENGTH 64
-
-typedef struct
-{
- int ident;
- int version;
- lump_t lumps[HEADER_LUMPS];
-} q3dheader_t;
-
-typedef struct
-{
- char name[Q3PATHLENGTH];
- int surfaceflags;
- int contents;
+model_brush_lightstyleinfo_t;
+
+typedef struct model_brush_s
+{
+ // true if this model is a HalfLife .bsp file
+ qbool ishlbsp;
+ // true if this model is a BSP2rmqe .bsp file (expanded 32bit bsp format for rmqe)
+ qbool isbsp2rmqe;
+ // true if this model is a BSP2 .bsp file (expanded 32bit bsp format for DarkPlaces, others?)
+ qbool isbsp2;
+ // true if this model is a Quake2 .bsp file (IBSP38)
+ qbool isq2bsp;
+ // true if this model is a Quake3 .bsp file (IBSP46)
+ qbool isq3bsp;
+ // true if this model is a Quake1/Quake2 .bsp file where skymasking capability exists
+ qbool skymasking;
+ // string of entity definitions (.map format)
+ char *entities;
+
+ // if not NULL this is a submodel
+ struct model_s *parentmodel;
+ // (this is the number of the submodel, an index into submodels)
+ int submodel;
+
+ // number of submodels in this map (just used by server to know how many
+ // submodels to load)
+ int numsubmodels;
+ // pointers to each of the submodels
+ struct model_s **submodels;
+
+ int num_planes;
+ mplane_t *data_planes;
+
+ int num_nodes;
+ mnode_t *data_nodes;
+
+ // visible leafs, not counting 0 (solid)
+ int num_visleafs;
+ // number of actual leafs (including 0 which is solid)
+ int num_leafs;
+ mleaf_t *data_leafs;
+
+ int num_leafbrushes;
+ int *data_leafbrushes;
+
+ int num_leafsurfaces;
+ int *data_leafsurfaces;
+
+ int num_portals;
+ mportal_t *data_portals;
+
+ int num_portalpoints;
+ mvertex_t *data_portalpoints;
+
+ int num_brushes;
+ struct q3mbrush_s *data_brushes;
+
+ int num_brushsides;
+ struct q3mbrushside_s *data_brushsides;
+
+ // pvs
+ int num_pvsclusters;
+ int num_pvsclusterbytes;
+ unsigned char *data_pvsclusters;
+ // example
+ //pvschain = model->brush.data_pvsclusters + mycluster * model->brush.num_pvsclusterbytes;
+ //if (pvschain[thatcluster >> 3] & (1 << (thatcluster & 7)))
+
+ // collision geometry for q3 curves
+ int num_collisionvertices;
+ int num_collisiontriangles;
+ float *data_collisionvertex3f;
+ int *data_collisionelement3i;
+
+ // a mesh containing all shadow casting geometry for the whole model (including submodels), portions of this are referenced by each surface's num_firstshadowmeshtriangle
+ struct shadowmesh_s *shadowmesh;
+
+ // a mesh containing all SUPERCONTENTS_SOLID surfaces for this model or submodel, for physics engines to use
+ struct shadowmesh_s *collisionmesh;
+
+ // common functions
+ int (*SuperContentsFromNativeContents)(int nativecontents);
+ int (*NativeContentsFromSuperContents)(int supercontents);
+ unsigned char *(*GetPVS)(struct model_s *model, const vec3_t p);
+ int (*FatPVS)(struct model_s *model, const vec3_t org, vec_t radius, unsigned char *pvsbuffer, int pvsbufferlength, qbool merge);
+ int (*BoxTouchingPVS)(struct model_s *model, const unsigned char *pvs, const vec3_t mins, const vec3_t maxs);
+ int (*BoxTouchingLeafPVS)(struct model_s *model, const unsigned char *pvs, const vec3_t mins, const vec3_t maxs);
+ int (*BoxTouchingVisibleLeafs)(struct model_s *model, const unsigned char *visibleleafs, const vec3_t mins, const vec3_t maxs);
+ int (*FindBoxClusters)(struct model_s *model, const vec3_t mins, const vec3_t maxs, int maxclusters, int *clusterlist);
+ void (*LightPoint)(struct model_s *model, const vec3_t p, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal);
+ void (*FindNonSolidLocation)(struct model_s *model, const vec3_t in, vec3_t out, vec_t radius);
+ mleaf_t *(*PointInLeaf)(struct model_s *model, const vec3_t p);
+ // these are actually only found on brushq1, but NULL is handled gracefully
+ void (*AmbientSoundLevelsForPoint)(struct model_s *model, const vec3_t p, unsigned char *out, int outsize);
+ void (*RoundUpToHullSize)(struct model_s *cmodel, const vec3_t inmins, const vec3_t inmaxs, vec3_t outmins, vec3_t outmaxs);
+ // trace a line of sight through this model (returns false if the line if sight is definitely blocked)
+ qbool (*TraceLineOfSight)(struct model_s *model, const vec3_t start, const vec3_t end, const vec3_t acceptmins, const vec3_t acceptmaxs);
+
+ char skybox[MAX_QPATH];
+
+ struct skinframe_s *solidskyskinframe;
+ struct skinframe_s *alphaskyskinframe;
+
+ qbool supportwateralpha;
+
+ // QuakeWorld
+ int qw_md4sum;
+ int qw_md4sum2;