File: qcommon\qfiles.h

    1 /*
    2 Copyright (C) 1997-2001 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 //
   22 // qfiles.h: quake file formats
   23 // This file must be identical in the quake and utils directories
   24 //
   25 
   26 /*
   27 ========================================================================
   28 
   29 The .pak files are just a linear collapse of a directory tree
   30 
   31 ========================================================================
   32 */
   33 
   34 #define IDPAKHEADER             (('K'<<24)+('C'<<16)+('A'<<8)+'P')
   35 
   36 typedef struct
   37 {
   38         char    name[56];
   39         int             filepos, filelen;
   40 } dpackfile_t;
   41 
   42 typedef struct
   43 {
   44         int             ident;          // == IDPAKHEADER
   45         int             dirofs;
   46         int             dirlen;
   47 } dpackheader_t;
   48 
   49 #define MAX_FILES_IN_PACK       4096
   50 
   51 
   52 /*
   53 ========================================================================
   54 
   55 PCX files are used for as many images as possible
   56 
   57 ========================================================================
   58 */
   59 
   60 typedef struct
   61 {
   62     char        manufacturer;
   63     char        version;
   64     char        encoding;
   65     char        bits_per_pixel;
   66     unsigned short      xmin,ymin,xmax,ymax;
   67     unsigned short      hres,vres;
   68     unsigned char       palette[48];
   69     char        reserved;
   70     char        color_planes;
   71     unsigned short      bytes_per_line;
   72     unsigned short      palette_type;
   73     char        filler[58];
   74     unsigned char       data;                   // unbounded
   75 } pcx_t;
   76 
   77 
   78 /*
   79 ========================================================================
   80 
   81 .MD2 triangle model file format
   82 
   83 ========================================================================
   84 */
   85 
   86 #define IDALIASHEADER           (('2'<<24)+('P'<<16)+('D'<<8)+'I')
   87 #define ALIAS_VERSION   8
   88 
   89 #define MAX_TRIANGLES   4096
   90 #define MAX_VERTS               2048
   91 #define MAX_FRAMES              512
   92 #define MAX_MD2SKINS    32
   93 #define MAX_SKINNAME    64
   94 
   95 typedef struct
   96 {
   97         short   s;
   98         short   t;
   99 } dstvert_t;
  100 
  101 typedef struct 
  102 {
  103         short   index_xyz[3];
  104         short   index_st[3];
  105 } dtriangle_t;
  106 
  107 typedef struct
  108 {
  109         byte    v[3];                   // scaled byte to fit in frame mins/maxs
  110         byte    lightnormalindex;
  111 } dtrivertx_t;
  112 
  113 #define DTRIVERTX_V0   0
  114 #define DTRIVERTX_V1   1
  115 #define DTRIVERTX_V2   2
  116 #define DTRIVERTX_LNI  3
  117 #define DTRIVERTX_SIZE 4
  118 
  119 typedef struct
  120 {
  121         float           scale[3];       // multiply byte verts by this
  122         float           translate[3];   // then add this
  123         char            name[16];       // frame name from grabbing
  124         dtrivertx_t     verts[1];       // variable sized
  125 } daliasframe_t;
  126 
  127 
  128 // the glcmd format:
  129 // a positive integer starts a tristrip command, followed by that many
  130 // vertex structures.
  131 // a negative integer starts a trifan command, followed by -x vertexes
  132 // a zero indicates the end of the command list.
  133 // a vertex consists of a floating point s, a floating point t,
  134 // and an integer vertex index.
  135 
  136 
  137 typedef struct
  138 {
  139         int                     ident;
  140         int                     version;
  141 
  142         int                     skinwidth;
  143         int                     skinheight;
  144         int                     framesize;              // byte size of each frame
  145 
  146         int                     num_skins;
  147         int                     num_xyz;
  148         int                     num_st;                 // greater than num_xyz for seams
  149         int                     num_tris;
  150         int                     num_glcmds;             // dwords in strip/fan command list
  151         int                     num_frames;
  152 
  153         int                     ofs_skins;              // each skin is a MAX_SKINNAME string
  154         int                     ofs_st;                 // byte offset from start for stverts
  155         int                     ofs_tris;               // offset for dtriangles
  156         int                     ofs_frames;             // offset for first frame
  157         int                     ofs_glcmds;     
  158         int                     ofs_end;                // end of file
  159 
  160 } dmdl_t;
  161 
  162 /*
  163 ========================================================================
  164 
  165 .SP2 sprite file format
  166 
  167 ========================================================================
  168 */
  169 
  170 #define IDSPRITEHEADER  (('2'<<24)+('S'<<16)+('D'<<8)+'I')
  171                 // little-endian "IDS2"
  172 #define SPRITE_VERSION  2
  173 
  174 typedef struct
  175 {
  176         int             width, height;
  177         int             origin_x, origin_y;             // raster coordinates inside pic
  178         char    name[MAX_SKINNAME];             // name of pcx file
  179 } dsprframe_t;
  180 
  181 typedef struct {
  182         int                     ident;
  183         int                     version;
  184         int                     numframes;
  185         dsprframe_t     frames[1];                      // variable sized
  186 } dsprite_t;
  187 
  188 /*
  189 ==============================================================================
  190 
  191   .WAL texture file format
  192 
  193 ==============================================================================
  194 */
  195 
  196 
  197 #define MIPLEVELS       4
  198 typedef struct miptex_s
  199 {
  200         char            name[32];
  201         unsigned        width, height;
  202         unsigned        offsets[MIPLEVELS];             // four mip maps stored
  203         char            animname[32];                   // next frame in animation chain
  204         int                     flags;
  205         int                     contents;
  206         int                     value;
  207 } miptex_t;
  208 
  209 
  210 
  211 /*
  212 ==============================================================================
  213 
  214   .BSP file format
  215 
  216 ==============================================================================
  217 */
  218 
  219 #define IDBSPHEADER     (('P'<<24)+('S'<<16)+('B'<<8)+'I')
  220                 // little-endian "IBSP"
  221 
  222 #define BSPVERSION      38
  223 
  224 
  225 // upper design bounds
  226 // leaffaces, leafbrushes, planes, and verts are still bounded by
  227 // 16 bit short limits
  228 #define MAX_MAP_MODELS          1024
  229 #define MAX_MAP_BRUSHES         8192
  230 #define MAX_MAP_ENTITIES        2048
  231 #define MAX_MAP_ENTSTRING       0x40000
  232 #define MAX_MAP_TEXINFO         8192
  233 
  234 #define MAX_MAP_AREAS           256
  235 #define MAX_MAP_AREAPORTALS     1024
  236 #define MAX_MAP_PLANES          65536
  237 #define MAX_MAP_NODES           65536
  238 #define MAX_MAP_BRUSHSIDES      65536
  239 #define MAX_MAP_LEAFS           65536
  240 #define MAX_MAP_VERTS           65536
  241 #define MAX_MAP_FACES           65536
  242 #define MAX_MAP_LEAFFACES       65536
  243 #define MAX_MAP_LEAFBRUSHES 65536
  244 #define MAX_MAP_PORTALS         65536
  245 #define MAX_MAP_EDGES           128000
  246 #define MAX_MAP_SURFEDGES       256000
  247 #define MAX_MAP_LIGHTING        0x200000
  248 #define MAX_MAP_VISIBILITY      0x100000
  249 
  250 // key / value pair sizes
  251 
  252 #define MAX_KEY         32
  253 #define MAX_VALUE       1024
  254 
  255 //=============================================================================
  256 
  257 typedef struct
  258 {
  259         int             fileofs, filelen;
  260 } lump_t;
  261 
  262 #define LUMP_ENTITIES           0
  263 #define LUMP_PLANES                     1
  264 #define LUMP_VERTEXES           2
  265 #define LUMP_VISIBILITY         3
  266 #define LUMP_NODES                      4
  267 #define LUMP_TEXINFO            5
  268 #define LUMP_FACES                      6
  269 #define LUMP_LIGHTING           7
  270 #define LUMP_LEAFS                      8
  271 #define LUMP_LEAFFACES          9
  272 #define LUMP_LEAFBRUSHES        10
  273 #define LUMP_EDGES                      11
  274 #define LUMP_SURFEDGES          12
  275 #define LUMP_MODELS                     13
  276 #define LUMP_BRUSHES            14
  277 #define LUMP_BRUSHSIDES         15
  278 #define LUMP_POP                        16
  279 #define LUMP_AREAS                      17
  280 #define LUMP_AREAPORTALS        18
  281 #define HEADER_LUMPS            19
  282 
  283 typedef struct
  284 {
  285         int                     ident;
  286         int                     version;        
  287         lump_t          lumps[HEADER_LUMPS];
  288 } dheader_t;
  289 
  290 typedef struct
  291 {
  292         float           mins[3], maxs[3];
  293         float           origin[3];              // for sounds or lights
  294         int                     headnode;
  295         int                     firstface, numfaces;    // submodels just draw faces
  296                                                                                 // without walking the bsp tree
  297 } dmodel_t;
  298 
  299 
  300 typedef struct
  301 {
  302         float   point[3];
  303 } dvertex_t;
  304 
  305 
  306 // 0-2 are axial planes
  307 #define PLANE_X                 0
  308 #define PLANE_Y                 1
  309 #define PLANE_Z                 2
  310 
  311 // 3-5 are non-axial planes snapped to the nearest
  312 #define PLANE_ANYX              3
  313 #define PLANE_ANYY              4
  314 #define PLANE_ANYZ              5
  315 
  316 // planes (x&~1) and (x&~1)+1 are always opposites
  317 
  318 typedef struct
  319 {
  320         float   normal[3];
  321         float   dist;
  322         int             type;           // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
  323 } dplane_t;
  324 
  325 
  326 // contents flags are seperate bits
  327 // a given brush can contribute multiple content bits
  328 // multiple brushes can be in a single leaf
  329 
  330 // these definitions also need to be in q_shared.h!
  331 
  332 // lower bits are stronger, and will eat weaker brushes completely
  333 #define CONTENTS_SOLID                  1               // an eye is never valid in a solid
  334 #define CONTENTS_WINDOW                 2               // translucent, but not watery
  335 #define CONTENTS_AUX                    4
  336 #define CONTENTS_LAVA                   8
  337 #define CONTENTS_SLIME                  16
  338 #define CONTENTS_WATER                  32
  339 #define CONTENTS_MIST                   64
  340 #define LAST_VISIBLE_CONTENTS   64
  341 
  342 // remaining contents are non-visible, and don't eat brushes
  343 
  344 #define CONTENTS_AREAPORTAL             0x8000
  345 
  346 #define CONTENTS_PLAYERCLIP             0x10000
  347 #define CONTENTS_MONSTERCLIP    0x20000
  348 
  349 // currents can be added to any other contents, and may be mixed
  350 #define CONTENTS_CURRENT_0              0x40000
  351 #define CONTENTS_CURRENT_90             0x80000
  352 #define CONTENTS_CURRENT_180    0x100000
  353 #define CONTENTS_CURRENT_270    0x200000
  354 #define CONTENTS_CURRENT_UP             0x400000
  355 #define CONTENTS_CURRENT_DOWN   0x800000
  356 
  357 #define CONTENTS_ORIGIN                 0x1000000       // removed before bsping an entity
  358 
  359 #define CONTENTS_MONSTER                0x2000000       // should never be on a brush, only in game
  360 #define CONTENTS_DEADMONSTER    0x4000000
  361 #define CONTENTS_DETAIL                 0x8000000       // brushes to be added after vis leafs
  362 #define CONTENTS_TRANSLUCENT    0x10000000      // auto set if any surface has trans
  363 #define CONTENTS_LADDER                 0x20000000
  364 
  365 
  366 
  367 #define SURF_LIGHT              0x1             // value will hold the light strength
  368 
  369 #define SURF_SLICK              0x2             // effects game physics
  370 
  371 #define SURF_SKY                0x4             // don't draw, but add to skybox
  372 #define SURF_WARP               0x8             // turbulent water warp
  373 #define SURF_TRANS33    0x10
  374 #define SURF_TRANS66    0x20
  375 #define SURF_FLOWING    0x40    // scroll towards angle
  376 #define SURF_NODRAW             0x80    // don't bother referencing the texture
  377 
  378 
  379 
  380 
  381 typedef struct
  382 {
  383         int                     planenum;
  384         int                     children[2];    // negative numbers are -(leafs+1), not nodes
  385         short           mins[3];                // for frustom culling
  386         short           maxs[3];
  387         unsigned short  firstface;
  388         unsigned short  numfaces;       // counting both sides
  389 } dnode_t;
  390 
  391 
  392 typedef struct texinfo_s
  393 {
  394         float           vecs[2][4];             // [s/t][xyz offset]
  395         int                     flags;                  // miptex flags + overrides
  396         int                     value;                  // light emission, etc
  397         char            texture[32];    // texture name (textures/*.wal)
  398         int                     nexttexinfo;    // for animations, -1 = end of chain
  399 } texinfo_t;
  400 
  401 
  402 // note that edge 0 is never used, because negative edge nums are used for
  403 // counterclockwise use of the edge in a face
  404 typedef struct
  405 {
  406         unsigned short  v[2];           // vertex numbers
  407 } dedge_t;
  408 
  409 #define MAXLIGHTMAPS    4
  410 typedef struct
  411 {
  412         unsigned short  planenum;
  413         short           side;
  414 
  415         int                     firstedge;              // we must support > 64k edges
  416         short           numedges;       
  417         short           texinfo;
  418 
  419 // lighting info
  420         byte            styles[MAXLIGHTMAPS];
  421         int                     lightofs;               // start of [numstyles*surfsize] samples
  422 } dface_t;
  423 
  424 typedef struct
  425 {
  426         int                             contents;                       // OR of all brushes (not needed?)
  427 
  428         short                   cluster;
  429         short                   area;
  430 
  431         short                   mins[3];                        // for frustum culling
  432         short                   maxs[3];
  433 
  434         unsigned short  firstleafface;
  435         unsigned short  numleaffaces;
  436 
  437         unsigned short  firstleafbrush;
  438         unsigned short  numleafbrushes;
  439 } dleaf_t;
  440 
  441 typedef struct
  442 {
  443         unsigned short  planenum;               // facing out of the leaf
  444         short   texinfo;
  445 } dbrushside_t;
  446 
  447 typedef struct
  448 {
  449         int                     firstside;
  450         int                     numsides;
  451         int                     contents;
  452 } dbrush_t;
  453 
  454 #define ANGLE_UP        -1
  455 #define ANGLE_DOWN      -2
  456 
  457 
  458 // the visibility lump consists of a header with a count, then
  459 // byte offsets for the PVS and PHS of each cluster, then the raw
  460 // compressed bit vectors
  461 #define DVIS_PVS        0
  462 #define DVIS_PHS        1
  463 typedef struct
  464 {
  465         int                     numclusters;
  466         int                     bitofs[8][2];   // bitofs[numclusters][2]
  467 } dvis_t;
  468 
  469 // each area has a list of portals that lead into other areas
  470 // when portals are closed, other areas may not be visible or
  471 // hearable even if the vis info says that it should be
  472 typedef struct
  473 {
  474         int             portalnum;
  475         int             otherarea;
  476 } dareaportal_t;
  477 
  478 typedef struct
  479 {
  480         int             numareaportals;
  481         int             firstareaportal;
  482 } darea_t;
  483