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_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 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 (const char *name, qboolean crash); 424 void *Mod_Extradata (model_t *mod); // handles caching 425 void Mod_TouchModel (const 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