home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / client / model.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-17  |  8.5 KB  |  403 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. #ifndef __MODEL__
  22. #define __MODEL__
  23.  
  24. #include "modelgen.h"
  25. #include "spritegn.h"
  26.  
  27. /*
  28.  
  29. d*_t structures are on-disk representations
  30. m*_t structures are in-memory
  31.  
  32. */
  33.  
  34. // entity effects
  35.  
  36. #define EF_BRIGHTFIELD      1
  37. #define EF_MUZZLEFLASH      2
  38. #define EF_BRIGHTLIGHT      4
  39. #define EF_DIMLIGHT       8
  40. #define EF_FLAG1        16
  41. #define EF_FLAG2        32
  42. #define EF_BLUE         64
  43. #define EF_RED          128
  44.  
  45. /*
  46. ==============================================================================
  47.  
  48. BRUSH MODELS
  49.  
  50. ==============================================================================
  51. */
  52.  
  53.  
  54. //
  55. // in memory representation
  56. //
  57. // !!! if this is changed, it must be changed in asm_draw.h too !!!
  58. typedef struct
  59. {
  60.   vec3_t    position;
  61. } mvertex_t;
  62.  
  63. #define SIDE_FRONT  0
  64. #define SIDE_BACK 1
  65. #define SIDE_ON   2
  66.  
  67.  
  68. // plane_t structure
  69. // !!! if this is changed, it must be changed in asm_i386.h too !!!
  70. typedef struct mplane_s
  71. {
  72.   vec3_t  normal;
  73.   float dist;
  74.   byte  type;     // for texture axis selection and fast side tests
  75.   byte  signbits;   // signx + signy<<1 + signz<<1
  76.   byte  pad[2];
  77. } mplane_t;
  78.  
  79. typedef struct texture_s
  80. {
  81.   char    name[16];
  82.   unsigned  width, height;
  83.   int     anim_total;       // total tenths in sequence ( 0 = no)
  84.   int     anim_min, anim_max;   // time for this frame min <=time< max
  85.   struct texture_s *anim_next;    // in the animation sequence
  86.   struct texture_s *alternate_anims;  // bmodels in frmae 1 use these
  87.   unsigned  offsets[MIPLEVELS];   // four mip maps stored
  88. } texture_t;
  89.  
  90.  
  91. #define SURF_PLANEBACK    2
  92. #define SURF_DRAWSKY    4
  93. #define SURF_DRAWSPRITE   8
  94. #define SURF_DRAWTURB   0x10
  95. #define SURF_DRAWTILED    0x20
  96. #define SURF_DRAWBACKGROUND 0x40
  97.  
  98. // !!! if this is changed, it must be changed in asm_draw.h too !!!
  99. typedef struct
  100. {
  101.   unsigned short  v[2];
  102.   unsigned int  cachededgeoffset;
  103. } medge_t;
  104.  
  105. typedef struct
  106. {
  107.   float   vecs[2][4];
  108.   float   mipadjust;
  109.   texture_t *texture;
  110.   int     flags;
  111. } mtexinfo_t;
  112.  
  113. typedef struct msurface_s
  114. {
  115.   int     visframe;   // should be drawn when node is crossed
  116.  
  117.   int     dlightframe;
  118.   int     dlightbits;
  119.  
  120.   mplane_t  *plane;
  121.   int     flags;
  122.  
  123.   int     firstedge;  // look up in model->surfedges[], negative numbers
  124.   int     numedges; // are backwards edges
  125.   
  126. // surface generation data
  127.   struct surfcache_s  *cachespots[MIPLEVELS];
  128.  
  129.   short   texturemins[2];
  130.   short   extents[2];
  131.  
  132.   mtexinfo_t  *texinfo;
  133.   
  134. // lighting info
  135.   byte    styles[MAXLIGHTMAPS];
  136.   byte    *samples;   // [numstyles*surfsize]
  137. } msurface_t;
  138.  
  139. typedef struct mnode_s
  140. {
  141. // common with leaf
  142.   int     contents;   // 0, to differentiate from leafs
  143.   int     visframe;   // node needs to be traversed if current
  144.   
  145.   short   minmaxs[6];   // for bounding box culling
  146.  
  147.   struct mnode_s  *parent;
  148.  
  149. // node specific
  150.   mplane_t  *plane;
  151.   struct mnode_s  *children[2]; 
  152.  
  153.   unsigned short    firstsurface;
  154.   unsigned short    numsurfaces;
  155. } mnode_t;
  156.  
  157.  
  158.  
  159. typedef struct mleaf_s
  160. {
  161. // common with node
  162.   int     contents;   // wil be a negative contents number
  163.   int     visframe;   // node needs to be traversed if current
  164.  
  165.   short   minmaxs[6];   // for bounding box culling
  166.  
  167.   struct mnode_s  *parent;
  168.  
  169. // leaf specific
  170.   byte    *compressed_vis;
  171.   struct efrag_s  *efrags;
  172.  
  173.   msurface_t  **firstmarksurface;
  174.   int     nummarksurfaces;
  175.   int     key;      // BSP sequence number for leaf's contents
  176.   byte    ambient_sound_level[NUM_AMBIENTS];
  177. } mleaf_t;
  178.  
  179. // !!! if this is changed, it must be changed in asm_i386.h too !!!
  180. typedef struct
  181. {
  182.   dclipnode_t *clipnodes;
  183.   mplane_t  *planes;
  184.   int     firstclipnode;
  185.   int     lastclipnode;
  186.   vec3_t    clip_mins;
  187.   vec3_t    clip_maxs;
  188. } hull_t;
  189.  
  190. /*
  191. ==============================================================================
  192.  
  193. SPRITE MODELS
  194.  
  195. ==============================================================================
  196. */
  197.  
  198.  
  199. // FIXME: shorten these?
  200. typedef struct mspriteframe_s
  201. {
  202.   int   width;
  203.   int   height;
  204.   void  *pcachespot;      // remove?
  205.   float up, down, left, right;
  206.   byte  pixels[4];
  207. } mspriteframe_t;
  208.  
  209. typedef struct
  210. {
  211.   int       numframes;
  212.   float     *intervals;
  213.   mspriteframe_t  *frames[1];
  214. } mspritegroup_t;
  215.  
  216. typedef struct
  217. {
  218.   spriteframetype_t type;
  219.   mspriteframe_t    *frameptr;
  220. } mspriteframedesc_t;
  221.  
  222. typedef struct
  223. {
  224.   int         type;
  225.   int         maxwidth;
  226.   int         maxheight;
  227.   int         numframes;
  228.   float       beamlength;   // remove?
  229.   void        *cachespot;   // remove?
  230.   mspriteframedesc_t  frames[1];
  231. } msprite_t;
  232.  
  233.  
  234. /*
  235. ==============================================================================
  236.  
  237. ALIAS MODELS
  238.  
  239. Alias models are position independent, so the cache manager can move them.
  240. ==============================================================================
  241. */
  242.  
  243. typedef struct
  244. {
  245.   aliasframetype_t  type;
  246.   trivertx_t      bboxmin;
  247.   trivertx_t      bboxmax;
  248.   int         frame;
  249.   char        name[16];
  250. } maliasframedesc_t;
  251.  
  252. typedef struct
  253. {
  254.   aliasskintype_t   type;
  255.   void        *pcachespot;
  256.   int         skin;
  257. } maliasskindesc_t;
  258.  
  259. typedef struct
  260. {
  261.   trivertx_t      bboxmin;
  262.   trivertx_t      bboxmax;
  263.   int         frame;
  264. } maliasgroupframedesc_t;
  265.  
  266. typedef struct
  267. {
  268.   int           numframes;
  269.   int           intervals;
  270.   maliasgroupframedesc_t  frames[1];
  271. } maliasgroup_t;
  272.  
  273. typedef struct
  274. {
  275.   int         numskins;
  276.   int         intervals;
  277.   maliasskindesc_t  skindescs[1];
  278. } maliasskingroup_t;
  279.  
  280. // !!! if this is changed, it must be changed in asm_draw.h too !!!
  281. typedef struct mtriangle_s {
  282.   int         facesfront;
  283.   int         vertindex[3];
  284. } mtriangle_t;
  285.  
  286. typedef struct {
  287.   int         model;
  288.   int         stverts;
  289.   int         skindesc;
  290.   int         triangles;
  291.   maliasframedesc_t frames[1];
  292. } aliashdr_t;
  293.  
  294. //===================================================================
  295.  
  296. //
  297. // Whole model
  298. //
  299.  
  300. typedef enum {mod_brush, mod_sprite, mod_alias} modtype_t;
  301.  
  302. #define EF_ROCKET 1     // leave a trail
  303. #define EF_GRENADE  2     // leave a trail
  304. #define EF_GIB    4     // leave a trail
  305. #define EF_ROTATE 8     // rotate (bonus items)
  306. #define EF_TRACER 16      // green split trail
  307. #define EF_ZOMGIB 32      // small blood trail
  308. #define EF_TRACER2  64      // orange split trail + rotate
  309. #define EF_TRACER3  128     // purple trail
  310.  
  311. typedef struct model_s
  312. {
  313.   char    name[MAX_QPATH];
  314.   qboolean  needload;   // bmodels and sprites don't cache normally
  315.  
  316.   modtype_t type;
  317.   int     numframes;
  318.   synctype_t  synctype;
  319.   
  320.   int     flags;
  321.  
  322. //
  323. // volume occupied by the model graphics
  324. //    
  325.   vec3_t    mins, maxs;
  326.   float   radius;
  327.  
  328. //
  329. // solid volume for clipping (sent from server)
  330. //
  331.   qboolean  clipbox;
  332.   vec3_t    clipmins, clipmaxs;
  333.  
  334. //
  335. // brush model
  336. //
  337.   int     firstmodelsurface, nummodelsurfaces;
  338.  
  339.   int     numsubmodels;
  340.   dmodel_t  *submodels;
  341.  
  342.   int     numplanes;
  343.   mplane_t  *planes;
  344.  
  345.   int     numleafs;   // number of visible leafs, not counting 0
  346.   mleaf_t   *leafs;
  347.  
  348.   int     numvertexes;
  349.   mvertex_t *vertexes;
  350.  
  351.   int     numedges;
  352.   medge_t   *edges;
  353.  
  354.   int     numnodes;
  355.   mnode_t   *nodes;
  356.  
  357.   int     numtexinfo;
  358.   mtexinfo_t  *texinfo;
  359.  
  360.   int     numsurfaces;
  361.   msurface_t  *surfaces;
  362.  
  363.   int     numsurfedges;
  364.   int     *surfedges;
  365.  
  366.   int     numclipnodes;
  367.   dclipnode_t *clipnodes;
  368.  
  369.   int     nummarksurfaces;
  370.   msurface_t  **marksurfaces;
  371.  
  372.   hull_t    hulls[MAX_MAP_HULLS];
  373.  
  374.   int     numtextures;
  375.   texture_t **textures;
  376.  
  377.   byte    *visdata;
  378.   byte    *lightdata;
  379.   char    *entities;
  380.  
  381.   unsigned  checksum;   // for world models only
  382.   unsigned  checksum2;    // for world models only
  383.  
  384. //
  385. // additional model data
  386. //
  387.   cache_user_t  cache;    // only access through Mod_Extradata
  388.  
  389. } model_t;
  390.  
  391. //============================================================================
  392.  
  393. void  Mod_Init (void);
  394. void  Mod_ClearAll (void);
  395. model_t *Mod_ForName (char *name, qboolean crash);
  396. void  *Mod_Extradata (model_t *mod);  // handles caching
  397. void  Mod_TouchModel (char *name);
  398.  
  399. mleaf_t *Mod_PointInLeaf (float *p, model_t *model);
  400. byte  *Mod_LeafPVS (mleaf_t *leaf, model_t *model);
  401.  
  402. #endif  // __MODEL__
  403.