6 #include "r_textures.h"
11 #define Q3BSPVERSION 46
12 #define Q3BSPVERSION_LIVE 47
13 #define Q3BSPVERSION_IG 48
15 #define Q3LUMP_ENTITIES 0 // entities to spawn (used by server and client)
16 #define Q3LUMP_TEXTURES 1 // textures used (used by faces)
17 #define Q3LUMP_PLANES 2 // planes used (used by bsp nodes)
18 #define Q3LUMP_NODES 3 // bsp nodes (used by bsp nodes, bsp leafs, rendering, collisions)
19 #define Q3LUMP_LEAFS 4 // bsp leafs (used by bsp nodes)
20 #define Q3LUMP_LEAFFACES 5 // array of ints indexing faces (used by leafs)
21 #define Q3LUMP_LEAFBRUSHES 6 // array of ints indexing brushes (used by leafs)
22 #define Q3LUMP_MODELS 7 // models (used by rendering, collisions)
23 #define Q3LUMP_BRUSHES 8 // brushes (used by effects, collisions)
24 #define Q3LUMP_BRUSHSIDES 9 // brush faces (used by brushes)
25 #define Q3LUMP_VERTICES 10 // mesh vertices (used by faces)
26 #define Q3LUMP_TRIANGLES 11 // mesh triangles (used by faces)
27 #define Q3LUMP_EFFECTS 12 // fog (used by faces)
28 #define Q3LUMP_FACES 13 // surfaces (used by leafs)
29 #define Q3LUMP_LIGHTMAPS 14 // lightmap textures (used by faces)
30 #define Q3LUMP_LIGHTGRID 15 // lighting as a voxel grid (used by rendering)
31 #define Q3LUMP_PVS 16 // potentially visible set; bit[clusters][clusters] (used by rendering)
32 #define Q3HEADER_LUMPS 17
33 #define Q3LUMP_ADVERTISEMENTS 17 // quake live stuff written by zeroradiant's q3map2 (ignored by DP)
34 #define Q3HEADER_LUMPS_LIVE 18
35 #define Q3HEADER_LUMPS_MAX 18
37 typedef struct q3dheader_s
41 lump_t lumps[Q3HEADER_LUMPS_MAX];
44 typedef struct q3dtexture_s
46 char name[Q3PATHLENGTH];
52 // note: planes are paired, the pair of planes with i and i ^ 1 are opposites.
53 typedef struct q3dplane_s
60 typedef struct q3dnode_s
69 typedef struct q3dleaf_s
71 int clusterindex; // pvs index
72 int areaindex; // area index
82 typedef struct q3dmodel_s
93 typedef struct q3dbrush_s
101 typedef struct q3dbrushside_s
108 typedef struct q3dbrushside_ig_s
116 typedef struct q3dvertex_s
122 unsigned char color4ub[4];
126 typedef struct q3dmeshvertex_s
128 int offset; // first vertex index of mesh
132 typedef struct q3deffect_s
134 char shadername[Q3PATHLENGTH];
136 int unknown; // I read this is always 5 except in q3dm8 which has one effect with -1
140 #define Q3FACETYPE_FLAT 1 // common
141 #define Q3FACETYPE_PATCH 2 // common
142 #define Q3FACETYPE_MESH 3 // common
143 #define Q3FACETYPE_FLARE 4 // rare (is this ever used?)
145 typedef struct q3dface_s
148 int effectindex; // -1 if none
149 int type; // Q3FACETYPE
154 int lightmapindex; // -1 if none
155 int lightmap_base[2];
156 int lightmap_size[2];
161 // corrupt or don't care
168 // mesh is a collection of triangles on a plane, renderable as a mesh (NOT a polygon)
169 float lightmap_origin[3];
170 float lightmap_vectors[2][3];
178 // patch renders as a bezier mesh, with adjustable tesselation
179 // level (optionally based on LOD using the bbox and polygon
180 // count to choose a tesselation level)
181 // note: multiple patches may have the same bbox to cause them to
182 // be LOD adjusted together as a group
184 float mins[3]; // LOD bbox
185 float maxs[3]; // LOD bbox
187 int patchsize[2]; // dimensions of vertex grid
193 // mesh renders as simply a triangle mesh
203 // flare renders as a simple sprite at origin, no geometry
204 // exists, nor does it have a radius, a cvar controls the radius
205 // and another cvar controls distance fade
206 // (they were not used in Q3 I'm told)
216 typedef struct q3dlightmap_s
218 unsigned char rgb[128*128*3];
222 typedef struct q3dlightgrid_s
224 unsigned char ambientrgb[3];
225 unsigned char diffusergb[3];
226 unsigned char diffusepitch;
227 unsigned char diffuseyaw;
231 typedef struct q3dpvs_s
235 // unsigned char chains[];
236 // containing bits in 0-7 order (not 7-0 order),
237 // pvschains[mycluster * chainlength + (thatcluster >> 3)] & (1 << (thatcluster & 7))
241 // surfaceflags from bsp
242 #define Q3SURFACEFLAG_NODAMAGE 1
243 #define Q3SURFACEFLAG_SLICK 2
244 #define Q3SURFACEFLAG_SKY 4
245 #define Q3SURFACEFLAG_LADDER 8 // has no surfaceparm
246 #define Q3SURFACEFLAG_NOIMPACT 16
247 #define Q3SURFACEFLAG_NOMARKS 32
248 #define Q3SURFACEFLAG_FLESH 64 // has no surfaceparm
249 #define Q3SURFACEFLAG_NODRAW 128
250 #define Q3SURFACEFLAG_HINT 256
251 #define Q3SURFACEFLAG_SKIP 512 // has no surfaceparm
252 #define Q3SURFACEFLAG_NOLIGHTMAP 1024
253 #define Q3SURFACEFLAG_POINTLIGHT 2048
254 #define Q3SURFACEFLAG_METALSTEPS 4096
255 #define Q3SURFACEFLAG_NOSTEPS 8192 // has no surfaceparm
256 #define Q3SURFACEFLAG_NONSOLID 16384
257 #define Q3SURFACEFLAG_LIGHTFILTER 32768
258 #define Q3SURFACEFLAG_ALPHASHADOW 65536
259 #define Q3SURFACEFLAG_NODLIGHT 131072
260 #define Q3SURFACEFLAG_DUST 262144
262 // surfaceparms from shaders
263 #define Q3SURFACEPARM_ALPHASHADOW 1
264 #define Q3SURFACEPARM_AREAPORTAL 2
265 #define Q3SURFACEPARM_CLUSTERPORTAL 4
266 #define Q3SURFACEPARM_DETAIL 8
267 #define Q3SURFACEPARM_DONOTENTER 16
268 #define Q3SURFACEPARM_FOG 32
269 #define Q3SURFACEPARM_LAVA 64
270 #define Q3SURFACEPARM_LIGHTFILTER 128
271 #define Q3SURFACEPARM_METALSTEPS 256
272 #define Q3SURFACEPARM_NODAMAGE 512
273 #define Q3SURFACEPARM_NODLIGHT 1024
274 #define Q3SURFACEPARM_NODRAW 2048
275 #define Q3SURFACEPARM_NODROP 4096
276 #define Q3SURFACEPARM_NOIMPACT 8192
277 #define Q3SURFACEPARM_NOLIGHTMAP 16384
278 #define Q3SURFACEPARM_NOMARKS 32768
279 #define Q3SURFACEPARM_NOMIPMAPS 65536
280 #define Q3SURFACEPARM_NONSOLID 131072
281 #define Q3SURFACEPARM_ORIGIN 262144
282 #define Q3SURFACEPARM_PLAYERCLIP 524288
283 #define Q3SURFACEPARM_SKY 1048576
284 #define Q3SURFACEPARM_SLICK 2097152
285 #define Q3SURFACEPARM_SLIME 4194304
286 #define Q3SURFACEPARM_STRUCTURAL 8388608
287 #define Q3SURFACEPARM_TRANS 16777216
288 #define Q3SURFACEPARM_WATER 33554432
289 #define Q3SURFACEPARM_POINTLIGHT 67108864
290 #define Q3SURFACEPARM_HINT 134217728
291 #define Q3SURFACEPARM_DUST 268435456
292 #define Q3SURFACEPARM_BOTCLIP 536870912
293 #define Q3SURFACEPARM_LIGHTGRID 1073741824
294 #define Q3SURFACEPARM_ANTIPORTAL 2147483648u
296 typedef struct q3mbrush_s
298 struct colbrushf_s *colbrushf;
300 struct q3mbrushside_s *firstbrushside;
301 struct texture_s *texture;
305 typedef struct q3mbrushside_s
307 struct mplane_s *plane;
308 struct texture_s *texture;
312 typedef struct model_brushq3_s
315 q3dmodel_t *data_models;
317 // used only during loading - freed after loading!
319 float *data_vertex3f;
320 float *data_normal3f;
321 float *data_texcoordtexture2f;
322 float *data_texcoordlightmap2f;
325 // freed after loading!
330 q3deffect_t *data_effects;
333 int num_originallightmaps;
334 int num_mergedlightmaps;
335 int num_lightmapmergedwidthpower;
336 int num_lightmapmergedheightpower;
337 int num_lightmapmergedwidthheightdeluxepower;
338 int num_lightmapmerge;
339 rtexture_t **data_lightmaps;
340 rtexture_t **data_deluxemaps;
342 // voxel light data with directional shading - data for cpu sampling of it...
344 q3dlightgrid_t *data_lightgrid;
345 // size of each cell (may vary by map, typically 64 64 128)
346 float num_lightgrid_cellsize[3];
347 // 1.0 / num_lightgrid_cellsize
348 float num_lightgrid_scale[3];
349 // dimensions of the world model in lightgrid cells
350 int num_lightgrid_imins[3];
351 int num_lightgrid_imaxs[3];
352 int num_lightgrid_isize[3];
353 // transform modelspace coordinates to lightgrid index
354 matrix4x4_t num_lightgrid_indexfromworld;
355 // parameters for fragment shader to sample the texture version of it:
356 int lightgridtexturesize[3]; // 3 layers tall (ambient, lightcolor, lightdir)
357 matrix4x4_t lightgridworldtotexturematrix;
358 rtexture_t *lightgridtexture;
360 // true if this q3bsp file has been detected as using deluxemapping
361 // (lightmap texture pairs, every odd one is never directly refernced,
362 // and contains lighting normals, not colors)
364 // true if the detected deluxemaps are the modelspace kind, rather than
365 // the faster tangentspace kind
366 qbool deluxemapping_modelspace;
367 // size of lightmaps (128 by default, but may be another poweroftwo if
368 // external lightmaps are used (q3map2 -lightmapsize)