model.h revision 9fd67c44777b350dc56f3e70c88963b0d966ffc7
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/* 35============================================================================== 36 37BRUSH MODELS 38 39============================================================================== 40*/ 41 42 43// 44// in memory representation 45// 46// !!! if this is changed, it must be changed in asm_draw.h too !!! 47typedef struct 48{ 49 vec3_t position; 50} mvertex_t; 51 52#define SIDE_FRONT 0 53#define SIDE_BACK 1 54#define SIDE_ON 2 55 56 57// plane_t structure 58// !!! if this is changed, it must be changed in asm_i386.h too !!! 59typedef struct mplane_s 60{ 61 vec3_t normal; 62 float dist; 63 byte type; // for texture axis selection and fast side tests 64 byte signbits; // signx + signy<<1 + signz<<1 65 byte pad[2]; 66} mplane_t; 67 68typedef struct texture_s 69{ 70 char name[16]; 71 unsigned width, height; 72 int anim_total; // total tenths in sequence ( 0 = no) 73 int anim_min, anim_max; // time for this frame min <=time< max 74 struct texture_s *anim_next; // in the animation sequence 75 struct texture_s *alternate_anims; // bmodels in frmae 1 use these 76 unsigned offsets[MIPLEVELS]; // four mip maps stored 77} texture_t; 78 79 80#define SURF_PLANEBACK 2 81#define SURF_DRAWSKY 4 82#define SURF_DRAWSPRITE 8 83#define SURF_DRAWTURB 0x10 84#define SURF_DRAWTILED 0x20 85#define SURF_DRAWBACKGROUND 0x40 86 87// !!! if this is changed, it must be changed in asm_draw.h too !!! 88typedef struct 89{ 90 unsigned short v[2]; 91 unsigned int cachededgeoffset; 92} medge_t; 93 94typedef struct 95{ 96 float vecs[2][4]; 97 float mipadjust; 98 texture_t *texture; 99 int flags; 100} mtexinfo_t; 101 102typedef struct msurface_s 103{ 104 int visframe; // should be drawn when node is crossed 105 106 int dlightframe; 107 int dlightbits; 108 109 mplane_t *plane; 110 int flags; 111 112 int firstedge; // look up in model->surfedges[], negative numbers 113 int numedges; // are backwards edges 114 115// surface generation data 116 struct surfcache_s *cachespots[MIPLEVELS]; 117 118 short texturemins[2]; 119 short extents[2]; 120 121 mtexinfo_t *texinfo; 122 123// lighting info 124 byte styles[MAXLIGHTMAPS]; 125 byte *samples; // [numstyles*surfsize] 126} msurface_t; 127 128typedef struct mnode_s 129{ 130// common with leaf 131 int contents; // 0, to differentiate from leafs 132 int visframe; // node needs to be traversed if current 133 134 short minmaxs[6]; // for bounding box culling 135 136 struct mnode_s *parent; 137 138// node specific 139 mplane_t *plane; 140 struct mnode_s *children[2]; 141 142 unsigned short firstsurface; 143 unsigned short numsurfaces; 144} mnode_t; 145 146 147 148typedef struct mleaf_s 149{ 150// common with node 151 int contents; // wil be a negative contents number 152 int visframe; // node needs to be traversed if current 153 154 short minmaxs[6]; // for bounding box culling 155 156 struct mnode_s *parent; 157 158// leaf specific 159 byte *compressed_vis; 160 efrag_t *efrags; 161 162 msurface_t **firstmarksurface; 163 int nummarksurfaces; 164 int key; // BSP sequence number for leaf's contents 165 byte ambient_sound_level[NUM_AMBIENTS]; 166} mleaf_t; 167 168// !!! if this is changed, it must be changed in asm_i386.h too !!! 169typedef struct 170{ 171 dclipnode_t *clipnodes; 172 mplane_t *planes; 173 int firstclipnode; 174 int lastclipnode; 175 vec3_t clip_mins; 176 vec3_t clip_maxs; 177} hull_t; 178 179/* 180============================================================================== 181 182SPRITE MODELS 183 184============================================================================== 185*/ 186 187 188// FIXME: shorten these? 189typedef struct mspriteframe_s 190{ 191 int width; 192 int height; 193 void *pcachespot; // remove? 194 float up, down, left, right; 195 byte pixels[4]; 196} mspriteframe_t; 197 198typedef struct 199{ 200 int numframes; 201 float *intervals; 202 mspriteframe_t *frames[1]; 203} mspritegroup_t; 204 205typedef struct 206{ 207 spriteframetype_t type; 208 mspriteframe_t *frameptr; 209} mspriteframedesc_t; 210 211typedef struct 212{ 213 int type; 214 int maxwidth; 215 int maxheight; 216 int numframes; 217 float beamlength; // remove? 218 void *cachespot; // remove? 219 mspriteframedesc_t frames[1]; 220} msprite_t; 221 222 223/* 224============================================================================== 225 226ALIAS MODELS 227 228Alias models are position independent, so the cache manager can move them. 229============================================================================== 230*/ 231 232typedef struct 233{ 234 aliasframetype_t type; 235 trivertx_t bboxmin; 236 trivertx_t bboxmax; 237 int frame; 238 char name[16]; 239} maliasframedesc_t; 240 241typedef struct 242{ 243 aliasskintype_t type; 244 void *pcachespot; 245 int skin; 246} maliasskindesc_t; 247 248typedef struct 249{ 250 trivertx_t bboxmin; 251 trivertx_t bboxmax; 252 int frame; 253} maliasgroupframedesc_t; 254 255typedef struct 256{ 257 int numframes; 258 int intervals; 259 maliasgroupframedesc_t frames[1]; 260} maliasgroup_t; 261 262typedef struct 263{ 264 int numskins; 265 int intervals; 266 maliasskindesc_t skindescs[1]; 267} maliasskingroup_t; 268 269// !!! if this is changed, it must be changed in asm_draw.h too !!! 270typedef struct mtriangle_s { 271 int facesfront; 272 int vertindex[3]; 273} mtriangle_t; 274 275typedef struct { 276 int model; 277 int stverts; 278 int skindesc; 279 int triangles; 280 maliasframedesc_t frames[1]; 281} aliashdr_t; 282 283//=================================================================== 284 285// 286// Whole model 287// 288 289typedef enum {mod_brush, mod_sprite, mod_alias} modtype_t; 290 291#define EF_ROCKET 1 // leave a trail 292#define EF_GRENADE 2 // leave a trail 293#define EF_GIB 4 // leave a trail 294#define EF_ROTATE 8 // rotate (bonus items) 295#define EF_TRACER 16 // green split trail 296#define EF_ZOMGIB 32 // small blood trail 297#define EF_TRACER2 64 // orange split trail + rotate 298#define EF_TRACER3 128 // purple trail 299 300typedef struct model_s 301{ 302 char name[MAX_QPATH]; 303 qboolean needload; // bmodels and sprites don't cache normally 304 305 modtype_t type; 306 int numframes; 307 synctype_t synctype; 308 309 int flags; 310 311// 312// volume occupied by the model 313// 314 vec3_t mins, maxs; 315 float radius; 316 317// 318// brush model 319// 320 int firstmodelsurface, nummodelsurfaces; 321 322 int numsubmodels; 323 dmodel_t *submodels; 324 325 int numplanes; 326 mplane_t *planes; 327 328 int numleafs; // number of visible leafs, not counting 0 329 mleaf_t *leafs; 330 331 int numvertexes; 332 mvertex_t *vertexes; 333 334 int numedges; 335 medge_t *edges; 336 337 int numnodes; 338 mnode_t *nodes; 339 340 int numtexinfo; 341 mtexinfo_t *texinfo; 342 343 int numsurfaces; 344 msurface_t *surfaces; 345 346 int numsurfedges; 347 int *surfedges; 348 349 int numclipnodes; 350 dclipnode_t *clipnodes; 351 352 int nummarksurfaces; 353 msurface_t **marksurfaces; 354 355 hull_t hulls[MAX_MAP_HULLS]; 356 357 int numtextures; 358 texture_t **textures; 359 360 byte *visdata; 361 byte *lightdata; 362 char *entities; 363 364// 365// additional model data 366// 367 cache_user_t cache; // only access through Mod_Extradata 368 369} model_t; 370 371//============================================================================ 372 373void Mod_Init (void); 374void Mod_ClearAll (void); 375model_t *Mod_ForName (char *name, qboolean crash); 376void *Mod_Extradata (model_t *mod); // handles caching 377void Mod_TouchModel (char *name); 378 379mleaf_t *Mod_PointInLeaf (float *p, model_t *model); 380byte *Mod_LeafPVS (mleaf_t *leaf, model_t *model); 381 382#endif // __MODEL__ 383