Patch from hunter_rus

git-svn-id: https://svn.eduke32.com/eduke32@665 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2008-03-27 21:32:23 +00:00
parent 697b640ea7
commit c5d5cdc879
9 changed files with 170 additions and 52 deletions

View file

@ -278,6 +278,8 @@ extern int usevoxels, voxscale[MAXVOXELS];
#ifdef POLYMOST
extern int usemodels, usehightile;
#endif
EXTERN int h_xsize[MAXTILES], h_ysize[MAXTILES];
EXTERN signed char h_xoffs[MAXTILES], h_yoffs[MAXTILES];
extern char *engineerrstr;
extern char noclip;

View file

@ -19,7 +19,7 @@
#if defined(__APPLE__)
# include <OpenGL/glext.h>
#else
# include "glext.h"
# include "GL/glext.h"
#endif
#ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT

View file

@ -69,6 +69,7 @@ enum
T_FOGPAL,
T_LOADGRP,
T_DUMMYTILE,T_DUMMYTILERANGE,
T_SETUPTILE,T_SETUPTILERANGE,
T_CACHESIZE,
T_MUSIC,T_ID,T_SOUND,
T_REDPAL,T_BLUEPAL,T_BROWNPAL,T_GREYPAL,T_GREENPAL,T_SPECPAL
@ -120,6 +121,8 @@ static tokenlist basetokens[] =
{ "loadgrp", T_LOADGRP },
{ "dummytile", T_DUMMYTILE },
{ "dummytilerange", T_DUMMYTILERANGE },
{ "setuptile", T_SETUPTILE },
{ "setuptilerange", T_SETUPTILERANGE },
{ "cachesize", T_CACHESIZE },
};
@ -516,6 +519,52 @@ static int defsparser(scriptfile *script)
if (scriptfile_getnumber(script,&j)) break;
}
break;
case T_SETUPTILE:
{
int tile, tmp;
if (scriptfile_getsymbol(script,&tile)) break;
if (tile >= MAXTILES)break;
if (scriptfile_getsymbol(script,&h_xsize[tile])) break;
if (scriptfile_getsymbol(script,&h_ysize[tile])) break;
if (scriptfile_getsymbol(script,&tmp)) break;
h_xoffs[tile]=tmp;
if (scriptfile_getsymbol(script,&tmp)) break;
h_yoffs[tile]=tmp;
break;
}
case T_SETUPTILERANGE:
{
int tile1,tile2,xsiz,ysiz,xoffs,yoffs,i;
if (scriptfile_getnumber(script,&tile1)) break;
if (scriptfile_getnumber(script,&tile2)) break;
if (scriptfile_getnumber(script,&xsiz)) break;
if (scriptfile_getnumber(script,&ysiz)) break;
if (scriptfile_getsymbol(script,&xoffs)) break;
if (scriptfile_getsymbol(script,&yoffs)) break;
if (tile2 < tile1)
{
initprintf("Warning: backwards tile range on line %s:%d\n", script->filename, scriptfile_getlinum(script,cmdtokptr));
i = tile2;
tile2 = tile1;
tile1 = i;
}
if ((tile1 >= 0 && tile1 < MAXTILES) && (tile2 >= 0 && tile2 < MAXTILES))
{
for (i=tile1;i<=tile2;i++)
{
if ((unsigned int)i < MAXTILES)
{
h_xsize[i] = xsiz;
h_ysize[i] = ysiz;
h_xoffs[i] = xoffs;
h_yoffs[i] = yoffs;
}
}
}
break;
}
case T_DUMMYTILE:
{
int tile, xsiz, ysiz, j;

View file

@ -7909,6 +7909,8 @@ int loadpics(char *filename, int askedsize)
//
char cachedebug = 0;
char faketile[MAXTILES];
int h_xsize[MAXTILES], h_ysize[MAXTILES];
signed char h_xoffs[MAXTILES], h_yoffs[MAXTILES];
void loadtile(short tilenume)
{

View file

@ -154,7 +154,7 @@ void (APIENTRY * bglBeginQueryARB)(GLenum target, GLuint id);
void (APIENTRY * bglEndQueryARB)(GLenum target);
void (APIENTRY * bglGetQueryivARB)(GLenum target, GLenum pname, GLint *params);
void (APIENTRY * bglGetQueryObjectivARB)(GLuint id, GLenum pname, GLint *params);
void (APIENTRY * bglGetQueryObjectuivARB)(uint id, GLenum pname, GLuint *params);
void (APIENTRY * bglGetQueryObjectuivARB)(GLuint id, GLenum pname, GLuint *params);
// GLU
void (APIENTRY * bgluTessBeginContour)(GLUtesselator* tess);

View file

@ -6,7 +6,7 @@
#include "kplib.h"
#define HICEFFECTMASK (1|2)
#define HICEFFECTMASK (1|2|4)
palette_t hictinting[MAXPALOOKUPS];
//moved into polymost.h

View file

@ -660,6 +660,7 @@ static int daskinloader(int filh, int *fptr, int *bpl, int *sizx, int *sizy, int
char *picfil,*cptr,al=255;
coltype *pic;
int xsiz, ysiz, tsizx, tsizy;
int r, g, b;
picfillen = kfilelength(filh);
picfil = (char *)malloc(picfillen); if (!picfil) { return -1; }
@ -692,6 +693,9 @@ static int daskinloader(int filh, int *fptr, int *bpl, int *sizx, int *sizy, int
applypalmapSkin((char *)pic,tsizx,tsizy,pal);
cptr = &britable[gammabrightness ? 0 : curbrightness][0];
r=(glinfo.bgra)?hictinting[pal].b:hictinting[pal].r;
g=hictinting[pal].g;
b=(glinfo.bgra)?hictinting[pal].r:hictinting[pal].b;
for (y=0,j=0;y<tsizy;y++,j+=xsiz)
{
coltype *rpptr = &pic[j], tcol;
@ -715,6 +719,13 @@ static int daskinloader(int filh, int *fptr, int *bpl, int *sizx, int *sizy, int
tcol.g = 255-tcol.g;
tcol.r = 255-tcol.r;
}
if (effect & 4)
{
// colorize
tcol.b = min((int)(tcol.b)*b/64,255);
tcol.g = min((int)(tcol.g)*g/64,255);
tcol.r = min((int)(tcol.r)*r/64,255);
}
rpptr[x].b = tcol.b;
rpptr[x].g = tcol.g;
@ -1735,6 +1746,8 @@ static int md3draw(md3model *m, spritetype *tspr)
bglEnable(GL_TEXTURE_2D);
pc[0] = pc[1] = pc[2] = ((float)(numpalookups-min(max((globalshade * shadescale)+m->shadeoff,0),numpalookups)))/((float)numpalookups);
if (!(hictinting[globalpal].f&4))
{
if (!(m->flags&1)||sector[sprite[tspr->owner].sectnum].floorpal!=0)
{
pc[0] *= (float)hictinting[globalpal].r / 255.0;
@ -1748,6 +1761,7 @@ static int md3draw(md3model *m, spritetype *tspr)
}
}
else globalnoeffect=1;
}
if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; }
else pc[3] = 1.0;

View file

@ -1472,6 +1472,7 @@ int gloadtile_hi(int dapic,int dapalnum, int facen, hicreplctyp *hicr, int damet
{
coltype *pic = NULL, *rpptr;
int j, x, y, xsiz=0, ysiz=0, tsizx, tsizy;
int r, g, b;
char *picfil = NULL, *fn, hasalpha = 255;
int picfillen, texfmt = GL_RGBA, intexfmt = GL_RGBA, filh;
@ -1549,6 +1550,10 @@ int gloadtile_hi(int dapic,int dapalnum, int facen, hicreplctyp *hicr, int damet
if (kprender(picfil,picfillen,(int)pic,xsiz*sizeof(coltype),xsiz,ysiz,0,0)) { free(picfil); free(pic); return -2; }
applypalmapsT((char *)pic,tsizx,tsizy,dapalnum);
r=(glinfo.bgra)?hictinting[dapalnum].r:hictinting[dapalnum].b;
g=hictinting[dapalnum].g;
b=(glinfo.bgra)?hictinting[dapalnum].b:hictinting[dapalnum].r;
for (y=0,j=0;y<tsizy;y++,j+=xsiz)
{
coltype tcol;
@ -1575,6 +1580,13 @@ int gloadtile_hi(int dapic,int dapalnum, int facen, hicreplctyp *hicr, int damet
tcol.g = 255-tcol.g;
tcol.r = 255-tcol.r;
}
if (effect & 4)
{
// colorize
tcol.b = min((int)((tcol.b)*r)/64,255);
tcol.g = min((int)((tcol.g)*g)/64,255);
tcol.r = min((int)((tcol.r)*b)/64,255);
}
rpptr[x].b = tcol.b;
rpptr[x].g = tcol.g;
@ -1973,6 +1985,7 @@ void drawpoly(double *dpx, double *dpy, int n, int method)
}
// tinting happens only to hightile textures, and only if the texture we're
// rendering isn't for the same palette as what we asked for
if (!(hictinting[globalpal].f&4))
if (pth && (pth->flags & 2))
{
if (pth->palnum != globalpal)
@ -2831,6 +2844,7 @@ static void polymost_drawalls(int bunch)
double t, r, t0, t1, ocy0, ocy1, ofy0, ofy1, oxp0, oyp0, ft[4];
double oguo, ogux, oguy;
int i, x, y, z, cz, fz, wallnum, sectnum, nextsectnum;
int ypan; // for panning correction
sectnum = thesector[bunchfirst[bunch]]; sec = &sector[sectnum];
@ -3711,7 +3725,12 @@ static void polymost_drawalls(int bunch)
t1 = ((float)(i-globalposz))*ryp1 + ghoriz;
t = ((gdx*x0 + gdo) * (float)wal->yrepeat) / ((x1-x0) * ryp0 * 2048.f);
i = (1<<(picsiz[globalpicnum]>>4)); if (i < tilesizy[globalpicnum]) i <<= 1;
fy = (float)wal->ypanning * ((float)i) / 256.0;
ypan = wal->ypanning;
if (ypan>256-(i-tilesizy[globalpicnum])*(256./i))
ypan -= (i-tilesizy[globalpicnum])*(256./i);
fy = (float)ypan * ((float)i) / 256.0;
gvx = (t0-t1)*t;
gvy = (x1-x0)*t;
gvo = -gvx*x0 - gvy*t0 + fy*gdo; gvx += fy*gdx; gvy += fy*gdy;
@ -3753,7 +3772,12 @@ static void polymost_drawalls(int bunch)
t1 = ((float)(i-globalposz))*ryp1 + ghoriz;
t = ((gdx*x0 + gdo) * (float)wal->yrepeat) / ((x1-x0) * ryp0 * 2048.f);
i = (1<<(picsiz[globalpicnum]>>4)); if (i < tilesizy[globalpicnum]) i <<= 1;
fy = (float)nwal->ypanning * ((float)i) / 256.0;
ypan = nwal->ypanning;
if (ypan>256-(i-tilesizy[globalpicnum])*(256./i))
ypan -= (i-tilesizy[globalpicnum])*(256./i);
fy = (float)ypan * ((float)i) / 256.0;
gvx = (t0-t1)*t;
gvy = (x1-x0)*t;
gvo = -gvx*x0 - gvy*t0 + fy*gdo; gvx += fy*gdx; gvy += fy*gdy;
@ -3791,7 +3815,12 @@ static void polymost_drawalls(int bunch)
t1 = ((float)(i-globalposz))*ryp1 + ghoriz;
t = ((gdx*x0 + gdo) * (float)wal->yrepeat) / ((x1-x0) * ryp0 * 2048.f);
i = (1<<(picsiz[globalpicnum]>>4)); if (i < tilesizy[globalpicnum]) i <<= 1;
fy = (float)wal->ypanning * ((float)i) / 256.0;
ypan = wal->ypanning;
if (ypan>256-(i-tilesizy[globalpicnum])*(256./i))
ypan -= (i-tilesizy[globalpicnum])*(256./i);
fy = (float)ypan * ((float)i) / 256.0;
gvx = (t0-t1)*t;
gvy = (x1-x0)*t;
gvo = -gvx*x0 - gvy*t0 + fy*gdo; gvx += fy*gdx; gvy += fy*gdy;
@ -4359,6 +4388,8 @@ void polymost_drawsprite(int snum)
int i, j, spritenum, xoff=0, yoff=0, method, npoints;
spritetype *tspr;
int posx,posy;
int oldsizx, oldsizy;
int tsizx, tsizy;
tspr = tspriteptr[snum];
if (tspr->owner < 0 || tspr->picnum < 0) return;
@ -4371,10 +4402,13 @@ void polymost_drawsprite(int snum)
if ((globalorientation&48) != 48) // only non-voxel sprites should do this
{
int flag;
if (picanm[globalpicnum]&192) globalpicnum += animateoffs(globalpicnum,spritenum+32768);
xoff = (int)((signed char)((picanm[globalpicnum]>>8)&255))+((int)tspr->xoffset);
yoff = (int)((signed char)((picanm[globalpicnum]>>16)&255))+((int)tspr->yoffset);
flag = usehightile&&h_xsize[globalpicnum];
xoff = (int)tspr->xoffset;
yoff = (int)tspr->yoffset;
xoff += (signed char)((flag)?(h_xoffs[globalpicnum]):((picanm[globalpicnum]>>8)&255));
yoff += (signed char)((flag)?(h_yoffs[globalpicnum]):((picanm[globalpicnum]>>16)&255));
}
method = 1+4;
@ -4434,6 +4468,13 @@ void polymost_drawsprite(int snum)
posx-=(sintable[(tspr->ang+512)&2047]>>13);
posy-=(sintable[(tspr->ang)&2047]>>13);
}
oldsizx=tsizx=tilesizx[globalpicnum];
oldsizy=tsizy=tilesizy[globalpicnum];
if (usehightile&&h_xsize[globalpicnum])
{
tsizx=h_xsize[globalpicnum];
tsizy=h_ysize[globalpicnum];
}
switch ((globalorientation>>4)&3)
{
@ -4451,10 +4492,10 @@ void polymost_drawsprite(int snum)
f = ryp0*(float)xdimen/160.0;
fx = ((float)tspr->xrepeat)*f;
fy = ((float)tspr->yrepeat)*f*((float)yxaspect/65536.0);
sx0 -= fx*(float)xoff; if (tilesizx[globalpicnum]&1) sx0 += fx*.5;
sx0 -= fx*(float)xoff; if (tsizx&1) sx0 += fx*.5;
sy0 -= fy*(float)yoff;
fx *= ((float)tilesizx[globalpicnum]);
fy *= ((float)tilesizy[globalpicnum]);
fx *= ((float)tsizx);
fy *= ((float)tsizy);
px[0] = px[3] = sx0-fx*.5; px[1] = px[2] = sx0+fx*.5;
if (!(globalorientation&128)) { py[0] = py[1] = sy0-fy; py[2] = py[3] = sy0; }
@ -4462,17 +4503,17 @@ void polymost_drawsprite(int snum)
gdx = gdy = guy = gvx = 0; gdo = ryp0*gviewxrange;
if (!(globalorientation&4))
{ gux = (float)tilesizx[globalpicnum]*gdo/(px[1]-px[0]+.002); guo = -gux*(px[0]-.001); }
else { gux = (float)tilesizx[globalpicnum]*gdo/(px[0]-px[1]-.002); guo = -gux*(px[1]+.001); }
{ gux = (float)tsizx*gdo/(px[1]-px[0]+.002); guo = -gux*(px[0]-.001); }
else { gux = (float)tsizx*gdo/(px[0]-px[1]-.002); guo = -gux*(px[1]+.001); }
if (!(globalorientation&8))
{ gvy = (float)tilesizy[globalpicnum]*gdo/(py[3]-py[0]+.002); gvo = -gvy*(py[0]-.001); }
else { gvy = (float)tilesizy[globalpicnum]*gdo/(py[0]-py[3]-.002); gvo = -gvy*(py[3]+.001); }
{ gvy = (float)tsizy*gdo/(py[3]-py[0]+.002); gvo = -gvy*(py[0]-.001); }
else { gvy = (float)tsizy*gdo/(py[0]-py[3]-.002); gvo = -gvy*(py[3]+.001); }
// sprite panning
guy -= gdy*((float)(spriteext[spritenum].xpanning)/255.f)*tilesizx[globalpicnum];
guo -= gdo*((float)(spriteext[spritenum].xpanning)/255.f)*tilesizx[globalpicnum];
gvy -= gdy*((float)(spriteext[spritenum].ypanning)/255.f)*tilesizy[globalpicnum];
gvo -= gdo*((float)(spriteext[spritenum].ypanning)/255.f)*tilesizy[globalpicnum];
guy -= gdy*((float)(spriteext[spritenum].xpanning)/255.f)*tsizx;
guo -= gdo*((float)(spriteext[spritenum].xpanning)/255.f)*tsizx;
gvy -= gdy*((float)(spriteext[spritenum].ypanning)/255.f)*tsizy;
gvo -= gdo*((float)(spriteext[spritenum].ypanning)/255.f)*tsizy;
//Clip sprites to ceilings/floors when no parallaxing and not sloped
if (!(sector[tspr->sectnum].ceilingstat&3))
@ -4492,7 +4533,8 @@ void polymost_drawsprite(int snum)
if (spriteext[spritenum].ypanning)
trepeat = 1;
#endif
tilesizx[globalpicnum] = tsizx;
tilesizy[globalpicnum] = tsizy;
pow2xsplit = 0; drawpoly(px,py,4,method);
#ifdef USE_OPENGL
@ -4511,9 +4553,9 @@ void polymost_drawsprite(int snum)
xv = (float)tspr->xrepeat * (float)sintable[(tspr->ang)&2047] / 65536.0;
yv = (float)tspr->xrepeat * (float)sintable[(tspr->ang+1536)&2047] / 65536.0;
f = (float)(tilesizx[globalpicnum]>>1) + (float)xoff;
x0 = (float)(posx-globalposx) - xv*f; x1 = xv*(float)tilesizx[globalpicnum] + x0;
y0 = (float)(posy-globalposy) - yv*f; y1 = yv*(float)tilesizx[globalpicnum] + y0;
f = (float)(tsizx>>1) + (float)xoff;
x0 = (float)(posx-globalposx) - xv*f; x1 = xv*(float)tsizx + x0;
y0 = (float)(posy-globalposy) - yv*f; y1 = yv*(float)tsizx + y0;
yp0 = x0*gcosang2 + y0*gsinang2;
yp1 = x1*gcosang2 + y1*gsinang2;
@ -4528,7 +4570,7 @@ void polymost_drawsprite(int snum)
if (yp1 < SCISDIST) { t1 = (SCISDIST-oyp0)/(yp1-oyp0); xp1 = (xp1-oxp0)*t1+oxp0; yp1 = SCISDIST; }
else { t1 = 1.f; }
f = ((float)tspr->yrepeat) * (float)tilesizy[globalpicnum] * 4;
f = ((float)tspr->yrepeat) * (float)tsizy * 4;
ryp0 = 1.0/yp0;
ryp1 = 1.0/yp1;
@ -4540,8 +4582,8 @@ void polymost_drawsprite(int snum)
tspr->z -= ((yoff*tspr->yrepeat)<<2);
if (globalorientation&128)
{
tspr->z += ((tilesizy[globalpicnum]*tspr->yrepeat)<<1);
if (tilesizy[globalpicnum]&1) tspr->z += (tspr->yrepeat<<1); //Odd yspans
tspr->z += ((tsizy*tspr->yrepeat)<<1);
if (tsizy&1) tspr->z += (tspr->yrepeat<<1); //Odd yspans
}
sc0 = ((float)(tspr->z-globalposz-f))*ryp0 + ghoriz;
@ -4554,29 +4596,29 @@ void polymost_drawsprite(int snum)
gdo = ryp0*gxyaspect - gdx*sx0;
//Original equations:
//(gux*sx0 + guo)/(gdx*sx1 + gdo) = tilesizx[globalpicnum]*t0
//(gux*sx1 + guo)/(gdx*sx1 + gdo) = tilesizx[globalpicnum]*t1
//(gux*sx0 + guo)/(gdx*sx1 + gdo) = tsizx*t0
//(gux*sx1 + guo)/(gdx*sx1 + gdo) = tsizx*t1
//
// gvx*sx0 + gvy*sc0 + gvo = 0
// gvy*sx1 + gvy*sc1 + gvo = 0
//(gvx*sx0 + gvy*sf0 + gvo)/(gdx*sx0 + gdo) = tilesizy[globalpicnum]
//(gvx*sx1 + gvy*sf1 + gvo)/(gdx*sx1 + gdo) = tilesizy[globalpicnum]
//(gvx*sx0 + gvy*sf0 + gvo)/(gdx*sx0 + gdo) = tsizy
//(gvx*sx1 + gvy*sf1 + gvo)/(gdx*sx1 + gdo) = tsizy
//gux*sx0 + guo = t0*tilesizx[globalpicnum]*yp0
//gux*sx1 + guo = t1*tilesizx[globalpicnum]*yp1
//gux*sx0 + guo = t0*tsizx*yp0
//gux*sx1 + guo = t1*tsizx*yp1
if (globalorientation&4) { t0 = 1.f-t0; t1 = 1.f-t1; }
//sprite panning
t0 -= ((float)(spriteext[spritenum].xpanning)/255.f);
t1 -= ((float)(spriteext[spritenum].xpanning)/255.f);
gux = (t0*ryp0 - t1*ryp1)*gxyaspect*(float)tilesizx[globalpicnum] / (sx0-sx1);
gux = (t0*ryp0 - t1*ryp1)*gxyaspect*(float)tsizx / (sx0-sx1);
guy = 0;
guo = t0*ryp0*gxyaspect*(float)tilesizx[globalpicnum] - gux*sx0;
guo = t0*ryp0*gxyaspect*(float)tsizx - gux*sx0;
//gvx*sx0 + gvy*sc0 + gvo = 0
//gvx*sx1 + gvy*sc1 + gvo = 0
//gvx*sx0 + gvy*sf0 + gvo = tilesizy[globalpicnum]*(gdx*sx0 + gdo)
f = ((float)tilesizy[globalpicnum])*(gdx*sx0 + gdo) / ((sx0-sx1)*(sc0-sf0));
//gvx*sx0 + gvy*sf0 + gvo = tsizy*(gdx*sx0 + gdo)
f = ((float)tsizy)*(gdx*sx0 + gdo) / ((sx0-sx1)*(sc0-sf0));
if (!(globalorientation&8))
{
gvx = (sc0-sc1)*f;
@ -4591,14 +4633,14 @@ void polymost_drawsprite(int snum)
}
// sprite panning
gvx -= gdx*((float)(spriteext[spritenum].ypanning)/255.f)*tilesizy[globalpicnum];
gvy -= gdy*((float)(spriteext[spritenum].ypanning)/255.f)*tilesizy[globalpicnum];
gvo -= gdo*((float)(spriteext[spritenum].ypanning)/255.f)*tilesizy[globalpicnum];
gvx -= gdx*((float)(spriteext[spritenum].ypanning)/255.f)*tsizy;
gvy -= gdy*((float)(spriteext[spritenum].ypanning)/255.f)*tsizy;
gvo -= gdo*((float)(spriteext[spritenum].ypanning)/255.f)*tsizy;
//Clip sprites to ceilings/floors when no parallaxing
if (!(sector[tspr->sectnum].ceilingstat&1))
{
f = ((float)tspr->yrepeat) * (float)tilesizy[globalpicnum] * 4;
f = ((float)tspr->yrepeat) * (float)tsizy * 4;
if (sector[tspr->sectnum].ceilingz > tspr->z-f)
{
sc0 = ((float)(sector[tspr->sectnum].ceilingz-globalposz))*ryp0 + ghoriz;
@ -4634,6 +4676,8 @@ void polymost_drawsprite(int snum)
trepeat = 1;
#endif
tilesizx[globalpicnum] = tsizx;
tilesizy[globalpicnum] = tsizy;
pow2xsplit = 0; drawpoly(px,py,4,method);
#ifdef USE_OPENGL
@ -4655,10 +4699,10 @@ void polymost_drawsprite(int snum)
i = (tspr->ang&2047);
c = sintable[(i+512)&2047]/65536.0;
s = sintable[i]/65536.0;
x0 = ((tilesizx[globalpicnum]>>1)-xoff)*tspr->xrepeat;
y0 = ((tilesizy[globalpicnum]>>1)-yoff)*tspr->yrepeat;
x1 = ((tilesizx[globalpicnum]>>1)+xoff)*tspr->xrepeat;
y1 = ((tilesizy[globalpicnum]>>1)+yoff)*tspr->yrepeat;
x0 = ((tsizx>>1)-xoff)*tspr->xrepeat;
y0 = ((tsizy>>1)-yoff)*tspr->yrepeat;
x1 = ((tsizx>>1)+xoff)*tspr->xrepeat;
y1 = ((tsizy>>1)+yoff)*tspr->yrepeat;
//Project 3D to 2D
for (j=0;j<4;j++)
@ -4727,16 +4771,16 @@ void polymost_drawsprite(int snum)
f =-4.0/(float)tspr->yrepeat; gvx *= f; gvy *= f; gvo *= f;
if (globalorientation&4)
{
gux = ((float)tilesizx[globalpicnum])*gdx - gux;
guy = ((float)tilesizx[globalpicnum])*gdy - guy;
guo = ((float)tilesizx[globalpicnum])*gdo - guo;
gux = ((float)tsizx)*gdx - gux;
guy = ((float)tsizx)*gdy - guy;
guo = ((float)tsizx)*gdo - guo;
}
// sprite panning
guy -= gdy*((float)(spriteext[spritenum].xpanning)/255.f)*tilesizx[globalpicnum];
guo -= gdo*((float)(spriteext[spritenum].xpanning)/255.f)*tilesizx[globalpicnum];
gvy -= gdy*((float)(spriteext[spritenum].ypanning)/255.f)*tilesizy[globalpicnum];
gvo -= gdo*((float)(spriteext[spritenum].ypanning)/255.f)*tilesizy[globalpicnum];
guy -= gdy*((float)(spriteext[spritenum].xpanning)/255.f)*tsizx;
guo -= gdo*((float)(spriteext[spritenum].xpanning)/255.f)*tsizx;
gvy -= gdy*((float)(spriteext[spritenum].ypanning)/255.f)*tsizy;
gvo -= gdo*((float)(spriteext[spritenum].ypanning)/255.f)*tsizy;
#ifdef USE_OPENGL
if (spriteext[spritenum].xpanning)
@ -4745,6 +4789,8 @@ void polymost_drawsprite(int snum)
trepeat = 1;
#endif
tilesizx[globalpicnum] = tsizx;
tilesizy[globalpicnum] = tsizy;
pow2xsplit = 0; drawpoly(px,py,npoints,method);
#ifdef USE_OPENGL
@ -4759,6 +4805,8 @@ void polymost_drawsprite(int snum)
case 3: //Voxel sprite
break;
}
tilesizx[globalpicnum]=oldsizx;
tilesizy[globalpicnum]=oldsizy;
}
//sx,sy center of sprite; screen coods*65536

View file

@ -2425,6 +2425,9 @@ static int DrawTiles(int iTopLeft, int iSelected, int nXTiles, int nYTiles, int
Bsprintf(szT,"%dx%d",tilesizx[idTile],tilesizy[idTile]);
printext256(xdim>>2,ydim-8,whitecol,-1,szT,0);
Bsprintf(szT,"%d, %d",(picanm[idTile]>>8)&0xFF,(picanm[idTile]>>16)&0xFF);
printext256((xdim>>2)+100,ydim-8,whitecol,-1,szT,0);
enddrawing();
showframe(1);