2008-05-05 09:05:07 +00:00
|
|
|
#ifndef _mdsprite_h_
|
|
|
|
# define _mdsprite_h_
|
|
|
|
|
2009-08-09 05:32:17 +00:00
|
|
|
#include "hightile.h"
|
|
|
|
|
2008-05-05 09:05:07 +00:00
|
|
|
#ifdef __POWERPC__
|
|
|
|
#define SHIFTMOD32(a) ((a)&31)
|
|
|
|
#else
|
|
|
|
#define SHIFTMOD32(a) (a)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
|
|
|
|
int32_t shadeoff;
|
2008-05-05 09:05:07 +00:00
|
|
|
float scale, bscale, zadd;
|
|
|
|
GLuint *texid; // skins
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t flags;
|
|
|
|
} mdmodel_t;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
|
|
|
typedef struct _mdanim_t
|
|
|
|
{
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t startframe, endframe;
|
|
|
|
int32_t fpssc, flags;
|
2008-05-05 09:05:07 +00:00
|
|
|
struct _mdanim_t *next;
|
|
|
|
} mdanim_t;
|
|
|
|
#define MDANIM_LOOP 0
|
|
|
|
#define MDANIM_ONESHOT 1
|
|
|
|
|
|
|
|
typedef struct _mdskinmap_t
|
|
|
|
{
|
2009-04-26 05:57:42 +00:00
|
|
|
uint8_t palette, filler[3]; // Build palette number
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t skinnum, surfnum; // Skin identifier, surface number
|
2008-05-05 09:05:07 +00:00
|
|
|
char *fn; // Skin filename
|
|
|
|
GLuint texid[HICEFFECTMASK+1]; // OpenGL texture numbers for effect variations
|
|
|
|
struct _mdskinmap_t *next;
|
2009-03-28 15:19:44 +00:00
|
|
|
float param, specpower, specfactor;
|
2008-05-05 09:05:07 +00:00
|
|
|
} mdskinmap_t;
|
|
|
|
|
|
|
|
|
|
|
|
//This MD2 code is based on the source code from David Henry (tfc_duke(at)hotmail.com)
|
|
|
|
// Was at http://tfc.duke.free.fr/us/tutorials/models/md2.htm
|
|
|
|
// Available from http://web.archive.org/web/20030816010242/http://tfc.duke.free.fr/us/tutorials/models/md2.htm
|
|
|
|
// Now at http://tfc.duke.free.fr/coding/md2.html (in French)
|
|
|
|
//He probably wouldn't recognize it if he looked at it though :)
|
|
|
|
typedef struct { float x, y, z; } point3d;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t id, vers, skinxsiz, skinysiz, framebytes; //id:"IPD2", vers:8
|
|
|
|
int32_t numskins, numverts, numuv, numtris, numglcmds, numframes;
|
|
|
|
int32_t ofsskins, ofsuv, ofstris, ofsframes, ofsglcmds, ofseof; //ofsskins: skin names (64 bytes each)
|
2008-05-05 09:05:07 +00:00
|
|
|
} md2head_t;
|
|
|
|
|
2009-04-26 05:57:42 +00:00
|
|
|
typedef struct { uint8_t v[3], ni; } md2vert_t; //compressed vertex coords (x,y,z)
|
2008-05-05 09:05:07 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
point3d mul, add; //scale&translation vector
|
|
|
|
char name[16]; //frame name
|
|
|
|
md2vert_t verts[1]; //first vertex of this frame
|
|
|
|
} md2frame_t;
|
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
typedef struct { int16_t u, v; } md2uv_t;
|
2008-05-05 09:05:07 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2009-01-10 07:38:50 +00:00
|
|
|
uint16_t v[3];
|
|
|
|
uint16_t u[3];
|
2008-05-05 09:05:07 +00:00
|
|
|
} md2tri_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
//WARNING: This top block is a union between md2model&md3model: Make sure it matches!
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
|
|
|
|
int32_t shadeoff;
|
2008-05-05 09:05:07 +00:00
|
|
|
float scale, bscale, zadd;
|
|
|
|
GLuint *texid; // texture ids for base skin if no mappings defined
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t flags;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t numframes, cframe, nframe, fpssc, usesalpha;
|
2008-05-05 09:05:07 +00:00
|
|
|
float oldtime, curtime, interpol;
|
|
|
|
mdanim_t *animations;
|
|
|
|
mdskinmap_t *skinmap;
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified,
|
2008-05-05 09:05:07 +00:00
|
|
|
|
|
|
|
//MD2 specific stuff:
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t numverts, numglcmds, framebytes, *glcmds;
|
2008-05-05 09:05:07 +00:00
|
|
|
char *frames;
|
|
|
|
char *basepath; // pointer to string of base path
|
|
|
|
char *skinfn; // pointer to first of numskins 64-char strings
|
|
|
|
md2uv_t *uv;
|
|
|
|
md2tri_t* tris;
|
2009-01-10 07:38:50 +00:00
|
|
|
} md2model_t;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
typedef struct { char nam[64]; int32_t i; } md3shader_t; //ascz path of shader, shader index
|
|
|
|
typedef struct { int32_t i[3]; } md3tri_t; //indices of tri
|
2008-05-05 09:05:07 +00:00
|
|
|
typedef struct { float u, v; } md3uv_t;
|
2009-04-26 05:57:42 +00:00
|
|
|
typedef struct { int16_t x, y, z; uint8_t nlat, nlng; } md3xyzn_t; //xyz are [10:6] ints
|
2008-05-05 09:05:07 +00:00
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
point3d min, max, cen; //bounding box&origin
|
|
|
|
float r; //radius of bounding sphere
|
|
|
|
char nam[16]; //ascz frame name
|
|
|
|
} md3frame_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
char nam[64]; //ascz tag name
|
|
|
|
point3d p, x, y, z; //tag object pos&orient
|
|
|
|
} md3tag_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t id; //IDP3(0x33806873)
|
2008-05-05 09:05:07 +00:00
|
|
|
char nam[64]; //ascz surface name
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t flags; //?
|
|
|
|
int32_t numframes, numshaders, numverts, numtris; //numframes same as md3head,max shade=~256,vert=~4096,tri=~8192
|
|
|
|
int32_t ofstris;
|
|
|
|
int32_t ofsshaders;
|
|
|
|
int32_t ofsuv;
|
|
|
|
int32_t ofsxyzn;
|
|
|
|
int32_t ofsend;
|
2008-05-24 06:53:56 +00:00
|
|
|
// DO NOT read directly to this structure
|
|
|
|
// the following block is NOT in the file format
|
|
|
|
// be sure to use the SIZEOF_MD3SURF_T macro
|
|
|
|
md3tri_t *tris;
|
|
|
|
md3shader_t *shaders;
|
|
|
|
md3uv_t *uv;
|
|
|
|
md3xyzn_t *xyzn;
|
2009-03-10 12:08:33 +00:00
|
|
|
float *geometry;
|
2008-05-05 09:05:07 +00:00
|
|
|
} md3surf_t;
|
|
|
|
|
2009-03-10 12:08:33 +00:00
|
|
|
#define SIZEOF_MD3SURF_T (11*sizeof(int32_t) + 64*sizeof(char))
|
2008-05-24 06:53:56 +00:00
|
|
|
|
2008-05-05 09:05:07 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t id, vers; //id=IDP3(0x33806873), vers=15
|
2008-05-05 09:05:07 +00:00
|
|
|
char nam[64]; //ascz path in PK3
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t flags; //?
|
|
|
|
int32_t numframes, numtags, numsurfs, numskins; //max=~1024,~16,~32,numskins=artifact of MD2; use shader field instead
|
|
|
|
int32_t ofsframes;
|
|
|
|
int32_t ofstags;
|
|
|
|
int32_t ofssurfs;
|
|
|
|
int32_t eof;
|
2008-05-24 06:53:56 +00:00
|
|
|
// DO NOT read directly to this structure
|
|
|
|
// the following block is NOT in the file format
|
|
|
|
// be sure to use the SIZEOF_MD3HEAD_T macro
|
|
|
|
md3frame_t *frames;
|
|
|
|
md3tag_t *tags;
|
|
|
|
md3surf_t *surfs;
|
2008-05-05 09:05:07 +00:00
|
|
|
} md3head_t;
|
|
|
|
|
2008-05-24 06:53:56 +00:00
|
|
|
#define SIZEOF_MD3HEAD_T (sizeof(md3head_t)-3*sizeof(void*))
|
|
|
|
|
2008-05-05 09:05:07 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
//WARNING: This top block is a union between md2model&md3model: Make sure it matches!
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
|
|
|
|
int32_t shadeoff;
|
2008-05-05 09:05:07 +00:00
|
|
|
float scale, bscale, zadd;
|
2009-01-10 07:38:50 +00:00
|
|
|
uint32_t *texid; // texture ids for base skin if no mappings defined
|
|
|
|
int32_t flags;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t numframes, cframe, nframe, fpssc, usesalpha;
|
2008-05-05 09:05:07 +00:00
|
|
|
float oldtime, curtime, interpol;
|
|
|
|
mdanim_t *animations;
|
|
|
|
mdskinmap_t *skinmap;
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified,
|
2008-05-05 09:05:07 +00:00
|
|
|
|
|
|
|
//MD3 specific
|
|
|
|
md3head_t head;
|
|
|
|
point3d *muladdframes;
|
2009-01-10 07:38:50 +00:00
|
|
|
uint16_t *indexes;
|
|
|
|
uint16_t *vindexes;
|
2008-05-05 09:05:07 +00:00
|
|
|
float *maxdepths;
|
|
|
|
GLuint* vbos;
|
2008-06-01 08:58:06 +00:00
|
|
|
// polymer VBO names after that, allocated per surface
|
|
|
|
GLuint* indices;
|
|
|
|
GLuint* texcoords;
|
|
|
|
GLuint* geometry;
|
2009-01-10 07:38:50 +00:00
|
|
|
} md3model_t;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
|
|
|
#define VOXBORDWIDTH 1 //use 0 to save memory, but has texture artifacts; 1 looks better...
|
|
|
|
#define VOXUSECHAR 0
|
|
|
|
#if (VOXUSECHAR != 0)
|
2009-04-26 05:57:42 +00:00
|
|
|
typedef struct { uint8_t x, y, z, u, v; } vert_t;
|
2008-05-05 09:05:07 +00:00
|
|
|
#else
|
2009-01-10 07:38:50 +00:00
|
|
|
typedef struct { uint16_t x, y, z, u, v; } vert_t;
|
2008-05-05 09:05:07 +00:00
|
|
|
#endif
|
|
|
|
typedef struct { vert_t v[4]; } voxrect_t;
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
//WARNING: This top block is a union of md2model,md3model,voxmodel: Make sure it matches!
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
|
|
|
|
int32_t shadeoff;
|
2008-05-05 09:05:07 +00:00
|
|
|
float scale, bscale, zadd;
|
2009-01-10 07:38:50 +00:00
|
|
|
uint32_t *texid; // skins for palettes
|
|
|
|
int32_t flags;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
|
|
|
//VOX specific stuff:
|
2009-01-10 07:38:50 +00:00
|
|
|
voxrect_t *quad; int32_t qcnt, qfacind[7];
|
|
|
|
int32_t *mytex, mytexx, mytexy;
|
|
|
|
int32_t xsiz, ysiz, zsiz;
|
2008-05-05 09:05:07 +00:00
|
|
|
float xpiv, ypiv, zpiv;
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t is8bit;
|
|
|
|
} voxmodel_t;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
2009-02-28 07:44:54 +00:00
|
|
|
/*
|
2008-05-05 09:05:07 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
// maps build tiles to particular animation frames of a model
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t modelid;
|
|
|
|
int32_t skinnum;
|
|
|
|
int32_t framenum; // calculate the number from the name when declaring
|
2008-05-05 09:05:07 +00:00
|
|
|
float smoothduration;
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t next;
|
2008-05-05 09:05:07 +00:00
|
|
|
char pal;
|
|
|
|
} tile2model_t;
|
|
|
|
|
|
|
|
#define EXTRATILES MAXTILES
|
|
|
|
EXTERN tile2model_t tile2model[MAXTILES+EXTRATILES];
|
2009-02-28 07:44:54 +00:00
|
|
|
*/
|
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
EXTERN mdmodel_t **models;
|
2008-05-05 09:05:07 +00:00
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
void updateanimation(md2model_t *m, spritetype *tspr);
|
|
|
|
int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf);
|
2008-12-02 10:44:39 +00:00
|
|
|
void mdinit(void);
|
|
|
|
void freeallmodels(void);
|
|
|
|
void clearskins(void);
|
2009-01-10 07:38:50 +00:00
|
|
|
int32_t mddraw(spritetype *tspr);
|
2008-12-02 10:44:39 +00:00
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
typedef struct { float xadd, yadd, zadd; int16_t angadd, flags; } hudtyp;
|
2008-12-02 10:44:39 +00:00
|
|
|
|
|
|
|
EXTERN hudtyp hudmem[2][MAXTILES]; //~320KB ... ok for now ... could replace with dynamic alloc
|
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
EXTERN int32_t mdpause;
|
|
|
|
EXTERN int32_t nummodelsalloced, nextmodelid;
|
|
|
|
EXTERN voxmodel_t *voxmodels[MAXVOXELS];
|
2008-12-02 10:44:39 +00:00
|
|
|
|
2009-01-10 07:38:50 +00:00
|
|
|
void voxfree(voxmodel_t *m);
|
|
|
|
voxmodel_t *voxload(const char *filnam);
|
|
|
|
int32_t voxdraw(voxmodel_t *m, spritetype *tspr);
|
2008-12-02 10:44:39 +00:00
|
|
|
|
2010-12-24 15:44:37 +00:00
|
|
|
int md3postload_polymer(md3model_t* m);
|
|
|
|
|
2008-05-05 09:05:07 +00:00
|
|
|
#endif // !_mdsprite_h_
|