+typedef struct model_brush_s
+{
+ // true if this model is a HalfLife .bsp file
+ qboolean ishlbsp;
+ // string of entity definitions (.map format)
+ char *entities;
+
+ // if non-zero this is a submodel
+ // (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 if .isworldmodel is true
+ 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_textures;
+ texture_t *data_textures;
+
+ int num_surfaces;
+ msurface_t *data_surfaces;
+ msurface_lightmapinfo_t *data_surfaces_lightmapinfo;
+
+ int num_brushes;
+ q3mbrush_t *data_brushes;
+
+ int num_brushsides;
+ q3mbrushside_t *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)))
+
+ // a mesh containing all shadow casting geometry for the whole model (including submodels), portions of this are referenced by each surface's num_firstshadowmeshtriangle
+ shadowmesh_t *shadowmesh;
+
+ // common functions
+ int (*SuperContentsFromNativeContents)(struct model_s *model, int nativecontents);
+ int (*NativeContentsFromSuperContents)(struct model_s *model, int supercontents);
+ qbyte *(*GetPVS)(struct model_s *model, const vec3_t p);
+ int (*FatPVS)(struct model_s *model, const vec3_t org, vec_t radius, qbyte *pvsbuffer, int pvsbufferlength);
+ int (*BoxTouchingPVS)(struct model_s *model, const qbyte *pvs, const vec3_t mins, const vec3_t maxs);
+ int (*BoxTouchingLeafPVS)(struct model_s *model, const qbyte *pvs, const vec3_t mins, const vec3_t maxs);
+ int (*BoxTouchingVisibleLeafs)(struct model_s *model, const qbyte *visibleleafs, const vec3_t mins, const vec3_t maxs);
+ 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 float *p);
+ // these are actually only found on brushq1, but NULL is handled gracefully
+ void (*AmbientSoundLevelsForPoint)(struct model_s *model, const vec3_t p, qbyte *out, int outsize);
+ void (*RoundUpToHullSize)(struct model_s *cmodel, const vec3_t inmins, const vec3_t inmaxs, vec3_t outmins, vec3_t outmaxs);
+
+ char skybox[64];
+
+ rtexture_t *solidskytexture;
+ rtexture_t *alphaskytexture;
+}
+model_brush_t;