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