mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-16 09:21:12 +00:00
Polymodes: make flipping closer to classic.
This fixes cases A and B in test_tileoffsets.map. git-svn-id: https://svn.eduke32.com/eduke32@3778 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
64406cc25c
commit
946d207c56
2 changed files with 22 additions and 22 deletions
|
@ -3546,7 +3546,7 @@ static inline void polymer_scansprites(int16_t sectnum, spritetype* localtsprit
|
|||
|
||||
void polymer_updatesprite(int32_t snum)
|
||||
{
|
||||
int32_t curpicnum, xsize, ysize, tilexoff, tileyoff, xoff, yoff, i, j, cs;
|
||||
int32_t curpicnum, xsize, ysize, tilexoff, tileyoff, xoff, yoff, i, j;
|
||||
spritetype *tspr = tspriteptr[snum];
|
||||
float xratio, yratio, ang, f;
|
||||
float spos[3];
|
||||
|
@ -3554,12 +3554,13 @@ void polymer_updatesprite(int32_t snum)
|
|||
uint8_t flipu, flipv;
|
||||
_prsprite *s;
|
||||
|
||||
const uint32_t cs = tspr->cstat;
|
||||
const uint32_t alignmask = (cs & SPR_ALIGN_MASK);
|
||||
|
||||
if (pr_verbosity >= 3) OSD_Printf("PR : Updating sprite %i...\n", snum);
|
||||
|
||||
if (tspr->owner < 0 || tspr->picnum < 0) return;
|
||||
|
||||
cs = tspr->cstat;
|
||||
|
||||
if (prsprites[tspr->owner] == NULL)
|
||||
{
|
||||
prsprites[tspr->owner] = (_prsprite *) Bcalloc(sizeof(_prsprite), 1);
|
||||
|
@ -3661,28 +3662,26 @@ void polymer_updatesprite(int32_t snum)
|
|||
inbuffer = vertsprite;
|
||||
|
||||
{
|
||||
// Initially set flipu and flipv.
|
||||
const uint8_t xflip = !!(tspr->cstat & SPR_XFLIP);
|
||||
const uint8_t yflip = !!(tspr->cstat & SPR_YFLIP);
|
||||
const uint8_t flooraligned = ((tspr->cstat & SPR_ALIGN_MASK)==SPR_FLOOR);
|
||||
const uint8_t xflip = !!(cs & SPR_XFLIP);
|
||||
const uint8_t yflip = !!(cs & SPR_YFLIP);
|
||||
const uint8_t flooraligned = (alignmask==SPR_FLOOR);
|
||||
|
||||
// Initially set flipu and flipv.
|
||||
flipu = (xflip ^ flooraligned);
|
||||
flipv = (yflip && !flooraligned);
|
||||
}
|
||||
|
||||
if (pr_billboardingmode && (tspr->cstat & SPR_ALIGN_MASK)==0)
|
||||
{
|
||||
// do surgery on the face tspr to make it look like a wall sprite
|
||||
tspr->cstat |= 16;
|
||||
tspr->ang = (viewangle + 1024) & 2047;
|
||||
}
|
||||
if (pr_billboardingmode && alignmask==0)
|
||||
{
|
||||
// do surgery on the face tspr to make it look like a wall sprite
|
||||
tspr->cstat |= 16;
|
||||
tspr->ang = (viewangle + 1024) & 2047;
|
||||
}
|
||||
|
||||
if (flipu) {
|
||||
xoff = -xoff;
|
||||
}
|
||||
if (flipu)
|
||||
xoff = -xoff;
|
||||
|
||||
if (flipv) {
|
||||
yoff = -yoff;
|
||||
if (yflip && alignmask!=0)
|
||||
yoff = -yoff;
|
||||
}
|
||||
|
||||
switch (tspr->cstat & SPR_ALIGN_MASK)
|
||||
|
@ -3743,7 +3742,7 @@ void polymer_updatesprite(int32_t snum)
|
|||
|
||||
polymer_computeplane(&s->plane);
|
||||
|
||||
if ((cs & SPR_ALIGN_MASK) && (pr_vbos > 0))
|
||||
if (alignmask && (pr_vbos > 0))
|
||||
{
|
||||
bglBindBufferARB(GL_ARRAY_BUFFER_ARB, s->plane.vbo);
|
||||
bglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 4 * sizeof(GLfloat) * 5, s->plane.buffer);
|
||||
|
@ -3755,7 +3754,7 @@ void polymer_updatesprite(int32_t snum)
|
|||
s->plane.vbo = 0;
|
||||
}
|
||||
|
||||
if (tspr->cstat & SPR_ALIGN_MASK)
|
||||
if (alignmask)
|
||||
{
|
||||
int32_t curpriority = 0;
|
||||
|
||||
|
|
|
@ -3835,7 +3835,8 @@ void polymost_drawsprite(int32_t snum)
|
|||
case 0: //Face sprite
|
||||
//Project 3D to 2D
|
||||
if (globalorientation&4) xoff = -xoff;
|
||||
if (globalorientation&8) yoff = -yoff;
|
||||
// NOTE: yoff not negated not for y flipping, unlike wall and floor
|
||||
// aligned sprites.
|
||||
|
||||
sx0 = (float)(tspr->x-globalposx);
|
||||
sy0 = (float)(tspr->y-globalposy);
|
||||
|
|
Loading…
Reference in a new issue