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