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