1/* 2Copyright (C) 1996-1997 Id Software, Inc. 3 4This program is free software; you can redistribute it and/or 5modify it under the terms of the GNU General Public License 6as published by the Free Software Foundation; either version 2 7of the License, or (at your option) any later version. 8 9This program is distributed in the hope that it will be useful, 10but WITHOUT ANY WARRANTY; without even the implied warranty of 11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 13See the GNU General Public License for more details. 14 15You should have received a copy of the GNU General Public License 16along with this program; if not, write to the Free Software 17Foundation, 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 29d*_t structures are on-disk representations 30m*_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 45BRUSH 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 !!! 55typedef 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 !!! 67typedef 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 76typedef 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 !!! 99typedef struct 100{ 101 unsigned short v[2]; 102 unsigned int cachededgeoffset; 103} medge_t; 104 105typedef 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 115typedef 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 124typedef 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 155typedef 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 175typedef 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 !!! 196typedef 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 209SPRITE MODELS 210 211============================================================================== 212*/ 213 214 215// FIXME: shorten these? 216typedef struct mspriteframe_s 217{ 218 int width; 219 int height; 220 float up, down, left, right; 221 int gl_texturenum; 222} mspriteframe_t; 223 224typedef struct 225{ 226 int numframes; 227 float *intervals; 228 mspriteframe_t *frames[1]; 229} mspritegroup_t; 230 231typedef struct 232{ 233 spriteframetype_t type; 234 mspriteframe_t *frameptr; 235} mspriteframedesc_t; 236 237typedef 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 252ALIAS MODELS 253 254Alias models are position independent, so the cache manager can move them. 255============================================================================== 256*/ 257 258typedef 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 269typedef struct 270{ 271 trivertx_t bboxmin; 272 trivertx_t bboxmax; 273 int frame; 274} maliasgroupframedesc_t; 275 276typedef 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 !!! 284typedef struct mtriangle_s { 285 int facesfront; 286 int vertindex[3]; 287} mtriangle_t; 288 289 290#define MAX_SKINS 32 291typedef 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 320extern aliashdr_t *pheader; 321extern stvert_t stverts[MAXALIASVERTS]; 322extern mtriangle_t triangles[MAXALIASTRIS]; 323extern trivertx_t *poseverts[MAXALIASFRAMES]; 324 325//=================================================================== 326 327// 328// Whole model 329// 330 331typedef enum {mod_brush, mod_sprite, mod_alias, modtype_t_max = 1 << 30} 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 342typedef 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 421void Mod_Init (void); 422void Mod_ClearAll (void); 423model_t *Mod_ForName (const char *name, qboolean crash); 424void *Mod_Extradata (model_t *mod); // handles caching 425void Mod_TouchModel (const char *name); 426 427mleaf_t *Mod_PointInLeaf (float *p, model_t *model); 428byte *Mod_LeafPVS (mleaf_t *leaf, model_t *model); 429 430#endif // __MODEL__ 431