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