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