JIMITA DO TH EROTSPRITE

This commit is contained in:
Jaime Passos 2019-09-28 17:56:27 -03:00
parent 2e493a3d4d
commit 5c8b7a142b

View file

@ -225,14 +225,17 @@ void R_CacheRotSprite(spriteframe_t *sprframe, INT32 rot, UINT8 flip)
patch_t *newpatch; patch_t *newpatch;
UINT16 *rawsrc, *rawdst; UINT16 *rawsrc, *rawdst;
size_t size, size2; size_t size, size2;
const char *lumpname; INT32 bflip = ((flip != 0x00) ? -1 : 1);
#define SPRITE_XCENTER (width / 2)
#define SPRITE_YCENTER (height / 2)
#define ROTSPRITE_XCENTER (newwidth / 2)
#define ROTSPRITE_YCENTER (newheight / 2)
if (!sprframe->rotsprite.cached[rot]) if (!sprframe->rotsprite.cached[rot])
{ {
INT32 sx,sy;
INT32 dx,dy; INT32 dx,dy;
INT32 ox,oy; INT32 px,py;
INT32 nox,noy;
INT32 width,height; INT32 width,height;
fixed_t ca, sa; fixed_t ca, sa;
lumpnum_t lump = sprframe->lumppat[rot]; lumpnum_t lump = sprframe->lumppat[rot];
@ -244,15 +247,14 @@ void R_CacheRotSprite(spriteframe_t *sprframe, INT32 rot, UINT8 flip)
return; return;
patch = (patch_t *)W_CacheLumpNum(lump, PU_CACHE); patch = (patch_t *)W_CacheLumpNum(lump, PU_CACHE);
lumpname = W_CheckNameForNum(lump);
CONS_Debug(DBG_RENDER, "R_CacheRotSprite: %s\n", lumpname);
//CONS_Printf("%d\n", angle * ROTANGDIFF);
width = patch->width; width = patch->width;
height = patch->height; height = patch->height;
// patch origin
ox = (width / 2); // rotation pivot
oy = (height / 2); px = SPRITE_XCENTER; //22;
py = SPRITE_YCENTER; //47;
if (flip)
px = width - px;
// Draw the sprite to a temporary buffer. // Draw the sprite to a temporary buffer.
size = (width*height); size = (width*height);
@ -286,8 +288,50 @@ void R_CacheRotSprite(spriteframe_t *sprframe, INT32 rot, UINT8 flip)
newheight = max(height, max(h1, h2)); newheight = max(height, max(h1, h2));
} }
nox = (newwidth / 2); // check boundaries
noy = (newheight / 2); {
fixed_t top[2][2];
fixed_t bottom[2][2];
top[0][0] = FixedMul((-ROTSPRITE_XCENTER) << FRACBITS, ca) + FixedMul((-ROTSPRITE_YCENTER) << FRACBITS, sa) + (px << FRACBITS);
top[0][1] = FixedMul((-ROTSPRITE_XCENTER) << FRACBITS, sa) + FixedMul((-ROTSPRITE_YCENTER) << FRACBITS, ca) + (py << FRACBITS);
top[1][0] = FixedMul((newwidth-ROTSPRITE_XCENTER) << FRACBITS, ca) + FixedMul((-ROTSPRITE_YCENTER) << FRACBITS, sa) + (px << FRACBITS);
top[1][1] = FixedMul((newwidth-ROTSPRITE_XCENTER) << FRACBITS, sa) + FixedMul((-ROTSPRITE_YCENTER) << FRACBITS, ca) + (py << FRACBITS);
bottom[0][0] = FixedMul((-ROTSPRITE_XCENTER) << FRACBITS, ca) + FixedMul((newheight-ROTSPRITE_YCENTER) << FRACBITS, sa) + (px << FRACBITS);
bottom[0][1] = -FixedMul((-ROTSPRITE_XCENTER) << FRACBITS, sa) + FixedMul((newheight-ROTSPRITE_YCENTER) << FRACBITS, ca) + (py << FRACBITS);
bottom[1][0] = FixedMul((newwidth-ROTSPRITE_XCENTER) << FRACBITS, ca) + FixedMul((newheight-ROTSPRITE_YCENTER) << FRACBITS, sa) + (px << FRACBITS);
bottom[1][1] = -FixedMul((newwidth-ROTSPRITE_XCENTER) << FRACBITS, sa) + FixedMul((newheight-ROTSPRITE_YCENTER) << FRACBITS, ca) + (py << FRACBITS);
top[0][0] >>= FRACBITS;
top[0][1] >>= FRACBITS;
top[1][0] >>= FRACBITS;
top[1][1] >>= FRACBITS;
bottom[0][0] >>= FRACBITS;
bottom[0][1] >>= FRACBITS;
bottom[1][0] >>= FRACBITS;
bottom[1][1] >>= FRACBITS;
#define BOUNDARYWCHECK(b) (b[0] < 0 || b[0] >= width)
#define BOUNDARYHCHECK(b) (b[1] < 0 || b[1] >= height)
#define BOUNDARYADJUST(x) x = 15*x/10
// top left/right
if (BOUNDARYWCHECK(top[0]) || BOUNDARYWCHECK(top[1]))
BOUNDARYADJUST(newwidth);
// bottom left/right
else if (BOUNDARYWCHECK(bottom[0]) || BOUNDARYWCHECK(bottom[1]))
BOUNDARYADJUST(newwidth);
// top left/right
if (BOUNDARYHCHECK(top[0]) || BOUNDARYHCHECK(top[1]))
BOUNDARYADJUST(newheight);
// bottom left/right
else if (BOUNDARYHCHECK(bottom[0]) || BOUNDARYHCHECK(bottom[1]))
BOUNDARYADJUST(newheight);
#undef BOUNDARYWCHECK
#undef BOUNDARYHCHECK
#undef BOUNDARYADJUST
}
size2 = (newwidth * newheight); size2 = (newwidth * newheight);
if (!size2) if (!size2)
@ -304,8 +348,10 @@ void R_CacheRotSprite(spriteframe_t *sprframe, INT32 rot, UINT8 flip)
{ {
for (dx = 0; dx < newwidth; dx++) for (dx = 0; dx < newwidth; dx++)
{ {
sx = FixedMul((dx-nox) << FRACBITS, ca) + FixedMul((dy-noy) << FRACBITS, sa) + (ox << FRACBITS); INT32 x = (dx-ROTSPRITE_XCENTER) << FRACBITS;
sy = -FixedMul((dx-nox) << FRACBITS, sa) + FixedMul((dy-noy) << FRACBITS, ca) + (oy << FRACBITS); INT32 y = (dy-ROTSPRITE_YCENTER) << FRACBITS;
INT32 sx = FixedMul(x, ca) + FixedMul(y, sa) + (px << FRACBITS);
INT32 sy = -FixedMul(x, sa) + FixedMul(y, ca) + (py << FRACBITS);
sx >>= FRACBITS; sx >>= FRACBITS;
sy >>= FRACBITS; sy >>= FRACBITS;
if (sx >= 0 && sy >= 0 && sx < width && sy < height) if (sx >= 0 && sy >= 0 && sx < width && sy < height)
@ -315,9 +361,10 @@ void R_CacheRotSprite(spriteframe_t *sprframe, INT32 rot, UINT8 flip)
// make patch // make patch
newpatch = R_FlatToPatch_16bpp(rawdst, newwidth, newheight, &size); newpatch = R_FlatToPatch_16bpp(rawdst, newwidth, newheight, &size);
// This is BROKEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! newpatch->leftoffset = (newpatch->width / 2) - ((SPRITE_XCENTER - patch->leftoffset) * bflip);
newpatch->leftoffset = (newpatch->width / 2) - ((ox - patch->leftoffset) * ((flip != 0x00) ? -1 : 1)); newpatch->topoffset = (newpatch->height / 2) - (SPRITE_YCENTER - patch->topoffset);
newpatch->topoffset = (newpatch->height / 2) - (oy - patch->topoffset); newpatch->leftoffset += (SPRITE_XCENTER - px);
newpatch->topoffset += (SPRITE_YCENTER - py);
//BP: we cannot use special tric in hardware mode because feet in ground caused by z-buffer //BP: we cannot use special tric in hardware mode because feet in ground caused by z-buffer
if (rendermode != render_none) // not for psprite if (rendermode != render_none) // not for psprite
@ -346,16 +393,12 @@ void R_CacheRotSprite(spriteframe_t *sprframe, INT32 rot, UINT8 flip)
// free image data // free image data
Z_Free(rawsrc); Z_Free(rawsrc);
Z_Free(patch);
#ifdef HWRENDER
if (rendermode == render_soft)
#endif
W_UnlockCachedPatch(patch);
// Can remove if needed
I_OsPolling();
I_UpdateNoBlit();
} }
#undef SPRITE_XCENTER
#undef SPRITE_YCENTER
#undef ROTSPRITE_XCENTER
#undef ROTSPRITE_YCENTER
} }
static void R_FreeRotSprite(spritedef_t *spritedef) static void R_FreeRotSprite(spritedef_t *spritedef)