changed brushq3 submodel firstsurface and firstbrush from pointers to integers
[xonotic/darkplaces.git] / model_brush.h
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19 */
20
21 #ifndef MODEL_BRUSH_H
22 #define MODEL_BRUSH_H
23
24 /*
25 ==============================================================================
26
27 BRUSH MODELS
28
29 ==============================================================================
30 */
31
32 #define Q3PATHLENGTH 64
33
34
35 //
36 // in memory representation
37 //
38 typedef struct
39 {
40         vec3_t position;
41 }
42 mvertex_t;
43
44 #define SIDE_FRONT 0
45 #define SIDE_BACK 1
46 #define SIDE_ON 2
47
48
49 // plane_t structure
50 typedef struct mplane_s
51 {
52         vec3_t normal;
53         float dist;
54         // for texture axis selection and fast side tests
55         int type;
56         int signbits;
57 }
58 mplane_t;
59
60 #define SHADERSTAGE_SKY 0
61 #define SHADERSTAGE_NORMAL 1
62 #define SHADERSTAGE_COUNT 2
63
64 #define SURF_PLANEBACK 2
65 #define SURF_DRAWSKY 4
66 #define SURF_DRAWTURB 0x10
67 #define SURF_LIGHTMAP 0x20
68 #define SURF_DRAWNOALPHA 0x100
69 #define SURF_DRAWFULLBRIGHT 0x200
70 #define SURF_LIGHTBOTHSIDES 0x400
71 #define SURF_WATERALPHA 0x4000 // this polygon's alpha is modulated by r_wateralpha
72 #define SURF_SOLIDCLIP 0x8000 // this polygon blocks movement
73
74 #define SURFRENDER_OPAQUE 0
75 #define SURFRENDER_ALPHA 1
76 #define SURFRENDER_ADD 2
77
78 struct entity_render_s;
79 struct texture_s;
80 struct msurface_s;
81
82 typedef struct texture_s
83 {
84         // q1bsp
85         // name
86         //char name[16];
87         // size
88         unsigned int width, height;
89         // SURF_ flags
90         unsigned int flags;
91
92         // type of rendering (SURFRENDER_ value)
93         int rendertype;
94
95         // loaded the same as model skins
96         skinframe_t skin;
97
98         // total frames in sequence and alternate sequence
99         int anim_total[2];
100         // direct pointers to each of the frames in the sequences
101         // (indexed as [alternate][frame])
102         struct texture_s *anim_frames[2][10];
103         // set if animated or there is an alternate frame set
104         // (this is an optimization in the renderer)
105         int animated;
106         // the current texture frame in animation
107         struct texture_s *currentframe;
108         // current alpha of the texture
109         float currentalpha;
110
111         // q3bsp
112         char name[Q3PATHLENGTH];
113         char firstpasstexturename[Q3PATHLENGTH]; // used only during loading
114         int surfaceflags;
115         int supercontents;
116         int surfaceparms;
117         int textureflags;
118
119         //skinframe_t skin;
120 }
121 texture_t;
122
123 typedef struct
124 {
125         unsigned short v[2];
126 }
127 medge_t;
128
129 typedef struct
130 {
131         float vecs[2][4];
132         texture_t *texture;
133         int flags;
134 }
135 mtexinfo_t;
136
137 struct q3meffect_s;
138 typedef struct msurface_s
139 {
140         // bounding box for onscreen checks
141         vec3_t mins;
142         vec3_t maxs;
143         // the texture to use on the surface
144         texture_t *texture;
145         // the lightmap texture fragment to use on the rendering mesh
146         rtexture_t *lightmaptexture;
147         // mesh for rendering
148         surfmesh_t mesh;
149         // index into model->brush.shadowmesh
150         int num_firstshadowmeshtriangle;
151
152         // the node plane this is on, backwards if SURF_PLANEBACK flag set
153         mplane_t *plane; // q1bsp
154         // SURF_ flags
155         int flags; // q1bsp
156         // texture mapping properties used by this surface
157         mtexinfo_t *texinfo; // q1bsp
158         // if lightmap settings changed, this forces update
159         int cached_dlight; // q1bsp
160         // index into d_lightstylevalue array, 255 means not used (black)
161         qbyte styles[MAXLIGHTMAPS]; // q1bsp
162         // RGB lighting data [numstyles][height][width][3]
163         qbyte *samples; // q1bsp
164         // stain to apply on lightmap (soot/dirt/blood/whatever)
165         qbyte *stainsamples; // q1bsp
166         // the stride when building lightmaps to comply with fragment update
167         int lightmaptexturestride; // q1bsp
168         int texturemins[2]; // q1bsp
169         int extents[2]; // q1bsp
170         // if this == r_framecount there are dynamic lights on the surface
171         int dlightframe; // q1bsp
172         // which dynamic lights are touching this surface
173         // (only access this if dlightframe is current)
174         int dlightbits[8]; // q1bsp
175
176         struct q3meffect_s *effect; // q3bsp
177         // FIXME: collisionmarkframe should be kept in a separate array
178         int collisionmarkframe; // q3bsp // don't collide twice in one trace
179 }
180 msurface_t;
181
182 typedef struct mnode_s
183 {
184         //this part shared between node and leaf
185         mplane_t *plane; // != NULL
186         struct mnode_s *parent;
187         struct mportal_s *portals;
188         // for bounding box culling
189         vec3_t mins;
190         vec3_t maxs;
191
192         // this part unique to node
193         struct mnode_s *children[2];
194
195         // q1bsp specific
196         unsigned short firstsurface;
197         unsigned short numsurfaces;
198 }
199 mnode_t;
200
201 typedef struct mleaf_s
202 {
203         //this part shared between node and leaf
204         mplane_t *plane; // == NULL
205         struct mnode_s *parent;
206         struct mportal_s *portals;
207         // for bounding box culling
208         vec3_t mins;
209         vec3_t maxs;
210
211         // this part unique to leaf
212         // common
213         int clusterindex; // -1 is not in pvs, >= 0 is pvs bit number
214         int areaindex; // q3bsp
215         int numleafsurfaces;
216         int *firstleafsurface;
217         int numleafbrushes; // q3bsp
218         int *firstleafbrush; // q3bsp
219         qbyte ambient_sound_level[NUM_AMBIENTS]; // q1bsp
220         int contents; // q1bsp: // TODO: remove (only used temporarily during loading when making collision hull 0)
221         int portalmarkid; // q1bsp // used by see-polygon-through-portals visibility checker
222 }
223 mleaf_t;
224
225 typedef struct
226 {
227         dclipnode_t *clipnodes;
228         mplane_t *planes;
229         int firstclipnode;
230         int lastclipnode;
231         vec3_t clip_mins;
232         vec3_t clip_maxs;
233         vec3_t clip_size;
234 }
235 hull_t;
236
237 typedef struct mportal_s
238 {
239         struct mportal_s *next; // the next portal on this leaf
240         mleaf_t *here; // the leaf this portal is on
241         mleaf_t *past; // the leaf through this portal (infront)
242         int numpoints;
243         mvertex_t *points;
244         vec3_t mins, maxs; // culling
245         mplane_t plane;
246 }
247 mportal_t;
248
249 typedef struct svbspmesh_s
250 {
251         struct svbspmesh_s *next;
252         int numverts, maxverts;
253         int numtriangles, maxtriangles;
254         float *verts;
255         int *elements;
256 }
257 svbspmesh_t;
258
259 typedef struct mlight_s
260 {
261         // location of light
262         vec3_t origin;
263         // distance attenuation scale (smaller is a larger light)
264         float falloff;
265         // color and brightness combined
266         vec3_t light;
267         // brightness bias, used for limiting radius without a hard edge
268         float subtract;
269         // spotlight direction
270         vec3_t spotdir;
271         // cosine of spotlight cone angle (or 0 if not a spotlight)
272         float spotcone;
273         // distance bias (larger value is softer and darker)
274         float distbias;
275         // light style controlling this light
276         int style;
277         // maximum extent of the light for shading purposes
278         float lightradius;
279         // maximum extent of the light for culling purposes
280         float cullradius;
281         float cullradius2;
282         /*
283         // surfaces this shines on
284         int numsurfaces;
285         msurface_t **surfaces;
286         // lit area
287         vec3_t mins, maxs;
288         // precomputed shadow volume meshs
289         //svbspmesh_t *shadowvolume;
290         //vec3_t shadowvolumemins, shadowvolumemaxs;
291         shadowmesh_t *shadowvolume;
292         */
293 }
294 mlight_t;
295
296 extern rtexture_t *r_notexture;
297 extern texture_t r_notexture_mip;
298
299 struct model_s;
300 void Mod_Q1BSP_Load(struct model_s *mod, void *buffer);
301 void Mod_IBSP_Load(struct model_s *mod, void *buffer);
302 void Mod_MAP_Load(struct model_s *mod, void *buffer);
303 void Mod_BrushInit(void);
304
305 // Q2 bsp stuff
306
307 #define Q2BSPVERSION    38
308
309 // leaffaces, leafbrushes, planes, and verts are still bounded by
310 // 16 bit short limits
311
312 //=============================================================================
313
314 #define Q2LUMP_ENTITIES         0
315 #define Q2LUMP_PLANES                   1
316 #define Q2LUMP_VERTEXES         2
317 #define Q2LUMP_VISIBILITY               3
318 #define Q2LUMP_NODES                    4
319 #define Q2LUMP_TEXINFO          5
320 #define Q2LUMP_FACES                    6
321 #define Q2LUMP_LIGHTING         7
322 #define Q2LUMP_LEAFS                    8
323 #define Q2LUMP_LEAFFACES                9
324 #define Q2LUMP_LEAFBRUSHES      10
325 #define Q2LUMP_EDGES                    11
326 #define Q2LUMP_SURFEDGES                12
327 #define Q2LUMP_MODELS                   13
328 #define Q2LUMP_BRUSHES          14
329 #define Q2LUMP_BRUSHSIDES               15
330 #define Q2LUMP_POP                      16
331 #define Q2LUMP_AREAS                    17
332 #define Q2LUMP_AREAPORTALS      18
333 #define Q2HEADER_LUMPS          19
334
335 typedef struct
336 {
337         int                     ident;
338         int                     version;
339         lump_t          lumps[HEADER_LUMPS];
340 } q2dheader_t;
341
342 typedef struct
343 {
344         float           mins[3], maxs[3];
345         float           origin[3];              // for sounds or lights
346         int                     headnode;
347         int                     firstface, numfaces;    // submodels just draw faces
348                                                                                 // without walking the bsp tree
349 } q2dmodel_t;
350
351 // planes (x&~1) and (x&~1)+1 are always opposites
352
353 // contents flags are seperate bits
354 // a given brush can contribute multiple content bits
355 // multiple brushes can be in a single leaf
356
357 // these definitions also need to be in q_shared.h!
358
359 // lower bits are stronger, and will eat weaker brushes completely
360 #define Q2CONTENTS_SOLID                        1               // an eye is never valid in a solid
361 #define Q2CONTENTS_WINDOW                       2               // translucent, but not watery
362 #define Q2CONTENTS_AUX                  4
363 #define Q2CONTENTS_LAVA                 8
364 #define Q2CONTENTS_SLIME                        16
365 #define Q2CONTENTS_WATER                        32
366 #define Q2CONTENTS_MIST                 64
367 #define Q2LAST_VISIBLE_CONTENTS 64
368
369 // remaining contents are non-visible, and don't eat brushes
370
371 #define Q2CONTENTS_AREAPORTAL           0x8000
372
373 #define Q2CONTENTS_PLAYERCLIP           0x10000
374 #define Q2CONTENTS_MONSTERCLIP  0x20000
375
376 // currents can be added to any other contents, and may be mixed
377 #define Q2CONTENTS_CURRENT_0            0x40000
378 #define Q2CONTENTS_CURRENT_90           0x80000
379 #define Q2CONTENTS_CURRENT_180  0x100000
380 #define Q2CONTENTS_CURRENT_270  0x200000
381 #define Q2CONTENTS_CURRENT_UP           0x400000
382 #define Q2CONTENTS_CURRENT_DOWN 0x800000
383
384 #define Q2CONTENTS_ORIGIN                       0x1000000       // removed before bsping an entity
385
386 #define Q2CONTENTS_MONSTER              0x2000000       // should never be on a brush, only in game
387 #define Q2CONTENTS_DEADMONSTER  0x4000000
388 #define Q2CONTENTS_DETAIL                       0x8000000       // brushes to be added after vis leafs
389 #define Q2CONTENTS_TRANSLUCENT  0x10000000      // auto set if any surface has trans
390 #define Q2CONTENTS_LADDER                       0x20000000
391
392
393
394 #define Q2SURF_LIGHT            0x1             // value will hold the light strength
395
396 #define Q2SURF_SLICK            0x2             // effects game physics
397
398 #define Q2SURF_SKY              0x4             // don't draw, but add to skybox
399 #define Q2SURF_WARP             0x8             // turbulent water warp
400 #define Q2SURF_TRANS33  0x10
401 #define Q2SURF_TRANS66  0x20
402 #define Q2SURF_FLOWING  0x40    // scroll towards angle
403 #define Q2SURF_NODRAW           0x80    // don't bother referencing the texture
404
405
406
407
408 typedef struct
409 {
410         int                     planenum;
411         int                     children[2];    // negative numbers are -(leafs+1), not nodes
412         short           mins[3];                // for frustom culling
413         short           maxs[3];
414         unsigned short  firstface;
415         unsigned short  numfaces;       // counting both sides
416 } q2dnode_t;
417
418
419 typedef struct
420 {
421         float           vecs[2][4];             // [s/t][xyz offset]
422         int                     flags;                  // miptex flags + overrides
423         int                     value;                  // light emission, etc
424         char            texture[32];    // texture name (textures/*.wal)
425         int                     nexttexinfo;    // for animations, -1 = end of chain
426 } q2texinfo_t;
427
428 typedef struct
429 {
430         int                             contents;                       // OR of all brushes (not needed?)
431
432         short                   cluster;
433         short                   area;
434
435         short                   mins[3];                        // for frustum culling
436         short                   maxs[3];
437
438         unsigned short  firstleafface;
439         unsigned short  numleaffaces;
440
441         unsigned short  firstleafbrush;
442         unsigned short  numleafbrushes;
443 } q2dleaf_t;
444
445 typedef struct
446 {
447         unsigned short  planenum;               // facing out of the leaf
448         short   texinfo;
449 } q2dbrushside_t;
450
451 typedef struct
452 {
453         int                     firstside;
454         int                     numsides;
455         int                     contents;
456 } q2dbrush_t;
457
458
459 // the visibility lump consists of a header with a count, then
460 // byte offsets for the PVS and PHS of each cluster, then the raw
461 // compressed bit vectors
462 #define Q2DVIS_PVS      0
463 #define Q2DVIS_PHS      1
464 typedef struct
465 {
466         int                     numclusters;
467         int                     bitofs[8][2];   // bitofs[numclusters][2]
468 } q2dvis_t;
469
470 // each area has a list of portals that lead into other areas
471 // when portals are closed, other areas may not be visible or
472 // hearable even if the vis info says that it should be
473 typedef struct
474 {
475         int             portalnum;
476         int             otherarea;
477 } q2dareaportal_t;
478
479 typedef struct
480 {
481         int             numareaportals;
482         int             firstareaportal;
483 } q2darea_t;
484
485
486 //Q3 bsp stuff
487
488 #define Q3BSPVERSION    46
489
490 #define Q3LUMP_ENTITIES         0 // entities to spawn (used by server and client)
491 #define Q3LUMP_TEXTURES         1 // textures used (used by faces)
492 #define Q3LUMP_PLANES           2 // planes used (used by bsp nodes)
493 #define Q3LUMP_NODES            3 // bsp nodes (used by bsp nodes, bsp leafs, rendering, collisions)
494 #define Q3LUMP_LEAFS            4 // bsp leafs (used by bsp nodes)
495 #define Q3LUMP_LEAFFACES        5 // array of ints indexing faces (used by leafs)
496 #define Q3LUMP_LEAFBRUSHES      6 // array of ints indexing brushes (used by leafs)
497 #define Q3LUMP_MODELS           7 // models (used by rendering, collisions)
498 #define Q3LUMP_BRUSHES          8 // brushes (used by effects, collisions)
499 #define Q3LUMP_BRUSHSIDES       9 // brush faces (used by brushes)
500 #define Q3LUMP_VERTICES         10 // mesh vertices (used by faces)
501 #define Q3LUMP_TRIANGLES        11 // mesh triangles (used by faces)
502 #define Q3LUMP_EFFECTS          12 // fog (used by faces)
503 #define Q3LUMP_FACES            13 // surfaces (used by leafs)
504 #define Q3LUMP_LIGHTMAPS        14 // lightmap textures (used by faces)
505 #define Q3LUMP_LIGHTGRID        15 // lighting as a voxel grid (used by rendering)
506 #define Q3LUMP_PVS                      16 // potentially visible set; bit[clusters][clusters] (used by rendering)
507 #define Q3HEADER_LUMPS          17
508
509 typedef struct
510 {
511         int                     ident;
512         int                     version;
513         lump_t          lumps[HEADER_LUMPS];
514 } q3dheader_t;
515
516 typedef struct
517 {
518         char name[Q3PATHLENGTH];
519         int surfaceflags;
520         int contents;
521 }
522 q3dtexture_t;
523
524 // note: planes are paired, the pair of planes with i and i ^ 1 are opposites.
525 typedef struct
526 {
527         float normal[3];
528         float dist;
529 }
530 q3dplane_t;
531
532 typedef struct
533 {
534         int planeindex;
535         int childrenindex[2];
536         int mins[3];
537         int maxs[3];
538 }
539 q3dnode_t;
540
541 typedef struct
542 {
543         int clusterindex; // pvs index
544         int areaindex; // area index
545         int mins[3];
546         int maxs[3];
547         int firstleafface;
548         int numleaffaces;
549         int firstleafbrush;
550         int numleafbrushes;
551 }
552 q3dleaf_t;
553
554 typedef struct
555 {
556         float mins[3];
557         float maxs[3];
558         int firstface;
559         int numfaces;
560         int firstbrush;
561         int numbrushes;
562 }
563 q3dmodel_t;
564
565 typedef struct
566 {
567         int firstbrushside;
568         int numbrushsides;
569         int textureindex;
570 }
571 q3dbrush_t;
572
573 typedef struct
574 {
575         int planeindex;
576         int textureindex;
577 }
578 q3dbrushside_t;
579
580 typedef struct
581 {
582         float origin3f[3];
583         float texcoord2f[2];
584         float lightmap2f[2];
585         float normal3f[3];
586         unsigned char color4ub[4];
587 }
588 q3dvertex_t;
589
590 typedef struct
591 {
592         int offset; // first vertex index of mesh
593 }
594 q3dmeshvertex_t;
595
596 typedef struct
597 {
598         char shadername[Q3PATHLENGTH];
599         int brushindex;
600         int unknown; // I read this is always 5 except in q3dm8 which has one effect with -1
601 }
602 q3deffect_t;
603
604 #define Q3FACETYPE_POLYGON 1 // common
605 #define Q3FACETYPE_PATCH 2 // common
606 #define Q3FACETYPE_MESH 3 // common
607 #define Q3FACETYPE_FLARE 4 // rare (is this ever used?)
608
609 typedef struct
610 {
611         int textureindex;
612         int effectindex; // -1 if none
613         int type; // Q3FACETYPE
614         int firstvertex;
615         int numvertices;
616         int firstelement;
617         int numelements;
618         int lightmapindex; // -1 if none
619         int lightmap_base[2];
620         int lightmap_size[2];
621         union
622         {
623                 struct
624                 {
625                         // corrupt or don't care
626                         int blah[14];
627                 }
628                 unknown;
629                 struct
630                 {
631                         // Q3FACETYPE_POLYGON
632                         // polygon is simply a convex polygon, renderable as a mesh
633                         float lightmap_origin[3];
634                         float lightmap_vectors[2][3];
635                         float normal[3];
636                         int unused1[2];
637                 }
638                 polygon;
639                 struct
640                 {
641                         // Q3FACETYPE_PATCH
642                         // patch renders as a bezier mesh, with adjustable tesselation
643                         // level (optionally based on LOD using the bbox and polygon
644                         // count to choose a tesselation level)
645                         // note: multiple patches may have the same bbox to cause them to
646                         // be LOD adjusted together as a group
647                         int unused1[3];
648                         float mins[3]; // LOD bbox
649                         float maxs[3]; // LOD bbox
650                         int unused2[3];
651                         int patchsize[2]; // dimensions of vertex grid
652                 }
653                 patch;
654                 struct
655                 {
656                         // Q3FACETYPE_MESH
657                         // mesh renders as simply a triangle mesh
658                         int unused1[3];
659                         float mins[3];
660                         float maxs[3];
661                         int unused2[5];
662                 }
663                 mesh;
664                 struct
665                 {
666                         // Q3FACETYPE_FLARE
667                         // flare renders as a simple sprite at origin, no geometry
668                         // exists, nor does it have a radius, a cvar controls the radius
669                         // and another cvar controls distance fade
670                         // (they were not used in Q3 I'm told)
671                         float origin[3];
672                         int unused1[11];
673                 }
674                 flare;
675         }
676         specific;
677 }
678 q3dface_t;
679
680 typedef struct
681 {
682         unsigned char rgb[128*128*3];
683 }
684 q3dlightmap_t;
685
686 typedef struct
687 {
688         unsigned char ambientrgb[3];
689         unsigned char diffusergb[3];
690         unsigned char diffusepitch;
691         unsigned char diffuseyaw;
692 }
693 q3dlightgrid_t;
694
695 typedef struct
696 {
697         int numclusters;
698         int chainlength;
699         // unsigned char chains[];
700         // containing bits in 0-7 order (not 7-0 order),
701         // pvschains[mycluster * chainlength + (thatcluster >> 3)] & (1 << (thatcluster & 7))
702 }
703 q3dpvs_t;
704
705 // surfaceflags from bsp
706 #define Q3SURFACEFLAG_NODAMAGE 1
707 #define Q3SURFACEFLAG_SLICK 2
708 #define Q3SURFACEFLAG_SKY 4
709 #define Q3SURFACEFLAG_LADDER 8
710 #define Q3SURFACEFLAG_NOIMPACT 16
711 #define Q3SURFACEFLAG_NOMARKS 32
712 #define Q3SURFACEFLAG_FLESH 64
713 #define Q3SURFACEFLAG_NODRAW 128
714 #define Q3SURFACEFLAG_HINT 256
715 #define Q3SURFACEFLAG_SKIP 512
716 #define Q3SURFACEFLAG_NOLIGHTMAP 1024
717 #define Q3SURFACEFLAG_POINTLIGHT 2048
718 #define Q3SURFACEFLAG_METALSTEPS 4096
719 #define Q3SURFACEFLAG_NOSTEPS 8192
720 #define Q3SURFACEFLAG_NONSOLID 16384
721 #define Q3SURFACEFLAG_LIGHTFILTER 32768
722 #define Q3SURFACEFLAG_ALPHASHADOW 65536
723 #define Q3SURFACEFLAG_NODLIGHT 131072
724 #define Q3SURFACEFLAG_DUST 262144
725
726 // surfaceparms from shaders
727 #define Q3SURFACEPARM_ALPHASHADOW 1
728 #define Q3SURFACEPARM_AREAPORTAL 2
729 #define Q3SURFACEPARM_CLUSTERPORTAL 4
730 #define Q3SURFACEPARM_DETAIL 8
731 #define Q3SURFACEPARM_DONOTENTER 16
732 #define Q3SURFACEPARM_FOG 32
733 #define Q3SURFACEPARM_LAVA 64
734 #define Q3SURFACEPARM_LIGHTFILTER 128
735 #define Q3SURFACEPARM_METALSTEPS 256
736 #define Q3SURFACEPARM_NODAMAGE 512
737 #define Q3SURFACEPARM_NODLIGHT 1024
738 #define Q3SURFACEPARM_NODRAW 2048
739 #define Q3SURFACEPARM_NODROP 4096
740 #define Q3SURFACEPARM_NOIMPACT 8192
741 #define Q3SURFACEPARM_NOLIGHTMAP 16384
742 #define Q3SURFACEPARM_NOMARKS 32768
743 #define Q3SURFACEPARM_NOMIPMAPS 65536
744 #define Q3SURFACEPARM_NONSOLID 131072
745 #define Q3SURFACEPARM_ORIGIN 262144
746 #define Q3SURFACEPARM_PLAYERCLIP 524288
747 #define Q3SURFACEPARM_SKY 1048576
748 #define Q3SURFACEPARM_SLICK 2197152
749 #define Q3SURFACEPARM_SLIME 4194304
750 #define Q3SURFACEPARM_STRUCTURAL 8388608
751 #define Q3SURFACEPARM_TRANS 16777216
752 #define Q3SURFACEPARM_WATER 33554432
753 #define Q3SURFACEPARM_POINTLIGHT 67108864
754
755 // various flags from shaders
756 #define Q3TEXTUREFLAG_TWOSIDED 1
757 #define Q3TEXTUREFLAG_ADDITIVE 2
758 #define Q3TEXTUREFLAG_NOMIPMAPS 4
759 #define Q3TEXTUREFLAG_NOPICMIP 8
760 #define Q3TEXTUREFLAG_AUTOSPRITE 16
761 #define Q3TEXTUREFLAG_AUTOSPRITE2 32
762 #define Q3TEXTUREFLAG_ALPHATEST 64
763
764 typedef struct q3mmodel_s
765 {
766         vec3_t mins;
767         vec3_t maxs;
768         int numsurfaces;
769         int firstsurface;
770         int numbrushes;
771         int firstbrush;
772 }
773 q3mmodel_t;
774
775 typedef struct q3mbrush_s
776 {
777         struct colbrushf_s *colbrushf;
778         int numbrushsides;
779         struct q3mbrushside_s *firstbrushside;
780         struct texture_s *texture;
781 }
782 q3mbrush_t;
783
784 typedef struct q3mbrushside_s
785 {
786         struct mplane_s *plane;
787         struct texture_s *texture;
788 }
789 q3mbrushside_t;
790
791 typedef struct q3meffect_s
792 {
793         char shadername[Q3PATHLENGTH];
794         struct q3mbrush_s *brush;
795         int unknown; // 5 or -1
796 }
797 q3meffect_t;
798
799 #define CHECKPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] & (1 << ((b) & 7))) : false)
800 #define SETPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] |= (1 << ((b) & 7))) : false)
801 #define CLEARPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] &= ~(1 << ((b) & 7))) : false)
802
803 #endif
804