home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / bspfile.h < prev    next >
C/C++ Source or Header  |  2000-06-17  |  7KB  |  325 lines

  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.  
  22. // upper design bounds
  23.  
  24. #define MAX_MAP_HULLS   4
  25.  
  26. #define MAX_MAP_MODELS    256
  27. #define MAX_MAP_BRUSHES   4096
  28. #define MAX_MAP_ENTITIES  1024
  29. #define MAX_MAP_ENTSTRING 65536
  30.  
  31. #define MAX_MAP_PLANES    32767
  32. #define MAX_MAP_NODES   32767   // because negative shorts are contents
  33. #define MAX_MAP_CLIPNODES 32767   //
  34. #define MAX_MAP_LEAFS   8192
  35. #define MAX_MAP_VERTS   65535
  36. #define MAX_MAP_FACES   65535
  37. #define MAX_MAP_MARKSURFACES 65535
  38. #define MAX_MAP_TEXINFO   4096
  39. #define MAX_MAP_EDGES   256000
  40. #define MAX_MAP_SURFEDGES 512000
  41. #define MAX_MAP_TEXTURES  512
  42. #define MAX_MAP_MIPTEX    0x200000
  43. #define MAX_MAP_LIGHTING  0x100000
  44. #define MAX_MAP_VISIBILITY  0x100000
  45.  
  46. #define MAX_MAP_PORTALS   65536
  47.  
  48. // key / value pair sizes
  49.  
  50. #define MAX_KEY   32
  51. #define MAX_VALUE 1024
  52.  
  53. //=============================================================================
  54.  
  55.  
  56. #define BSPVERSION  29
  57. #define TOOLVERSION 2
  58.  
  59. typedef struct
  60. {
  61.   int   fileofs, filelen;
  62. } lump_t;
  63.  
  64. #define LUMP_ENTITIES 0
  65. #define LUMP_PLANES   1
  66. #define LUMP_TEXTURES 2
  67. #define LUMP_VERTEXES 3
  68. #define LUMP_VISIBILITY 4
  69. #define LUMP_NODES    5
  70. #define LUMP_TEXINFO  6
  71. #define LUMP_FACES    7
  72. #define LUMP_LIGHTING 8
  73. #define LUMP_CLIPNODES  9
  74. #define LUMP_LEAFS    10
  75. #define LUMP_MARKSURFACES 11
  76. #define LUMP_EDGES    12
  77. #define LUMP_SURFEDGES  13
  78. #define LUMP_MODELS   14
  79.  
  80. #define HEADER_LUMPS  15
  81.  
  82. typedef struct
  83. {
  84.   float   mins[3], maxs[3];
  85.   float   origin[3];
  86.   int     headnode[MAX_MAP_HULLS];
  87.   int     visleafs;   // not including the solid leaf 0
  88.   int     firstface, numfaces;
  89. } dmodel_t;
  90.  
  91. typedef struct
  92. {
  93.   int     version;  
  94.   lump_t    lumps[HEADER_LUMPS];
  95. } dheader_t;
  96.  
  97. typedef struct
  98. {
  99.   int     nummiptex;
  100.   int     dataofs[4];   // [nummiptex]
  101. } dmiptexlump_t;
  102.  
  103. #define MIPLEVELS 4
  104. typedef struct miptex_s
  105. {
  106.   char    name[16];
  107.   unsigned  width, height;
  108.   unsigned  offsets[MIPLEVELS];   // four mip maps stored
  109. } miptex_t;
  110.  
  111.  
  112. typedef struct
  113. {
  114.   float point[3];
  115. } dvertex_t;
  116.  
  117.  
  118. // 0-2 are axial planes
  119. #define PLANE_X     0
  120. #define PLANE_Y     1
  121. #define PLANE_Z     2
  122.  
  123. // 3-5 are non-axial planes snapped to the nearest
  124. #define PLANE_ANYX    3
  125. #define PLANE_ANYY    4
  126. #define PLANE_ANYZ    5
  127.  
  128. typedef struct
  129. {
  130.   float normal[3];
  131.   float dist;
  132.   int   type;   // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate
  133. } dplane_t;
  134.  
  135.  
  136.  
  137. #define CONTENTS_EMPTY    -1
  138. #define CONTENTS_SOLID    -2
  139. #define CONTENTS_WATER    -3
  140. #define CONTENTS_SLIME    -4
  141. #define CONTENTS_LAVA   -5
  142. #define CONTENTS_SKY    -6
  143. #define CONTENTS_ORIGIN   -7    // removed at csg time
  144. #define CONTENTS_CLIP   -8    // changed to contents_solid
  145.  
  146. #define CONTENTS_CURRENT_0    -9
  147. #define CONTENTS_CURRENT_90   -10
  148. #define CONTENTS_CURRENT_180  -11
  149. #define CONTENTS_CURRENT_270  -12
  150. #define CONTENTS_CURRENT_UP   -13
  151. #define CONTENTS_CURRENT_DOWN -14
  152.  
  153.  
  154. // !!! if this is changed, it must be changed in asm_i386.h too !!!
  155. typedef struct
  156. {
  157.   int     planenum;
  158.   short   children[2];  // negative numbers are -(leafs+1), not nodes
  159.   short   mins[3];    // for sphere culling
  160.   short   maxs[3];
  161.   unsigned short  firstface;
  162.   unsigned short  numfaces; // counting both sides
  163. } dnode_t;
  164.  
  165. typedef struct
  166. {
  167.   int     planenum;
  168.   short   children[2];  // negative numbers are contents
  169. } dclipnode_t;
  170.  
  171.  
  172. typedef struct texinfo_s
  173. {
  174.   float   vecs[2][4];   // [s/t][xyz offset]
  175.   int     miptex;
  176.   int     flags;
  177. } texinfo_t;
  178. #define TEX_SPECIAL   1   // sky or slime, no lightmap or 256 subdivision
  179.  
  180. // note that edge 0 is never used, because negative edge nums are used for
  181. // counterclockwise use of the edge in a face
  182. typedef struct
  183. {
  184.   unsigned short  v[2];   // vertex numbers
  185. } dedge_t;
  186.  
  187. #define MAXLIGHTMAPS  4
  188. typedef struct
  189. {
  190.   short   planenum;
  191.   short   side;
  192.  
  193.   int     firstedge;    // we must support > 64k edges
  194.   short   numedges; 
  195.   short   texinfo;
  196.  
  197. // lighting info
  198.   byte    styles[MAXLIGHTMAPS];
  199.   int     lightofs;   // start of [numstyles*surfsize] samples
  200. } dface_t;
  201.  
  202.  
  203.  
  204. #define AMBIENT_WATER 0
  205. #define AMBIENT_SKY   1
  206. #define AMBIENT_SLIME 2
  207. #define AMBIENT_LAVA  3
  208.  
  209. #define NUM_AMBIENTS      4   // automatic ambient sounds
  210.  
  211. // leaf 0 is the generic CONTENTS_SOLID leaf, used for all solid areas
  212. // all other leafs need visibility info
  213. typedef struct
  214. {
  215.   int     contents;
  216.   int     visofs;       // -1 = no visibility info
  217.  
  218.   short   mins[3];      // for frustum culling
  219.   short   maxs[3];
  220.  
  221.   unsigned short    firstmarksurface;
  222.   unsigned short    nummarksurfaces;
  223.  
  224.   byte    ambient_level[NUM_AMBIENTS];
  225. } dleaf_t;
  226.  
  227.  
  228. //============================================================================
  229.  
  230. #ifndef QUAKE_GAME
  231.  
  232. #define ANGLE_UP  -1
  233. #define ANGLE_DOWN  -2
  234.  
  235.  
  236. // the utilities get to be lazy and just use large static arrays
  237.  
  238. extern  int     nummodels;
  239. extern  dmodel_t  dmodels[MAX_MAP_MODELS];
  240.  
  241. extern  int     visdatasize;
  242. extern  byte    dvisdata[MAX_MAP_VISIBILITY];
  243.  
  244. extern  int     lightdatasize;
  245. extern  byte    dlightdata[MAX_MAP_LIGHTING];
  246.  
  247. extern  int     texdatasize;
  248. extern  byte    dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
  249.  
  250. extern  int     entdatasize;
  251. extern  char    dentdata[MAX_MAP_ENTSTRING];
  252.  
  253. extern  int     numleafs;
  254. extern  dleaf_t   dleafs[MAX_MAP_LEAFS];
  255.  
  256. extern  int     numplanes;
  257. extern  dplane_t  dplanes[MAX_MAP_PLANES];
  258.  
  259. extern  int     numvertexes;
  260. extern  dvertex_t dvertexes[MAX_MAP_VERTS];
  261.  
  262. extern  int     numnodes;
  263. extern  dnode_t   dnodes[MAX_MAP_NODES];
  264.  
  265. extern  int     numtexinfo;
  266. extern  texinfo_t texinfo[MAX_MAP_TEXINFO];
  267.  
  268. extern  int     numfaces;
  269. extern  dface_t   dfaces[MAX_MAP_FACES];
  270.  
  271. extern  int     numclipnodes;
  272. extern  dclipnode_t dclipnodes[MAX_MAP_CLIPNODES];
  273.  
  274. extern  int     numedges;
  275. extern  dedge_t   dedges[MAX_MAP_EDGES];
  276.  
  277. extern  int     nummarksurfaces;
  278. extern  unsigned short  dmarksurfaces[MAX_MAP_MARKSURFACES];
  279.  
  280. extern  int     numsurfedges;
  281. extern  int     dsurfedges[MAX_MAP_SURFEDGES];
  282.  
  283.  
  284. void DecompressVis (byte *in, byte *decompressed);
  285. int CompressVis (byte *vis, byte *dest);
  286.  
  287. void  LoadBSPFile (char *filename);
  288. void  WriteBSPFile (char *filename);
  289. void  PrintBSPFileSizes (void);
  290.  
  291. //===============
  292.  
  293.  
  294. typedef struct epair_s
  295. {
  296.   struct epair_s  *next;
  297.   char  *key;
  298.   char  *value;
  299. } epair_t;
  300.  
  301. typedef struct
  302. {
  303.   vec3_t    origin;
  304.   int     firstbrush;
  305.   int     numbrushes;
  306.   epair_t   *epairs;
  307. } entity_t;
  308.  
  309. extern  int     num_entities;
  310. extern  entity_t  entities[MAX_MAP_ENTITIES];
  311.  
  312. void  ParseEntities (void);
  313. void  UnparseEntities (void);
  314.  
  315. void  SetKeyValue (entity_t *ent, char *key, char *value);
  316. char  *ValueForKey (entity_t *ent, char *key);
  317. // will return "" if not present
  318.  
  319. vec_t FloatForKey (entity_t *ent, char *key);
  320. void  GetVectorForKey (entity_t *ent, char *key, vec3_t vec);
  321.  
  322. epair_t *ParseEpair (void);
  323.  
  324. #endif
  325.