]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.h
Merge PR 'Make particles solid squares when cl_particles_quake is set to 2'
[xonotic/darkplaces.git] / model_brush.h
index 5646631977195e0c95c403f568bfb39c4c5c7b25..bec06c30e43e73e6bac9aba7dca49ee00aa0746c 100644 (file)
@@ -21,6 +21,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #ifndef MODEL_BRUSH_H
 #define MODEL_BRUSH_H
 
+#include "qtypes.h"
+#include "qdefs.h"
+#include "bspfile.h"
+
 /*
 ==============================================================================
 
@@ -48,11 +52,18 @@ mvertex_t;
 // plane_t structure
 typedef struct mplane_s
 {
-       vec3_t normal;
-       float dist;
+       union
+       {
+               struct
+               {
+                       vec3_t normal;
+                       vec_t dist;
+               };
+               vec4_t normal_and_dist;
+       };
        // for texture axis selection and fast side tests
-       int type;
-       int signbits;
+       int type; // set by PlaneClassify()
+       int signbits; // set by PlaneClassify()
 }
 mplane_t;
 
@@ -62,52 +73,76 @@ mplane_t;
 
 //#define SURF_PLANEBACK 2
 
+// indicates that all triangles of the surface should be added to the BIH collision system
+#define MATERIALFLAG_MESHCOLLISIONS 0x00000001
 // use alpha blend on this material
-#define MATERIALFLAG_ALPHA 2
+#define MATERIALFLAG_ALPHA 0x00000002
 // use additive blend on this material
-#define MATERIALFLAG_ADD 4
+#define MATERIALFLAG_ADD 0x00000004
 // turn off depth test on this material
-#define MATERIALFLAG_NODEPTHTEST 8
+#define MATERIALFLAG_NODEPTHTEST 0x00000008
 // multiply alpha by r_wateralpha cvar
-#define MATERIALFLAG_WATERALPHA 16
+#define MATERIALFLAG_WATERALPHA 0x00000010
 // draw with no lighting
-#define MATERIALFLAG_FULLBRIGHT 32
-// drawn as a normal lightmapped wall
-#define MATERIALFLAG_WALL 64
-// swirling water effect
-#define MATERIALFLAG_WATER 128
-// this surface shows the sky
+#define MATERIALFLAG_FULLBRIGHT 0x00000020
+// drawn as a normal surface (alternative to SKY)
+#define MATERIALFLAG_WALL 0x00000040
+// this surface shows the sky in its place, alternative to WALL
 // skipped if transparent
-#define MATERIALFLAG_SKY 256
+#define MATERIALFLAG_SKY 0x00000080
+// swirling water effect (used with MATERIALFLAG_WALL)
+#define MATERIALFLAG_WATERSCROLL 0x00000100
 // skips drawing the surface
-#define MATERIALFLAG_NODRAW 512
+#define MATERIALFLAG_NODRAW 0x00000200
 // probably used only on q1bsp water
-#define MATERIALFLAG_LIGHTBOTHSIDES 1024
+#define MATERIALFLAG_LIGHTBOTHSIDES 0x00000400
 // use alpha test on this material
-#define MATERIALFLAG_ALPHATEST 2048
+#define MATERIALFLAG_ALPHATEST 0x00000800
 // treat this material as a blended transparency (as opposed to an alpha test
 // transparency), this causes special fog behavior, and disables glDepthMask
-#define MATERIALFLAG_BLENDED 4096
+#define MATERIALFLAG_BLENDED 0x00001000
 // render using a custom blendfunc
-#define MATERIALFLAG_CUSTOMBLEND 8192
+#define MATERIALFLAG_CUSTOMBLEND 0x00002000
 // do not cast shadows from this material
-#define MATERIALFLAG_NOSHADOW 16384
+#define MATERIALFLAG_NOSHADOW 0x00004000
 // render using vertex alpha (q3bsp) as texture blend parameter between foreground (normal) skinframe and background skinframe
-#define MATERIALFLAG_VERTEXTEXTUREBLEND 32768
+#define MATERIALFLAG_VERTEXTEXTUREBLEND 0x00008000
 // disables GL_CULL_FACE on this texture (making it double sided)
-#define MATERIALFLAG_NOCULLFACE 65536
+#define MATERIALFLAG_NOCULLFACE 0x00010000
 // render with a very short depth range (like 10% of normal), this causes entities to appear infront of most of the scene
-#define MATERIALFLAG_SHORTDEPTHRANGE 131072
-// render refraction and reflection (note: this is always opaque, the shader does the alpha effect)
-#define MATERIALFLAG_WATERSHADER 262144
-// render reflection only
-#define MATERIALFLAG_REFLECTION 524288
+#define MATERIALFLAG_SHORTDEPTHRANGE 0x00020000
+// render water, comprising refraction and reflection (note: this is always opaque, the shader does the alpha effect)
+#define MATERIALFLAG_WATERSHADER 0x00040000
+// render refraction (note: this is just a way to distort the background, otherwise useless)
+#define MATERIALFLAG_REFRACTION 0x00080000
+// render reflection
+#define MATERIALFLAG_REFLECTION 0x00100000
+// use model lighting on this material (q1bsp lightmap sampling or q3bsp lightgrid, implies FULLBRIGHT is false)
+#define MATERIALFLAG_MODELLIGHT 0x00200000
+// causes RSurf_GetCurrentTexture to leave alone certain fields
+#define MATERIALFLAG_CUSTOMSURFACE 0x00800000
+// causes MATERIALFLAG_BLENDED to render a depth pass before rendering, hiding backfaces and other hidden geometry
+#define MATERIALFLAG_TRANSDEPTH 0x01000000
+// like refraction, but doesn't distort etc.
+#define MATERIALFLAG_CAMERA 0x02000000
+// disable rtlight on surface - does not disable other types of lighting (LIGHTMAP, MODELLIGHT)
+#define MATERIALFLAG_NORTLIGHT 0x04000000
+// alphagen vertex - should always be used with MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_NOSHADOW (or MATERIALFLAG_ADD instead of MATERIALFLAG_ALPHA)
+#define MATERIALFLAG_ALPHAGEN_VERTEX 0x08000000
+// use occlusion buffer for corona
+#define MATERIALFLAG_OCCLUDE 0x10000000
+// use vertex color instead of lighting (e.g. particles and other glowy stuff), use with MATERIALFLAG_FULLBRIGHT
+#define MATERIALFLAG_VERTEXCOLOR 0x20000000
+// sample the q3bsp lightgrid in the shader rather than relying on MATERIALFLAG_MODELLIGHT
+#define MATERIALFLAG_LIGHTGRID 0x40000000
 // combined mask of all attributes that require depth sorted rendering
 #define MATERIALFLAGMASK_DEPTHSORTED (MATERIALFLAG_BLENDED | MATERIALFLAG_NODEPTHTEST)
+// combined mask of all attributes that cause some sort of transparency
+#define MATERIALFLAGMASK_TRANSLUCENT (MATERIALFLAG_WATERALPHA | MATERIALFLAG_SKY | MATERIALFLAG_NODRAW | MATERIALFLAG_ALPHATEST | MATERIALFLAG_BLENDED | MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION)
 
 typedef struct medge_s
 {
-       unsigned short v[2];
+       unsigned int v[2];
 }
 medge_t;
 
@@ -131,8 +166,8 @@ typedef struct mnode_s
        struct mnode_s *children[2];
 
        // q1bsp specific
-       unsigned short firstsurface;
-       unsigned short numsurfaces;
+       unsigned int firstsurface;
+       unsigned int numsurfaces;
 }
 mnode_t;
 
@@ -163,9 +198,15 @@ typedef struct mleaf_s
 }
 mleaf_t;
 
+typedef struct mclipnode_s
+{
+       int                     planenum;
+       int                     children[2];    // negative numbers are contents
+} mclipnode_t;
+
 typedef struct hull_s
 {
-       dclipnode_t *clipnodes;
+       mclipnode_t *clipnodes;
        mplane_t *planes;
        int firstclipnode;
        int lastclipnode;
@@ -184,6 +225,7 @@ typedef struct mportal_s
        mvertex_t *points;
        vec3_t mins, maxs; // culling
        mplane_t plane;
+       double tracetime; // refreshed to realtime by traceline tests
 }
 mportal_t;
 
@@ -197,480 +239,127 @@ typedef struct svbspmesh_s
 }
 svbspmesh_t;
 
-// 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 q2dheader_s
-{
-       int                     ident;
-       int                     version;
-       lump_t          lumps[Q2HEADER_LUMPS];
-} q2dheader_t;
-
-typedef struct q2dmodel_s
-{
-       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 q2dnode_s
-{
-       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 q2texinfo_s
-{
-       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 q2dleaf_s
-{
-       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 q2dbrushside_s
+typedef struct model_brush_lightstyleinfo_s
 {
-       unsigned short  planenum;               // facing out of the leaf
-       short   texinfo;
-} q2dbrushside_t;
-
-typedef struct q2dbrush_s
-{
-       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 q2dvis_s
-{
-       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 q2dareaportal_s
-{
-       int             portalnum;
-       int             otherarea;
-} q2dareaportal_t;
-
-typedef struct q2darea_s
-{
-       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
-
-typedef struct q3dheader_s
-{
-       int                     ident;
-       int                     version;
-       lump_t          lumps[Q3HEADER_LUMPS];
-} q3dheader_t;
-
-typedef struct q3dtexture_s
-{
-       char name[Q3PATHLENGTH];
-       int surfaceflags;
-       int contents;
+       int style;
+       int value;
+       int numsurfaces;
+       int *surfacelist;
 }
-q3dtexture_t;
-
-// note: planes are paired, the pair of planes with i and i ^ 1 are opposites.
-typedef struct q3dplane_s
-{
-       float normal[3];
-       float dist;
+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;
 }
-q3dplane_t;
+model_brush_t;
 
-typedef struct q3dnode_s
-{
-       int planeindex;
-       int childrenindex[2];
-       int mins[3];
-       int maxs[3];
-}
-q3dnode_t;
-
-typedef struct q3dleaf_s
-{
-       int clusterindex; // pvs index
-       int areaindex; // area index
-       int mins[3];
-       int maxs[3];
-       int firstleafface;
-       int numleaffaces;
-       int firstleafbrush;
-       int numleafbrushes;
-}
-q3dleaf_t;
-
-typedef struct q3dmodel_s
-{
-       float mins[3];
-       float maxs[3];
-       int firstface;
-       int numfaces;
-       int firstbrush;
-       int numbrushes;
-}
-q3dmodel_t;
-
-typedef struct q3dbrush_s
-{
-       int firstbrushside;
-       int numbrushsides;
-       int textureindex;
-}
-q3dbrush_t;
-
-typedef struct q3dbrushside_s
-{
-       int planeindex;
-       int textureindex;
-}
-q3dbrushside_t;
-
-typedef struct q3dvertex_s
-{
-       float origin3f[3];
-       float texcoord2f[2];
-       float lightmap2f[2];
-       float normal3f[3];
-       unsigned char color4ub[4];
-}
-q3dvertex_t;
-
-typedef struct q3dmeshvertex_s
-{
-       int offset; // first vertex index of mesh
-}
-q3dmeshvertex_t;
-
-typedef struct q3deffect_s
-{
-       char shadername[Q3PATHLENGTH];
-       int brushindex;
-       int unknown; // I read this is always 5 except in q3dm8 which has one effect with -1
-}
-q3deffect_t;
-
-#define Q3FACETYPE_POLYGON 1 // common
-#define Q3FACETYPE_PATCH 2 // common
-#define Q3FACETYPE_MESH 3 // common
-#define Q3FACETYPE_FLARE 4 // rare (is this ever used?)
-
-typedef struct q3dface_s
-{
-       int textureindex;
-       int effectindex; // -1 if none
-       int type; // Q3FACETYPE
-       int firstvertex;
-       int numvertices;
-       int firstelement;
-       int numelements;
-       int lightmapindex; // -1 if none
-       int lightmap_base[2];
-       int lightmap_size[2];
-       union
-       {
-               struct
-               {
-                       // corrupt or don't care
-                       int blah[14];
-               }
-               unknown;
-               struct
-               {
-                       // Q3FACETYPE_POLYGON
-                       // polygon is simply a convex polygon, renderable as a mesh
-                       float lightmap_origin[3];
-                       float lightmap_vectors[2][3];
-                       float normal[3];
-                       int unused1[2];
-               }
-               polygon;
-               struct
-               {
-                       // Q3FACETYPE_PATCH
-                       // patch renders as a bezier mesh, with adjustable tesselation
-                       // level (optionally based on LOD using the bbox and polygon
-                       // count to choose a tesselation level)
-                       // note: multiple patches may have the same bbox to cause them to
-                       // be LOD adjusted together as a group
-                       int unused1[3];
-                       float mins[3]; // LOD bbox
-                       float maxs[3]; // LOD bbox
-                       int unused2[3];
-                       int patchsize[2]; // dimensions of vertex grid
-               }
-               patch;
-               struct
-               {
-                       // Q3FACETYPE_MESH
-                       // mesh renders as simply a triangle mesh
-                       int unused1[3];
-                       float mins[3];
-                       float maxs[3];
-                       int unused2[5];
-               }
-               mesh;
-               struct
-               {
-                       // Q3FACETYPE_FLARE
-                       // flare renders as a simple sprite at origin, no geometry
-                       // exists, nor does it have a radius, a cvar controls the radius
-                       // and another cvar controls distance fade
-                       // (they were not used in Q3 I'm told)
-                       float origin[3];
-                       int unused1[11];
-               }
-               flare;
-       }
-       specific;
-}
-q3dface_t;
-
-typedef struct q3dlightmap_s
-{
-       unsigned char rgb[128*128*3];
-}
-q3dlightmap_t;
-
-typedef struct q3dlightgrid_s
-{
-       unsigned char ambientrgb[3];
-       unsigned char diffusergb[3];
-       unsigned char diffusepitch;
-       unsigned char diffuseyaw;
-}
-q3dlightgrid_t;
-
-typedef struct q3dpvs_s
-{
-       int numclusters;
-       int chainlength;
-       // unsigned char chains[];
-       // containing bits in 0-7 order (not 7-0 order),
-       // pvschains[mycluster * chainlength + (thatcluster >> 3)] & (1 << (thatcluster & 7))
-}
-q3dpvs_t;
-
-// surfaceflags from bsp
-#define Q3SURFACEFLAG_NODAMAGE 1
-#define Q3SURFACEFLAG_SLICK 2
-#define Q3SURFACEFLAG_SKY 4
-#define Q3SURFACEFLAG_LADDER 8
-#define Q3SURFACEFLAG_NOIMPACT 16
-#define Q3SURFACEFLAG_NOMARKS 32
-#define Q3SURFACEFLAG_FLESH 64
-#define Q3SURFACEFLAG_NODRAW 128
-#define Q3SURFACEFLAG_HINT 256
-#define Q3SURFACEFLAG_SKIP 512
-#define Q3SURFACEFLAG_NOLIGHTMAP 1024
-#define Q3SURFACEFLAG_POINTLIGHT 2048
-#define Q3SURFACEFLAG_METALSTEPS 4096
-#define Q3SURFACEFLAG_NOSTEPS 8192
-#define Q3SURFACEFLAG_NONSOLID 16384
-#define Q3SURFACEFLAG_LIGHTFILTER 32768
-#define Q3SURFACEFLAG_ALPHASHADOW 65536
-#define Q3SURFACEFLAG_NODLIGHT 131072
-#define Q3SURFACEFLAG_DUST 262144
-
-// surfaceparms from shaders
-#define Q3SURFACEPARM_ALPHASHADOW 1
-#define Q3SURFACEPARM_AREAPORTAL 2
-#define Q3SURFACEPARM_CLUSTERPORTAL 4
-#define Q3SURFACEPARM_DETAIL 8
-#define Q3SURFACEPARM_DONOTENTER 16
-#define Q3SURFACEPARM_FOG 32
-#define Q3SURFACEPARM_LAVA 64
-#define Q3SURFACEPARM_LIGHTFILTER 128
-#define Q3SURFACEPARM_METALSTEPS 256
-#define Q3SURFACEPARM_NODAMAGE 512
-#define Q3SURFACEPARM_NODLIGHT 1024
-#define Q3SURFACEPARM_NODRAW 2048
-#define Q3SURFACEPARM_NODROP 4096
-#define Q3SURFACEPARM_NOIMPACT 8192
-#define Q3SURFACEPARM_NOLIGHTMAP 16384
-#define Q3SURFACEPARM_NOMARKS 32768
-#define Q3SURFACEPARM_NOMIPMAPS 65536
-#define Q3SURFACEPARM_NONSOLID 131072
-#define Q3SURFACEPARM_ORIGIN 262144
-#define Q3SURFACEPARM_PLAYERCLIP 524288
-#define Q3SURFACEPARM_SKY 1048576
-#define Q3SURFACEPARM_SLICK 2197152
-#define Q3SURFACEPARM_SLIME 4194304
-#define Q3SURFACEPARM_STRUCTURAL 8388608
-#define Q3SURFACEPARM_TRANS 16777216
-#define Q3SURFACEPARM_WATER 33554432
-#define Q3SURFACEPARM_POINTLIGHT 67108864
-#define Q3SURFACEPARM_HINT 134217728
-#define Q3SURFACEPARM_DUST 268435456
-#define Q3SURFACEPARM_BOTCLIP 536870912
-#define Q3SURFACEPARM_LIGHTGRID 1073741824
-#define Q3SURFACEPARM_ANTIPORTAL 2147483648u
-
-typedef struct q3mbrush_s
-{
-       struct colbrushf_s *colbrushf;
-       int numbrushsides;
-       struct q3mbrushside_s *firstbrushside;
-       struct texture_s *texture;
-}
-q3mbrush_t;
-
-typedef struct q3mbrushside_s
-{
-       struct mplane_s *plane;
-       struct texture_s *texture;
-}
-q3mbrushside_t;
-
-#define CHECKPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] & (1 << ((b) & 7))) : false)
-#define SETPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] |= (1 << ((b) & 7))) : false)
-#define CLEARPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] &= ~(1 << ((b) & 7))) : false)
+// the first cast is to shut up a stupid warning by clang, the second cast is to make both sides have the same type
+#define CHECKPVSBIT(pvs,b) ((b) >= 0 ? (unsigned char) ((pvs)[(b) >> 3] & (1 << ((b) & 7))) : (unsigned char) false)
+#define SETPVSBIT(pvs,b) (void) ((b) >= 0 ? (unsigned char) ((pvs)[(b) >> 3] |= (1 << ((b) & 7))) : (unsigned char) false)
+#define CLEARPVSBIT(pvs,b) (void) ((b) >= 0 ? (unsigned char) ((pvs)[(b) >> 3] &= ~(1 << ((b) & 7))) : (unsigned char) false)
 
 #endif
-