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