home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 14 / MA_Cover_14.iso / source / c / q1source_amy / qw / client / gl_model.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-12-21  |  9.4 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.