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 33 34 // 35 // in memory representation 36 // 37 typedef struct mvertex_s 38 { 39 vec3_t position; 40 } 41 mvertex_t; 42 43 #define SIDE_FRONT 0 44 #define SIDE_BACK 1 45 #define SIDE_ON 2 46 47 48 // plane_t structure 49 typedef struct mplane_s 50 { 51 vec3_t normal; 52 float dist; 53 // for texture axis selection and fast side tests 54 int type; 55 int signbits; 56 } 57 mplane_t; 58 59 #define SHADERSTAGE_SKY 0 60 #define SHADERSTAGE_NORMAL 1 61 #define SHADERSTAGE_COUNT 2 62 63 //#define SURF_PLANEBACK 2 64 65 // use alpha blend on this material 66 #define MATERIALFLAG_ALPHA 2 67 // use additive blend on this material 68 #define MATERIALFLAG_ADD 4 69 // turn off depth test on this material 70 #define MATERIALFLAG_NODEPTHTEST 8 71 // multiply alpha by r_wateralpha cvar 72 #define MATERIALFLAG_WATERALPHA 16 73 // draw with no lighting 74 #define MATERIALFLAG_FULLBRIGHT 32 75 // drawn as a normal surface (alternative to SKY) 76 #define MATERIALFLAG_WALL 64 77 // this surface shows the sky in its place, alternative to WALL 78 // skipped if transparent 79 #define MATERIALFLAG_SKY 128 80 // swirling water effect (used with MATERIALFLAG_WALL) 81 #define MATERIALFLAG_WATERSCROLL 256 82 // skips drawing the surface 83 #define MATERIALFLAG_NODRAW 512 84 // probably used only on q1bsp water 85 #define MATERIALFLAG_LIGHTBOTHSIDES 1024 86 // use alpha test on this material 87 #define MATERIALFLAG_ALPHATEST 2048 88 // treat this material as a blended transparency (as opposed to an alpha test 89 // transparency), this causes special fog behavior, and disables glDepthMask 90 #define MATERIALFLAG_BLENDED 4096 91 // render using a custom blendfunc 92 #define MATERIALFLAG_CUSTOMBLEND 8192 93 // do not cast shadows from this material 94 #define MATERIALFLAG_NOSHADOW 16384 95 // render using vertex alpha (q3bsp) as texture blend parameter between foreground (normal) skinframe and background skinframe 96 #define MATERIALFLAG_VERTEXTEXTUREBLEND 32768 97 // disables GL_CULL_FACE on this texture (making it double sided) 98 #define MATERIALFLAG_NOCULLFACE 65536 99 // render with a very short depth range (like 10% of normal), this causes entities to appear infront of most of the scene 100 #define MATERIALFLAG_SHORTDEPTHRANGE 131072 101 // render water, comprising refraction and reflection (note: this is always opaque, the shader does the alpha effect) 102 #define MATERIALFLAG_WATERSHADER 262144 103 // render refraction (note: this is just a way to distort the background, otherwise useless) 104 #define MATERIALFLAG_REFRACTION 524288 105 // render reflection 106 #define MATERIALFLAG_REFLECTION 1048576 107 // use model lighting on this material (q1bsp lightmap sampling or q3bsp lightgrid, implies FULLBRIGHT is false) 108 #define MATERIALFLAG_MODELLIGHT 4194304 109 // add directional model lighting to this material (q3bsp lightgrid only) 110 #define MATERIALFLAG_MODELLIGHT_DIRECTIONAL 8388608 111 // combined mask of all attributes that require depth sorted rendering 112 #define MATERIALFLAGMASK_DEPTHSORTED (MATERIALFLAG_BLENDED | MATERIALFLAG_NODEPTHTEST) 113 // combined mask of all attributes that cause some sort of transparency 114 #define MATERIALFLAGMASK_TRANSLUCENT (MATERIALFLAG_WATERALPHA | MATERIALFLAG_SKY | MATERIALFLAG_NODRAW | MATERIALFLAG_ALPHATEST | MATERIALFLAG_BLENDED | MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION) 115 116 typedef struct medge_s 117 { 118 unsigned short v[2]; 119 } 120 medge_t; 121 122 struct entity_render_s; 123 struct texture_s; 124 struct msurface_s; 125 126 typedef struct mnode_s 127 { 128 //this part shared between node and leaf 129 mplane_t *plane; // != NULL 130 struct mnode_s *parent; 131 struct mportal_s *portals; 132 // for bounding box culling 133 vec3_t mins; 134 vec3_t maxs; 135 // supercontents from all brushes inside this node or leaf 136 int combinedsupercontents; 137 138 // this part unique to node 139 struct mnode_s *children[2]; 140 141 // q1bsp specific 142 unsigned short firstsurface; 143 unsigned short numsurfaces; 144 } 145 mnode_t; 146 147 typedef struct mleaf_s 148 { 149 //this part shared between node and leaf 150 mplane_t *plane; // == NULL 151 struct mnode_s *parent; 152 struct mportal_s *portals; 153 // for bounding box culling 154 vec3_t mins; 155 vec3_t maxs; 156 // supercontents from all brushes inside this node or leaf 157 int combinedsupercontents; 158 159 // this part unique to leaf 160 // common 161 int clusterindex; // -1 is not in pvs, >= 0 is pvs bit number 162 int areaindex; // q3bsp 163 int containscollisionsurfaces; // indicates whether the leafsurfaces contains q3 patches 164 int numleafsurfaces; 165 int *firstleafsurface; 166 int numleafbrushes; // q3bsp 167 int *firstleafbrush; // q3bsp 168 unsigned char ambient_sound_level[NUM_AMBIENTS]; // q1bsp 169 int contents; // q1bsp: // TODO: remove (only used temporarily during loading when making collision hull 0) 170 int portalmarkid; // q1bsp // used by see-polygon-through-portals visibility checker 171 } 172 mleaf_t; 173 174 typedef struct mclipnode_s 175 { 176 int planenum; 177 int children[2]; // negative numbers are contents 178 } mclipnode_t; 179 180 typedef struct hull_s 181 { 182 mclipnode_t *clipnodes; 183 mplane_t *planes; 184 int firstclipnode; 185 int lastclipnode; 186 vec3_t clip_mins; 187 vec3_t clip_maxs; 188 vec3_t clip_size; 189 } 190 hull_t; 191 192 typedef struct mportal_s 193 { 194 struct mportal_s *next; // the next portal on this leaf 195 mleaf_t *here; // the leaf this portal is on 196 mleaf_t *past; // the leaf through this portal (infront) 197 int numpoints; 198 mvertex_t *points; 199 vec3_t mins, maxs; // culling 200 mplane_t plane; 201 } 202 mportal_t; 203 204 typedef struct svbspmesh_s 205 { 206 struct svbspmesh_s *next; 207 int numverts, maxverts; 208 int numtriangles, maxtriangles; 209 float *verts; 210 int *elements; 211 } 212 svbspmesh_t; 213 214 // Q2 bsp stuff 215 216 #define Q2BSPVERSION 38 217 218 // leaffaces, leafbrushes, planes, and verts are still bounded by 219 // 16 bit short limits 220 221 //============================================================================= 222 223 #define Q2LUMP_ENTITIES 0 224 #define Q2LUMP_PLANES 1 225 #define Q2LUMP_VERTEXES 2 226 #define Q2LUMP_VISIBILITY 3 227 #define Q2LUMP_NODES 4 228 #define Q2LUMP_TEXINFO 5 229 #define Q2LUMP_FACES 6 230 #define Q2LUMP_LIGHTING 7 231 #define Q2LUMP_LEAFS 8 232 #define Q2LUMP_LEAFFACES 9 233 #define Q2LUMP_LEAFBRUSHES 10 234 #define Q2LUMP_EDGES 11 235 #define Q2LUMP_SURFEDGES 12 236 #define Q2LUMP_MODELS 13 237 #define Q2LUMP_BRUSHES 14 238 #define Q2LUMP_BRUSHSIDES 15 239 #define Q2LUMP_POP 16 240 #define Q2LUMP_AREAS 17 241 #define Q2LUMP_AREAPORTALS 18 242 #define Q2HEADER_LUMPS 19 243 244 typedef struct q2dheader_s 245 { 246 int ident; 247 int version; 248 lump_t lumps[Q2HEADER_LUMPS]; 249 } q2dheader_t; 250 251 typedef struct q2dmodel_s 252 { 253 float mins[3], maxs[3]; 254 float origin[3]; // for sounds or lights 255 int headnode; 256 int firstface, numfaces; // submodels just draw faces 257 // without walking the bsp tree 258 } q2dmodel_t; 259 260 // planes (x&~1) and (x&~1)+1 are always opposites 261 262 // contents flags are seperate bits 263 // a given brush can contribute multiple content bits 264 // multiple brushes can be in a single leaf 265 266 // these definitions also need to be in q_shared.h! 267 268 // lower bits are stronger, and will eat weaker brushes completely 269 #define Q2CONTENTS_SOLID 1 // an eye is never valid in a solid 270 #define Q2CONTENTS_WINDOW 2 // translucent, but not watery 271 #define Q2CONTENTS_AUX 4 272 #define Q2CONTENTS_LAVA 8 273 #define Q2CONTENTS_SLIME 16 274 #define Q2CONTENTS_WATER 32 275 #define Q2CONTENTS_MIST 64 276 #define Q2LAST_VISIBLE_CONTENTS 64 277 278 // remaining contents are non-visible, and don't eat brushes 279 280 #define Q2CONTENTS_AREAPORTAL 0x8000 281 282 #define Q2CONTENTS_PLAYERCLIP 0x10000 283 #define Q2CONTENTS_MONSTERCLIP 0x20000 284 285 // currents can be added to any other contents, and may be mixed 286 #define Q2CONTENTS_CURRENT_0 0x40000 287 #define Q2CONTENTS_CURRENT_90 0x80000 288 #define Q2CONTENTS_CURRENT_180 0x100000 289 #define Q2CONTENTS_CURRENT_270 0x200000 290 #define Q2CONTENTS_CURRENT_UP 0x400000 291 #define Q2CONTENTS_CURRENT_DOWN 0x800000 292 293 #define Q2CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity 294 295 #define Q2CONTENTS_MONSTER 0x2000000 // should never be on a brush, only in game 296 #define Q2CONTENTS_DEADMONSTER 0x4000000 297 #define Q2CONTENTS_DETAIL 0x8000000 // brushes to be added after vis leafs 298 #define Q2CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans 299 #define Q2CONTENTS_LADDER 0x20000000 300 301 302 303 #define Q2SURF_LIGHT 0x1 // value will hold the light strength 304 305 #define Q2SURF_SLICK 0x2 // effects game physics 306 307 #define Q2SURF_SKY 0x4 // don't draw, but add to skybox 308 #define Q2SURF_WARP 0x8 // turbulent water warp 309 #define Q2SURF_TRANS33 0x10 310 #define Q2SURF_TRANS66 0x20 311 #define Q2SURF_FLOWING 0x40 // scroll towards angle 312 #define Q2SURF_NODRAW 0x80 // don't bother referencing the texture 313 314 315 316 317 typedef struct q2dnode_s 318 { 319 int planenum; 320 int children[2]; // negative numbers are -(leafs+1), not nodes 321 short mins[3]; // for frustom culling 322 short maxs[3]; 323 unsigned short firstface; 324 unsigned short numfaces; // counting both sides 325 } q2dnode_t; 326 327 328 typedef struct q2texinfo_s 329 { 330 float vecs[2][4]; // [s/t][xyz offset] 331 int flags; // miptex flags + overrides 332 int value; // light emission, etc 333 char texture[32]; // texture name (textures/*.wal) 334 int nexttexinfo; // for animations, -1 = end of chain 335 } q2texinfo_t; 336 337 typedef struct q2dleaf_s 338 { 339 int contents; // OR of all brushes (not needed?) 340 341 short cluster; 342 short area; 343 344 short mins[3]; // for frustum culling 345 short maxs[3]; 346 347 unsigned short firstleafface; 348 unsigned short numleaffaces; 349 350 unsigned short firstleafbrush; 351 unsigned short numleafbrushes; 352 } q2dleaf_t; 353 354 typedef struct q2dbrushside_s 355 { 356 unsigned short planenum; // facing out of the leaf 357 short texinfo; 358 } q2dbrushside_t; 359 360 typedef struct q2dbrush_s 361 { 362 int firstside; 363 int numsides; 364 int contents; 365 } q2dbrush_t; 366 367 368 // the visibility lump consists of a header with a count, then 369 // byte offsets for the PVS and PHS of each cluster, then the raw 370 // compressed bit vectors 371 #define Q2DVIS_PVS 0 372 #define Q2DVIS_PHS 1 373 typedef struct q2dvis_s 374 { 375 int numclusters; 376 int bitofs[8][2]; // bitofs[numclusters][2] 377 } q2dvis_t; 378 379 // each area has a list of portals that lead into other areas 380 // when portals are closed, other areas may not be visible or 381 // hearable even if the vis info says that it should be 382 typedef struct q2dareaportal_s 383 { 384 int portalnum; 385 int otherarea; 386 } q2dareaportal_t; 387 388 typedef struct q2darea_s 389 { 390 int numareaportals; 391 int firstareaportal; 392 } q2darea_t; 393 394 395 //Q3 bsp stuff 396 397 #define Q3BSPVERSION 46 398 #define Q3BSPVERSION_LIVE 47 399 #define Q3BSPVERSION_IG 48 400 401 #define Q3LUMP_ENTITIES 0 // entities to spawn (used by server and client) 402 #define Q3LUMP_TEXTURES 1 // textures used (used by faces) 403 #define Q3LUMP_PLANES 2 // planes used (used by bsp nodes) 404 #define Q3LUMP_NODES 3 // bsp nodes (used by bsp nodes, bsp leafs, rendering, collisions) 405 #define Q3LUMP_LEAFS 4 // bsp leafs (used by bsp nodes) 406 #define Q3LUMP_LEAFFACES 5 // array of ints indexing faces (used by leafs) 407 #define Q3LUMP_LEAFBRUSHES 6 // array of ints indexing brushes (used by leafs) 408 #define Q3LUMP_MODELS 7 // models (used by rendering, collisions) 409 #define Q3LUMP_BRUSHES 8 // brushes (used by effects, collisions) 410 #define Q3LUMP_BRUSHSIDES 9 // brush faces (used by brushes) 411 #define Q3LUMP_VERTICES 10 // mesh vertices (used by faces) 412 #define Q3LUMP_TRIANGLES 11 // mesh triangles (used by faces) 413 #define Q3LUMP_EFFECTS 12 // fog (used by faces) 414 #define Q3LUMP_FACES 13 // surfaces (used by leafs) 415 #define Q3LUMP_LIGHTMAPS 14 // lightmap textures (used by faces) 416 #define Q3LUMP_LIGHTGRID 15 // lighting as a voxel grid (used by rendering) 417 #define Q3LUMP_PVS 16 // potentially visible set; bit[clusters][clusters] (used by rendering) 418 #define Q3HEADER_LUMPS 17 419 #define Q3LUMP_ADVERTISEMENTS 17 // quake live stuff written by zeroradiant's q3map2 (ignored by DP) 420 #define Q3HEADER_LUMPS_LIVE 18 421 #define Q3HEADER_LUMPS_MAX 18 422 423 typedef struct q3dheader_s 424 { 425 int ident; 426 int version; 427 lump_t lumps[Q3HEADER_LUMPS_MAX]; 428 } q3dheader_t; 429 430 typedef struct q3dtexture_s 431 { 432 char name[Q3PATHLENGTH]; 433 int surfaceflags; 434 int contents; 435 } 436 q3dtexture_t; 437 438 // note: planes are paired, the pair of planes with i and i ^ 1 are opposites. 439 typedef struct q3dplane_s 440 { 441 float normal[3]; 442 float dist; 443 } 444 q3dplane_t; 445 446 typedef struct q3dnode_s 447 { 448 int planeindex; 449 int childrenindex[2]; 450 int mins[3]; 451 int maxs[3]; 452 } 453 q3dnode_t; 454 455 typedef struct q3dleaf_s 456 { 457 int clusterindex; // pvs index 458 int areaindex; // area index 459 int mins[3]; 460 int maxs[3]; 461 int firstleafface; 462 int numleaffaces; 463 int firstleafbrush; 464 int numleafbrushes; 465 } 466 q3dleaf_t; 467 468 typedef struct q3dmodel_s 469 { 470 float mins[3]; 471 float maxs[3]; 472 int firstface; 473 int numfaces; 474 int firstbrush; 475 int numbrushes; 476 } 477 q3dmodel_t; 478 479 typedef struct q3dbrush_s 480 { 481 int firstbrushside; 482 int numbrushsides; 483 int textureindex; 484 } 485 q3dbrush_t; 486 487 typedef struct q3dbrushside_s 488 { 489 int planeindex; 490 int textureindex; 491 } 492 q3dbrushside_t; 493 494 typedef struct q3dbrushside_ig_s 495 { 496 int planeindex; 497 int textureindex; 498 int surfaceflags; 499 } 500 q3dbrushside_ig_t; 501 502 typedef struct q3dvertex_s 503 { 504 float origin3f[3]; 505 float texcoord2f[2]; 506 float lightmap2f[2]; 507 float normal3f[3]; 508 unsigned char color4ub[4]; 509 } 510 q3dvertex_t; 511 512 typedef struct q3dmeshvertex_s 513 { 514 int offset; // first vertex index of mesh 515 } 516 q3dmeshvertex_t; 517 518 typedef struct q3deffect_s 519 { 520 char shadername[Q3PATHLENGTH]; 521 int brushindex; 522 int unknown; // I read this is always 5 except in q3dm8 which has one effect with -1 523 } 524 q3deffect_t; 525 526 #define Q3FACETYPE_FLAT 1 // common 527 #define Q3FACETYPE_PATCH 2 // common 528 #define Q3FACETYPE_MESH 3 // common 529 #define Q3FACETYPE_FLARE 4 // rare (is this ever used?) 530 531 typedef struct q3dface_s 532 { 533 int textureindex; 534 int effectindex; // -1 if none 535 int type; // Q3FACETYPE 536 int firstvertex; 537 int numvertices; 538 int firstelement; 539 int numelements; 540 int lightmapindex; // -1 if none 541 int lightmap_base[2]; 542 int lightmap_size[2]; 543 union 544 { 545 struct 546 { 547 // corrupt or don't care 548 int blah[14]; 549 } 550 unknown; 551 struct 552 { 553 // Q3FACETYPE_FLAT 554 // mesh is a collection of triangles on a plane, renderable as a mesh (NOT a polygon) 555 float lightmap_origin[3]; 556 float lightmap_vectors[2][3]; 557 float normal[3]; 558 int unused1[2]; 559 } 560 flat; 561 struct 562 { 563 // Q3FACETYPE_PATCH 564 // patch renders as a bezier mesh, with adjustable tesselation 565 // level (optionally based on LOD using the bbox and polygon 566 // count to choose a tesselation level) 567 // note: multiple patches may have the same bbox to cause them to 568 // be LOD adjusted together as a group 569 int unused1[3]; 570 float mins[3]; // LOD bbox 571 float maxs[3]; // LOD bbox 572 int unused2[3]; 573 int patchsize[2]; // dimensions of vertex grid 574 } 575 patch; 576 struct 577 { 578 // Q3FACETYPE_MESH 579 // mesh renders as simply a triangle mesh 580 int unused1[3]; 581 float mins[3]; 582 float maxs[3]; 583 int unused2[5]; 584 } 585 mesh; 586 struct 587 { 588 // Q3FACETYPE_FLARE 589 // flare renders as a simple sprite at origin, no geometry 590 // exists, nor does it have a radius, a cvar controls the radius 591 // and another cvar controls distance fade 592 // (they were not used in Q3 I'm told) 593 float origin[3]; 594 int unused1[11]; 595 } 596 flare; 597 } 598 specific; 599 } 600 q3dface_t; 601 602 typedef struct q3dlightmap_s 603 { 604 unsigned char rgb[128*128*3]; 605 } 606 q3dlightmap_t; 607 608 typedef struct q3dlightgrid_s 609 { 610 unsigned char ambientrgb[3]; 611 unsigned char diffusergb[3]; 612 unsigned char diffusepitch; 613 unsigned char diffuseyaw; 614 } 615 q3dlightgrid_t; 616 617 typedef struct q3dpvs_s 618 { 619 int numclusters; 620 int chainlength; 621 // unsigned char chains[]; 622 // containing bits in 0-7 order (not 7-0 order), 623 // pvschains[mycluster * chainlength + (thatcluster >> 3)] & (1 << (thatcluster & 7)) 624 } 625 q3dpvs_t; 626 627 // surfaceflags from bsp 628 #define Q3SURFACEFLAG_NODAMAGE 1 629 #define Q3SURFACEFLAG_SLICK 2 630 #define Q3SURFACEFLAG_SKY 4 631 #define Q3SURFACEFLAG_LADDER 8 632 #define Q3SURFACEFLAG_NOIMPACT 16 633 #define Q3SURFACEFLAG_NOMARKS 32 634 #define Q3SURFACEFLAG_FLESH 64 635 #define Q3SURFACEFLAG_NODRAW 128 636 #define Q3SURFACEFLAG_HINT 256 637 #define Q3SURFACEFLAG_SKIP 512 638 #define Q3SURFACEFLAG_NOLIGHTMAP 1024 639 #define Q3SURFACEFLAG_POINTLIGHT 2048 640 #define Q3SURFACEFLAG_METALSTEPS 4096 641 #define Q3SURFACEFLAG_NOSTEPS 8192 642 #define Q3SURFACEFLAG_NONSOLID 16384 643 #define Q3SURFACEFLAG_LIGHTFILTER 32768 644 #define Q3SURFACEFLAG_ALPHASHADOW 65536 645 #define Q3SURFACEFLAG_NODLIGHT 131072 646 #define Q3SURFACEFLAG_DUST 262144 647 648 // surfaceparms from shaders 649 #define Q3SURFACEPARM_ALPHASHADOW 1 650 #define Q3SURFACEPARM_AREAPORTAL 2 651 #define Q3SURFACEPARM_CLUSTERPORTAL 4 652 #define Q3SURFACEPARM_DETAIL 8 653 #define Q3SURFACEPARM_DONOTENTER 16 654 #define Q3SURFACEPARM_FOG 32 655 #define Q3SURFACEPARM_LAVA 64 656 #define Q3SURFACEPARM_LIGHTFILTER 128 657 #define Q3SURFACEPARM_METALSTEPS 256 658 #define Q3SURFACEPARM_NODAMAGE 512 659 #define Q3SURFACEPARM_NODLIGHT 1024 660 #define Q3SURFACEPARM_NODRAW 2048 661 #define Q3SURFACEPARM_NODROP 4096 662 #define Q3SURFACEPARM_NOIMPACT 8192 663 #define Q3SURFACEPARM_NOLIGHTMAP 16384 664 #define Q3SURFACEPARM_NOMARKS 32768 665 #define Q3SURFACEPARM_NOMIPMAPS 65536 666 #define Q3SURFACEPARM_NONSOLID 131072 667 #define Q3SURFACEPARM_ORIGIN 262144 668 #define Q3SURFACEPARM_PLAYERCLIP 524288 669 #define Q3SURFACEPARM_SKY 1048576 670 #define Q3SURFACEPARM_SLICK 2097152 671 #define Q3SURFACEPARM_SLIME 4194304 672 #define Q3SURFACEPARM_STRUCTURAL 8388608 673 #define Q3SURFACEPARM_TRANS 16777216 674 #define Q3SURFACEPARM_WATER 33554432 675 #define Q3SURFACEPARM_POINTLIGHT 67108864 676 #define Q3SURFACEPARM_HINT 134217728 677 #define Q3SURFACEPARM_DUST 268435456 678 #define Q3SURFACEPARM_BOTCLIP 536870912 679 #define Q3SURFACEPARM_LIGHTGRID 1073741824 680 #define Q3SURFACEPARM_ANTIPORTAL 2147483648u 681 682 typedef struct q3mbrush_s 683 { 684 struct colbrushf_s *colbrushf; 685 int numbrushsides; 686 struct q3mbrushside_s *firstbrushside; 687 struct texture_s *texture; 688 } 689 q3mbrush_t; 690 691 typedef struct q3mbrushside_s 692 { 693 struct mplane_s *plane; 694 struct texture_s *texture; 695 } 696 q3mbrushside_t; 697 698 #define CHECKPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] & (1 << ((b) & 7))) : false) 699 #define SETPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] |= (1 << ((b) & 7))) : false) 700 #define CLEARPVSBIT(pvs,b) ((b) >= 0 ? ((pvs)[(b) >> 3] &= ~(1 << ((b) & 7))) : false) 701 702 #endif 703 704