diff --git a/polymer/build/Makefile.deps b/polymer/build/Makefile.deps index fd1225a56..ae09cde72 100644 --- a/polymer/build/Makefile.deps +++ b/polymer/build/Makefile.deps @@ -9,7 +9,7 @@ $(OBJ)/compat.$o: $(SRC)/compat.c $(INC)/compat.h $(OBJ)/config.$o: $(SRC)/config.c $(INC)/compat.h $(INC)/osd.h $(INC)/editor.h $(OBJ)/crc32.$o: $(SRC)/crc32.c $(INC)/crc32.h $(OBJ)/defs.$o: $(SRC)/defs.c $(INC)/build.h $(INC)/baselayer.h $(INC)/scriptfile.h $(INC)/compat.h -$(OBJ)/engine.$o: $(SRC)/engine.c $(SRC)/polymost.c $(INC)/kplib.h $(SRC)/hightile.c $(SRC)/mdsprite.c $(INC)/md4.h $(INC)/lzf.h $(INC)/lzwnew.h $(INC)/compat.h $(INC)/build.h $(INC)/pragmas.h $(INC)/cache1d.h $(INC)/a.h $(INC)/osd.h $(INC)/baselayer.h $(INC)/polymer.h $(INC)/polymost.h +$(OBJ)/engine.$o: $(SRC)/engine.c $(SRC)/polymost.c $(INC)/kplib.h $(SRC)/hightile.c $(SRC)/mdsprite.c $(INC)/md4.h $(INC)/lzf.h $(INC)/lzwnew.h $(INC)/compat.h $(INC)/build.h $(INC)/pragmas.h $(INC)/cache1d.h $(INC)/a.h $(INC)/osd.h $(INC)/baselayer.h $(INC)/polymer.h $(INC)/polymost.h $(INC)/mdsprite.h $(OBJ)/glbuild.$o: $(SRC)/glbuild.c $(INC)/glbuild.h $(INC)/baselayer.h $(OBJ)/kplib.$o: $(SRC)/kplib.c $(INC)/compat.h $(OBJ)/lzf_c.$o: $(SRC)/lzf_c.c $(SRC)/lzfP.h @@ -26,7 +26,7 @@ $(OBJ)/sound.$o: $(SRC)/sound.c $(INC)/osd.h $(INC)/compat.h $(INC)/cache1d.h $(OBJ)/winlayer.$o: $(SRC)/winlayer.c $(INC)/compat.h $(INC)/winlayer.h $(INC)/baselayer.h $(INC)/pragmas.h $(INC)/build.h $(INC)/a.h $(INC)/osd.h $(INC)/dxdidf.h $(INC)/glbuild.h $(OBJ)/gtkbits.$o: $(SRC)/gtkbits.c $(INC)/baselayer.h $(INC)/build.h $(INC)/dynamicgtk.h $(OBJ)/dynamicgtk.$o: $(SRC)/dynamicgtk.c $(INC)/dynamicgtk.h -$(OBJ)/polymer.$o: $(SRC)/polymer.c $(INC)/polymer.h $(INC)/compat.h $(INC)/build.h $(INC)/glbuild.h $(INC)/osd.h $(INC)/polymost.h $(INC)/pragmas.h +$(OBJ)/polymer.$o: $(SRC)/polymer.c $(INC)/polymer.h $(INC)/compat.h $(INC)/build.h $(INC)/glbuild.h $(INC)/osd.h $(INC)/polymost.h $(INC)/pragmas.h $(INC)/mdsprite.h $(OBJ)/buildres.$(res): $(SRC)/misc/buildres.rc $(INC)/startwin.editor.h $(OBJ)/startwin.editor.$o: $(SRC)/startwin.editor.c $(INC)/build.h $(INC)/editor.h $(INC)/winlayer.h $(INC)/compat.h $(INC)/startwin.editor.h diff --git a/polymer/build/include/mdsprite.h b/polymer/build/include/mdsprite.h new file mode 100644 index 000000000..34011a3c5 --- /dev/null +++ b/polymer/build/include/mdsprite.h @@ -0,0 +1,204 @@ +#ifndef _mdsprite_h_ +# define _mdsprite_h_ + +#ifdef __POWERPC__ +#define SHIFTMOD32(a) ((a)&31) +#else +#define SHIFTMOD32(a) (a) +#endif + +typedef struct +{ + int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! + int shadeoff; + float scale, bscale, zadd; + GLuint *texid; // skins + int flags; +} mdmodel; + +typedef struct _mdanim_t +{ + int startframe, endframe; + int fpssc, flags; + struct _mdanim_t *next; +} mdanim_t; +#define MDANIM_LOOP 0 +#define MDANIM_ONESHOT 1 + +typedef struct _mdskinmap_t +{ + unsigned char palette, filler[3]; // Build palette number + int skinnum, surfnum; // Skin identifier, surface number + char *fn; // Skin filename + GLuint texid[HICEFFECTMASK+1]; // OpenGL texture numbers for effect variations + struct _mdskinmap_t *next; + float param; + char *palmap;int size; +} 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 +{ + int id, vers, skinxsiz, skinysiz, framebytes; //id:"IPD2", vers:8 + int numskins, numverts, numuv, numtris, numglcmds, numframes; + int ofsskins, ofsuv, ofstris, ofsframes, ofsglcmds, ofseof; //ofsskins: skin names (64 bytes each) +} md2head_t; + +typedef struct { unsigned char v[3], ni; } md2vert_t; //compressed vertex coords (x,y,z) +typedef struct +{ + point3d mul, add; //scale&translation vector + char name[16]; //frame name + md2vert_t verts[1]; //first vertex of this frame +} md2frame_t; + +typedef struct { short u, v; } md2uv_t; +typedef struct +{ + unsigned short v[3]; + unsigned short u[3]; +} md2tri_t; + +typedef struct +{ + //WARNING: This top block is a union between md2model&md3model: Make sure it matches! + int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! + int shadeoff; + float scale, bscale, zadd; + GLuint *texid; // texture ids for base skin if no mappings defined + int flags; + + int numframes, cframe, nframe, fpssc, usesalpha; + float oldtime, curtime, interpol; + mdanim_t *animations; + mdskinmap_t *skinmap; + int numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified, + + //MD2 specific stuff: + int numverts, numglcmds, framebytes, *glcmds; + 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; +} md2model; + + +typedef struct { char nam[64]; int i; } md3shader_t; //ascz path of shader, shader index +typedef struct { int i[3]; } md3tri_t; //indices of tri +typedef struct { float u, v; } md3uv_t; +typedef struct { signed short x, y, z; unsigned char nlat, nlng; } md3xyzn_t; //xyz are [10:6] ints + +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 +{ + int id; //IDP3(0x33806873) + char nam[64]; //ascz surface name + int flags; //? + int numframes, numshaders, numverts, numtris; //numframes same as md3head,max shade=~256,vert=~4096,tri=~8192 + md3tri_t *tris; //file format: rel offs from md3surf + md3shader_t *shaders; //file format: rel offs from md3surf + md3uv_t *uv; //file format: rel offs from md3surf + md3xyzn_t *xyzn; //file format: rel offs from md3surf + int ofsend; +} md3surf_t; + +typedef struct +{ + int id, vers; //id=IDP3(0x33806873), vers=15 + char nam[64]; //ascz path in PK3 + int flags; //? + int numframes, numtags, numsurfs, numskins; //max=~1024,~16,~32,numskins=artifact of MD2; use shader field instead + md3frame_t *frames; //file format: abs offs + md3tag_t *tags; //file format: abs offs + md3surf_t *surfs; //file format: abs offs + int eof; //file format: abs offs +} md3head_t; + +typedef struct +{ + //WARNING: This top block is a union between md2model&md3model: Make sure it matches! + int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! + int shadeoff; + float scale, bscale, zadd; + unsigned int *texid; // texture ids for base skin if no mappings defined + int flags; + + int numframes, cframe, nframe, fpssc, usesalpha; + float oldtime, curtime, interpol; + mdanim_t *animations; + mdskinmap_t *skinmap; + int numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified, + + //MD3 specific + md3head_t head; + point3d *muladdframes; + unsigned short *indexes; + unsigned short *vindexes; + float *maxdepths; + GLuint* vbos; +} md3model; + +#define VOXBORDWIDTH 1 //use 0 to save memory, but has texture artifacts; 1 looks better... +#define VOXUSECHAR 0 +#if (VOXUSECHAR != 0) +typedef struct { unsigned char x, y, z, u, v; } vert_t; +#else +typedef struct { unsigned short x, y, z, u, v; } vert_t; +#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! + int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! + int shadeoff; + float scale, bscale, zadd; + unsigned int *texid; // skins for palettes + int flags; + + //VOX specific stuff: + voxrect_t *quad; int qcnt, qfacind[7]; + int *mytex, mytexx, mytexy; + int xsiz, ysiz, zsiz; + float xpiv, ypiv, zpiv; + int is8bit; +} voxmodel; + +typedef struct +{ + // maps build tiles to particular animation frames of a model + int modelid; + int skinnum; + int framenum; // calculate the number from the name when declaring + float smoothduration; + int next; + char pal; +} tile2model_t; + +#define EXTRATILES MAXTILES +EXTERN tile2model_t tile2model[MAXTILES+EXTRATILES]; +EXTERN mdmodel **models; + +void updateanimation(md2model *m, spritetype *tspr); +int mdloadskin(md2model *m, int number, int pal, int surf); + +#endif // !_mdsprite_h_ diff --git a/polymer/build/include/polymer.h b/polymer/build/include/polymer.h index a4715b6f1..186ab6487 100644 --- a/polymer/build/include/polymer.h +++ b/polymer/build/include/polymer.h @@ -31,6 +31,7 @@ # include "glbuild.h" # include "osd.h" # include "polymost.h" +# include "mdsprite.h" # include "pragmas.h" # include @@ -157,6 +158,6 @@ static void polymer_getsky(void); static void polymer_drawskyquad(int p1, int p2, GLfloat height); static void polymer_drawartsky(short tilenum); -# endif +# endif // !POLYMER_C #endif // !_polymer_h_ diff --git a/polymer/build/include/polymost.h b/polymer/build/include/polymost.h index 903a11e91..c4bb1c7d0 100644 --- a/polymer/build/include/polymost.h +++ b/polymer/build/include/polymost.h @@ -39,4 +39,6 @@ pthtyp * gltexcache (int dapicnum, int dapalnum, int dameth); extern palette_t hictinting[MAXPALOOKUPS]; extern float gtang; +#define HICEFFECTMASK (1|2|4) + #endif // !_polymost_h_ diff --git a/polymer/build/src/hightile.c b/polymer/build/src/hightile.c index c2de17358..465288d2c 100644 --- a/polymer/build/src/hightile.c +++ b/polymer/build/src/hightile.c @@ -6,10 +6,10 @@ #include "kplib.h" -#define HICEFFECTMASK (1|2|4) palette_t hictinting[MAXPALOOKUPS]; //moved into polymost.h +//#define HICEFFECTMASK (1|2|4) /*struct hicskybox_t { int ignore; char *face[6]; diff --git a/polymer/build/src/mdsprite.c b/polymer/build/src/mdsprite.c index 181f90bc6..267808b23 100644 --- a/polymer/build/src/mdsprite.c +++ b/polymer/build/src/mdsprite.c @@ -1,202 +1,8 @@ //------------------------------------- MD2/MD3 LIBRARY BEGINS ------------------------------------- -#ifdef __POWERPC__ -#define SHIFTMOD32(a) ((a)&31) -#else -#define SHIFTMOD32(a) (a) -#endif - -typedef struct -{ - int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! - int shadeoff; - float scale, bscale, zadd; - GLuint *texid; // skins - int flags; -} mdmodel; - -typedef struct _mdanim_t -{ - int startframe, endframe; - int fpssc, flags; - struct _mdanim_t *next; -} mdanim_t; -#define MDANIM_LOOP 0 -#define MDANIM_ONESHOT 1 - -typedef struct _mdskinmap_t -{ - unsigned char palette, filler[3]; // Build palette number - int skinnum, surfnum; // Skin identifier, surface number - char *fn; // Skin filename - GLuint texid[HICEFFECTMASK+1]; // OpenGL texture numbers for effect variations - struct _mdskinmap_t *next; - float param; - char *palmap;int size; -} 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 -{ - int id, vers, skinxsiz, skinysiz, framebytes; //id:"IPD2", vers:8 - int numskins, numverts, numuv, numtris, numglcmds, numframes; - int ofsskins, ofsuv, ofstris, ofsframes, ofsglcmds, ofseof; //ofsskins: skin names (64 bytes each) -} md2head_t; - -typedef struct { unsigned char v[3], ni; } md2vert_t; //compressed vertex coords (x,y,z) -typedef struct -{ - point3d mul, add; //scale&translation vector - char name[16]; //frame name - md2vert_t verts[1]; //first vertex of this frame -} md2frame_t; - -typedef struct { short u, v; } md2uv_t; -typedef struct -{ - unsigned short v[3]; - unsigned short u[3]; -} md2tri_t; - -typedef struct -{ - //WARNING: This top block is a union between md2model&md3model: Make sure it matches! - int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! - int shadeoff; - float scale, bscale, zadd; - GLuint *texid; // texture ids for base skin if no mappings defined - int flags; - - int numframes, cframe, nframe, fpssc, usesalpha; - float oldtime, curtime, interpol; - mdanim_t *animations; - mdskinmap_t *skinmap; - int numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified, - - //MD2 specific stuff: - int numverts, numglcmds, framebytes, *glcmds; - 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; -} md2model; - - -typedef struct { char nam[64]; int i; } md3shader_t; //ascz path of shader, shader index -typedef struct { int i[3]; } md3tri_t; //indices of tri -typedef struct { float u, v; } md3uv_t; -typedef struct { signed short x, y, z; unsigned char nlat, nlng; } md3xyzn_t; //xyz are [10:6] ints - -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 -{ - int id; //IDP3(0x33806873) - char nam[64]; //ascz surface name - int flags; //? - int numframes, numshaders, numverts, numtris; //numframes same as md3head,max shade=~256,vert=~4096,tri=~8192 - md3tri_t *tris; //file format: rel offs from md3surf - md3shader_t *shaders; //file format: rel offs from md3surf - md3uv_t *uv; //file format: rel offs from md3surf - md3xyzn_t *xyzn; //file format: rel offs from md3surf - int ofsend; -} md3surf_t; - -typedef struct -{ - int id, vers; //id=IDP3(0x33806873), vers=15 - char nam[64]; //ascz path in PK3 - int flags; //? - int numframes, numtags, numsurfs, numskins; //max=~1024,~16,~32,numskins=artifact of MD2; use shader field instead - md3frame_t *frames; //file format: abs offs - md3tag_t *tags; //file format: abs offs - md3surf_t *surfs; //file format: abs offs - int eof; //file format: abs offs -} md3head_t; - -typedef struct -{ - //WARNING: This top block is a union between md2model&md3model: Make sure it matches! - int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! - int shadeoff; - float scale, bscale, zadd; - unsigned int *texid; // texture ids for base skin if no mappings defined - int flags; - - int numframes, cframe, nframe, fpssc, usesalpha; - float oldtime, curtime, interpol; - mdanim_t *animations; - mdskinmap_t *skinmap; - int numskins, skinloaded; // set to 1+numofskin when a skin is loaded and the tex coords are modified, - - //MD3 specific - md3head_t head; - point3d *muladdframes; - unsigned short *indexes; - unsigned short *vindexes; - float *maxdepths; - GLuint* vbos; -} md3model; - -#define VOXBORDWIDTH 1 //use 0 to save memory, but has texture artifacts; 1 looks better... -#define VOXUSECHAR 0 -#if (VOXUSECHAR != 0) -typedef struct { unsigned char x, y, z, u, v; } vert_t; -#else -typedef struct { unsigned short x, y, z, u, v; } vert_t; -#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! - int mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure! - int shadeoff; - float scale, bscale, zadd; - unsigned int *texid; // skins for palettes - int flags; - - //VOX specific stuff: - voxrect_t *quad; int qcnt, qfacind[7]; - int *mytex, mytexx, mytexy; - int xsiz, ysiz, zsiz; - float xpiv, ypiv, zpiv; - int is8bit; -} voxmodel; +#include "mdsprite.h" static voxmodel *voxmodels[MAXVOXELS]; - -typedef struct -{ - // maps build tiles to particular animation frames of a model - int modelid; - int skinnum; - int framenum; // calculate the number from the name when declaring - float smoothduration; - int next; - char pal; -} tile2model_t; - -#define EXTRATILES MAXTILES int curextra=MAXTILES; -static tile2model_t tile2model[MAXTILES+EXTRATILES]; int addtileP(int model,int tile,int pallet) { @@ -232,7 +38,6 @@ int mdpause=0; #define MODELALLOCGROUP 256 static int nummodelsalloced = 0, nextmodelid = 0; -static mdmodel **models = NULL; static int maxmodelverts = 0, allocmodelverts = 0; static int maxmodeltris = 0, allocmodeltris = 0; @@ -859,7 +664,7 @@ failure: // --------------------------------------------------- JONOF'S COMPRESSED TEXTURE CACHE STUFF //Note: even though it says md2model, it works for both md2model&md3model -static int mdloadskin(md2model *m, int number, int pal, int surf) +int mdloadskin(md2model *m, int number, int pal, int surf) { int i,j, fptr=0, bpl, xsiz=0, ysiz=0, osizx, osizy, texfmt = GL_RGBA, intexfmt = GL_RGBA; char *skinfile, hasalpha, fn[BMAX_PATH+65]; @@ -1053,7 +858,7 @@ static int mdloadskin(md2model *m, int number, int pal, int surf) } //Note: even though it says md2model, it works for both md2model&md3model -static void updateanimation(md2model *m, spritetype *tspr) +void updateanimation(md2model *m, spritetype *tspr) { mdanim_t *anim; int i, j, k; diff --git a/polymer/build/src/polymer.c b/polymer/build/src/polymer.c index 2114c1f87..8888ed8fb 100644 --- a/polymer/build/src/polymer.c +++ b/polymer/build/src/polymer.c @@ -333,6 +333,48 @@ void polymer_drawmaskwall(int damaskwallcnt) polymer_drawplane(-1, -3, w->maskglpic, w->maskcolor, w->portal, NULL, 0, NULL); } +static void polymer_drawmdsprite(spritetype *tspr) +{ + md3model* m; + float spos[3]; + float ang; + int surfi; + md3xyzn_t *v0; + md3surf_t *s; + GLuint i; + + m = (md3model*)models[tile2model[Ptile2tile(tspr->picnum,sprite[tspr->owner].pal)].modelid]; + updateanimation((md2model *)m,tspr); + + spos[0] = tspr->y; + spos[1] = -(float)(tspr->z) / 16.0f; + spos[2] = -tspr->x; + ang = (float)((tspr->ang) & 2047) / (2048.0f / 360.0f); + + bglMatrixMode(GL_MODELVIEW); + bglPushMatrix(); + bglTranslatef(spos[0], spos[1], spos[2]); + bglRotatef(-ang, 0.0f, 1.0f, 0.0f); + bglRotatef(-90.0f, 1.0f, 0.0f, 0.0f); + bglRotatef(90.0f, 0.0f, 0.0f, 1.0f); + for (surfi=0;surfihead.numsurfs;surfi++) + { + s = &m->head.surfs[surfi]; + v0 = &s->xyzn[m->cframe*s->numverts]; + + i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,sprite[tspr->owner].pal)].skinnum,globalpal,surfi); + if (!i) + continue; + + bglBindTexture(GL_TEXTURE_2D, i); + + bglVertexPointer(3, GL_SHORT, sizeof(md3xyzn_t), v0); + bglTexCoordPointer(2, GL_FLOAT, 0, s->uv); + bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, s->tris); + } + bglPopMatrix(); +} + void polymer_drawsprite(int snum) { int curpicnum, glpic, xsize, ysize, tilexoff, tileyoff, xoff, yoff; @@ -345,6 +387,12 @@ void polymer_drawsprite(int snum) tspr = tspriteptr[snum]; + if (usemodels && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].modelid >= 0 && tile2model[Ptile2tile(tspr->picnum,tspr->pal)].framenum >= 0) + { + polymer_drawmdsprite(tspr); + return; + } + curpicnum = tspr->picnum; if (picanm[curpicnum]&192) curpicnum += animateoffs(curpicnum,tspr->owner+32768);