Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.